Skip to content

Commit bff3fff

Browse files
committed
feat: Add the Handle, HandleOnce, and RemoveHandler events to IpcMain
1 parent 456135a commit bff3fff

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

src/ElectronNET.API/API/IpcMain.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,48 @@ public void Send(BrowserView browserView, string channel, params object[] data)
154154
{
155155
BridgeConnector.Socket.Emit("sendToIpcRendererBrowserView", browserView.Id, channel, data);
156156
}
157+
158+
/// <summary>
159+
/// Adds a handler for an invokeable IPC. This handler will be called
160+
/// whenever a renderer calls ipcRenderer.invoke(channel, ...args).
161+
/// </summary>
162+
/// <param name="channel">Channelname.</param>
163+
/// <param name="listener">Callback Method.</param>
164+
public void Handle(string channel, Func<object, object> listener)
165+
{
166+
BridgeConnector.Socket.Emit("registerHandleIpcMainChannel", channel);
167+
BridgeConnector.Socket.On<JsonElement>(channel, (args) =>
168+
{
169+
var arg = FormatArguments(args);
170+
var result = listener(arg);
171+
BridgeConnector.Socket.Emit(channel + "Handle", result);
172+
});
173+
}
174+
175+
/// <summary>
176+
/// Handles a single invokeable IPC message, then removes the listener.
177+
/// See ipcMain.handle(channel, listener).
178+
/// </summary>
179+
/// <param name="channel">Channelname.</param>
180+
/// <param name="listener">Callback Method.</param>
181+
public void HandleOnce(string channel, Func<object, object> listener)
182+
{
183+
BridgeConnector.Socket.Emit("registerHandleOnceIpcMainChannel", channel);
184+
BridgeConnector.Socket.Once<JsonElement>(channel, (args) =>
185+
{
186+
var arg = FormatArguments(args);
187+
var result = listener(arg);
188+
BridgeConnector.Socket.Emit(channel + "HandleOnce", result);
189+
});
190+
}
191+
192+
/// <summary>
193+
/// Removes any handler for channel, if present.
194+
/// </summary>
195+
/// <param name="channel">Channelname.</param>
196+
public void RemoveHandler(string channel)
197+
{
198+
BridgeConnector.Socket.Emit("removeHandlerIpcMainChannel", channel);
199+
}
157200
}
158201
}

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)