comctx
Version:
Use RPC to communicate easily across contexts in any JavaScript environment.
25 lines (21 loc) • 973 B
text/typescript
import type { Adapter, Message, OnMessage, SendMessage } from 'comctx'
export class ProvideAdapter implements Adapter {
sendMessage: SendMessage = (message) => {
/**
* Compatible with Firefox
* https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Sharing_objects_with_page_scripts#cloneinto
*/
const detail = typeof cloneInto === 'function' ? cloneInto(message, document.defaultView) : message
document.dispatchEvent(new CustomEvent('message', { detail }))
// console.log('EventProvideAdapter SendMessage', message)
}
onMessage: OnMessage = (callback) => {
const handler = (event: Event) => {
callback((event as CustomEvent<Partial<Message> | undefined>).detail)
// console.log('EventProvideAdapter SendMessage', event.detail)
}
document.addEventListener('message', handler)
return () => document.removeEventListener('message', handler)
}
}
export const InjectAdapter = ProvideAdapter