From 200ec0e2b8df43716890b1e2ec52e9438a311f70 Mon Sep 17 00:00:00 2001 From: jiangheng Date: Tue, 16 Jun 2026 20:50:25 +0800 Subject: [PATCH] fix: lock onmessage to prevent duplicate message handlers wasm-bindgen registers a message handler during mod.default() initialization. When using addEventListener for task dispatch, both handlers fire for every postMessage, causing the wasm-bindgen handler to fail on wasmworker-format messages. Lock the onmessage setter via Object.defineProperty after init so that addEventListener remains the sole message dispatch path. --- src/webworker/js.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/webworker/js.rs b/src/webworker/js.rs index 704eda2..94d70ba 100644 --- a/src/webworker/js.rs +++ b/src/webworker/js.rs @@ -19,6 +19,16 @@ console.debug('Initializing worker'); } await mod.default({{wasm_bg}}); + + // wasm-bindgen registers a message handler during init. Lock the + // onmessage setter so future assignments can't add duplicate + // listeners alongside our addEventListener handler. + self.onmessage = null; + Object.defineProperty(self, 'onmessage', { + set: function(v) {}, + get: function() { return null; }, + }); + self.postMessage({ success: true }); console.debug('Worker started'); @@ -87,6 +97,14 @@ initHandler = async function(event) { // Remove this listener and add the task handler self.removeEventListener('message', initHandler); + // Lock onmessage to prevent wasm-bindgen's handler from firing + // alongside addEventListener. + self.onmessage = null; + Object.defineProperty(self, 'onmessage', { + set: function(v) {}, + get: function() { return null; }, + }); + // Add the main message handler for tasks self.addEventListener('message', async event => { console.debug('Received worker event');