@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.
- package/dist/{chunk-N2HH4SGD.js → chunk-URMIRXBS.js} +107 -43
- package/dist/{chunk-HTHV7ZM6.js → chunk-ZCCJNXS7.js} +1 -1
- package/dist/helpers/mediaProxyPreview.js +2 -2
- package/dist/helpers/proxyTranscoder.d.ts +16 -5
- package/dist/helpers/proxyTranscoder.js +5 -3
- package/dist/index.js +2 -2
- package/package.json +3 -3
|
@@ -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 = "
|
|
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
|
|
159
|
-
|
|
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
|
|
390
|
-
if (!box) return "
|
|
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
|
|
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
|
|
411
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
536
|
-
signal
|
|
553
|
+
TRANSCODE_STALL_MS,
|
|
554
|
+
signal,
|
|
555
|
+
(encodedSeconds) => onProgress({ doneSeconds: (range?.startSeconds ?? 0) + encodedSeconds, totalSeconds })
|
|
537
556
|
);
|
|
538
|
-
const ranges = chunkRanges(
|
|
539
|
-
if (!ranges) return encode(outputPath
|
|
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
|
-
|
|
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", "
|
|
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,
|
|
628
|
+
proc.on("close", (code, killedBy) => {
|
|
629
|
+
clearTimeout(timer);
|
|
582
630
|
if (code === 0) {
|
|
583
631
|
resolvePromise();
|
|
584
|
-
} else if (
|
|
632
|
+
} else if (stalled) {
|
|
585
633
|
reject(
|
|
586
634
|
new ProxyTranscodeError(
|
|
587
|
-
`ffmpeg
|
|
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
|
-
|
|
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
|
|
707
|
-
|
|
708
|
-
|
|
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
|
-
|
|
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,
|
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
isAutoProxyEnabled,
|
|
5
5
|
proxyEtagSalt,
|
|
6
6
|
resolvePreviewMediaCodecProbeCache
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
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 = "
|
|
14
|
+
declare const PROXY_PARAMS_VERSION = "v6";
|
|
15
15
|
declare const CACHE_DIR_NAME = ".transcode-cache";
|
|
16
|
-
|
|
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)
|
|
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,
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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.
|
|
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/
|
|
88
|
-
"@hyperframes/
|
|
87
|
+
"@hyperframes/core": "0.8.200",
|
|
88
|
+
"@hyperframes/parsers": "0.8.200"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"@types/node": "^25.0.10",
|