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', 'store-set', 'store-get', 'fetch-models', 'getBaseUrl', 'call-openai', 'openai-partial-response', 'get-api-key', 'set-api-key', 'call-openai-title' ] const rendererAvailChannels: string[] = ['openai-partial-response', 'get-api-key', 'set-api-key'] 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}`) } })