@hyperframes/core 0.8.222 → 0.8.224
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.
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Drift a playing element may carry before sync pulls it back onto the playhead. */
|
|
2
2
|
export declare const MEDIA_SYNC_TOLERANCE_SECONDS = 0.04;
|
|
3
3
|
export declare const MEDIA_HARD_SYNC_SECONDS = 0.5;
|
|
4
|
+
export declare function markMediaRestarted(el: HTMLMediaElement): void;
|
|
4
5
|
/** Rate or seek for media `offset` s behind (+) or ahead (-); a lag still growing (`settled` false) never seeks. */
|
|
5
6
|
export declare function steerMedia(el: HTMLMediaElement, offset: number, baseRate: number, settled: boolean, audioOnly?: boolean): {
|
|
6
7
|
rate: number;
|
|
@@ -13,11 +13,20 @@ const AUDIO_MAX_STEER = 0.1;
|
|
|
13
13
|
const AUDIO_STEER_LIMIT_SECONDS = 0.1;
|
|
14
14
|
/** Direction (+1 fast, -1 slow) an element is being steered in; absent when it plays at its authored rate. */
|
|
15
15
|
const steering = new WeakMap();
|
|
16
|
+
/** Started or seeked, not yet moving in tolerance: its lag is its own output latency, which a seek only renews. */
|
|
17
|
+
const catchingUp = new WeakSet();
|
|
18
|
+
export function markMediaRestarted(el) {
|
|
19
|
+
catchingUp.add(el);
|
|
20
|
+
}
|
|
16
21
|
/** Rate or seek for media `offset` s behind (+) or ahead (-); a lag still growing (`settled` false) never seeks. */
|
|
17
22
|
export function steerMedia(el, offset, baseRate, settled, audioOnly = el.tagName === "AUDIO") {
|
|
18
23
|
const lag = Math.abs(offset);
|
|
19
|
-
if (
|
|
24
|
+
if (settled && lag <= MEDIA_SYNC_TOLERANCE_SECONDS)
|
|
25
|
+
catchingUp.delete(el);
|
|
26
|
+
const seekable = !catchingUp.has(el) || lag > MEDIA_HARD_SYNC_SECONDS;
|
|
27
|
+
if (audioOnly && settled && lag > AUDIO_STEER_LIMIT_SECONDS && seekable) {
|
|
20
28
|
steering.delete(el);
|
|
29
|
+
catchingUp.add(el);
|
|
21
30
|
return { rate: baseRate, seek: true };
|
|
22
31
|
}
|
|
23
32
|
const direction = Math.sign(offset);
|
|
@@ -35,6 +44,7 @@ export function steerMedia(el, offset, baseRate, settled, audioOnly = el.tagName
|
|
|
35
44
|
/** Drop `el`'s steering: it was seeked, paused or replaced, so its old offset says nothing. */
|
|
36
45
|
export function forgetSteering(el) {
|
|
37
46
|
steering.delete(el);
|
|
47
|
+
catchingUp.delete(el);
|
|
38
48
|
}
|
|
39
49
|
export function isSteering(el) {
|
|
40
50
|
return steering.has(el);
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ export type RuntimeStateMessage = {
|
|
|
38
38
|
currentTime: number;
|
|
39
39
|
ended: boolean;
|
|
40
40
|
isPlaying: boolean;
|
|
41
|
+
buffering: boolean;
|
|
41
42
|
muted: boolean;
|
|
42
43
|
playbackRate: number;
|
|
43
44
|
};
|
|
@@ -239,6 +240,7 @@ export type RuntimePreviewHealthMessage = {
|
|
|
239
240
|
worstFrameMs: number;
|
|
240
241
|
skippedShare: number;
|
|
241
242
|
waitingShare: number;
|
|
243
|
+
frozenShare: number;
|
|
242
244
|
gapP50Ms: number;
|
|
243
245
|
gapP95Ms: number;
|
|
244
246
|
mode: "play";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/core",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.224",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -429,9 +429,9 @@
|
|
|
429
429
|
"linkedom": "^0.18.12",
|
|
430
430
|
"postcss": "^8.5.8",
|
|
431
431
|
"wawoff2": "^2.0.1",
|
|
432
|
-
"@hyperframes/lint": "0.8.
|
|
433
|
-
"@hyperframes/
|
|
434
|
-
"@hyperframes/
|
|
432
|
+
"@hyperframes/lint": "0.8.224",
|
|
433
|
+
"@hyperframes/studio-server": "0.8.224",
|
|
434
|
+
"@hyperframes/parsers": "0.8.224"
|
|
435
435
|
},
|
|
436
436
|
"devDependencies": {
|
|
437
437
|
"@fontsource/archivo-black": "^5.2.8",
|