diff options
-rw-r--r-- | cli/tests/worker_post_undefined.ts | 5 | ||||
-rw-r--r-- | cli/tests/workers_test.ts | 25 | ||||
-rw-r--r-- | runtime/js/11_workers.js | 7 |
3 files changed, 37 insertions, 0 deletions
diff --git a/cli/tests/worker_post_undefined.ts b/cli/tests/worker_post_undefined.ts new file mode 100644 index 000000000..1b9b8d6ca --- /dev/null +++ b/cli/tests/worker_post_undefined.ts @@ -0,0 +1,5 @@ +self.onmessage = (ev: MessageEvent) => { + console.log("received in worker", ev.data); + self.postMessage(undefined); + console.log("posted from worker"); +}; diff --git a/cli/tests/workers_test.ts b/cli/tests/workers_test.ts index 9cbc864bd..70ecbb828 100644 --- a/cli/tests/workers_test.ts +++ b/cli/tests/workers_test.ts @@ -385,6 +385,31 @@ Deno.test({ }, }); +Deno.test({ + name: "Worker post undefined", + fn: async function (): Promise<void> { + const promise = deferred(); + const worker = new Worker( + new URL("./worker_post_undefined.ts", import.meta.url).href, + { type: "module" }, + ); + + const handleWorkerMessage = (e: MessageEvent): void => { + console.log("main <- worker:", e.data); + worker.terminate(); + promise.resolve(); + }; + + worker.addEventListener("messageerror", () => console.log("message error")); + worker.addEventListener("error", () => console.log("error")); + worker.addEventListener("message", handleWorkerMessage); + + console.log("\npost from parent"); + worker.postMessage(undefined); + await promise; + }, +}); + Deno.test("Worker inherits permissions", async function () { const promise = deferred(); const worker = new Worker( diff --git a/runtime/js/11_workers.js b/runtime/js/11_workers.js index 57f420728..e943d66bc 100644 --- a/runtime/js/11_workers.js +++ b/runtime/js/11_workers.js @@ -47,6 +47,13 @@ } function decodeMessage(dataIntArray) { + // Temporary solution until structured clone arrives in v8. + // Current clone is made by parsing json to byte array and from byte array back to json. + // In that case "undefined" transforms to empty byte array, but empty byte array does not transform back to undefined. + // Thats why this special is statement is needed. + if (dataIntArray.length == 0) { + return undefined; + } const dataJson = decoder.decode(dataIntArray); return JSON.parse(dataJson); } |