@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.
Files changed (60) hide show
  1. package/dist/elements/EFAudio.d.ts +1 -2
  2. package/dist/elements/EFAudio.js +6 -9
  3. package/dist/elements/EFMedia/AssetIdMediaEngine.js +4 -1
  4. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +3 -4
  5. package/dist/elements/EFMedia/AssetMediaEngine.js +28 -17
  6. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +30 -11
  7. package/dist/elements/EFMedia/BaseMediaEngine.js +83 -31
  8. package/dist/elements/EFMedia/JitMediaEngine.d.ts +2 -4
  9. package/dist/elements/EFMedia/JitMediaEngine.js +12 -12
  10. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +7 -2
  11. package/dist/elements/EFVideo.d.ts +0 -1
  12. package/dist/elements/EFVideo.js +0 -9
  13. package/dist/elements/TargetController.js +3 -2
  14. package/package.json +2 -2
  15. package/src/elements/EFAudio.ts +7 -20
  16. package/src/elements/EFMedia/AssetIdMediaEngine.ts +10 -1
  17. package/src/elements/EFMedia/AssetMediaEngine.ts +45 -21
  18. package/src/elements/EFMedia/BaseMediaEngine.browsertest.ts +311 -0
  19. package/src/elements/EFMedia/BaseMediaEngine.ts +168 -51
  20. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +2 -12
  21. package/src/elements/EFMedia/JitMediaEngine.ts +25 -16
  22. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +10 -1
  23. package/src/elements/EFTemporal.browsertest.ts +47 -0
  24. package/src/elements/EFVideo.browsertest.ts +127 -281
  25. package/src/elements/EFVideo.ts +9 -9
  26. package/src/elements/TargetController.ts +6 -2
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +2 -4
  46. package/test/recordReplayProxyPlugin.js +46 -31
  47. package/test/setup.ts +16 -0
  48. package/test/useAssetMSW.ts +54 -0
  49. package/test/useMSW.ts +4 -11
  50. package/types.json +1 -1
  51. package/dist/elements/MediaController.d.ts +0 -30
  52. package/src/elements/EFMedia/BaseMediaEngine.test.ts +0 -164
  53. package/src/elements/MediaController.ts +0 -98
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. /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 response = await host.fetch(url);
15
- const data = (await response.json()) as ManifestResponse;
16
- return new JitMediaEngine(host, urlGenerator, data);
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
- public host: EFMedia,
21
- private urlGenerator: UrlGenerator,
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
- const rendition = this.data.audioRenditions[0];
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
- const rendition = this.data.videoRenditions[0];
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
- const response = await this.host.fetch(url, { signal });
78
- const arrayBuffer = await response.arrayBuffer();
79
- return arrayBuffer;
86
+
87
+ // Use unified fetch method
88
+ return this.fetchMedia(url, signal);
80
89
  }
81
90
 
82
- async fetchMediaSegmentImpl(
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.fetchMediaCache(url);
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
+ });