Skip to content

Commit

Permalink
feat(overlay): Add direct event sending w/o sidecar (#508)
Browse files Browse the repository at this point in the history
Working towards #133, supersedes #498
  • Loading branch information
BYK committed Aug 27, 2024
1 parent b2b5c85 commit 5013585
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 15 deletions.
6 changes: 6 additions & 0 deletions .changeset/nasty-lizards-sleep.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@spotlightjs/overlay': minor
---

Add direct event ingestion through `Spotlight.sendEvent('<content-type>', <event>)` to allow sending events without the
sidecar
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"cSpell.words": [
"Astro",
"Astro's",
"astrojs",
"contextlines",
"Endcaps",
"fontsource",
Expand Down
24 changes: 18 additions & 6 deletions packages/overlay/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ export default function App({
}
}

const result: [contentType: string, listener: (event: MessageEvent) => void][] = [];
const result: Record<string, (event: { data: string | Buffer }) => void> = Object.create(null);
for (const [contentType, integrations] of contentTypeToIntegrations.entries()) {
const listener = (event: MessageEvent): void => {
const listener = (event: { data: string | Buffer }): void => {
log(`Received new ${contentType} event`);
for (const integration of integrations) {
const newIntegrationData = integration.processEvent
Expand All @@ -67,10 +67,10 @@ export default function App({
}
};

log('Adding listener for', contentType, 'sum', result.length);
log('Adding listener for', contentType);

// `contentType` could for example be "application/x-sentry-envelope"
result.push([contentType, listener]);
result[contentType] = listener;
}
return result;
}, [integrations]);
Expand Down Expand Up @@ -139,8 +139,18 @@ export default function App({
navigate(e.detail);
};

return { clearEvents, onOpen, onClose, onNavigate, onToggle };
}, [integrations, navigate, sidecarUrl]);
const onEvent = ({ detail }: CustomEvent<{ contentType: string; data: string }>) => {
const { contentType, data } = detail;
const listener = contentTypeListeners[contentType];
if (!listener) {
log('Got event for unknown content type:', contentType);
return;
}
listener({ data });
};

return { clearEvents, onEvent, onOpen, onClose, onNavigate, onToggle };
}, [integrations, navigate, sidecarUrl, contentTypeListeners]);

useKeyPress(['ctrlKey', 'F12'], eventHandlers.onToggle);

Expand All @@ -150,13 +160,15 @@ export default function App({
spotlightEventTarget.addEventListener('close', eventHandlers.onClose);
spotlightEventTarget.addEventListener('navigate', eventHandlers.onNavigate as EventListener);
spotlightEventTarget.addEventListener('clearEvents', eventHandlers.clearEvents as EventListener);
spotlightEventTarget.addEventListener('event', eventHandlers.onEvent as EventListener);

return (): undefined => {
log('useEffect[destructor]: Removing event listeners');
spotlightEventTarget.removeEventListener('open', eventHandlers.onOpen as EventListener);
spotlightEventTarget.removeEventListener('close', eventHandlers.onClose);
spotlightEventTarget.removeEventListener('navigate', eventHandlers.onNavigate as EventListener);
spotlightEventTarget.removeEventListener('clearEvents', eventHandlers.clearEvents as EventListener);
spotlightEventTarget.removeEventListener('event', eventHandlers.onEvent as EventListener);
};
}, [spotlightEventTarget, eventHandlers]);

Expand Down
11 changes: 8 additions & 3 deletions packages/overlay/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@ export async function onClose(cb: EventListener) {
on('closed', cb);
}

/**
* Send an event to spotlight without the sidecar
*/
export async function sendEvent(contentType: string, data: string) {
trigger('event', { contentType, data });
}

/**
* Invokes the passed in callback when the Spotlight debugger Window is opened
*/
Expand All @@ -70,9 +77,7 @@ export async function onOpen(cb: EventListener) {
* A count of the number of collected severe events is passed to the callback.
*/
export async function onSevereEvent(cb: (count: number) => void) {
on('severeEventCount', e => {
cb((e as CustomEvent).detail?.count ?? 1);
});
on('severeEventCount', e => cb((e as CustomEvent).detail?.count ?? 1));
}

function isSpotlightInjected() {
Expand Down
13 changes: 7 additions & 6 deletions packages/overlay/src/sidecar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ import { log } from './lib/logger';

export function connectToSidecar(
sidecarUrl: string,
contentTypeListeners: [contentType: string, listener: (event: MessageEvent) => void][],
// Content Type to listener
contentTypeListeners: Record<string, (event: MessageEvent) => void>,
setOnline: React.Dispatch<React.SetStateAction<boolean>>,
): () => void {
log('Connecting to sidecar at', sidecarUrl);
const source = new EventSource(sidecarUrl);

for (const [contentType, listener] of contentTypeListeners) {
for (const [contentType, listener] of Object.entries(contentTypeListeners)) {
source.addEventListener(contentType, listener);
}

Expand All @@ -24,10 +25,10 @@ export function connectToSidecar(
});

return () => {
log(`Removing ${contentTypeListeners.length} listeners`);
for (const typeAndListener of contentTypeListeners) {
source.removeEventListener(typeAndListener[0], typeAndListener[1]);
log('Removed listener for type', typeAndListener[0]);
log('Removing all content type listeners');
for (const [contentType, listener] of Object.entries(contentTypeListeners)) {
source.removeEventListener(contentType, listener);
log('Removed listener for type', contentType);
}
};
}

0 comments on commit 5013585

Please sign in to comment.