From 2e6da9496bdace2c65040b9d1845c44801ca868c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20L=C3=B3pez=20Guevara?= Date: Tue, 16 May 2023 15:41:21 -0300 Subject: [PATCH] feat: prerender & analyse in worker rather than subprocess to support Deno (#9919) * feat(fork): use workers * Create hot-actors-hope.md * Update packages/kit/src/utils/fork.js Co-authored-by: Rich Harris --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: Rich Harris --- .changeset/hot-actors-hope.md | 5 +++++ packages/kit/src/utils/fork.js | 39 +++++++++++++++------------------- 2 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 .changeset/hot-actors-hope.md diff --git a/.changeset/hot-actors-hope.md b/.changeset/hot-actors-hope.md new file mode 100644 index 000000000000..28d0a3a75041 --- /dev/null +++ b/.changeset/hot-actors-hope.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +feat: prerender in worker rather than subprocess to support Deno diff --git a/packages/kit/src/utils/fork.js b/packages/kit/src/utils/fork.js index 58ed2dcb5066..bfdc0f281051 100644 --- a/packages/kit/src/utils/fork.js +++ b/packages/kit/src/utils/fork.js @@ -1,5 +1,5 @@ import { fileURLToPath } from 'node:url'; -import child_process from 'node:child_process'; +import { Worker, isMainThread, parentPort } from 'node:worker_threads'; /** * Runs a task in a subprocess so any dangling stuff gets killed upon completion. @@ -11,23 +11,21 @@ import child_process from 'node:child_process'; * @returns {(opts: T) => Promise} A function that when called starts the subprocess */ export function forked(module, callback) { - if (process.env.SVELTEKIT_FORK && process.send) { - process.send({ type: 'ready', module }); - - process.on( + if (!isMainThread && parentPort) { + parentPort.on( 'message', /** @param {any} data */ async (data) => { if (data?.type === 'args' && data.module === module) { - if (process.send) { - process.send({ - type: 'result', - module, - payload: await callback(data.payload) - }); - } + parentPort?.postMessage({ + type: 'result', + module, + payload: await callback(data.payload) + }); } } ); + + parentPort.postMessage({ type: 'ready', module }); } /** @@ -36,20 +34,17 @@ export function forked(module, callback) { */ const fn = function (opts) { return new Promise((fulfil, reject) => { - const child = child_process.fork(fileURLToPath(module), { - stdio: 'inherit', + const worker = new Worker(fileURLToPath(module), { env: { - ...process.env, - SVELTEKIT_FORK: 'true' - }, - serialization: 'advanced' + ...process.env + } }); - child.on( + worker.on( 'message', /** @param {any} data */ (data) => { if (data?.type === 'ready' && data.module === module) { - child.send({ + worker.postMessage({ type: 'args', module, payload: opts @@ -57,13 +52,13 @@ export function forked(module, callback) { } if (data?.type === 'result' && data.module === module) { - child.kill(); + worker.terminate(); fulfil(data.payload); } } ); - child.on('exit', (code) => { + worker.on('exit', (code) => { if (code) { reject(new Error(`Failed with code ${code}`)); }