@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,60 @@
1
+ import { MICROSECONDS_PER_SECOND } from "../model/types.js";
2
+ const DEFAULT_FPS = 30;
3
+ const DEFAULT_FRAME_TOLERANCE_US = 33333;
4
+ function normalizeFps(value) {
5
+ if (!Number.isFinite(value) || value <= 0) {
6
+ return DEFAULT_FPS;
7
+ }
8
+ return value;
9
+ }
10
+ function frameDurationFromFps(fps) {
11
+ const normalized = normalizeFps(fps);
12
+ const duration = MICROSECONDS_PER_SECOND / normalized;
13
+ return Math.max(Math.round(duration), 1);
14
+ }
15
+ function frameIndexFromTimestamp(baseTimestampUs, timestampUs, fps, strategy = "nearest") {
16
+ const frameDurationUs = frameDurationFromFps(fps);
17
+ if (frameDurationUs <= 0) {
18
+ return 0;
19
+ }
20
+ const delta = timestampUs - baseTimestampUs;
21
+ const rawIndex = delta / frameDurationUs;
22
+ if (!Number.isFinite(rawIndex)) {
23
+ return 0;
24
+ }
25
+ switch (strategy) {
26
+ case "floor":
27
+ return Math.floor(rawIndex);
28
+ case "ceil":
29
+ return Math.ceil(rawIndex);
30
+ default:
31
+ return Math.round(rawIndex);
32
+ }
33
+ }
34
+ function quantizeTimestampToFrame(timestampUs, baseTimestampUs, fps, strategy = "nearest") {
35
+ const frameDurationUs = frameDurationFromFps(fps);
36
+ const index = frameIndexFromTimestamp(baseTimestampUs, timestampUs, fps, strategy);
37
+ return baseTimestampUs + index * frameDurationUs;
38
+ }
39
+ function isTimestampWithinFrame(targetTimeUs, frameTimestampUs, frameDurationUs, toleranceUs = DEFAULT_FRAME_TOLERANCE_US) {
40
+ if (!Number.isFinite(frameTimestampUs)) {
41
+ return false;
42
+ }
43
+ const delta = Math.abs(targetTimeUs - frameTimestampUs);
44
+ if (delta <= toleranceUs) {
45
+ return true;
46
+ }
47
+ if (frameDurationUs > 0 && frameTimestampUs <= targetTimeUs) {
48
+ return targetTimeUs < frameTimestampUs + frameDurationUs;
49
+ }
50
+ return false;
51
+ }
52
+ export {
53
+ DEFAULT_FRAME_TOLERANCE_US,
54
+ frameDurationFromFps,
55
+ frameIndexFromTimestamp,
56
+ isTimestampWithinFrame,
57
+ normalizeFps,
58
+ quantizeTimestampToFrame
59
+ };
60
+ //# sourceMappingURL=time-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-utils.js","sources":["../../src/utils/time-utils.ts"],"sourcesContent":["import type { TimeUs } from '../model/types';\nimport { MICROSECONDS_PER_SECOND } from '../model/types';\n\nexport type QuantizeStrategy = 'nearest' | 'floor' | 'ceil';\n\nconst DEFAULT_FPS = 30;\n\nexport const DEFAULT_FRAME_TOLERANCE_US: TimeUs = 33_333;\n\nexport function normalizeFps(value?: number): number {\n if (!Number.isFinite(value) || (value as number) <= 0) {\n return DEFAULT_FPS;\n }\n return value as number;\n}\n\nexport function frameDurationFromFps(fps?: number): TimeUs {\n const normalized = normalizeFps(fps);\n const duration = MICROSECONDS_PER_SECOND / normalized;\n return Math.max(Math.round(duration), 1);\n}\n\nexport function frameIndexFromTimestamp(\n baseTimestampUs: TimeUs,\n timestampUs: TimeUs,\n fps?: number,\n strategy: QuantizeStrategy = 'nearest'\n): number {\n const frameDurationUs = frameDurationFromFps(fps);\n if (frameDurationUs <= 0) {\n return 0;\n }\n\n const delta = timestampUs - baseTimestampUs;\n const rawIndex = delta / frameDurationUs;\n\n if (!Number.isFinite(rawIndex)) {\n return 0;\n }\n\n switch (strategy) {\n case 'floor':\n return Math.floor(rawIndex);\n case 'ceil':\n return Math.ceil(rawIndex);\n default:\n return Math.round(rawIndex);\n }\n}\n\nexport function quantizeTimestampToFrame(\n timestampUs: TimeUs,\n baseTimestampUs: TimeUs,\n fps?: number,\n strategy: QuantizeStrategy = 'nearest'\n): TimeUs {\n const frameDurationUs = frameDurationFromFps(fps);\n const index = frameIndexFromTimestamp(baseTimestampUs, timestampUs, fps, strategy);\n return baseTimestampUs + index * frameDurationUs;\n}\n\nexport function isTimestampWithinFrame(\n targetTimeUs: TimeUs,\n frameTimestampUs: TimeUs,\n frameDurationUs: TimeUs,\n toleranceUs: TimeUs = DEFAULT_FRAME_TOLERANCE_US\n): boolean {\n if (!Number.isFinite(frameTimestampUs)) {\n return false;\n }\n\n const delta = Math.abs(targetTimeUs - frameTimestampUs);\n if (delta <= toleranceUs) {\n return true;\n }\n\n if (frameDurationUs > 0 && frameTimestampUs <= targetTimeUs) {\n return targetTimeUs < frameTimestampUs + frameDurationUs;\n }\n\n return false;\n}\n"],"names":[],"mappings":";AAKA,MAAM,cAAc;AAEb,MAAM,6BAAqC;AAE3C,SAAS,aAAa,OAAwB;AACnD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAM,SAAoB,GAAG;AACrD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,KAAsB;AACzD,QAAM,aAAa,aAAa,GAAG;AACnC,QAAM,WAAW,0BAA0B;AAC3C,SAAO,KAAK,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC;AACzC;AAEO,SAAS,wBACd,iBACA,aACA,KACA,WAA6B,WACrB;AACR,QAAM,kBAAkB,qBAAqB,GAAG;AAChD,MAAI,mBAAmB,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,cAAc;AAC5B,QAAM,WAAW,QAAQ;AAEzB,MAAI,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,UAAQ,UAAA;AAAA,IACN,KAAK;AACH,aAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B,KAAK;AACH,aAAO,KAAK,KAAK,QAAQ;AAAA,IAC3B;AACE,aAAO,KAAK,MAAM,QAAQ;AAAA,EAAA;AAEhC;AAEO,SAAS,yBACd,aACA,iBACA,KACA,WAA6B,WACrB;AACR,QAAM,kBAAkB,qBAAqB,GAAG;AAChD,QAAM,QAAQ,wBAAwB,iBAAiB,aAAa,KAAK,QAAQ;AACjF,SAAO,kBAAkB,QAAQ;AACnC;AAEO,SAAS,uBACd,cACA,kBACA,iBACA,cAAsB,4BACb;AACT,MAAI,CAAC,OAAO,SAAS,gBAAgB,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,IAAI,eAAe,gBAAgB;AACtD,MAAI,SAAS,aAAa;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,KAAK,oBAAoB,cAAc;AAC3D,WAAO,eAAe,mBAAmB;AAAA,EAC3C;AAEA,SAAO;AACT;"}
@@ -0,0 +1,44 @@
1
+ import { WorkerChannel } from './WorkerChannel';
2
+ import { WorkerStateInfo, WorkerType } from './types';
3
+ import { EventBus } from '../event/EventBus';
4
+ import { EventPayloadMap } from '../event/events';
5
+
6
+ export interface BaseWorkerConfig {
7
+ type: WorkerType;
8
+ url: string;
9
+ eventBus: EventBus<EventPayloadMap>;
10
+ clipId?: string;
11
+ }
12
+ export declare class BaseWorker {
13
+ private worker;
14
+ readonly channel: WorkerChannel;
15
+ private state;
16
+ private taskCount;
17
+ private lastError?;
18
+ readonly type: WorkerType;
19
+ readonly clipId?: string;
20
+ private eventBus;
21
+ constructor(config: BaseWorkerConfig);
22
+ private setupErrorHandling;
23
+ initialize(config?: any): Promise<void>;
24
+ sendStream<T = Uint8Array>(stream: ReadableStream<T>, metadata?: {
25
+ type?: string;
26
+ url?: string;
27
+ streamId?: string;
28
+ [key: string]: any;
29
+ }): Promise<void>;
30
+ send<T = any, R = any>(command: string, payload?: T, options?: {
31
+ timeout?: number;
32
+ transfer?: Transferable[];
33
+ signal?: AbortSignal;
34
+ }): Promise<R>;
35
+ receiveStream(onStream: (stream: ReadableStream, metadata?: Record<string, any>) => void): void;
36
+ notify(command: string, payload?: any, transfer?: Transferable[]): void;
37
+ get port(): MessagePort;
38
+ getChannel(): WorkerChannel;
39
+ terminate(): void;
40
+ get status(): WorkerStateInfo;
41
+ getWorkerId(): string;
42
+ onError?(error: Error): void;
43
+ }
44
+ //# sourceMappingURL=BaseWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseWorker.d.ts","sourceRoot":"","sources":["../../src/worker/BaseWorker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAC,CAAQ;IAE1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,MAAM,EAAE,gBAAgB;IAcpC,OAAO,CAAC,kBAAkB;IAcpB,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvC,UAAU,CAAC,CAAC,GAAG,UAAU,EAC7B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,GACA,OAAO,CAAC,IAAI,CAAC;IAIV,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,CAAC,EACX,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GACA,OAAO,CAAC,CAAC,CAAC;IAeb,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI;IAI/F,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI;IAIvE,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED,UAAU,IAAI,aAAa;IAI3B,SAAS,IAAI,IAAI;IAOjB,IAAI,MAAM,IAAI,eAAe,CAM5B;IAED,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAC7B"}
@@ -0,0 +1,98 @@
1
+ import { WorkerChannel } from "./WorkerChannel.js";
2
+ import { WorkerMessageType } from "./types.js";
3
+ import { MeframeEvent } from "../event/events.js";
4
+ class BaseWorker {
5
+ worker;
6
+ channel;
7
+ state = "idle";
8
+ taskCount = 0;
9
+ lastError;
10
+ type;
11
+ clipId;
12
+ eventBus;
13
+ constructor(config) {
14
+ this.type = config.type;
15
+ this.clipId = config.clipId;
16
+ this.eventBus = config.eventBus;
17
+ this.worker = new Worker(config.url, { type: "module" });
18
+ this.channel = new WorkerChannel(this.worker, {
19
+ name: this.getWorkerId(),
20
+ timeout: 3e4
21
+ });
22
+ this.setupErrorHandling();
23
+ }
24
+ setupErrorHandling() {
25
+ this.worker.onerror = (error) => {
26
+ this.state = "error";
27
+ this.lastError = new Error(error.message || "Worker error");
28
+ this.onError?.(this.lastError);
29
+ this.eventBus.emit(MeframeEvent.WorkerError, {
30
+ type: this.type,
31
+ workerId: this.getWorkerId(),
32
+ error: this.lastError
33
+ });
34
+ };
35
+ }
36
+ async initialize(config) {
37
+ this.eventBus.emit(MeframeEvent.WorkerStarted, {
38
+ type: this.type,
39
+ workerId: this.getWorkerId()
40
+ });
41
+ await this.channel.send(WorkerMessageType.Configure, {
42
+ config,
43
+ initial: true
44
+ });
45
+ this.eventBus.emit(MeframeEvent.WorkerReady, {
46
+ type: this.type,
47
+ workerId: this.getWorkerId()
48
+ });
49
+ }
50
+ async sendStream(stream, metadata) {
51
+ await this.channel.sendStream(stream, metadata);
52
+ }
53
+ async send(command, payload, options) {
54
+ this.taskCount++;
55
+ this.state = "busy";
56
+ try {
57
+ const result = await this.channel.send(command, payload, options);
58
+ return result;
59
+ } finally {
60
+ this.taskCount--;
61
+ if (this.taskCount === 0) {
62
+ this.state = "idle";
63
+ }
64
+ }
65
+ }
66
+ receiveStream(onStream) {
67
+ this.channel.receiveStream(onStream);
68
+ }
69
+ notify(command, payload, transfer) {
70
+ this.channel.notify(command, payload, transfer);
71
+ }
72
+ get port() {
73
+ return this.channel.port;
74
+ }
75
+ getChannel() {
76
+ return this.channel;
77
+ }
78
+ terminate() {
79
+ this.channel.dispose();
80
+ this.worker.terminate();
81
+ this.state = "terminated";
82
+ this.taskCount = 0;
83
+ }
84
+ get status() {
85
+ return {
86
+ state: this.state,
87
+ taskCount: this.taskCount,
88
+ lastError: this.lastError?.message
89
+ };
90
+ }
91
+ getWorkerId() {
92
+ return this.clipId ? `${this.type}#${this.clipId}` : this.type;
93
+ }
94
+ }
95
+ export {
96
+ BaseWorker
97
+ };
98
+ //# sourceMappingURL=BaseWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseWorker.js","sources":["../../src/worker/BaseWorker.ts"],"sourcesContent":["/**\n * BaseWorker: Lightweight wrapper for Worker + WorkerChannel\n * Provides a thin abstraction over Web Worker with state management\n */\n\nimport { WorkerChannel } from './WorkerChannel';\nimport { WorkerMessageType, type WorkerStateInfo, type WorkerType } from './types';\nimport type { EventBus } from '../event/EventBus';\nimport { MeframeEvent, type EventPayloadMap } from '../event/events';\n\nexport interface BaseWorkerConfig {\n type: WorkerType;\n url: string;\n eventBus: EventBus<EventPayloadMap>;\n clipId?: string;\n}\n\nexport class BaseWorker {\n private worker: Worker;\n readonly channel: WorkerChannel;\n private state: WorkerStateInfo['state'] = 'idle';\n private taskCount = 0;\n private lastError?: Error;\n\n readonly type: WorkerType;\n readonly clipId?: string;\n private eventBus: EventBus<EventPayloadMap>;\n\n constructor(config: BaseWorkerConfig) {\n this.type = config.type;\n this.clipId = config.clipId;\n this.eventBus = config.eventBus;\n\n this.worker = new Worker(config.url, { type: 'module' });\n this.channel = new WorkerChannel(this.worker, {\n name: this.getWorkerId(),\n timeout: 30000,\n });\n\n this.setupErrorHandling();\n }\n\n private setupErrorHandling(): void {\n this.worker.onerror = (error) => {\n this.state = 'error';\n this.lastError = new Error(error.message || 'Worker error');\n this.onError?.(this.lastError);\n\n this.eventBus.emit(MeframeEvent.WorkerError, {\n type: this.type,\n workerId: this.getWorkerId(),\n error: this.lastError,\n });\n };\n }\n\n async initialize(config?: any): Promise<void> {\n this.eventBus.emit(MeframeEvent.WorkerStarted, {\n type: this.type,\n workerId: this.getWorkerId(),\n });\n await this.channel.send(WorkerMessageType.Configure, {\n config,\n initial: true,\n });\n\n this.eventBus.emit(MeframeEvent.WorkerReady, {\n type: this.type,\n workerId: this.getWorkerId(),\n });\n }\n\n async sendStream<T = Uint8Array>(\n stream: ReadableStream<T>,\n metadata?: {\n type?: string;\n url?: string;\n streamId?: string;\n [key: string]: any;\n }\n ): Promise<void> {\n await this.channel.sendStream(stream, metadata);\n }\n\n async send<T = any, R = any>(\n command: string,\n payload?: T,\n options?: {\n timeout?: number;\n transfer?: Transferable[];\n signal?: AbortSignal;\n }\n ): Promise<R> {\n this.taskCount++;\n this.state = 'busy';\n\n try {\n const result = await this.channel.send(command as any, payload, options);\n return result as R;\n } finally {\n this.taskCount--;\n if (this.taskCount === 0) {\n this.state = 'idle';\n }\n }\n }\n\n receiveStream(onStream: (stream: ReadableStream, metadata?: Record<string, any>) => void): void {\n this.channel.receiveStream(onStream);\n }\n\n notify(command: string, payload?: any, transfer?: Transferable[]): void {\n this.channel.notify(command, payload, transfer);\n }\n\n get port(): MessagePort {\n return this.channel.port as unknown as MessagePort;\n }\n\n getChannel(): WorkerChannel {\n return this.channel;\n }\n\n terminate(): void {\n this.channel.dispose();\n this.worker.terminate();\n this.state = 'terminated';\n this.taskCount = 0;\n }\n\n get status(): WorkerStateInfo {\n return {\n state: this.state,\n taskCount: this.taskCount,\n lastError: this.lastError?.message,\n };\n }\n\n getWorkerId(): string {\n return this.clipId ? `${this.type}#${this.clipId}` : this.type;\n }\n\n onError?(error: Error): void;\n}\n"],"names":[],"mappings":";;;AAiBO,MAAM,WAAW;AAAA,EACd;AAAA,EACC;AAAA,EACD,QAAkC;AAAA,EAClC,YAAY;AAAA,EACZ;AAAA,EAEC;AAAA,EACA;AAAA,EACD;AAAA,EAER,YAAY,QAA0B;AACpC,SAAK,OAAO,OAAO;AACnB,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW,OAAO;AAEvB,SAAK,SAAS,IAAI,OAAO,OAAO,KAAK,EAAE,MAAM,UAAU;AACvD,SAAK,UAAU,IAAI,cAAc,KAAK,QAAQ;AAAA,MAC5C,MAAM,KAAK,YAAA;AAAA,MACX,SAAS;AAAA,IAAA,CACV;AAED,SAAK,mBAAA;AAAA,EACP;AAAA,EAEQ,qBAA2B;AACjC,SAAK,OAAO,UAAU,CAAC,UAAU;AAC/B,WAAK,QAAQ;AACb,WAAK,YAAY,IAAI,MAAM,MAAM,WAAW,cAAc;AAC1D,WAAK,UAAU,KAAK,SAAS;AAE7B,WAAK,SAAS,KAAK,aAAa,aAAa;AAAA,QAC3C,MAAM,KAAK;AAAA,QACX,UAAU,KAAK,YAAA;AAAA,QACf,OAAO,KAAK;AAAA,MAAA,CACb;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAA6B;AAC5C,SAAK,SAAS,KAAK,aAAa,eAAe;AAAA,MAC7C,MAAM,KAAK;AAAA,MACX,UAAU,KAAK,YAAA;AAAA,IAAY,CAC5B;AACD,UAAM,KAAK,QAAQ,KAAK,kBAAkB,WAAW;AAAA,MACnD;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAED,SAAK,SAAS,KAAK,aAAa,aAAa;AAAA,MAC3C,MAAM,KAAK;AAAA,MACX,UAAU,KAAK,YAAA;AAAA,IAAY,CAC5B;AAAA,EACH;AAAA,EAEA,MAAM,WACJ,QACA,UAMe;AACf,UAAM,KAAK,QAAQ,WAAW,QAAQ,QAAQ;AAAA,EAChD;AAAA,EAEA,MAAM,KACJ,SACA,SACA,SAKY;AACZ,SAAK;AACL,SAAK,QAAQ;AAEb,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,SAAgB,SAAS,OAAO;AACvE,aAAO;AAAA,IACT,UAAA;AACE,WAAK;AACL,UAAI,KAAK,cAAc,GAAG;AACxB,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,UAAkF;AAC9F,SAAK,QAAQ,cAAc,QAAQ;AAAA,EACrC;AAAA,EAEA,OAAO,SAAiB,SAAe,UAAiC;AACtE,SAAK,QAAQ,OAAO,SAAS,SAAS,QAAQ;AAAA,EAChD;AAAA,EAEA,IAAI,OAAoB;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,aAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAkB;AAChB,SAAK,QAAQ,QAAA;AACb,SAAK,OAAO,UAAA;AACZ,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAI,SAA0B;AAC5B,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK,WAAW;AAAA,IAAA;AAAA,EAE/B;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,KAAK;AAAA,EAC5D;AAGF;"}
@@ -0,0 +1,105 @@
1
+ import { WorkerMessageType, PendingRequest, MessageHandler, MessageHandlers, WorkerState, PortLike } from './types';
2
+ import { RetryConfig } from './worker-retry';
3
+
4
+ export interface WorkerChannelConfig {
5
+ name: string;
6
+ timeout?: number;
7
+ maxRetries?: number;
8
+ }
9
+ export declare class WorkerChannel {
10
+ name: string;
11
+ port: PortLike;
12
+ pendingRequests: Map<string, PendingRequest>;
13
+ messageHandlers: MessageHandlers;
14
+ state: WorkerState;
15
+ defaultTimeout: number;
16
+ defaultMaxRetries: number;
17
+ constructor(port: PortLike, config: WorkerChannelConfig);
18
+ /**
19
+ * Send a message and wait for response with retry support
20
+ */
21
+ send<T = any, R = any>(type: WorkerMessageType, payload?: T, options?: {
22
+ timeout?: number;
23
+ maxRetries?: number;
24
+ transfer?: Transferable[];
25
+ retryConfig?: Partial<RetryConfig>;
26
+ }): Promise<R>;
27
+ /**
28
+ * Send a message once (without retry)
29
+ */
30
+ private sendOnce;
31
+ /**
32
+ * Send a message without waiting for response
33
+ */
34
+ post<T = any>(type: WorkerMessageType, payload?: T, transfer?: Transferable[]): void;
35
+ /**
36
+ * Register a message handler
37
+ */
38
+ on<T = any, R = any>(type: WorkerMessageType, handler: MessageHandler<T, R>): void;
39
+ /**
40
+ * Unregister a message handler
41
+ */
42
+ off(type: WorkerMessageType): void;
43
+ /**
44
+ * Dispose the channel
45
+ */
46
+ dispose(): void;
47
+ /**
48
+ * Setup message handler for incoming messages
49
+ */
50
+ private setupMessageHandler;
51
+ /**
52
+ * Handle incoming request
53
+ */
54
+ private handleRequest;
55
+ /**
56
+ * Handle incoming response
57
+ */
58
+ private handleResponse;
59
+ /**
60
+ * Send a response message
61
+ */
62
+ private sendResponse;
63
+ /**
64
+ * Check if message is a response
65
+ */
66
+ private isResponse;
67
+ /**
68
+ * Check if message is a request
69
+ */
70
+ private isRequest;
71
+ /**
72
+ * Generate unique message ID
73
+ */
74
+ private generateMessageId;
75
+ /**
76
+ * Send a notification message without waiting for response
77
+ * Alias for post() method for compatibility
78
+ */
79
+ notify<T = any>(type: WorkerMessageType | string, payload?: T, transfer?: Transferable[]): void;
80
+ /**
81
+ * Register a message handler
82
+ * Alias for on() method for compatibility
83
+ */
84
+ registerHandler<T = any, R = any>(type: WorkerMessageType | string, handler: MessageHandler<T, R>): void;
85
+ /**
86
+ * Send a ReadableStream to another worker
87
+ * Automatically handles transferable streams vs chunk-by-chunk fallback
88
+ */
89
+ sendStream<T = Uint8Array>(stream: ReadableStream<T>, metadata?: {
90
+ type?: string;
91
+ url?: string;
92
+ streamId?: string;
93
+ [key: string]: any;
94
+ }): Promise<void>;
95
+ /**
96
+ * Stream chunks from a ReadableStream (fallback when transfer is not supported)
97
+ */
98
+ private streamChunks;
99
+ /**
100
+ * Receive a stream from another worker
101
+ * Handles both transferable streams and chunk-by-chunk reconstruction
102
+ */
103
+ receiveStream<T = Uint8Array>(onStream: (stream: ReadableStream<T>, metadata?: Record<string, any>) => void): Promise<void>;
104
+ }
105
+ //# sourceMappingURL=WorkerChannel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerChannel.d.ts","sourceRoot":"","sources":["../../src/worker/WorkerChannel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,355 @@
1
+ import { WorkerState } from "./types.js";
2
+ import { withRetry, defaultRetryConfig } from "./worker-retry.js";
3
+ import { isTransferable, extractTransferables } from "./transferable-helper.js";
4
+ class WorkerChannel {
5
+ name;
6
+ port;
7
+ pendingRequests = /* @__PURE__ */ new Map();
8
+ messageHandlers = {};
9
+ state = WorkerState.Idle;
10
+ defaultTimeout;
11
+ defaultMaxRetries;
12
+ constructor(port, config) {
13
+ this.name = config.name;
14
+ this.port = port;
15
+ this.defaultTimeout = config.timeout ?? 3e4;
16
+ this.defaultMaxRetries = config.maxRetries ?? 3;
17
+ this.setupMessageHandler();
18
+ this.state = WorkerState.Ready;
19
+ }
20
+ /**
21
+ * Send a message and wait for response with retry support
22
+ */
23
+ async send(type, payload, options) {
24
+ const maxRetries = options?.maxRetries ?? this.defaultMaxRetries;
25
+ const retryConfig = {
26
+ ...defaultRetryConfig,
27
+ maxRetries,
28
+ ...options?.retryConfig
29
+ };
30
+ return withRetry(() => this.sendOnce(type, payload, options), retryConfig);
31
+ }
32
+ /**
33
+ * Send a message once (without retry)
34
+ */
35
+ async sendOnce(type, payload, options) {
36
+ const id = this.generateMessageId();
37
+ const timeout = options?.timeout ?? this.defaultTimeout;
38
+ const message = {
39
+ type,
40
+ id,
41
+ payload,
42
+ timestamp: Date.now()
43
+ };
44
+ return new Promise((resolve, reject) => {
45
+ const request = {
46
+ id,
47
+ type,
48
+ timestamp: Date.now(),
49
+ timeout,
50
+ resolve,
51
+ reject
52
+ };
53
+ this.pendingRequests.set(id, request);
54
+ const timeoutId = setTimeout(() => {
55
+ const pending = this.pendingRequests.get(id);
56
+ if (pending) {
57
+ this.pendingRequests.delete(id);
58
+ const error = new Error(`Request timeout: ${id} ${type} (${timeout}ms)`);
59
+ error.code = "TIMEOUT";
60
+ pending.reject(error);
61
+ }
62
+ }, timeout);
63
+ request.timeoutId = timeoutId;
64
+ if (options?.transfer) {
65
+ this.port.postMessage(message, options.transfer);
66
+ } else {
67
+ this.port.postMessage(message);
68
+ }
69
+ });
70
+ }
71
+ /**
72
+ * Send a message without waiting for response
73
+ */
74
+ post(type, payload, transfer) {
75
+ const message = {
76
+ type,
77
+ id: this.generateMessageId(),
78
+ payload,
79
+ timestamp: Date.now()
80
+ };
81
+ if (transfer) {
82
+ this.port.postMessage(message, transfer);
83
+ } else {
84
+ this.port.postMessage(message);
85
+ }
86
+ }
87
+ /**
88
+ * Register a message handler
89
+ */
90
+ on(type, handler) {
91
+ this.messageHandlers[type] = handler;
92
+ }
93
+ /**
94
+ * Unregister a message handler
95
+ */
96
+ off(type) {
97
+ delete this.messageHandlers[type];
98
+ }
99
+ /**
100
+ * Dispose the channel
101
+ */
102
+ dispose() {
103
+ this.state = WorkerState.Disposed;
104
+ for (const [, request] of this.pendingRequests) {
105
+ if (request.timeoutId) {
106
+ clearTimeout(request.timeoutId);
107
+ }
108
+ request.reject(new Error("Channel disposed"));
109
+ }
110
+ this.pendingRequests.clear();
111
+ this.port.onmessage = null;
112
+ }
113
+ /**
114
+ * Setup message handler for incoming messages
115
+ */
116
+ setupMessageHandler() {
117
+ this.port.onmessage = async (event) => {
118
+ const data = event.data;
119
+ if (this.isResponse(data)) {
120
+ this.handleResponse(data);
121
+ return;
122
+ }
123
+ if (this.isRequest(data)) {
124
+ await this.handleRequest(data);
125
+ return;
126
+ }
127
+ };
128
+ }
129
+ /**
130
+ * Handle incoming request
131
+ */
132
+ async handleRequest(message) {
133
+ const handler = this.messageHandlers[message.type];
134
+ if (!handler) {
135
+ this.sendResponse(message.id, false, null, {
136
+ code: "NO_HANDLER",
137
+ message: `No handler registered for message type: ${message.type}`
138
+ });
139
+ return;
140
+ }
141
+ this.state = WorkerState.Processing;
142
+ Promise.resolve().then(() => handler(message.payload, message.transfer)).then((result) => {
143
+ this.sendResponse(message.id, true, result);
144
+ this.state = WorkerState.Ready;
145
+ }).catch((error) => {
146
+ const workerError = {
147
+ code: "HANDLER_ERROR",
148
+ message: error instanceof Error ? error.message : String(error),
149
+ stack: error instanceof Error ? error.stack : void 0
150
+ };
151
+ this.sendResponse(message.id, false, null, workerError);
152
+ this.state = WorkerState.Ready;
153
+ });
154
+ }
155
+ /**
156
+ * Handle incoming response
157
+ */
158
+ handleResponse(response) {
159
+ const request = this.pendingRequests.get(response.id);
160
+ if (!request) {
161
+ return;
162
+ }
163
+ this.pendingRequests.delete(response.id);
164
+ if (request.timeoutId) {
165
+ clearTimeout(request.timeoutId);
166
+ }
167
+ if (response.success) {
168
+ request.resolve(response.result);
169
+ } else {
170
+ const error = new Error(response.error?.message || "Unknown error");
171
+ if (response.error) {
172
+ Object.assign(error, response.error);
173
+ }
174
+ request.reject(error);
175
+ }
176
+ }
177
+ /**
178
+ * Send a response message
179
+ */
180
+ sendResponse(id, success, result, error) {
181
+ let transfer = [];
182
+ if (isTransferable(result)) {
183
+ transfer.push(result);
184
+ }
185
+ const response = {
186
+ id,
187
+ success,
188
+ result,
189
+ error,
190
+ timestamp: Date.now()
191
+ };
192
+ this.port.postMessage(response, transfer);
193
+ }
194
+ /**
195
+ * Check if message is a response
196
+ */
197
+ isResponse(data) {
198
+ return data && typeof data === "object" && "id" in data && "success" in data && !("type" in data);
199
+ }
200
+ /**
201
+ * Check if message is a request
202
+ */
203
+ isRequest(data) {
204
+ return data && typeof data === "object" && "id" in data && "type" in data;
205
+ }
206
+ /**
207
+ * Generate unique message ID
208
+ */
209
+ generateMessageId() {
210
+ return `${this.name}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
211
+ }
212
+ /**
213
+ * Send a notification message without waiting for response
214
+ * Alias for post() method for compatibility
215
+ */
216
+ notify(type, payload, transfer) {
217
+ this.post(type, payload, transfer);
218
+ }
219
+ /**
220
+ * Register a message handler
221
+ * Alias for on() method for compatibility
222
+ */
223
+ registerHandler(type, handler) {
224
+ this.on(type, handler);
225
+ }
226
+ /**
227
+ * Send a ReadableStream to another worker
228
+ * Automatically handles transferable streams vs chunk-by-chunk fallback
229
+ */
230
+ async sendStream(stream, metadata) {
231
+ const streamId = metadata?.streamId || this.generateMessageId();
232
+ if (isTransferable(stream)) {
233
+ this.port.postMessage(
234
+ {
235
+ type: "stream_transfer",
236
+ ...metadata,
237
+ stream,
238
+ streamId
239
+ },
240
+ [stream]
241
+ // Transfer ownership
242
+ );
243
+ } else {
244
+ await this.streamChunks(stream, streamId, metadata);
245
+ }
246
+ }
247
+ /**
248
+ * Stream chunks from a ReadableStream (fallback when transfer is not supported)
249
+ */
250
+ async streamChunks(stream, streamId, metadata) {
251
+ const reader = stream.getReader();
252
+ this.post("stream_start", {
253
+ streamId,
254
+ ...metadata,
255
+ mode: "chunk_transfer"
256
+ });
257
+ try {
258
+ while (true) {
259
+ const { done, value } = await reader.read();
260
+ if (done) {
261
+ this.post("stream_end", {
262
+ streamId,
263
+ ...metadata
264
+ });
265
+ break;
266
+ }
267
+ const transfer = [];
268
+ if (value instanceof ArrayBuffer) {
269
+ transfer.push(value);
270
+ } else if (value instanceof Uint8Array) {
271
+ transfer.push(value.buffer);
272
+ } else if (typeof AudioData !== "undefined" && value instanceof AudioData) {
273
+ transfer.push(value);
274
+ } else if (typeof VideoFrame !== "undefined" && value instanceof VideoFrame) {
275
+ transfer.push(value);
276
+ } else if (typeof value === "object" && value !== null) {
277
+ const extracted = extractTransferables(value);
278
+ transfer.push(...extracted);
279
+ }
280
+ this.post(
281
+ "stream_chunk",
282
+ {
283
+ streamId,
284
+ chunk: value,
285
+ ...metadata
286
+ },
287
+ transfer
288
+ );
289
+ }
290
+ } catch (error) {
291
+ this.post("stream_error", {
292
+ streamId,
293
+ error: error instanceof Error ? error.message : String(error),
294
+ ...metadata
295
+ });
296
+ throw error;
297
+ } finally {
298
+ reader.releaseLock();
299
+ }
300
+ }
301
+ /**
302
+ * Receive a stream from another worker
303
+ * Handles both transferable streams and chunk-by-chunk reconstruction
304
+ */
305
+ async receiveStream(onStream) {
306
+ const chunkedStreams = /* @__PURE__ */ new Map();
307
+ const prev = this.port.onmessage;
308
+ const handler = (event) => {
309
+ const raw = event.data;
310
+ const envelopeType = raw?.type;
311
+ const hasPayload = raw && typeof raw === "object" && "payload" in raw;
312
+ const payload = hasPayload ? raw.payload : raw;
313
+ if (envelopeType === "stream_transfer" && payload?.stream) {
314
+ onStream(payload.stream, payload);
315
+ return;
316
+ }
317
+ if (envelopeType === "stream_start" && payload?.streamId) {
318
+ const stream = new ReadableStream({
319
+ start(controller) {
320
+ chunkedStreams.set(payload.streamId, { controller, metadata: payload });
321
+ }
322
+ });
323
+ onStream(stream, payload);
324
+ return;
325
+ }
326
+ if (envelopeType === "stream_chunk" && payload?.streamId && chunkedStreams.has(payload.streamId)) {
327
+ const s = chunkedStreams.get(payload.streamId);
328
+ if (s) s.controller.enqueue(payload.chunk);
329
+ return;
330
+ }
331
+ if (envelopeType === "stream_end" && payload?.streamId && chunkedStreams.has(payload.streamId)) {
332
+ const s = chunkedStreams.get(payload.streamId);
333
+ if (s) {
334
+ s.controller.close();
335
+ chunkedStreams.delete(payload.streamId);
336
+ }
337
+ return;
338
+ }
339
+ if (envelopeType === "stream_error" && payload?.streamId && chunkedStreams.has(payload.streamId)) {
340
+ const s = chunkedStreams.get(payload.streamId);
341
+ if (s) {
342
+ s.controller.error(new Error(String(payload.error || "stream error")));
343
+ chunkedStreams.delete(payload.streamId);
344
+ }
345
+ return;
346
+ }
347
+ if (typeof prev === "function") prev.call(this.port, event);
348
+ };
349
+ this.port.onmessage = handler;
350
+ }
351
+ }
352
+ export {
353
+ WorkerChannel
354
+ };
355
+ //# sourceMappingURL=WorkerChannel.js.map