diff options
Diffstat (limited to 'runtime/js/99_main.js')
-rw-r--r-- | runtime/js/99_main.js | 40 |
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 { |