agentic-qe 3.7.5 → 3.7.7
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/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +38 -0
- package/dist/cli/bundle.js +6220 -1373
- package/dist/cli/commands/security.d.ts.map +1 -1
- package/dist/cli/commands/security.js +66 -1
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/test.d.ts.map +1 -1
- package/dist/cli/commands/test.js +86 -3
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/index.js +119 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/coordination/workflow-orchestrator.d.ts.map +1 -1
- package/dist/coordination/workflow-orchestrator.js +2 -6
- package/dist/coordination/workflow-orchestrator.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.d.ts +71 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.d.ts.map +1 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.js +456 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.js.map +1 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.d.ts +81 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.d.ts.map +1 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.js +20 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.js.map +1 -0
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.d.ts +19 -0
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.js +82 -0
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/index.d.ts +2 -0
- package/dist/domains/test-execution/services/e2e/index.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/index.js +5 -0
- package/dist/domains/test-execution/services/e2e/index.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/step-executors.d.ts +6 -0
- package/dist/domains/test-execution/services/e2e/step-executors.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/step-executors.js +17 -2
- package/dist/domains/test-execution/services/e2e/step-executors.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/types.d.ts +18 -1
- package/dist/domains/test-execution/services/e2e/types.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/types.js.map +1 -1
- package/dist/integrations/browser/client-factory.d.ts +6 -1
- package/dist/integrations/browser/client-factory.d.ts.map +1 -1
- package/dist/integrations/browser/client-factory.js +37 -2
- package/dist/integrations/browser/client-factory.js.map +1 -1
- package/dist/integrations/browser/index.d.ts +5 -1
- package/dist/integrations/browser/index.d.ts.map +1 -1
- package/dist/integrations/browser/index.js +8 -1
- package/dist/integrations/browser/index.js.map +1 -1
- package/dist/integrations/browser/page-pool-types.d.ts +70 -0
- package/dist/integrations/browser/page-pool-types.d.ts.map +1 -0
- package/dist/integrations/browser/page-pool-types.js +19 -0
- package/dist/integrations/browser/page-pool-types.js.map +1 -0
- package/dist/integrations/browser/page-pool.d.ts +79 -0
- package/dist/integrations/browser/page-pool.d.ts.map +1 -0
- package/dist/integrations/browser/page-pool.js +288 -0
- package/dist/integrations/browser/page-pool.js.map +1 -0
- package/dist/integrations/browser/resource-blocking.d.ts +47 -0
- package/dist/integrations/browser/resource-blocking.d.ts.map +1 -0
- package/dist/integrations/browser/resource-blocking.js +195 -0
- package/dist/integrations/browser/resource-blocking.js.map +1 -0
- package/dist/integrations/browser/stealth/index.d.ts +8 -0
- package/dist/integrations/browser/stealth/index.d.ts.map +1 -0
- package/dist/integrations/browser/stealth/index.js +7 -0
- package/dist/integrations/browser/stealth/index.js.map +1 -0
- package/dist/integrations/browser/stealth/stealth-client.d.ts +51 -0
- package/dist/integrations/browser/stealth/stealth-client.d.ts.map +1 -0
- package/dist/integrations/browser/stealth/stealth-client.js +359 -0
- package/dist/integrations/browser/stealth/stealth-client.js.map +1 -0
- package/dist/integrations/browser/stealth/stealth-types.d.ts +35 -0
- package/dist/integrations/browser/stealth/stealth-types.d.ts.map +1 -0
- package/dist/integrations/browser/stealth/stealth-types.js +17 -0
- package/dist/integrations/browser/stealth/stealth-types.js.map +1 -0
- package/dist/integrations/browser/types.d.ts +13 -10
- package/dist/integrations/browser/types.d.ts.map +1 -1
- package/dist/integrations/browser/types.js.map +1 -1
- package/dist/mcp/bundle.js +5090 -222
- package/dist/mcp/handlers/core-handlers.d.ts.map +1 -1
- package/dist/mcp/handlers/core-handlers.js +35 -0
- package/dist/mcp/handlers/core-handlers.js.map +1 -1
- package/dist/mcp/protocol-server.d.ts.map +1 -1
- package/dist/mcp/protocol-server.js +4 -1
- package/dist/mcp/protocol-server.js.map +1 -1
- package/dist/mcp/qe-tool-bridge.d.ts +27 -0
- package/dist/mcp/qe-tool-bridge.d.ts.map +1 -0
- package/dist/mcp/qe-tool-bridge.js +87 -0
- package/dist/mcp/qe-tool-bridge.js.map +1 -0
- package/dist/mcp/tools/registry.d.ts +4 -0
- package/dist/mcp/tools/registry.d.ts.map +1 -1
- package/dist/mcp/tools/registry.js +20 -0
- package/dist/mcp/tools/registry.js.map +1 -1
- package/dist/mcp/tools/security-compliance/visual-security.d.ts +45 -0
- package/dist/mcp/tools/security-compliance/visual-security.d.ts.map +1 -0
- package/dist/mcp/tools/security-compliance/visual-security.js +218 -0
- package/dist/mcp/tools/security-compliance/visual-security.js.map +1 -0
- package/dist/mcp/tools/test-execution/browser-workflow.d.ts +50 -0
- package/dist/mcp/tools/test-execution/browser-workflow.d.ts.map +1 -0
- package/dist/mcp/tools/test-execution/browser-workflow.js +145 -0
- package/dist/mcp/tools/test-execution/browser-workflow.js.map +1 -0
- package/dist/mcp/tools/test-execution/load-test.d.ts +37 -0
- package/dist/mcp/tools/test-execution/load-test.d.ts.map +1 -0
- package/dist/mcp/tools/test-execution/load-test.js +98 -0
- package/dist/mcp/tools/test-execution/load-test.js.map +1 -0
- package/dist/mcp/tools/test-execution/schedule.d.ts +44 -0
- package/dist/mcp/tools/test-execution/schedule.d.ts.map +1 -0
- package/dist/mcp/tools/test-execution/schedule.js +96 -0
- package/dist/mcp/tools/test-execution/schedule.js.map +1 -0
- package/dist/planning/goap-planner.d.ts.map +1 -1
- package/dist/planning/goap-planner.js +7 -28
- package/dist/planning/goap-planner.js.map +1 -1
- package/dist/planning/plan-executor.d.ts.map +1 -1
- package/dist/planning/plan-executor.js +7 -28
- package/dist/planning/plan-executor.js.map +1 -1
- package/package.json +3 -10
- package/dist/cli/commands/qe-tools.d.ts +0 -27
- package/dist/cli/commands/qe-tools.d.ts.map +0 -1
- package/dist/cli/commands/qe-tools.js +0 -771
- package/dist/cli/commands/qe-tools.js.map +0 -1
- package/dist/neural-optimizer/index.d.ts +0 -55
- package/dist/neural-optimizer/index.d.ts.map +0 -1
- package/dist/neural-optimizer/index.js +0 -57
- package/dist/neural-optimizer/index.js.map +0 -1
- package/dist/neural-optimizer/replay-buffer.d.ts +0 -126
- package/dist/neural-optimizer/replay-buffer.d.ts.map +0 -1
- package/dist/neural-optimizer/replay-buffer.js +0 -356
- package/dist/neural-optimizer/replay-buffer.js.map +0 -1
- package/dist/neural-optimizer/swarm-topology.d.ts +0 -157
- package/dist/neural-optimizer/swarm-topology.d.ts.map +0 -1
- package/dist/neural-optimizer/swarm-topology.js +0 -384
- package/dist/neural-optimizer/swarm-topology.js.map +0 -1
- package/dist/neural-optimizer/topology-optimizer.d.ts +0 -137
- package/dist/neural-optimizer/topology-optimizer.d.ts.map +0 -1
- package/dist/neural-optimizer/topology-optimizer.js +0 -657
- package/dist/neural-optimizer/topology-optimizer.js.map +0 -1
- package/dist/neural-optimizer/types.d.ts +0 -333
- package/dist/neural-optimizer/types.d.ts.map +0 -1
- package/dist/neural-optimizer/types.js +0 -57
- package/dist/neural-optimizer/types.js.map +0 -1
- package/dist/neural-optimizer/value-network.d.ts +0 -129
- package/dist/neural-optimizer/value-network.d.ts.map +0 -1
- package/dist/neural-optimizer/value-network.js +0 -279
- package/dist/neural-optimizer/value-network.js.map +0 -1
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { BrowserUnavailableError } from './types';
|
|
27
27
|
import { AgentBrowserClient } from './agent-browser/client';
|
|
28
|
+
import { StealthBrowserClient } from './stealth/stealth-client';
|
|
28
29
|
// ============================================================================
|
|
29
30
|
// Availability Checks
|
|
30
31
|
// ============================================================================
|
|
@@ -72,6 +73,12 @@ const AGENT_BROWSER_REQUIRED_USE_CASES = [
|
|
|
72
73
|
'responsive-testing', // Requires device emulation
|
|
73
74
|
'auth-testing', // Requires state persistence
|
|
74
75
|
];
|
|
76
|
+
/**
|
|
77
|
+
* Use cases that prefer the stealth browser client
|
|
78
|
+
*/
|
|
79
|
+
const STEALTH_PREFERRED_USE_CASES = [
|
|
80
|
+
'stealth-testing', // Bot-protected environments
|
|
81
|
+
];
|
|
75
82
|
/**
|
|
76
83
|
* Use cases that can use either tool
|
|
77
84
|
* Both Vibium and agent-browser support these capabilities
|
|
@@ -206,6 +213,12 @@ class VibiumClientStub {
|
|
|
206
213
|
*/
|
|
207
214
|
export async function createBrowserClient(options = {}) {
|
|
208
215
|
const { preference = 'auto', useCase } = options;
|
|
216
|
+
// If use case prefers stealth, try it first
|
|
217
|
+
if (useCase && STEALTH_PREFERRED_USE_CASES.includes(useCase)) {
|
|
218
|
+
if (await isStealthAvailable()) {
|
|
219
|
+
return new StealthBrowserClient();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
209
222
|
// If use case requires agent-browser, use it directly
|
|
210
223
|
if (useCase && requiresAgentBrowser(useCase)) {
|
|
211
224
|
return createAgentBrowserClient();
|
|
@@ -214,6 +227,12 @@ export async function createBrowserClient(options = {}) {
|
|
|
214
227
|
if (preference === 'agent-browser') {
|
|
215
228
|
return createAgentBrowserClient();
|
|
216
229
|
}
|
|
230
|
+
if (preference === 'stealth') {
|
|
231
|
+
if (await isStealthAvailable()) {
|
|
232
|
+
return new StealthBrowserClient();
|
|
233
|
+
}
|
|
234
|
+
throw new BrowserUnavailableError('stealth', 'Patchright is not installed');
|
|
235
|
+
}
|
|
217
236
|
if (preference === 'vibium') {
|
|
218
237
|
const available = await isVibiumAvailable();
|
|
219
238
|
if (available) {
|
|
@@ -298,11 +317,12 @@ export async function getBrowserClientForUseCase(useCase) {
|
|
|
298
317
|
* @returns Promise<{ vibium: boolean; agentBrowser: boolean }> Availability status
|
|
299
318
|
*/
|
|
300
319
|
export async function getBrowserToolAvailability() {
|
|
301
|
-
const [vibium, agentBrowser] = await Promise.all([
|
|
320
|
+
const [vibium, agentBrowser, stealth] = await Promise.all([
|
|
302
321
|
isVibiumAvailable(),
|
|
303
322
|
isAgentBrowserAvailable(),
|
|
323
|
+
isStealthAvailable(),
|
|
304
324
|
]);
|
|
305
|
-
return { vibium, agentBrowser };
|
|
325
|
+
return { vibium, agentBrowser, stealth };
|
|
306
326
|
}
|
|
307
327
|
/**
|
|
308
328
|
* Get the recommended tool for a use case
|
|
@@ -311,6 +331,9 @@ export async function getBrowserToolAvailability() {
|
|
|
311
331
|
* @returns 'agent-browser' | 'vibium' | 'either' Recommendation
|
|
312
332
|
*/
|
|
313
333
|
export function getRecommendedToolForUseCase(useCase) {
|
|
334
|
+
if (STEALTH_PREFERRED_USE_CASES.includes(useCase)) {
|
|
335
|
+
return 'stealth';
|
|
336
|
+
}
|
|
314
337
|
if (requiresAgentBrowser(useCase)) {
|
|
315
338
|
return 'agent-browser';
|
|
316
339
|
}
|
|
@@ -320,4 +343,16 @@ export function getRecommendedToolForUseCase(useCase) {
|
|
|
320
343
|
// Default to either for any unknown use cases
|
|
321
344
|
return 'either';
|
|
322
345
|
}
|
|
346
|
+
/**
|
|
347
|
+
* Check if stealth browser (Patchright) is available
|
|
348
|
+
*/
|
|
349
|
+
export async function isStealthAvailable() {
|
|
350
|
+
try {
|
|
351
|
+
const client = new StealthBrowserClient();
|
|
352
|
+
return await client.isAvailable();
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
323
358
|
//# sourceMappingURL=client-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../../../src/integrations/browser/client-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../../../src/integrations/browser/client-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,11 @@
|
|
|
49
49
|
* - For Auth Testing: Use agent-browser (state persistence)
|
|
50
50
|
*/
|
|
51
51
|
export { type ElementTarget, type BrowserToolPreference, type BrowserUseCase, type BrowserLaunchOptions, type BrowserSessionInfo, type BrowserNavigateResult, type BrowserScreenshotResult, type SnapshotElement, type ParsedSnapshot, type IBrowserClient, type IAgentBrowserClient, BrowserError, BrowserUnavailableError, BrowserTimeoutError, BrowserElementNotFoundError, } from './types';
|
|
52
|
-
export { type BrowserClientFactoryOptions, createBrowserClient, createAgentBrowserClient, getBrowserClientForUseCase, isVibiumAvailable, isAgentBrowserAvailable, getBrowserToolAvailability, getRecommendedToolForUseCase, } from './client-factory';
|
|
52
|
+
export { type BrowserClientFactoryOptions, createBrowserClient, createAgentBrowserClient, getBrowserClientForUseCase, isVibiumAvailable, isAgentBrowserAvailable, isStealthAvailable, getBrowserToolAvailability, getRecommendedToolForUseCase, } from './client-factory';
|
|
53
53
|
export { AgentBrowserClient } from './agent-browser/client';
|
|
54
|
+
export { type ResourceCategory, type ResourceBlockingConfig, type ResourceBlockingPreset, shouldBlockRequest, getResourceBlockingPreset, } from './resource-blocking';
|
|
55
|
+
export { BrowserPagePool, createBrowserPagePool, } from './page-pool';
|
|
56
|
+
export { type PageState, type PooledPage, type BrowserPagePoolConfig, type PagePoolStats, DEFAULT_PAGE_POOL_CONFIG, } from './page-pool-types';
|
|
57
|
+
export { StealthBrowserClient, type StealthBrowserConfig, DEFAULT_STEALTH_CONFIG, } from './stealth';
|
|
54
58
|
export { WebContentFetcher, createWebContentFetcher, fetchWebContent, type FetchTier, type FetchStatus, type WebContentFetchResult, type WebContentFetchOptions, } from './web-content-fetcher';
|
|
55
59
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAEL,KAAK,2BAA2B,EAEhC,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAE1B,iBAAiB,EACjB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAEL,KAAK,2BAA2B,EAEhC,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAE1B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAElB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,eAAe,EACf,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAEL,iBAAiB,EAEjB,uBAAuB,EACvB,eAAe,EAEf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC"}
|
|
@@ -56,11 +56,18 @@ export {
|
|
|
56
56
|
// Main factory functions
|
|
57
57
|
createBrowserClient, createAgentBrowserClient, getBrowserClientForUseCase,
|
|
58
58
|
// Availability checks
|
|
59
|
-
isVibiumAvailable, isAgentBrowserAvailable,
|
|
59
|
+
isVibiumAvailable, isAgentBrowserAvailable, isStealthAvailable,
|
|
60
60
|
// Utility functions
|
|
61
61
|
getBrowserToolAvailability, getRecommendedToolForUseCase, } from './client-factory';
|
|
62
62
|
// Re-export AgentBrowserClient for direct instantiation if needed
|
|
63
63
|
export { AgentBrowserClient } from './agent-browser/client';
|
|
64
|
+
// Resource Blocking
|
|
65
|
+
export { shouldBlockRequest, getResourceBlockingPreset, } from './resource-blocking';
|
|
66
|
+
// Page Pool
|
|
67
|
+
export { BrowserPagePool, createBrowserPagePool, } from './page-pool';
|
|
68
|
+
export { DEFAULT_PAGE_POOL_CONFIG, } from './page-pool-types';
|
|
69
|
+
// Stealth Browser
|
|
70
|
+
export { StealthBrowserClient, DEFAULT_STEALTH_CONFIG, } from './stealth';
|
|
64
71
|
// Web Content Fetcher - 5-tier browser cascade
|
|
65
72
|
export {
|
|
66
73
|
// Main class
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO;AAcL,SAAS;AACT,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AAEjB,oBAAoB;AACpB,OAAO;AAGL,yBAAyB;AACzB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B;AAC1B,sBAAsB;AACtB,iBAAiB,EACjB,uBAAuB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO;AAcL,SAAS;AACT,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AAEjB,oBAAoB;AACpB,OAAO;AAGL,yBAAyB;AACzB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B;AAC1B,sBAAsB;AACtB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB;AAClB,oBAAoB;AACpB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAE1B,kEAAkE;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,oBAAoB;AACpB,OAAO,EAIL,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,YAAY;AACZ,OAAO,EACL,eAAe,EACf,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAKL,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EAEpB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAEnB,+CAA+C;AAC/C,OAAO;AACL,aAAa;AACb,iBAAiB;AACjB,oBAAoB;AACpB,uBAAuB,EACvB,eAAe,GAMhB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Page Pool Types
|
|
3
|
+
*
|
|
4
|
+
* Manages concurrent browser pages for parallel E2E test execution.
|
|
5
|
+
* Follows the ConnectionPoolImpl pattern from src/mcp/connection-pool.ts.
|
|
6
|
+
*
|
|
7
|
+
* @module integrations/browser/page-pool-types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* State of a pooled browser page
|
|
11
|
+
*/
|
|
12
|
+
export type PageState = 'ready' | 'busy' | 'error' | 'closed';
|
|
13
|
+
/**
|
|
14
|
+
* A managed browser page within the pool
|
|
15
|
+
*/
|
|
16
|
+
export interface PooledPage {
|
|
17
|
+
/** Unique page identifier */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Current page state */
|
|
20
|
+
state: PageState;
|
|
21
|
+
/** When the page was created (ms since epoch) */
|
|
22
|
+
createdAt: number;
|
|
23
|
+
/** When the page was last used (ms since epoch) */
|
|
24
|
+
lastUsedAt: number;
|
|
25
|
+
/** Health score (0-1, where 1 is healthy) */
|
|
26
|
+
health: number;
|
|
27
|
+
/** Current URL */
|
|
28
|
+
url?: string;
|
|
29
|
+
/** Cumulative error count */
|
|
30
|
+
errorCount: number;
|
|
31
|
+
/** Total requests served by this page */
|
|
32
|
+
requestsServed: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Browser page pool configuration
|
|
36
|
+
*/
|
|
37
|
+
export interface BrowserPagePoolConfig {
|
|
38
|
+
/** Maximum concurrent pages (default: 6) */
|
|
39
|
+
maxPages: number;
|
|
40
|
+
/** Minimum pre-warmed pages (default: 1) */
|
|
41
|
+
minPages: number;
|
|
42
|
+
/** Idle timeout before page is closed in ms (default: 120000) */
|
|
43
|
+
idleTimeoutMs: number;
|
|
44
|
+
/** Health check interval in ms (default: 15000) */
|
|
45
|
+
healthCheckIntervalMs: number;
|
|
46
|
+
/** Minimum health score to keep a page (default: 0.5) */
|
|
47
|
+
healthThreshold: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Default page pool configuration
|
|
51
|
+
*/
|
|
52
|
+
export declare const DEFAULT_PAGE_POOL_CONFIG: BrowserPagePoolConfig;
|
|
53
|
+
/**
|
|
54
|
+
* Page pool statistics for monitoring
|
|
55
|
+
*/
|
|
56
|
+
export interface PagePoolStats {
|
|
57
|
+
/** Total pages in the pool */
|
|
58
|
+
totalPages: number;
|
|
59
|
+
/** Pages ready for use */
|
|
60
|
+
readyPages: number;
|
|
61
|
+
/** Pages currently in use */
|
|
62
|
+
busyPages: number;
|
|
63
|
+
/** Pages in error state */
|
|
64
|
+
errorPages: number;
|
|
65
|
+
/** Ratio of successful acquisitions to total attempts */
|
|
66
|
+
poolHitRate: number;
|
|
67
|
+
/** Average time to acquire a page in ms */
|
|
68
|
+
avgAcquisitionTimeMs: number;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=page-pool-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-pool-types.d.ts","sourceRoot":"","sources":["../../../src/integrations/browser/page-pool-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,qBAMtC,CAAC;AAMF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Page Pool Types
|
|
3
|
+
*
|
|
4
|
+
* Manages concurrent browser pages for parallel E2E test execution.
|
|
5
|
+
* Follows the ConnectionPoolImpl pattern from src/mcp/connection-pool.ts.
|
|
6
|
+
*
|
|
7
|
+
* @module integrations/browser/page-pool-types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default page pool configuration
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_PAGE_POOL_CONFIG = {
|
|
13
|
+
maxPages: 6,
|
|
14
|
+
minPages: 1,
|
|
15
|
+
idleTimeoutMs: 120_000,
|
|
16
|
+
healthCheckIntervalMs: 15_000,
|
|
17
|
+
healthThreshold: 0.5,
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=page-pool-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-pool-types.js","sourceRoot":"","sources":["../../../src/integrations/browser/page-pool-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqDH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA0B;IAC7D,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,aAAa,EAAE,OAAO;IACtB,qBAAqB,EAAE,MAAM;IAC7B,eAAe,EAAE,GAAG;CACrB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Page Pool
|
|
3
|
+
*
|
|
4
|
+
* Manages concurrent browser pages with state tracking for parallel E2E execution.
|
|
5
|
+
* Follows the ConnectionPoolImpl pattern from src/mcp/connection-pool.ts.
|
|
6
|
+
*
|
|
7
|
+
* @module integrations/browser/page-pool
|
|
8
|
+
*/
|
|
9
|
+
import type { PooledPage, BrowserPagePoolConfig, PagePoolStats } from './page-pool-types';
|
|
10
|
+
/**
|
|
11
|
+
* Browser Page Pool
|
|
12
|
+
*
|
|
13
|
+
* Manages a pool of browser pages for concurrent E2E test execution.
|
|
14
|
+
* Uses semaphore pattern for thread-safe acquisition and idle set for O(1) lookup.
|
|
15
|
+
*/
|
|
16
|
+
export declare class BrowserPagePool {
|
|
17
|
+
private readonly pages;
|
|
18
|
+
private readonly readyPages;
|
|
19
|
+
private readonly config;
|
|
20
|
+
private healthCheckInterval;
|
|
21
|
+
private initialized;
|
|
22
|
+
private totalRequests;
|
|
23
|
+
private cacheHits;
|
|
24
|
+
private acquisitionTimes;
|
|
25
|
+
private readonly MAX_SAMPLES;
|
|
26
|
+
private acquireQueue;
|
|
27
|
+
private processing;
|
|
28
|
+
constructor(config?: Partial<BrowserPagePoolConfig>);
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the pool, pre-warming minPages
|
|
31
|
+
*/
|
|
32
|
+
initialize(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Acquire a ready page from the pool (sync fast path)
|
|
35
|
+
*/
|
|
36
|
+
acquire(): PooledPage | null;
|
|
37
|
+
/**
|
|
38
|
+
* Acquire a page asynchronously (thread-safe for concurrent callers)
|
|
39
|
+
*/
|
|
40
|
+
acquireAsync(): Promise<PooledPage | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Release a page back to the pool.
|
|
43
|
+
* If there are pending acquireAsync waiters, resolves the next one immediately.
|
|
44
|
+
*/
|
|
45
|
+
release(pageId: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Mark a page as errored
|
|
48
|
+
*/
|
|
49
|
+
markError(pageId: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Remove errored and timed-out pages, maintain minPages
|
|
52
|
+
*/
|
|
53
|
+
prune(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Get pool statistics
|
|
56
|
+
*/
|
|
57
|
+
getStats(): PagePoolStats;
|
|
58
|
+
/**
|
|
59
|
+
* Shut down the pool and release all resources
|
|
60
|
+
*/
|
|
61
|
+
shutdown(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Get a page by id (for diagnostics)
|
|
64
|
+
*/
|
|
65
|
+
getPage(pageId: string): PooledPage | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Get all pages (for diagnostics)
|
|
68
|
+
*/
|
|
69
|
+
getAllPages(): PooledPage[];
|
|
70
|
+
private createPage;
|
|
71
|
+
private processQueue;
|
|
72
|
+
private runHealthChecks;
|
|
73
|
+
private trackAcquisitionTime;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a new browser page pool instance
|
|
77
|
+
*/
|
|
78
|
+
export declare function createBrowserPagePool(config?: Partial<BrowserPagePoolConfig>): BrowserPagePool;
|
|
79
|
+
//# sourceMappingURL=page-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-pool.d.ts","sourceRoot":"","sources":["../../../src/integrations/browser/page-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAEV,UAAU,EACV,qBAAqB,EACrB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAO3B;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,mBAAmB,CAA+C;IAC1E,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IAGnC,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAInD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;IACH,OAAO,IAAI,UAAU,GAAG,IAAI;IA8B5B;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAO1C;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAuB7B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU/B;;OAEG;IACH,KAAK,IAAI,MAAM;IA2Bf;;OAEG;IACH,QAAQ,IAAI,aAAa;IAkCzB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB/B;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI/C;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAQ3B,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,oBAAoB;CAM7B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACtC,eAAe,CAEjB"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Page Pool
|
|
3
|
+
*
|
|
4
|
+
* Manages concurrent browser pages with state tracking for parallel E2E execution.
|
|
5
|
+
* Follows the ConnectionPoolImpl pattern from src/mcp/connection-pool.ts.
|
|
6
|
+
*
|
|
7
|
+
* @module integrations/browser/page-pool
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from 'crypto';
|
|
10
|
+
import { DEFAULT_PAGE_POOL_CONFIG } from './page-pool-types';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Browser Page Pool
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Browser Page Pool
|
|
16
|
+
*
|
|
17
|
+
* Manages a pool of browser pages for concurrent E2E test execution.
|
|
18
|
+
* Uses semaphore pattern for thread-safe acquisition and idle set for O(1) lookup.
|
|
19
|
+
*/
|
|
20
|
+
export class BrowserPagePool {
|
|
21
|
+
pages = new Map();
|
|
22
|
+
readyPages = new Set();
|
|
23
|
+
config;
|
|
24
|
+
healthCheckInterval = null;
|
|
25
|
+
initialized = false;
|
|
26
|
+
// Performance tracking
|
|
27
|
+
totalRequests = 0;
|
|
28
|
+
cacheHits = 0;
|
|
29
|
+
acquisitionTimes = [];
|
|
30
|
+
MAX_SAMPLES = 100;
|
|
31
|
+
// Semaphore for async acquire
|
|
32
|
+
acquireQueue = [];
|
|
33
|
+
processing = false;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = { ...DEFAULT_PAGE_POOL_CONFIG, ...config };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the pool, pre-warming minPages
|
|
39
|
+
*/
|
|
40
|
+
async initialize() {
|
|
41
|
+
if (this.initialized)
|
|
42
|
+
return;
|
|
43
|
+
for (let i = 0; i < this.config.minPages; i++) {
|
|
44
|
+
this.createPage();
|
|
45
|
+
}
|
|
46
|
+
if (this.config.healthCheckIntervalMs > 0) {
|
|
47
|
+
this.healthCheckInterval = setInterval(() => {
|
|
48
|
+
this.runHealthChecks();
|
|
49
|
+
}, this.config.healthCheckIntervalMs);
|
|
50
|
+
if (this.healthCheckInterval.unref) {
|
|
51
|
+
this.healthCheckInterval.unref();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
this.initialized = true;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Acquire a ready page from the pool (sync fast path)
|
|
58
|
+
*/
|
|
59
|
+
acquire() {
|
|
60
|
+
const start = performance.now();
|
|
61
|
+
this.totalRequests++;
|
|
62
|
+
for (const pageId of this.readyPages) {
|
|
63
|
+
const page = this.pages.get(pageId);
|
|
64
|
+
if (page && page.health >= this.config.healthThreshold) {
|
|
65
|
+
page.state = 'busy';
|
|
66
|
+
page.lastUsedAt = Date.now();
|
|
67
|
+
this.readyPages.delete(pageId);
|
|
68
|
+
this.cacheHits++;
|
|
69
|
+
this.trackAcquisitionTime(performance.now() - start);
|
|
70
|
+
return page;
|
|
71
|
+
}
|
|
72
|
+
this.readyPages.delete(pageId);
|
|
73
|
+
}
|
|
74
|
+
// Try to create a new page if under capacity (not a cache hit — page is new)
|
|
75
|
+
if (this.pages.size < this.config.maxPages) {
|
|
76
|
+
const page = this.createPage();
|
|
77
|
+
page.state = 'busy';
|
|
78
|
+
this.readyPages.delete(page.id);
|
|
79
|
+
this.trackAcquisitionTime(performance.now() - start);
|
|
80
|
+
return page;
|
|
81
|
+
}
|
|
82
|
+
this.trackAcquisitionTime(performance.now() - start);
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Acquire a page asynchronously (thread-safe for concurrent callers)
|
|
87
|
+
*/
|
|
88
|
+
acquireAsync() {
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
this.acquireQueue.push(resolve);
|
|
91
|
+
this.processQueue();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Release a page back to the pool.
|
|
96
|
+
* If there are pending acquireAsync waiters, resolves the next one immediately.
|
|
97
|
+
*/
|
|
98
|
+
release(pageId) {
|
|
99
|
+
const page = this.pages.get(pageId);
|
|
100
|
+
if (!page)
|
|
101
|
+
return;
|
|
102
|
+
page.state = 'ready';
|
|
103
|
+
page.lastUsedAt = Date.now();
|
|
104
|
+
page.requestsServed++;
|
|
105
|
+
if (page.health >= this.config.healthThreshold) {
|
|
106
|
+
// If a waiter is queued, give this page directly to them
|
|
107
|
+
if (this.acquireQueue.length > 0) {
|
|
108
|
+
const resolve = this.acquireQueue.shift();
|
|
109
|
+
page.state = 'busy';
|
|
110
|
+
page.lastUsedAt = Date.now();
|
|
111
|
+
this.totalRequests++;
|
|
112
|
+
this.cacheHits++;
|
|
113
|
+
resolve(page);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.readyPages.add(pageId);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Mark a page as errored
|
|
121
|
+
*/
|
|
122
|
+
markError(pageId) {
|
|
123
|
+
const page = this.pages.get(pageId);
|
|
124
|
+
if (!page)
|
|
125
|
+
return;
|
|
126
|
+
page.state = 'error';
|
|
127
|
+
page.errorCount++;
|
|
128
|
+
page.health = Math.max(0, page.health - 0.3);
|
|
129
|
+
this.readyPages.delete(pageId);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Remove errored and timed-out pages, maintain minPages
|
|
133
|
+
*/
|
|
134
|
+
prune() {
|
|
135
|
+
const now = Date.now();
|
|
136
|
+
const toRemove = [];
|
|
137
|
+
for (const [id, page] of this.pages) {
|
|
138
|
+
const isError = page.state === 'error' || page.health < this.config.healthThreshold;
|
|
139
|
+
const isIdleExpired = page.state === 'ready' && now - page.lastUsedAt > this.config.idleTimeoutMs;
|
|
140
|
+
if (isError || isIdleExpired) {
|
|
141
|
+
toRemove.push(id);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const id of toRemove) {
|
|
145
|
+
this.pages.delete(id);
|
|
146
|
+
this.readyPages.delete(id);
|
|
147
|
+
}
|
|
148
|
+
// Maintain minimum pages
|
|
149
|
+
while (this.pages.size < this.config.minPages) {
|
|
150
|
+
this.createPage();
|
|
151
|
+
}
|
|
152
|
+
return toRemove.length;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get pool statistics
|
|
156
|
+
*/
|
|
157
|
+
getStats() {
|
|
158
|
+
let readyCount = 0;
|
|
159
|
+
let busyCount = 0;
|
|
160
|
+
let errorCount = 0;
|
|
161
|
+
for (const page of this.pages.values()) {
|
|
162
|
+
switch (page.state) {
|
|
163
|
+
case 'ready':
|
|
164
|
+
readyCount++;
|
|
165
|
+
break;
|
|
166
|
+
case 'busy':
|
|
167
|
+
busyCount++;
|
|
168
|
+
break;
|
|
169
|
+
case 'error':
|
|
170
|
+
errorCount++;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const avg = this.acquisitionTimes.length > 0
|
|
175
|
+
? this.acquisitionTimes.reduce((a, b) => a + b, 0) / this.acquisitionTimes.length
|
|
176
|
+
: 0;
|
|
177
|
+
return {
|
|
178
|
+
totalPages: this.pages.size,
|
|
179
|
+
readyPages: readyCount,
|
|
180
|
+
busyPages: busyCount,
|
|
181
|
+
errorPages: errorCount,
|
|
182
|
+
poolHitRate: this.totalRequests > 0 ? this.cacheHits / this.totalRequests : 0,
|
|
183
|
+
avgAcquisitionTimeMs: avg,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Shut down the pool and release all resources
|
|
188
|
+
*/
|
|
189
|
+
async shutdown() {
|
|
190
|
+
if (this.healthCheckInterval) {
|
|
191
|
+
clearInterval(this.healthCheckInterval);
|
|
192
|
+
this.healthCheckInterval = null;
|
|
193
|
+
}
|
|
194
|
+
for (const page of this.pages.values()) {
|
|
195
|
+
page.state = 'closed';
|
|
196
|
+
}
|
|
197
|
+
this.pages.clear();
|
|
198
|
+
this.readyPages.clear();
|
|
199
|
+
this.initialized = false;
|
|
200
|
+
// Reject any pending acquire requests
|
|
201
|
+
for (const resolve of this.acquireQueue) {
|
|
202
|
+
resolve(null);
|
|
203
|
+
}
|
|
204
|
+
this.acquireQueue = [];
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get a page by id (for diagnostics)
|
|
208
|
+
*/
|
|
209
|
+
getPage(pageId) {
|
|
210
|
+
return this.pages.get(pageId);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get all pages (for diagnostics)
|
|
214
|
+
*/
|
|
215
|
+
getAllPages() {
|
|
216
|
+
return Array.from(this.pages.values());
|
|
217
|
+
}
|
|
218
|
+
// ==========================================================================
|
|
219
|
+
// Private
|
|
220
|
+
// ==========================================================================
|
|
221
|
+
createPage() {
|
|
222
|
+
const id = `page-${randomUUID().split('-')[0]}`;
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
const page = {
|
|
225
|
+
id,
|
|
226
|
+
state: 'ready',
|
|
227
|
+
createdAt: now,
|
|
228
|
+
lastUsedAt: now,
|
|
229
|
+
health: 1.0,
|
|
230
|
+
errorCount: 0,
|
|
231
|
+
requestsServed: 0,
|
|
232
|
+
};
|
|
233
|
+
this.pages.set(id, page);
|
|
234
|
+
this.readyPages.add(id);
|
|
235
|
+
return page;
|
|
236
|
+
}
|
|
237
|
+
processQueue() {
|
|
238
|
+
if (this.processing || this.acquireQueue.length === 0)
|
|
239
|
+
return;
|
|
240
|
+
this.processing = true;
|
|
241
|
+
const resolve = this.acquireQueue.shift();
|
|
242
|
+
try {
|
|
243
|
+
resolve(this.acquire());
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
this.processing = false;
|
|
247
|
+
if (this.acquireQueue.length > 0) {
|
|
248
|
+
setImmediate(() => this.processQueue());
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
runHealthChecks() {
|
|
253
|
+
for (const page of this.pages.values()) {
|
|
254
|
+
if (page.state === 'closed')
|
|
255
|
+
continue;
|
|
256
|
+
// Degrade health based on error rate
|
|
257
|
+
const total = page.requestsServed + page.errorCount;
|
|
258
|
+
if (total > 0) {
|
|
259
|
+
const errorRate = page.errorCount / total;
|
|
260
|
+
page.health = Math.max(0, 1 - errorRate * 0.8);
|
|
261
|
+
}
|
|
262
|
+
const wasReady = this.readyPages.has(page.id);
|
|
263
|
+
const isHealthy = page.health >= this.config.healthThreshold;
|
|
264
|
+
if (page.state === 'ready' && !isHealthy) {
|
|
265
|
+
page.state = 'error';
|
|
266
|
+
this.readyPages.delete(page.id);
|
|
267
|
+
}
|
|
268
|
+
else if (page.state === 'error' && isHealthy && !wasReady) {
|
|
269
|
+
page.state = 'ready';
|
|
270
|
+
this.readyPages.add(page.id);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
this.prune();
|
|
274
|
+
}
|
|
275
|
+
trackAcquisitionTime(ms) {
|
|
276
|
+
this.acquisitionTimes.push(ms);
|
|
277
|
+
if (this.acquisitionTimes.length > this.MAX_SAMPLES) {
|
|
278
|
+
this.acquisitionTimes.shift();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Create a new browser page pool instance
|
|
284
|
+
*/
|
|
285
|
+
export function createBrowserPagePool(config) {
|
|
286
|
+
return new BrowserPagePool(config);
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=page-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-pool.js","sourceRoot":"","sources":["../../../src/integrations/browser/page-pool.ts"],"names":[],"mappings":"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"}
|