import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron' // Whitelist of valid channels used for IPC communication (Send message from Renderer to Main) const mainAvailChannels: string[] = [ 'msgRequestGetVersion', 'msgOpenExternalLink', 'msgOpenFile' ] const rendererAvailChannels: string[] = [] contextBridge.exposeInMainWorld('mainApi', { send: (channel: string, ...data: any[]): void => { if (mainAvailChannels.includes(channel)) { ipcRenderer.send.apply(null, [channel, ...data]) if (process.env.NODE_ENV === 'development') { console.log({ type: 'send', channel, request: data }) } } else { throw new Error(`Unknown ipc channel name: ${channel}`) } }, on: ( channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void ): void => { if (rendererAvailChannels.includes(channel)) { ipcRenderer.on(channel, listener) } else { throw new Error(`Unknown ipc channel name: ${channel}`) } }, once: ( channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void ): void => { if (rendererAvailChannels.includes(channel)) { ipcRenderer.once(channel, listener) } else { throw new Error(`Unknown ipc channel name: ${channel}`) } }, off: ( channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void ): void => { if (rendererAvailChannels.includes(channel)) { ipcRenderer.off(channel, listener) } else { throw new Error(`Unknown ipc channel name: ${channel}`) } }, invoke: async (channel: string, ...data: any[]): Promise => { if (mainAvailChannels.includes(channel)) { const result = await ipcRenderer.invoke.apply(null, [channel, ...data]) if (process.env.NODE_ENV === 'development') { console.log({ type: 'invoke', channel, request: data, result }) } return result } throw new Error(`Unknown ipc channel name: ${channel}`) } })