UNPKG

webext-typed-messages

Version:

Better WebExtension sendMessage API

90 lines (89 loc) 2.69 kB
/** * Definitions for your custom runtime messages. * * Should be a map of message types to message handler functions. * * @example * * ```ts * declare module "webext-typed-messages" { * interface RuntimeMessages { * hello: (name: string) => string; * } * } * ``` */ export interface RuntimeMessages { } /** * Definitions for your custom tab messages. * * Should be a map of message types to message handler functions. * * @example * * ```ts * declare module "webext-typed-messages" { * interface TabMessages { * add: (a: number, b: number) => Promise<number>; * } * } * ``` */ export interface TabMessages { } /** * Parameters for a message handler. * * @template T - Message handler map * @template M - Message type */ declare type messageParams<T extends {}, M extends keyof T> = T[M] extends (...params: infer P) => any ? P : never; /** * Return type of a message handler. * * @template T - Message handler map * @template M - Message type */ declare type messageResult<T extends {}, M extends keyof T> = T[M] extends (...params: any[]) => infer R ? Awaited<R> : undefined; /** * Sends a runtime message to your registered handlers. * * Call {@link addRuntimeMessageListener} to register your handlers. * * @see {@link chrome.runtime.sendMessage} */ export declare function sendRuntimeMessage<M extends keyof RuntimeMessages>(type: M, ...params: messageParams<RuntimeMessages, M>): Promise<messageResult<RuntimeMessages, M> | undefined>; /** * Sends a message to the content script in the specified tab. * * The content script should call {@link addTabMessageListener} to receive the message. * * @see {@link chrome.tabs.sendMessage} */ export declare function sendTabMessage<M extends keyof TabMessages>(tabId: number, type: M, ...params: messageParams<TabMessages, M>): Promise<messageResult<TabMessages, M> | undefined>; /** * Object of functions for handling messages of each type. * * @template T - Message handler map */ declare type MessageListenerMap<T extends {}> = { [M in keyof T]: (this: void, ...params: messageParams<T, M>) => messageResult<T, M> | Promise<messageResult<T, M>>; }; /** * Registers listeners for runtime messages. * * Should be called in the background script. * * @see {@link chrome.runtime.onMessage} */ export declare function addRuntimeMessageListener(listenerMap: MessageListenerMap<RuntimeMessages>): () => void; /** * Registers listeners for tab messages. * * Should be called in the content script. * * @see {@link chrome.runtime.onMessage} */ export declare function addTabMessageListener(listenerMap: MessageListenerMap<TabMessages>): () => void; export {};