@meframe/core 0.0.1

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 (352) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +22 -0
  3. package/README.md +396 -0
  4. package/dist/Meframe.d.ts +82 -0
  5. package/dist/Meframe.d.ts.map +1 -0
  6. package/dist/Meframe.js +290 -0
  7. package/dist/Meframe.js.map +1 -0
  8. package/dist/_virtual/mp4box.all.js +5 -0
  9. package/dist/_virtual/mp4box.all.js.map +1 -0
  10. package/dist/cache/BatchWriter.d.ts +25 -0
  11. package/dist/cache/BatchWriter.d.ts.map +1 -0
  12. package/dist/cache/CacheManager.d.ts +115 -0
  13. package/dist/cache/CacheManager.d.ts.map +1 -0
  14. package/dist/cache/CacheManager.js +388 -0
  15. package/dist/cache/CacheManager.js.map +1 -0
  16. package/dist/cache/CacheStatsDecorator.d.ts +27 -0
  17. package/dist/cache/CacheStatsDecorator.d.ts.map +1 -0
  18. package/dist/cache/L2Cache.d.ts +39 -0
  19. package/dist/cache/L2Cache.d.ts.map +1 -0
  20. package/dist/cache/L2Cache.js +282 -0
  21. package/dist/cache/L2Cache.js.map +1 -0
  22. package/dist/cache/index.d.ts +7 -0
  23. package/dist/cache/index.d.ts.map +1 -0
  24. package/dist/cache/l1/AudioL1Cache.d.ts +30 -0
  25. package/dist/cache/l1/AudioL1Cache.d.ts.map +1 -0
  26. package/dist/cache/l1/AudioL1Cache.js +306 -0
  27. package/dist/cache/l1/AudioL1Cache.js.map +1 -0
  28. package/dist/cache/l1/MixedAudioL1Cache.d.ts +13 -0
  29. package/dist/cache/l1/MixedAudioL1Cache.d.ts.map +1 -0
  30. package/dist/cache/l1/MixedAudioL1Cache.js +52 -0
  31. package/dist/cache/l1/MixedAudioL1Cache.js.map +1 -0
  32. package/dist/cache/l1/VideoL1Cache.d.ts +69 -0
  33. package/dist/cache/l1/VideoL1Cache.d.ts.map +1 -0
  34. package/dist/cache/l1/VideoL1Cache.js +318 -0
  35. package/dist/cache/l1/VideoL1Cache.js.map +1 -0
  36. package/dist/cache/l1/gop-utils.d.ts +10 -0
  37. package/dist/cache/l1/gop-utils.d.ts.map +1 -0
  38. package/dist/cache/l1/gop-utils.js +78 -0
  39. package/dist/cache/l1/gop-utils.js.map +1 -0
  40. package/dist/cache/l1/index.d.ts +4 -0
  41. package/dist/cache/l1/index.d.ts.map +1 -0
  42. package/dist/cache/l1/types.d.ts +17 -0
  43. package/dist/cache/l1/types.d.ts.map +1 -0
  44. package/dist/cache/types.d.ts +93 -0
  45. package/dist/cache/types.d.ts.map +1 -0
  46. package/dist/config/ConfigLoader.d.ts +69 -0
  47. package/dist/config/ConfigLoader.d.ts.map +1 -0
  48. package/dist/config/ConfigLoader.js +133 -0
  49. package/dist/config/ConfigLoader.js.map +1 -0
  50. package/dist/config/defaults.d.ts +125 -0
  51. package/dist/config/defaults.d.ts.map +1 -0
  52. package/dist/config/defaults.js +191 -0
  53. package/dist/config/defaults.js.map +1 -0
  54. package/dist/config/index.d.ts +6 -0
  55. package/dist/config/index.d.ts.map +1 -0
  56. package/dist/config/presets.d.ts +32 -0
  57. package/dist/config/presets.d.ts.map +1 -0
  58. package/dist/config/presets.js +11 -0
  59. package/dist/config/presets.js.map +1 -0
  60. package/dist/config/types.d.ts +199 -0
  61. package/dist/config/types.d.ts.map +1 -0
  62. package/dist/config/validation.d.ts +19 -0
  63. package/dist/config/validation.d.ts.map +1 -0
  64. package/dist/config/validation.js +232 -0
  65. package/dist/config/validation.js.map +1 -0
  66. package/dist/controllers/PlaybackController.d.ts +55 -0
  67. package/dist/controllers/PlaybackController.d.ts.map +1 -0
  68. package/dist/controllers/PlaybackController.js +369 -0
  69. package/dist/controllers/PlaybackController.js.map +1 -0
  70. package/dist/controllers/PreRenderService.d.ts +34 -0
  71. package/dist/controllers/PreRenderService.d.ts.map +1 -0
  72. package/dist/controllers/PreRenderService.js +83 -0
  73. package/dist/controllers/PreRenderService.js.map +1 -0
  74. package/dist/controllers/PreRenderTaskQueue.d.ts +21 -0
  75. package/dist/controllers/PreRenderTaskQueue.d.ts.map +1 -0
  76. package/dist/controllers/PreviewHandle.d.ts +23 -0
  77. package/dist/controllers/PreviewHandle.d.ts.map +1 -0
  78. package/dist/controllers/PreviewHandle.js +39 -0
  79. package/dist/controllers/PreviewHandle.js.map +1 -0
  80. package/dist/controllers/index.d.ts +8 -0
  81. package/dist/controllers/index.d.ts.map +1 -0
  82. package/dist/controllers/types.d.ts +102 -0
  83. package/dist/controllers/types.d.ts.map +1 -0
  84. package/dist/event/EventBus.d.ts +42 -0
  85. package/dist/event/EventBus.d.ts.map +1 -0
  86. package/dist/event/EventBus.js +94 -0
  87. package/dist/event/EventBus.js.map +1 -0
  88. package/dist/event/events.d.ts +371 -0
  89. package/dist/event/events.d.ts.map +1 -0
  90. package/dist/event/events.js +71 -0
  91. package/dist/event/events.js.map +1 -0
  92. package/dist/event/index.d.ts +4 -0
  93. package/dist/event/index.d.ts.map +1 -0
  94. package/dist/index.d.ts +14 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +15 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/model/CompositionModel.d.ts +48 -0
  99. package/dist/model/CompositionModel.d.ts.map +1 -0
  100. package/dist/model/CompositionModel.js +197 -0
  101. package/dist/model/CompositionModel.js.map +1 -0
  102. package/dist/model/RcFrame.d.ts +34 -0
  103. package/dist/model/RcFrame.d.ts.map +1 -0
  104. package/dist/model/RcFrame.js +97 -0
  105. package/dist/model/RcFrame.js.map +1 -0
  106. package/dist/model/dirty-range.d.ts +5 -0
  107. package/dist/model/dirty-range.d.ts.map +1 -0
  108. package/dist/model/dirty-range.js +220 -0
  109. package/dist/model/dirty-range.js.map +1 -0
  110. package/dist/model/index.d.ts +7 -0
  111. package/dist/model/index.d.ts.map +1 -0
  112. package/dist/model/patch.d.ts +5 -0
  113. package/dist/model/patch.d.ts.map +1 -0
  114. package/dist/model/patch.js +250 -0
  115. package/dist/model/patch.js.map +1 -0
  116. package/dist/model/types.d.ts +135 -0
  117. package/dist/model/types.d.ts.map +1 -0
  118. package/dist/model/types.js +5 -0
  119. package/dist/model/types.js.map +1 -0
  120. package/dist/model/validation.d.ts +15 -0
  121. package/dist/model/validation.d.ts.map +1 -0
  122. package/dist/model/validation.js +74 -0
  123. package/dist/model/validation.js.map +1 -0
  124. package/dist/node_modules/.pnpm/mp4box@0.5.4/node_modules/mp4box/dist/mp4box.all.js +7046 -0
  125. package/dist/node_modules/.pnpm/mp4box@0.5.4/node_modules/mp4box/dist/mp4box.all.js.map +1 -0
  126. package/dist/orchestrator/ClipSessionManager.d.ts +75 -0
  127. package/dist/orchestrator/ClipSessionManager.d.ts.map +1 -0
  128. package/dist/orchestrator/ClipSessionManager.js +160 -0
  129. package/dist/orchestrator/ClipSessionManager.js.map +1 -0
  130. package/dist/orchestrator/CompositionPlanner.d.ts +55 -0
  131. package/dist/orchestrator/CompositionPlanner.d.ts.map +1 -0
  132. package/dist/orchestrator/CompositionPlanner.js +411 -0
  133. package/dist/orchestrator/CompositionPlanner.js.map +1 -0
  134. package/dist/orchestrator/Orchestrator.d.ts +59 -0
  135. package/dist/orchestrator/Orchestrator.d.ts.map +1 -0
  136. package/dist/orchestrator/Orchestrator.js +390 -0
  137. package/dist/orchestrator/Orchestrator.js.map +1 -0
  138. package/dist/orchestrator/VideoClipSession.d.ts +64 -0
  139. package/dist/orchestrator/VideoClipSession.d.ts.map +1 -0
  140. package/dist/orchestrator/VideoClipSession.js +309 -0
  141. package/dist/orchestrator/VideoClipSession.js.map +1 -0
  142. package/dist/orchestrator/index.d.ts +5 -0
  143. package/dist/orchestrator/index.d.ts.map +1 -0
  144. package/dist/orchestrator/types.d.ts +64 -0
  145. package/dist/orchestrator/types.d.ts.map +1 -0
  146. package/dist/plugins/BackpressureMonitor.d.ts +33 -0
  147. package/dist/plugins/BackpressureMonitor.d.ts.map +1 -0
  148. package/dist/plugins/BackpressureMonitor.js +62 -0
  149. package/dist/plugins/BackpressureMonitor.js.map +1 -0
  150. package/dist/plugins/PluginManager.d.ts +37 -0
  151. package/dist/plugins/PluginManager.d.ts.map +1 -0
  152. package/dist/plugins/PluginManager.js +66 -0
  153. package/dist/plugins/PluginManager.js.map +1 -0
  154. package/dist/plugins/types.d.ts +60 -0
  155. package/dist/plugins/types.d.ts.map +1 -0
  156. package/dist/stages/compose/AudioDucker.d.ts +59 -0
  157. package/dist/stages/compose/AudioDucker.d.ts.map +1 -0
  158. package/dist/stages/compose/AudioDucker.js +161 -0
  159. package/dist/stages/compose/AudioDucker.js.map +1 -0
  160. package/dist/stages/compose/AudioMixer.d.ts +29 -0
  161. package/dist/stages/compose/AudioMixer.d.ts.map +1 -0
  162. package/dist/stages/compose/AudioMixer.js +373 -0
  163. package/dist/stages/compose/AudioMixer.js.map +1 -0
  164. package/dist/stages/compose/FilterProcessor.d.ts +41 -0
  165. package/dist/stages/compose/FilterProcessor.d.ts.map +1 -0
  166. package/dist/stages/compose/FilterProcessor.js +226 -0
  167. package/dist/stages/compose/FilterProcessor.js.map +1 -0
  168. package/dist/stages/compose/GlobalAudioSession.d.ts +38 -0
  169. package/dist/stages/compose/GlobalAudioSession.d.ts.map +1 -0
  170. package/dist/stages/compose/GlobalAudioSession.js +122 -0
  171. package/dist/stages/compose/GlobalAudioSession.js.map +1 -0
  172. package/dist/stages/compose/LayerRenderer.d.ts +30 -0
  173. package/dist/stages/compose/LayerRenderer.d.ts.map +1 -0
  174. package/dist/stages/compose/LayerRenderer.js +215 -0
  175. package/dist/stages/compose/LayerRenderer.js.map +1 -0
  176. package/dist/stages/compose/OfflineAudioMixer.d.ts +14 -0
  177. package/dist/stages/compose/OfflineAudioMixer.d.ts.map +1 -0
  178. package/dist/stages/compose/OfflineAudioMixer.js +68 -0
  179. package/dist/stages/compose/OfflineAudioMixer.js.map +1 -0
  180. package/dist/stages/compose/TransitionProcessor.d.ts +30 -0
  181. package/dist/stages/compose/TransitionProcessor.d.ts.map +1 -0
  182. package/dist/stages/compose/TransitionProcessor.js +189 -0
  183. package/dist/stages/compose/TransitionProcessor.js.map +1 -0
  184. package/dist/stages/compose/VideoComposer.d.ts +30 -0
  185. package/dist/stages/compose/VideoComposer.d.ts.map +1 -0
  186. package/dist/stages/compose/VideoComposer.js +186 -0
  187. package/dist/stages/compose/VideoComposer.js.map +1 -0
  188. package/dist/stages/compose/audio-compose.worker.d.ts +79 -0
  189. package/dist/stages/compose/audio-compose.worker.d.ts.map +1 -0
  190. package/dist/stages/compose/audio-compose.worker.js +541 -0
  191. package/dist/stages/compose/audio-compose.worker.js.map +1 -0
  192. package/dist/stages/compose/instructions.d.ts +95 -0
  193. package/dist/stages/compose/instructions.d.ts.map +1 -0
  194. package/dist/stages/compose/types.d.ts +245 -0
  195. package/dist/stages/compose/types.d.ts.map +1 -0
  196. package/dist/stages/compose/video-compose.worker.d.ts +60 -0
  197. package/dist/stages/compose/video-compose.worker.d.ts.map +1 -0
  198. package/dist/stages/compose/video-compose.worker.js +369 -0
  199. package/dist/stages/compose/video-compose.worker.js.map +1 -0
  200. package/dist/stages/decode/AudioChunkDecoder.d.ts +41 -0
  201. package/dist/stages/decode/AudioChunkDecoder.d.ts.map +1 -0
  202. package/dist/stages/decode/AudioChunkDecoder.js +83 -0
  203. package/dist/stages/decode/AudioChunkDecoder.js.map +1 -0
  204. package/dist/stages/decode/BaseDecoder.d.ts +35 -0
  205. package/dist/stages/decode/BaseDecoder.d.ts.map +1 -0
  206. package/dist/stages/decode/BaseDecoder.js +130 -0
  207. package/dist/stages/decode/BaseDecoder.js.map +1 -0
  208. package/dist/stages/decode/VideoChunkDecoder.d.ts +54 -0
  209. package/dist/stages/decode/VideoChunkDecoder.d.ts.map +1 -0
  210. package/dist/stages/decode/VideoChunkDecoder.js +209 -0
  211. package/dist/stages/decode/VideoChunkDecoder.js.map +1 -0
  212. package/dist/stages/decode/decode.worker.d.ts +70 -0
  213. package/dist/stages/decode/decode.worker.d.ts.map +1 -0
  214. package/dist/stages/decode/decode.worker.js +436 -0
  215. package/dist/stages/decode/decode.worker.js.map +1 -0
  216. package/dist/stages/decode/index.d.ts +5 -0
  217. package/dist/stages/decode/index.d.ts.map +1 -0
  218. package/dist/stages/decode/types.d.ts +108 -0
  219. package/dist/stages/decode/types.d.ts.map +1 -0
  220. package/dist/stages/demux/MP3FrameParser.d.ts +33 -0
  221. package/dist/stages/demux/MP3FrameParser.d.ts.map +1 -0
  222. package/dist/stages/demux/MP3FrameParser.js +186 -0
  223. package/dist/stages/demux/MP3FrameParser.js.map +1 -0
  224. package/dist/stages/demux/MP4Demuxer.d.ts +45 -0
  225. package/dist/stages/demux/MP4Demuxer.d.ts.map +1 -0
  226. package/dist/stages/demux/MP4Demuxer.js +227 -0
  227. package/dist/stages/demux/MP4Demuxer.js.map +1 -0
  228. package/dist/stages/demux/aac-esds-extractor.d.ts +7 -0
  229. package/dist/stages/demux/aac-esds-extractor.d.ts.map +1 -0
  230. package/dist/stages/demux/audio-demux.worker.d.ts +51 -0
  231. package/dist/stages/demux/audio-demux.worker.d.ts.map +1 -0
  232. package/dist/stages/demux/audio-demux.worker.js +312 -0
  233. package/dist/stages/demux/audio-demux.worker.js.map +1 -0
  234. package/dist/stages/demux/types.d.ts +77 -0
  235. package/dist/stages/demux/types.d.ts.map +1 -0
  236. package/dist/stages/demux/video-demux.worker.d.ts +48 -0
  237. package/dist/stages/demux/video-demux.worker.d.ts.map +1 -0
  238. package/dist/stages/demux/video-demux.worker.js +173 -0
  239. package/dist/stages/demux/video-demux.worker.js.map +1 -0
  240. package/dist/stages/encode/AudioChunkEncoder.d.ts +21 -0
  241. package/dist/stages/encode/AudioChunkEncoder.d.ts.map +1 -0
  242. package/dist/stages/encode/AudioChunkEncoder.js +37 -0
  243. package/dist/stages/encode/AudioChunkEncoder.js.map +1 -0
  244. package/dist/stages/encode/BaseEncoder.d.ts +44 -0
  245. package/dist/stages/encode/BaseEncoder.d.ts.map +1 -0
  246. package/dist/stages/encode/BaseEncoder.js +164 -0
  247. package/dist/stages/encode/BaseEncoder.js.map +1 -0
  248. package/dist/stages/encode/EncoderPool.d.ts +28 -0
  249. package/dist/stages/encode/EncoderPool.d.ts.map +1 -0
  250. package/dist/stages/encode/VideoChunkEncoder.d.ts +26 -0
  251. package/dist/stages/encode/VideoChunkEncoder.d.ts.map +1 -0
  252. package/dist/stages/encode/VideoChunkEncoder.js +50 -0
  253. package/dist/stages/encode/VideoChunkEncoder.js.map +1 -0
  254. package/dist/stages/encode/encode.worker.d.ts +3 -0
  255. package/dist/stages/encode/encode.worker.d.ts.map +1 -0
  256. package/dist/stages/encode/encode.worker.js +318 -0
  257. package/dist/stages/encode/encode.worker.js.map +1 -0
  258. package/dist/stages/encode/index.d.ts +6 -0
  259. package/dist/stages/encode/index.d.ts.map +1 -0
  260. package/dist/stages/encode/types.d.ts +127 -0
  261. package/dist/stages/encode/types.d.ts.map +1 -0
  262. package/dist/stages/load/EventHandlers.d.ts +35 -0
  263. package/dist/stages/load/EventHandlers.d.ts.map +1 -0
  264. package/dist/stages/load/EventHandlers.js +65 -0
  265. package/dist/stages/load/EventHandlers.js.map +1 -0
  266. package/dist/stages/load/ResourceLoader.d.ts +36 -0
  267. package/dist/stages/load/ResourceLoader.d.ts.map +1 -0
  268. package/dist/stages/load/ResourceLoader.js +184 -0
  269. package/dist/stages/load/ResourceLoader.js.map +1 -0
  270. package/dist/stages/load/StreamFactory.d.ts +42 -0
  271. package/dist/stages/load/StreamFactory.d.ts.map +1 -0
  272. package/dist/stages/load/StreamFactory.js +201 -0
  273. package/dist/stages/load/StreamFactory.js.map +1 -0
  274. package/dist/stages/load/TaskManager.d.ts +50 -0
  275. package/dist/stages/load/TaskManager.d.ts.map +1 -0
  276. package/dist/stages/load/TaskManager.js +103 -0
  277. package/dist/stages/load/TaskManager.js.map +1 -0
  278. package/dist/stages/load/WindowByteRangeResolver.d.ts +47 -0
  279. package/dist/stages/load/WindowByteRangeResolver.d.ts.map +1 -0
  280. package/dist/stages/load/WindowByteRangeResolver.js +270 -0
  281. package/dist/stages/load/WindowByteRangeResolver.js.map +1 -0
  282. package/dist/stages/load/index.d.ts +11 -0
  283. package/dist/stages/load/index.d.ts.map +1 -0
  284. package/dist/stages/load/types.d.ts +177 -0
  285. package/dist/stages/load/types.d.ts.map +1 -0
  286. package/dist/stages/mux/MP4Muxer.d.ts +44 -0
  287. package/dist/stages/mux/MP4Muxer.d.ts.map +1 -0
  288. package/dist/stages/mux/MP4Muxer.js +262 -0
  289. package/dist/stages/mux/MP4Muxer.js.map +1 -0
  290. package/dist/stages/mux/OPFSWriter.d.ts +46 -0
  291. package/dist/stages/mux/OPFSWriter.d.ts.map +1 -0
  292. package/dist/stages/mux/index.d.ts +5 -0
  293. package/dist/stages/mux/index.d.ts.map +1 -0
  294. package/dist/stages/mux/mux.worker.d.ts +65 -0
  295. package/dist/stages/mux/mux.worker.d.ts.map +1 -0
  296. package/dist/stages/mux/mux.worker.js +219 -0
  297. package/dist/stages/mux/mux.worker.js.map +1 -0
  298. package/dist/stages/mux/types.d.ts +95 -0
  299. package/dist/stages/mux/types.d.ts.map +1 -0
  300. package/dist/stages/mux/utils.d.ts +32 -0
  301. package/dist/stages/mux/utils.d.ts.map +1 -0
  302. package/dist/stages/mux/utils.js +34 -0
  303. package/dist/stages/mux/utils.js.map +1 -0
  304. package/dist/types.d.ts +25 -0
  305. package/dist/types.d.ts.map +1 -0
  306. package/dist/utils/BackpressureAdapter.d.ts +26 -0
  307. package/dist/utils/BackpressureAdapter.d.ts.map +1 -0
  308. package/dist/utils/binary-search.d.ts +33 -0
  309. package/dist/utils/binary-search.d.ts.map +1 -0
  310. package/dist/utils/binary-search.js +62 -0
  311. package/dist/utils/binary-search.js.map +1 -0
  312. package/dist/utils/canvas-utils.d.ts +96 -0
  313. package/dist/utils/canvas-utils.d.ts.map +1 -0
  314. package/dist/utils/canvas-utils.js +58 -0
  315. package/dist/utils/canvas-utils.js.map +1 -0
  316. package/dist/utils/object-utils.d.ts +34 -0
  317. package/dist/utils/object-utils.d.ts.map +1 -0
  318. package/dist/utils/object-utils.js +22 -0
  319. package/dist/utils/object-utils.js.map +1 -0
  320. package/dist/utils/time-utils.d.ts +10 -0
  321. package/dist/utils/time-utils.d.ts.map +1 -0
  322. package/dist/utils/time-utils.js +60 -0
  323. package/dist/utils/time-utils.js.map +1 -0
  324. package/dist/worker/BaseWorker.d.ts +44 -0
  325. package/dist/worker/BaseWorker.d.ts.map +1 -0
  326. package/dist/worker/BaseWorker.js +98 -0
  327. package/dist/worker/BaseWorker.js.map +1 -0
  328. package/dist/worker/WorkerChannel.d.ts +105 -0
  329. package/dist/worker/WorkerChannel.d.ts.map +1 -0
  330. package/dist/worker/WorkerChannel.js +355 -0
  331. package/dist/worker/WorkerChannel.js.map +1 -0
  332. package/dist/worker/WorkerPool.d.ts +52 -0
  333. package/dist/worker/WorkerPool.d.ts.map +1 -0
  334. package/dist/worker/WorkerPool.js +124 -0
  335. package/dist/worker/WorkerPool.js.map +1 -0
  336. package/dist/worker/index.d.ts +11 -0
  337. package/dist/worker/index.d.ts.map +1 -0
  338. package/dist/worker/transferable-helper.d.ts +89 -0
  339. package/dist/worker/transferable-helper.d.ts.map +1 -0
  340. package/dist/worker/transferable-helper.js +44 -0
  341. package/dist/worker/transferable-helper.js.map +1 -0
  342. package/dist/worker/types.d.ts +179 -0
  343. package/dist/worker/types.d.ts.map +1 -0
  344. package/dist/worker/types.js +50 -0
  345. package/dist/worker/types.js.map +1 -0
  346. package/dist/worker/worker-event-whitelist.d.ts +23 -0
  347. package/dist/worker/worker-event-whitelist.d.ts.map +1 -0
  348. package/dist/worker/worker-retry.d.ts +36 -0
  349. package/dist/worker/worker-retry.d.ts.map +1 -0
  350. package/dist/worker/worker-retry.js +55 -0
  351. package/dist/worker/worker-retry.js.map +1 -0
  352. package/package.json +105 -0
