interface IBroadcastJS {
    close: () => void;
    postMessage: (message: Message) => void;
    onMessage: (messageName: string, onReceive: (message: Message) => void) => void;
    canBrowserSupportBroadcastJS: () => boolean;
    hasListeners: (messageName: string) => boolean;
}
interface Message<T = unknown> {
    message: string;
    data: T;
    isInternal?: boolean;
}
interface BroadcastHandlers {
    onBeforeSendMessage?: (message: Message) => void;
    onAfterSendMessage?: (message: Message) => void;
    onBeforePostMessage?: (message: Message) => void;
    onAfterPostMessage?: (message: Message) => void;
    onBeforeClose?: () => void;
    onAfterClose?: () => void;
    onError?: (message: Message) => void;
}
declare class BroadcastJS implements IBroadcastJS {
    private static bcInstance;
    private static bcJSInstance;
    private static messageCallbacks;
    private static handlers;
    constructor(name: string, handlers?: BroadcastHandlers);
    /**
     * Closes the broadcast channel.
     *
     * @returns {void}
     *
     * @example
     * const broadcast = new BroadcastJS("channelName");
     * broadcast.close();
     */
    close(): void;
    /**
     * Posts a message to the broadcast channel.
     *
     * @param {Message} message - The message to post.
     * @returns {void}
     *
     * @example
     * const broadcast = new BroadcastJS("channelName");
     * broadcast.postMessage({ message: "message", data: { count: 0 } });
     */
    postMessage(message: Message): void;
    /**
     * Calls a callback when a message is received.
     *
     * @param {string} messageName - The name of the message to call the callback for.
     * @param {function} onRecieve - The callback to call when a message is received.
     * @returns {void}
     *
     * @example
     * const broadcast = new BroadcastJS("channelName");
     * broadcast.onMessage("name", (message) => {
     *     console.log(message);
     * });
     */
    onMessage<T>(messageName: string, onRecieve: (message: Message<T>) => void): void;
    removeMessage(messageName: string): void;
    canBrowserSupportBroadcastJS(): boolean;
    hasListeners(messageName: string): boolean;
    private static internalMessage;
    private createMessage;
    private createSerializedMessage;
}

export { BroadcastJS, type Message };
