summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/worker_post_undefined.ts5
-rw-r--r--cli/tests/workers_test.ts25
-rw-r--r--runtime/js/11_workers.js7
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);
}