@lynker-desktop/electron-ipc 0.0.9-alpha.5 → 0.0.9-alpha.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAA;AAG7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,eAAO,MAAM,MAAM,QAAO,WAQzB,CAAA;AAED,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,KAAK,WAAW,yBAErB;IACD;;;;;OAKG;IACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAQnE;;;;;OAKG;WACS,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAGrE;;;;OAIG;IACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAM/E;;;;OAIG;IACJ,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAM3E;;;;;OAKG;IACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IASnE;;;;;;OAMG;IACJ,MAAM,CAAC,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IASlG;;;;OAIG;IACJ,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAOnF;;;;OAIG;IACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAO/E;;OAEG;WACU,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUtD;;;OAGG;WACU,6BAA6B,IAAI,OAAO,CAAC,MAAM,CAAC;CAS9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAA;AAG7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,eAAO,MAAM,MAAM,QAAO,WAQzB,CAAA;AAED,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,KAAK,WAAW,yBAErB;IACD;;;;;;OAMG;WACS,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAGrE;;;;;OAKG;IACJ,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;;;IAW3E;;;;;;OAMG;IACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAUnE;;;;;;;OAOG;IACJ,MAAM,CAAC,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAUlG;;;;;OAKG;IACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;;;IAY/E;;OAEG;WACU,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUtD;;;OAGG;WACU,6BAA6B,IAAI,OAAO,CAAC,MAAM,CAAC;CAS9D"}
@@ -1,6 +1,6 @@
1
+ import { getRandomUUID } from '../common/index.js';
1
2
  export { WINDOWL_GLOBAL_KEY } from '../common/index.js';
2
3
 
