summaryrefslogtreecommitdiff
path: root/runtime/js/99_main.js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js/99_main.js')
-rw-r--r--runtime/js/99_main.js40
1 files changed, 34 insertions, 6 deletions
diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js
index 91a4dcefd..d0e86bce7 100644
--- a/runtime/js/99_main.js
+++ b/runtime/js/99_main.js
@@ -42,6 +42,8 @@ delete Object.prototype.__proto__;
const errors = window.__bootstrap.errors.errors;
const webidl = window.__bootstrap.webidl;
const { defineEventHandler } = window.__bootstrap.webUtil;
+ const { deserializeJsMessageData, serializeJsMessageData } =
+ window.__bootstrap.messagePort;
let windowIsClosing = false;
@@ -77,9 +79,31 @@ delete Object.prototype.__proto__;
const onmessage = () => {};
const onerror = () => {};
- function postMessage(data) {
- const dataIntArray = core.serialize(data);
- core.opSync("op_worker_post_message", null, dataIntArray);
+ function postMessage(message, transferOrOptions = {}) {
+ const prefix =
+ "Failed to execute 'postMessage' on 'DedicatedWorkerGlobalScope'";
+ webidl.requiredArguments(arguments.length, 1, { prefix });
+ message = webidl.converters.any(message);
+ let options;
+ if (
+ webidl.type(transferOrOptions) === "Object" &&
+ transferOrOptions !== undefined &&
+ transferOrOptions[Symbol.iterator] !== undefined
+ ) {
+ const transfer = webidl.converters["sequence<object>"](
+ transferOrOptions,
+ { prefix, context: "Argument 2" },
+ );
+ options = { transfer };
+ } else {
+ options = webidl.converters.PostMessageOptions(transferOrOptions, {
+ prefix,
+ context: "Argument 2",
+ });
+ }
+ const { transfer } = options;
+ const data = serializeJsMessageData(message, transfer);
+ core.opSync("op_worker_post_message", data);
}
let isClosing = false;
@@ -90,12 +114,16 @@ delete Object.prototype.__proto__;
globalDispatchEvent = globalThis.dispatchEvent.bind(globalThis);
}
while (!isClosing) {
- const bufferMsg = await core.opAsync("op_worker_get_message");
- const data = core.deserialize(bufferMsg);
+ const data = await core.opAsync("op_worker_recv_message");
+ if (data === null) break;
+ const v = deserializeJsMessageData(data);
+ const message = v[0];
+ const transfer = v[1];
const msgEvent = new MessageEvent("message", {
cancelable: false,
- data,
+ data: message,
+ ports: transfer,
});
try {