@blockcast/mmt-container 0.1.0-main.149f78a4adae

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 (678) hide show
  1. package/README.md +432 -0
  2. package/dist/.build-stamp +0 -0
  3. package/dist/__tests__/test-utils.d.ts +71 -0
  4. package/dist/__tests__/test-utils.d.ts.map +1 -0
  5. package/dist/align.d.ts +148 -0
  6. package/dist/align.d.ts.map +1 -0
  7. package/dist/align.js +88 -0
  8. package/dist/align.js.map +7 -0
  9. package/dist/audio-init-parser.d.ts +66 -0
  10. package/dist/audio-init-parser.d.ts.map +1 -0
  11. package/dist/audio-init-parser.js +118 -0
  12. package/dist/audio-init-parser.js.map +7 -0
  13. package/dist/audio-ring-buffer.d.ts +50 -0
  14. package/dist/audio-ring-buffer.d.ts.map +1 -0
  15. package/dist/audio-ring-buffer.js +93 -0
  16. package/dist/audio-ring-buffer.js.map +7 -0
  17. package/dist/authored-timing.d.ts +32 -0
  18. package/dist/authored-timing.d.ts.map +1 -0
  19. package/dist/authored-timing.js +32 -0
  20. package/dist/authored-timing.js.map +7 -0
  21. package/dist/browser-runtime.js +17109 -0
  22. package/dist/browser-runtime.js.map +7 -0
  23. package/dist/carp-catalog.d.ts +318 -0
  24. package/dist/carp-catalog.d.ts.map +1 -0
  25. package/dist/carp-catalog.js +549 -0
  26. package/dist/carp-catalog.js.map +7 -0
  27. package/dist/catalog-fec-params.d.ts +82 -0
  28. package/dist/catalog-fec-params.d.ts.map +1 -0
  29. package/dist/catalog-fec-params.js +66 -0
  30. package/dist/catalog-fec-params.js.map +7 -0
  31. package/dist/catalog-network-source.d.ts +19 -0
  32. package/dist/catalog-network-source.d.ts.map +1 -0
  33. package/dist/catalog-network-source.js +22 -0
  34. package/dist/catalog-network-source.js.map +7 -0
  35. package/dist/catalog-validator.d.ts +18 -0
  36. package/dist/catalog-validator.d.ts.map +1 -0
  37. package/dist/catalog-validator.js +7747 -0
  38. package/dist/catalog-validator.js.map +7 -0
  39. package/dist/cmaf-block-assembler.d.ts +168 -0
  40. package/dist/cmaf-block-assembler.d.ts.map +1 -0
  41. package/dist/cmaf-block-assembler.js +1755 -0
  42. package/dist/cmaf-block-assembler.js.map +7 -0
  43. package/dist/cmaf-group-batcher.d.ts +38 -0
  44. package/dist/cmaf-group-batcher.d.ts.map +1 -0
  45. package/dist/cmaf-group-batcher.js +195 -0
  46. package/dist/cmaf-group-batcher.js.map +7 -0
  47. package/dist/cmcd-producer.d.ts +104 -0
  48. package/dist/cmcd-producer.d.ts.map +1 -0
  49. package/dist/cmcd-producer.js +207 -0
  50. package/dist/cmcd-producer.js.map +7 -0
  51. package/dist/codec-utils.d.ts +235 -0
  52. package/dist/codec-utils.d.ts.map +1 -0
  53. package/dist/codec-utils.js +1225 -0
  54. package/dist/codec-utils.js.map +7 -0
  55. package/dist/fec-codec.d.ts +32 -0
  56. package/dist/fec-codec.d.ts.map +1 -0
  57. package/dist/fec-codec.js +47 -0
  58. package/dist/fec-codec.js.map +7 -0
  59. package/dist/fec-manager.d.ts +266 -0
  60. package/dist/fec-manager.d.ts.map +1 -0
  61. package/dist/fec-manager.js +1447 -0
  62. package/dist/fec-manager.js.map +7 -0
  63. package/dist/fec-starvation-detector.d.ts +59 -0
  64. package/dist/fec-starvation-detector.d.ts.map +1 -0
  65. package/dist/fec-starvation-detector.js +75 -0
  66. package/dist/fec-starvation-detector.js.map +7 -0
  67. package/dist/fec-worker-setup.d.ts +76 -0
  68. package/dist/fec-worker-setup.d.ts.map +1 -0
  69. package/dist/fec-worker-setup.js +603 -0
  70. package/dist/fec-worker-setup.js.map +7 -0
  71. package/dist/fmp4-completion.d.ts +30 -0
  72. package/dist/fmp4-completion.d.ts.map +1 -0
  73. package/dist/fmp4-completion.js +21 -0
  74. package/dist/fmp4-completion.js.map +7 -0
  75. package/dist/fmp4-reader.d.ts +37 -0
  76. package/dist/fmp4-reader.d.ts.map +1 -0
  77. package/dist/fmp4-reader.js +100 -0
  78. package/dist/fmp4-reader.js.map +7 -0
  79. package/dist/index.d.ts +47 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +330 -0
  82. package/dist/index.js.map +7 -0
  83. package/dist/iso-bmff-timing.d.ts +47 -0
  84. package/dist/iso-bmff-timing.d.ts.map +1 -0
  85. package/dist/iso-bmff-timing.js +526 -0
  86. package/dist/iso-bmff-timing.js.map +7 -0
  87. package/dist/loc.d.ts +68 -0
  88. package/dist/loc.d.ts.map +1 -0
  89. package/dist/loc.js +143 -0
  90. package/dist/loc.js.map +7 -0
  91. package/dist/manifest-auth-plan.d.ts +30 -0
  92. package/dist/manifest-auth-plan.d.ts.map +1 -0
  93. package/dist/manifest-auth-plan.js +1267 -0
  94. package/dist/manifest-auth-plan.js.map +7 -0
  95. package/dist/media-router.d.ts +338 -0
  96. package/dist/media-router.d.ts.map +1 -0
  97. package/dist/media-router.js +802 -0
  98. package/dist/media-router.js.map +7 -0
  99. package/dist/mfu-reassembler.d.ts +264 -0
  100. package/dist/mfu-reassembler.d.ts.map +1 -0
  101. package/dist/mfu-reassembler.js +2668 -0
  102. package/dist/mfu-reassembler.js.map +7 -0
  103. package/dist/mfu-reassembly-policy.d.ts +24 -0
  104. package/dist/mfu-reassembly-policy.d.ts.map +1 -0
  105. package/dist/mfu-reassembly-policy.js +99 -0
  106. package/dist/mfu-reassembly-policy.js.map +7 -0
  107. package/dist/mmtp-container-parser.d.ts +304 -0
  108. package/dist/mmtp-container-parser.d.ts.map +1 -0
  109. package/dist/mmtp-container-parser.js +5378 -0
  110. package/dist/mmtp-container-parser.js.map +7 -0
  111. package/dist/mmtp-container-parser.no-modules.js +7853 -0
  112. package/dist/mmtp-container-parser.no-modules.js.map +7 -0
  113. package/dist/mmtp-decode-pipeline.d.ts +96 -0
  114. package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
  115. package/dist/mmtp-decode-pipeline.js +5589 -0
  116. package/dist/mmtp-decode-pipeline.js.map +7 -0
  117. package/dist/mmtp-router.d.ts +383 -0
  118. package/dist/mmtp-router.d.ts.map +1 -0
  119. package/dist/mmtp-router.js +8384 -0
  120. package/dist/mmtp-router.js.map +7 -0
  121. package/dist/mmtp-to-cmaf.d.ts +166 -0
  122. package/dist/mmtp-to-cmaf.d.ts.map +1 -0
  123. package/dist/mmtp-to-cmaf.js +781 -0
  124. package/dist/mmtp-to-cmaf.js.map +7 -0
  125. package/dist/multicast-auth-catalog.d.ts +115 -0
  126. package/dist/multicast-auth-catalog.d.ts.map +1 -0
  127. package/dist/multicast-auth-catalog.js +202 -0
  128. package/dist/multicast-auth-catalog.js.map +7 -0
  129. package/dist/multicast-input.d.ts +107 -0
  130. package/dist/multicast-input.d.ts.map +1 -0
  131. package/dist/multicast-input.js +256 -0
  132. package/dist/multicast-input.js.map +7 -0
  133. package/dist/multicast-manager.d.ts +330 -0
  134. package/dist/multicast-manager.d.ts.map +1 -0
  135. package/dist/multicast-manager.js +11032 -0
  136. package/dist/multicast-manager.js.map +7 -0
  137. package/dist/multicast-transport.d.ts +62 -0
  138. package/dist/multicast-transport.d.ts.map +1 -0
  139. package/dist/multicast-transport.js +338 -0
  140. package/dist/multicast-transport.js.map +7 -0
  141. package/dist/multicast-unwrap.d.ts +57 -0
  142. package/dist/multicast-unwrap.d.ts.map +1 -0
  143. package/dist/multicast-unwrap.js +384 -0
  144. package/dist/multicast-unwrap.js.map +7 -0
  145. package/dist/no-modules.d.ts +9 -0
  146. package/dist/no-modules.d.ts.map +1 -0
  147. package/dist/no-modules.js +7819 -0
  148. package/dist/no-modules.js.map +7 -0
  149. package/dist/phase14-catalog-override.d.ts +126 -0
  150. package/dist/phase14-catalog-override.d.ts.map +1 -0
  151. package/dist/phase14-catalog-override.js +155 -0
  152. package/dist/phase14-catalog-override.js.map +7 -0
  153. package/dist/repair-fetch.d.ts +58 -0
  154. package/dist/repair-fetch.d.ts.map +1 -0
  155. package/dist/repair-fetch.js +117 -0
  156. package/dist/repair-fetch.js.map +7 -0
  157. package/dist/sample-combiner.d.ts +182 -0
  158. package/dist/sample-combiner.d.ts.map +1 -0
  159. package/dist/sample-combiner.js +571 -0
  160. package/dist/sample-combiner.js.map +7 -0
  161. package/dist/signaling.d.ts +29 -0
  162. package/dist/signaling.d.ts.map +1 -0
  163. package/dist/signaling.js +232 -0
  164. package/dist/signaling.js.map +7 -0
  165. package/dist/source-auth.d.ts +2 -0
  166. package/dist/source-auth.d.ts.map +1 -0
  167. package/dist/source-auth.js +1220 -0
  168. package/dist/source-auth.js.map +7 -0
  169. package/dist/switching-set-alignment.d.ts +61 -0
  170. package/dist/switching-set-alignment.d.ts.map +1 -0
  171. package/dist/switching-set-alignment.js +85 -0
  172. package/dist/switching-set-alignment.js.map +7 -0
  173. package/dist/timestamp-codec.d.ts +34 -0
  174. package/dist/timestamp-codec.d.ts.map +1 -0
  175. package/dist/timestamp-codec.js +456 -0
  176. package/dist/timestamp-codec.js.map +7 -0
  177. package/dist/track-pipeline-setup.d.ts +72 -0
  178. package/dist/track-pipeline-setup.d.ts.map +1 -0
  179. package/dist/track-pipeline-setup.js +306 -0
  180. package/dist/track-pipeline-setup.js.map +7 -0
  181. package/dist/track-pipeline.d.ts +121 -0
  182. package/dist/track-pipeline.d.ts.map +1 -0
  183. package/dist/track-pipeline.js +229 -0
  184. package/dist/track-pipeline.js.map +7 -0
  185. package/dist/track-session.d.ts +269 -0
  186. package/dist/track-session.d.ts.map +1 -0
  187. package/dist/track-session.js +597 -0
  188. package/dist/track-session.js.map +7 -0
  189. package/dist/transport-pool.d.ts +69 -0
  190. package/dist/transport-pool.d.ts.map +1 -0
  191. package/dist/transport-pool.js +88 -0
  192. package/dist/transport-pool.js.map +7 -0
  193. package/dist/wasm-mfu-reassembler.d.ts +81 -0
  194. package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
  195. package/dist/wasm-mfu-reassembler.js +1915 -0
  196. package/dist/wasm-mfu-reassembler.js.map +7 -0
  197. package/dist/wasm-mmtp-container-parser.d.ts +10 -0
  198. package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
  199. package/dist/wasm-mmtp-container-parser.js +5635 -0
  200. package/dist/wasm-mmtp-container-parser.js.map +7 -0
  201. package/node_modules/@blockcast/fec-worker/README.md +213 -0
  202. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  203. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
  204. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
  205. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
  206. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
  207. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
  208. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
  209. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
  210. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
  211. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
  212. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
  213. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
  214. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
  215. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
  216. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
  217. package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
  218. package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
  219. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
  220. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
  221. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
  222. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
  223. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
  224. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
  225. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
  226. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
  227. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
  228. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
  229. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
  230. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
  231. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
  232. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
  233. package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
  234. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
  235. package/node_modules/@blockcast/fec-worker/package.json +59 -0
  236. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
  237. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
  238. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
  239. package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
  240. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
  241. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
  242. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
  243. package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
  244. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  245. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  246. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  247. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  248. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  249. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  250. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  251. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  252. package/node_modules/@blockcast/mmt-base/README.md +120 -0
  253. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  254. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  255. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  256. package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  257. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  258. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
  259. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  260. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
  261. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  262. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  263. package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  264. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
  265. package/node_modules/@blockcast/mmt-fec/README.md +270 -0
  266. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  267. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
  268. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
  269. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
  270. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
  271. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
  272. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
  273. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
  274. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
  275. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
  276. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
  277. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
  278. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
  279. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
  280. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
  281. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
  282. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
  283. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
  284. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
  285. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
  286. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
  287. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
  288. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
  289. package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
  290. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
  291. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
  292. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
  293. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
  294. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
  295. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
  296. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
  297. package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
  298. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
  299. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
  300. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
  301. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
  302. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
  303. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  304. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  305. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  306. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
  324. package/node_modules/@blockcast/mmt-fec/package.json +79 -0
  325. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
  326. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
  327. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
  328. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
  329. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
  330. package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
  331. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
  332. package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
  333. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
  334. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  335. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
  336. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
  337. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
  351. package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
  352. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
  353. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
  354. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
  355. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
  356. package/node_modules/@noble/hashes/LICENSE +21 -0
  357. package/node_modules/@noble/hashes/README.md +521 -0
  358. package/node_modules/@noble/hashes/_assert.d.ts +17 -0
  359. package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
  360. package/node_modules/@noble/hashes/_assert.js +18 -0
  361. package/node_modules/@noble/hashes/_assert.js.map +1 -0
  362. package/node_modules/@noble/hashes/_blake.d.ts +14 -0
  363. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  364. package/node_modules/@noble/hashes/_blake.js +50 -0
  365. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  366. package/node_modules/@noble/hashes/_md.d.ts +51 -0
  367. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  368. package/node_modules/@noble/hashes/_md.js +162 -0
  369. package/node_modules/@noble/hashes/_md.js.map +1 -0
  370. package/node_modules/@noble/hashes/_u64.d.ts +55 -0
  371. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  372. package/node_modules/@noble/hashes/_u64.js +90 -0
  373. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  374. package/node_modules/@noble/hashes/argon2.d.ts +32 -0
  375. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  376. package/node_modules/@noble/hashes/argon2.js +401 -0
  377. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  378. package/node_modules/@noble/hashes/blake1.d.ts +106 -0
  379. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  380. package/node_modules/@noble/hashes/blake1.js +459 -0
  381. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  382. package/node_modules/@noble/hashes/blake2.d.ts +116 -0
  383. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  384. package/node_modules/@noble/hashes/blake2.js +420 -0
  385. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  386. package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
  387. package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
  388. package/node_modules/@noble/hashes/blake2b.js +14 -0
  389. package/node_modules/@noble/hashes/blake2b.js.map +1 -0
  390. package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
  391. package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
  392. package/node_modules/@noble/hashes/blake2s.js +24 -0
  393. package/node_modules/@noble/hashes/blake2s.js.map +1 -0
  394. package/node_modules/@noble/hashes/blake3.d.ts +54 -0
  395. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  396. package/node_modules/@noble/hashes/blake3.js +255 -0
  397. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  398. package/node_modules/@noble/hashes/crypto.d.ts +2 -0
  399. package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
  400. package/node_modules/@noble/hashes/crypto.js +5 -0
  401. package/node_modules/@noble/hashes/crypto.js.map +1 -0
  402. package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
  403. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
  404. package/node_modules/@noble/hashes/cryptoNode.js +18 -0
  405. package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
  406. package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
  407. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  408. package/node_modules/@noble/hashes/eskdf.js +166 -0
  409. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  410. package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
  411. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
  412. package/node_modules/@noble/hashes/esm/_assert.js +15 -0
  413. package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
  414. package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
  415. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
  416. package/node_modules/@noble/hashes/esm/_blake.js +45 -0
  417. package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
  418. package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
  419. package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
  420. package/node_modules/@noble/hashes/esm/_md.js +155 -0
  421. package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
  422. package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
  423. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
  424. package/node_modules/@noble/hashes/esm/_u64.js +67 -0
  425. package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
  426. package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
  427. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
  428. package/node_modules/@noble/hashes/esm/argon2.js +392 -0
  429. package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
  430. package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
  431. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
  432. package/node_modules/@noble/hashes/esm/blake1.js +452 -0
  433. package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
  434. package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
  435. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
  436. package/node_modules/@noble/hashes/esm/blake2.js +413 -0
  437. package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
  438. package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
  439. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
  440. package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
  441. package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
  442. package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
  443. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
  444. package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
  445. package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
  446. package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
  447. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
  448. package/node_modules/@noble/hashes/esm/blake3.js +251 -0
  449. package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
  450. package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
  451. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
  452. package/node_modules/@noble/hashes/esm/crypto.js +2 -0
  453. package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
  454. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
  455. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
  456. package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
  457. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
  458. package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
  459. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
  460. package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
  461. package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
  462. package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
  463. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
  464. package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
  465. package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
  466. package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
  467. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
  468. package/node_modules/@noble/hashes/esm/hmac.js +86 -0
  469. package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
  470. package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
  471. package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
  472. package/node_modules/@noble/hashes/esm/index.js +33 -0
  473. package/node_modules/@noble/hashes/esm/index.js.map +1 -0
  474. package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
  475. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
  476. package/node_modules/@noble/hashes/esm/legacy.js +281 -0
  477. package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
  478. package/node_modules/@noble/hashes/esm/package.json +10 -0
  479. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
  480. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
  481. package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
  482. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
  483. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
  484. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
  485. package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
  486. package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
  487. package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
  488. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
  489. package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
  490. package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
  491. package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
  492. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
  493. package/node_modules/@noble/hashes/esm/sha1.js +11 -0
  494. package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
  495. package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
  496. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
  497. package/node_modules/@noble/hashes/esm/sha2.js +375 -0
  498. package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
  499. package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
  500. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
  501. package/node_modules/@noble/hashes/esm/sha256.js +20 -0
  502. package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
  503. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
  504. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
  505. package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
  506. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
  507. package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
  508. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
  509. package/node_modules/@noble/hashes/esm/sha3.js +234 -0
  510. package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
  511. package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
  512. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
  513. package/node_modules/@noble/hashes/esm/sha512.js +26 -0
  514. package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
  515. package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
  516. package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
  517. package/node_modules/@noble/hashes/esm/utils.js +281 -0
  518. package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
  519. package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
  520. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  521. package/node_modules/@noble/hashes/hkdf.js +88 -0
  522. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  523. package/node_modules/@noble/hashes/hmac.d.ts +35 -0
  524. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  525. package/node_modules/@noble/hashes/hmac.js +91 -0
  526. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  527. package/node_modules/@noble/hashes/index.d.ts +1 -0
  528. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  529. package/node_modules/@noble/hashes/index.js +33 -0
  530. package/node_modules/@noble/hashes/index.js.map +1 -0
  531. package/node_modules/@noble/hashes/legacy.d.ts +71 -0
  532. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  533. package/node_modules/@noble/hashes/legacy.js +287 -0
  534. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  535. package/node_modules/@noble/hashes/package.json +266 -0
  536. package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
  537. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  538. package/node_modules/@noble/hashes/pbkdf2.js +101 -0
  539. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  540. package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
  541. package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
  542. package/node_modules/@noble/hashes/ripemd160.js +16 -0
  543. package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
  544. package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
  545. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  546. package/node_modules/@noble/hashes/scrypt.js +232 -0
  547. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  548. package/node_modules/@noble/hashes/sha1.d.ts +11 -0
  549. package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
  550. package/node_modules/@noble/hashes/sha1.js +14 -0
  551. package/node_modules/@noble/hashes/sha1.js.map +1 -0
  552. package/node_modules/@noble/hashes/sha2.d.ts +159 -0
  553. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  554. package/node_modules/@noble/hashes/sha2.js +384 -0
  555. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  556. package/node_modules/@noble/hashes/sha256.d.ts +20 -0
  557. package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
  558. package/node_modules/@noble/hashes/sha256.js +23 -0
  559. package/node_modules/@noble/hashes/sha256.js.map +1 -0
  560. package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
  561. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  562. package/node_modules/@noble/hashes/sha3-addons.js +402 -0
  563. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  564. package/node_modules/@noble/hashes/sha3.d.ts +53 -0
  565. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  566. package/node_modules/@noble/hashes/sha3.js +239 -0
  567. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  568. package/node_modules/@noble/hashes/sha512.d.ts +26 -0
  569. package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
  570. package/node_modules/@noble/hashes/sha512.js +29 -0
  571. package/node_modules/@noble/hashes/sha512.js.map +1 -0
  572. package/node_modules/@noble/hashes/src/_assert.ts +22 -0
  573. package/node_modules/@noble/hashes/src/_blake.ts +50 -0
  574. package/node_modules/@noble/hashes/src/_md.ts +176 -0
  575. package/node_modules/@noble/hashes/src/_u64.ts +91 -0
  576. package/node_modules/@noble/hashes/src/argon2.ts +497 -0
  577. package/node_modules/@noble/hashes/src/blake1.ts +534 -0
  578. package/node_modules/@noble/hashes/src/blake2.ts +486 -0
  579. package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
  580. package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
  581. package/node_modules/@noble/hashes/src/blake3.ts +272 -0
  582. package/node_modules/@noble/hashes/src/crypto.ts +9 -0
  583. package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
  584. package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
  585. package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
  586. package/node_modules/@noble/hashes/src/hmac.ts +94 -0
  587. package/node_modules/@noble/hashes/src/index.ts +31 -0
  588. package/node_modules/@noble/hashes/src/legacy.ts +293 -0
  589. package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
  590. package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
  591. package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
  592. package/node_modules/@noble/hashes/src/sha1.ts +10 -0
  593. package/node_modules/@noble/hashes/src/sha2.ts +402 -0
  594. package/node_modules/@noble/hashes/src/sha256.ts +24 -0
  595. package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
  596. package/node_modules/@noble/hashes/src/sha3.ts +258 -0
  597. package/node_modules/@noble/hashes/src/sha512.ts +34 -0
  598. package/node_modules/@noble/hashes/src/utils.ts +395 -0
  599. package/node_modules/@noble/hashes/utils.d.ts +161 -0
  600. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  601. package/node_modules/@noble/hashes/utils.js +313 -0
  602. package/node_modules/@noble/hashes/utils.js.map +1 -0
  603. package/package.json +203 -0
  604. package/schemas/catalog.schema.json +283 -0
  605. package/src/align.ts +235 -0
  606. package/src/audio-init-parser.ts +189 -0
  607. package/src/audio-ring-buffer.ts +120 -0
  608. package/src/authored-timing.ts +63 -0
  609. package/src/carp-catalog.ts +776 -0
  610. package/src/catalog-fec-params.ts +167 -0
  611. package/src/catalog-network-source.ts +49 -0
  612. package/src/catalog-validator.ts +34 -0
  613. package/src/cmaf-block-assembler.ts +1058 -0
  614. package/src/cmaf-group-batcher.ts +104 -0
  615. package/src/cmcd-producer.ts +329 -0
  616. package/src/codec-utils.ts +1539 -0
  617. package/src/fec-codec.ts +61 -0
  618. package/src/fec-manager.ts +1939 -0
  619. package/src/fec-starvation-detector.ts +128 -0
  620. package/src/fec-worker-setup.ts +177 -0
  621. package/src/fmp4-completion.ts +47 -0
  622. package/src/fmp4-reader.ts +112 -0
  623. package/src/index.ts +443 -0
  624. package/src/iso-bmff-timing.ts +688 -0
  625. package/src/loc.ts +181 -0
  626. package/src/manifest-auth-plan.ts +107 -0
  627. package/src/media-router.ts +1185 -0
  628. package/src/mfu-reassembler.ts +2842 -0
  629. package/src/mfu-reassembly-policy.ts +134 -0
  630. package/src/mmtp-container-parser.ts +1498 -0
  631. package/src/mmtp-decode-pipeline.ts +315 -0
  632. package/src/mmtp-router.ts +3027 -0
  633. package/src/mmtp-to-cmaf.ts +956 -0
  634. package/src/multicast-auth-catalog.ts +340 -0
  635. package/src/multicast-input.ts +439 -0
  636. package/src/multicast-manager.ts +1503 -0
  637. package/src/multicast-transport.ts +320 -0
  638. package/src/multicast-unwrap.ts +132 -0
  639. package/src/no-modules.ts +20 -0
  640. package/src/phase14-catalog-override.ts +336 -0
  641. package/src/repair-fetch.ts +217 -0
  642. package/src/sample-combiner.ts +846 -0
  643. package/src/signaling.ts +78 -0
  644. package/src/source-auth.ts +1 -0
  645. package/src/switching-set-alignment.ts +109 -0
  646. package/src/timestamp-codec.ts +265 -0
  647. package/src/track-pipeline-setup.ts +189 -0
  648. package/src/track-pipeline.ts +332 -0
  649. package/src/track-session.ts +778 -0
  650. package/src/transport-pool.ts +128 -0
  651. package/src/wasm-mfu-reassembler.ts +372 -0
  652. package/src/wasm-mmtp-container-parser.ts +23 -0
  653. package/test-vectors/align.json +199 -0
  654. package/test-vectors/catalog/README.md +25 -0
  655. package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
  656. package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
  657. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
  658. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
  659. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
  660. package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
  661. package/test-vectors/catalog/negative/network-source-object.json +25 -0
  662. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
  663. package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
  664. package/test-vectors/catalog/negative/track-role-empty.json +16 -0
  665. package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
  666. package/test-vectors/catalog/positive/fec-multicast.json +51 -0
  667. package/test-vectors/catalog/positive/flat-av.json +30 -0
  668. package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
  669. package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
  670. package/test-vectors/catalog/positive/track-role.json +49 -0
  671. package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
  672. package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
  673. package/test-vectors/catalog-multicast-auth-v1.json +26 -0
  674. package/test-vectors/catalog-validation.json +148 -0
  675. package/test-vectors/catalog-validator-public-api.mjs +25 -0
  676. package/test-vectors/generate-source-auth-fixture.mjs +114 -0
  677. package/test-vectors/source-auth-v1.json +61 -0
  678. package/test-vectors/subsample-placement-v1.json +230 -0
