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:
parent
a44349dfdf
commit
5f015eac9c
3 changed files with 37 additions and 0 deletions
5
cli/tests/worker_post_undefined.ts
Normal file
5
cli/tests/worker_post_undefined.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
self.onmessage = (ev: MessageEvent) => {
|
||||
console.log("received in worker", ev.data);
|
||||
self.postMessage(undefined);
|
||||
console.log("posted from worker");
|
||||
};
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue