adnbn
Version: 
Addon Bone - Cross-browser web extension framework with shared code base
41 lines (39 loc) • 2.3 kB
TypeScript
declare const MessageGlobalKey = "adnbnMessage";
declare const MessageTypeSeparator = ":";
declare const MessageSenderProperty = "_sender";
type MessageSender = chrome.runtime.MessageSender;
type MessageSendOptions = number | {
    tabId: number;
    frameId?: number;
    documentId?: string;
};
interface MessageDictionary {
    [key: string]: (data: any) => any;
}
interface MessageSenderAware {
    [MessageSenderProperty]?: MessageSender;
}
type MessageType<T extends MessageDictionary> = Extract<keyof T, string>;
type MessageData<T extends MessageDictionary, K extends MessageType<T>> = Parameters<T[K]>[0];
type MessageResponse<T extends MessageDictionary, K extends MessageType<T>> = ReturnType<T[K]>;
type MessageTargetHandler<T extends MessageDictionary, K extends MessageType<T>> = (data: MessageData<T, K>, sender: MessageSender) => MessageResponse<T, K>;
type MessageMapHandler<T extends MessageDictionary> = {
    [K in MessageType<T>]?: MessageTargetHandler<T, K>;
};
type MessageGeneralHandler<T extends MessageDictionary, K extends MessageType<T>> = (type: K, data: MessageData<T, K>, sender: MessageSender) => any;
interface MessageBody<T extends MessageDictionary, K extends MessageType<T>> {
    id: string;
    type: K;
    data: MessageData<T, K>;
    timestamp: number;
}
interface MessageProvider<T extends MessageDictionary, TOptions = void> {
    send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: TOptions): Promise<MessageResponse<T, K>>;
    watch<K extends MessageType<T>>(type: K, handler: MessageTargetHandler<T, K>): () => void;
    watch(map: MessageMapHandler<T>): () => void;
    watch<K extends MessageType<T>>(general: MessageGeneralHandler<T, K>): () => void;
}
interface MessageHandler<T extends MessageDictionary> {
    run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined | null;
}
export { type MessageBody, type MessageData, type MessageDictionary, type MessageGeneralHandler, MessageGlobalKey, type MessageHandler, type MessageMapHandler, type MessageProvider, type MessageResponse, type MessageSendOptions, type MessageSender, type MessageSenderAware, MessageSenderProperty, type MessageTargetHandler, type MessageType, MessageTypeSeparator };