'use strict'; const { ArrayPrototypePushApply, Number, Promise, RegExpPrototypeExec, StringPrototypeEndsWith, } = primordials; const { spawn } = require('child_process'); const net = require('net'); const { setInterval: pSetInterval, setTimeout: pSetTimeout, } = require('timers/promises'); const { AbortController, } = require('internal/abort_controller'); const { ERR_DEBUGGER_STARTUP_ERROR } = require('internal/errors').codes; const { exitCodes: { kInvalidCommandLineArgument, }, } = internalBinding('errors'); const debugRegex = /Debugger listening on ws:\/\/\[?(.+?)\]?:(\d+)\//; async function portIsFree(host, port, timeout = 3000) { if (port === 0) return; // Binding to a random port. const retryDelay = 150; const ac = new AbortController(); const { signal } = ac; pSetTimeout(timeout).then(() => ac.abort()); const asyncIterator = pSetInterval(retryDelay); while (true) { await asyncIterator.next(); if (signal.aborted) { throw new ERR_DEBUGGER_STARTUP_ERROR( `Timeout (${timeout}) waiting for ${host}:${port} to be free`); } const error = await new Promise((resolve) => { const socket = net.connect(port, host); socket.on('error', resolve); socket.on('connect', () => { socket.end(); resolve(); }); }); if (error?.code === 'ECONNREFUSED') { return; } } } function ensureTrailingNewline(text) { return StringPrototypeEndsWith(text, '\n') ? text : `${text}\n`; } function writeInspectUsageAndExit(invokedAs, message, exitCode) { const code = exitCode ?? (message ? kInvalidCommandLineArgument : 0); const out = code === 0 ? process.stdout : process.stderr; if (message) { out.write(`${message}\n`); } out.write(`Usage: ${invokedAs} [--port=] [ ...] [