import { injectable } from "tsyringe"; import { Message, valueOf } from "../shared/messages"; export type WebExtMessageSender = browser.runtime.MessageSender; @injectable() export default class MessageListener { onWebMessage(listener: (msg: Message, sender: Window) => void) { window.addEventListener("message", (event: MessageEvent) => { const sender = event.source; if (!(sender instanceof Window)) { return; } let message = null; try { message = JSON.parse(event.data); } catch (e) { // ignore unexpected message return; } listener(message, sender); }); } onBackgroundMessage( listener: (msg: Message, sender: WebExtMessageSender) => any ) { browser.runtime.onMessage.addListener( (msg: any, sender: WebExtMessageSender) => { try { return Promise.resolve(listener(valueOf(msg), sender)); } catch (e) { console.warn(e); return; } } ); } }