diff --git a/electron/preload/index.ts b/electron/preload/index.ts index 612e19a8..3316868a 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.ts @@ -1,26 +1,15 @@ import { ipcRenderer, contextBridge } from 'electron' // --------- Expose some API to the Renderer process --------- -contextBridge.exposeInMainWorld('ipcRenderer', withPrototype(ipcRenderer)) +contextBridge.exposeInMainWorld('app', { + onEvent(cb) { + const channel = 'main-process-message' + const channel2 = 'other-ipc-channel' -// `exposeInMainWorld` can't detect attributes and methods of `prototype`, manually patching it. -function withPrototype(obj: Record) { - const protos = Object.getPrototypeOf(obj) - - for (const [key, value] of Object.entries(protos)) { - if (Object.prototype.hasOwnProperty.call(obj, key)) continue - - if (typeof value === 'function') { - // Some native APIs, like `NodeJS.EventEmitter['on']`, don't work in the Renderer process. Wrapping them into a function. - obj[key] = function (...args: any) { - return value.call(obj, ...args) - } - } else { - obj[key] = value - } - } - return obj -} + ipcRenderer.on(channel, (_e, ...args) => cb(channel, ...args)) + ipcRenderer.on(channel2, (_e, ...args) => cb(channel2, ...args)) + }, +}) // --------- Preload scripts loading --------- function domReady(condition: DocumentReadyState[] = ['complete', 'interactive']) { diff --git a/src/demos/ipc.ts b/src/demos/ipc.ts index ba4daa0c..c5697a1f 100644 --- a/src/demos/ipc.ts +++ b/src/demos/ipc.ts @@ -1,4 +1,4 @@ -window.ipcRenderer.on('main-process-message', (_event, ...args) => { - console.log('[Receive Main-process message]:', ...args) +window.app.onEvent((channel, ...args) => { + console.log(channel, ...args) }) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 788532e7..5679df78 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -7,6 +7,8 @@ declare module '*.vue' { } interface Window { - // expose in the `electron/preload/index.ts` - ipcRenderer: import('electron').IpcRenderer + app: { + // Expose in the `electron/preload/index.ts` + onEvent: (cb: (channel: string, ...args: any[]) => void) => void + } }