import { ipcMain, WebContents, WebFrameMain } from 'electron'; import { getUIPath } from './pathResolver.js'; import { pathToFileURL } from 'url'; export function isDev(): boolean { return process.env.NODE_ENV === 'development'; } export function ipcMainHandle( key: Key, handler: () => EventPayloadMapping[Key] ) { ipcMain.handle(key, (event) => { validateEventFrame(event.senderFrame!); return handler(); }); } export function ipcMainOn( key: Key, handler: (payload: EventPayloadMapping[Key]) => void ) { ipcMain.on(key, (event, payload) => { validateEventFrame(event.senderFrame!); return handler(payload); }); } export function ipcWebContentsSend( key: Key, webContents: WebContents, payload: EventPayloadMapping[Key] ) { webContents.send(key, payload); } export function validateEventFrame(frame: WebFrameMain | null): asserts frame is WebFrameMain { if (!frame) throw new Error('Missing frame'); const url = frame.url; if (isDev() && new URL(url).host === 'localhost:5123') { return; } if (url !== pathToFileURL(getUIPath()).toString()) { throw new Error('Malicious event'); } }