@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,309 @@
1
+ class VideoClipSession {
2
+ clipId;
3
+ planner;
4
+ workerPool;
5
+ cacheManager;
6
+ compositionModel;
7
+ workerConfigs;
8
+ callbacks;
9
+ instructionContext = null;
10
+ visualWorker = null;
11
+ decodeWorker = null;
12
+ encodeWorker = null;
13
+ videoDemuxWorker = null;
14
+ visualStream = null;
15
+ visualToEncodeChannel = null;
16
+ decodeToVisualChannel = null;
17
+ demuxToDecodeChannel = null;
18
+ isActive = false;
19
+ isDisposed = false;
20
+ static async create(config) {
21
+ return new VideoClipSession(config);
22
+ }
23
+ constructor(config) {
24
+ this.clipId = config.clipId;
25
+ this.planner = config.planner;
26
+ this.workerPool = config.workerPool;
27
+ this.cacheManager = config.cacheManager;
28
+ this.compositionModel = config.compositionModel;
29
+ this.workerConfigs = config.workerConfigs;
30
+ this.callbacks = config.callbacks;
31
+ }
32
+ async activate() {
33
+ if (this.isActive || this.isDisposed) return;
34
+ const clip = this.getClip();
35
+ const resource = this.getResource();
36
+ if (!clip || !resource || resource.type !== "video") {
37
+ return;
38
+ }
39
+ await this.setupPipeline(clip, resource);
40
+ await this.ensureInstructions(clip);
41
+ this.isActive = true;
42
+ if (this.callbacks.onPipelineReady) {
43
+ await this.callbacks.onPipelineReady(this.clipId);
44
+ console.log("[VideoClipSession] activate - onPipelineReady done", this.clipId);
45
+ }
46
+ }
47
+ async deactivate() {
48
+ if (!this.isActive || this.isDisposed) return;
49
+ this.isActive = false;
50
+ await this.invalidateClipCache();
51
+ await this.releasePipeline();
52
+ }
53
+ async dispose() {
54
+ if (this.isDisposed) return;
55
+ await this.deactivate();
56
+ this.planner.releaseClip(this.clipId);
57
+ this.isDisposed = true;
58
+ }
59
+ async handlePlannerUpdate(update) {
60
+ if (this.isDisposed) {
61
+ return;
62
+ }
63
+ if (update.type === "remove") {
64
+ await this.dispose();
65
+ return;
66
+ }
67
+ const instructions = update.instructions;
68
+ if (!instructions) {
69
+ return;
70
+ }
71
+ const clip = this.getClip();
72
+ const resource = this.getResource();
73
+ if (!clip || !resource || resource.type !== "video") {
74
+ return;
75
+ }
76
+ if (!this.isActive) {
77
+ await this.activate();
78
+ }
79
+ if (update.type === "pipelineChange") {
80
+ await this.restartPipeline(clip, resource, instructions, update.dirtyRanges);
81
+ return;
82
+ }
83
+ await this.installInstructions(instructions, update.dirtyRanges, {
84
+ expectCacheInvalidation: false,
85
+ triggerSync: update.type !== "instructionOnly"
86
+ });
87
+ }
88
+ async requestReplay(range) {
89
+ if (this.isDisposed || !this.isActive || !this.visualWorker || !this.instructionContext) {
90
+ return;
91
+ }
92
+ await this.cacheManager.invalidateRange(range.startUs, range.endUs, this.clipId);
93
+ await this.visualWorker.send("sync_clip", {
94
+ clipId: this.clipId,
95
+ revision: this.instructionContext.revision,
96
+ range
97
+ });
98
+ }
99
+ get visualWorkerHandle() {
100
+ return this.visualWorker;
101
+ }
102
+ getClip() {
103
+ return this.compositionModel?.findClip?.(this.clipId) ?? null;
104
+ }
105
+ getResource() {
106
+ const clip = this.getClip();
107
+ if (!clip) return null;
108
+ return this.compositionModel.resources.get(clip.resourceId) || null;
109
+ }
110
+ async ensureInstructions(clip) {
111
+ const instructions = this.planner.getInstructions(this.clipId);
112
+ if (!instructions) {
113
+ throw new Error(`No instructions for clip ${this.clipId}`);
114
+ }
115
+ await this.installInstructions(instructions, [
116
+ {
117
+ clipId: clip.id,
118
+ trackId: clip.trackId || "main",
119
+ startUs: clip.startUs,
120
+ endUs: clip.startUs + clip.durationUs,
121
+ reason: "initial-install"
122
+ }
123
+ ]);
124
+ }
125
+ async setupPipeline(clip, resource) {
126
+ await this.acquireWorkers(clip, resource.id);
127
+ await this.connectVideoPipeline(clip, resource.id);
128
+ if (!this.visualWorker) {
129
+ throw new Error("Visual worker unavailable");
130
+ }
131
+ }
132
+ async acquireWorkers(clip, resourceId) {
133
+ this.visualWorker = await this.workerPool.get("videoCompose", clip.id, { lazy: true });
134
+ this.decodeWorker = await this.workerPool.get("decode");
135
+ this.encodeWorker = await this.workerPool.get("encode");
136
+ this.videoDemuxWorker = await this.workerPool.get("videoDemux", resourceId, { lazy: true });
137
+ const visualConfig = this.workerConfigs.videoCompose ?? {};
138
+ const renderOverrides = this.compositionModel.renderConfig ?? {};
139
+ const timeline = {
140
+ clipId: clip.id,
141
+ clipStartUs: clip.startUs,
142
+ clipEndUs: clip.startUs + clip.durationUs,
143
+ compositionFps: this.compositionModel.fps ?? visualConfig.fps ?? 30
144
+ };
145
+ await this.visualWorker.send("configure", {
146
+ initial: true,
147
+ clipId: clip.id,
148
+ config: { ...visualConfig, ...renderOverrides, timeline }
149
+ });
150
+ }
151
+ async connectVideoPipeline(clip, resourceId) {
152
+ if (!this.visualWorker || !this.decodeWorker || !this.encodeWorker || !this.videoDemuxWorker) {
153
+ throw new Error("Pipeline workers not ready");
154
+ }
155
+ const clipId = clip.id;
156
+ this.visualToEncodeChannel = new MessageChannel();
157
+ await this.visualWorker.send(
158
+ "connect",
159
+ {
160
+ direction: "downstream",
161
+ port: this.visualToEncodeChannel.port1,
162
+ streamType: "video",
163
+ clipId
164
+ },
165
+ { transfer: [this.visualToEncodeChannel.port1] }
166
+ );
167
+ await this.encodeWorker.send(
168
+ "connect",
169
+ {
170
+ direction: "upstream",
171
+ port: this.visualToEncodeChannel.port2,
172
+ streamType: "video",
173
+ clipId
174
+ },
175
+ { transfer: [this.visualToEncodeChannel.port2] }
176
+ );
177
+ this.decodeToVisualChannel = new MessageChannel();
178
+ await this.decodeWorker.send(
179
+ "connect",
180
+ {
181
+ direction: "downstream",
182
+ port: this.decodeToVisualChannel.port1,
183
+ streamType: "video",
184
+ clipId
185
+ },
186
+ { transfer: [this.decodeToVisualChannel.port1] }
187
+ );
188
+ await this.visualWorker.send(
189
+ "connect",
190
+ {
191
+ direction: "upstream",
192
+ port: this.decodeToVisualChannel.port2,
193
+ streamType: "video",
194
+ clipId
195
+ },
196
+ { transfer: [this.decodeToVisualChannel.port2] }
197
+ );
198
+ this.demuxToDecodeChannel = new MessageChannel();
199
+ await this.videoDemuxWorker.send(
200
+ "connect",
201
+ {
202
+ direction: "downstream",
203
+ port: this.demuxToDecodeChannel.port1,
204
+ streamType: "video",
205
+ clipId
206
+ },
207
+ { transfer: [this.demuxToDecodeChannel.port1] }
208
+ );
209
+ await this.decodeWorker.send(
210
+ "connect",
211
+ {
212
+ direction: "upstream",
213
+ port: this.demuxToDecodeChannel.port2,
214
+ streamType: "video",
215
+ clipId
216
+ },
217
+ { transfer: [this.demuxToDecodeChannel.port2] }
218
+ );
219
+ const demuxConfig = this.workerConfigs.videoDemux ?? {};
220
+ await this.videoDemuxWorker.send("configure", {
221
+ initial: true,
222
+ resourceId,
223
+ clipId,
224
+ config: demuxConfig
225
+ });
226
+ this.visualWorker.receiveStream((stream) => {
227
+ const visualConfig = this.workerConfigs.videoCompose ?? {};
228
+ const fps = this.compositionModel.fps ?? visualConfig.fps ?? 30;
229
+ this.callbacks.onStreamReady(this.clipId, stream, fps);
230
+ });
231
+ }
232
+ async installInstructions(instructions, dirtyRanges, options) {
233
+ this.instructionContext = {
234
+ revision: instructions.revision,
235
+ instructions,
236
+ status: instructions.status
237
+ };
238
+ if (options?.expectCacheInvalidation) {
239
+ await this.invalidateRanges(dirtyRanges);
240
+ }
241
+ if (this.visualWorker) {
242
+ await this.visualWorker.send("install_instructions", instructions);
243
+ }
244
+ if (options?.triggerSync) {
245
+ await this.syncDirtyRanges(dirtyRanges, instructions.revision);
246
+ }
247
+ }
248
+ async restartPipeline(clip, resource, instructions, dirtyRanges) {
249
+ await this.releasePipeline();
250
+ await this.setupPipeline(clip, resource);
251
+ await this.installInstructions(instructions, dirtyRanges, {
252
+ expectCacheInvalidation: true,
253
+ triggerSync: true
254
+ });
255
+ }
256
+ async releasePipeline() {
257
+ if (this.visualWorker && this.instructionContext) {
258
+ await this.visualWorker.notify("dispose_clip", {
259
+ clipId: this.clipId,
260
+ revision: this.instructionContext.revision
261
+ });
262
+ }
263
+ this.visualToEncodeChannel?.port1.close();
264
+ this.visualToEncodeChannel?.port2.close();
265
+ this.decodeToVisualChannel?.port1.close();
266
+ this.decodeToVisualChannel?.port2.close();
267
+ this.demuxToDecodeChannel?.port1.close();
268
+ this.demuxToDecodeChannel?.port2.close();
269
+ this.visualToEncodeChannel = null;
270
+ this.decodeToVisualChannel = null;
271
+ this.demuxToDecodeChannel = null;
272
+ if (this.visualStream && this.callbacks.onStreamDisposed) {
273
+ this.callbacks.onStreamDisposed(this.clipId);
274
+ }
275
+ this.visualStream = null;
276
+ if (this.videoDemuxWorker) {
277
+ this.workerPool.terminate("videoDemux", this.getResource()?.id);
278
+ this.videoDemuxWorker = null;
279
+ }
280
+ if (this.visualWorker) {
281
+ this.workerPool.terminate("videoCompose", this.clipId);
282
+ this.visualWorker = null;
283
+ }
284
+ this.decodeWorker = null;
285
+ this.encodeWorker = null;
286
+ }
287
+ async invalidateClipCache() {
288
+ await this.cacheManager.invalidateClip(this.clipId);
289
+ }
290
+ async invalidateRanges(ranges) {
291
+ for (const range of ranges) {
292
+ await this.cacheManager.invalidateRange(range.startUs, range.endUs, this.clipId);
293
+ }
294
+ }
295
+ async syncDirtyRanges(ranges, revision) {
296
+ if (!this.visualWorker) return;
297
+ for (const range of ranges) {
298
+ await this.visualWorker.send("sync_clip", {
299
+ clipId: this.clipId,
300
+ revision,
301
+ range
302
+ });
303
+ }
304
+ }
305
+ }
306
+ export {
307
+ VideoClipSession
308
+ };
309
+ //# sourceMappingURL=VideoClipSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoClipSession.js","sources":["../../src/orchestrator/VideoClipSession.ts"],"sourcesContent":["import type { WorkerPool } from '../worker/WorkerPool';\nimport type { CacheManager } from '../cache/CacheManager';\nimport type { CompositionModel, Clip } from '../model';\nimport type { DirtyRange } from './types';\nimport type { CompositionPlanner, ClipUpdateResult } from './CompositionPlanner';\nimport type { ClipInstructionSet } from '../stages/compose/instructions';\nimport type { BaseWorker } from '../worker/BaseWorker';\nimport type { WorkerType } from '../worker/types';\n\ninterface VideoClipSessionCallbacks {\n onStreamReady(clipId: string, stream: ReadableStream<VideoFrame>, fps: number): void;\n onStreamDisposed?(clipId: string): void;\n onPipelineReady?(clipId: string): Promise<void>;\n}\n\ninterface VideoClipSessionConfig {\n clipId: string;\n planner: CompositionPlanner;\n workerPool: WorkerPool;\n cacheManager: CacheManager;\n compositionModel: CompositionModel;\n workerConfigs: Record<WorkerType, any>;\n callbacks: VideoClipSessionCallbacks;\n}\n\ninterface InstructionContext {\n revision: number;\n instructions: ClipInstructionSet;\n status: ClipInstructionSet['status'];\n}\n\nexport class VideoClipSession {\n private readonly clipId: string;\n private readonly planner: CompositionPlanner;\n private readonly workerPool: WorkerPool;\n private readonly cacheManager: CacheManager;\n private readonly compositionModel: CompositionModel;\n private readonly workerConfigs: Record<WorkerType, any>;\n private readonly callbacks: VideoClipSessionCallbacks;\n\n private instructionContext: InstructionContext | null = null;\n private visualWorker: BaseWorker | null = null;\n private decodeWorker: BaseWorker | null = null;\n private encodeWorker: BaseWorker | null = null;\n private videoDemuxWorker: BaseWorker | null = null;\n private visualStream: ReadableStream<VideoFrame> | null = null;\n private visualToEncodeChannel: MessageChannel | null = null;\n private decodeToVisualChannel: MessageChannel | null = null;\n private demuxToDecodeChannel: MessageChannel | null = null;\n private isActive = false;\n private isDisposed = false;\n\n static async create(config: VideoClipSessionConfig): Promise<VideoClipSession> {\n return new VideoClipSession(config);\n }\n\n private constructor(config: VideoClipSessionConfig) {\n this.clipId = config.clipId;\n this.planner = config.planner;\n this.workerPool = config.workerPool;\n this.cacheManager = config.cacheManager;\n this.compositionModel = config.compositionModel;\n this.workerConfigs = config.workerConfigs;\n this.callbacks = config.callbacks;\n }\n\n async activate(): Promise<void> {\n if (this.isActive || this.isDisposed) return;\n\n const clip = this.getClip();\n const resource = this.getResource();\n if (!clip || !resource || resource.type !== 'video') {\n return;\n }\n\n await this.setupPipeline(clip, resource);\n await this.ensureInstructions(clip);\n\n this.isActive = true;\n\n // Notify that pipeline is ready - triggers resource loading\n if (this.callbacks.onPipelineReady) {\n await this.callbacks.onPipelineReady(this.clipId);\n console.log('[VideoClipSession] activate - onPipelineReady done', this.clipId);\n }\n }\n\n async deactivate(): Promise<void> {\n if (!this.isActive || this.isDisposed) return;\n this.isActive = false;\n\n await this.invalidateClipCache();\n await this.releasePipeline();\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) return;\n await this.deactivate();\n this.planner.releaseClip(this.clipId);\n this.isDisposed = true;\n }\n\n async handlePlannerUpdate(update: ClipUpdateResult): Promise<void> {\n if (this.isDisposed) {\n return;\n }\n\n if (update.type === 'remove') {\n await this.dispose();\n return;\n }\n\n const instructions = update.instructions;\n if (!instructions) {\n return;\n }\n\n const clip = this.getClip();\n const resource = this.getResource();\n if (!clip || !resource || resource.type !== 'video') {\n return;\n }\n\n if (!this.isActive) {\n await this.activate();\n }\n\n if (update.type === 'pipelineChange') {\n await this.restartPipeline(clip, resource, instructions, update.dirtyRanges);\n return;\n }\n\n await this.installInstructions(instructions, update.dirtyRanges, {\n expectCacheInvalidation: false,\n triggerSync: update.type !== 'instructionOnly',\n });\n }\n\n async requestReplay(range: DirtyRange): Promise<void> {\n if (this.isDisposed || !this.isActive || !this.visualWorker || !this.instructionContext) {\n return;\n }\n\n await this.cacheManager.invalidateRange(range.startUs, range.endUs, this.clipId);\n await this.visualWorker.send('sync_clip', {\n clipId: this.clipId,\n revision: this.instructionContext.revision,\n range,\n });\n }\n\n get visualWorkerHandle(): BaseWorker | null {\n return this.visualWorker;\n }\n\n private getClip(): Clip | null {\n return this.compositionModel?.findClip?.(this.clipId) ?? null;\n }\n\n private getResource() {\n const clip = this.getClip();\n if (!clip) return null;\n return this.compositionModel.resources.get(clip.resourceId) || null;\n }\n\n private async ensureInstructions(clip: Clip): Promise<void> {\n const instructions = this.planner.getInstructions(this.clipId);\n if (!instructions) {\n throw new Error(`No instructions for clip ${this.clipId}`);\n }\n\n await this.installInstructions(instructions, [\n {\n clipId: clip.id,\n trackId: clip.trackId || 'main',\n startUs: clip.startUs,\n endUs: clip.startUs + clip.durationUs,\n reason: 'initial-install',\n },\n ]);\n }\n\n private async setupPipeline(clip: Clip, resource: { id: string }): Promise<void> {\n await this.acquireWorkers(clip, resource.id);\n await this.connectVideoPipeline(clip, resource.id);\n\n if (!this.visualWorker) {\n throw new Error('Visual worker unavailable');\n }\n\n // this.visualStream = await this.visualWorker.send<never, ReadableStream<VideoFrame>>(\n // 'get_stream'\n // );\n\n // if (this.visualStream) {\n // const visualConfig = this.workerConfigs.videoCompose ?? {};\n // const fps = this.compositionModel.fps ?? visualConfig.fps ?? 30;\n // this.callbacks.onStreamReady(this.clipId, this.visualStream, clip.trackId || 'main', fps);\n // }\n }\n\n private async acquireWorkers(clip: Clip, resourceId: string): Promise<void> {\n this.visualWorker = await this.workerPool.get('videoCompose', clip.id, { lazy: true });\n this.decodeWorker = await this.workerPool.get('decode');\n this.encodeWorker = await this.workerPool.get('encode');\n this.videoDemuxWorker = await this.workerPool.get('videoDemux', resourceId, { lazy: true });\n\n const visualConfig = this.workerConfigs.videoCompose ?? {};\n const renderOverrides = this.compositionModel.renderConfig ?? {};\n const timeline = {\n clipId: clip.id,\n clipStartUs: clip.startUs,\n clipEndUs: clip.startUs + clip.durationUs,\n compositionFps: this.compositionModel.fps ?? visualConfig.fps ?? 30,\n };\n\n await this.visualWorker.send('configure', {\n initial: true,\n clipId: clip.id,\n config: { ...visualConfig, ...renderOverrides, timeline },\n });\n }\n\n private async connectVideoPipeline(clip: Clip, resourceId: string): Promise<void> {\n if (!this.visualWorker || !this.decodeWorker || !this.encodeWorker || !this.videoDemuxWorker) {\n throw new Error('Pipeline workers not ready');\n }\n\n const clipId = clip.id;\n\n this.visualToEncodeChannel = new MessageChannel();\n await this.visualWorker.send(\n 'connect',\n {\n direction: 'downstream',\n port: this.visualToEncodeChannel.port1,\n streamType: 'video',\n clipId,\n },\n { transfer: [this.visualToEncodeChannel.port1] }\n );\n await this.encodeWorker.send(\n 'connect',\n {\n direction: 'upstream',\n port: this.visualToEncodeChannel.port2,\n streamType: 'video',\n clipId,\n },\n { transfer: [this.visualToEncodeChannel.port2] }\n );\n\n this.decodeToVisualChannel = new MessageChannel();\n await this.decodeWorker.send(\n 'connect',\n {\n direction: 'downstream',\n port: this.decodeToVisualChannel.port1,\n streamType: 'video',\n clipId,\n },\n { transfer: [this.decodeToVisualChannel.port1] }\n );\n await this.visualWorker.send(\n 'connect',\n {\n direction: 'upstream',\n port: this.decodeToVisualChannel.port2,\n streamType: 'video',\n clipId,\n },\n { transfer: [this.decodeToVisualChannel.port2] }\n );\n\n this.demuxToDecodeChannel = new MessageChannel();\n await this.videoDemuxWorker.send(\n 'connect',\n {\n direction: 'downstream',\n port: this.demuxToDecodeChannel.port1,\n streamType: 'video',\n clipId,\n },\n { transfer: [this.demuxToDecodeChannel.port1] }\n );\n await this.decodeWorker.send(\n 'connect',\n {\n direction: 'upstream',\n port: this.demuxToDecodeChannel.port2,\n streamType: 'video',\n clipId,\n },\n { transfer: [this.demuxToDecodeChannel.port2] }\n );\n\n const demuxConfig = this.workerConfigs.videoDemux ?? {};\n await this.videoDemuxWorker.send('configure', {\n initial: true,\n resourceId,\n clipId,\n config: demuxConfig,\n });\n\n this.visualWorker.receiveStream((stream) => {\n const visualConfig = this.workerConfigs.videoCompose ?? {};\n const fps = this.compositionModel.fps ?? visualConfig.fps ?? 30;\n this.callbacks.onStreamReady(this.clipId, stream, fps);\n });\n }\n\n private async installInstructions(\n instructions: ClipInstructionSet,\n dirtyRanges: DirtyRange[],\n options?: { expectCacheInvalidation?: boolean; triggerSync?: boolean }\n ): Promise<void> {\n this.instructionContext = {\n revision: instructions.revision,\n instructions,\n status: instructions.status,\n };\n\n if (options?.expectCacheInvalidation) {\n await this.invalidateRanges(dirtyRanges);\n }\n\n if (this.visualWorker) {\n await this.visualWorker.send('install_instructions', instructions);\n }\n\n if (options?.triggerSync) {\n await this.syncDirtyRanges(dirtyRanges, instructions.revision);\n }\n }\n\n private async restartPipeline(\n clip: Clip,\n resource: { id: string },\n instructions: ClipInstructionSet,\n dirtyRanges: DirtyRange[]\n ): Promise<void> {\n await this.releasePipeline();\n await this.setupPipeline(clip, resource);\n await this.installInstructions(instructions, dirtyRanges, {\n expectCacheInvalidation: true,\n triggerSync: true,\n });\n }\n\n private async releasePipeline(): Promise<void> {\n if (this.visualWorker && this.instructionContext) {\n await this.visualWorker.notify('dispose_clip', {\n clipId: this.clipId,\n revision: this.instructionContext.revision,\n });\n }\n\n this.visualToEncodeChannel?.port1.close();\n this.visualToEncodeChannel?.port2.close();\n this.decodeToVisualChannel?.port1.close();\n this.decodeToVisualChannel?.port2.close();\n this.demuxToDecodeChannel?.port1.close();\n this.demuxToDecodeChannel?.port2.close();\n\n this.visualToEncodeChannel = null;\n this.decodeToVisualChannel = null;\n this.demuxToDecodeChannel = null;\n\n if (this.visualStream && this.callbacks.onStreamDisposed) {\n this.callbacks.onStreamDisposed(this.clipId);\n }\n this.visualStream = null;\n\n if (this.videoDemuxWorker) {\n this.workerPool.terminate('videoDemux', this.getResource()?.id);\n this.videoDemuxWorker = null;\n }\n\n if (this.visualWorker) {\n this.workerPool.terminate('videoCompose', this.clipId);\n this.visualWorker = null;\n }\n\n // Shared workers are not terminated here (decode / encode)\n this.decodeWorker = null;\n this.encodeWorker = null;\n }\n\n private async invalidateClipCache(): Promise<void> {\n await this.cacheManager.invalidateClip(this.clipId);\n }\n\n private async invalidateRanges(ranges: DirtyRange[]): Promise<void> {\n for (const range of ranges) {\n await this.cacheManager.invalidateRange(range.startUs, range.endUs, this.clipId);\n }\n }\n\n private async syncDirtyRanges(ranges: DirtyRange[], revision: number): Promise<void> {\n if (!this.visualWorker) return;\n\n for (const range of ranges) {\n await this.visualWorker.send('sync_clip', {\n clipId: this.clipId,\n revision,\n range,\n });\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { Orchestrator } from './Orchestrator';
2
+ export { CompositionPlanner } from './CompositionPlanner';
3
+ export { ClipSessionManager } from './ClipSessionManager';
4
+ export type { IOrchestrator, OrchestratorConfig, DirtyRange } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { CompositionModel, CompositionModelData, CompositionPatch, TimeUs, RcFrame } from '../model';
2
+ import { EventBus } from '../event/EventBus';
3
+ import { EventPayloadMap } from '../event/events';
4
+ import { WorkerType, WorkerStatus } from '../worker/types';
5
+
6
+ /**
7
+ * Orchestrator configuration
8
+ */
9
+ export interface OrchestratorConfig {
10
+ workerBaseUrl: string;
11
+ maxWorkers?: number;
12
+ cacheConfig?: {
13
+ l1Size?: number;
14
+ l2Size?: number;
15
+ enabled?: boolean;
16
+ };
17
+ eventBus?: EventBus<EventPayloadMap>;
18
+ }
19
+ /**
20
+ * Frame render options
21
+ */
22
+ export interface RenderFrameOptions {
23
+ priority?: 'high' | 'normal' | 'low';
24
+ clipId?: string;
25
+ signal?: AbortSignal;
26
+ }
27
+ /**
28
+ * Orchestrator interface
29
+ */
30
+ export interface IOrchestrator {
31
+ readonly events: Pick<EventBus<EventPayloadMap>, 'on' | 'off' | 'once'>;
32
+ readonly compositionModel: CompositionModel | null;
33
+ readonly workerStatus: WorkerStatus;
34
+ initialize(): Promise<void>;
35
+ setCompositionModel(model: CompositionModel | CompositionModelData): Promise<void>;
36
+ applyPatch(patch: CompositionPatch): Promise<void>;
37
+ restartWorker(type: WorkerType, clipId?: string): Promise<void>;
38
+ renderFrame(timeUs: TimeUs, options?: RenderFrameOptions): Promise<RcFrame | null>;
39
+ dispose(): Promise<void>;
40
+ }
41
+ /**
42
+ * Preview handle for playback control
43
+ */
44
+ export interface PreviewHandle {
45
+ seek(timeUs: TimeUs): void;
46
+ setRate(rate: number): void;
47
+ pause(): void;
48
+ resume(): void;
49
+ stop(): void;
50
+ getCurrentTimeUs(): TimeUs;
51
+ on(event: string, handler: Function): void;
52
+ off(event: string, handler: Function): void;
53
+ }
54
+ /**
55
+ * Dirty range information
56
+ */
57
+ export interface DirtyRange {
58
+ startUs: TimeUs;
59
+ endUs: TimeUs;
60
+ trackId: string;
61
+ clipId?: string;
62
+ reason: string;
63
+ }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/orchestrator/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,MAAM,EACN,OAAO,EACR,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IACxE,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAEpC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,UAAU,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACnF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,IAAI,IAAI,IAAI,CAAC;IACb,gBAAgB,IAAI,MAAM,CAAC;IAC3B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Monitor and report backpressure status across pipeline stages
3
+ * This is a runtime monitoring tool used by plugins
4
+ */
5
+ export declare class BackpressureMonitor {
6
+ private metrics;
7
+ /**
8
+ * Update metrics for a stage
9
+ */
10
+ updateMetrics(stage: string, desiredSize: number, queueSize?: number): void;
11
+ /**
12
+ * Get current metrics snapshot
13
+ */
14
+ getSnapshot(): Record<string, {
15
+ desiredSize: number;
16
+ queueSize: number;
17
+ isPaused: boolean;
18
+ age: number;
19
+ }>;
20
+ /**
21
+ * Check if any stage is experiencing backpressure
22
+ */
23
+ hasBackpressure(): boolean;
24
+ /**
25
+ * Get stages currently experiencing backpressure
26
+ */
27
+ getBottlenecks(): string[];
28
+ /**
29
+ * Clear all metrics
30
+ */
31
+ clear(): void;
32
+ }
33
+ //# sourceMappingURL=BackpressureMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackpressureMonitor.d.ts","sourceRoot":"","sources":["../../src/plugins/BackpressureMonitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAQX;IAEJ;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,IAAI;IAU9E;;OAEG;IACH,WAAW,IAAI,MAAM,CACnB,MAAM,EACN;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;KACb,CACF;IAcD;;OAEG;IACH,eAAe,IAAI,OAAO;IAS1B;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAU1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,62 @@
1
+ class BackpressureMonitor {
2
+ metrics = /* @__PURE__ */ new Map();
3
+ /**
4
+ * Update metrics for a stage
5
+ */
6
+ updateMetrics(stage, desiredSize, queueSize = 0) {
7
+ const isPaused = desiredSize <= 0;
8
+ this.metrics.set(stage, {
9
+ desiredSize,
10
+ queueSize,
11
+ isPaused,
12
+ lastUpdate: Date.now()
13
+ });
14
+ }
15
+ /**
16
+ * Get current metrics snapshot
17
+ */
18
+ getSnapshot() {
19
+ const now = Date.now();
20
+ const snapshot = {};
21
+ for (const [stage, metrics] of this.metrics) {
22
+ snapshot[stage] = {
23
+ ...metrics,
24
+ age: now - metrics.lastUpdate
25
+ };
26
+ }
27
+ return snapshot;
28
+ }
29
+ /**
30
+ * Check if any stage is experiencing backpressure
31
+ */
32
+ hasBackpressure() {
33
+ for (const metrics of this.metrics.values()) {
34
+ if (metrics.isPaused) {
35
+ return true;
36
+ }
37
+ }
38
+ return false;
39
+ }
40
+ /**
41
+ * Get stages currently experiencing backpressure
42
+ */
43
+ getBottlenecks() {
44
+ const bottlenecks = [];
45
+ for (const [stage, metrics] of this.metrics) {
46
+ if (metrics.isPaused) {
47
+ bottlenecks.push(stage);
48
+ }
49
+ }
50
+ return bottlenecks;
51
+ }
52
+ /**
53
+ * Clear all metrics
54
+ */
55
+ clear() {
56
+ this.metrics.clear();
57
+ }
58
+ }
59
+ export {
60
+ BackpressureMonitor
61
+ };
62
+ //# sourceMappingURL=BackpressureMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackpressureMonitor.js","sources":["../../src/plugins/BackpressureMonitor.ts"],"sourcesContent":["/**\n * Monitor and report backpressure status across pipeline stages\n * This is a runtime monitoring tool used by plugins\n */\nexport class BackpressureMonitor {\n private metrics = new Map<\n string,\n {\n desiredSize: number;\n queueSize: number;\n isPaused: boolean;\n lastUpdate: number;\n }\n >();\n\n /**\n * Update metrics for a stage\n */\n updateMetrics(stage: string, desiredSize: number, queueSize: number = 0): void {\n const isPaused = desiredSize <= 0;\n this.metrics.set(stage, {\n desiredSize,\n queueSize,\n isPaused,\n lastUpdate: Date.now(),\n });\n }\n\n /**\n * Get current metrics snapshot\n */\n getSnapshot(): Record<\n string,\n {\n desiredSize: number;\n queueSize: number;\n isPaused: boolean;\n age: number;\n }\n > {\n const now = Date.now();\n const snapshot: Record<string, any> = {};\n\n for (const [stage, metrics] of this.metrics) {\n snapshot[stage] = {\n ...metrics,\n age: now - metrics.lastUpdate,\n };\n }\n\n return snapshot;\n }\n\n /**\n * Check if any stage is experiencing backpressure\n */\n hasBackpressure(): boolean {\n for (const metrics of this.metrics.values()) {\n if (metrics.isPaused) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get stages currently experiencing backpressure\n */\n getBottlenecks(): string[] {\n const bottlenecks: string[] = [];\n for (const [stage, metrics] of this.metrics) {\n if (metrics.isPaused) {\n bottlenecks.push(stage);\n }\n }\n return bottlenecks;\n }\n\n /**\n * Clear all metrics\n */\n clear(): void {\n this.metrics.clear();\n }\n}\n"],"names":[],"mappings":"AAIO,MAAM,oBAAoB;AAAA,EACvB,8BAAc,IAAA;AAAA;AAAA;AAAA;AAAA,EAatB,cAAc,OAAe,aAAqB,YAAoB,GAAS;AAC7E,UAAM,WAAW,eAAe;AAChC,SAAK,QAAQ,IAAI,OAAO;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,KAAK,IAAA;AAAA,IAAI,CACtB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAQE;AACA,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,WAAgC,CAAA;AAEtC,eAAW,CAAC,OAAO,OAAO,KAAK,KAAK,SAAS;AAC3C,eAAS,KAAK,IAAI;AAAA,QAChB,GAAG;AAAA,QACH,KAAK,MAAM,QAAQ;AAAA,MAAA;AAAA,IAEvB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA2B;AACzB,eAAW,WAAW,KAAK,QAAQ,OAAA,GAAU;AAC3C,UAAI,QAAQ,UAAU;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA2B;AACzB,UAAM,cAAwB,CAAA;AAC9B,eAAW,CAAC,OAAO,OAAO,KAAK,KAAK,SAAS;AAC3C,UAAI,QAAQ,UAAU;AACpB,oBAAY,KAAK,KAAK;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,MAAA;AAAA,EACf;AACF;"}
@@ -0,0 +1,37 @@
1
+ import { Plugin } from './types';
2
+ import { Meframe } from '../Meframe';
3
+
4
+ /**
5
+ * Plugin manager implementation
6
+ */
7
+ export declare class PluginManager {
8
+ private plugins;
9
+ private hooks;
10
+ private core;
11
+ constructor(core: Meframe);
12
+ /**
13
+ * Register a plugin
14
+ */
15
+ register(plugin: Plugin): void;
16
+ /**
17
+ * Unregister a plugin
18
+ */
19
+ unregister(name: string): void;
20
+ /**
21
+ * Get all registered plugins
22
+ */
23
+ getPlugins(): Plugin[];
24
+ /**
25
+ * Check if a plugin is registered
26
+ */
27
+ hasPlugin(name: string): boolean;
28
+ /**
29
+ * Execute a hook with context
30
+ */
31
+ executeHook(hook: string, context: any): Promise<void>;
32
+ /**
33
+ * Dispose all plugins
34
+ */
35
+ disposeAll(): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=PluginManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../src/plugins/PluginManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,IAAI,CAAU;gBAEV,IAAI,EAAE,OAAO;IAIzB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CASlC"}
@@ -0,0 +1,66 @@
1
+ class PluginManager {
2
+ plugins = /* @__PURE__ */ new Map();
3
+ hooks = /* @__PURE__ */ new Map();
4
+ core;
5
+ constructor(core) {
6
+ this.core = core;
7
+ }
8
+ /**
9
+ * Register a plugin
10
+ */
11
+ register(plugin) {
12
+ if (this.plugins.has(plugin.name)) {
13
+ throw new Error(`Plugin ${plugin.name} is already registered`);
14
+ }
15
+ this.plugins.set(plugin.name, plugin);
16
+ plugin.install(this.core);
17
+ }
18
+ /**
19
+ * Unregister a plugin
20
+ */
21
+ unregister(name) {
22
+ const plugin = this.plugins.get(name);
23
+ if (plugin?.uninstall) {
24
+ plugin.uninstall(this.core);
25
+ }
26
+ this.plugins.delete(name);
27
+ }
28
+ /**
29
+ * Get all registered plugins
30
+ */
31
+ getPlugins() {
32
+ return Array.from(this.plugins.values());
33
+ }
34
+ /**
35
+ * Check if a plugin is registered
36
+ */
37
+ hasPlugin(name) {
38
+ return this.plugins.has(name);
39
+ }
40
+ /**
41
+ * Execute a hook with context
42
+ */
43
+ async executeHook(hook, context) {
44
+ const handlers = this.hooks.get(hook);
45
+ if (!handlers) return;
46
+ for (const handler of handlers) {
47
+ await handler(context);
48
+ }
49
+ }
50
+ /**
51
+ * Dispose all plugins
52
+ */
53
+ async disposeAll() {
54
+ for (const plugin of this.plugins.values()) {
55
+ if (plugin.uninstall) {
56
+ await plugin.uninstall(this.core);
57
+ }
58
+ }
59
+ this.plugins.clear();
60
+ this.hooks.clear();
61
+ }
62
+ }
63
+ export {
64
+ PluginManager
65
+ };
66
+ //# sourceMappingURL=PluginManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginManager.js","sources":["../../src/plugins/PluginManager.ts"],"sourcesContent":["/**\n * PluginManager: Manages plugins for the Meframe engine\n */\n\nimport type { Plugin } from './types';\nimport type { Meframe } from '../Meframe';\n\n/**\n * Plugin manager implementation\n */\nexport class PluginManager {\n private plugins = new Map<string, Plugin>();\n private hooks = new Map<string, Set<Function>>();\n private core: Meframe;\n\n constructor(core: Meframe) {\n this.core = core;\n }\n\n /**\n * Register a plugin\n */\n register(plugin: Plugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin ${plugin.name} is already registered`);\n }\n this.plugins.set(plugin.name, plugin);\n plugin.install(this.core);\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin?.uninstall) {\n plugin.uninstall(this.core);\n }\n this.plugins.delete(name);\n }\n\n /**\n * Get all registered plugins\n */\n getPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Execute a hook with context\n */\n async executeHook(hook: string, context: any): Promise<void> {\n const handlers = this.hooks.get(hook);\n if (!handlers) return;\n\n for (const handler of handlers) {\n await handler(context);\n }\n }\n\n /**\n * Dispose all plugins\n */\n async disposeAll(): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.uninstall) {\n await plugin.uninstall(this.core);\n }\n }\n this.plugins.clear();\n this.hooks.clear();\n }\n}\n"],"names":[],"mappings":"AAUO,MAAM,cAAc;AAAA,EACjB,8BAAc,IAAA;AAAA,EACd,4BAAY,IAAA;AAAA,EACZ;AAAA,EAER,YAAY,MAAe;AACzB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAsB;AAC7B,QAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,GAAG;AACjC,YAAM,IAAI,MAAM,UAAU,OAAO,IAAI,wBAAwB;AAAA,IAC/D;AACA,SAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AACpC,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAoB;AAC7B,UAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AACpC,QAAI,QAAQ,WAAW;AACrB,aAAO,UAAU,KAAK,IAAI;AAAA,IAC5B;AACA,SAAK,QAAQ,OAAO,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAuB;AACrB,WAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAuB;AAC/B,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAc,SAA6B;AAC3D,UAAM,WAAW,KAAK,MAAM,IAAI,IAAI;AACpC,QAAI,CAAC,SAAU;AAEf,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,OAAO;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,eAAW,UAAU,KAAK,QAAQ,OAAA,GAAU;AAC1C,UAAI,OAAO,WAAW;AACpB,cAAM,OAAO,UAAU,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AACA,SAAK,QAAQ,MAAA;AACb,SAAK,MAAM,MAAA;AAAA,EACb;AACF;"}