@descryy/runtime-orchestrator 0.5.0 → 0.5.2

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.
Files changed (47) hide show
  1. package/dist/attach-log-sources.d.ts +12 -2
  2. package/dist/attach-log-sources.d.ts.map +1 -1
  3. package/dist/attach-log-sources.js +132 -26
  4. package/dist/attach-log-sources.js.map +1 -1
  5. package/dist/attach-to-running-jvm-process.d.ts.map +1 -1
  6. package/dist/attach-to-running-jvm-process.js +129 -37
  7. package/dist/attach-to-running-jvm-process.js.map +1 -1
  8. package/dist/attach-to-running-node-process.d.ts +2 -0
  9. package/dist/attach-to-running-node-process.d.ts.map +1 -1
  10. package/dist/attach-to-running-node-process.js +222 -27
  11. package/dist/attach-to-running-node-process.js.map +1 -1
  12. package/dist/attach-to-running-process.d.ts +2 -0
  13. package/dist/attach-to-running-process.d.ts.map +1 -1
  14. package/dist/attach-to-running-process.js +62 -12
  15. package/dist/attach-to-running-process.js.map +1 -1
  16. package/dist/cdp-client.d.ts +7 -1
  17. package/dist/cdp-client.d.ts.map +1 -1
  18. package/dist/cdp-client.js +83 -7
  19. package/dist/cdp-client.js.map +1 -1
  20. package/dist/cgroup-partial-restriction.d.ts.map +1 -1
  21. package/dist/cgroup-partial-restriction.js +4 -1
  22. package/dist/cgroup-partial-restriction.js.map +1 -1
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/instrumented-execution.d.ts +2 -0
  28. package/dist/instrumented-execution.d.ts.map +1 -1
  29. package/dist/instrumented-execution.js +136 -14
  30. package/dist/instrumented-execution.js.map +1 -1
  31. package/dist/jvm-agent/build.d.ts +2 -2
  32. package/dist/jvm-agent/build.d.ts.map +1 -1
  33. package/dist/jvm-agent/build.js +46 -17
  34. package/dist/jvm-agent/build.js.map +1 -1
  35. package/dist/polling-output-source.d.ts +16 -6
  36. package/dist/polling-output-source.d.ts.map +1 -1
  37. package/dist/polling-output-source.js +38 -22
  38. package/dist/polling-output-source.js.map +1 -1
  39. package/dist/profile-backend-observation.d.ts +7 -0
  40. package/dist/profile-backend-observation.d.ts.map +1 -1
  41. package/dist/profile-backend-observation.js +87 -25
  42. package/dist/profile-backend-observation.js.map +1 -1
  43. package/dist/respawn-and-supervise.d.ts +1 -0
  44. package/dist/respawn-and-supervise.d.ts.map +1 -1
  45. package/dist/respawn-and-supervise.js +29 -1
  46. package/dist/respawn-and-supervise.js.map +1 -1
  47. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"attach-to-running-node-process.d.ts","sourceRoot":"","sources":["../src/attach-to-running-node-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAyG,MAAM,4BAA4B,CAAC;AAsCnK,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uIAAuI;IACvI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,mGAAmG;IACnG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kKAAkK;IAClK,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,mIAAmI;IACnI,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAOD;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5F,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAsED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iCAAiC,GAAG,SAAS,CAmHhG"}
1
+ {"version":3,"file":"attach-to-running-node-process.d.ts","sourceRoot":"","sources":["../src/attach-to-running-node-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAyG,MAAM,4BAA4B,CAAC;AAyEnK,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uIAAuI;IACvI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,mGAAmG;IACnG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kKAAkK;IAClK,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,mIAAmI;IACnI,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAClD;AAOD;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GACrI,OAAO,CAAC,MAAM,CAAC,CA4DjB;AAyJD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iCAAiC,GAAG,SAAS,CAwKhG"}
@@ -37,7 +37,11 @@
37
37
  * observed, not the mechanism). `capabilities()` reports `backendLogAccess`, not