@@ -0,0 +1,256 @@
1
+ // src/multicast-input.ts
2
+ var MulticastInputError = class extends Error {
3
+ constructor(kind, endpointIndex, message) {
4
+ super(message);
5
+ this.kind = kind;
6
+ this.endpointIndex = endpointIndex;
7
+ this.name = "MulticastInputError";
8
+ }
9
+ };
10
+ function multicastFromConfig(input) {
11
+ if (input.endpoints.length === 0) {
12
+ throw new MulticastInputError(
13
+ "empty_endpoints",
14
+ null,
15
+ "endpoints[] must be non-empty \u2014 a multicast field with zero endpoints declares nothing"
16
+ );
17
+ }
18
+ if (input.version !== void 0 && (!Number.isInteger(input.version) || input.version < 0)) {
19
+ throw new MulticastInputError("invalid_version", null, `version must be a non-negative integer; got ${input.version}`);
20
+ }
21
+ if (input.validUntil !== void 0) {
22
+ if (!Number.isFinite(input.validUntil) || input.validUntil <= 0) {
23
+ throw new MulticastInputError(
24
+ "invalid_valid_until",
25
+ null,
26
+ `validUntil must be a positive unix-ms timestamp; got ${input.validUntil}`
27
+ );
28
+ }
29
+ }
30
+ const seenTuples = /* @__PURE__ */ new Set();
31
+ const endpoints = input.endpoints.map((ep, idx) => validateEndpoint(ep, idx, seenTuples));
32
+ const out = { endpoints };
33
+ if (input.enabled !== void 0) out.enabled = input.enabled;
34
+ if (input.amtFallback !== void 0) out.amtFallback = { ...input.amtFallback };
35
+ if (input.version !== void 0) out.version = input.version;
36
+ if (input.validUntil !== void 0) out.validUntil = input.validUntil;
37
+ return out;
38
+ }
39
+ function validateEndpoint(ep, idx, seenTuples) {
40
+ if (ep.protocol === "ssm" && (!ep.sourceAddress || ep.sourceAddress.length === 0)) {
41
+ throw new MulticastInputError(
42
+ "ssm_requires_source",
43
+ idx,
44
+ `endpoint[${idx}] protocol=ssm requires sourceAddress`
45
+ );
46
+ }
47
+ if (ep.protocol === "amt" && (!ep.relayAddress || ep.relayAddress.length === 0)) {
48
+ throw new MulticastInputError(
49
+ "amt_requires_relay",
50
+ idx,
51
+ `endpoint[${idx}] protocol=amt requires relayAddress`
52
+ );
53
+ }
54
+ if (!isMulticastGroupAddress(ep.groupAddress)) {
55
+ throw new MulticastInputError(
56
+ "invalid_group_address",
57
+ idx,
58
+ `endpoint[${idx}] groupAddress "${ep.groupAddress}" is not a valid multicast address`
59
+ );
60
+ }
61
+ if (ep.protocol === "ssm" && !isSsmGroupAddress(ep.groupAddress)) {
62
+ throw new MulticastInputError(
63
+ "ssm_group_out_of_range",
64
+ idx,
65
+ `endpoint[${idx}] protocol=ssm requires groupAddress in 232.0.0.0/8 (IPv4) or ff3x::/32 (IPv6); got "${ep.groupAddress}"`
66
+ );
67
+ }
68
+ if (!Number.isInteger(ep.port) || ep.port < 1 || ep.port > 65535) {
69
+ throw new MulticastInputError("invalid_port", idx, `endpoint[${idx}] port must be 1..65535; got ${ep.port}`);
70
+ }
71
+ if (ep.tracks.length === 0) {
72
+ throw new MulticastInputError("empty_tracks", idx, `endpoint[${idx}] tracks must be non-empty`);
73
+ }
74
+ const seenPids = /* @__PURE__ */ new Set();
75
+ for (const t of ep.tracks) {
76
+ if (typeof t.name !== "string" || t.name.length === 0) {
77
+ throw new MulticastInputError(
78
+ "invalid_track_name",
79
+ idx,
80
+ `endpoint[${idx}] track name must be a non-empty string`
81
+ );
82
+ }
83
+ if (!Number.isInteger(t.packetId) || t.packetId < 0 || t.packetId > 65535) {
84
+ throw new MulticastInputError(
85
+ "invalid_packet_id",
86
+ idx,
87
+ `endpoint[${idx}] track "${t.name}" packetId must be 0..65535; got ${t.packetId}`
88
+ );
89
+ }
90
+ if (seenPids.has(t.packetId)) {
91
+ throw new MulticastInputError(
92
+ "duplicate_packet_id",
93
+ idx,
94
+ `endpoint[${idx}] duplicate packetId ${t.packetId}`
95
+ );
96
+ }
97
+ seenPids.add(t.packetId);
98
+ }
99
+ if (ep.bandwidth !== void 0 && (!Number.isFinite(ep.bandwidth) || ep.bandwidth <= 0)) {
100
+ throw new MulticastInputError(
101
+ "invalid_bandwidth",
102
+ idx,
103
+ `endpoint[${idx}] bandwidth must be positive; got ${ep.bandwidth}`
104
+ );
105
+ }
106
+ const tupleKey = `${ep.sourceAddress ?? ""}|${ep.groupAddress}|${ep.port}`;
107
+ if (seenTuples.has(tupleKey)) {
108
+ throw new MulticastInputError(
109
+ "duplicate_endpoint_tuple",
110
+ idx,
111
+ `endpoint[${idx}] duplicates (sourceAddress, groupAddress, port) tuple "${tupleKey}"`
112
+ );
113
+ }
114
+ seenTuples.add(tupleKey);
115
+ const out = {
116
+ protocol: ep.protocol,
117
+ groupAddress: ep.groupAddress,
118
+ port: ep.port,
119
+ tracks: ep.tracks.map((t) => ({ name: t.name, packetId: t.packetId }))
120
+ };
121
+ if (ep.sourceAddress !== void 0) out.sourceAddress = ep.sourceAddress;
122
+ if (ep.relayAddress !== void 0) out.relayAddress = ep.relayAddress;
123
+ if (ep.bandwidth !== void 0) out.bandwidth = ep.bandwidth;
124
+ return out;
125
+ }
126
+ function isMulticastGroupAddress(addr) {
127
+ if (addr.includes(":")) {
128
+ return /^ff[0-9a-f]{2}:/i.test(addr);
129
+ }
130
+ const m = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(addr);
131
+ if (!m) return false;
132
+ for (let i = 1; i <= 4; i++) {
133
+ const v = Number(m[i]);
134
+ if (!Number.isInteger(v) || v < 0 || v > 255) return false;
135
+ }
136
+ const first = Number(m[1]);
137
+ return first >= 224 && first <= 239;
138
+ }
139
+ function isSsmGroupAddress(addr) {
140
+ if (addr.includes(":")) {
141
+ return /^ff3[0-9a-f]:0{0,4}:/i.test(addr);
142
+ }
143
+ const m = /^(\d{1,3})\./.exec(addr);
144
+ return m !== null && Number(m[1]) === 232;
145
+ }
146
+ function multicastFromEnv(env = globalThis.process?.env ?? {}) {
147
+ const indices = collectMulticastIndices(env);
148
+ if (indices.length === 0) {
149
+ const strayCatalog = env["MOQCAST_MULTICAST_AMT_DISCOVERY"] !== void 0 || env["MOQCAST_MULTICAST_AMT_RELAY_DNS"] !== void 0;
150
+ if (strayCatalog) {
151
+ throw new MulticastInputError(
152
+ "invalid_env_shape",
153
+ null,
154
+ "MOQCAST_MULTICAST_AMT_* env keys are set but no per-endpoint keys (MOQCAST_MULTICAST_GROUP / _PROTOCOL / _PORT / _TRACKS) were found. AMT discovery is a catalog-level fallback for endpoints; declaring it with zero endpoints is a misconfiguration."
155
+ );
156
+ }
157
+ return void 0;
158
+ }
159
+ const endpoints = indices.map((idx) => readEndpointAt(env, idx));
160
+ const input = {
161
+ endpoints,
162
+ ...env["MOQCAST_MULTICAST_AMT_DISCOVERY"] ? {
163
+ amtFallback: {
164
+ discovery: env["MOQCAST_MULTICAST_AMT_DISCOVERY"],
165
+ ...env["MOQCAST_MULTICAST_AMT_RELAY_DNS"] ? { relayDns: env["MOQCAST_MULTICAST_AMT_RELAY_DNS"] } : {}
166
+ }
167
+ } : {}
168
+ };
169
+ return multicastFromConfig(input);
170
+ }
171
+ var ENV_PER_FIELD = ["PROTOCOL", "GROUP", "PORT", "SOURCE", "RELAY", "TRACKS", "BANDWIDTH"];
172
+ var ENV_CATALOG_LEVEL = /* @__PURE__ */ new Set(["AMT_DISCOVERY", "AMT_RELAY_DNS"]);
173
+ function collectMulticastIndices(env) {
174
+ const indices = /* @__PURE__ */ new Set();
175
+ let hasUnindexed = false;
176
+ let hasZeroIndexed = false;
177
+ for (const [key, val] of Object.entries(env)) {
178
+ if (val === void 0) continue;
179
+ if (!key.startsWith("MOQCAST_MULTICAST_")) continue;
180
+ const suffix = key.slice("MOQCAST_MULTICAST_".length);
181
+ if (ENV_CATALOG_LEVEL.has(suffix)) continue;
182
+ const m = /^(\d+)_(.+)$/.exec(suffix);
183
+ if (m) {
184
+ const idx = Number(m[1]);
185
+ const field = m[2];
186
+ if (!ENV_PER_FIELD.includes(field)) continue;
187
+ if (idx === 0) hasZeroIndexed = true;
188
+ indices.add(idx);
189
+ } else if (ENV_PER_FIELD.includes(suffix)) {
190
+ hasUnindexed = true;
191
+ indices.add(0);
192
+ }
193
+ }
194
+ if (hasUnindexed && hasZeroIndexed) {
195
+ throw new MulticastInputError(
196
+ "invalid_env_shape",
197
+ null,
198
+ "MOQCAST_MULTICAST_* env contract: cannot mix unindexed keys (MOQCAST_MULTICAST_GROUP) with explicitly-indexed keys at index 0 (MOQCAST_MULTICAST_0_GROUP) \u2014 they refer to the same endpoint. Use one form consistently."
199
+ );
200
+ }
201
+ return [...indices].sort((a, b) => a - b);
202
+ }
203
+ function readEndpointAt(env, idx) {
204
+ const lookup = (field) => {
205
+ if (idx === 0) {
206
+ return env[`MOQCAST_MULTICAST_${field}`] ?? env[`MOQCAST_MULTICAST_0_${field}`];
207
+ }
208
+ return env[`MOQCAST_MULTICAST_${idx}_${field}`];
209
+ };
210
+ const portStr = lookup("PORT");
211
+ const port = portStr !== void 0 ? Number(portStr) : NaN;
212
+ const tracks = parseTracksEnv(lookup("TRACKS"), idx);
213
+ const bandwidthStr = lookup("BANDWIDTH");
214
+ const bandwidth = bandwidthStr !== void 0 ? Number(bandwidthStr) : void 0;
215
+ const source = lookup("SOURCE");
216
+ const relay = lookup("RELAY");
217
+ return {
218
+ protocol: lookup("PROTOCOL"),
219
+ groupAddress: lookup("GROUP") ?? "",
220
+ port,
221
+ tracks,
222
+ ...source ? { sourceAddress: source } : {},
223
+ ...relay ? { relayAddress: relay } : {},
224
+ ...bandwidth !== void 0 ? { bandwidth } : {}
225
+ };
226
+ }
227
+ function parseTracksEnv(raw, endpointIdx) {
228
+ if (!raw || raw.length === 0) return [];
229
+ return raw.split(",").map((entry, i) => {
230
+ const colon = entry.lastIndexOf(":");
231
+ if (colon < 0) {
232
+ throw new MulticastInputError(
233
+ "invalid_track_name",
234
+ endpointIdx,
235
+ `endpoint[${endpointIdx}] TRACKS[${i}] missing ":" \u2014 expected "name:packetId", got ${JSON.stringify(entry)}`
236
+ );
237
+ }
238
+ const name = entry.slice(0, colon).trim();
239
+ const idStr = entry.slice(colon + 1).trim();
240
+ const packetId = Number(idStr);
241
+ if (!name || idStr.length === 0 || !Number.isFinite(packetId) || !Number.isInteger(packetId)) {
242
+ throw new MulticastInputError(
243
+ "invalid_packet_id",
244
+ endpointIdx,
245
+ `endpoint[${endpointIdx}] TRACKS[${i}] entry malformed (need "name:integer"): ${JSON.stringify(entry)}`
246
+ );
247
+ }
248
+ return { name, packetId };
249
+ });
250
+ }
251
+ export {
252
+ MulticastInputError,
253
+ multicastFromConfig,
254
+ multicastFromEnv
255
+ };
256
+ //# sourceMappingURL=multicast-input.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/multicast-input.ts"],
4
+ "sourcesContent": ["// Module-local ambient: `multicastFromEnv` reads `process.env` when present\n// (Node, FFI host) and falls back to `{}` in browser contexts. The package\n// targets both, so we don't pull in `@types/node` org-wide \u2014 declaring the\n// minimal surface we touch keeps the dependency graph tight and the\n// published .d.ts free of node-isms.\ndeclare const process: { env: Record<string, string | undefined> } | undefined;\n\n/**\n * Multicast catalog input contract \u2014 validator + builder.\n *\n * Per draft-ramadan-moq-multicast-00 \u00A73 + \u00A74.1, the publisher (FFmpeg,\n * cast bridge, GStreamer, OBS-bridge) populates `multicast.endpoints[]`\n * in the catalog when its output includes a UDP multicast destination.\n *\n * This module is the TypeScript-side validator over a versioned input\n * shape. Sister-language validators (FFmpeg C, cast Rust) target the\n * same invariants \u2014 eventually via a shared JSON Schema + fixtures\n * (BLO-3341 follow-up); today parity is enforced by code review against\n * 1:1 ports. Each publisher's integration MUST also assert that the\n * declared `(sourceAddress, groupAddress, port)` matches what it\n * actually emits \u2014 that's a separate runtime check the helper cannot\n * perform.\n *\n * Validation invariants (per codex review of BLO-3323 v2):\n * - protocol === 'ssm' \u2192 sourceAddress REQUIRED\n * - protocol === 'amt' \u2192 relayAddress REQUIRED\n * - groupAddress is a valid IPv4 multicast group (224.0.0.0/4)\n * or IPv6 multicast group (ff00::/8)\n * - SSM groupAddress MUST be in 232.0.0.0/8 (IPv4) or ff3x::/32 (IPv6),\n * where the IPv6 form requires P=1 + T=1 (the `3` nibble) AND the\n * 16-bit reserved-zero second hextet per RFC 3306 \u00A74 / RFC 4607.\n * - port in 1..65535\n * - tracks non-empty; per-track packetId in 0..65535\n * - packetIds unique within an endpoint\n * - (sourceAddress, groupAddress, port) tuple unique across endpoints\n * - bandwidth (if present) > 0\n * - validUntil (if present) is a positive unix-ms timestamp\n *\n * @see draft-ramadan-moq-multicast-00 \u00A74.1\n * @see .planning/drafts/blo-3323-multicast-catalog-source-of-truth.md\n */\n\nimport {\n\ttype AmtDiscovery,\n\ttype MulticastCatalogConfig,\n\ttype MulticastEndpoint,\n\ttype MulticastProtocol,\n\ttype MulticastTrackObject,\n} from \"./carp-catalog.js\";\n\n/**\n * Strict typed input for one multicast endpoint. The publisher provides\n * this shape (env vars / CLI / config record), the helper validates and\n * lifts it into a `MulticastEndpoint` ready to embed in the catalog.\n */\nexport interface MulticastEndpointInput {\n\treadonly protocol: MulticastProtocol;\n\treadonly sourceAddress?: string;\n\treadonly groupAddress: string;\n\treadonly port: number;\n\t/** New emitters MUST use the object form (name + packetId). */\n\treadonly tracks: ReadonlyArray<MulticastTrackObject>;\n\treadonly relayAddress?: string;\n\t/** Aggregate bandwidth in bits per second. RECOMMENDED per draft \u00A74.1. */\n\treadonly bandwidth?: number;\n}\n\n/**\n * Strict typed input for the catalog-level multicast extension.\n *\n * `version` (monotonic) + `validUntil` (unix ms) support the catalog\n * freshness model: subscribers refetch before expiry, and publishers\n * MUST republish (with bumped `version`) on any endpoint mutation.\n */\nexport interface MulticastInput {\n\treadonly enabled?: boolean;\n\treadonly endpoints: ReadonlyArray<MulticastEndpointInput>;\n\treadonly amtFallback?: { readonly discovery: AmtDiscovery; readonly relayDns?: string };\n\treadonly version?: number;\n\treadonly validUntil?: number;\n}\n\nexport type MulticastInputErrorKind =\n\t| \"empty_endpoints\"\n\t| \"ssm_requires_source\"\n\t| \"amt_requires_relay\"\n\t| \"invalid_group_address\"\n\t| \"ssm_group_out_of_range\"\n\t| \"invalid_port\"\n\t| \"empty_tracks\"\n\t| \"invalid_track_name\"\n\t| \"invalid_packet_id\"\n\t| \"duplicate_packet_id\"\n\t| \"duplicate_endpoint_tuple\"\n\t| \"invalid_bandwidth\"\n\t| \"invalid_valid_until\"\n\t| \"invalid_version\"\n\t| \"invalid_env_shape\";\n\nexport class MulticastInputError extends Error {\n\tconstructor(\n\t\tpublic readonly kind: MulticastInputErrorKind,\n\t\tpublic readonly endpointIndex: number | null,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MulticastInputError\";\n\t}\n}\n\n/**\n * Validate a typed publisher input and lift it into a\n * `MulticastCatalogConfig` ready for `catalog.multicast = \u2026`.\n *\n * Throws `MulticastInputError` on any invariant violation. Fail-fast\n * at config-load time, never at runtime \u2014 silent fallbacks hide bugs\n * upstream (per the project's \"no anti-patterns\" directive).\n */\nexport function multicastFromConfig(input: MulticastInput): MulticastCatalogConfig {\n\tif (input.endpoints.length === 0) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"empty_endpoints\",\n\t\t\tnull,\n\t\t\t\"endpoints[] must be non-empty \u2014 a multicast field with zero endpoints declares nothing\",\n\t\t);\n\t}\n\tif (input.version !== undefined && (!Number.isInteger(input.version) || input.version < 0)) {\n\t\tthrow new MulticastInputError(\"invalid_version\", null, `version must be a non-negative integer; got ${input.version}`);\n\t}\n\tif (input.validUntil !== undefined) {\n\t\tif (!Number.isFinite(input.validUntil) || input.validUntil <= 0) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"invalid_valid_until\",\n\t\t\t\tnull,\n\t\t\t\t`validUntil must be a positive unix-ms timestamp; got ${input.validUntil}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst seenTuples = new Set<string>();\n\tconst endpoints: MulticastEndpoint[] = input.endpoints.map((ep, idx) => validateEndpoint(ep, idx, seenTuples));\n\n\tconst out: MulticastCatalogConfig = { endpoints };\n\tif (input.enabled !== undefined) out.enabled = input.enabled;\n\tif (input.amtFallback !== undefined) out.amtFallback = { ...input.amtFallback };\n\tif (input.version !== undefined) out.version = input.version;\n\tif (input.validUntil !== undefined) out.validUntil = input.validUntil;\n\treturn out;\n}\n\nfunction validateEndpoint(\n\tep: MulticastEndpointInput,\n\tidx: number,\n\tseenTuples: Set<string>,\n): MulticastEndpoint {\n\tif (ep.protocol === \"ssm\" && (!ep.sourceAddress || ep.sourceAddress.length === 0)) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"ssm_requires_source\",\n\t\t\tidx,\n\t\t\t`endpoint[${idx}] protocol=ssm requires sourceAddress`,\n\t\t);\n\t}\n\tif (ep.protocol === \"amt\" && (!ep.relayAddress || ep.relayAddress.length === 0)) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"amt_requires_relay\",\n\t\t\tidx,\n\t\t\t`endpoint[${idx}] protocol=amt requires relayAddress`,\n\t\t);\n\t}\n\n\tif (!isMulticastGroupAddress(ep.groupAddress)) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"invalid_group_address\",\n\t\t\tidx,\n\t\t\t`endpoint[${idx}] groupAddress \"${ep.groupAddress}\" is not a valid multicast address`,\n\t\t);\n\t}\n\tif (ep.protocol === \"ssm\" && !isSsmGroupAddress(ep.groupAddress)) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"ssm_group_out_of_range\",\n\t\t\tidx,\n\t\t\t`endpoint[${idx}] protocol=ssm requires groupAddress in 232.0.0.0/8 (IPv4) or ff3x::/32 (IPv6); got \"${ep.groupAddress}\"`,\n\t\t);\n\t}\n\n\tif (!Number.isInteger(ep.port) || ep.port < 1 || ep.port > 65535) {\n\t\tthrow new MulticastInputError(\"invalid_port\", idx, `endpoint[${idx}] port must be 1..65535; got ${ep.port}`);\n\t}\n\n\tif (ep.tracks.length === 0) {\n\t\tthrow new MulticastInputError(\"empty_tracks\", idx, `endpoint[${idx}] tracks must be non-empty`);\n\t}\n\n\tconst seenPids = new Set<number>();\n\tfor (const t of ep.tracks) {\n\t\tif (typeof t.name !== \"string\" || t.name.length === 0) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"invalid_track_name\",\n\t\t\t\tidx,\n\t\t\t\t`endpoint[${idx}] track name must be a non-empty string`,\n\t\t\t);\n\t\t}\n\t\tif (!Number.isInteger(t.packetId) || t.packetId < 0 || t.packetId > 65535) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"invalid_packet_id\",\n\t\t\t\tidx,\n\t\t\t\t`endpoint[${idx}] track \"${t.name}\" packetId must be 0..65535; got ${t.packetId}`,\n\t\t\t);\n\t\t}\n\t\tif (seenPids.has(t.packetId)) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"duplicate_packet_id\",\n\t\t\t\tidx,\n\t\t\t\t`endpoint[${idx}] duplicate packetId ${t.packetId}`,\n\t\t\t);\n\t\t}\n\t\tseenPids.add(t.packetId);\n\t}\n\n\tif (ep.bandwidth !== undefined && (!Number.isFinite(ep.bandwidth) || ep.bandwidth <= 0)) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"invalid_bandwidth\",\n\t\t\tidx,\n\t\t\t`endpoint[${idx}] bandwidth must be positive; got ${ep.bandwidth}`,\n\t\t);\n\t}\n\n\tconst tupleKey = `${ep.sourceAddress ?? \"\"}|${ep.groupAddress}|${ep.port}`;\n\tif (seenTuples.has(tupleKey)) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"duplicate_endpoint_tuple\",\n\t\t\tidx,\n\t\t\t`endpoint[${idx}] duplicates (sourceAddress, groupAddress, port) tuple \"${tupleKey}\"`,\n\t\t);\n\t}\n\tseenTuples.add(tupleKey);\n\n\tconst out: MulticastEndpoint = {\n\t\tprotocol: ep.protocol,\n\t\tgroupAddress: ep.groupAddress,\n\t\tport: ep.port,\n\t\ttracks: ep.tracks.map((t) => ({ name: t.name, packetId: t.packetId })),\n\t};\n\tif (ep.sourceAddress !== undefined) out.sourceAddress = ep.sourceAddress;\n\tif (ep.relayAddress !== undefined) out.relayAddress = ep.relayAddress;\n\tif (ep.bandwidth !== undefined) out.bandwidth = ep.bandwidth;\n\treturn out;\n}\n\nfunction isMulticastGroupAddress(addr: string): boolean {\n\tif (addr.includes(\":\")) {\n\t\t// IPv6: ff00::/8. Prefix-only check; full IPv6 syntax validation\n\t\t// is delegated to the OS bind() call downstream.\n\t\treturn /^ff[0-9a-f]{2}:/i.test(addr);\n\t}\n\tconst m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(addr);\n\tif (!m) return false;\n\tfor (let i = 1; i <= 4; i++) {\n\t\tconst v = Number(m[i]);\n\t\tif (!Number.isInteger(v) || v < 0 || v > 255) return false;\n\t}\n\tconst first = Number(m[1]);\n\treturn first >= 224 && first <= 239;\n}\n\nfunction isSsmGroupAddress(addr: string): boolean {\n\tif (addr.includes(\":\")) {\n\t\t// SSM IPv6: ff3x::/32 per RFC 3306 \u00A74. Requires P=1 + T=1 (the `3`\n\t\t// nibble) AND the second 16-bit hextet to be all-zero (RFC 3306's\n\t\t// \"prefix length = 0\" \u2192 next 32 bits are 0). The regex matches\n\t\t// `ff3?:0000:` collapsed forms (`ff3e::`, `ff3e:0::`, `ff3e:0:`,\n\t\t// `ff3e:0000:`) and rejects `ff3e:beef::1` etc.\n\t\treturn /^ff3[0-9a-f]:0{0,4}:/i.test(addr);\n\t}\n\tconst m = /^(\\d{1,3})\\./.exec(addr);\n\treturn m !== null && Number(m[1]) === 232;\n}\n\n// Env-var helper (BLO-3337): read MOQCAST_MULTICAST_* keys and route\n// through multicastFromConfig so all per-endpoint invariants apply.\n\n/**\n * Read `MOQCAST_MULTICAST_*` env vars and return a\n * `MulticastCatalogConfig`. Returns `undefined` when no per-endpoint\n * key is set.\n *\n * Env contract \u2014 per-endpoint keys take an optional non-negative index:\n *\n * MOQCAST_MULTICAST[_<idx>]_PROTOCOL=ssm\n * MOQCAST_MULTICAST[_<idx>]_GROUP=232.1.1.1\n * MOQCAST_MULTICAST[_<idx>]_PORT=5004\n * MOQCAST_MULTICAST[_<idx>]_SOURCE=10.0.0.20 (required for ssm)\n * MOQCAST_MULTICAST[_<idx>]_RELAY=amt.example.com (required for amt)\n * MOQCAST_MULTICAST[_<idx>]_TRACKS=video:1,audio:3\n * MOQCAST_MULTICAST[_<idx>]_BANDWIDTH=8000000 (optional, bps)\n *\n * MOQCAST_MULTICAST_AMT_DISCOVERY=driad (catalog-level)\n * MOQCAST_MULTICAST_AMT_RELAY_DNS=relay.example.com (catalog-level)\n *\n * The unindexed form (`MOQCAST_MULTICAST_GROUP`) is exactly index 0;\n * mixing it with explicit `_0_` keys is rejected as ambiguous. Indices\n * need not be contiguous; observed indices are sorted ascending.\n */\nexport function multicastFromEnv(\n\tenv: Record<string, string | undefined> = ((globalThis as { process?: { env?: Record<string, string | undefined> } })\n\t\t.process?.env ?? {}) as Record<string, string | undefined>,\n): MulticastCatalogConfig | undefined {\n\tconst indices = collectMulticastIndices(env);\n\tif (indices.length === 0) {\n\t\t// Catalog-level AMT keys without per-endpoint keys is a\n\t\t// misconfiguration, not a no-op: `MOQCAST_MULTICAST_AMT_DISCOVERY`\n\t\t// only makes sense alongside endpoints to fall back FOR. Throw\n\t\t// loudly instead of silently dropping the request \u2014 a publisher\n\t\t// that meant to declare AMT fallback shouldn't have its config\n\t\t// disappear without any signal.\n\t\tconst strayCatalog = env[\"MOQCAST_MULTICAST_AMT_DISCOVERY\"] !== undefined\n\t\t\t|| env[\"MOQCAST_MULTICAST_AMT_RELAY_DNS\"] !== undefined;\n\t\tif (strayCatalog) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"invalid_env_shape\",\n\t\t\t\tnull,\n\t\t\t\t\"MOQCAST_MULTICAST_AMT_* env keys are set but no per-endpoint keys \" +\n\t\t\t\t\t\"(MOQCAST_MULTICAST_GROUP / _PROTOCOL / _PORT / _TRACKS) were found. \" +\n\t\t\t\t\t\"AMT discovery is a catalog-level fallback for endpoints; declaring it \" +\n\t\t\t\t\t\"with zero endpoints is a misconfiguration.\",\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconst endpoints: MulticastEndpointInput[] = indices.map((idx) => readEndpointAt(env, idx));\n\n\tconst input: MulticastInput = {\n\t\tendpoints,\n\t\t...(env[\"MOQCAST_MULTICAST_AMT_DISCOVERY\"]\n\t\t\t? {\n\t\t\t\t\tamtFallback: {\n\t\t\t\t\t\tdiscovery: env[\"MOQCAST_MULTICAST_AMT_DISCOVERY\"] as AmtDiscovery,\n\t\t\t\t\t\t...(env[\"MOQCAST_MULTICAST_AMT_RELAY_DNS\"]\n\t\t\t\t\t\t\t? { relayDns: env[\"MOQCAST_MULTICAST_AMT_RELAY_DNS\"] }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\treturn multicastFromConfig(input);\n}\n\nconst ENV_PER_FIELD = [\"PROTOCOL\", \"GROUP\", \"PORT\", \"SOURCE\", \"RELAY\", \"TRACKS\", \"BANDWIDTH\"];\nconst ENV_CATALOG_LEVEL = new Set([\"AMT_DISCOVERY\", \"AMT_RELAY_DNS\"]);\n\nfunction collectMulticastIndices(env: Record<string, string | undefined>): number[] {\n\tconst indices = new Set<number>();\n\tlet hasUnindexed = false;\n\tlet hasZeroIndexed = false;\n\n\tfor (const [key, val] of Object.entries(env)) {\n\t\tif (val === undefined) continue;\n\t\tif (!key.startsWith(\"MOQCAST_MULTICAST_\")) continue;\n\t\tconst suffix = key.slice(\"MOQCAST_MULTICAST_\".length);\n\t\tif (ENV_CATALOG_LEVEL.has(suffix)) continue;\n\n\t\tconst m = /^(\\d+)_(.+)$/.exec(suffix);\n\t\tif (m) {\n\t\t\tconst idx = Number(m[1]);\n\t\t\tconst field = m[2];\n\t\t\tif (!ENV_PER_FIELD.includes(field)) continue;\n\t\t\tif (idx === 0) hasZeroIndexed = true;\n\t\t\tindices.add(idx);\n\t\t} else if (ENV_PER_FIELD.includes(suffix)) {\n\t\t\thasUnindexed = true;\n\t\t\tindices.add(0);\n\t\t}\n\t}\n\n\tif (hasUnindexed && hasZeroIndexed) {\n\t\tthrow new MulticastInputError(\n\t\t\t\"invalid_env_shape\",\n\t\t\tnull,\n\t\t\t\"MOQCAST_MULTICAST_* env contract: cannot mix unindexed keys (MOQCAST_MULTICAST_GROUP) \" +\n\t\t\t\t\"with explicitly-indexed keys at index 0 (MOQCAST_MULTICAST_0_GROUP) \u2014 they refer to \" +\n\t\t\t\t\"the same endpoint. Use one form consistently.\",\n\t\t);\n\t}\n\n\treturn [...indices].sort((a, b) => a - b);\n}\n\nfunction readEndpointAt(env: Record<string, string | undefined>, idx: number): MulticastEndpointInput {\n\tconst lookup = (field: string): string | undefined => {\n\t\tif (idx === 0) {\n\t\t\treturn env[`MOQCAST_MULTICAST_${field}`] ?? env[`MOQCAST_MULTICAST_0_${field}`];\n\t\t}\n\t\treturn env[`MOQCAST_MULTICAST_${idx}_${field}`];\n\t};\n\n\tconst portStr = lookup(\"PORT\");\n\tconst port = portStr !== undefined ? Number(portStr) : NaN;\n\tconst tracks = parseTracksEnv(lookup(\"TRACKS\"), idx);\n\tconst bandwidthStr = lookup(\"BANDWIDTH\");\n\tconst bandwidth = bandwidthStr !== undefined ? Number(bandwidthStr) : undefined;\n\tconst source = lookup(\"SOURCE\");\n\tconst relay = lookup(\"RELAY\");\n\n\treturn {\n\t\tprotocol: lookup(\"PROTOCOL\") as MulticastProtocol,\n\t\tgroupAddress: lookup(\"GROUP\") ?? \"\",\n\t\tport,\n\t\ttracks,\n\t\t...(source ? { sourceAddress: source } : {}),\n\t\t...(relay ? { relayAddress: relay } : {}),\n\t\t...(bandwidth !== undefined ? { bandwidth } : {}),\n\t};\n}\n\nfunction parseTracksEnv(raw: string | undefined, endpointIdx: number): MulticastTrackObject[] {\n\tif (!raw || raw.length === 0) return [];\n\treturn raw.split(\",\").map((entry, i) => {\n\t\tconst colon = entry.lastIndexOf(\":\");\n\t\tif (colon < 0) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"invalid_track_name\",\n\t\t\t\tendpointIdx,\n\t\t\t\t`endpoint[${endpointIdx}] TRACKS[${i}] missing \":\" \u2014 expected \"name:packetId\", got ${JSON.stringify(entry)}`,\n\t\t\t);\n\t\t}\n\t\tconst name = entry.slice(0, colon).trim();\n\t\tconst idStr = entry.slice(colon + 1).trim();\n\t\tconst packetId = Number(idStr);\n\t\tif (!name || idStr.length === 0 || !Number.isFinite(packetId) || !Number.isInteger(packetId)) {\n\t\t\tthrow new MulticastInputError(\n\t\t\t\t\"invalid_packet_id\",\n\t\t\t\tendpointIdx,\n\t\t\t\t`endpoint[${endpointIdx}] TRACKS[${i}] entry malformed (need \"name:integer\"): ${JSON.stringify(entry)}`,\n\t\t\t);\n\t\t}\n\t\treturn { name, packetId };\n\t});\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Facade composing FECManager + MmtpRouter + MulticastTransport.
3
+ *
4
+ * Public methods delegate to the decomposed components. Applications that
5
+ * need individual layers can use them directly:
6
+ * - FECManager — codec-agnostic FEC decode
7
+ * - MmtpRouter — MMTP packet parsing + frame routing
8
+ * - MulticastTransport — SSM join/socket/watchdog
9
+ */
10
+ import { FECManager, type FECManagerConfig, type WasmFecDecoder } from "./fec-manager.js";
11
+ import { MmtpRouter, type FrameCallback, type ManifestIdentityResolver, type MmtpIngressContext, type TrackPacketCallback } from "./mmtp-router.js";
12
+ import { MulticastTransport } from "./multicast-transport.js";
13
+ import type { FecWorkerClient, FecTrackStats } from "@blockcast/fec-worker";
14
+ import type { MfuReassemblerBackend } from "./mfu-reassembler.js";
15
+ import type { MfuReassemblyPolicy } from "./mfu-reassembly-policy.js";
16
+ import type { ManifestObjectIdentity, ManifestVerifier } from "@blockcast/mmt-manifest-verify";
17
+ import type { BlockAssemblerConfig, CmafBlockSample } from "./cmaf-block-assembler.js";
18
+ export interface MulticastEndpointConfig {
19
+ sourceAddress: string;
20
+ groupAddress: string;
21
+ port: number;
22
+ /** Explicit gateway transport policy. Omitted means gateway-selected auto mode. */
23
+ mode?: 'auto' | 'native' | 'tunnel';
24
+ /** AMT relay hostname/IP from catalog endpoint. */
25
+ relayAddress?: string;
26
+ /** AMT relay port from catalog endpoint. */
27
+ relayPort?: number;
28
+ /** AMT relay hostname/IP from player/UI overrides. */
29
+ amtRelay?: string;
30
+ amtRelayPort?: number;
31
+ /** MMTP packet IDs to forward before data enters the page transport queue. */
32
+ packetIds?: number[];
33
+ /** Exact catalog tracks carried by this physical multicast endpoint. */
34
+ tracks?: MmtpIngressContext["tracks"];
35
+ fecK?: number;
36
+ /** Number of repair symbols per FEC block (P). Used to size recovery reorder latency. */
37
+ fecRepairSymbols?: number;
38
+ /** Symbol size in bytes (T). NOT repair count. */
39
+ fecSymbolSize?: number;
40
+ /** Catalog fec.reorderToleranceMs — signaled jitter/reorder allowance, ADDED
41
+ * to the derived delivery window. Never a multiplier on the span, so one
42
+ * network yields the same slack on a wide video span and a narrow audio one.
43
+ *
44
+ * Absence widens the window by zero rather than throwing, unlike the datagram
45
+ * MFU deadline in hang-mmt-fec. The distinction is which way absence fails:
46
+ * there the tolerance IS the deadline's slack term and guessing one invents
47
+ * a reorder budget, so it must fail loud; here the window is already fully
48
+ * derived from other catalog values and the tolerance only widens it, so
49
+ * adding nothing is the identity and errs toward earlier failback. Do not
50
+ * "harmonize" this into a throw, and do not turn the zero into a default. */
51
+ fecReorderToleranceMs?: number;
52
+ fecInterleaveDepthMs?: number;
53
+ /** Aggregate endpoint bandwidth in bits per second from the multicast catalog. */
54
+ bandwidth?: number;
55
+ fps?: number;
56
+ /** Catalog-derived lower bound for packet-silence failback (for example, keyframe repair cadence). */
57
+ minimumFailbackWindowMs?: number;
58
+ }
59
+ export interface MulticastManagerOptions {
60
+ /**
61
+ * MFU reassembly timeout (ms). Threaded to the inner MmtpRouter (and its
62
+ * MmtpContainerParser). Caller derives from catalog `fec.interleaveDepthMs`,
63
+ * which is already in milliseconds — `moqenc_mmt.c` converts
64
+ * `depth_ms = fec_depth * (1000/fps)` before populating the catalog.
65
+ * Defaults to 1000ms (with parser warning) when omitted.
66
+ */
67
+ mfuTimeoutMs?: number;
68
+ reassemblyPolicy?: MfuReassemblyPolicy;
69
+ reassembler?: MfuReassemblerBackend;
70
+ maxBufferedMfus?: number;
71
+ manifestVerifier?: ManifestVerifier;
72
+ manifestVerifierOwnership?: "caller" | "router";
73
+ resolveManifestIdentity?: (packetId: number, sbn: number, esi: number, catalogTrackName?: string) => ManifestObjectIdentity | null;
74
+ resolveManifestIdentityForRoute?: ManifestIdentityResolver;
75
+ }
76
+ export interface RepairBlockIdentity {
77
+ readonly packetId: number;
78
+ /** Non-empty catalog identity, or null when the producer has no track name. */
79
+ readonly catalogTrackName: string | null;
80
+ readonly sbn: number;
81
+ }
82
+ export type RepairLifecycleEvent = {
83
+ readonly version: 1;
84
+ readonly type: "requested";
85
+ readonly block: RepairBlockIdentity;
86
+ } | {
87
+ readonly version: 1;
88
+ readonly type: "recovered" | "failed";
89
+ readonly block: RepairBlockIdentity;
90
+ readonly symbols: {
91
+ readonly multicast: number;
92
+ readonly moq: number;
93
+ };
94
+ };
95
+ export type RepairLifecycleObserver = (event: RepairLifecycleEvent) => void;
96
+ export interface RepairLifecycleSource {
97
+ addRepairLifecycleObserver(observer: RepairLifecycleObserver): () => void;
98
+ }
99
+ /** Minimal event shape accepted by application-owned event targets. */
100
+ export interface RepairLifecycleApplicationEvent {
101
+ readonly type: string;
102
+ readonly detail: RepairLifecycleEvent;
103
+ }
104
+ /** DOM EventTarget event shape, including the Node 18 Event fallback. */
105
+ export interface RepairLifecycleDomEvent extends Event {
106
+ readonly detail: RepairLifecycleEvent;
107
+ }
108
+ /** Structural target contract shared by DOM and Closure-style event targets. */
109
+ export interface RepairLifecycleEventTarget<TEvent extends RepairLifecycleApplicationEvent> {
110
+ dispatchEvent(event: TEvent): unknown;
111
+ }
112
+ export interface RepairLifecycleEventOptions<TEvent extends RepairLifecycleApplicationEvent = RepairLifecycleDomEvent> {
113
+ bubbles?: boolean;
114
+ composed?: boolean;
115
+ createEvent?: RepairLifecycleEventFactory<TEvent>;
116
+ }
117
+ export type RepairLifecycleEventFactory<TEvent extends RepairLifecycleApplicationEvent = RepairLifecycleDomEvent> = (type: typeof REPAIR_LIFECYCLE_EVENT_TYPE, detail: RepairLifecycleEvent, options: Readonly<{
118
+ bubbles: boolean;
119
+ composed: boolean;
120
+ }>) => TEvent;
121
+ /** Public EventTarget event carrying an immutable RepairLifecycleEvent detail. */
122
+ export declare const REPAIR_LIFECYCLE_EVENT_TYPE = "repairlifecycle";
123
+ /** Diagnostic JSON-lines prefix. Never consume logs as a lifecycle API. */
124
+ export declare const REPAIR_LIFECYCLE_LOG_PREFIX = "[MulticastManager] repair-lifecycle ";
125
+ /** Runtime guard for observer, DOM-event, and cross-realm consumers. */
126
+ export declare function isRepairLifecycleEvent(value: unknown): value is RepairLifecycleEvent;
127
+ /**
128
+ * Forward typed repair lifecycle observations through an application-owned
129
+ * EventTarget. The adapter retains no history; the returned function detaches
130
+ * the observer.
131
+ */
132
+ export declare function forwardRepairLifecycleEvents<TEvent extends RepairLifecycleApplicationEvent>(source: RepairLifecycleSource, target: RepairLifecycleEventTarget<TEvent>, options: RepairLifecycleEventOptions<TEvent> & {
133
+ createEvent: RepairLifecycleEventFactory<TEvent>;
134
+ }): () => void;
135
+ export declare function forwardRepairLifecycleEvents(source: RepairLifecycleSource, target: EventTarget, options?: RepairLifecycleEventOptions): () => void;
136
+ /** Catalog track descriptor for configureMultiTrack(). */
137
+ export interface MultiTrackCatalogTrack {
138
+ name: string;
139
+ altGroup?: number;
140
+ framerate?: number;
141
+ fec?: unknown;
142
+ /** PacketId for testability — in production, learned at subscribe time (Plan 03). */
143
+ packetId?: number;
144
+ }
145
+ /** Multi-track catalog shape accepted by configureMultiTrack(). */
146
+ export interface MultiTrackCatalog {
147
+ tracks: MultiTrackCatalogTrack[];
148
+ }
149
+ /** Creates one stateful synchronous FEC decoder per physical catalog stream. */
150
+ export type WasmFecDecoderFactory = (track: Readonly<MultiTrackCatalogTrack>) => WasmFecDecoder;
151
+ export declare class MulticastManager {
152
+ #private;
153
+ constructor(options?: MulticastManagerOptions);
154
+ get fecManager(): FECManager;
155
+ get router(): MmtpRouter;
156
+ get transport(): MulticastTransport;
157
+ get reassembler(): MfuReassemblerBackend;
158
+ get diagnostics(): {
159
+ _fec: {
160
+ timeoutMs: number;
161
+ activeBlocks: number;
162
+ completedBlocks: number;
163
+ pendingCounts: {
164
+ [k: string]: number;
165
+ };
166
+ fpsDetected: boolean;
167
+ interleaveDepthMs: number;
168
+ startupAlignedPackets: number[];
169
+ startupPartialBlocks: number;
170
+ startupRepairReadyPackets: number[];
171
+ startupRepairFailOpenPackets: number[];
172
+ pendingWorkerCleanups: number;
173
+ repairTrackedBlocks: number;
174
+ lifecycleTrace: {
175
+ atMs: number;
176
+ event: "repair-requested" | "repair-arrived" | "timeout-queued" | "cleanup-ack" | "recovered" | "failed";
177
+ packetId: number;
178
+ sbn: number;
179
+ catalogTrackName?: string;
180
+ sourceCount: number;
181
+ sourceEsis: number[];
182
+ repairRsIds: number[];
183
+ decoderPath: "worker" | "sync" | "none";
184
+ deadlineRemainingMs?: number;
185
+ pendingCleanup: boolean;
186
+ rsId?: number;
187
+ }[];
188
+ };
189
+ };
190
+ get stats(): import("./multicast-transport.js").MulticastTransportStats;
191
+ get fecStats(): import("./fec-manager.js").FecStats;
192
+ /** The raw WASM decoder for stats access */
193
+ get wasmDecoder(): WasmFecDecoder | null;
194
+ setFecDecoder(packetId: number, client: WasmFecDecoder, k: number, trackType?: "video" | "audio", config?: FECManagerConfig, catalogTrackName?: string): void;
195
+ /**
196
+ * Register a Worker-backed FEC decoder for a specific packetId (track).
197
+ * Worker-backed tracks decode asynchronously — recovered frames arrive via
198
+ * FECManager.onBlockRecovered callback instead of feedSourceSymbol return value.
199
+ */
200
+ setFecWorker(packetId: number, client: FecWorkerClient, trackType: "video" | "audio", config: FECManagerConfig, catalogTrackName?: string): void;
201
+ /** Register callback for Worker-level FecTrackStats updates. */
202
+ setOnFecStatsUpdate(cb: (packetId: number, stats: FecTrackStats) => void): void;
203
+ setFramerate(fps: number): void;
204
+ /**
205
+ * Configure one track's FEC geometry, block mapper, and block-inactivity
206
+ * deadline from that track's own catalog values, then re-reduce the
207
+ * stream-global deadlines across every registered track.
208
+ *
209
+ * This is the packet-specific replacement for the global `configureFec`
210
+ * side effects: per-track concerns stay per-track, and the genuinely
211
+ * stream-global ones (transport failback, router MFU timeout, router reorder
212
+ * window) become an explicit max reduction instead of a last-caller-wins race
213
+ * in which whichever track configured last silently set the whole stream's
214
+ * timing.
215
+ */
216
+ configureTrackFec(packetId: number, config: Pick<MulticastEndpointConfig, "fecK" | "fecRepairSymbols" | "fecSymbolSize" | "fecInterleaveDepthMs" | "fecReorderToleranceMs" | "fps" | "bandwidth" | "minimumFailbackWindowMs">): void;
217
+ configureFec(config: Pick<MulticastEndpointConfig, "fecK" | "fecRepairSymbols" | "fecSymbolSize" | "fecInterleaveDepthMs" | "fecReorderToleranceMs" | "fps" | "bandwidth" | "minimumFailbackWindowMs">): void;
218
+ /** Register callback for track type discovery (from init data / inline signaling). */
219
+ onTrackTypeDiscovered(cb: (packetId: number, trackType: "video" | "audio") => void): void;
220
+ setPacketIdType(packetId: number, trackType: "video" | "audio"): void;
221
+ /**
222
+ * Set the keyframe loss timeout on the inner MmtpRouter.
223
+ * Must be called BEFORE setPacketIdType('video').
224
+ * Derive from explicit keyframe/group duration:
225
+ * Math.ceil(groupDurationMs * KEYFRAME_LOST_TIMEOUT_SLACK).
226
+ */
227
+ setKeyframeLostTimeoutMs(ms: number): void;
228
+ setMfuTimeoutMs(ms: number): void;
229
+ setTrackCodec(packetId: number, codec: string): void;
230
+ onVideoFrame(cb: FrameCallback): void;
231
+ onAudioFrame(cb: FrameCallback): void;
232
+ onTrackFrame(packetId: number, cb: FrameCallback): void;
233
+ onTrackPacket(packetId: number, cb: TrackPacketCallback): void;
234
+ onInitSegment(cb: (data: Uint8Array) => void): void;
235
+ onTrackInit(packetId: number, cb: (data: Uint8Array) => void): void;
236
+ onFecBlockStarted(cb: (sbn: number, packetId: number) => void): void;
237
+ /** Unrecoverable-FEC-block signal. Players drive decoder recovery from this
238
+ * (a starved decoder cannot resync on its own once the block is abandoned). */
239
+ onFecBlockFailed(cb: (sbn: number, packetId: number, catalogTrackName?: string) => void): void;
240
+ enableMseAssembler(packetId: number, config: Omit<BlockAssemblerConfig, "k">, catalogTrackName?: string): import("./cmaf-block-assembler.js").CmafBlockAssembler;
241
+ onMseSegment(packetId: number, cb: (segment: Uint8Array) => void, catalogTrackName?: string): void;
242
+ onMseSample(packetId: number, cb: (sample: CmafBlockSample) => void, catalogTrackName?: string): void;
243
+ onMseInitSegment(packetId: number, cb: (init: Uint8Array) => void, catalogTrackName?: string): void;
244
+ emitMseInit(packetId: number, catalogTrackName?: string): void;
245
+ markExternalVideoSync(packetId?: number, catalogTrackName?: string): void;
246
+ onTakeover(cb: () => void): void;
247
+ onFailback(cb: () => void): void;
248
+ confirmVideo(): void;
249
+ confirmAudio(): void;
250
+ static isAvailable(): boolean;
251
+ join(config: MulticastEndpointConfig): Promise<boolean>;
252
+ /** Feed a raw packet from an external source (AMT tunnel, ASM subscription).
253
+ *
254
+ * For MoQ-unicast-fallback mode (no SSM bridge), call
255
+ * `manager.router.feedPacket(packet, "moq")` directly to bypass
256
+ * MulticastTransport's takeover/watchdog/failback gates while preserving
257
+ * transport attribution in FEC path counters.
258
+ * The `router` accessor above is already public.
259
+ */
260
+ feedPacket(data: ArrayBuffer | Uint8Array, ingress?: MmtpIngressContext): void;
261
+ /** Process a repair packet from MoQ (reliable QUIC). */
262
+ processRepairFromMoQ(packet: Uint8Array, ownerPacketId?: number, catalogTrackName?: string): void;
263
+ /** Route a Worker-recovered FEC block through the MMTP parser + dedup pipeline. */
264
+ routeRecoveredBlock(blockId: number, data: Uint8Array, packetId: number, catalogTrackName?: string): void;
265
+ /** Route one Worker-recovered source symbol through the MMTP parser + dedup pipeline. */
266
+ routeRecoveredSymbol(blockId: number, data: Uint8Array, packetId: number, esi?: number, catalogTrackName?: string): void;
267
+ /**
268
+ * Configure the manager for a multi-track (base/delta/repair) CMAF switching set.
269
+ *
270
+ * D-04: Validates completeness via validateSwitchingSet — throws if incomplete.
271
+ * D-07: Applies per-track FEC configs (base+delta get decoders; repair does not).
272
+ * D-17: Builds altGroup → track-name index for getSwitchingSet().
273
+ * D-26: Registers packetId → TrackRole on MmtpRouter for block-complete fanout.
274
+ *
275
+ * @param catalog - Multi-track catalog (tracks array with name, altGroup, fec, packetId).
276
+ * @param wasmDecoderSource - One WASM FEC decoder for a single FEC stream, or
277
+ * a factory returning a distinct decoder per stream.
278
+ */
279
+ configureMultiTrack(catalog: MultiTrackCatalog, wasmDecoderSource?: WasmFecDecoder | WasmFecDecoderFactory): void;
280
+ /**
281
+ * Return the track names belonging to the given altGroup switching set.
282
+ * D-17: altGroup groups base+delta+repair into one switching set.
283
+ *
284
+ * @param altGroup - The altGroup number to look up.
285
+ * @returns Array of track names in that switching set (empty if none).
286
+ */
287
+ getSwitchingSet(altGroup: number): string[];
288
+ /**
289
+ * Register callback fired when a repair fetch should be issued for an FEC block.
290
+ *
291
+ * D-28: At most one outstanding repair fetch per (packetId, sbn) block.
292
+ * clearRepairForBlock fires automatically when the block resolves (via
293
+ * FECManager.onRepairResolved); call it manually only on fetch failure
294
+ * paths the FEC layer cannot observe (fetch error, range not retained,
295
+ * transport timeout) so a stuck fetch cannot wedge the block's slot.
296
+ *
297
+ * Registering also arms the FEC repair deadline: each block gets a one-shot
298
+ * timer for the derived K-symbol source-production horizon; a block still
299
+ * short of K when it fires requests repair here. Failure accounting timing
300
+ * is unchanged.
301
+ */
302
+ onRepairSubscribe(cb: (sbn: number, packetId: number, catalogTrackName?: string) => void): void;
303
+ /**
304
+ * Observe causal repair lifecycle events without retaining snapshots in the
305
+ * transport. Returns an unsubscribe function.
306
+ */
307
+ addRepairLifecycleObserver(observer: RepairLifecycleObserver): () => void;
308
+ /** Observe per-stream epoch resets (used by repair transports to abort I/O). */
309
+ addTrackResetObserver(observer: (packetId: number, catalogTrackName: string) => void): () => void;
310
+ /** Begin a fresh retained-replay epoch for one physical media stream. */
311
+ resetTrack(packetId: number, catalogTrackName: string): void;
312
+ /**
313
+ * Request a repair-track fetch for the given FEC block.
314
+ *
315
+ * D-28: duplicate requests for the same (packetId, sbn) are suppressed
316
+ * until clearRepairForBlock is called.
317
+ *
318
+ * @param sbn - Source Block Number identifying the FEC block needing repair.
319
+ * @param packetId - MMTP packet_id owning the block (video/audio tracks have
320
+ * independent SBN spaces, so the in-flight key must be composite).
321
+ */
322
+ requestRepairForBlock(sbn: number, packetId: number, catalogTrackName?: string): void;
323
+ /**
324
+ * Clear in-flight repair state for the given block.
325
+ * Fired automatically when the block resolves; safe to call redundantly.
326
+ */
327
+ clearRepairForBlock(sbn: number, packetId: number, catalogTrackName?: string): void;
328
+ dispose(): void;
329
+ }
330
+ //# sourceMappingURL=multicast-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multicast-manager.d.ts","sourceRoot":"","sources":["../src/multicast-manager.ts"],"names":[],"mappings":"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"}