Skip to content

Commit 7174118

Browse files
authored
Merge pull request #1019 from DYH1319/feat/submit_new_event_for_ipc
feat: submit new events for ipcMain
2 parents d85a64f + 092789a commit 7174118

5 files changed

Lines changed: 164 additions & 2 deletions

File tree

docs/Core/Migration-Guide.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dotnet add package ElectronNET.Core.AspNet # For ASP.NET projects
3131
### Step 2: Configure Project Settings
3232

3333
**Auto-generated Configuration:**
34-
ElectronNET.Core automatically creates `electron-builder.json` during the first build or NuGet restore. No manual configuration is needed for basic setups.
34+
ElectronNET.Core automatically creates `electron-builder.json` in the `Properties` folder of your project during the first build or NuGet restore. No manual configuration is needed for basic setups.
3535

3636
**Migrate Existing Configuration:**
3737
If you have an existing `electron.manifest.json` file:
@@ -63,6 +63,9 @@ You can also manually edit `electron-builder.json`:
6363
}
6464
```
6565

66+
**Modify Launch Settings:**
67+
ElectronNET.Core no longer needs a separate CLI tool (electronize.exe) for launching. You should update your launch settings to use either the ASP.NET-first or Electron-first approach. See [Debugging](../Using/Debugging.md) for details.
68+
6669
## 🎯 Testing Migration
6770

6871
After completing the migration steps:

src/ElectronNET.API/API/IpcMain.cs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,29 @@ public void OnSync(string channel, Func<object, object> listener)
102102
});
103103
}
104104

105+
/// <summary>
106+
/// Send a message to the renderer process synchronously via channel,
107+
/// you can also send arbitrary arguments.
108+
///
109+
/// Note: Sending a synchronous message will block the whole renderer process,
110+
/// unless you know what you are doing you should never use it.
111+
/// </summary>
112+
/// <param name="channel"></param>
113+
/// <param name="listener"></param>
114+
public void OnSync(string channel, Func<object, Task<object>> listener)
115+
{
116+
BridgeConnector.Socket.Emit("registerSyncIpcMainChannel", channel);
117+
BridgeConnector.Socket.On<JsonElement>(channel, (args) =>
118+
{
119+
Task.Run(async () =>
120+
{
121+
var arg = FormatArguments(args);
122+
var result = await listener(arg);
123+
BridgeConnector.Socket.Emit(channel + "Sync", result);
124+
});
125+
});
126+
}
127+
105128
/// <summary>
106129
/// Adds a one time listener method for the event. This listener is invoked only
107130
/// the next time a message is sent to channel, after which it is removed.
@@ -154,5 +177,88 @@ public void Send(BrowserView browserView, string channel, params object[] data)
154177
{
155178
BridgeConnector.Socket.Emit("sendToIpcRendererBrowserView", browserView.Id, channel, data);
156179
}
180+
181+
/// <summary>
182+
/// Adds a handler for an invokeable IPC. This handler will be called
183+
/// whenever a renderer calls ipcRenderer.invoke(channel, ...args).
184+
/// </summary>
185+
/// <param name="channel">Channelname.</param>
186+
/// <param name="listener">Callback Method.</param>
187+
public void Handle(string channel, Func<object, object> listener)
188+
{
189+
BridgeConnector.Socket.Emit("registerHandleIpcMainChannel", channel);
190+
BridgeConnector.Socket.On<JsonElement>(channel, (args) =>
191+
{
192+
var arg = FormatArguments(args);
193+
var result = listener(arg);
194+
BridgeConnector.Socket.Emit(channel + "Handle", result);
195+
});
196+
}
197+
198+
/// <summary>
199+
/// Adds a handler for an invokeable IPC. This handler will be called
200+
/// whenever a renderer calls ipcRenderer.invoke(channel, ...args).
201+
/// </summary>
202+
/// <param name="channel">Channelname.</param>
203+
/// <param name="listener">Callback Method.</param>
204+
public void Handle(string channel, Func<object, Task<object>> listener)
205+
{
206+
BridgeConnector.Socket.Emit("registerHandleIpcMainChannel", channel);
207+
BridgeConnector.Socket.On<JsonElement>(channel, (args) =>
208+
{
209+
Task.Run(async () =>
210+
{
211+
var arg = FormatArguments(args);
212+
var result = await listener(arg);
213+
BridgeConnector.Socket.Emit(channel + "Handle", result);
214+
});
215+
});
216+
}
217+
218+
/// <summary>
219+
/// Handles a single invokeable IPC message, then removes the listener.
220+
/// See ipcMain.handle(channel, listener).
221+
/// </summary>
222+
/// <param name="channel">Channelname.</param>
223+
/// <param name="listener">Callback Method.</param>
224+
public void HandleOnce(string channel, Func<object, object> listener)
225+
{
226+
BridgeConnector.Socket.Emit("registerHandleOnceIpcMainChannel", channel);
227+
BridgeConnector.Socket.Once<JsonElement>(channel, (args) =>
228+
{
229+
var arg = FormatArguments(args);
230+
var result = listener(arg);
231+
BridgeConnector.Socket.Emit(channel + "HandleOnce", result);
232+
});
233+
}
234+
235+
/// <summary>
236+
/// Handles a single invokeable IPC message, then removes the listener.
237+
/// See ipcMain.handle(channel, listener).
238+
/// </summary>
239+
/// <param name="channel">Channelname.</param>
240+
/// <param name="listener">Callback Method.</param>
241+
public void HandleOnce(string channel, Func<object, Task<object>> listener)
242+
{
243+
BridgeConnector.Socket.Emit("registerHandleOnceIpcMainChannel", channel);
244+
BridgeConnector.Socket.Once<JsonElement>(channel, (args) =>
245+
{
246+
Task.Run(async () =>
247+
{
248+
var arg = FormatArguments(args);
249+
var result = await listener(arg);
250+
BridgeConnector.Socket.Emit(channel + "HandleOnce", result);
251+
});
252+
});
253+
}
254+
255+
/// <summary>
256+
/// Removes any handler for channel, if present.
257+
/// </summary>
258+
/// <param name="channel">Channelname.</param>
259+
public void RemoveHandler(string channel)
260+
{
261+
BridgeConnector.Socket.Emit("removeHandlerIpcMainChannel", channel);
262+
}
157263
}
158264
}

src/ElectronNET.Host/api/ipc.js

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ElectronNET.Host/api/ipc.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ElectronNET.Host/api/ipc.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,34 @@ export = (socket: Socket) => {
5555
}
5656
});
5757

58+
socket.on('registerHandleIpcMainChannel', (channel) => {
59+
ipcMain.handle(channel, (event, args) => {
60+
return new Promise((resolve, _reject) => {
61+
socket.removeAllListeners(channel + 'Handle');
62+
socket.on(channel + 'Handle', (result) => {
63+
resolve(result);
64+
});
65+
electronSocket.emit(channel, [event.preventDefault(), args]);
66+
});
67+
});
68+
});
69+
70+
socket.on('registerHandleOnceIpcMainChannel', (channel) => {
71+
ipcMain.handleOnce(channel, (event, args) => {
72+
return new Promise((resolve, _reject) => {
73+
socket.removeAllListeners(channel + 'HandleOnce');
74+
socket.once(channel + 'HandleOnce', (result) => {
75+
resolve(result);
76+
});
77+
electronSocket.emit(channel, [event.preventDefault(), args]);
78+
});
79+
});
80+
});
81+
82+
socket.on('removeHandlerIpcMainChannel', (channel) => {
83+
ipcMain.removeHandler(channel);
84+
});
85+
5886
// Integration helpers: programmatically click menu items from renderer tests
5987
ipcMain.on('integration-click-application-menu', (event, id: string) => {
6088
try {

0 commit comments

Comments
 (0)