import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal'; type IPCHandler = (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any export const handleSync = function (channel: string, handler: T) { ipcMainInternal.on(channel, async (event, ...args) => { try { event.returnValue = [null, await handler(event, ...args)]; } catch (error) { event.returnValue = [error]; } }); }; let nextId = 0; export function invokeInWebContents (sender: Electron.WebContentsInternal, sendToAll: boolean, command: string, ...args: any[]) { return new Promise((resolve, reject) => { const requestId = ++nextId; const channel = `${command}_RESPONSE_${requestId}`; ipcMainInternal.on(channel, function handler ( event, error: Electron.SerializedError, result: any ) { if (event.sender !== sender) { console.error(`Reply to ${command} sent by unexpected WebContents (${event.sender.id})`); return; } ipcMainInternal.removeListener(channel, handler); if (error) { reject(error); } else { resolve(result); } }); if (sendToAll) { sender._sendInternalToAll(command, requestId, ...args); } else { sender._sendInternal(command, requestId, ...args); } }); }