@hyperframes/core 0.8.48 → 0.8.50

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.
@@ -31,15 +31,24 @@ export function scanPendingCompositionAssets(doc) {
31
31
  const fontsLoading = doc.fonts?.status === "loading";
32
32
  return { pendingMedia, pendingImages, fontsLoading };
33
33
  }
34
- function collectPendingCompositionAssets(doc, { pendingMedia, pendingImages, fontsLoading }) {
34
+ function collectPendingCompositionAssets(doc, { pendingMedia, pendingImages, fontsLoading }, signal) {
35
35
  const mediaReady = pendingMedia.map((el) => new Promise((resolve) => {
36
+ // init.ts's eager preload pass may have already errored this element
37
+ // before this input ran; a DOM error event doesn't refire, so a
38
+ // listener attached now would wait for the shared 8s timeout instead.
39
+ if (el.error) {
40
+ resolve();
41
+ return;
42
+ }
36
43
  const onSettled = () => {
37
44
  el.removeEventListener("canplay", onSettled);
38
45
  el.removeEventListener("error", onSettled);
46
+ signal.removeEventListener("abort", onSettled);
39
47
  resolve();
40
48
  };
41
49
  el.addEventListener("canplay", onSettled);
42
50
  el.addEventListener("error", onSettled);
51
+ signal.addEventListener("abort", onSettled, { once: true });
43
52
  }));
44
53
  const imagesReady = pendingImages.map((img) => img.decode ? img.decode().catch(() => { }) : Promise.resolve());
45
54
  const fontsReady = fontsLoading && doc.fonts ? doc.fonts.ready.then(() => { }) : Promise.resolve();
@@ -47,21 +56,127 @@ function collectPendingCompositionAssets(doc, { pendingMedia, pendingImages, fon
47
56
  }
48
57
  /** Declared-media readiness input: waits on the composition's own video,
49
58
  * audio, image and font-face loads. */
50
- export function mediaReadinessInput(doc) {
59
+ export function mediaReadinessInput(doc, signal) {
51
60
  const scan = scanPendingCompositionAssets(doc);
52
61
  if (scan.pendingMedia.length === 0 && scan.pendingImages.length === 0 && !scan.fontsLoading) {
53
62
  return null;
54
63
  }
55
- return collectPendingCompositionAssets(doc, scan);
64
+ return collectPendingCompositionAssets(doc, scan, signal);
65
+ }
66
+ const RENDER_READY_POLL_MS = 50;
67
+ /** Declared-compute readiness input: waits on `window.__renderReady`. A
68
+ * probe-only composition (no HyperFrames runtime injected) never sets
69
+ * it — __hf absent means nothing to wait on, not an 8s poll for a flag
70
+ * that was never going to flip. */
71
+ export function computeReadinessInput(doc, signal) {
72
+ const win = doc.defaultView;
73
+ if (!win)
74
+ return null;
75
+ if (win.__renderReady)
76
+ return null;
77
+ if (!win.__hf)
78
+ return null;
79
+ return new Promise((resolve) => {
80
+ let timeoutId;
81
+ const finish = () => {
82
+ if (timeoutId !== undefined)
83
+ clearTimeout(timeoutId);
84
+ signal.removeEventListener("abort", finish);
85
+ resolve();
86
+ };
87
+ if (signal.aborted) {
88
+ finish();
89
+ return;
90
+ }
91
+ signal.addEventListener("abort", finish, { once: true });
92
+ const poll = () => {
93
+ if (win.__renderReady) {
94
+ finish();
95
+ return;
96
+ }
97
+ timeoutId = setTimeout(poll, RENDER_READY_POLL_MS);
98
+ };
99
+ poll();
100
+ });
101
+ }
102
+ // Frame-to-frame gap under which the main thread counts as free. Generous
103
+ // relative to a 16.7ms (60fps) frame budget — this detects a busy stretch
104
+ // (a mesh build, a shader compile), not ordinary frame-time variance.
105
+ const IDLE_FRAME_GAP_MS = 50;
106
+ // Two consecutive quiet frames, not one: a single fast gap can follow
107
+ // directly after the busy work finishes mid-frame and says nothing about
108
+ // whether the next frame is also free.
109
+ const IDLE_FRAMES_REQUIRED = 2;
110
+ // Gives up on a doc that keeps producing frames below 20fps. Does NOT bound
111
+ // a doc that stops painting entirely (backgrounded tab, or fewer than 3
112
+ // frames total) — that still rides the full shared 8s timeout, same as
113
+ // before this input existed. ponytail: 1500ms is unmeasured, retune later.
114
+ const MAX_PAINT_WAIT_MS = 1_500;
115
+ // Resolves with -1 on abort instead of rejecting: every caller already
116
+ // re-checks `signal.aborted` right after awaiting this, so a sentinel value
117
+ // is enough and keeps the abort path a plain early-return, not a try/catch.
118
+ function nextAnimationFrame(win, signal) {
119
+ return new Promise((resolve) => {
120
+ if (signal.aborted) {
121
+ resolve(-1);
122
+ return;
123
+ }
124
+ let id = 0;
125
+ const onAbort = () => {
126
+ win.cancelAnimationFrame?.(id);
127
+ resolve(-1);
128
+ };
129
+ signal.addEventListener("abort", onAbort, { once: true });
130
+ // A host whose rAF calls back synchronously reaches onAbort in the
131
+ // callback, so it must already be declared above.
132
+ id = win.requestAnimationFrame((ts) => {
133
+ signal.removeEventListener("abort", onAbort);
134
+ resolve(ts);
135
+ });
136
+ });
137
+ }
138
+ /** Composition-agnostic readiness input: waits for a frame to paint, then
139
+ * two consecutive quiet frame gaps — an early-out once the main thread is
140
+ * free, not a hold on steady sub-20fps painting. See MAX_PAINT_WAIT_MS for
141
+ * what this bound does and does not cover. */
142
+ export function paintAndIdleReadinessInput(doc, signal) {
143
+ const win = doc.defaultView;
144
+ if (!win)
145
+ return null;
146
+ return (async () => {
147
+ const firstTs = await nextAnimationFrame(win, signal);
148
+ if (signal.aborted)
149
+ return;
150
+ let lastTs = await nextAnimationFrame(win, signal);
151
+ let quietStreak = 0;
152
+ while (!signal.aborted && quietStreak < IDLE_FRAMES_REQUIRED) {
153
+ if (lastTs - firstTs >= MAX_PAINT_WAIT_MS)
154
+ return;
155
+ const ts = await nextAnimationFrame(win, signal);
156
+ if (signal.aborted)
157
+ return;
158
+ quietStreak = ts - lastTs < IDLE_FRAME_GAP_MS ? quietStreak + 1 : 0;
159
+ lastTs = ts;
160
+ }
161
+ })();
56
162
  }
57
163
  const DEFAULT_TIMEOUT_MS = 8_000;
58
164
  /** Invokes `onSettled` once every input settles, or the timeout elapses.
59
165
  * Calls back synchronously, before returning, when nothing is pending — a
60
166
  * caller that plays right after this call sees the decision already
61
- * applied, same as before this gate existed. */
167
+ * applied, same as before this gate existed. With the default inputs this
168
+ * only happens for a document with no `defaultView`, since
169
+ * paintAndIdleReadinessInput always has a frame to wait on otherwise. */
62
170
  export function settleCompositionReadiness(doc, onSettled, opts = {}) {
63
- const inputs = opts.inputs ?? [mediaReadinessInput];
64
- const pending = inputs.map((input) => input(doc)).filter((p) => p !== null);
171
+ const inputs = opts.inputs ?? [
172
+ mediaReadinessInput,
173
+ computeReadinessInput,
174
+ paintAndIdleReadinessInput,
175
+ ];
176
+ const controller = new AbortController();
177
+ const pending = inputs
178
+ .map((input) => input(doc, controller.signal))
179
+ .filter((p) => p !== null);
65
180
  if (pending.length === 0) {
66
181
  onSettled({ timedOut: false });
67
182
  return;
@@ -71,8 +186,13 @@ export function settleCompositionReadiness(doc, onSettled, opts = {}) {
71
186
  const timeout = new Promise((resolve) => {
72
187
  timeoutId = setTimeout(() => resolve("timed-out"), timeoutMs);
73
188
  });
189
+ // A timeout win leaves the losing inputs' promises pending forever unless
190
+ // told to stop: this abort is what lets computeReadinessInput clear its
191
+ // poll timer and paintAndIdleReadinessInput cancel its rAF chain instead
192
+ // of running for the life of the page.
74
193
  Promise.race([Promise.all(pending).then(() => "done"), timeout]).then((result) => {
75
194
  clearTimeout(timeoutId);
195
+ controller.abort();
76
196
  onSettled({ timedOut: result === "timed-out" });
77
197
  });
78
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compositionReadiness.js","sourceRoot":"","sources":["../src/compositionReadiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compositionReadiness.js","sourceRoot":"","sources":["../src/compositionReadiness.ts"],"names":[],"mappings":"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"}