main
ts 48 lines 1.45 KB
Raw
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 }