import type { RpcInfo } from './RpcServer' export type AsyncFunction = Function & ((...args: any[]) => Promise) // Our secret tokens to recognise our messages export const RPC_CALL = '__RPC_CALL__' export const RPC_RESPONSE = '__RPC_RESPONSE__' export interface RpcMessage { __WEBEXTENSION_RPC_MESSAGE__: typeof RPC_CALL | typeof RPC_RESPONSE, funcName: string, } export interface RpcCallMessage extends RpcMessage { __WEBEXTENSION_RPC_MESSAGE__: typeof RPC_CALL, funcName: F['name'], args: ReplaceRpcInfo, null>, addRpcInfoAsArgument: number | false, } export type RpcResponseMessage = | RpcResponseResolve | RpcResponseReject | RpcResponseRpcError interface RpcResponseMessage_base { __WEBEXTENSION_RPC_MESSAGE__: typeof RPC_RESPONSE, } interface RpcResponseResolve extends RpcResponseMessage_base { returnValue: ReturnType, } interface RpcResponseReject extends RpcResponseMessage_base { errorMessage: string, } interface RpcResponseRpcError extends RpcResponseMessage_base { rpcError: string, } export function isRpcCallMessage(message: any): message is RpcCallMessage { return !!(message && message['__WEBEXTENSION_RPC_MESSAGE__'] === RPC_CALL) } export function isRpcResponseMessage(message: any): message is RpcResponseMessage { return !!(message && message['__WEBEXTENSION_RPC_MESSAGE__'] === RPC_RESPONSE) } type Tail = T extends [infer _Head, ...infer Tail] ? Tail : []; export type ReplaceRpcInfo, Replacement extends any> = Params extends [RpcInfo, ...any] ? [Replacement, ...Tail] : Params