-
Notifications
You must be signed in to change notification settings - Fork 109
Open
Description
Describe the bug
When devtron.install() is called after other libraries have already registered IPC handlers via ipcMain.handle(), those pre-existing handlers receive devtron's wrapped payload object { __uuid__devtron, args } instead of the original arguments.
This is because:
- Devtron's
patchIpcMain()replacesipcMain.handlewith a wrapper that callsgetArgsFromPayload()to unwrap arguments - However, handlers registered before
patchIpcMain()was called are using the originalipcMain.handle, so they never go through the unwrapping logic - Meanwhile, devtron's renderer-preload always wraps
ipcRenderer.invokecalls with the{ __uuid__devtron, args }payload format
To Reproduce
- Register an IPC handler before devtron is installed:
// Early in app initialization
ipcMain.handle('my-channel', (event, methodName, ...args) => {
console.log('methodName:', methodName); // Expects a string like 'doSomething'
});
2. Install devtron later (e.g., after app.whenReady()):
app.whenReady().then(async () => {
const { devtron } = await import('@electron/devtron');
await devtron.install();
});
3. From the renderer, invoke the channel:
ipcRenderer.invoke('my-channel', 'doSomething', { data: 'test' });
4. Expected: methodName is 'doSomething'
5. Actual: methodName is { __uuid__devtron: '...', args: ['doSomething', { data: 'test' }] }Real-world example
This breaks @bugsnag/electron which registers IPC handlers during module initialization (before devtron can be installed). When calling bugsnag.notify() from the renderer, the main process logs:
[BUGSNAG] attempted to call IPC method named "[object Object]" which doesn't exist
And Bugsnag is initialized before everything else in an Electron app, to catch as many as possible bugs.
Suggested solutions
- Patch existing handlers - When patchIpcMain() is called, retroactively wrap any handlers that were already registered with the unwrapping logic.
OR
- Channel exclusion list - Allow users to specify channels that should be excluded from devtron's payload wrapping:
devtron.install({
excludeChannels: ['bugsnag::renderer-to-main', 'bugsnag::renderer-to-main-sync']
});
Metadata
Metadata
Assignees
Labels
No labels