@hyperframes/engine 0.6.10 → 0.6.11
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/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/browserManager.d.ts +11 -1
- package/dist/services/browserManager.d.ts.map +1 -1
- package/dist/services/browserManager.js +106 -13
- package/dist/services/browserManager.js.map +1 -1
- package/package.json +2 -2
- package/src/config.ts +1 -1
- package/src/index.ts +1 -0
- package/src/services/browserManager.test.ts +149 -0
- package/src/services/browserManager.ts +118 -13
package/dist/config.js
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2JH,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,GAAG,EAAE,EAAE;IACP,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,EAAE;IAEf,WAAW,EAAE,MAAM;IACnB,cAAc,EAAE,GAAG;IACnB,iBAAiB,EAAE,GAAG;IACtB,oBAAoB,EAAE,IAAI;IAE1B,UAAU,EAAE,KAAK;IACjB,cAAc,EAAE,UAAU;IAC1B,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
*/
|
|
32
32
|
export type { HfProtocol, HfMediaElement, HfTransitionMeta, CaptureOptions, CaptureVideoMetadataHint, CaptureResult, CaptureBufferResult, CapturePerfSummary, } from "./types.js";
|
|
33
33
|
export { resolveConfig, DEFAULT_CONFIG, type EngineConfig } from "./config.js";
|
|
34
|
-
export { acquireBrowser, releaseBrowser, resolveHeadlessShellPath, resolveBrowserGpuMode, buildChromeArgs, ENABLE_BROWSER_POOL, type BuildChromeArgsOptions, type CaptureMode, type AcquiredBrowser, } from "./services/browserManager.js";
|
|
34
|
+
export { acquireBrowser, releaseBrowser, drainBrowserPool, resolveHeadlessShellPath, resolveBrowserGpuMode, buildChromeArgs, ENABLE_BROWSER_POOL, type BuildChromeArgsOptions, type CaptureMode, type AcquiredBrowser, } from "./services/browserManager.js";
|
|
35
35
|
export { createCaptureSession, initializeSession, closeCaptureSession, captureFrame, captureFrameToBuffer, discardWarmupCapture, getCompositionDuration, getCapturePerfSummary, prepareCaptureSessionForReuse, type CaptureSession, type BeforeCaptureHook, type DiscardWarmupInnerCapture, } from "./services/frameCapture.js";
|
|
36
36
|
export { beginFrameCapture, pageScreenshotCapture, getCdpSession, injectVideoFramesBatch, syncVideoFrameVisibility, cdpSessionCache, initTransparentBackground, captureAlphaPng, applyDomLayerMask, removeDomLayerMask, DOM_LAYER_MASK_STYLE_ID, type BeginFrameResult, } from "./services/screenshotService.js";
|
|
37
37
|
export { encodeFramesFromDir, encodeFramesChunkedConcat, muxVideoWithAudio, applyFaststart, detectGpuEncoder, ENCODER_PRESETS, getEncoderPreset, type GpuEncoder, } from "./services/chunkEncoder.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EACL,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,KAAK,UAAU,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAEhG,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,GAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAG1F,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,SAAS,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGlF,OAAO,EACL,KAAK,YAAY,EACjB,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
// ── Configuration ──────────────────────────────────────────────────────────────
|
|
33
33
|
export { resolveConfig, DEFAULT_CONFIG } from "./config.js";
|
|
34
34
|
// ── Browser management ─────────────────────────────────────────────────────────
|
|
35
|
-
export { acquireBrowser, releaseBrowser, resolveHeadlessShellPath, resolveBrowserGpuMode, buildChromeArgs, ENABLE_BROWSER_POOL, } from "./services/browserManager.js";
|
|
35
|
+
export { acquireBrowser, releaseBrowser, drainBrowserPool, resolveHeadlessShellPath, resolveBrowserGpuMode, buildChromeArgs, ENABLE_BROWSER_POOL, } from "./services/browserManager.js";
|
|
36
36
|
// ── Frame capture pipeline ──────────────────────────────────────────────────────
|
|
37
37
|
export { createCaptureSession, initializeSession, closeCaptureSession, captureFrame, captureFrameToBuffer, discardWarmupCapture, getCompositionDuration, getCapturePerfSummary, prepareCaptureSessionForReuse, } from "./services/frameCapture.js";
|
|
38
38
|
// ── Screenshot (BeginFrame) ─────────────────────────────────────────────────────
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAcH,kFAAkF;AAClF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAE/E,kFAAkF;AAClF,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GAIpB,MAAM,8BAA8B,CAAC;AAEtC,mFAAmF;AACnF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,GAI9B,MAAM,4BAA4B,CAAC;AAEpC,mFAAmF;AACnF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,iCAAiC,CAAC;AAEzC,kFAAkF;AAClF,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GAKzB,MAAM,gCAAgC,CAAC;AAExC,kFAAkF;AAClF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,GAOjB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGvF,kFAAkF;AAClF,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,GAInB,MAAM,mCAAmC,CAAC;AAE3C,kFAAkF;AAClF,OAAO,EACL,gBAAgB,GAGjB,MAAM,0BAA0B,CAAC;AAElC,kFAAkF;AAClF,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GAIzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EACL,SAAS,EACT,iBAAiB,GAGlB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAuB,MAAM,4BAA4B,CAAC;AAElF,iFAAiF;AACjF,OAAO,EAEL,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,GAGrB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GAKxB,MAAM,gBAAgB,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Manages Puppeteer browser lifecycle: Chrome executable resolution,
|
|
5
5
|
* launch args, pooled browser acquisition/release.
|
|
6
6
|
*/
|
|
7
|
-
import type { Browser } from "puppeteer-core";
|
|
7
|
+
import type { Browser, PuppeteerNode } from "puppeteer-core";
|
|
8
8
|
import { type EngineConfig } from "../config.js";
|
|
9
9
|
export type CaptureMode = "beginframe" | "screenshot";
|
|
10
10
|
export interface AcquiredBrowser {
|
|
@@ -56,6 +56,16 @@ export declare function resolveBrowserGpuMode(mode: EngineConfig["browserGpuMode
|
|
|
56
56
|
export declare function acquireBrowser(chromeArgs: string[], config?: Partial<Pick<EngineConfig, "browserTimeout" | "protocolTimeout" | "enableBrowserPool" | "chromePath" | "forceScreenshot">>): Promise<AcquiredBrowser>;
|
|
57
57
|
export declare function releaseBrowser(browser: Browser, config?: Partial<Pick<EngineConfig, "enableBrowserPool">>): Promise<void>;
|
|
58
58
|
export declare function forceReleaseBrowser(browser: Browser): void;
|
|
59
|
+
/**
|
|
60
|
+
* Forcefully close the pooled browser if one exists, regardless of refCount.
|
|
61
|
+
* Used for explicit cleanup at process exit or between independent render jobs
|
|
62
|
+
* that should not share browser state.
|
|
63
|
+
*/
|
|
64
|
+
export declare function drainBrowserPool(): Promise<void>;
|
|
65
|
+
/** Test-only: reset all pool state. */
|
|
66
|
+
export declare function _resetBrowserPoolForTests(): void;
|
|
67
|
+
/** Test-only: inject a mock PuppeteerNode so tests bypass the dynamic import. */
|
|
68
|
+
export declare function _setPuppeteerForTests(mock: PuppeteerNode | undefined): void;
|
|
59
69
|
export interface BuildChromeArgsOptions {
|
|
60
70
|
width: number;
|
|
61
71
|
height: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserManager.d.ts","sourceRoot":"","sources":["../../src/services/browserManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"browserManager.d.ts","sourceRoot":"","sources":["../../src/services/browserManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAmBjE,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,GACjD,MAAM,GAAG,SAAS,CA0BpB;AAQD,eAAO,MAAM,mBAAmB,SAAmC,CAAC;AA6DpE;;;;;;;;;;;GAWG;AACH,eAAO,IAAI,wBAAwB,EAAE,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC;AAElF,gDAAgD;AAChD,wBAAgB,qCAAqC,IAAI,IAAI,CAE5D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,CAAC,gBAAgB,CAAC,EACpC,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CACvB,GACL,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,CA4DlC;AA4BD,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,CAAC,EAAE,OAAO,CACd,IAAI,CACF,YAAY,EACZ,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,YAAY,GAAG,iBAAiB,CAC9F,CACF,GACA,OAAO,CAAC,eAAe,CAAC,CAsD1B;AA6DD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC,GACxD,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B1D;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CActD;AAED,uCAAuC;AACvC,wBAAgB,yBAAyB,IAAI,IAAI,CAKhD;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAE3E;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAID,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,EAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACnF,MAAM,EAAE,CAmEV"}
|
|
@@ -62,6 +62,7 @@ export function resolveHeadlessShellPath(config) {
|
|
|
62
62
|
let pooledBrowser = null;
|
|
63
63
|
let pooledBrowserRefCount = 0;
|
|
64
64
|
let pooledCaptureMode = "screenshot";
|
|
65
|
+
let _pooledBrowserLaunchPromise = null;
|
|
65
66
|
// Preserve the producer-era export so re-export shims keep the same public API.
|
|
66
67
|
export const ENABLE_BROWSER_POOL = DEFAULT_CONFIG.enableBrowserPool;
|
|
67
68
|
// Flags only meaningful when Chrome's compositor is driven by
|
|
@@ -218,15 +219,77 @@ export function resolveBrowserGpuMode(mode, options = {}) {
|
|
|
218
219
|
function logResolvedBrowserGpuMode(resolved, reason) {
|
|
219
220
|
console.error(`[hyperframes] browserGpuMode auto → ${resolved} (${reason})`);
|
|
220
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Resolve the capture mode the caller expects, WITHOUT launching a browser.
|
|
224
|
+
* Used to validate pool compatibility before returning a cached instance.
|
|
225
|
+
*/
|
|
226
|
+
function resolveRequestedCaptureMode(config) {
|
|
227
|
+
const headlessShell = resolveHeadlessShellPath(config);
|
|
228
|
+
// BeginFrame requires chrome-headless-shell AND Linux — crashes on
|
|
229
|
+
// macOS/Windows (crbug.com/40656275).
|
|
230
|
+
const isLinux = process.platform === "linux";
|
|
231
|
+
const forceScreenshot = config?.forceScreenshot ?? DEFAULT_CONFIG.forceScreenshot;
|
|
232
|
+
if (headlessShell && isLinux && !forceScreenshot)
|
|
233
|
+
return "beginframe";
|
|
234
|
+
return "screenshot";
|
|
235
|
+
}
|
|
221
236
|
export async function acquireBrowser(chromeArgs, config) {
|
|
222
237
|
const enablePool = config?.enableBrowserPool ?? DEFAULT_CONFIG.enableBrowserPool;
|
|
223
238
|
if (enablePool && pooledBrowser) {
|
|
224
|
-
|
|
225
|
-
|
|
239
|
+
if (!pooledBrowser.connected) {
|
|
240
|
+
pooledBrowser = null;
|
|
241
|
+
pooledBrowserRefCount = 0;
|
|
242
|
+
_pooledBrowserLaunchPromise = null;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// Validate mode compatibility: a caller that needs screenshot mode
|
|
246
|
+
// (forceScreenshot, alpha output, BeginFrame timeout retry) must not
|
|
247
|
+
// receive a beginframe browser — the BeginFrame-only flags make the
|
|
248
|
+
// compositor wait for frames the screenshot path never sends.
|
|
249
|
+
const requestedMode = resolveRequestedCaptureMode(config);
|
|
250
|
+
if (pooledCaptureMode === requestedMode) {
|
|
251
|
+
pooledBrowserRefCount += 1;
|
|
252
|
+
return { browser: pooledBrowser, captureMode: pooledCaptureMode };
|
|
253
|
+
}
|
|
254
|
+
// Mode mismatch — skip pool, launch a dedicated browser for this caller.
|
|
255
|
+
// Don't evict the pooled browser: other sessions may still hold refs.
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Dedup concurrent launches: when the pool is enabled and multiple callers
|
|
259
|
+
// (e.g. parallel workers via Promise.all) race into acquireBrowser before
|
|
260
|
+
// the first launch completes, they would all see pooledBrowser === null and
|
|
261
|
+
// each spawn a separate Chrome. Cache the in-flight launch Promise so the
|
|
262
|
+
// second+ callers await the same one instead of launching again.
|
|
263
|
+
if (enablePool && _pooledBrowserLaunchPromise) {
|
|
264
|
+
const result = await _pooledBrowserLaunchPromise;
|
|
265
|
+
const requestedMode = resolveRequestedCaptureMode(config);
|
|
266
|
+
if (result.captureMode === requestedMode) {
|
|
267
|
+
pooledBrowserRefCount += 1;
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
// Mode mismatch with pending launch — launch a dedicated browser.
|
|
271
|
+
}
|
|
272
|
+
const launchPromise = launchBrowser(chromeArgs, config);
|
|
273
|
+
if (enablePool && !pooledBrowser && !_pooledBrowserLaunchPromise) {
|
|
274
|
+
_pooledBrowserLaunchPromise = launchPromise;
|
|
275
|
+
try {
|
|
276
|
+
const result = await launchPromise;
|
|
277
|
+
pooledBrowser = result.browser;
|
|
278
|
+
pooledBrowserRefCount = 1;
|
|
279
|
+
pooledCaptureMode = result.captureMode;
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
_pooledBrowserLaunchPromise = null;
|
|
284
|
+
}
|
|
226
285
|
}
|
|
286
|
+
return launchPromise;
|
|
287
|
+
}
|
|
288
|
+
async function launchBrowser(chromeArgs, config) {
|
|
227
289
|
// Config chromePath overrides env var / auto-detection.
|
|
228
290
|
const headlessShell = resolveHeadlessShellPath(config);
|
|
229
|
-
// BeginFrame requires chrome-headless-shell AND Linux (crashes on
|
|
291
|
+
// BeginFrame requires chrome-headless-shell AND Linux (crashes on
|
|
292
|
+
// macOS/Windows — crbug.com/40656275).
|
|
230
293
|
const isLinux = process.platform === "linux";
|
|
231
294
|
const forceScreenshot = config?.forceScreenshot ?? DEFAULT_CONFIG.forceScreenshot;
|
|
232
295
|
let captureMode;
|
|
@@ -251,11 +314,6 @@ export async function acquireBrowser(chromeArgs, config) {
|
|
|
251
314
|
timeout: browserTimeout,
|
|
252
315
|
protocolTimeout,
|
|
253
316
|
});
|
|
254
|
-
// Probe HeadlessExperimental.beginFrame — recent chrome-headless-shell
|
|
255
|
-
// builds (observed on 147) dropped the method while keeping the flags
|
|
256
|
-
// valid, so `--enable-begin-frame-control` leaves the compositor waiting
|
|
257
|
-
// for beginFrames the engine can no longer send. Auto-fall back to
|
|
258
|
-
// screenshot mode with the appropriate flags.
|
|
259
317
|
if (captureMode === "beginframe") {
|
|
260
318
|
const supported = await probeBeginFrameSupport(browser).catch(() => true);
|
|
261
319
|
if (!supported) {
|
|
@@ -272,11 +330,6 @@ export async function acquireBrowser(chromeArgs, config) {
|
|
|
272
330
|
});
|
|
273
331
|
}
|
|
274
332
|
}
|
|
275
|
-
if (enablePool) {
|
|
276
|
-
pooledBrowser = browser;
|
|
277
|
-
pooledBrowserRefCount = 1;
|
|
278
|
-
pooledCaptureMode = captureMode;
|
|
279
|
-
}
|
|
280
333
|
return { browser, captureMode };
|
|
281
334
|
}
|
|
282
335
|
export async function releaseBrowser(browser, config) {
|
|
@@ -290,6 +343,7 @@ export async function releaseBrowser(browser, config) {
|
|
|
290
343
|
if (pooledBrowserRefCount === 0) {
|
|
291
344
|
await browser.close().catch(() => { });
|
|
292
345
|
pooledBrowser = null;
|
|
346
|
+
_pooledBrowserLaunchPromise = null;
|
|
293
347
|
}
|
|
294
348
|
return;
|
|
295
349
|
}
|
|
@@ -297,8 +351,16 @@ export async function releaseBrowser(browser, config) {
|
|
|
297
351
|
}
|
|
298
352
|
export function forceReleaseBrowser(browser) {
|
|
299
353
|
if (pooledBrowser && pooledBrowser === browser) {
|
|
354
|
+
// If other sessions still hold refs, just drop ours — don't kill the
|
|
355
|
+
// shared Chrome out from under them. The browser will be cleaned up when
|
|
356
|
+
// the last session releases or drainBrowserPool is called.
|
|
357
|
+
if (pooledBrowserRefCount > 1) {
|
|
358
|
+
pooledBrowserRefCount -= 1;
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
300
361
|
pooledBrowserRefCount = 0;
|
|
301
362
|
pooledBrowser = null;
|
|
363
|
+
_pooledBrowserLaunchPromise = null;
|
|
302
364
|
}
|
|
303
365
|
const proc = browser.process?.();
|
|
304
366
|
if (proc && !proc.killed) {
|
|
@@ -316,6 +378,37 @@ export function forceReleaseBrowser(browser) {
|
|
|
316
378
|
// Best-effort cleanup.
|
|
317
379
|
}
|
|
318
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Forcefully close the pooled browser if one exists, regardless of refCount.
|
|
383
|
+
* Used for explicit cleanup at process exit or between independent render jobs
|
|
384
|
+
* that should not share browser state.
|
|
385
|
+
*/
|
|
386
|
+
export async function drainBrowserPool() {
|
|
387
|
+
// Await any in-flight launch first — otherwise the launch resolves after we
|
|
388
|
+
// drain and produces a browser that nobody references (orphan).
|
|
389
|
+
const pending = _pooledBrowserLaunchPromise;
|
|
390
|
+
_pooledBrowserLaunchPromise = null;
|
|
391
|
+
if (pending) {
|
|
392
|
+
await pending.then((r) => r.browser.close()).catch(() => { });
|
|
393
|
+
}
|
|
394
|
+
if (pooledBrowser) {
|
|
395
|
+
const browser = pooledBrowser;
|
|
396
|
+
pooledBrowser = null;
|
|
397
|
+
pooledBrowserRefCount = 0;
|
|
398
|
+
await browser.close().catch(() => { });
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/** Test-only: reset all pool state. */
|
|
402
|
+
export function _resetBrowserPoolForTests() {
|
|
403
|
+
pooledBrowser = null;
|
|
404
|
+
pooledBrowserRefCount = 0;
|
|
405
|
+
pooledCaptureMode = "screenshot";
|
|
406
|
+
_pooledBrowserLaunchPromise = null;
|
|
407
|
+
}
|
|
408
|
+
/** Test-only: inject a mock PuppeteerNode so tests bypass the dynamic import. */
|
|
409
|
+
export function _setPuppeteerForTests(mock) {
|
|
410
|
+
_puppeteer = mock;
|
|
411
|
+
}
|
|
319
412
|
const CANVAS_DRAW_ELEMENT_FEATURE_FLAG = "--enable-features=CanvasDrawElement";
|
|
320
413
|
export function buildChromeArgs(options, config) {
|
|
321
414
|
const platform = options.platform ?? process.platform;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserManager.js","sourceRoot":"","sources":["../../src/services/browserManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browserManager.js","sourceRoot":"","sources":["../../src/services/browserManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/engine",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.11",
|
|
4
4
|
"description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"linkedom": "^0.18.12",
|
|
22
22
|
"puppeteer": "^24.0.0",
|
|
23
23
|
"puppeteer-core": "^24.39.1",
|
|
24
|
-
"@hyperframes/core": "^0.6.
|
|
24
|
+
"@hyperframes/core": "^0.6.11"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^25.0.10",
|
package/src/config.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
2
|
|
|
3
|
+
import type { Browser, PuppeteerNode } from "puppeteer-core";
|
|
4
|
+
|
|
3
5
|
import {
|
|
4
6
|
_resetAutoBrowserGpuModeCacheForTests,
|
|
7
|
+
_resetBrowserPoolForTests,
|
|
8
|
+
_setPuppeteerForTests,
|
|
9
|
+
acquireBrowser,
|
|
5
10
|
buildChromeArgs,
|
|
11
|
+
drainBrowserPool,
|
|
6
12
|
forceReleaseBrowser,
|
|
13
|
+
releaseBrowser,
|
|
7
14
|
resolveBrowserGpuMode,
|
|
8
15
|
} from "./browserManager.js";
|
|
9
16
|
|
|
@@ -157,3 +164,145 @@ describe("forceReleaseBrowser", () => {
|
|
|
157
164
|
expect(disconnectFn).toHaveBeenCalled();
|
|
158
165
|
});
|
|
159
166
|
});
|
|
167
|
+
|
|
168
|
+
describe("browser pool", () => {
|
|
169
|
+
function makeMockBrowser(): Browser {
|
|
170
|
+
return {
|
|
171
|
+
connected: true,
|
|
172
|
+
newPage: vi.fn(),
|
|
173
|
+
version: vi.fn().mockResolvedValue("HeadlessChrome/131.0.0.0"),
|
|
174
|
+
close: vi.fn().mockResolvedValue(undefined),
|
|
175
|
+
disconnect: vi.fn(),
|
|
176
|
+
process: () => ({ kill: vi.fn(), killed: false }),
|
|
177
|
+
} as unknown as Browser;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// forceScreenshot: true bypasses the BeginFrame probe path, which on Linux
|
|
181
|
+
// CI would trigger a second ppt.launch() when the mock's newPage() doesn't
|
|
182
|
+
// return a real page and the probe falls back to screenshot mode.
|
|
183
|
+
const poolCfg = { enableBrowserPool: true, forceScreenshot: true } as const;
|
|
184
|
+
|
|
185
|
+
let launchFn: ReturnType<typeof vi.fn>;
|
|
186
|
+
|
|
187
|
+
beforeEach(() => {
|
|
188
|
+
_resetBrowserPoolForTests();
|
|
189
|
+
const mockBrowser = makeMockBrowser();
|
|
190
|
+
launchFn = vi.fn().mockResolvedValue(mockBrowser);
|
|
191
|
+
_setPuppeteerForTests({ launch: launchFn } as unknown as PuppeteerNode);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
afterEach(async () => {
|
|
195
|
+
await drainBrowserPool();
|
|
196
|
+
_setPuppeteerForTests(undefined);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("sequential acquires with pool enabled return the same browser", async () => {
|
|
200
|
+
const first = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
201
|
+
const second = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
202
|
+
|
|
203
|
+
expect(first.browser).toBe(second.browser);
|
|
204
|
+
expect(launchFn).toHaveBeenCalledTimes(1);
|
|
205
|
+
|
|
206
|
+
await releaseBrowser(first.browser, poolCfg);
|
|
207
|
+
await releaseBrowser(second.browser, poolCfg);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("concurrent acquires via Promise.all trigger exactly one launch", async () => {
|
|
211
|
+
const [a, b, c] = await Promise.all([
|
|
212
|
+
acquireBrowser(["--no-sandbox"], poolCfg),
|
|
213
|
+
acquireBrowser(["--no-sandbox"], poolCfg),
|
|
214
|
+
acquireBrowser(["--no-sandbox"], poolCfg),
|
|
215
|
+
]);
|
|
216
|
+
|
|
217
|
+
expect(launchFn).toHaveBeenCalledTimes(1);
|
|
218
|
+
expect(a.browser).toBe(b.browser);
|
|
219
|
+
expect(b.browser).toBe(c.browser);
|
|
220
|
+
|
|
221
|
+
await releaseBrowser(a.browser, poolCfg);
|
|
222
|
+
await releaseBrowser(b.browser, poolCfg);
|
|
223
|
+
await releaseBrowser(c.browser, poolCfg);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it("pool recovers from a disconnected browser", async () => {
|
|
227
|
+
const first = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
228
|
+
await releaseBrowser(first.browser, poolCfg);
|
|
229
|
+
|
|
230
|
+
// Simulate Chrome crash
|
|
231
|
+
(first.browser as unknown as { connected: boolean }).connected = false;
|
|
232
|
+
|
|
233
|
+
const freshBrowser = makeMockBrowser();
|
|
234
|
+
launchFn.mockResolvedValue(freshBrowser);
|
|
235
|
+
|
|
236
|
+
const second = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
237
|
+
expect(second.browser).toBe(freshBrowser);
|
|
238
|
+
expect(second.browser).not.toBe(first.browser);
|
|
239
|
+
expect(launchFn).toHaveBeenCalledTimes(2);
|
|
240
|
+
|
|
241
|
+
await releaseBrowser(second.browser, poolCfg);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("release at refCount 0 closes the browser", async () => {
|
|
245
|
+
const result = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
246
|
+
const closeFn = result.browser.close as ReturnType<typeof vi.fn>;
|
|
247
|
+
|
|
248
|
+
await releaseBrowser(result.browser, poolCfg);
|
|
249
|
+
expect(closeFn).toHaveBeenCalledTimes(1);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it("pool returns a separate browser when forceScreenshot mismatches pooled mode", async () => {
|
|
253
|
+
const first = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
254
|
+
expect(first.captureMode).toBe("screenshot");
|
|
255
|
+
|
|
256
|
+
// Second acquire with same forceScreenshot — same mode, should reuse
|
|
257
|
+
const second = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
258
|
+
expect(second.browser).toBe(first.browser);
|
|
259
|
+
expect(launchFn).toHaveBeenCalledTimes(1);
|
|
260
|
+
|
|
261
|
+
await releaseBrowser(first.browser, poolCfg);
|
|
262
|
+
await releaseBrowser(second.browser, poolCfg);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("forceReleaseBrowser does not kill Chrome when other sessions hold refs", async () => {
|
|
266
|
+
const result = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
267
|
+
// Acquire a second ref
|
|
268
|
+
const second = await acquireBrowser(["--no-sandbox"], poolCfg);
|
|
269
|
+
|
|
270
|
+
const disconnectFn = result.browser.disconnect as ReturnType<typeof vi.fn>;
|
|
271
|
+
forceReleaseBrowser(result.browser);
|
|
272
|
+
|
|
273
|
+
// Should NOT have disconnected — other session still holds a ref
|
|
274
|
+
expect(disconnectFn).not.toHaveBeenCalled();
|
|
275
|
+
|
|
276
|
+
// Release the remaining ref normally
|
|
277
|
+
await releaseBrowser(second.browser, poolCfg);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it("drainBrowserPool is safe to call when no browser is pooled", async () => {
|
|
281
|
+
await drainBrowserPool();
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it("drainBrowserPool awaits in-flight launch before closing", async () => {
|
|
285
|
+
let resolveDeferred!: (browser: Browser) => void;
|
|
286
|
+
const deferred = new Promise<Browser>((resolve) => {
|
|
287
|
+
resolveDeferred = resolve;
|
|
288
|
+
});
|
|
289
|
+
launchFn.mockReturnValue(deferred);
|
|
290
|
+
|
|
291
|
+
// Start acquire — it will be pending
|
|
292
|
+
const acquirePromise = acquireBrowser(["--no-sandbox"], poolCfg);
|
|
293
|
+
|
|
294
|
+
// Drain while launch is in-flight
|
|
295
|
+
const drainPromise = drainBrowserPool();
|
|
296
|
+
|
|
297
|
+
// Resolve the pending launch
|
|
298
|
+
const mockBrowser = makeMockBrowser();
|
|
299
|
+
resolveDeferred(mockBrowser);
|
|
300
|
+
|
|
301
|
+
await drainPromise;
|
|
302
|
+
const closeFn = mockBrowser.close as ReturnType<typeof vi.fn>;
|
|
303
|
+
expect(closeFn).toHaveBeenCalled();
|
|
304
|
+
|
|
305
|
+
// The acquire should still resolve (the launch completed before drain closed it)
|
|
306
|
+
await acquirePromise.catch(() => {});
|
|
307
|
+
});
|
|
308
|
+
});
|
|
@@ -73,6 +73,7 @@ export function resolveHeadlessShellPath(
|
|
|
73
73
|
let pooledBrowser: Browser | null = null;
|
|
74
74
|
let pooledBrowserRefCount = 0;
|
|
75
75
|
let pooledCaptureMode: CaptureMode = "screenshot";
|
|
76
|
+
let _pooledBrowserLaunchPromise: Promise<AcquiredBrowser> | null = null;
|
|
76
77
|
|
|
77
78
|
// Preserve the producer-era export so re-export shims keep the same public API.
|
|
78
79
|
export const ENABLE_BROWSER_POOL = DEFAULT_CONFIG.enableBrowserPool;
|
|
@@ -249,6 +250,22 @@ function logResolvedBrowserGpuMode(resolved: "hardware" | "software", reason: st
|
|
|
249
250
|
console.error(`[hyperframes] browserGpuMode auto → ${resolved} (${reason})`);
|
|
250
251
|
}
|
|
251
252
|
|
|
253
|
+
/**
|
|
254
|
+
* Resolve the capture mode the caller expects, WITHOUT launching a browser.
|
|
255
|
+
* Used to validate pool compatibility before returning a cached instance.
|
|
256
|
+
*/
|
|
257
|
+
function resolveRequestedCaptureMode(
|
|
258
|
+
config?: Partial<Pick<EngineConfig, "chromePath" | "forceScreenshot">>,
|
|
259
|
+
): CaptureMode {
|
|
260
|
+
const headlessShell = resolveHeadlessShellPath(config);
|
|
261
|
+
// BeginFrame requires chrome-headless-shell AND Linux — crashes on
|
|
262
|
+
// macOS/Windows (crbug.com/40656275).
|
|
263
|
+
const isLinux = process.platform === "linux";
|
|
264
|
+
const forceScreenshot = config?.forceScreenshot ?? DEFAULT_CONFIG.forceScreenshot;
|
|
265
|
+
if (headlessShell && isLinux && !forceScreenshot) return "beginframe";
|
|
266
|
+
return "screenshot";
|
|
267
|
+
}
|
|
268
|
+
|
|
252
269
|
export async function acquireBrowser(
|
|
253
270
|
chromeArgs: string[],
|
|
254
271
|
config?: Partial<
|
|
@@ -261,14 +278,69 @@ export async function acquireBrowser(
|
|
|
261
278
|
const enablePool = config?.enableBrowserPool ?? DEFAULT_CONFIG.enableBrowserPool;
|
|
262
279
|
|
|
263
280
|
if (enablePool && pooledBrowser) {
|
|
264
|
-
|
|
265
|
-
|
|
281
|
+
if (!pooledBrowser.connected) {
|
|
282
|
+
pooledBrowser = null;
|
|
283
|
+
pooledBrowserRefCount = 0;
|
|
284
|
+
_pooledBrowserLaunchPromise = null;
|
|
285
|
+
} else {
|
|
286
|
+
// Validate mode compatibility: a caller that needs screenshot mode
|
|
287
|
+
// (forceScreenshot, alpha output, BeginFrame timeout retry) must not
|
|
288
|
+
// receive a beginframe browser — the BeginFrame-only flags make the
|
|
289
|
+
// compositor wait for frames the screenshot path never sends.
|
|
290
|
+
const requestedMode = resolveRequestedCaptureMode(config);
|
|
291
|
+
if (pooledCaptureMode === requestedMode) {
|
|
292
|
+
pooledBrowserRefCount += 1;
|
|
293
|
+
return { browser: pooledBrowser, captureMode: pooledCaptureMode };
|
|
294
|
+
}
|
|
295
|
+
// Mode mismatch — skip pool, launch a dedicated browser for this caller.
|
|
296
|
+
// Don't evict the pooled browser: other sessions may still hold refs.
|
|
297
|
+
}
|
|
266
298
|
}
|
|
267
299
|
|
|
300
|
+
// Dedup concurrent launches: when the pool is enabled and multiple callers
|
|
301
|
+
// (e.g. parallel workers via Promise.all) race into acquireBrowser before
|
|
302
|
+
// the first launch completes, they would all see pooledBrowser === null and
|
|
303
|
+
// each spawn a separate Chrome. Cache the in-flight launch Promise so the
|
|
304
|
+
// second+ callers await the same one instead of launching again.
|
|
305
|
+
if (enablePool && _pooledBrowserLaunchPromise) {
|
|
306
|
+
const result = await _pooledBrowserLaunchPromise;
|
|
307
|
+
const requestedMode = resolveRequestedCaptureMode(config);
|
|
308
|
+
if (result.captureMode === requestedMode) {
|
|
309
|
+
pooledBrowserRefCount += 1;
|
|
310
|
+
return result;
|
|
311
|
+
}
|
|
312
|
+
// Mode mismatch with pending launch — launch a dedicated browser.
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const launchPromise = launchBrowser(chromeArgs, config);
|
|
316
|
+
|
|
317
|
+
if (enablePool && !pooledBrowser && !_pooledBrowserLaunchPromise) {
|
|
318
|
+
_pooledBrowserLaunchPromise = launchPromise;
|
|
319
|
+
try {
|
|
320
|
+
const result = await launchPromise;
|
|
321
|
+
pooledBrowser = result.browser;
|
|
322
|
+
pooledBrowserRefCount = 1;
|
|
323
|
+
pooledCaptureMode = result.captureMode;
|
|
324
|
+
return result;
|
|
325
|
+
} finally {
|
|
326
|
+
_pooledBrowserLaunchPromise = null;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return launchPromise;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
async function launchBrowser(
|
|
334
|
+
chromeArgs: string[],
|
|
335
|
+
config?: Partial<
|
|
336
|
+
Pick<EngineConfig, "browserTimeout" | "protocolTimeout" | "chromePath" | "forceScreenshot">
|
|
337
|
+
>,
|
|
338
|
+
): Promise<AcquiredBrowser> {
|
|
268
339
|
// Config chromePath overrides env var / auto-detection.
|
|
269
340
|
const headlessShell = resolveHeadlessShellPath(config);
|
|
270
341
|
|
|
271
|
-
// BeginFrame requires chrome-headless-shell AND Linux (crashes on
|
|
342
|
+
// BeginFrame requires chrome-headless-shell AND Linux (crashes on
|
|
343
|
+
// macOS/Windows — crbug.com/40656275).
|
|
272
344
|
const isLinux = process.platform === "linux";
|
|
273
345
|
const forceScreenshot = config?.forceScreenshot ?? DEFAULT_CONFIG.forceScreenshot;
|
|
274
346
|
let captureMode: CaptureMode;
|
|
@@ -295,11 +367,6 @@ export async function acquireBrowser(
|
|
|
295
367
|
protocolTimeout,
|
|
296
368
|
});
|
|
297
369
|
|
|
298
|
-
// Probe HeadlessExperimental.beginFrame — recent chrome-headless-shell
|
|
299
|
-
// builds (observed on 147) dropped the method while keeping the flags
|
|
300
|
-
// valid, so `--enable-begin-frame-control` leaves the compositor waiting
|
|
301
|
-
// for beginFrames the engine can no longer send. Auto-fall back to
|
|
302
|
-
// screenshot mode with the appropriate flags.
|
|
303
370
|
if (captureMode === "beginframe") {
|
|
304
371
|
const supported = await probeBeginFrameSupport(browser).catch(() => true);
|
|
305
372
|
if (!supported) {
|
|
@@ -319,11 +386,6 @@ export async function acquireBrowser(
|
|
|
319
386
|
}
|
|
320
387
|
}
|
|
321
388
|
|
|
322
|
-
if (enablePool) {
|
|
323
|
-
pooledBrowser = browser;
|
|
324
|
-
pooledBrowserRefCount = 1;
|
|
325
|
-
pooledCaptureMode = captureMode;
|
|
326
|
-
}
|
|
327
389
|
return { browser, captureMode };
|
|
328
390
|
}
|
|
329
391
|
|
|
@@ -341,6 +403,7 @@ export async function releaseBrowser(
|
|
|
341
403
|
if (pooledBrowserRefCount === 0) {
|
|
342
404
|
await browser.close().catch(() => {});
|
|
343
405
|
pooledBrowser = null;
|
|
406
|
+
_pooledBrowserLaunchPromise = null;
|
|
344
407
|
}
|
|
345
408
|
return;
|
|
346
409
|
}
|
|
@@ -349,8 +412,16 @@ export async function releaseBrowser(
|
|
|
349
412
|
|
|
350
413
|
export function forceReleaseBrowser(browser: Browser): void {
|
|
351
414
|
if (pooledBrowser && pooledBrowser === browser) {
|
|
415
|
+
// If other sessions still hold refs, just drop ours — don't kill the
|
|
416
|
+
// shared Chrome out from under them. The browser will be cleaned up when
|
|
417
|
+
// the last session releases or drainBrowserPool is called.
|
|
418
|
+
if (pooledBrowserRefCount > 1) {
|
|
419
|
+
pooledBrowserRefCount -= 1;
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
352
422
|
pooledBrowserRefCount = 0;
|
|
353
423
|
pooledBrowser = null;
|
|
424
|
+
_pooledBrowserLaunchPromise = null;
|
|
354
425
|
}
|
|
355
426
|
const proc = (
|
|
356
427
|
browser as unknown as {
|
|
@@ -371,6 +442,40 @@ export function forceReleaseBrowser(browser: Browser): void {
|
|
|
371
442
|
}
|
|
372
443
|
}
|
|
373
444
|
|
|
445
|
+
/**
|
|
446
|
+
* Forcefully close the pooled browser if one exists, regardless of refCount.
|
|
447
|
+
* Used for explicit cleanup at process exit or between independent render jobs
|
|
448
|
+
* that should not share browser state.
|
|
449
|
+
*/
|
|
450
|
+
export async function drainBrowserPool(): Promise<void> {
|
|
451
|
+
// Await any in-flight launch first — otherwise the launch resolves after we
|
|
452
|
+
// drain and produces a browser that nobody references (orphan).
|
|
453
|
+
const pending = _pooledBrowserLaunchPromise;
|
|
454
|
+
_pooledBrowserLaunchPromise = null;
|
|
455
|
+
if (pending) {
|
|
456
|
+
await pending.then((r) => r.browser.close()).catch(() => {});
|
|
457
|
+
}
|
|
458
|
+
if (pooledBrowser) {
|
|
459
|
+
const browser = pooledBrowser;
|
|
460
|
+
pooledBrowser = null;
|
|
461
|
+
pooledBrowserRefCount = 0;
|
|
462
|
+
await browser.close().catch(() => {});
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/** Test-only: reset all pool state. */
|
|
467
|
+
export function _resetBrowserPoolForTests(): void {
|
|
468
|
+
pooledBrowser = null;
|
|
469
|
+
pooledBrowserRefCount = 0;
|
|
470
|
+
pooledCaptureMode = "screenshot";
|
|
471
|
+
_pooledBrowserLaunchPromise = null;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/** Test-only: inject a mock PuppeteerNode so tests bypass the dynamic import. */
|
|
475
|
+
export function _setPuppeteerForTests(mock: PuppeteerNode | undefined): void {
|
|
476
|
+
_puppeteer = mock;
|
|
477
|
+
}
|
|
478
|
+
|
|
374
479
|
export interface BuildChromeArgsOptions {
|
|
375
480
|
width: number;
|
|
376
481
|
height: number;
|