@saptools/cf-inspector 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/wsTransport.ts","../src/cli.ts","../src/inspector.ts","../src/cdp.ts","../src/pathMapper.ts","../src/logpoint.ts","../src/snapshot.ts","../src/tunnel.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"BREAKPOINT_DID_NOT_BIND\"\n | \"INSPECTOR_DISCOVERY_FAILED\"\n | \"INSPECTOR_CONNECTION_FAILED\"\n | \"CDP_REQUEST_FAILED\"\n | \"BREAKPOINT_NOT_HIT\"\n | \"EVALUATION_FAILED\"\n | \"MISSING_TARGET\"\n | \"ABORTED\";\n\nexport class CfInspectorError extends Error {\n public readonly code: CfInspectorErrorCode;\n public readonly detail?: string;\n\n public constructor(code: CfInspectorErrorCode, message: string, detail?: string) {\n super(message);\n this.name = \"CfInspectorError\";\n this.code = code;\n if (detail !== undefined) {\n this.detail = detail;\n }\n }\n}\n\nexport interface BreakpointLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface RemoteRootLiteral {\n readonly kind: \"literal\";\n readonly value: string;\n}\n\nexport interface RemoteRootRegex {\n readonly kind: \"regex\";\n readonly pattern: string;\n readonly flags: string;\n readonly regex: RegExp;\n}\n\nexport interface RemoteRootNone {\n readonly kind: \"none\";\n}\n\nexport type RemoteRootSetting = RemoteRootLiteral | RemoteRootRegex | RemoteRootNone;\n\nexport interface BreakpointHandle {\n readonly breakpointId: string;\n readonly file: string;\n readonly line: number;\n readonly urlRegex: string;\n readonly resolvedLocations: readonly ResolvedLocation[];\n}\n\nexport interface ResolvedLocation {\n readonly scriptId: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber?: number;\n}\n\nexport interface CallFrameInfo {\n readonly callFrameId: string;\n readonly functionName: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n readonly scopeChain: readonly ScopeInfo[];\n}\n\nexport interface ScopeInfo {\n readonly type: string;\n readonly objectId?: string;\n readonly name?: string;\n}\n\nexport interface PauseEvent {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly callFrames: readonly CallFrameInfo[];\n}\n\nexport interface VariableSnapshot {\n readonly name: string;\n readonly value: string;\n readonly type?: string;\n readonly children?: readonly VariableSnapshot[];\n}\n\nexport interface ScopeSnapshot {\n readonly type: string;\n readonly variables: readonly VariableSnapshot[];\n}\n\nexport interface FrameSnapshot {\n readonly functionName: string;\n readonly url?: string;\n readonly line: number;\n readonly column: number;\n readonly scopes: readonly ScopeSnapshot[];\n}\n\nexport interface CapturedExpression {\n readonly expression: string;\n readonly value?: string;\n readonly type?: string;\n readonly error?: string;\n}\n\nexport interface SnapshotResult {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly capturedAt: string;\n readonly captureDurationMs: number;\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n}\n\nexport interface ScriptInfo {\n readonly scriptId: string;\n readonly url: string;\n}\n\nexport interface InspectorConnectOptions {\n readonly port: number;\n readonly host?: string;\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpMessage =\n | { readonly id: number; readonly result: unknown }\n | { readonly id: number; readonly error: { readonly code: number; readonly message: string } }\n | { readonly method: string; readonly params: unknown };\n","import { WebSocket } from \"ws\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./cdp.js\";\nimport { CfInspectorError } from \"./types.js\";\n\nexport async function wsTransportFactory(url: string): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n socket.off(\"error\", onError);\n resolve();\n };\n const onError = (err: Error): void => {\n socket.off(\"open\", onOpen);\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n const wrappers = new WeakMap<object, (...args: unknown[]) => void>();\n const wrapMessage = (listener: (data: string) => void): ((data: Buffer) => void) => {\n const wrapped = (data: Buffer): void => {\n listener(data.toString(\"utf8\"));\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapClose = (listener: () => void): (() => void) => {\n const wrapped = (): void => {\n listener();\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapError = (listener: (err: Error) => void): ((err: Error) => void) => {\n const wrapped = (err: Error): void => {\n listener(err);\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n\n return {\n send(payload: string): void {\n socket.send(payload);\n },\n close(): void {\n socket.close();\n },\n get readyState(): number {\n return socket.readyState;\n },\n on(event, listener): void {\n if (event === \"message\") {\n socket.on(\"message\", wrapMessage(listener as CdpTransportEventMap[\"message\"]));\n } else if (event === \"close\") {\n socket.on(\"close\", wrapClose(listener as CdpTransportEventMap[\"close\"]));\n } else {\n socket.on(\"error\", wrapError(listener as CdpTransportEventMap[\"error\"]));\n }\n },\n off(event, listener): void {\n const wrapped = wrappers.get(listener as object);\n if (!wrapped) {\n return;\n }\n if (event === \"message\") {\n socket.off(\"message\", wrapped as (data: Buffer) => void);\n } else if (event === \"close\") {\n socket.off(\"close\", wrapped as () => void);\n } else {\n socket.off(\"error\", wrapped as (err: Error) => void);\n }\n },\n };\n}\n","import process from \"node:process\";\n\nimport { Command } from \"commander\";\n\nimport {\n connectInspector,\n evaluateGlobal,\n fetchInspectorVersion,\n listScripts,\n resume,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"./inspector.js\";\nimport type { InspectorSession } from \"./inspector.js\";\nimport { streamLogpoint } from \"./logpoint.js\";\nimport type { LogpointEvent } from \"./logpoint.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"./pathMapper.js\";\nimport { captureSnapshot } from \"./snapshot.js\";\nimport { openCfTunnel } from \"./tunnel.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type { BreakpointHandle, SnapshotResult } from \"./types.js\";\n\nconst DEFAULT_BREAKPOINT_TIMEOUT_SEC = 30;\nconst DEFAULT_CF_TIMEOUT_SEC = 60;\n\ninterface PortTarget {\n readonly kind: \"port\";\n readonly port: number;\n readonly host: string;\n}\n\ninterface CfTarget {\n readonly kind: \"cf\";\n readonly region: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly cfTimeoutMs: number;\n}\n\ntype Target = PortTarget | CfTarget;\n\ninterface SharedTargetOptions {\n readonly port?: string;\n readonly host?: string;\n readonly region?: string;\n readonly org?: string;\n readonly space?: string;\n readonly app?: string;\n readonly cfTimeout?: string;\n}\n\ninterface SnapshotCommandOptions extends SharedTargetOptions {\n readonly bp: readonly string[];\n readonly capture?: string;\n readonly timeout?: string;\n readonly remoteRoot?: string;\n readonly condition?: string;\n readonly json: boolean;\n readonly keepPaused?: boolean;\n}\n\ninterface EvalCommandOptions extends SharedTargetOptions {\n readonly expr: string;\n readonly json: boolean;\n}\n\ninterface ListScriptsCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\ninterface LogCommandOptions extends SharedTargetOptions {\n readonly at: string;\n readonly expr: string;\n readonly remoteRoot?: string;\n readonly duration?: string;\n readonly json: boolean;\n}\n\ninterface AttachCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\nfunction parsePositiveInt(raw: string | undefined, label: string): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value <= 0 || value.toString() !== raw.trim()) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", `Invalid ${label}: \"${raw}\" — expected a positive integer`);\n }\n return value;\n}\n\nfunction resolveTarget(opts: SharedTargetOptions): Target {\n const port = parsePositiveInt(opts.port, \"--port\");\n if (port !== undefined) {\n return { kind: \"port\", port, host: opts.host ?? \"127.0.0.1\" };\n }\n if (\n opts.region !== undefined &&\n opts.org !== undefined &&\n opts.space !== undefined &&\n opts.app !== undefined\n ) {\n const cfTimeoutSec = parsePositiveInt(opts.cfTimeout, \"--cf-timeout\") ?? DEFAULT_CF_TIMEOUT_SEC;\n return {\n kind: \"cf\",\n region: opts.region,\n org: opts.org,\n space: opts.space,\n app: opts.app,\n cfTimeoutMs: cfTimeoutSec * 1000,\n };\n }\n throw new CfInspectorError(\n \"MISSING_TARGET\",\n \"Provide either --port (and optionally --host) or all of --region, --org, --space, --app.\",\n );\n}\n\ninterface ResolvedTunnel {\n readonly port: number;\n readonly host: string;\n readonly dispose: () => Promise<void>;\n}\n\nasync function openTarget(target: Target): Promise<ResolvedTunnel> {\n if (target.kind === \"port\") {\n return {\n port: target.port,\n host: target.host,\n dispose: (): Promise<void> => Promise.resolve(),\n };\n }\n const tunnel = await openCfTunnel({\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n tunnelReadyTimeoutMs: target.cfTimeoutMs,\n });\n return {\n port: tunnel.localPort,\n host: \"127.0.0.1\",\n dispose: async (): Promise<void> => {\n await tunnel.dispose();\n },\n };\n}\n\nfunction parseCaptureList(raw: string | undefined): readonly string[] {\n if (raw === undefined || raw.trim().length === 0) {\n return [];\n }\n return raw\n .split(\",\")\n .map((piece) => piece.trim())\n .filter((piece) => piece.length > 0);\n}\n\nasync function withSession<T>(\n target: Target,\n fn: (session: InspectorSession, port: number) => Promise<T>,\n): Promise<T> {\n const tunnel = await openTarget(target);\n let session: InspectorSession | undefined;\n try {\n session = await connectInspector({ port: tunnel.port, host: tunnel.host });\n return await fn(session, tunnel.port);\n } finally {\n if (session) {\n await session.dispose();\n }\n await tunnel.dispose();\n }\n}\n\nfunction writeJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/**\n * V8's `Debugger.setBreakpointByUrl` happily returns a breakpointId even when\n * the file:line did not match any loaded script — `resolvedLocations` is then\n * empty and the breakpoint will silently never fire. Surface a stderr warning\n * (not an error: source maps may resolve later if the script loads) so users\n * can spot a typo in --bp without staring at a BREAKPOINT_NOT_HIT timeout.\n */\nfunction warnOnUnboundBreakpoints(handles: readonly BreakpointHandle[]): void {\n for (const handle of handles) {\n if (handle.resolvedLocations.length === 0) {\n process.stderr.write(\n `[cf-inspector] warning: breakpoint ${handle.file}:${handle.line.toString()} ` +\n `did not bind to any loaded script. Check the path or pass --remote-root. ` +\n `Use 'list-scripts' to inspect what V8 currently has loaded.\\n`,\n );\n }\n }\n}\n\nfunction writeHumanSnapshot(snapshot: SnapshotResult): void {\n const lines: string[] = [];\n lines.push(\n `Snapshot @ ${snapshot.capturedAt}`,\n ` reason: ${snapshot.reason}`,\n ` capture: ${snapshot.captureDurationMs.toFixed(1)}ms`,\n );\n // Skip the raw CDP breakpoint IDs in human output — the frame line below\n // already shows file:line, and the IDs include the verbose internal urlRegex.\n if (snapshot.topFrame) {\n const frame = snapshot.topFrame;\n const fnName = frame.functionName.length === 0 ? \"(anonymous)\" : frame.functionName;\n const sourceUrl = frame.url !== undefined && frame.url.length > 0 ? frame.url : \"(unknown)\";\n lines.push(\n ` frame: ${fnName} ${sourceUrl}:${frame.line.toString()}:${frame.column.toString()}`,\n );\n for (const scope of frame.scopes) {\n lines.push(` scope ${scope.type} (${scope.variables.length.toString()} vars):`);\n for (const variable of scope.variables) {\n lines.push(` ${variable.name} = ${variable.value}`);\n }\n }\n }\n if (snapshot.captures.length > 0) {\n lines.push(\" captures:\");\n for (const capture of snapshot.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n lines.push(` ${capture.expression} = ${detail}`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nasync function handleSnapshot(opts: SnapshotCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n if (opts.bp.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"At least one --bp <file:line> is required.\",\n );\n }\n const breakpoints = opts.bp.map((spec) => parseBreakpointSpec(spec));\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const captures = parseCaptureList(opts.capture);\n const timeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_BREAKPOINT_TIMEOUT_SEC;\n const timeoutMs = timeoutSec * 1000;\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n\n const result = await withSession(target, async (session): Promise<SnapshotResult> => {\n if (condition !== undefined) {\n await validateExpression(session, condition);\n }\n const handles = await Promise.all(\n breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot,\n ...(condition === undefined ? {} : { condition }),\n }),\n ),\n );\n warnOnUnboundBreakpoints(handles);\n const breakpointIds = handles.map((h) => h.breakpointId);\n const pause = await waitForPause(session, { timeoutMs, breakpointIds });\n const snapshot = await captureSnapshot(session, pause, { captures });\n if (opts.keepPaused !== true) {\n try {\n await resume(session);\n } catch {\n // best-effort\n }\n }\n return snapshot;\n });\n\n if (opts.json) {\n writeJson(result);\n } else {\n writeHumanSnapshot(result);\n }\n}\n\nasync function handleEval(opts: EvalCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const result = await withSession(target, async (session) => {\n return await evaluateGlobal(session, opts.expr);\n });\n if (opts.json) {\n writeJson(result);\n return;\n }\n if (result.exceptionDetails !== undefined) {\n const detail =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n process.stderr.write(`${detail}\\n`);\n process.exitCode = 1;\n return;\n }\n const inner = result.result;\n if (inner === undefined) {\n process.stdout.write(\"\\n\");\n return;\n }\n if (typeof inner.value === \"string\") {\n process.stdout.write(`${inner.value}\\n`);\n return;\n }\n if (typeof inner.description === \"string\") {\n process.stdout.write(`${inner.description}\\n`);\n return;\n }\n process.stdout.write(`${JSON.stringify(inner.value)}\\n`);\n}\n\nfunction writeLogEvent(event: LogpointEvent, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n return;\n }\n if (event.error !== undefined) {\n process.stdout.write(`[${event.ts}] ${event.at} !err ${event.error}\\n`);\n return;\n }\n process.stdout.write(`[${event.ts}] ${event.at} ${event.value ?? \"\"}\\n`);\n}\n\nasync function handleLog(opts: LogCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const location = parseBreakpointSpec(opts.at);\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const durationSec = parsePositiveInt(opts.duration, \"--duration\");\n const expression = opts.expr.trim();\n if (expression.length === 0) {\n throw new CfInspectorError(\"INVALID_BREAKPOINT\", \"--expr must not be empty\");\n }\n\n const abort = new AbortController();\n const onSig = (): void => {\n abort.abort();\n };\n process.once(\"SIGINT\", onSig);\n process.once(\"SIGTERM\", onSig);\n\n try {\n await withSession(target, async (session) => {\n await validateExpression(session, expression);\n const result = await streamLogpoint(session, {\n location,\n expression,\n remoteRoot,\n ...(durationSec === undefined ? {} : { durationMs: durationSec * 1000 }),\n signal: abort.signal,\n onEvent: (event) => {\n writeLogEvent(event, opts.json);\n },\n onBreakpointSet: (handle) => {\n warnOnUnboundBreakpoints([handle]);\n },\n });\n if (opts.json) {\n process.stderr.write(\n `${JSON.stringify({ stopped: result.stoppedReason, emitted: result.emitted })}\\n`,\n );\n } else {\n process.stderr.write(\n `Stopped (${result.stoppedReason}); emitted ${result.emitted.toString()} log ${result.emitted === 1 ? \"entry\" : \"entries\"}.\\n`,\n );\n }\n });\n } finally {\n process.off(\"SIGINT\", onSig);\n process.off(\"SIGTERM\", onSig);\n }\n}\n\nasync function handleListScripts(opts: ListScriptsCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const scripts = await withSession(target, (session) => Promise.resolve(listScripts(session)));\n if (opts.json) {\n writeJson(scripts);\n return;\n }\n for (const script of scripts) {\n process.stdout.write(`${script.scriptId}\\t${script.url}\\n`);\n }\n}\n\nasync function handleAttach(opts: AttachCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const tunnel = await openTarget(target);\n try {\n const version = await fetchInspectorVersion(tunnel.host, tunnel.port, 5_000);\n if (opts.json) {\n writeJson({ host: tunnel.host, port: tunnel.port, ...version });\n return;\n }\n process.stdout.write(\n `Connected to ${tunnel.host}:${tunnel.port.toString()}\\n` +\n ` Browser: ${version.browser}\\n` +\n ` Protocol: ${version.protocolVersion}\\n`,\n );\n } finally {\n await tunnel.dispose();\n }\n}\n\nfunction applyTargetOptions(cmd: Command): Command {\n return cmd\n .option(\"--port <number>\", \"Local port the inspector or tunnel listens on\")\n .option(\"--host <host>\", \"Hostname (default: 127.0.0.1)\", \"127.0.0.1\")\n .option(\"--region <key>\", \"CF region key (e.g. eu10)\")\n .option(\"--org <name>\", \"CF org name\")\n .option(\"--space <name>\", \"CF space name\")\n .option(\"--app <name>\", \"CF app name\")\n .option(\"--cf-timeout <seconds>\", \"Timeout for CF tunnel readiness in seconds\");\n}\n\nexport async function main(argv: readonly string[]): Promise<void> {\n const program = new Command();\n program\n .name(\"cf-inspector\")\n .description(\"Drive a Node.js inspector from the command line — set breakpoints, capture snapshots, evaluate expressions\");\n\n const collectStrings = (value: string, prev: readonly string[] = []): readonly string[] => [\n ...prev,\n value,\n ];\n\n applyTargetOptions(\n program\n .command(\"snapshot\")\n .description(\"Set a breakpoint, wait for it to hit, capture the scope, and resume\"),\n )\n .option(\n \"--bp <file:line>\",\n \"Breakpoint location (repeatable; first hit wins), e.g. src/handler.ts:42\",\n collectStrings,\n [] as readonly string[],\n )\n .option(\"--capture <expr,…>\", \"Comma-separated expressions to evaluate in the paused frame\")\n .option(\"--timeout <seconds>\", \"How long to wait for the breakpoint to hit (default: 30)\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\n \"--condition <expr>\",\n \"Only pause when this JS expression evaluates truthy in the paused frame\",\n )\n .option(\"--no-json\", \"Print a human-readable summary instead of JSON\")\n .option(\"--keep-paused\", \"Skip the auto-resume after capture\")\n .action(async (opts: SnapshotCommandOptions): Promise<void> => {\n await handleSnapshot(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"log\")\n .description(\"Stream a non-pausing logpoint: log an expression each time a line executes\"),\n )\n .requiredOption(\"--at <file:line>\", \"Logpoint location, e.g. src/handler.ts:42\")\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to log on each hit\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--duration <seconds>\", \"Stop streaming after N seconds (default: run until SIGINT)\")\n .option(\"--no-json\", \"Print human-readable lines instead of JSON Lines\")\n .action(async (opts: LogCommandOptions): Promise<void> => {\n await handleLog(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"eval\")\n .description(\"Evaluate an expression against the global Runtime\"),\n )\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to evaluate\")\n .option(\"--no-json\", \"Print only the resulting value, not the full CDP envelope\")\n .action(async (opts: EvalCommandOptions): Promise<void> => {\n await handleEval(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"list-scripts\")\n .description(\"Print the scripts the V8 instance currently knows about\"),\n )\n .option(\"--no-json\", \"Print scriptId<TAB>url instead of JSON\")\n .action(async (opts: ListScriptsCommandOptions): Promise<void> => {\n await handleListScripts(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"attach\")\n .description(\"Connect, fetch the inspector version, and disconnect (smoke-test)\"),\n )\n .option(\"--no-json\", \"Print a multi-line summary instead of JSON\")\n .action(async (opts: AttachCommandOptions): Promise<void> => {\n await handleAttach(opts);\n });\n\n await program.parseAsync([...argv]);\n}\n\ntry {\n await main(process.argv);\n} catch (err: unknown) {\n if (err instanceof CfInspectorError) {\n process.stderr.write(`Error [${err.code}]: ${err.message}\\n`);\n if (err.detail !== undefined) {\n process.stderr.write(` detail: ${err.detail}\\n`);\n }\n process.exit(1);\n }\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n}\n","import { request } from \"node:http\";\n\nimport { CdpClient } from \"./cdp.js\";\nimport { buildBreakpointUrlRegex } from \"./pathMapper.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type {\n BreakpointHandle,\n BreakpointLocation,\n CallFrameInfo,\n InspectorConnectOptions,\n PauseEvent,\n RemoteRootSetting,\n ResolvedLocation,\n ScopeInfo,\n ScriptInfo,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\n\nexport interface InspectorTarget {\n readonly description: string;\n readonly devtoolsFrontendUrl?: string;\n readonly faviconUrl?: string;\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly webSocketDebuggerUrl: string;\n}\n\ninterface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\n}\n\n/**\n * Internal coordination flag between the always-on `Debugger.paused` buffer in\n * `connectInspector` and an active `waitForPause`. When `active` is true, the\n * buffer listener skips pushing the live event so it cannot be replayed by a\n * subsequent `waitForPause` call. See `connectInspector` for the full rationale.\n */\nexport interface PauseWaitGate {\n active: boolean;\n}\n\nexport interface InspectorSession {\n readonly client: CdpClient;\n readonly target: InspectorTarget;\n readonly scripts: ReadonlyMap<string, ScriptInfo>;\n readonly pauseBuffer: PauseEvent[];\n readonly pauseWaitGate: PauseWaitGate;\n dispose(): Promise<void>;\n}\n\ninterface CdpCallFrame {\n callFrameId?: unknown;\n functionName?: unknown;\n location?: { lineNumber?: unknown; columnNumber?: unknown };\n url?: unknown;\n scopeChain?: unknown;\n}\n\ninterface CdpScope {\n type?: unknown;\n name?: unknown;\n object?: { objectId?: unknown };\n}\n\ninterface CdpPauseParams {\n reason?: unknown;\n hitBreakpoints?: unknown;\n callFrames?: unknown;\n}\n\ninterface CdpSetBreakpointResult {\n breakpointId?: unknown;\n locations?: unknown;\n}\n\ninterface CdpResolvedLocation {\n scriptId?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n url?: unknown;\n}\n\ninterface CdpEvalResult {\n result?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\nasync function fetchJson<T>(url: string, timeoutMs: number): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const req = request(url, { method: \"GET\" }, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n try {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n resolve(JSON.parse(text) as T);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Failed to parse inspector discovery response from ${url}: ${message}`,\n ),\n );\n }\n });\n res.on(\"error\", (err) => {\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery response error: ${err.message}`,\n ),\n );\n });\n });\n req.setTimeout(timeoutMs, () => {\n req.destroy(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n });\n req.on(\"error\", (err) => {\n reject(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} failed: ${err.message}`,\n ),\n );\n });\n req.end();\n });\n}\n\nfunction toInspectorTarget(value: unknown, source: string): InspectorTarget {\n if (typeof value !== \"object\" || value === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is not an object in ${source}`,\n );\n }\n const candidate = value as Record<string, unknown>;\n const webSocketDebuggerUrl = candidate[\"webSocketDebuggerUrl\"];\n if (typeof webSocketDebuggerUrl !== \"string\" || webSocketDebuggerUrl.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is missing webSocketDebuggerUrl in ${source}`,\n );\n }\n return {\n description: typeof candidate[\"description\"] === \"string\" ? candidate[\"description\"] : \"\",\n id: typeof candidate[\"id\"] === \"string\" ? candidate[\"id\"] : \"\",\n title: typeof candidate[\"title\"] === \"string\" ? candidate[\"title\"] : \"\",\n type: typeof candidate[\"type\"] === \"string\" ? candidate[\"type\"] : \"\",\n url: typeof candidate[\"url\"] === \"string\" ? candidate[\"url\"] : \"\",\n webSocketDebuggerUrl,\n ...(typeof candidate[\"devtoolsFrontendUrl\"] === \"string\"\n ? { devtoolsFrontendUrl: candidate[\"devtoolsFrontendUrl\"] }\n : {}),\n ...(typeof candidate[\"faviconUrl\"] === \"string\" ? { faviconUrl: candidate[\"faviconUrl\"] } : {}),\n };\n}\n\nexport async function discoverInspectorTargets(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<readonly InspectorTarget[]> {\n const url = `http://${host}:${port.toString()}/json/list`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets returned from ${url}`,\n );\n }\n return raw.map((entry, idx): InspectorTarget => toInspectorTarget(entry, `${url}[${idx.toString()}]`));\n}\n\nfunction readVersionField(value: Record<string, unknown>, ...keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const entry = value[key];\n if (typeof entry === \"string\" && entry.length > 0) {\n return entry;\n }\n }\n return undefined;\n}\n\nexport async function fetchInspectorVersion(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<InspectorVersion> {\n const url = `http://${host}:${port.toString()}/json/version`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (typeof raw !== \"object\" || raw === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n const value = raw as Record<string, unknown>;\n const browser = readVersionField(value, \"Browser\", \"browser\");\n const protocolVersion = readVersionField(value, \"Protocol-Version\", \"protocolVersion\");\n if (browser === undefined || protocolVersion === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n return { browser, protocolVersion };\n}\n\ninterface ScriptParsedParams {\n scriptId?: unknown;\n url?: unknown;\n}\n\nexport async function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const target = targets[0];\n if (!target) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets available on ${host}:${options.port.toString()}`,\n );\n }\n const client = await CdpClient.connect({ url: target.webSocketDebuggerUrl });\n const scripts = new Map<string, ScriptInfo>();\n client.on(\"Debugger.scriptParsed\", (raw) => {\n const params = raw as ScriptParsedParams;\n const scriptId = asString(params.scriptId);\n const url = asString(params.url);\n if (scriptId.length === 0) {\n return;\n }\n scripts.set(scriptId, { scriptId, url });\n });\n // Buffer Debugger.paused events from the moment Debugger.enable is sent so\n // breakpoints that fire before waitForPause attaches its listener are not lost.\n // Bounded (FIFO drop-oldest) to avoid unbounded memory growth on a tight\n // paused-then-resumed loop.\n //\n // The pauseWaitGate coordinates with waitForPause: when a waitForPause call\n // is currently consuming the live CDP stream, this listener skips the buffer\n // push so the same event isn't replayed by a subsequent waitForPause call.\n // Without the gate, a buffer-miss path (waitForPause sees an empty buffer\n // and falls through to client.waitFor) ends with both client.waitFor AND\n // this listener handling the same event — the event is returned AND queued\n // in the buffer, ready to be replayed on the next call.\n const PAUSE_BUFFER_LIMIT = 32;\n const pauseBuffer: PauseEvent[] = [];\n const pauseWaitGate: PauseWaitGate = { active: false };\n client.on(\"Debugger.paused\", (raw) => {\n if (pauseWaitGate.active) {\n return;\n }\n const params = raw as CdpPauseParams;\n const event: PauseEvent = {\n reason: asString(params.reason),\n hitBreakpoints: Array.isArray(params.hitBreakpoints)\n ? params.hitBreakpoints.filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params.callFrames),\n };\n if (pauseBuffer.length >= PAUSE_BUFFER_LIMIT) {\n pauseBuffer.shift();\n }\n pauseBuffer.push(event);\n });\n await client.send(\"Runtime.enable\");\n await client.send(\"Debugger.enable\");\n return {\n client,\n target,\n scripts,\n pauseBuffer,\n pauseWaitGate,\n dispose: async (): Promise<void> => {\n try {\n await client.send(\"Debugger.disable\");\n } catch {\n // best-effort\n }\n client.dispose();\n },\n };\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction toResolvedLocations(value: unknown): readonly ResolvedLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ResolvedLocation[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpResolvedLocation;\n const scriptId = asString(candidate.scriptId);\n if (scriptId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.lineNumber);\n const result: ResolvedLocation = url === undefined\n ? { scriptId, lineNumber, columnNumber: asNumber(candidate.columnNumber) }\n : { scriptId, url, lineNumber, columnNumber: asNumber(candidate.columnNumber) };\n return [result];\n });\n}\n\nexport interface SetBreakpointInput extends BreakpointLocation {\n readonly remoteRoot?: RemoteRootSetting;\n readonly condition?: string;\n}\n\nexport async function setBreakpoint(\n session: InspectorSession,\n input: SetBreakpointInput,\n): Promise<BreakpointHandle> {\n const remoteRoot: RemoteRootSetting = input.remoteRoot ?? { kind: \"none\" };\n const urlRegex = buildBreakpointUrlRegex({ file: input.file, remoteRoot });\n const params: Record<string, unknown> = {\n lineNumber: input.line - 1,\n urlRegex,\n };\n if (input.condition !== undefined && input.condition.length > 0) {\n params[\"condition\"] = input.condition;\n }\n const result = await session.client.send<CdpSetBreakpointResult>(\n \"Debugger.setBreakpointByUrl\",\n params,\n );\n const breakpointId = asString(result.breakpointId);\n if (breakpointId.length === 0) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `setBreakpointByUrl did not return a breakpointId for ${input.file}:${input.line.toString()}`,\n );\n }\n return {\n breakpointId,\n file: input.file,\n line: input.line,\n urlRegex,\n resolvedLocations: toResolvedLocations(result.locations),\n };\n}\n\nexport async function removeBreakpoint(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n await session.client.send(\"Debugger.removeBreakpoint\", { breakpointId });\n}\n\nfunction toScopeChain(value: unknown): readonly ScopeInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ScopeInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpScope;\n const type = asString(candidate.type);\n if (type.length === 0) {\n return [];\n }\n const objectId = typeof candidate.object?.objectId === \"string\" ? candidate.object.objectId : undefined;\n const name = typeof candidate.name === \"string\" ? candidate.name : undefined;\n const base: ScopeInfo = name === undefined\n ? { type }\n : { type, name };\n return [objectId === undefined ? base : { ...base, objectId }];\n });\n}\n\nfunction toCallFrames(value: unknown): readonly CallFrameInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): CallFrameInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpCallFrame;\n const callFrameId = asString(candidate.callFrameId);\n if (callFrameId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.location?.lineNumber);\n const columnNumber = asNumber(candidate.location?.columnNumber);\n const base: CallFrameInfo = {\n callFrameId,\n functionName: asString(candidate.functionName),\n lineNumber,\n columnNumber,\n scopeChain: toScopeChain(candidate.scopeChain),\n };\n return [url === undefined ? base : { ...base, url }];\n });\n}\n\nexport interface WaitForPauseOptions {\n readonly timeoutMs: number;\n readonly breakpointIds?: readonly string[];\n}\n\nfunction pauseMatches(pause: PauseEvent, breakpointIds: readonly string[] | undefined): boolean {\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nexport async function waitForPause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n): Promise<PauseEvent> {\n // Check the buffer first — a breakpoint may have fired between setBreakpoint\n // returning and waitForPause being called (the inspectee runs continuously).\n const buffer = session.pauseBuffer;\n while (buffer.length > 0) {\n const head = buffer.shift();\n if (head !== undefined && pauseMatches(head, options.breakpointIds)) {\n return head;\n }\n }\n // No buffered match — switch to live mode. The pauseWaitGate flips on so\n // the always-on buffer listener skips the very event we're about to consume,\n // preventing duplicate-replay on a follow-up waitForPause.\n session.pauseWaitGate.active = true;\n let params: CdpPauseParams;\n try {\n const expected = options.breakpointIds;\n params = await session.client.waitFor<CdpPauseParams>(\"Debugger.paused\", {\n timeoutMs: options.timeoutMs,\n predicate: (raw): boolean => {\n if (expected === undefined || expected.length === 0) {\n return true;\n }\n const ids = Array.isArray(raw.hitBreakpoints)\n ? raw.hitBreakpoints.filter((id): id is string => typeof id === \"string\")\n : [];\n return ids.some((id) => expected.includes(id));\n },\n });\n } finally {\n session.pauseWaitGate.active = false;\n }\n return {\n reason: asString(params.reason),\n hitBreakpoints: Array.isArray(params.hitBreakpoints)\n ? params.hitBreakpoints.filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params.callFrames),\n };\n}\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n}\n\nexport async function evaluateOnFrame(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport async function evaluateGlobal(\n session: InspectorSession,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport function listScripts(session: InspectorSession): readonly ScriptInfo[] {\n return [...session.scripts.values()];\n}\n\ninterface CdpCompileResult {\n scriptId?: unknown;\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\n/**\n * Pre-compile a JS expression on the inspectee using Runtime.compileScript so\n * syntax errors surface as a CfInspectorError(\"INVALID_EXPRESSION\") instead of\n * being silently swallowed by V8 when wired into a breakpoint condition or a\n * logpoint. Without this guard, a typo in --condition or --expr causes the\n * breakpoint to silently never fire — the user would see BREAKPOINT_NOT_HIT\n * after the timeout and have no idea why.\n *\n * persistScript: false — we don't actually want the compiled script around;\n * we just want V8 to parse it and report any SyntaxError.\n */\nexport async function validateExpression(\n session: InspectorSession,\n expression: string,\n): Promise<void> {\n const result = await session.client.send<CdpCompileResult>(\"Runtime.compileScript\", {\n expression,\n sourceURL: \"<cf-inspector-validate>\",\n persistScript: false,\n });\n if (result.exceptionDetails === undefined) {\n return;\n }\n const description =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\"\n ? result.exceptionDetails.text\n : \"expression failed to compile\");\n throw new CfInspectorError(\"INVALID_EXPRESSION\", description);\n}\n\ninterface CdpProperty {\n name?: unknown;\n value?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n}\n\nexport async function getProperties(\n session: InspectorSession,\n objectId: string,\n): Promise<readonly CdpProperty[]> {\n const result = await session.client.send<{ result?: unknown }>(\"Runtime.getProperties\", {\n objectId,\n ownProperties: true,\n accessorPropertiesOnly: false,\n generatePreview: true,\n });\n if (!Array.isArray(result.result)) {\n return [];\n }\n return result.result as readonly CdpProperty[];\n}\n\nexport type { CdpEvalResult, CdpProperty };\n","import { EventEmitter } from \"node:events\";\n\nimport { CfInspectorError } from \"./types.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\n\nexport interface CdpTransportEventMap {\n readonly message: (data: string) => void;\n readonly close: () => void;\n readonly error: (err: Error) => void;\n}\n\nexport interface CdpTransport {\n send(payload: string): void;\n close(): void;\n readonly readyState: number;\n on<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n off<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n}\n\nexport type CdpTransportFactory = (url: string) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n}\n\ninterface PendingRequest {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\ninterface ParsedMessage {\n readonly id?: number;\n readonly method?: string;\n readonly result?: unknown;\n readonly params?: unknown;\n readonly error?: { code: number; message: string };\n}\n\nfunction parseMessage(raw: string): ParsedMessage | undefined {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return value as ParsedMessage;\n } catch {\n return undefined;\n }\n}\n\nasync function loadDefaultFactory(): Promise<CdpTransportFactory> {\n const mod = await import(\"./wsTransport.js\");\n return mod.wsTransportFactory;\n}\n\nexport class CdpClient {\n private readonly transport: CdpTransport;\n private readonly requestTimeoutMs: number;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly emitter = new EventEmitter();\n private nextId = 1;\n private closed = false;\n private closeReason: Error | undefined;\n\n private readonly handleMessage = (raw: string): void => {\n const parsed = parseMessage(raw);\n if (!parsed) {\n return;\n }\n if (typeof parsed.id === \"number\") {\n const pending = this.pending.get(parsed.id);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${parsed.id.toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n return;\n }\n if (typeof parsed.method === \"string\") {\n this.emitter.emit(parsed.method, parsed.params);\n this.emitter.emit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private readonly handleClose = (): void => {\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Inspector connection closed\"));\n };\n\n private readonly handleError = (err: Error): void => {\n this.markClosed(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", err.message),\n );\n };\n\n private constructor(transport: CdpTransport, requestTimeoutMs: number) {\n this.transport = transport;\n this.requestTimeoutMs = requestTimeoutMs;\n transport.on(\"message\", this.handleMessage);\n transport.on(\"close\", this.handleClose);\n transport.on(\"error\", this.handleError);\n }\n\n public static async connect(options: CdpClientOptions): Promise<CdpClient> {\n const factory = options.transportFactory ?? (await loadDefaultFactory());\n const transport = await factory(options.url);\n return new CdpClient(transport, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);\n }\n\n public async send<TResult = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<TResult> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n const id = this.nextId++;\n const payload = JSON.stringify({ id, method, params });\n return await new Promise<TResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP method ${method} timed out after ${this.requestTimeoutMs.toString()}ms`,\n ),\n );\n }, this.requestTimeoutMs);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n try {\n this.transport.send(payload);\n } catch (err: unknown) {\n clearTimeout(timer);\n this.pending.delete(id);\n const message = err instanceof Error ? err.message : String(err);\n reject(new CfInspectorError(\"CDP_REQUEST_FAILED\", `Failed to send ${method}: ${message}`));\n }\n });\n }\n\n public on(method: string, listener: (params: unknown) => void): () => void {\n this.emitter.on(method, listener);\n return (): void => {\n this.emitter.off(method, listener);\n };\n }\n\n public async waitFor<T = unknown>(\n method: string,\n options: { readonly timeoutMs: number; readonly predicate?: (params: T) => boolean } = {\n timeoutMs: this.requestTimeoutMs,\n },\n ): Promise<T> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n clearTimeout(timer);\n offEvent();\n offClose();\n };\n const offEvent = this.on(method, (raw) => {\n if (settled) {\n return;\n }\n const params = raw as T;\n if (options.predicate && !options.predicate(params)) {\n return;\n }\n settled = true;\n cleanup();\n resolve(params);\n });\n const offClose = this.onClose((err) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(err);\n });\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${options.timeoutMs.toString()}ms`,\n ),\n );\n }, options.timeoutMs);\n });\n }\n\n public onClose(listener: (err: Error) => void): () => void {\n if (this.closed) {\n const reason = this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n queueMicrotask(() => {\n listener(reason);\n });\n return (): void => {\n // already closed; nothing to detach\n };\n }\n this.emitter.on(\"__close__\", listener);\n return (): void => {\n this.emitter.off(\"__close__\", listener);\n };\n }\n\n public dispose(): void {\n if (this.closed) {\n return;\n }\n this.transport.off(\"message\", this.handleMessage);\n this.transport.off(\"close\", this.handleClose);\n this.transport.off(\"error\", this.handleError);\n try {\n this.transport.close();\n } catch {\n // best-effort\n }\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection disposed\"));\n }\n\n public get isClosed(): boolean {\n return this.closed;\n }\n\n private markClosed(reason: Error): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(reason);\n }\n this.pending.clear();\n this.emitter.emit(\"__close__\", reason);\n this.emitter.removeAllListeners();\n }\n}\n","import { CfInspectorError } from \"./types.js\";\nimport type { BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst REGEX_PREFIX = \"regex:\";\n// cspell:ignore dgimsuvy\nconst REGEX_FLAGS_PATTERN = /^[dgimsuvy]*$/;\nconst TS_JS_EXT_PATTERN = /\\.(?:ts|js|mts|mjs|cts|cjs)$/i;\n\nexport function parseBreakpointSpec(input: string): BreakpointLocation {\n const idx = input.lastIndexOf(\":\");\n if (idx <= 0 || idx === input.length - 1) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint must be in 'file:line' form, received: \"${input}\"`,\n );\n }\n const file = input.slice(0, idx).trim();\n const lineRaw = input.slice(idx + 1).trim();\n const line = Number.parseInt(lineRaw, 10);\n if (!Number.isInteger(line) || line <= 0 || line.toString() !== lineRaw) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint line must be a positive integer, received: \"${lineRaw}\"`,\n );\n }\n if (file.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint file path is empty in \"${input}\"`,\n );\n }\n return { file, line };\n}\n\nexport function parseRemoteRoot(value: string | undefined): RemoteRootSetting {\n const trimmed = value?.trim();\n if (trimmed === undefined || trimmed.length === 0) {\n return { kind: \"none\" };\n }\n if (trimmed.startsWith(REGEX_PREFIX)) {\n return toRegex(trimmed.slice(REGEX_PREFIX.length), \"\");\n }\n const slashRegex = parseSlashDelimited(trimmed);\n if (slashRegex !== undefined) {\n return toRegex(slashRegex.pattern, slashRegex.flags);\n }\n return { kind: \"literal\", value: stripTrailingSlash(trimmed) };\n}\n\nfunction toRegex(pattern: string, flags: string): RemoteRootSetting {\n try {\n const regex = new RegExp(pattern, flags);\n return { kind: \"regex\", pattern, flags, regex };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n throw new CfInspectorError(\n \"INVALID_REMOTE_ROOT\",\n `Failed to compile remote-root regex \"${pattern}\" with flags \"${flags}\": ${message}`,\n );\n }\n}\n\nfunction parseSlashDelimited(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith(\"/\")) {\n return undefined;\n }\n const closing = findLastUnescapedSlash(value);\n if (closing <= 0) {\n return undefined;\n }\n const flags = value.slice(closing + 1);\n // Disambiguate with literal paths: a path like \"/home/vcap/app/\" would parse\n // as `/<pattern>/` with empty flags. We require non-empty flags for the\n // slash-delimited form; flagless regexes must use the explicit \"regex:\" prefix.\n if (flags.length === 0 || !REGEX_FLAGS_PATTERN.test(flags)) {\n return undefined;\n }\n return { pattern: value.slice(1, closing), flags };\n}\n\nfunction findLastUnescapedSlash(value: string): number {\n for (let i = value.length - 1; i > 0; i--) {\n if (value[i] === \"/\" && !isEscaped(value, i)) {\n return i;\n }\n }\n return -1;\n}\n\nfunction isEscaped(value: string, idx: number): boolean {\n let backslashes = 0;\n for (let i = idx - 1; i >= 0; i--) {\n if (value[i] === \"\\\\\") {\n backslashes++;\n } else {\n break;\n }\n }\n return backslashes % 2 === 1;\n}\n\nfunction stripTrailingSlash(value: string): string {\n if (value.length > 1 && value.endsWith(\"/\")) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`);\n}\n\nfunction normalizeRelative(file: string): string {\n return file.replaceAll(/^[./\\\\]+/g, \"\").replaceAll(\"\\\\\", \"/\");\n}\n\nfunction dropExtension(file: string): { stem: string; matchedExt: boolean } {\n const match = TS_JS_EXT_PATTERN.exec(file);\n if (!match) {\n return { stem: file, matchedExt: false };\n }\n return { stem: file.slice(0, match.index), matchedExt: true };\n}\n\nconst EXT_GROUP = String.raw`\\.(?:ts|js|mts|mjs|cts|cjs)`;\nconst OPTIONAL_EXT_GROUP = String.raw`(?:\\.(?:ts|js|mts|mjs|cts|cjs))?`;\n\nexport interface BuildUrlRegexInput {\n readonly file: string;\n readonly remoteRoot: RemoteRootSetting;\n}\n\nexport function buildBreakpointUrlRegex(input: BuildUrlRegexInput): string {\n const normalized = normalizeRelative(input.file);\n const { stem, matchedExt } = dropExtension(normalized);\n const escapedStem = escapeRegExp(stem);\n const tail = matchedExt ? `${escapedStem}${EXT_GROUP}` : `${escapedStem}${OPTIONAL_EXT_GROUP}`;\n\n switch (input.remoteRoot.kind) {\n case \"none\": {\n return `(?:^|/)${tail}$`;\n }\n case \"literal\": {\n const escapedRoot = escapeRegExp(input.remoteRoot.value);\n return `^file://${escapedRoot}/${tail}$`;\n }\n case \"regex\": {\n return `^file://${input.remoteRoot.pattern}/${tail}$`;\n }\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport { removeBreakpoint, setBreakpoint } from \"./inspector.js\";\nimport type { InspectorSession } from \"./inspector.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointEvent {\n readonly ts: string;\n readonly at: string;\n readonly value?: string;\n readonly error?: string;\n readonly raw?: string;\n}\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly signal?: AbortSignal;\n readonly onEvent: (event: LogpointEvent) => void;\n /**\n * Fires once, immediately after `Debugger.setBreakpointByUrl` returns, with\n * the resolved breakpoint handle. Useful for surfacing warnings such as a BP\n * that did not bind to any script — the caller can warn the user before\n * the stream window elapses.\n */\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n /** Emitted log count, including parse errors that kept the sentinel. */\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\";\n}\n\n/**\n * Serialize a CDP-side IIFE that runs the user's expression as a \"logpoint\":\n * never pauses (always returns false), tags each emitted log with a unique\n * sentinel so we can distinguish our logs from app traffic, and wraps both the\n * user expression and JSON.stringify in try/catch so a thrown expression still\n * surfaces an error event instead of silently breaking the breakpoint.\n *\n * Exported for unit testing — the wire format is part of the contract.\n */\nexport function buildLogpointCondition(sentinel: string, expression: string): string {\n // sentinel embedded as a JS string literal; expression wrapped in parens.\n // The IIFE returns false so V8 never pauses the inspectee.\n return [\n \"(function(){\",\n `var s=${JSON.stringify(sentinel)};`,\n \"try{\",\n `var v=(${expression});`,\n \"var r=typeof v==='string'?v:JSON.stringify(v);\",\n \"console.log(s, r);\",\n \"}catch(e){\",\n \"console.log(s, '!err:'+(e&&e.message?e.message:String(e)));\",\n \"}\",\n \"return false;\",\n \"})()\",\n ].join(\"\");\n}\n\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\ninterface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readArg(arg: unknown, index: number): string | undefined {\n if (typeof arg !== \"object\" || arg === null) {\n return undefined;\n }\n const candidate = arg as CdpRemoteObject;\n if (candidate.type === \"string\" && typeof candidate.value === \"string\") {\n return candidate.value;\n }\n // Other primitives — coerce via String() only on confirmed-primitive types.\n const isPrimitiveType =\n candidate.type === \"number\" ||\n candidate.type === \"boolean\" ||\n candidate.type === \"bigint\";\n const isPrimitiveValue =\n typeof candidate.value === \"number\" ||\n typeof candidate.value === \"boolean\" ||\n typeof candidate.value === \"bigint\";\n if (isPrimitiveType && isPrimitiveValue) {\n return String(candidate.value);\n }\n // For first arg, only string sentinel matters; for second we handle below.\n return index === 0 ? undefined : \"\";\n}\n\nfunction parseLogEvent(\n rawArgs: unknown,\n sentinel: string,\n location: BreakpointLocation,\n timestamp: number | undefined,\n): LogpointEvent | undefined {\n if (!Array.isArray(rawArgs) || rawArgs.length < 2) {\n return undefined;\n }\n const tag = readArg(rawArgs[0], 0);\n if (tag !== sentinel) {\n return undefined;\n }\n const payload = readArg(rawArgs[1], 1) ?? \"\";\n const ts = new Date(typeof timestamp === \"number\" ? timestamp : Date.now()).toISOString();\n const at = `${location.file}:${location.line.toString()}`;\n if (payload.startsWith(\"!err:\")) {\n return { ts, at, error: payload.slice(\"!err:\".length) };\n }\n // Distinguish JSON-encoded vs already-string values by trying to parse;\n // unparseable strings are emitted as raw to preserve whatever the user logged.\n try {\n const parsed: unknown = JSON.parse(payload);\n if (typeof parsed === \"string\") {\n return { ts, at, value: parsed };\n }\n return { ts, at, value: JSON.stringify(parsed) };\n } catch {\n return { ts, at, value: payload, raw: payload };\n }\n}\n\nfunction generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression);\n\n // Attach the consoleAPICalled listener BEFORE setBreakpoint. CDP messages\n // travel on a single WebSocket; if we set the BP first, a fast inspectee\n // (e.g. setInterval 200ms) can fire the BP and emit consoleAPICalled before\n // we get a chance to subscribe — those events would be silently dropped.\n // The sentinel filter is generated up front so attaching early is safe.\n let emitted = 0;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n const event = parseLogEvent(params.args, sentinel, options.location, ts);\n if (event === undefined) {\n return;\n }\n emitted += 1;\n options.onEvent(event);\n });\n\n let handle: BreakpointHandle;\n try {\n handle = await setBreakpoint(session, {\n file: options.location.file,\n line: options.location.line,\n ...(options.remoteRoot === undefined ? {} : { remoteRoot: options.remoteRoot }),\n condition,\n });\n } catch (err: unknown) {\n offEvent();\n throw err;\n }\n options.onBreakpointSet?.(handle);\n\n const cleanup = async (): Promise<void> => {\n offEvent();\n try {\n await removeBreakpoint(session, handle.breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n };\n\n try {\n const reason = await waitForStop(session, options);\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n await cleanup();\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult[\"stoppedReason\"]> {\n return await new Promise<LogpointStreamResult[\"stoppedReason\"]>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStreamResult[\"stoppedReason\"]): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(reason);\n };\n const timer = options.durationMs === undefined\n ? undefined\n : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const offClose = session.client.onClose(() => {\n finish(\"transport-closed\");\n });\n const onAbort = (): void => {\n finish(\"signal\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n finish(\"signal\");\n }\n function cleanup(): void {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n}\n\nexport const internalsForTesting = {\n buildLogpointCondition,\n parseLogEvent,\n generateSentinel,\n SENTINEL_PREFIX,\n};\n","import { performance } from \"node:perf_hooks\";\n\nimport { evaluateOnFrame, getProperties } from \"./inspector.js\";\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./inspector.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n PauseEvent,\n ScopeSnapshot,\n SnapshotResult,\n VariableSnapshot,\n} from \"./types.js\";\n\nconst MAX_SCOPES = 3;\nconst MAX_SCOPE_VARIABLES = 20;\nconst MAX_CHILD_VARIABLES = 8;\nconst MAX_VARIABLE_DEPTH = 2;\nconst MAX_VALUE_LENGTH = 240;\nconst SENSITIVE_NAME_REGEX = /(pass(?:word)?|token|secret|api[_-]?key|authorization|cookie|session|private[_-]?key)/i;\n\nconst PRIORITY_BY_TYPE: Readonly<Record<string, number>> = {\n local: 0,\n arguments: 1,\n block: 2,\n closure: 3,\n catch: 4,\n with: 5,\n module: 6,\n script: 7,\n};\n\ninterface DescribedProperty {\n value: string;\n type?: string;\n objectId?: string;\n}\n\nfunction buildDescribed(value: string, type: string | undefined, objectId?: string): DescribedProperty {\n const base: DescribedProperty = { value };\n if (type !== undefined) {\n base.type = type;\n }\n if (objectId !== undefined) {\n base.objectId = objectId;\n }\n return base;\n}\n\nfunction describeProperty(prop: CdpProperty): DescribedProperty {\n const value = prop.value;\n if (value === undefined) {\n return { value: \"undefined\" };\n }\n const type = typeof value.type === \"string\" ? value.type : undefined;\n const objectId = typeof value.objectId === \"string\" ? value.objectId : undefined;\n if (type === \"undefined\") {\n return buildDescribed(\"undefined\", type);\n }\n if (type === \"string\" && typeof value.value === \"string\") {\n return buildDescribed(JSON.stringify(value.value), type);\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\" || type === \"symbol\") &&\n isPrimitive(value.value)\n ) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (typeof value.description === \"string\") {\n return buildDescribed(value.description, type, objectId);\n }\n if (isPrimitive(value.value)) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (objectId === undefined) {\n return buildDescribed(\"undefined\", type);\n }\n return buildDescribed(\"[object]\", type, objectId);\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol {\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\" || t === \"symbol\";\n}\n\nfunction formatPrimitive(value: string | number | boolean | bigint | symbol): string {\n if (typeof value === \"symbol\") {\n return value.toString();\n }\n if (typeof value === \"bigint\") {\n return `${value.toString()}n`;\n }\n return String(value);\n}\n\nfunction sanitizeValue(name: string, raw: string): string {\n if (SENSITIVE_NAME_REGEX.test(name)) {\n return \"[REDACTED]\";\n }\n if (raw.length <= MAX_VALUE_LENGTH) {\n return raw;\n }\n return `${raw.slice(0, MAX_VALUE_LENGTH)}...`;\n}\n\nfunction isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nasync function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n): Promise<readonly VariableSnapshot[]> {\n const properties = await getProperties(session, objectId);\n const limited = properties.slice(0, limit);\n const variables = await Promise.all(\n limited.map(async (prop): Promise<VariableSnapshot> => {\n const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n let children: readonly VariableSnapshot[] | undefined;\n if (depth > 0 && described.objectId !== undefined && isExpandable(described.type)) {\n try {\n const nested = await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n );\n if (nested.length > 0) {\n children = nested;\n }\n } catch {\n // best-effort: skip nested expansion on error\n }\n }\n const sanitizedValue = sanitizeValue(name, described.value);\n const base: VariableSnapshot = { name, value: sanitizedValue };\n const withType = described.type === undefined ? base : { ...base, type: described.type };\n return children === undefined ? withType : { ...withType, children };\n }),\n );\n return variables;\n}\n\nfunction selectScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n const eligible = scopeChain.filter((scope) => scope.objectId !== undefined && scope.type !== \"global\");\n return [...eligible]\n .sort((a, b) => priorityOf(a.type) - priorityOf(b.type))\n .slice(0, MAX_SCOPES);\n}\n\nfunction priorityOf(type: string): number {\n return PRIORITY_BY_TYPE[type] ?? Number.MAX_SAFE_INTEGER;\n}\n\nasync function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n): Promise<readonly ScopeSnapshot[]> {\n const scopes = selectScopes(frame.scopeChain);\n return await Promise.all(\n scopes.map(async (scope): Promise<ScopeSnapshot> => {\n const objectId = scope.objectId;\n if (objectId === undefined) {\n return { type: scope.type, variables: [] };\n }\n const variables = await captureProperties(session, objectId, MAX_SCOPE_VARIABLES, MAX_VARIABLE_DEPTH);\n return { type: scope.type, variables };\n }),\n );\n}\n\nfunction evalResultToCaptured(expression: string, result: CdpEvalResult): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n const text =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n return { expression, error: text };\n }\n const inner = result.result;\n if (!inner) {\n return { expression, error: \"no result returned\" };\n }\n const type = typeof inner.type === \"string\" ? inner.type : undefined;\n\n const buildCaptured = (rendered: string): CapturedExpression => {\n const sanitized = sanitizeValue(expression, rendered);\n const base: CapturedExpression = { expression, value: sanitized };\n return type === undefined ? base : { ...base, type };\n };\n\n if (type === \"string\" && typeof inner.value === \"string\") {\n return buildCaptured(JSON.stringify(inner.value));\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\") &&\n isPrimitive(inner.value)\n ) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n if (typeof inner.description === \"string\") {\n return buildCaptured(inner.description);\n }\n if (isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n return buildCaptured(\"undefined\");\n}\n\nexport interface CaptureSnapshotOptions {\n readonly captures?: readonly string[];\n}\n\nexport async function captureSnapshot(\n session: InspectorSession,\n pause: PauseEvent,\n options: CaptureSnapshotOptions = {},\n): Promise<SnapshotResult> {\n const startedAt = performance.now();\n const top = pause.callFrames[0];\n let topFrame: FrameSnapshot | undefined;\n let captures: CapturedExpression[] = [];\n if (top) {\n const scopes = await captureScopes(session, top);\n topFrame = {\n functionName: top.functionName,\n ...(top.url === undefined ? {} : { url: top.url }),\n line: top.lineNumber + 1,\n column: top.columnNumber + 1,\n scopes,\n };\n if (options.captures !== undefined && options.captures.length > 0) {\n captures = await Promise.all(\n options.captures.map(async (expression): Promise<CapturedExpression> => {\n try {\n const result = await evaluateOnFrame(session, top.callFrameId, expression);\n return evalResultToCaptured(expression, result);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: message };\n }\n }),\n );\n }\n }\n const captureDurationMs = Math.round((performance.now() - startedAt) * 1000) / 1000;\n return {\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n captureDurationMs,\n ...(topFrame === undefined ? {} : { topFrame }),\n captures,\n };\n}\n\nexport const internalsForTesting = {\n sanitizeValue,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import { startDebugger } from \"@saptools/cf-debugger\";\nimport type { DebuggerHandle, StartDebuggerOptions } from \"@saptools/cf-debugger\";\n\nexport interface TunnelTarget {\n readonly region: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly tunnelReadyTimeoutMs?: number;\n readonly preferredPort?: number;\n readonly verbose?: boolean;\n readonly signal?: AbortSignal;\n}\n\nexport interface OpenedTunnel {\n readonly localPort: number;\n readonly handle: DebuggerHandle;\n dispose(): Promise<void>;\n}\n\nexport async function openCfTunnel(target: TunnelTarget): Promise<OpenedTunnel> {\n const opts: StartDebuggerOptions = {\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n ...(target.tunnelReadyTimeoutMs === undefined ? {} : { tunnelReadyTimeoutMs: target.tunnelReadyTimeoutMs }),\n ...(target.preferredPort === undefined ? {} : { preferredPort: target.preferredPort }),\n ...(target.verbose === undefined ? {} : { verbose: target.verbose }),\n ...(target.signal === undefined ? {} : { signal: target.signal }),\n };\n const handle = await startDebugger(opts);\n return {\n localPort: handle.session.localPort,\n handle,\n dispose: async (): Promise<void> => {\n await handle.dispose();\n },\n };\n}\n"],"mappings":"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","names":["asString"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/wsTransport.ts","../src/cli.ts","../src/inspector.ts","../src/cdp.ts","../src/pathMapper.ts","../src/logpoint.ts","../src/snapshot.ts","../src/tunnel.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"BREAKPOINT_DID_NOT_BIND\"\n | \"INSPECTOR_DISCOVERY_FAILED\"\n | \"INSPECTOR_CONNECTION_FAILED\"\n | \"CDP_REQUEST_FAILED\"\n | \"BREAKPOINT_NOT_HIT\"\n | \"UNRELATED_PAUSE\"\n | \"UNRELATED_PAUSE_TIMEOUT\"\n | \"EVALUATION_FAILED\"\n | \"MISSING_TARGET\"\n | \"ABORTED\";\n\nexport class CfInspectorError extends Error {\n public readonly code: CfInspectorErrorCode;\n public readonly detail?: string;\n\n public constructor(code: CfInspectorErrorCode, message: string, detail?: string) {\n super(message);\n this.name = \"CfInspectorError\";\n this.code = code;\n if (detail !== undefined) {\n this.detail = detail;\n }\n }\n}\n\nexport interface BreakpointLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface RemoteRootLiteral {\n readonly kind: \"literal\";\n readonly value: string;\n}\n\nexport interface RemoteRootRegex {\n readonly kind: \"regex\";\n readonly pattern: string;\n readonly flags: string;\n readonly regex: RegExp;\n}\n\nexport interface RemoteRootNone {\n readonly kind: \"none\";\n}\n\nexport type RemoteRootSetting = RemoteRootLiteral | RemoteRootRegex | RemoteRootNone;\n\nexport interface BreakpointHandle {\n readonly breakpointId: string;\n readonly file: string;\n readonly line: number;\n readonly urlRegex: string;\n readonly resolvedLocations: readonly ResolvedLocation[];\n}\n\nexport interface ResolvedLocation {\n readonly scriptId: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber?: number;\n}\n\nexport interface CallFrameInfo {\n readonly callFrameId: string;\n readonly functionName: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n readonly scopeChain: readonly ScopeInfo[];\n}\n\nexport interface ScopeInfo {\n readonly type: string;\n readonly objectId?: string;\n readonly name?: string;\n}\n\nexport interface PauseEvent {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly callFrames: readonly CallFrameInfo[];\n readonly receivedAtMs?: number;\n}\n\nexport interface VariableSnapshot {\n readonly name: string;\n readonly value: string;\n readonly type?: string;\n readonly children?: readonly VariableSnapshot[];\n}\n\nexport interface ScopeSnapshot {\n readonly type: string;\n readonly variables: readonly VariableSnapshot[];\n}\n\nexport interface FrameSnapshot {\n readonly functionName: string;\n readonly url?: string;\n readonly line: number;\n readonly column: number;\n readonly scopes: readonly ScopeSnapshot[];\n}\n\nexport interface CapturedExpression {\n readonly expression: string;\n readonly value?: string;\n readonly type?: string;\n readonly error?: string;\n}\n\nexport interface SnapshotCaptureResult {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly capturedAt: string;\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n}\n\nexport interface SnapshotResult extends SnapshotCaptureResult {\n readonly pausedDurationMs: number | null;\n}\n\nexport interface ScriptInfo {\n readonly scriptId: string;\n readonly url: string;\n}\n\nexport interface InspectorConnectOptions {\n readonly port: number;\n readonly host?: string;\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpMessage =\n | { readonly id: number; readonly result: unknown }\n | { readonly id: number; readonly error: { readonly code: number; readonly message: string } }\n | { readonly method: string; readonly params: unknown };\n","import { WebSocket } from \"ws\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./cdp.js\";\nimport { CfInspectorError } from \"./types.js\";\n\nexport async function wsTransportFactory(url: string): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n socket.off(\"error\", onError);\n resolve();\n };\n const onError = (err: Error): void => {\n socket.off(\"open\", onOpen);\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n const wrappers = new WeakMap<object, (...args: unknown[]) => void>();\n const wrapMessage = (listener: (data: string) => void): ((data: Buffer) => void) => {\n const wrapped = (data: Buffer): void => {\n listener(data.toString(\"utf8\"));\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapClose = (listener: () => void): (() => void) => {\n const wrapped = (): void => {\n listener();\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapError = (listener: (err: Error) => void): ((err: Error) => void) => {\n const wrapped = (err: Error): void => {\n listener(err);\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n\n return {\n send(payload: string): void {\n socket.send(payload);\n },\n close(): void {\n socket.close();\n },\n get readyState(): number {\n return socket.readyState;\n },\n on(event, listener): void {\n if (event === \"message\") {\n socket.on(\"message\", wrapMessage(listener as CdpTransportEventMap[\"message\"]));\n } else if (event === \"close\") {\n socket.on(\"close\", wrapClose(listener as CdpTransportEventMap[\"close\"]));\n } else {\n socket.on(\"error\", wrapError(listener as CdpTransportEventMap[\"error\"]));\n }\n },\n off(event, listener): void {\n const wrapped = wrappers.get(listener as object);\n if (!wrapped) {\n return;\n }\n if (event === \"message\") {\n socket.off(\"message\", wrapped as (data: Buffer) => void);\n } else if (event === \"close\") {\n socket.off(\"close\", wrapped as () => void);\n } else {\n socket.off(\"error\", wrapped as (err: Error) => void);\n }\n },\n };\n}\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport { Command } from \"commander\";\n\nimport {\n connectInspector,\n evaluateGlobal,\n fetchInspectorVersion,\n listScripts,\n resume,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"./inspector.js\";\nimport type { InspectorSession } from \"./inspector.js\";\nimport { streamLogpoint } from \"./logpoint.js\";\nimport type { LogpointEvent } from \"./logpoint.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"./pathMapper.js\";\nimport { captureSnapshot } from \"./snapshot.js\";\nimport { openCfTunnel } from \"./tunnel.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type { BreakpointHandle, PauseEvent, SnapshotCaptureResult, SnapshotResult } from \"./types.js\";\n\nconst DEFAULT_BREAKPOINT_TIMEOUT_SEC = 30;\nconst DEFAULT_CF_TIMEOUT_SEC = 60;\n\ninterface PortTarget {\n readonly kind: \"port\";\n readonly port: number;\n readonly host: string;\n}\n\ninterface CfTarget {\n readonly kind: \"cf\";\n readonly region: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly cfTimeoutMs: number;\n}\n\ntype Target = PortTarget | CfTarget;\n\ninterface SharedTargetOptions {\n readonly port?: string;\n readonly host?: string;\n readonly region?: string;\n readonly org?: string;\n readonly space?: string;\n readonly app?: string;\n readonly cfTimeout?: string;\n}\n\ninterface SnapshotCommandOptions extends SharedTargetOptions {\n readonly bp: readonly string[];\n readonly capture?: string;\n readonly timeout?: string;\n readonly remoteRoot?: string;\n readonly condition?: string;\n readonly json: boolean;\n readonly keepPaused?: boolean;\n readonly failOnUnmatchedPause?: boolean;\n}\n\ninterface EvalCommandOptions extends SharedTargetOptions {\n readonly expr: string;\n readonly json: boolean;\n}\n\ninterface ListScriptsCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\ninterface LogCommandOptions extends SharedTargetOptions {\n readonly at: string;\n readonly expr: string;\n readonly remoteRoot?: string;\n readonly duration?: string;\n readonly json: boolean;\n}\n\ninterface AttachCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\nfunction parsePositiveInt(raw: string | undefined, label: string): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value <= 0 || value.toString() !== raw.trim()) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", `Invalid ${label}: \"${raw}\" — expected a positive integer`);\n }\n return value;\n}\n\nfunction resolveTarget(opts: SharedTargetOptions): Target {\n const port = parsePositiveInt(opts.port, \"--port\");\n if (port !== undefined) {\n return { kind: \"port\", port, host: opts.host ?? \"127.0.0.1\" };\n }\n if (\n opts.region !== undefined &&\n opts.org !== undefined &&\n opts.space !== undefined &&\n opts.app !== undefined\n ) {\n const cfTimeoutSec = parsePositiveInt(opts.cfTimeout, \"--cf-timeout\") ?? DEFAULT_CF_TIMEOUT_SEC;\n return {\n kind: \"cf\",\n region: opts.region,\n org: opts.org,\n space: opts.space,\n app: opts.app,\n cfTimeoutMs: cfTimeoutSec * 1000,\n };\n }\n throw new CfInspectorError(\n \"MISSING_TARGET\",\n \"Provide either --port (and optionally --host) or all of --region, --org, --space, --app.\",\n );\n}\n\ninterface ResolvedTunnel {\n readonly port: number;\n readonly host: string;\n readonly dispose: () => Promise<void>;\n}\n\nasync function openTarget(target: Target): Promise<ResolvedTunnel> {\n if (target.kind === \"port\") {\n return {\n port: target.port,\n host: target.host,\n dispose: (): Promise<void> => Promise.resolve(),\n };\n }\n const tunnel = await openCfTunnel({\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n tunnelReadyTimeoutMs: target.cfTimeoutMs,\n });\n return {\n port: tunnel.localPort,\n host: \"127.0.0.1\",\n dispose: async (): Promise<void> => {\n await tunnel.dispose();\n },\n };\n}\n\nfunction parseCaptureList(raw: string | undefined): readonly string[] {\n if (raw === undefined || raw.trim().length === 0) {\n return [];\n }\n return splitCaptureExpressions(raw);\n}\n\ntype QuoteChar = \"'\" | \"\\\"\" | \"`\";\n\ninterface CaptureSplitState {\n quote: QuoteChar | undefined;\n escaped: boolean;\n parenDepth: number;\n bracketDepth: number;\n braceDepth: number;\n start: number;\n readonly pieces: string[];\n}\n\nfunction isQuoteChar(value: string): value is QuoteChar {\n return value === \"'\" || value === \"\\\"\" || value === \"`\";\n}\n\nfunction consumeQuotedChar(state: CaptureSplitState, char: string): boolean {\n if (state.quote === undefined) {\n return false;\n }\n if (state.escaped) {\n state.escaped = false;\n return true;\n }\n if (char === \"\\\\\") {\n state.escaped = true;\n return true;\n }\n if (char === state.quote) {\n state.quote = undefined;\n }\n return true;\n}\n\nfunction updateCaptureDepth(state: CaptureSplitState, char: string): void {\n if (char === \"(\") {\n state.parenDepth += 1;\n } else if (char === \")\") {\n state.parenDepth = Math.max(0, state.parenDepth - 1);\n } else if (char === \"[\") {\n state.bracketDepth += 1;\n } else if (char === \"]\") {\n state.bracketDepth = Math.max(0, state.bracketDepth - 1);\n } else if (char === \"{\") {\n state.braceDepth += 1;\n } else if (char === \"}\") {\n state.braceDepth = Math.max(0, state.braceDepth - 1);\n }\n}\n\nfunction isTopLevel(state: CaptureSplitState): boolean {\n return state.parenDepth === 0 && state.bracketDepth === 0 && state.braceDepth === 0;\n}\n\nfunction appendCapturePiece(raw: string, state: CaptureSplitState, end: number): void {\n const piece = raw.slice(state.start, end).trim();\n if (piece.length > 0) {\n state.pieces.push(piece);\n }\n}\n\nfunction splitCaptureExpressions(raw: string): readonly string[] {\n const state: CaptureSplitState = {\n escaped: false,\n parenDepth: 0,\n bracketDepth: 0,\n braceDepth: 0,\n quote: undefined,\n start: 0,\n pieces: [],\n };\n for (let idx = 0; idx < raw.length; idx += 1) {\n const char = raw[idx];\n if (char === undefined) {\n continue;\n }\n if (consumeQuotedChar(state, char)) {\n continue;\n }\n if (isQuoteChar(char)) {\n state.quote = char;\n continue;\n }\n updateCaptureDepth(state, char);\n if (char === \",\" && isTopLevel(state)) {\n appendCapturePiece(raw, state, idx);\n state.start = idx + 1;\n }\n }\n appendCapturePiece(raw, state, raw.length);\n return state.pieces;\n}\n\nasync function withSession<T>(\n target: Target,\n fn: (session: InspectorSession, port: number) => Promise<T>,\n): Promise<T> {\n const tunnel = await openTarget(target);\n let session: InspectorSession | undefined;\n try {\n session = await connectInspector({ port: tunnel.port, host: tunnel.host });\n return await fn(session, tunnel.port);\n } finally {\n if (session) {\n await session.dispose();\n }\n await tunnel.dispose();\n }\n}\n\nfunction writeJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/**\n * V8's `Debugger.setBreakpointByUrl` happily returns a breakpointId even when\n * the file:line did not match any loaded script — `resolvedLocations` is then\n * empty and the breakpoint will silently never fire. Surface a stderr warning\n * (not an error: source maps may resolve later if the script loads) so users\n * can spot a typo in --bp without staring at a BREAKPOINT_NOT_HIT timeout.\n */\nfunction warnOnUnboundBreakpoints(handles: readonly BreakpointHandle[]): void {\n for (const handle of handles) {\n if (handle.resolvedLocations.length === 0) {\n process.stderr.write(\n `[cf-inspector] warning: breakpoint ${handle.file}:${handle.line.toString()} ` +\n `did not bind to any loaded script. Check the path or pass --remote-root. ` +\n `Use 'list-scripts' to inspect what V8 currently has loaded.\\n`,\n );\n }\n }\n}\n\nfunction roundDurationMs(durationMs: number): number {\n return Math.round(durationMs * 1000) / 1000;\n}\n\nfunction formatPauseLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n\nfunction warnOnUnmatchedPause(pause: PauseEvent): void {\n const reason = pause.reason.length > 0 ? pause.reason : \"unknown\";\n process.stderr.write(\n `[cf-inspector] warning: target is paused by another debugger event ` +\n `(${reason} at ${formatPauseLocation(pause)}); waiting for it to resume...\\n`,\n );\n}\n\nfunction withPausedDuration(\n snapshot: SnapshotCaptureResult,\n pausedDurationMs: number | null,\n): SnapshotResult {\n return {\n reason: snapshot.reason,\n hitBreakpoints: snapshot.hitBreakpoints,\n capturedAt: snapshot.capturedAt,\n pausedDurationMs,\n ...(snapshot.topFrame === undefined ? {} : { topFrame: snapshot.topFrame }),\n captures: snapshot.captures,\n };\n}\n\nfunction writeHumanSnapshot(snapshot: SnapshotResult): void {\n const pausedDuration = snapshot.pausedDurationMs === null\n ? \"unknown\"\n : `${snapshot.pausedDurationMs.toFixed(1)}ms`;\n const lines: string[] = [];\n lines.push(\n `Snapshot @ ${snapshot.capturedAt}`,\n ` reason: ${snapshot.reason}`,\n ` paused: ${pausedDuration}`,\n );\n // Skip the raw CDP breakpoint IDs in human output — the frame line below\n // already shows file:line, and the IDs include the verbose internal urlRegex.\n if (snapshot.topFrame) {\n const frame = snapshot.topFrame;\n const fnName = frame.functionName.length === 0 ? \"(anonymous)\" : frame.functionName;\n const sourceUrl = frame.url !== undefined && frame.url.length > 0 ? frame.url : \"(unknown)\";\n lines.push(\n ` frame: ${fnName} ${sourceUrl}:${frame.line.toString()}:${frame.column.toString()}`,\n );\n for (const scope of frame.scopes) {\n lines.push(` scope ${scope.type} (${scope.variables.length.toString()} vars):`);\n for (const variable of scope.variables) {\n lines.push(` ${variable.name} = ${variable.value}`);\n }\n }\n }\n if (snapshot.captures.length > 0) {\n lines.push(\" captures:\");\n for (const capture of snapshot.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n lines.push(` ${capture.expression} = ${detail}`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nasync function handleSnapshot(opts: SnapshotCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n if (opts.bp.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"At least one --bp <file:line> is required.\",\n );\n }\n const breakpoints = opts.bp.map((spec) => parseBreakpointSpec(spec));\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const captures = parseCaptureList(opts.capture);\n const timeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_BREAKPOINT_TIMEOUT_SEC;\n const timeoutMs = timeoutSec * 1000;\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n\n const result = await withSession(target, async (session): Promise<SnapshotResult> => {\n if (condition !== undefined) {\n await validateExpression(session, condition);\n }\n const handles = await Promise.all(\n breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot,\n ...(condition === undefined ? {} : { condition }),\n }),\n ),\n );\n warnOnUnboundBreakpoints(handles);\n const breakpointIds = handles.map((h) => h.breakpointId);\n let warnedUnmatchedPause = false;\n const pause = await waitForPause(session, {\n timeoutMs,\n breakpointIds,\n unmatchedPausePolicy: opts.failOnUnmatchedPause === true ? \"fail\" : \"wait-for-resume\",\n onUnmatchedPause: (unmatchedPause) => {\n if (warnedUnmatchedPause || opts.failOnUnmatchedPause === true) {\n return;\n }\n warnedUnmatchedPause = true;\n warnOnUnmatchedPause(unmatchedPause);\n },\n });\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(session, pause, { captures });\n if (opts.keepPaused === true) {\n return withPausedDuration(snapshot, null);\n }\n try {\n await resume(session);\n return withPausedDuration(\n snapshot,\n roundDurationMs(performance.now() - pausedStartedAt),\n );\n } catch {\n process.stderr.write(\n \"[cf-inspector] warning: Debugger.resume failed after snapshot; pausedDurationMs is unknown.\\n\",\n );\n // best-effort; a failed resume means the final paused duration is unknown.\n return withPausedDuration(snapshot, null);\n }\n });\n\n if (opts.json) {\n writeJson(result);\n } else {\n writeHumanSnapshot(result);\n }\n}\n\nasync function handleEval(opts: EvalCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const result = await withSession(target, async (session) => {\n return await evaluateGlobal(session, opts.expr);\n });\n if (opts.json) {\n writeJson(result);\n if (result.exceptionDetails !== undefined) {\n process.exitCode = 1;\n }\n return;\n }\n if (result.exceptionDetails !== undefined) {\n const detail =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n process.stderr.write(`${detail}\\n`);\n process.exitCode = 1;\n return;\n }\n const inner = result.result;\n if (inner === undefined) {\n process.stdout.write(\"\\n\");\n return;\n }\n if (typeof inner.value === \"string\") {\n process.stdout.write(`${inner.value}\\n`);\n return;\n }\n if (typeof inner.description === \"string\") {\n process.stdout.write(`${inner.description}\\n`);\n return;\n }\n process.stdout.write(`${JSON.stringify(inner.value)}\\n`);\n}\n\nfunction writeLogEvent(event: LogpointEvent, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n return;\n }\n if (event.error !== undefined) {\n process.stdout.write(`[${event.ts}] ${event.at} !err ${event.error}\\n`);\n return;\n }\n process.stdout.write(`[${event.ts}] ${event.at} ${event.value ?? \"\"}\\n`);\n}\n\nasync function handleLog(opts: LogCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const location = parseBreakpointSpec(opts.at);\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const durationSec = parsePositiveInt(opts.duration, \"--duration\");\n const expression = opts.expr.trim();\n if (expression.length === 0) {\n throw new CfInspectorError(\"INVALID_BREAKPOINT\", \"--expr must not be empty\");\n }\n\n const abort = new AbortController();\n const onSig = (): void => {\n abort.abort();\n };\n process.once(\"SIGINT\", onSig);\n process.once(\"SIGTERM\", onSig);\n\n try {\n await withSession(target, async (session) => {\n await validateExpression(session, expression);\n const result = await streamLogpoint(session, {\n location,\n expression,\n remoteRoot,\n ...(durationSec === undefined ? {} : { durationMs: durationSec * 1000 }),\n signal: abort.signal,\n onEvent: (event) => {\n writeLogEvent(event, opts.json);\n },\n onBreakpointSet: (handle) => {\n warnOnUnboundBreakpoints([handle]);\n },\n });\n if (opts.json) {\n process.stderr.write(\n `${JSON.stringify({ stopped: result.stoppedReason, emitted: result.emitted })}\\n`,\n );\n } else {\n process.stderr.write(\n `Stopped (${result.stoppedReason}); emitted ${result.emitted.toString()} log ${result.emitted === 1 ? \"entry\" : \"entries\"}.\\n`,\n );\n }\n });\n } finally {\n process.off(\"SIGINT\", onSig);\n process.off(\"SIGTERM\", onSig);\n }\n}\n\nasync function handleListScripts(opts: ListScriptsCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const scripts = await withSession(target, (session) => Promise.resolve(listScripts(session)));\n if (opts.json) {\n writeJson(scripts);\n return;\n }\n for (const script of scripts) {\n process.stdout.write(`${script.scriptId}\\t${script.url}\\n`);\n }\n}\n\nasync function handleAttach(opts: AttachCommandOptions): Promise<void> {\n const target = resolveTarget(opts);\n const tunnel = await openTarget(target);\n try {\n const version = await fetchInspectorVersion(tunnel.host, tunnel.port, 5_000);\n if (opts.json) {\n writeJson({ host: tunnel.host, port: tunnel.port, ...version });\n return;\n }\n process.stdout.write(\n `Connected to ${tunnel.host}:${tunnel.port.toString()}\\n` +\n ` Browser: ${version.browser}\\n` +\n ` Protocol: ${version.protocolVersion}\\n`,\n );\n } finally {\n await tunnel.dispose();\n }\n}\n\nfunction applyTargetOptions(cmd: Command): Command {\n return cmd\n .option(\"--port <number>\", \"Local port the inspector or tunnel listens on\")\n .option(\"--host <host>\", \"Hostname (default: 127.0.0.1)\", \"127.0.0.1\")\n .option(\"--region <key>\", \"CF region key (e.g. eu10)\")\n .option(\"--org <name>\", \"CF org name\")\n .option(\"--space <name>\", \"CF space name\")\n .option(\"--app <name>\", \"CF app name\")\n .option(\"--cf-timeout <seconds>\", \"Timeout for CF tunnel readiness in seconds\");\n}\n\nexport async function main(argv: readonly string[]): Promise<void> {\n const program = new Command();\n program\n .name(\"cf-inspector\")\n .description(\"Drive a Node.js inspector from the command line — set breakpoints, capture snapshots, evaluate expressions\");\n\n const collectStrings = (value: string, prev: readonly string[] = []): readonly string[] => [\n ...prev,\n value,\n ];\n\n applyTargetOptions(\n program\n .command(\"snapshot\")\n .description(\"Set a breakpoint, wait for it to hit, capture the scope, and resume\"),\n )\n .option(\n \"--bp <file:line>\",\n \"Breakpoint location (repeatable; first hit wins), e.g. src/handler.ts:42\",\n collectStrings,\n [] as readonly string[],\n )\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate in the paused frame\")\n .option(\"--timeout <seconds>\", \"How long to wait for the breakpoint to hit (default: 30)\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\n \"--condition <expr>\",\n \"Only pause when this JS expression evaluates truthy in the paused frame\",\n )\n .option(\"--no-json\", \"Print a human-readable summary instead of JSON\")\n .option(\"--keep-paused\", \"Skip Debugger.resume after capture; Node may resume when this CLI disconnects\")\n .option(\"--fail-on-unmatched-pause\", \"Fail immediately if the target pauses somewhere else\")\n .action(async (opts: SnapshotCommandOptions): Promise<void> => {\n await handleSnapshot(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"log\")\n .description(\"Stream a non-pausing logpoint: log an expression each time a line executes\"),\n )\n .requiredOption(\"--at <file:line>\", \"Logpoint location, e.g. src/handler.ts:42\")\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to log on each hit\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--duration <seconds>\", \"Stop streaming after N seconds (default: run until SIGINT)\")\n .option(\"--no-json\", \"Print human-readable lines instead of JSON Lines\")\n .action(async (opts: LogCommandOptions): Promise<void> => {\n await handleLog(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"eval\")\n .description(\"Evaluate an expression against the global Runtime\"),\n )\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to evaluate\")\n .option(\"--no-json\", \"Print only the resulting value, not the full CDP envelope\")\n .action(async (opts: EvalCommandOptions): Promise<void> => {\n await handleEval(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"list-scripts\")\n .description(\"Print the scripts the V8 instance currently knows about\"),\n )\n .option(\"--no-json\", \"Print scriptId<TAB>url instead of JSON\")\n .action(async (opts: ListScriptsCommandOptions): Promise<void> => {\n await handleListScripts(opts);\n });\n\n applyTargetOptions(\n program\n .command(\"attach\")\n .description(\"Connect, fetch the inspector version, and disconnect (smoke-test)\"),\n )\n .option(\"--no-json\", \"Print a multi-line summary instead of JSON\")\n .action(async (opts: AttachCommandOptions): Promise<void> => {\n await handleAttach(opts);\n });\n\n await program.parseAsync([...argv]);\n}\n\ntry {\n await main(process.argv);\n} catch (err: unknown) {\n if (err instanceof CfInspectorError) {\n process.stderr.write(`Error [${err.code}]: ${err.message}\\n`);\n if (err.detail !== undefined) {\n process.stderr.write(` detail: ${err.detail}\\n`);\n }\n process.exit(1);\n }\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n}\n","import { request } from \"node:http\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { CdpClient } from \"./cdp.js\";\nimport { buildBreakpointUrlRegex } from \"./pathMapper.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type {\n BreakpointHandle,\n BreakpointLocation,\n CallFrameInfo,\n InspectorConnectOptions,\n PauseEvent,\n RemoteRootSetting,\n ResolvedLocation,\n ScopeInfo,\n ScriptInfo,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\n\nexport interface InspectorTarget {\n readonly description: string;\n readonly devtoolsFrontendUrl?: string;\n readonly faviconUrl?: string;\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly webSocketDebuggerUrl: string;\n}\n\ninterface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\n}\n\n/**\n * Internal coordination flag between the always-on `Debugger.paused` buffer in\n * `connectInspector` and an active `waitForPause`. When `active` is true, the\n * buffer listener skips pushing the live event so it cannot be replayed by a\n * subsequent `waitForPause` call. See `connectInspector` for the full rationale.\n */\nexport interface PauseWaitGate {\n active: boolean;\n}\n\nexport interface DebuggerState {\n lastResumedAtMs?: number;\n}\n\nexport interface InspectorSession {\n readonly client: CdpClient;\n readonly target: InspectorTarget;\n readonly scripts: ReadonlyMap<string, ScriptInfo>;\n readonly pauseBuffer: PauseEvent[];\n readonly pauseWaitGate: PauseWaitGate;\n readonly debuggerState: DebuggerState;\n dispose(): Promise<void>;\n}\n\ninterface CdpCallFrame {\n callFrameId?: unknown;\n functionName?: unknown;\n location?: { lineNumber?: unknown; columnNumber?: unknown };\n url?: unknown;\n scopeChain?: unknown;\n}\n\ninterface CdpScope {\n type?: unknown;\n name?: unknown;\n object?: { objectId?: unknown };\n}\n\ninterface CdpPauseParams {\n reason?: unknown;\n hitBreakpoints?: unknown;\n callFrames?: unknown;\n}\n\ninterface CdpSetBreakpointResult {\n breakpointId?: unknown;\n locations?: unknown;\n}\n\ninterface CdpResolvedLocation {\n scriptId?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n url?: unknown;\n}\n\ninterface CdpEvalResult {\n result?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\nasync function fetchJson<T>(url: string, timeoutMs: number): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const req = request(url, { method: \"GET\" }, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n try {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n resolve(JSON.parse(text) as T);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Failed to parse inspector discovery response from ${url}: ${message}`,\n ),\n );\n }\n });\n res.on(\"error\", (err) => {\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery response error: ${err.message}`,\n ),\n );\n });\n });\n req.setTimeout(timeoutMs, () => {\n req.destroy(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n });\n req.on(\"error\", (err) => {\n reject(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} failed: ${err.message}`,\n ),\n );\n });\n req.end();\n });\n}\n\nfunction toInspectorTarget(value: unknown, source: string): InspectorTarget {\n if (typeof value !== \"object\" || value === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is not an object in ${source}`,\n );\n }\n const candidate = value as Record<string, unknown>;\n const webSocketDebuggerUrl = candidate[\"webSocketDebuggerUrl\"];\n if (typeof webSocketDebuggerUrl !== \"string\" || webSocketDebuggerUrl.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is missing webSocketDebuggerUrl in ${source}`,\n );\n }\n return {\n description: typeof candidate[\"description\"] === \"string\" ? candidate[\"description\"] : \"\",\n id: typeof candidate[\"id\"] === \"string\" ? candidate[\"id\"] : \"\",\n title: typeof candidate[\"title\"] === \"string\" ? candidate[\"title\"] : \"\",\n type: typeof candidate[\"type\"] === \"string\" ? candidate[\"type\"] : \"\",\n url: typeof candidate[\"url\"] === \"string\" ? candidate[\"url\"] : \"\",\n webSocketDebuggerUrl,\n ...(typeof candidate[\"devtoolsFrontendUrl\"] === \"string\"\n ? { devtoolsFrontendUrl: candidate[\"devtoolsFrontendUrl\"] }\n : {}),\n ...(typeof candidate[\"faviconUrl\"] === \"string\" ? { faviconUrl: candidate[\"faviconUrl\"] } : {}),\n };\n}\n\nexport async function discoverInspectorTargets(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<readonly InspectorTarget[]> {\n const url = `http://${host}:${port.toString()}/json/list`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets returned from ${url}`,\n );\n }\n return raw.map((entry, idx): InspectorTarget => toInspectorTarget(entry, `${url}[${idx.toString()}]`));\n}\n\nfunction readVersionField(value: Record<string, unknown>, ...keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const entry = value[key];\n if (typeof entry === \"string\" && entry.length > 0) {\n return entry;\n }\n }\n return undefined;\n}\n\nexport async function fetchInspectorVersion(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<InspectorVersion> {\n const url = `http://${host}:${port.toString()}/json/version`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (typeof raw !== \"object\" || raw === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n const value = raw as Record<string, unknown>;\n const browser = readVersionField(value, \"Browser\", \"browser\");\n const protocolVersion = readVersionField(value, \"Protocol-Version\", \"protocolVersion\");\n if (browser === undefined || protocolVersion === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n return { browser, protocolVersion };\n}\n\ninterface ScriptParsedParams {\n scriptId?: unknown;\n url?: unknown;\n}\n\nexport async function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const target = targets[0];\n if (!target) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets available on ${host}:${options.port.toString()}`,\n );\n }\n const client = await CdpClient.connect({ url: target.webSocketDebuggerUrl });\n const scripts = new Map<string, ScriptInfo>();\n client.on(\"Debugger.scriptParsed\", (raw) => {\n const params = raw as ScriptParsedParams;\n const scriptId = asString(params.scriptId);\n const url = asString(params.url);\n if (scriptId.length === 0) {\n return;\n }\n scripts.set(scriptId, { scriptId, url });\n });\n // Buffer Debugger.paused events from the moment Debugger.enable is sent so\n // breakpoints that fire before waitForPause attaches its listener are not lost.\n // Bounded (FIFO drop-oldest) to avoid unbounded memory growth on a tight\n // paused-then-resumed loop.\n //\n // The pauseWaitGate coordinates with waitForPause: when a waitForPause call\n // is currently consuming the live CDP stream, this listener skips the buffer\n // push so the same event isn't replayed by a subsequent waitForPause call.\n // Without the gate, a buffer-miss path (waitForPause sees an empty buffer\n // and falls through to client.waitFor) ends with both client.waitFor AND\n // this listener handling the same event — the event is returned AND queued\n // in the buffer, ready to be replayed on the next call.\n const PAUSE_BUFFER_LIMIT = 32;\n const pauseBuffer: PauseEvent[] = [];\n const pauseWaitGate: PauseWaitGate = { active: false };\n const debuggerState: DebuggerState = {};\n client.on(\"Debugger.paused\", (raw) => {\n if (pauseWaitGate.active) {\n return;\n }\n const params = raw as CdpPauseParams;\n const event = toPauseEvent(params, performance.now());\n if (pauseBuffer.length >= PAUSE_BUFFER_LIMIT) {\n pauseBuffer.shift();\n }\n pauseBuffer.push(event);\n });\n client.on(\"Debugger.resumed\", () => {\n debuggerState.lastResumedAtMs = performance.now();\n });\n await client.send(\"Runtime.enable\");\n await client.send(\"Debugger.enable\");\n return {\n client,\n target,\n scripts,\n pauseBuffer,\n pauseWaitGate,\n debuggerState,\n dispose: async (): Promise<void> => {\n try {\n await client.send(\"Debugger.disable\");\n } catch {\n // best-effort\n }\n client.dispose();\n },\n };\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction toResolvedLocations(value: unknown): readonly ResolvedLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ResolvedLocation[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpResolvedLocation;\n const scriptId = asString(candidate.scriptId);\n if (scriptId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.lineNumber);\n const result: ResolvedLocation = url === undefined\n ? { scriptId, lineNumber, columnNumber: asNumber(candidate.columnNumber) }\n : { scriptId, url, lineNumber, columnNumber: asNumber(candidate.columnNumber) };\n return [result];\n });\n}\n\nexport interface SetBreakpointInput extends BreakpointLocation {\n readonly remoteRoot?: RemoteRootSetting;\n readonly condition?: string;\n}\n\nexport async function setBreakpoint(\n session: InspectorSession,\n input: SetBreakpointInput,\n): Promise<BreakpointHandle> {\n const remoteRoot: RemoteRootSetting = input.remoteRoot ?? { kind: \"none\" };\n const urlRegex = buildBreakpointUrlRegex({ file: input.file, remoteRoot });\n const params: Record<string, unknown> = {\n lineNumber: input.line - 1,\n urlRegex,\n };\n if (input.condition !== undefined && input.condition.length > 0) {\n params[\"condition\"] = input.condition;\n }\n const result = await session.client.send<CdpSetBreakpointResult>(\n \"Debugger.setBreakpointByUrl\",\n params,\n );\n const breakpointId = asString(result.breakpointId);\n if (breakpointId.length === 0) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `setBreakpointByUrl did not return a breakpointId for ${input.file}:${input.line.toString()}`,\n );\n }\n return {\n breakpointId,\n file: input.file,\n line: input.line,\n urlRegex,\n resolvedLocations: toResolvedLocations(result.locations),\n };\n}\n\nexport async function removeBreakpoint(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n await session.client.send(\"Debugger.removeBreakpoint\", { breakpointId });\n}\n\nfunction toScopeChain(value: unknown): readonly ScopeInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ScopeInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpScope;\n const type = asString(candidate.type);\n if (type.length === 0) {\n return [];\n }\n const objectId = typeof candidate.object?.objectId === \"string\" ? candidate.object.objectId : undefined;\n const name = typeof candidate.name === \"string\" ? candidate.name : undefined;\n const base: ScopeInfo = name === undefined\n ? { type }\n : { type, name };\n return [objectId === undefined ? base : { ...base, objectId }];\n });\n}\n\nfunction toCallFrames(value: unknown): readonly CallFrameInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): CallFrameInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpCallFrame;\n const callFrameId = asString(candidate.callFrameId);\n if (callFrameId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.location?.lineNumber);\n const columnNumber = asNumber(candidate.location?.columnNumber);\n const base: CallFrameInfo = {\n callFrameId,\n functionName: asString(candidate.functionName),\n lineNumber,\n columnNumber,\n scopeChain: toScopeChain(candidate.scopeChain),\n };\n return [url === undefined ? base : { ...base, url }];\n });\n}\n\nexport interface WaitForPauseOptions {\n readonly timeoutMs: number;\n readonly breakpointIds?: readonly string[];\n readonly unmatchedPausePolicy?: \"wait-for-resume\" | \"fail\";\n readonly onUnmatchedPause?: (pause: PauseEvent) => void;\n}\n\nfunction pauseMatches(pause: PauseEvent, breakpointIds: readonly string[] | undefined): boolean {\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nfunction toPauseEvent(params: CdpPauseParams, receivedAtMs: number): PauseEvent {\n return {\n reason: asString(params.reason),\n hitBreakpoints: Array.isArray(params.hitBreakpoints)\n ? params.hitBreakpoints.filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params.callFrames),\n receivedAtMs,\n };\n}\n\nfunction remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\n}\n\nfunction topFrameLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n\nfunction pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n\nfunction hasResumedSincePause(session: InspectorSession, pause: PauseEvent): boolean {\n const pauseAt = pause.receivedAtMs;\n const resumedAt = session.debuggerState.lastResumedAtMs;\n return pauseAt !== undefined && resumedAt !== undefined && resumedAt >= pauseAt;\n}\n\nfunction throwBreakpointTimeout(timeoutMs: number): never {\n throw new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for matching Debugger.paused after ${timeoutMs.toString()}ms`,\n );\n}\n\nfunction throwUnrelatedPauseTimeout(pause: PauseEvent, timeoutMs: number): never {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE_TIMEOUT\",\n `Target stayed paused by another debugger event before this command's breakpoint could hit within ${timeoutMs.toString()}ms`,\n pauseDetail(pause),\n );\n}\n\nasync function waitForUnmatchedPauseToResume(\n session: InspectorSession,\n pause: PauseEvent,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> {\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwUnrelatedPauseTimeout(pause, timeoutMs);\n }\n try {\n await session.client.waitFor(\"Debugger.resumed\", { timeoutMs: remainingMs });\n session.debuggerState.lastResumedAtMs = performance.now();\n } catch (err: unknown) {\n if (err instanceof CfInspectorError && err.code === \"BREAKPOINT_NOT_HIT\") {\n throwUnrelatedPauseTimeout(pause, timeoutMs);\n }\n throw err;\n }\n}\n\nasync function handleUnmatchedPause(\n session: InspectorSession,\n pause: PauseEvent,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<void> {\n if (options.unmatchedPausePolicy === \"fail\") {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE\",\n \"Target paused before this command's breakpoint was reached\",\n pauseDetail(pause),\n );\n }\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n options.onUnmatchedPause?.(pause);\n await waitForUnmatchedPauseToResume(session, pause, deadlineMs, options.timeoutMs);\n}\n\nexport async function waitForPause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n): Promise<PauseEvent> {\n const deadlineMs = performance.now() + options.timeoutMs;\n // Check the buffer first — a breakpoint may have fired between setBreakpoint\n // returning and waitForPause being called (the inspectee runs continuously).\n const buffer = session.pauseBuffer;\n while (buffer.length > 0 || remainingUntil(deadlineMs) > 0) {\n while (buffer.length > 0) {\n const buffered = buffer.shift();\n if (buffered === undefined) {\n continue;\n }\n if (pauseMatches(buffered, options.breakpointIds)) {\n return buffered;\n }\n await handleUnmatchedPause(session, buffered, options, deadlineMs);\n }\n\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwBreakpointTimeout(options.timeoutMs);\n }\n session.pauseWaitGate.active = true;\n let receivedAtMs: number | undefined;\n let params: CdpPauseParams;\n try {\n params = await session.client.waitFor<CdpPauseParams>(\"Debugger.paused\", {\n timeoutMs: remainingMs,\n predicate: (): boolean => {\n receivedAtMs = performance.now();\n return true;\n },\n });\n } finally {\n session.pauseWaitGate.active = false;\n }\n const pause = toPauseEvent(params, receivedAtMs ?? performance.now());\n if (pauseMatches(pause, options.breakpointIds)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n}\n\nexport async function evaluateOnFrame(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport async function evaluateGlobal(\n session: InspectorSession,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport function listScripts(session: InspectorSession): readonly ScriptInfo[] {\n return [...session.scripts.values()];\n}\n\ninterface CdpCompileResult {\n scriptId?: unknown;\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\n/**\n * Pre-compile a JS expression on the inspectee using Runtime.compileScript so\n * syntax errors surface as a CfInspectorError(\"INVALID_EXPRESSION\") instead of\n * being silently swallowed by V8 when wired into a breakpoint condition or a\n * logpoint. Without this guard, a typo in --condition or --expr causes the\n * breakpoint to silently never fire — the user would see BREAKPOINT_NOT_HIT\n * after the timeout and have no idea why.\n *\n * persistScript: false — we don't actually want the compiled script around;\n * we just want V8 to parse it and report any SyntaxError.\n */\nexport async function validateExpression(\n session: InspectorSession,\n expression: string,\n): Promise<void> {\n const result = await session.client.send<CdpCompileResult>(\"Runtime.compileScript\", {\n expression,\n sourceURL: \"<cf-inspector-validate>\",\n persistScript: false,\n });\n if (result.exceptionDetails === undefined) {\n return;\n }\n const description =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\"\n ? result.exceptionDetails.text\n : \"expression failed to compile\");\n throw new CfInspectorError(\"INVALID_EXPRESSION\", description);\n}\n\ninterface CdpProperty {\n name?: unknown;\n value?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n}\n\nexport async function getProperties(\n session: InspectorSession,\n objectId: string,\n): Promise<readonly CdpProperty[]> {\n const result = await session.client.send<{ result?: unknown }>(\"Runtime.getProperties\", {\n objectId,\n ownProperties: true,\n accessorPropertiesOnly: false,\n generatePreview: true,\n });\n if (!Array.isArray(result.result)) {\n return [];\n }\n return result.result as readonly CdpProperty[];\n}\n\nexport type { CdpEvalResult, CdpProperty };\n","import { EventEmitter } from \"node:events\";\n\nimport { CfInspectorError } from \"./types.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\n\nexport interface CdpTransportEventMap {\n readonly message: (data: string) => void;\n readonly close: () => void;\n readonly error: (err: Error) => void;\n}\n\nexport interface CdpTransport {\n send(payload: string): void;\n close(): void;\n readonly readyState: number;\n on<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n off<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n}\n\nexport type CdpTransportFactory = (url: string) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n}\n\ninterface PendingRequest {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\ninterface ParsedMessage {\n readonly id?: number;\n readonly method?: string;\n readonly result?: unknown;\n readonly params?: unknown;\n readonly error?: { code: number; message: string };\n}\n\nfunction parseMessage(raw: string): ParsedMessage | undefined {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return value as ParsedMessage;\n } catch {\n return undefined;\n }\n}\n\nasync function loadDefaultFactory(): Promise<CdpTransportFactory> {\n const mod = await import(\"./wsTransport.js\");\n return mod.wsTransportFactory;\n}\n\nexport class CdpClient {\n private readonly transport: CdpTransport;\n private readonly requestTimeoutMs: number;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly emitter = new EventEmitter();\n private nextId = 1;\n private closed = false;\n private closeReason: Error | undefined;\n\n private readonly handleMessage = (raw: string): void => {\n const parsed = parseMessage(raw);\n if (!parsed) {\n return;\n }\n if (typeof parsed.id === \"number\") {\n const pending = this.pending.get(parsed.id);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${parsed.id.toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n return;\n }\n if (typeof parsed.method === \"string\") {\n this.emitter.emit(parsed.method, parsed.params);\n this.emitter.emit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private readonly handleClose = (): void => {\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Inspector connection closed\"));\n };\n\n private readonly handleError = (err: Error): void => {\n this.markClosed(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", err.message),\n );\n };\n\n private constructor(transport: CdpTransport, requestTimeoutMs: number) {\n this.transport = transport;\n this.requestTimeoutMs = requestTimeoutMs;\n transport.on(\"message\", this.handleMessage);\n transport.on(\"close\", this.handleClose);\n transport.on(\"error\", this.handleError);\n }\n\n public static async connect(options: CdpClientOptions): Promise<CdpClient> {\n const factory = options.transportFactory ?? (await loadDefaultFactory());\n const transport = await factory(options.url);\n return new CdpClient(transport, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);\n }\n\n public async send<TResult = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<TResult> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n const id = this.nextId++;\n const payload = JSON.stringify({ id, method, params });\n return await new Promise<TResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP method ${method} timed out after ${this.requestTimeoutMs.toString()}ms`,\n ),\n );\n }, this.requestTimeoutMs);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n try {\n this.transport.send(payload);\n } catch (err: unknown) {\n clearTimeout(timer);\n this.pending.delete(id);\n const message = err instanceof Error ? err.message : String(err);\n reject(new CfInspectorError(\"CDP_REQUEST_FAILED\", `Failed to send ${method}: ${message}`));\n }\n });\n }\n\n public on(method: string, listener: (params: unknown) => void): () => void {\n this.emitter.on(method, listener);\n return (): void => {\n this.emitter.off(method, listener);\n };\n }\n\n public async waitFor<T = unknown>(\n method: string,\n options: { readonly timeoutMs: number; readonly predicate?: (params: T) => boolean } = {\n timeoutMs: this.requestTimeoutMs,\n },\n ): Promise<T> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n clearTimeout(timer);\n offEvent();\n offClose();\n };\n const offEvent = this.on(method, (raw) => {\n if (settled) {\n return;\n }\n const params = raw as T;\n if (options.predicate && !options.predicate(params)) {\n return;\n }\n settled = true;\n cleanup();\n resolve(params);\n });\n const offClose = this.onClose((err) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(err);\n });\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${options.timeoutMs.toString()}ms`,\n ),\n );\n }, options.timeoutMs);\n });\n }\n\n public onClose(listener: (err: Error) => void): () => void {\n if (this.closed) {\n const reason = this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n queueMicrotask(() => {\n listener(reason);\n });\n return (): void => {\n // already closed; nothing to detach\n };\n }\n this.emitter.on(\"__close__\", listener);\n return (): void => {\n this.emitter.off(\"__close__\", listener);\n };\n }\n\n public dispose(): void {\n if (this.closed) {\n return;\n }\n this.transport.off(\"message\", this.handleMessage);\n this.transport.off(\"close\", this.handleClose);\n this.transport.off(\"error\", this.handleError);\n try {\n this.transport.close();\n } catch {\n // best-effort\n }\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection disposed\"));\n }\n\n public get isClosed(): boolean {\n return this.closed;\n }\n\n private markClosed(reason: Error): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(reason);\n }\n this.pending.clear();\n this.emitter.emit(\"__close__\", reason);\n this.emitter.removeAllListeners();\n }\n}\n","import { CfInspectorError } from \"./types.js\";\nimport type { BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst REGEX_PREFIX = \"regex:\";\n// cspell:ignore dgimsuvy\nconst REGEX_FLAGS_PATTERN = /^[dgimsuvy]*$/;\nconst TS_JS_EXT_PATTERN = /\\.(?:ts|js|mts|mjs|cts|cjs)$/i;\n\nexport function parseBreakpointSpec(input: string): BreakpointLocation {\n const idx = input.lastIndexOf(\":\");\n if (idx <= 0 || idx === input.length - 1) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint must be in 'file:line' form, received: \"${input}\"`,\n );\n }\n const file = input.slice(0, idx).trim();\n const lineRaw = input.slice(idx + 1).trim();\n const line = Number.parseInt(lineRaw, 10);\n if (!Number.isInteger(line) || line <= 0 || line.toString() !== lineRaw) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint line must be a positive integer, received: \"${lineRaw}\"`,\n );\n }\n if (file.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint file path is empty in \"${input}\"`,\n );\n }\n return { file, line };\n}\n\nexport function parseRemoteRoot(value: string | undefined): RemoteRootSetting {\n const trimmed = value?.trim();\n if (trimmed === undefined || trimmed.length === 0) {\n return { kind: \"none\" };\n }\n if (trimmed.startsWith(REGEX_PREFIX)) {\n return toRegex(trimmed.slice(REGEX_PREFIX.length), \"\");\n }\n const slashRegex = parseSlashDelimited(trimmed);\n if (slashRegex !== undefined) {\n return toRegex(slashRegex.pattern, slashRegex.flags);\n }\n return { kind: \"literal\", value: stripTrailingSlash(trimmed) };\n}\n\nfunction toRegex(pattern: string, flags: string): RemoteRootSetting {\n try {\n const regex = new RegExp(pattern, flags);\n return { kind: \"regex\", pattern, flags, regex };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n throw new CfInspectorError(\n \"INVALID_REMOTE_ROOT\",\n `Failed to compile remote-root regex \"${pattern}\" with flags \"${flags}\": ${message}`,\n );\n }\n}\n\nfunction parseSlashDelimited(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith(\"/\")) {\n return undefined;\n }\n const closing = findLastUnescapedSlash(value);\n if (closing <= 0) {\n return undefined;\n }\n const flags = value.slice(closing + 1);\n // Disambiguate with literal paths: a path like \"/home/vcap/app/\" would parse\n // as `/<pattern>/` with empty flags. We require non-empty flags for the\n // slash-delimited form; flagless regexes must use the explicit \"regex:\" prefix.\n if (flags.length === 0 || !REGEX_FLAGS_PATTERN.test(flags)) {\n return undefined;\n }\n return { pattern: value.slice(1, closing), flags };\n}\n\nfunction findLastUnescapedSlash(value: string): number {\n for (let i = value.length - 1; i > 0; i--) {\n if (value[i] === \"/\" && !isEscaped(value, i)) {\n return i;\n }\n }\n return -1;\n}\n\nfunction isEscaped(value: string, idx: number): boolean {\n let backslashes = 0;\n for (let i = idx - 1; i >= 0; i--) {\n if (value[i] === \"\\\\\") {\n backslashes++;\n } else {\n break;\n }\n }\n return backslashes % 2 === 1;\n}\n\nfunction stripTrailingSlash(value: string): string {\n if (value.length > 1 && value.endsWith(\"/\")) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nfunction normalizeRegexRootPattern(pattern: string): string {\n const withoutStartAnchor = pattern.startsWith(\"^\") ? pattern.slice(1) : pattern;\n const withoutEndAnchor =\n withoutStartAnchor.endsWith(\"$\") && !isEscaped(withoutStartAnchor, withoutStartAnchor.length - 1)\n ? withoutStartAnchor.slice(0, -1)\n : withoutStartAnchor;\n return stripTrailingSlash(withoutEndAnchor);\n}\n\nfunction buildFileUrlRegex(rootPattern: string, tail: string): string {\n const separator = rootPattern.endsWith(\"/\") ? \"\" : \"/\";\n return `^file://${rootPattern}${separator}${tail}$`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`);\n}\n\nfunction normalizeRelative(file: string): string {\n return file.replaceAll(/^[./\\\\]+/g, \"\").replaceAll(\"\\\\\", \"/\");\n}\n\nfunction dropExtension(file: string): { stem: string; matchedExt: boolean } {\n const match = TS_JS_EXT_PATTERN.exec(file);\n if (!match) {\n return { stem: file, matchedExt: false };\n }\n return { stem: file.slice(0, match.index), matchedExt: true };\n}\n\nconst EXT_GROUP = String.raw`\\.(?:ts|js|mts|mjs|cts|cjs)`;\nconst OPTIONAL_EXT_GROUP = String.raw`(?:\\.(?:ts|js|mts|mjs|cts|cjs))?`;\n\nexport interface BuildUrlRegexInput {\n readonly file: string;\n readonly remoteRoot: RemoteRootSetting;\n}\n\nexport function buildBreakpointUrlRegex(input: BuildUrlRegexInput): string {\n const normalized = normalizeRelative(input.file);\n const { stem, matchedExt } = dropExtension(normalized);\n const escapedStem = escapeRegExp(stem);\n const tail = matchedExt ? `${escapedStem}${EXT_GROUP}` : `${escapedStem}${OPTIONAL_EXT_GROUP}`;\n\n switch (input.remoteRoot.kind) {\n case \"none\": {\n return `(?:^|/)${tail}$`;\n }\n case \"literal\": {\n const escapedRoot = escapeRegExp(input.remoteRoot.value);\n return buildFileUrlRegex(escapedRoot, tail);\n }\n case \"regex\": {\n const rootPattern = normalizeRegexRootPattern(input.remoteRoot.pattern);\n return buildFileUrlRegex(rootPattern, tail);\n }\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport { removeBreakpoint, setBreakpoint } from \"./inspector.js\";\nimport type { InspectorSession } from \"./inspector.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointEvent {\n readonly ts: string;\n readonly at: string;\n readonly value?: string;\n readonly error?: string;\n readonly raw?: string;\n}\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly signal?: AbortSignal;\n readonly onEvent: (event: LogpointEvent) => void;\n /**\n * Fires once, immediately after `Debugger.setBreakpointByUrl` returns, with\n * the resolved breakpoint handle. Useful for surfacing warnings such as a BP\n * that did not bind to any script — the caller can warn the user before\n * the stream window elapses.\n */\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n /** Emitted log count, including parse errors that kept the sentinel. */\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\";\n}\n\n/**\n * Serialize a CDP-side IIFE that runs the user's expression as a \"logpoint\":\n * never pauses (always returns false), tags each emitted log with a unique\n * sentinel so we can distinguish our logs from app traffic, and wraps both the\n * user expression and JSON.stringify in try/catch so a thrown expression still\n * surfaces an error event instead of silently breaking the breakpoint.\n *\n * Exported for unit testing — the wire format is part of the contract.\n */\nexport function buildLogpointCondition(sentinel: string, expression: string): string {\n // sentinel embedded as a JS string literal; expression wrapped in parens.\n // The IIFE returns false so V8 never pauses the inspectee.\n return [\n \"(function(){\",\n `var s=${JSON.stringify(sentinel)};`,\n \"try{\",\n `var v=(${expression});`,\n \"var r=typeof v==='string'?v:JSON.stringify(v);\",\n \"console.log(s, r);\",\n \"}catch(e){\",\n \"console.log(s, '!err:'+(e&&e.message?e.message:String(e)));\",\n \"}\",\n \"return false;\",\n \"})()\",\n ].join(\"\");\n}\n\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\ninterface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readArg(arg: unknown, index: number): string | undefined {\n if (typeof arg !== \"object\" || arg === null) {\n return undefined;\n }\n const candidate = arg as CdpRemoteObject;\n if (candidate.type === \"string\" && typeof candidate.value === \"string\") {\n return candidate.value;\n }\n // Other primitives — coerce via String() only on confirmed-primitive types.\n const isPrimitiveType =\n candidate.type === \"number\" ||\n candidate.type === \"boolean\" ||\n candidate.type === \"bigint\";\n const isPrimitiveValue =\n typeof candidate.value === \"number\" ||\n typeof candidate.value === \"boolean\" ||\n typeof candidate.value === \"bigint\";\n if (isPrimitiveType && isPrimitiveValue) {\n return String(candidate.value);\n }\n // For first arg, only string sentinel matters; for second we handle below.\n return index === 0 ? undefined : \"\";\n}\n\nfunction parseLogEvent(\n rawArgs: unknown,\n sentinel: string,\n location: BreakpointLocation,\n timestamp: number | undefined,\n): LogpointEvent | undefined {\n if (!Array.isArray(rawArgs) || rawArgs.length < 2) {\n return undefined;\n }\n const tag = readArg(rawArgs[0], 0);\n if (tag !== sentinel) {\n return undefined;\n }\n const payload = readArg(rawArgs[1], 1) ?? \"\";\n const ts = new Date(typeof timestamp === \"number\" ? timestamp : Date.now()).toISOString();\n const at = `${location.file}:${location.line.toString()}`;\n if (payload.startsWith(\"!err:\")) {\n return { ts, at, error: payload.slice(\"!err:\".length) };\n }\n // Distinguish JSON-encoded vs already-string values by trying to parse;\n // unparseable strings are emitted as raw to preserve whatever the user logged.\n try {\n const parsed: unknown = JSON.parse(payload);\n if (typeof parsed === \"string\") {\n return { ts, at, value: parsed };\n }\n return { ts, at, value: JSON.stringify(parsed) };\n } catch {\n return { ts, at, value: payload, raw: payload };\n }\n}\n\nfunction generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression);\n\n // Attach the consoleAPICalled listener BEFORE setBreakpoint. CDP messages\n // travel on a single WebSocket; if we set the BP first, a fast inspectee\n // (e.g. setInterval 200ms) can fire the BP and emit consoleAPICalled before\n // we get a chance to subscribe — those events would be silently dropped.\n // The sentinel filter is generated up front so attaching early is safe.\n let emitted = 0;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n const event = parseLogEvent(params.args, sentinel, options.location, ts);\n if (event === undefined) {\n return;\n }\n emitted += 1;\n options.onEvent(event);\n });\n\n let handle: BreakpointHandle;\n try {\n handle = await setBreakpoint(session, {\n file: options.location.file,\n line: options.location.line,\n ...(options.remoteRoot === undefined ? {} : { remoteRoot: options.remoteRoot }),\n condition,\n });\n } catch (err: unknown) {\n offEvent();\n throw err;\n }\n options.onBreakpointSet?.(handle);\n\n const cleanup = async (): Promise<void> => {\n offEvent();\n try {\n await removeBreakpoint(session, handle.breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n };\n\n try {\n const reason = await waitForStop(session, options);\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n await cleanup();\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult[\"stoppedReason\"]> {\n return await new Promise<LogpointStreamResult[\"stoppedReason\"]>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStreamResult[\"stoppedReason\"]): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(reason);\n };\n const timer = options.durationMs === undefined\n ? undefined\n : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const offClose = session.client.onClose(() => {\n finish(\"transport-closed\");\n });\n const onAbort = (): void => {\n finish(\"signal\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n finish(\"signal\");\n }\n function cleanup(): void {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n}\n\nexport const internalsForTesting = {\n buildLogpointCondition,\n parseLogEvent,\n generateSentinel,\n SENTINEL_PREFIX,\n};\n","import { evaluateOnFrame, getProperties } from \"./inspector.js\";\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./inspector.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n PauseEvent,\n ScopeSnapshot,\n SnapshotCaptureResult,\n VariableSnapshot,\n} from \"./types.js\";\n\nconst MAX_SCOPES = 3;\nconst MAX_SCOPE_VARIABLES = 20;\nconst MAX_CHILD_VARIABLES = 8;\nconst MAX_VARIABLE_DEPTH = 2;\nconst MAX_VALUE_LENGTH = 240;\nconst SENSITIVE_NAME_REGEX = /(pass(?:word)?|credentials?|creds?|token|secret|api[_-]?key|authorization|cookie|session|private[_-]?key)/i;\n\nconst PRIORITY_BY_TYPE: Readonly<Record<string, number>> = {\n local: 0,\n arguments: 1,\n block: 2,\n closure: 3,\n catch: 4,\n with: 5,\n module: 6,\n script: 7,\n};\n\ninterface DescribedProperty {\n value: string;\n type?: string;\n objectId?: string;\n}\n\nfunction buildDescribed(value: string, type: string | undefined, objectId?: string): DescribedProperty {\n const base: DescribedProperty = { value };\n if (type !== undefined) {\n base.type = type;\n }\n if (objectId !== undefined) {\n base.objectId = objectId;\n }\n return base;\n}\n\nfunction describeProperty(prop: CdpProperty): DescribedProperty {\n const value = prop.value;\n if (value === undefined) {\n return { value: \"undefined\" };\n }\n const type = typeof value.type === \"string\" ? value.type : undefined;\n const objectId = typeof value.objectId === \"string\" ? value.objectId : undefined;\n if (type === \"undefined\") {\n return buildDescribed(\"undefined\", type);\n }\n if (type === \"string\" && typeof value.value === \"string\") {\n return buildDescribed(JSON.stringify(value.value), type);\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\" || type === \"symbol\") &&\n isPrimitive(value.value)\n ) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (typeof value.description === \"string\") {\n return buildDescribed(value.description, type, objectId);\n }\n if (isPrimitive(value.value)) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (objectId === undefined) {\n return buildDescribed(\"undefined\", type);\n }\n return buildDescribed(\"[object]\", type, objectId);\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol {\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\" || t === \"symbol\";\n}\n\nfunction formatPrimitive(value: string | number | boolean | bigint | symbol): string {\n if (typeof value === \"symbol\") {\n return value.toString();\n }\n if (typeof value === \"bigint\") {\n return `${value.toString()}n`;\n }\n return String(value);\n}\n\nfunction isSensitiveName(name: string): boolean {\n return SENSITIVE_NAME_REGEX.test(name);\n}\n\nfunction sanitizeValue(name: string, raw: string): string {\n if (isSensitiveName(name)) {\n return \"[REDACTED]\";\n }\n if (raw.length <= MAX_VALUE_LENGTH) {\n return raw;\n }\n return `${raw.slice(0, MAX_VALUE_LENGTH)}...`;\n}\n\nfunction isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nasync function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n): Promise<readonly VariableSnapshot[]> {\n const properties = await getProperties(session, objectId);\n const limited = properties.slice(0, limit);\n const variables = await Promise.all(\n limited.map(async (prop): Promise<VariableSnapshot> => {\n const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n const sensitive = isSensitiveName(name);\n let children: readonly VariableSnapshot[] | undefined;\n if (!sensitive && depth > 0 && described.objectId !== undefined && isExpandable(described.type)) {\n try {\n const nested = await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n );\n if (nested.length > 0) {\n children = nested;\n }\n } catch {\n // best-effort: skip nested expansion on error\n }\n }\n const sanitizedValue = sensitive ? \"[REDACTED]\" : sanitizeValue(name, described.value);\n const base: VariableSnapshot = { name, value: sanitizedValue };\n const withType = described.type === undefined ? base : { ...base, type: described.type };\n return children === undefined ? withType : { ...withType, children };\n }),\n );\n return variables;\n}\n\nfunction selectScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n const eligible = scopeChain.filter((scope) => scope.objectId !== undefined && scope.type !== \"global\");\n return [...eligible]\n .sort((a, b) => priorityOf(a.type) - priorityOf(b.type))\n .slice(0, MAX_SCOPES);\n}\n\nfunction priorityOf(type: string): number {\n return PRIORITY_BY_TYPE[type] ?? Number.MAX_SAFE_INTEGER;\n}\n\nasync function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n): Promise<readonly ScopeSnapshot[]> {\n const scopes = selectScopes(frame.scopeChain);\n return await Promise.all(\n scopes.map(async (scope): Promise<ScopeSnapshot> => {\n const objectId = scope.objectId;\n if (objectId === undefined) {\n return { type: scope.type, variables: [] };\n }\n const variables = await captureProperties(session, objectId, MAX_SCOPE_VARIABLES, MAX_VARIABLE_DEPTH);\n return { type: scope.type, variables };\n }),\n );\n}\n\nfunction evalResultToCaptured(expression: string, result: CdpEvalResult): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n const text =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n return { expression, error: text };\n }\n const inner = result.result;\n if (!inner) {\n return { expression, error: \"no result returned\" };\n }\n const type = typeof inner.type === \"string\" ? inner.type : undefined;\n\n const buildCaptured = (rendered: string): CapturedExpression => {\n const sanitized = sanitizeValue(expression, rendered);\n const base: CapturedExpression = { expression, value: sanitized };\n return type === undefined ? base : { ...base, type };\n };\n\n if (type === \"string\" && typeof inner.value === \"string\") {\n return buildCaptured(JSON.stringify(inner.value));\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\") &&\n isPrimitive(inner.value)\n ) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n if (typeof inner.description === \"string\") {\n return buildCaptured(inner.description);\n }\n if (isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n return buildCaptured(\"undefined\");\n}\n\nexport interface CaptureSnapshotOptions {\n readonly captures?: readonly string[];\n}\n\nexport async function captureSnapshot(\n session: InspectorSession,\n pause: PauseEvent,\n options: CaptureSnapshotOptions = {},\n): Promise<SnapshotCaptureResult> {\n const top = pause.callFrames[0];\n let topFrame: FrameSnapshot | undefined;\n let captures: CapturedExpression[] = [];\n if (top) {\n const scopes = await captureScopes(session, top);\n topFrame = {\n functionName: top.functionName,\n ...(top.url === undefined ? {} : { url: top.url }),\n line: top.lineNumber + 1,\n column: top.columnNumber + 1,\n scopes,\n };\n if (options.captures !== undefined && options.captures.length > 0) {\n captures = await Promise.all(\n options.captures.map(async (expression): Promise<CapturedExpression> => {\n try {\n const result = await evaluateOnFrame(session, top.callFrameId, expression);\n return evalResultToCaptured(expression, result);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: message };\n }\n }),\n );\n }\n }\n return {\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n ...(topFrame === undefined ? {} : { topFrame }),\n captures,\n };\n}\n\nexport const internalsForTesting = {\n sanitizeValue,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import { startDebugger } from \"@saptools/cf-debugger\";\nimport type { DebuggerHandle, StartDebuggerOptions } from \"@saptools/cf-debugger\";\n\nexport interface TunnelTarget {\n readonly region: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly tunnelReadyTimeoutMs?: number;\n readonly preferredPort?: number;\n readonly verbose?: boolean;\n readonly signal?: AbortSignal;\n}\n\nexport interface OpenedTunnel {\n readonly localPort: number;\n readonly handle: DebuggerHandle;\n dispose(): Promise<void>;\n}\n\nexport async function openCfTunnel(target: TunnelTarget): Promise<OpenedTunnel> {\n const opts: StartDebuggerOptions = {\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n ...(target.tunnelReadyTimeoutMs === undefined ? {} : { tunnelReadyTimeoutMs: target.tunnelReadyTimeoutMs }),\n ...(target.preferredPort === undefined ? {} : { preferredPort: target.preferredPort }),\n ...(target.verbose === undefined ? {} : { verbose: target.verbose }),\n ...(target.signal === undefined ? {} : { signal: target.signal }),\n };\n const handle = await startDebugger(opts);\n return {\n localPort: handle.session.localPort,\n handle,\n dispose: async (): Promise<void> => {\n await handle.dispose();\n },\n };\n}\n"],"mappings":"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","names":["performance","asString","performance"]}