@blockcast/mmt-container 0.3.0 → 0.4.0-main.71d61b2a53f2

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 (605) hide show
  1. package/README.md +33 -16
  2. package/dist/browser-runtime.js +14743 -14412
  3. package/dist/browser-runtime.js.map +4 -4
  4. package/dist/carp-catalog.d.ts +24 -19
  5. package/dist/carp-catalog.d.ts.map +1 -1
  6. package/dist/carp-catalog.js +29 -14
  7. package/dist/carp-catalog.js.map +4 -4
  8. package/dist/catalog-fec-params.d.ts +88 -28
  9. package/dist/catalog-fec-params.d.ts.map +1 -1
  10. package/dist/catalog-fec-params.js +60 -23
  11. package/dist/catalog-fec-params.js.map +4 -4
  12. package/dist/catalog-network-source.js +1 -7
  13. package/dist/catalog-network-source.js.map +4 -4
  14. package/dist/cmaf-block-assembler.d.ts +0 -2
  15. package/dist/cmaf-block-assembler.d.ts.map +1 -1
  16. package/dist/cmaf-block-assembler.js +0 -1
  17. package/dist/cmaf-block-assembler.js.map +2 -2
  18. package/dist/cmcd-producer.d.ts.map +1 -1
  19. package/dist/cmcd-producer.js +0 -4
  20. package/dist/cmcd-producer.js.map +2 -2
  21. package/dist/delivery-catalog.d.ts +124 -0
  22. package/dist/delivery-catalog.d.ts.map +1 -0
  23. package/dist/delivery-catalog.js +1857 -0
  24. package/dist/delivery-catalog.js.map +7 -0
  25. package/dist/delta-fallback-config.d.ts +42 -0
  26. package/dist/delta-fallback-config.d.ts.map +1 -0
  27. package/dist/delta-fallback-config.js +59 -0
  28. package/dist/delta-fallback-config.js.map +7 -0
  29. package/dist/fec-manager.d.ts +36 -30
  30. package/dist/fec-manager.d.ts.map +1 -1
  31. package/dist/fec-manager.js +303 -293
  32. package/dist/fec-manager.js.map +4 -4
  33. package/dist/fec-state.d.ts +19 -31
  34. package/dist/fec-state.d.ts.map +1 -1
  35. package/dist/fec-state.js +4 -10
  36. package/dist/fec-state.js.map +4 -4
  37. package/dist/fec-worker-setup.d.ts +18 -14
  38. package/dist/fec-worker-setup.d.ts.map +1 -1
  39. package/dist/fec-worker-setup.js +81 -96
  40. package/dist/fec-worker-setup.js.map +4 -4
  41. package/dist/index.d.ts +5 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +16 -0
  44. package/dist/index.js.map +2 -2
  45. package/dist/iso-block-locator.js +1 -7
  46. package/dist/iso-block-locator.js.map +4 -4
  47. package/dist/media-router.d.ts +20 -8
  48. package/dist/media-router.d.ts.map +1 -1
  49. package/dist/media-router.js +46 -21
  50. package/dist/media-router.js.map +2 -2
  51. package/dist/mfu-reassembler.js +24 -30
  52. package/dist/mfu-reassembler.js.map +4 -4
  53. package/dist/mmtp-container-parser.d.ts +6 -11
  54. package/dist/mmtp-container-parser.d.ts.map +1 -1
  55. package/dist/mmtp-container-parser.js +56 -97
  56. package/dist/mmtp-container-parser.js.map +4 -4
  57. package/dist/mmtp-container-parser.no-modules.js +78 -105
  58. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  59. package/dist/mmtp-decode-pipeline.js +56 -97
  60. package/dist/mmtp-decode-pipeline.js.map +4 -4
  61. package/dist/mmtp-router.d.ts +37 -26
  62. package/dist/mmtp-router.d.ts.map +1 -1
  63. package/dist/mmtp-router.js +162 -313
  64. package/dist/mmtp-router.js.map +4 -4
  65. package/dist/multicast-input.js +1 -7
  66. package/dist/multicast-input.js.map +4 -4
  67. package/dist/multicast-manager.d.ts +34 -6
  68. package/dist/multicast-manager.d.ts.map +1 -1
  69. package/dist/multicast-manager.js +709 -658
  70. package/dist/multicast-manager.js.map +4 -4
  71. package/dist/multicast-transport.d.ts +1 -1
  72. package/dist/multicast-transport.d.ts.map +1 -1
  73. package/dist/multicast-transport.js +44 -26
  74. package/dist/multicast-transport.js.map +4 -4
  75. package/dist/multicast-unwrap.js +29 -35
  76. package/dist/multicast-unwrap.js.map +4 -4
  77. package/dist/no-modules.js +77 -104
  78. package/dist/no-modules.js.map +4 -4
  79. package/dist/repair-fetch.d.ts +30 -19
  80. package/dist/repair-fetch.d.ts.map +1 -1
  81. package/dist/repair-fetch.js +33 -24
  82. package/dist/repair-fetch.js.map +4 -4
  83. package/dist/repair-layers.d.ts +18 -7
  84. package/dist/repair-layers.d.ts.map +1 -1
  85. package/dist/repair-layers.js +12 -10
  86. package/dist/repair-layers.js.map +4 -4
  87. package/dist/signaling.js +2 -11
  88. package/dist/signaling.js.map +4 -4
  89. package/dist/timestamp-codec.js +24 -30
  90. package/dist/timestamp-codec.js.map +4 -4
  91. package/dist/track-session.d.ts +7 -0
  92. package/dist/track-session.d.ts.map +1 -1
  93. package/dist/track-session.js +15 -8
  94. package/dist/track-session.js.map +2 -2
  95. package/dist/wasm-mfu-reassembler.js +1 -7
  96. package/dist/wasm-mfu-reassembler.js.map +4 -4
  97. package/dist/wasm-mmtp-container-parser.js +56 -97
  98. package/dist/wasm-mmtp-container-parser.js.map +4 -4
  99. package/package.json +7 -14
  100. package/schemas/catalog.schema.json +3 -3
  101. package/src/carp-catalog.ts +46 -24
  102. package/src/catalog-fec-params.ts +173 -64
  103. package/src/cmaf-block-assembler.ts +1 -4
  104. package/src/cmcd-producer.ts +0 -6
  105. package/src/delivery-catalog.ts +498 -0
  106. package/src/delta-fallback-config.ts +72 -0
  107. package/src/fec-manager.ts +414 -334
  108. package/src/fec-state.ts +20 -32
  109. package/src/fec-worker-setup.ts +109 -90
  110. package/src/index.ts +32 -0
  111. package/src/media-router.ts +59 -21
  112. package/src/mmtp-container-parser.ts +27 -18
  113. package/src/mmtp-router.ts +146 -313
  114. package/src/multicast-manager.ts +184 -83
  115. package/src/multicast-transport.ts +16 -9
  116. package/src/repair-fetch.ts +46 -27
  117. package/src/repair-layers.ts +28 -8
  118. package/src/track-session.ts +28 -9
  119. package/test-vectors/catalog/README.md +37 -17
  120. package/test-vectors/catalog/negative/fec-block-profile-retired.json +52 -0
  121. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +1 -1
  122. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +1 -1
  123. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +1 -1
  124. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +1 -1
  125. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +1 -1
  126. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +1 -1
  127. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +1 -1
  128. package/test-vectors/catalog/negative/multicast-endpoint-relay-address.json +39 -0
  129. package/test-vectors/catalog/negative/multicast-network-source-empty.json +1 -1
  130. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +1 -1
  131. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +1 -1
  132. package/test-vectors/catalog/positive/fec-layered-repair.json +2 -2
  133. package/test-vectors/catalog/positive/fec-multicast.json +2 -1
  134. package/test-vectors/catalog/positive/multicast-amt-manual-relay.json +38 -0
  135. package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +2 -1
  136. package/test-vectors/catalog-timing.json +356 -0
  137. package/test-vectors/catalog-validation.json +40 -5
  138. package/test-vectors/delivery-catalog/README.md +11 -0
  139. package/test-vectors/delivery-catalog/negative/missing-block-profile.json +58 -0
  140. package/test-vectors/delivery-catalog/negative/packet-id-signaling.json +59 -0
  141. package/test-vectors/delivery-catalog/negative/retired-k-padded-block-profile.json +59 -0
  142. package/test-vectors/delivery-catalog/positive/dash.json +56 -0
  143. package/test-vectors/delivery-catalog/positive/mmtp-source-only.json +43 -0
  144. package/node_modules/@blockcast/fec-worker/README.md +0 -223
  145. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  146. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +0 -38
  147. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +0 -1
  148. package/node_modules/@blockcast/fec-worker/dist/block-order.js +0 -78
  149. package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +0 -1
  150. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +0 -93
  151. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +0 -1
  152. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +0 -346
  153. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +0 -1
  154. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +0 -380
  155. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +0 -1
  156. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +0 -11
  157. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +0 -1
  158. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +0 -14
  159. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +0 -1
  160. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +0 -859
  161. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +0 -7
  162. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +0 -10
  163. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +0 -1
  164. package/node_modules/@blockcast/fec-worker/dist/index.js +0 -8
  165. package/node_modules/@blockcast/fec-worker/dist/index.js.map +0 -1
  166. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +0 -20
  167. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +0 -1
  168. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +0 -370
  169. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +0 -7
  170. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +0 -104
  171. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +0 -1
  172. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +0 -181
  173. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +0 -1
  174. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +0 -194
  175. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +0 -1
  176. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +0 -62
  177. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +0 -1
  178. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +0 -9
  179. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +0 -1
  180. package/node_modules/@blockcast/fec-worker/dist/transfer.js +0 -13
  181. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +0 -1
  182. package/node_modules/@blockcast/fec-worker/package.json +0 -59
  183. package/node_modules/@blockcast/fec-worker/src/block-order.ts +0 -93
  184. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +0 -392
  185. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +0 -399
  186. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +0 -1502
  187. package/node_modules/@blockcast/fec-worker/src/index.ts +0 -35
  188. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +0 -589
  189. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +0 -222
  190. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +0 -209
  191. package/node_modules/@blockcast/fec-worker/src/transfer.ts +0 -12
  192. package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  193. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  194. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  195. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  196. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  197. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  198. package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  199. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  200. package/node_modules/@blockcast/mmt-base/README.md +0 -134
  201. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  202. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  203. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  204. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  205. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  206. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  207. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  208. package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  209. package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  210. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  211. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  212. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  213. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  214. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  215. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  216. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  217. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  218. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  219. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  220. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  221. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  222. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  223. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  224. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  225. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  226. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  227. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  228. package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  229. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  230. package/node_modules/@blockcast/mmt-base/package.json +0 -49
  231. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  232. package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  233. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  234. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  235. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  236. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  237. package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  238. package/node_modules/@blockcast/mmt-fec/README.md +0 -271
  239. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  240. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +0 -82
  241. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +0 -1
  242. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +0 -296
  243. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +0 -1
  244. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +0 -106
  245. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +0 -1
  246. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +0 -288
  247. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +0 -1
  248. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +0 -46
  249. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +0 -1
  250. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +0 -96
  251. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +0 -1
  252. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +0 -33
  253. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +0 -1
  254. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +0 -57
  255. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +0 -1
  256. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +0 -205
  257. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +0 -1
  258. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +0 -240
  259. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +0 -1
  260. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +0 -28
  261. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +0 -1
  262. package/node_modules/@blockcast/mmt-fec/dist/index.js +0 -28
  263. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +0 -1
  264. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +0 -20
  265. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +0 -1
  266. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +0 -28
  267. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +0 -1
  268. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +0 -258
  269. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +0 -1
  270. package/node_modules/@blockcast/mmt-fec/dist/oti.js +0 -382
  271. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +0 -1
  272. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +0 -41
  273. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +0 -1
  274. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +0 -81
  275. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +0 -1
  276. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +0 -82
  277. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +0 -1
  278. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +0 -170
  279. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +0 -1
  280. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  281. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  282. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  283. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  284. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  285. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  286. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  287. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  288. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +0 -134
  289. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  290. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  291. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  292. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  293. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  294. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  295. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  296. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  297. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  298. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  299. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  300. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  301. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  302. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  303. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  304. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  305. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  306. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +0 -49
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  324. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  325. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  326. package/node_modules/@blockcast/mmt-fec/package.json +0 -79
  327. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +0 -371
  328. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +0 -439
  329. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +0 -127
  330. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +0 -68
  331. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +0 -310
  332. package/node_modules/@blockcast/mmt-fec/src/index.ts +0 -94
  333. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +0 -34
  334. package/node_modules/@blockcast/mmt-fec/src/oti.ts +0 -463
  335. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +0 -101
  336. package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +0 -195
  337. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +0 -28
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +0 -1
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +0 -128
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +0 -1
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +0 -4
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +0 -1
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +0 -4
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +0 -1
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +0 -37
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +0 -1
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +0 -179
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +0 -1
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +0 -99
  351. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +0 -1
  352. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +0 -492
  353. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +0 -1
  354. package/node_modules/@blockcast/mmt-manifest-verify/package.json +0 -45
  355. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +0 -171
  356. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +0 -3
  357. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +0 -230
  358. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +0 -669
  359. package/node_modules/@noble/hashes/LICENSE +0 -21
  360. package/node_modules/@noble/hashes/README.md +0 -521
  361. package/node_modules/@noble/hashes/_assert.d.ts +0 -17
  362. package/node_modules/@noble/hashes/_assert.d.ts.map +0 -1
  363. package/node_modules/@noble/hashes/_assert.js +0 -18
  364. package/node_modules/@noble/hashes/_assert.js.map +0 -1
  365. package/node_modules/@noble/hashes/_blake.d.ts +0 -14
  366. package/node_modules/@noble/hashes/_blake.d.ts.map +0 -1
  367. package/node_modules/@noble/hashes/_blake.js +0 -50
  368. package/node_modules/@noble/hashes/_blake.js.map +0 -1
  369. package/node_modules/@noble/hashes/_md.d.ts +0 -51
  370. package/node_modules/@noble/hashes/_md.d.ts.map +0 -1
  371. package/node_modules/@noble/hashes/_md.js +0 -162
  372. package/node_modules/@noble/hashes/_md.js.map +0 -1
  373. package/node_modules/@noble/hashes/_u64.d.ts +0 -55
  374. package/node_modules/@noble/hashes/_u64.d.ts.map +0 -1
  375. package/node_modules/@noble/hashes/_u64.js +0 -90
  376. package/node_modules/@noble/hashes/_u64.js.map +0 -1
  377. package/node_modules/@noble/hashes/argon2.d.ts +0 -32
  378. package/node_modules/@noble/hashes/argon2.d.ts.map +0 -1
  379. package/node_modules/@noble/hashes/argon2.js +0 -401
  380. package/node_modules/@noble/hashes/argon2.js.map +0 -1
  381. package/node_modules/@noble/hashes/blake1.d.ts +0 -106
  382. package/node_modules/@noble/hashes/blake1.d.ts.map +0 -1
  383. package/node_modules/@noble/hashes/blake1.js +0 -459
  384. package/node_modules/@noble/hashes/blake1.js.map +0 -1
  385. package/node_modules/@noble/hashes/blake2.d.ts +0 -116
  386. package/node_modules/@noble/hashes/blake2.d.ts.map +0 -1
  387. package/node_modules/@noble/hashes/blake2.js +0 -420
  388. package/node_modules/@noble/hashes/blake2.js.map +0 -1
  389. package/node_modules/@noble/hashes/blake2b.d.ts +0 -11
  390. package/node_modules/@noble/hashes/blake2b.d.ts.map +0 -1
  391. package/node_modules/@noble/hashes/blake2b.js +0 -14
  392. package/node_modules/@noble/hashes/blake2b.js.map +0 -1
  393. package/node_modules/@noble/hashes/blake2s.d.ts +0 -20
  394. package/node_modules/@noble/hashes/blake2s.d.ts.map +0 -1
  395. package/node_modules/@noble/hashes/blake2s.js +0 -24
  396. package/node_modules/@noble/hashes/blake2s.js.map +0 -1
  397. package/node_modules/@noble/hashes/blake3.d.ts +0 -54
  398. package/node_modules/@noble/hashes/blake3.d.ts.map +0 -1
  399. package/node_modules/@noble/hashes/blake3.js +0 -255
  400. package/node_modules/@noble/hashes/blake3.js.map +0 -1
  401. package/node_modules/@noble/hashes/crypto.d.ts +0 -2
  402. package/node_modules/@noble/hashes/crypto.d.ts.map +0 -1
  403. package/node_modules/@noble/hashes/crypto.js +0 -5
  404. package/node_modules/@noble/hashes/crypto.js.map +0 -1
  405. package/node_modules/@noble/hashes/cryptoNode.d.ts +0 -2
  406. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +0 -1
  407. package/node_modules/@noble/hashes/cryptoNode.js +0 -18
  408. package/node_modules/@noble/hashes/cryptoNode.js.map +0 -1
  409. package/node_modules/@noble/hashes/eskdf.d.ts +0 -47
  410. package/node_modules/@noble/hashes/eskdf.d.ts.map +0 -1
  411. package/node_modules/@noble/hashes/eskdf.js +0 -166
  412. package/node_modules/@noble/hashes/eskdf.js.map +0 -1
  413. package/node_modules/@noble/hashes/esm/_assert.d.ts +0 -17
  414. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +0 -1
  415. package/node_modules/@noble/hashes/esm/_assert.js +0 -15
  416. package/node_modules/@noble/hashes/esm/_assert.js.map +0 -1
  417. package/node_modules/@noble/hashes/esm/_blake.d.ts +0 -14
  418. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +0 -1
  419. package/node_modules/@noble/hashes/esm/_blake.js +0 -45
  420. package/node_modules/@noble/hashes/esm/_blake.js.map +0 -1
  421. package/node_modules/@noble/hashes/esm/_md.d.ts +0 -51
  422. package/node_modules/@noble/hashes/esm/_md.d.ts.map +0 -1
  423. package/node_modules/@noble/hashes/esm/_md.js +0 -155
  424. package/node_modules/@noble/hashes/esm/_md.js.map +0 -1
  425. package/node_modules/@noble/hashes/esm/_u64.d.ts +0 -55
  426. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +0 -1
  427. package/node_modules/@noble/hashes/esm/_u64.js +0 -67
  428. package/node_modules/@noble/hashes/esm/_u64.js.map +0 -1
  429. package/node_modules/@noble/hashes/esm/argon2.d.ts +0 -32
  430. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +0 -1
  431. package/node_modules/@noble/hashes/esm/argon2.js +0 -392
  432. package/node_modules/@noble/hashes/esm/argon2.js.map +0 -1
  433. package/node_modules/@noble/hashes/esm/blake1.d.ts +0 -106
  434. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +0 -1
  435. package/node_modules/@noble/hashes/esm/blake1.js +0 -452
  436. package/node_modules/@noble/hashes/esm/blake1.js.map +0 -1
  437. package/node_modules/@noble/hashes/esm/blake2.d.ts +0 -116
  438. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +0 -1
  439. package/node_modules/@noble/hashes/esm/blake2.js +0 -413
  440. package/node_modules/@noble/hashes/esm/blake2.js.map +0 -1
  441. package/node_modules/@noble/hashes/esm/blake2b.d.ts +0 -11
  442. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +0 -1
  443. package/node_modules/@noble/hashes/esm/blake2b.js +0 -11
  444. package/node_modules/@noble/hashes/esm/blake2b.js.map +0 -1
  445. package/node_modules/@noble/hashes/esm/blake2s.d.ts +0 -20
  446. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +0 -1
  447. package/node_modules/@noble/hashes/esm/blake2s.js +0 -21
  448. package/node_modules/@noble/hashes/esm/blake2s.js.map +0 -1
  449. package/node_modules/@noble/hashes/esm/blake3.d.ts +0 -54
  450. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +0 -1
  451. package/node_modules/@noble/hashes/esm/blake3.js +0 -251
  452. package/node_modules/@noble/hashes/esm/blake3.js.map +0 -1
  453. package/node_modules/@noble/hashes/esm/crypto.d.ts +0 -2
  454. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +0 -1
  455. package/node_modules/@noble/hashes/esm/crypto.js +0 -2
  456. package/node_modules/@noble/hashes/esm/crypto.js.map +0 -1
  457. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +0 -2
  458. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +0 -1
  459. package/node_modules/@noble/hashes/esm/cryptoNode.js +0 -15
  460. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +0 -1
  461. package/node_modules/@noble/hashes/esm/eskdf.d.ts +0 -47
  462. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +0 -1
  463. package/node_modules/@noble/hashes/esm/eskdf.js +0 -160
  464. package/node_modules/@noble/hashes/esm/eskdf.js.map +0 -1
  465. package/node_modules/@noble/hashes/esm/hkdf.d.ts +0 -36
  466. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +0 -1
  467. package/node_modules/@noble/hashes/esm/hkdf.js +0 -82
  468. package/node_modules/@noble/hashes/esm/hkdf.js.map +0 -1
  469. package/node_modules/@noble/hashes/esm/hmac.d.ts +0 -35
  470. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +0 -1
  471. package/node_modules/@noble/hashes/esm/hmac.js +0 -86
  472. package/node_modules/@noble/hashes/esm/hmac.js.map +0 -1
  473. package/node_modules/@noble/hashes/esm/index.d.ts +0 -2
  474. package/node_modules/@noble/hashes/esm/index.d.ts.map +0 -1
  475. package/node_modules/@noble/hashes/esm/index.js +0 -33
  476. package/node_modules/@noble/hashes/esm/index.js.map +0 -1
  477. package/node_modules/@noble/hashes/esm/legacy.d.ts +0 -71
  478. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +0 -1
  479. package/node_modules/@noble/hashes/esm/legacy.js +0 -281
  480. package/node_modules/@noble/hashes/esm/legacy.js.map +0 -1
  481. package/node_modules/@noble/hashes/esm/package.json +0 -10
  482. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +0 -23
  483. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +0 -1
  484. package/node_modules/@noble/hashes/esm/pbkdf2.js +0 -97
  485. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +0 -1
  486. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +0 -13
  487. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +0 -1
  488. package/node_modules/@noble/hashes/esm/ripemd160.js +0 -13
  489. package/node_modules/@noble/hashes/esm/ripemd160.js.map +0 -1
  490. package/node_modules/@noble/hashes/esm/scrypt.d.ts +0 -34
  491. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +0 -1
  492. package/node_modules/@noble/hashes/esm/scrypt.js +0 -228
  493. package/node_modules/@noble/hashes/esm/scrypt.js.map +0 -1
  494. package/node_modules/@noble/hashes/esm/sha1.d.ts +0 -11
  495. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +0 -1
  496. package/node_modules/@noble/hashes/esm/sha1.js +0 -11
  497. package/node_modules/@noble/hashes/esm/sha1.js.map +0 -1
  498. package/node_modules/@noble/hashes/esm/sha2.d.ts +0 -159
  499. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +0 -1
  500. package/node_modules/@noble/hashes/esm/sha2.js +0 -375
  501. package/node_modules/@noble/hashes/esm/sha2.js.map +0 -1
  502. package/node_modules/@noble/hashes/esm/sha256.d.ts +0 -20
  503. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +0 -1
  504. package/node_modules/@noble/hashes/esm/sha256.js +0 -20
  505. package/node_modules/@noble/hashes/esm/sha256.js.map +0 -1
  506. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +0 -142
  507. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +0 -1
  508. package/node_modules/@noble/hashes/esm/sha3-addons.js +0 -393
  509. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +0 -1
  510. package/node_modules/@noble/hashes/esm/sha3.d.ts +0 -53
  511. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +0 -1
  512. package/node_modules/@noble/hashes/esm/sha3.js +0 -234
  513. package/node_modules/@noble/hashes/esm/sha3.js.map +0 -1
  514. package/node_modules/@noble/hashes/esm/sha512.d.ts +0 -26
  515. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +0 -1
  516. package/node_modules/@noble/hashes/esm/sha512.js +0 -26
  517. package/node_modules/@noble/hashes/esm/sha512.js.map +0 -1
  518. package/node_modules/@noble/hashes/esm/utils.d.ts +0 -161
  519. package/node_modules/@noble/hashes/esm/utils.d.ts.map +0 -1
  520. package/node_modules/@noble/hashes/esm/utils.js +0 -281
  521. package/node_modules/@noble/hashes/esm/utils.js.map +0 -1
  522. package/node_modules/@noble/hashes/hkdf.d.ts +0 -36
  523. package/node_modules/@noble/hashes/hkdf.d.ts.map +0 -1
  524. package/node_modules/@noble/hashes/hkdf.js +0 -88
  525. package/node_modules/@noble/hashes/hkdf.js.map +0 -1
  526. package/node_modules/@noble/hashes/hmac.d.ts +0 -35
  527. package/node_modules/@noble/hashes/hmac.d.ts.map +0 -1
  528. package/node_modules/@noble/hashes/hmac.js +0 -91
  529. package/node_modules/@noble/hashes/hmac.js.map +0 -1
  530. package/node_modules/@noble/hashes/index.d.ts +0 -1
  531. package/node_modules/@noble/hashes/index.d.ts.map +0 -1
  532. package/node_modules/@noble/hashes/index.js +0 -33
  533. package/node_modules/@noble/hashes/index.js.map +0 -1
  534. package/node_modules/@noble/hashes/legacy.d.ts +0 -71
  535. package/node_modules/@noble/hashes/legacy.d.ts.map +0 -1
  536. package/node_modules/@noble/hashes/legacy.js +0 -287
  537. package/node_modules/@noble/hashes/legacy.js.map +0 -1
  538. package/node_modules/@noble/hashes/package.json +0 -266
  539. package/node_modules/@noble/hashes/pbkdf2.d.ts +0 -23
  540. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +0 -1
  541. package/node_modules/@noble/hashes/pbkdf2.js +0 -101
  542. package/node_modules/@noble/hashes/pbkdf2.js.map +0 -1
  543. package/node_modules/@noble/hashes/ripemd160.d.ts +0 -13
  544. package/node_modules/@noble/hashes/ripemd160.d.ts.map +0 -1
  545. package/node_modules/@noble/hashes/ripemd160.js +0 -16
  546. package/node_modules/@noble/hashes/ripemd160.js.map +0 -1
  547. package/node_modules/@noble/hashes/scrypt.d.ts +0 -34
  548. package/node_modules/@noble/hashes/scrypt.d.ts.map +0 -1
  549. package/node_modules/@noble/hashes/scrypt.js +0 -232
  550. package/node_modules/@noble/hashes/scrypt.js.map +0 -1
  551. package/node_modules/@noble/hashes/sha1.d.ts +0 -11
  552. package/node_modules/@noble/hashes/sha1.d.ts.map +0 -1
  553. package/node_modules/@noble/hashes/sha1.js +0 -14
  554. package/node_modules/@noble/hashes/sha1.js.map +0 -1
  555. package/node_modules/@noble/hashes/sha2.d.ts +0 -159
  556. package/node_modules/@noble/hashes/sha2.d.ts.map +0 -1
  557. package/node_modules/@noble/hashes/sha2.js +0 -384
  558. package/node_modules/@noble/hashes/sha2.js.map +0 -1
  559. package/node_modules/@noble/hashes/sha256.d.ts +0 -20
  560. package/node_modules/@noble/hashes/sha256.d.ts.map +0 -1
  561. package/node_modules/@noble/hashes/sha256.js +0 -23
  562. package/node_modules/@noble/hashes/sha256.js.map +0 -1
  563. package/node_modules/@noble/hashes/sha3-addons.d.ts +0 -142
  564. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +0 -1
  565. package/node_modules/@noble/hashes/sha3-addons.js +0 -402
  566. package/node_modules/@noble/hashes/sha3-addons.js.map +0 -1
  567. package/node_modules/@noble/hashes/sha3.d.ts +0 -53
  568. package/node_modules/@noble/hashes/sha3.d.ts.map +0 -1
  569. package/node_modules/@noble/hashes/sha3.js +0 -239
  570. package/node_modules/@noble/hashes/sha3.js.map +0 -1
  571. package/node_modules/@noble/hashes/sha512.d.ts +0 -26
  572. package/node_modules/@noble/hashes/sha512.d.ts.map +0 -1
  573. package/node_modules/@noble/hashes/sha512.js +0 -29
  574. package/node_modules/@noble/hashes/sha512.js.map +0 -1
  575. package/node_modules/@noble/hashes/src/_assert.ts +0 -22
  576. package/node_modules/@noble/hashes/src/_blake.ts +0 -50
  577. package/node_modules/@noble/hashes/src/_md.ts +0 -176
  578. package/node_modules/@noble/hashes/src/_u64.ts +0 -91
  579. package/node_modules/@noble/hashes/src/argon2.ts +0 -497
  580. package/node_modules/@noble/hashes/src/blake1.ts +0 -534
  581. package/node_modules/@noble/hashes/src/blake2.ts +0 -486
  582. package/node_modules/@noble/hashes/src/blake2b.ts +0 -10
  583. package/node_modules/@noble/hashes/src/blake2s.ts +0 -20
  584. package/node_modules/@noble/hashes/src/blake3.ts +0 -272
  585. package/node_modules/@noble/hashes/src/crypto.ts +0 -9
  586. package/node_modules/@noble/hashes/src/cryptoNode.ts +0 -15
  587. package/node_modules/@noble/hashes/src/eskdf.ts +0 -187
  588. package/node_modules/@noble/hashes/src/hkdf.ts +0 -88
  589. package/node_modules/@noble/hashes/src/hmac.ts +0 -94
  590. package/node_modules/@noble/hashes/src/index.ts +0 -31
  591. package/node_modules/@noble/hashes/src/legacy.ts +0 -293
  592. package/node_modules/@noble/hashes/src/pbkdf2.ts +0 -122
  593. package/node_modules/@noble/hashes/src/ripemd160.ts +0 -12
  594. package/node_modules/@noble/hashes/src/scrypt.ts +0 -257
  595. package/node_modules/@noble/hashes/src/sha1.ts +0 -10
  596. package/node_modules/@noble/hashes/src/sha2.ts +0 -402
  597. package/node_modules/@noble/hashes/src/sha256.ts +0 -24
  598. package/node_modules/@noble/hashes/src/sha3-addons.ts +0 -499
  599. package/node_modules/@noble/hashes/src/sha3.ts +0 -258
  600. package/node_modules/@noble/hashes/src/sha512.ts +0 -34
  601. package/node_modules/@noble/hashes/src/utils.ts +0 -395
  602. package/node_modules/@noble/hashes/utils.d.ts +0 -161
  603. package/node_modules/@noble/hashes/utils.d.ts.map +0 -1
  604. package/node_modules/@noble/hashes/utils.js +0 -313
  605. package/node_modules/@noble/hashes/utils.js.map +0 -1