3
- // import { getRandomUUID } from '../common';
4
4
  const getIpc = () => {
5
5
  try {
6
6
  // @ts-ignore
@@ -18,101 +18,82 @@ class RendererIPC {
18
18
  static get ipcRenderer() {
19
19
  return getIpc();
20
20
  }
21
- /**
22
- * 发送一次性给主进程消息
23
- * @param channel
24
- * @param args
25
- * @returns
26
- */
27
- static invokeMainOnce(channel, ...args) {
28
- return new Promise(resolve => {
29
- getIpc().once(`${channel}-reply`, (_event, result) => {
30
- resolve(result);
31
- });
32
- getIpc().send(channel, ...args);
33
- });
34
- }
35
21
  /**
36
22
  * 发送给主进程消息
37
- * @param channel
38
- * @param args
39
- * @returns
23
+ * 使用 Electron 原生的 invoke 方法,支持并发请求
24
+ * @param channel 消息通道名称
25
+ * @param args 传递给处理器的参数
26
+ * @returns Promise<any> 返回处理结果
40
27
  */
41
28
  static async invokeMain(channel, ...args) {
42
- return await getIpc().invoke(channel, ...args);
43
- }
44
- /**
45
- * 处理一次性主进程发送过来的消息
46
- * @param channel
47
- * @param handler
48
- */
49
- static handleMainOnce(channel, handler) {
50
- getIpc().once(channel, async (_event, ...args) => {
51
- const result = await handler(...args);
52
- getIpc().send(`${channel}-reply`, result);
53
- });
29
+ return await RendererIPC.ipcRenderer.invoke(channel, ...args);
54
30
  }
55
31
  /**
56
32
  * 处理主进程发送过来的消息
57
- * @param channel
58
- * @param handler
33
+ * 支持 requestId 机制,确保并发请求正确匹配
34
+ * @param channel 消息通道名称
35
+ * @param handler 处理函数,接收除 requestId 外的所有参数
59
36
  */
60
37
  static handleMain(channel, handler) {
61
- getIpc().on(channel, async (_event, ...args) => {
38
+ RendererIPC.ipcRenderer.on(channel, async (_event, requestId, ...args) => {
62
39
  const result = await handler(...args);
63
- getIpc().send(`${channel}-reply`, result);
40
+ RendererIPC.ipcRenderer.send(`${channel}-reply-${requestId}`, result);
64
41
  });
42
+ return {
43
+ cancel: () => {
44
+ RendererIPC.ipcRenderer.removeListener(channel, handler);
45
+ }
46
+ };
65
47
  }
66
48
  /**
67
49
  * 发送给渲染进程消息
68
- * @param channel
69
- * @param args
70
- * @returns
50
+ * 使用唯一的 requestId 确保并发请求不会互相干扰
51
+ * @param channel 消息通道名称
52
+ * @param args 传递给渲染进程的参数
53
+ * @returns Promise<any> 返回渲染进程的处理结果
71
54
  */
72
55
  static invokeRenderer(channel, ...args) {
73
56
  return new Promise(resolve => {
74
- getIpc().once(`${channel}-reply`, (_event, result) => {
57
+ const requestId = getRandomUUID();
58
+ RendererIPC.ipcRenderer.once(`${channel}-reply-${requestId}`, (_event, result) => {
75
59
  resolve(result);
76
60
  });
77
- getIpc().send('relay-message', { channel, args });
61
+ RendererIPC.ipcRenderer.send('relay-message', { channel, requestId, args });
78
62
  });
79
63
  }
80
64
  /**
81
65
  * 发送给指定渲染进程消息
82
- * @param targetWindowId
83
- * @param channel
84
- * @param args
85
- * @returns
66
+ * 使用唯一的 requestId 确保并发请求不会互相干扰
67
+ * @param targetWindowId 目标窗口ID
68
+ * @param channel 消息通道名称
69
+ * @param args 传递给渲染进程的参数
70
+ * @returns Promise<any> 返回渲染进程的处理结果
86
71
  */
87
72
  static invokeRendererByWinId(targetWindowId, channel, ...args) {
88
73
  return new Promise(resolve => {
89
- getIpc().once(`${channel}-reply`, (_event, result) => {
74
+ const requestId = getRandomUUID();
75
+ RendererIPC.ipcRenderer.once(`${channel}-reply-${requestId}`, (_event, result) => {
90
76
  resolve(result);
91
77
  });
92
- getIpc().send('relay-message', { targetWindowId, channel, args });
93
- });
94
- }
95
- /**
96
- * 处理一次性渲染进程发送过来的消息
97
- * @param channel
98
- * @param handler
99
- */
100
- static handleRendererOnce(channel, handler) {
101
- getIpc().once(channel, async (_event, ...args) => {
102
- const result = await handler(...args);
103
- getIpc().send('relay-reply', { originalChannel: channel, result });
78
+ RendererIPC.ipcRenderer.send('relay-message', { targetWindowId, channel, requestId, args });
104
79
  });
105
80
  }
106
81
  /**
107
82
  * 处理渲染进程发送过来的消息
108
- * @param channel
109
- * @param handler
83
+ * 支持 requestId 机制,确保并发请求正确匹配
84
+ * @param channel 消息通道名称
85
+ * @param handler 处理函数,接收除 requestId 外的所有参数
110
86
  */
111
87
  static handleRenderer(channel, handler) {
112
- getIpc().on(channel, async (_event, ...args) => {
88
+ RendererIPC.ipcRenderer.on(channel, async (_event, requestId, ...args) => {
113
89
  const result = await handler(...args);
114
- getIpc().send('relay-reply', { originalChannel: channel, result });
90
+ RendererIPC.ipcRenderer.send('relay-reply', { originalChannel: channel, requestId, result });
115
91
  });
92
+ return {
93
+ cancel: () => {
94
+ RendererIPC.ipcRenderer.removeListener(channel, handler);
95
+ }
96
+ };
116
97
  }
117
98
  /**
118
99
  * 获取当前渲染进程id
@@ -120,10 +101,10 @@ class RendererIPC {
120
101
  static async getCurrentWebContentId() {
121
102
  return new Promise(resolve => {
122
103
  const channel = `__GetCurrentWebContentId__`;
123
- getIpc().once(`${channel}-reply`, (_event, result) => {
104
+ RendererIPC.ipcRenderer.once(`${channel}-reply`, (_event, result) => {
124
105
  resolve(result);
125
106
  });
126
- getIpc().send(channel);
107
+ RendererIPC.ipcRenderer.send(channel);
127
108
  });
128
109
  }
129
110
  /**
@@ -133,10 +114,10 @@ class RendererIPC {
133
114
  static async openCurrentWebContentDevTools() {
134
115
  return new Promise(resolve => {
135
116
  const channel = `__OpenCurrentWebContentDevTools__`;
136
- getIpc().once(`${channel}-reply`, (_event, result) => {
117
+ RendererIPC.ipcRenderer.once(`${channel}-reply`, (_event, result) => {
137
118
  resolve(result);
138
119
  });
139
- getIpc().send(channel);
120
+ RendererIPC.ipcRenderer.send(channel);
140
121
  });
141
122
  }
142
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["import type { IpcRenderer, IpcRendererEvent } from 'electron'\n// import { getRandomUUID } from '../common';\n\nexport { WINDOWL_GLOBAL_KEY } from '../common'\n\nexport const getIpc = (): IpcRenderer => {\n try {\n // @ts-ignore\n return window.__ELECTRON_IPC__ || window?.require('electron').ipcRenderer\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\nexport class RendererIPC {\n /**\n * 原生ipcRenderer\n */\n static get ipcRenderer() {\n return getIpc()\n }\n /**\n * 发送一次性给主进程消息\n * @param channel\n * @param args\n * @returns\n */\n\tstatic invokeMainOnce(channel: string, ...args: any[]): Promise<any> {\n\t\treturn new Promise(resolve => {\n\t\t\tgetIpc().once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tgetIpc().send(channel, ...args)\n\t\t})\n\t}\n /**\n * 发送给主进程消息\n * @param channel\n * @param args\n * @returns\n */\n\tstatic async invokeMain(channel: string, ...args: any[]): Promise<any> {\n\t\treturn await getIpc().invoke(channel, ...args)\n\t}\n /**\n * 处理一次性主进程发送过来的消息\n * @param channel\n * @param handler\n */\n\tstatic handleMainOnce(channel: string, handler: (...args: any[]) => Promise<any>) {\n\t\tgetIpc().once(channel, async (_event: IpcRendererEvent, ...args: any[]) => {\n\t\t\tconst result = await handler(...args)\n\t\t\tgetIpc().send(`${channel}-reply`, result)\n\t\t})\n\t}\n /**\n * 处理主进程发送过来的消息\n * @param channel\n * @param handler\n */\n\tstatic handleMain(channel: string, handler: (...args: any[]) => Promise<any>) {\n\t\tgetIpc().on(channel, async (_event: IpcRendererEvent, ...args: any[]) => {\n\t\t\tconst result = await handler(...args)\n\t\t\tgetIpc().send(`${channel}-reply`, result)\n\t\t})\n\t}\n /**\n * 发送给渲染进程消息\n * @param channel\n * @param args\n * @returns\n */\n\tstatic invokeRenderer(channel: string, ...args: any[]): Promise<any> {\n\t\treturn new Promise(resolve => {\n\t\t\tgetIpc().once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tgetIpc().send('relay-message', { channel, args })\n\t\t})\n\t}\n\n /**\n * 发送给指定渲染进程消息\n * @param targetWindowId\n * @param channel\n * @param args\n * @returns\n */\n\tstatic invokeRendererByWinId(targetWindowId: number, channel: string, ...args: any[]): Promise<any> {\n\t\treturn new Promise(resolve => {\n\t\t\tgetIpc().once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tgetIpc().send('relay-message', { targetWindowId, channel, args })\n\t\t})\n\t}\n\n /**\n * 处理一次性渲染进程发送过来的消息\n * @param channel\n * @param handler\n */\n\tstatic handleRendererOnce(channel: string, handler: (...args: any[]) => Promise<any>) {\n\t\tgetIpc().once(channel, async (_event: IpcRendererEvent, ...args: any[]) => {\n\t\t\tconst result = await handler(...args)\n\t\t\tgetIpc().send('relay-reply', { originalChannel: channel, result })\n\t\t})\n\t}\n\n /**\n * 处理渲染进程发送过来的消息\n * @param channel\n * @param handler\n */\n\tstatic handleRenderer(channel: string, handler: (...args: any[]) => Promise<any>) {\n\t\tgetIpc().on(channel, async (_event: IpcRendererEvent, ...args: any[]) => {\n\t\t\tconst result = await handler(...args)\n\t\t\tgetIpc().send('relay-reply', { originalChannel: channel, result })\n\t\t})\n\t}\n\n /**\n * 获取当前渲染进程id\n */\n static async getCurrentWebContentId(): Promise<number> {\n return new Promise(resolve => {\n const channel = `__GetCurrentWebContentId__`\n\t\t\tgetIpc().once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tgetIpc().send(channel)\n\t\t})\n }\n\n /**\n * 打开当前窗口的开发者工具\n * @returns\n */\n static async openCurrentWebContentDevTools(): Promise<number> {\n return new Promise(resolve => {\n const channel = `__OpenCurrentWebContentDevTools__`\n\t\t\tgetIpc().once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tgetIpc().send(channel)\n\t\t})\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["import type { IpcRenderer, IpcRendererEvent } from 'electron'\nimport { getRandomUUID } from '../common';\n\nexport { WINDOWL_GLOBAL_KEY } from '../common'\n\nexport const getIpc = (): IpcRenderer => {\n try {\n // @ts-ignore\n return window.__ELECTRON_IPC__ || window?.require('electron').ipcRenderer\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\nexport class RendererIPC {\n /**\n * 原生ipcRenderer\n */\n static get ipcRenderer() {\n return getIpc()\n }\n /**\n * 发送给主进程消息\n * 使用 Electron 原生的 invoke 方法,支持并发请求\n * @param channel 消息通道名称\n * @param args 传递给处理器的参数\n * @returns Promise<any> 返回处理结果\n */\n\tstatic async invokeMain(channel: string, ...args: any[]): Promise<any> {\n\t\treturn await RendererIPC.ipcRenderer.invoke(channel, ...args)\n\t}\n /**\n * 处理主进程发送过来的消息\n * 支持 requestId 机制,确保并发请求正确匹配\n * @param channel 消息通道名称\n * @param handler 处理函数,接收除 requestId 外的所有参数\n */\n\tstatic handleMain(channel: string, handler: (...args: any[]) => Promise<any>) {\n\t\tRendererIPC.ipcRenderer.on(channel, async (_event: IpcRendererEvent, requestId: string, ...args: any[]) => {\n\t\t\tconst result = await handler(...args)\n\t\t\tRendererIPC.ipcRenderer.send(`${channel}-reply-${requestId}`, result)\n\t\t})\n return {\n cancel: () => {\n RendererIPC.ipcRenderer.removeListener(channel, handler)\n }\n };\n\t}\n /**\n * 发送给渲染进程消息\n * 使用唯一的 requestId 确保并发请求不会互相干扰\n * @param channel 消息通道名称\n * @param args 传递给渲染进程的参数\n * @returns Promise<any> 返回渲染进程的处理结果\n */\n\tstatic invokeRenderer(channel: string, ...args: any[]): Promise<any> {\n\t\treturn new Promise(resolve => {\n\t\t\tconst requestId = getRandomUUID()\n\t\t\tRendererIPC.ipcRenderer.once(`${channel}-reply-${requestId}`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tRendererIPC.ipcRenderer.send('relay-message', { channel, requestId, args })\n\t\t})\n\t}\n\n /**\n * 发送给指定渲染进程消息\n * 使用唯一的 requestId 确保并发请求不会互相干扰\n * @param targetWindowId 目标窗口ID\n * @param channel 消息通道名称\n * @param args 传递给渲染进程的参数\n * @returns Promise<any> 返回渲染进程的处理结果\n */\n\tstatic invokeRendererByWinId(targetWindowId: number, channel: string, ...args: any[]): Promise<any> {\n\t\treturn new Promise(resolve => {\n\t\t\tconst requestId = getRandomUUID()\n\t\t\tRendererIPC.ipcRenderer.once(`${channel}-reply-${requestId}`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tRendererIPC.ipcRenderer.send('relay-message', { targetWindowId, channel, requestId, args })\n\t\t})\n\t}\n\n /**\n * 处理渲染进程发送过来的消息\n * 支持 requestId 机制,确保并发请求正确匹配\n * @param channel 消息通道名称\n * @param handler 处理函数,接收除 requestId 外的所有参数\n */\n\tstatic handleRenderer(channel: string, handler: (...args: any[]) => Promise<any>) {\n\t\tRendererIPC.ipcRenderer.on(channel, async (_event: IpcRendererEvent, requestId: string, ...args: any[]) => {\n\t\t\tconst result = await handler(...args)\n\t\t\tRendererIPC.ipcRenderer.send('relay-reply', { originalChannel: channel, requestId, result })\n\t\t})\n return {\n cancel: () => {\n RendererIPC.ipcRenderer.removeListener(channel, handler)\n }\n };\n\t}\n\n /**\n * 获取当前渲染进程id\n */\n static async getCurrentWebContentId(): Promise<number> {\n return new Promise(resolve => {\n const channel = `__GetCurrentWebContentId__`\n\t\t\tRendererIPC.ipcRenderer.once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tRendererIPC.ipcRenderer.send(channel)\n\t\t})\n }\n\n /**\n * 打开当前窗口的开发者工具\n * @returns\n */\n static async openCurrentWebContentDevTools(): Promise<number> {\n return new Promise(resolve => {\n const channel = `__OpenCurrentWebContentDevTools__`\n\t\t\tRendererIPC.ipcRenderer.once(`${channel}-reply`, (_event: IpcRendererEvent, result: any) => {\n\t\t\t\tresolve(result)\n\t\t\t})\n\t\t\tRendererIPC.ipcRenderer.send(channel)\n\t\t})\n }\n}\n"],"names":[],"mappings":"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"}
package/main/index.d.ts CHANGED
@@ -1,60 +1,123 @@
1
1
  export declare let isInitialized: boolean;
2
+ /**
3
+ * 主进程 IPC 通信类
4
+ * 负责处理主进程与渲染进程之间的消息通信
5
+ * 使用单例模式确保全局唯一实例
6
+ *
7
+ * 修复说明:
8
+ * - 为每个请求生成唯一的 requestId,解决并发请求数据错乱问题
9
+ * - 确保请求和响应能够正确匹配,避免多个并发请求互相干扰
10
+ */
2
11
  declare class MainIPC {
3
12
  static instance: MainIPC;
4
13
  private eventEmitter;
5
14
  constructor();
6
15
  /**
7
16
  * 发送给主进程消息
8
- * @param channel
9
- * @param args
10
- * @returns
17
+ * 使用唯一的 requestId 确保并发请求不会互相干扰
18
+ *
19
+ * @param channel 消息通道名称
20
+ * @param args 传递给处理器的参数
21
+ * @returns Promise<any> 返回处理结果
22
+ *
23
+ * 修复说明:
24
+ * - 为每个请求生成唯一的 requestId
25
+ * - 监听 `${channel}-reply-${requestId}` 事件,确保只接收对应请求的回复
26
+ * - 发送请求时包含 requestId,让处理器知道如何回复
11
27
  */
12
- invokeMain(channel: string, ...args: any[]): Promise<unknown>;
13
- /**
14
- * 处理一次性主进程发送过来的消息
15
- * @param channel
16
- * @param handler
17
- */
18
- handleMainOnce(channel: string, handler: (...args: any[]) => Promise<any>): void;
28
+ invokeMain(channel: string, ...args: any[]): Promise<any>;
19
29
  /**
20
30
  * 处理主进程发送过来的消息
21
- * @param channel
22
- * @param handler
31
+ * 持续监听指定通道的消息
32
+ *
33
+ * @param channel 消息通道名称
34
+ * @param handler 处理函数,接收除 requestId 外的所有参数
35
+ *
36
+ * 修复说明:
37
+ * - 接收 requestId 作为第一个参数
38
+ * - 使用 `${channel}-reply-${requestId}` 发送回复,确保回复给正确的请求
39
+ * - 支持多个并发请求,每个请求都有独立的回复通道
23
40
  */
24
- handleMain(channel: string, handler: (...args: any[]) => Promise<any>): void;
41
+ handleMain(channel: string, handler: (...args: any[]) => Promise<any>): {
42
+ cancel: () => void;
43
+ };
25
44
  /**
26
45
  * 发送给渲染进程消息
27
- * @param webContents
28
- * @param channel
29
- * @param args
30
- * @returns
46
+ * 使用唯一的 requestId 确保并发请求不会互相干扰
47
+ *
48
+ * @param webContents 目标渲染进程的 WebContents 对象
49
+ * @param channel 消息通道名称
50
+ * @param args 传递给渲染进程的参数
51
+ * @returns Promise<any> 返回渲染进程的处理结果
52
+ *
53
+ * 修复说明:
54
+ * - 为每个请求生成唯一的 requestId
55
+ * - 监听 `${channel}-reply-${requestId}` 事件,确保只接收对应请求的回复
56
+ * - 发送请求时包含 requestId,让渲染进程知道如何回复
57
+ * - 等待渲染进程加载完成后再发送消息,确保消息能够被正确接收
31
58
  */
32
59
  invokeRenderer(webContents: Electron.WebContents, channel: string, ...args: any[]): Promise<any>;
33
60
  /**
34
- * 发送给所有渲染进程消息
35
- * @param channel
36
- * @param args
37
- * @returns
38
- */
61
+ * 发送给所有渲染进程消息
62
+ * 向所有渲染进程发送消息并收集所有响应
63
+ *
64
+ * @param channel 消息通道名称
65
+ * @param args 传递给所有渲染进程的参数
66
+ * @returns Promise<any[]> 返回所有渲染进程的处理结果数组
67
+ *
68
+ * 修复说明:
69
+ * - 为每个请求生成唯一的 requestId
70
+ * - 收集所有渲染进程的响应,当所有响应都收到时才 resolve
71
+ * - 使用 `${channel}-reply-${requestId}` 确保只接收对应请求的回复
72
+ * - 如果没有渲染进程,直接返回空数组
73
+ * - 等待每个渲染进程加载完成后再发送消息
74
+ */
39
75
  invokeAllRenderer(channel: string, ...args: any[]): Promise<any>;
40
- /**
41
- * 处理一次性渲染进程发送过来的消息
42
- * @param channel
43
- * @param handler
44
- */
45
- handleRendererOnce(channel: string, handler: (...args: any[]) => Promise<any>): void;
46
76
  /**
47
77
  * 处理渲染进程发送过来的消息
48
- * @param channel
49
- * @param handler
78
+ * 持续监听指定通道的消息,支持超时处理
79
+ *
80
+ * @param channel 消息通道名称
81
+ * @param handler 处理函数,接收除 requestId 外的所有参数
82
+ *
83
+ * 修复说明:
84
+ * - 接收 requestId 作为第一个参数
85
+ * - 使用 ipcMain.handle 替代 ipcMain.on,提供更好的错误处理
86
+ * - 支持 8 秒超时机制,避免长时间等待
87
+ * - 支持并发请求,每个请求都有独立的处理流程
88
+ * - 提供详细的错误日志记录
50
89
  */
51
- handleRenderer(channel: string, handler: (...args: any[]) => Promise<any>): void;
90
+ handleRenderer(channel: string, handler: (...args: any[]) => Promise<any>): {
91
+ cancel: () => void;
92
+ };
52
93
  /**
53
- * 初始化
94
+ * 初始化消息中继功能
95
+ * 设置消息转发和回复机制,支持跨渲染进程通信
96
+ *
97
+ * 功能说明:
98
+ * - relay-message: 转发消息到指定的渲染进程或所有渲染进程
99
+ * - relay-reply: 处理回复消息,广播给所有渲染进程
100
+ * - __GetCurrentWebContentId__: 获取当前 WebContent ID
101
+ * - __OpenCurrentWebContentDevTools__: 打开当前 WebContent 的开发者工具
54
102
  */
55
103
  relayMessage(): void;
56
104
  }
105
+ /**
106
+ * 全局 MainIPC 实例
107
+ * 使用全局变量确保单例模式,避免重复创建实例
108
+ */
57
109
  export declare const mainIPC: MainIPC;
110
+ /**
111
+ * 初始化 IPC 通信系统
112
+ * 设置消息中继功能,确保跨进程通信正常工作
113
+ *
114
+ * @returns MainIPC 实例
115
+ *
116
+ * 功能说明:
117
+ * - 检查是否已经初始化,避免重复初始化
118
+ * - 设置消息中继功能,支持跨渲染进程通信
119
+ * - 返回全局 MainIPC 实例
120
+ */
58
121
  export declare const initialize: () => any;
59
122
  export {};
60
123
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AAIA,eAAO,IAAI,aAAa,SAAQ,CAAC;AACjC,cAAM,OAAO;IACZ,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAA;IACxB,OAAO,CAAC,YAAY,CAAmC;;IAUtD;;;;;OAKG;IACE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAS/C;;;;OAIG;IACJ,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAOxE;;;;OAIG;IACJ,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAOpE;;;;;;OAMG;IACJ,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAoB/F;;;;;OAKG;IACJ,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAqB/D;;;;OAIG;IACJ,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAM5E;;;;OAIG;IACJ,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;IAqCxE;;OAEG;IACJ,YAAY;CA8CZ;AAED,eAAO,MAAM,OAAO,EAAE,OAAgH,CAAC;AAEvI,eAAO,MAAM,UAAU,WAWtB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AAIA,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC;;;;;;;;GAQG;AACH,cAAM,OAAO;IACZ,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAA;IACxB,OAAO,CAAC,YAAY,CAAmC;;IAUtD;;;;;;;;;;;;OAYG;IACE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IA8B9D;;;;;;;;;;;OAWG;IACJ,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;;;IAYpE;;;;;;;;;;;;;;OAcG;IACJ,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IA+C7F;;;;;;;;;;;;;;KAcC;IACJ,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAuD/D;;;;;;;;;;;;;OAaG;IACJ,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC;;;IAyCxE;;;;;;;;;OASG;IACJ,YAAY;CAkEZ;AAED;;;GAGG;AAEH,eAAO,MAAM,OAAO,EAAE,OAAgH,CAAC;AAEvI;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,WAWtB,CAAA"}