@nntoan/bb-browser 0.13.0

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.
@@ -0,0 +1,535 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-D4HDZEJT.js";
3
+
4
+ // packages/cli/src/cdp-monitor.ts
5
+ import { createServer } from "http";
6
+ import { request as httpRequest } from "http";
7
+ import { mkdir, writeFile, unlink } from "fs/promises";
8
+ import os from "os";
9
+ import path from "path";
10
+ import WebSocket from "ws";
11
+
12
+ // packages/cli/src/cdp-monitor-state.ts
13
+ function normalizeHeaders(headers) {
14
+ if (!headers || typeof headers !== "object") return void 0;
15
+ return Object.fromEntries(
16
+ Object.entries(headers).map(([key, value]) => [key, String(value)])
17
+ );
18
+ }
19
+ var MonitorState = class {
20
+ networkRequests = /* @__PURE__ */ new Map();
21
+ networkEnabled = false;
22
+ consoleMessages = [];
23
+ consoleEnabled = false;
24
+ jsErrors = [];
25
+ errorsEnabled = false;
26
+ traceRecording = false;
27
+ traceEvents = [];
28
+ /**
29
+ * Feed a CDP session event (from any attached target) into the monitor
30
+ * state. The method + params mirror what cdp-client.ts handles inside
31
+ * its own handleSessionEvent, but without any connection‐specific logic
32
+ * (dialog handling, etc.) that the monitor does not need.
33
+ */
34
+ handleSessionEvent(method, params) {
35
+ if (method === "Network.requestWillBeSent") {
36
+ const requestId = typeof params.requestId === "string" ? params.requestId : void 0;
37
+ const request = params.request;
38
+ if (!requestId || !request) return;
39
+ this.networkRequests.set(requestId, {
40
+ requestId,
41
+ url: String(request.url ?? ""),
42
+ method: String(request.method ?? "GET"),
43
+ type: String(params.type ?? "Other"),
44
+ timestamp: Math.round(Number(params.timestamp ?? Date.now()) * 1e3),
45
+ requestHeaders: normalizeHeaders(request.headers),
46
+ requestBody: typeof request.postData === "string" ? request.postData : void 0
47
+ });
48
+ return;
49
+ }
50
+ if (method === "Network.responseReceived") {
51
+ const requestId = typeof params.requestId === "string" ? params.requestId : void 0;
52
+ const response = params.response;
53
+ if (!requestId || !response) return;
54
+ const existing = this.networkRequests.get(requestId);
55
+ if (!existing) return;
56
+ existing.status = typeof response.status === "number" ? response.status : void 0;
57
+ existing.statusText = typeof response.statusText === "string" ? response.statusText : void 0;
58
+ existing.responseHeaders = normalizeHeaders(response.headers);
59
+ existing.mimeType = typeof response.mimeType === "string" ? response.mimeType : void 0;
60
+ this.networkRequests.set(requestId, existing);
61
+ return;
62
+ }
63
+ if (method === "Network.loadingFailed") {
64
+ const requestId = typeof params.requestId === "string" ? params.requestId : void 0;
65
+ if (!requestId) return;
66
+ const existing = this.networkRequests.get(requestId);
67
+ if (!existing) return;
68
+ existing.failed = true;
69
+ existing.failureReason = typeof params.errorText === "string" ? params.errorText : "Unknown error";
70
+ this.networkRequests.set(requestId, existing);
71
+ return;
72
+ }
73
+ if (method === "Runtime.consoleAPICalled") {
74
+ const type = String(params.type ?? "log");
75
+ const args = Array.isArray(params.args) ? params.args : [];
76
+ const text = args.map((arg) => {
77
+ if (typeof arg.value === "string") return arg.value;
78
+ if (arg.value !== void 0) return String(arg.value);
79
+ if (typeof arg.description === "string") return arg.description;
80
+ return "";
81
+ }).filter(Boolean).join(" ");
82
+ const stack = params.stackTrace;
83
+ const firstCallFrame = Array.isArray(stack?.callFrames) ? stack?.callFrames[0] : void 0;
84
+ this.consoleMessages.push({
85
+ type: ["log", "info", "warn", "error", "debug"].includes(type) ? type : "log",
86
+ text,
87
+ timestamp: Math.round(Number(params.timestamp ?? Date.now())),
88
+ url: typeof firstCallFrame?.url === "string" ? firstCallFrame.url : void 0,
89
+ lineNumber: typeof firstCallFrame?.lineNumber === "number" ? firstCallFrame.lineNumber : void 0
90
+ });
91
+ return;
92
+ }
93
+ if (method === "Runtime.exceptionThrown") {
94
+ const details = params.exceptionDetails;
95
+ if (!details) return;
96
+ const exception = details.exception;
97
+ const stackTrace = details.stackTrace;
98
+ const callFrames = Array.isArray(stackTrace?.callFrames) ? stackTrace.callFrames : [];
99
+ this.jsErrors.push({
100
+ message: typeof exception?.description === "string" ? exception.description : String(details.text ?? "JavaScript exception"),
101
+ url: typeof details.url === "string" ? details.url : typeof callFrames[0]?.url === "string" ? String(callFrames[0].url) : void 0,
102
+ lineNumber: typeof details.lineNumber === "number" ? details.lineNumber : void 0,
103
+ columnNumber: typeof details.columnNumber === "number" ? details.columnNumber : void 0,
104
+ stackTrace: callFrames.length > 0 ? callFrames.map(
105
+ (frame) => `${String(frame.functionName ?? "<anonymous>")} (${String(frame.url ?? "")}:${String(frame.lineNumber ?? 0)}:${String(frame.columnNumber ?? 0)})`
106
+ ).join("\n") : void 0,
107
+ timestamp: Date.now()
108
+ });
109
+ }
110
+ }
111
+ // --------------- clear helpers ---------------
112
+ clearNetwork() {
113
+ this.networkRequests.clear();
114
+ }
115
+ clearConsole() {
116
+ this.consoleMessages.length = 0;
117
+ }
118
+ clearErrors() {
119
+ this.jsErrors.length = 0;
120
+ }
121
+ // --------------- query helpers ---------------
122
+ getNetworkRequests(filter) {
123
+ const all = Array.from(this.networkRequests.values());
124
+ if (!filter) return all;
125
+ return all.filter((item) => item.url.includes(filter));
126
+ }
127
+ getConsoleMessages(filter) {
128
+ if (!filter) return this.consoleMessages;
129
+ return this.consoleMessages.filter((item) => item.text.includes(filter));
130
+ }
131
+ getJsErrors(filter) {
132
+ if (!filter) return this.jsErrors;
133
+ return this.jsErrors.filter(
134
+ (item) => item.message.includes(filter) || item.url?.includes(filter)
135
+ );
136
+ }
137
+ };
138
+
139
+ // packages/cli/src/cdp-monitor.ts
140
+ function getArg(flag, fallback) {
141
+ const idx = process.argv.indexOf(flag);
142
+ if (idx < 0 || idx + 1 >= process.argv.length) return fallback;
143
+ return process.argv[idx + 1];
144
+ }
145
+ var CDP_HOST = getArg("--cdp-host", "127.0.0.1");
146
+ var CDP_PORT = Number(getArg("--cdp-port", "19825"));
147
+ var MONITOR_PORT = Number(getArg("--monitor-port", "19826"));
148
+ var AUTH_TOKEN = getArg("--token", "");
149
+ if (!AUTH_TOKEN) {
150
+ process.stderr.write("cdp-monitor: --token is required\n");
151
+ process.exit(1);
152
+ }
153
+ var MONITOR_DIR = path.join(os.homedir(), ".bb-browser");
154
+ var PID_FILE = path.join(MONITOR_DIR, "monitor.pid");
155
+ var PORT_FILE = path.join(MONITOR_DIR, "monitor.port");
156
+ var TOKEN_FILE = path.join(MONITOR_DIR, "monitor.token");
157
+ var IDLE_TIMEOUT_MS = 30 * 60 * 1e3;
158
+ var idleTimer = null;
159
+ function resetIdleTimer() {
160
+ if (idleTimer) clearTimeout(idleTimer);
161
+ idleTimer = setTimeout(() => {
162
+ shutdown("idle timeout");
163
+ }, IDLE_TIMEOUT_MS);
164
+ if (idleTimer && typeof idleTimer === "object" && "unref" in idleTimer) {
165
+ }
166
+ }
167
+ var browserSocket = null;
168
+ var nextMessageId = 1;
169
+ var browserPending = /* @__PURE__ */ new Map();
170
+ var sessions = /* @__PURE__ */ new Map();
171
+ var attachedTargets = /* @__PURE__ */ new Map();
172
+ var state = new MonitorState();
173
+ var startTime = Date.now();
174
+ function fetchJson(url) {
175
+ return new Promise((resolve, reject) => {
176
+ const req = httpRequest(url, { method: "GET" }, (res) => {
177
+ const chunks = [];
178
+ res.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
179
+ res.on("end", () => {
180
+ const raw = Buffer.concat(chunks).toString("utf8");
181
+ if ((res.statusCode ?? 500) >= 400) {
182
+ reject(new Error(`HTTP ${res.statusCode ?? 500}: ${raw}`));
183
+ return;
184
+ }
185
+ try {
186
+ resolve(JSON.parse(raw));
187
+ } catch (error) {
188
+ reject(error);
189
+ }
190
+ });
191
+ });
192
+ req.on("error", reject);
193
+ req.end();
194
+ });
195
+ }
196
+ function connectWebSocket(url) {
197
+ return new Promise((resolve, reject) => {
198
+ const ws = new WebSocket(url);
199
+ ws.once("open", () => resolve(ws));
200
+ ws.once("error", reject);
201
+ });
202
+ }
203
+ function browserCommand(method, params = {}) {
204
+ if (!browserSocket) throw new Error("CDP not connected");
205
+ const id = nextMessageId++;
206
+ const payload = JSON.stringify({ id, method, params });
207
+ return new Promise((resolve, reject) => {
208
+ browserPending.set(id, {
209
+ resolve,
210
+ reject,
211
+ method
212
+ });
213
+ browserSocket.send(payload);
214
+ });
215
+ }
216
+ function sessionCommand(targetId, method, params = {}) {
217
+ if (!browserSocket) throw new Error("CDP not connected");
218
+ const sessionId = sessions.get(targetId);
219
+ if (!sessionId) throw new Error(`No session for target ${targetId}`);
220
+ const id = nextMessageId++;
221
+ const payload = JSON.stringify({ id, method, params, sessionId });
222
+ return new Promise((resolve, reject) => {
223
+ const check = (raw) => {
224
+ const msg = JSON.parse(raw.toString());
225
+ if (msg.id === id && msg.sessionId === sessionId) {
226
+ browserSocket.off("message", check);
227
+ if (msg.error) {
228
+ reject(new Error(`${method}: ${msg.error.message ?? "Unknown CDP error"}`));
229
+ } else {
230
+ resolve(msg.result);
231
+ }
232
+ }
233
+ };
234
+ browserSocket.on("message", check);
235
+ browserSocket.send(payload);
236
+ });
237
+ }
238
+ async function attachAndEnable(targetId) {
239
+ if (sessions.has(targetId)) return;
240
+ const result = await browserCommand("Target.attachToTarget", {
241
+ targetId,
242
+ flatten: true
243
+ });
244
+ sessions.set(targetId, result.sessionId);
245
+ attachedTargets.set(result.sessionId, targetId);
246
+ await sessionCommand(targetId, "Network.enable").catch(() => {
247
+ });
248
+ await sessionCommand(targetId, "Runtime.enable").catch(() => {
249
+ });
250
+ }
251
+ function setupSocketListeners(ws) {
252
+ ws.on("message", (raw) => {
253
+ const message = JSON.parse(raw.toString());
254
+ if (typeof message.id === "number") {
255
+ const pending = browserPending.get(message.id);
256
+ if (!pending) return;
257
+ browserPending.delete(message.id);
258
+ if (message.error) {
259
+ pending.reject(
260
+ new Error(
261
+ `${pending.method}: ${message.error.message ?? "Unknown CDP error"}`
262
+ )
263
+ );
264
+ } else {
265
+ pending.resolve(message.result);
266
+ }
267
+ return;
268
+ }
269
+ if (message.method === "Target.attachedToTarget") {
270
+ const params = message.params;
271
+ const sessionId = params.sessionId;
272
+ const targetInfo = params.targetInfo;
273
+ if (typeof sessionId === "string" && typeof targetInfo?.targetId === "string") {
274
+ sessions.set(targetInfo.targetId, sessionId);
275
+ attachedTargets.set(sessionId, targetInfo.targetId);
276
+ }
277
+ return;
278
+ }
279
+ if (message.method === "Target.detachedFromTarget") {
280
+ const params = message.params;
281
+ const sessionId = params.sessionId;
282
+ if (typeof sessionId === "string") {
283
+ const targetId = attachedTargets.get(sessionId);
284
+ if (targetId) {
285
+ sessions.delete(targetId);
286
+ attachedTargets.delete(sessionId);
287
+ }
288
+ }
289
+ return;
290
+ }
291
+ if (message.method === "Target.targetCreated") {
292
+ const params = message.params;
293
+ const targetInfo = params.targetInfo;
294
+ if (targetInfo?.type === "page" && typeof targetInfo.targetId === "string") {
295
+ attachAndEnable(targetInfo.targetId).catch(() => {
296
+ });
297
+ }
298
+ return;
299
+ }
300
+ if (typeof message.sessionId === "string" && typeof message.method === "string") {
301
+ state.handleSessionEvent(message.method, message.params ?? {});
302
+ }
303
+ });
304
+ ws.on("close", () => {
305
+ log("CDP connection closed \u2014 shutting down");
306
+ shutdown("cdp closed");
307
+ });
308
+ ws.on("error", (err) => {
309
+ log(`CDP error: ${err.message}`);
310
+ });
311
+ }
312
+ async function connectCdp() {
313
+ const versionData = await fetchJson(`http://${CDP_HOST}:${CDP_PORT}/json/version`);
314
+ const wsUrl = versionData.webSocketDebuggerUrl;
315
+ if (typeof wsUrl !== "string" || !wsUrl) {
316
+ throw new Error("CDP endpoint missing webSocketDebuggerUrl");
317
+ }
318
+ const ws = await connectWebSocket(wsUrl);
319
+ browserSocket = ws;
320
+ setupSocketListeners(ws);
321
+ await browserCommand("Target.setDiscoverTargets", { discover: true });
322
+ const result = await browserCommand("Target.getTargets");
323
+ const pages = (result.targetInfos || []).filter((t) => t.type === "page");
324
+ for (const page of pages) {
325
+ await attachAndEnable(page.targetId).catch(() => {
326
+ });
327
+ }
328
+ state.networkEnabled = true;
329
+ state.consoleEnabled = true;
330
+ state.errorsEnabled = true;
331
+ log(`Connected to CDP, monitoring ${pages.length} page(s)`);
332
+ }
333
+ function ok(id, data) {
334
+ return { id, success: true, data };
335
+ }
336
+ function fail(id, error) {
337
+ const msg = error instanceof Error ? error.message : String(error);
338
+ return { id, success: false, error: msg };
339
+ }
340
+ function handleCommand(request) {
341
+ try {
342
+ switch (request.action) {
343
+ case "network": {
344
+ const sub = request.networkCommand ?? "requests";
345
+ switch (sub) {
346
+ case "requests": {
347
+ const requests = state.getNetworkRequests(request.filter);
348
+ return ok(request.id, { networkRequests: requests });
349
+ }
350
+ case "clear":
351
+ state.clearNetwork();
352
+ return ok(request.id, {});
353
+ case "route":
354
+ return ok(request.id, { routeCount: 0 });
355
+ case "unroute":
356
+ return ok(request.id, { routeCount: 0 });
357
+ default:
358
+ return fail(request.id, `Unknown network subcommand: ${sub}`);
359
+ }
360
+ }
361
+ case "console": {
362
+ const sub = request.consoleCommand ?? "get";
363
+ switch (sub) {
364
+ case "get":
365
+ return ok(request.id, {
366
+ consoleMessages: state.getConsoleMessages(request.filter)
367
+ });
368
+ case "clear":
369
+ state.clearConsole();
370
+ return ok(request.id, {});
371
+ default:
372
+ return fail(request.id, `Unknown console subcommand: ${sub}`);
373
+ }
374
+ }
375
+ case "errors": {
376
+ const sub = request.errorsCommand ?? "get";
377
+ switch (sub) {
378
+ case "get":
379
+ return ok(request.id, {
380
+ jsErrors: state.getJsErrors(request.filter)
381
+ });
382
+ case "clear":
383
+ state.clearErrors();
384
+ return ok(request.id, {});
385
+ default:
386
+ return fail(request.id, `Unknown errors subcommand: ${sub}`);
387
+ }
388
+ }
389
+ case "trace": {
390
+ const sub = request.traceCommand ?? "status";
391
+ switch (sub) {
392
+ case "start":
393
+ state.traceRecording = true;
394
+ state.traceEvents.length = 0;
395
+ return ok(request.id, {
396
+ traceStatus: { recording: true, eventCount: 0 }
397
+ });
398
+ case "stop": {
399
+ state.traceRecording = false;
400
+ return ok(request.id, {
401
+ traceEvents: [...state.traceEvents],
402
+ traceStatus: {
403
+ recording: false,
404
+ eventCount: state.traceEvents.length
405
+ }
406
+ });
407
+ }
408
+ case "status":
409
+ return ok(request.id, {
410
+ traceStatus: {
411
+ recording: state.traceRecording,
412
+ eventCount: state.traceEvents.length
413
+ }
414
+ });
415
+ default:
416
+ return fail(request.id, `Unknown trace subcommand: ${sub}`);
417
+ }
418
+ }
419
+ default:
420
+ return fail(request.id, `Monitor does not handle action: ${request.action}`);
421
+ }
422
+ } catch (error) {
423
+ return fail(request.id, error);
424
+ }
425
+ }
426
+ function readBody(req) {
427
+ return new Promise((resolve, reject) => {
428
+ const chunks = [];
429
+ req.on("data", (chunk) => chunks.push(chunk));
430
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
431
+ req.on("error", reject);
432
+ });
433
+ }
434
+ function jsonResponse(res, status, body) {
435
+ const data = JSON.stringify(body);
436
+ res.writeHead(status, {
437
+ "Content-Type": "application/json",
438
+ "Content-Length": Buffer.byteLength(data)
439
+ });
440
+ res.end(data);
441
+ }
442
+ function handleHttp(req, res) {
443
+ resetIdleTimer();
444
+ const authHeader = req.headers.authorization ?? "";
445
+ if (authHeader !== `Bearer ${AUTH_TOKEN}`) {
446
+ jsonResponse(res, 401, { error: "Unauthorized" });
447
+ return;
448
+ }
449
+ const url = req.url ?? "/";
450
+ if (req.method === "GET" && url === "/status") {
451
+ jsonResponse(res, 200, {
452
+ running: true,
453
+ cdpConnected: browserSocket !== null && browserSocket.readyState === WebSocket.OPEN,
454
+ uptimeMs: Date.now() - startTime,
455
+ counts: {
456
+ network: state.networkRequests.size,
457
+ console: state.consoleMessages.length,
458
+ errors: state.jsErrors.length
459
+ }
460
+ });
461
+ return;
462
+ }
463
+ if (req.method === "POST" && url === "/command") {
464
+ readBody(req).then((body) => {
465
+ const request = JSON.parse(body);
466
+ const response = handleCommand(request);
467
+ jsonResponse(res, 200, response);
468
+ }).catch((err) => {
469
+ jsonResponse(res, 400, { error: String(err) });
470
+ });
471
+ return;
472
+ }
473
+ if (req.method === "POST" && url === "/shutdown") {
474
+ jsonResponse(res, 200, { ok: true });
475
+ setTimeout(() => shutdown("shutdown requested"), 100);
476
+ return;
477
+ }
478
+ jsonResponse(res, 404, { error: "Not found" });
479
+ }
480
+ function log(msg) {
481
+ process.stderr.write(`[cdp-monitor] ${msg}
482
+ `);
483
+ }
484
+ async function writePidFiles() {
485
+ await mkdir(MONITOR_DIR, { recursive: true });
486
+ await writeFile(PID_FILE, String(process.pid), { mode: 420 });
487
+ await writeFile(PORT_FILE, String(MONITOR_PORT), { mode: 420 });
488
+ await writeFile(TOKEN_FILE, AUTH_TOKEN, { mode: 384 });
489
+ }
490
+ async function cleanupPidFiles() {
491
+ await unlink(PID_FILE).catch(() => {
492
+ });
493
+ await unlink(PORT_FILE).catch(() => {
494
+ });
495
+ await unlink(TOKEN_FILE).catch(() => {
496
+ });
497
+ }
498
+ var shuttingDown = false;
499
+ function shutdown(reason) {
500
+ if (shuttingDown) return;
501
+ shuttingDown = true;
502
+ log(`Shutting down: ${reason}`);
503
+ if (browserSocket) {
504
+ try {
505
+ browserSocket.close();
506
+ } catch {
507
+ }
508
+ }
509
+ if (httpServer) {
510
+ httpServer.close();
511
+ }
512
+ cleanupPidFiles().finally(() => process.exit(0));
513
+ }
514
+ process.on("SIGINT", () => shutdown("SIGINT"));
515
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
516
+ var httpServer = null;
517
+ async function main() {
518
+ try {
519
+ await connectCdp();
520
+ } catch (error) {
521
+ log(`Failed to connect to CDP: ${error instanceof Error ? error.message : String(error)}`);
522
+ process.exit(1);
523
+ }
524
+ httpServer = createServer(handleHttp);
525
+ httpServer.listen(MONITOR_PORT, "127.0.0.1", async () => {
526
+ log(`HTTP server listening on 127.0.0.1:${MONITOR_PORT}`);
527
+ await writePidFiles();
528
+ resetIdleTimer();
529
+ });
530
+ }
531
+ main().catch((err) => {
532
+ log(`Fatal: ${err instanceof Error ? err.message : String(err)}`);
533
+ process.exit(1);
534
+ });
535
+ //# sourceMappingURL=cdp-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/cdp-monitor.ts","../packages/cli/src/cdp-monitor-state.ts"],"sourcesContent":["/**\n * cdp-monitor — long-running background process that maintains a persistent\n * CDP connection and accumulates network / console / error / trace data.\n *\n * Spawned (detached) by monitor-manager.ts. Communicates with short-lived\n * CLI invocations via a tiny HTTP API on 127.0.0.1.\n *\n * Usage:\n * node cdp-monitor.js --cdp-host 127.0.0.1 --cdp-port 19825 \\\n * --monitor-port 19826 --token <hex>\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { request as httpRequest } from \"node:http\";\nimport { mkdir, writeFile, unlink } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport WebSocket from \"ws\";\nimport type { Request, Response, ResponseData, TraceStatus } from \"@bb-browser/shared\";\nimport { MonitorState } from \"./cdp-monitor-state.js\";\n\n// ---------------------------------------------------------------------------\n// Arg parsing\n// ---------------------------------------------------------------------------\n\nfunction getArg(flag: string, fallback: string): string {\n const idx = process.argv.indexOf(flag);\n if (idx < 0 || idx + 1 >= process.argv.length) return fallback;\n return process.argv[idx + 1];\n}\n\nconst CDP_HOST = getArg(\"--cdp-host\", \"127.0.0.1\");\nconst CDP_PORT = Number(getArg(\"--cdp-port\", \"19825\"));\nconst MONITOR_PORT = Number(getArg(\"--monitor-port\", \"19826\"));\nconst AUTH_TOKEN = getArg(\"--token\", \"\");\n\nif (!AUTH_TOKEN) {\n process.stderr.write(\"cdp-monitor: --token is required\\n\");\n process.exit(1);\n}\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\n\nconst MONITOR_DIR = path.join(os.homedir(), \".bb-browser\");\nconst PID_FILE = path.join(MONITOR_DIR, \"monitor.pid\");\nconst PORT_FILE = path.join(MONITOR_DIR, \"monitor.port\");\nconst TOKEN_FILE = path.join(MONITOR_DIR, \"monitor.token\");\n\n// ---------------------------------------------------------------------------\n// Auto-exit timer (30 minutes without any HTTP request)\n// ---------------------------------------------------------------------------\n\nconst IDLE_TIMEOUT_MS = 30 * 60 * 1000;\nlet idleTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction resetIdleTimer(): void {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n shutdown(\"idle timeout\");\n }, IDLE_TIMEOUT_MS);\n // Allow Node to exit naturally if nothing else holds it\n if (idleTimer && typeof idleTimer === \"object\" && \"unref\" in idleTimer) {\n // Do NOT unref the idle timer — we want it to keep the process alive\n }\n}\n\n// ---------------------------------------------------------------------------\n// CDP helpers (mirrored from cdp-client.ts — intentionally duplicated to\n// avoid coupling / risky refactor of cdp-client.ts in Phase 1)\n// ---------------------------------------------------------------------------\n\ntype JsonObject = Record<string, unknown>;\n\ninterface PendingCommand {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n method: string;\n}\n\nlet browserSocket: WebSocket | null = null;\nlet nextMessageId = 1;\nconst browserPending = new Map<number, PendingCommand>();\nconst sessions = new Map<string, string>(); // targetId -> sessionId\nconst attachedTargets = new Map<string, string>(); // sessionId -> targetId\n\nconst state = new MonitorState();\nconst startTime = Date.now();\n\n// ---------------------------------------------------------------------------\n// CDP connection\n// ---------------------------------------------------------------------------\n\nfunction fetchJson(url: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const req = httpRequest(url, { method: \"GET\" }, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(Buffer.from(chunk)));\n res.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if ((res.statusCode ?? 500) >= 400) {\n reject(new Error(`HTTP ${res.statusCode ?? 500}: ${raw}`));\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n });\n req.on(\"error\", reject);\n req.end();\n });\n}\n\nfunction connectWebSocket(url: string): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url);\n ws.once(\"open\", () => resolve(ws));\n ws.once(\"error\", reject);\n });\n}\n\nfunction browserCommand<T>(method: string, params: JsonObject = {}): Promise<T> {\n if (!browserSocket) throw new Error(\"CDP not connected\");\n const id = nextMessageId++;\n const payload = JSON.stringify({ id, method, params });\n return new Promise<T>((resolve, reject) => {\n browserPending.set(id, {\n resolve: resolve as (v: unknown) => void,\n reject,\n method,\n });\n browserSocket!.send(payload);\n });\n}\n\nfunction sessionCommand<T>(targetId: string, method: string, params: JsonObject = {}): Promise<T> {\n if (!browserSocket) throw new Error(\"CDP not connected\");\n const sessionId = sessions.get(targetId);\n if (!sessionId) throw new Error(`No session for target ${targetId}`);\n const id = nextMessageId++;\n const payload = JSON.stringify({ id, method, params, sessionId });\n return new Promise<T>((resolve, reject) => {\n const check = (raw: WebSocket.RawData) => {\n const msg = JSON.parse(raw.toString()) as JsonObject;\n if (msg.id === id && msg.sessionId === sessionId) {\n browserSocket!.off(\"message\", check);\n if (msg.error) {\n reject(new Error(`${method}: ${(msg.error as JsonObject).message ?? \"Unknown CDP error\"}`));\n } else {\n resolve(msg.result as T);\n }\n }\n };\n browserSocket!.on(\"message\", check);\n browserSocket!.send(payload);\n });\n}\n\nasync function attachAndEnable(targetId: string): Promise<void> {\n if (sessions.has(targetId)) return;\n const result = await browserCommand<{ sessionId: string }>(\"Target.attachToTarget\", {\n targetId,\n flatten: true,\n });\n sessions.set(targetId, result.sessionId);\n attachedTargets.set(result.sessionId, targetId);\n\n // Enable domains the monitor cares about\n await sessionCommand(targetId, \"Network.enable\").catch(() => {});\n await sessionCommand(targetId, \"Runtime.enable\").catch(() => {});\n}\n\nfunction setupSocketListeners(ws: WebSocket): void {\n ws.on(\"message\", (raw) => {\n const message = JSON.parse(raw.toString()) as JsonObject;\n\n // Response to a browser-level command\n if (typeof message.id === \"number\") {\n const pending = browserPending.get(message.id);\n if (!pending) return;\n browserPending.delete(message.id);\n if (message.error) {\n pending.reject(\n new Error(\n `${pending.method}: ${(message.error as JsonObject).message ?? \"Unknown CDP error\"}`,\n ),\n );\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Flat-mode attach notification\n if (message.method === \"Target.attachedToTarget\") {\n const params = message.params as JsonObject;\n const sessionId = params.sessionId;\n const targetInfo = params.targetInfo as JsonObject;\n if (typeof sessionId === \"string\" && typeof targetInfo?.targetId === \"string\") {\n sessions.set(targetInfo.targetId, sessionId);\n attachedTargets.set(sessionId, targetInfo.targetId);\n }\n return;\n }\n\n if (message.method === \"Target.detachedFromTarget\") {\n const params = message.params as JsonObject;\n const sessionId = params.sessionId;\n if (typeof sessionId === \"string\") {\n const targetId = attachedTargets.get(sessionId);\n if (targetId) {\n sessions.delete(targetId);\n attachedTargets.delete(sessionId);\n }\n }\n return;\n }\n\n // New targets — auto-attach pages\n if (message.method === \"Target.targetCreated\") {\n const params = message.params as JsonObject;\n const targetInfo = params.targetInfo as JsonObject;\n if (targetInfo?.type === \"page\" && typeof targetInfo.targetId === \"string\") {\n attachAndEnable(targetInfo.targetId).catch(() => {});\n }\n return;\n }\n\n // Flat protocol: session events carry sessionId directly\n if (typeof message.sessionId === \"string\" && typeof message.method === \"string\") {\n state.handleSessionEvent(message.method as string, (message.params ?? {}) as JsonObject);\n }\n });\n\n ws.on(\"close\", () => {\n log(\"CDP connection closed — shutting down\");\n shutdown(\"cdp closed\");\n });\n\n ws.on(\"error\", (err) => {\n log(`CDP error: ${err.message}`);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Startup\n// ---------------------------------------------------------------------------\n\nasync function connectCdp(): Promise<void> {\n const versionData = (await fetchJson(`http://${CDP_HOST}:${CDP_PORT}/json/version`)) as JsonObject;\n const wsUrl = versionData.webSocketDebuggerUrl;\n if (typeof wsUrl !== \"string\" || !wsUrl) {\n throw new Error(\"CDP endpoint missing webSocketDebuggerUrl\");\n }\n\n const ws = await connectWebSocket(wsUrl);\n browserSocket = ws;\n setupSocketListeners(ws);\n\n // Discover existing targets\n await browserCommand(\"Target.setDiscoverTargets\", { discover: true });\n const result = await browserCommand<{\n targetInfos: Array<{ targetId: string; type: string; title: string; url: string }>;\n }>(\"Target.getTargets\");\n\n const pages = (result.targetInfos || []).filter((t) => t.type === \"page\");\n for (const page of pages) {\n await attachAndEnable(page.targetId).catch(() => {});\n }\n\n state.networkEnabled = true;\n state.consoleEnabled = true;\n state.errorsEnabled = true;\n\n log(`Connected to CDP, monitoring ${pages.length} page(s)`);\n}\n\n// ---------------------------------------------------------------------------\n// Request handling\n// ---------------------------------------------------------------------------\n\nfunction ok(id: string, data?: ResponseData): Response {\n return { id, success: true, data };\n}\n\nfunction fail(id: string, error: unknown): Response {\n const msg = error instanceof Error ? error.message : String(error);\n return { id, success: false, error: msg };\n}\n\nfunction handleCommand(request: Request): Response {\n try {\n switch (request.action) {\n case \"network\": {\n const sub = request.networkCommand ?? \"requests\";\n switch (sub) {\n case \"requests\": {\n const requests = state.getNetworkRequests(request.filter);\n // Note: withBody (fetching response bodies) requires a live\n // session command which we could implement, but for Phase 1 we\n // return what we have.\n return ok(request.id, { networkRequests: requests });\n }\n case \"clear\":\n state.clearNetwork();\n return ok(request.id, {});\n case \"route\":\n return ok(request.id, { routeCount: 0 });\n case \"unroute\":\n return ok(request.id, { routeCount: 0 });\n default:\n return fail(request.id, `Unknown network subcommand: ${sub}`);\n }\n }\n\n case \"console\": {\n const sub = request.consoleCommand ?? \"get\";\n switch (sub) {\n case \"get\":\n return ok(request.id, {\n consoleMessages: state.getConsoleMessages(request.filter),\n });\n case \"clear\":\n state.clearConsole();\n return ok(request.id, {});\n default:\n return fail(request.id, `Unknown console subcommand: ${sub}`);\n }\n }\n\n case \"errors\": {\n const sub = request.errorsCommand ?? \"get\";\n switch (sub) {\n case \"get\":\n return ok(request.id, {\n jsErrors: state.getJsErrors(request.filter),\n });\n case \"clear\":\n state.clearErrors();\n return ok(request.id, {});\n default:\n return fail(request.id, `Unknown errors subcommand: ${sub}`);\n }\n }\n\n case \"trace\": {\n const sub = request.traceCommand ?? \"status\";\n switch (sub) {\n case \"start\":\n state.traceRecording = true;\n state.traceEvents.length = 0;\n return ok(request.id, {\n traceStatus: { recording: true, eventCount: 0 } satisfies TraceStatus,\n });\n case \"stop\": {\n state.traceRecording = false;\n return ok(request.id, {\n traceEvents: [...state.traceEvents],\n traceStatus: {\n recording: false,\n eventCount: state.traceEvents.length,\n } satisfies TraceStatus,\n });\n }\n case \"status\":\n return ok(request.id, {\n traceStatus: {\n recording: state.traceRecording,\n eventCount: state.traceEvents.length,\n } satisfies TraceStatus,\n });\n default:\n return fail(request.id, `Unknown trace subcommand: ${sub}`);\n }\n }\n\n default:\n return fail(request.id, `Monitor does not handle action: ${request.action}`);\n }\n } catch (error) {\n return fail(request.id, error);\n }\n}\n\n// ---------------------------------------------------------------------------\n// HTTP server\n// ---------------------------------------------------------------------------\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n req.on(\"error\", reject);\n });\n}\n\nfunction jsonResponse(res: ServerResponse, status: number, body: unknown): void {\n const data = JSON.stringify(body);\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(data),\n });\n res.end(data);\n}\n\nfunction handleHttp(req: IncomingMessage, res: ServerResponse): void {\n resetIdleTimer();\n\n // Auth check\n const authHeader = req.headers.authorization ?? \"\";\n if (authHeader !== `Bearer ${AUTH_TOKEN}`) {\n jsonResponse(res, 401, { error: \"Unauthorized\" });\n return;\n }\n\n const url = req.url ?? \"/\";\n\n if (req.method === \"GET\" && url === \"/status\") {\n jsonResponse(res, 200, {\n running: true,\n cdpConnected: browserSocket !== null && browserSocket.readyState === WebSocket.OPEN,\n uptimeMs: Date.now() - startTime,\n counts: {\n network: state.networkRequests.size,\n console: state.consoleMessages.length,\n errors: state.jsErrors.length,\n },\n });\n return;\n }\n\n if (req.method === \"POST\" && url === \"/command\") {\n readBody(req)\n .then((body) => {\n const request = JSON.parse(body) as Request;\n const response = handleCommand(request);\n jsonResponse(res, 200, response);\n })\n .catch((err) => {\n jsonResponse(res, 400, { error: String(err) });\n });\n return;\n }\n\n if (req.method === \"POST\" && url === \"/shutdown\") {\n jsonResponse(res, 200, { ok: true });\n setTimeout(() => shutdown(\"shutdown requested\"), 100);\n return;\n }\n\n jsonResponse(res, 404, { error: \"Not found\" });\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle\n// ---------------------------------------------------------------------------\n\nfunction log(msg: string): void {\n process.stderr.write(`[cdp-monitor] ${msg}\\n`);\n}\n\nasync function writePidFiles(): Promise<void> {\n await mkdir(MONITOR_DIR, { recursive: true });\n await writeFile(PID_FILE, String(process.pid), { mode: 0o644 });\n await writeFile(PORT_FILE, String(MONITOR_PORT), { mode: 0o644 });\n await writeFile(TOKEN_FILE, AUTH_TOKEN, { mode: 0o600 });\n}\n\nasync function cleanupPidFiles(): Promise<void> {\n await unlink(PID_FILE).catch(() => {});\n await unlink(PORT_FILE).catch(() => {});\n await unlink(TOKEN_FILE).catch(() => {});\n}\n\nlet shuttingDown = false;\n\nfunction shutdown(reason: string): void {\n if (shuttingDown) return;\n shuttingDown = true;\n log(`Shutting down: ${reason}`);\n if (browserSocket) {\n try {\n browserSocket.close();\n } catch {}\n }\n if (httpServer) {\n httpServer.close();\n }\n cleanupPidFiles().finally(() => process.exit(0));\n}\n\nprocess.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\nprocess.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\nlet httpServer: ReturnType<typeof createServer> | null = null;\n\nasync function main(): Promise<void> {\n try {\n await connectCdp();\n } catch (error) {\n log(`Failed to connect to CDP: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n\n httpServer = createServer(handleHttp);\n httpServer.listen(MONITOR_PORT, \"127.0.0.1\", async () => {\n log(`HTTP server listening on 127.0.0.1:${MONITOR_PORT}`);\n await writePidFiles();\n resetIdleTimer();\n });\n}\n\nmain().catch((err) => {\n log(`Fatal: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n});\n","/**\n * MonitorState — reusable monitoring state for CDP events.\n *\n * Extracted from the event‐handling logic in cdp-client.ts so that the\n * long‐running monitor process can accumulate network, console, error\n * and trace data across multiple short‐lived CLI invocations.\n */\n\nimport type {\n NetworkRequestInfo,\n ConsoleMessageInfo,\n JSErrorInfo,\n TraceEvent,\n} from \"@bb-browser/shared\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction normalizeHeaders(headers: unknown): Record<string, string> | undefined {\n if (!headers || typeof headers !== \"object\") return undefined;\n return Object.fromEntries(\n Object.entries(headers as Record<string, unknown>).map(([key, value]) => [key, String(value)]),\n );\n}\n\nexport class MonitorState {\n networkRequests = new Map<string, NetworkRequestInfo>();\n networkEnabled = false;\n\n consoleMessages: ConsoleMessageInfo[] = [];\n consoleEnabled = false;\n\n jsErrors: JSErrorInfo[] = [];\n errorsEnabled = false;\n\n traceRecording = false;\n traceEvents: TraceEvent[] = [];\n\n /**\n * Feed a CDP session event (from any attached target) into the monitor\n * state. The method + params mirror what cdp-client.ts handles inside\n * its own handleSessionEvent, but without any connection‐specific logic\n * (dialog handling, etc.) that the monitor does not need.\n */\n handleSessionEvent(method: string, params: JsonObject): void {\n if (method === \"Network.requestWillBeSent\") {\n const requestId = typeof params.requestId === \"string\" ? params.requestId : undefined;\n const request = params.request as JsonObject | undefined;\n if (!requestId || !request) return;\n this.networkRequests.set(requestId, {\n requestId,\n url: String(request.url ?? \"\"),\n method: String(request.method ?? \"GET\"),\n type: String(params.type ?? \"Other\"),\n timestamp: Math.round(Number(params.timestamp ?? Date.now()) * 1000),\n requestHeaders: normalizeHeaders(request.headers),\n requestBody: typeof request.postData === \"string\" ? request.postData : undefined,\n });\n return;\n }\n\n if (method === \"Network.responseReceived\") {\n const requestId = typeof params.requestId === \"string\" ? params.requestId : undefined;\n const response = params.response as JsonObject | undefined;\n if (!requestId || !response) return;\n const existing = this.networkRequests.get(requestId);\n if (!existing) return;\n existing.status = typeof response.status === \"number\" ? response.status : undefined;\n existing.statusText = typeof response.statusText === \"string\" ? response.statusText : undefined;\n existing.responseHeaders = normalizeHeaders(response.headers);\n existing.mimeType = typeof response.mimeType === \"string\" ? response.mimeType : undefined;\n this.networkRequests.set(requestId, existing);\n return;\n }\n\n if (method === \"Network.loadingFailed\") {\n const requestId = typeof params.requestId === \"string\" ? params.requestId : undefined;\n if (!requestId) return;\n const existing = this.networkRequests.get(requestId);\n if (!existing) return;\n existing.failed = true;\n existing.failureReason = typeof params.errorText === \"string\" ? params.errorText : \"Unknown error\";\n this.networkRequests.set(requestId, existing);\n return;\n }\n\n if (method === \"Runtime.consoleAPICalled\") {\n const type = String(params.type ?? \"log\");\n const args = Array.isArray(params.args) ? (params.args as JsonObject[]) : [];\n const text = args\n .map((arg) => {\n if (typeof arg.value === \"string\") return arg.value;\n if (arg.value !== undefined) return String(arg.value);\n if (typeof arg.description === \"string\") return arg.description;\n return \"\";\n })\n .filter(Boolean)\n .join(\" \");\n const stack = params.stackTrace as JsonObject | undefined;\n const firstCallFrame = Array.isArray(stack?.callFrames)\n ? (stack?.callFrames[0] as JsonObject | undefined)\n : undefined;\n this.consoleMessages.push({\n type: [\"log\", \"info\", \"warn\", \"error\", \"debug\"].includes(type)\n ? (type as ConsoleMessageInfo[\"type\"])\n : \"log\",\n text,\n timestamp: Math.round(Number(params.timestamp ?? Date.now())),\n url: typeof firstCallFrame?.url === \"string\" ? firstCallFrame.url : undefined,\n lineNumber: typeof firstCallFrame?.lineNumber === \"number\" ? firstCallFrame.lineNumber : undefined,\n });\n return;\n }\n\n if (method === \"Runtime.exceptionThrown\") {\n const details = params.exceptionDetails as JsonObject | undefined;\n if (!details) return;\n const exception = details.exception as JsonObject | undefined;\n const stackTrace = details.stackTrace as JsonObject | undefined;\n const callFrames = Array.isArray(stackTrace?.callFrames)\n ? (stackTrace.callFrames as JsonObject[])\n : [];\n this.jsErrors.push({\n message:\n typeof exception?.description === \"string\"\n ? exception.description\n : String(details.text ?? \"JavaScript exception\"),\n url:\n typeof details.url === \"string\"\n ? details.url\n : typeof callFrames[0]?.url === \"string\"\n ? String(callFrames[0].url)\n : undefined,\n lineNumber: typeof details.lineNumber === \"number\" ? details.lineNumber : undefined,\n columnNumber: typeof details.columnNumber === \"number\" ? details.columnNumber : undefined,\n stackTrace:\n callFrames.length > 0\n ? callFrames\n .map(\n (frame) =>\n `${String(frame.functionName ?? \"<anonymous>\")} (${String(frame.url ?? \"\")}:${String(frame.lineNumber ?? 0)}:${String(frame.columnNumber ?? 0)})`,\n )\n .join(\"\\n\")\n : undefined,\n timestamp: Date.now(),\n });\n }\n }\n\n // --------------- clear helpers ---------------\n\n clearNetwork(): void {\n this.networkRequests.clear();\n }\n\n clearConsole(): void {\n this.consoleMessages.length = 0;\n }\n\n clearErrors(): void {\n this.jsErrors.length = 0;\n }\n\n // --------------- query helpers ---------------\n\n getNetworkRequests(filter?: string): NetworkRequestInfo[] {\n const all = Array.from(this.networkRequests.values());\n if (!filter) return all;\n return all.filter((item) => item.url.includes(filter));\n }\n\n getConsoleMessages(filter?: string): ConsoleMessageInfo[] {\n if (!filter) return this.consoleMessages;\n return this.consoleMessages.filter((item) => item.text.includes(filter));\n }\n\n getJsErrors(filter?: string): JSErrorInfo[] {\n if (!filter) return this.jsErrors;\n return this.jsErrors.filter(\n (item) => item.message.includes(filter) || item.url?.includes(filter),\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
31
+
32
+ export {
33
+ __commonJS,
34
+ __export,
35
+ __toESM
36
+ };
37
+ //# sourceMappingURL=chunk-D4HDZEJT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}