diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/inspector.js | 2 | ||||
-rw-r--r-- | lib/internal/bootstrap/node.js | 12 | ||||
-rw-r--r-- | lib/internal/console/inspector.js | 52 | ||||
-rw-r--r-- | lib/internal/util/inspector.js | 51 |
4 files changed, 55 insertions, 62 deletions
diff --git a/lib/inspector.js b/lib/inspector.js index 565b3aa972..cc8f86ee46 100644 --- a/lib/inspector.js +++ b/lib/inspector.js @@ -106,6 +106,6 @@ module.exports = { url: url, // This is dynamically added during bootstrap, // where the console from the VM is still available - console: require('internal/console/inspector').consoleFromVM, + console: require('internal/util/inspector').consoleFromVM, Session }; diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 8f38bff448..bb07bee6f4 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -710,13 +710,17 @@ function setupGlobalConsole() { value: consoleFromNode, writable: true }); - // TODO(joyeecheung): can we skip this if inspector is not active? + if (config.hasInspector) { - const inspector = - NativeModule.require('internal/console/inspector'); - inspector.addInspectorApis(consoleFromNode, consoleFromVM); + const inspector = NativeModule.require('internal/util/inspector'); // This will be exposed by `require('inspector').console` later. inspector.consoleFromVM = consoleFromVM; + // TODO(joyeecheung): postpone this until the first time inspector + // is activated. + inspector.wrapConsole(consoleFromNode, consoleFromVM); + const { setConsoleExtensionInstaller } = internalBinding('inspector'); + // Setup inspector command line API. + setConsoleExtensionInstaller(inspector.installConsoleExtensions); } } diff --git a/lib/internal/console/inspector.js b/lib/internal/console/inspector.js deleted file mode 100644 index 3dbc68a193..0000000000 --- a/lib/internal/console/inspector.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -const CJSModule = require('internal/modules/cjs/loader'); -const { makeRequireFunction } = require('internal/modules/cjs/helpers'); -const { tryGetCwd } = require('internal/process/execution'); -const { addCommandLineAPI, consoleCall } = internalBinding('inspector'); - -// Wrap a console implemented by Node.js with features from the VM inspector -function addInspectorApis(consoleFromNode, consoleFromVM) { - // Setup inspector command line API. - const cwd = tryGetCwd(); - const consoleAPIModule = new CJSModule('<inspector console>'); - consoleAPIModule.paths = - CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths); - addCommandLineAPI('require', makeRequireFunction(consoleAPIModule)); - const config = {}; - - // If global console has the same method as inspector console, - // then wrap these two methods into one. Native wrapper will preserve - // the original stack. - for (const key of Object.keys(consoleFromNode)) { - if (!consoleFromVM.hasOwnProperty(key)) - continue; - consoleFromNode[key] = consoleCall.bind(consoleFromNode, - consoleFromVM[key], - consoleFromNode[key], - config); - } - - // Add additional console APIs from the inspector - for (const key of Object.keys(consoleFromVM)) { - if (consoleFromNode.hasOwnProperty(key)) - continue; - consoleFromNode[key] = consoleFromVM[key]; - } -} - -module.exports = { - addInspectorApis -}; - -// Stores the console from VM, should be set during bootstrap. -let consoleFromVM; - -Object.defineProperty(module.exports, 'consoleFromVM', { - get() { - return consoleFromVM; - }, - set(val) { - consoleFromVM = val; - } -}); diff --git a/lib/internal/util/inspector.js b/lib/internal/util/inspector.js index face748ab0..68c20108bd 100644 --- a/lib/internal/util/inspector.js +++ b/lib/internal/util/inspector.js @@ -1,11 +1,9 @@ 'use strict'; -const { hasInspector } = internalBinding('config'); -const inspector = hasInspector ? require('inspector') : undefined; - let session; - function sendInspectorCommand(cb, onError) { + const { hasInspector } = internalBinding('config'); + const inspector = hasInspector ? require('inspector') : undefined; if (!hasInspector) return onError(); if (session === undefined) session = new inspector.Session(); try { @@ -20,6 +18,49 @@ function sendInspectorCommand(cb, onError) { } } +// Create a special require function for the inspector command line API +function installConsoleExtensions(commandLineApi) { + if (commandLineApi.require) { return; } + const { tryGetCwd } = require('internal/process/execution'); + const CJSModule = require('internal/modules/cjs/loader'); + const { makeRequireFunction } = require('internal/modules/cjs/helpers'); + const consoleAPIModule = new CJSModule('<inspector console>'); + const cwd = tryGetCwd(); + consoleAPIModule.paths = + CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths); + commandLineApi.require = makeRequireFunction(consoleAPIModule); +} + +// Wrap a console implemented by Node.js with features from the VM inspector +function wrapConsole(consoleFromNode, consoleFromVM) { + const config = {}; + const { consoleCall } = internalBinding('inspector'); + for (const key of Object.keys(consoleFromVM)) { + // If global console has the same method as inspector console, + // then wrap these two methods into one. Native wrapper will preserve + // the original stack. + if (consoleFromNode.hasOwnProperty(key)) { + consoleFromNode[key] = consoleCall.bind(consoleFromNode, + consoleFromVM[key], + consoleFromNode[key], + config); + } else { + // Add additional console APIs from the inspector + consoleFromNode[key] = consoleFromVM[key]; + } + } +} + +// Stores the console from VM, should be set during bootstrap. +let consoleFromVM; module.exports = { - sendInspectorCommand + installConsoleExtensions, + sendInspectorCommand, + wrapConsole, + get consoleFromVM() { + return consoleFromVM; + }, + set consoleFromVM(val) { + consoleFromVM = val; + } }; |