@electron-toolkit/typed-ipc
Version:
Type-safe Electron IPC, best practices in TypeScript.
41 lines (38 loc) • 1.54 kB
TypeScript
type IpcListenEventMap = {
[key: string]: [...args: any[]];
};
type IpcHandleEventMap = {
[key: string]: (...args: any[]) => any;
};
type IpcEventMap = IpcListenEventMap | IpcHandleEventMap;
type ExtractArgs<T> = T extends IpcListenEventMap ? T : never;
type ExtractHandler<T> = T extends IpcHandleEventMap ? T : never;
/**
* Typed listener for Electron `ipcMain`.
*/
declare class IpcListener<T extends IpcEventMap> {
private listeners;
private handlers;
/**
* Listen to `channel`.
*/
on<E extends keyof ExtractArgs<T>>(channel: Extract<E, string>, listener: (e: Electron.IpcMainEvent, ...args: ExtractArgs<T>[E]) => void | Promise<void>): void;
/**
* Handle a renderer invoke request.
*/
handle<E extends keyof ExtractHandler<T>>(channel: Extract<E, string>, listener: (e: Electron.IpcMainInvokeEvent, ...args: Parameters<ExtractHandler<T>[E]>) => ReturnType<ExtractHandler<T>[E]> | Promise<ReturnType<ExtractHandler<T>[E]>>): void;
/**
* Dispose all listeners and handlers.
*/
dispose(): void;
}
/**
* Typed emitter for sending an asynchronous message to the renderer process.
*/
declare class IpcEmitter<T extends IpcListenEventMap> {
/**
* Send an asynchronous message to the renderer process.
*/
send<E extends keyof T>(sender: Electron.WebContents, channel: Extract<E, string>, ...args: T[E]): void;
}
export { type ExtractArgs, type ExtractHandler, IpcEmitter, type IpcEventMap, type IpcHandleEventMap, type IpcListenEventMap, IpcListener };