@editframe/elements 0.18.20-beta.0 → 0.18.22-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 (41) hide show
  1. package/dist/elements/EFAudio.d.ts +1 -12
  2. package/dist/elements/EFAudio.js +3 -18
  3. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +1 -1
  4. package/dist/elements/EFMedia/AssetMediaEngine.js +3 -3
  5. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +15 -9
  6. package/dist/elements/EFMedia/BufferedSeekingInput.js +76 -78
  7. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +12 -10
  8. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +2 -18
  9. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +12 -10
  10. package/dist/elements/EFTemporal.d.ts +0 -1
  11. package/dist/elements/EFTemporal.js +4 -8
  12. package/dist/elements/EFTimegroup.d.ts +4 -4
  13. package/dist/elements/EFTimegroup.js +52 -60
  14. package/dist/elements/EFVideo.d.ts +1 -32
  15. package/dist/elements/EFVideo.js +13 -51
  16. package/dist/elements/SampleBuffer.js +1 -1
  17. package/dist/gui/ContextMixin.browsertest.d.ts +1 -1
  18. package/dist/gui/ContextMixin.js +1 -1
  19. package/package.json +2 -2
  20. package/src/elements/EFAudio.browsertest.ts +0 -3
  21. package/src/elements/EFAudio.ts +3 -22
  22. package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +39 -1
  23. package/src/elements/EFMedia/AssetMediaEngine.ts +5 -4
  24. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +90 -185
  25. package/src/elements/EFMedia/BufferedSeekingInput.ts +119 -130
  26. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +21 -21
  27. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +10 -5
  28. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +33 -34
  29. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +22 -20
  30. package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +0 -3
  31. package/src/elements/EFMedia.browsertest.ts +72 -60
  32. package/src/elements/EFTemporal.ts +5 -15
  33. package/src/elements/EFTimegroup.browsertest.ts +9 -4
  34. package/src/elements/EFTimegroup.ts +79 -95
  35. package/src/elements/EFVideo.browsertest.ts +172 -160
  36. package/src/elements/EFVideo.ts +17 -73
  37. package/src/elements/SampleBuffer.ts +1 -2
  38. package/src/gui/ContextMixin.browsertest.ts +5 -2
  39. package/src/gui/ContextMixin.ts +7 -0
  40. package/test/EFVideo.framegen.browsertest.ts +0 -54
  41. package/types.json +1 -1
@@ -53,7 +53,6 @@ export class SampleBuffer {
53
53
  }
54
54
 
