@editframe/elements 0.20.4-beta.0 → 0.23.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.
Files changed (183) hide show
  1. package/dist/DelayedLoadingState.js +0 -27
  2. package/dist/EF_FRAMEGEN.d.ts +5 -3
  3. package/dist/EF_FRAMEGEN.js +49 -11
  4. package/dist/_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js +7 -0
  5. package/dist/attachContextRoot.d.ts +1 -0
  6. package/dist/attachContextRoot.js +9 -0
  7. package/dist/elements/ContextProxiesController.d.ts +1 -2
  8. package/dist/elements/EFAudio.js +5 -9
  9. package/dist/elements/EFCaptions.d.ts +1 -3
  10. package/dist/elements/EFCaptions.js +112 -129
  11. package/dist/elements/EFImage.js +6 -7
  12. package/dist/elements/EFMedia/AssetIdMediaEngine.js +2 -5
  13. package/dist/elements/EFMedia/AssetMediaEngine.js +36 -33
  14. package/dist/elements/EFMedia/BaseMediaEngine.js +57 -73
  15. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +1 -1
  16. package/dist/elements/EFMedia/BufferedSeekingInput.js +134 -78
  17. package/dist/elements/EFMedia/JitMediaEngine.js +9 -19
  18. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +7 -13
  19. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +2 -3
  20. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +1 -1
  21. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +6 -5
  22. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +1 -3
  23. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +1 -1
  24. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +1 -1
  25. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +1 -1
  26. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +9 -25
  27. package/dist/elements/EFMedia/shared/BufferUtils.js +2 -17
  28. package/dist/elements/EFMedia/shared/GlobalInputCache.js +0 -24
  29. package/dist/elements/EFMedia/shared/PrecisionUtils.js +0 -21
  30. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +0 -17
  31. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +1 -10
  32. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +29 -0
  33. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +32 -0
  34. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +1 -15
  35. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +1 -7
  36. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +8 -5
  37. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +12 -13
  38. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +1 -1
  39. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +134 -70
  40. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +11 -18
  41. package/dist/elements/EFMedia.d.ts +19 -0
  42. package/dist/elements/EFMedia.js +44 -25
  43. package/dist/elements/EFSourceMixin.js +5 -7
  44. package/dist/elements/EFSurface.js +6 -9
  45. package/dist/elements/EFTemporal.browsertest.d.ts +11 -0
  46. package/dist/elements/EFTemporal.d.ts +10 -0
  47. package/dist/elements/EFTemporal.js +100 -41
  48. package/dist/elements/EFThumbnailStrip.js +23 -73
  49. package/dist/elements/EFTimegroup.browsertest.d.ts +3 -3
  50. package/dist/elements/EFTimegroup.d.ts +35 -14
  51. package/dist/elements/EFTimegroup.js +138 -181
  52. package/dist/elements/EFVideo.d.ts +16 -2
  53. package/dist/elements/EFVideo.js +156 -108
  54. package/dist/elements/EFWaveform.js +23 -40
  55. package/dist/elements/SampleBuffer.js +3 -7
  56. package/dist/elements/TargetController.js +5 -5
  57. package/dist/elements/durationConverter.js +4 -4
  58. package/dist/elements/renderTemporalAudio.d.ts +10 -0
  59. package/dist/elements/renderTemporalAudio.js +35 -0
  60. package/dist/elements/updateAnimations.js +19 -43
  61. package/dist/gui/ContextMixin.d.ts +5 -5
  62. package/dist/gui/ContextMixin.js +167 -162
  63. package/dist/gui/Controllable.browsertest.d.ts +0 -0
  64. package/dist/gui/Controllable.d.ts +15 -0
  65. package/dist/gui/Controllable.js +9 -0
  66. package/dist/gui/EFConfiguration.js +7 -7
  67. package/dist/gui/EFControls.browsertest.d.ts +11 -0
  68. package/dist/gui/EFControls.d.ts +18 -4
  69. package/dist/gui/EFControls.js +70 -28
  70. package/dist/gui/EFDial.browsertest.d.ts +0 -0
  71. package/dist/gui/EFDial.d.ts +18 -0
  72. package/dist/gui/EFDial.js +141 -0
  73. package/dist/gui/EFFilmstrip.browsertest.d.ts +11 -0
  74. package/dist/gui/EFFilmstrip.d.ts +12 -2
  75. package/dist/gui/EFFilmstrip.js +214 -129
  76. package/dist/gui/EFFitScale.js +5 -8
  77. package/dist/gui/EFFocusOverlay.js +4 -4
  78. package/dist/gui/EFPause.browsertest.d.ts +0 -0
  79. package/dist/gui/EFPause.d.ts +23 -0
  80. package/dist/gui/EFPause.js +59 -0
  81. package/dist/gui/EFPlay.browsertest.d.ts +0 -0
  82. package/dist/gui/EFPlay.d.ts +23 -0
  83. package/dist/gui/EFPlay.js +59 -0
  84. package/dist/gui/EFPreview.d.ts +4 -0
  85. package/dist/gui/EFPreview.js +18 -9
  86. package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
  87. package/dist/gui/EFResizableBox.d.ts +34 -0
  88. package/dist/gui/EFResizableBox.js +547 -0
  89. package/dist/gui/EFScrubber.d.ts +9 -3
  90. package/dist/gui/EFScrubber.js +13 -13
  91. package/dist/gui/EFTimeDisplay.d.ts +7 -1
  92. package/dist/gui/EFTimeDisplay.js +8 -8
  93. package/dist/gui/EFToggleLoop.d.ts +9 -3
  94. package/dist/gui/EFToggleLoop.js +7 -5
  95. package/dist/gui/EFTogglePlay.d.ts +12 -4
  96. package/dist/gui/EFTogglePlay.js +26 -21
  97. package/dist/gui/EFWorkbench.js +5 -5
  98. package/dist/gui/PlaybackController.d.ts +67 -0
  99. package/dist/gui/PlaybackController.js +310 -0
  100. package/dist/gui/TWMixin.js +1 -1
  101. package/dist/gui/TWMixin2.js +1 -1
  102. package/dist/gui/TargetOrContextMixin.d.ts +10 -0
  103. package/dist/gui/TargetOrContextMixin.js +98 -0
  104. package/dist/gui/efContext.d.ts +2 -2
  105. package/dist/index.d.ts +5 -0
  106. package/dist/index.js +5 -1
  107. package/dist/otel/BridgeSpanExporter.d.ts +13 -0
  108. package/dist/otel/BridgeSpanExporter.js +87 -0
  109. package/dist/otel/setupBrowserTracing.d.ts +12 -0
  110. package/dist/otel/setupBrowserTracing.js +32 -0
  111. package/dist/otel/tracingHelpers.d.ts +34 -0
  112. package/dist/otel/tracingHelpers.js +112 -0
  113. package/dist/style.css +1 -1
  114. package/dist/transcoding/cache/RequestDeduplicator.js +0 -21
  115. package/dist/transcoding/cache/URLTokenDeduplicator.js +1 -21
  116. package/dist/transcoding/utils/UrlGenerator.js +2 -19
  117. package/dist/utils/LRUCache.js +6 -53
  118. package/package.json +13 -5
  119. package/src/elements/ContextProxiesController.ts +10 -10
  120. package/src/elements/EFAudio.ts +1 -0
  121. package/src/elements/EFCaptions.browsertest.ts +128 -56
  122. package/src/elements/EFCaptions.ts +60 -34
  123. package/src/elements/EFImage.browsertest.ts +1 -2
  124. package/src/elements/EFMedia/AssetMediaEngine.ts +65 -37
  125. package/src/elements/EFMedia/BaseMediaEngine.ts +110 -52
  126. package/src/elements/EFMedia/BufferedSeekingInput.ts +218 -101
  127. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +3 -0
  128. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +7 -3
  129. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +1 -1
  130. package/src/elements/EFMedia/videoTasks/MainVideoInputCache.ts +76 -0
  131. package/src/elements/EFMedia/videoTasks/makeScrubVideoInputTask.ts +16 -10
  132. package/src/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.ts +7 -1
  133. package/src/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.ts +222 -116
  134. package/src/elements/EFMedia.browsertest.ts +8 -15
  135. package/src/elements/EFMedia.ts +54 -8
  136. package/src/elements/EFSurface.browsertest.ts +2 -6
  137. package/src/elements/EFSurface.ts +1 -0
  138. package/src/elements/EFTemporal.browsertest.ts +58 -1
  139. package/src/elements/EFTemporal.ts +140 -4
  140. package/src/elements/EFThumbnailStrip.browsertest.ts +2 -8
  141. package/src/elements/EFThumbnailStrip.ts +1 -0
  142. package/src/elements/EFTimegroup.browsertest.ts +16 -15
  143. package/src/elements/EFTimegroup.ts +281 -275
  144. package/src/elements/EFVideo.browsertest.ts +162 -74
  145. package/src/elements/EFVideo.ts +229 -101
  146. package/src/elements/FetchContext.browsertest.ts +7 -2
  147. package/src/elements/TargetController.browsertest.ts +1 -0
  148. package/src/elements/TargetController.ts +1 -0
  149. package/src/elements/renderTemporalAudio.ts +108 -0
  150. package/src/elements/updateAnimations.browsertest.ts +181 -6
  151. package/src/elements/updateAnimations.ts +6 -6
  152. package/src/gui/ContextMixin.browsertest.ts +274 -27
  153. package/src/gui/ContextMixin.ts +230 -175
  154. package/src/gui/Controllable.browsertest.ts +258 -0
  155. package/src/gui/Controllable.ts +41 -0
  156. package/src/gui/EFControls.browsertest.ts +294 -80
  157. package/src/gui/EFControls.ts +139 -28
  158. package/src/gui/EFDial.browsertest.ts +84 -0
  159. package/src/gui/EFDial.ts +172 -0
  160. package/src/gui/EFFilmstrip.browsertest.ts +712 -0
  161. package/src/gui/EFFilmstrip.ts +213 -23
  162. package/src/gui/EFPause.browsertest.ts +202 -0
  163. package/src/gui/EFPause.ts +73 -0
  164. package/src/gui/EFPlay.browsertest.ts +202 -0
  165. package/src/gui/EFPlay.ts +73 -0
  166. package/src/gui/EFPreview.ts +20 -5
  167. package/src/gui/EFResizableBox.browsertest.ts +79 -0
  168. package/src/gui/EFResizableBox.ts +898 -0
  169. package/src/gui/EFScrubber.ts +7 -5
  170. package/src/gui/EFTimeDisplay.browsertest.ts +19 -19
  171. package/src/gui/EFTimeDisplay.ts +3 -1
  172. package/src/gui/EFToggleLoop.ts +6 -5
  173. package/src/gui/EFTogglePlay.ts +30 -23
  174. package/src/gui/PlaybackController.ts +522 -0
  175. package/src/gui/TWMixin.css +3 -0
  176. package/src/gui/TargetOrContextMixin.ts +185 -0
  177. package/src/gui/efContext.ts +2 -2
  178. package/src/otel/BridgeSpanExporter.ts +150 -0
  179. package/src/otel/setupBrowserTracing.ts +73 -0
  180. package/src/otel/tracingHelpers.ts +251 -0
  181. package/test/cache-integration-verification.browsertest.ts +1 -1
  182. package/types.json +1 -1
  183. package/dist/elements/ContextProxiesController.js +0 -69
