diff --git a/lib/internal/debugger/inspect_repl.js b/lib/internal/debugger/inspect_repl.js index b6f8e32e806dfe..87388b41a47b2c 100644 --- a/lib/internal/debugger/inspect_repl.js +++ b/lib/internal/debugger/inspect_repl.js @@ -25,6 +25,7 @@ const { Promise, PromisePrototypeThen, PromiseResolve, + PromiseWithResolvers, ReflectGetOwnPropertyDescriptor, ReflectOwnKeys, RegExpPrototypeExec, @@ -380,6 +381,8 @@ function createRepl(inspector) { let selectedFrame; let exitDebugRepl; let contextLineNumber = 2; + let initialBreakRender; + let waitForInitialBreakRender = false; function resetOnStart() { knownScripts = {}; @@ -890,6 +893,13 @@ function createRepl(inspector) { }); } + function createInitialBreakRenderPromise(pauseRender) { + const { promise, resolve, reject } = PromiseWithResolvers(); + initialBreakRender = promise; + PromisePrototypeThen(pauseRender, resolve, reject); + return promise; + } + Debugger.on('paused', ({ callFrames, reason /* , hitBreakpoints */ }) => { if (process.env.NODE_INSPECT_RESUME_ON_START === '1' && reason === 'Break on start') { @@ -910,7 +920,7 @@ function createRepl(inspector) { const header = `${breakType} in ${scriptUrl}:${lineNumber + 1}`; - inspector.suspendReplWhile(() => + const pauseRender = inspector.suspendReplWhile(() => PromisePrototypeThen( SafePromiseAllReturnArrayLike([formatWatchers(true), selectedFrame.list(contextLineNumber)]), ({ 0: watcherList, 1: context }) => { @@ -919,6 +929,10 @@ function createRepl(inspector) { inspect(context); print(`${header}\n${breakContext}`); })); + + if (waitForInitialBreakRender && !initialBreakRender) { + createInitialBreakRenderPromise(pauseRender); + } }); function handleResumed() { @@ -1186,6 +1200,9 @@ function createRepl(inspector) { } async function initAfterStart() { + waitForInitialBreakRender = + !!inspector.options?.script && + process.env.NODE_INSPECT_RESUME_ON_START !== '1'; await Runtime.enable(); await Profiler.enable(); await Profiler.setSamplingInterval({ interval: 100 }); @@ -1194,7 +1211,12 @@ function createRepl(inspector) { await Debugger.setBlackboxPatterns({ patterns: [] }); await Debugger.setPauseOnExceptions({ state: pauseOnExceptionState }); await restoreBreakpoints(); - return Runtime.runIfWaitingForDebugger(); + await Runtime.runIfWaitingForDebugger(); + await PromiseResolve(); + waitForInitialBreakRender = false; + const initialBreakRenderPromise = initialBreakRender; + initialBreakRender = null; + await initialBreakRenderPromise; } return async function startRepl() {