diff --git a/.circleci/config.yml b/.circleci/config.yml index 87740249862fb..d5c6913975e81 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -872,6 +872,8 @@ jobs: - upload-test-results test-bun: executor: linux-python + environment: + OVERRIDE_NODE_JS_VERSION: "v24.0.0" steps: - checkout - pip-install @@ -880,10 +882,14 @@ jobs: name: install bun command: | curl -fsSL https://bun.com/install | bash - echo "BUN_ENGINE = os.path.expanduser('~/.bun/bin/bun')" >> ~/emsdk/.emscripten - echo "JS_ENGINES = [BUN_ENGINE]" >> ~/emsdk/.emscripten + echo "NODE_JS_TEST = os.path.expanduser('~/.bun/bin/bun')" >> ~/emsdk/.emscripten + echo "JS_ENGINES = [NODE_JS_TEST]" >> ~/emsdk/.emscripten - run-tests: - test_targets: "core0.test_hello_world" + test_targets: " + core0.test_hello_world + core0.test_hello_argc_pthreads + core2.test_pthread_create + " test-jsc: executor: linux-python steps: diff --git a/src/pthread_esm_startup.mjs b/src/pthread_esm_startup.mjs index fe53ed6a7e5a0..c28d9f1fdea8c 100644 --- a/src/pthread_esm_startup.mjs +++ b/src/pthread_esm_startup.mjs @@ -16,14 +16,17 @@ console.log("Running pthread_esm_startup"); #if ENVIRONMENT_MAY_BE_NODE if ({{{ nodeDetectionCode() }}}) { // Create as web-worker-like an environment as we can. + globalThis.self = globalThis; var worker_threads = await import('worker_threads'); - global.Worker = worker_threads.Worker; + globalThis.Worker = worker_threads.Worker; var parentPort = worker_threads['parentPort']; - parentPort.on('message', (msg) => global.onmessage?.({ data: msg })); - Object.assign(globalThis, { - self: global, - postMessage: (msg) => parentPort['postMessage'](msg), - }); + // Deno and Bun already have `postMessage` defined on the global scope and + // deliver messages to `globalThis.onmessage`, so we must not duplicate that + // behavior here if `postMessage` is already present. + if (!globalThis.postMessage) { + parentPort.on('message', (msg) => globalThis.onmessage?.({ data: msg })); + globalThis.postMessage = (msg) => parentPort['postMessage'](msg); + } } #endif diff --git a/src/runtime_common.js b/src/runtime_common.js index 93523d4e12ecd..62b84cbe10e31 100644 --- a/src/runtime_common.js +++ b/src/runtime_common.js @@ -38,12 +38,15 @@ var readyPromiseResolve, readyPromiseReject; #if (PTHREADS || WASM_WORKERS) && (ENVIRONMENT_MAY_BE_NODE && !WASM_ESM_INTEGRATION) if (ENVIRONMENT_IS_NODE && {{{ ENVIRONMENT_IS_WORKER_THREAD() }}}) { // Create as web-worker-like an environment as we can. + globalThis.self = globalThis; var parentPort = worker_threads['parentPort']; - parentPort.on('message', (msg) => global.onmessage?.({ data: msg })); - Object.assign(globalThis, { - self: global, - postMessage: (msg) => parentPort['postMessage'](msg), - }); + // Deno and Bun already have `postMessage` defined on the global scope and + // deliver messages to `globalThis.onmessage`, so we must not duplicate that + // behavior here if `postMessage` is already present. + if (!globalThis.postMessage) { + parentPort.on('message', (msg) => globalThis.onmessage?.({ data: msg })); + globalThis.postMessage = (msg) => parentPort['postMessage'](msg); + } // Node.js Workers do not pass postMessage()s and uncaught exception events to the parent // thread necessarily in the same order where they were generated in sequential program order. // See https://github.com/nodejs/node/issues/59617 diff --git a/tools/shared.py b/tools/shared.py index 78be09305ca1d..05077a557294d 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -278,7 +278,11 @@ def env_with_node_in_path(): def _get_node_version_pair(nodejs): - actual = utils.run_process(nodejs + ['--version'], stdout=PIPE).stdout.strip() + override = os.environ.get('OVERRIDE_NODE_JS_VERSION') + if override: + actual = override + else: + actual = utils.run_process(nodejs + ['--version'], stdout=PIPE).stdout.strip() version = actual.removeprefix('v') version = version.split('-')[0].split('.') version = tuple(int(v) for v in version)