38
38
  * `consoleObservation` (reserved for a browser page's console).
39
39
  */
40
- import { spawnSync } from "node:child_process";
40
+ import { execFile } from "node:child_process";
41
+ import { readlinkSync } from "node:fs";
42
+ import { basename } from "node:path";
43
+ import { promisify } from "node:util";
44
+ import { findPortOwner } from "@descryy/runtime-controller";
41
45
  import { connectCdp } from "./cdp-client.js";
42
46
  import { isProcessAlive } from "./attach-to-running-process.js";
43
47
  import { COLLECTOR_VERSION } from "./collector-version.js";
@@ -54,23 +58,59 @@ import { COLLECTOR_VERSION } from "./collector-version.js";
54
58
  * other, so this check is the only backstop for `SIGUSR1` — unlike HotSpot's
55
59
  * attach socket (the JVM sibling), which enforces uid at the OS level itself.
56
60
  */
57
- function verifyLikelyNodeProcessOwnedBySelf(pid) {
58
- const result = spawnSync("ps", ["-o", "uid=,comm=", "-p", String(pid)], { encoding: "utf8" });
59
- const line = (result.stdout ?? "").trim().split("\n")[0]?.trim();
60
- if (result.status !== 0 || line === undefined || line === "") {
61
- return { ok: false, reason: `could not verify pid ${String(pid)}'s owner/command via ps (exit ${String(result.status)}) — refusing to signal a process this module cannot confirm the identity of` };
61
+ const execFileAsync = promisify(execFile);
62
+ const PS_TIMEOUT_MS = 5_000;
63
+ const NODE_EXECUTABLE_NAME = /^(?:node|nodejs)(?:\.exe)?$/;
64
+ async function psField(pid, field) {
65
+ try {
66
+ const { stdout } = await execFileAsync("ps", ["-o", `${field}=`, "-p", String(pid)], { encoding: "utf8", timeout: PS_TIMEOUT_MS });
67
+ const value = stdout.trim().split("\n")[0]?.trim() ?? "";
68
+ return value === "" ? { ok: false, detail: "ps printed nothing" } : { ok: true, value };
69
+ }
70
+ catch (error) {
71
+ return { ok: false, detail: error instanceof Error ? error.message : String(error) };
72
+ }
73
+ }
74
+ function executableNameFromProc(pid) {
75
+ if (process.platform !== "linux")
76
+ return null;
77
+ try {
78
+ return basename(readlinkSync(`/proc/${String(pid)}/exe`).replace(/ \(deleted\)$/, ""));
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
84
+ function invalidTargetPidReason(pid) {
85
+ if (!Number.isSafeInteger(pid))
86
+ return `${String(pid)} is not a whole number`;
87
+ if (pid === 1)
88
+ return "pid 1 is the init process, which belongs to a different user than this process and must never be signalled";
89
+ if (pid < 1)
90
+ return `${String(pid)} is not a process id (0 and negative values address process groups)`;
91
+ if (pid === process.pid || pid === process.ppid)
92
+ return `pid ${String(pid)} is this process or its parent, which must never be the target of an attach`;
93
+ return null;
94
+ }
95
+ async function verifyLikelyNodeProcessOwnedBySelf(pid) {
96
+ const owner = await psField(pid, "uid");
97
+ const command = await psField(pid, "comm");
98
+ const startedAt = await psField(pid, "lstart");
99
+ const failed = [owner, command, startedAt].find((answer) => !answer.ok);
100
+ if (failed !== undefined || !owner.ok || !command.ok || !startedAt.ok) {
101
+ const detail = failed !== undefined && !failed.ok ? failed.detail : "ps gave no answer";
102
+ return { ok: false, reason: `could not verify pid ${String(pid)}'s owner/command via ps (${detail}) — refusing to signal a process this module cannot confirm the identity of` };
62
103
  }
63
- const [uidField, ...commFields] = line.split(/\s+/);
64
- const uid = Number(uidField);
65
- const comm = commFields.join(" ").toLowerCase();
104
+ const uid = Number(owner.value);
66
105
  const ownUid = process.getuid?.();
67
106
  if (ownUid !== undefined && uid !== ownUid) {
68
107
  return { ok: false, reason: `pid ${String(pid)} is owned by uid ${String(uid)}, not this process's own uid ${String(ownUid)} — refusing to signal a process this session does not own` };
69
108
  }
70
- if (!comm.includes("node")) {
71
- return { ok: false, reason: `pid ${String(pid)}'s command is "${comm}", which does not look like a Node process — refusing to send SIGUSR1 to a process that may not handle it` };
109
+ const executable = executableNameFromProc(pid) ?? basename(command.value);
110
+ if (!NODE_EXECUTABLE_NAME.test(executable.toLowerCase())) {
111
+ return { ok: false, reason: `pid ${String(pid)}'s executable is "${executable}", which does not look like a Node process (expected node or nodejs) — refusing to send SIGUSR1 to a process that may not handle it` };
72
112
  }
73
- return { ok: true };
113
+ return { ok: true, startedAt: startedAt.value };
74
114
  }
75
115
  /**
76
116
  * Sends `SIGUSR1` to `pid`, then polls `http://<host>:<port>/json` until the
@@ -82,6 +122,10 @@ function verifyLikelyNodeProcessOwnedBySelf(pid) {
82
122
  * non-POSIX platform, or a port that never answers (see module doc).
83
123
  */
84
124
  export async function discoverNodeInspectorUrl(pid, options = {}) {
125
+ const invalidPid = invalidTargetPidReason(pid);
126
+ if (invalidPid !== null) {
127
+ throw new Error(`discoverNodeInspectorUrl: ${invalidPid}.`);
128
+ }
85
129
  if (!isProcessAlive(pid)) {
86
130
  throw new Error(`discoverNodeInspectorUrl: pid ${String(pid)} is not running — cannot attach to a target that does not exist.`);
87
131
  }
@@ -89,7 +133,7 @@ export async function discoverNodeInspectorUrl(pid, options = {}) {
89
133
  throw new Error("discoverNodeInspectorUrl: SIGUSR1 inspector activation is POSIX-only; not available on win32.");
90
134
  }
91
135
  // A-F10: verified BEFORE the signal — a wrong pid must never reach process.kill
92
- const identity = verifyLikelyNodeProcessOwnedBySelf(pid);
136
+ const identity = await verifyLikelyNodeProcessOwnedBySelf(pid);
93
137
  if (!identity.ok) {
94
138
  throw new Error(`discoverNodeInspectorUrl: ${identity.reason}.`);
95
139
  }
@@ -97,6 +141,10 @@ export async function discoverNodeInspectorUrl(pid, options = {}) {
97
141
  const port = options.port ?? 9229;
98
142
  const timeoutMs = options.timeoutMs ?? 5000;
99
143
  const discoveryUrl = `http://${host}:${String(port)}/json`;
144
+ const stillSameProcess = await psField(pid, "lstart");
145
+ if (!stillSameProcess.ok || stillSameProcess.value !== identity.startedAt) {
146
+ throw new Error(`discoverNodeInspectorUrl: pid ${String(pid)} stopped being the process that was verified (it exited or its pid was reused) — SIGUSR1 was not sent.`);
147
+ }
100
148
  process.kill(pid, "SIGUSR1");
101
149
  const deadline = Date.now() + timeoutMs;
102
150
  let lastError = null;
@@ -105,15 +153,20 @@ export async function discoverNodeInspectorUrl(pid, options = {}) {
105
153
  throw new Error(`discoverNodeInspectorUrl: pid ${String(pid)} exited while waiting for its inspector to come up.`);
106
154
  }
107
155
  try {
108
- const response = await fetch(discoveryUrl);
156
+ const attemptMs = Math.max(1, Math.min(DISCOVERY_ATTEMPT_TIMEOUT_MS, deadline - Date.now()));
157
+ const response = await fetch(discoveryUrl, { signal: AbortSignal.timeout(attemptMs) });
109
158
  if (response.ok) {
110
159
  const targets = (await response.json());
111
160
  const target = targets.find((candidate) => candidate.webSocketDebuggerUrl !== undefined);
112
- if (target?.webSocketDebuggerUrl !== undefined)
161
+ if (target?.webSocketDebuggerUrl !== undefined) {
162
+ assertInspectorBelongsToTarget(pid, host, port, target.webSocketDebuggerUrl, options.allowUnverifiedOwner === true);
113
163
  return target.webSocketDebuggerUrl;
164
+ }
114
165
  }
115
166
  }
116
167
  catch (error) {
168
+ if (error instanceof InspectorOwnershipError)
169
+ throw error;
117
170
  lastError = error;
118
171
  }
119
172
  await new Promise((resolve) => setTimeout(resolve, 50));
@@ -124,6 +177,41 @@ export async function discoverNodeInspectorUrl(pid, options = {}) {
124
177
  "process, or the target was itself configured with --inspect-port/NODE_OPTIONS) — this module cannot discover a " +
125
178
  "non-default port from outside; a caller who knows the real port must supply discoveryPort.");
126
179
  }
180
+ class InspectorOwnershipError extends Error {
181
+ }
182
+ function assertInspectorBelongsToTarget(pid, host, port, webSocketUrl, allowUnverifiedOwner) {
183
+ let socketUrl;
184
+ try {
185
+ socketUrl = new URL(webSocketUrl);
186
+ }
187
+ catch {
188
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: the inspector at ${host}:${String(port)} returned a WebSocket address that is not a URL, so it was not connected to.`);
189
+ }
190
+ const reportedHost = socketUrl.hostname.replace(/^\[|\]$/g, "");
191
+ const askedHost = host.replace(/^\[|\]$/g, "");
192
+ const reportedPort = socketUrl.port === "" ? "80" : socketUrl.port;
193
+ if ((socketUrl.protocol !== "ws:" && socketUrl.protocol !== "wss:") || reportedHost !== askedHost || reportedPort !== String(port)) {
194
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: the inspector at ${host}:${String(port)} pointed at ${socketUrl.protocol}//${socketUrl.host} instead, so it was not connected to (an inspector may only name its own address).`);
195
+ }
196
+ const owner = findPortOwner(port);
197
+ if (owner.outcome === "found") {
198
+ if (owner.pid === pid)
199
+ return;
200
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: the inspector answering on ${host}:${String(port)} belongs to pid ${String(owner.pid)}, not the target pid ${String(pid)} (another debug session already held that port), so it was not attached to; pass discoveryPort for the port the target really bound.`);
201
+ }
202
+ if (owner.outcome === "several-owners") {
203
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: several processes (${owner.pids.join(", ")}) listen on port ${String(port)}, so the inspector cannot be attributed to pid ${String(pid)}.`);
204
+ }
205
+ if (owner.outcome === "nothing-listening") {
206
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: nothing was listening on port ${String(port)} when its owner was checked, so the inspector cannot be attributed to pid ${String(pid)}.`);
207
+ }
208
+ if (owner.outcome === "owned-by-docker-proxy") {
209
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: port ${String(port)} is held by a docker-proxy (pid ${String(owner.pid)}), not by pid ${String(pid)}.`);
210
+ }
211
+ if (!allowUnverifiedOwner) {
212
+ throw new InspectorOwnershipError(`discoverNodeInspectorUrl: who owns the inspector on port ${String(port)} could not be established (${owner.reason}), so attach was refused; set allowUnverifiedInspectorOwner to attach anyway.`);
213
+ }
214
+ }
127
215
  /** Decodes a `file://` URL to a plain filesystem path, matching every other adapter's convention. Anything else is passed through verbatim. */
128
216
  function pathFromCdpUrl(url) {
129
217
  if (url === undefined || url === "")
@@ -149,11 +237,50 @@ function locationFromCallFrame(frame) {
149
237
  resolvedVia: null,
150
238
  };
151
239
  }
240
+ function isRecord(value) {
241
+ return typeof value === "object" && value !== null && !Array.isArray(value);
242
+ }
243
+ function textOrUndefined(value) {
244
+ return typeof value === "string" ? value : undefined;
245
+ }
246
+ function numberOrUndefined(value) {
247
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
248
+ }
249
+ function remoteObjectFrom(value) {
250
+ if (!isRecord(value))
251
+ return {};
252
+ const type = textOrUndefined(value["type"]);
253
+ const description = textOrUndefined(value["description"]);
254
+ return { ...(type === undefined ? {} : { type }), ...(value["value"] === undefined ? {} : { value: value["value"] }), ...(description === undefined ? {} : { description }) };
255
+ }
256
+ function callFramesFrom(value) {
257
+ if (!Array.isArray(value))
258
+ return [];
259
+ return value.filter(isRecord).map((frame) => {
260
+ const functionName = textOrUndefined(frame["functionName"]);
261
+ return {
262
+ ...(functionName === undefined ? {} : { functionName }),
263
+ url: textOrUndefined(frame["url"]),
264
+ lineNumber: numberOrUndefined(frame["lineNumber"]),
265
+ columnNumber: numberOrUndefined(frame["columnNumber"]),
266
+ };
267
+ });
268
+ }
269
+ function printable(value) {
270
+ if (typeof value === "string")
271
+ return value;
272
+ try {
273
+ return JSON.stringify(value) ?? String(value);
274
+ }
275
+ catch {
276
+ return String(value);
277
+ }
278
+ }
152
279
  function formatConsoleArgs(args) {
153
280
  return args
154
281
  .map((arg) => {
155
282
  if (arg.value !== undefined)
156
- return typeof arg.value === "string" ? arg.value : JSON.stringify(arg.value);
283
+ return printable(arg.value);
157
284
  if (arg.description !== undefined)
158
285
  return arg.description;
159
286
  return `<${arg.type ?? "unknown"}>`;
@@ -163,6 +290,7 @@ function formatConsoleArgs(args) {
163
290
  function notThisCollectorsJob(what) {
164
291
  return { availability: "unavailable", reason: `attachToRunningNodeProcess observes a Node process's Runtime domain (console, exceptions) only, not ${what}.` };
165
292
  }
293
+ const DISCOVERY_ATTEMPT_TIMEOUT_MS = 1_000;
166
294
  const CAPABILITIES = {
167
295
  domObservation: notThisCollectorsJob("DOM inspection"),
168
296
  // reserved for a browser page's console; this is a backend process's, reported
@@ -193,6 +321,8 @@ const CAPABILITIES = {
193
321
  */
194
322
  export function attachToRunningNodeProcess(options) {
195
323
  let session = null;
324
+ let inspectorLeftOpen = null;
325
+ let stopped = false;
196
326
  return {
197
327
  collectorId: `attach-node-inspector:${options.processId}`,
198
328
  async start(context) {
@@ -202,13 +332,45 @@ export function attachToRunningNodeProcess(options) {
202
332
  ...(options.discoveryHost !== undefined ? { host: options.discoveryHost } : {}),
203
333
  ...(options.discoveryPort !== undefined ? { port: options.discoveryPort } : {}),
204
334
  ...(options.discoveryTimeoutMs !== undefined ? { timeoutMs: options.discoveryTimeoutMs } : {}),
335
+ ...(options.allowUnverifiedInspectorOwner === true ? { allowUnverifiedOwner: true } : {}),
205
336
  });
206
337
  }
207
338
  catch (error) {
208
339
  return { available: false, reason: error instanceof Error ? error.message : String(error) };
209
340
  }
341
+ stopped = false;
342
+ const reportEventProblem = (method, error) => {
343
+ if (stopped)
344
+ return;
345
+ try {
346
+ context.emit({
347
+ timestamp: new Date().toISOString(),
348
+ source: "backend-process",
349
+ service: options.service ?? null,
350
+ process: options.processId,
351
+ eventType: "COLLECTOR_ERROR",
352
+ payload: {
353
+ raw: `attach-node-inspector for process "${options.processId}" could not handle a ${method} event: ${error instanceof Error ? error.message : String(error)}`,
354
+ collectorId: `attach-node-inspector:${options.processId}`,
355
+ error: error instanceof Error ? error.message : String(error),
356
+ },
357
+ traceId: null,
358
+ requestId: null,
359
+ correlationId: null,
360
+ graphNodeId: null,
361
+ sourceLocation: null,
362
+ stackTrace: null,
363
+ confidence: 1,
364
+ redactionStatus: "pending-redaction",
365
+ collectorVersion: COLLECTOR_VERSION,
366
+ });
367
+ }
368
+ catch (emitError) {
369
+ console.error(`[attach-node-inspector:${options.processId}] ${method} handling failed (${String(error)}) and the failure could not be emitted: ${String(emitError)}`);
370
+ }
371
+ };
210
372
  try {
211
- session = await connectCdp(webSocketDebuggerUrl);
373
+ session = await connectCdp(webSocketDebuggerUrl, { onHandlerError: reportEventProblem });
212
374
  }
213
375
  catch (error) {
214
376
  return {
@@ -216,16 +378,30 @@ export function attachToRunningNodeProcess(options) {
216
378
  reason: `attachToRunningNodeProcess: found the inspector but could not open a CDP connection to it: ${error instanceof Error ? error.message : String(error)}`,
217
379
  };
218
380
  }
219
- await session.send("Runtime.enable");
381
+ try {
382
+ await session.send("Runtime.enable");
383
+ }
384
+ catch (error) {
385
+ session.close();
386
+ session = null;
387
+ return {
388
+ available: false,
389
+ reason: `attachToRunningNodeProcess: connected to the inspector but it did not enable the Runtime domain: ${error instanceof Error ? error.message : String(error)}`,
390
+ };
391
+ }
392
+ inspectorLeftOpen = new URL(webSocketDebuggerUrl).host;
220
393
  session.on("Runtime.consoleAPICalled", (params) => {
221
- const p = params;
394
+ if (stopped)
395
+ return;
396
+ const level = textOrUndefined(params["type"]);
397
+ const args = Array.isArray(params["args"]) ? params["args"].map(remoteObjectFrom) : [];
222
398
  context.emit({
223
399
  timestamp: new Date().toISOString(),
224
400
  source: "backend-process",
225
401
  service: options.service ?? null,
226
402
  process: options.processId,
227
403
  eventType: "CONSOLE_MESSAGE",
228
- payload: { level: p.type ?? "log", text: formatConsoleArgs(p.args ?? []) },
404
+ payload: { level: level ?? "log", text: formatConsoleArgs(args) },
229
405
  traceId: null,
230
406
  requestId: null,
231
407
  correlationId: null,
@@ -238,15 +414,24 @@ export function attachToRunningNodeProcess(options) {
238
414
  });
239
415
  });
240
416
  session.on("Runtime.exceptionThrown", (params) => {
241
- const p = params;
242
- const details = p.exceptionDetails ?? {};
243
- const description = details.exception?.description;
417
+ if (stopped)
418
+ return;
419
+ const rawDetails = isRecord(params["exceptionDetails"]) ? params["exceptionDetails"] : {};
420
+ const details = {
421
+ text: textOrUndefined(rawDetails["text"]),
422
+ url: textOrUndefined(rawDetails["url"]),
423
+ lineNumber: numberOrUndefined(rawDetails["lineNumber"]),
424
+ columnNumber: numberOrUndefined(rawDetails["columnNumber"]),
425
+ exception: remoteObjectFrom(rawDetails["exception"]),
426
+ callFrames: callFramesFrom(isRecord(rawDetails["stackTrace"]) ? rawDetails["stackTrace"]["callFrames"] : undefined),
427
+ };
428
+ const description = details.exception.description;
244
429
  const message = description !== undefined
245
430
  ? (description.split("\n")[0] ?? description)
246
- : details.exception?.value !== undefined
247
- ? String(details.exception.value)
431
+ : details.exception.value !== undefined
432
+ ? printable(details.exception.value)
248
433
  : (details.text ?? "Uncaught exception");
249
- const callFrames = details.stackTrace?.callFrames ?? [];
434
+ const callFrames = details.callFrames;
250
435
  const frames = callFrames.map((frame) => ({ location: locationFromCallFrame(frame), raw: `${frame.functionName ?? "<anonymous>"} (${frame.url ?? ""}:${String(frame.lineNumber)}:${String(frame.columnNumber)})` }));
251
436
  // no frames from CDP: fall back to the throw site itself as a synthetic
252
437
  // one-frame trace rather than discarding it
@@ -278,12 +463,22 @@ export function attachToRunningNodeProcess(options) {
278
463
  return { available: true };
279
464
  },
280
465
  stop() {
466
+ stopped = true;
281
467
  session?.close();
282
468
  session = null;
283
469
  return Promise.resolve();
284
470
  },
285
471
  capabilities() {
286
- return CAPABILITIES;
472
+ if (inspectorLeftOpen === null)
473
+ return CAPABILITIES;
474
+ return {
475
+ ...CAPABILITIES,
476
+ backendLogAccess: {
477
+ availability: "available",
478
+ reason: `the target's inspector, switched on with SIGUSR1 to attach, keeps listening on ${inspectorLeftOpen} after this run: ` +
479
+ "attach mode runs no code in the target, so it cannot switch it off. Restart the process to close it.",
480
+ },
481
+ };
287
482
  },
288
483
  };
289
484
  }
@@ -1 +1 @@
1
- {"version":3,"file":"attach-to-running-node-process.js","sourceRoot":"","sources":["../src/attach-to-running-node-process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attach-to-running-node-process.js","sourceRoot":"","sources":["../src/attach-to-running-node-process.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,8 @@ export interface AttachToRunningProcessOptions {
41
41
  */
42
42
  readonly stopObserving: () => boolean;
43
43
  readonly pollIntervalMs?: number;
44
+ /** Most bytes of the log's existing backlog read at attach; an older span is skipped and disclosed as a gap. Defaults to `DEFAULT_ATTACH_LOG_BACKLOG_CAP_BYTES`. */
45
+ readonly maxBacklogBytes?: number;
44
46
  }
45
47
  /**
46
48
  * `process.kill(pid, 0)` sends no signal — it only asks the kernel whether
@@ -1 +1 @@
1
- {"version":3,"file":"attach-to-running-process.d.ts","sourceRoot":"","sources":["../src/attach-to-running-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAInF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2HAA2H;IAC3H,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2LAA2L;IAC3L,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,2BAA2B,CAkC1G"}
1
+ {"version":3,"file":"attach-to-running-process.d.ts","sourceRoot":"","sources":["../src/attach-to-running-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAKL,KAAK,WAAW,EAEjB,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2HAA2H;IAC3H,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2LAA2L;IAC3L,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,oKAAoK;IACpK,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAuDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,2BAA2B,CAmC1G"}
@@ -17,8 +17,9 @@
17
17
  * with this pid exists, not that it's the one the caller thinks — pids are reused.
18
18
  * Disclosed, not solved, same as `readiness.ts`.
19
19
  */
20
- import { readFileSync } from "node:fs";
21
- import { computeAttachFence } from "@descryy/runtime-controller";
20
+ import { closeSync, readSync } from "node:fs";
21
+ import { StringDecoder } from "node:string_decoder";
22
+ import { assertTargetPid, computeAttachFence, openAttachLogFile, resolveAttachLogPath, } from "@descryy/runtime-controller";
22
23
  import { createPollingProcessOutputSource } from "./polling-output-source.js";
23
24
  /**
24
25
  * `process.kill(pid, 0)` sends no signal — it only asks the kernel whether
@@ -27,6 +28,8 @@ import { createPollingProcessOutputSource } from "./polling-output-source.js";
27
28
  * purpose. Any other error is treated as "exists" rather than guessed away.
28
29
  */
29
30
  export function isProcessAlive(pid) {
31
+ if (!Number.isSafeInteger(pid) || pid <= 0)
32
+ return false;
30
33
  try {
31
34
  process.kill(pid, 0);
32
35
  return true;
@@ -35,6 +38,51 @@ export function isProcessAlive(pid) {
35
38
  return error.code === "EPERM";
36
39
  }
37
40
  }
41
+ const READ_CHUNK_BYTES = 1024 * 1024;
42
+ const MAX_BYTES_PER_POLL = 4 * 1024 * 1024;
43
+ function createIncrementalLogReader(input) {
44
+ let fileOffset = input.startOffset;
45
+ let unreportedSkippedBytes = input.skippedBacklogBytes;
46
+ let fileIdentity = null;
47
+ let consumedChars = 0;
48
+ let chunk = null;
49
+ const decoder = new StringDecoder("utf8");
50
+ return (cursor) => {
51
+ if (cursor !== consumedChars) {
52
+ throw new RangeError(`attachToRunningProcess: asked to continue from character ${String(cursor)} but ${String(consumedChars)} have been consumed`);
53
+ }
54
+ const opened = openAttachLogFile(input.logFilePath);
55
+ if (!opened.ok) {
56
+ throw new Error(`attachToRunningProcess: could not read log file "${input.logFilePath}" for pid ${String(input.pid)}: ${opened.reason}`);
57
+ }
58
+ try {
59
+ const replaced = fileIdentity !== null && opened.inode !== fileIdentity;
60
+ if (opened.size < fileOffset || (replaced && fileOffset > 0)) {
61
+ throw new Error(`attachToRunningProcess: log file "${input.logFilePath}" for pid ${String(input.pid)} shrank from ${String(fileOffset)} to ${String(opened.size)} bytes ` +
62
+ "between reads -- this looks like log rotation or truncation, not new output. This source slices forward from a consumed offset and cannot " +
63
+ "reconstruct a truncated or rotated file without either duplicating or dropping lines. Reported rather than guessed.");
64
+ }
65
+ fileIdentity = opened.inode;
66
+ chunk ??= Buffer.allocUnsafe(READ_CHUNK_BYTES);
67
+ const limit = Math.min(opened.size, fileOffset + MAX_BYTES_PER_POLL);
68
+ let text = "";
69
+ while (fileOffset < limit) {
70
+ const read = readSync(opened.descriptor, chunk, 0, Math.min(chunk.length, limit - fileOffset), fileOffset);
71
+ if (read === 0)
72
+ break;
73
+ fileOffset += read;
74
+ text += decoder.write(chunk.subarray(0, read));
75
+ }
76
+ consumedChars += text.length;
77
+ const droppedChars = unreportedSkippedBytes;
78
+ unreportedSkippedBytes = 0;
79
+ return { text, cursor: consumedChars, droppedChars };
80
+ }
81
+ finally {
82
+ closeSync(opened.descriptor);
83
+ }
84
+ };
85
+ }
38
86
  /**
39
87
  * Attach to an already-running process via a log file it is already writing to.
40
88
  * Throws immediately if the pid isn't alive — refuses rather than returning a
@@ -55,24 +103,26 @@ export function isProcessAlive(pid) {
55
103
  * forever, or a dead one polls until the caller notices.
56
104
  */
57
105
  export function attachToRunningProcess(options) {
106
+ assertTargetPid(options.pid, { allowOwnProcess: true });
58
107
  if (!isProcessAlive(options.pid)) {
59
108
  throw new Error(`attachToRunningProcess: pid ${options.pid} for "${options.processId}" is not running — attach requires ` +
60
109
  `a target that already exists. Use ExecutionController.run() to spawn a new process instead.`);
61
110
  }
62
- const attachFence = computeAttachFence(options.pid, options.logFilePath);
111
+ const resolution = resolveAttachLogPath(options.logFilePath);
112
+ if (!resolution.ok) {
113
+ throw new Error(`attachToRunningProcess: log file refused for "${options.processId}": ${resolution.reason}`);
114
+ }
115
+ const attachFence = computeAttachFence(options.pid, options.logFilePath, process.platform, options.maxBacklogBytes);
63
116
  const source = createPollingProcessOutputSource({
64
117
  processId: options.processId,
65
118
  // an ad-hoc attach may have no declared service; null is the honest answer
66
119
  serviceName: options.serviceName ?? null,
67
- readOutput: () => {
68
- try {
69
- return readFileSync(options.logFilePath, "utf8");
70
- }
71
- catch (error) {
72
- const detail = error instanceof Error ? error.message : String(error);
73
- throw new Error(`attachToRunningProcess: could not read log file "${options.logFilePath}" for pid ${options.pid}: ${detail}`);
74
- }
75
- },
120
+ readOutputFrom: createIncrementalLogReader({
121
+ logFilePath: options.logFilePath,
122
+ pid: options.pid,
123
+ startOffset: attachFence.backlogStartOffset,
124
+ skippedBacklogBytes: attachFence.backlogSkippedBytes,
125
+ }),
76
126
  // either reason ends the source; dropping the liveness half would leave a
77
127
  // target that dies mid-window polled until the caller noticed
78
128
  isFinished: () => options.stopObserving() || !isProcessAlive(options.pid),
@@ -1 +1 @@
1
- {"version":3,"file":"attach-to-running-process.js","sourceRoot":"","sources":["../src/attach-to-running-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,kBAAkB,EAAoB,MAAM,6BAA6B,CAAC;AAEnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AA0B9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3D,CAAC;AACH,CAAC;AAcD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,SAAS,qCAAqC;YACvG,6FAA6F,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,gCAAgC,CAAC;QAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,2EAA2E;QAC3E,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,UAAU,EAAE,GAAG,EAAE;YACf,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,MAAM,IAAI,KAAK,CACb,oDAAoD,OAAO,CAAC,WAAW,aAAa,OAAO,CAAC,GAAG,KAAK,MAAM,EAAE,CAC7G,CAAC;YACJ,CAAC;QACH,CAAC;QACD,0EAA0E;QAC1E,8DAA8D;QAC9D,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;QACzE,sEAAsE;QACtE,wDAAwD;QACxD,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;QACtD,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5F,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"attach-to-running-process.js","sourceRoot":"","sources":["../src/attach-to-running-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AA4B9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3D,CAAC;AACH,CAAC;AAcD,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AACrC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,SAAS,0BAA0B,CAAC,KAKnC;IACC,IAAI,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC;IACnC,IAAI,sBAAsB,GAAG,KAAK,CAAC,mBAAmB,CAAC;IACvD,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CAAC,4DAA4D,MAAM,CAAC,MAAM,CAAC,QAAQ,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QACrJ,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oDAAoD,KAAK,CAAC,WAAW,aAAa,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3I,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC;YACxE,IAAI,MAAM,CAAC,IAAI,GAAG,UAAU,IAAI,CAAC,QAAQ,IAAI,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CACb,qCAAqC,KAAK,CAAC,WAAW,aAAa,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;oBACvJ,4IAA4I;oBAC5I,qHAAqH,CACxH,CAAC;YACJ,CAAC;YACD,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;YAC5B,KAAK,KAAK,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAAC,CAAC;YACrE,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,OAAO,UAAU,GAAG,KAAK,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC3G,IAAI,IAAI,KAAK,CAAC;oBAAE,MAAM;gBACtB,UAAU,IAAI,IAAI,CAAC;gBACnB,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC;YAC7B,MAAM,YAAY,GAAG,sBAAsB,CAAC;YAC5C,sBAAsB,GAAG,CAAC,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,SAAS,qCAAqC;YACvG,6FAA6F,CAChG,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iDAAiD,OAAO,CAAC,SAAS,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpH,MAAM,MAAM,GAAG,gCAAgC,CAAC;QAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,2EAA2E;QAC3E,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,cAAc,EAAE,0BAA0B,CAAC;YACzC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,WAAW,EAAE,WAAW,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;SACrD,CAAC;QACF,0EAA0E;QAC1E,8DAA8D;QAC9D,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;QACzE,sEAAsE;QACtE,wDAAwD;QACxD,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;QACtD,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5F,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;AACpC,CAAC"}
@@ -19,9 +19,15 @@ export interface CdpSession {
19
19
  /** Closes the underlying WebSocket. Idempotent. Rejects every still-pending `send()`. */
20
20
  close(): void;
21
21
  }
22
+ export interface CdpConnectOptions {
23
+ readonly connectTimeoutMs?: number;
24
+ readonly commandTimeoutMs?: number;
25
+ readonly onHandlerError?: (method: string, error: unknown) => void;
26
+ readonly maxEventsPerSession?: number;
27
+ }
22
28
  /**
23
29
  * Resolves once the socket is open, or rejects if it errors/closes first —
24
30
  * so a caller never has to race `open` against `error` itself.
25
31
  */
26
- export declare function connectCdp(webSocketUrl: string): Promise<CdpSession>;
32
+ export declare function connectCdp(webSocketUrl: string, options?: CdpConnectOptions): Promise<CdpSession>;
27
33
  //# sourceMappingURL=cdp-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cdp-client.d.ts","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACzB,gKAAgK;IAChK,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChF,qHAAqH;IACrH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnF,yFAAyF;IACzF,KAAK,IAAI,IAAI,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgFpE"}
1
+ {"version":3,"file":"cdp-client.d.ts","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACzB,gKAAgK;IAChK,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChF,qHAAqH;IACrH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnF,yFAAyF;IACzF,KAAK,IAAI,IAAI,CAAC;CACf;AAQD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAOD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+IrG"}