@@ -77,9 +77,11 @@ import {
77
77
  parseTrackRole,
78
78
  validateSwitchingSet,
79
79
  isFecCatalogConfig,
80
+ isFecCatalogGeometry,
80
81
  type FecCatalogConfig,
81
82
  type TrackRole,
82
83
  } from "./carp-catalog.js";
84
+ import { catalogFecUnavailable, type TrackFecUnavailable } from "./catalog-fec-params.js";
83
85
 
84
86
  export interface MulticastEndpointConfig {
85
87
  sourceAddress: string;
@@ -87,11 +89,9 @@ export interface MulticastEndpointConfig {
87
89
  port: number;
88
90
  /** Explicit gateway transport policy. Omitted means gateway-selected auto mode. */
89
91
  mode?: 'auto' | 'native' | 'tunnel';
90
- /** AMT relay hostname/IP from catalog endpoint. */
91
- relayAddress?: string;
92
92
  /** AMT relay port from catalog endpoint. */
93
93
  relayPort?: number;
94
- /** AMT relay hostname/IP from player/UI overrides. Wins over `relayAddress`. */
94
+ /** AMT relay hostname/IP: the player/UI override, or the catalog's `multicast.networkSource` AMT relay. */
95
95
  amtRelay?: string;
96
96
  /** AMT relay port from player/UI overrides. Wins over `relayPort`. */
97
97
  amtRelayPort?: number;
@@ -100,8 +100,9 @@ export interface MulticastEndpointConfig {
100
100
  /** Exact catalog tracks carried by this physical multicast endpoint. */
101
101
  tracks?: MmtpIngressContext["tracks"];
102
102
  /**
103
- * The catalog `fec.blockProfile` (BLO-35597): `k-padded-v1` or
104
- * `iso-ssbg1-v1`. Required for per-track FEC configuration; never defaulted.
103
+ * The catalog `fec.blockProfile` (BLO-35597): `iso-ssbg1-v1`, the only
104
+ * profile (the retired `k-padded-v1` token is refused). Required for
105
+ * per-track FEC configuration; never defaulted.
105
106
  */
106
107
  fecBlockProfile?: FecBlockProfile;
107
108
  fecK?: number;
@@ -932,7 +933,10 @@ function projectFecDiagnosticBlock(block: FecBlockSnapshot) {
932
933
  lastSymbolTs: block.lastSymbolTs,
933
934
  ...(block.completedTs === undefined ? {} : { completedTs: block.completedTs }),
934
935
  deadlineTs: block.deadlineTs,
935
- altaVerified: block.altaVerified,
936
+ // ponytail: the per-packet authenticator is gone, so this is always 0. It
937
+ // stays only because pim-multicast-gateway's normalizeSubscriptionDiagnostics
938
+ // still requires a number here; drop it once that validator stops asking.
939
+ altaVerified: 0,
936
940
  relayBlockSigValid: block.relayBlockSigValid,
937
941
  };
938
942
  }
@@ -963,7 +967,6 @@ function projectFecDiagnosticConfig(config: FecTrackConfig) {
963
967
  interleaveMs: config.interleaveMs,
964
968
  fecMode: config.fecMode,
965
969
  ...(config.repairTrack === undefined ? {} : { repairTrack: config.repairTrack }),
966
- altaEnabled: config.altaEnabled,
967
970
  relayBlockSigEnabled: config.relayBlockSigEnabled,
968
971
  };
969
972
  }
@@ -1042,13 +1045,14 @@ function repairTrackNamesBySource(
1042
1045
  bySource.set(source, names);
1043
1046
  };
1044
1047
  for (const track of tracks) {
1045
- if (
1046
- track.fec !== undefined &&
1047
- isFecCatalogConfig(track.fec) &&
1048
- track.fec.repairTrack
1049
- ) {
1050
- add(track.name, track.fec.repairTrack);
1051
- }
1048
+ // The explicit pointer counts whether or not the source's FEC config is
1049
+ // usable (an unimplemented block profile leaves the track without FEC,
1050
+ // not without its repair track): ownership is membership, not
1051
+ // decodability, so no isFecCatalogConfig gate here.
1052
+ const repairTrack = typeof track.fec === "object" && track.fec !== null
1053
+ ? (track.fec as { readonly repairTrack?: unknown }).repairTrack
1054
+ : undefined;
1055
+ if (typeof repairTrack === "string") add(track.name, repairTrack);
1052
1056
  if (track.packaging === "fec-repair" && Array.isArray(track.depends) && track.depends.length === 1) {
1053
1057
  add(track.depends[0]!, track.name);
1054
1058
  }
@@ -1059,6 +1063,7 @@ function repairTrackNamesBySource(
1059
1063
  export class MulticastManager {
1060
1064
  readonly #fec: FECManager;
1061
1065
  readonly #router: MmtpRouter;
1066
+ #hostMfuTimeoutMs: number | null;
1062
1067
  readonly #transport: MulticastTransport<MmtpIngressContext>;
1063
1068
  #reportedFecDiagnosticsFailure = false;
1064
1069
 
@@ -1170,6 +1175,7 @@ export class MulticastManager {
1170
1175
  this.#emitRepairLifecycle(decision);
1171
1176
  },
1172
1177
  });
1178
+ this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
1173
1179
  this.#transport = new MulticastTransport<MmtpIngressContext>((packet, ingress) => {
1174
1180
  this.#router.feedPacket(packet, "multicast", undefined, ingress);
1175
1181
  });
