/**@license
 *  sysend.js - send messages between browser windows/tabs version 1.17.5
 *
 *  Copyright (C) 2014 Jakub T. Jankiewicz <https://jcubic.pl/me>
 *  Released under the MIT license
 *
 */
type callback<T> = (message: T, event: string) => void;

interface Sysend {
    id: string;
    broadcast<T>(event: string, data?: T): void;
    emit(event: string, data?: unknown): void;
    on<T>(event: string, callback: callback<T>): void;
    off<T>(event: string, callback?: callback<T>): void;
    proxy(...args: string[]): void;
    serializer<T>(to: (data: T) => string, from: (data: string) => T): void;
    track(event: 'open', callback: (data: {id: string, count: number, primary: boolean}) => void): void;
    track(event: 'close', callback: (data: {id: string, count: number, primary: boolean, self: boolean}) => void): void;
    track(event: 'primary', callback: () => void): void;
    track<T>(event: 'message', callback: (payload: {data: T, origin: string}) => void): void;
    track(event: 'secondary', callback: () => void): void;
    track(event: 'update', callback: (payload: Array<{ id: string, primary: boolean }>) => void): void;
    untrack(event: 'open' | 'close' | 'primary' | 'secondary' | 'message' | 'update', fn?: (input?: unknown) => void): void;
    list(): Promise<Array<{ id: string, primary: boolean }>>;
    post<T>(target: string, data?: T): void;
    channel(...domains: string[]): void;
    isPrimary(): boolean;
    rpc<T extends Array<unknown>, U>(object: Record<string, (...args: T) => U>): Promise<Record<string, (id: string, ...args: T) => Promise<U>>>
}

declare const sysend: Sysend;

export default sysend;