@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 (audioOnly && settled && lag > AUDIO_STEER_LIMIT_SECONDS) {
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);
@@ -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.222",
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.222",
433
- "@hyperframes/parsers": "0.8.222",
434
- "@hyperframes/studio-server": "0.8.222"
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",