@@ -1434,7 +1440,6 @@ export class MulticastManager {
1434
1440
  ...(this.#streamFecBaseline ? [this.#streamFecBaseline] : []),
1435
1441
  ...this.#trackFecTiming.values(),
1436
1442
  ];
1437
- if (contributions.length === 0) return;
1438
1443
 
1439
1444
  let deliveryWindowMs: number | undefined;
1440
1445
  let minimumFailbackWindowMs: number | undefined;
@@ -1451,11 +1456,7 @@ export class MulticastManager {
1451
1456
  c.minimumFailbackWindowMs,
1452
1457
  );
1453
1458
  }
1454
- // Only a valid §5.1 ms interleave may drive router timing. A sub-floor
1455
- // value is a raw frame count (no fps to convert with) and would collapse
1456
- // the MFU timeout to ~0 and the reorder window to a single frame; skip
1457
- // the derivation rather than clamp it, leaving previously-configured
1458
- // router timing untouched.
1459
+ // Only a positive catalog span contributes elapsed FEC timing.
1459
1460
  const interleaveOk =
1460
1461
  c.interleaveDepthMs !== undefined &&
1461
1462
  c.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS;
@@ -1479,15 +1480,11 @@ export class MulticastManager {
1479
1480
  deliveryWindowMs === undefined
1480
1481
  ? minimumFailbackWindowMs
1481
1482
  : Math.max(deliveryWindowMs, minimumFailbackWindowMs ?? 0);
1482
- if (failbackWindowMs !== undefined) {
1483
- this.#transport.setFailbackWindowMs(failbackWindowMs);
1484
- }
1485
- if (mfuTimeoutMs !== undefined) {
1486
- this.#router.setMfuTimeoutMs(mfuTimeoutMs);
1487
- }
1488
- if (reorderWindowFrames !== undefined) {
1489
- this.#router.setReorderWindow(reorderWindowFrames);
1490
- }
1483
+ // Without a positive span or host failback floor, disable the silence watchdog.
1484
+ this.#transport.setFailbackWindowMs(failbackWindowMs ?? null);
1485
+ // No FEC deadline: restore the host's independent reassembly policy.
1486
+ this.#router.setMfuTimeoutMs(mfuTimeoutMs ?? this.#hostMfuTimeoutMs);
1487
+ this.#router.setReorderWindow(reorderWindowFrames ?? 0);
1491
1488
  }
