diff --git a/examples/raytrace-parallel/worker.js b/examples/raytrace-parallel/worker.js index 05ca4f00..26d40c62 100644 --- a/examples/raytrace-parallel/worker.js +++ b/examples/raytrace-parallel/worker.js @@ -1,36 +1,25 @@ // synchronously, using the browser, import out shim JS scripts importScripts('raytrace_parallel.js'); -let booted = false; -let lastPtr = null; - // Wait for the main thread to send us the shared module/memory. Once we've got // it, initialize it all with the `wasm_bindgen` global we imported via // `importScripts`. // // After our first message all subsequent messages are an entry point to run, // so we just do that. -self.onmessage = function(args) { - self.onmessage = event => run(event.data); - const [module, memory] = args.data; - wasm_bindgen(module, memory) - .then(() => { - booted = true; - if (lastPtr) - run(lastPtr); - }) - .catch(e => setTimeout(() => { throw e; })); // propagate to main `onerror` -}; +self.onmessage = event => { + let initialised = wasm_bindgen(...event.data).catch(err => { + // Propagate to main `onerror`: + setTimeout(() => { + throw err; + }); + // Rethrow to keep promise rejected and prevent execution of further commands: + throw err; + }); -function run(ptr) { - if (!booted) { - lastPtr = ptr; - return; - } - lastPtr = null; - try { - wasm_bindgen.child_entry_point(ptr); - } catch (e) { - throw new Error(e.message + "\n\n" + e.stack); - } -} + self.onmessage = async event => { + // This will queue further commands up until the module is fully initialised: + await initialised; + wasm_bindgen.child_entry_point(event.data); + }; +};