@editframe/elements 0.16.8-beta.0 → 0.18.3-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 (267) hide show
  1. package/README.md +30 -0
  2. package/dist/DecoderResetFrequency.test.d.ts +1 -0
  3. package/dist/DecoderResetRecovery.test.d.ts +1 -0
  4. package/dist/DelayedLoadingState.d.ts +48 -0
  5. package/dist/DelayedLoadingState.integration.test.d.ts +1 -0
  6. package/dist/DelayedLoadingState.js +113 -0
  7. package/dist/DelayedLoadingState.test.d.ts +1 -0
  8. package/dist/EF_FRAMEGEN.d.ts +10 -1
  9. package/dist/EF_FRAMEGEN.js +199 -179
  10. package/dist/EF_INTERACTIVE.js +2 -6
  11. package/dist/EF_RENDERING.js +1 -3
  12. package/dist/LoadingDebounce.test.d.ts +1 -0
  13. package/dist/LoadingIndicator.browsertest.d.ts +0 -0
  14. package/dist/ManualScrubTest.test.d.ts +1 -0
  15. package/dist/ScrubResolvedFlashing.test.d.ts +1 -0
  16. package/dist/ScrubTrackManager.d.ts +96 -0
  17. package/dist/ScrubTrackManager.test.d.ts +1 -0
  18. package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
  19. package/dist/VideoStuckDiagnostic.test.d.ts +1 -0
  20. package/dist/elements/CrossUpdateController.js +13 -15
  21. package/dist/elements/EFAudio.browsertest.d.ts +0 -0
  22. package/dist/elements/EFAudio.d.ts +22 -3
  23. package/dist/elements/EFAudio.js +60 -43
  24. package/dist/elements/EFCaptions.js +337 -373
  25. package/dist/elements/EFImage.d.ts +1 -0
  26. package/dist/elements/EFImage.js +73 -91
  27. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
  28. package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
  29. package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +1 -0
  30. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +47 -0
  31. package/dist/elements/EFMedia/AssetMediaEngine.js +116 -0
  32. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
  33. package/dist/elements/EFMedia/BaseMediaEngine.js +96 -0
  34. package/dist/elements/EFMedia/BaseMediaEngine.test.d.ts +1 -0
  35. package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +1 -0
  36. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
  37. package/dist/elements/EFMedia/BufferedSeekingInput.js +159 -0
  38. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  39. package/dist/elements/EFMedia/JitMediaEngine.d.ts +31 -0
  40. package/dist/elements/EFMedia/JitMediaEngine.js +62 -0
  41. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +9 -0
  42. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +16 -0
  43. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +48 -0
  44. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +3 -0
  45. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +138 -0
  46. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +9 -0
  47. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +4 -0
  48. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +16 -0
  49. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +9 -0
  50. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +3 -0
  51. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +22 -0
  52. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
  53. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +24 -0
  54. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
  55. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +18 -0
  56. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
  57. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +16 -0
  58. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
  59. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +104 -0
  60. package/dist/elements/EFMedia/services/AudioElementFactory.browsertest.d.ts +1 -0
  61. package/dist/elements/EFMedia/services/AudioElementFactory.d.ts +22 -0
  62. package/dist/elements/EFMedia/services/AudioElementFactory.js +72 -0
  63. package/dist/elements/EFMedia/services/MediaSourceService.browsertest.d.ts +1 -0
  64. package/dist/elements/EFMedia/services/MediaSourceService.d.ts +47 -0
  65. package/dist/elements/EFMedia/services/MediaSourceService.js +73 -0
  66. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +7 -0
  67. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +54 -0
  68. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +70 -0
  69. package/dist/elements/EFMedia/shared/BufferUtils.js +89 -0
  70. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +23 -0
  71. package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +1 -0
  72. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
  73. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +1 -0
  74. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
  75. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
  76. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts +1 -0
  77. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.d.ts +9 -0
  78. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +16 -0
  79. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +46 -0
  80. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.d.ts +9 -0
  81. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.d.ts +4 -0
  82. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js +16 -0
  83. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.d.ts +9 -0
  84. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.d.ts +3 -0
  85. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.js +27 -0
  86. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.d.ts +7 -0
  87. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +25 -0
  88. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.d.ts +9 -0
  89. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.d.ts +4 -0
  90. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +18 -0
  91. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.d.ts +9 -0
  92. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.d.ts +4 -0
  93. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +16 -0
  94. package/dist/elements/EFMedia.browsertest.d.ts +1 -0
  95. package/dist/elements/EFMedia.d.ts +95 -66
  96. package/dist/elements/EFMedia.js +204 -683
  97. package/dist/elements/EFSourceMixin.js +31 -48
  98. package/dist/elements/EFTemporal.d.ts +2 -1
  99. package/dist/elements/EFTemporal.js +266 -360
  100. package/dist/elements/EFTimegroup.d.ts +14 -1
  101. package/dist/elements/EFTimegroup.js +337 -323
  102. package/dist/elements/EFVideo.browsertest.d.ts +0 -0
  103. package/dist/elements/EFVideo.d.ts +123 -4
  104. package/dist/elements/EFVideo.js +308 -111
  105. package/dist/elements/EFWaveform.js +375 -411
  106. package/dist/elements/FetchMixin.js +14 -24
  107. package/dist/elements/MediaController.d.ts +30 -0
  108. package/dist/elements/SampleBuffer.d.ts +14 -0
  109. package/dist/elements/SampleBuffer.js +52 -0
  110. package/dist/elements/TargetController.js +130 -156
  111. package/dist/elements/TimegroupController.js +17 -19
  112. package/dist/elements/durationConverter.js +15 -4
  113. package/dist/elements/parseTimeToMs.js +4 -10
  114. package/dist/elements/printTaskStatus.d.ts +2 -0
  115. package/dist/elements/updateAnimations.js +39 -59
  116. package/dist/getRenderInfo.d.ts +2 -2
  117. package/dist/getRenderInfo.js +59 -67
  118. package/dist/gui/ContextMixin.js +150 -288
  119. package/dist/gui/EFConfiguration.js +27 -43
  120. package/dist/gui/EFFilmstrip.d.ts +3 -3
  121. package/dist/gui/EFFilmstrip.js +440 -620
  122. package/dist/gui/EFFitScale.d.ts +2 -2
  123. package/dist/gui/EFFitScale.js +112 -135
  124. package/dist/gui/EFFocusOverlay.js +45 -61
  125. package/dist/gui/EFPreview.js +30 -49
  126. package/dist/gui/EFScrubber.js +78 -99
  127. package/dist/gui/EFTimeDisplay.js +49 -70
  128. package/dist/gui/EFToggleLoop.js +17 -34
  129. package/dist/gui/EFTogglePlay.js +37 -58
  130. package/dist/gui/EFWorkbench.js +66 -88
  131. package/dist/gui/TWMixin.js +2 -48
  132. package/dist/gui/TWMixin2.js +31 -0
  133. package/dist/gui/efContext.js +2 -6
  134. package/dist/gui/fetchContext.js +1 -3
  135. package/dist/gui/focusContext.js +1 -3
  136. package/dist/gui/focusedElementContext.js +2 -6
  137. package/dist/gui/playingContext.js +1 -4
  138. package/dist/gui/services/ElementConnectionManager.browsertest.d.ts +1 -0
  139. package/dist/gui/services/ElementConnectionManager.d.ts +59 -0
  140. package/dist/gui/services/ElementConnectionManager.js +128 -0
  141. package/dist/gui/services/PlaybackController.browsertest.d.ts +1 -0
  142. package/dist/gui/services/PlaybackController.d.ts +103 -0
  143. package/dist/gui/services/PlaybackController.js +290 -0
  144. package/dist/index.js +5 -30
  145. package/dist/msToTimeCode.js +11 -13
  146. package/dist/services/MediaSourceManager.d.ts +62 -0
  147. package/dist/services/MediaSourceManager.js +211 -0
  148. package/dist/style.css +2 -1
  149. package/dist/transcoding/cache/CacheManager.d.ts +73 -0
  150. package/dist/transcoding/cache/RequestDeduplicator.d.ts +29 -0
  151. package/dist/transcoding/cache/RequestDeduplicator.js +53 -0
  152. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +1 -0
  153. package/dist/transcoding/types/index.d.ts +242 -0
  154. package/dist/transcoding/utils/MediaUtils.d.ts +9 -0
  155. package/dist/transcoding/utils/UrlGenerator.d.ts +26 -0
  156. package/dist/transcoding/utils/UrlGenerator.js +45 -0
  157. package/dist/transcoding/utils/constants.d.ts +27 -0
  158. package/dist/utils/LRUCache.d.ts +34 -0
  159. package/dist/utils/LRUCache.js +115 -0
  160. package/package.json +4 -3
  161. package/src/elements/EFAudio.browsertest.ts +709 -0
  162. package/src/elements/EFAudio.ts +59 -15
  163. package/src/elements/EFCaptions.browsertest.ts +0 -1
  164. package/src/elements/EFImage.browsertest.ts +42 -1
  165. package/src/elements/EFImage.ts +23 -3
  166. package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +222 -0
  167. package/src/elements/EFMedia/AssetIdMediaEngine.ts +70 -0
  168. package/src/elements/EFMedia/AssetMediaEngine.ts +210 -0
  169. package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
  170. package/src/elements/EFMedia/BaseMediaEngine.ts +170 -0
  171. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +400 -0
  172. package/src/elements/EFMedia/BufferedSeekingInput.ts +267 -0
  173. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
  174. package/src/elements/EFMedia/JitMediaEngine.ts +110 -0
  175. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +554 -0
  176. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +81 -0
  177. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +241 -0
  178. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +59 -0
  179. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +23 -0
  180. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +55 -0
  181. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +35 -0
  182. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +42 -0
  183. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +34 -0
  184. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +23 -0
  185. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +174 -0
  186. package/src/elements/EFMedia/services/AudioElementFactory.browsertest.ts +325 -0
  187. package/src/elements/EFMedia/services/AudioElementFactory.ts +119 -0
  188. package/src/elements/EFMedia/services/MediaSourceService.browsertest.ts +257 -0
  189. package/src/elements/EFMedia/services/MediaSourceService.ts +102 -0
  190. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +128 -0
  191. package/src/elements/EFMedia/shared/BufferUtils.ts +310 -0
  192. package/src/elements/EFMedia/shared/MediaTaskUtils.ts +44 -0
  193. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +247 -0
  194. package/src/elements/EFMedia/shared/RenditionHelpers.ts +79 -0
  195. package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +128 -0
  196. package/src/elements/EFMedia/tasks/makeMediaEngineTask.test.ts +233 -0
  197. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +89 -0
  198. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.ts +555 -0
  199. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +79 -0
  200. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.ts +59 -0
  201. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.ts +23 -0
  202. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.ts +55 -0
  203. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.ts +45 -0
  204. package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +44 -0
  205. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
  206. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +32 -0
  207. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
  208. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +23 -0
  209. package/src/elements/EFMedia.browsertest.ts +696 -271
  210. package/src/elements/EFMedia.ts +218 -776
  211. package/src/elements/EFTemporal.browsertest.ts +0 -1
  212. package/src/elements/EFTemporal.ts +13 -3
  213. package/src/elements/EFTimegroup.browsertest.ts +6 -3
  214. package/src/elements/EFTimegroup.ts +221 -27
  215. package/src/elements/EFVideo.browsertest.ts +758 -0
  216. package/src/elements/EFVideo.ts +418 -68
  217. package/src/elements/EFWaveform.ts +5 -5
  218. package/src/elements/MediaController.ts +98 -0
  219. package/src/elements/SampleBuffer.ts +97 -0
  220. package/src/elements/printTaskStatus.ts +16 -0
  221. package/src/elements/updateAnimations.ts +6 -0
  222. package/src/gui/ContextMixin.ts +23 -104
  223. package/src/gui/TWMixin.ts +10 -3
  224. package/src/gui/services/ElementConnectionManager.browsertest.ts +263 -0
  225. package/src/gui/services/ElementConnectionManager.ts +224 -0
  226. package/src/gui/services/PlaybackController.browsertest.ts +437 -0
  227. package/src/gui/services/PlaybackController.ts +521 -0
  228. package/src/services/MediaSourceManager.ts +333 -0
  229. package/src/transcoding/cache/CacheManager.ts +208 -0
  230. package/src/transcoding/cache/RequestDeduplicator.test.ts +170 -0
  231. package/src/transcoding/cache/RequestDeduplicator.ts +65 -0
  232. package/src/transcoding/types/index.ts +265 -0
  233. package/src/transcoding/utils/MediaUtils.ts +63 -0
  234. package/src/transcoding/utils/UrlGenerator.ts +68 -0
  235. package/src/transcoding/utils/constants.ts +36 -0
  236. package/src/utils/LRUCache.ts +153 -0
  237. package/test/EFVideo.framegen.browsertest.ts +127 -0
  238. package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/data.bin +0 -0
  239. package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/metadata.json +21 -0
  240. package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/data.bin +0 -0
  241. package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/metadata.json +21 -0
  242. package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/data.bin +0 -0
  243. package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/metadata.json +21 -0
  244. package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/data.bin +0 -0
  245. package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/metadata.json +21 -0
  246. package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/data.bin +0 -0
  247. package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/metadata.json +21 -0
  248. package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/data.bin +0 -0
  249. package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/metadata.json +21 -0
  250. 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
  251. package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/metadata.json +21 -0
  252. 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
  253. package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/metadata.json +21 -0
  254. 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
  255. package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/metadata.json +21 -0
  256. 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
  257. package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/metadata.json +21 -0
  258. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -0
  259. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +19 -0
  260. package/test/createJitTestClips.ts +425 -0
  261. package/test/recordReplayProxyPlugin.js +302 -0
  262. package/test/useAssetMSW.ts +49 -0
  263. package/test/useMSW.ts +44 -0
  264. package/types.json +1 -1
  265. package/dist/gui/TWMixin.css.js +0 -4
  266. /package/dist/elements/{TargetController.test.d.ts → TargetController.browsertest.d.ts} +0 -0
  267. /package/src/elements/{TargetController.test.ts → TargetController.browsertest.ts} +0 -0
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Test utility to load pre-generated JIT transcoded clips for browser testing
3
+ * Uses the latest JIT transcoding APIs for realistic testing scenarios
4
+ */
5
+
6
+ export interface JitTestClip {
7
+ url: string;
8
+ startTimeMs: number;
9
+ durationMs: number;
10
+ quality: "low" | "medium" | "high";
11
+ data: Uint8Array;
12
+ actualStartTimeMs: number;
13
+ actualDurationMs: number;
14
+ type: "video" | "audio";
15
+ }
16
+
17
+ export interface CreateJitTestClipsOptions {
18
+ sourceVideoUrl: string;
19
+ segments: Array<{
20
+ startTimeMs: number;
21
+ durationMs: number;
22
+ quality: "low" | "medium" | "high";
23
+ type?: "video" | "audio";
24
+ }>;
25
+ }
26
+
27
+ export interface JitTestMetadata {
28
+ url: string;
29
+ durationMs: number;
30
+ segmentDuration: number;
31
+ streams: Array<{
32
+ index: number;
33
+ type: "video" | "audio";
34
+ codecName: string;
35
+ duration: number;
36
+ durationMs: number;
37
+ width?: number;
38
+ height?: number;
39
+ frameRate?: { num: number; den: number };
40
+ channels?: number;
41
+ sampleRate?: number;
42
+ bitrate?: number;
43
+ }>;
44
+ presets: string[];
45
+ supportedFormats: string[];
46
+ extractedAt: string;
47
+ }
48
+
49
+ /**
50
+ * Create realistic MP4 video segment with proper structure
51
+ * Uses knowledge from JIT transcoding to create valid segments
52
+ */
53
+ function createRealisticVideoSegment(
54
+ durationMs: number,
55
+ quality: "low" | "medium" | "high",
56
+ ): Uint8Array {
57
+ // Quality settings based on JIT transcoding presets
58
+ const qualitySettings: Record<
59
+ "low" | "medium" | "high",
60
+ { bitrate: number; resolution: [number, number] }
61
+ > = {
62
+ low: { bitrate: 500000, resolution: [640, 360] },
63
+ medium: { bitrate: 1500000, resolution: [1280, 720] },
64
+ high: { bitrate: 4000000, resolution: [1920, 1080] },
65
+ };
66
+
67
+ const settings = qualitySettings[quality];
68
+
69
+ // Create proper MP4 structure with realistic timing
70
+ const ftypBox = createFtypBox();
71
+ const moovBox = createMoovBox(durationMs);
72
+ const mdatBox = createMdatBox(durationMs, settings.bitrate);
73
+
74
+ const totalSize = ftypBox.length + moovBox.length + mdatBox.length;
75
+ const result = new Uint8Array(totalSize);
76
+
77
+ let offset = 0;
78
+ result.set(ftypBox, offset);
79
+ offset += ftypBox.length;
80
+ result.set(moovBox, offset);
81
+ offset += moovBox.length;
82
+ result.set(mdatBox, offset);
83
+
84
+ return result;
85
+ }
86
+
87
+ /**
88
+ * Create realistic MP4 audio segment for audio-only testing
89
+ */
90
+ function createRealisticAudioSegment(
91
+ durationMs: number,
92
+ quality: "low" | "medium" | "high",
93
+ ): Uint8Array {
94
+ const qualitySettings: Record<
95
+ "low" | "medium" | "high",
96
+ { bitrate: number; sampleRate: number }
97
+ > = {
98
+ low: { bitrate: 64000, sampleRate: 22050 },
99
+ medium: { bitrate: 128000, sampleRate: 44100 },
100
+ high: { bitrate: 256000, sampleRate: 48000 },
101
+ };
102
+
103
+ const settings = qualitySettings[quality];
104
+
105
+ // Create MP4 audio-only structure
106
+ const ftypBox = createFtypBox("M4A ");
107
+ const moovBox = createAudioMoovBox(settings.sampleRate, durationMs);
108
+ const mdatBox = createAudioMdatBox(durationMs, settings.bitrate);
109
+
110
+ const totalSize = ftypBox.length + moovBox.length + mdatBox.length;
111
+ const result = new Uint8Array(totalSize);
112
+
113
+ let offset = 0;
114
+ result.set(ftypBox, offset);
115
+ offset += ftypBox.length;
116
+ result.set(moovBox, offset);
117
+ offset += moovBox.length;
118
+ result.set(mdatBox, offset);
119
+
120
+ return result;
121
+ }
122
+
123
+ function createFtypBox(majorBrand = "isom"): Uint8Array {
124
+ // Ensure brand is exactly 4 bytes
125
+ const brand = majorBrand.slice(0, 4).padEnd(4, " ");
126
+ const brandBytes = new TextEncoder().encode(brand);
127
+ const box = new Uint8Array(32);
128
+ const view = new DataView(box.buffer);
129
+
130
+ view.setUint32(0, 32); // box size
131
+ box.set(new TextEncoder().encode("ftyp"), 4);
132
+ box.set(brandBytes, 8);
133
+ view.setUint32(12, 0x00000200); // minor version
134
+ box.set(new TextEncoder().encode("isom"), 16);
135
+ box.set(new TextEncoder().encode("iso2"), 20);
136
+ box.set(new TextEncoder().encode("avc1"), 24);
137
+ box.set(new TextEncoder().encode("mp41"), 28);
138
+
139
+ return box;
140
+ }
141
+
142
+ function createMoovBox(durationMs: number): Uint8Array {
143
+ // Simplified moov box with proper timing information
144
+ const timescale = 30000; // 30fps * 1000
145
+ const duration = Math.floor((durationMs * timescale) / 1000);
146
+
147
+ const box = new Uint8Array(200); // Simplified moov box
148
+ const view = new DataView(box.buffer);
149
+
150
+ view.setUint32(0, 200); // box size
151
+ box.set(new TextEncoder().encode("moov"), 4);
152
+
153
+ // Add mvhd box with timing
154
+ view.setUint32(8, 108); // mvhd size
155
+ box.set(new TextEncoder().encode("mvhd"), 12);
156
+ view.setUint32(16, 0); // version + flags
157
+ view.setUint32(20, Math.floor(Date.now() / 1000)); // creation time
158
+ view.setUint32(24, Math.floor(Date.now() / 1000)); // modification time
159
+ view.setUint32(28, timescale); // timescale
160
+ view.setUint32(32, duration); // duration
161
+ view.setUint32(36, 0x00010000); // rate (1.0)
162
+
163
+ return box;
164
+ }
165
+
166
+ function createAudioMoovBox(
167
+ sampleRate: number,
168
+ durationMs: number,
169
+ ): Uint8Array {
170
+ const timescale = sampleRate;
171
+ const duration = Math.floor((durationMs * timescale) / 1000);
172
+
173
+ const box = new Uint8Array(180);
174
+ const view = new DataView(box.buffer);
175
+
176
+ view.setUint32(0, 180); // box size
177
+ box.set(new TextEncoder().encode("moov"), 4);
178
+
179
+ // Add mvhd box for audio
180
+ view.setUint32(8, 108);
181
+ box.set(new TextEncoder().encode("mvhd"), 12);
182
+ view.setUint32(16, 0);
183
+ view.setUint32(20, Math.floor(Date.now() / 1000));
184
+ view.setUint32(24, Math.floor(Date.now() / 1000));
185
+ view.setUint32(28, timescale);
186
+ view.setUint32(32, duration);
187
+
188
+ return box;
189
+ }
190
+
191
+ function createMdatBox(durationMs: number, bitrate: number): Uint8Array {
192
+ // Calculate realistic data size based on bitrate and duration
193
+ const dataSize = Math.floor((bitrate * durationMs) / (8 * 1000)); // bytes
194
+ const totalSize = dataSize + 8;
195
+
196
+ const box = new Uint8Array(totalSize);
197
+ const view = new DataView(box.buffer);
198
+
199
+ view.setUint32(0, totalSize);
200
+ box.set(new TextEncoder().encode("mdat"), 4);
201
+
202
+ // Fill with pseudo-realistic video data patterns
203
+ for (let i = 8; i < totalSize; i++) {
204
+ // Create pattern that resembles video data
205
+ const pattern = (i * 7 + Math.floor(i / 16) * 13) % 256;
206
+ box[i] = pattern;
207
+ }
208
+
209
+ return box;
210
+ }
211
+
212
+ function createAudioMdatBox(durationMs: number, bitrate: number): Uint8Array {
213
+ const dataSize = Math.floor((bitrate * durationMs) / (8 * 1000));
214
+ const totalSize = dataSize + 8;
215
+
216
+ const box = new Uint8Array(totalSize);
217
+ const view = new DataView(box.buffer);
218
+
219
+ view.setUint32(0, totalSize);
220
+ box.set(new TextEncoder().encode("mdat"), 4);
221
+
222
+ // Fill with audio-like data patterns
223
+ for (let i = 8; i < totalSize; i++) {
224
+ // Create pattern that resembles audio data (more regular patterns)
225
+ const wave = Math.sin((i * 2 * Math.PI) / 1024) * 127 + 128;
226
+ box[i] = Math.floor(wave);
227
+ }
228
+
229
+ return box;
230
+ }
231
+
232
+ /**
233
+ * Create JIT test clips using realistic MP4 data structures
234
+ */
235
+ export async function createJitTestClips(
236
+ options: CreateJitTestClipsOptions,
237
+ ): Promise<JitTestClip[]> {
238
+ const clips: JitTestClip[] = [];
239
+
240
+ for (const segment of options.segments) {
241
+ try {
242
+ const segmentType = segment.type || "video";
243
+
244
+ const data =
245
+ segmentType === "audio"
246
+ ? createRealisticAudioSegment(segment.durationMs, segment.quality)
247
+ : createRealisticVideoSegment(segment.durationMs, segment.quality);
248
+
249
+ clips.push({
250
+ url: options.sourceVideoUrl,
251
+ startTimeMs: segment.startTimeMs,
252
+ durationMs: segment.durationMs,
253
+ quality: segment.quality,
254
+ type: segmentType,
255
+ data,
256
+ actualStartTimeMs: segment.startTimeMs,
257
+ actualDurationMs: segment.durationMs,
258
+ });
259
+
260
+ console.log(
261
+ `✅ Created realistic ${segmentType} ${segment.quality} clip: ${data.length} bytes`,
262
+ );
263
+ } catch (error) {
264
+ console.error(`Failed to create ${segment.quality} test clip:`, error);
265
+ }
266
+ }
267
+
268
+ return clips;
269
+ }
270
+
271
+ /**
272
+ * Create test clips specifically for MediaElementSource caching tests
273
+ */
274
+ export async function createMediaElementSourceTestClips(
275
+ sourceVideoUrl: string,
276
+ ): Promise<JitTestClip[]> {
277
+ return createJitTestClips({
278
+ sourceVideoUrl,
279
+ segments: [
280
+ // Multiple segments that will trigger repeated MediaElementSource creation
281
+ { startTimeMs: 0, durationMs: 2000, quality: "medium" },
282
+ { startTimeMs: 2000, durationMs: 2000, quality: "medium" },
283
+ { startTimeMs: 4000, durationMs: 2000, quality: "medium" },
284
+ { startTimeMs: 6000, durationMs: 2000, quality: "medium" },
285
+ { startTimeMs: 8000, durationMs: 2000, quality: "medium" },
286
+
287
+ // Audio-only segments for testing audio-specific caching
288
+ { startTimeMs: 0, durationMs: 2000, quality: "medium", type: "audio" },
289
+ { startTimeMs: 2000, durationMs: 2000, quality: "medium", type: "audio" },
290
+ { startTimeMs: 4000, durationMs: 2000, quality: "medium", type: "audio" },
291
+ ],
292
+ });
293
+ }
294
+
295
+ /**
296
+ * Create realistic JIT metadata that matches transcoding service output
297
+ */
298
+ export function createRealisticJitMetadata(
299
+ sourceUrl: string,
300
+ durationMs = 10000,
301
+ hasAudio = true,
302
+ hasVideo = true,
303
+ ): JitTestMetadata {
304
+ const streams: JitTestMetadata["streams"] = [];
305
+
306
+ if (hasVideo) {
307
+ streams.push({
308
+ index: 0,
309
+ type: "video",
310
+ codecName: "h264",
311
+ duration: durationMs / 1000,
312
+ durationMs,
313
+ width: 1920,
314
+ height: 1080,
315
+ frameRate: { num: 30, den: 1 },
316
+ bitrate: 4000000,
317
+ });
318
+ }
319
+
320
+ if (hasAudio) {
321
+ streams.push({
322
+ index: hasVideo ? 1 : 0,
323
+ type: "audio",
324
+ codecName: "aac",
325
+ duration: durationMs / 1000,
326
+ durationMs,
327
+ channels: 2,
328
+ sampleRate: 48000,
329
+ bitrate: 128000,
330
+ });
331
+ }
332
+
333
+ return {
334
+ url: sourceUrl,
335
+ durationMs,
336
+ segmentDuration: 2000, // 2s segments for video, will be 15s for audio in AudioTranscodingClient
337
+ streams,
338
+ presets: ["low", "medium", "high"],
339
+ supportedFormats: ["mp4"],
340
+ extractedAt: new Date().toISOString(),
341
+ };
342
+ }
343
+
344
+ /**
345
+ * Mock JIT transcoding service that serves realistic test data
346
+ */
347
+ export class MockJitTranscodingService {
348
+ private clips: Map<string, JitTestClip> = new Map();
349
+ private metadata: Map<string, JitTestMetadata> = new Map();
350
+
351
+ constructor(clips: JitTestClip[]) {
352
+ for (const clip of clips) {
353
+ const key = `${clip.url}:${clip.startTimeMs}:${clip.quality}:${clip.type}`;
354
+ this.clips.set(key, clip);
355
+ }
356
+ }
357
+
358
+ setMetadata(url: string, metadata: JitTestMetadata) {
359
+ this.metadata.set(url, metadata);
360
+ }
361
+
362
+ getMetadata(url: string): JitTestMetadata {
363
+ const metadata = this.metadata.get(url);
364
+ if (!metadata) {
365
+ // Create default metadata
366
+ return createRealisticJitMetadata(url);
367
+ }
368
+ return metadata;
369
+ }
370
+
371
+ getSegment(
372
+ url: string,
373
+ startTimeMs: number,
374
+ quality: "low" | "medium" | "high",
375
+ type: "video" | "audio" = "video",
376
+ ): Uint8Array {
377
+ // Align to segment boundaries like real service
378
+ const segmentDuration = type === "audio" ? 15000 : 2000;
379
+ const alignedStart =
380
+ Math.floor(startTimeMs / segmentDuration) * segmentDuration;
381
+
382
+ const key = `${url}:${alignedStart}:${quality}:${type}`;
383
+ const clip = this.clips.get(key);
384
+
385
+ if (!clip) {
386
+ throw new Error(`No test clip found for ${key}`);
387
+ }
388
+
389
+ return clip.data;
390
+ }
391
+
392
+ // Create init segment for MediaSource streaming
393
+ getInitSegment(type: "video" | "audio" = "video"): Uint8Array {
394
+ if (type === "audio") {
395
+ return createRealisticAudioSegment(0, "medium").slice(0, 200);
396
+ }
397
+ return createRealisticVideoSegment(0, "medium").slice(0, 300);
398
+ }
399
+ }
400
+
401
+ /**
402
+ * Cache for test clips to avoid regenerating them multiple times
403
+ */
404
+ const testClipCache = new Map<string, JitTestClip[]>();
405
+
406
+ /**
407
+ * Get or create cached test clips for MediaElementSource testing
408
+ */
409
+ export async function getCachedMediaElementSourceTestClips(
410
+ sourceVideoUrl: string,
411
+ ): Promise<JitTestClip[]> {
412
+ const cacheKey = `media-element-source:${sourceVideoUrl}`;
413
+ let clips = testClipCache.get(cacheKey);
414
+
415
+ if (!clips) {
416
+ console.log(
417
+ `Creating MediaElementSource test clips for ${sourceVideoUrl}...`,
418
+ );
419
+ clips = await createMediaElementSourceTestClips(sourceVideoUrl);
420
+ testClipCache.set(cacheKey, clips);
421
+ console.log(`Created ${clips.length} MediaElementSource test clips`);
422
+ }
423
+
424
+ return clips;
425
+ }