mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
Adds a "worker" package condition that is applied within Web Worker threads created via the `Worker` global, for the worker entry point, its dependencies, `import()`, `require()` and `import.meta.resolve()`. Threads created via `worker_threads`, including from within a Web Worker, do not apply the condition. Other conditions are unaffected. Assisted-by: OpenCode Signed-off-by: Guy Bedford <guybedford@gmail.com> PR-URL: https://github.com/nodejs/node/pull/66635 Reviewed-By: James M Snell <jasnell@gmail.com>
78 lines
2.6 KiB
JavaScript
78 lines
2.6 KiB
JavaScript
// Flags: --experimental-web-worker --conditions=custom-condition
|
|
'use strict';
|
|
|
|
// The `worker` package condition applies only within Web Worker threads,
|
|
// not on the main thread or in `worker_threads` threads.
|
|
|
|
const common = require('../common');
|
|
const fixtures = require('../common/fixtures');
|
|
const assert = require('node:assert');
|
|
const { once } = require('node:events');
|
|
const { Worker: ThreadWorker } = require('node:worker_threads');
|
|
|
|
const base = fixtures.fileURL('es-modules/worker-condition/');
|
|
const pkg = new URL('node_modules/pkg/', base);
|
|
|
|
function runWebWorker(url, options) {
|
|
const worker = new Worker(url, options);
|
|
worker.onerror = common.mustNotCall('worker failed');
|
|
return new Promise((resolve) => {
|
|
worker.onmessage = common.mustCall(({ data }) => {
|
|
worker.terminate();
|
|
resolve(data);
|
|
});
|
|
});
|
|
}
|
|
|
|
(async () => {
|
|
// Main thread: no worker condition.
|
|
assert.deepStrictEqual((await import(new URL('main.mjs', base))).default, {
|
|
import: 'default',
|
|
custom: 'custom',
|
|
require: 'default',
|
|
resolve: new URL('default.mjs', pkg).href,
|
|
workerOnly: 'ERR_PACKAGE_PATH_NOT_EXPORTED',
|
|
});
|
|
|
|
// Module Web Worker: entry point dependencies, dynamic import,
|
|
// import.meta.resolve, require, nested threads.
|
|
assert.deepStrictEqual(
|
|
await runWebWorker(new URL('module-worker.mjs', base), { type: 'module' }),
|
|
{
|
|
staticImport: 'worker',
|
|
dynamicImport: 'worker',
|
|
custom: 'custom-worker',
|
|
workerOnly: 'worker',
|
|
resolve: new URL('worker.mjs', pkg).href,
|
|
require: 'worker',
|
|
// worker_threads created from a Web Worker revert to no worker condition.
|
|
thread: {
|
|
import: 'default',
|
|
custom: 'custom',
|
|
require: 'default',
|
|
resolve: new URL('default.mjs', pkg).href,
|
|
},
|
|
// Nested Web Workers retain it.
|
|
nested: 'worker',
|
|
});
|
|
|
|
// Classic Web Worker.
|
|
assert.deepStrictEqual(
|
|
await runWebWorker(new URL('classic-worker.js', base)),
|
|
{
|
|
require: 'worker',
|
|
import: 'worker',
|
|
resolve: fixtures.path('es-modules/worker-condition/node_modules/pkg/worker.cjs'),
|
|
});
|
|
|
|
// Web Worker created from a worker_threads thread.
|
|
const thread = new ThreadWorker(new URL('thread-spawns-webworker.mjs', base));
|
|
const [threadResult] = await once(thread, 'message');
|
|
assert.deepStrictEqual(threadResult, { thread: 'default', webWorker: 'worker' });
|
|
|
|
// Async module customization hooks registered from a Web Worker.
|
|
assert.strictEqual(
|
|
await runWebWorker(new URL('hooks-worker.mjs', base), { type: 'module' }),
|
|
'worker');
|
|
})().then(common.mustCall());
|