hyperframes 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +65 -5
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -54,7 +54,7 @@ var VERSION;
54
54
  var init_version = __esm({
55
55
  "src/version.ts"() {
56
56
  "use strict";
57
- VERSION = true ? "0.4.1" : "0.0.0-dev";
57
+ VERSION = true ? "0.4.2" : "0.0.0-dev";
58
58
  }
59
59
  });
60
60
 
@@ -20428,6 +20428,34 @@ function resolveHeadlessShellPath(config) {
20428
20428
  }
20429
20429
  return void 0;
20430
20430
  }
20431
+ function stripBeginFrameFlags(args) {
20432
+ return args.filter((a) => !BEGINFRAME_ONLY_FLAGS.has(a));
20433
+ }
20434
+ async function probeBeginFrameSupport(browser) {
20435
+ let page;
20436
+ try {
20437
+ page = await browser.newPage();
20438
+ const client = await page.createCDPSession();
20439
+ await client.send("HeadlessExperimental.enable");
20440
+ const beginFrame = client.send("HeadlessExperimental.beginFrame", {
20441
+ frameTimeTicks: 0,
20442
+ interval: 33,
20443
+ noDisplayUpdates: true
20444
+ });
20445
+ const timeout = new Promise(
20446
+ (_2, reject) => setTimeout(() => reject(new Error("beginFrame probe timeout")), 2e3)
20447
+ );
20448
+ await Promise.race([beginFrame, timeout]);
20449
+ await client.detach().catch(() => {
20450
+ });
20451
+ return true;
20452
+ } catch {
20453
+ return false;
20454
+ } finally {
20455
+ await page?.close().catch(() => {
20456
+ });
20457
+ }
20458
+ }
20431
20459
  async function acquireBrowser(chromeArgs, config) {
20432
20460
  const enablePool = config?.enableBrowserPool ?? DEFAULT_CONFIG2.enableBrowserPool;
20433
20461
  if (enablePool && pooledBrowser) {
@@ -20447,14 +20475,35 @@ async function acquireBrowser(chromeArgs, config) {
20447
20475
  executablePath = headlessShell ?? void 0;
20448
20476
  }
20449
20477
  const ppt = await getPuppeteer();
20450
- const browser = await ppt.launch({
20478
+ const browserTimeout = config?.browserTimeout ?? DEFAULT_CONFIG2.browserTimeout;
20479
+ const protocolTimeout = config?.protocolTimeout ?? DEFAULT_CONFIG2.protocolTimeout;
20480
+ let browser = await ppt.launch({
20451
20481
  headless: true,
20452
20482
  args: chromeArgs,
20453
20483
  defaultViewport: null,
20454
20484
  executablePath,
20455
- timeout: config?.browserTimeout ?? DEFAULT_CONFIG2.browserTimeout,
20456
- protocolTimeout: config?.protocolTimeout ?? DEFAULT_CONFIG2.protocolTimeout
20485
+ timeout: browserTimeout,
20486
+ protocolTimeout
20457
20487
  });
20488
+ if (captureMode === "beginframe") {
20489
+ const supported = await probeBeginFrameSupport(browser).catch(() => true);
20490
+ if (!supported) {
20491
+ await browser.close().catch(() => {
20492
+ });
20493
+ console.warn(
20494
+ "[BrowserManager] HeadlessExperimental.beginFrame unavailable in this Chromium build; falling back to screenshot mode."
20495
+ );
20496
+ captureMode = "screenshot";
20497
+ browser = await ppt.launch({
20498
+ headless: true,
20499
+ args: stripBeginFrameFlags(chromeArgs),
20500
+ defaultViewport: null,
20501
+ executablePath,
20502
+ timeout: browserTimeout,
20503
+ protocolTimeout
20504
+ });
20505
+ }
20506
+ }
20458
20507
  if (enablePool) {
20459
20508
  pooledBrowser = browser;
20460
20509
  pooledBrowserRefCount = 1;
@@ -20537,7 +20586,7 @@ function buildChromeArgs(options, config) {
20537
20586
  }
20538
20587
  return chromeArgs;
20539
20588
  }
20540
- var _puppeteer, pooledBrowser, pooledBrowserRefCount, pooledCaptureMode, ENABLE_BROWSER_POOL;
20589
+ var _puppeteer, pooledBrowser, pooledBrowserRefCount, pooledCaptureMode, ENABLE_BROWSER_POOL, BEGINFRAME_ONLY_FLAGS;
20541
20590
  var init_browserManager = __esm({
20542
20591
  "../engine/src/services/browserManager.ts"() {
20543
20592
  "use strict";
@@ -20546,6 +20595,17 @@ var init_browserManager = __esm({
20546
20595
  pooledBrowserRefCount = 0;
20547
20596
  pooledCaptureMode = "screenshot";
20548
20597
  ENABLE_BROWSER_POOL = DEFAULT_CONFIG2.enableBrowserPool;
20598
+ BEGINFRAME_ONLY_FLAGS = /* @__PURE__ */ new Set([
20599
+ "--deterministic-mode",
20600
+ "--enable-begin-frame-control",
20601
+ "--disable-new-content-rendering-timeout",
20602
+ "--run-all-compositor-stages-before-draw",
20603
+ "--disable-threaded-animation",
20604
+ "--disable-threaded-scrolling",
20605
+ "--disable-checker-imaging",
20606
+ "--disable-image-animation-resync",
20607
+ "--enable-surface-synchronization"
20608
+ ]);
20549
20609
  }
20550
20610
  });
20551
20611
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hyperframes",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "HyperFrames CLI — create, preview, and render HTML video compositions",
5
5
  "repository": {
6
6
  "type": "git",