/**
 * 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 {};
