'use strict'; const common = require('../common'); common.skipIfInspectorDisabled(); const assert = require('assert'); const { NodeInstance } = require('../common/inspector-helper.js'); async function runTests() { const child = new NodeInstance(['-e', `(${main.toString()})()`], '', ''); const session = await child.connectInspectorSession(); await session.send({ method: 'Runtime.enable' }); // Check that there is only one console message received. await session.waitForConsoleOutput('log', 'before wait for debugger'); assert.ok(!session.unprocessedNotifications() .some((n) => n.method === 'Runtime.consoleAPICalled')); // Check that inspector.url() is available between inspector.open() and // inspector.waitForDebugger() const { result: { value } } = await session.send({ method: 'Runtime.evaluate', params: { expression: 'process._ws', includeCommandLineAPI: true } }); assert.ok(value.startsWith('ws://')); await session.send({ method: 'NodeRuntime.enable' }); child.write('first'); await session.waitForNotification('NodeRuntime.waitingForDebugger'); await session.send({ method: 'Runtime.runIfWaitingForDebugger' }); await session.send({ method: 'NodeRuntime.disable' }); // Check that messages after first and before second waitForDebugger are // received await session.waitForConsoleOutput('log', 'after wait for debugger'); await session.waitForConsoleOutput('log', 'before second wait for debugger'); assert.ok(!session.unprocessedNotifications() .some((n) => n.method === 'Runtime.consoleAPICalled')); const secondSession = await child.connectInspectorSession(); // Check that inspector.waitForDebugger can be resumed from another session await session.send({ method: 'NodeRuntime.enable' }); child.write('second'); await session.waitForNotification('NodeRuntime.waitingForDebugger'); await session.send({ method: 'Runtime.runIfWaitingForDebugger' }); await session.send({ method: 'NodeRuntime.disable' }); await session.waitForConsoleOutput('log', 'after second wait for debugger'); assert.ok(!session.unprocessedNotifications() .some((n) => n.method === 'Runtime.consoleAPICalled')); secondSession.disconnect(); session.disconnect(); function main(prefix) { const inspector = require('inspector'); inspector.open(0, undefined, false); process._ws = inspector.url(); console.log('before wait for debugger'); process.stdin.once('data', (data) => { if (data.toString() === 'first') { inspector.waitForDebugger(); console.log('after wait for debugger'); console.log('before second wait for debugger'); process.stdin.once('data', (data) => { if (data.toString() === 'second') { inspector.waitForDebugger(); console.log('after second wait for debugger'); process.exit(); } }); } }); } // Check that inspector.waitForDebugger throws if there is no active // inspector const re = /^Error \[ERR_INSPECTOR_NOT_ACTIVE\]: Inspector is not active$/; assert.throws(() => require('inspector').waitForDebugger(), re); } runTests().then(common.mustCall());