@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.
- package/dist/compiler/compositionScoping.d.ts.map +1 -1
- package/dist/compiler/compositionScoping.js +9 -2
- package/dist/compiler/compositionScoping.js.map +1 -1
- package/dist/compiler/htmlBundler.d.ts.map +1 -1
- package/dist/compiler/htmlBundler.js +12 -14
- package/dist/compiler/htmlBundler.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -0
- package/dist/compiler/index.d.ts.map +1 -1
- package/dist/compiler/index.js +2 -0
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/scriptRuns.d.ts +9 -0
- package/dist/compiler/scriptRuns.d.ts.map +1 -0
- package/dist/compiler/scriptRuns.js +30 -0
- package/dist/compiler/scriptRuns.js.map +1 -0
- package/dist/compositionReadiness.d.ts +18 -4
- package/dist/compositionReadiness.d.ts.map +1 -1
- package/dist/compositionReadiness.js +126 -6
- package/dist/compositionReadiness.js.map +1 -1
- package/dist/generated/runtime-inline.js +1 -1
- package/dist/generated/runtime-inline.js.map +1 -1
- package/dist/hyperframe.runtime.iife.js +34 -27
- package/dist/runtime/types.d.ts +13 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -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 ?? [
|
|
64
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"compositionReadiness.js","sourceRoot":"","sources":["../src/compositionReadiness.ts"],"names":[],"mappings":"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"}
|