comctx
Version:
Use RPC to communicate easily across contexts in any JavaScript environment.
34 lines (30 loc) • 1.18 kB
text/typescript
import { Workbox, WorkboxMessageEvent } from 'workbox-window'
import { Adapter, SendMessage, OnMessage } from 'comctx'
declare const self: ServiceWorkerGlobalScope
export class ProvideAdapter implements Adapter {
sendMessage: SendMessage = (message) => {
self.clients.matchAll().then((clients) => {
clients.forEach((client) => client.postMessage(message))
})
}
onMessage: OnMessage = (callback) => {
const handler = (event: ExtendableMessageEvent) => callback(event.data)
self.addEventListener('message', handler)
return () => self.removeEventListener('message', handler)
}
}
export class InjectAdapter implements Adapter {
workbox: Workbox
constructor(path: string) {
this.workbox = new Workbox(path, { type: import.meta.env.MODE === 'production' ? 'classic' : 'module' })
this.workbox.register()
}
sendMessage: SendMessage = (message) => {
this.workbox.messageSW(message)
}
onMessage: OnMessage = (callback) => {
const handler = (event: WorkboxMessageEvent) => callback(event.data)
this.workbox.addEventListener('message', handler)
return () => this.workbox.removeEventListener('message', handler)
}
}