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?
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),
});