webext-typed-messages
Version:
Better WebExtension sendMessage API
90 lines (89 loc) • 2.69 kB
TypeScript
/**
* 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 {};