diff options
Diffstat (limited to 'runtime/js')
-rw-r--r-- | runtime/js/11_workers.js | 15 | ||||
-rw-r--r-- | runtime/js/99_main.js | 13 |
2 files changed, 17 insertions, 11 deletions
diff --git a/runtime/js/11_workers.js b/runtime/js/11_workers.js index 15bbad101..5d24df93d 100644 --- a/runtime/js/11_workers.js +++ b/runtime/js/11_workers.js @@ -46,6 +46,7 @@ function createWorker( permissions, name, workerType, + closeOnIdle, ) { return op_create_worker({ hasSourceCode, @@ -54,6 +55,7 @@ function createWorker( sourceCode, specifier, workerType, + closeOnIdle, }); } @@ -75,14 +77,6 @@ function hostRecvMessage(id) { const privateWorkerRef = Symbol(); -function refWorker(worker) { - worker[privateWorkerRef](true); -} - -function unrefWorker(worker) { - worker[privateWorkerRef](false); -} - class Worker extends EventTarget { #id = 0; #name = ""; @@ -134,8 +128,9 @@ class Worker extends EventTarget { hasSourceCode, sourceCode, deno?.permissions, - name, + this.#name, workerType, + false, ); this.#id = id; this.#pollControl(); @@ -325,4 +320,4 @@ webidl.converters["WorkerType"] = webidl.createEnumConverter("WorkerType", [ "module", ]); -export { refWorker, unrefWorker, Worker }; +export { Worker }; diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 27ba488e7..585128ba8 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -279,6 +279,7 @@ function postMessage(message, transferOrOptions = {}) { let isClosing = false; let globalDispatchEvent; +let closeOnIdle; async function pollForMessages() { if (!globalDispatchEvent) { @@ -288,7 +289,14 @@ async function pollForMessages() { ); } while (!isClosing) { - const data = await op_worker_recv_message(); + const op = op_worker_recv_message(); + // In a Node.js worker, unref() the op promise to prevent it from + // keeping the event loop alive. This avoids the need to explicitly + // call self.close() or worker.terminate(). + if (closeOnIdle) { + core.unrefOpPromise(op); + } + const data = await op; if (data === null) break; const v = messagePort.deserializeJsMessageData(data); const message = v[0]; @@ -803,6 +811,8 @@ function bootstrapWorkerRuntime( 6: argv0, 7: shouldDisableDeprecatedApiWarning, 8: shouldUseVerboseDeprecatedApiWarning, + 9: _future, + 10: closeOnIdle_, } = runtimeOptions; deprecatedApiWarningDisabled = shouldDisableDeprecatedApiWarning; @@ -864,6 +874,7 @@ function bootstrapWorkerRuntime( location.setLocationHref(location_); + closeOnIdle = closeOnIdle_; globalThis.pollForMessages = pollForMessages; // TODO(bartlomieju): deprecate --unstable |