UNPKG

@lynker-desktop/electron-ipc

Version:

electron-ipc

127 lines (124 loc) 4.54 kB
import { getRandomUUID } from '../common/index.js'; export { WINDOWL_GLOBAL_KEY } from '../common/index.js'; const getIpc = () => { try { // @ts-ignore return window.__ELECTRON_IPC__ || window?.require('electron').ipcRenderer; } catch (error) { console.error('当前非桌面端环境, 请在桌面端中调用'); return {}; } }; class RendererIPC { /** * 原生ipcRenderer */ static get ipcRenderer() { return getIpc(); } /** * 发送给主进程消息 * 使用 Electron 原生的 invoke 方法,支持并发请求 * @param channel 消息通道名称 * @param args 传递给处理器的参数 * @returns Promise<any> 返回处理结果 */ static async invokeMain(channel, ...args) { return await RendererIPC.ipcRenderer.invoke(channel, ...args); } /** * 处理主进程发送过来的消息 * 支持 requestId 机制,确保并发请求正确匹配 * @param channel 消息通道名称 * @param handler 处理函数,接收除 requestId 外的所有参数 */ static handleMain(channel, handler) { RendererIPC.ipcRenderer.on(channel, async (_event, requestId, ...args) => { const result = await handler(...args); RendererIPC.ipcRenderer.send(`${channel}-reply-${requestId}`, result); }); return { cancel: () => { RendererIPC.ipcRenderer.removeListener(channel, handler); } }; } /** * 发送给渲染进程消息 * 使用唯一的 requestId 确保并发请求不会互相干扰 * @param channel 消息通道名称 * @param args 传递给渲染进程的参数 * @returns Promise<any> 返回渲染进程的处理结果 */ static invokeRenderer(channel, ...args) { return new Promise(resolve => { const requestId = getRandomUUID(); RendererIPC.ipcRenderer.once(`${channel}-reply-${requestId}`, (_event, result) => { resolve(result); }); RendererIPC.ipcRenderer.send('relay-message', { channel, requestId, args }); }); } /** * 发送给指定渲染进程消息 * 使用唯一的 requestId 确保并发请求不会互相干扰 * @param targetWindowId 目标窗口ID * @param channel 消息通道名称 * @param args 传递给渲染进程的参数 * @returns Promise<any> 返回渲染进程的处理结果 */ static invokeRendererByWinId(targetWindowId, channel, ...args) { return new Promise(resolve => { const requestId = getRandomUUID(); RendererIPC.ipcRenderer.once(`${channel}-reply-${requestId}`, (_event, result) => { resolve(result); }); RendererIPC.ipcRenderer.send('relay-message', { targetWindowId, channel, requestId, args }); }); } /** * 处理渲染进程发送过来的消息 * 支持 requestId 机制,确保并发请求正确匹配 * @param channel 消息通道名称 * @param handler 处理函数,接收除 requestId 外的所有参数 */ static handleRenderer(channel, handler) { RendererIPC.ipcRenderer.on(channel, async (_event, requestId, ...args) => { const result = await handler(...args); RendererIPC.ipcRenderer.send('relay-reply', { originalChannel: channel, requestId, result }); }); return { cancel: () => { RendererIPC.ipcRenderer.removeListener(channel, handler); } }; } /** * 获取当前渲染进程id */ static async getCurrentWebContentId() { return new Promise(resolve => { const channel = `__GetCurrentWebContentId__`; RendererIPC.ipcRenderer.once(`${channel}-reply`, (_event, result) => { resolve(result); }); RendererIPC.ipcRenderer.send(channel); }); } /** * 打开当前窗口的开发者工具 * @returns */ static async openCurrentWebContentDevTools() { return new Promise(resolve => { const channel = `__OpenCurrentWebContentDevTools__`; RendererIPC.ipcRenderer.once(`${channel}-reply`, (_event, result) => { resolve(result); }); RendererIPC.ipcRenderer.send(channel); }); } } export { RendererIPC, getIpc }; //# sourceMappingURL=index.js.map