@editframe/elements 0.18.7-beta.0 → 0.18.19-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/dist/elements/EFAudio.d.ts +1 -2
- package/dist/elements/EFAudio.js +6 -9
- package/dist/elements/EFMedia/AssetIdMediaEngine.js +4 -1
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +3 -4
- package/dist/elements/EFMedia/AssetMediaEngine.js +28 -17
- package/dist/elements/EFMedia/BaseMediaEngine.d.ts +30 -11
- package/dist/elements/EFMedia/BaseMediaEngine.js +83 -31
- package/dist/elements/EFMedia/JitMediaEngine.d.ts +2 -4
- package/dist/elements/EFMedia/JitMediaEngine.js +12 -12
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +7 -2
- package/dist/elements/EFVideo.d.ts +0 -1
- package/dist/elements/EFVideo.js +0 -9
- package/dist/elements/TargetController.js +3 -2
- package/package.json +2 -2
- package/src/elements/EFAudio.ts +7 -20
- package/src/elements/EFMedia/AssetIdMediaEngine.ts +10 -1
- package/src/elements/EFMedia/AssetMediaEngine.ts +45 -21
- package/src/elements/EFMedia/BaseMediaEngine.browsertest.ts +311 -0
- package/src/elements/EFMedia/BaseMediaEngine.ts +168 -51
- package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +2 -12
- package/src/elements/EFMedia/JitMediaEngine.ts +25 -16
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +10 -1
- package/src/elements/EFTemporal.browsertest.ts +47 -0
- package/src/elements/EFVideo.browsertest.ts +127 -281
- package/src/elements/EFVideo.ts +9 -9
- package/src/elements/TargetController.ts +6 -2
- package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/metadata.json +3 -8
- package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/metadata.json +3 -8
- package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/metadata.json +3 -8
- package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/metadata.json +3 -8
- package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/metadata.json +3 -8
- package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/metadata.json +3 -8
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/metadata.json +4 -9
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/metadata.json +4 -9
- package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/metadata.json +4 -9
- package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/metadata.json +4 -9
- package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/metadata.json +4 -9
- package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/metadata.json +4 -9
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +2 -4
- package/test/recordReplayProxyPlugin.js +46 -31
- package/test/setup.ts +16 -0
- package/test/useAssetMSW.ts +54 -0
- package/test/useMSW.ts +4 -11
- package/types.json +1 -1
- package/dist/elements/MediaController.d.ts +0 -30
- package/src/elements/EFMedia/BaseMediaEngine.test.ts +0 -164
- package/src/elements/MediaController.ts +0 -98
- package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/metadata.json +0 -22
- package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/metadata.json +0 -22
- package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/metadata.json +0 -22
- /package/dist/elements/EFMedia/{BaseMediaEngine.test.d.ts → BaseMediaEngine.browsertest.d.ts} +0 -0
|
@@ -109,15 +109,10 @@ describe("JitMediaEngine", () => {
|
|
|
109
109
|
|
|
110
110
|
test("returns undefined audio rendition when none available", ({
|
|
111
111
|
urlGenerator,
|
|
112
|
-
emptyManifestResponse,
|
|
113
112
|
host,
|
|
114
113
|
expect,
|
|
115
114
|
}) => {
|
|
116
|
-
const engine = new JitMediaEngine(
|
|
117
|
-
host,
|
|
118
|
-
urlGenerator,
|
|
119
|
-
emptyManifestResponse,
|
|
120
|
-
);
|
|
115
|
+
const engine = new JitMediaEngine(host, urlGenerator);
|
|
121
116
|
|
|
122
117
|
expect(engine.audioRendition).toBeUndefined();
|
|
123
118
|
});
|
|
@@ -138,15 +133,10 @@ describe("JitMediaEngine", () => {
|
|
|
138
133
|
|
|
139
134
|
test("returns undefined video rendition when none available", ({
|
|
140
135
|
urlGenerator,
|
|
141
|
-
emptyManifestResponse,
|
|
142
136
|
host,
|
|
143
137
|
expect,
|
|
144
138
|
}) => {
|
|
145
|
-
const engine = new JitMediaEngine(
|
|
146
|
-
host,
|
|
147
|
-
urlGenerator,
|
|
148
|
-
emptyManifestResponse,
|
|
149
|
-
);
|
|
139
|
+
const engine = new JitMediaEngine(host, urlGenerator);
|
|
150
140
|
|
|
151
141
|
expect(engine.videoRendition).toBeUndefined();
|
|
152
142
|
});
|
|
@@ -10,18 +10,19 @@ import type { EFMedia } from "../EFMedia.js";
|
|
|
10
10
|
import { BaseMediaEngine } from "./BaseMediaEngine";
|
|
11
11
|
|
|
12
12
|
export class JitMediaEngine extends BaseMediaEngine implements MediaEngine {
|
|
13
|
+
private urlGenerator: UrlGenerator;
|
|
14
|
+
private data: ManifestResponse = {} as ManifestResponse;
|
|
15
|
+
|
|
13
16
|
static async fetch(host: EFMedia, urlGenerator: UrlGenerator, url: string) {
|
|
14
|
-
const
|
|
15
|
-
const data =
|
|
16
|
-
|
|
17
|
+
const engine = new JitMediaEngine(host, urlGenerator);
|
|
18
|
+
const data = await engine.fetchManifest(url);
|
|
19
|
+
engine.data = data;
|
|
20
|
+
return engine;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
|
-
constructor(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
private data: ManifestResponse,
|
|
23
|
-
) {
|
|
24
|
-
super();
|
|
23
|
+
constructor(host: EFMedia, urlGenerator: UrlGenerator) {
|
|
24
|
+
super(host);
|
|
25
|
+
this.urlGenerator = urlGenerator;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
get durationMs() {
|
|
@@ -33,9 +34,13 @@ export class JitMediaEngine extends BaseMediaEngine implements MediaEngine {
|
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
get audioRendition(): AudioRendition | undefined {
|
|
36
|
-
|
|
37
|
+
if (!this.data.audioRenditions || this.data.audioRenditions.length === 0) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
37
40
|
|
|
41
|
+
const rendition = this.data.audioRenditions[0];
|
|
38
42
|
if (!rendition) return undefined;
|
|
43
|
+
|
|
39
44
|
return {
|
|
40
45
|
id: rendition.id as RenditionId,
|
|
41
46
|
trackId: undefined,
|
|
@@ -46,9 +51,13 @@ export class JitMediaEngine extends BaseMediaEngine implements MediaEngine {
|
|
|
46
51
|
}
|
|
47
52
|
|
|
48
53
|
get videoRendition(): VideoRendition | undefined {
|
|
49
|
-
|
|
54
|
+
if (!this.data.videoRenditions || this.data.videoRenditions.length === 0) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
50
57
|
|
|
58
|
+
const rendition = this.data.videoRenditions[0];
|
|
51
59
|
if (!rendition) return undefined;
|
|
60
|
+
|
|
52
61
|
return {
|
|
53
62
|
id: rendition.id as RenditionId,
|
|
54
63
|
trackId: undefined,
|
|
@@ -74,12 +83,12 @@ export class JitMediaEngine extends BaseMediaEngine implements MediaEngine {
|
|
|
74
83
|
rendition.id,
|
|
75
84
|
this,
|
|
76
85
|
);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return
|
|
86
|
+
|
|
87
|
+
// Use unified fetch method
|
|
88
|
+
return this.fetchMedia(url, signal);
|
|
80
89
|
}
|
|
81
90
|
|
|
82
|
-
async
|
|
91
|
+
async fetchMediaSegment(
|
|
83
92
|
segmentId: number,
|
|
84
93
|
rendition: { id?: RenditionId; trackId: number | undefined; src: string },
|
|
85
94
|
) {
|
|
@@ -91,7 +100,7 @@ export class JitMediaEngine extends BaseMediaEngine implements MediaEngine {
|
|
|
91
100
|
rendition.id,
|
|
92
101
|
this,
|
|
93
102
|
);
|
|
94
|
-
return this.
|
|
103
|
+
return this.fetchMedia(url);
|
|
95
104
|
}
|
|
96
105
|
|
|
97
106
|
computeSegmentId(
|
|
@@ -13,8 +13,17 @@ export const makeAudioSeekTask = (host: EFMedia): AudioSeekTask => {
|
|
|
13
13
|
onError: (error) => {
|
|
14
14
|
if (error instanceof IgnorableError) {
|
|
15
15
|
console.info("audioSeekTask aborted");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (error instanceof DOMException) {
|
|
19
|
+
console.error(
|
|
20
|
+
`audioSeekTask error: ${error.message} ${error.name} ${error.code}`,
|
|
21
|
+
);
|
|
22
|
+
} else if (error instanceof Error) {
|
|
23
|
+
console.error(`audioSeekTask error ${error.name}: ${error.message}`);
|
|
24
|
+
} else {
|
|
25
|
+
console.error("audioSeekTask unknown error", error);
|
|
16
26
|
}
|
|
17
|
-
console.error("audioSeekTask error", error);
|
|
18
27
|
},
|
|
19
28
|
onComplete: (_value) => {},
|
|
20
29
|
task: async (
|
|
@@ -26,6 +26,20 @@ describe("sourcein and sourceout", () => {
|
|
|
26
26
|
expect(element.durationMs).toBe(4_000);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
+
test("sourcein='0s' is parsed correctly as 0", () => {
|
|
30
|
+
const element = document.createElement("ten-seconds");
|
|
31
|
+
element.setAttribute("sourcein", "0s");
|
|
32
|
+
expect(element.sourceInMs).toBe(0);
|
|
33
|
+
expect(element.durationMs).toBe(10_000);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("sourcein='0ms' is parsed correctly as 0", () => {
|
|
37
|
+
const element = document.createElement("ten-seconds");
|
|
38
|
+
element.setAttribute("sourcein", "0ms");
|
|
39
|
+
expect(element.sourceInMs).toBe(0);
|
|
40
|
+
expect(element.durationMs).toBe(10_000);
|
|
41
|
+
});
|
|
42
|
+
|
|
29
43
|
describe("only srcin is set", () => {
|
|
30
44
|
test("duration is calculated", () => {
|
|
31
45
|
const element = document.createElement("ten-seconds");
|
|
@@ -109,3 +123,36 @@ describe("duration", () => {
|
|
|
109
123
|
expect(element.durationMs).toBe(10_000);
|
|
110
124
|
});
|
|
111
125
|
});
|
|
126
|
+
|
|
127
|
+
describe("EFVideo sourcein attribute", () => {
|
|
128
|
+
test("EFVideo with sourcein='0s' should parse correctly", () => {
|
|
129
|
+
const element = document.createElement("ef-video");
|
|
130
|
+
element.setAttribute("sourcein", "0s");
|
|
131
|
+
|
|
132
|
+
// The sourcein attribute should be set correctly
|
|
133
|
+
expect(element.getAttribute("sourcein")).toBe("0s");
|
|
134
|
+
|
|
135
|
+
// Note: In the test environment, the property system may not be fully initialized
|
|
136
|
+
// but the attribute is set correctly, which is what we're testing
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("Multiple EFVideo elements can be created without conflicts", () => {
|
|
140
|
+
// This test verifies that our fix for the abort signal deduplication issue works
|
|
141
|
+
// Multiple elements should be able to exist without signal conflicts
|
|
142
|
+
|
|
143
|
+
const element1 = document.createElement("ef-video");
|
|
144
|
+
const element2 = document.createElement("ef-video");
|
|
145
|
+
|
|
146
|
+
// Set different sources
|
|
147
|
+
element1.src = "test-video-1.mp4";
|
|
148
|
+
element2.src = "test-video-2.mp4";
|
|
149
|
+
|
|
150
|
+
// Both elements should have their attributes set correctly
|
|
151
|
+
expect(element1.src).toBe("test-video-1.mp4");
|
|
152
|
+
expect(element2.src).toBe("test-video-2.mp4");
|
|
153
|
+
|
|
154
|
+
// Both elements should be valid DOM elements
|
|
155
|
+
expect(element1.tagName).toBe("EF-VIDEO");
|
|
156
|
+
expect(element2.tagName).toBe("EF-VIDEO");
|
|
157
|
+
});
|
|
158
|
+
});
|