@saptools/cf-inspector 0.3.19 → 0.4.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/cdp/wsTransport.ts","../src/index.ts","../src/pathMapper.ts","../src/inspector/breakpoints.ts","../src/inspector/conversions.ts","../src/inspector/discovery.ts","../src/inspector/pause.ts","../src/inspector/runtime.ts","../src/inspector/session.ts","../src/cdp/client.ts","../src/snapshot/values.ts","../src/snapshot/evaluation.ts","../src/snapshot/properties.ts","../src/snapshot/objects.ts","../src/snapshot/scopes.ts","../src/snapshot/capture.ts","../src/logpoint/condition.ts","../src/logpoint/events.ts","../src/logpoint/stream.ts","../src/cf/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 { CfInspectorError } from \"../types.js\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./client.js\";\n\nexport async function wsTransportFactory(url: string): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await waitForOpen(socket, url);\n const wrappers = new WeakMap<object, (...args: unknown[]) => void>();\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 const wrapped = wrapListener(event, listener, wrappers);\n socket.on(event, wrapped);\n },\n off(event, listener): void {\n const wrapped = wrappers.get(listener as object);\n if (!wrapped) {\n return;\n }\n socket.off(event, wrapped);\n },\n };\n}\n\nasync function waitForOpen(socket: WebSocket, url: string): Promise<void> {\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}\n\nfunction wrapListener<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n wrappers: WeakMap<object, (...args: unknown[]) => void>,\n): (...args: unknown[]) => void {\n if (event === \"message\") {\n const wrapped = (data: Buffer): void => {\n (listener as CdpTransportEventMap[\"message\"])(data.toString(\"utf8\"));\n };\n wrappers.set(listener as object, wrapped as (...args: unknown[]) => void);\n return wrapped as (...args: unknown[]) => void;\n }\n if (event === \"close\") {\n const wrapped = (): void => {\n (listener as CdpTransportEventMap[\"close\"])();\n };\n wrappers.set(listener as object, wrapped as (...args: unknown[]) => void);\n return wrapped as (...args: unknown[]) => void;\n }\n const wrapped = (err: Error): void => {\n (listener as CdpTransportEventMap[\"error\"])(err);\n };\n wrappers.set(listener as object, wrapped as (...args: unknown[]) => void);\n return wrapped as (...args: unknown[]) => void;\n}\n","export { CfInspectorError } from \"./types.js\";\nexport type {\n BreakpointHandle,\n BreakpointLocation,\n CallFrameInfo,\n CapturedExpression,\n CfInspectorErrorCode,\n FrameSnapshot,\n InspectorConnectOptions,\n PauseEvent,\n RemoteRootSetting,\n ResolvedLocation,\n ScopeInfo,\n ScopeSnapshot,\n SnapshotCaptureResult,\n ScriptInfo,\n SnapshotResult,\n VariableSnapshot,\n} from \"./types.js\";\n\nexport {\n buildBreakpointUrlRegex,\n parseBreakpointSpec,\n parseRemoteRoot,\n} from \"./pathMapper.js\";\n\nexport {\n connectInspector,\n discoverInspectorTargets,\n evaluateGlobal,\n evaluateOnFrame,\n fetchInspectorVersion,\n getProperties,\n listScripts,\n removeBreakpoint,\n resume,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"./inspector/index.js\";\nexport type {\n DebuggerState,\n InspectorSession,\n InspectorTarget,\n SetBreakpointInput,\n WaitForPauseOptions,\n} from \"./inspector/index.js\";\n\nexport { captureSnapshot } from \"./snapshot/capture.js\";\nexport type { CaptureSnapshotOptions } from \"./snapshot/capture.js\";\n\nexport { buildLogpointCondition } from \"./logpoint/condition.js\";\nexport { streamLogpoint } from \"./logpoint/stream.js\";\nexport type {\n LogpointEvent,\n} from \"./logpoint/events.js\";\nexport type {\n LogpointStreamOptions,\n LogpointStreamResult,\n} from \"./logpoint/stream.js\";\n\nexport { openCfTunnel } from \"./cf/tunnel.js\";\nexport type { OpenedTunnel, TunnelTarget } from \"./cf/tunnel.js\";\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 { buildBreakpointUrlRegex } from \"../pathMapper.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, RemoteRootSetting } from \"../types.js\";\n\nimport { asString, toResolvedLocations } from \"./conversions.js\";\nimport type { CdpSetBreakpointResult, InspectorSession, SetBreakpointInput } from \"./types.js\";\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","import type {\n CallFrameInfo,\n PauseEvent,\n ResolvedLocation,\n ScriptInfo,\n ScopeInfo,\n} from \"../types.js\";\n\nimport type {\n CdpCallFrame,\n CdpPauseParams,\n CdpResolvedLocation,\n CdpScope,\n} from \"./types.js\";\n\nexport function asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function 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\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 resolveCallFrameUrl(\n frame: CdpCallFrame,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): string | undefined {\n const direct = nonEmptyString(frame.url);\n if (direct !== undefined) {\n return direct;\n }\n const scriptId = nonEmptyString(frame.location?.scriptId);\n if (scriptId === undefined) {\n return undefined;\n }\n return nonEmptyString(scripts?.get(scriptId)?.url);\n}\n\nfunction toCallFrames(\n value: unknown,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): 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 = resolveCallFrameUrl(candidate, scripts);\n const base: CallFrameInfo = {\n callFrameId,\n functionName: asString(candidate.functionName),\n lineNumber: asNumber(candidate.location?.lineNumber),\n columnNumber: asNumber(candidate.location?.columnNumber),\n scopeChain: toScopeChain(candidate.scopeChain),\n };\n return [url === undefined ? base : { ...base, url }];\n });\n}\n\nexport function toPauseEvent(\n params: CdpPauseParams,\n receivedAtMs: number,\n scripts?: ReadonlyMap<string, ScriptInfo>,\n): 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, scripts),\n receivedAtMs,\n };\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\nexport function pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n","import { request } from \"node:http\";\n\nimport { CfInspectorError } from \"../types.js\";\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\nexport interface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\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 resolve(parseJsonResponse(chunks) as T);\n } catch (err: unknown) {\n reject(parseDiscoveryError(url, err));\n }\n });\n res.on(\"error\", (err) => {\n reject(newDiscoveryError(`Inspector discovery response error: ${err.message}`));\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 parseJsonResponse(chunks: readonly Buffer[]): unknown {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n return JSON.parse(text) as unknown;\n}\n\nfunction parseDiscoveryError(url: string, err: unknown): CfInspectorError {\n const message = err instanceof Error ? err.message : String(err);\n return newDiscoveryError(`Failed to parse inspector discovery response from ${url}: ${message}`);\n}\n\nfunction newDiscoveryError(message: string): CfInspectorError {\n return new CfInspectorError(\"INSPECTOR_DISCOVERY_FAILED\", message);\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","import { performance } from \"node:perf_hooks\";\n\nimport { CfInspectorError } from \"../types.js\";\nimport type { PauseEvent } from \"../types.js\";\n\nimport { pauseDetail, toPauseEvent } from \"./conversions.js\";\nimport type { CdpPauseParams, InspectorSession, WaitForPauseOptions } from \"./types.js\";\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 remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\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 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 const pause = await waitForLivePause(session, options, deadlineMs);\n if (pauseMatches(pause, options.breakpointIds)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nasync function waitForLivePause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<PauseEvent> {\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 return toPauseEvent(params, receivedAtMs ?? performance.now(), session.scripts);\n}\n","import { CfInspectorError } from \"../types.js\";\nimport type { ScriptInfo } from \"../types.js\";\n\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./types.js\";\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\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\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 } from \"./types.js\";\n","import { performance } from \"node:perf_hooks\";\n\nimport { CdpClient } from \"../cdp/client.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { InspectorConnectOptions, PauseEvent, ScriptInfo } from \"../types.js\";\n\nimport { asString, toPauseEvent } from \"./conversions.js\";\nimport { discoverInspectorTargets } from \"./discovery.js\";\nimport type { CdpPauseParams, DebuggerState, InspectorSession, ScriptParsedParams } from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst PAUSE_BUFFER_LIMIT = 32;\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 const pauseBuffer: PauseEvent[] = [];\n const 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(), scripts);\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","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?: { readonly code: number; readonly 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 this.handleResponse(parsed);\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 = this.createRequestTimer(id, method, reject);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n this.sendPayload(id, method, payload, timer, reject);\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 finish = (value: T): void => {\n settled = true;\n cleanup();\n resolve(value);\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 finish(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(this.createWaitTimeoutError(method, options.timeoutMs));\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 handleResponse(parsed: ParsedMessage): void {\n const pending = this.pending.get(parsed.id ?? -1);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id ?? -1);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${(parsed.id ?? -1).toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n }\n\n private createRequestTimer(\n id: number,\n method: string,\n reject: (error: Error) => void,\n ): ReturnType<typeof setTimeout> {\n return 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 }\n\n private createWaitTimeoutError(method: string, timeoutMs: number): CfInspectorError {\n return new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${timeoutMs.toString()}ms`,\n );\n }\n\n private sendPayload(\n id: number,\n method: string,\n payload: string,\n timer: ReturnType<typeof setTimeout>,\n reject: (error: Error) => void,\n ): void {\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 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 { VariableSnapshot } from \"../types.js\";\n\nexport const DEFAULT_MAX_VALUE_LENGTH = 4096;\n\nexport function 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\nexport function 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\nexport function resolveMaxValueLength(value: number | undefined): number {\n if (value === undefined) {\n return DEFAULT_MAX_VALUE_LENGTH;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `Invalid maxValueLength: ${value.toString()} — expected a positive integer`,\n );\n }\n return value;\n}\n\nexport function limitValueLength(raw: string, maxValueLength = DEFAULT_MAX_VALUE_LENGTH): string {\n if (raw.length <= maxValueLength) {\n return raw;\n }\n return `${raw.slice(0, maxValueLength)}...`;\n}\n\nfunction parseQuotedString(value: string): string {\n try {\n const parsed: unknown = JSON.parse(value);\n return typeof parsed === \"string\" ? parsed : value;\n } catch {\n return value;\n }\n}\n\nfunction parseNumericIndex(name: string): number | undefined {\n const parsed = Number.parseInt(name, 10);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed.toString() !== name) {\n return undefined;\n }\n return parsed;\n}\n\nfunction scalarFromVariable(variable: VariableSnapshot): unknown {\n const value = variable.value;\n if (variable.type === \"string\") {\n return parseQuotedString(value);\n }\n if (variable.type === \"number\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : value;\n }\n if (variable.type === \"boolean\") {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n }\n if (variable.type === \"undefined\") {\n return \"[undefined]\";\n }\n if (variable.type === \"bigint\") {\n return value;\n }\n return value === \"null\" ? null : value;\n}\n\nexport function toStructuredValue(variable: VariableSnapshot): unknown {\n const children = variable.children;\n if (children === undefined || children.length === 0) {\n return scalarFromVariable(variable);\n }\n const indexed = children.flatMap((child): readonly [number, unknown][] => {\n const index = parseNumericIndex(child.name);\n if (index === undefined) {\n return [];\n }\n return [[index, toStructuredValue(child)]];\n });\n if (indexed.length > 0) {\n const maxIndex = Math.max(...indexed.map(([index]) => index));\n const out = Array.from({ length: maxIndex + 1 }, () => null as unknown);\n for (const [index, entry] of indexed) {\n out[index] = entry;\n }\n return out;\n }\n const out: Record<string, unknown> = {};\n for (const child of children) {\n out[child.name] = toStructuredValue(child);\n }\n return out;\n}\n","import type { CdpEvalResult } from \"../inspector/types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n formatPrimitive,\n isPrimitive,\n limitValueLength,\n} from \"./values.js\";\n\nexport function evalResultToCaptured(\n expression: string,\n result: CdpEvalResult,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n return { expression, error: readEvalError(result, maxValueLength) };\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 const buildCaptured = (rendered: string): CapturedExpression => {\n const sanitized = limitValueLength(rendered, maxValueLength);\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 ((type === \"number\" || type === \"boolean\" || type === \"bigint\") && isPrimitive(inner.value)) {\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\nfunction readEvalError(result: CdpEvalResult, maxValueLength: number): string {\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 limitValueLength(text, maxValueLength);\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { CdpProperty, InspectorSession } from \"../inspector/types.js\";\nimport type { VariableSnapshot } from \"../types.js\";\n\nimport { formatPrimitive, isPrimitive, limitValueLength } from \"./values.js\";\n\nexport const MAX_SCOPE_VARIABLES = 20;\nexport const MAX_CHILD_VARIABLES = 8;\nexport const MAX_VARIABLE_DEPTH = 2;\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\nexport function 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 isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nexport async function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n maxValueLength: 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 return await captureProperty(session, prop, depth, maxValueLength);\n }),\n );\n return variables;\n}\n\nasync function captureProperty(\n session: InspectorSession,\n prop: CdpProperty,\n depth: number,\n maxValueLength: number,\n): Promise<VariableSnapshot> {\n const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n const children = await capturePropertyChildren(session, described, depth, maxValueLength);\n const sanitizedValue = limitValueLength(described.value, maxValueLength);\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\nasync function capturePropertyChildren(\n session: InspectorSession,\n described: DescribedProperty,\n depth: number,\n maxValueLength: number,\n): Promise<readonly VariableSnapshot[] | undefined> {\n if (depth <= 0 || described.objectId === undefined || !isExpandable(described.type)) {\n return undefined;\n }\n try {\n const nested = await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n maxValueLength,\n );\n return nested.length > 0 ? nested : undefined;\n } catch {\n return undefined;\n }\n}\n","import type { CdpEvalResult, InspectorSession } from \"../inspector/types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport { limitValueLength, toStructuredValue } from \"./values.js\";\n\nfunction objectIdFromEvalResult(result: CdpEvalResult): string | undefined {\n const inner = result.result;\n if (inner?.type !== \"object\") {\n return undefined;\n }\n const objectId = inner.objectId;\n if (typeof objectId !== \"string\" || objectId.length === 0) {\n return undefined;\n }\n return objectId;\n}\n\nasync function renderObjectCapture(\n session: InspectorSession,\n objectId: string,\n maxValueLength: number,\n): Promise<string | undefined> {\n try {\n const properties = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n const structured: Record<string, unknown> = {};\n for (const variable of properties) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return JSON.stringify(structured);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeRenderedObjectCapture(rendered: string, original: string): string | undefined {\n if (rendered === \"{}\" && original !== \"Object\") {\n return undefined;\n }\n if (original.startsWith(\"Array(\") && rendered === \"{\\\"length\\\":0}\") {\n return \"[]\";\n }\n return rendered;\n}\n\nexport async function withSerializedObjectCapture(\n session: InspectorSession,\n expression: string,\n evalResult: CdpEvalResult,\n captured: CapturedExpression,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n if (captured.error !== undefined || captured.value === undefined) {\n return captured;\n }\n const objectId = objectIdFromEvalResult(evalResult);\n if (objectId === undefined) {\n return captured;\n }\n const rendered = await renderObjectCapture(session, objectId, maxValueLength);\n if (rendered === undefined) {\n return captured;\n }\n const normalized = normalizeRenderedObjectCapture(rendered, captured.value);\n if (normalized === undefined) {\n return captured;\n }\n const value = limitValueLength(normalized, maxValueLength);\n return captured.type === undefined\n ? { expression, value }\n : { expression, value, type: captured.type };\n}\n","import type { InspectorSession } from \"../inspector/types.js\";\nimport type { CallFrameInfo, ScopeSnapshot } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\n\nconst MAX_SCOPES = 3;\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\nexport function 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\nexport async function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n maxValueLength: number,\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 try {\n const variables = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n return { type: scope.type, variables };\n } catch {\n return { type: scope.type, variables: [] };\n }\n }),\n );\n}\n","import { evaluateOnFrame } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CapturedExpression,\n FrameSnapshot,\n PauseEvent,\n SnapshotCaptureResult,\n} from \"../types.js\";\n\nimport { evalResultToCaptured } from \"./evaluation.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { describeProperty } from \"./properties.js\";\nimport { captureScopes, selectScopes } from \"./scopes.js\";\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n} from \"./values.js\";\n\nexport interface CaptureSnapshotOptions {\n readonly captures?: readonly string[];\n readonly includeScopes?: boolean;\n readonly maxValueLength?: number;\n}\n\nexport async function captureSnapshot(\n session: InspectorSession,\n pause: PauseEvent,\n options: CaptureSnapshotOptions = {},\n): Promise<SnapshotCaptureResult> {\n const maxValueLength = resolveMaxValueLength(options.maxValueLength);\n const top = pause.callFrames[0];\n let topFrame: FrameSnapshot | undefined;\n let captures: CapturedExpression[] = [];\n if (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 };\n if (options.includeScopes === true) {\n const scopes = await captureScopes(session, top, maxValueLength);\n topFrame = { ...topFrame, scopes };\n }\n captures = await captureExpressions(session, top.callFrameId, options.captures, maxValueLength);\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\nasync function captureExpressions(\n session: InspectorSession,\n callFrameId: string,\n captures: readonly string[] | undefined,\n maxValueLength: number,\n): Promise<CapturedExpression[]> {\n if (captures === undefined || captures.length === 0) {\n return [];\n }\n return await Promise.all(\n captures.map(async (expression): Promise<CapturedExpression> => {\n return await captureExpression(session, callFrameId, expression, maxValueLength);\n }),\n );\n}\n\nasync function captureExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression);\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n return await withSerializedObjectCapture(session, expression, result, captured, maxValueLength);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: limitValueLength(message, maxValueLength) };\n }\n}\n\nexport const internalsForTesting = {\n DEFAULT_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import { randomBytes } from \"node:crypto\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport function buildLogpointCondition(sentinel: string, expression: string): string {\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\nexport function generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport { SENTINEL_PREFIX };\n","import type { BreakpointLocation } from \"../types.js\";\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\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\nexport interface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nexport function 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 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 return index === 0 ? undefined : \"\";\n}\n\nexport function 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 return parsePayload(ts, at, payload);\n}\n\nfunction parsePayload(ts: string, at: string, payload: string): LogpointEvent {\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","import { removeBreakpoint, setBreakpoint } from \"../inspector/breakpoints.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"../types.js\";\n\nimport { buildLogpointCondition, generateSentinel } from \"./condition.js\";\nimport { asString, parseLogEvent } from \"./events.js\";\nimport type { ConsoleAPICalledParams, LogpointEvent } from \"./events.js\";\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 readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\";\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 let emitted = 0;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n const event = toLogpointEvent(raw, sentinel, options.location);\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 try {\n const reason = await waitForStop(session, options);\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n offEvent();\n await removeBreakpointBestEffort(session, handle.breakpointId);\n }\n}\n\nfunction toLogpointEvent(\n raw: unknown,\n sentinel: string,\n location: BreakpointLocation,\n): LogpointEvent | undefined {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return undefined;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n return parseLogEvent(params.args, sentinel, location, ts);\n}\n\nasync function removeBreakpointBestEffort(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n try {\n await removeBreakpoint(session, breakpointId);\n } catch {\n // best-effort: tunnel may be gone\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","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":["wrapped","performance","performance","out","asString","asString"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/cdp/wsTransport.ts","../src/index.ts","../src/pathMapper.ts","../src/inspector/breakpoints.ts","../src/inspector/conversions.ts","../src/inspector/discovery.ts","../src/inspector/pause.ts","../src/inspector/runtime.ts","../src/inspector/session.ts","../src/cdp/client.ts","../src/snapshot/values.ts","../src/snapshot/evaluation.ts","../src/snapshot/properties.ts","../src/snapshot/exception.ts","../src/snapshot/objects.ts","../src/snapshot/scopes.ts","../src/snapshot/stack.ts","../src/snapshot/capture.ts","../src/logpoint/condition.ts","../src/logpoint/stream.ts","../src/logpoint/events.ts","../src/cf/tunnel.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"INVALID_HIT_COUNT\"\n | \"INVALID_PAUSE_TYPE\"\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 readonly data?: unknown;\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 readonly captures?: readonly CapturedExpression[];\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 ExceptionSnapshot {\n readonly value?: string;\n readonly type?: string;\n readonly description?: 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 readonly stack?: readonly FrameSnapshot[];\n readonly exception?: ExceptionSnapshot;\n}\n\nexport interface SnapshotResult extends SnapshotCaptureResult {\n readonly pausedDurationMs: number | null;\n}\n\nexport interface WatchEvent {\n readonly ts: string;\n readonly at: string;\n readonly hit: number;\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n readonly stack?: readonly FrameSnapshot[];\n readonly exception?: ExceptionSnapshot;\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 { CfInspectorError } from \"../types.js\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./client.js\";\n\nexport interface WsTransportOptions {\n readonly connectTimeoutMs?: number;\n}\n\nexport async function wsTransportFactory(\n url: string,\n options: WsTransportOptions = {},\n): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await waitForOpen(socket, url, options.connectTimeoutMs);\n // Keyed by `(event, listener)` — registering the same listener function for\n // two different events must produce two distinct wrappers; otherwise `off`\n // for one event would unsubscribe the wrong wrapper.\n const wrappers = new Map<keyof CdpTransportEventMap, WeakMap<object, (...args: unknown[]) => void>>();\n\n function wrappersFor(event: keyof CdpTransportEventMap): WeakMap<object, (...args: unknown[]) => void> {\n const existing = wrappers.get(event);\n if (existing !== undefined) {\n return existing;\n }\n const created = new WeakMap<object, (...args: unknown[]) => void>();\n wrappers.set(event, created);\n return created;\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 const wrapped = wrapListener(event, listener);\n wrappersFor(event).set(listener as object, wrapped);\n socket.on(event, wrapped);\n },\n off(event, listener): void {\n const wrapped = wrappersFor(event).get(listener as object);\n if (!wrapped) {\n return;\n }\n socket.off(event, wrapped);\n },\n };\n}\n\nasync function waitForOpen(socket: WebSocket, url: string, timeoutMs: number | undefined): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n socket.off(\"open\", onOpen);\n socket.off(\"error\", onError);\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n const onOpen = (): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve();\n };\n const onError = (err: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n const timer = timeoutMs === undefined ? undefined : setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n // Absorb the 'error' event that ws emits asynchronously when terminate()\n // races an in-flight handshake. Without this swallower the post-cleanup\n // error becomes an unhandled exception.\n socket.on(\"error\", () => {\n // swallow\n });\n try {\n socket.terminate();\n } catch {\n // best-effort\n }\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `WebSocket handshake to ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n }, timeoutMs);\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n}\n\nfunction wrapListener<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n): (...args: unknown[]) => void {\n if (event === \"message\") {\n const wrapped = (data: Buffer): void => {\n (listener as CdpTransportEventMap[\"message\"])(data.toString(\"utf8\"));\n };\n return wrapped as (...args: unknown[]) => void;\n }\n if (event === \"close\") {\n const wrapped = (): void => {\n (listener as CdpTransportEventMap[\"close\"])();\n };\n return wrapped as (...args: unknown[]) => void;\n }\n const wrapped = (err: Error): void => {\n (listener as CdpTransportEventMap[\"error\"])(err);\n };\n return wrapped as (...args: unknown[]) => void;\n}\n","export { CfInspectorError } from \"./types.js\";\nexport type {\n BreakpointHandle,\n BreakpointLocation,\n CallFrameInfo,\n CapturedExpression,\n CfInspectorErrorCode,\n ExceptionSnapshot,\n FrameSnapshot,\n InspectorConnectOptions,\n PauseEvent,\n RemoteRootSetting,\n ResolvedLocation,\n ScopeInfo,\n ScopeSnapshot,\n SnapshotCaptureResult,\n ScriptInfo,\n SnapshotResult,\n VariableSnapshot,\n WatchEvent,\n} from \"./types.js\";\n\nexport {\n buildBreakpointUrlRegex,\n parseBreakpointSpec,\n parseRemoteRoot,\n} from \"./pathMapper.js\";\n\nexport {\n buildHitCountedCondition,\n connectInspector,\n discoverInspectorTargets,\n evaluateGlobal,\n evaluateOnFrame,\n fetchInspectorVersion,\n getProperties,\n listScripts,\n removeBreakpoint,\n resume,\n setBreakpoint,\n setPauseOnExceptions,\n validateExpression,\n waitForPause,\n} from \"./inspector/index.js\";\nexport type {\n DebuggerState,\n InspectorSession,\n InspectorTarget,\n PauseOnExceptionsState,\n SetBreakpointInput,\n WaitForPauseOptions,\n} from \"./inspector/index.js\";\n\nexport { captureSnapshot } from \"./snapshot/capture.js\";\nexport type { CaptureSnapshotOptions } from \"./snapshot/capture.js\";\nexport { captureException } from \"./snapshot/exception.js\";\nexport { walkStack } from \"./snapshot/stack.js\";\nexport type { WalkStackOptions } from \"./snapshot/stack.js\";\n\nexport { buildLogpointCondition } from \"./logpoint/condition.js\";\nexport type { LogpointConditionOptions } from \"./logpoint/condition.js\";\nexport { streamLogpoint } from \"./logpoint/stream.js\";\nexport type {\n LogpointEvent,\n} from \"./logpoint/events.js\";\nexport type {\n LogpointStopReason,\n LogpointStreamOptions,\n LogpointStreamResult,\n} from \"./logpoint/stream.js\";\n\nexport { openCfTunnel } from \"./cf/tunnel.js\";\nexport type { OpenedTunnel, TunnelTarget } from \"./cf/tunnel.js\";\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(embeddedRoot: string, tail: string, separator: \"\" | \"/\"): string {\n return `^file://${embeddedRoot}${separator}${tail}$`;\n}\n\nfunction rootSeparator(rawPattern: string): \"\" | \"/\" {\n return rawPattern.endsWith(\"/\") ? \"\" : \"/\";\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 root = input.remoteRoot.value;\n return buildFileUrlRegex(escapeRegExp(root), tail, rootSeparator(root));\n }\n case \"regex\": {\n const root = normalizeRegexRootPattern(input.remoteRoot.pattern);\n // Wrap the user pattern in a non-capturing group so alternation in the\n // user's regex (e.g. `regex:a|b`) does not bind to the surrounding\n // `^file://` / tail. Without this, the engine would parse the result as\n // `(^file://a)|(b/.../src/...$)`.\n return buildFileUrlRegex(`(?:${root})`, tail, rootSeparator(root));\n }\n }\n}\n","import { buildBreakpointUrlRegex } from \"../pathMapper.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, RemoteRootSetting } from \"../types.js\";\n\nimport { asString, toResolvedLocations } from \"./conversions.js\";\nimport type { CdpSetBreakpointResult, InspectorSession, SetBreakpointInput } from \"./types.js\";\n\nconst HITS_GLOBAL = \"globalThis.__CFI_HITS\";\nlet counterKeyCounter = 0;\n\nfunction nextCounterKey(file: string, line: number): string {\n counterKeyCounter += 1;\n return `${file}:${line.toString()}:${counterKeyCounter.toString()}`;\n}\n\nfunction validateHitCount(hitCount: number | undefined): number | undefined {\n if (hitCount === undefined) {\n return undefined;\n }\n if (!Number.isInteger(hitCount) || hitCount <= 0) {\n throw new CfInspectorError(\n \"INVALID_HIT_COUNT\",\n `hitCount must be a positive integer, received: ${hitCount.toString()}`,\n );\n }\n return hitCount;\n}\n\nexport function buildHitCountedCondition(\n hitCount: number,\n counterKey: string,\n userCondition: string | undefined,\n): string {\n const keyLiteral = JSON.stringify(counterKey);\n const baseCondition = userCondition !== undefined && userCondition.trim().length > 0\n ? `(${userCondition})`\n : \"true\";\n return [\n \"(function(){\",\n `var m=(${HITS_GLOBAL}=${HITS_GLOBAL}||{});`,\n `var k=${keyLiteral};`,\n \"m[k]=(m[k]||0)+1;\",\n `if(m[k]<${hitCount.toString()})return false;`,\n `return ${baseCondition};`,\n \"})()\",\n ].join(\"\");\n}\n\nfunction resolveCondition(\n input: SetBreakpointInput,\n): string | undefined {\n const condition = input.condition;\n const hitCount = validateHitCount(input.hitCount);\n if (hitCount === undefined) {\n return condition !== undefined && condition.length > 0 ? condition : undefined;\n }\n const counterKey = nextCounterKey(input.file, input.line);\n return buildHitCountedCondition(hitCount, counterKey, condition);\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 const condition = resolveCondition(input);\n if (condition !== undefined) {\n params[\"condition\"] = 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","import type {\n CallFrameInfo,\n PauseEvent,\n ResolvedLocation,\n ScriptInfo,\n ScopeInfo,\n} from \"../types.js\";\n\nimport type {\n CdpCallFrame,\n CdpPauseParams,\n CdpResolvedLocation,\n CdpScope,\n} from \"./types.js\";\n\nexport function asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function 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\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 resolveCallFrameUrl(\n frame: CdpCallFrame,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): string | undefined {\n const direct = nonEmptyString(frame.url);\n if (direct !== undefined) {\n return direct;\n }\n const scriptId = nonEmptyString(frame.location?.scriptId);\n if (scriptId === undefined) {\n return undefined;\n }\n return nonEmptyString(scripts?.get(scriptId)?.url);\n}\n\nfunction toCallFrames(\n value: unknown,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): 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 = resolveCallFrameUrl(candidate, scripts);\n const base: CallFrameInfo = {\n callFrameId,\n functionName: asString(candidate.functionName),\n lineNumber: asNumber(candidate.location?.lineNumber),\n columnNumber: asNumber(candidate.location?.columnNumber),\n scopeChain: toScopeChain(candidate.scopeChain),\n };\n return [url === undefined ? base : { ...base, url }];\n });\n}\n\nexport function toPauseEvent(\n params: CdpPauseParams,\n receivedAtMs: number,\n scripts?: ReadonlyMap<string, ScriptInfo>,\n): PauseEvent {\n const base: 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, scripts),\n receivedAtMs,\n };\n return params.data === undefined ? base : { ...base, data: params.data };\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\nexport function pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n","import { request } from \"node:http\";\n\nimport { CfInspectorError } from \"../types.js\";\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\nexport interface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\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 resolve(parseJsonResponse(chunks) as T);\n } catch (err: unknown) {\n reject(parseDiscoveryError(url, err));\n }\n });\n res.on(\"error\", (err) => {\n reject(newDiscoveryError(`Inspector discovery response error: ${err.message}`));\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 parseJsonResponse(chunks: readonly Buffer[]): unknown {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n return JSON.parse(text) as unknown;\n}\n\nfunction parseDiscoveryError(url: string, err: unknown): CfInspectorError {\n const message = err instanceof Error ? err.message : String(err);\n return newDiscoveryError(`Failed to parse inspector discovery response from ${url}: ${message}`);\n}\n\nfunction newDiscoveryError(message: string): CfInspectorError {\n return new CfInspectorError(\"INSPECTOR_DISCOVERY_FAILED\", message);\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","import { performance } from \"node:perf_hooks\";\n\nimport { CfInspectorError } from \"../types.js\";\nimport type { PauseEvent } from \"../types.js\";\n\nimport { pauseDetail, toPauseEvent } from \"./conversions.js\";\nimport type { CdpPauseParams, InspectorSession, WaitForPauseOptions } from \"./types.js\";\n\nfunction pauseMatches(\n pause: PauseEvent,\n breakpointIds: readonly string[] | undefined,\n pauseReasons: readonly string[] | undefined,\n): boolean {\n if (pauseReasons !== undefined && pauseReasons.length > 0) {\n return pauseReasons.includes(pause.reason);\n }\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nfunction remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\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 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, options.pauseReasons)) {\n return buffered;\n }\n await handleUnmatchedPause(session, buffered, options, deadlineMs);\n }\n const pause = await waitForLivePause(session, options, deadlineMs);\n if (pauseMatches(pause, options.breakpointIds, options.pauseReasons)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nasync function waitForLivePause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<PauseEvent> {\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 return toPauseEvent(params, receivedAtMs ?? performance.now(), session.scripts);\n}\n","import { CfInspectorError } from \"../types.js\";\nimport type { ScriptInfo } from \"../types.js\";\n\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./types.js\";\n\nexport type PauseOnExceptionsState = \"none\" | \"uncaught\" | \"caught\" | \"all\";\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n}\n\nexport async function setPauseOnExceptions(\n session: InspectorSession,\n state: PauseOnExceptionsState,\n): Promise<void> {\n await session.client.send(\"Debugger.setPauseOnExceptions\", { state });\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\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\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 } from \"./types.js\";\n","import { performance } from \"node:perf_hooks\";\n\nimport { CdpClient } from \"../cdp/client.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { InspectorConnectOptions, PauseEvent, ScriptInfo } from \"../types.js\";\n\nimport { asString, toPauseEvent } from \"./conversions.js\";\nimport { discoverInspectorTargets } from \"./discovery.js\";\nimport type { CdpPauseParams, DebuggerState, InspectorSession, ScriptParsedParams } from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst PAUSE_BUFFER_LIMIT = 32;\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({\n url: target.webSocketDebuggerUrl,\n connectTimeoutMs,\n });\n try {\n return await initSession(client, target);\n } catch (err: unknown) {\n // The CdpClient is alive (its WS is open) but the inspector handshake\n // failed before we could hand the session to the caller. Dispose so the\n // underlying WS does not leak.\n client.dispose();\n throw err;\n }\n}\n\nasync function initSession(\n client: CdpClient,\n target: InspectorSession[\"target\"],\n): Promise<InspectorSession> {\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 const pauseBuffer: PauseEvent[] = [];\n const 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(), scripts);\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","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 interface CdpTransportFactoryOptions {\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpTransportFactory = (\n url: string,\n options?: CdpTransportFactoryOptions,\n) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n readonly connectTimeoutMs?: 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?: { readonly code: number; readonly 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 this.handleResponse(parsed);\n return;\n }\n if (typeof parsed.method === \"string\") {\n // A throwing listener must not crash the WS message pipeline. Without\n // this guard, EventEmitter rethrows on the first uncaught listener\n // exception and the rest of the dispatch stops — including downstream\n // listeners that need to settle pending requests.\n this.safeEmit(parsed.method, parsed.params);\n this.safeEmit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private safeEmit(event: string, payload: unknown): void {\n // EventEmitter.emit re-throws on the first listener's exception and skips\n // the rest. Iterate explicitly so one bad listener does not deny later\n // listeners (e.g. the pause buffer pusher) from observing the event.\n const listeners = this.emitter.listeners(event);\n for (const listener of listeners) {\n try {\n (listener as (payload: unknown) => void)(payload);\n } catch {\n // Listener exceptions are caller bugs; swallow to keep the pipeline alive.\n }\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 factoryOptions: CdpTransportFactoryOptions =\n options.connectTimeoutMs === undefined ? {} : { connectTimeoutMs: options.connectTimeoutMs };\n const transport = await factory(options.url, factoryOptions);\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 = this.createRequestTimer(id, method, reject);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n this.sendPayload(id, method, payload, timer, reject);\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 finish = (value: T): void => {\n settled = true;\n cleanup();\n resolve(value);\n };\n const offEvent = this.on(method, (raw) => {\n if (settled) {\n return;\n }\n const params = raw as T;\n if (options.predicate) {\n // A throwing predicate must not propagate up through emitter.emit\n // (which would crash the message handler and the WS pipeline).\n // Treat a throw as a predicate rejection so the caller times out\n // instead of bringing the process down.\n let accepted: boolean;\n try {\n accepted = options.predicate(params);\n } catch {\n return;\n }\n if (!accepted) {\n return;\n }\n }\n finish(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(this.createWaitTimeoutError(method, options.timeoutMs));\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 handleResponse(parsed: ParsedMessage): void {\n const pending = this.pending.get(parsed.id ?? -1);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id ?? -1);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${(parsed.id ?? -1).toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n }\n\n private createRequestTimer(\n id: number,\n method: string,\n reject: (error: Error) => void,\n ): ReturnType<typeof setTimeout> {\n return 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 }\n\n private createWaitTimeoutError(method: string, timeoutMs: number): CfInspectorError {\n return new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${timeoutMs.toString()}ms`,\n );\n }\n\n private sendPayload(\n id: number,\n method: string,\n payload: string,\n timer: ReturnType<typeof setTimeout>,\n reject: (error: Error) => void,\n ): void {\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 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 { VariableSnapshot } from \"../types.js\";\n\nexport const DEFAULT_MAX_VALUE_LENGTH = 4096;\n\nexport function 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\nexport function 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\nexport function resolveMaxValueLength(value: number | undefined): number {\n if (value === undefined) {\n return DEFAULT_MAX_VALUE_LENGTH;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `Invalid maxValueLength: ${value.toString()} — expected a positive integer`,\n );\n }\n return value;\n}\n\nexport function limitValueLength(raw: string, maxValueLength = DEFAULT_MAX_VALUE_LENGTH): string {\n if (raw.length <= maxValueLength) {\n return raw;\n }\n return `${raw.slice(0, maxValueLength)}...`;\n}\n\nfunction parseQuotedString(value: string): string {\n try {\n const parsed: unknown = JSON.parse(value);\n return typeof parsed === \"string\" ? parsed : value;\n } catch {\n return value;\n }\n}\n\nfunction parseNumericIndex(name: string): number | undefined {\n const parsed = Number.parseInt(name, 10);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed.toString() !== name) {\n return undefined;\n }\n return parsed;\n}\n\nfunction scalarFromVariable(variable: VariableSnapshot): unknown {\n const value = variable.value;\n if (variable.type === \"string\") {\n return parseQuotedString(value);\n }\n if (variable.type === \"number\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : value;\n }\n if (variable.type === \"boolean\") {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n }\n if (variable.type === \"undefined\") {\n return \"[undefined]\";\n }\n if (variable.type === \"bigint\") {\n return value;\n }\n return value === \"null\" ? null : value;\n}\n\nfunction isArrayLikeChildren(children: readonly VariableSnapshot[]): boolean {\n let hasNumeric = false;\n for (const child of children) {\n // V8 includes `length` as an own property on arrays; ignore it when\n // deciding whether the children look array-shaped.\n if (child.name === \"length\") {\n continue;\n }\n if (parseNumericIndex(child.name) === undefined) {\n return false;\n }\n hasNumeric = true;\n }\n return hasNumeric;\n}\n\nexport function toStructuredValue(variable: VariableSnapshot): unknown {\n const children = variable.children;\n if (children === undefined || children.length === 0) {\n return scalarFromVariable(variable);\n }\n if (isArrayLikeChildren(children)) {\n const indexed = children.flatMap((child): readonly [number, unknown][] => {\n const index = parseNumericIndex(child.name);\n if (index === undefined) {\n // length entry; not part of the array body\n return [];\n }\n return [[index, toStructuredValue(child)]];\n });\n const maxIndex = Math.max(...indexed.map(([index]) => index));\n const out = Array.from({ length: maxIndex + 1 }, () => null as unknown);\n for (const [index, entry] of indexed) {\n out[index] = entry;\n }\n return out;\n }\n // Mixed numeric + string keys, or pure string keys: keep all children as\n // an object so non-indexed properties are not silently dropped.\n const out: Record<string, unknown> = {};\n for (const child of children) {\n out[child.name] = toStructuredValue(child);\n }\n return out;\n}\n","import type { CdpEvalResult } from \"../inspector/types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n formatPrimitive,\n isPrimitive,\n limitValueLength,\n} from \"./values.js\";\n\nexport function evalResultToCaptured(\n expression: string,\n result: CdpEvalResult,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n return { expression, error: readEvalError(result, maxValueLength) };\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 const buildCaptured = (rendered: string): CapturedExpression => {\n const sanitized = limitValueLength(rendered, maxValueLength);\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 ((type === \"number\" || type === \"boolean\" || type === \"bigint\") && isPrimitive(inner.value)) {\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\nfunction readEvalError(result: CdpEvalResult, maxValueLength: number): string {\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 limitValueLength(text, maxValueLength);\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { CdpProperty, InspectorSession } from \"../inspector/types.js\";\nimport type { VariableSnapshot } from \"../types.js\";\n\nimport { formatPrimitive, isPrimitive, limitValueLength } from \"./values.js\";\n\nexport const MAX_SCOPE_VARIABLES = 20;\nexport const MAX_CHILD_VARIABLES = 8;\nexport const MAX_VARIABLE_DEPTH = 2;\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\nexport function 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 isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nexport async function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n maxValueLength: 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 return await captureProperty(session, prop, depth, maxValueLength);\n }),\n );\n return variables;\n}\n\nasync function captureProperty(\n session: InspectorSession,\n prop: CdpProperty,\n depth: number,\n maxValueLength: number,\n): Promise<VariableSnapshot> {\n const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n const children = await capturePropertyChildren(session, described, depth, maxValueLength);\n const sanitizedValue = limitValueLength(described.value, maxValueLength);\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\nasync function capturePropertyChildren(\n session: InspectorSession,\n described: DescribedProperty,\n depth: number,\n maxValueLength: number,\n): Promise<readonly VariableSnapshot[] | undefined> {\n if (depth <= 0 || described.objectId === undefined || !isExpandable(described.type)) {\n return undefined;\n }\n try {\n const nested = await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n maxValueLength,\n );\n return nested.length > 0 ? nested : undefined;\n } catch {\n return undefined;\n }\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type { ExceptionSnapshot, PauseEvent } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport { limitValueLength, toStructuredValue } from \"./values.js\";\n\ninterface CdpExceptionData {\n readonly type?: unknown;\n readonly description?: unknown;\n readonly value?: unknown;\n readonly objectId?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nasync function materializeObject(\n session: InspectorSession,\n objectId: string,\n maxValueLength: number,\n): Promise<string | undefined> {\n try {\n const properties = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n if (properties.length === 0) {\n return undefined;\n }\n const structured: Record<string, unknown> = {};\n for (const variable of properties) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return JSON.stringify(structured);\n } catch {\n return undefined;\n }\n}\n\nasync function readPropertyDescription(\n session: InspectorSession,\n objectId: string,\n name: string,\n): Promise<string | undefined> {\n try {\n const properties = await getProperties(session, objectId);\n for (const prop of properties) {\n if (prop.name !== name) {\n continue;\n }\n const value = prop.value;\n if (value === undefined) {\n continue;\n }\n if (typeof value.value === \"string\") {\n return value.value;\n }\n if (typeof value.description === \"string\") {\n return value.description;\n }\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function captureException(\n session: InspectorSession,\n pause: PauseEvent,\n maxValueLength: number,\n): Promise<ExceptionSnapshot | undefined> {\n if (pause.reason !== \"exception\" && pause.reason !== \"promiseRejection\") {\n return undefined;\n }\n const data = pause.data;\n if (typeof data !== \"object\" || data === null) {\n return { error: \"no exception data attached\" };\n }\n const candidate = data as CdpExceptionData;\n const type = asString(candidate.type);\n const description = asString(candidate.description);\n if (typeof candidate.value === \"string\") {\n return buildResult(type, description, JSON.stringify(candidate.value), maxValueLength);\n }\n if (typeof candidate.value === \"number\" || typeof candidate.value === \"boolean\") {\n return buildResult(type, description, String(candidate.value), maxValueLength);\n }\n const objectId = asString(candidate.objectId);\n if (objectId === undefined) {\n if (description !== undefined) {\n return buildResult(type, description, description, maxValueLength);\n }\n return { error: \"exception data has no objectId or value\" };\n }\n const message = await readPropertyDescription(session, objectId, \"message\");\n const rendered = await materializeObject(session, objectId, maxValueLength);\n if (rendered !== undefined) {\n const result = buildResult(type, description, rendered, maxValueLength);\n return message === undefined ? result : { ...result, description: limitValueLength(message, maxValueLength) };\n }\n return buildResult(type, description, description ?? \"[exception]\", maxValueLength);\n}\n\nfunction buildResult(\n type: string | undefined,\n description: string | undefined,\n value: string,\n maxValueLength: number,\n): ExceptionSnapshot {\n const safeValue = limitValueLength(value, maxValueLength);\n const base: ExceptionSnapshot = { value: safeValue };\n const withType = type === undefined ? base : { ...base, type };\n return description === undefined ? withType : { ...withType, description: limitValueLength(description, maxValueLength) };\n}\n","import type { CdpEvalResult, InspectorSession } from \"../inspector/types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport { limitValueLength, toStructuredValue } from \"./values.js\";\n\nfunction objectIdFromEvalResult(result: CdpEvalResult): string | undefined {\n const inner = result.result;\n if (inner?.type !== \"object\") {\n return undefined;\n }\n const objectId = inner.objectId;\n if (typeof objectId !== \"string\" || objectId.length === 0) {\n return undefined;\n }\n return objectId;\n}\n\nasync function renderObjectCapture(\n session: InspectorSession,\n objectId: string,\n maxValueLength: number,\n): Promise<string | undefined> {\n try {\n const properties = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n const structured: Record<string, unknown> = {};\n for (const variable of properties) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return JSON.stringify(structured);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeRenderedObjectCapture(rendered: string, original: string): string | undefined {\n if (rendered === \"{}\" && original !== \"Object\") {\n return undefined;\n }\n if (original.startsWith(\"Array(\") && rendered === \"{\\\"length\\\":0}\") {\n return \"[]\";\n }\n return rendered;\n}\n\nexport async function withSerializedObjectCapture(\n session: InspectorSession,\n expression: string,\n evalResult: CdpEvalResult,\n captured: CapturedExpression,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n if (captured.error !== undefined || captured.value === undefined) {\n return captured;\n }\n const objectId = objectIdFromEvalResult(evalResult);\n if (objectId === undefined) {\n return captured;\n }\n const rendered = await renderObjectCapture(session, objectId, maxValueLength);\n if (rendered === undefined) {\n return captured;\n }\n const normalized = normalizeRenderedObjectCapture(rendered, captured.value);\n if (normalized === undefined) {\n return captured;\n }\n const value = limitValueLength(normalized, maxValueLength);\n return captured.type === undefined\n ? { expression, value }\n : { expression, value, type: captured.type };\n}\n","import type { InspectorSession } from \"../inspector/types.js\";\nimport type { CallFrameInfo, ScopeSnapshot } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\n\nconst MAX_SCOPES = 3;\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\nexport function 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\nexport async function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n maxValueLength: number,\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 try {\n const variables = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n return { type: scope.type, variables };\n } catch {\n return { type: scope.type, variables: [] };\n }\n }),\n );\n}\n","import { evaluateOnFrame } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n} from \"../types.js\";\n\nimport { evalResultToCaptured } from \"./evaluation.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { limitValueLength } from \"./values.js\";\n\nexport const DEFAULT_STACK_DEPTH = 1;\nexport const MAX_STACK_DEPTH = 64;\n\nfunction clampDepth(depth: number, frameCount: number): number {\n if (depth <= 0) {\n return 0;\n }\n return Math.min(depth, frameCount, MAX_STACK_DEPTH);\n}\n\nfunction buildBaseFrame(frame: CallFrameInfo): FrameSnapshot {\n const base: FrameSnapshot = {\n functionName: frame.functionName,\n line: frame.lineNumber + 1,\n column: frame.columnNumber + 1,\n };\n return frame.url === undefined ? base : { ...base, url: frame.url };\n}\n\nasync function captureFrameExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression);\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n return await withSerializedObjectCapture(session, expression, result, captured, maxValueLength);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: limitValueLength(message, maxValueLength) };\n }\n}\n\nasync function captureFrameExpressions(\n session: InspectorSession,\n frame: CallFrameInfo,\n expressions: readonly string[],\n maxValueLength: number,\n): Promise<readonly CapturedExpression[]> {\n if (expressions.length === 0) {\n return [];\n }\n return await Promise.all(\n expressions.map((expression) =>\n captureFrameExpression(session, frame.callFrameId, expression, maxValueLength),\n ),\n );\n}\n\nexport interface WalkStackOptions {\n readonly stackDepth: number;\n readonly stackCaptures: readonly string[];\n readonly maxValueLength: number;\n}\n\nexport async function walkStack(\n session: InspectorSession,\n callFrames: readonly CallFrameInfo[],\n options: WalkStackOptions,\n): Promise<readonly FrameSnapshot[]> {\n const depth = clampDepth(options.stackDepth, callFrames.length);\n if (depth <= 1) {\n return [];\n }\n const slice = callFrames.slice(0, depth);\n return await Promise.all(\n slice.map(async (frame): Promise<FrameSnapshot> => {\n const base = buildBaseFrame(frame);\n if (options.stackCaptures.length === 0) {\n return base;\n }\n const captures = await captureFrameExpressions(\n session,\n frame,\n options.stackCaptures,\n options.maxValueLength,\n );\n return { ...base, captures };\n }),\n );\n}\n","import { evaluateOnFrame } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CapturedExpression,\n ExceptionSnapshot,\n FrameSnapshot,\n PauseEvent,\n SnapshotCaptureResult,\n} from \"../types.js\";\n\nimport { evalResultToCaptured } from \"./evaluation.js\";\nimport { captureException } from \"./exception.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { describeProperty } from \"./properties.js\";\nimport { captureScopes, selectScopes } from \"./scopes.js\";\nimport { DEFAULT_STACK_DEPTH, walkStack } from \"./stack.js\";\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n} from \"./values.js\";\n\nexport interface CaptureSnapshotOptions {\n readonly captures?: readonly string[];\n readonly includeScopes?: boolean;\n readonly maxValueLength?: number;\n readonly stackDepth?: number;\n readonly stackCaptures?: readonly string[];\n}\n\nexport async function captureSnapshot(\n session: InspectorSession,\n pause: PauseEvent,\n options: CaptureSnapshotOptions = {},\n): Promise<SnapshotCaptureResult> {\n const maxValueLength = resolveMaxValueLength(options.maxValueLength);\n const top = pause.callFrames[0];\n let topFrame: FrameSnapshot | undefined;\n let captures: CapturedExpression[] = [];\n let stack: readonly FrameSnapshot[] = [];\n if (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 };\n if (options.includeScopes === true) {\n const scopes = await captureScopes(session, top, maxValueLength);\n topFrame = { ...topFrame, scopes };\n }\n captures = await captureExpressions(session, top.callFrameId, options.captures, maxValueLength);\n stack = await walkStack(session, pause.callFrames, {\n stackDepth: options.stackDepth ?? DEFAULT_STACK_DEPTH,\n stackCaptures: options.stackCaptures ?? [],\n maxValueLength,\n });\n }\n const exception = await captureException(session, pause, maxValueLength);\n return buildResult({\n pause,\n topFrame,\n captures,\n stack,\n exception,\n });\n}\n\ninterface BuildResultInput {\n readonly pause: PauseEvent;\n readonly topFrame: FrameSnapshot | undefined;\n readonly captures: readonly CapturedExpression[];\n readonly stack: readonly FrameSnapshot[];\n readonly exception: ExceptionSnapshot | undefined;\n}\n\nfunction buildResult(input: BuildResultInput): SnapshotCaptureResult {\n const base: SnapshotCaptureResult = {\n reason: input.pause.reason,\n hitBreakpoints: input.pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n captures: input.captures,\n };\n const withFrame = input.topFrame === undefined ? base : { ...base, topFrame: input.topFrame };\n const withStack = input.stack.length > 0 ? { ...withFrame, stack: input.stack } : withFrame;\n return input.exception === undefined ? withStack : { ...withStack, exception: input.exception };\n}\n\nasync function captureExpressions(\n session: InspectorSession,\n callFrameId: string,\n captures: readonly string[] | undefined,\n maxValueLength: number,\n): Promise<CapturedExpression[]> {\n if (captures === undefined || captures.length === 0) {\n return [];\n }\n return await Promise.all(\n captures.map(async (expression): Promise<CapturedExpression> => {\n return await captureExpression(session, callFrameId, expression, maxValueLength);\n }),\n );\n}\n\nasync function captureExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression);\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n return await withSerializedObjectCapture(session, expression, result, captured, maxValueLength);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: limitValueLength(message, maxValueLength) };\n }\n}\n\nexport const internalsForTesting = {\n DEFAULT_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import { randomBytes } from \"node:crypto\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointConditionOptions {\n readonly predicate?: string;\n readonly hitCount?: number;\n readonly counterKey?: string;\n}\n\nconst HITS_GLOBAL = \"globalThis.__CFI_LOG_HITS\";\n\nfunction buildLoggingIife(sentinel: string, expression: string): string {\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\nfunction buildHitGate(hitCount: number, counterKey: string): string {\n const keyLiteral = JSON.stringify(counterKey);\n return [\n \"(function(){\",\n `var m=(${HITS_GLOBAL}=${HITS_GLOBAL}||{});`,\n `var k=${keyLiteral};`,\n \"m[k]=(m[k]||0)+1;\",\n `return m[k]>=${hitCount.toString()};`,\n \"})()\",\n ].join(\"\");\n}\n\nfunction combineGuards(guards: readonly string[]): string | undefined {\n const filtered = guards.filter((guard) => guard.length > 0);\n if (filtered.length === 0) {\n return undefined;\n }\n if (filtered.length === 1) {\n return filtered[0];\n }\n return filtered.map((guard) => `(${guard})`).join(\"&&\");\n}\n\nexport function buildLogpointCondition(\n sentinel: string,\n expression: string,\n options: LogpointConditionOptions = {},\n): string {\n const guards: string[] = [];\n if (options.hitCount !== undefined) {\n const counterKey = options.counterKey ?? sentinel;\n guards.push(buildHitGate(options.hitCount, counterKey));\n }\n const userPredicate = options.predicate?.trim();\n if (userPredicate !== undefined && userPredicate.length > 0) {\n guards.push(`(${userPredicate})`);\n }\n const iife = buildLoggingIife(sentinel, expression);\n const guard = combineGuards(guards);\n if (guard === undefined) {\n return iife;\n }\n return `(${guard})?${iife}:false`;\n}\n\nexport function generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport { SENTINEL_PREFIX };\n","import { removeBreakpoint, setBreakpoint } from \"../inspector/breakpoints.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"../types.js\";\n\nimport { buildLogpointCondition, generateSentinel } from \"./condition.js\";\nimport { asString, parseLogEvent } from \"./events.js\";\nimport type { ConsoleAPICalledParams, LogpointEvent } from \"./events.js\";\n\nexport type LogpointStopReason =\n | \"duration\"\n | \"signal\"\n | \"transport-closed\"\n | \"max-events\";\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly hitCount?: number;\n readonly condition?: string;\n readonly signal?: AbortSignal;\n readonly onEvent: (event: LogpointEvent) => void;\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n readonly emitted: number;\n readonly stoppedReason: LogpointStopReason;\n}\n\nfunction validateMaxEvents(maxEvents: number | undefined): number | undefined {\n if (maxEvents === undefined) {\n return undefined;\n }\n if (!Number.isInteger(maxEvents) || maxEvents <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `maxEvents must be a positive integer, received: ${maxEvents.toString()}`,\n );\n }\n return maxEvents;\n}\n\nfunction validateHitCount(hitCount: number | undefined): number | undefined {\n if (hitCount === undefined) {\n return undefined;\n }\n if (!Number.isInteger(hitCount) || hitCount <= 0) {\n throw new CfInspectorError(\n \"INVALID_HIT_COUNT\",\n `hitCount must be a positive integer, received: ${hitCount.toString()}`,\n );\n }\n return hitCount;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const maxEvents = validateMaxEvents(options.maxEvents);\n const hitCount = validateHitCount(options.hitCount);\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression, {\n ...(options.condition === undefined ? {} : { predicate: options.condition }),\n ...(hitCount === undefined ? {} : { hitCount }),\n });\n let emitted = 0;\n let maxEventsReached = false;\n let stopMaxEvents: (() => void) | undefined;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n if (maxEventsReached) {\n return;\n }\n const event = toLogpointEvent(raw, sentinel, options.location);\n if (event === undefined) {\n return;\n }\n emitted += 1;\n try {\n options.onEvent(event);\n } catch {\n // A throwing onEvent must not stop the stream or skip the max-events\n // check below — that would cause us to overshoot the cap on every throw.\n }\n if (maxEvents !== undefined && emitted >= maxEvents) {\n maxEventsReached = true;\n stopMaxEvents?.();\n }\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 try {\n const reason = await waitForStop(session, options, (signal) => {\n stopMaxEvents = signal;\n if (maxEventsReached) {\n signal();\n }\n });\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n offEvent();\n await removeBreakpointBestEffort(session, handle.breakpointId);\n }\n}\n\nfunction toLogpointEvent(\n raw: unknown,\n sentinel: string,\n location: BreakpointLocation,\n): LogpointEvent | undefined {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return undefined;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n return parseLogEvent(params.args, sentinel, location, ts);\n}\n\nasync function removeBreakpointBestEffort(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n try {\n await removeBreakpoint(session, breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n registerMaxEventsSignal: (signal: () => void) => void,\n): Promise<LogpointStopReason> {\n return await new Promise<LogpointStopReason>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStopReason): 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 registerMaxEventsSignal(() => {\n finish(\"max-events\");\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","import type { BreakpointLocation } from \"../types.js\";\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\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\nexport interface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nexport function 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 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 return index === 0 ? undefined : \"\";\n}\n\nexport function 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 return parsePayload(ts, at, payload);\n}\n\nfunction parsePayload(ts: string, at: string, payload: string): LogpointEvent {\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","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":["wrapped","performance","performance","out","asString","buildResult","HITS_GLOBAL","asString","validateHitCount","asString"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saptools/cf-inspector",
3
- "version": "0.3.19",
3
+ "version": "0.4.1",
4
4
  "description": "Set breakpoints, capture variable snapshots, and evaluate expressions on a SAP BTP Cloud Foundry Node.js app via the Chrome DevTools Protocol — agent-friendly, no IDE required.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -52,7 +52,7 @@
52
52
  "dependencies": {
53
53
  "commander": "^13.0.0",
54
54
  "ws": "^8.18.0",
55
- "@saptools/cf-debugger": "0.1.6"
55
+ "@saptools/cf-debugger": "0.1.7"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@playwright/test": "^1.50.0",
@@ -64,7 +64,7 @@
64
64
  "scripts": {
65
65
  "build": "tsup",
66
66
  "typecheck": "tsc --noEmit",
67
- "lint": "eslint src tests --ignore-pattern tests/e2e/fixtures/sample-app.mjs",
67
+ "lint": "eslint src tests --ignore-pattern tests/e2e/fixtures/sample-app.mjs --ignore-pattern tests/e2e/fixtures/sample-stack.mjs",
68
68
  "test:unit": "vitest run --coverage",
69
69
  "test:e2e": "playwright test"
70
70
  }
package/dist/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
-
2
- export { }