| 1 | import { SOURCE_CLIENT } from '@ipshipyard/libp2p-inspector-metrics' |
| 2 | import { TypedEventEmitter } from '@libp2p/interface' |
| 3 | import { getBrowserInstance } from './get-browser.js' |
| 4 | import type { DevToolsMessage, WorkerMessage } from '../app.tsx' |
| 5 | import type { RPCMessage } from '@ipshipyard/libp2p-inspector-metrics' |
| 6 | import type { TypedEventTarget } from '@libp2p/interface' |
| 7 | |
| 8 | const browser = getBrowserInstance() |
| 9 | let port: chrome.runtime.Port | undefined |
| 10 | |
| 11 | // listen for incoming connections from the service worker script |
| 12 | |
| 13 | export interface DevToolEvents { |
| 14 | 'page-loaded': CustomEvent |
| 15 | 'libp2p-rpc': CustomEvent<RPCMessage> |
| 16 | } |
| 17 | |
| 18 | export const devToolEvents: TypedEventTarget<DevToolEvents> = new TypedEventEmitter() |
| 19 | |
| 20 | export function sendMessage <Message extends Omit<DevToolsMessage, 'source' | 'tabId'>> (message: Omit<Message, 'source' | 'tabId'>): void { |
| 21 | if (port == null) { |
| 22 | port = browser.runtime.connect({ |
| 23 | name: SOURCE_CLIENT |
| 24 | }) |
| 25 | |
| 26 | port.onMessage.addListener((message: RPCMessage | WorkerMessage) => { |
| 27 | if (message.type === 'page-loaded') { |
| 28 | devToolEvents.safeDispatchEvent('page-loaded') |
| 29 | } |
| 30 | |
| 31 | if (message.type === 'libp2p-rpc') { |
| 32 | devToolEvents.safeDispatchEvent<RPCMessage>('libp2p-rpc', { |
| 33 | detail: message |
| 34 | }) |
| 35 | } |
| 36 | }) |
| 37 | |
| 38 | port.onDisconnect.addListener(() => { |
| 39 | port = undefined |
| 40 | }) |
| 41 | } |
| 42 | |
| 43 | port.postMessage({ |
| 44 | ...message, |
| 45 | source: SOURCE_CLIENT, |
| 46 | tabId: browser.devtools.inspectedWindow.tabId |
| 47 | }) |
| 48 | } |