export enum MessageType { RequestActiveMatch, NotifyActiveMatch } export type MessageData = { [MessageType.RequestActiveMatch]: undefined; [MessageType.NotifyActiveMatch]: { id: string; url: string; domain: string; }; }[T]; export async function sendMessage(message: T, data: MessageData) { await browser.runtime.sendMessage({ type: message, data: data }); } export async function sendMessageToActiveTab(message: T, data: MessageData) { const tabs = await browser.tabs.query({ active: true, currentWindow: true }); await browser.tabs.sendMessage(tabs[0].id!, { type: message, data: data }).catch(() => {}); } export function listenMessages(listener: (type: MessageType, data: any) => void): () => void { const callback = (callbackData: { type: MessageType; data: any }) => { const { type, data } = callbackData; listener(type, data); }; browser.runtime.onMessage.addListener(callback); return () => { browser.runtime.onMessage.removeListener(callback); }; }