diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index aa0a6b282e138a..8b40c2258b6e69 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -38,7 +38,6 @@ const { internalBinding, NativeModule } = loaderExports; const { Object, Symbol } = primordials; -const { getOptionValue } = NativeModule.require('internal/options'); const config = internalBinding('config'); const { deprecate } = NativeModule.require('internal/util'); @@ -282,38 +281,6 @@ if (process.env.NODE_V8_COVERAGE) { }; } -// Worker threads don't receive signals. -if (isMainThread) { - const { - isSignal, - startListeningIfSignal, - stopListeningIfSignal - } = mainThreadSetup.createSignalHandlers(); - process.on('newListener', startListeningIfSignal); - process.on('removeListener', stopListeningIfSignal); - // re-arm pre-existing signal event registrations - // with this signal wrap capabilities. - const signalEvents = process.eventNames().filter(isSignal); - for (const ev of signalEvents) { - process.emit('newListener', ev); - } -} - -if (getOptionValue('--experimental-report')) { - const { - config, - handleSignal, - report, - syncConfig - } = NativeModule.require('internal/process/report'); - process.report = report; - // Download the CLI / ENV config into JS land. - syncConfig(config, false); - if (config.events.includes('signal')) { - process.on(config.signal, handleSignal); - } -} - function setupProcessObject() { const EventEmitter = NativeModule.require('events'); const origProcProto = Object.getPrototypeOf(process); diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js index 556c6ba39e51f6..072112e68ba07f 100644 --- a/lib/internal/bootstrap/pre_execution.js +++ b/lib/internal/bootstrap/pre_execution.js @@ -8,6 +8,13 @@ let traceEventsAsyncHook; function prepareMainThreadExecution() { setupTraceCategoryState(); + // Only main thread receives signals. + setupSignalHandlers(); + + // Process initial configurations of node-report, if any. + initializeReport(); + initializeReportSignalHandlers(); // Main-thread-only. + // If the process is spawned with env NODE_CHANNEL_FD, it's probably // spawned by our child_process module, then initialize IPC. // This attaches some internal event listeners and creates: @@ -28,6 +35,47 @@ function prepareMainThreadExecution() { loadPreloadModules(); } +function initializeReport() { + if (!getOptionValue('--experimental-report')) { + return; + } + const { + config, + report, + syncConfig + } = require('internal/process/report'); + process.report = report; + // Download the CLI / ENV config into JS land. + syncConfig(config, false); +} + +function setupSignalHandlers() { + const { + createSignalHandlers + } = require('internal/process/main_thread_only'); + const { + startListeningIfSignal, + stopListeningIfSignal + } = createSignalHandlers(); + process.on('newListener', startListeningIfSignal); + process.on('removeListener', stopListeningIfSignal); +} + +// This has to be called after both initializeReport() and +// setupSignalHandlers() are called +function initializeReportSignalHandlers() { + if (!getOptionValue('--experimental-report')) { + return; + } + const { + config, + handleSignal + } = require('internal/process/report'); + if (config.events.includes('signal')) { + process.on(config.signal, handleSignal); + } +} + function setupTraceCategoryState() { const { asyncHooksEnabledInitial, @@ -179,5 +227,6 @@ module.exports = { initializeDeprecations, initializeESMLoader, loadPreloadModules, - setupTraceCategoryState + setupTraceCategoryState, + initializeReport }; diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 13c1b136edaf43..b6dbc47274a7da 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -6,6 +6,7 @@ const { initializeDeprecations, initializeESMLoader, + initializeReport, loadPreloadModules, setupTraceCategoryState } = require('internal/bootstrap/pre_execution'); @@ -75,6 +76,7 @@ port.on('message', (message) => { } = message; setupTraceCategoryState(); + initializeReport(); if (manifestSrc) { require('internal/process/policy').setup(manifestSrc, manifestURL); } diff --git a/lib/internal/process/main_thread_only.js b/lib/internal/process/main_thread_only.js index 2572402f620c27..24a7b02520fa57 100644 --- a/lib/internal/process/main_thread_only.js +++ b/lib/internal/process/main_thread_only.js @@ -144,7 +144,6 @@ function createSignalHandlers() { } return { - isSignal, startListeningIfSignal, stopListeningIfSignal };