@hyperframes/engine 0.6.10 → 0.6.12

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 CHANGED
@@ -17,7 +17,7 @@ export const DEFAULT_CONFIG = {
17
17
  largeRenderThreshold: 1000,
18
18
  disableGpu: false,
19
19
  browserGpuMode: "software",
20
- enableBrowserPool: false,
20
+ enableBrowserPool: true,
21
21
  browserTimeout: 120_000,
22
22
  protocolTimeout: 300_000,
23
23
  forceScreenshot: false,
@@ -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,KAAK;IACxB,cAAc,EAAE,OAAO;IACvB,eAAe,EAAE,OAAO;IACxB,eAAe,EAAE,KAAK;IACtB,yBAAyB,EAAE,IAAI;IAE/B,mBAAmB,EAAE,KAAK;IAC1B,eAAe,EAAE,GAAG;IACpB,qBAAqB,EAAE,IAAI;IAC3B,iCAAiC,EAAE,GAAG;IAEtC,mBAAmB,EAAE,OAAO;IAC5B,oBAAoB,EAAE,OAAO;IAC7B,sBAAsB,EAAE,OAAO;IAE/B,GAAG,EAAE,KAAK;IACV,aAAa,EAAE,IAAI;IAEnB,SAAS,EAAE,CAAC;IACZ,sBAAsB,EAAE,GAAG;IAC3B,6BAA6B,EAAE,IAAI;IAEnC,kBAAkB,EAAE,MAAM;IAC1B,kBAAkB,EAAE,MAAM;IAE1B,aAAa,EAAE,IAAI;IAEnB,KAAK,EAAE,KAAK;CACb,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiC;IAC7D,MAAM,GAAG,GAAG,CAAC,GAAW,EAAsB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAU,EAAE;QACvD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,QAAQ,CAAC;QACrD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3C,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,QAAiB,EAAW,EAAE;QAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QACvC,OAAO,GAAG,KAAK,MAAM,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,iBAAiB,GAAG,GAAmC,EAAE;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC7C,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;QAC3E,OAAO,cAAc,CAAC,cAAc,CAAC;IACvC,CAAC,CAAC;IAEF,kCAAkC;IAClC,MAAM,OAAO,GAA0B;QACrC,WAAW,EAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1F,cAAc,EAAE,MAAM,CAAC,2BAA2B,EAAE,cAAc,CAAC,cAAc,CAAC;QAClF,iBAAiB,EAAE,MAAM,CAAC,8BAA8B,EAAE,cAAc,CAAC,iBAAiB,CAAC;QAC3F,oBAAoB,EAAE,MAAM,CAC1B,iCAAiC,EACjC,cAAc,CAAC,oBAAoB,CACpC;QAED,UAAU,EAAE,GAAG,CAAC,8BAA8B,CAAC;QAC/C,UAAU,EAAE,OAAO,CAAC,sBAAsB,EAAE,cAAc,CAAC,UAAU,CAAC;QACtE,cAAc,EAAE,iBAAiB,EAAE;QACnC,iBAAiB,EAAE,OAAO,CAAC,8BAA8B,EAAE,cAAc,CAAC,iBAAiB,CAAC;QAC5F,cAAc,EAAE,MAAM,CAAC,sCAAsC,EAAE,cAAc,CAAC,cAAc,CAAC;QAC7F,eAAe,EAAE,MAAM,CACrB,wCAAwC,EACxC,cAAc,CAAC,eAAe,CAC/B;QACD,qBAAqB,EAAE,GAAG,CAAC,kCAAkC,CAAC;YAC5D,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YACjD,CAAC,CAAC,SAAS;QAEb,eAAe,EAAE,OAAO,CAAC,2BAA2B,EAAE,cAAc,CAAC,eAAe,CAAC;QACrF,yBAAyB,EAAE,OAAO,CAChC,0BAA0B,EAC1B,cAAc,CAAC,yBAAyB,CACzC;QAED,mBAAmB,EAAE,OAAO,CAC1B,gCAAgC,EAChC,cAAc,CAAC,mBAAmB,CACnC;QACD,eAAe,EAAE,IAAI,CAAC,GAAG,CACvB,GAAG,EACH,MAAM,CAAC,4BAA4B,EAAE,cAAc,CAAC,eAAe,CAAC,CACrE;QACD,qBAAqB,EAAE,OAAO,CAC5B,kCAAkC,EAClC,cAAc,CAAC,qBAAqB,CACrC;QACD,iCAAiC,EAAE,IAAI,CAAC,GAAG,CACzC,CAAC,EACD,MAAM,CACJ,gDAAgD,EAChD,cAAc,CAAC,iCAAiC,CACjD,CACF;QAED,mBAAmB,EAAE,MAAM,CAAC,0BAA0B,EAAE,cAAc,CAAC,mBAAmB,CAAC;QAC3F,oBAAoB,EAAE,MAAM,CAAC,2BAA2B,EAAE,cAAc,CAAC,oBAAoB,CAAC;QAC9F,sBAAsB,EAAE,MAAM,CAC5B,6BAA6B,EAC7B,cAAc,CAAC,sBAAsB,CACtC;QAED,GAAG,EAAE,CAAC,GAAG,EAAE;YACT,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACzC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,EAAE;QACJ,aAAa,EAAE,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC,aAAa,CAAC;QAEhF,SAAS,EAAE,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC,SAAS,CAAC;QAClE,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAC9B,EAAE,EACF,MAAM,CAAC,qCAAqC,EAAE,cAAc,CAAC,sBAAsB,CAAC,CACrF;QACD,6BAA6B,EAAE,IAAI,CAAC,GAAG,CACrC,EAAE,EACF,MAAM,CACJ,wCAAwC,EACxC,cAAc,CAAC,6BAA6B,CAC7C,CACF;QAED,kBAAkB,EAAE,MAAM,CACxB,kCAAkC,EAClC,cAAc,CAAC,kBAAkB,CAClC;QACD,kBAAkB,EAAE,MAAM,CACxB,kCAAkC,EAClC,cAAc,CAAC,kBAAkB,CAClC;QAED,aAAa,EAAE,GAAG,CAAC,oCAAoC,CAAC,KAAK,OAAO;QACpE,mBAAmB,EAAE,GAAG,CAAC,mCAAmC,CAAC;QAE7D,eAAe,EAAE,GAAG,CAAC,+BAA+B,CAAC;KACtD,CAAC;IAEF,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;IAEhG,OAAO;QACL,GAAG,cAAc;QACjB,GAAG,QAAQ;QACX,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
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";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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":"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"}
@@ -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,EAAiB,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;AAOD,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;AAYD,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,CAoE1B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC,GACxD,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB1D;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"}
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
- pooledBrowserRefCount += 1;
225
- return { browser: pooledBrowser, captureMode: pooledCaptureMode };
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 macOS/Windows).
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.10",
3
+ "version": "0.6.12",
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.10"
24
+ "@hyperframes/core": "^0.6.12"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "^25.0.10",
package/src/config.ts CHANGED
@@ -173,7 +173,7 @@ export const DEFAULT_CONFIG: EngineConfig = {
173
173
 
174
174
  disableGpu: false,
175
175
  browserGpuMode: "software",
176
- enableBrowserPool: false,
176
+ enableBrowserPool: true,
177
177
  browserTimeout: 120_000,
178
178
  protocolTimeout: 300_000,
179
179
  forceScreenshot: false,
package/src/index.ts CHANGED
@@ -49,6 +49,7 @@ export { resolveConfig, DEFAULT_CONFIG, type EngineConfig } from "./config.js";
49
49
  export {
50
50
  acquireBrowser,
51
51
  releaseBrowser,
52
+ drainBrowserPool,
52
53
  resolveHeadlessShellPath,
53
54
  resolveBrowserGpuMode,
54
55
  buildChromeArgs,
@@ -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
- pooledBrowserRefCount += 1;
265
- return { browser: pooledBrowser, captureMode: pooledCaptureMode };
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 macOS/Windows).
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;