@@ -0,0 +1,95 @@
1
+ export interface MuxConfig {
2
+ container: 'mp4';
3
+ output?: {
4
+ target: 'blob' | 'opfs' | 'stream';
5
+ filePath?: string;
6
+ stream?: WritableStream<Uint8Array>;
7
+ };
8
+ video?: {
9
+ codec: string;
10
+ width: number;
11
+ height: number;
12
+ frameRate?: number;
13
+ bitrate?: number;
14
+ description?: Uint8Array;
15
+ };
16
+ audio?: {
17
+ codec: string;
18
+ sampleRate: number;
19
+ channelCount: number;
20
+ bitrate?: number;
21
+ description?: Uint8Array;
22
+ };
23
+ mp4?: {
24
+ fragmentDuration?: number;
25
+ fragmented?: boolean;
26
+ fastStart?: boolean;
27
+ brands?: string[];
28
+ };
29
+ metadata?: {
30
+ title?: string;
31
+ artist?: string;
32
+ album?: string;
33
+ date?: string;
34
+ comment?: string;
35
+ custom?: Record<string, string>;
36
+ };
37
+ performance?: {
38
+ bufferSize?: number;
39
+ flushInterval?: number;
40
+ maxMemory?: number;
41
+ };
42
+ }
43
+ export interface MuxSample {
44
+ trackId: number;
45
+ data: Uint8Array;
46
+ timestamp: number;
47
+ dts?: number;
48
+ duration: number;
49
+ isKeyFrame: boolean;
50
+ flags?: {
51
+ isLeading?: number;
52
+ dependsOn?: number;
53
+ isDependedOn?: number;
54
+ hasRedundancy?: number;
55
+ degradationPriority?: number;
56
+ };
57
+ }
58
+ export interface MuxTrack {
59
+ id: number;
60
+ type: 'video' | 'audio';
61
+ codec: string;
62
+ timescale: number;
63
+ duration?: number;
64
+ width?: number;
65
+ height?: number;
66
+ frameRate?: number;
67
+ sampleRate?: number;
68
+ channelCount?: number;
69
+ codecConfig?: Uint8Array;
70
+ }
71
+ export interface MuxerEvents {
72
+ onReady?: () => void;
73
+ onProgress?: (written: number) => void;
74
+ onError?: (error: Error) => void;
75
+ onComplete?: (output: Blob | FileSystemFileHandle | void) => void;
76
+ }
77
+ export interface BaseMuxer {
78
+ configure(config: MuxConfig): Promise<void>;
79
+ addTrack(track: MuxTrack): number;
80
+ writeSample(sample: MuxSample): void;
81
+ flush(): Promise<void>;
82
+ finalize(): Promise<Blob | FileSystemFileHandle | void>;
83
+ reset(): void;
84
+ destroy(): void;
85
+ }
86
+ export interface MuxerOptions {
87
+ config: MuxConfig;
88
+ events?: MuxerEvents;
89
+ }
90
+ export interface EncodedChunkData {
91
+ type: 'video' | 'audio';
92
+ chunk: EncodedVideoChunk | EncodedAudioChunk;
93
+ trackId: number;
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/stages/mux/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { EncodedChunkData, MuxSample } from './types';
2
+
3
+ /**
4
+ * Convert WebCodecs EncodedChunk to MuxSample
5
+ */
6
+ export declare function encodedChunkToMuxSample(data: EncodedChunkData): MuxSample;
7
+ /**
8
+ * Convert microseconds to timescale units
9
+ */
10
+ export declare function usToTimescale(microseconds: number, timescale: number): number;
11
+ /**
12
+ * Convert timescale units to microseconds
13
+ */
14
+ export declare function timescaleToUs(units: number, timescale: number): number;
15
+ /**
16
+ * Calculate optimal timescale for given frame rate
17
+ */
18
+ export declare function calculateTimescale(frameRate?: number): number;
19
+ /**
20
+ * Parse codec string to extract codec parameters
21
+ * e.g., 'avc1.42E01E' -> { codec: 'avc1', profile: '42', level: '1E' }
22
+ */
23
+ export declare function parseCodecString(codec: string): {
24
+ codec: string;
25
+ profile?: string;
26
+ level?: string;
27
+ };
28
+ /**
29
+ * Create MP4 file brands based on codec
30
+ */
31
+ export declare function createBrands(codecs: string[]): string[];
32
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/stages/mux/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAczE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAa7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAiBA;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAkBvD"}
@@ -0,0 +1,34 @@
1
+ function usToTimescale(microseconds, timescale) {
2
+ return Math.round(microseconds * timescale / 1e6);
3
+ }
4
+ function calculateTimescale(frameRate) {
5
+ if (!frameRate) return 9e4;
6
+ const commonRates = {
7
+ 24: 24e3,
8
+ 25: 25e3,
9
+ 30: 3e4,
10
+ 50: 5e4,
11
+ 60: 6e4
12
+ };
13
+ return commonRates[Math.round(frameRate)] || 9e4;
14
+ }
15
+ function parseCodecString(codec) {
16
+ const parts = codec.split(".");
17
+ const result = { codec: parts[0] };
18
+ if (parts[0] === "avc1" || parts[0] === "hev1" || parts[0] === "hvc1") {
19
+ if (parts[1]) {
20
+ result.profile = parts[1].substring(0, 2);
21
+ result.level = parts[1].substring(4, 6);
22
+ }
23
+ } else if (parts[0] === "mp4a") {
24
+ if (parts[1]) result.objectType = parts[1];
25
+ if (parts[2]) result.audioObjectType = parts[2];
26
+ }
27
+ return result;
28
+ }
29
+ export {
30
+ calculateTimescale,
31
+ parseCodecString,
32
+ usToTimescale
33
+ };
34
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../src/stages/mux/utils.ts"],"sourcesContent":["import type { EncodedChunkData, MuxSample } from './types';\n\n/**\n * Convert WebCodecs EncodedChunk to MuxSample\n */\nexport function encodedChunkToMuxSample(data: EncodedChunkData): MuxSample {\n const { chunk, trackId, type } = data;\n\n // Create buffer for chunk data\n const buffer = new Uint8Array(chunk.byteLength);\n chunk.copyTo(buffer);\n\n return {\n trackId,\n data: buffer,\n timestamp: chunk.timestamp,\n duration: chunk.duration || 0,\n isKeyFrame: type === 'video' ? (chunk as EncodedVideoChunk).type === 'key' : true, // Audio samples are always \"key frames\"\n };\n}\n\n/**\n * Convert microseconds to timescale units\n */\nexport function usToTimescale(microseconds: number, timescale: number): number {\n return Math.round((microseconds * timescale) / 1_000_000);\n}\n\n/**\n * Convert timescale units to microseconds\n */\nexport function timescaleToUs(units: number, timescale: number): number {\n return Math.round((units * 1_000_000) / timescale);\n}\n\n/**\n * Calculate optimal timescale for given frame rate\n */\nexport function calculateTimescale(frameRate?: number): number {\n if (!frameRate) return 90000; // Default for video\n\n // Common frame rates and their optimal timescales\n const commonRates: Record<number, number> = {\n 24: 24000,\n 25: 25000,\n 30: 30000,\n 50: 50000,\n 60: 60000,\n };\n\n return commonRates[Math.round(frameRate)] || 90000;\n}\n\n/**\n * Parse codec string to extract codec parameters\n * e.g., 'avc1.42E01E' -> { codec: 'avc1', profile: '42', level: '1E' }\n */\nexport function parseCodecString(codec: string): {\n codec: string;\n profile?: string;\n level?: string;\n} {\n const parts = codec.split('.');\n const result: any = { codec: parts[0] };\n\n if (parts[0] === 'avc1' || parts[0] === 'hev1' || parts[0] === 'hvc1') {\n // H.264/H.265 codec string format\n if (parts[1]) {\n result.profile = parts[1].substring(0, 2);\n result.level = parts[1].substring(4, 6);\n }\n } else if (parts[0] === 'mp4a') {\n // AAC codec string format\n if (parts[1]) result.objectType = parts[1];\n if (parts[2]) result.audioObjectType = parts[2];\n }\n\n return result;\n}\n\n/**\n * Create MP4 file brands based on codec\n */\nexport function createBrands(codecs: string[]): string[] {\n const brands = new Set<string>(['isom', 'iso2']);\n\n for (const codec of codecs) {\n if (codec.startsWith('avc1')) {\n brands.add('avc1');\n brands.add('mp41');\n } else if (codec.startsWith('hev1') || codec.startsWith('hvc1')) {\n brands.add('hev1');\n brands.add('hvc1');\n } else if (codec.startsWith('av01')) {\n brands.add('av01');\n } else if (codec.startsWith('mp4a')) {\n brands.add('mp41');\n }\n }\n\n return Array.from(brands);\n}\n"],"names":[],"mappings":"AAwBO,SAAS,cAAc,cAAsB,WAA2B;AAC7E,SAAO,KAAK,MAAO,eAAe,YAAa,GAAS;AAC1D;AAYO,SAAS,mBAAmB,WAA4B;AAC7D,MAAI,CAAC,UAAW,QAAO;AAGvB,QAAM,cAAsC;AAAA,IAC1C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAGN,SAAO,YAAY,KAAK,MAAM,SAAS,CAAC,KAAK;AAC/C;AAMO,SAAS,iBAAiB,OAI/B;AACA,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAM,SAAc,EAAE,OAAO,MAAM,CAAC,EAAA;AAEpC,MAAI,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,QAAQ;AAErE,QAAI,MAAM,CAAC,GAAG;AACZ,aAAO,UAAU,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC;AACxC,aAAO,QAAQ,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC;AAAA,IACxC;AAAA,EACF,WAAW,MAAM,CAAC,MAAM,QAAQ;AAE9B,QAAI,MAAM,CAAC,EAAG,QAAO,aAAa,MAAM,CAAC;AACzC,QAAI,MAAM,CAAC,EAAG,QAAO,kBAAkB,MAAM,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Core type definitions
3
+ */
4
+ export type { MeframeConfig, ResolvedConfig } from './config/types';
5
+ export type MeframeState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused' | 'exporting' | 'error' | 'destroyed';
6
+ export interface ExportOptions {
7
+ /** Output format */
8
+ format: 'mp4' | 'webm';
9
+ /** Video codec */
10
+ videoCodec?: 'h264' | 'h265' | 'vp9' | 'av1';
11
+ /** Audio codec */
12
+ audioCodec?: 'aac' | 'opus';
13
+ /** Video bitrate in bps */
14
+ videoBitrate?: number;
15
+ /** Audio bitrate in bps */
16
+ audioBitrate?: number;
17
+ /** Output resolution */
18
+ width?: number;
19
+ height?: number;
20
+ /** Frame rate */
21
+ fps?: number;
22
+ /** Quality preset */
23
+ quality?: 'low' | 'medium' | 'high' | 'highest';
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,QAAQ,GACR,WAAW,GACX,OAAO,GACP,WAAW,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAEvB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAE7C,kBAAkB;IAClB,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAE5B,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iBAAiB;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,qBAAqB;IACrB,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;CACjD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Backpressure adapter for bridging Stream API with non-stream components
3
+ * Handles MessageChannel and GPU boundaries
4
+ */
5
+ export declare class BackpressureAdapter {
6
+ /**
7
+ * Monitor MessageChannel capacity
8
+ */
9
+ createMessageChannelBridge<T>(port: MessagePort, options?: {
10
+ maxPendingMessages?: number;
11
+ highWaterMark?: number;
12
+ }): WritableStream<T>;
13
+ /**
14
+ * Create GPU upload throttle
15
+ */
16
+ createGPUThrottle(maxTextureMemory?: number): TransformStream<VideoFrame, VideoFrame>;
17
+ /**
18
+ * Memory-aware transform with automatic degradation
19
+ */
20
+ createMemoryAwareTransform<T>(options?: {
21
+ maxMemoryBytes?: number;
22
+ onMemoryPressure?: () => void;
23
+ estimateSize?: (item: T) => number;
24
+ }): TransformStream<T, T>;
25
+ }
26
+ //# sourceMappingURL=BackpressureAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackpressureAdapter.d.ts","sourceRoot":"","sources":["../../src/utils/BackpressureAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B;;OAEG;IACH,0BAA0B,CAAC,CAAC,EAC1B,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE;QACP,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB,GACL,cAAc,CAAC,CAAC,CAAC;IAyCpB;;OAEG;IACH,iBAAiB,CACf,gBAAgB,GAAE,MAA0B,GAC3C,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC;IAwB1C;;OAEG;IACH,0BAA0B,CAAC,CAAC,EAC1B,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;QAC9B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;KAC/B,GACL,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;CAgCzB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Binary search utilities for sorted arrays
3
+ */
4
+ /**
5
+ * Find the first index where the predicate returns true
6
+ * Assumes array is sorted such that predicate returns false for all elements before target
7
+ * and true for all elements at or after target
8
+ */
9
+ export declare function binarySearchFirst<T>(array: T[], predicate: (item: T) => boolean): number;
10
+ /**
11
+ * Find an item in a sorted array that contains a given value within its range
12
+ * @param array - Sorted array of items with ranges
13
+ * @param value - Value to search for
14
+ * @param getRange - Function to get start and end values from an item
15
+ * @returns The item containing the value, or null if not found
16
+ */
17
+ export declare function binarySearchRange<T>(array: T[], value: number, getRange: (item: T) => {
18
+ start: number;
19
+ end: number;
20
+ }): T | null;
21
+ /**
22
+ * Find all items in a sorted array that overlap with a given range
23
+ * @param array - Sorted array of items with ranges
24
+ * @param startValue - Start of the search range (inclusive)
25
+ * @param endValue - End of the search range (exclusive)
26
+ * @param getRange - Function to get start and end values from an item
27
+ * @returns Array of items that overlap with the search range
28
+ */
29
+ export declare function binarySearchOverlapping<T>(array: T[], startValue: number, endValue: number, getRange: (item: T) => {
30
+ start: number;
31
+ end: number;
32
+ }): T[];
33
+ //# sourceMappingURL=binary-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-search.d.ts","sourceRoot":"","sources":["../../src/utils/binary-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAiBxF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD,CAAC,GAAG,IAAI,CAoBV;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD,CAAC,EAAE,CA+BL"}
@@ -0,0 +1,62 @@
1
+ function binarySearchFirst(array, predicate) {
2
+ let left = 0;
3
+ let right = array.length - 1;
4
+ let firstIndex = array.length;
5
+ while (left <= right) {
6
+ const mid = Math.floor((left + right) / 2);
7
+ const midItem = array[mid];
8
+ if (midItem && predicate(midItem)) {
9
+ firstIndex = mid;
10
+ right = mid - 1;
11
+ } else {
12
+ left = mid + 1;
13
+ }
14
+ }
15
+ return firstIndex;
16
+ }
17
+ function binarySearchRange(array, value, getRange) {
18
+ let left = 0;
19
+ let right = array.length - 1;
20
+ while (left <= right) {
21
+ const mid = Math.floor((left + right) / 2);
22
+ const item = array[mid];
23
+ if (!item) return null;
24
+ const range = getRange(item);
25
+ if (value >= range.start && value < range.end) {
26
+ return item;
27
+ } else if (value < range.start) {
28
+ right = mid - 1;
29
+ } else {
30
+ left = mid + 1;
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ function binarySearchOverlapping(array, startValue, endValue, getRange) {
36
+ if (startValue >= endValue) {
37
+ return [];
38
+ }
39
+ const firstIndex = binarySearchFirst(array, (item) => {
40
+ const range = getRange(item);
41
+ return range.end > startValue;
42
+ });
43
+ const results = [];
44
+ for (let i = firstIndex; i < array.length; i++) {
45
+ const item = array[i];
46
+ if (!item) continue;
47
+ const range = getRange(item);
48
+ if (range.start >= endValue) {
49
+ break;
50
+ }
51
+ if (range.start < endValue && range.end > startValue) {
52
+ results.push(item);
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+ export {
58
+ binarySearchFirst,
59
+ binarySearchOverlapping,
60
+ binarySearchRange
61
+ };
62
+ //# sourceMappingURL=binary-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-search.js","sources":["../../src/utils/binary-search.ts"],"sourcesContent":["/**\n * Binary search utilities for sorted arrays\n */\n\n/**\n * Find the first index where the predicate returns true\n * Assumes array is sorted such that predicate returns false for all elements before target\n * and true for all elements at or after target\n */\nexport function binarySearchFirst<T>(array: T[], predicate: (item: T) => boolean): number {\n let left = 0;\n let right = array.length - 1;\n let firstIndex = array.length;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const midItem = array[mid];\n if (midItem && predicate(midItem)) {\n firstIndex = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return firstIndex;\n}\n\n/**\n * Find an item in a sorted array that contains a given value within its range\n * @param array - Sorted array of items with ranges\n * @param value - Value to search for\n * @param getRange - Function to get start and end values from an item\n * @returns The item containing the value, or null if not found\n */\nexport function binarySearchRange<T>(\n array: T[],\n value: number,\n getRange: (item: T) => { start: number; end: number }\n): T | null {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const item = array[mid];\n if (!item) return null;\n const range = getRange(item);\n\n if (value >= range.start && value < range.end) {\n return item;\n } else if (value < range.start) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return null;\n}\n\n/**\n * Find all items in a sorted array that overlap with a given range\n * @param array - Sorted array of items with ranges\n * @param startValue - Start of the search range (inclusive)\n * @param endValue - End of the search range (exclusive)\n * @param getRange - Function to get start and end values from an item\n * @returns Array of items that overlap with the search range\n */\nexport function binarySearchOverlapping<T>(\n array: T[],\n startValue: number,\n endValue: number,\n getRange: (item: T) => { start: number; end: number }\n): T[] {\n // Invalid range (start >= end) doesn't overlap with anything\n // This includes empty ranges where start === end\n if (startValue >= endValue) {\n return [];\n }\n\n // Find first item that might overlap (its end > startValue)\n const firstIndex = binarySearchFirst(array, (item) => {\n const range = getRange(item);\n return range.end > startValue;\n });\n\n const results: T[] = [];\n for (let i = firstIndex; i < array.length; i++) {\n const item = array[i];\n if (!item) continue;\n const range = getRange(item);\n\n // Stop if we've passed the search range\n if (range.start >= endValue) {\n break;\n }\n\n // Add if overlapping\n if (range.start < endValue && range.end > startValue) {\n results.push(item);\n }\n }\n\n return results;\n}\n"],"names":[],"mappings":"AASO,SAAS,kBAAqB,OAAY,WAAyC;AACxF,MAAI,OAAO;AACX,MAAI,QAAQ,MAAM,SAAS;AAC3B,MAAI,aAAa,MAAM;AAEvB,SAAO,QAAQ,OAAO;AACpB,UAAM,MAAM,KAAK,OAAO,OAAO,SAAS,CAAC;AACzC,UAAM,UAAU,MAAM,GAAG;AACzB,QAAI,WAAW,UAAU,OAAO,GAAG;AACjC,mBAAa;AACb,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,kBACd,OACA,OACA,UACU;AACV,MAAI,OAAO;AACX,MAAI,QAAQ,MAAM,SAAS;AAE3B,SAAO,QAAQ,OAAO;AACpB,UAAM,MAAM,KAAK,OAAO,OAAO,SAAS,CAAC;AACzC,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,SAAS,IAAI;AAE3B,QAAI,SAAS,MAAM,SAAS,QAAQ,MAAM,KAAK;AAC7C,aAAO;AAAA,IACT,WAAW,QAAQ,MAAM,OAAO;AAC9B,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAUO,SAAS,wBACd,OACA,YACA,UACA,UACK;AAGL,MAAI,cAAc,UAAU;AAC1B,WAAO,CAAA;AAAA,EACT;AAGA,QAAM,aAAa,kBAAkB,OAAO,CAAC,SAAS;AACpD,UAAM,QAAQ,SAAS,IAAI;AAC3B,WAAO,MAAM,MAAM;AAAA,EACrB,CAAC;AAED,QAAM,UAAe,CAAA;AACrB,WAAS,IAAI,YAAY,IAAI,MAAM,QAAQ,KAAK;AAC9C,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,SAAS,IAAI;AAG3B,QAAI,MAAM,SAAS,UAAU;AAC3B;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ,YAAY,MAAM,MAAM,YAAY;AACpD,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Canvas utility functions for handling DPI and high-quality rendering
3
+ */
4
+ /**
5
+ * Setup canvas with proper DPI handling for Retina/HiDPI displays
6
+ *
7
+ * @param canvas - HTMLCanvasElement to configure
8
+ * @param displayWidth - CSS display width in logical pixels
9
+ * @param displayHeight - CSS display height in logical pixels
10
+ * @returns Actual canvas dimensions (considering DPI)
11
+ *
12
+ * @example
13
+ * const canvas = document.createElement('canvas');
14
+ * const dims = setupCanvasDPI(canvas, 540, 960);
15
+ * console.log(dims); // { width: 1080, height: 1920 } on 2x DPI screen
16
+ */
17
+ export declare function setupCanvasDPI(canvas: HTMLCanvasElement, displayWidth: number, displayHeight: number): {
18
+ width: number;
19
+ height: number;
20
+ };
21
+ /**
22
+ * Get recommended composition canvas size based on display canvas
23
+ *
24
+ * @param displayCanvas - The preview canvas element
25
+ * @returns Recommended composition dimensions
26
+ *
27
+ * @example
28
+ * const canvas = document.getElementById('preview');
29
+ * const composeSize = getCompositionSize(canvas);
30
+ * // Use composeSize.width and composeSize.height for Meframe config
31
+ */
32
+ export declare function getCompositionSize(displayCanvas: HTMLCanvasElement): {
33
+ width: number;
34
+ height: number;
35
+ };
36
+ /**
37
+ * Create a high-DPI canvas with proper settings
38
+ *
39
+ * @param container - Optional container element to append canvas to
40
+ * @param options - Canvas configuration options
41
+ * @returns Configured canvas element and its dimensions
42
+ *
43
+ * @example
44
+ * const { canvas, dimensions } = createHiDPICanvas(document.body, {
45
+ * displayWidth: 540,
46
+ * displayHeight: 960,
47
+ * });
48
+ *
49
+ * const meframe = await Meframe.create({
50
+ * canvas,
51
+ * config: {
52
+ * compose: {
53
+ * canvas: {
54
+ * width: dimensions.width,
55
+ * height: dimensions.height,
56
+ * }
57
+ * }
58
+ * }
59
+ * });
60
+ */
61
+ export declare function createHiDPICanvas(container?: HTMLElement, options?: {
62
+ displayWidth: number;
63
+ displayHeight: number;
64
+ className?: string;
65
+ id?: string;
66
+ }): {
67
+ canvas: HTMLCanvasElement;
68
+ dimensions: {
69
+ width: number;
70
+ height: number;
71
+ };
72
+ };
73
+ /**
74
+ * Check if canvas DPI is properly configured
75
+ *
76
+ * @param canvas - Canvas element to check
77
+ * @returns Diagnostic information about canvas DPI setup
78
+ *
79
+ * @example
80
+ * const info = checkCanvasDPI(myCanvas);
81
+ * if (!info.isOptimal) {
82
+ * console.warn('Canvas DPI not optimal:', info.message);
83
+ * }
84
+ */
85
+ export declare function checkCanvasDPI(canvas: HTMLCanvasElement): {
86
+ dpr: number;
87
+ canvasWidth: number;
88
+ canvasHeight: number;
89
+ displayWidth: number;
90
+ displayHeight: number;
91
+ expectedWidth: number;
92
+ expectedHeight: number;
93
+ isOptimal: boolean;
94
+ message: string;
95
+ };
96
+ //# sourceMappingURL=canvas-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-utils.d.ts","sourceRoot":"","sources":["../../src/utils/canvas-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAenC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,GAAG;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAKA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,WAAW,EACvB,OAAO,GAAE;IACP,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CAC+B,GAC5C;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C,CAkBA;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CA6BA"}
@@ -0,0 +1,58 @@
1
+ function setupCanvasDPI(canvas, displayWidth, displayHeight) {
2
+ const dpr = window.devicePixelRatio || 1;
3
+ canvas.width = Math.round(displayWidth * dpr);
4
+ canvas.height = Math.round(displayHeight * dpr);
5
+ canvas.style.width = `${displayWidth}px`;
6
+ canvas.style.height = `${displayHeight}px`;
7
+ return {
8
+ width: canvas.width,
9
+ height: canvas.height
10
+ };
11
+ }
12
+ function createHiDPICanvas(container, options = { displayWidth: 540, displayHeight: 960 }) {
13
+ const canvas = document.createElement("canvas");
14
+ if (options.id) {
15
+ canvas.id = options.id;
16
+ }
17
+ if (options.className) {
18
+ canvas.className = options.className;
19
+ }
20
+ const dimensions = setupCanvasDPI(canvas, options.displayWidth, options.displayHeight);
21
+ if (container) {
22
+ container.appendChild(canvas);
23
+ }
24
+ return { canvas, dimensions };
25
+ }
26
+ function checkCanvasDPI(canvas) {
27
+ const dpr = window.devicePixelRatio || 1;
28
+ const displayWidth = canvas.clientWidth;
29
+ const displayHeight = canvas.clientHeight;
30
+ const expectedWidth = Math.round(displayWidth * dpr);
31
+ const expectedHeight = Math.round(displayHeight * dpr);
32
+ const widthMatch = Math.abs(canvas.width - expectedWidth) <= 1;
33
+ const heightMatch = Math.abs(canvas.height - expectedHeight) <= 1;
34
+ const isOptimal = widthMatch && heightMatch;
35
+ let message = "";
36
+ if (!isOptimal) {
37
+ message = `Canvas DPI mismatch! Expected ${expectedWidth}×${expectedHeight} but got ${canvas.width}×${canvas.height}. This will cause blurry rendering on ${dpr}x DPI screens.`;
38
+ } else {
39
+ message = `Canvas DPI is properly configured for ${dpr}x display.`;
40
+ }
41
+ return {
42
+ dpr,
43
+ canvasWidth: canvas.width,
44
+ canvasHeight: canvas.height,
45
+ displayWidth,
46
+ displayHeight,
47
+ expectedWidth,
48
+ expectedHeight,
49
+ isOptimal,
50
+ message
51
+ };
52
+ }
53
+ export {
54
+ checkCanvasDPI,
55
+ createHiDPICanvas,
56
+ setupCanvasDPI
57
+ };
58
+ //# sourceMappingURL=canvas-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-utils.js","sources":["../../src/utils/canvas-utils.ts"],"sourcesContent":["/**\n * Canvas utility functions for handling DPI and high-quality rendering\n */\n\n/**\n * Setup canvas with proper DPI handling for Retina/HiDPI displays\n *\n * @param canvas - HTMLCanvasElement to configure\n * @param displayWidth - CSS display width in logical pixels\n * @param displayHeight - CSS display height in logical pixels\n * @returns Actual canvas dimensions (considering DPI)\n *\n * @example\n * const canvas = document.createElement('canvas');\n * const dims = setupCanvasDPI(canvas, 540, 960);\n * console.log(dims); // { width: 1080, height: 1920 } on 2x DPI screen\n */\nexport function setupCanvasDPI(\n canvas: HTMLCanvasElement,\n displayWidth: number,\n displayHeight: number\n): { width: number; height: number } {\n const dpr = window.devicePixelRatio || 1;\n\n // Set actual canvas pixel dimensions (considering DPI)\n canvas.width = Math.round(displayWidth * dpr);\n canvas.height = Math.round(displayHeight * dpr);\n\n // Set CSS display dimensions\n canvas.style.width = `${displayWidth}px`;\n canvas.style.height = `${displayHeight}px`;\n\n return {\n width: canvas.width,\n height: canvas.height,\n };\n}\n\n/**\n * Get recommended composition canvas size based on display canvas\n *\n * @param displayCanvas - The preview canvas element\n * @returns Recommended composition dimensions\n *\n * @example\n * const canvas = document.getElementById('preview');\n * const composeSize = getCompositionSize(canvas);\n * // Use composeSize.width and composeSize.height for Meframe config\n */\nexport function getCompositionSize(displayCanvas: HTMLCanvasElement): {\n width: number;\n height: number;\n} {\n return {\n width: displayCanvas.width,\n height: displayCanvas.height,\n };\n}\n\n/**\n * Create a high-DPI canvas with proper settings\n *\n * @param container - Optional container element to append canvas to\n * @param options - Canvas configuration options\n * @returns Configured canvas element and its dimensions\n *\n * @example\n * const { canvas, dimensions } = createHiDPICanvas(document.body, {\n * displayWidth: 540,\n * displayHeight: 960,\n * });\n *\n * const meframe = await Meframe.create({\n * canvas,\n * config: {\n * compose: {\n * canvas: {\n * width: dimensions.width,\n * height: dimensions.height,\n * }\n * }\n * }\n * });\n */\nexport function createHiDPICanvas(\n container?: HTMLElement,\n options: {\n displayWidth: number;\n displayHeight: number;\n className?: string;\n id?: string;\n } = { displayWidth: 540, displayHeight: 960 }\n): {\n canvas: HTMLCanvasElement;\n dimensions: { width: number; height: number };\n} {\n const canvas = document.createElement('canvas');\n\n if (options.id) {\n canvas.id = options.id;\n }\n\n if (options.className) {\n canvas.className = options.className;\n }\n\n const dimensions = setupCanvasDPI(canvas, options.displayWidth, options.displayHeight);\n\n if (container) {\n container.appendChild(canvas);\n }\n\n return { canvas, dimensions };\n}\n\n/**\n * Check if canvas DPI is properly configured\n *\n * @param canvas - Canvas element to check\n * @returns Diagnostic information about canvas DPI setup\n *\n * @example\n * const info = checkCanvasDPI(myCanvas);\n * if (!info.isOptimal) {\n * console.warn('Canvas DPI not optimal:', info.message);\n * }\n */\nexport function checkCanvasDPI(canvas: HTMLCanvasElement): {\n dpr: number;\n canvasWidth: number;\n canvasHeight: number;\n displayWidth: number;\n displayHeight: number;\n expectedWidth: number;\n expectedHeight: number;\n isOptimal: boolean;\n message: string;\n} {\n const dpr = window.devicePixelRatio || 1;\n const displayWidth = canvas.clientWidth;\n const displayHeight = canvas.clientHeight;\n const expectedWidth = Math.round(displayWidth * dpr);\n const expectedHeight = Math.round(displayHeight * dpr);\n\n const widthMatch = Math.abs(canvas.width - expectedWidth) <= 1;\n const heightMatch = Math.abs(canvas.height - expectedHeight) <= 1;\n const isOptimal = widthMatch && heightMatch;\n\n let message = '';\n if (!isOptimal) {\n message = `Canvas DPI mismatch! Expected ${expectedWidth}×${expectedHeight} but got ${canvas.width}×${canvas.height}. This will cause blurry rendering on ${dpr}x DPI screens.`;\n } else {\n message = `Canvas DPI is properly configured for ${dpr}x display.`;\n }\n\n return {\n dpr,\n canvasWidth: canvas.width,\n canvasHeight: canvas.height,\n displayWidth,\n displayHeight,\n expectedWidth,\n expectedHeight,\n isOptimal,\n message,\n };\n}\n"],"names":[],"mappings":"AAiBO,SAAS,eACd,QACA,cACA,eACmC;AACnC,QAAM,MAAM,OAAO,oBAAoB;AAGvC,SAAO,QAAQ,KAAK,MAAM,eAAe,GAAG;AAC5C,SAAO,SAAS,KAAK,MAAM,gBAAgB,GAAG;AAG9C,SAAO,MAAM,QAAQ,GAAG,YAAY;AACpC,SAAO,MAAM,SAAS,GAAG,aAAa;AAEtC,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EAAA;AAEnB;AAgDO,SAAS,kBACd,WACA,UAKI,EAAE,cAAc,KAAK,eAAe,OAIxC;AACA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,MAAI,QAAQ,IAAI;AACd,WAAO,KAAK,QAAQ;AAAA,EACtB;AAEA,MAAI,QAAQ,WAAW;AACrB,WAAO,YAAY,QAAQ;AAAA,EAC7B;AAEA,QAAM,aAAa,eAAe,QAAQ,QAAQ,cAAc,QAAQ,aAAa;AAErF,MAAI,WAAW;AACb,cAAU,YAAY,MAAM;AAAA,EAC9B;AAEA,SAAO,EAAE,QAAQ,WAAA;AACnB;AAcO,SAAS,eAAe,QAU7B;AACA,QAAM,MAAM,OAAO,oBAAoB;AACvC,QAAM,eAAe,OAAO;AAC5B,QAAM,gBAAgB,OAAO;AAC7B,QAAM,gBAAgB,KAAK,MAAM,eAAe,GAAG;AACnD,QAAM,iBAAiB,KAAK,MAAM,gBAAgB,GAAG;AAErD,QAAM,aAAa,KAAK,IAAI,OAAO,QAAQ,aAAa,KAAK;AAC7D,QAAM,cAAc,KAAK,IAAI,OAAO,SAAS,cAAc,KAAK;AAChE,QAAM,YAAY,cAAc;AAEhC,MAAI,UAAU;AACd,MAAI,CAAC,WAAW;AACd,cAAU,iCAAiC,aAAa,IAAI,cAAc,YAAY,OAAO,KAAK,IAAI,OAAO,MAAM,yCAAyC,GAAG;AAAA,EACjK,OAAO;AACL,cAAU,yCAAyC,GAAG;AAAA,EACxD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,OAAO;AAAA,IACpB,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Deep merge two objects recursively
3
+ * Later values override earlier ones
4
+ * Supports merging objects with different but compatible types
5
+ */
6
+ export declare function deepMerge<T = any>(target: any, ...sources: any[]): T;
7
+ /**
8
+ * Type-safe deep merge for configuration objects
9
+ * Ensures the result conforms to the target type structure
10
+ */
11
+ export declare function deepMergeConfig<T extends Record<string, any>>(defaults: T, ...overrides: Array<Partial<Record<keyof T, any>>>): T;
12
+ /**
13
+ * Get a nested value from an object using a path
14
+ * @param obj The object to query
15
+ * @param path Path to the value (e.g., 'a.b.c' or ['a', 'b', 'c'])
16
+ * @param defaultValue Default value if path doesn't exist
17
+ */
18
+ export declare function get<T = any>(obj: any, path: string | string[], defaultValue?: T): T;
19
+ /**
20
+ * Set a nested value in an object using a path
21
+ * @param obj The object to modify
22
+ * @param path Path to the value (e.g., 'a.b.c' or ['a', 'b', 'c'])
23
+ * @param value The value to set
24
+ */
25
+ export declare function set<T extends Record<string, any>>(obj: T, path: string | string[], value: any): T;
26
+ /**
27
+ * Check if a value is a plain object
28
+ */
29
+ export declare function isPlainObject(value: any): value is Record<string, any>;
30
+ /**
31
+ * Clone an object deeply
32
+ */
33
+ export declare function cloneDeep<T>(obj: T): T;
34
+ //# sourceMappingURL=object-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-utils.d.ts","sourceRoot":"","sources":["../../src/utils/object-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAgCpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3D,QAAQ,EAAE,CAAC,EACX,GAAG,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GACjD,CAAC,CAEH;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAYnF;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,CAiBjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAOtE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAgBtC"}
@@ -0,0 +1,22 @@
1
+ function deepMerge(target, ...sources) {
2
+ if (!sources.length) return target;
3
+ const result = { ...target };
4
+ for (const source of sources) {
5
+ if (!source) continue;
6
+ for (const key in source) {
7
+ const sourceValue = source[key];
8
+ const targetValue = result[key];
9
+ if (sourceValue === void 0) continue;
10
+ if (sourceValue !== null && typeof sourceValue === "object" && !Array.isArray(sourceValue) && targetValue !== null && typeof targetValue === "object" && !Array.isArray(targetValue)) {
11
+ result[key] = deepMerge(targetValue, sourceValue);
12
+ } else {
13
+ result[key] = sourceValue;
14
+ }
15
+ }
16
+ }
17
+ return result;
18
+ }
19
+ export {
20
+ deepMerge
21
+ };
22
+ //# sourceMappingURL=object-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-utils.js","sources":["../../src/utils/object-utils.ts"],"sourcesContent":["/**\n * Deep merge two objects recursively\n * Later values override earlier ones\n * Supports merging objects with different but compatible types\n */\nexport function deepMerge<T = any>(target: any, ...sources: any[]): T {\n if (!sources.length) return target as T;\n\n const result = { ...target };\n\n for (const source of sources) {\n if (!source) continue;\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (sourceValue === undefined) continue;\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // Recursively merge objects\n result[key] = deepMerge(targetValue, sourceValue);\n } else {\n // Direct assignment for primitives and arrays\n result[key] = sourceValue;\n }\n }\n }\n\n return result as T;\n}\n\n/**\n * Type-safe deep merge for configuration objects\n * Ensures the result conforms to the target type structure\n */\nexport function deepMergeConfig<T extends Record<string, any>>(\n defaults: T,\n ...overrides: Array<Partial<Record<keyof T, any>>>\n): T {\n return deepMerge<T>(defaults, ...overrides);\n}\n\n/**\n * Get a nested value from an object using a path\n * @param obj The object to query\n * @param path Path to the value (e.g., 'a.b.c' or ['a', 'b', 'c'])\n * @param defaultValue Default value if path doesn't exist\n */\nexport function get<T = any>(obj: any, path: string | string[], defaultValue?: T): T {\n const keys = Array.isArray(path) ? path : path.split('.');\n let current = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') {\n return defaultValue as T;\n }\n current = current[key];\n }\n\n return current !== undefined ? current : (defaultValue as T);\n}\n\n/**\n * Set a nested value in an object using a path\n * @param obj The object to modify\n * @param path Path to the value (e.g., 'a.b.c' or ['a', 'b', 'c'])\n * @param value The value to set\n */\nexport function set<T extends Record<string, any>>(obj: T, path: string | string[], value: any): T {\n const keys = Array.isArray(path) ? path : path.split('.');\n const lastKey = keys.pop();\n\n if (!lastKey) return obj;\n\n let current: any = obj;\n\n for (const key of keys) {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key];\n }\n\n current[lastKey] = value;\n return obj;\n}\n\n/**\n * Check if a value is a plain object\n */\nexport function isPlainObject(value: any): value is Record<string, any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n value.constructor === Object &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Clone an object deeply\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (obj instanceof Date) return new Date(obj.getTime()) as any;\n if (obj instanceof Array) return obj.map((item) => cloneDeep(item)) as any;\n if (obj instanceof Set) return new Set(Array.from(obj).map((item) => cloneDeep(item))) as any;\n if (obj instanceof Map) {\n return new Map(Array.from(obj.entries()).map(([k, v]) => [cloneDeep(k), cloneDeep(v)])) as any;\n }\n\n const cloned = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = cloneDeep(obj[key]);\n }\n }\n return cloned;\n}\n"],"names":[],"mappings":"AAKO,SAAS,UAAmB,WAAgB,SAAmB;AACpE,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,SAAS,EAAE,GAAG,OAAA;AAEpB,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAQ;AAEb,eAAW,OAAO,QAAQ;AACxB,YAAM,cAAc,OAAO,GAAG;AAC9B,YAAM,cAAc,OAAO,GAAG;AAE9B,UAAI,gBAAgB,OAAW;AAE/B,UACE,gBAAgB,QAChB,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,KAC1B,gBAAgB,QAChB,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,GAC1B;AAEA,eAAO,GAAG,IAAI,UAAU,aAAa,WAAW;AAAA,MAClD,OAAO;AAEL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;"}
@@ -0,0 +1,10 @@
1
+ import { TimeUs } from '../model/types';
2
+
3
+ export type QuantizeStrategy = 'nearest' | 'floor' | 'ceil';
4
+ export declare const DEFAULT_FRAME_TOLERANCE_US: TimeUs;
5
+ export declare function normalizeFps(value?: number): number;
6
+ export declare function frameDurationFromFps(fps?: number): TimeUs;
7
+ export declare function frameIndexFromTimestamp(baseTimestampUs: TimeUs, timestampUs: TimeUs, fps?: number, strategy?: QuantizeStrategy): number;
8
+ export declare function quantizeTimestampToFrame(timestampUs: TimeUs, baseTimestampUs: TimeUs, fps?: number, strategy?: QuantizeStrategy): TimeUs;
9
+ export declare function isTimestampWithinFrame(targetTimeUs: TimeUs, frameTimestampUs: TimeUs, frameDurationUs: TimeUs, toleranceUs?: TimeUs): boolean;
10
+ //# sourceMappingURL=time-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-utils.d.ts","sourceRoot":"","sources":["../../src/utils/time-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAI5D,eAAO,MAAM,0BAA0B,EAAE,MAAe,CAAC;AAEzD,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,GAAE,gBAA4B,GACrC,MAAM,CAqBR;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,GAAE,gBAA4B,GACrC,MAAM,CAIR;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,WAAW,GAAE,MAAmC,GAC/C,OAAO,CAeT"}