import type { IpcMainEvent, IpcMainInvokeEvent, WebContents, } from "electron/main"; import { ipcMain as untypedIpcMain, // eslint-disable-line no-restricted-imports } from "electron/main"; import type { MainCall, MainMessage, RendererMessage, } from "../common/typed-ipc.js"; type MainListener = MainMessage[Channel] extends (...args: infer Args) => infer Return ? (event: IpcMainEvent & {returnValue: Return}, ...args: Args) => void : never; type MainHandler = MainCall[Channel] extends ( ...args: infer Args ) => infer Return ? (event: IpcMainInvokeEvent, ...args: Args) => Return | Promise : never; export const ipcMain: { on( channel: "forward-message", listener: ( event: IpcMainEvent, channel: Channel, ...args: Parameters ) => void, ): void; on( channel: Channel, listener: MainListener, ): void; once( channel: Channel, listener: MainListener, ): void; removeListener( channel: Channel, listener: MainListener, ): void; removeAllListeners(channel?: keyof MainMessage): void; handle( channel: Channel, handler: MainHandler, ): void; handleOnce( channel: Channel, handler: MainHandler, ): void; removeHandler(channel: keyof MainCall): void; } = untypedIpcMain; export function send( contents: WebContents, channel: Channel, ...args: Parameters ): void { contents.send(channel, ...args); } export function sendToFrame( contents: WebContents, frameId: number | [number, number], channel: Channel, ...args: Parameters ): void { contents.sendToFrame(frameId, channel, ...args); }