agent-web-interface 4.1.1 → 4.3.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.
- package/dist/src/browser/session-manager.d.ts +28 -1
- package/dist/src/browser/session-manager.d.ts.map +1 -1
- package/dist/src/browser/session-manager.js +73 -0
- package/dist/src/browser/session-manager.js.map +1 -1
- package/dist/src/index.d.ts +10 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +66 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/server/mcp-server.d.ts +14 -1
- package/dist/src/server/mcp-server.d.ts.map +1 -1
- package/dist/src/server/mcp-server.js +50 -7
- package/dist/src/server/mcp-server.js.map +1 -1
- package/dist/src/server/session-store.d.ts +18 -3
- package/dist/src/server/session-store.d.ts.map +1 -1
- package/dist/src/server/session-store.js +27 -3
- package/dist/src/server/session-store.js.map +1 -1
- package/dist/src/session/session-worker-binding.d.ts +57 -0
- package/dist/src/session/session-worker-binding.d.ts.map +1 -0
- package/dist/src/session/session-worker-binding.js +109 -0
- package/dist/src/session/session-worker-binding.js.map +1 -0
- package/dist/src/shared/services/logging.service.d.ts +8 -0
- package/dist/src/shared/services/logging.service.d.ts.map +1 -1
- package/dist/src/shared/services/logging.service.js +10 -0
- package/dist/src/shared/services/logging.service.js.map +1 -1
- package/dist/src/snapshot/element-resolver.d.ts +35 -14
- package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
- package/dist/src/snapshot/element-resolver.js +109 -60
- package/dist/src/snapshot/element-resolver.js.map +1 -1
- package/dist/src/snapshot/index.d.ts +1 -1
- package/dist/src/snapshot/index.d.ts.map +1 -1
- package/dist/src/snapshot/index.js +1 -1
- package/dist/src/snapshot/index.js.map +1 -1
- package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
- package/dist/src/snapshot/snapshot-compiler.js +99 -2
- package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
- package/dist/src/snapshot/snapshot.types.d.ts +1 -1
- package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
- package/dist/src/snapshot/snapshot.types.js +1 -0
- package/dist/src/snapshot/snapshot.types.js.map +1 -1
- package/dist/src/state/actionables-filter.d.ts.map +1 -1
- package/dist/src/state/actionables-filter.js +1 -0
- package/dist/src/state/actionables-filter.js.map +1 -1
- package/dist/src/state/state-renderer.d.ts.map +1 -1
- package/dist/src/state/state-renderer.js +2 -0
- package/dist/src/state/state-renderer.js.map +1 -1
- package/dist/src/tools/browser-tools.d.ts +29 -8
- package/dist/src/tools/browser-tools.d.ts.map +1 -1
- package/dist/src/tools/browser-tools.js +93 -131
- package/dist/src/tools/browser-tools.js.map +1 -1
- package/dist/src/tools/canvas-tools.d.ts +32 -0
- package/dist/src/tools/canvas-tools.d.ts.map +1 -0
- package/dist/src/tools/canvas-tools.js +370 -0
- package/dist/src/tools/canvas-tools.js.map +1 -0
- package/dist/src/tools/form-tools.d.ts +2 -4
- package/dist/src/tools/form-tools.d.ts.map +1 -1
- package/dist/src/tools/form-tools.js +6 -38
- package/dist/src/tools/form-tools.js.map +1 -1
- package/dist/src/tools/index.d.ts +6 -4
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +13 -4
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/tool-context.d.ts +53 -0
- package/dist/src/tools/tool-context.d.ts.map +1 -0
- package/dist/src/tools/tool-context.js +119 -0
- package/dist/src/tools/tool-context.js.map +1 -0
- package/dist/src/tools/tool-result.types.d.ts +16 -1
- package/dist/src/tools/tool-result.types.d.ts.map +1 -1
- package/dist/src/tools/tool-result.types.js +11 -0
- package/dist/src/tools/tool-result.types.js.map +1 -1
- package/dist/src/tools/tool-schemas.d.ts +277 -150
- package/dist/src/tools/tool-schemas.d.ts.map +1 -1
- package/dist/src/tools/tool-schemas.js +85 -3
- package/dist/src/tools/tool-schemas.js.map +1 -1
- package/dist/src/worker/chrome-worker-process.d.ts +123 -0
- package/dist/src/worker/chrome-worker-process.d.ts.map +1 -0
- package/dist/src/worker/chrome-worker-process.js +294 -0
- package/dist/src/worker/chrome-worker-process.js.map +1 -0
- package/dist/src/worker/errors/index.d.ts +5 -0
- package/dist/src/worker/errors/index.d.ts.map +1 -0
- package/dist/src/worker/errors/index.js +5 -0
- package/dist/src/worker/errors/index.js.map +1 -0
- package/dist/src/worker/errors/worker.error.d.ts +122 -0
- package/dist/src/worker/errors/worker.error.d.ts.map +1 -0
- package/dist/src/worker/errors/worker.error.js +199 -0
- package/dist/src/worker/errors/worker.error.js.map +1 -0
- package/dist/src/worker/health-monitor.d.ts +141 -0
- package/dist/src/worker/health-monitor.d.ts.map +1 -0
- package/dist/src/worker/health-monitor.js +260 -0
- package/dist/src/worker/health-monitor.js.map +1 -0
- package/dist/src/worker/index.d.ts +16 -0
- package/dist/src/worker/index.d.ts.map +1 -0
- package/dist/src/worker/index.js +19 -0
- package/dist/src/worker/index.js.map +1 -0
- package/dist/src/worker/lease-manager.d.ts +137 -0
- package/dist/src/worker/lease-manager.d.ts.map +1 -0
- package/dist/src/worker/lease-manager.js +334 -0
- package/dist/src/worker/lease-manager.js.map +1 -0
- package/dist/src/worker/multi-tenant-config.d.ts +46 -0
- package/dist/src/worker/multi-tenant-config.d.ts.map +1 -0
- package/dist/src/worker/multi-tenant-config.js +94 -0
- package/dist/src/worker/multi-tenant-config.js.map +1 -0
- package/dist/src/worker/port-allocator.d.ts +96 -0
- package/dist/src/worker/port-allocator.d.ts.map +1 -0
- package/dist/src/worker/port-allocator.js +153 -0
- package/dist/src/worker/port-allocator.js.map +1 -0
- package/dist/src/worker/types.d.ts +218 -0
- package/dist/src/worker/types.d.ts.map +1 -0
- package/dist/src/worker/types.js +38 -0
- package/dist/src/worker/types.js.map +1 -0
- package/dist/src/worker/worker-manager.d.ts +157 -0
- package/dist/src/worker/worker-manager.d.ts.map +1 -0
- package/dist/src/worker/worker-manager.js +500 -0
- package/dist/src/worker/worker-manager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors the health of Chrome workers by periodically checking
|
|
5
|
+
* their CDP endpoints via /json/version.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import type { HealthCheckResult, HealthMonitorEvents } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Configuration for health checking
|
|
11
|
+
*/
|
|
12
|
+
export interface HealthCheckConfig {
|
|
13
|
+
/** Timeout for individual health checks (ms) */
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
/** Number of consecutive failures before considered unhealthy */
|
|
16
|
+
failureThreshold?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Track health state for a worker
|
|
20
|
+
*/
|
|
21
|
+
interface WorkerHealthState {
|
|
22
|
+
workerId: string;
|
|
23
|
+
port: number;
|
|
24
|
+
healthy: boolean;
|
|
25
|
+
consecutiveFailures: number;
|
|
26
|
+
lastCheck?: HealthCheckResult;
|
|
27
|
+
lastCheckTime?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Type-safe EventEmitter for HealthMonitor
|
|
31
|
+
*/
|
|
32
|
+
interface HealthMonitorEmitter {
|
|
33
|
+
on<K extends keyof HealthMonitorEvents>(event: K, listener: (data: HealthMonitorEvents[K]) => void): this;
|
|
34
|
+
once<K extends keyof HealthMonitorEvents>(event: K, listener: (data: HealthMonitorEvents[K]) => void): this;
|
|
35
|
+
emit<K extends keyof HealthMonitorEvents>(event: K, data: HealthMonitorEvents[K]): boolean;
|
|
36
|
+
off<K extends keyof HealthMonitorEvents>(event: K, listener: (data: HealthMonitorEvents[K]) => void): this;
|
|
37
|
+
removeAllListeners<K extends keyof HealthMonitorEvents>(event?: K): this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Monitors the health of Chrome workers.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const monitor = new HealthMonitor({ intervalMs: 30000 });
|
|
45
|
+
*
|
|
46
|
+
* monitor.on('healthChange', ({ workerId, healthy, result }) => {
|
|
47
|
+
* if (!healthy) {
|
|
48
|
+
* console.log(`Worker ${workerId} became unhealthy: ${result.error}`);
|
|
49
|
+
* }
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* monitor.registerWorker('w-123', 9300);
|
|
53
|
+
* monitor.start();
|
|
54
|
+
*
|
|
55
|
+
* // Later...
|
|
56
|
+
* monitor.unregisterWorker('w-123');
|
|
57
|
+
* monitor.stop();
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare class HealthMonitor extends EventEmitter implements HealthMonitorEmitter {
|
|
61
|
+
private readonly intervalMs;
|
|
62
|
+
private readonly config;
|
|
63
|
+
private readonly workers;
|
|
64
|
+
private intervalId;
|
|
65
|
+
private _isRunning;
|
|
66
|
+
constructor(intervalMs?: number, config?: HealthCheckConfig);
|
|
67
|
+
/**
|
|
68
|
+
* Check if the monitor is currently running
|
|
69
|
+
*/
|
|
70
|
+
get isRunning(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get the number of registered workers
|
|
73
|
+
*/
|
|
74
|
+
get workerCount(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Register a worker for health monitoring
|
|
77
|
+
*
|
|
78
|
+
* @param workerId - Unique worker identifier
|
|
79
|
+
* @param port - CDP port number
|
|
80
|
+
*/
|
|
81
|
+
registerWorker(workerId: string, port: number): void;
|
|
82
|
+
/**
|
|
83
|
+
* Unregister a worker from health monitoring
|
|
84
|
+
*
|
|
85
|
+
* @param workerId - Unique worker identifier
|
|
86
|
+
* @returns true if the worker was found and removed
|
|
87
|
+
*/
|
|
88
|
+
unregisterWorker(workerId: string): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Check if a worker is registered
|
|
91
|
+
*/
|
|
92
|
+
isWorkerRegistered(workerId: string): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Get the current health state of a worker
|
|
95
|
+
*/
|
|
96
|
+
getWorkerHealth(workerId: string): WorkerHealthState | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* Start periodic health monitoring
|
|
99
|
+
*/
|
|
100
|
+
start(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Stop periodic health monitoring
|
|
103
|
+
*/
|
|
104
|
+
stop(): void;
|
|
105
|
+
/**
|
|
106
|
+
* Check health of all registered workers
|
|
107
|
+
*/
|
|
108
|
+
checkAllWorkers(): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Check health of a specific worker by ID
|
|
111
|
+
*
|
|
112
|
+
* @param workerId - Worker identifier
|
|
113
|
+
* @returns Health check result
|
|
114
|
+
*/
|
|
115
|
+
checkWorkerById(workerId: string): Promise<HealthCheckResult>;
|
|
116
|
+
/**
|
|
117
|
+
* Perform a single health check on a worker
|
|
118
|
+
*/
|
|
119
|
+
private checkWorker;
|
|
120
|
+
/**
|
|
121
|
+
* Perform a health check against the CDP endpoint
|
|
122
|
+
*
|
|
123
|
+
* @param port - CDP port number
|
|
124
|
+
* @returns Health check result
|
|
125
|
+
*/
|
|
126
|
+
performHealthCheck(port: number): Promise<HealthCheckResult>;
|
|
127
|
+
/**
|
|
128
|
+
* Get all unhealthy workers
|
|
129
|
+
*/
|
|
130
|
+
getUnhealthyWorkers(): string[];
|
|
131
|
+
/**
|
|
132
|
+
* Reset health state for a worker (e.g., after restart)
|
|
133
|
+
*/
|
|
134
|
+
resetWorkerHealth(workerId: string): void;
|
|
135
|
+
/**
|
|
136
|
+
* Clear all registered workers
|
|
137
|
+
*/
|
|
138
|
+
clear(): void;
|
|
139
|
+
}
|
|
140
|
+
export {};
|
|
141
|
+
//# sourceMappingURL=health-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-monitor.d.ts","sourceRoot":"","sources":["../../../src/worker/health-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors the health of Chrome workers by periodically checking
|
|
5
|
+
* their CDP endpoints via /json/version.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { createLogger } from '../shared/services/logging.service.js';
|
|
9
|
+
const logger = createLogger('HealthMonitor');
|
|
10
|
+
/**
|
|
11
|
+
* Default health check configuration
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_HEALTH_CONFIG = {
|
|
14
|
+
timeoutMs: 5000,
|
|
15
|
+
failureThreshold: 3,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Monitors the health of Chrome workers.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const monitor = new HealthMonitor({ intervalMs: 30000 });
|
|
23
|
+
*
|
|
24
|
+
* monitor.on('healthChange', ({ workerId, healthy, result }) => {
|
|
25
|
+
* if (!healthy) {
|
|
26
|
+
* console.log(`Worker ${workerId} became unhealthy: ${result.error}`);
|
|
27
|
+
* }
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* monitor.registerWorker('w-123', 9300);
|
|
31
|
+
* monitor.start();
|
|
32
|
+
*
|
|
33
|
+
* // Later...
|
|
34
|
+
* monitor.unregisterWorker('w-123');
|
|
35
|
+
* monitor.stop();
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export class HealthMonitor extends EventEmitter {
|
|
39
|
+
intervalMs;
|
|
40
|
+
config;
|
|
41
|
+
workers = new Map();
|
|
42
|
+
intervalId = null;
|
|
43
|
+
_isRunning = false;
|
|
44
|
+
constructor(intervalMs = 30_000, config = {}) {
|
|
45
|
+
super();
|
|
46
|
+
this.intervalMs = intervalMs;
|
|
47
|
+
this.config = { ...DEFAULT_HEALTH_CONFIG, ...config };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if the monitor is currently running
|
|
51
|
+
*/
|
|
52
|
+
get isRunning() {
|
|
53
|
+
return this._isRunning;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the number of registered workers
|
|
57
|
+
*/
|
|
58
|
+
get workerCount() {
|
|
59
|
+
return this.workers.size;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Register a worker for health monitoring
|
|
63
|
+
*
|
|
64
|
+
* @param workerId - Unique worker identifier
|
|
65
|
+
* @param port - CDP port number
|
|
66
|
+
*/
|
|
67
|
+
registerWorker(workerId, port) {
|
|
68
|
+
if (this.workers.has(workerId)) {
|
|
69
|
+
logger.warning('Worker already registered for health monitoring', { workerId });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.workers.set(workerId, {
|
|
73
|
+
workerId,
|
|
74
|
+
port,
|
|
75
|
+
healthy: true, // Assume healthy until proven otherwise
|
|
76
|
+
consecutiveFailures: 0,
|
|
77
|
+
});
|
|
78
|
+
logger.debug('Worker registered for health monitoring', { workerId, port });
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Unregister a worker from health monitoring
|
|
82
|
+
*
|
|
83
|
+
* @param workerId - Unique worker identifier
|
|
84
|
+
* @returns true if the worker was found and removed
|
|
85
|
+
*/
|
|
86
|
+
unregisterWorker(workerId) {
|
|
87
|
+
const removed = this.workers.delete(workerId);
|
|
88
|
+
if (removed) {
|
|
89
|
+
logger.debug('Worker unregistered from health monitoring', { workerId });
|
|
90
|
+
}
|
|
91
|
+
return removed;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if a worker is registered
|
|
95
|
+
*/
|
|
96
|
+
isWorkerRegistered(workerId) {
|
|
97
|
+
return this.workers.has(workerId);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get the current health state of a worker
|
|
101
|
+
*/
|
|
102
|
+
getWorkerHealth(workerId) {
|
|
103
|
+
return this.workers.get(workerId);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Start periodic health monitoring
|
|
107
|
+
*/
|
|
108
|
+
start() {
|
|
109
|
+
if (this._isRunning) {
|
|
110
|
+
logger.warning('Health monitor is already running');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this._isRunning = true;
|
|
114
|
+
// Run initial check immediately
|
|
115
|
+
void this.checkAllWorkers();
|
|
116
|
+
// Set up periodic checks
|
|
117
|
+
this.intervalId = setInterval(() => {
|
|
118
|
+
void this.checkAllWorkers();
|
|
119
|
+
}, this.intervalMs);
|
|
120
|
+
logger.info('Health monitor started', { intervalMs: this.intervalMs });
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Stop periodic health monitoring
|
|
124
|
+
*/
|
|
125
|
+
stop() {
|
|
126
|
+
if (!this._isRunning) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (this.intervalId) {
|
|
130
|
+
clearInterval(this.intervalId);
|
|
131
|
+
this.intervalId = null;
|
|
132
|
+
}
|
|
133
|
+
this._isRunning = false;
|
|
134
|
+
logger.info('Health monitor stopped');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check health of all registered workers
|
|
138
|
+
*/
|
|
139
|
+
async checkAllWorkers() {
|
|
140
|
+
const checks = Array.from(this.workers.values()).map((state) => this.checkWorker(state));
|
|
141
|
+
await Promise.all(checks);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check health of a specific worker by ID
|
|
145
|
+
*
|
|
146
|
+
* @param workerId - Worker identifier
|
|
147
|
+
* @returns Health check result
|
|
148
|
+
*/
|
|
149
|
+
async checkWorkerById(workerId) {
|
|
150
|
+
const state = this.workers.get(workerId);
|
|
151
|
+
if (!state) {
|
|
152
|
+
return {
|
|
153
|
+
healthy: false,
|
|
154
|
+
error: `Worker ${workerId} is not registered`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return this.checkWorker(state);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Perform a single health check on a worker
|
|
161
|
+
*/
|
|
162
|
+
async checkWorker(state) {
|
|
163
|
+
const result = await this.performHealthCheck(state.port);
|
|
164
|
+
state.lastCheck = result;
|
|
165
|
+
state.lastCheckTime = Date.now();
|
|
166
|
+
const wasHealthy = state.healthy;
|
|
167
|
+
if (result.healthy) {
|
|
168
|
+
state.consecutiveFailures = 0;
|
|
169
|
+
state.healthy = true;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
state.consecutiveFailures++;
|
|
173
|
+
// Only mark as unhealthy after threshold is reached
|
|
174
|
+
if (state.consecutiveFailures >= this.config.failureThreshold) {
|
|
175
|
+
state.healthy = false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Emit event if health state changed
|
|
179
|
+
if (wasHealthy !== state.healthy) {
|
|
180
|
+
logger.info('Worker health state changed', {
|
|
181
|
+
workerId: state.workerId,
|
|
182
|
+
healthy: state.healthy,
|
|
183
|
+
consecutiveFailures: state.consecutiveFailures,
|
|
184
|
+
});
|
|
185
|
+
this.emit('healthChange', {
|
|
186
|
+
workerId: state.workerId,
|
|
187
|
+
healthy: state.healthy,
|
|
188
|
+
result,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Perform a health check against the CDP endpoint
|
|
195
|
+
*
|
|
196
|
+
* @param port - CDP port number
|
|
197
|
+
* @returns Health check result
|
|
198
|
+
*/
|
|
199
|
+
async performHealthCheck(port) {
|
|
200
|
+
const url = `http://127.0.0.1:${port}/json/version`;
|
|
201
|
+
const startTime = Date.now();
|
|
202
|
+
try {
|
|
203
|
+
const response = await fetch(url, {
|
|
204
|
+
signal: AbortSignal.timeout(this.config.timeoutMs),
|
|
205
|
+
});
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
return {
|
|
208
|
+
healthy: false,
|
|
209
|
+
responseTimeMs: Date.now() - startTime,
|
|
210
|
+
error: `HTTP ${response.status}: ${response.statusText}`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const versionInfo = (await response.json());
|
|
214
|
+
return {
|
|
215
|
+
healthy: true,
|
|
216
|
+
responseTimeMs: Date.now() - startTime,
|
|
217
|
+
versionInfo,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
const errorMessage = error instanceof Error
|
|
222
|
+
? error.name === 'TimeoutError'
|
|
223
|
+
? `Timeout after ${this.config.timeoutMs}ms`
|
|
224
|
+
: error.message
|
|
225
|
+
: String(error);
|
|
226
|
+
return {
|
|
227
|
+
healthy: false,
|
|
228
|
+
responseTimeMs: Date.now() - startTime,
|
|
229
|
+
error: errorMessage,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get all unhealthy workers
|
|
235
|
+
*/
|
|
236
|
+
getUnhealthyWorkers() {
|
|
237
|
+
return Array.from(this.workers.entries())
|
|
238
|
+
.filter(([_, state]) => !state.healthy)
|
|
239
|
+
.map(([workerId]) => workerId);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Reset health state for a worker (e.g., after restart)
|
|
243
|
+
*/
|
|
244
|
+
resetWorkerHealth(workerId) {
|
|
245
|
+
const state = this.workers.get(workerId);
|
|
246
|
+
if (state) {
|
|
247
|
+
state.healthy = true;
|
|
248
|
+
state.consecutiveFailures = 0;
|
|
249
|
+
state.lastCheck = undefined;
|
|
250
|
+
state.lastCheckTime = undefined;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Clear all registered workers
|
|
255
|
+
*/
|
|
256
|
+
clear() {
|
|
257
|
+
this.workers.clear();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=health-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-monitor.js","sourceRoot":"","sources":["../../../src/worker/health-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Module
|
|
3
|
+
*
|
|
4
|
+
* Exports the Browser Worker Manager system for managing tenant-bound
|
|
5
|
+
* Chrome workers with exclusive lease-based access control.
|
|
6
|
+
*/
|
|
7
|
+
export { WorkerManager } from './worker-manager.js';
|
|
8
|
+
export { WorkerError, type WorkerErrorCode } from './errors/index.js';
|
|
9
|
+
export type { WorkerState, LeaseStatus, WorkerDescriptor, LeaseDescriptor, LeaseAcquisitionResult, WorkerManagerConfig, PortRange, HealthCheckResult, CdpVersionInfo, WorkerProcessEvents, HealthMonitorEvents, WorkerManagerEvents, } from './types.js';
|
|
10
|
+
export { DEFAULT_WORKER_CONFIG, CHROME_WORKER_ARGS } from './types.js';
|
|
11
|
+
export { PortAllocator, type PortAllocatorConfig } from './port-allocator.js';
|
|
12
|
+
export { ChromeWorkerProcess, type ChromeWorkerProcessConfig, findChromePath, } from './chrome-worker-process.js';
|
|
13
|
+
export { HealthMonitor, type HealthCheckConfig } from './health-monitor.js';
|
|
14
|
+
export { LeaseManager, type LeaseManagerConfig } from './lease-manager.js';
|
|
15
|
+
export { getMultiTenantConfig, validateMultiTenantConfig, type MultiTenantConfig, } from './multi-tenant-config.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,YAAY,EACV,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,KAAK,iBAAiB,GACvB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Module
|
|
3
|
+
*
|
|
4
|
+
* Exports the Browser Worker Manager system for managing tenant-bound
|
|
5
|
+
* Chrome workers with exclusive lease-based access control.
|
|
6
|
+
*/
|
|
7
|
+
// Main orchestrator
|
|
8
|
+
export { WorkerManager } from './worker-manager.js';
|
|
9
|
+
// Error handling
|
|
10
|
+
export { WorkerError } from './errors/index.js';
|
|
11
|
+
export { DEFAULT_WORKER_CONFIG, CHROME_WORKER_ARGS } from './types.js';
|
|
12
|
+
// Component classes (for advanced usage/testing)
|
|
13
|
+
export { PortAllocator } from './port-allocator.js';
|
|
14
|
+
export { ChromeWorkerProcess, findChromePath, } from './chrome-worker-process.js';
|
|
15
|
+
export { HealthMonitor } from './health-monitor.js';
|
|
16
|
+
export { LeaseManager } from './lease-manager.js';
|
|
17
|
+
// Multi-tenant configuration
|
|
18
|
+
export { getMultiTenantConfig, validateMultiTenantConfig, } from './multi-tenant-config.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AAkBtE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvE,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,mBAAmB,EAEnB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAA0B,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAE3E,6BAA6B;AAC7B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,GAE1B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages exclusive leases for worker access.
|
|
5
|
+
* Each tenant can hold at most one lease at a time.
|
|
6
|
+
*/
|
|
7
|
+
import type { LeaseDescriptor, LeaseAcquisitionResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for LeaseManager
|
|
10
|
+
*/
|
|
11
|
+
export interface LeaseManagerConfig {
|
|
12
|
+
/** Default lease TTL in milliseconds */
|
|
13
|
+
defaultTtlMs: number;
|
|
14
|
+
/** Interval for checking expired leases (ms) */
|
|
15
|
+
cleanupIntervalMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Manages exclusive leases for tenant workers.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const leaseManager = new LeaseManager({ defaultTtlMs: 300000 });
|
|
23
|
+
*
|
|
24
|
+
* // Acquire a lease
|
|
25
|
+
* const result = leaseManager.acquire('tenant-a', 'controller-1', 'w-123');
|
|
26
|
+
* if (result.success) {
|
|
27
|
+
* console.log(`Lease acquired: ${result.lease.leaseId}`);
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* // Refresh the lease before it expires
|
|
31
|
+
* leaseManager.refresh('tenant-a');
|
|
32
|
+
*
|
|
33
|
+
* // Release when done
|
|
34
|
+
* leaseManager.release('tenant-a');
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class LeaseManager {
|
|
38
|
+
private readonly defaultTtlMs;
|
|
39
|
+
private readonly leases;
|
|
40
|
+
private cleanupIntervalId;
|
|
41
|
+
/** Callbacks for lease expiration */
|
|
42
|
+
private onLeaseExpiredCallbacks;
|
|
43
|
+
/** Callbacks for lease revocation */
|
|
44
|
+
private onLeaseRevokedCallbacks;
|
|
45
|
+
constructor(config: LeaseManagerConfig);
|
|
46
|
+
/**
|
|
47
|
+
* Get number of active leases
|
|
48
|
+
*/
|
|
49
|
+
get leaseCount(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Acquire a lease for a tenant
|
|
52
|
+
*
|
|
53
|
+
* @param tenantId - Tenant identifier
|
|
54
|
+
* @param controllerId - Controller/session identifier
|
|
55
|
+
* @param workerId - Worker to lease
|
|
56
|
+
* @param ttlMs - Optional custom TTL (uses default if not specified)
|
|
57
|
+
* @returns Lease acquisition result
|
|
58
|
+
*/
|
|
59
|
+
acquire(tenantId: string, controllerId: string, workerId: string, ttlMs?: number): LeaseAcquisitionResult;
|
|
60
|
+
/**
|
|
61
|
+
* Release a lease
|
|
62
|
+
*
|
|
63
|
+
* @param tenantId - Tenant identifier
|
|
64
|
+
* @param controllerId - Optional controller ID to validate ownership
|
|
65
|
+
* @returns true if lease was released
|
|
66
|
+
*/
|
|
67
|
+
release(tenantId: string, controllerId?: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Refresh a lease to extend its TTL
|
|
70
|
+
*
|
|
71
|
+
* @param tenantId - Tenant identifier
|
|
72
|
+
* @param ttlMs - Optional new TTL (uses default if not specified)
|
|
73
|
+
* @returns true if lease was refreshed
|
|
74
|
+
* @throws WorkerError if lease not found or expired
|
|
75
|
+
*/
|
|
76
|
+
refresh(tenantId: string, ttlMs?: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Revoke a lease (typically on worker crash)
|
|
79
|
+
*
|
|
80
|
+
* @param tenantId - Tenant identifier
|
|
81
|
+
* @param reason - Reason for revocation
|
|
82
|
+
*/
|
|
83
|
+
revoke(tenantId: string, reason: string): void;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a tenant has an active lease
|
|
86
|
+
*/
|
|
87
|
+
hasLease(tenantId: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Get the lease for a tenant (if any)
|
|
90
|
+
*/
|
|
91
|
+
getLease(tenantId: string): LeaseDescriptor | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* Get the lease holder (controller) for a tenant
|
|
94
|
+
*/
|
|
95
|
+
getLeaseHolder(tenantId: string): string | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Check if a specific controller holds the lease for a tenant
|
|
98
|
+
*/
|
|
99
|
+
isLeaseHeldBy(tenantId: string, controllerId: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Get the worker ID for a tenant's lease
|
|
102
|
+
*/
|
|
103
|
+
getWorkerIdForTenant(tenantId: string): string | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* Register a callback for lease expiration
|
|
106
|
+
*/
|
|
107
|
+
onLeaseExpired(callback: (lease: LeaseDescriptor) => void): void;
|
|
108
|
+
/**
|
|
109
|
+
* Register a callback for lease revocation
|
|
110
|
+
*/
|
|
111
|
+
onLeaseRevoked(callback: (lease: LeaseDescriptor, reason: string) => void): void;
|
|
112
|
+
/**
|
|
113
|
+
* Clean up expired leases
|
|
114
|
+
*/
|
|
115
|
+
cleanupExpired(): number;
|
|
116
|
+
/**
|
|
117
|
+
* Get all active leases
|
|
118
|
+
*/
|
|
119
|
+
getAllLeases(): LeaseDescriptor[];
|
|
120
|
+
/**
|
|
121
|
+
* Clear all leases
|
|
122
|
+
*/
|
|
123
|
+
clear(): void;
|
|
124
|
+
/**
|
|
125
|
+
* Stop the cleanup interval
|
|
126
|
+
*/
|
|
127
|
+
stop(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Internal: refresh lease TTL
|
|
130
|
+
*/
|
|
131
|
+
private refreshLease;
|
|
132
|
+
/**
|
|
133
|
+
* Internal: start cleanup interval
|
|
134
|
+
*/
|
|
135
|
+
private startCleanupInterval;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=lease-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease-manager.d.ts","sourceRoot":"","sources":["../../../src/worker/lease-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAM1E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,iBAAiB,CAA+C;IAExE,qCAAqC;IACrC,OAAO,CAAC,uBAAuB,CAA4C;IAC3E,qCAAqC;IACrC,OAAO,CAAC,uBAAuB,CAA4D;gBAE/E,MAAM,EAAE,kBAAkB;IAStC;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;;;;;OAQG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,sBAAsB;IA+DzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO;IA4BzD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAoBlD;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA4B9C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAanC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIvD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKpD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAW9D;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ1D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIhE;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhF;;OAEG;IACH,cAAc,IAAI,MAAM;IAoCxB;;OAEG;IACH,YAAY,IAAI,eAAe,EAAE;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}
|