55
55
  find(desiredSeekTimeMs: number): MediaSample | undefined {
56
- // Take snapshot to avoid concurrent modification during iteration
57
56
  const currentBuffer = [...this.buffer];
58
57
 
59
58
  if (currentBuffer.length === 0) return undefined;
@@ -70,7 +69,7 @@ export class SampleBuffer {
70
69
  const sampleEndMs = roundToMilliseconds(sampleStartMs + sampleDurationMs);
71
70
 
72
71
  // Check if the desired time falls within this sample's time span [start, end], inclusive of end
73
- if (targetTimeMs >= sampleStartMs && targetTimeMs <= sampleEndMs) {
72
+ if (targetTimeMs >= sampleStartMs && targetTimeMs < sampleEndMs) {
74
73
  return sample;
75
74
  }
76
75
  }
@@ -1,4 +1,4 @@
1
- import { LitElement } from "lit";
1
+ import { html, LitElement } from "lit";
2
2
  import { customElement } from "lit/decorators/custom-element.js";
3
3
  import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
4
4
 
@@ -13,7 +13,7 @@ class TestContext extends ContextMixin(LitElement) {}
13
13
  @customElement("test-context-reactivity")
14
14
  class TestContextElement extends ContextMixin(LitElement) {
15
15
  render() {
16
- return document.createElement("ef-timegroup");
16
+ return html`<slot></slot>`;
17
17
  }
18
18
  }
19
19
 
@@ -631,6 +631,9 @@ describe("ContextMixin", () => {
631
631
  await timegroup.updateComplete;
632
632
  await newChild.updateComplete;
633
633
 
634
+ // Wait for next animation frame to ensure temporal cache is cleared
635
+ await new Promise((resolve) => requestAnimationFrame(resolve));
636
+
634
637
  // Duration should now be 15s (the max of all children)
635
638
  expect(element.targetTimegroup?.durationMs).toBe(15000);
636
639
 
@@ -250,6 +250,13 @@ export function ContextMixin<T extends Constructor<LitElement>>(superClass: T) {
250
250
  if (newTimegroup !== this.targetTimegroup) {
251
251
  this.targetTimegroup = newTimegroup;
252
252
  shouldUpdate = true;
253
+ } else if (
254
+ mutation.target instanceof Element &&
255
+ (mutation.target.tagName === "EF-TIMEGROUP" ||
256
+ mutation.target.closest("ef-timegroup"))
257
+ ) {
258
+ // Handle childList changes within existing timegroups
259
+ shouldUpdate = true;
253
260
  }
254
261
  } else if (mutation.type === "attributes") {
255
262
  // Watch for attribute changes that might affect duration
@@ -50,40 +50,10 @@ describe("EFVideo Frame Generation", () => {
50
50
  expect(video.durationMs).toBe(0);
51
51
  });
52
52
 
53
- test("effective mode is 'asset' if mode is not specified", async ({
54
- expect,
55
- }) => {
56
- expect(video.effectiveMode).toBe("asset");
57
- });
58
-
59
- test("assetIndexLoader is pending", async ({ expect }) => {
60
- expect(video.assetIndexLoader.status).toEqual(TaskStatus.PENDING);
61
- });
62
-
63
- test("assetSegmentKeysTask is pending", ({ expect }) => {
64
- expect(video.assetSegmentKeysTask.status).toEqual(TaskStatus.PENDING);
65
- });
66
-
67
- test("assetInitSegmentsTask is pending", ({ expect }) => {
68
- expect(video.assetInitSegmentsTask.status).toEqual(TaskStatus.PENDING);
69
- });
70
-
71
- test("assetSegmentLoader is pending", ({ expect }) => {
72
- expect(video.assetSegmentLoader.status).toEqual(TaskStatus.PENDING);
73
- });
74
-
75
53
  test("fragmentIndexTask is pending", ({ expect }) => {
76
54
  expect(video.fragmentIndexTask.status).toEqual(TaskStatus.PENDING);
77
55
  });
78
56
 
79
- test("mediaSegmentsTask is pending", ({ expect }) => {
80
- expect(video.mediaSegmentsTask.status).toEqual(TaskStatus.PENDING);
81
- });
82
-
83
- test("seekTask is pending", ({ expect }) => {
84
- expect(video.seekTask.status).toEqual(TaskStatus.PENDING);
85
- });
86
-
87
57
  // Note: Timing-dependent tests disabled due to seek range issues
88
58
  // The test asset data starts at 80ms but component initializes at 0ms
89
59
  // These tests validate task completion after data loading but fail on seek timing
@@ -96,32 +66,8 @@ describe("EFVideo Frame Generation", () => {
96
66
  expect(video.durationMs).toBeCloseTo(10_085, 0);
97
67
  });
98
68
 
99
- test("assetIndexLoader is fulfilled", ({ expect }) => {
100
- expect(video.assetIndexLoader.status).toEqual(TaskStatus.COMPLETE);
101
- });
102
-
103
- test("assetSegmentKeysTask is fulfilled", ({ expect }) => {
104
- expect(video.assetSegmentKeysTask.status).toEqual(TaskStatus.COMPLETE);
105
- });
106
-
107
- test("assetInitSegmentsTask is fulfilled", ({ expect }) => {
108
- expect(video.assetInitSegmentsTask.status).toEqual(TaskStatus.COMPLETE);
109
- });
110
-
111
- test("assetSegmentLoader is fulfilled", ({ expect }) => {
112
- expect(video.assetSegmentLoader.status).toEqual(TaskStatus.COMPLETE);
113
- });
114
-
115
69
  test("fragmentIndexTask is fulfilled", ({ expect }) => {
116
70
  expect(video.fragmentIndexTask.status).toEqual(TaskStatus.COMPLETE);
117
71
  });
118
-
119
- test("mediaSegmentsTask is fulfilled", ({ expect }) => {
120
- expect(video.mediaSegmentsTask.status).toEqual(TaskStatus.COMPLETE);
121
- });
122
-
123
- test("seekTask is fulfilled", ({ expect }) => {
124
- expect(video.seekTask.status).toEqual(TaskStatus.COMPLETE);
125
- });
126
72
  });
127
73
  });