import { type NamespacesInstancesV1, type NamespacesStaticV1 } from "@todesktop/client-util";
import { type Ref } from "./invoke.js";
declare type KeyOf<T> = Extract<keyof T, string>;
interface Events {
    [key: string]: (...args: unknown[]) => void;
}
interface LegacyEvents {
    [key: string]: string;
}
export interface ListenerEvent {
    sender: {
        id: string;
        namespace: string;
        type: string;
    };
}
export declare type NamespaceEvents<T extends Events> = {
    [P in keyof T]: (...args: Parameters<T[P]>) => ReturnType<T[P]>;
};
declare type AddEventListenerFn<T extends Events, RequiredRef extends boolean> = <E extends KeyOf<T>>(eventName: E, callback: T[E], ...args: RequiredRef extends true ? [{
    ref: Ref;
    preventDefault?: boolean;
}] : [{
    ref?: Ref;
    preventDefault?: boolean;
}?]) => Promise<() => Promise<void>>;
declare type RemoveAllListenersFn<T extends Events, RequiredRef extends boolean> = <E extends KeyOf<T>>(eventName: E, ...args: RequiredRef extends true ? [{
    ref: Ref;
}] : [{
    ref?: Ref;
}?]) => Promise<void>;
declare type NamespaceListenersReturnApi<T extends Events, RequiredRef extends boolean> = {
    removeAllListeners: RemoveAllListenersFn<T, RequiredRef>;
    on: AddEventListenerFn<T, RequiredRef>;
};
export declare const createOnAndOffNamespaceListeners: <T extends Events, RequiredRef extends boolean>(namespace: keyof (NamespacesStaticV1 & NamespacesInstancesV1), compatibleWithVersionsAfter?: string) => NamespaceListenersReturnApi<T, RequiredRef>;
export declare const createOnAndOffNamespaceListenersWithCompatiblityForLegacyEvents: <T extends Events, U extends LegacyEvents, RequiredRef extends boolean>(legacyMappings: U, namespace: keyof (NamespacesStaticV1 & NamespacesInstancesV1)) => NamespaceListenersReturnApi<T, RequiredRef>;
export declare const isDev: boolean;
export {};