@@ -1,6 +1,3 @@
1
- /**
2
- * A simple LRU (Least Recently Used) cache implementation
3
- */
4
1
  var LRUCache = class {
5
2
  constructor(maxSize) {
6
3
  this.cache = /* @__PURE__ */ new Map();
@@ -35,10 +32,6 @@ var LRUCache = class {
35
32
  return this.cache.size;
36
33
  }
37
34
  };
38
- /**
39
- * Size-aware LRU cache that tracks memory usage in bytes
40
- * Evicts entries when total size exceeds the maximum
41
- */
42
35
  var SizeAwareLRUCache = class {
43
36
  constructor(maxSizeBytes) {
44
37
  this.cache = /* @__PURE__ */ new Map();
@@ -112,17 +105,11 @@ var SizeAwareLRUCache = class {
112
105
  return this.maxSizeBytes;
113
106
  }
114
107
  };
115
- /**
116
- * Red-Black Tree node colors
117
- */
118
108
  var Color = /* @__PURE__ */ function(Color$1) {
119
109
  Color$1["RED"] = "RED";
120
110
  Color$1["BLACK"] = "BLACK";
121
111
  return Color$1;
122
112
  }(Color || {});
123
- /**
124
- * Red-Black Tree node for ordered key storage
125
- */
126
113
  var RBTreeNode = class {
127
114
  constructor(key, color = Color.RED, left = null, right = null, parent = null) {
128
115
  this.key = key;
@@ -132,10 +119,6 @@ var RBTreeNode = class {
132
119
  this.parent = parent;
133
120
  }
134
121
  };
135
- /**
136
- * Red-Black Tree implementation for O(log n) operations
137
- * Supports insert, delete, search, range queries, and nearest neighbor
138
- */
139
122
  var RedBlackTree = class {
140
123
  constructor(compareFn) {
141
124
  this.root = null;
@@ -198,16 +181,12 @@ var RedBlackTree = class {
198
181
  let current = this.root;
199
182
  while (current) {
200
183
  parent = current;
201
- const cmp = this.compareFn(node.key, current.key);
202
- current = cmp < 0 ? current.left : current.right;
184
+ current = this.compareFn(node.key, current.key) < 0 ? current.left : current.right;
203
185
  }
204
186
  node.parent = parent;
205
187
  if (!parent) this.root = node;
206
- else {
207
- const cmp = this.compareFn(node.key, parent.key);
208
- if (cmp < 0) parent.left = node;
209
- else parent.right = node;
210
- }
188
+ else if (this.compareFn(node.key, parent.key) < 0) parent.left = node;
189
+ else parent.right = node;
211
190
  }
212
191
  fixInsert(node) {
213
192
  while (node.parent && node.parent.color === Color.RED) if (node.parent === node.parent.parent?.left) {
@@ -392,10 +371,6 @@ var RedBlackTree = class {
392
371
  if (endCmp < 0) this.inorderRange(node.right, start, end, result);
393
372
  }
394
373
  };
395
- /**
396
- * LRU cache with binary search capabilities using Red-Black tree
397
- * All operations are O(log n) for ordered queries and O(1) for LRU operations
398
- */
399
374
  var OrderedLRUCache = class {
400
375
  constructor(maxSize, compareFn) {
401
376
  this.cache = /* @__PURE__ */ new Map();
@@ -403,9 +378,6 @@ var OrderedLRUCache = class {
403
378
  this.compareFn = compareFn || ((a, b) => a < b ? -1 : a > b ? 1 : 0);
404
379
  this.tree = new RedBlackTree(this.compareFn);
405
380
  }
406
- /**
407
- * Get value by exact key (O(1))
408
- */
409
381
  get(key) {
410
382
  const value = this.cache.get(key);
411
383
  if (value) {
@@ -414,12 +386,8 @@ var OrderedLRUCache = class {
414
386
  }
415
387
  return value;
416
388
  }
417
- /**
418
- * Set key-value pair (O(log n) for tree operations, O(1) for cache)
419
- */
420
389
  set(key, value) {
421
- const isUpdate = this.cache.has(key);
422
- if (isUpdate) this.cache.delete(key);
390
+ if (this.cache.has(key)) this.cache.delete(key);
423
391
  else {
424
392
  if (this.cache.size >= this.maxSize) {
425
393
  const firstKey = this.cache.keys().next().value;
@@ -432,18 +400,9 @@ var OrderedLRUCache = class {
432
400
  }
433
401
  this.cache.set(key, value);
434
402
  }
435
- /**
436
- * Find exact key using tree search (O(log n))
437
- */
438
403
  findExact(key) {
439
- const foundKey = this.tree.find(key);
440
- if (foundKey !== null) return this.get(key);
441
- return void 0;
442
- }
443
- /**
444
- * Find keys within distance of center point (O(log n + k) where k is result count)
445
- * Returns empty array if no keys found in range
446
- */
404
+ if (this.tree.find(key) !== null) return this.get(key);
405
+ }
447
406
  findNearestInRange(center, distance) {
448
407
  const nearestKeys = this.tree.findNearestInRange(center, distance);
449
408
  const result = [];
@@ -456,9 +415,6 @@ var OrderedLRUCache = class {
456
415
  }
457
416
  return result;
458
417
  }
459
- /**
460
- * Find all key-value pairs in range [start, end] (O(log n + k) where k is result count)
461
- */
462
418
  findRange(start, end) {
463
419
  const keys = this.tree.findRange(start, end);
464
420
  const result = [];
@@ -471,9 +427,6 @@ var OrderedLRUCache = class {
471
427
  }
472
428
  return result;
473
429
  }
474
- /**
475
- * Get all keys in sorted order (O(n))
476
- */
477
430
  getSortedKeys() {
478
431
  return this.tree.getAllSorted();
479
432
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@editframe/elements",
3
- "version": "0.20.4-beta.0",
3
+ "version": "0.23.6-beta.0",
4
4
  "description": "",
5
5
  "exports": {
6
6
  ".": {
@@ -27,12 +27,20 @@
27
27
  "license": "UNLICENSED",
28
28
  "dependencies": {
29
29
  "@bramus/style-observer": "^1.3.0",
30
- "@editframe/assets": "0.20.4-beta.0",
31
- "@lit/context": "^1.1.2",
32
- "@lit/task": "^1.0.1",
30
+ "@editframe/assets": "0.23.6-beta.0",
31
+ "@lit/context": "^1.1.6",
32
+ "@lit/task": "^1.0.3",
33
+ "@opentelemetry/api": "^1.9.0",
34
+ "@opentelemetry/context-zone": "^1.26.0",
35
+ "@opentelemetry/core": "^1.26.0",
36
+ "@opentelemetry/exporter-trace-otlp-http": "^0.53.0",
37
+ "@opentelemetry/resources": "^1.26.0",
38
+ "@opentelemetry/sdk-trace-base": "^1.26.0",
39
+ "@opentelemetry/sdk-trace-web": "^1.26.0",
40
+ "@opentelemetry/semantic-conventions": "^1.37.0",
33
41
  "d3": "^7.9.0",
34
42
  "debug": "^4.3.5",
35
- "lit": "^3.1.4",
43
+ "lit": "^3.3.1",
36
44
  "mediabunny": "^1.1.1",
37
45
  "zod": "^3.24.1"
38
46
  },
@@ -23,7 +23,7 @@ export type ContextProxyConfig = {
23
23
  * // @ts-expect-error controller is intentionally not referenced directly
24
24
  * #contextProxyController = new ContextProxyController(this, {
25
25
  * target: () => this.targetElement,
26
- * contexts: [playingContext, loopContext, targetTimegroupContext]
26
+ * contexts: [playingContext, loopContext, targetTemporalContext]
27
27
  * });
28
28
  * }
29
29
  * ```
@@ -31,16 +31,13 @@ export type ContextProxyConfig = {
31
31
  export class ContextProxyController implements ReactiveController {
32
32
  private host: LitElement;
33
33
  private proxyMap = new Map<Context<any, any>, () => HTMLElement | null>();
34
- private boundHandler: EventListener;
35
34
  private pendingRequests: ContextEvent<any>[] = [];
36
35
 
37
36
  constructor(host: LitElement, config: ContextProxyConfig) {
37
+ console.log("targetGetter? constructor");
38
38
  this.host = host;
39
39
  this.host.addController(this);
40
40
 
41
- // Create the bound handler once
42
- this.boundHandler = this.handleContextRequest.bind(this);
43
-
44
41
  // Build the proxy map
45
42
  for (const context of config.contexts) {
46
43
  this.proxyMap.set(context, config.target);
@@ -48,11 +45,11 @@ export class ContextProxyController implements ReactiveController {
48
45
  }
49
46
 
50
47
  hostConnected(): void {
51
- this.host.addEventListener("context-request", this.boundHandler);
48
+ console.log("targetGetter? hostConnected");
52
49
  }
53
50
 
54
51
  hostDisconnected(): void {
55
- this.host.removeEventListener("context-request", this.boundHandler);
52
+ this.host.removeEventListener("context-request", this.handleContextRequest);
56
53
  }
57
54
 
58
55
  hostUpdate(): void {
@@ -72,10 +69,11 @@ export class ContextProxyController implements ReactiveController {
72
69
  }
73
70
  }
74
71
 
75
- private handleContextRequest(event: Event): void {
72
+ private handleContextRequest = (event: Event): void => {
76
73
  const contextEvent = event as ContextEvent<any>;
77
74
 
78
75
  // Check if we should proxy this context
76
+ console.log("targetGetter?", contextEvent.context);
79
77
  const targetGetter = this.proxyMap.get(contextEvent.context);
80
78
 
81
79
  if (targetGetter) {
@@ -89,15 +87,17 @@ export class ContextProxyController implements ReactiveController {
89
87
  this.pendingRequests.push(contextEvent);
90
88
  }
91
89
  }
92
- }
90
+ };
93
91
 
94
92
  private processContextRequest(contextEvent: ContextEvent<any>): boolean {
95
93
  const targetGetter = this.proxyMap.get(contextEvent.context);
94
+ console.log("targetGetter?", targetGetter);
96
95
  if (!targetGetter) return false;
97
96
 
98
97
  // Get the target element using the getter function
99
98
  const targetElement = targetGetter();
100
99
 
100
+ console.log("targetElement?", targetElement);
101
101
  if (!targetElement) {
102
102
  return false;
103
103
  }
@@ -110,7 +110,7 @@ export class ContextProxyController implements ReactiveController {
110
110
  try {
111
111
  const newEvent = new ContextEvent(
112
112
  contextEvent.context,
113
- // @ts-ignore (this fails a typecheck but works)
113
+ // @ts-expect-error (this fails a typecheck but works)
114
114
  contextEvent.callback,
115
115
  contextEvent.subscribe,
116
116
  );
@@ -13,6 +13,7 @@ export class EFAudio extends TWMixin(EFMedia) {
13
13
  // TODO: Remove this as soon as we have an audio-specific property that needs @property
14
14
  @property({ type: Boolean, attribute: "dummy-property" })
15
15
  // @ts-expect-error - This is a hack to activate Lit's property processing system
16
+ // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Used to activate Lit's property processing
16
17
  private _propertyHack = false;
17
18
 
18
19
  audioElementRef = createRef<HTMLAudioElement>();