// --- tab communication --- // export enum TabMessageType { RequestActiveMatch, NotifyActiveMatch } export type TabMessageData = { [TabMessageType.RequestActiveMatch]: undefined; [TabMessageType.NotifyActiveMatch]: { id: string; url: string; domain: string; }; }[T]; export async function sendTabBroadcast(message: T, data: TabMessageData) { await browser.runtime.sendMessage({ type: message, data: data }); } export async function sendTabMessageToActiveTab(message: T, data: TabMessageData) { const tabs = await browser.tabs.query({ active: true, currentWindow: true }); await browser.tabs.sendMessage(tabs[0].id!, { type: message, data: data }).catch(() => {}); } export function listenTabMessages(listener: (type: TabMessageType, data: any) => void): () => void { const callback = (callbackData: { type: TabMessageType; data: any }) => { const { type, data } = callbackData; listener(type, data); }; browser.runtime.onMessage.addListener(callback); return () => browser.runtime.onMessage.removeListener(callback); } // --- background script communication --- // export enum BackgroundMessageType { Ff2mpv, RequestTabUrl } export type BackgroundMessageData = { [BackgroundMessageType.Ff2mpv]: { url: string; }; [BackgroundMessageType.RequestTabUrl]: undefined; }[T]; export type BackgroundMessageReply = { [BackgroundMessageType.Ff2mpv]: undefined; [BackgroundMessageType.RequestTabUrl]: string | null; }[T]; export async function sendBackgroundMessage( message: T, data: BackgroundMessageData ): Promise> { const response = await browser.runtime.sendMessage({ type: message, data: data }); return response; }