import * as pusher_js_types_src_core_events_callback_registry from 'pusher-js/types/src/core/events/callback_registry';
import * as pusher_js_types_src_core_watchlist from 'pusher-js/types/src/core/watchlist';
import * as pusher_js_types_src_core_user from 'pusher-js/types/src/core/user';
import * as PusherClient from 'pusher-js';
import PusherClient__default, { Channel } from 'pusher-js';
import { z } from 'zod';

type TypeSafePusherClientType<S extends Record<string, Record<string, z.ZodType<any, any>>>, P extends Partial<Record<string, z.ZodType<any, any>>> = Record<string, never>> = {
    joinChannel<K extends keyof S>(channelName: K, id: string | number): Channel & {
        listen<E extends keyof S[K]>(eventName: E, callback: (data: z.infer<S[K][E]>) => void, context?: any): void;
    };
    leaveChannel<K extends keyof S>(channelName: K, id: string | number): void;
    member: {
        bind: <E extends Extract<keyof P, string>>(eventName: E, callback: (data: z.infer<NonNullable<P[E]>>) => void, context?: any) => any;
    };
    subscribe(channelName: string): Channel;
    unsubscribe(channelName: string): void;
    user: PusherClient__default["user"];
    on(eventName: string, callback: Function): void;
};
declare function createPusherClient<S extends Record<string, Record<string, z.ZodType<any, any>>>, P extends Partial<Record<string, z.ZodType<any, any>>> = Record<string, never>>({ setup, channel_id_separator, userEvents, }: {
    setup: S;
    channel_id_separator?: "_" | "-" | "=" | "@" | "," | "." | ";";
    userEvents?: P;
}): {
    TypeSafePusherClient: {
        new (app_key: string, options: PusherClient.Options): {
            pusher: PusherClient__default;
            member: {
                bind: <E extends keyof P>(eventName: E, callback: (data: z.TypeOf<NonNullable<P[E]>>) => void, context?: any) => pusher_js_types_src_core_user.default;
                pusher: PusherClient__default;
                signin_requested: boolean;
                user_data: any;
                serverToUserChannel: Channel;
                signinDonePromise: Promise<any>;
                watchlist: pusher_js_types_src_core_watchlist.default;
                callbacks: pusher_js_types_src_core_events_callback_registry.default;
                global_callbacks: Function[];
                failThrough: Function;
            };
            joinChannel<K extends keyof S>(channelName: K, id: string | number): Channel & {
                listen<E extends keyof S[K]>(eventName: E, callback: (data: z.infer<S[K][E]>) => void, context?: any): void;
            };
            leaveChannel<K extends keyof S>(channelName: K, id: string | number): void;
            subscribe(channelName: string): Channel;
            unsubscribe(channelName: string): void;
            readonly user: PusherClient__default["user"];
            on(eventName: string, callback: Function): void;
        };
    };
};

export { type TypeSafePusherClientType, createPusherClient, createPusherClient as default };
