@saptools/cf-inspector 0.3.14 → 0.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +120 -120
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -164,6 +164,9 @@ interface InspectorVersion {
|
|
|
164
164
|
readonly browser: string;
|
|
165
165
|
readonly protocolVersion: string;
|
|
166
166
|
}
|
|
167
|
+
declare function discoverInspectorTargets(host: string, port: number, timeoutMs: number): Promise<readonly InspectorTarget[]>;
|
|
168
|
+
declare function fetchInspectorVersion(host: string, port: number, timeoutMs: number): Promise<InspectorVersion>;
|
|
169
|
+
|
|
167
170
|
/**
|
|
168
171
|
* Internal coordination flag between the always-on `Debugger.paused` buffer in
|
|
169
172
|
* `connectInspector` and an active `waitForPause`. When `active` is true, the
|
|
@@ -199,8 +202,6 @@ interface CdpEvalResult {
|
|
|
199
202
|
};
|
|
200
203
|
};
|
|
201
204
|
}
|
|
202
|
-
declare function discoverInspectorTargets(host: string, port: number, timeoutMs: number): Promise<readonly InspectorTarget[]>;
|
|
203
|
-
declare function fetchInspectorVersion(host: string, port: number, timeoutMs: number): Promise<InspectorVersion>;
|
|
204
205
|
declare function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession>;
|
|
205
206
|
interface SetBreakpointInput extends BreakpointLocation {
|
|
206
207
|
readonly remoteRoot?: RemoteRootSetting;
|
package/dist/index.js
CHANGED
|
@@ -260,7 +260,6 @@ function buildBreakpointUrlRegex(input) {
|
|
|
260
260
|
}
|
|
261
261
|
|
|
262
262
|
// src/inspector.ts
|
|
263
|
-
import { request } from "http";
|
|
264
263
|
import { performance } from "perf_hooks";
|
|
265
264
|
|
|
266
265
|
// src/cdp.ts
|
|
@@ -473,10 +472,9 @@ var CdpClient = class _CdpClient {
|
|
|
473
472
|
}
|
|
474
473
|
};
|
|
475
474
|
|
|
476
|
-
// src/
|
|
475
|
+
// src/inspectorDiscovery.ts
|
|
477
476
|
init_types();
|
|
478
|
-
|
|
479
|
-
var DEFAULT_HOST = "127.0.0.1";
|
|
477
|
+
import { request } from "http";
|
|
480
478
|
async function fetchJson(url, timeoutMs) {
|
|
481
479
|
return await new Promise((resolve, reject) => {
|
|
482
480
|
const req = request(url, { method: "GET" }, (res) => {
|
|
@@ -592,6 +590,11 @@ async function fetchInspectorVersion(host, port, timeoutMs) {
|
|
|
592
590
|
}
|
|
593
591
|
return { browser, protocolVersion };
|
|
594
592
|
}
|
|
593
|
+
|
|
594
|
+
// src/inspector.ts
|
|
595
|
+
init_types();
|
|
596
|
+
var DEFAULT_CONNECT_TIMEOUT_MS = 5e3;
|
|
597
|
+
var DEFAULT_HOST = "127.0.0.1";
|
|
595
598
|
async function connectInspector(options) {
|
|
596
599
|
const host = options.host ?? DEFAULT_HOST;
|
|
597
600
|
const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/wsTransport.ts","../src/index.ts","../src/pathMapper.ts","../src/inspector.ts","../src/cdp.ts","../src/snapshot.ts","../src/logpoint.ts","../src/tunnel.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"BREAKPOINT_DID_NOT_BIND\"\n | \"INSPECTOR_DISCOVERY_FAILED\"\n | \"INSPECTOR_CONNECTION_FAILED\"\n | \"CDP_REQUEST_FAILED\"\n | \"BREAKPOINT_NOT_HIT\"\n | \"UNRELATED_PAUSE\"\n | \"UNRELATED_PAUSE_TIMEOUT\"\n | \"EVALUATION_FAILED\"\n | \"MISSING_TARGET\"\n | \"ABORTED\";\n\nexport class CfInspectorError extends Error {\n public readonly code: CfInspectorErrorCode;\n public readonly detail?: string;\n\n public constructor(code: CfInspectorErrorCode, message: string, detail?: string) {\n super(message);\n this.name = \"CfInspectorError\";\n this.code = code;\n if (detail !== undefined) {\n this.detail = detail;\n }\n }\n}\n\nexport interface BreakpointLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface RemoteRootLiteral {\n readonly kind: \"literal\";\n readonly value: string;\n}\n\nexport interface RemoteRootRegex {\n readonly kind: \"regex\";\n readonly pattern: string;\n readonly flags: string;\n readonly regex: RegExp;\n}\n\nexport interface RemoteRootNone {\n readonly kind: \"none\";\n}\n\nexport type RemoteRootSetting = RemoteRootLiteral | RemoteRootRegex | RemoteRootNone;\n\nexport interface BreakpointHandle {\n readonly breakpointId: string;\n readonly file: string;\n readonly line: number;\n readonly urlRegex: string;\n readonly resolvedLocations: readonly ResolvedLocation[];\n}\n\nexport interface ResolvedLocation {\n readonly scriptId: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber?: number;\n}\n\nexport interface CallFrameInfo {\n readonly callFrameId: string;\n readonly functionName: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n readonly scopeChain: readonly ScopeInfo[];\n}\n\nexport interface ScopeInfo {\n readonly type: string;\n readonly objectId?: string;\n readonly name?: string;\n}\n\nexport interface PauseEvent {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly callFrames: readonly CallFrameInfo[];\n readonly receivedAtMs?: number;\n}\n\nexport interface VariableSnapshot {\n readonly name: string;\n readonly value: string;\n readonly type?: string;\n readonly children?: readonly VariableSnapshot[];\n}\n\nexport interface ScopeSnapshot {\n readonly type: string;\n readonly variables: readonly VariableSnapshot[];\n}\n\nexport interface FrameSnapshot {\n readonly functionName: string;\n readonly url?: string;\n readonly line: number;\n readonly column: number;\n readonly scopes?: readonly ScopeSnapshot[];\n}\n\nexport interface CapturedExpression {\n readonly expression: string;\n readonly value?: string;\n readonly type?: string;\n readonly error?: string;\n}\n\nexport interface SnapshotCaptureResult {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly capturedAt: string;\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n}\n\nexport interface SnapshotResult extends SnapshotCaptureResult {\n readonly pausedDurationMs: number | null;\n}\n\nexport interface ScriptInfo {\n readonly scriptId: string;\n readonly url: string;\n}\n\nexport interface InspectorConnectOptions {\n readonly port: number;\n readonly host?: string;\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpMessage =\n | { readonly id: number; readonly result: unknown }\n | { readonly id: number; readonly error: { readonly code: number; readonly message: string } }\n | { readonly method: string; readonly params: unknown };\n","import { WebSocket } from \"ws\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./cdp.js\";\nimport { CfInspectorError } from \"./types.js\";\n\nexport async function wsTransportFactory(url: string): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n socket.off(\"error\", onError);\n resolve();\n };\n const onError = (err: Error): void => {\n socket.off(\"open\", onOpen);\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n const wrappers = new WeakMap<object, (...args: unknown[]) => void>();\n const wrapMessage = (listener: (data: string) => void): ((data: Buffer) => void) => {\n const wrapped = (data: Buffer): void => {\n listener(data.toString(\"utf8\"));\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapClose = (listener: () => void): (() => void) => {\n const wrapped = (): void => {\n listener();\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapError = (listener: (err: Error) => void): ((err: Error) => void) => {\n const wrapped = (err: Error): void => {\n listener(err);\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n\n return {\n send(payload: string): void {\n socket.send(payload);\n },\n close(): void {\n socket.close();\n },\n get readyState(): number {\n return socket.readyState;\n },\n on(event, listener): void {\n if (event === \"message\") {\n socket.on(\"message\", wrapMessage(listener as CdpTransportEventMap[\"message\"]));\n } else if (event === \"close\") {\n socket.on(\"close\", wrapClose(listener as CdpTransportEventMap[\"close\"]));\n } else {\n socket.on(\"error\", wrapError(listener as CdpTransportEventMap[\"error\"]));\n }\n },\n off(event, listener): void {\n const wrapped = wrappers.get(listener as object);\n if (!wrapped) {\n return;\n }\n if (event === \"message\") {\n socket.off(\"message\", wrapped as (data: Buffer) => void);\n } else if (event === \"close\") {\n socket.off(\"close\", wrapped as () => void);\n } else {\n socket.off(\"error\", wrapped as (err: Error) => void);\n }\n },\n };\n}\n","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.js\";\nexport type {\n DebuggerState,\n InspectorSession,\n InspectorTarget,\n SetBreakpointInput,\n WaitForPauseOptions,\n} from \"./inspector.js\";\n\nexport { captureSnapshot } from \"./snapshot.js\";\nexport type { CaptureSnapshotOptions } from \"./snapshot.js\";\n\nexport { buildLogpointCondition, streamLogpoint } from \"./logpoint.js\";\nexport type {\n LogpointEvent,\n LogpointStreamOptions,\n LogpointStreamResult,\n} from \"./logpoint.js\";\n\nexport { openCfTunnel } from \"./tunnel.js\";\nexport type { OpenedTunnel, TunnelTarget } from \"./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 { request } from \"node:http\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { CdpClient } from \"./cdp.js\";\nimport { buildBreakpointUrlRegex } from \"./pathMapper.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type {\n BreakpointHandle,\n BreakpointLocation,\n CallFrameInfo,\n InspectorConnectOptions,\n PauseEvent,\n RemoteRootSetting,\n ResolvedLocation,\n ScopeInfo,\n ScriptInfo,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\n\nexport interface InspectorTarget {\n readonly description: string;\n readonly devtoolsFrontendUrl?: string;\n readonly faviconUrl?: string;\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly webSocketDebuggerUrl: string;\n}\n\ninterface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\n}\n\n/**\n * Internal coordination flag between the always-on `Debugger.paused` buffer in\n * `connectInspector` and an active `waitForPause`. When `active` is true, the\n * buffer listener skips pushing the live event so it cannot be replayed by a\n * subsequent `waitForPause` call. See `connectInspector` for the full rationale.\n */\nexport interface PauseWaitGate {\n active: boolean;\n}\n\nexport interface DebuggerState {\n lastResumedAtMs?: number;\n}\n\nexport interface InspectorSession {\n readonly client: CdpClient;\n readonly target: InspectorTarget;\n readonly scripts: ReadonlyMap<string, ScriptInfo>;\n readonly pauseBuffer: PauseEvent[];\n readonly pauseWaitGate: PauseWaitGate;\n readonly debuggerState: DebuggerState;\n dispose(): Promise<void>;\n}\n\ninterface CdpCallFrame {\n callFrameId?: unknown;\n functionName?: unknown;\n location?: { lineNumber?: unknown; columnNumber?: unknown };\n url?: unknown;\n scopeChain?: unknown;\n}\n\ninterface CdpScope {\n type?: unknown;\n name?: unknown;\n object?: { objectId?: unknown };\n}\n\ninterface CdpPauseParams {\n reason?: unknown;\n hitBreakpoints?: unknown;\n callFrames?: unknown;\n}\n\ninterface CdpSetBreakpointResult {\n breakpointId?: unknown;\n locations?: unknown;\n}\n\ninterface CdpResolvedLocation {\n scriptId?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n url?: unknown;\n}\n\ninterface CdpEvalResult {\n result?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\nasync function fetchJson<T>(url: string, timeoutMs: number): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const req = request(url, { method: \"GET\" }, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n try {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n resolve(JSON.parse(text) as T);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Failed to parse inspector discovery response from ${url}: ${message}`,\n ),\n );\n }\n });\n res.on(\"error\", (err) => {\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery response error: ${err.message}`,\n ),\n );\n });\n });\n req.setTimeout(timeoutMs, () => {\n req.destroy(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n });\n req.on(\"error\", (err) => {\n reject(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} failed: ${err.message}`,\n ),\n );\n });\n req.end();\n });\n}\n\nfunction toInspectorTarget(value: unknown, source: string): InspectorTarget {\n if (typeof value !== \"object\" || value === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is not an object in ${source}`,\n );\n }\n const candidate = value as Record<string, unknown>;\n const webSocketDebuggerUrl = candidate[\"webSocketDebuggerUrl\"];\n if (typeof webSocketDebuggerUrl !== \"string\" || webSocketDebuggerUrl.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is missing webSocketDebuggerUrl in ${source}`,\n );\n }\n return {\n description: typeof candidate[\"description\"] === \"string\" ? candidate[\"description\"] : \"\",\n id: typeof candidate[\"id\"] === \"string\" ? candidate[\"id\"] : \"\",\n title: typeof candidate[\"title\"] === \"string\" ? candidate[\"title\"] : \"\",\n type: typeof candidate[\"type\"] === \"string\" ? candidate[\"type\"] : \"\",\n url: typeof candidate[\"url\"] === \"string\" ? candidate[\"url\"] : \"\",\n webSocketDebuggerUrl,\n ...(typeof candidate[\"devtoolsFrontendUrl\"] === \"string\"\n ? { devtoolsFrontendUrl: candidate[\"devtoolsFrontendUrl\"] }\n : {}),\n ...(typeof candidate[\"faviconUrl\"] === \"string\" ? { faviconUrl: candidate[\"faviconUrl\"] } : {}),\n };\n}\n\nexport async function discoverInspectorTargets(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<readonly InspectorTarget[]> {\n const url = `http://${host}:${port.toString()}/json/list`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets returned from ${url}`,\n );\n }\n return raw.map((entry, idx): InspectorTarget => toInspectorTarget(entry, `${url}[${idx.toString()}]`));\n}\n\nfunction readVersionField(value: Record<string, unknown>, ...keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const entry = value[key];\n if (typeof entry === \"string\" && entry.length > 0) {\n return entry;\n }\n }\n return undefined;\n}\n\nexport async function fetchInspectorVersion(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<InspectorVersion> {\n const url = `http://${host}:${port.toString()}/json/version`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (typeof raw !== \"object\" || raw === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n const value = raw as Record<string, unknown>;\n const browser = readVersionField(value, \"Browser\", \"browser\");\n const protocolVersion = readVersionField(value, \"Protocol-Version\", \"protocolVersion\");\n if (browser === undefined || protocolVersion === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n return { browser, protocolVersion };\n}\n\ninterface ScriptParsedParams {\n scriptId?: unknown;\n url?: unknown;\n}\n\nexport async function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const target = targets[0];\n if (!target) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets available on ${host}:${options.port.toString()}`,\n );\n }\n const client = await CdpClient.connect({ url: target.webSocketDebuggerUrl });\n const scripts = new Map<string, ScriptInfo>();\n client.on(\"Debugger.scriptParsed\", (raw) => {\n const params = raw as ScriptParsedParams;\n const scriptId = asString(params.scriptId);\n const url = asString(params.url);\n if (scriptId.length === 0) {\n return;\n }\n scripts.set(scriptId, { scriptId, url });\n });\n // Buffer Debugger.paused events from the moment Debugger.enable is sent so\n // breakpoints that fire before waitForPause attaches its listener are not lost.\n // Bounded (FIFO drop-oldest) to avoid unbounded memory growth on a tight\n // paused-then-resumed loop.\n //\n // The pauseWaitGate coordinates with waitForPause: when a waitForPause call\n // is currently consuming the live CDP stream, this listener skips the buffer\n // push so the same event isn't replayed by a subsequent waitForPause call.\n // Without the gate, a buffer-miss path (waitForPause sees an empty buffer\n // and falls through to client.waitFor) ends with both client.waitFor AND\n // this listener handling the same event — the event is returned AND queued\n // in the buffer, ready to be replayed on the next call.\n const PAUSE_BUFFER_LIMIT = 32;\n const pauseBuffer: PauseEvent[] = [];\n const pauseWaitGate: PauseWaitGate = { active: false };\n const debuggerState: DebuggerState = {};\n client.on(\"Debugger.paused\", (raw) => {\n if (pauseWaitGate.active) {\n return;\n }\n const params = raw as CdpPauseParams;\n const event = toPauseEvent(params, performance.now());\n if (pauseBuffer.length >= PAUSE_BUFFER_LIMIT) {\n pauseBuffer.shift();\n }\n pauseBuffer.push(event);\n });\n client.on(\"Debugger.resumed\", () => {\n debuggerState.lastResumedAtMs = performance.now();\n });\n await client.send(\"Runtime.enable\");\n await client.send(\"Debugger.enable\");\n return {\n client,\n target,\n scripts,\n pauseBuffer,\n pauseWaitGate,\n debuggerState,\n dispose: async (): Promise<void> => {\n try {\n await client.send(\"Debugger.disable\");\n } catch {\n // best-effort\n }\n client.dispose();\n },\n };\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction toResolvedLocations(value: unknown): readonly ResolvedLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ResolvedLocation[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpResolvedLocation;\n const scriptId = asString(candidate.scriptId);\n if (scriptId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.lineNumber);\n const result: ResolvedLocation = url === undefined\n ? { scriptId, lineNumber, columnNumber: asNumber(candidate.columnNumber) }\n : { scriptId, url, lineNumber, columnNumber: asNumber(candidate.columnNumber) };\n return [result];\n });\n}\n\nexport interface SetBreakpointInput extends BreakpointLocation {\n readonly remoteRoot?: RemoteRootSetting;\n readonly condition?: string;\n}\n\nexport async function setBreakpoint(\n session: InspectorSession,\n input: SetBreakpointInput,\n): Promise<BreakpointHandle> {\n const remoteRoot: RemoteRootSetting = input.remoteRoot ?? { kind: \"none\" };\n const urlRegex = buildBreakpointUrlRegex({ file: input.file, remoteRoot });\n const params: Record<string, unknown> = {\n lineNumber: input.line - 1,\n urlRegex,\n };\n if (input.condition !== undefined && input.condition.length > 0) {\n params[\"condition\"] = input.condition;\n }\n const result = await session.client.send<CdpSetBreakpointResult>(\n \"Debugger.setBreakpointByUrl\",\n params,\n );\n const breakpointId = asString(result.breakpointId);\n if (breakpointId.length === 0) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `setBreakpointByUrl did not return a breakpointId for ${input.file}:${input.line.toString()}`,\n );\n }\n return {\n breakpointId,\n file: input.file,\n line: input.line,\n urlRegex,\n resolvedLocations: toResolvedLocations(result.locations),\n };\n}\n\nexport async function removeBreakpoint(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n await session.client.send(\"Debugger.removeBreakpoint\", { breakpointId });\n}\n\nfunction toScopeChain(value: unknown): readonly ScopeInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ScopeInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpScope;\n const type = asString(candidate.type);\n if (type.length === 0) {\n return [];\n }\n const objectId = typeof candidate.object?.objectId === \"string\" ? candidate.object.objectId : undefined;\n const name = typeof candidate.name === \"string\" ? candidate.name : undefined;\n const base: ScopeInfo = name === undefined\n ? { type }\n : { type, name };\n return [objectId === undefined ? base : { ...base, objectId }];\n });\n}\n\nfunction toCallFrames(value: unknown): readonly CallFrameInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): CallFrameInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpCallFrame;\n const callFrameId = asString(candidate.callFrameId);\n if (callFrameId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.location?.lineNumber);\n const columnNumber = asNumber(candidate.location?.columnNumber);\n const base: CallFrameInfo = {\n callFrameId,\n functionName: asString(candidate.functionName),\n lineNumber,\n columnNumber,\n scopeChain: toScopeChain(candidate.scopeChain),\n };\n return [url === undefined ? base : { ...base, url }];\n });\n}\n\nexport interface WaitForPauseOptions {\n readonly timeoutMs: number;\n readonly breakpointIds?: readonly string[];\n readonly unmatchedPausePolicy?: \"wait-for-resume\" | \"fail\";\n readonly onUnmatchedPause?: (pause: PauseEvent) => void;\n}\n\nfunction pauseMatches(pause: PauseEvent, breakpointIds: readonly string[] | undefined): boolean {\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nfunction toPauseEvent(params: CdpPauseParams, receivedAtMs: number): PauseEvent {\n return {\n reason: asString(params.reason),\n hitBreakpoints: Array.isArray(params.hitBreakpoints)\n ? params.hitBreakpoints.filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params.callFrames),\n receivedAtMs,\n };\n}\n\nfunction remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\n}\n\nfunction topFrameLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n\nfunction pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n\nfunction hasResumedSincePause(session: InspectorSession, pause: PauseEvent): boolean {\n const pauseAt = pause.receivedAtMs;\n const resumedAt = session.debuggerState.lastResumedAtMs;\n return pauseAt !== undefined && resumedAt !== undefined && resumedAt >= pauseAt;\n}\n\nfunction throwBreakpointTimeout(timeoutMs: number): never {\n throw new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for matching Debugger.paused after ${timeoutMs.toString()}ms`,\n );\n}\n\nfunction throwUnrelatedPauseTimeout(pause: PauseEvent, timeoutMs: number): never {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE_TIMEOUT\",\n `Target stayed paused by another debugger event before this command's breakpoint could hit within ${timeoutMs.toString()}ms`,\n pauseDetail(pause),\n );\n}\n\nasync function waitForUnmatchedPauseToResume(\n session: InspectorSession,\n pause: PauseEvent,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> {\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwUnrelatedPauseTimeout(pause, timeoutMs);\n }\n try {\n await session.client.waitFor(\"Debugger.resumed\", { timeoutMs: remainingMs });\n session.debuggerState.lastResumedAtMs = performance.now();\n } catch (err: unknown) {\n if (err instanceof CfInspectorError && err.code === \"BREAKPOINT_NOT_HIT\") {\n throwUnrelatedPauseTimeout(pause, timeoutMs);\n }\n throw err;\n }\n}\n\nasync function handleUnmatchedPause(\n session: InspectorSession,\n pause: PauseEvent,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<void> {\n if (options.unmatchedPausePolicy === \"fail\") {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE\",\n \"Target paused before this command's breakpoint was reached\",\n pauseDetail(pause),\n );\n }\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n options.onUnmatchedPause?.(pause);\n await waitForUnmatchedPauseToResume(session, pause, deadlineMs, options.timeoutMs);\n}\n\nexport async function waitForPause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n): Promise<PauseEvent> {\n const deadlineMs = performance.now() + options.timeoutMs;\n // Check the buffer first — a breakpoint may have fired between setBreakpoint\n // returning and waitForPause being called (the inspectee runs continuously).\n const buffer = session.pauseBuffer;\n while (buffer.length > 0 || remainingUntil(deadlineMs) > 0) {\n while (buffer.length > 0) {\n const buffered = buffer.shift();\n if (buffered === undefined) {\n continue;\n }\n if (pauseMatches(buffered, options.breakpointIds)) {\n return buffered;\n }\n await handleUnmatchedPause(session, buffered, options, deadlineMs);\n }\n\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwBreakpointTimeout(options.timeoutMs);\n }\n session.pauseWaitGate.active = true;\n let receivedAtMs: number | undefined;\n let params: CdpPauseParams;\n try {\n params = await session.client.waitFor<CdpPauseParams>(\"Debugger.paused\", {\n timeoutMs: remainingMs,\n predicate: (): boolean => {\n receivedAtMs = performance.now();\n return true;\n },\n });\n } finally {\n session.pauseWaitGate.active = false;\n }\n const pause = toPauseEvent(params, receivedAtMs ?? performance.now());\n if (pauseMatches(pause, options.breakpointIds)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n}\n\nexport async function evaluateOnFrame(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport async function evaluateGlobal(\n session: InspectorSession,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport function listScripts(session: InspectorSession): readonly ScriptInfo[] {\n return [...session.scripts.values()];\n}\n\ninterface CdpCompileResult {\n scriptId?: unknown;\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\n/**\n * Pre-compile a JS expression on the inspectee using Runtime.compileScript so\n * syntax errors surface as a CfInspectorError(\"INVALID_EXPRESSION\") instead of\n * being silently swallowed by V8 when wired into a breakpoint condition or a\n * logpoint. Without this guard, a typo in --condition or --expr causes the\n * breakpoint to silently never fire — the user would see BREAKPOINT_NOT_HIT\n * after the timeout and have no idea why.\n *\n * persistScript: false — we don't actually want the compiled script around;\n * we just want V8 to parse it and report any SyntaxError.\n */\nexport async function validateExpression(\n session: InspectorSession,\n expression: string,\n): Promise<void> {\n const result = await session.client.send<CdpCompileResult>(\"Runtime.compileScript\", {\n expression,\n sourceURL: \"<cf-inspector-validate>\",\n persistScript: false,\n });\n if (result.exceptionDetails === undefined) {\n return;\n }\n const description =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\"\n ? result.exceptionDetails.text\n : \"expression failed to compile\");\n throw new CfInspectorError(\"INVALID_EXPRESSION\", description);\n}\n\ninterface CdpProperty {\n name?: unknown;\n value?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n}\n\nexport async function getProperties(\n session: InspectorSession,\n objectId: string,\n): Promise<readonly CdpProperty[]> {\n const result = await session.client.send<{ result?: unknown }>(\"Runtime.getProperties\", {\n objectId,\n ownProperties: true,\n accessorPropertiesOnly: false,\n generatePreview: true,\n });\n if (!Array.isArray(result.result)) {\n return [];\n }\n return result.result as readonly CdpProperty[];\n}\n\nexport type { CdpEvalResult, CdpProperty };\n","import { EventEmitter } from \"node:events\";\n\nimport { CfInspectorError } from \"./types.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\n\nexport interface CdpTransportEventMap {\n readonly message: (data: string) => void;\n readonly close: () => void;\n readonly error: (err: Error) => void;\n}\n\nexport interface CdpTransport {\n send(payload: string): void;\n close(): void;\n readonly readyState: number;\n on<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n off<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n}\n\nexport type CdpTransportFactory = (url: string) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n}\n\ninterface PendingRequest {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\ninterface ParsedMessage {\n readonly id?: number;\n readonly method?: string;\n readonly result?: unknown;\n readonly params?: unknown;\n readonly error?: { code: number; message: string };\n}\n\nfunction parseMessage(raw: string): ParsedMessage | undefined {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return value as ParsedMessage;\n } catch {\n return undefined;\n }\n}\n\nasync function loadDefaultFactory(): Promise<CdpTransportFactory> {\n const mod = await import(\"./wsTransport.js\");\n return mod.wsTransportFactory;\n}\n\nexport class CdpClient {\n private readonly transport: CdpTransport;\n private readonly requestTimeoutMs: number;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly emitter = new EventEmitter();\n private nextId = 1;\n private closed = false;\n private closeReason: Error | undefined;\n\n private readonly handleMessage = (raw: string): void => {\n const parsed = parseMessage(raw);\n if (!parsed) {\n return;\n }\n if (typeof parsed.id === \"number\") {\n const pending = this.pending.get(parsed.id);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${parsed.id.toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n return;\n }\n if (typeof parsed.method === \"string\") {\n this.emitter.emit(parsed.method, parsed.params);\n this.emitter.emit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private readonly handleClose = (): void => {\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Inspector connection closed\"));\n };\n\n private readonly handleError = (err: Error): void => {\n this.markClosed(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", err.message),\n );\n };\n\n private constructor(transport: CdpTransport, requestTimeoutMs: number) {\n this.transport = transport;\n this.requestTimeoutMs = requestTimeoutMs;\n transport.on(\"message\", this.handleMessage);\n transport.on(\"close\", this.handleClose);\n transport.on(\"error\", this.handleError);\n }\n\n public static async connect(options: CdpClientOptions): Promise<CdpClient> {\n const factory = options.transportFactory ?? (await loadDefaultFactory());\n const transport = await factory(options.url);\n return new CdpClient(transport, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);\n }\n\n public async send<TResult = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<TResult> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n const id = this.nextId++;\n const payload = JSON.stringify({ id, method, params });\n return await new Promise<TResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP method ${method} timed out after ${this.requestTimeoutMs.toString()}ms`,\n ),\n );\n }, this.requestTimeoutMs);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n try {\n this.transport.send(payload);\n } catch (err: unknown) {\n clearTimeout(timer);\n this.pending.delete(id);\n const message = err instanceof Error ? err.message : String(err);\n reject(new CfInspectorError(\"CDP_REQUEST_FAILED\", `Failed to send ${method}: ${message}`));\n }\n });\n }\n\n public on(method: string, listener: (params: unknown) => void): () => void {\n this.emitter.on(method, listener);\n return (): void => {\n this.emitter.off(method, listener);\n };\n }\n\n public async waitFor<T = unknown>(\n method: string,\n options: { readonly timeoutMs: number; readonly predicate?: (params: T) => boolean } = {\n timeoutMs: this.requestTimeoutMs,\n },\n ): Promise<T> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n clearTimeout(timer);\n offEvent();\n offClose();\n };\n const offEvent = this.on(method, (raw) => {\n if (settled) {\n return;\n }\n const params = raw as T;\n if (options.predicate && !options.predicate(params)) {\n return;\n }\n settled = true;\n cleanup();\n resolve(params);\n });\n const offClose = this.onClose((err) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(err);\n });\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${options.timeoutMs.toString()}ms`,\n ),\n );\n }, options.timeoutMs);\n });\n }\n\n public onClose(listener: (err: Error) => void): () => void {\n if (this.closed) {\n const reason = this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n queueMicrotask(() => {\n listener(reason);\n });\n return (): void => {\n // already closed; nothing to detach\n };\n }\n this.emitter.on(\"__close__\", listener);\n return (): void => {\n this.emitter.off(\"__close__\", listener);\n };\n }\n\n public dispose(): void {\n if (this.closed) {\n return;\n }\n this.transport.off(\"message\", this.handleMessage);\n this.transport.off(\"close\", this.handleClose);\n this.transport.off(\"error\", this.handleError);\n try {\n this.transport.close();\n } catch {\n // best-effort\n }\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection disposed\"));\n }\n\n public get isClosed(): boolean {\n return this.closed;\n }\n\n private markClosed(reason: Error): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(reason);\n }\n this.pending.clear();\n this.emitter.emit(\"__close__\", reason);\n this.emitter.removeAllListeners();\n }\n}\n","import { evaluateOnFrame, getProperties } from \"./inspector.js\";\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./inspector.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n PauseEvent,\n ScopeSnapshot,\n SnapshotCaptureResult,\n VariableSnapshot,\n} from \"./types.js\";\n\nconst MAX_SCOPES = 3;\nconst MAX_SCOPE_VARIABLES = 20;\nconst MAX_CHILD_VARIABLES = 8;\nconst MAX_VARIABLE_DEPTH = 2;\nconst DEFAULT_MAX_VALUE_LENGTH = 4096;\n\nconst PRIORITY_BY_TYPE: Readonly<Record<string, number>> = {\n local: 0,\n arguments: 1,\n block: 2,\n closure: 3,\n catch: 4,\n with: 5,\n module: 6,\n script: 7,\n};\n\ninterface DescribedProperty {\n value: string;\n type?: string;\n objectId?: string;\n}\n\nfunction buildDescribed(value: string, type: string | undefined, objectId?: string): DescribedProperty {\n const base: DescribedProperty = { value };\n if (type !== undefined) {\n base.type = type;\n }\n if (objectId !== undefined) {\n base.objectId = objectId;\n }\n return base;\n}\n\nfunction describeProperty(prop: CdpProperty): DescribedProperty {\n const value = prop.value;\n if (value === undefined) {\n return { value: \"undefined\" };\n }\n const type = typeof value.type === \"string\" ? value.type : undefined;\n const objectId = typeof value.objectId === \"string\" ? value.objectId : undefined;\n if (type === \"undefined\") {\n return buildDescribed(\"undefined\", type);\n }\n if (type === \"string\" && typeof value.value === \"string\") {\n return buildDescribed(JSON.stringify(value.value), type);\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\" || type === \"symbol\") &&\n isPrimitive(value.value)\n ) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (typeof value.description === \"string\") {\n return buildDescribed(value.description, type, objectId);\n }\n if (isPrimitive(value.value)) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (objectId === undefined) {\n return buildDescribed(\"undefined\", type);\n }\n return buildDescribed(\"[object]\", type, objectId);\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol {\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\" || t === \"symbol\";\n}\n\nfunction formatPrimitive(value: string | number | boolean | bigint | symbol): string {\n if (typeof value === \"symbol\") {\n return value.toString();\n }\n if (typeof value === \"bigint\") {\n return `${value.toString()}n`;\n }\n return String(value);\n}\n\nfunction 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\nfunction 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 isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nasync function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n 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 const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n let children: readonly VariableSnapshot[] | undefined;\n if (depth > 0 && described.objectId !== undefined && isExpandable(described.type)) {\n try {\n const nested = await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n maxValueLength,\n );\n if (nested.length > 0) {\n children = nested;\n }\n } catch {\n // best-effort: skip nested expansion on error\n }\n }\n const sanitizedValue = 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 );\n return variables;\n}\n\nfunction selectScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n const eligible = scopeChain.filter((scope) => scope.objectId !== undefined && scope.type !== \"global\");\n return [...eligible]\n .sort((a, b) => priorityOf(a.type) - priorityOf(b.type))\n .slice(0, MAX_SCOPES);\n}\n\nfunction priorityOf(type: string): number {\n return PRIORITY_BY_TYPE[type] ?? Number.MAX_SAFE_INTEGER;\n}\n\nasync function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n 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\nfunction evalResultToCaptured(\n expression: string,\n result: CdpEvalResult,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n const text =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n return { expression, error: limitValueLength(text, 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\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 (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\") &&\n isPrimitive(inner.value)\n ) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n if (typeof inner.description === \"string\") {\n return buildCaptured(inner.description);\n }\n if (isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n return buildCaptured(\"undefined\");\n}\n\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\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 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\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 // Preserve richer built-in descriptions (Date/Map/Set/Promise...) if property\n // expansion only produced an empty object payload.\n if (rendered === \"{}\" && original !== \"Object\") {\n return undefined;\n }\n // For empty arrays, property expansion often only yields {\"length\":0}.\n // Convert it to [] for readability and consistency.\n if (original.startsWith(\"Array(\") && rendered === \"{\\\"length\\\":0}\") {\n return \"[]\";\n }\n return rendered;\n}\n\nasync 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\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 if (options.captures !== undefined && options.captures.length > 0) {\n captures = await Promise.all(\n options.captures.map(async (expression): Promise<CapturedExpression> => {\n try {\n const result = await evaluateOnFrame(session, top.callFrameId, expression);\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n return await withSerializedObjectCapture(\n session,\n expression,\n result,\n captured,\n maxValueLength,\n );\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: limitValueLength(message, maxValueLength) };\n }\n }),\n );\n }\n }\n return {\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n ...(topFrame === undefined ? {} : { topFrame }),\n captures,\n };\n}\n\nexport const internalsForTesting = {\n DEFAULT_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import { randomBytes } from \"node:crypto\";\n\nimport { removeBreakpoint, setBreakpoint } from \"./inspector.js\";\nimport type { InspectorSession } from \"./inspector.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointEvent {\n readonly ts: string;\n readonly at: string;\n readonly value?: string;\n readonly error?: string;\n readonly raw?: string;\n}\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly signal?: AbortSignal;\n readonly onEvent: (event: LogpointEvent) => void;\n /**\n * Fires once, immediately after `Debugger.setBreakpointByUrl` returns, with\n * the resolved breakpoint handle. Useful for surfacing warnings such as a BP\n * that did not bind to any script — the caller can warn the user before\n * the stream window elapses.\n */\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n /** Emitted log count, including parse errors that kept the sentinel. */\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\";\n}\n\n/**\n * Serialize a CDP-side IIFE that runs the user's expression as a \"logpoint\":\n * never pauses (always returns false), tags each emitted log with a unique\n * sentinel so we can distinguish our logs from app traffic, and wraps both the\n * user expression and JSON.stringify in try/catch so a thrown expression still\n * surfaces an error event instead of silently breaking the breakpoint.\n *\n * Exported for unit testing — the wire format is part of the contract.\n */\nexport function buildLogpointCondition(sentinel: string, expression: string): string {\n // sentinel embedded as a JS string literal; expression wrapped in parens.\n // The IIFE returns false so V8 never pauses the inspectee.\n return [\n \"(function(){\",\n `var s=${JSON.stringify(sentinel)};`,\n \"try{\",\n `var v=(${expression});`,\n \"var r=typeof v==='string'?v:JSON.stringify(v);\",\n \"console.log(s, r);\",\n \"}catch(e){\",\n \"console.log(s, '!err:'+(e&&e.message?e.message:String(e)));\",\n \"}\",\n \"return false;\",\n \"})()\",\n ].join(\"\");\n}\n\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\ninterface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readArg(arg: unknown, index: number): string | undefined {\n if (typeof arg !== \"object\" || arg === null) {\n return undefined;\n }\n const candidate = arg as CdpRemoteObject;\n if (candidate.type === \"string\" && typeof candidate.value === \"string\") {\n return candidate.value;\n }\n // Other primitives — coerce via String() only on confirmed-primitive types.\n const isPrimitiveType =\n candidate.type === \"number\" ||\n candidate.type === \"boolean\" ||\n candidate.type === \"bigint\";\n const isPrimitiveValue =\n typeof candidate.value === \"number\" ||\n typeof candidate.value === \"boolean\" ||\n typeof candidate.value === \"bigint\";\n if (isPrimitiveType && isPrimitiveValue) {\n return String(candidate.value);\n }\n // For first arg, only string sentinel matters; for second we handle below.\n return index === 0 ? undefined : \"\";\n}\n\nfunction parseLogEvent(\n rawArgs: unknown,\n sentinel: string,\n location: BreakpointLocation,\n timestamp: number | undefined,\n): LogpointEvent | undefined {\n if (!Array.isArray(rawArgs) || rawArgs.length < 2) {\n return undefined;\n }\n const tag = readArg(rawArgs[0], 0);\n if (tag !== sentinel) {\n return undefined;\n }\n const payload = readArg(rawArgs[1], 1) ?? \"\";\n const ts = new Date(typeof timestamp === \"number\" ? timestamp : Date.now()).toISOString();\n const at = `${location.file}:${location.line.toString()}`;\n if (payload.startsWith(\"!err:\")) {\n return { ts, at, error: payload.slice(\"!err:\".length) };\n }\n // Distinguish JSON-encoded vs already-string values by trying to parse;\n // unparseable strings are emitted as raw to preserve whatever the user logged.\n try {\n const parsed: unknown = JSON.parse(payload);\n if (typeof parsed === \"string\") {\n return { ts, at, value: parsed };\n }\n return { ts, at, value: JSON.stringify(parsed) };\n } catch {\n return { ts, at, value: payload, raw: payload };\n }\n}\n\nfunction generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression);\n\n // Attach the consoleAPICalled listener BEFORE setBreakpoint. CDP messages\n // travel on a single WebSocket; if we set the BP first, a fast inspectee\n // (e.g. setInterval 200ms) can fire the BP and emit consoleAPICalled before\n // we get a chance to subscribe — those events would be silently dropped.\n // The sentinel filter is generated up front so attaching early is safe.\n let emitted = 0;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n const event = parseLogEvent(params.args, sentinel, options.location, ts);\n if (event === undefined) {\n return;\n }\n emitted += 1;\n options.onEvent(event);\n });\n\n let handle: BreakpointHandle;\n try {\n handle = await setBreakpoint(session, {\n file: options.location.file,\n line: options.location.line,\n ...(options.remoteRoot === undefined ? {} : { remoteRoot: options.remoteRoot }),\n condition,\n });\n } catch (err: unknown) {\n offEvent();\n throw err;\n }\n options.onBreakpointSet?.(handle);\n\n const cleanup = async (): Promise<void> => {\n offEvent();\n try {\n await removeBreakpoint(session, handle.breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n };\n\n try {\n const reason = await waitForStop(session, options);\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n await cleanup();\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult[\"stoppedReason\"]> {\n return await new Promise<LogpointStreamResult[\"stoppedReason\"]>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStreamResult[\"stoppedReason\"]): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(reason);\n };\n const timer = options.durationMs === undefined\n ? undefined\n : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const offClose = session.client.onClose(() => {\n finish(\"transport-closed\");\n });\n const onAbort = (): void => {\n finish(\"signal\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n finish(\"signal\");\n }\n function cleanup(): void {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n}\n\nexport const internalsForTesting = {\n buildLogpointCondition,\n parseLogEvent,\n generateSentinel,\n SENTINEL_PREFIX,\n};\n","import { 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":["out","asString"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/wsTransport.ts","../src/index.ts","../src/pathMapper.ts","../src/inspector.ts","../src/cdp.ts","../src/inspectorDiscovery.ts","../src/snapshot.ts","../src/logpoint.ts","../src/tunnel.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"BREAKPOINT_DID_NOT_BIND\"\n | \"INSPECTOR_DISCOVERY_FAILED\"\n | \"INSPECTOR_CONNECTION_FAILED\"\n | \"CDP_REQUEST_FAILED\"\n | \"BREAKPOINT_NOT_HIT\"\n | \"UNRELATED_PAUSE\"\n | \"UNRELATED_PAUSE_TIMEOUT\"\n | \"EVALUATION_FAILED\"\n | \"MISSING_TARGET\"\n | \"ABORTED\";\n\nexport class CfInspectorError extends Error {\n public readonly code: CfInspectorErrorCode;\n public readonly detail?: string;\n\n public constructor(code: CfInspectorErrorCode, message: string, detail?: string) {\n super(message);\n this.name = \"CfInspectorError\";\n this.code = code;\n if (detail !== undefined) {\n this.detail = detail;\n }\n }\n}\n\nexport interface BreakpointLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface RemoteRootLiteral {\n readonly kind: \"literal\";\n readonly value: string;\n}\n\nexport interface RemoteRootRegex {\n readonly kind: \"regex\";\n readonly pattern: string;\n readonly flags: string;\n readonly regex: RegExp;\n}\n\nexport interface RemoteRootNone {\n readonly kind: \"none\";\n}\n\nexport type RemoteRootSetting = RemoteRootLiteral | RemoteRootRegex | RemoteRootNone;\n\nexport interface BreakpointHandle {\n readonly breakpointId: string;\n readonly file: string;\n readonly line: number;\n readonly urlRegex: string;\n readonly resolvedLocations: readonly ResolvedLocation[];\n}\n\nexport interface ResolvedLocation {\n readonly scriptId: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber?: number;\n}\n\nexport interface CallFrameInfo {\n readonly callFrameId: string;\n readonly functionName: string;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n readonly scopeChain: readonly ScopeInfo[];\n}\n\nexport interface ScopeInfo {\n readonly type: string;\n readonly objectId?: string;\n readonly name?: string;\n}\n\nexport interface PauseEvent {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly callFrames: readonly CallFrameInfo[];\n readonly receivedAtMs?: number;\n}\n\nexport interface VariableSnapshot {\n readonly name: string;\n readonly value: string;\n readonly type?: string;\n readonly children?: readonly VariableSnapshot[];\n}\n\nexport interface ScopeSnapshot {\n readonly type: string;\n readonly variables: readonly VariableSnapshot[];\n}\n\nexport interface FrameSnapshot {\n readonly functionName: string;\n readonly url?: string;\n readonly line: number;\n readonly column: number;\n readonly scopes?: readonly ScopeSnapshot[];\n}\n\nexport interface CapturedExpression {\n readonly expression: string;\n readonly value?: string;\n readonly type?: string;\n readonly error?: string;\n}\n\nexport interface SnapshotCaptureResult {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly capturedAt: string;\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n}\n\nexport interface SnapshotResult extends SnapshotCaptureResult {\n readonly pausedDurationMs: number | null;\n}\n\nexport interface ScriptInfo {\n readonly scriptId: string;\n readonly url: string;\n}\n\nexport interface InspectorConnectOptions {\n readonly port: number;\n readonly host?: string;\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpMessage =\n | { readonly id: number; readonly result: unknown }\n | { readonly id: number; readonly error: { readonly code: number; readonly message: string } }\n | { readonly method: string; readonly params: unknown };\n","import { WebSocket } from \"ws\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./cdp.js\";\nimport { CfInspectorError } from \"./types.js\";\n\nexport async function wsTransportFactory(url: string): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n socket.off(\"error\", onError);\n resolve();\n };\n const onError = (err: Error): void => {\n socket.off(\"open\", onOpen);\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n const wrappers = new WeakMap<object, (...args: unknown[]) => void>();\n const wrapMessage = (listener: (data: string) => void): ((data: Buffer) => void) => {\n const wrapped = (data: Buffer): void => {\n listener(data.toString(\"utf8\"));\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapClose = (listener: () => void): (() => void) => {\n const wrapped = (): void => {\n listener();\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n const wrapError = (listener: (err: Error) => void): ((err: Error) => void) => {\n const wrapped = (err: Error): void => {\n listener(err);\n };\n wrappers.set(listener, wrapped as (...args: unknown[]) => void);\n return wrapped;\n };\n\n return {\n send(payload: string): void {\n socket.send(payload);\n },\n close(): void {\n socket.close();\n },\n get readyState(): number {\n return socket.readyState;\n },\n on(event, listener): void {\n if (event === \"message\") {\n socket.on(\"message\", wrapMessage(listener as CdpTransportEventMap[\"message\"]));\n } else if (event === \"close\") {\n socket.on(\"close\", wrapClose(listener as CdpTransportEventMap[\"close\"]));\n } else {\n socket.on(\"error\", wrapError(listener as CdpTransportEventMap[\"error\"]));\n }\n },\n off(event, listener): void {\n const wrapped = wrappers.get(listener as object);\n if (!wrapped) {\n return;\n }\n if (event === \"message\") {\n socket.off(\"message\", wrapped as (data: Buffer) => void);\n } else if (event === \"close\") {\n socket.off(\"close\", wrapped as () => void);\n } else {\n socket.off(\"error\", wrapped as (err: Error) => void);\n }\n },\n };\n}\n","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.js\";\nexport type {\n DebuggerState,\n InspectorSession,\n InspectorTarget,\n SetBreakpointInput,\n WaitForPauseOptions,\n} from \"./inspector.js\";\n\nexport { captureSnapshot } from \"./snapshot.js\";\nexport type { CaptureSnapshotOptions } from \"./snapshot.js\";\n\nexport { buildLogpointCondition, streamLogpoint } from \"./logpoint.js\";\nexport type {\n LogpointEvent,\n LogpointStreamOptions,\n LogpointStreamResult,\n} from \"./logpoint.js\";\n\nexport { openCfTunnel } from \"./tunnel.js\";\nexport type { OpenedTunnel, TunnelTarget } from \"./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 { performance } from \"node:perf_hooks\";\n\nimport { CdpClient } from \"./cdp.js\";\nimport {\n discoverInspectorTargets,\n fetchInspectorVersion,\n} from \"./inspectorDiscovery.js\";\nimport type { InspectorTarget } from \"./inspectorDiscovery.js\";\nimport { buildBreakpointUrlRegex } from \"./pathMapper.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type {\n BreakpointHandle,\n BreakpointLocation,\n CallFrameInfo,\n InspectorConnectOptions,\n PauseEvent,\n RemoteRootSetting,\n ResolvedLocation,\n ScopeInfo,\n ScriptInfo,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\n\nexport { discoverInspectorTargets, fetchInspectorVersion };\nexport type { InspectorTarget } from \"./inspectorDiscovery.js\";\n\n/**\n * Internal coordination flag between the always-on `Debugger.paused` buffer in\n * `connectInspector` and an active `waitForPause`. When `active` is true, the\n * buffer listener skips pushing the live event so it cannot be replayed by a\n * subsequent `waitForPause` call. See `connectInspector` for the full rationale.\n */\nexport interface PauseWaitGate {\n active: boolean;\n}\n\nexport interface DebuggerState {\n lastResumedAtMs?: number;\n}\n\nexport interface InspectorSession {\n readonly client: CdpClient;\n readonly target: InspectorTarget;\n readonly scripts: ReadonlyMap<string, ScriptInfo>;\n readonly pauseBuffer: PauseEvent[];\n readonly pauseWaitGate: PauseWaitGate;\n readonly debuggerState: DebuggerState;\n dispose(): Promise<void>;\n}\n\ninterface CdpCallFrame {\n callFrameId?: unknown;\n functionName?: unknown;\n location?: { lineNumber?: unknown; columnNumber?: unknown };\n url?: unknown;\n scopeChain?: unknown;\n}\n\ninterface CdpScope {\n type?: unknown;\n name?: unknown;\n object?: { objectId?: unknown };\n}\n\ninterface CdpPauseParams {\n reason?: unknown;\n hitBreakpoints?: unknown;\n callFrames?: unknown;\n}\n\ninterface CdpSetBreakpointResult {\n breakpointId?: unknown;\n locations?: unknown;\n}\n\ninterface CdpResolvedLocation {\n scriptId?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n url?: unknown;\n}\n\ninterface CdpEvalResult {\n result?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\ninterface ScriptParsedParams {\n scriptId?: unknown;\n url?: unknown;\n}\n\nexport async function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const target = targets[0];\n if (!target) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets available on ${host}:${options.port.toString()}`,\n );\n }\n const client = await CdpClient.connect({ url: target.webSocketDebuggerUrl });\n const scripts = new Map<string, ScriptInfo>();\n client.on(\"Debugger.scriptParsed\", (raw) => {\n const params = raw as ScriptParsedParams;\n const scriptId = asString(params.scriptId);\n const url = asString(params.url);\n if (scriptId.length === 0) {\n return;\n }\n scripts.set(scriptId, { scriptId, url });\n });\n // Buffer Debugger.paused events from the moment Debugger.enable is sent so\n // breakpoints that fire before waitForPause attaches its listener are not lost.\n // Bounded (FIFO drop-oldest) to avoid unbounded memory growth on a tight\n // paused-then-resumed loop.\n //\n // The pauseWaitGate coordinates with waitForPause: when a waitForPause call\n // is currently consuming the live CDP stream, this listener skips the buffer\n // push so the same event isn't replayed by a subsequent waitForPause call.\n // Without the gate, a buffer-miss path (waitForPause sees an empty buffer\n // and falls through to client.waitFor) ends with both client.waitFor AND\n // this listener handling the same event — the event is returned AND queued\n // in the buffer, ready to be replayed on the next call.\n const PAUSE_BUFFER_LIMIT = 32;\n const pauseBuffer: PauseEvent[] = [];\n const pauseWaitGate: PauseWaitGate = { active: false };\n const debuggerState: DebuggerState = {};\n client.on(\"Debugger.paused\", (raw) => {\n if (pauseWaitGate.active) {\n return;\n }\n const params = raw as CdpPauseParams;\n const event = toPauseEvent(params, performance.now());\n if (pauseBuffer.length >= PAUSE_BUFFER_LIMIT) {\n pauseBuffer.shift();\n }\n pauseBuffer.push(event);\n });\n client.on(\"Debugger.resumed\", () => {\n debuggerState.lastResumedAtMs = performance.now();\n });\n await client.send(\"Runtime.enable\");\n await client.send(\"Debugger.enable\");\n return {\n client,\n target,\n scripts,\n pauseBuffer,\n pauseWaitGate,\n debuggerState,\n dispose: async (): Promise<void> => {\n try {\n await client.send(\"Debugger.disable\");\n } catch {\n // best-effort\n }\n client.dispose();\n },\n };\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction toResolvedLocations(value: unknown): readonly ResolvedLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ResolvedLocation[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpResolvedLocation;\n const scriptId = asString(candidate.scriptId);\n if (scriptId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.lineNumber);\n const result: ResolvedLocation = url === undefined\n ? { scriptId, lineNumber, columnNumber: asNumber(candidate.columnNumber) }\n : { scriptId, url, lineNumber, columnNumber: asNumber(candidate.columnNumber) };\n return [result];\n });\n}\n\nexport interface SetBreakpointInput extends BreakpointLocation {\n readonly remoteRoot?: RemoteRootSetting;\n readonly condition?: string;\n}\n\nexport async function setBreakpoint(\n session: InspectorSession,\n input: SetBreakpointInput,\n): Promise<BreakpointHandle> {\n const remoteRoot: RemoteRootSetting = input.remoteRoot ?? { kind: \"none\" };\n const urlRegex = buildBreakpointUrlRegex({ file: input.file, remoteRoot });\n const params: Record<string, unknown> = {\n lineNumber: input.line - 1,\n urlRegex,\n };\n if (input.condition !== undefined && input.condition.length > 0) {\n params[\"condition\"] = input.condition;\n }\n const result = await session.client.send<CdpSetBreakpointResult>(\n \"Debugger.setBreakpointByUrl\",\n params,\n );\n const breakpointId = asString(result.breakpointId);\n if (breakpointId.length === 0) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `setBreakpointByUrl did not return a breakpointId for ${input.file}:${input.line.toString()}`,\n );\n }\n return {\n breakpointId,\n file: input.file,\n line: input.line,\n urlRegex,\n resolvedLocations: toResolvedLocations(result.locations),\n };\n}\n\nexport async function removeBreakpoint(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n await session.client.send(\"Debugger.removeBreakpoint\", { breakpointId });\n}\n\nfunction toScopeChain(value: unknown): readonly ScopeInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ScopeInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpScope;\n const type = asString(candidate.type);\n if (type.length === 0) {\n return [];\n }\n const objectId = typeof candidate.object?.objectId === \"string\" ? candidate.object.objectId : undefined;\n const name = typeof candidate.name === \"string\" ? candidate.name : undefined;\n const base: ScopeInfo = name === undefined\n ? { type }\n : { type, name };\n return [objectId === undefined ? base : { ...base, objectId }];\n });\n}\n\nfunction toCallFrames(value: unknown): readonly CallFrameInfo[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): CallFrameInfo[] => {\n if (typeof entry !== \"object\" || entry === null) {\n return [];\n }\n const candidate = entry as CdpCallFrame;\n const callFrameId = asString(candidate.callFrameId);\n if (callFrameId.length === 0) {\n return [];\n }\n const url = typeof candidate.url === \"string\" ? candidate.url : undefined;\n const lineNumber = asNumber(candidate.location?.lineNumber);\n const columnNumber = asNumber(candidate.location?.columnNumber);\n const base: CallFrameInfo = {\n callFrameId,\n functionName: asString(candidate.functionName),\n lineNumber,\n columnNumber,\n scopeChain: toScopeChain(candidate.scopeChain),\n };\n return [url === undefined ? base : { ...base, url }];\n });\n}\n\nexport interface WaitForPauseOptions {\n readonly timeoutMs: number;\n readonly breakpointIds?: readonly string[];\n readonly unmatchedPausePolicy?: \"wait-for-resume\" | \"fail\";\n readonly onUnmatchedPause?: (pause: PauseEvent) => void;\n}\n\nfunction pauseMatches(pause: PauseEvent, breakpointIds: readonly string[] | undefined): boolean {\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nfunction toPauseEvent(params: CdpPauseParams, receivedAtMs: number): PauseEvent {\n return {\n reason: asString(params.reason),\n hitBreakpoints: Array.isArray(params.hitBreakpoints)\n ? params.hitBreakpoints.filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params.callFrames),\n receivedAtMs,\n };\n}\n\nfunction remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\n}\n\nfunction topFrameLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n\nfunction pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n\nfunction hasResumedSincePause(session: InspectorSession, pause: PauseEvent): boolean {\n const pauseAt = pause.receivedAtMs;\n const resumedAt = session.debuggerState.lastResumedAtMs;\n return pauseAt !== undefined && resumedAt !== undefined && resumedAt >= pauseAt;\n}\n\nfunction throwBreakpointTimeout(timeoutMs: number): never {\n throw new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for matching Debugger.paused after ${timeoutMs.toString()}ms`,\n );\n}\n\nfunction throwUnrelatedPauseTimeout(pause: PauseEvent, timeoutMs: number): never {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE_TIMEOUT\",\n `Target stayed paused by another debugger event before this command's breakpoint could hit within ${timeoutMs.toString()}ms`,\n pauseDetail(pause),\n );\n}\n\nasync function waitForUnmatchedPauseToResume(\n session: InspectorSession,\n pause: PauseEvent,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> {\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwUnrelatedPauseTimeout(pause, timeoutMs);\n }\n try {\n await session.client.waitFor(\"Debugger.resumed\", { timeoutMs: remainingMs });\n session.debuggerState.lastResumedAtMs = performance.now();\n } catch (err: unknown) {\n if (err instanceof CfInspectorError && err.code === \"BREAKPOINT_NOT_HIT\") {\n throwUnrelatedPauseTimeout(pause, timeoutMs);\n }\n throw err;\n }\n}\n\nasync function handleUnmatchedPause(\n session: InspectorSession,\n pause: PauseEvent,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<void> {\n if (options.unmatchedPausePolicy === \"fail\") {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE\",\n \"Target paused before this command's breakpoint was reached\",\n pauseDetail(pause),\n );\n }\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n options.onUnmatchedPause?.(pause);\n await waitForUnmatchedPauseToResume(session, pause, deadlineMs, options.timeoutMs);\n}\n\nexport async function waitForPause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n): Promise<PauseEvent> {\n const deadlineMs = performance.now() + options.timeoutMs;\n // Check the buffer first — a breakpoint may have fired between setBreakpoint\n // returning and waitForPause being called (the inspectee runs continuously).\n const buffer = session.pauseBuffer;\n while (buffer.length > 0 || remainingUntil(deadlineMs) > 0) {\n while (buffer.length > 0) {\n const buffered = buffer.shift();\n if (buffered === undefined) {\n continue;\n }\n if (pauseMatches(buffered, options.breakpointIds)) {\n return buffered;\n }\n await handleUnmatchedPause(session, buffered, options, deadlineMs);\n }\n\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwBreakpointTimeout(options.timeoutMs);\n }\n session.pauseWaitGate.active = true;\n let receivedAtMs: number | undefined;\n let params: CdpPauseParams;\n try {\n params = await session.client.waitFor<CdpPauseParams>(\"Debugger.paused\", {\n timeoutMs: remainingMs,\n predicate: (): boolean => {\n receivedAtMs = performance.now();\n return true;\n },\n });\n } finally {\n session.pauseWaitGate.active = false;\n }\n const pause = toPauseEvent(params, receivedAtMs ?? performance.now());\n if (pauseMatches(pause, options.breakpointIds)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n}\n\nexport async function evaluateOnFrame(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport async function evaluateGlobal(\n session: InspectorSession,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport function listScripts(session: InspectorSession): readonly ScriptInfo[] {\n return [...session.scripts.values()];\n}\n\ninterface CdpCompileResult {\n scriptId?: unknown;\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\n/**\n * Pre-compile a JS expression on the inspectee using Runtime.compileScript so\n * syntax errors surface as a CfInspectorError(\"INVALID_EXPRESSION\") instead of\n * being silently swallowed by V8 when wired into a breakpoint condition or a\n * logpoint. Without this guard, a typo in --condition or --expr causes the\n * breakpoint to silently never fire — the user would see BREAKPOINT_NOT_HIT\n * after the timeout and have no idea why.\n *\n * persistScript: false — we don't actually want the compiled script around;\n * we just want V8 to parse it and report any SyntaxError.\n */\nexport async function validateExpression(\n session: InspectorSession,\n expression: string,\n): Promise<void> {\n const result = await session.client.send<CdpCompileResult>(\"Runtime.compileScript\", {\n expression,\n sourceURL: \"<cf-inspector-validate>\",\n persistScript: false,\n });\n if (result.exceptionDetails === undefined) {\n return;\n }\n const description =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\"\n ? result.exceptionDetails.text\n : \"expression failed to compile\");\n throw new CfInspectorError(\"INVALID_EXPRESSION\", description);\n}\n\ninterface CdpProperty {\n name?: unknown;\n value?: { type?: unknown; value?: unknown; description?: unknown; objectId?: unknown };\n}\n\nexport async function getProperties(\n session: InspectorSession,\n objectId: string,\n): Promise<readonly CdpProperty[]> {\n const result = await session.client.send<{ result?: unknown }>(\"Runtime.getProperties\", {\n objectId,\n ownProperties: true,\n accessorPropertiesOnly: false,\n generatePreview: true,\n });\n if (!Array.isArray(result.result)) {\n return [];\n }\n return result.result as readonly CdpProperty[];\n}\n\nexport type { CdpEvalResult, CdpProperty };\n","import { EventEmitter } from \"node:events\";\n\nimport { CfInspectorError } from \"./types.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\n\nexport interface CdpTransportEventMap {\n readonly message: (data: string) => void;\n readonly close: () => void;\n readonly error: (err: Error) => void;\n}\n\nexport interface CdpTransport {\n send(payload: string): void;\n close(): void;\n readonly readyState: number;\n on<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n off<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n}\n\nexport type CdpTransportFactory = (url: string) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n}\n\ninterface PendingRequest {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\ninterface ParsedMessage {\n readonly id?: number;\n readonly method?: string;\n readonly result?: unknown;\n readonly params?: unknown;\n readonly error?: { code: number; message: string };\n}\n\nfunction parseMessage(raw: string): ParsedMessage | undefined {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return value as ParsedMessage;\n } catch {\n return undefined;\n }\n}\n\nasync function loadDefaultFactory(): Promise<CdpTransportFactory> {\n const mod = await import(\"./wsTransport.js\");\n return mod.wsTransportFactory;\n}\n\nexport class CdpClient {\n private readonly transport: CdpTransport;\n private readonly requestTimeoutMs: number;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly emitter = new EventEmitter();\n private nextId = 1;\n private closed = false;\n private closeReason: Error | undefined;\n\n private readonly handleMessage = (raw: string): void => {\n const parsed = parseMessage(raw);\n if (!parsed) {\n return;\n }\n if (typeof parsed.id === \"number\") {\n const pending = this.pending.get(parsed.id);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${parsed.id.toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n return;\n }\n if (typeof parsed.method === \"string\") {\n this.emitter.emit(parsed.method, parsed.params);\n this.emitter.emit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private readonly handleClose = (): void => {\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Inspector connection closed\"));\n };\n\n private readonly handleError = (err: Error): void => {\n this.markClosed(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", err.message),\n );\n };\n\n private constructor(transport: CdpTransport, requestTimeoutMs: number) {\n this.transport = transport;\n this.requestTimeoutMs = requestTimeoutMs;\n transport.on(\"message\", this.handleMessage);\n transport.on(\"close\", this.handleClose);\n transport.on(\"error\", this.handleError);\n }\n\n public static async connect(options: CdpClientOptions): Promise<CdpClient> {\n const factory = options.transportFactory ?? (await loadDefaultFactory());\n const transport = await factory(options.url);\n return new CdpClient(transport, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);\n }\n\n public async send<TResult = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<TResult> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n const id = this.nextId++;\n const payload = JSON.stringify({ id, method, params });\n return await new Promise<TResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP method ${method} timed out after ${this.requestTimeoutMs.toString()}ms`,\n ),\n );\n }, this.requestTimeoutMs);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n try {\n this.transport.send(payload);\n } catch (err: unknown) {\n clearTimeout(timer);\n this.pending.delete(id);\n const message = err instanceof Error ? err.message : String(err);\n reject(new CfInspectorError(\"CDP_REQUEST_FAILED\", `Failed to send ${method}: ${message}`));\n }\n });\n }\n\n public on(method: string, listener: (params: unknown) => void): () => void {\n this.emitter.on(method, listener);\n return (): void => {\n this.emitter.off(method, listener);\n };\n }\n\n public async waitFor<T = unknown>(\n method: string,\n options: { readonly timeoutMs: number; readonly predicate?: (params: T) => boolean } = {\n timeoutMs: this.requestTimeoutMs,\n },\n ): Promise<T> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n clearTimeout(timer);\n offEvent();\n offClose();\n };\n const offEvent = this.on(method, (raw) => {\n if (settled) {\n return;\n }\n const params = raw as T;\n if (options.predicate && !options.predicate(params)) {\n return;\n }\n settled = true;\n cleanup();\n resolve(params);\n });\n const offClose = this.onClose((err) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(err);\n });\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${options.timeoutMs.toString()}ms`,\n ),\n );\n }, options.timeoutMs);\n });\n }\n\n public onClose(listener: (err: Error) => void): () => void {\n if (this.closed) {\n const reason = this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n queueMicrotask(() => {\n listener(reason);\n });\n return (): void => {\n // already closed; nothing to detach\n };\n }\n this.emitter.on(\"__close__\", listener);\n return (): void => {\n this.emitter.off(\"__close__\", listener);\n };\n }\n\n public dispose(): void {\n if (this.closed) {\n return;\n }\n this.transport.off(\"message\", this.handleMessage);\n this.transport.off(\"close\", this.handleClose);\n this.transport.off(\"error\", this.handleError);\n try {\n this.transport.close();\n } catch {\n // best-effort\n }\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection disposed\"));\n }\n\n public get isClosed(): boolean {\n return this.closed;\n }\n\n private markClosed(reason: Error): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(reason);\n }\n this.pending.clear();\n this.emitter.emit(\"__close__\", reason);\n this.emitter.removeAllListeners();\n }\n}\n","import { 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 const text = Buffer.concat(chunks).toString(\"utf8\");\n resolve(JSON.parse(text) as T);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Failed to parse inspector discovery response from ${url}: ${message}`,\n ),\n );\n }\n });\n res.on(\"error\", (err) => {\n reject(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery response error: ${err.message}`,\n ),\n );\n });\n });\n req.setTimeout(timeoutMs, () => {\n req.destroy(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n });\n req.on(\"error\", (err) => {\n reject(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} failed: ${err.message}`,\n ),\n );\n });\n req.end();\n });\n}\n\nfunction toInspectorTarget(value: unknown, source: string): InspectorTarget {\n if (typeof value !== \"object\" || value === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is not an object in ${source}`,\n );\n }\n const candidate = value as Record<string, unknown>;\n const webSocketDebuggerUrl = candidate[\"webSocketDebuggerUrl\"];\n if (typeof webSocketDebuggerUrl !== \"string\" || webSocketDebuggerUrl.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is missing webSocketDebuggerUrl in ${source}`,\n );\n }\n return {\n description: typeof candidate[\"description\"] === \"string\" ? candidate[\"description\"] : \"\",\n id: typeof candidate[\"id\"] === \"string\" ? candidate[\"id\"] : \"\",\n title: typeof candidate[\"title\"] === \"string\" ? candidate[\"title\"] : \"\",\n type: typeof candidate[\"type\"] === \"string\" ? candidate[\"type\"] : \"\",\n url: typeof candidate[\"url\"] === \"string\" ? candidate[\"url\"] : \"\",\n webSocketDebuggerUrl,\n ...(typeof candidate[\"devtoolsFrontendUrl\"] === \"string\"\n ? { devtoolsFrontendUrl: candidate[\"devtoolsFrontendUrl\"] }\n : {}),\n ...(typeof candidate[\"faviconUrl\"] === \"string\" ? { faviconUrl: candidate[\"faviconUrl\"] } : {}),\n };\n}\n\nexport async function discoverInspectorTargets(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<readonly InspectorTarget[]> {\n const url = `http://${host}:${port.toString()}/json/list`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets returned from ${url}`,\n );\n }\n return raw.map((entry, idx): InspectorTarget => toInspectorTarget(entry, `${url}[${idx.toString()}]`));\n}\n\nfunction readVersionField(value: Record<string, unknown>, ...keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const entry = value[key];\n if (typeof entry === \"string\" && entry.length > 0) {\n return entry;\n }\n }\n return undefined;\n}\n\nexport async function fetchInspectorVersion(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<InspectorVersion> {\n const url = `http://${host}:${port.toString()}/json/version`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (typeof raw !== \"object\" || raw === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n const value = raw as Record<string, unknown>;\n const browser = readVersionField(value, \"Browser\", \"browser\");\n const protocolVersion = readVersionField(value, \"Protocol-Version\", \"protocolVersion\");\n if (browser === undefined || protocolVersion === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n return { browser, protocolVersion };\n}\n","import { evaluateOnFrame, getProperties } from \"./inspector.js\";\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./inspector.js\";\nimport { CfInspectorError } from \"./types.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n PauseEvent,\n ScopeSnapshot,\n SnapshotCaptureResult,\n VariableSnapshot,\n} from \"./types.js\";\n\nconst MAX_SCOPES = 3;\nconst MAX_SCOPE_VARIABLES = 20;\nconst MAX_CHILD_VARIABLES = 8;\nconst MAX_VARIABLE_DEPTH = 2;\nconst DEFAULT_MAX_VALUE_LENGTH = 4096;\n\nconst PRIORITY_BY_TYPE: Readonly<Record<string, number>> = {\n local: 0,\n arguments: 1,\n block: 2,\n closure: 3,\n catch: 4,\n with: 5,\n module: 6,\n script: 7,\n};\n\ninterface DescribedProperty {\n value: string;\n type?: string;\n objectId?: string;\n}\n\nfunction buildDescribed(value: string, type: string | undefined, objectId?: string): DescribedProperty {\n const base: DescribedProperty = { value };\n if (type !== undefined) {\n base.type = type;\n }\n if (objectId !== undefined) {\n base.objectId = objectId;\n }\n return base;\n}\n\nfunction describeProperty(prop: CdpProperty): DescribedProperty {\n const value = prop.value;\n if (value === undefined) {\n return { value: \"undefined\" };\n }\n const type = typeof value.type === \"string\" ? value.type : undefined;\n const objectId = typeof value.objectId === \"string\" ? value.objectId : undefined;\n if (type === \"undefined\") {\n return buildDescribed(\"undefined\", type);\n }\n if (type === \"string\" && typeof value.value === \"string\") {\n return buildDescribed(JSON.stringify(value.value), type);\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\" || type === \"symbol\") &&\n isPrimitive(value.value)\n ) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (typeof value.description === \"string\") {\n return buildDescribed(value.description, type, objectId);\n }\n if (isPrimitive(value.value)) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (objectId === undefined) {\n return buildDescribed(\"undefined\", type);\n }\n return buildDescribed(\"[object]\", type, objectId);\n}\n\nfunction isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol {\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\" || t === \"symbol\";\n}\n\nfunction formatPrimitive(value: string | number | boolean | bigint | symbol): string {\n if (typeof value === \"symbol\") {\n return value.toString();\n }\n if (typeof value === \"bigint\") {\n return `${value.toString()}n`;\n }\n return String(value);\n}\n\nfunction 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\nfunction 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 isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nasync function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n 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 const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n let children: readonly VariableSnapshot[] | undefined;\n if (depth > 0 && described.objectId !== undefined && isExpandable(described.type)) {\n try {\n const nested = await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n maxValueLength,\n );\n if (nested.length > 0) {\n children = nested;\n }\n } catch {\n // best-effort: skip nested expansion on error\n }\n }\n const sanitizedValue = 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 );\n return variables;\n}\n\nfunction selectScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n const eligible = scopeChain.filter((scope) => scope.objectId !== undefined && scope.type !== \"global\");\n return [...eligible]\n .sort((a, b) => priorityOf(a.type) - priorityOf(b.type))\n .slice(0, MAX_SCOPES);\n}\n\nfunction priorityOf(type: string): number {\n return PRIORITY_BY_TYPE[type] ?? Number.MAX_SAFE_INTEGER;\n}\n\nasync function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n 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\nfunction evalResultToCaptured(\n expression: string,\n result: CdpEvalResult,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n const text =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n return { expression, error: limitValueLength(text, 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\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 (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\") &&\n isPrimitive(inner.value)\n ) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n if (typeof inner.description === \"string\") {\n return buildCaptured(inner.description);\n }\n if (isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n return buildCaptured(\"undefined\");\n}\n\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\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 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\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 // Preserve richer built-in descriptions (Date/Map/Set/Promise...) if property\n // expansion only produced an empty object payload.\n if (rendered === \"{}\" && original !== \"Object\") {\n return undefined;\n }\n // For empty arrays, property expansion often only yields {\"length\":0}.\n // Convert it to [] for readability and consistency.\n if (original.startsWith(\"Array(\") && rendered === \"{\\\"length\\\":0}\") {\n return \"[]\";\n }\n return rendered;\n}\n\nasync 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\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 if (options.captures !== undefined && options.captures.length > 0) {\n captures = await Promise.all(\n options.captures.map(async (expression): Promise<CapturedExpression> => {\n try {\n const result = await evaluateOnFrame(session, top.callFrameId, expression);\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n return await withSerializedObjectCapture(\n session,\n expression,\n result,\n captured,\n maxValueLength,\n );\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { expression, error: limitValueLength(message, maxValueLength) };\n }\n }),\n );\n }\n }\n return {\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n ...(topFrame === undefined ? {} : { topFrame }),\n captures,\n };\n}\n\nexport const internalsForTesting = {\n DEFAULT_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import { randomBytes } from \"node:crypto\";\n\nimport { removeBreakpoint, setBreakpoint } from \"./inspector.js\";\nimport type { InspectorSession } from \"./inspector.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointEvent {\n readonly ts: string;\n readonly at: string;\n readonly value?: string;\n readonly error?: string;\n readonly raw?: string;\n}\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly signal?: AbortSignal;\n readonly onEvent: (event: LogpointEvent) => void;\n /**\n * Fires once, immediately after `Debugger.setBreakpointByUrl` returns, with\n * the resolved breakpoint handle. Useful for surfacing warnings such as a BP\n * that did not bind to any script — the caller can warn the user before\n * the stream window elapses.\n */\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n /** Emitted log count, including parse errors that kept the sentinel. */\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\";\n}\n\n/**\n * Serialize a CDP-side IIFE that runs the user's expression as a \"logpoint\":\n * never pauses (always returns false), tags each emitted log with a unique\n * sentinel so we can distinguish our logs from app traffic, and wraps both the\n * user expression and JSON.stringify in try/catch so a thrown expression still\n * surfaces an error event instead of silently breaking the breakpoint.\n *\n * Exported for unit testing — the wire format is part of the contract.\n */\nexport function buildLogpointCondition(sentinel: string, expression: string): string {\n // sentinel embedded as a JS string literal; expression wrapped in parens.\n // The IIFE returns false so V8 never pauses the inspectee.\n return [\n \"(function(){\",\n `var s=${JSON.stringify(sentinel)};`,\n \"try{\",\n `var v=(${expression});`,\n \"var r=typeof v==='string'?v:JSON.stringify(v);\",\n \"console.log(s, r);\",\n \"}catch(e){\",\n \"console.log(s, '!err:'+(e&&e.message?e.message:String(e)));\",\n \"}\",\n \"return false;\",\n \"})()\",\n ].join(\"\");\n}\n\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\ninterface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readArg(arg: unknown, index: number): string | undefined {\n if (typeof arg !== \"object\" || arg === null) {\n return undefined;\n }\n const candidate = arg as CdpRemoteObject;\n if (candidate.type === \"string\" && typeof candidate.value === \"string\") {\n return candidate.value;\n }\n // Other primitives — coerce via String() only on confirmed-primitive types.\n const isPrimitiveType =\n candidate.type === \"number\" ||\n candidate.type === \"boolean\" ||\n candidate.type === \"bigint\";\n const isPrimitiveValue =\n typeof candidate.value === \"number\" ||\n typeof candidate.value === \"boolean\" ||\n typeof candidate.value === \"bigint\";\n if (isPrimitiveType && isPrimitiveValue) {\n return String(candidate.value);\n }\n // For first arg, only string sentinel matters; for second we handle below.\n return index === 0 ? undefined : \"\";\n}\n\nfunction parseLogEvent(\n rawArgs: unknown,\n sentinel: string,\n location: BreakpointLocation,\n timestamp: number | undefined,\n): LogpointEvent | undefined {\n if (!Array.isArray(rawArgs) || rawArgs.length < 2) {\n return undefined;\n }\n const tag = readArg(rawArgs[0], 0);\n if (tag !== sentinel) {\n return undefined;\n }\n const payload = readArg(rawArgs[1], 1) ?? \"\";\n const ts = new Date(typeof timestamp === \"number\" ? timestamp : Date.now()).toISOString();\n const at = `${location.file}:${location.line.toString()}`;\n if (payload.startsWith(\"!err:\")) {\n return { ts, at, error: payload.slice(\"!err:\".length) };\n }\n // Distinguish JSON-encoded vs already-string values by trying to parse;\n // unparseable strings are emitted as raw to preserve whatever the user logged.\n try {\n const parsed: unknown = JSON.parse(payload);\n if (typeof parsed === \"string\") {\n return { ts, at, value: parsed };\n }\n return { ts, at, value: JSON.stringify(parsed) };\n } catch {\n return { ts, at, value: payload, raw: payload };\n }\n}\n\nfunction generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression);\n\n // Attach the consoleAPICalled listener BEFORE setBreakpoint. CDP messages\n // travel on a single WebSocket; if we set the BP first, a fast inspectee\n // (e.g. setInterval 200ms) can fire the BP and emit consoleAPICalled before\n // we get a chance to subscribe — those events would be silently dropped.\n // The sentinel filter is generated up front so attaching early is safe.\n let emitted = 0;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n const event = parseLogEvent(params.args, sentinel, options.location, ts);\n if (event === undefined) {\n return;\n }\n emitted += 1;\n options.onEvent(event);\n });\n\n let handle: BreakpointHandle;\n try {\n handle = await setBreakpoint(session, {\n file: options.location.file,\n line: options.location.line,\n ...(options.remoteRoot === undefined ? {} : { remoteRoot: options.remoteRoot }),\n condition,\n });\n } catch (err: unknown) {\n offEvent();\n throw err;\n }\n options.onBreakpointSet?.(handle);\n\n const cleanup = async (): Promise<void> => {\n offEvent();\n try {\n await removeBreakpoint(session, handle.breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n };\n\n try {\n const reason = await waitForStop(session, options);\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n await cleanup();\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult[\"stoppedReason\"]> {\n return await new Promise<LogpointStreamResult[\"stoppedReason\"]>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStreamResult[\"stoppedReason\"]): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(reason);\n };\n const timer = options.durationMs === undefined\n ? undefined\n : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const offClose = session.client.onClose(() => {\n finish(\"transport-closed\");\n });\n const onAbort = (): void => {\n finish(\"signal\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n finish(\"signal\");\n }\n function cleanup(): void {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n}\n\nexport const internalsForTesting = {\n buildLogpointCondition,\n parseLogEvent,\n generateSentinel,\n SENTINEL_PREFIX,\n};\n","import { 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":["out","asString"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saptools/cf-inspector",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.16",
|
|
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": {
|