MCPcopy Create free account
hub / github.com/ChromeDevTools/chrome-devtools-mcp / createStackTrace

Function createStackTrace

src/devtools/DevtoolsUtils.ts:393–444  ·  view source on GitHub ↗
(
  devTools: TargetUniverse,
  rawStackTrace: Protocol.Runtime.StackTrace,
  targetId: string | undefined,
)

Source from the content-addressed store, hash-verified

391}
392
393export async function createStackTrace(
394 devTools: TargetUniverse,
395 rawStackTrace: Protocol.Runtime.StackTrace,
396 targetId: string | undefined,
397): Promise<DevTools.StackTrace.StackTrace.StackTrace> {
398 const targetManager = devTools.universe.context.get(DevTools.TargetManager);
399 const target = targetId
400 ? targetManager.targetById(targetId) || devTools.target
401 : devTools.target;
402 const model = target.model(DevTools.DebuggerModel) as DevTools.DebuggerModel;
403
404 // DevTools doesn't wait for source maps to attach before building a stack trace, rather it'll send
405 // an update event once a source map was attached and the stack trace retranslated. This doesn't
406 // work in the MCP case, so we'll collect all script IDs upfront and wait for any pending source map
407 // loads before creating the stack trace. We might also have to wait for Debugger.ScriptParsed events if
408 // the stack trace is created particularly early.
409 const scriptIds = new Set<Protocol.Runtime.ScriptId>();
410 for (const frame of rawStackTrace.callFrames) {
411 scriptIds.add(frame.scriptId);
412 }
413 for (
414 let asyncStack = rawStackTrace.parent;
415 asyncStack;
416 asyncStack = asyncStack.parent
417 ) {
418 for (const frame of asyncStack.callFrames) {
419 scriptIds.add(frame.scriptId);
420 }
421 }
422
423 const signal = AbortSignal.timeout(1_000);
424 await Promise.all(
425 [...scriptIds].map(id =>
426 waitForScript(model, id, signal)
427 .then(script =>
428 model.sourceMapManager().sourceMapForClientPromise(script),
429 )
430 .catch(),
431 ),
432 );
433
434 const binding = devTools.universe.context.get(
435 DevTools.DebuggerWorkspaceBinding,
436 );
437 // DevTools uses branded types for ScriptId and others. Casting the puppeteer protocol type to the DevTools protocol type is safe.
438 return binding.createStackTraceFromProtocolRuntime(
439 rawStackTrace as Parameters<
440 DevTools.DebuggerWorkspaceBinding['createStackTraceFromProtocolRuntime']
441 >[0],
442 target,
443 );
444}
445
446// Waits indefinitely for the script so pair it with Promise.race.
447async function waitForScript(

Callers 2

fromDetailsMethod · 0.85

Calls 3

waitForScriptFunction · 0.85
getMethod · 0.80
timeoutMethod · 0.80

Tested by

no test coverage detected