1492
1489
 
1493
1490
  /**
@@ -1535,10 +1532,10 @@ export class MulticastManager {
1535
1532
  `[MulticastManager] configureTrackFec(${packetId}) catalogTrackName must be non-empty when given`,
1536
1533
  );
1537
1534
  }
1538
- if (config.fecK === undefined || config.fecInterleaveDepthMs === undefined) {
1535
+ if (config.fecK === undefined) {
1539
1536
  throw new Error(
1540
- `[MulticastManager] configureTrackFec(${packetId}) requires fecK and ` +
1541
- "fecInterleaveDepthMs. Derive the per-track FEC geometry from the " +
1537
+ `[MulticastManager] configureTrackFec(${packetId}) requires fecK. ` +
1538
+ "Derive the per-track FEC geometry from the " +
1542
1539
  "stream catalog.",
1543
1540
  );
1544
1541
  }
@@ -1547,7 +1544,10 @@ export class MulticastManager {
1547
1544
  `[MulticastManager] configureTrackFec(${packetId}) fecBlockProfile`,
1548
1545
  );
1549
1546
  assertPositiveGeometry("fecK", config.fecK);
1550
- assertPositiveGeometry("fecInterleaveDepthMs", config.fecInterleaveDepthMs);
1547
+ const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
1548
+ if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
1549
+ throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
1550
+ }
1551
1551
  assertPositiveGeometry("fecSymbolSize", config.fecSymbolSize);
1552
1552
  assertPositiveGeometry("fps", config.fps);
1553
1553
  assertPositiveGeometry("bandwidth", config.bandwidth);
@@ -1578,9 +1578,9 @@ export class MulticastManager {
1578
1578
  // (configureTrack/timeoutMsForPacket); it just never had the repair-symbol
1579
1579
  // and bandwidth inputs needed to compute one.
1580
1580
  const deliveryWindowMs =
1581
- config.fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
1581
+ interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
1582
1582
  ? computeFecDeliveryWindowMs({
1583
- interleaveDepthMs: config.fecInterleaveDepthMs,
1583
+ interleaveDepthMs,
1584
1584
  sourceSymbols: config.fecK,
1585
1585
  repairSymbols: config.fecRepairSymbols,
1586
1586
  symbolSize: config.fecSymbolSize,
@@ -1593,12 +1593,12 @@ export class MulticastManager {
1593
1593
  // The block classifier's geometry comes from the raw catalog cadence
1594
1594
  // fields; a track whose media kind is not known yet classifies fail-closed.
1595
1595
  const trackKind = config.trackKind ?? this.#router.trackKindFor(packetId);
1596
- const geometry = trackKind === undefined
1596
+ const geometry = trackKind === undefined || interleaveDepthMs === 0
1597
1597
  ? undefined
1598
1598
  : deriveBlockClassifierGeometry({
1599
1599
  trackKind,
1600
1600
  framerate: config.fps,
1601
- interleaveDepthMs: config.fecInterleaveDepthMs,
1601
+ interleaveDepthMs,
1602
1602
  timescale: config.timescale,
1603
1603
  keyframeIntervalTicks: config.keyframeIntervalTicks,
1604
1604
  keyframeIntervalMs: config.keyframeIntervalMs,
@@ -1607,7 +1607,7 @@ export class MulticastManager {
1607
1607
  blockProfile,
1608
1608
  k: config.fecK,
1609
1609
  symbolSize: config.fecSymbolSize,
1610
- interleaveDepthMs: config.fecInterleaveDepthMs,
1610
+ interleaveDepthMs,
1611
1611
  fps: config.fps,
1612
1612
  timeoutMs: deliveryWindowMs,
1613
1613
  ...(trackKind === undefined ? {} : { trackKind }),
@@ -1619,7 +1619,7 @@ export class MulticastManager {
1619
1619
 
1620
1620
  this.#trackFecTiming.set(packetId, {
1621
1621
  deliveryWindowMs,
1622
- interleaveDepthMs: config.fecInterleaveDepthMs,
1622
+ interleaveDepthMs,
1623
1623
  fps: config.fps,
1624
1624
  k: config.fecK,
1625
1625
  repairSymbols: config.fecRepairSymbols,
@@ -1642,6 +1642,10 @@ export class MulticastManager {
1642
1642
  | "minimumFailbackWindowMs"
1643
1643
  >,
1644
1644
  ) {
1645
+ const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
1646
+ if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
1647
+ throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
1648
+ }
1645
1649
  const minimumFailbackWindowMs = config.minimumFailbackWindowMs;
1646
1650
  if (
1647
1651
  minimumFailbackWindowMs !== undefined &&
@@ -1671,7 +1675,7 @@ export class MulticastManager {
1671
1675
  config.fecInterleaveDepthMs &&
1672
1676
  config.fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
1673
1677
  ? computeFecDeliveryWindowMs({
1674
- interleaveDepthMs: config.fecInterleaveDepthMs,
1678
+ interleaveDepthMs,
1675
1679
  sourceSymbols: config.fecK,
1676
1680
  repairSymbols: config.fecRepairSymbols,
1677
1681
  symbolSize: config.fecSymbolSize,
@@ -1683,7 +1687,7 @@ export class MulticastManager {
1683
1687
  this.#fec.configure({
1684
1688
  k: config.fecK,
1685
1689
  symbolSize: config.fecSymbolSize,
1686
- interleaveDepthMs: config.fecInterleaveDepthMs,
1690
+ interleaveDepthMs,
1687
1691
  fps: config.fps,
1688
1692
  timeoutMs: deliveryWindowMs,
1689
1693
  });
@@ -1698,28 +1702,28 @@ export class MulticastManager {
1698
1702
  // narrow them below what this baseline already guarantees.
1699
1703
  this.#streamFecBaseline = {
1700
1704
  deliveryWindowMs,
1701
- interleaveDepthMs: config.fecInterleaveDepthMs,
1705
+ interleaveDepthMs,
1702
1706
  fps: config.fps,
1703
1707
  k: config.fecK,
1704
1708
  repairSymbols: config.fecRepairSymbols,
1705
1709
  minimumFailbackWindowMs,
1706
1710
  };
1707
1711
  this.#applyStreamGlobalFecTiming();
1708
- // Wire FecBlockMapper to MmtpRouter so SBN/ESI derivation works for FEC recovery.
1712
+ // Wire the stream-global FecBlockMapper to MmtpRouter. Under iso-ssbg1-v1
1713
+ // (the only profile) the mapper locates no source symbol: a source is
1714
+ // placed only once a repair states its block (SS_Start, SSB_length), and
1715
+ // FecBlockMapper.fromSsId refuses every FEC stream. The router reads the
1716
+ // mapper only for the stream's block profile and K_max when no FEC
1717
+ // manager answers for the packet.
1709
1718
  //
1710
- // gopDurationMs MUST be the per-frame interval (1000/fps), NOT the
1711
- // interleaveDepthMs. Passing interleaveDepthMs collapses D to 1, which
1712
- // makes the mapper math equivalent to the no-mapper fallback
1713
- // (floor(ssId/k), ssId%k) and breaks SBN/ESI derivation for any interleaved
1714
- // FEC. Surfaced by BLO-3323 L14 (pim-multicast-gateway run 26373805710):
1715
- // with K=32 + interleaveDepthMs=1000ms but gopDurationMs=1000ms, blocks
1716
- // completed with only ~8 source + ~8 repair symbols (out of 40 expected at
1717
- // 25-30fps), so the WASM decoder failed to recover any block at 10% loss.
1719
+ // gopDurationMs is the per-frame interval (1000/fps), never the
1720
+ // interleaveDepthMs: the mapper derives its interleave depth D from their
1721
+ // ratio, and passing interleaveDepthMs collapses D to 1 (BLO-3323 L14).
1718
1722
  const k = config.fecK;
1719
1723
  const interleaveMs = config.fecInterleaveDepthMs;
1720
1724
  const fps = config.fps;
1721
- // The stream-global mapper is the k-padded-v1 SS_ID locator; it exists
1722
- // only for a stream whose catalog names that profile.
1725
+ // The stream-global mapper exists only for a stream whose catalog names a
1726
+ // block profile; parseFecBlockProfile refuses the retired k-padded-v1.
1723
1727
  const blockProfile = config.fecBlockProfile === undefined
1724
1728
  ? undefined
1725
1729
  : parseFecBlockProfile(config.fecBlockProfile, "[MulticastManager] configureFec fecBlockProfile");
@@ -1771,6 +1775,7 @@ export class MulticastManager {
1771
1775
 
1772
1776
  setMfuTimeoutMs(ms: number): void {
1773
1777
  this.#router.setMfuTimeoutMs(ms);
1778
+ this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
1774
1779
  }
1775
1780
 
1776
1781
  setTrackCodec(packetId: number, codec: string) {
@@ -1798,6 +1803,7 @@ export class MulticastManager {
1798
1803
  onTrackPacket(packetId: number, cb: TrackPacketCallback) {
1799
1804
  this.#router.onTrackPacket(packetId, cb);
1800
1805
  }
1806
+ /** @deprecated Use onTrackInit(packetId, cb); see MmtpRouter.onInitSegment. */
1801
1807
  onInitSegment(cb: (data: Uint8Array) => void) {
1802
1808
  this.#router.onInitSegment(cb);
1803
1809
  }
