openchrome-mcp 1.10.1 → 1.10.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.
- package/README.md +3 -0
- package/dist/browser-state/snapshot.d.ts +12 -0
- package/dist/browser-state/snapshot.d.ts.map +1 -1
- package/dist/browser-state/snapshot.js +39 -7
- package/dist/browser-state/snapshot.js.map +1 -1
- package/dist/cdp/client.d.ts +16 -0
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +62 -2
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/tab-health-monitor.d.ts +16 -1
- package/dist/cdp/tab-health-monitor.d.ts.map +1 -1
- package/dist/cdp/tab-health-monitor.js +47 -12
- package/dist/cdp/tab-health-monitor.js.map +1 -1
- package/dist/chrome/process-watchdog.d.ts +18 -0
- package/dist/chrome/process-watchdog.d.ts.map +1 -1
- package/dist/chrome/process-watchdog.js +42 -8
- package/dist/chrome/process-watchdog.js.map +1 -1
- package/dist/index.js +141 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +6 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/session-state-persistence.d.ts +17 -0
- package/dist/session-state-persistence.d.ts.map +1 -1
- package/dist/session-state-persistence.js +36 -1
- package/dist/session-state-persistence.js.map +1 -1
- package/dist/utils/health-endpoint-gating.d.ts +19 -0
- package/dist/utils/health-endpoint-gating.d.ts.map +1 -0
- package/dist/utils/health-endpoint-gating.js +28 -0
- package/dist/utils/health-endpoint-gating.js.map +1 -0
- package/dist/utils/idle-state.d.ts +62 -0
- package/dist/utils/idle-state.d.ts.map +1 -0
- package/dist/utils/idle-state.js +88 -0
- package/dist/utils/idle-state.js.map +1 -0
- package/dist/utils/idle-timeout.d.ts +69 -0
- package/dist/utils/idle-timeout.d.ts.map +1 -0
- package/dist/utils/idle-timeout.js +139 -0
- package/dist/utils/idle-timeout.js.map +1 -0
- package/dist/utils/parent-watcher.d.ts +33 -0
- package/dist/utils/parent-watcher.d.ts.map +1 -0
- package/dist/utils/parent-watcher.js +78 -0
- package/dist/utils/parent-watcher.js.map +1 -0
- package/dist/watchdog/chrome-monitor.d.ts +16 -0
- package/dist/watchdog/chrome-monitor.d.ts.map +1 -1
- package/dist/watchdog/chrome-monitor.js +35 -3
- package/dist/watchdog/chrome-monitor.js.map +1 -1
- package/dist/watchdog/disk-monitor.d.ts +17 -0
- package/dist/watchdog/disk-monitor.d.ts.map +1 -1
- package/dist/watchdog/disk-monitor.js +41 -8
- package/dist/watchdog/disk-monitor.js.map +1 -1
- package/dist/watchdog/event-loop-monitor.d.ts +23 -0
- package/dist/watchdog/event-loop-monitor.d.ts.map +1 -1
- package/dist/watchdog/event-loop-monitor.js +61 -25
- package/dist/watchdog/event-loop-monitor.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -535,6 +535,9 @@ docker run openchrome
|
|
|
535
535
|
| `CHROME_USER_DATA_DIR` | Custom profile directory |
|
|
536
536
|
| `CI` | Detected automatically; adds `--no-sandbox` |
|
|
537
537
|
| `DOCKER` | Detected automatically; adds `--no-sandbox` |
|
|
538
|
+
| `OPENCHROME_PPID_WATCH` | Set to `0` to disable the parent-process watcher in stdio mode. Default: enabled. The watcher exits the server when its launching MCP-client parent dies, so abrupt parent termination (force-quit, `kill -9`, tmux teardown) does not orphan the openchrome process. HTTP and `both` transport modes ignore this flag — they remain daemon-capable. |
|
|
539
|
+
| `OPENCHROME_PPID_WATCH_INTERVAL_MS` | Polling interval for the parent watcher in milliseconds. Default: `2000`. Clamped to `[500, 60000]`. |
|
|
540
|
+
| `OPENCHROME_HEALTH_ENDPOINT` | Force-enable (`1`/`true`) or force-disable (`0`/`false`) the `/health` and `/metrics` HTTP listener. Default: on for `--transport http` / `both`, off for `--transport stdio`. Stdio-mode instances usually talk to a single MCP client over the pipe and do not need an external monitoring port; disabling it saves ~200-300 KB heap + one file descriptor per instance. Operators who run stdio under a supervisor can opt in with `OPENCHROME_HEALTH_ENDPOINT=1`; daemon-mode operators who run the health check externally can opt out with `OPENCHROME_HEALTH_ENDPOINT=0`. Invalid values (e.g. `yes`, `2`) fall through to the transport-mode default. |
|
|
538
541
|
|
|
539
542
|
### Individual flags
|
|
540
543
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* - Old snapshots are pruned to keep disk usage bounded.
|
|
14
14
|
* - All restore operations are best-effort (try/catch, non-fatal).
|
|
15
15
|
*/
|
|
16
|
+
import { IdleState } from '../utils/idle-state';
|
|
16
17
|
export interface BrowserSnapshot {
|
|
17
18
|
timestamp: number;
|
|
18
19
|
cookies: Array<{
|
|
@@ -32,13 +33,17 @@ export declare class BrowserStateManager {
|
|
|
32
33
|
private readonly intervalMs;
|
|
33
34
|
private readonly maxSnapshots;
|
|
34
35
|
private readonly snapshotDir;
|
|
36
|
+
private readonly idleState;
|
|
35
37
|
private lastSnapshotAt;
|
|
36
38
|
private snapshotCount;
|
|
39
|
+
private stopped;
|
|
40
|
+
private lastDelayMs;
|
|
37
41
|
private getCookiesFn;
|
|
38
42
|
private getTabUrlsFn;
|
|
39
43
|
constructor(opts?: {
|
|
40
44
|
intervalMs?: number;
|
|
41
45
|
maxSnapshots?: number;
|
|
46
|
+
idleState?: IdleState;
|
|
42
47
|
});
|
|
43
48
|
/**
|
|
44
49
|
* Register the cookie retrieval function (called from index.ts after CDP client is ready).
|
|
@@ -51,6 +56,13 @@ export declare class BrowserStateManager {
|
|
|
51
56
|
setTabUrlProvider(fn: () => Promise<string[]>): void;
|
|
52
57
|
start(): Promise<void>;
|
|
53
58
|
stop(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Current scheduling delay in ms — exposed for tests asserting the
|
|
61
|
+
* active/idle rate transition (issue #649 §3.1).
|
|
62
|
+
*/
|
|
63
|
+
getCurrentDelayMs(): number;
|
|
64
|
+
private nextDelayMs;
|
|
65
|
+
private scheduleNext;
|
|
54
66
|
takeSnapshot(): Promise<void>;
|
|
55
67
|
/**
|
|
56
68
|
* Load the latest snapshot's cookies (raw data for the caller to apply via CDP).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/browser-state/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/browser-state/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,EAAgC,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQ9E,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,YAAY,CAA0C;gBAElD,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IAOxF;;;OAGG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;IAIjD;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IAI9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAI3B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAed,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BnC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAmBjC,cAAc;IAkB5B,SAAS,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;CAG/D"}
|
|
@@ -53,19 +53,29 @@ const path = __importStar(require("path"));
|
|
|
53
53
|
const os = __importStar(require("os"));
|
|
54
54
|
const fs = __importStar(require("fs/promises"));
|
|
55
55
|
const defaults_1 = require("../config/defaults");
|
|
56
|
+
const idle_state_1 = require("../utils/idle-state");
|
|
57
|
+
/**
|
|
58
|
+
* Idle cadence. 300 s is 5× slower than the default 60 s active rate
|
|
59
|
+
* (issue #649 Part A §3.1 — snapshot is rebuilt on next RPC regardless).
|
|
60
|
+
*/
|
|
61
|
+
const IDLE_SNAPSHOT_INTERVAL_MS = 300_000;
|
|
56
62
|
class BrowserStateManager {
|
|
57
63
|
timer = null;
|
|
58
64
|
intervalMs;
|
|
59
65
|
maxSnapshots;
|
|
60
66
|
snapshotDir;
|
|
67
|
+
idleState;
|
|
61
68
|
lastSnapshotAt = 0;
|
|
62
69
|
snapshotCount = 0;
|
|
70
|
+
stopped = true;
|
|
71
|
+
lastDelayMs = 0;
|
|
63
72
|
getCookiesFn = null;
|
|
64
73
|
getTabUrlsFn = null;
|
|
65
74
|
constructor(opts) {
|
|
66
75
|
this.intervalMs = opts?.intervalMs ?? defaults_1.DEFAULT_SNAPSHOT_INTERVAL_MS;
|
|
67
76
|
this.maxSnapshots = opts?.maxSnapshots ?? defaults_1.DEFAULT_SNAPSHOT_MAX_COUNT;
|
|
68
77
|
this.snapshotDir = path.join(os.homedir(), '.openchrome', 'snapshots');
|
|
78
|
+
this.idleState = opts?.idleState ?? (0, idle_state_1.getIdleState)();
|
|
69
79
|
}
|
|
70
80
|
/**
|
|
71
81
|
* Register the cookie retrieval function (called from index.ts after CDP client is ready).
|
|
@@ -82,22 +92,44 @@ class BrowserStateManager {
|
|
|
82
92
|
}
|
|
83
93
|
async start() {
|
|
84
94
|
this.stop();
|
|
95
|
+
this.stopped = false;
|
|
85
96
|
await fs.mkdir(this.snapshotDir, { recursive: true });
|
|
86
97
|
// Don't take immediate snapshot — wait for first interval
|
|
87
|
-
this.
|
|
88
|
-
this.takeSnapshot().catch(err => {
|
|
89
|
-
console.error('[BrowserState] Snapshot failed:', err);
|
|
90
|
-
});
|
|
91
|
-
}, this.intervalMs);
|
|
92
|
-
this.timer.unref();
|
|
98
|
+
this.scheduleNext(this.nextDelayMs());
|
|
93
99
|
console.error(`[BrowserState] Snapshot service started (interval: ${this.intervalMs}ms, dir: ${this.snapshotDir})`);
|
|
94
100
|
}
|
|
95
101
|
stop() {
|
|
102
|
+
this.stopped = true;
|
|
96
103
|
if (this.timer) {
|
|
97
|
-
|
|
104
|
+
clearTimeout(this.timer);
|
|
98
105
|
this.timer = null;
|
|
99
106
|
}
|
|
100
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Current scheduling delay in ms — exposed for tests asserting the
|
|
110
|
+
* active/idle rate transition (issue #649 §3.1).
|
|
111
|
+
*/
|
|
112
|
+
getCurrentDelayMs() {
|
|
113
|
+
return this.lastDelayMs;
|
|
114
|
+
}
|
|
115
|
+
nextDelayMs() {
|
|
116
|
+
return this.idleState.isIdle(idle_state_1.IDLE_WINDOW_MS) ? IDLE_SNAPSHOT_INTERVAL_MS : this.intervalMs;
|
|
117
|
+
}
|
|
118
|
+
scheduleNext(delay) {
|
|
119
|
+
if (this.stopped)
|
|
120
|
+
return;
|
|
121
|
+
this.lastDelayMs = delay;
|
|
122
|
+
this.timer = setTimeout(() => {
|
|
123
|
+
this.takeSnapshot()
|
|
124
|
+
.catch(err => {
|
|
125
|
+
console.error('[BrowserState] Snapshot failed:', err);
|
|
126
|
+
})
|
|
127
|
+
.finally(() => {
|
|
128
|
+
this.scheduleNext(this.nextDelayMs());
|
|
129
|
+
});
|
|
130
|
+
}, delay);
|
|
131
|
+
this.timer.unref();
|
|
132
|
+
}
|
|
101
133
|
async takeSnapshot() {
|
|
102
134
|
if (!this.getCookiesFn)
|
|
103
135
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/browser-state/snapshot.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,uCAAyB;AACzB,gDAAkC;AAClC,iDAG4B;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/browser-state/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/cdp/client.d.ts
CHANGED
|
@@ -60,6 +60,8 @@ export declare class CDPClient {
|
|
|
60
60
|
private pingLatencies;
|
|
61
61
|
private static readonly MAX_PING_SAMPLES;
|
|
62
62
|
private static readonly COOKIE_CACHE_TTL;
|
|
63
|
+
private static readonly COOKIE_SOURCE_CACHE_MAX;
|
|
64
|
+
private static readonly COOKIE_DATA_CACHE_MAX;
|
|
63
65
|
private reconnecting;
|
|
64
66
|
private reconnectingAttempt;
|
|
65
67
|
private reconnectNextRetryAt;
|
|
@@ -100,6 +102,20 @@ export declare class CDPClient {
|
|
|
100
102
|
*/
|
|
101
103
|
private onTargetDestroyed;
|
|
102
104
|
private touchTargetActivity;
|
|
105
|
+
/**
|
|
106
|
+
* Insert or refresh an entry in cookieSourceCache with a FIFO size cap.
|
|
107
|
+
* When the cache is at capacity AND the key is new, the oldest-inserted
|
|
108
|
+
* entry is evicted. Existing keys update in place without eviction.
|
|
109
|
+
* See issue #647.
|
|
110
|
+
*/
|
|
111
|
+
private setCookieSourceCacheEntry;
|
|
112
|
+
/**
|
|
113
|
+
* Insert or refresh an entry in cookieDataCache with a FIFO size cap.
|
|
114
|
+
* When the cache is at capacity AND the key is new, the oldest-inserted
|
|
115
|
+
* entry is evicted. Existing keys update in place without eviction.
|
|
116
|
+
* See issue #647.
|
|
117
|
+
*/
|
|
118
|
+
private setCookieDataCacheEntry;
|
|
103
119
|
getLastCookieScanResult(): CookieScanResult | null;
|
|
104
120
|
/**
|
|
105
121
|
* Emit connection event
|
package/dist/cdp/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAkB,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0B9F,OAAO,EAAE,MAAM,EAAsB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAkB,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0B9F,OAAO,EAAE,MAAM,EAAsB,MAAM,iBAAiB,CAAC;AAmB7D,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,eAAe,GAAG,YAAY,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,wBAAwB,CAAmD;IACnF,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,4BAA4B,CAAK;IACzC,OAAO,CAAC,6BAA6B,CAAK;IAC1C,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,iBAAiB,CAAmE;IAC5F,OAAO,CAAC,eAAe,CAAyE;IAChG,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,mBAAmB,CAAqD;IAChF,OAAO,CAAC,oBAAoB,CAAiC;IAC7D,wFAAwF;IACxF,OAAO,CAAC,cAAc,CAA8B;IACpD,wFAAwF;IACxF,OAAO,CAAC,cAAc,CAAK;IAG3B,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,kBAAkB,CAA+B;IAGzD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IASlD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAM;IAGnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,oBAAoB,CAAK;IACjC,sEAAsE;IACtE,OAAO,CAAC,mBAAmB,CAAS;gBAExB,OAAO,GAAE,gBAAqB;IAU1C;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;;OAGG;IACH,gBAAgB,IAAI,MAAM;IAO1B;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIvE;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAO1E;;OAEG;IACH,0BAA0B,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAInF;;OAEG;IACH,6BAA6B,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAOtF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAgBjC;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAgB/B,uBAAuB,IAAI,gBAAgB,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA4BtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI;IA2BtE;;OAEG;IACH,OAAO,CAAC,6BAA6B;IASrC;;;;;OAKG;IACH,qBAAqB,IAAI,IAAI;IAO7B;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU;IAI5D;;;OAGG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,oBAAoB,IAAI;QACtB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,sBAAsB,EAAE,MAAM,CAAC;KAChC;IAoBD;;;;OAIG;YACW,eAAe;IAyD7B;;OAEG;YACW,gBAAgB;IA+H9B;;;;;;;;OAQG;YACW,eAAe;IAmM7B;;;;;;;;;OASG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6D3D;;;;;;;;OAQG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgElE;;;;OAIG;YACW,4BAA4B;IAqB1C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BjC;;OAEG;IACH,UAAU,IAAI,OAAO;IAQrB,MAAM,CAAC,QAAQ,CAAC,gBAAgB;;;MAAoB;IAEpD;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC;IAOrD;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;;;;;;;OAQG;IACG,2BAA2B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuC7E,6BAA6B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKlF;;;;OAIG;YACW,8BAA8B;IAqK5C;;;;OAIG;IACG,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAkHhF;;;;;OAKG;IACG,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAyF1G;;;;;;;;;OASG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA0N1G;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA+K7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAKjC;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuB7C;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAiC/D;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAWrD;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBpD;;;OAGG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAoBb;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;CAG1E;AAKD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAKlE;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAqC;IAEpD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;IAShE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;OAEG;IACH,MAAM,IAAI,SAAS,EAAE;IAIrB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CASrC;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD"}
|
package/dist/cdp/client.js
CHANGED
|
@@ -55,6 +55,7 @@ const with_timeout_1 = require("../utils/with-timeout");
|
|
|
55
55
|
const collector_1 = require("../metrics/collector");
|
|
56
56
|
const connection_1 = require("../errors/connection");
|
|
57
57
|
const fingerprint_defense_1 = require("../stealth/fingerprint-defense");
|
|
58
|
+
const idle_state_1 = require("../utils/idle-state");
|
|
58
59
|
function parseEnvInt(name, fallback) {
|
|
59
60
|
const raw = process.env[name];
|
|
60
61
|
if (raw === undefined)
|
|
@@ -105,6 +106,15 @@ class CDPClient {
|
|
|
105
106
|
pingLatencies = []; // rolling window
|
|
106
107
|
static MAX_PING_SAMPLES = 60; // ~5 min at 5s interval
|
|
107
108
|
static COOKIE_CACHE_TTL = 300000; // 5 minutes
|
|
109
|
+
// Bounded cookie cache sizes (see issue #647).
|
|
110
|
+
// Entries are evicted FIFO on write once at cap, and on read-miss when stale.
|
|
111
|
+
// Rationale:
|
|
112
|
+
// - 64 source entries ≈ 64 distinct domains per instance (edge case fan-out
|
|
113
|
+
// degrades gracefully to the existing fresh-scan slow path).
|
|
114
|
+
// - 16 data entries ≈ typical open-tab count; one entry holds a full cookie
|
|
115
|
+
// array (~50–100 KB) so this is the dominant memory line.
|
|
116
|
+
static COOKIE_SOURCE_CACHE_MAX = 64;
|
|
117
|
+
static COOKIE_DATA_CACHE_MAX = 16;
|
|
108
118
|
// Reconnection progress (exposed via getConnectionMetrics)
|
|
109
119
|
reconnecting = false;
|
|
110
120
|
reconnectingAttempt = 0;
|
|
@@ -202,6 +212,38 @@ class CDPClient {
|
|
|
202
212
|
touchTargetActivity(targetId) {
|
|
203
213
|
this.targetActivityAt.set(targetId, Date.now());
|
|
204
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Insert or refresh an entry in cookieSourceCache with a FIFO size cap.
|
|
217
|
+
* When the cache is at capacity AND the key is new, the oldest-inserted
|
|
218
|
+
* entry is evicted. Existing keys update in place without eviction.
|
|
219
|
+
* See issue #647.
|
|
220
|
+
*/
|
|
221
|
+
setCookieSourceCacheEntry(key, value) {
|
|
222
|
+
if (this.cookieSourceCache.size >= CDPClient.COOKIE_SOURCE_CACHE_MAX &&
|
|
223
|
+
!this.cookieSourceCache.has(key)) {
|
|
224
|
+
const firstKey = this.cookieSourceCache.keys().next().value;
|
|
225
|
+
if (firstKey !== undefined) {
|
|
226
|
+
this.cookieSourceCache.delete(firstKey);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
this.cookieSourceCache.set(key, value);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Insert or refresh an entry in cookieDataCache with a FIFO size cap.
|
|
233
|
+
* When the cache is at capacity AND the key is new, the oldest-inserted
|
|
234
|
+
* entry is evicted. Existing keys update in place without eviction.
|
|
235
|
+
* See issue #647.
|
|
236
|
+
*/
|
|
237
|
+
setCookieDataCacheEntry(key, value) {
|
|
238
|
+
if (this.cookieDataCache.size >= CDPClient.COOKIE_DATA_CACHE_MAX &&
|
|
239
|
+
!this.cookieDataCache.has(key)) {
|
|
240
|
+
const firstKey = this.cookieDataCache.keys().next().value;
|
|
241
|
+
if (firstKey !== undefined) {
|
|
242
|
+
this.cookieDataCache.delete(firstKey);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
this.cookieDataCache.set(key, value);
|
|
246
|
+
}
|
|
205
247
|
getLastCookieScanResult() {
|
|
206
248
|
return this.lastCookieScanResult;
|
|
207
249
|
}
|
|
@@ -610,6 +652,8 @@ class CDPClient {
|
|
|
610
652
|
// Set up disconnect handler
|
|
611
653
|
// Non-null assertion: the retry loop above either sets this.browser and breaks, or throws.
|
|
612
654
|
this.browser.on('disconnected', () => {
|
|
655
|
+
// Inbound CDP event — reset idle window (issue #649 Part A).
|
|
656
|
+
(0, idle_state_1.getIdleState)().notifyActive();
|
|
613
657
|
console.error('[CDPClient] Browser disconnected');
|
|
614
658
|
this.handleDisconnect().catch((err) => {
|
|
615
659
|
console.error('[CDPClient] handleDisconnect failed:', err);
|
|
@@ -617,11 +661,15 @@ class CDPClient {
|
|
|
617
661
|
});
|
|
618
662
|
// Set up target destroyed handler
|
|
619
663
|
this.browser.on('targetdestroyed', (0, safe_listener_1.safeAsyncListener)('targetdestroyed', async (target) => {
|
|
664
|
+
// Inbound CDP event — reset idle window (issue #649 Part A).
|
|
665
|
+
(0, idle_state_1.getIdleState)().notifyActive();
|
|
620
666
|
const targetId = (0, puppeteer_helpers_1.getTargetId)(target);
|
|
621
667
|
console.error(`[CDPClient] Target destroyed: ${targetId}`);
|
|
622
668
|
this.onTargetDestroyed(targetId);
|
|
623
669
|
}));
|
|
624
670
|
this.browser.on('targetchanged', (0, safe_listener_1.safeAsyncListener)('targetchanged', async (target) => {
|
|
671
|
+
// Inbound CDP event — reset idle window (issue #649 Part A).
|
|
672
|
+
(0, idle_state_1.getIdleState)().notifyActive();
|
|
625
673
|
if (target.type() !== 'page')
|
|
626
674
|
return;
|
|
627
675
|
const targetId = (0, puppeteer_helpers_1.getTargetId)(target);
|
|
@@ -639,6 +687,8 @@ class CDPClient {
|
|
|
639
687
|
// (popup/window.open). This makes OAuth redirects, popups, and cross-origin navigations
|
|
640
688
|
// visible without materializing unrelated Chrome-internal targets.
|
|
641
689
|
this.browser.on('targetcreated', (0, safe_listener_1.safeAsyncListener)('targetcreated', async (target) => {
|
|
690
|
+
// Inbound CDP event — reset idle window (issue #649 Part A).
|
|
691
|
+
(0, idle_state_1.getIdleState)().notifyActive();
|
|
642
692
|
// Only track 'page' type targets (skip service_worker, browser, etc.)
|
|
643
693
|
if (target.type() !== 'page')
|
|
644
694
|
return;
|
|
@@ -1001,6 +1051,11 @@ class CDPClient {
|
|
|
1001
1051
|
this.lastCookieScanResult = result;
|
|
1002
1052
|
return result;
|
|
1003
1053
|
}
|
|
1054
|
+
if (cached) {
|
|
1055
|
+
// Stale entry: drop it so the cache does not retain expired data when
|
|
1056
|
+
// the fresh scan path below produces a new result (see issue #647).
|
|
1057
|
+
this.cookieSourceCache.delete(cacheKey);
|
|
1058
|
+
}
|
|
1004
1059
|
// Promise coalescing: if a scan for this domain is already in-flight, reuse it
|
|
1005
1060
|
const existing = this.inFlightCookieScans.get(cacheKey);
|
|
1006
1061
|
if (existing) {
|
|
@@ -1145,7 +1200,7 @@ class CDPClient {
|
|
|
1145
1200
|
if (cookieCount > 0) {
|
|
1146
1201
|
const domainScore = targetDomain ? this.domainMatchScore(candidate.url, targetDomain) : 0;
|
|
1147
1202
|
console.error(`[CDPClient] Found authenticated page ${candidate.targetId.slice(0, 8)} at ${candidate.url.slice(0, 50)} (${cookieCount} cookies, domain score: ${domainScore})`);
|
|
1148
|
-
this.
|
|
1203
|
+
this.setCookieSourceCacheEntry(cacheKey, { targetId: candidate.targetId, timestamp: Date.now() });
|
|
1149
1204
|
this.touchTargetActivity(candidate.targetId);
|
|
1150
1205
|
const status = targetsScanned < candidates.length ? 'partial' : 'complete';
|
|
1151
1206
|
const resultSummary = buildResult(status, candidates.length, candidate.targetId);
|
|
@@ -1203,6 +1258,11 @@ class CDPClient {
|
|
|
1203
1258
|
await destSession.detach().catch(() => { });
|
|
1204
1259
|
}
|
|
1205
1260
|
}
|
|
1261
|
+
if (cachedData) {
|
|
1262
|
+
// Stale entry: drop it so the cache does not retain expired data when
|
|
1263
|
+
// the fresh scan path below produces a new result (see issue #647).
|
|
1264
|
+
this.cookieDataCache.delete(sourceTargetId);
|
|
1265
|
+
}
|
|
1206
1266
|
// Attach to the source target via the multiplexed browser CDP session
|
|
1207
1267
|
const browser = this.getBrowser();
|
|
1208
1268
|
const browserSession = await browser.target().createCDPSession();
|
|
@@ -1226,7 +1286,7 @@ class CDPClient {
|
|
|
1226
1286
|
const result = await browserSession.send('Network.getAllCookies', undefined, { sessionId });
|
|
1227
1287
|
const cookies = result?.cookies || [];
|
|
1228
1288
|
// Store in cookie data cache
|
|
1229
|
-
this.
|
|
1289
|
+
this.setCookieDataCacheEntry(sourceTargetId, { cookies, timestamp: Date.now() });
|
|
1230
1290
|
if (cookies.length === 0) {
|
|
1231
1291
|
console.error('[CDPClient] No cookies found in source page');
|
|
1232
1292
|
return 0;
|