interface Sender {
    addEventListener: (name: "message", handler: (event: MessageEvent<unknown>) => void) => void;
    removeEventListener: (name: "message", handler: (event: MessageEvent<unknown>) => void) => void;
}
interface Receiver {
    postMessage: (data: any, targetOrigin?: string | WindowPostMessageOptions) => void;
}
interface IRequest {
    id: string;
    name: string;
    arguments: unknown[];
}
interface IResponseResult {
    id: string;
    name: string;
    result: unknown;
}
interface IResponseError {
    id: string;
    name: string;
    error: string;
}

interface Receive {
    <Controllers extends Record<string, (...args: any[]) => any>>(controllers: Controllers, targetOrigin?: string): Controllers;
    <Controllers extends Record<string, (...args: any[]) => any>>(controllers: Controllers, optionsTargetOrigin?: WindowPostMessageOptions): Controllers;
    cancel(): void;
}
declare function useReceive(sender: Sender & Receiver, receiver?: Receiver): Receive;
declare function useReceive(sender: Sender, receiver: Receiver): Receive;
interface Send {
    <Controllers extends Record<string, (...args: any[]) => any>, Name extends keyof Controllers = keyof Controllers>(name: Name, args: Controllers[Name] extends (...args: infer A) => any ? A : unknown[], targetOrigin?: string): Promise<Awaited<ReturnType<Controllers[Name]>>>;
    <Controllers extends Record<string, (...args: any[]) => any>, Name extends keyof Controllers = keyof Controllers>(name: Name, args: Controllers[Name] extends (...args: infer A) => any ? A : unknown[], postMessageOptions?: WindowPostMessageOptions): Promise<Awaited<ReturnType<Controllers[Name]>>>;
}
declare function useSend(sender: Sender & Receiver, receiver?: Receiver, timeout?: false | number): Send;
declare function useSend(sender: Sender, receiver: Receiver, timeout?: false | number): Send;

export { IRequest, IResponseError, IResponseResult, Receiver, Sender, useReceive, useSend };