@@ -1821,7 +1827,7 @@ export class MulticastManager {
1821
1827
 
1822
1828
  enableMseAssembler(
1823
1829
  packetId: number,
1824
- config: Omit<BlockAssemblerConfig, "k">,
1830
+ config: BlockAssemblerConfig,
1825
1831
  catalogTrackName?: string,
1826
1832
  ) {
1827
1833
  return this.#router.enableMseAssembler(packetId, config, catalogTrackName);
@@ -1906,21 +1912,11 @@ export class MulticastManager {
1906
1912
  ),
1907
1913
  ),
1908
1914
  };
1909
- // Precedence between two sources, not a tolerant alias. BOTH operands can
1910
- // carry a catalog-declared relay, so neither one is "the" inlet:
1911
- // `amtRelay` — the player/UI override, AND the post-migration catalog
1912
- // path: `endpointToMulticastConfig` (packages/transport
1913
- // multicast-catalog-policy.ts) resolves
1914
- // `multicast.networkSource[{type:"amt"}]` into it
1915
- // through `findAmtRelay`.
1916
- // `relayAddress` — the pre-migration per-endpoint relay, retained so a
1917
- // catalog published before BLO-37834 still joins.
1918
- // The override/networkSource value wins, else the legacy endpoint value.
1919
- // `??`, not `||`, so precedence is deliberately NOT trim-aware: a player
1920
- // clearing its override field means "no AMT", not "fall back to the legacy
1921
- // relay". Blank is absent for the port decision below but present here.
1922
- // Retiring `relayAddress` is the legacy cut (BLO-38068), not this branch.
1923
- const amtRelay = config.amtRelay ?? config.relayAddress;
1915
+ // The single relay inlet: the player/UI override, or the catalog's
1916
+ // `multicast.networkSource[{type:"amt"}]` relay, which
1917
+ // `endpointToMulticastConfig` (packages/transport
1918
+ // multicast-catalog-policy.ts) resolves into `amtRelay` via `findAmtRelay`.
1919
+ const amtRelay = config.amtRelay;
1924
1920
  const transportConfig = {
1925
1921
  sourceAddress: config.sourceAddress,
1926
1922
  groupAddress: config.groupAddress,
@@ -1933,9 +1929,8 @@ export class MulticastManager {
1933
1929
  // endpoint-config.ts) deliberately has no implicit relay port — it throws
1934
1930
  // and `MulticastTransport.join` resolves false — so the default is
1935
1931
  // resolved HERE and arrives there explicit, exactly as the two catalog
1936
- // readers do it. This is the last of the three readers: the `relayAddress`
1937
- // half cannot supply a port at all (the pre-migration wire shape has no
1938
- // port field), and `resolveNetworkSource` emits the same port-less shape.
1932
+ // readers do it. This is the last of the three readers: `resolveNetworkSource`
1933
+ // emits a port-less relay shape.
1939
1934
  // Keyed on the resolved relay, so a DRIAD entry — which pins no relay —
1940
1935
  // never has a port manufactured for it. Blank counts as no relay, the
1941
1936
  // same test `catalogAmtNetworkSource` applies (it trims, then skips) and
@@ -2210,7 +2205,10 @@ export class MulticastManager {
2210
2205
  }
2211
2206
  }
2212
2207
 
2213
- /** Release what the manager and FEC hold for a stream whose packet ID the router retired. */
2208
+ /**
2209
+ * Release what the manager and FEC hold for a stream whose packet ID the
2210
+ * router retired, or whose FEC a catalog reconfiguration no longer configures.
2211
+ */
2214
2212
  #releaseRetiredStream(stream: MmtpStreamIdentity): void {
2215
2213
  // Repair transports abort I/O for a stream on a reset notice
2216
2214
  // (wireRepairFetch); a retired stream's repair fetches end with it.
@@ -2232,10 +2230,10 @@ export class MulticastManager {
2232
2230
  for (const [key, stats] of [...this.#blockPolicyStats]) {
2233
2231
  if (stats.packetId === stream.packetId) this.#blockPolicyStats.delete(key);
2234
2232
  }
2235
- // The retired track stops contributing to the stream-global FEC timing;
2236
- // the deadlines already applied stay until the next configuration
2237
- // re-reduces them, which only ever errs toward the wider window.
2238
- this.#trackFecTiming.delete(stream.packetId);
2233
+ if (this.#trackFecTiming.delete(stream.packetId)) {
2234
+ this.#applyStreamGlobalFecTiming();
2235
+ }
2236
+ this.#multiTrackFecTracks.delete(stream.packetId);
2239
2237
  this.#fec.releasePacket(stream.packetId);
2240
2238
  }
2241
2239
 
@@ -2302,6 +2300,21 @@ export class MulticastManager {
2302
2300
  * D-17: Builds altGroup → track-name index for getSwitchingSet().
2303
2301
  * D-26: Registers packetId → TrackRole on MmtpRouter for block-complete fanout.
2304
2302
  *
2303
+ * FEC availability is per track (draft-ramadan-moq-fec §5.1). A media track
2304
+ * whose `fec` names no implemented `blockProfile` (only `iso-ssbg1-v1` is
2305
+ * implemented; the retired `k-padded-v1` is not), or an `iso-ssbg1-v1` span
2306
+ * it cannot use, is consumed without FEC: it gets no decoder, and none of
2307
+ * its repair tracks (layer 0 by `fec.repairTrack`, further layers and the
2308
+ * overlay by `depends`) is given an owner, so the router drops their packets
2309
+ * before any decoder. Those legs keep the `repair` role and their owner's
2310
+ * switching set. Neither the call nor any other track's FEC fails on that
2311
+ * account; `trackFecUnavailable(name)` reports the reason. FEC a previous
2312
+ * call configured on a packetId this call does not is released
2313
+ * (FECManager.releasePacket); frames its release gate held are delivered in
2314
+ * order, each gap stalled. FEC wired by hand (setFecDecoder) is left alone.
2315
+ * Geometry a decoder could not configure (K, P, T, `repairTrack`,
2316
+ * algorithm) still throws.
2317
+ *
2305
2318
  * @param catalog - Multi-track catalog (tracks array with name, altGroup, fec, packetId).
2306
2319
  * @param wasmDecoderSource - One WASM FEC decoder for a single FEC stream, or
2307
2320
  * a factory returning a distinct decoder per stream.
@@ -2325,6 +2338,44 @@ export class MulticastManager {
2325
2338
  // mis-roled or rejected on its name, and would land in its own altGroup
2326
2339
  // rather than its owner's.
2327
2340
  const repairNamesBySource = repairTrackNamesBySource(catalog.tracks);
2341
+ // §5.1: classify each media track's FEC before roles are resolved. A track
2342
+ // whose FEC is unavailable still names its layer 0 by `fec.repairTrack`;
2343
+ // that pointer is a catalog fact about the leg, not about the profile, so
2344
+ // the leg stays roled `repair` in its owner's group rather than falling
2345
+ // through to its name. It is never given an owner below.
2346
+ const declaredRepairNames = new Set<string>();
2347
+ for (const names of repairNamesBySource.values()) {
2348
+ for (const name of names) declaredRepairNames.add(name);
2349
+ }
2350
+ const fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
2351
+ for (let i = 0; i < catalog.tracks.length; i++) {
2352
+ const track = catalog.tracks[i]!;
2353
+ if (
2354
+ track.fec === undefined ||
2355
+ track.packaging === "fec-repair" ||
2356
+ declaredRepairNames.has(track.name)
2357
+ ) {
2358
+ continue;
2359
+ }
2360
+ const fecUnavailable = catalogFecUnavailable(track.fec, `$.tracks[${i}].fec`);
2361
+ if (fecUnavailable === undefined) continue;
2362
+ fecUnavailableByTrack.set(track.name, fecUnavailable);
2363
+ const layerZero = (track.fec as { repairTrack?: unknown }).repairTrack;
2364
+ if (typeof layerZero === "string" && layerZero.length > 0) {
2365
+ const names = repairNamesBySource.get(track.name) ?? new Set<string>();
2366
+ names.add(layerZero);
2367
+ repairNamesBySource.set(track.name, names);
2368
+ }
2369
+ }
2370
+ // Every repair leg of a source without FEC goes unowned, including one a
2371
+ // source with FEC also names: the router could not tell the two sources'
2372
+ // symbols apart on it, and the unavailable source's must reach no decoder.
2373
+ const unownedRepairNames = new Set<string>();
2374
+ for (const sourceName of fecUnavailableByTrack.keys()) {
2375
+ for (const repairName of repairNamesBySource.get(sourceName) ?? []) {
2376
+ unownedRepairNames.add(repairName);
2377
+ }
2378
+ }
2328
2379
  const repairOwnerGroup = new Map<string, string>();
2329
2380
  const repairOwnerAltGroup = new Map<string, number | undefined>();
2330
2381
  for (const track of catalog.tracks) {
@@ -2390,11 +2441,15 @@ export class MulticastManager {
2390
2441
  for (let i = 0; i < catalog.tracks.length; i++) {
2391
2442
  const track = catalog.tracks[i]!;
2392
2443
  if (resolvedRoles[i] === "repair" || track.fec === undefined) continue;
2393
- if (!isFecCatalogConfig(track.fec)) {
2444
+ // Malformed geometry fails the call whatever the profile says; an
2445
+ // unavailable profile or span only costs this track its FEC (§5.1).
2446
+ const unavailable = fecUnavailableByTrack.has(track.name);
2447
+ if (!(unavailable ? isFecCatalogGeometry(track.fec) : isFecCatalogConfig(track.fec))) {
2394
2448
  throw new Error(
2395
2449
  `[MulticastManager] invalid fec config for track '${track.name}'`,
2396
2450
  );
2397
2451
  }
2452
+ if (unavailable) continue;
2398
2453
  if (track.packetId !== undefined) fecTrackIndexes.push(i);
2399
2454
  }
2400
2455
 
@@ -2424,10 +2479,32 @@ export class MulticastManager {
2424
2479
  }
2425
2480
  }
2426
2481
 
2427
- // Reset switching-set index and repair packetId set.
2482
+ // Reset switching-set index, repair packetId set and FEC availability.
2428
2483
  this.#switchingSets.clear();
2429
2484
  this.#repairPacketIds.clear();
2430
2485
  this.#router.clearRepairPacketIdOwners();
2486
+ // FEC a previous call configured that this one does not (the source is
2487
+ // gone, lost its `fec`, or its FEC is now unavailable) must not stay
2488
+ // installed: its symbols would still be read as block coordinates and
2489
+ // held for repair legs that no longer have an owner. FEC a caller wired
2490
+ // by hand is not this call's to release.
2491
+ const fecPacketIds = new Set([...fecDecoders.keys()].map((i) => catalog.tracks[i]!.packetId));
2492
+ // The record survives a throw below: a packet this call configures again
2493
+ // is overwritten by its set(), and a released one is dropped by
2494
+ // #releaseRetiredStream.
2495
+ for (const [packetId, catalogTrackName] of this.#multiTrackFecTracks) {
2496
+ if (fecPacketIds.has(packetId)) continue;
2497
+ if (!this.#fec.isTrackConfigured(packetId)) {
2498
+ this.#multiTrackFecTracks.delete(packetId);
2499
+ continue;
2500
+ }
2501
+ this.#router.releaseFecPacket(packetId);
2502
+ this.#releaseRetiredStream({ packetId, catalogTrackName });
2503
+ }
2504
+ this.#fecUnavailableByTrack.clear();
2505
+ for (const [name, reason] of fecUnavailableByTrack) {
2506
+ this.#fecUnavailableByTrack.set(name, reason);
2507
+ }
2431
2508
  const catalogTracksByName = new Map(
2432
2509
  catalog.tracks.map((track) => [track.name, track] as const),
2433
2510
  );
@@ -2460,8 +2537,9 @@ export class MulticastManager {
2460
2537
  continue;
2461
2538
  }
2462
2539
 
2463
- // D-07: Apply per-track FEC config for non-repair tracks.
2464
- if (track.fec !== undefined) {
2540
+ // D-07: Apply per-track FEC config for non-repair tracks. A track whose
2541
+ // FEC is unavailable (§5.1) is consumed like a track without `fec`.
2542
+ if (track.fec !== undefined && !fecUnavailableByTrack.has(track.name)) {
2465
2543
  const fecCfg = track.fec as FecCatalogConfig;
2466
2544
  // Every repair layer and the keyframe overlay route to this source's
2467
2545
  // decoder, not only layer 0. A layer whose packetId had no registered
@@ -2469,6 +2547,7 @@ export class MulticastManager {
2469
2547
  // two sources whose RS_ID ranges overlap would be indistinguishable.
2470
2548
  if (track.packetId !== undefined) {
2471
2549
  for (const repairName of repairNamesBySource.get(track.name) ?? []) {
2550
+ if (unownedRepairNames.has(repairName)) continue;
2472
2551
  const repairTrack = catalogTracksByName.get(repairName);
2473
2552
  if (repairTrack?.packetId !== undefined) {
2474
2553
  this.#router.setRepairPacketIdOwner(repairTrack.packetId, track.packetId);
@@ -2493,17 +2572,18 @@ export class MulticastManager {
2493
2572
  blockProfile,
2494
2573
  k: fecCfg.sourceSymbols,
2495
2574
  symbolSize: fecCfg.symbolSize,
2496
- interleaveDepthMs: fecCfg.interleaveDepthMs,
2575
+ interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
2497
2576
  fps: track.framerate,
2498
2577
  trackKind: "video",
2499
2578
  },
2500
2579
  track.name,
2501
2580
  );
2581
+ this.#multiTrackFecTracks.set(track.packetId, track.name);
2502
2582
  this.#configureTrackMapper(track.packetId, {
2503
2583
  blockProfile,
2504
2584
  k: fecCfg.sourceSymbols,
2505
2585
  symbolSize: fecCfg.symbolSize,
2506
- interleaveDepthMs: fecCfg.interleaveDepthMs,
2586
+ interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
2507
2587
  fps: track.framerate,
2508
2588
  });
2509
2589
  this.#router.setPacketIdType(track.packetId, "video");
@@ -2512,6 +2592,27 @@ export class MulticastManager {
2512
2592
  }
2513
2593
  }
2514
2594
 
2595
+ /**
2596
+ * Why `configureMultiTrack` consumes the named catalog track without FEC
2597
+ * although its `fec` block declares one (draft-ramadan-moq-fec §5.1): no
2598
+ * implemented `blockProfile` (`track_fec_block_profile_unimplemented`, e.g.
2599
+ * the retired `k-padded-v1`; `track_fec_block_profile` when absent), or an
2600
+ * invalid `iso-ssbg1-v1` span (`track_fec`). Absent/zero spans keep in-band
2601
+ * decoding enabled. The same reason the hang
2602
+ * resolver reports (`catalogFecUnavailable`). Undefined for every other
2603
+ * track, and for every track before the first call; each call replaces the
2604
+ * previous call's answers.
2605
+ */
2606
+ trackFecUnavailable(trackName: string): TrackFecUnavailable | undefined {
2607
+ return this.#fecUnavailableByTrack.get(trackName);
2608
+ }
2609
+
2610
+ /** Per-track FEC availability from the last `configureMultiTrack` call. */
2611
+ readonly #fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
2612
+
2613
+ /** packetId → catalog track name of the FEC the last `configureMultiTrack` installed. */
2614
+ readonly #multiTrackFecTracks = new Map<number, string>();
2615
+
2515
2616
  /**
2516
2617
  * Return the track names belonging to the given altGroup switching set.
2517
2618
  * D-17: altGroup groups base+delta+repair into one switching set.
@@ -269,7 +269,7 @@ export class MulticastTransport<TPacketContext = never> {
269
269
  // inside the window, instead of a clear+set pair on every packet.
270
270
  #watchdog: ReturnType<typeof setTimeout> | null = null
271
271
  #lastPacketAtMs = 0
272
- #failbackWindowMs: number | null = null
272
+ #failbackWindowMs: number | null | undefined
273
273
  #onTakeover: (() => void) | null = null
274
274
  #onFailback: ((reason: MulticastFailbackReason) => void) | null = null
275
275
  // Data-plane-live edge: the first packet this join accepted. Everything
@@ -644,18 +644,24 @@ export class MulticastTransport<TPacketContext = never> {
644
644
  return this.#dataPlaneLive
645
645
  }
646
646
 
647
- setFailbackWindowMs(windowMs: number): void {
648
- if (!Number.isFinite(windowMs) || windowMs <= 0) {
647
+ setFailbackWindowMs(windowMs: number | null): void {
648
+ if (windowMs !== null && (!Number.isFinite(windowMs) || windowMs <= 0)) {
649
649
  throw new Error(
650
650
  `[MulticastTransport] failbackWindowMs=${windowMs}. ` +
651
651
  `Derive a positive failback window from the stream catalog.`,
652
652
  )
653
653
  }
654
654
  this.#failbackWindowMs = windowMs
655
- // An armed timer was scheduled against the previous window; re-derive its
656
- // wake-up from the last packet so a narrower window is not enforced late.
657
- if (this.#watchdog !== null) {
658
- clearTimeout(this.#watchdog)
655
+ if (windowMs === null) {
656
+ if (this.#watchdog !== null) clearTimeout(this.#watchdog)
657
+ this.#watchdog = null
658
+ return
659
+ }
660
+ // Re-enable against the last packet even when the previous policy disabled
661
+ // the watchdog: a silent live stream may never deliver another packet.
662
+ if (this.#watchdog !== null) clearTimeout(this.#watchdog)
663
+ this.#watchdog = null
664
+ if (this.#dataPlaneLive && this.#onFailback) {
659
665
  const silentMs = performance.now() - this.#lastPacketAtMs
660
666
  this.#armWatchdog(Math.max(0, Math.ceil(windowMs - silentMs)))
661
667
  }
@@ -1022,7 +1028,8 @@ export class MulticastTransport<TPacketContext = never> {
1022
1028
  }
1023
1029
  if (this.#watchdog !== null) return
1024
1030
  if (!this.#onFailback) return
1025
- if (this.#failbackWindowMs === null) {
1031
+ if (this.#failbackWindowMs === null) return
1032
+ if (this.#failbackWindowMs === undefined) {
1026
1033
  throw new Error(
1027
1034
  '[MulticastTransport] Failback watchdog requires a catalog-derived window',
1028
1035
  )
@@ -1033,7 +1040,7 @@ export class MulticastTransport<TPacketContext = never> {
1033
1040
  #armWatchdog(delayMs: number): void {
1034
1041
  this.#watchdog = setTimeout(() => {
1035
1042
  this.#watchdog = null
1036
- if (this.#disposed || !this.#onFailback || this.#failbackWindowMs === null) return
1043
+ if (this.#disposed || !this.#onFailback || this.#failbackWindowMs == null) return
1037
1044
  const silentMs = performance.now() - this.#lastPacketAtMs
1038
1045
  if (silentMs < this.#failbackWindowMs) {
1039
1046
  this.#armWatchdog(Math.ceil(this.#failbackWindowMs - silentMs))