@torrent-tv/proxy 2.89.6 → 2.89.8
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/AGENTS.md +32 -12
- package/CHANGELOG.md +2340 -2330
- package/assets/calibration/audio/NOTICE.md +19 -19
- package/assets/calibration/audio/manifest.json +98 -98
- package/biome.json +412 -412
- package/docs/browser-proxy-contract.md +155 -155
- package/docs/container-architecture.md +273 -273
- package/docs/encode-run-state.md +1 -1
- package/docs/playback-start-forecast.md +113 -98
- package/package.json +51 -50
- package/routes/api/sources/files/get.js +106 -106
- package/scripts/build-audio-samples.mjs +31 -31
- package/services/encode/EncodeRun.js +67 -15
- package/services/encode/EncodeRuns.js +19 -7
- package/services/encode/OutputOpening.js +784 -784
- package/services/encode/audio-calibration.js +67 -67
- package/services/encode/audio-work-rate.js +15 -15
- package/services/encode/encode-exit.js +2 -0
- package/services/encode/hwaccel.js +1894 -1894
- package/services/encode/output/index.js +24 -24
- package/services/encode/piece-completeness.js +60 -2
- package/services/encode/run-command.js +757 -755
- package/services/encode/segment-formats/index.js +1 -0
- package/services/encode/segment-formats/mp4-boxes.js +8 -1
- package/services/media/ContainerOrchestrator.js +202 -202
- package/services/media/KeyframeTables.js +356 -356
- package/services/media/SubtitleCues.js +592 -592
- package/services/media/audio-inventory.js +299 -299
- package/services/media/container/AviContainer.js +268 -268
- package/services/media/container/Container.js +632 -632
- package/services/media/container/ContainerFactory.js +38 -38
- package/services/media/container/MatroskaContainer.js +1031 -1031
- package/services/media/container/Mp4Container.js +1354 -1354
- package/services/media/container/SubtitleFileContainer.js +339 -339
- package/services/media/container/ebml-stream.js +174 -174
- package/services/media/container/matroska-clusters.js +1165 -1165
- package/services/media/container/unavailable.js +77 -77
- package/services/media/tracks/ContainerTrack.js +84 -84
- package/services/media/tracks/TextSubtitleTrack.js +295 -295
- package/services/storage/piece-store/shared-piece-store.js +1937 -1937
- package/services/storage/segment-store/SegmentStore.js +1294 -1294
- package/services/torrent/Contents.js +382 -382
- package/services/torrent/episode-naming.js +182 -182
- package/services/torrent/torrent-pool.js +2688 -2688
- package/services/torrent/worker/client.js +836 -836
- package/services/torrent/worker/held-bytes.js +231 -231
- package/services/torrent/worker/worker.js +1137 -1137
- package/services/transport/data-channel-handler.js +1373 -1373
- package/services/viewer/PriorityMap.js +421 -421
- package/test/audio-calibration.test.js +23 -23
- package/test/auto-quality-step.test.js +762 -762
- package/test/coalesce.test.js +39 -39
- package/test/coverage-follows-the-disk.test.js +5 -0
- package/test/decode-cost.test.js +475 -475
- package/test/encode-run.test.js +58 -0
- package/test/episode-naming.test.js +131 -131
- package/test/failed-encoder-still-serves-what-exists.test.js +1 -1
- package/test/fixtures/audio-frame-boundary.json +1 -1
- package/test/fixtures/refused-audio-20261002.json +10 -0
- package/test/fmp4-presentation-clock.test.js +4 -2
- package/test/format-keyed-outputs.test.js +78 -78
- package/test/health-metrics.test.js +11 -13
- package/test/held-read-ownership.test.js +77 -77
- package/test/helpers/encode-run.js +14 -6
- package/test/helpers/held-file.js +77 -77
- package/test/helpers/manager.js +62 -62
- package/test/helpers/matroska-file.js +296 -296
- package/test/keyframe-table-budget.test.js +123 -123
- package/test/matroska-cluster-discovery.test.js +323 -323
- package/test/one-output-one-session.test.js +273 -273
- package/test/output-speed.test.js +6 -1
- package/test/piece-completeness.test.js +37 -1
- package/test/quality-variants.test.js +1274 -1270
- package/test/rate-control-in-the-output.test.js +4 -3
- package/test/reads-not-yet-arrived.test.js +218 -218
- package/test/seek-frees-the-viewers-requests.test.js +1 -1
- package/test/segment-closed-on-both-branches.test.js +114 -114
- package/test/segment-judged-by-its-own-header.test.js +222 -222
- package/test/segment-serve-wiring.test.js +481 -481
- package/test/serving-existing-output.test.js +111 -111
- package/test/source-files-route.test.js +113 -113
- package/test/subtitle-cue-walk.test.js +385 -385
- package/test/subtitle-metadata.test.js +15 -15
- package/test/subtitle-plan-waits.test.js +125 -125
- package/test/subtitle-track-numbering.test.js +391 -391
- package/test/two-viewers-one-picture.test.js +508 -508
- package/test/viewer-requests-admission.test.js +92 -92
- package/test/viewer-starts-on-map.test.js +27 -27
- package/test/viewer-states.test.js +5 -2
- package/test/viewing-generations.test.js +390 -390
- package/test/whole-file-held-read.test.js +30 -30
- package/utils/coalesce.js +41 -41
package/test/coalesce.test.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file A request that arrives during a run gives one more run, never a lost
|
|
3
|
-
* one and never a queue.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import test from "node:test";
|
|
7
|
-
import assert from "node:assert/strict";
|
|
8
|
-
|
|
9
|
-
import { coalescing } from "../utils/coalesce.js";
|
|
10
|
-
|
|
11
|
-
test("asked during a run: one more run after it, however often it was asked", async () => {
|
|
12
|
-
const runs = [];
|
|
13
|
-
let release;
|
|
14
|
-
const run = coalescing(async (label) => {
|
|
15
|
-
runs.push(label);
|
|
16
|
-
if (runs.length === 1) {
|
|
17
|
-
await new Promise((resolve) => {
|
|
18
|
-
release = resolve;
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
const first = run("file", "first");
|
|
23
|
-
await run("file", "second");
|
|
24
|
-
await run("file", "third");
|
|
25
|
-
assert.deepEqual(runs, ["first"], "nothing ran beside the run in progress");
|
|
26
|
-
release();
|
|
27
|
-
await first;
|
|
28
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
29
|
-
assert.deepEqual(runs, ["first", "third"], "exactly one more run, with the latest arguments");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test("different keys run side by side", async () => {
|
|
33
|
-
const runs = [];
|
|
34
|
-
const run = coalescing(async (label) => {
|
|
35
|
-
runs.push(label);
|
|
36
|
-
});
|
|
37
|
-
await Promise.all([run("a", "a"), run("b", "b")]);
|
|
38
|
-
assert.deepEqual(runs.sort(), ["a", "b"]);
|
|
39
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* @file A request that arrives during a run gives one more run, never a lost
|
|
3
|
+
* one and never a queue.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
|
|
9
|
+
import { coalescing } from "../utils/coalesce.js";
|
|
10
|
+
|
|
11
|
+
test("asked during a run: one more run after it, however often it was asked", async () => {
|
|
12
|
+
const runs = [];
|
|
13
|
+
let release;
|
|
14
|
+
const run = coalescing(async (label) => {
|
|
15
|
+
runs.push(label);
|
|
16
|
+
if (runs.length === 1) {
|
|
17
|
+
await new Promise((resolve) => {
|
|
18
|
+
release = resolve;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const first = run("file", "first");
|
|
23
|
+
await run("file", "second");
|
|
24
|
+
await run("file", "third");
|
|
25
|
+
assert.deepEqual(runs, ["first"], "nothing ran beside the run in progress");
|
|
26
|
+
release();
|
|
27
|
+
await first;
|
|
28
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
29
|
+
assert.deepEqual(runs, ["first", "third"], "exactly one more run, with the latest arguments");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("different keys run side by side", async () => {
|
|
33
|
+
const runs = [];
|
|
34
|
+
const run = coalescing(async (label) => {
|
|
35
|
+
runs.push(label);
|
|
36
|
+
});
|
|
37
|
+
await Promise.all([run("a", "a"), run("b", "b")]);
|
|
38
|
+
assert.deepEqual(runs.sort(), ["a", "b"]);
|
|
39
|
+
});
|
|
@@ -190,7 +190,12 @@ test("a piece discarded with the run that had it open is not ready either", (t)
|
|
|
190
190
|
// A run stopped the instant after opening #0 leaves a file of no bytes under a
|
|
191
191
|
// name that reads as a segment; the store throws it away. Field 2026-09-07,
|
|
192
192
|
// 20:13:13 and 20:13:57 — printed twice while the map went on saying 482.
|
|
193
|
+
// Whoever removes a piece tells the store, as the serving path does after
|
|
194
|
+
// taking out a piece short of a track: the store's memory of a directory ends
|
|
195
|
+
// on an event, not on the directory's modification time, which moves in
|
|
196
|
+
// steps of several milliseconds and can stay where it was.
|
|
193
197
|
rmSync(path.join(dir, fmp4Format.segmentFileName(0)), { force: true });
|
|
198
|
+
store.forget(PICTURE);
|
|
194
199
|
|
|
195
200
|
made.reconcile();
|
|
196
201
|
assert.equal(made.runsOn(PICTURE).length, 1, "one number missing is one encoder");
|