@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,336 @@
1
+ /**
2
+ * Phase 14 catalog-override hook (test harness only).
3
+ *
4
+ * When `globalThis.__PHASE14_CATALOG_OVERRIDE` is set (injected by the
5
+ * 7point test via `page.addInitScript` — see
6
+ * packages/moq-server/tests/7point-validation.test.mjs `applyPhase14CatalogOverride`)
7
+ * the override's `tracks[]` are merged into whatever catalog the MoQ-delivered
8
+ * JSON produced:
9
+ *
10
+ * - Dedupe by `track.name`.
11
+ * - When both sides carry a track with the same name, the override's
12
+ * `fec` config wins — this is how the 7point harness steers multi-track
13
+ * tests onto the Phase 14 `video/base` + `video/delta` + `video/repair`
14
+ * switching set without asking the publisher to change its catalog.
15
+ * - Tracks present only in the override are appended as-is.
16
+ * - Tracks present only in the MoQ catalog are preserved unchanged.
17
+ *
18
+ * This module is deliberately player-agnostic. It exposes:
19
+ *
20
+ * getPhase14CatalogOverride() — read + shape-check the global.
21
+ * mergeOverrideIntoHangRenditions() — merge into a `@moq/hang`
22
+ * Catalog.Root `video.renditions` /
23
+ * `audio.renditions` dict. Used by
24
+ * hang-mmt-fec/js/watch/src/broadcast.ts.
25
+ * mergeOverrideIntoCmsfTracks() — merge into moqtail's CMSF-flat
26
+ * `tracks[]` array. Used by
27
+ * moqtail-private CMSFCatalog.from().
28
+ *
29
+ * Production builds never set the global, so all three helpers are no-ops at
30
+ * runtime unless the test harness opts in.
31
+ */
32
+
33
+ import type { FecAlgorithm, FecCatalogConfig } from "./carp-catalog.js";
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Override fixture shape (IETF draft-ietf-moq-catalogformat-01)
37
+ // ---------------------------------------------------------------------------
38
+
39
+ /**
40
+ * A single override track entry — mirrors the fixture at
41
+ * `packages/moq-server/tests/fixtures/multi-track-catalog.json`.
42
+ *
43
+ * Kept intentionally permissive: the canonical fixture carries `name`,
44
+ * `altGroup`, `framerate`, and `fec`, but future 7point scenarios may extend
45
+ * with additional hints without wanting this module to gate-keep them.
46
+ */
47
+ export interface Phase14OverrideTrack {
48
+ name: string;
49
+ /** CMSF packaging kind. Optional per track — when absent, the merge
50
+ * derives it from the override's top-level `streamingFormat`. */
51
+ packaging?: "mmtp" | "cmaf" | "loc" | "timeline";
52
+ /** Required when packaging is `mmtp`; the current publisher emits MFU mode. */
53
+ mmtpMode?: "mpu" | "mfu";
54
+ /** Required when packaging is `mmtp`; copied into synthesized CMSF tracks. */
55
+ timescale?: number;
56
+ /** Required when packaging is `mmtp`; copied into synthesized CMSF tracks. */
57
+ groupDurationMs?: number;
58
+ /** Codec string. Optional per track — when absent, the merge inherits
59
+ * from the existing video/audio rendition in the MoQ catalog (the
60
+ * publisher's declaration). Throws only when neither the override nor
61
+ * any existing rendition supplies one. */
62
+ codec?: string;
63
+ role?: "video" | "audio" | "timeline";
64
+ altGroup?: number;
65
+ framerate?: number;
66
+ fec?: Partial<FecCatalogConfig> & { algorithm: FecAlgorithm };
67
+ }
68
+
69
+ /**
70
+ * The shape the 7point harness writes to `globalThis.__PHASE14_CATALOG_OVERRIDE`.
71
+ * Extra top-level fields (`version`, `streamingFormat`, ...) are ignored —
72
+ * the merge only consumes `tracks[]`.
73
+ */
74
+ export interface Phase14CatalogOverride {
75
+ version?: string;
76
+ streamingFormat?: string;
77
+ tracks: Phase14OverrideTrack[];
78
+ }
79
+
80
+ // ---------------------------------------------------------------------------
81
+ // Global reader
82
+ // ---------------------------------------------------------------------------
83
+
84
+ /**
85
+ * Read `globalThis.__PHASE14_CATALOG_OVERRIDE` and return it only when it has
86
+ * a well-formed `tracks[]` array. Malformed values log + return `null` rather
87
+ * than throw so a broken fixture never kills the MoQ path for a real stream.
88
+ */
89
+ export function getPhase14CatalogOverride(): Phase14CatalogOverride | null {
90
+ // `globalThis` is defined in workers, service workers, and the main window;
91
+ // it's the portable way to reach the test-injected hook from any context.
92
+ const g = globalThis as Record<string, unknown>;
93
+ const raw = g["__PHASE14_CATALOG_OVERRIDE"];
94
+ if (raw === undefined || raw === null) return null;
95
+ if (typeof raw !== "object") {
96
+ console.warn("[phase14-catalog-override] hook is not an object; ignoring");
97
+ return null;
98
+ }
99
+ const obj = raw as Record<string, unknown>;
100
+ const tracks = obj["tracks"];
101
+ if (!Array.isArray(tracks)) {
102
+ console.warn("[phase14-catalog-override] hook.tracks is not an array; ignoring");
103
+ return null;
104
+ }
105
+ // Shallow filter: keep only entries that at least have a string name.
106
+ // Each consumer (hang or CMSF merge) validates shape further.
107
+ const filtered: Phase14OverrideTrack[] = [];
108
+ for (const t of tracks) {
109
+ if (typeof t === "object" && t !== null) {
110
+ const entry = t as Record<string, unknown>;
111
+ if (typeof entry["name"] === "string" && (entry["name"] as string).length > 0) {
112
+ filtered.push(entry as unknown as Phase14OverrideTrack);
113
+ }
114
+ }
115
+ }
116
+ if (filtered.length === 0) return null;
117
+ return {
118
+ version: typeof obj["version"] === "string" ? (obj["version"] as string) : undefined,
119
+ streamingFormat:
120
+ typeof obj["streamingFormat"] === "string" ? (obj["streamingFormat"] as string) : undefined,
121
+ tracks: filtered,
122
+ };
123
+ }
124
+
125
+ // ---------------------------------------------------------------------------
126
+ // Hang renditions merge (moq-lib / hang-mmt-fec)
127
+ // ---------------------------------------------------------------------------
128
+
129
+ /**
130
+ * Merge override tracks into a `@moq/hang` Catalog.Root-like object. The
131
+ * caller passes the already-parsed Catalog.Root (mutates in place and also
132
+ * returns it for convenience). No-op when `override` is null.
133
+ *
134
+ * Dedupe rule: override wins for `fec` config and `framerate`. Everything
135
+ * else (codec, container kind) is preserved from the MoQ-delivered rendition
136
+ * when it exists, or synthesised from the override when it does not.
137
+ *
138
+ * Typed `any` here rather than narrow-matching `Catalog.Root` because the
139
+ * upstream `@moq/hang` schema is branded (u53) and the container `kind` union
140
+ * varies by version (`loc` kind appears in hang-mmt-fec's fork). Matching
141
+ * that surface exactly would over-couple this module to a single upstream
142
+ * revision; the runtime shape we rely on (`.video.renditions` dict mutation)
143
+ * is stable.
144
+ */
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
+ export function mergeOverrideIntoHangRenditions<T extends Record<string, any>>(
147
+ catalog: T,
148
+ override: Phase14CatalogOverride | null,
149
+ ): T {
150
+ if (!override) return catalog;
151
+
152
+ for (const track of override.tracks) {
153
+ // Default role inference: names without an explicit role field are
154
+ // treated as video unless the name suffix says audio.
155
+ const role: "video" | "audio" =
156
+ track.role === "audio" || track.name.startsWith("audio") ? "audio" : "video";
157
+
158
+ const bagKey = role === "audio" ? "audio" : "video";
159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
160
+ const bag: { renditions: Record<string, any>; priority?: number } =
161
+ catalog[bagKey] ?? { renditions: {}, priority: 1 };
162
+ const existing = bag.renditions[track.name];
163
+
164
+ // Merge: override fills gaps, does NOT overwrite existing fec/framerate.
165
+ // The publisher's real catalog is ground truth for wire parameters:
166
+ // if the existing rendition already has a matching fec config, that's
167
+ // what the publisher's packets actually carry. Overwriting it with a
168
+ // fixture value (e.g. Phase 14 target K=768 when publisher emits K=4)
169
+ // causes the FEC manager to wait for symbols that never arrive.
170
+ // Only when the rendition is brand-new (no existing fec) do we seed
171
+ // from the fixture.
172
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
+ const merged: Record<string, any> = {
174
+ ...(existing ?? {}),
175
+ container: existing?.container ?? { kind: "mmtp-fec" },
176
+ codec: existing?.codec ?? "",
177
+ };
178
+ if (existing?.framerate === undefined && track.framerate !== undefined) {
179
+ merged["framerate"] = track.framerate;
180
+ }
181
+ if (existing?.fec === undefined && track.fec !== undefined) {
182
+ merged["fec"] = track.fec;
183
+ }
184
+
185
+ bag.renditions[track.name] = merged;
186
+ // Reassign so a freshly-created bag is actually reachable on the
187
+ // catalog when the MoQ side was missing video/audio entirely.
188
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
+ (catalog as any)[bagKey] = bag;
190
+ }
191
+ return catalog;
192
+ }
193
+
194
+ // ---------------------------------------------------------------------------
195
+ // CMSF tracks merge (moqtail-private)
196
+ // ---------------------------------------------------------------------------
197
+
198
+ /**
199
+ * Shape-minimal description of a CMSF track input (pre-validation JSON, not
200
+ * the parsed `CMSFTrack`). Keeps this module free of a hard dependency on
201
+ * moqtail-ts.
202
+ */
203
+ type CmsfTrackJson = {
204
+ name: string;
205
+ packaging?: string;
206
+ mmtpMode?: string;
207
+ timescale?: number;
208
+ groupDurationMs?: number;
209
+ role?: string;
210
+ codec?: string;
211
+ framerate?: number;
212
+ fec?: unknown;
213
+ [k: string]: unknown;
214
+ };
215
+
216
+ function isPositiveInteger(value: unknown): value is number {
217
+ return typeof value === "number" && Number.isInteger(value) && value > 0;
218
+ }
219
+
220
+ /**
221
+ * Merge override tracks into a raw CMSF `tracks[]` JSON array (as produced
222
+ * by `JSON.parse(catalog.json)` inside `CMSFCatalog.from`).
223
+ *
224
+ * Dedupe by `name`. For name collisions, publisher-emitted `fec` + `framerate`
225
+ * are preserved (the publisher is ground truth for wire parameters). For new
226
+ * track names, missing `packaging` is derived from the override's top-level
227
+ * `streamingFormat`, and missing `codec` is inherited from any existing video
228
+ * track in the catalog. Throws on bad init when neither source supplies them.
229
+ */
230
+ export function mergeOverrideIntoCmsfTracks(
231
+ tracks: CmsfTrackJson[],
232
+ override: Phase14CatalogOverride | null,
233
+ ): CmsfTrackJson[] {
234
+ if (!override) return tracks;
235
+
236
+ const byName = new Map<string, CmsfTrackJson>();
237
+ for (const t of tracks) {
238
+ if (typeof t?.name === "string") byName.set(t.name, t);
239
+ }
240
+
241
+ // Catalog-derived fallbacks (NOT magic numbers) — inherited from existing
242
+ // publisher tracks. Used only when the override track doesn't carry them.
243
+ const derivedPackaging = override.streamingFormat;
244
+ const existingVideoTrack = tracks.find(
245
+ (t) => t.role === "video" && typeof t.codec === "string" && (t.codec as string).length > 0,
246
+ );
247
+ const existingAudioTrack = tracks.find(
248
+ (t) => t.role === "audio" && typeof t.codec === "string" && (t.codec as string).length > 0,
249
+ );
250
+
251
+ for (const ot of override.tracks) {
252
+ const existing = byName.get(ot.name);
253
+ if (existing !== undefined) {
254
+ // Preserve publisher-emitted fec + framerate — those describe what
255
+ // is actually on the wire. Overwriting with fixture values causes
256
+ // the player's FEC manager to wait for symbols that never arrive
257
+ // when the fixture's K/P don't match the publisher's.
258
+ if (existing.fec === undefined && ot.fec !== undefined) existing.fec = ot.fec;
259
+ if (existing.framerate === undefined && ot.framerate !== undefined) {
260
+ existing.framerate = ot.framerate;
261
+ }
262
+ if (ot.role !== undefined && existing.role === undefined) existing.role = ot.role;
263
+ if (existing.packaging === "mmtp") {
264
+ const mode = existing.mmtpMode ?? ot.mmtpMode;
265
+ if (mode !== "mpu" && mode !== "mfu") {
266
+ throw new Error(
267
+ `[phase14-catalog-override] track "${ot.name}" has packaging='mmtp' but no valid mmtpMode`,
268
+ );
269
+ }
270
+ existing.mmtpMode = mode;
271
+ if (existing.timescale === undefined && ot.timescale !== undefined) existing.timescale = ot.timescale;
272
+ if (existing.groupDurationMs === undefined && ot.groupDurationMs !== undefined) {
273
+ existing.groupDurationMs = ot.groupDurationMs;
274
+ }
275
+ if (!isPositiveInteger(existing.timescale)) {
276
+ throw new Error(
277
+ `[phase14-catalog-override] track "${ot.name}" has packaging='mmtp' but no valid timescale`,
278
+ );
279
+ }
280
+ if (!isPositiveInteger(existing.groupDurationMs)) {
281
+ throw new Error(
282
+ `[phase14-catalog-override] track "${ot.name}" has packaging='mmtp' but no valid groupDurationMs`,
283
+ );
284
+ }
285
+ }
286
+ } else {
287
+ const packaging = ot.packaging ?? derivedPackaging;
288
+ if (typeof packaging !== "string" || packaging.length === 0) {
289
+ throw new Error(
290
+ `[phase14-catalog-override] track "${ot.name}" has no packaging — supply per-track or set top-level streamingFormat`,
291
+ );
292
+ }
293
+ // Role inference: repair tracks (ending in /repair) stay role-less
294
+ // per CMSF convention; others default to video.
295
+ const role = ot.role ?? (ot.name.endsWith("/repair") ? undefined : "video");
296
+ const inheritedCodec =
297
+ role === "audio" ? existingAudioTrack?.codec : existingVideoTrack?.codec;
298
+ const codec = ot.codec ?? inheritedCodec;
299
+ if (packaging !== "timeline" && (typeof codec !== "string" || codec.length === 0)) {
300
+ throw new Error(
301
+ `[phase14-catalog-override] track "${ot.name}" has no codec (packaging='${packaging}') — supply per-track or ensure the publisher catalog has a ${role ?? "video"} track to inherit from`,
302
+ );
303
+ }
304
+ const mmtpMode = ot.mmtpMode;
305
+ if (packaging === "mmtp" && mmtpMode !== "mpu" && mmtpMode !== "mfu") {
306
+ throw new Error(
307
+ `[phase14-catalog-override] track "${ot.name}" has packaging='mmtp' but no valid mmtpMode`,
308
+ );
309
+ }
310
+ if (packaging === "mmtp" && !isPositiveInteger(ot.timescale)) {
311
+ throw new Error(
312
+ `[phase14-catalog-override] track "${ot.name}" has packaging='mmtp' but no valid timescale`,
313
+ );
314
+ }
315
+ if (packaging === "mmtp" && !isPositiveInteger(ot.groupDurationMs)) {
316
+ throw new Error(
317
+ `[phase14-catalog-override] track "${ot.name}" has packaging='mmtp' but no valid groupDurationMs`,
318
+ );
319
+ }
320
+ const entry: CmsfTrackJson = {
321
+ name: ot.name,
322
+ packaging,
323
+ codec: codec as string,
324
+ };
325
+ if (mmtpMode !== undefined) entry.mmtpMode = mmtpMode;
326
+ if (ot.timescale !== undefined) entry.timescale = ot.timescale;
327
+ if (ot.groupDurationMs !== undefined) entry.groupDurationMs = ot.groupDurationMs;
328
+ if (role !== undefined) entry.role = role;
329
+ if (ot.framerate !== undefined) entry.framerate = ot.framerate;
330
+ if (ot.fec !== undefined) entry.fec = ot.fec;
331
+ tracks.push(entry);
332
+ byName.set(ot.name, entry);
333
+ }
334
+ }
335
+ return tracks;
336
+ }
@@ -0,0 +1,217 @@
1
+ /**
2
+ * D-28 shared repair-fetch shell.
3
+ *
4
+ * Player-agnostic orchestration for per-SBN on-demand MoQ FEC repair
5
+ * backfill. Each player (moqtail client, hang watch, Shaka MSF bridge)
6
+ * supplies only its protocol verb via {@link RepairFetchTransport}:
7
+ *
8
+ * - moqtail: standalone FETCH (FetchType.Standalone) for group [sbn, sbn+1)
9
+ * - moq-lite/hang: Subscribe with startGroup=sbn, endGroup=sbn (the relay
10
+ * propagates startGroup upstream to pull the past group from the origin's
11
+ * producer cache)
12
+ *
13
+ * Everything else — registration, fire-time repair-track resolution, per-fetch
14
+ * abort/timeout, feeding symbols, and in-flight slot release on failure — is
15
+ * identical across players and lives here.
16
+ */
17
+
18
+ import type { MulticastManager } from './multicast-manager.js'
19
+
20
+ /** Resolve a packetId to its repair track name at FIRE TIME.
21
+ *
22
+ * Called on every repair request, never cached by the shell: ABR ladder
23
+ * rungs can share a packetId (e.g. video/720p and video/360p both p:1), so
24
+ * the mapping must reflect the track active when the request fires, not
25
+ * when the shell was wired. Return null when the packetId has no
26
+ * repair-bearing track — the request is released without a fetch. */
27
+ export type ResolveRepairTarget = (
28
+ packetId: number,
29
+ catalogTrackName?: string,
30
+ ) => { repairTrack: string } | null
31
+
32
+ /** Protocol-specific fetch of one FEC block's repair group.
33
+ *
34
+ * Yield each repair object payload (MMTP packet bytes, ISO 23008-1 §C.5.3
35
+ * Repair FEC Payload ID framing). Return when the group ends. MUST abort
36
+ * promptly when `signal` fires — the shell bounds every fetch by the
37
+ * block's remaining repair budget. */
38
+ export type RepairFetchTransport = (
39
+ repairTrack: string,
40
+ sbn: number,
41
+ packetId: number,
42
+ signal: AbortSignal,
43
+ ) => AsyncIterable<Uint8Array>
44
+
45
+ export interface WireRepairFetchOptions {
46
+ resolveTarget: ResolveRepairTarget
47
+ transport: RepairFetchTransport
48
+ /** Override the per-fetch timeout. Default: the budget between the resolved
49
+ * K-symbol source horizon and the block fail bound. */
50
+ timeoutMsForPacket?: (packetId: number) => number
51
+ /** Classify a transport error as a transient publisher/relay retention race.
52
+ * Matching failures are retried only inside the block's remaining budget. */
53
+ shouldRetry?: (error: unknown) => boolean
54
+ /** Delay between classified transient attempts. Default: 10ms. */
55
+ retryDelayMs?: number
56
+ }
57
+
58
+ /**
59
+ * Wire the D-28 repair-fetch shell onto a MulticastManager.
60
+ *
61
+ * Call AFTER the manager has a repair-bearing FEC configuration (players gate
62
+ * this on the first fec-setup that carries a repairTrack) — registration arms
63
+ * the per-block repair deadlines in the FEC layer.
64
+ *
65
+ * Returns a dispose function that aborts outstanding fetches and stops new
66
+ * ones from being issued.
67
+ */
68
+ export function wireRepairFetch(mc: MulticastManager, opts: WireRepairFetchOptions): () => void {
69
+ type InFlightRepair = {
70
+ controller: AbortController
71
+ sbn: number
72
+ packetId: number
73
+ catalogTrackName?: string
74
+ }
75
+ const inFlight = new Map<string, InFlightRepair>()
76
+ let disposed = false
77
+ const requestKey = (
78
+ sbn: number,
79
+ packetId: number,
80
+ catalogTrackName?: string,
81
+ ): string => JSON.stringify([packetId, catalogTrackName ?? null, sbn])
82
+
83
+ const removeResetObserver = mc.addTrackResetObserver(
84
+ (packetId, catalogTrackName) => {
85
+ for (const [key, request] of inFlight) {
86
+ if (
87
+ request.packetId === packetId &&
88
+ request.catalogTrackName === catalogTrackName
89
+ ) {
90
+ request.controller.abort()
91
+ inFlight.delete(key)
92
+ }
93
+ }
94
+ },
95
+ )
96
+
97
+ const timeoutFor = (
98
+ sbn: number,
99
+ packetId: number,
100
+ catalogTrackName?: string,
101
+ ): number =>
102
+ opts.timeoutMsForPacket?.(packetId) ??
103
+ mc.fecManager.repairFetchTimeoutMsForBlock(
104
+ sbn,
105
+ packetId,
106
+ catalogTrackName,
107
+ )
108
+ const clearRepair = (
109
+ sbn: number,
110
+ packetId: number,
111
+ catalogTrackName?: string,
112
+ ): void => {
113
+ if (catalogTrackName === undefined) mc.clearRepairForBlock(sbn, packetId)
114
+ else mc.clearRepairForBlock(sbn, packetId, catalogTrackName)
115
+ }
116
+ const clearRepairIfOwner = (key: string, request: InFlightRepair): void => {
117
+ if (inFlight.get(key) !== request) return
118
+ clearRepair(request.sbn, request.packetId, request.catalogTrackName)
119
+ }
120
+ const waitForRetry = (signal: AbortSignal): Promise<void> =>
121
+ new Promise((resolve) => {
122
+ if (signal.aborted) {
123
+ resolve()
124
+ return
125
+ }
126
+ let timer: ReturnType<typeof setTimeout>
127
+ const onAbort = () => {
128
+ clearTimeout(timer)
129
+ resolve()
130
+ }
131
+ timer = setTimeout(() => {
132
+ signal.removeEventListener('abort', onAbort)
133
+ resolve()
134
+ }, Math.max(1, opts.retryDelayMs ?? 10))
135
+ signal.addEventListener('abort', onAbort, { once: true })
136
+ })
137
+
138
+ mc.onRepairSubscribe((sbn, packetId, catalogTrackName) => {
139
+ if (disposed) {
140
+ clearRepair(sbn, packetId, catalogTrackName)
141
+ return
142
+ }
143
+
144
+ // Fire-time resolution — see ResolveRepairTarget.
145
+ const target = opts.resolveTarget(packetId, catalogTrackName)
146
+ if (!target) {
147
+ clearRepair(sbn, packetId, catalogTrackName)
148
+ return
149
+ }
150
+
151
+ const ctrl = new AbortController()
152
+ const key = requestKey(sbn, packetId, catalogTrackName)
153
+ const previous = inFlight.get(key)
154
+ previous?.controller.abort()
155
+ const request: InFlightRepair = { controller: ctrl, sbn, packetId, catalogTrackName }
156
+ inFlight.set(key, request)
157
+ const timeoutMs = timeoutFor(sbn, packetId, catalogTrackName)
158
+ const timer = setTimeout(() => ctrl.abort(), Math.max(1, timeoutMs))
159
+
160
+ void (async () => {
161
+ let fed = 0
162
+ try {
163
+ while (!ctrl.signal.aborted) {
164
+ try {
165
+ for await (const packet of opts.transport(
166
+ target.repairTrack,
167
+ sbn,
168
+ packetId,
169
+ ctrl.signal,
170
+ )) {
171
+ if (ctrl.signal.aborted) break
172
+ if (inFlight.get(key) !== request) break
173
+ fed++
174
+ if (catalogTrackName === undefined) {
175
+ mc.processRepairFromMoQ(packet, packetId)
176
+ } else {
177
+ mc.processRepairFromMoQ(packet, packetId, catalogTrackName)
178
+ }
179
+ }
180
+ break
181
+ } catch (err) {
182
+ if (fed > 0 || ctrl.signal.aborted || !opts.shouldRetry?.(err)) throw err
183
+ await waitForRetry(ctrl.signal)
184
+ }
185
+ }
186
+ // A fetch that ended without feeding anything cannot resolve the
187
+ // block; release the slot so failure accounting is not wedged. A
188
+ // fetch that fed symbols leaves resolution to the FEC layer
189
+ // (onRepairResolved clears the slot on completion OR failure).
190
+ if (fed === 0) clearRepairIfOwner(key, request)
191
+ } catch (err) {
192
+ // Range-not-retained, transport error, or abort: the block can only
193
+ // resolve via the fail bound now — release the slot immediately.
194
+ clearRepairIfOwner(key, request)
195
+ if (!ctrl.signal.aborted) {
196
+ console.warn(
197
+ `[RepairFetch] fetch failed pid=${packetId} sbn=${sbn} track=${target.repairTrack}:`,
198
+ err,
199
+ )
200
+ }
201
+ } finally {
202
+ clearTimeout(timer)
203
+ if (inFlight.get(key) === request) inFlight.delete(key)
204
+ }
205
+ })()
206
+ })
207
+
208
+ return () => {
209
+ disposed = true
210
+ removeResetObserver()
211
+ for (const request of inFlight.values()) {
212
+ clearRepair(request.sbn, request.packetId, request.catalogTrackName)
213
+ request.controller.abort()
214
+ }
215
+ inFlight.clear()
216
+ }
217
+ }