@hyperframes/studio-server 0.8.198 → 0.8.200

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.
@@ -22,7 +22,7 @@ import {
22
22
  utimesSync,
23
23
  writeFileSync
24
24
  } from "fs";
25
- import { tmpdir } from "os";
25
+ import { availableParallelism, tmpdir } from "os";
26
26
  import { basename, dirname, extname as extname2, isAbsolute, join as join2, relative, resolve, sep } from "path";
27
27
  import {
28
28
  formatPreviewProxyBox,
@@ -144,7 +144,7 @@ function cleanupProxyCache(cacheDir, options = {}) {
144
144
  }
145
145
 
146
146
  // src/helpers/proxyTranscoder.ts
147
- var PROXY_PARAMS_VERSION = "v5";
147
+ var PROXY_PARAMS_VERSION = "v6";
148
148
  var CACHE_DIR_NAME = ".transcode-cache";
149
149
  function boundedEnvInteger(name, fallback, min, max) {
150
150
  const raw = process.env[name]?.trim();
@@ -155,8 +155,13 @@ function boundedEnvInteger(name, fallback, min, max) {
155
155
  var MAX_CONCURRENT_TRANSCODES = boundedEnvInteger("HYPERFRAMES_PROXY_MAX_CONCURRENCY", 2, 1, 16);
156
156
  var MAX_QUEUED_TRANSCODES = boundedEnvInteger("HYPERFRAMES_PROXY_MAX_QUEUE", 8, 0, 256);
157
157
  var STDERR_TAIL_MAX_CHARS = 4e3;
158
- var TRANSCODE_TIMEOUT_MS = 15 * 60 * 1e3;
159
- var PROXY_CHUNK_SECONDS = 60;
158
+ var TRANSCODE_STALL_MS = boundedEnvInteger(
159
+ "HYPERFRAMES_PROXY_STALL_MS",
160
+ 3 * 60 * 1e3,
161
+ 1e4,
162
+ 60 * 60 * 1e3
163
+ );
164
+ var PROXY_CHUNK_SECONDS = 15;
160
165
  var CHUNK_PREFIX = ".part-";
161
166
  var CONCAT_TIMEOUT_MS = 2 * 60 * 1e3;
162
167
  var FAILURE_CACHE_TTL_MS = 60 * 1e3;
@@ -265,6 +270,10 @@ function getProxyCachePath(projectDir, absoluteSourcePath, variant = "h264", box
265
270
  box
266
271
  );
267
272
  }
273
+ function reportProgress(job, progress) {
274
+ job.lastProgress = progress;
275
+ for (const listener of job.progress) listener(progress);
276
+ }
268
277
  var ProxyDroppedError = class extends ProxyTranscodeError {
269
278
  constructor() {
270
279
  super("media proxy copy dropped: every caller left", null, "");
@@ -386,11 +395,15 @@ function rememberFailure(cachePath, error) {
386
395
  function clearFailedTranscodesForTest() {
387
396
  failedTranscodes.clear();
388
397
  }
389
- function proxyScaleFilter(box) {
390
- if (!box) return "scale=trunc(iw/2)*2:trunc(ih/2)*2";
398
+ function proxyScaleSize(box) {
399
+ if (!box) return { width: "trunc(iw/2)*2", height: "trunc(ih/2)*2" };
391
400
  const factor = `min(1\\,max(${box.width}/iw\\,${box.height}/ih))`;
392
401
  const side = (d) => `min(trunc(${d}/2)*2\\,ceil(${d}*${factor}/2)*2)`;
393
- return `scale=${side("iw")}:${side("ih")}`;
402
+ return { width: side("iw"), height: side("ih") };
403
+ }
404
+ function proxyScaleFilter(box) {
405
+ const { width, height } = proxyScaleSize(box);
406
+ return `scale=${width}:${height}`;
394
407
  }
395
408
  var STDERR_ERROR_LINE = /error|invalid|denied|no space|not found|unknown/i;
396
409
  function stderrReason(stderrTail) {
@@ -407,26 +420,24 @@ function chunkRanges(durationSeconds) {
407
420
  lengthSeconds: index === count - 1 ? durationSeconds - index * PROXY_CHUNK_SECONDS : PROXY_CHUNK_SECONDS
408
421
  }));
409
422
  }
410
- function ffmpegBudgetError(chunksKept, chunkCount) {
411
- return new ProxyTranscodeError(
412
- `ffmpeg ran out of its ${TRANSCODE_TIMEOUT_MS}ms budget with ${chunksKept}/${chunkCount} pieces done; the finished pieces are kept and the next attempt continues from them`,
413
- null,
414
- ""
415
- );
416
- }
417
- async function encodeInChunks(ranges, chunkPrefix, tempPath, encode, concat) {
423
+ async function encodeInChunks(ranges, chunkPrefix, tempPath, encode, concat, onDone = () => {
424
+ }) {
418
425
  const extension = extname2(tempPath);
419
- const deadline = Date.now() + TRANSCODE_TIMEOUT_MS;
420
426
  const pieces = ranges.map((_, index) => `${chunkPrefix}${index}${extension}`);
427
+ let doneSeconds = 0;
428
+ for (const [index, range] of ranges.entries()) {
429
+ if (existsSync2(pieces[index])) doneSeconds += range.lengthSeconds;
430
+ }
431
+ if (doneSeconds) onDone(doneSeconds);
421
432
  for (const [index, range] of ranges.entries()) {
422
433
  const piece = pieces[index];
423
434
  if (existsSync2(piece)) continue;
424
- const timeoutMs = deadline - Date.now();
425
- if (timeoutMs <= 0) throw ffmpegBudgetError(index, ranges.length);
426
435
  const pieceTemp = join2(dirname(piece), `.tmp-${randomUUID()}-${basename(piece)}`);
427
436
  try {
428
- await encode(pieceTemp, timeoutMs, range);
437
+ await encode(pieceTemp, range);
429
438
  renameSync(pieceTemp, piece);
439
+ doneSeconds += range.lengthSeconds;
440
+ onDone(doneSeconds);
430
441
  } finally {
431
442
  if (existsSync2(pieceTemp)) unlinkSync2(pieceTemp);
432
443
  }
@@ -467,6 +478,7 @@ var H264_ARGS = [
467
478
  "-movflags",
468
479
  "+faststart"
469
480
  ];
481
+ var VP8_THREADS = String(Math.min(4, availableParallelism()));
470
482
  var VP8_ARGS = [
471
483
  "-c:v",
472
484
  "libvpx",
@@ -486,6 +498,8 @@ var VP8_ARGS = [
486
498
  "bt709",
487
499
  "-cpu-used",
488
500
  "4",
501
+ "-threads",
502
+ VP8_THREADS,
489
503
  "-auto-alt-ref",
490
504
  "0",
491
505
  "-metadata:s:v:0",
@@ -503,12 +517,12 @@ async function buildVideoFilter(ffmpegPath, sourcePath, metadata, keepsAlpha, bo
503
517
  const evenScale = proxyScaleFilter(box);
504
518
  const pixelFormat = keepsAlpha ? "yuva420p" : "yuv420p";
505
519
  return toneMap ? [
506
- hdrToSdrToneMapFilter(metadata.color, firstFrame),
520
+ hdrToSdrToneMapFilter(metadata.color, firstFrame, box && proxyScaleSize(box)),
507
521
  `${evenScale}:out_color_matrix=bt709:out_range=tv`,
508
522
  `format=${pixelFormat}`
509
523
  ].join(",") : [evenScale, `format=${pixelFormat}`].join(",");
510
524
  }
511
- async function runFfmpeg(sourcePath, outputPath, chunkPrefix, variant, box, signal) {
525
+ async function runFfmpeg(sourcePath, outputPath, chunkPrefix, variant, box, signal, onProgress) {
512
526
  const metadata = await probeMediaMetadata(sourcePath);
513
527
  const ffmpegPath = findFfBinary("ffmpeg", { configuredMustExist: true });
514
528
  if (!ffmpegPath) {
@@ -518,10 +532,14 @@ async function runFfmpeg(sourcePath, outputPath, chunkPrefix, variant, box, sign
518
532
  const videoFilter = await buildVideoFilter(ffmpegPath, sourcePath, metadata, keepsAlpha, box);
519
533
  const alphaDecoder = keepsAlpha ? alphaDecoderFor(metadata.color.codecName) : null;
520
534
  const decoderArgs = alphaDecoder ? ["-c:v", alphaDecoder] : [];
521
- const encode = (target, timeoutMs, range) => spawnFfmpeg(
535
+ const totalSeconds = metadata.durationSeconds;
536
+ const encode = (target, range) => spawnFfmpeg(
522
537
  ffmpegPath,
523
538
  [
524
539
  "-y",
540
+ "-progress",
541
+ "pipe:1",
542
+ "-nostats",
525
543
  ...range ? ["-ss", String(range.startSeconds)] : [],
526
544
  ...decoderArgs,
527
545
  "-i",
@@ -532,17 +550,19 @@ async function runFfmpeg(sourcePath, outputPath, chunkPrefix, variant, box, sign
532
550
  ...variant === "vp8" ? VP8_ARGS : H264_ARGS,
533
551
  target
534
552
  ],
535
- timeoutMs,
536
- signal
553
+ TRANSCODE_STALL_MS,
554
+ signal,
555
+ (encodedSeconds) => onProgress({ doneSeconds: (range?.startSeconds ?? 0) + encodedSeconds, totalSeconds })
537
556
  );
538
- const ranges = chunkRanges(metadata.durationSeconds);
539
- if (!ranges) return encode(outputPath, TRANSCODE_TIMEOUT_MS);
557
+ const ranges = chunkRanges(totalSeconds);
558
+ if (!ranges) return encode(outputPath);
540
559
  await encodeInChunks(
541
560
  ranges,
542
561
  chunkPrefix,
543
562
  outputPath,
544
563
  encode,
545
- (listPath, target) => spawnFfmpeg(ffmpegPath, concatArgs(listPath, target, variant), CONCAT_TIMEOUT_MS, signal)
564
+ (listPath, target) => spawnFfmpeg(ffmpegPath, concatArgs(listPath, target, variant), CONCAT_TIMEOUT_MS, signal),
565
+ (doneSeconds) => onProgress({ doneSeconds, totalSeconds })
546
566
  );
547
567
  }
548
568
  function concatArgs(listPath, target, variant) {
@@ -560,35 +580,67 @@ function concatArgs(listPath, target, variant) {
560
580
  target
561
581
  ];
562
582
  }
563
- function spawnFfmpeg(ffmpegPath, args, timeoutMs, signal) {
583
+ var OUT_TIME = /^out_time_(?:us|ms)=(\d+)$/;
584
+ function spawnFfmpeg(ffmpegPath, args, stallMs, signal, onProgress) {
564
585
  return new Promise((resolvePromise, reject) => {
565
586
  signal.throwIfAborted();
566
587
  const proc = spawn(ffmpegPath, args, {
567
- stdio: ["ignore", "ignore", "pipe"],
568
- timeout: timeoutMs,
588
+ stdio: ["ignore", "pipe", "pipe"],
569
589
  killSignal: "SIGKILL",
570
590
  signal,
571
591
  windowsHide: true
572
592
  });
593
+ let stalled = false;
594
+ let timer;
595
+ const armStall = () => {
596
+ clearTimeout(timer);
597
+ timer = setTimeout(() => {
598
+ stalled = true;
599
+ proc.kill("SIGKILL");
600
+ }, stallMs);
601
+ timer.unref();
602
+ };
603
+ armStall();
604
+ let furthest = 0;
605
+ let lineTail = "";
606
+ proc.stdout?.on("data", (chunk) => {
607
+ const lines = (lineTail + chunk.toString()).split("\n");
608
+ lineTail = lines.pop() ?? "";
609
+ for (const line of lines) {
610
+ const reached = OUT_TIME.exec(line.trim());
611
+ if (!reached) continue;
612
+ const seconds = Number(reached[1]) / 1e6;
613
+ if (seconds <= furthest) continue;
614
+ furthest = seconds;
615
+ armStall();
616
+ onProgress?.(seconds);
617
+ }
618
+ });
573
619
  let stderrTail = "";
574
620
  proc.stderr?.on("data", (chunk) => {
575
621
  stderrTail = (stderrTail + chunk.toString()).slice(-STDERR_TAIL_MAX_CHARS);
576
622
  });
577
623
  proc.on("error", (err) => {
624
+ clearTimeout(timer);
578
625
  if (signal.aborted) return;
579
626
  reject(new FfmpegUnavailableError(`failed to spawn ffmpeg: ${err.message}`, stderrTail));
580
627
  });
581
- proc.on("close", (code, signal2) => {
628
+ proc.on("close", (code, killedBy) => {
629
+ clearTimeout(timer);
582
630
  if (code === 0) {
583
631
  resolvePromise();
584
- } else if (signal2) {
632
+ } else if (stalled) {
585
633
  reject(
586
634
  new ProxyTranscodeError(
587
- `ffmpeg killed by ${signal2} (timeout ${timeoutMs}ms or external kill)`,
635
+ `ffmpeg made no progress for ${Math.round(stallMs / 1e3)}s and was ended; finished pieces are kept for the next attempt`,
588
636
  null,
589
637
  stderrTail
590
638
  )
591
639
  );
640
+ } else if (killedBy) {
641
+ reject(
642
+ new ProxyTranscodeError(`ffmpeg killed by ${killedBy} (external kill)`, null, stderrTail)
643
+ );
592
644
  } else {
593
645
  reject(
594
646
  new ProxyTranscodeError(
@@ -619,7 +671,8 @@ async function transcodeToCache(job, projectDir, absoluteSourcePath, cachePath,
619
671
  chunkPrefix,
620
672
  variant,
621
673
  box,
622
- job.abandoned.signal
674
+ job.abandoned.signal,
675
+ (progress) => reportProgress(job, progress)
623
676
  );
624
677
  renameSync(tempPath, cachePath);
625
678
  maintainProxyCache(cacheDir);
@@ -662,7 +715,8 @@ async function resolveProxy(projectDir, absoluteSourcePath, variant = "h264", bo
662
715
  cachePath,
663
716
  priority: options.priority === true,
664
717
  callers: 0,
665
- abandoned: new AbortController()
718
+ abandoned: new AbortController(),
719
+ progress: /* @__PURE__ */ new Set()
666
720
  };
667
721
  const promise = transcodeToCache(
668
722
  job,
@@ -684,10 +738,19 @@ async function resolveProxy(projectDir, absoluteSourcePath, variant = "h264", bo
684
738
  inFlight.set(cachePath, entry);
685
739
  }
686
740
  if (options.priority) prioritize(entry.job);
687
- return joinJob(entry.promise, entry.job, options.signal);
741
+ const listener = options.onProgress;
742
+ const joined = joinJob(entry.promise, entry.job, options.signal);
743
+ if (listener) {
744
+ entry.job.progress.add(listener);
745
+ if (entry.job.lastProgress) listener(entry.job.lastProgress);
746
+ const stop = () => void entry.job.progress.delete(listener);
747
+ joined.then(stop, stop);
748
+ }
749
+ return joined;
688
750
  }
689
751
  async function resolveProxies(projectDir, sources, onSettled = () => {
690
- }) {
752
+ }, onProgress = () => {
753
+ }, signal) {
691
754
  const first = sources[0];
692
755
  if (first) {
693
756
  maintainProxyCache(
@@ -703,14 +766,14 @@ async function resolveProxies(projectDir, sources, onSettled = () => {
703
766
  const worker = async () => {
704
767
  for (let index = next++; index < sources.length; index = next++) {
705
768
  const { sourcePath, variant, box } = sources[index];
706
- results[index] = await waitForProxy(
707
- resolveProxy(projectDir, sourcePath, variant, box),
708
- TRANSCODE_TIMEOUT_MS
709
- ).then(
769
+ results[index] = await resolveProxy(projectDir, sourcePath, variant, box, {
770
+ onProgress: (progress) => onProgress(index, progress),
771
+ signal
772
+ }).then(
710
773
  (value) => ({ status: "fulfilled", value }),
711
774
  (reason) => ({ status: "rejected", reason })
712
775
  );
713
- onSettled();
776
+ onSettled(index);
714
777
  }
715
778
  };
716
779
  const workers = Math.min(MAX_CONCURRENT_TRANSCODES, sources.length);
@@ -734,7 +797,8 @@ export {
734
797
  cleanupProxyCache,
735
798
  PROXY_PARAMS_VERSION,
736
799
  CACHE_DIR_NAME,
737
- TRANSCODE_TIMEOUT_MS,
800
+ TRANSCODE_STALL_MS,
801
+ PROXY_CHUNK_SECONDS,
738
802
  PROXY_PENDING_RETRY_AFTER_SECONDS,
739
803
  DEFAULT_PROXY_WAIT_TIMEOUT_MS,
740
804
  ProxyTranscodeError,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PROXY_PARAMS_VERSION,
3
3
  resolveProxy
4
- } from "./chunk-N2HH4SGD.js";
4
+ } from "./chunk-URMIRXBS.js";
5
5
  import {
6
6
  createMediaCodecProbeCache,
7
7
  proxyVariantFor,
@@ -4,8 +4,8 @@ import {
4
4
  isAutoProxyEnabled,
5
5
  proxyEtagSalt,
6
6
  resolvePreviewMediaCodecProbeCache
7
- } from "../chunk-HTHV7ZM6.js";
8
- import "../chunk-N2HH4SGD.js";
7
+ } from "../chunk-ZCCJNXS7.js";
8
+ import "../chunk-URMIRXBS.js";
9
9
  import "../chunk-XMNHDWQI.js";
10
10
  import "../chunk-QF7MFJJU.js";
11
11
  import "../chunk-SVQFE44C.js";
@@ -11,9 +11,12 @@ import { ProxyVariant } from './mediaCodecMap.js';
11
11
  * caller's `signal` detaches that caller; once no caller is left, the copy is
12
12
  * dropped from the queue or its ffmpeg is killed.
13
13
  */
14
- declare const PROXY_PARAMS_VERSION = "v5";
14
+ declare const PROXY_PARAMS_VERSION = "v6";
15
15
  declare const CACHE_DIR_NAME = ".transcode-cache";
16
- declare const TRANSCODE_TIMEOUT_MS: number;
16
+ /** A copy that makes no progress this long is ended: a hung encode, not a slow one. */
17
+ declare const TRANSCODE_STALL_MS: number;
18
+ /** A longer source is copied in pieces this long; a stopped copy keeps its finished pieces and loses at most one. */
19
+ declare const PROXY_CHUNK_SECONDS = 15;
17
20
  declare const PROXY_PENDING_RETRY_AFTER_SECONDS = 2;
18
21
  declare const DEFAULT_PROXY_WAIT_TIMEOUT_MS: number;
19
22
  declare class ProxyTranscodeError extends Error {
@@ -48,6 +51,11 @@ declare function waitForProxy<T>(promise: Promise<T>, timeoutMs?: number): Promi
48
51
  * preview box (`hf-proxy-box`) to name a boxed copy.
49
52
  */
50
53
  declare function getProxyCachePath(projectDir: string, absoluteSourcePath: string, variant?: ProxyVariant, box?: PreviewProxyBox): string;
54
+ /** How far a copy has got: seconds of the source done, out of its length when that is known. */
55
+ interface ProxyProgress {
56
+ doneSeconds: number;
57
+ totalSeconds?: number;
58
+ }
51
59
  /** Test hook: forget remembered transcode failures (module state persists
52
60
  * across tests that don't reload the module). */
53
61
  declare function clearFailedTranscodesForTest(): void;
@@ -67,15 +75,18 @@ declare function proxyActivityMark(projectDir: string): string | null;
67
75
  */
68
76
  declare function resolveProxy(projectDir: string, absoluteSourcePath: string, variant?: ProxyVariant, box?: PreviewProxyBox, options?: ResolveProxyOptions): Promise<string>;
69
77
  /** Batch resolve for check and publish: at most MAX_CONCURRENT_TRANSCODES of its own requests in
70
- * flight (other callers can still fill the queue); each waits at most TRANSCODE_TIMEOUT_MS. */
78
+ * flight (other callers can still fill the queue). A copy is ended only when it stops making
79
+ * progress (TRANSCODE_STALL_MS), so a long source that keeps moving is never cut by a clock. */
71
80
  declare function resolveProxies(projectDir: string, sources: ReadonlyArray<{
72
81
  sourcePath: string;
73
82
  variant: ProxyVariant;
74
83
  box?: PreviewProxyBox;
75
- }>, onSettled?: () => void): Promise<PromiseSettledResult<string>[]>;
84
+ }>, onSettled?: (index: number) => void, onProgress?: (index: number, progress: ProxyProgress) => void, signal?: AbortSignal): Promise<PromiseSettledResult<string>[]>;
76
85
  interface ResolveProxyOptions {
77
86
  priority?: boolean;
78
87
  signal?: AbortSignal;
88
+ /** Hears how far the shared copy has got, from the first caller's start to the copy's end. */
89
+ onProgress?: (progress: ProxyProgress) => void;
79
90
  }
80
91
 
81
- export { CACHE_DIR_NAME, DEFAULT_PROXY_WAIT_TIMEOUT_MS, FfmpegMissingFilterError, FfmpegUnavailableError, PROXY_PARAMS_VERSION, PROXY_PENDING_RETRY_AFTER_SECONDS, ProxyCapacityError, ProxySourceOutsideProjectError, ProxyTranscodeError, ProxyWaitTimeoutError, type ResolveProxyOptions, TRANSCODE_TIMEOUT_MS, clearFailedTranscodesForTest, getProxyCachePath, proxyActivityMark, resolveProxies, resolveProxy, waitForProxy };
92
+ export { CACHE_DIR_NAME, DEFAULT_PROXY_WAIT_TIMEOUT_MS, FfmpegMissingFilterError, FfmpegUnavailableError, PROXY_CHUNK_SECONDS, PROXY_PARAMS_VERSION, PROXY_PENDING_RETRY_AFTER_SECONDS, ProxyCapacityError, type ProxyProgress, ProxySourceOutsideProjectError, ProxyTranscodeError, ProxyWaitTimeoutError, type ResolveProxyOptions, TRANSCODE_STALL_MS, clearFailedTranscodesForTest, getProxyCachePath, proxyActivityMark, resolveProxies, resolveProxy, waitForProxy };
@@ -3,20 +3,21 @@ import {
3
3
  DEFAULT_PROXY_WAIT_TIMEOUT_MS,
4
4
  FfmpegMissingFilterError,
5
5
  FfmpegUnavailableError,
6
+ PROXY_CHUNK_SECONDS,
6
7
  PROXY_PARAMS_VERSION,
7
8
  PROXY_PENDING_RETRY_AFTER_SECONDS,
8
9
  ProxyCapacityError,
9
10
  ProxySourceOutsideProjectError,
10
11
  ProxyTranscodeError,
11
12
  ProxyWaitTimeoutError,
12
- TRANSCODE_TIMEOUT_MS,
13
+ TRANSCODE_STALL_MS,
13
14
  clearFailedTranscodesForTest,
14
15
  getProxyCachePath,
15
16
  proxyActivityMark,
16
17
  resolveProxies,
17
18
  resolveProxy,
18
19
  waitForProxy
19
- } from "../chunk-N2HH4SGD.js";
20
+ } from "../chunk-URMIRXBS.js";
20
21
  import "../chunk-XMNHDWQI.js";
21
22
  import "../chunk-QF7MFJJU.js";
22
23
  import "../chunk-SVQFE44C.js";
@@ -26,13 +27,14 @@ export {
26
27
  DEFAULT_PROXY_WAIT_TIMEOUT_MS,
27
28
  FfmpegMissingFilterError,
28
29
  FfmpegUnavailableError,
30
+ PROXY_CHUNK_SECONDS,
29
31
  PROXY_PARAMS_VERSION,
30
32
  PROXY_PENDING_RETRY_AFTER_SECONDS,
31
33
  ProxyCapacityError,
32
34
  ProxySourceOutsideProjectError,
33
35
  ProxyTranscodeError,
34
36
  ProxyWaitTimeoutError,
35
- TRANSCODE_TIMEOUT_MS,
37
+ TRANSCODE_STALL_MS,
36
38
  clearFailedTranscodesForTest,
37
39
  getProxyCachePath,
38
40
  proxyActivityMark,
package/dist/index.js CHANGED
@@ -82,7 +82,7 @@ import {
82
82
  isAutoProxyEnabled,
83
83
  proxyEtagSalt,
84
84
  resolvePreviewMediaCodecProbeCache
85
- } from "./chunk-HTHV7ZM6.js";
85
+ } from "./chunk-ZCCJNXS7.js";
86
86
  import {
87
87
  CACHE_DIR_NAME,
88
88
  PROXY_PENDING_RETRY_AFTER_SECONDS,
@@ -93,7 +93,7 @@ import {
93
93
  proxyActivityMark,
94
94
  resolveProxy,
95
95
  waitForProxy
96
- } from "./chunk-N2HH4SGD.js";
96
+ } from "./chunk-URMIRXBS.js";
97
97
  import {
98
98
  PROXY_VARIANT_CONFIG,
99
99
  decideMediaProxyEligibility,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/studio-server",
3
- "version": "0.8.198",
3
+ "version": "0.8.200",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/heygen-com/hyperframes",
@@ -84,8 +84,8 @@
84
84
  "linkedom": "^0.18.12",
85
85
  "postcss": "^8.5.8",
86
86
  "postcss-selector-parser": "^7.1.2",
87
- "@hyperframes/parsers": "0.8.198",
88
- "@hyperframes/core": "0.8.198"
87
+ "@hyperframes/core": "0.8.200",
88
+ "@hyperframes/parsers": "0.8.200"
89
89
  },
90
90
  "devDependencies": {
91
91
  "@types/node": "^25.0.10",