@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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/l1/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { TimeUs } from '../../model/types';
2
+
3
+ export interface L1Config {
4
+ maxMemoryMB: number;
5
+ maxGOPs?: number;
6
+ gopIntervalUs?: number;
7
+ }
8
+ export interface AudioSlot {
9
+ timestampUs: TimeUs;
10
+ durationUs: TimeUs;
11
+ planes: Float32Array[];
12
+ }
13
+ export interface AudioMetadata {
14
+ sampleRate: number;
15
+ numberOfChannels: number;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cache/l1/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,93 @@
1
+ import { RcFrame } from '../model';
2
+ import { TimeUs } from '../model/types';
3
+
4
+ export interface CacheConfig {
5
+ /** Maximum L1 cache size in bytes */
6
+ maxL1Size: number;
7
+ /** Maximum L2 cache size in bytes */
8
+ maxL2Size: number;
9
+ /** Cache eviction policy */
10
+ evictionPolicy: 'lru' | 'lfu' | 'fifo';
11
+ /** Prefetch window in microseconds */
12
+ prefetchWindowUs: TimeUs;
13
+ /** Retention window in microseconds */
14
+ retentionWindowUs: TimeUs;
15
+ }
16
+ export interface CacheStats {
17
+ /** L1 cache statistics */
18
+ l1: {
19
+ size: number;
20
+ maxSize: number;
21
+ hitRate: number;
22
+ missRate: number;
23
+ evictions: number;
24
+ entries: number;
25
+ };
26
+ /** L2 cache statistics */
27
+ l2: {
28
+ size: number;
29
+ maxSize: number;
30
+ hitRate: number;
31
+ missRate: number;
32
+ evictions: number;
33
+ entries: number;
34
+ };
35
+ /** Overall statistics */
36
+ total: {
37
+ hits: number;
38
+ misses: number;
39
+ hitRate: number;
40
+ };
41
+ }
42
+ export interface CacheEntry<T> {
43
+ /** Entry key */
44
+ key: string;
45
+ /** Cached data */
46
+ data: T;
47
+ /** Size in bytes */
48
+ size: number;
49
+ /** Creation timestamp */
50
+ createdAt: number;
51
+ /** Last access timestamp */
52
+ lastAccessedAt: number;
53
+ /** Access count */
54
+ accessCount: number;
55
+ /** Pin tokens referencing this entry (window aware retention). @better-ai.mdc retain window */
56
+ pinnedBy?: Set<string>;
57
+ }
58
+ export interface GOP {
59
+ /** GOP index */
60
+ index: number;
61
+ /** Start time in microseconds */
62
+ startUs: TimeUs;
63
+ /** Duration in microseconds */
64
+ durationUs: TimeUs;
65
+ /** Video frames in this GOP */
66
+ frames: RcFrame[];
67
+ /** Whether this GOP starts with a keyframe */
68
+ isKeyframe: boolean;
69
+ /** Clip ID for clip-aware caching */
70
+ clipId: string;
71
+ }
72
+ export interface ClipMetadata {
73
+ /** Clip identifier */
74
+ id: string;
75
+ /** Clip hash for cache key */
76
+ hash: string;
77
+ /** Start time in composition */
78
+ startUs: TimeUs;
79
+ /** Duration */
80
+ durationUs: TimeUs;
81
+ /** Number of chunks */
82
+ chunkCount: number;
83
+ /** Total size in bytes */
84
+ totalBytes: number;
85
+ /** Codec configuration */
86
+ codecConfig?: {
87
+ codec: string;
88
+ width?: number;
89
+ height?: number;
90
+ bitrate?: number;
91
+ };
92
+ }
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAElB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAEvC,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,0BAA0B;IAC1B,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,yBAAyB;IACzB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IAEZ,kBAAkB;IAClB,IAAI,EAAE,CAAC,CAAC;IAER,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IAEvB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IAEpB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,GAAG;IAClB,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IAEd,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAEhB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IAEnB,+BAA+B;IAC/B,MAAM,EAAE,OAAO,EAAE,CAAC;IAElB,8CAA8C;IAC9C,UAAU,EAAE,OAAO,CAAC;IAEpB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IAEX,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAEhB,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IAEnB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH"}
@@ -0,0 +1,69 @@
1
+ import { MeframeConfig, ResolvedConfig, ConfigLoaderOptions } from './types';
2
+ import { TUNING_PRESETS } from './defaults';
3
+
4
+ /**
5
+ * Configuration loader for Meframe
6
+ * Handles loading, validation, and resolution of configuration
7
+ */
8
+ export declare class ConfigLoader {
9
+ private static instance;
10
+ private config;
11
+ private userConfig;
12
+ /**
13
+ * Get singleton instance
14
+ */
15
+ static getInstance(): ConfigLoader;
16
+ /**
17
+ * Load and resolve configuration
18
+ * In build time, this would be handled by Vite/Rollup virtual module plugin
19
+ * At runtime, we use defaults or provided overrides
20
+ */
21
+ load(options?: ConfigLoaderOptions): Promise<ResolvedConfig>;
22
+ /**
23
+ * Get current resolved configuration
24
+ */
25
+ getConfig(): ResolvedConfig;
26
+ /**
27
+ * Apply a tuning preset
28
+ */
29
+ applyPreset(presetName: keyof typeof TUNING_PRESETS): ResolvedConfig;
30
+ /**
31
+ * Update configuration at runtime
32
+ */
33
+ update(partial: MeframeConfig): ResolvedConfig;
34
+ /**
35
+ * Reset to defaults
36
+ */
37
+ reset(): ResolvedConfig;
38
+ /**
39
+ * Clear singleton instance (mainly for testing)
40
+ */
41
+ static clearInstance(): void;
42
+ /**
43
+ * Resolve configuration by merging with defaults
44
+ * Each stage resolves its own configuration section
45
+ */
46
+ private resolveConfig;
47
+ /**
48
+ * Load configuration from virtual module
49
+ * This would be injected by Vite/Rollup at build time
50
+ */
51
+ private loadFromVirtualModule;
52
+ /**
53
+ * Load configuration from file path (for testing)
54
+ */
55
+ private loadFromPath;
56
+ }
57
+ /**
58
+ * Convenience function to get the global config loader
59
+ */
60
+ export declare function getConfigLoader(): ConfigLoader;
61
+ /**
62
+ * Convenience function to load configuration
63
+ */
64
+ export declare function loadConfig(options?: ConfigLoaderOptions): Promise<ResolvedConfig>;
65
+ /**
66
+ * Convenience function to get current configuration
67
+ */
68
+ export declare function getConfig(): ResolvedConfig;
69
+ //# sourceMappingURL=ConfigLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5D;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,UAAU,CAA8B;IAEhD;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC;;;;OAIG;IACG,IAAI,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;IAgCtE;;OAEG;IACH,SAAS,IAAI,cAAc;IAQ3B;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,OAAO,cAAc,GAAG,cAAc;IAOpE;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc;IAkB9C;;OAEG;IACH,KAAK,IAAI,cAAc;IAMvB;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;OAGG;IACH,OAAO,CAAC,aAAa;IASrB;;;OAGG;YACW,qBAAqB;IAenC;;OAEG;YACW,YAAY;CAM3B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,cAAc,CAE1C"}
@@ -0,0 +1,133 @@
1
+ import { DEFAULT_CONFIG, TUNING_PRESETS } from "./defaults.js";
2
+ import { validateConfig } from "./validation.js";
3
+ import { deepMerge } from "../utils/object-utils.js";
4
+ class ConfigLoader {
5
+ static instance = null;
6
+ config = null;
7
+ userConfig = null;
8
+ /**
9
+ * Get singleton instance
10
+ */
11
+ static getInstance() {
12
+ if (!ConfigLoader.instance) {
13
+ ConfigLoader.instance = new ConfigLoader();
14
+ }
15
+ return ConfigLoader.instance;
16
+ }
17
+ /**
18
+ * Load and resolve configuration
19
+ * In build time, this would be handled by Vite/Rollup virtual module plugin
20
+ * At runtime, we use defaults or provided overrides
21
+ */
22
+ async load(options = {}) {
23
+ if (options.override) {
24
+ this.userConfig = options.override;
25
+ } else if (options.configPath) {
26
+ this.userConfig = await this.loadFromPath(options.configPath);
27
+ } else {
28
+ this.userConfig = await this.loadFromVirtualModule();
29
+ }
30
+ if (this.userConfig) {
31
+ const validation = validateConfig(this.userConfig);
32
+ if (!validation.valid) {
33
+ console.warn("[ConfigLoader] Configuration validation warnings:", validation.warnings);
34
+ if (validation.errors.length > 0) {
35
+ throw new Error(`Configuration validation failed: ${validation.errors.join(", ")}`);
36
+ }
37
+ } else if (validation.warnings.length > 0) {
38
+ console.warn("[ConfigLoader] Configuration warnings:", validation.warnings);
39
+ }
40
+ }
41
+ this.config = this.resolveConfig(this.userConfig);
42
+ return this.config;
43
+ }
44
+ /**
45
+ * Get current resolved configuration
46
+ */
47
+ getConfig() {
48
+ if (!this.config) {
49
+ return DEFAULT_CONFIG;
50
+ }
51
+ return this.config;
52
+ }
53
+ /**
54
+ * Apply a tuning preset
55
+ */
56
+ applyPreset(presetName) {
57
+ const preset = TUNING_PRESETS[presetName];
58
+ this.userConfig = preset;
59
+ this.config = this.resolveConfig(preset);
60
+ return this.config;
61
+ }
62
+ /**
63
+ * Update configuration at runtime
64
+ */
65
+ update(partial) {
66
+ this.userConfig = deepMerge(this.userConfig || {}, partial);
67
+ const validation = validateConfig(this.userConfig);
68
+ if (!validation.valid) {
69
+ console.warn("[ConfigLoader] Configuration validation warnings:", validation.warnings);
70
+ if (validation.errors.length > 0) {
71
+ throw new Error(`Configuration validation failed: ${validation.errors.join(", ")}`);
72
+ }
73
+ }
74
+ this.config = this.resolveConfig(this.userConfig);
75
+ return this.config;
76
+ }
77
+ /**
78
+ * Reset to defaults
79
+ */
80
+ reset() {
81
+ this.userConfig = null;
82
+ this.config = DEFAULT_CONFIG;
83
+ return this.config;
84
+ }
85
+ /**
86
+ * Clear singleton instance (mainly for testing)
87
+ */
88
+ static clearInstance() {
89
+ ConfigLoader.instance = null;
90
+ }
91
+ /**
92
+ * Resolve configuration by merging with defaults
93
+ * Each stage resolves its own configuration section
94
+ */
95
+ resolveConfig(userConfig) {
96
+ if (!userConfig) {
97
+ return DEFAULT_CONFIG;
98
+ }
99
+ return deepMerge(DEFAULT_CONFIG, userConfig);
100
+ }
101
+ /**
102
+ * Load configuration from virtual module
103
+ * This would be injected by Vite/Rollup at build time
104
+ */
105
+ async loadFromVirtualModule() {
106
+ if (typeof window !== "undefined" && window.__MEFRAME_CONFIG__) {
107
+ return window.__MEFRAME_CONFIG__;
108
+ }
109
+ if (typeof global !== "undefined" && global.__MEFRAME_CONFIG__) {
110
+ return global.__MEFRAME_CONFIG__;
111
+ }
112
+ return null;
113
+ }
114
+ /**
115
+ * Load configuration from file path (for testing)
116
+ */
117
+ async loadFromPath(path) {
118
+ console.warn(`[ConfigLoader] Loading from path '${path}' not implemented in runtime`);
119
+ return null;
120
+ }
121
+ }
122
+ function getConfigLoader() {
123
+ return ConfigLoader.getInstance();
124
+ }
125
+ async function loadConfig(options) {
126
+ return getConfigLoader().load(options);
127
+ }
128
+ export {
129
+ ConfigLoader,
130
+ getConfigLoader,
131
+ loadConfig
132
+ };
133
+ //# sourceMappingURL=ConfigLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.js","sources":["../../src/config/ConfigLoader.ts"],"sourcesContent":["import type { MeframeConfig, ResolvedConfig, ConfigLoaderOptions } from './types';\nimport { DEFAULT_CONFIG, TUNING_PRESETS } from './defaults';\nimport { validateConfig } from './validation';\nimport { deepMerge } from '../utils/object-utils';\n\n/**\n * Configuration loader for Meframe\n * Handles loading, validation, and resolution of configuration\n */\nexport class ConfigLoader {\n private static instance: ConfigLoader | null = null;\n private config: ResolvedConfig | null = null;\n private userConfig: MeframeConfig | null = null;\n\n /**\n * Get singleton instance\n */\n static getInstance(): ConfigLoader {\n if (!ConfigLoader.instance) {\n ConfigLoader.instance = new ConfigLoader();\n }\n return ConfigLoader.instance;\n }\n\n /**\n * Load and resolve configuration\n * In build time, this would be handled by Vite/Rollup virtual module plugin\n * At runtime, we use defaults or provided overrides\n */\n async load(options: ConfigLoaderOptions = {}): Promise<ResolvedConfig> {\n // If override is provided, use it directly\n if (options.override) {\n this.userConfig = options.override;\n } else if (options.configPath) {\n // In a real implementation, this would load from the virtual module\n // For now, we'll just use the path as a hint for testing\n this.userConfig = await this.loadFromPath(options.configPath);\n } else {\n // Try to load from virtual module (injected at build time)\n this.userConfig = await this.loadFromVirtualModule();\n }\n\n // Validate user configuration\n if (this.userConfig) {\n const validation = validateConfig(this.userConfig);\n if (!validation.valid) {\n console.warn('[ConfigLoader] Configuration validation warnings:', validation.warnings);\n if (validation.errors.length > 0) {\n throw new Error(`Configuration validation failed: ${validation.errors.join(', ')}`);\n }\n } else if (validation.warnings.length > 0) {\n console.warn('[ConfigLoader] Configuration warnings:', validation.warnings);\n }\n }\n\n // Resolve configuration\n this.config = this.resolveConfig(this.userConfig);\n\n return this.config;\n }\n\n /**\n * Get current resolved configuration\n */\n getConfig(): ResolvedConfig {\n if (!this.config) {\n // Return defaults if not loaded yet\n return DEFAULT_CONFIG;\n }\n return this.config;\n }\n\n /**\n * Apply a tuning preset\n */\n applyPreset(presetName: keyof typeof TUNING_PRESETS): ResolvedConfig {\n const preset = TUNING_PRESETS[presetName];\n this.userConfig = preset;\n this.config = this.resolveConfig(preset);\n return this.config;\n }\n\n /**\n * Update configuration at runtime\n */\n update(partial: MeframeConfig): ResolvedConfig {\n // Merge with existing user config\n this.userConfig = deepMerge(this.userConfig || {}, partial) as MeframeConfig;\n\n // Validate\n const validation = validateConfig(this.userConfig);\n if (!validation.valid) {\n console.warn('[ConfigLoader] Configuration validation warnings:', validation.warnings);\n if (validation.errors.length > 0) {\n throw new Error(`Configuration validation failed: ${validation.errors.join(', ')}`);\n }\n }\n\n // Resolve and update\n this.config = this.resolveConfig(this.userConfig);\n return this.config;\n }\n\n /**\n * Reset to defaults\n */\n reset(): ResolvedConfig {\n this.userConfig = null;\n this.config = DEFAULT_CONFIG;\n return this.config;\n }\n\n /**\n * Clear singleton instance (mainly for testing)\n */\n static clearInstance(): void {\n ConfigLoader.instance = null;\n }\n\n /**\n * Resolve configuration by merging with defaults\n * Each stage resolves its own configuration section\n */\n private resolveConfig(userConfig: MeframeConfig | null): ResolvedConfig {\n if (!userConfig) {\n return DEFAULT_CONFIG;\n }\n\n // Use improved deepMerge that handles type differences\n return deepMerge<ResolvedConfig>(DEFAULT_CONFIG, userConfig);\n }\n\n /**\n * Load configuration from virtual module\n * This would be injected by Vite/Rollup at build time\n */\n private async loadFromVirtualModule(): Promise<MeframeConfig | null> {\n // Check if virtual module is available\n if (typeof window !== 'undefined' && (window as any).__MEFRAME_CONFIG__) {\n return (window as any).__MEFRAME_CONFIG__;\n }\n\n // In Node.js environment, check global\n if (typeof global !== 'undefined' && (global as any).__MEFRAME_CONFIG__) {\n return (global as any).__MEFRAME_CONFIG__;\n }\n\n // No user configuration found, will use defaults\n return null;\n }\n\n /**\n * Load configuration from file path (for testing)\n */\n private async loadFromPath(path: string): Promise<MeframeConfig | null> {\n // In a real implementation, this would use dynamic import\n // For now, return null and rely on overrides for testing\n console.warn(`[ConfigLoader] Loading from path '${path}' not implemented in runtime`);\n return null;\n }\n}\n\n/**\n * Convenience function to get the global config loader\n */\nexport function getConfigLoader(): ConfigLoader {\n return ConfigLoader.getInstance();\n}\n\n/**\n * Convenience function to load configuration\n */\nexport async function loadConfig(options?: ConfigLoaderOptions): Promise<ResolvedConfig> {\n return getConfigLoader().load(options);\n}\n\n/**\n * Convenience function to get current configuration\n */\nexport function getConfig(): ResolvedConfig {\n return getConfigLoader().getConfig();\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { ResolvedConfig } from './types';
2
+
3
+ /**
4
+ * Default configuration values based on mobile 1080p30 memory budget
5
+ *
6
+ * Note: Canvas dimensions are fixed for the entire project.
7
+ * All video clips will be scaled/fitted to this resolution.
8
+ * Choose based on your primary content type:
9
+ * - 720×1280: Mobile vertical video
10
+ * - 1080×1920: HD vertical video (TikTok, Instagram Reels) ← default
11
+ * - 1920×1080: HD horizontal video (YouTube)
12
+ */
13
+ export declare const DEFAULT_CONFIG: ResolvedConfig;
14
+ /**
15
+ * Tuning presets for common scenarios
16
+ */
17
+ export declare const TUNING_PRESETS: {
18
+ /**
19
+ * Low-latency live streaming
20
+ * Minimize buffering for real-time playback
21
+ */
22
+ readonly lowLatency: {
23
+ readonly global: {
24
+ readonly logLevel: "info";
25
+ };
26
+ readonly load: {
27
+ readonly backpressure: {
28
+ readonly highWaterMark: number;
29
+ };
30
+ };
31
+ readonly demux: {
32
+ readonly backpressure: {
33
+ readonly highWaterMark: 3;
34
+ };
35
+ };
36
+ readonly decode: {
37
+ readonly video: {
38
+ readonly backpressure: {
39
+ readonly highWaterMark: 2;
40
+ readonly decodeQueueThreshold: 4;
41
+ };
42
+ };
43
+ readonly audio: {
44
+ readonly backpressure: {
45
+ readonly highWaterMark: 10;
46
+ };
47
+ };
48
+ };
49
+ };
50
+ /**
51
+ * 4K60 playback/export
52
+ * Larger buffers for high bitrate content
53
+ */
54
+ readonly highQuality: {
55
+ readonly global: {
56
+ readonly logLevel: "info";
57
+ };
58
+ readonly load: {
59
+ readonly backpressure: {
60
+ readonly highWaterMark: number;
61
+ };
62
+ readonly retry: {
63
+ readonly maxAttempts: 3;
64
+ readonly baseDelayMs: 500;
65
+ };
66
+ };
67
+ readonly demux: {
68
+ readonly backpressure: {
69
+ readonly highWaterMark: 20;
70
+ };
71
+ };
72
+ readonly decode: {
73
+ readonly video: {
74
+ readonly backpressure: {
75
+ readonly highWaterMark: 8;
76
+ readonly decodeQueueThreshold: 24;
77
+ };
78
+ readonly codecHints: ("h264" | "hevc")[];
79
+ };
80
+ readonly audio: {
81
+ readonly backpressure: {
82
+ readonly highWaterMark: 30;
83
+ };
84
+ };
85
+ };
86
+ readonly cache: {
87
+ readonly l2: {
88
+ readonly quotaGb: 1;
89
+ };
90
+ };
91
+ };
92
+ /**
93
+ * Batch offline transcode
94
+ * Maximum throughput, memory not a concern
95
+ */
96
+ readonly offline: {
97
+ readonly global: {
98
+ readonly logLevel: "warn";
99
+ };
100
+ readonly load: {
101
+ readonly backpressure: {
102
+ readonly highWaterMark: number;
103
+ };
104
+ };
105
+ readonly demux: {
106
+ readonly backpressure: {
107
+ readonly highWaterMark: 25;
108
+ };
109
+ };
110
+ readonly decode: {
111
+ readonly video: {
112
+ readonly backpressure: {
113
+ readonly highWaterMark: 12;
114
+ readonly decodeQueueThreshold: 32;
115
+ };
116
+ };
117
+ readonly audio: {
118
+ readonly backpressure: {
119
+ readonly highWaterMark: 40;
120
+ };
121
+ };
122
+ };
123
+ };
124
+ };
125
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiB9C;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,cAiE5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8BH;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;qCAyBmC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;;;;;;;;;;;;;;IAezD;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BK,CAAC"}
@@ -0,0 +1,191 @@
1
+ import { CANVAS_PRESETS } from "./presets.js";
2
+ function getWorkerConfig() {
3
+ const isDev = typeof process !== "undefined" && process.env.NODE_ENV !== "production" || typeof window !== "undefined" && window.location?.hostname === "localhost";
4
+ return {
5
+ workerBaseUrl: isDev ? "/src/stages" : "/dist/stages",
6
+ workerExtension: isDev ? ".ts" : ".js"
7
+ };
8
+ }
9
+ const DEFAULT_CONFIG = {
10
+ global: {
11
+ logLevel: "info",
12
+ enablePerfMonitor: false,
13
+ ...getWorkerConfig(),
14
+ defaultCanvasWidth: CANVAS_PRESETS.MOBILE_PORTRAIT.width,
15
+ defaultCanvasHeight: CANVAS_PRESETS.MOBILE_PORTRAIT.height,
16
+ defaultFps: 30
17
+ },
18
+ load: {
19
+ backpressure: {
20
+ highWaterMark: 64 * 1024,
21
+ // 64 KB
22
+ stallTimeoutMs: 500
23
+ },
24
+ retry: {
25
+ maxAttempts: 3,
26
+ baseDelayMs: 500
27
+ },
28
+ window: {
29
+ maxInflightPerClip: 1,
30
+ maxInflight: 4,
31
+ chunkSize: 1 * 1024 * 1024
32
+ // 1 MB
33
+ }
34
+ },
35
+ demux: {
36
+ backpressure: {
37
+ highWaterMark: 10
38
+ // 10 EncodedChunks
39
+ }
40
+ },
41
+ decode: {
42
+ video: {
43
+ backpressure: {
44
+ highWaterMark: 4,
45
+ // 4 EncodedVideoChunks
46
+ decodeQueueThreshold: 16
47
+ // Pause when decoder has 16+ chunks
48
+ },
49
+ maxGOPs: 4
50
+ // Cache 4 GOPs for seeking
51
+ },
52
+ audio: {
53
+ backpressure: {
54
+ highWaterMark: 20
55
+ // 20 EncodedAudioChunks
56
+ }
57
+ }
58
+ },
59
+ compose: {
60
+ visual: {},
61
+ audio: {
62
+ enableDucking: false
63
+ // Default: no ducking
64
+ }
65
+ },
66
+ encode: {
67
+ video: {},
68
+ audio: {}
69
+ },
70
+ cache: {
71
+ l1: {},
72
+ l2: {}
73
+ },
74
+ mux: {}
75
+ };
76
+ const TUNING_PRESETS = {
77
+ /**
78
+ * Low-latency live streaming
79
+ * Minimize buffering for real-time playback
80
+ */
81
+ lowLatency: {
82
+ global: {
83
+ logLevel: "info"
84
+ },
85
+ load: {
86
+ backpressure: {
87
+ highWaterMark: 16 * 1024
88
+ // 16 KB
89
+ }
90
+ },
91
+ demux: {
92
+ backpressure: {
93
+ highWaterMark: 3
94
+ }
95
+ },
96
+ decode: {
97
+ video: {
98
+ backpressure: {
99
+ highWaterMark: 2,
100
+ decodeQueueThreshold: 4
101
+ }
102
+ },
103
+ audio: {
104
+ backpressure: {
105
+ highWaterMark: 10
106
+ }
107
+ }
108
+ }
109
+ },
110
+ /**
111
+ * 4K60 playback/export
112
+ * Larger buffers for high bitrate content
113
+ */
114
+ highQuality: {
115
+ global: {
116
+ logLevel: "info"
117
+ },
118
+ load: {
119
+ backpressure: {
120
+ highWaterMark: 256 * 1024
121
+ // 256 KB
122
+ },
123
+ retry: {
124
+ maxAttempts: 3,
125
+ baseDelayMs: 500
126
+ }
127
+ },
128
+ demux: {
129
+ backpressure: {
130
+ highWaterMark: 20
131
+ }
132
+ },
133
+ decode: {
134
+ video: {
135
+ backpressure: {
136
+ highWaterMark: 8,
137
+ decodeQueueThreshold: 24
138
+ },
139
+ codecHints: ["h264", "hevc"]
140
+ },
141
+ audio: {
142
+ backpressure: {
143
+ highWaterMark: 30
144
+ }
145
+ }
146
+ },
147
+ cache: {
148
+ l2: {
149
+ quotaGb: 1
150
+ }
151
+ }
152
+ },
153
+ /**
154
+ * Batch offline transcode
155
+ * Maximum throughput, memory not a concern
156
+ */
157
+ offline: {
158
+ global: {
159
+ logLevel: "warn"
160
+ },
161
+ load: {
162
+ backpressure: {
163
+ highWaterMark: 512 * 1024
164
+ // 512 KB
165
+ }
166
+ },
167
+ demux: {
168
+ backpressure: {
169
+ highWaterMark: 25
170
+ }
171
+ },
172
+ decode: {
173
+ video: {
174
+ backpressure: {
175
+ highWaterMark: 12,
176
+ decodeQueueThreshold: 32
177
+ }
178
+ },
179
+ audio: {
180
+ backpressure: {
181
+ highWaterMark: 40
182
+ }
183
+ }
184
+ }
185
+ }
186
+ };
187
+ export {
188
+ DEFAULT_CONFIG,
189
+ TUNING_PRESETS
190
+ };
191
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sources":["../../src/config/defaults.ts"],"sourcesContent":["import type { ResolvedConfig } from './types';\nimport { CANVAS_PRESETS } from './presets';\n\n/**\n * Get default worker configuration based on environment\n */\nfunction getWorkerConfig() {\n const isDev =\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') ||\n (typeof window !== 'undefined' && window.location?.hostname === 'localhost');\n\n return {\n workerBaseUrl: isDev ? '/src/stages' : '/dist/stages',\n workerExtension: isDev ? '.ts' : '.js',\n };\n}\n\n/**\n * Default configuration values based on mobile 1080p30 memory budget\n *\n * Note: Canvas dimensions are fixed for the entire project.\n * All video clips will be scaled/fitted to this resolution.\n * Choose based on your primary content type:\n * - 720×1280: Mobile vertical video\n * - 1080×1920: HD vertical video (TikTok, Instagram Reels) ← default\n * - 1920×1080: HD horizontal video (YouTube)\n */\nexport const DEFAULT_CONFIG: ResolvedConfig = {\n global: {\n logLevel: 'info',\n enablePerfMonitor: false,\n ...getWorkerConfig(),\n defaultCanvasWidth: CANVAS_PRESETS.MOBILE_PORTRAIT.width,\n defaultCanvasHeight: CANVAS_PRESETS.MOBILE_PORTRAIT.height,\n defaultFps: 30,\n },\n\n load: {\n backpressure: {\n highWaterMark: 64 * 1024, // 64 KB\n stallTimeoutMs: 500,\n },\n retry: {\n maxAttempts: 3,\n baseDelayMs: 500,\n },\n window: {\n maxInflightPerClip: 1,\n maxInflight: 4,\n chunkSize: 1 * 1024 * 1024, // 1 MB\n },\n },\n\n demux: {\n backpressure: {\n highWaterMark: 10, // 10 EncodedChunks\n },\n },\n\n decode: {\n video: {\n backpressure: {\n highWaterMark: 4, // 4 EncodedVideoChunks\n decodeQueueThreshold: 16, // Pause when decoder has 16+ chunks\n },\n maxGOPs: 4, // Cache 4 GOPs for seeking\n },\n audio: {\n backpressure: {\n highWaterMark: 20, // 20 EncodedAudioChunks\n },\n },\n },\n\n compose: {\n visual: {},\n audio: {\n enableDucking: false, // Default: no ducking\n },\n },\n\n encode: {\n video: {},\n audio: {},\n },\n\n cache: {\n l1: {},\n l2: {},\n },\n\n mux: {},\n};\n\n/**\n * Tuning presets for common scenarios\n */\nexport const TUNING_PRESETS = {\n /**\n * Low-latency live streaming\n * Minimize buffering for real-time playback\n */\n lowLatency: {\n global: {\n logLevel: 'info' as const,\n },\n load: {\n backpressure: {\n highWaterMark: 16 * 1024, // 16 KB\n },\n },\n demux: {\n backpressure: {\n highWaterMark: 3,\n },\n },\n decode: {\n video: {\n backpressure: {\n highWaterMark: 2,\n decodeQueueThreshold: 4,\n },\n },\n audio: {\n backpressure: {\n highWaterMark: 10,\n },\n },\n },\n },\n\n /**\n * 4K60 playback/export\n * Larger buffers for high bitrate content\n */\n highQuality: {\n global: {\n logLevel: 'info' as const,\n },\n load: {\n backpressure: {\n highWaterMark: 256 * 1024, // 256 KB\n },\n retry: {\n maxAttempts: 3,\n baseDelayMs: 500,\n },\n },\n demux: {\n backpressure: {\n highWaterMark: 20,\n },\n },\n decode: {\n video: {\n backpressure: {\n highWaterMark: 8,\n decodeQueueThreshold: 24,\n },\n codecHints: ['h264', 'hevc'] as ('h264' | 'hevc')[],\n },\n audio: {\n backpressure: {\n highWaterMark: 30,\n },\n },\n },\n cache: {\n l2: {\n quotaGb: 1,\n },\n },\n },\n\n /**\n * Batch offline transcode\n * Maximum throughput, memory not a concern\n */\n offline: {\n global: {\n logLevel: 'warn' as const,\n },\n load: {\n backpressure: {\n highWaterMark: 512 * 1024, // 512 KB\n },\n },\n demux: {\n backpressure: {\n highWaterMark: 25,\n },\n },\n decode: {\n video: {\n backpressure: {\n highWaterMark: 12,\n decodeQueueThreshold: 32,\n },\n },\n audio: {\n backpressure: {\n highWaterMark: 40,\n },\n },\n },\n },\n} as const;\n"],"names":[],"mappings":"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"}