const electron = require('electron'); electron.contextBridge.exposeInMainWorld('electron', { subscribeStatistics: (callback) => ipcOn('statistics', (stats) => { callback(stats); }), subscribeChangeView: (callback) => ipcOn('changeView', (view) => { callback(view); }), getStaticData: () => ipcInvoke('getStaticData'), sendFrameAction: (payload) => ipcSend('sendFrameAction', payload), } satisfies Window['electron']); function ipcInvoke( key: Key ): Promise { return electron.ipcRenderer.invoke(key); } function ipcOn( key: Key, callback: (payload: EventPayloadMapping[Key]) => void ) { const cb = (_: Electron.IpcRendererEvent, payload: any) => callback(payload); electron.ipcRenderer.on(key, cb); return () => electron.ipcRenderer.off(key, cb); } function ipcSend( key: Key, payload: EventPayloadMapping[Key] ) { electron.ipcRenderer.send(key, payload); }