electronipc

Can't remove listener from ipcRenderer in Electron


I currently have something like the following code:

// preload.js
const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('API', {
  exampleListener: (listener) => ipcRenderer.on('example', (_, message) => listener(message)),
  removeExampleListener: (listener) => ipcRenderer.removeListener('example', (_, message) => listener(message)),
});
// renderer.js
const handler = (message) => console.log('Received message:', message);
API.exampleListener(handler);
// ...
API.removeExampleListener(handler);

Adding a listener works great, but for some reason not removing the listener.

Unfortunately using removeAllListeners isn't viable in my case.

Is what I am doing not possible or am I missing something?


Solution

  • You have to pass the same function, not a function that does the same thing. For example:

    const someListener = (l) => ipcRenderer.on('example', (_, message) => l(message))
    contextBridge.exposeInMainWorld('API', {
      exampleListener: someListener,
      removeExampleListener: (_) => ipcRenderer.removeListener('example', someListener),
    });