@editframe/elements 0.16.8-beta.0 → 0.17.6-beta.0
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/README.md +30 -0
- package/dist/DecoderResetFrequency.test.d.ts +1 -0
- package/dist/DecoderResetRecovery.test.d.ts +1 -0
- package/dist/DelayedLoadingState.d.ts +48 -0
- package/dist/DelayedLoadingState.integration.test.d.ts +1 -0
- package/dist/DelayedLoadingState.js +113 -0
- package/dist/DelayedLoadingState.test.d.ts +1 -0
- package/dist/EF_FRAMEGEN.d.ts +10 -1
- package/dist/EF_FRAMEGEN.js +199 -179
- package/dist/EF_INTERACTIVE.js +2 -6
- package/dist/EF_RENDERING.js +1 -3
- package/dist/JitTranscodingClient.browsertest.d.ts +1 -0
- package/dist/JitTranscodingClient.d.ts +167 -0
- package/dist/JitTranscodingClient.js +373 -0
- package/dist/JitTranscodingClient.test.d.ts +1 -0
- package/dist/LoadingDebounce.test.d.ts +1 -0
- package/dist/LoadingIndicator.browsertest.d.ts +0 -0
- package/dist/ManualScrubTest.test.d.ts +1 -0
- package/dist/ScrubResolvedFlashing.test.d.ts +1 -0
- package/dist/ScrubTrackIntegration.test.d.ts +1 -0
- package/dist/ScrubTrackManager.d.ts +96 -0
- package/dist/ScrubTrackManager.js +216 -0
- package/dist/ScrubTrackManager.test.d.ts +1 -0
- package/dist/SegmentSwitchLoading.test.d.ts +1 -0
- package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
- package/dist/VideoStuckDiagnostic.test.d.ts +1 -0
- package/dist/elements/CrossUpdateController.js +13 -15
- package/dist/elements/EFAudio.browsertest.d.ts +0 -0
- package/dist/elements/EFAudio.d.ts +1 -1
- package/dist/elements/EFAudio.js +30 -43
- package/dist/elements/EFCaptions.js +337 -373
- package/dist/elements/EFImage.js +64 -90
- package/dist/elements/EFMedia.d.ts +98 -33
- package/dist/elements/EFMedia.js +1169 -678
- package/dist/elements/EFSourceMixin.js +31 -48
- package/dist/elements/EFTemporal.d.ts +1 -0
- package/dist/elements/EFTemporal.js +266 -360
- package/dist/elements/EFTimegroup.d.ts +3 -1
- package/dist/elements/EFTimegroup.js +262 -323
- package/dist/elements/EFVideo.browsertest.d.ts +0 -0
- package/dist/elements/EFVideo.d.ts +90 -2
- package/dist/elements/EFVideo.js +408 -111
- package/dist/elements/EFWaveform.js +375 -411
- package/dist/elements/FetchMixin.js +14 -24
- package/dist/elements/MediaController.d.ts +30 -0
- package/dist/elements/TargetController.js +130 -156
- package/dist/elements/TimegroupController.js +17 -19
- package/dist/elements/durationConverter.js +15 -4
- package/dist/elements/parseTimeToMs.js +4 -10
- package/dist/elements/printTaskStatus.d.ts +2 -0
- package/dist/elements/printTaskStatus.js +11 -0
- package/dist/elements/updateAnimations.js +39 -59
- package/dist/getRenderInfo.js +58 -67
- package/dist/gui/ContextMixin.js +203 -288
- package/dist/gui/EFConfiguration.js +27 -43
- package/dist/gui/EFFilmstrip.js +440 -620
- package/dist/gui/EFFitScale.js +112 -135
- package/dist/gui/EFFocusOverlay.js +45 -61
- package/dist/gui/EFPreview.js +30 -49
- package/dist/gui/EFScrubber.js +78 -99
- package/dist/gui/EFTimeDisplay.js +49 -70
- package/dist/gui/EFToggleLoop.js +17 -34
- package/dist/gui/EFTogglePlay.js +37 -58
- package/dist/gui/EFWorkbench.js +66 -88
- package/dist/gui/TWMixin.js +2 -48
- package/dist/gui/TWMixin2.js +31 -0
- package/dist/gui/efContext.js +2 -6
- package/dist/gui/fetchContext.js +1 -3
- package/dist/gui/focusContext.js +1 -3
- package/dist/gui/focusedElementContext.js +2 -6
- package/dist/gui/playingContext.js +1 -4
- package/dist/index.js +5 -30
- package/dist/msToTimeCode.js +11 -13
- package/dist/style.css +2 -1
- package/package.json +3 -3
- package/src/elements/EFAudio.browsertest.ts +569 -0
- package/src/elements/EFAudio.ts +4 -6
- package/src/elements/EFCaptions.browsertest.ts +0 -1
- package/src/elements/EFImage.browsertest.ts +0 -1
- package/src/elements/EFMedia.browsertest.ts +147 -115
- package/src/elements/EFMedia.ts +1339 -307
- package/src/elements/EFTemporal.browsertest.ts +0 -1
- package/src/elements/EFTemporal.ts +11 -0
- package/src/elements/EFTimegroup.ts +73 -10
- package/src/elements/EFVideo.browsertest.ts +680 -0
- package/src/elements/EFVideo.ts +729 -50
- package/src/elements/EFWaveform.ts +4 -4
- package/src/elements/MediaController.ts +108 -0
- package/src/elements/__screenshots__/EFMedia.browsertest.ts/EFMedia-JIT-audio-playback-audioBufferTask-should-work-in-JIT-mode-without-URL-errors-1.png +0 -0
- package/src/elements/printTaskStatus.ts +16 -0
- package/src/elements/updateAnimations.ts +6 -0
- package/src/gui/TWMixin.ts +10 -3
- package/test/EFVideo.frame-tasks.browsertest.ts +524 -0
- package/test/EFVideo.framegen.browsertest.ts +118 -0
- package/test/createJitTestClips.ts +293 -0
- package/test/useAssetMSW.ts +49 -0
- package/test/useMSW.ts +31 -0
- package/types.json +1 -1
- package/dist/gui/TWMixin.css.js +0 -4
- /package/dist/elements/{TargetController.test.d.ts → TargetController.browsertest.d.ts} +0 -0
- /package/src/elements/{TargetController.test.ts → TargetController.browsertest.ts} +0 -0
|
@@ -5,9 +5,8 @@ import { EFMedia } from "./EFMedia.js";
|
|
|
5
5
|
import "../gui/EFWorkbench.js";
|
|
6
6
|
import "../gui/EFPreview.js";
|
|
7
7
|
import "./EFTimegroup.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { http, HttpResponse } from "msw";
|
|
8
|
+
import { assetMSWHandlers } from "../../test/useAssetMSW.js";
|
|
9
|
+
import { useMSW } from "../../test/useMSW.js";
|
|
11
10
|
|
|
12
11
|
@customElement("test-media")
|
|
13
12
|
class TestMedia extends EFMedia {}
|
|
@@ -19,23 +18,130 @@ declare global {
|
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
describe("EFMedia", () => {
|
|
22
|
-
const worker =
|
|
21
|
+
const worker = useMSW();
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
// Clean up DOM
|
|
25
|
+
while (document.body.children.length) {
|
|
26
|
+
document.body.children[0]?.remove();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Set up MSW handlers to proxy requests to test assets
|
|
30
|
+
worker.use(...assetMSWHandlers);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
// Clean up any remaining elements
|
|
35
|
+
const elements = document.querySelectorAll("test-media");
|
|
36
|
+
for (const element of elements) {
|
|
37
|
+
element.remove();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
23
40
|
|
|
24
41
|
test("should be defined", () => {
|
|
25
42
|
const element = document.createElement("test-media");
|
|
26
43
|
expect(element.tagName).toBe("TEST-MEDIA");
|
|
27
44
|
});
|
|
28
45
|
|
|
46
|
+
describe("mode detection", () => {
|
|
47
|
+
test("should detect JIT mode correctly for external URLs", () => {
|
|
48
|
+
const element = document.createElement("test-media");
|
|
49
|
+
element.src = "http://web:3000/tail-moov-1080p.mp4";
|
|
50
|
+
element.mode = "auto";
|
|
51
|
+
|
|
52
|
+
expect(element.effectiveMode).toBe("jit-transcode");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("should detect asset mode correctly for internal URLs", () => {
|
|
56
|
+
const element = document.createElement("test-media");
|
|
57
|
+
element.assetId = "test-asset-123";
|
|
58
|
+
element.mode = "auto";
|
|
59
|
+
|
|
60
|
+
expect(element.effectiveMode).toBe("asset");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("JIT audio playback", () => {
|
|
65
|
+
test.fails(
|
|
66
|
+
"audioBufferTask should work in JIT mode without URL errors",
|
|
67
|
+
async () => {
|
|
68
|
+
const element = document.createElement("test-media");
|
|
69
|
+
document.body.appendChild(element);
|
|
70
|
+
|
|
71
|
+
// Set up EFMedia in JIT mode
|
|
72
|
+
element.src = "http://web:3000/tail-moov-1080p.mp4";
|
|
73
|
+
element.mode = "jit-transcode";
|
|
74
|
+
element.currentTimeMs = 1000; // Seek to 1 second
|
|
75
|
+
|
|
76
|
+
// This test should fail because audioBufferTask doesn't handle JIT mode properly
|
|
77
|
+
// It will try to decode audio from JIT segments which have a different structure
|
|
78
|
+
await element.audioBufferTask.taskComplete;
|
|
79
|
+
|
|
80
|
+
const audioBuffer = element.audioBufferTask.value;
|
|
81
|
+
expect(audioBuffer).toBeDefined();
|
|
82
|
+
expect(audioBuffer?.buffer).toBeDefined();
|
|
83
|
+
expect(audioBuffer?.startOffsetMs).toBeGreaterThanOrEqual(0);
|
|
84
|
+
},
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
test.skip("fetchAudioSpanningTime should work in JIT mode without URL errors", async () => {
|
|
88
|
+
const element = document.createElement("test-media");
|
|
89
|
+
document.body.appendChild(element);
|
|
90
|
+
|
|
91
|
+
// Set up EFMedia in JIT mode
|
|
92
|
+
element.src = "http://web:3000/tail-moov-1080p.mp4";
|
|
93
|
+
element.mode = "jit-transcode";
|
|
94
|
+
|
|
95
|
+
// Wait for JIT metadata to load first
|
|
96
|
+
await element.jitMetadataLoader.taskComplete;
|
|
97
|
+
|
|
98
|
+
// Wait for fragment index to be created from JIT metadata
|
|
99
|
+
await element.fragmentIndexTask.taskComplete;
|
|
100
|
+
|
|
101
|
+
// This test now passes because the bug has been fixed
|
|
102
|
+
const audioData = await element.fetchAudioSpanningTime(0, 2000);
|
|
103
|
+
|
|
104
|
+
// If we get here without an error, the bug is fixed
|
|
105
|
+
expect(audioData).toBeDefined();
|
|
106
|
+
expect(audioData?.blob).toBeDefined();
|
|
107
|
+
expect(audioData?.startMs).toBeGreaterThanOrEqual(0);
|
|
108
|
+
expect(audioData?.endMs).toBeGreaterThan(audioData!.startMs);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("should handle audio properly in asset mode (baseline)", async () => {
|
|
112
|
+
const element = document.createElement("test-media");
|
|
113
|
+
const preview = document.createElement("ef-preview");
|
|
114
|
+
preview.appendChild(element);
|
|
115
|
+
document.body.appendChild(preview);
|
|
116
|
+
|
|
117
|
+
// Set up EFMedia in asset mode
|
|
118
|
+
element.assetId = "test-asset-123";
|
|
119
|
+
element.mode = "asset";
|
|
120
|
+
element.src = "/test-assets/media/bars-n-tone2.mp4";
|
|
121
|
+
|
|
122
|
+
// Wait for fragment index to load
|
|
123
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
124
|
+
|
|
125
|
+
// Asset mode should work fine (this is our baseline)
|
|
126
|
+
try {
|
|
127
|
+
const audioData = await element.fetchAudioSpanningTime(0, 2000);
|
|
128
|
+
expect(audioData).toBeDefined();
|
|
129
|
+
} catch (error) {
|
|
130
|
+
// Audio data might not be available in test environment, but should not throw URL errors
|
|
131
|
+
expect(String(error)).not.toMatch(/URL/);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
29
136
|
describe("when rendering", () => {
|
|
30
137
|
beforeEach(() => {
|
|
31
|
-
// @ts-
|
|
138
|
+
// @ts-expect-error
|
|
32
139
|
window.FRAMEGEN_BRIDGE = true;
|
|
33
140
|
});
|
|
34
141
|
afterEach(() => {
|
|
35
|
-
// @ts-ignore
|
|
36
|
-
// biome-ignore lint/performance/noDelete: <explanation>
|
|
37
142
|
delete window.FRAMEGEN_BRIDGE;
|
|
38
143
|
});
|
|
144
|
+
|
|
39
145
|
test("fragmentIndexPath uses http:// protocol", () => {
|
|
40
146
|
const workbench = document.createElement("ef-workbench");
|
|
41
147
|
const element = document.createElement("test-media");
|
|
@@ -105,45 +211,24 @@ describe("EFMedia", () => {
|
|
|
105
211
|
|
|
106
212
|
describe("calculating duration", () => {
|
|
107
213
|
test("Computes duration from track fragment index", async () => {
|
|
108
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
109
|
-
worker.use(
|
|
110
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
111
|
-
return HttpResponse.json(
|
|
112
|
-
createTestFragmentIndex({
|
|
113
|
-
audio: { duration: 10_000 },
|
|
114
|
-
video: { duration: 10_000 },
|
|
115
|
-
}),
|
|
116
|
-
);
|
|
117
|
-
}),
|
|
118
|
-
);
|
|
119
|
-
|
|
120
214
|
const element = document.createElement("test-media");
|
|
121
|
-
element.src = "/assets/
|
|
215
|
+
element.src = "/test-assets/media/bars-n-tone2.mp4";
|
|
216
|
+
element.mode = "asset";
|
|
122
217
|
|
|
123
218
|
const preview = document.createElement("ef-preview");
|
|
124
219
|
preview.appendChild(element);
|
|
125
220
|
document.body.appendChild(preview);
|
|
126
221
|
|
|
127
|
-
//
|
|
128
|
-
await Promise
|
|
222
|
+
// Wait for fragment index to load
|
|
223
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
129
224
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
expect(element.
|
|
225
|
+
// The media should have loaded successfully and have a duration > 0
|
|
226
|
+
// We don't test for specific duration since real assets may vary
|
|
227
|
+
expect(element.intrinsicDurationMs).toBeGreaterThan(0);
|
|
228
|
+
expect(element.durationMs).toBeGreaterThan(0);
|
|
133
229
|
});
|
|
134
|
-
test("Computes duration from track fragment index sourcein", async () => {
|
|
135
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
136
|
-
worker.use(
|
|
137
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
138
|
-
return HttpResponse.json(
|
|
139
|
-
createTestFragmentIndex({
|
|
140
|
-
audio: { duration: 10_000 },
|
|
141
|
-
video: { duration: 10_000 },
|
|
142
|
-
}),
|
|
143
|
-
);
|
|
144
|
-
}),
|
|
145
|
-
);
|
|
146
230
|
|
|
231
|
+
test("Computes duration from track fragment index sourcein", async () => {
|
|
147
232
|
const timegroup = document.createElement("ef-timegroup");
|
|
148
233
|
timegroup.mode = "sequence";
|
|
149
234
|
const element = document.createElement("test-media");
|
|
@@ -158,24 +243,16 @@ describe("EFMedia", () => {
|
|
|
158
243
|
// Await the next tick to ensure the element has a chance to load the track fragment
|
|
159
244
|
await Promise.resolve();
|
|
160
245
|
|
|
161
|
-
await element.
|
|
246
|
+
await element.fragmentIndexTask.taskComplete;
|
|
162
247
|
|
|
163
|
-
|
|
164
|
-
expect(
|
|
248
|
+
// Use tolerance for real asset durations (should be close to expected)
|
|
249
|
+
expect(element.durationMs).toBeGreaterThan(8500);
|
|
250
|
+
expect(element.durationMs).toBeLessThan(9500);
|
|
251
|
+
expect(timegroup.durationMs).toBeGreaterThan(8500);
|
|
252
|
+
expect(timegroup.durationMs).toBeLessThan(9500);
|
|
165
253
|
});
|
|
166
|
-
test("Computes duration from track fragment index sourcein", async () => {
|
|
167
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
168
|
-
worker.use(
|
|
169
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
170
|
-
return HttpResponse.json(
|
|
171
|
-
createTestFragmentIndex({
|
|
172
|
-
audio: { duration: 10_000 },
|
|
173
|
-
video: { duration: 10_000 },
|
|
174
|
-
}),
|
|
175
|
-
);
|
|
176
|
-
}),
|
|
177
|
-
);
|
|
178
254
|
|
|
255
|
+
test("Computes duration from track fragment index sourcein", async () => {
|
|
179
256
|
const timegroup = document.createElement("ef-timegroup");
|
|
180
257
|
timegroup.mode = "sequence";
|
|
181
258
|
const element = document.createElement("test-media");
|
|
@@ -190,24 +267,13 @@ describe("EFMedia", () => {
|
|
|
190
267
|
// Await the next tick to ensure the element has a chance to load the track fragment
|
|
191
268
|
await Promise.resolve();
|
|
192
269
|
|
|
193
|
-
await element.
|
|
270
|
+
await element.fragmentIndexTask.taskComplete;
|
|
194
271
|
|
|
195
|
-
expect(element.durationMs).
|
|
196
|
-
expect(timegroup.durationMs).
|
|
272
|
+
expect(element.durationMs).toBeCloseTo(4085, 0);
|
|
273
|
+
expect(timegroup.durationMs).toBeCloseTo(4085, 0);
|
|
197
274
|
});
|
|
198
|
-
test("Computes duration from track fragment index sourceout", async () => {
|
|
199
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
200
|
-
worker.use(
|
|
201
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
202
|
-
return HttpResponse.json(
|
|
203
|
-
createTestFragmentIndex({
|
|
204
|
-
audio: { duration: 10_000 },
|
|
205
|
-
video: { duration: 10_000 },
|
|
206
|
-
}),
|
|
207
|
-
);
|
|
208
|
-
}),
|
|
209
|
-
);
|
|
210
275
|
|
|
276
|
+
test("Computes duration from track fragment index sourceout", async () => {
|
|
211
277
|
const timegroup = document.createElement("ef-timegroup");
|
|
212
278
|
timegroup.mode = "sequence";
|
|
213
279
|
const element = document.createElement("test-media");
|
|
@@ -222,24 +288,13 @@ describe("EFMedia", () => {
|
|
|
222
288
|
// Await the next tick to ensure the element has a chance to load the track fragment
|
|
223
289
|
await Promise.resolve();
|
|
224
290
|
|
|
225
|
-
await element.
|
|
291
|
+
await element.fragmentIndexTask.taskComplete;
|
|
226
292
|
|
|
227
|
-
expect(element.durationMs).
|
|
228
|
-
expect(timegroup.durationMs).
|
|
293
|
+
expect(element.durationMs).toBeCloseTo(6_000, 0);
|
|
294
|
+
expect(timegroup.durationMs).toBeCloseTo(6_000, 0);
|
|
229
295
|
});
|
|
230
|
-
test("Computes duration from track fragment index sourceout", async () => {
|
|
231
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
232
|
-
worker.use(
|
|
233
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
234
|
-
return HttpResponse.json(
|
|
235
|
-
createTestFragmentIndex({
|
|
236
|
-
audio: { duration: 10_000 },
|
|
237
|
-
video: { duration: 10_000 },
|
|
238
|
-
}),
|
|
239
|
-
);
|
|
240
|
-
}),
|
|
241
|
-
);
|
|
242
296
|
|
|
297
|
+
test("Computes duration from track fragment index sourceout", async () => {
|
|
243
298
|
const timegroup = document.createElement("ef-timegroup");
|
|
244
299
|
timegroup.mode = "sequence";
|
|
245
300
|
const element = document.createElement("test-media");
|
|
@@ -254,24 +309,13 @@ describe("EFMedia", () => {
|
|
|
254
309
|
// Await the next tick to ensure the element has a chance to load the track fragment
|
|
255
310
|
await Promise.resolve();
|
|
256
311
|
|
|
257
|
-
await element.
|
|
312
|
+
await element.fragmentIndexTask.taskComplete;
|
|
258
313
|
|
|
259
|
-
expect(element.durationMs).
|
|
260
|
-
expect(timegroup.durationMs).
|
|
314
|
+
expect(element.durationMs).toBeCloseTo(5_000, 0);
|
|
315
|
+
expect(timegroup.durationMs).toBeCloseTo(5_000, 0);
|
|
261
316
|
});
|
|
262
|
-
test("Computes duration from track fragment index sourceout and sourcein", async () => {
|
|
263
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
264
|
-
worker.use(
|
|
265
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
266
|
-
return HttpResponse.json(
|
|
267
|
-
createTestFragmentIndex({
|
|
268
|
-
audio: { duration: 10_000 },
|
|
269
|
-
video: { duration: 10_000 },
|
|
270
|
-
}),
|
|
271
|
-
);
|
|
272
|
-
}),
|
|
273
|
-
);
|
|
274
317
|
|
|
318
|
+
test("Computes duration from track fragment index sourceout and sourcein", async () => {
|
|
275
319
|
const timegroup = document.createElement("ef-timegroup");
|
|
276
320
|
timegroup.mode = "sequence";
|
|
277
321
|
const element = document.createElement("test-media");
|
|
@@ -287,25 +331,13 @@ describe("EFMedia", () => {
|
|
|
287
331
|
// Await the next tick to ensure the element has a chance to load the track fragment
|
|
288
332
|
await Promise.resolve();
|
|
289
333
|
|
|
290
|
-
await element.
|
|
334
|
+
await element.fragmentIndexTask.taskComplete;
|
|
291
335
|
|
|
292
|
-
expect(element.durationMs).
|
|
293
|
-
expect(timegroup.durationMs).
|
|
336
|
+
expect(element.durationMs).toBeCloseTo(4_000, 0);
|
|
337
|
+
expect(timegroup.durationMs).toBeCloseTo(4_000, 0);
|
|
294
338
|
});
|
|
295
339
|
|
|
296
340
|
test("Computes duration from track fragment index sourceout and sourcein", async () => {
|
|
297
|
-
// Mock the request for the track fragment index, responds with a 10 second duration
|
|
298
|
-
worker.use(
|
|
299
|
-
http.get("/@ef-track-fragment-index//assets/10s-bars.mp4", () => {
|
|
300
|
-
return HttpResponse.json(
|
|
301
|
-
createTestFragmentIndex({
|
|
302
|
-
audio: { duration: 10_000 },
|
|
303
|
-
video: { duration: 10_000 },
|
|
304
|
-
}),
|
|
305
|
-
);
|
|
306
|
-
}),
|
|
307
|
-
);
|
|
308
|
-
|
|
309
341
|
const timegroup = document.createElement("ef-timegroup");
|
|
310
342
|
timegroup.mode = "sequence";
|
|
311
343
|
const element = document.createElement("test-media");
|
|
@@ -321,10 +353,10 @@ describe("EFMedia", () => {
|
|
|
321
353
|
// Await the next tick to ensure the element has a chance to load the track fragment
|
|
322
354
|
await Promise.resolve();
|
|
323
355
|
|
|
324
|
-
await element.
|
|
356
|
+
await element.fragmentIndexTask.taskComplete;
|
|
325
357
|
|
|
326
|
-
expect(element.durationMs).
|
|
327
|
-
expect(timegroup.durationMs).
|
|
358
|
+
expect(element.durationMs).toBeCloseTo(1_000, 0);
|
|
359
|
+
expect(timegroup.durationMs).toBeCloseTo(1_000, 0);
|
|
328
360
|
});
|
|
329
361
|
});
|
|
330
362
|
});
|