0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

fix: Worker hangs when posting "undefined" as message (#8920)

This commit fixes hang in web workers occuring when sending
"undefined" as message value. It is a temporary band-aid
until proper structured close is implemented.

Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
This commit is contained in:
yonatan ben avraham 2021-01-08 16:44:24 +02:00 committed by GitHub
parent a44349dfdf
commit 5f015eac9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 0 deletions

View file

@ -0,0 +1,5 @@
self.onmessage = (ev: MessageEvent) => {
console.log("received in worker", ev.data);
self.postMessage(undefined);
console.log("posted from worker");
};

View file

@ -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(

View file

@ -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);
}