@blockcast/mmt-container 0.3.0 → 0.4.0-main.1e94b11199ea

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 (606) hide show
  1. package/README.md +33 -16
  2. package/dist/browser-runtime.js +14816 -14254
  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 +32 -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 +52 -30
  30. package/dist/fec-manager.d.ts.map +1 -1
  31. package/dist/fec-manager.js +338 -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 +14 -11
  54. package/dist/mmtp-container-parser.d.ts.map +1 -1
  55. package/dist/mmtp-container-parser.js +126 -99
  56. package/dist/mmtp-container-parser.js.map +4 -4
  57. package/dist/mmtp-container-parser.no-modules.js +154 -108
  58. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  59. package/dist/mmtp-decode-pipeline.js +126 -99
  60. package/dist/mmtp-decode-pipeline.js.map +4 -4
  61. package/dist/mmtp-router.d.ts +51 -29
  62. package/dist/mmtp-router.d.ts.map +1 -1
  63. package/dist/mmtp-router.js +260 -326
  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 +72 -6
  68. package/dist/multicast-manager.d.ts.map +1 -1
  69. package/dist/multicast-manager.js +882 -673
  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 +150 -106
  78. package/dist/no-modules.js.map +4 -4
  79. package/dist/repair-fetch.d.ts +116 -21
  80. package/dist/repair-fetch.d.ts.map +1 -1
  81. package/dist/repair-fetch.js +114 -34
  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 +126 -99
  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 +51 -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 +457 -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 +106 -20
  113. package/src/mmtp-router.ts +189 -330
  114. package/src/multicast-manager.ts +265 -86
  115. package/src/multicast-transport.ts +16 -9
  116. package/src/repair-fetch.ts +273 -43
  117. package/src/repair-layers.ts +28 -8
  118. package/src/track-session.ts +28 -9
  119. package/test-vectors/catalog/README.md +44 -18
  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 +2 -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/section-codes.json +33 -0
  137. package/test-vectors/catalog-timing.json +356 -0
  138. package/test-vectors/catalog-validation.json +40 -5
  139. package/test-vectors/delivery-catalog/README.md +11 -0
  140. package/test-vectors/delivery-catalog/negative/missing-block-profile.json +58 -0
  141. package/test-vectors/delivery-catalog/negative/packet-id-signaling.json +59 -0
  142. package/test-vectors/delivery-catalog/negative/retired-k-padded-block-profile.json +59 -0
  143. package/test-vectors/delivery-catalog/positive/dash.json +56 -0
  144. package/test-vectors/delivery-catalog/positive/mmtp-source-only.json +43 -0
  145. package/node_modules/@blockcast/fec-worker/README.md +0 -223
  146. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  147. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +0 -38
  148. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +0 -1
  149. package/node_modules/@blockcast/fec-worker/dist/block-order.js +0 -78
  150. package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +0 -1
  151. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +0 -93
  152. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +0 -1
  153. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +0 -346
  154. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +0 -1
  155. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +0 -380
  156. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +0 -1
  157. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +0 -11
  158. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +0 -1
  159. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +0 -14
  160. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +0 -1
  161. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +0 -859
  162. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +0 -7
  163. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +0 -10
  164. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +0 -1
  165. package/node_modules/@blockcast/fec-worker/dist/index.js +0 -8
  166. package/node_modules/@blockcast/fec-worker/dist/index.js.map +0 -1
  167. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +0 -20
  168. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +0 -1
  169. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +0 -370
  170. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +0 -7
  171. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +0 -104
  172. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +0 -1
  173. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +0 -181
  174. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +0 -1
  175. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +0 -194
  176. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +0 -1
  177. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +0 -62
  178. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +0 -1
  179. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +0 -9
  180. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +0 -1
  181. package/node_modules/@blockcast/fec-worker/dist/transfer.js +0 -13
  182. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +0 -1
  183. package/node_modules/@blockcast/fec-worker/package.json +0 -59
  184. package/node_modules/@blockcast/fec-worker/src/block-order.ts +0 -93
  185. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +0 -392
  186. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +0 -399
  187. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +0 -1502
  188. package/node_modules/@blockcast/fec-worker/src/index.ts +0 -35
  189. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +0 -589
  190. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +0 -222
  191. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +0 -209
  192. package/node_modules/@blockcast/fec-worker/src/transfer.ts +0 -12
  193. package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  194. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  195. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  196. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  197. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  198. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  199. package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  200. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  201. package/node_modules/@blockcast/mmt-base/README.md +0 -134
  202. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  203. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  204. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  205. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  206. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  207. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  208. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  209. package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  210. package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  211. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  212. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  213. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  214. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  215. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  216. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  217. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  218. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  219. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  220. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  221. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  222. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  223. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  224. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  225. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  226. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  227. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  228. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  229. package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  230. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  231. package/node_modules/@blockcast/mmt-base/package.json +0 -49
  232. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  233. package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  234. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  235. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  236. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  237. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  238. package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  239. package/node_modules/@blockcast/mmt-fec/README.md +0 -271
  240. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  241. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +0 -82
  242. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +0 -1
  243. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +0 -296
  244. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +0 -1
  245. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +0 -106
  246. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +0 -1
  247. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +0 -288
  248. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +0 -1
  249. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +0 -46
  250. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +0 -1
  251. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +0 -96
  252. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +0 -1
  253. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +0 -33
  254. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +0 -1
  255. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +0 -57
  256. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +0 -1
  257. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +0 -205
  258. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +0 -1
  259. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +0 -240
  260. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +0 -1
  261. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +0 -28
  262. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +0 -1
  263. package/node_modules/@blockcast/mmt-fec/dist/index.js +0 -28
  264. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +0 -1
  265. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +0 -20
  266. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +0 -1
  267. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +0 -28
  268. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +0 -1
  269. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +0 -258
  270. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +0 -1
  271. package/node_modules/@blockcast/mmt-fec/dist/oti.js +0 -382
  272. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +0 -1
  273. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +0 -41
  274. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +0 -1
  275. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +0 -81
  276. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +0 -1
  277. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +0 -82
  278. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +0 -1
  279. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +0 -170
  280. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +0 -1
  281. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  282. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  283. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  284. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  285. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  286. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  287. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  288. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  289. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +0 -134
  290. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  291. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  292. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  293. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  294. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  295. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  296. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  297. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  298. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  299. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  300. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  301. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  302. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  303. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  304. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  305. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  306. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +0 -49
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  324. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  325. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  326. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  327. package/node_modules/@blockcast/mmt-fec/package.json +0 -79
  328. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +0 -371
  329. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +0 -439
  330. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +0 -127
  331. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +0 -68
  332. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +0 -310
  333. package/node_modules/@blockcast/mmt-fec/src/index.ts +0 -94
  334. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +0 -34
  335. package/node_modules/@blockcast/mmt-fec/src/oti.ts +0 -463
  336. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +0 -101
  337. package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +0 -195
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +0 -28
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +0 -1
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +0 -128
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +0 -1
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +0 -4
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +0 -1
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +0 -4
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +0 -1
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +0 -37
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +0 -1
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +0 -179
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +0 -1
  351. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +0 -99
  352. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +0 -1
  353. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +0 -492
  354. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +0 -1
  355. package/node_modules/@blockcast/mmt-manifest-verify/package.json +0 -45
  356. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +0 -171
  357. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +0 -3
  358. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +0 -230
  359. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +0 -669
  360. package/node_modules/@noble/hashes/LICENSE +0 -21
  361. package/node_modules/@noble/hashes/README.md +0 -521
  362. package/node_modules/@noble/hashes/_assert.d.ts +0 -17
  363. package/node_modules/@noble/hashes/_assert.d.ts.map +0 -1
  364. package/node_modules/@noble/hashes/_assert.js +0 -18
  365. package/node_modules/@noble/hashes/_assert.js.map +0 -1
  366. package/node_modules/@noble/hashes/_blake.d.ts +0 -14
  367. package/node_modules/@noble/hashes/_blake.d.ts.map +0 -1
  368. package/node_modules/@noble/hashes/_blake.js +0 -50
  369. package/node_modules/@noble/hashes/_blake.js.map +0 -1
  370. package/node_modules/@noble/hashes/_md.d.ts +0 -51
  371. package/node_modules/@noble/hashes/_md.d.ts.map +0 -1
  372. package/node_modules/@noble/hashes/_md.js +0 -162
  373. package/node_modules/@noble/hashes/_md.js.map +0 -1
  374. package/node_modules/@noble/hashes/_u64.d.ts +0 -55
  375. package/node_modules/@noble/hashes/_u64.d.ts.map +0 -1
  376. package/node_modules/@noble/hashes/_u64.js +0 -90
  377. package/node_modules/@noble/hashes/_u64.js.map +0 -1
  378. package/node_modules/@noble/hashes/argon2.d.ts +0 -32
  379. package/node_modules/@noble/hashes/argon2.d.ts.map +0 -1
  380. package/node_modules/@noble/hashes/argon2.js +0 -401
  381. package/node_modules/@noble/hashes/argon2.js.map +0 -1
  382. package/node_modules/@noble/hashes/blake1.d.ts +0 -106
  383. package/node_modules/@noble/hashes/blake1.d.ts.map +0 -1
  384. package/node_modules/@noble/hashes/blake1.js +0 -459
  385. package/node_modules/@noble/hashes/blake1.js.map +0 -1
  386. package/node_modules/@noble/hashes/blake2.d.ts +0 -116
  387. package/node_modules/@noble/hashes/blake2.d.ts.map +0 -1
  388. package/node_modules/@noble/hashes/blake2.js +0 -420
  389. package/node_modules/@noble/hashes/blake2.js.map +0 -1
  390. package/node_modules/@noble/hashes/blake2b.d.ts +0 -11
  391. package/node_modules/@noble/hashes/blake2b.d.ts.map +0 -1
  392. package/node_modules/@noble/hashes/blake2b.js +0 -14
  393. package/node_modules/@noble/hashes/blake2b.js.map +0 -1
  394. package/node_modules/@noble/hashes/blake2s.d.ts +0 -20
  395. package/node_modules/@noble/hashes/blake2s.d.ts.map +0 -1
  396. package/node_modules/@noble/hashes/blake2s.js +0 -24
  397. package/node_modules/@noble/hashes/blake2s.js.map +0 -1
  398. package/node_modules/@noble/hashes/blake3.d.ts +0 -54
  399. package/node_modules/@noble/hashes/blake3.d.ts.map +0 -1
  400. package/node_modules/@noble/hashes/blake3.js +0 -255
  401. package/node_modules/@noble/hashes/blake3.js.map +0 -1
  402. package/node_modules/@noble/hashes/crypto.d.ts +0 -2
  403. package/node_modules/@noble/hashes/crypto.d.ts.map +0 -1
  404. package/node_modules/@noble/hashes/crypto.js +0 -5
  405. package/node_modules/@noble/hashes/crypto.js.map +0 -1
  406. package/node_modules/@noble/hashes/cryptoNode.d.ts +0 -2
  407. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +0 -1
  408. package/node_modules/@noble/hashes/cryptoNode.js +0 -18
  409. package/node_modules/@noble/hashes/cryptoNode.js.map +0 -1
  410. package/node_modules/@noble/hashes/eskdf.d.ts +0 -47
  411. package/node_modules/@noble/hashes/eskdf.d.ts.map +0 -1
  412. package/node_modules/@noble/hashes/eskdf.js +0 -166
  413. package/node_modules/@noble/hashes/eskdf.js.map +0 -1
  414. package/node_modules/@noble/hashes/esm/_assert.d.ts +0 -17
  415. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +0 -1
  416. package/node_modules/@noble/hashes/esm/_assert.js +0 -15
  417. package/node_modules/@noble/hashes/esm/_assert.js.map +0 -1
  418. package/node_modules/@noble/hashes/esm/_blake.d.ts +0 -14
  419. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +0 -1
  420. package/node_modules/@noble/hashes/esm/_blake.js +0 -45
  421. package/node_modules/@noble/hashes/esm/_blake.js.map +0 -1
  422. package/node_modules/@noble/hashes/esm/_md.d.ts +0 -51
  423. package/node_modules/@noble/hashes/esm/_md.d.ts.map +0 -1
  424. package/node_modules/@noble/hashes/esm/_md.js +0 -155
  425. package/node_modules/@noble/hashes/esm/_md.js.map +0 -1
  426. package/node_modules/@noble/hashes/esm/_u64.d.ts +0 -55
  427. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +0 -1
  428. package/node_modules/@noble/hashes/esm/_u64.js +0 -67
  429. package/node_modules/@noble/hashes/esm/_u64.js.map +0 -1
  430. package/node_modules/@noble/hashes/esm/argon2.d.ts +0 -32
  431. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +0 -1
  432. package/node_modules/@noble/hashes/esm/argon2.js +0 -392
  433. package/node_modules/@noble/hashes/esm/argon2.js.map +0 -1
  434. package/node_modules/@noble/hashes/esm/blake1.d.ts +0 -106
  435. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +0 -1
  436. package/node_modules/@noble/hashes/esm/blake1.js +0 -452
  437. package/node_modules/@noble/hashes/esm/blake1.js.map +0 -1
  438. package/node_modules/@noble/hashes/esm/blake2.d.ts +0 -116
  439. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +0 -1
  440. package/node_modules/@noble/hashes/esm/blake2.js +0 -413
  441. package/node_modules/@noble/hashes/esm/blake2.js.map +0 -1
  442. package/node_modules/@noble/hashes/esm/blake2b.d.ts +0 -11
  443. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +0 -1
  444. package/node_modules/@noble/hashes/esm/blake2b.js +0 -11
  445. package/node_modules/@noble/hashes/esm/blake2b.js.map +0 -1
  446. package/node_modules/@noble/hashes/esm/blake2s.d.ts +0 -20
  447. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +0 -1
  448. package/node_modules/@noble/hashes/esm/blake2s.js +0 -21
  449. package/node_modules/@noble/hashes/esm/blake2s.js.map +0 -1
  450. package/node_modules/@noble/hashes/esm/blake3.d.ts +0 -54
  451. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +0 -1
  452. package/node_modules/@noble/hashes/esm/blake3.js +0 -251
  453. package/node_modules/@noble/hashes/esm/blake3.js.map +0 -1
  454. package/node_modules/@noble/hashes/esm/crypto.d.ts +0 -2
  455. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +0 -1
  456. package/node_modules/@noble/hashes/esm/crypto.js +0 -2
  457. package/node_modules/@noble/hashes/esm/crypto.js.map +0 -1
  458. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +0 -2
  459. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +0 -1
  460. package/node_modules/@noble/hashes/esm/cryptoNode.js +0 -15
  461. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +0 -1
  462. package/node_modules/@noble/hashes/esm/eskdf.d.ts +0 -47
  463. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +0 -1
  464. package/node_modules/@noble/hashes/esm/eskdf.js +0 -160
  465. package/node_modules/@noble/hashes/esm/eskdf.js.map +0 -1
  466. package/node_modules/@noble/hashes/esm/hkdf.d.ts +0 -36
  467. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +0 -1
  468. package/node_modules/@noble/hashes/esm/hkdf.js +0 -82
  469. package/node_modules/@noble/hashes/esm/hkdf.js.map +0 -1
  470. package/node_modules/@noble/hashes/esm/hmac.d.ts +0 -35
  471. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +0 -1
  472. package/node_modules/@noble/hashes/esm/hmac.js +0 -86
  473. package/node_modules/@noble/hashes/esm/hmac.js.map +0 -1
  474. package/node_modules/@noble/hashes/esm/index.d.ts +0 -2
  475. package/node_modules/@noble/hashes/esm/index.d.ts.map +0 -1
  476. package/node_modules/@noble/hashes/esm/index.js +0 -33
  477. package/node_modules/@noble/hashes/esm/index.js.map +0 -1
  478. package/node_modules/@noble/hashes/esm/legacy.d.ts +0 -71
  479. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +0 -1
  480. package/node_modules/@noble/hashes/esm/legacy.js +0 -281
  481. package/node_modules/@noble/hashes/esm/legacy.js.map +0 -1
  482. package/node_modules/@noble/hashes/esm/package.json +0 -10
  483. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +0 -23
  484. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +0 -1
  485. package/node_modules/@noble/hashes/esm/pbkdf2.js +0 -97
  486. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +0 -1
  487. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +0 -13
  488. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +0 -1
  489. package/node_modules/@noble/hashes/esm/ripemd160.js +0 -13
  490. package/node_modules/@noble/hashes/esm/ripemd160.js.map +0 -1
  491. package/node_modules/@noble/hashes/esm/scrypt.d.ts +0 -34
  492. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +0 -1
  493. package/node_modules/@noble/hashes/esm/scrypt.js +0 -228
  494. package/node_modules/@noble/hashes/esm/scrypt.js.map +0 -1
  495. package/node_modules/@noble/hashes/esm/sha1.d.ts +0 -11
  496. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +0 -1
  497. package/node_modules/@noble/hashes/esm/sha1.js +0 -11
  498. package/node_modules/@noble/hashes/esm/sha1.js.map +0 -1
  499. package/node_modules/@noble/hashes/esm/sha2.d.ts +0 -159
  500. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +0 -1
  501. package/node_modules/@noble/hashes/esm/sha2.js +0 -375
  502. package/node_modules/@noble/hashes/esm/sha2.js.map +0 -1
  503. package/node_modules/@noble/hashes/esm/sha256.d.ts +0 -20
  504. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +0 -1
  505. package/node_modules/@noble/hashes/esm/sha256.js +0 -20
  506. package/node_modules/@noble/hashes/esm/sha256.js.map +0 -1
  507. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +0 -142
  508. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +0 -1
  509. package/node_modules/@noble/hashes/esm/sha3-addons.js +0 -393
  510. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +0 -1
  511. package/node_modules/@noble/hashes/esm/sha3.d.ts +0 -53
  512. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +0 -1
  513. package/node_modules/@noble/hashes/esm/sha3.js +0 -234
  514. package/node_modules/@noble/hashes/esm/sha3.js.map +0 -1
  515. package/node_modules/@noble/hashes/esm/sha512.d.ts +0 -26
  516. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +0 -1
  517. package/node_modules/@noble/hashes/esm/sha512.js +0 -26
  518. package/node_modules/@noble/hashes/esm/sha512.js.map +0 -1
  519. package/node_modules/@noble/hashes/esm/utils.d.ts +0 -161
  520. package/node_modules/@noble/hashes/esm/utils.d.ts.map +0 -1
  521. package/node_modules/@noble/hashes/esm/utils.js +0 -281
  522. package/node_modules/@noble/hashes/esm/utils.js.map +0 -1
  523. package/node_modules/@noble/hashes/hkdf.d.ts +0 -36
  524. package/node_modules/@noble/hashes/hkdf.d.ts.map +0 -1
  525. package/node_modules/@noble/hashes/hkdf.js +0 -88
  526. package/node_modules/@noble/hashes/hkdf.js.map +0 -1
  527. package/node_modules/@noble/hashes/hmac.d.ts +0 -35
  528. package/node_modules/@noble/hashes/hmac.d.ts.map +0 -1
  529. package/node_modules/@noble/hashes/hmac.js +0 -91
  530. package/node_modules/@noble/hashes/hmac.js.map +0 -1
  531. package/node_modules/@noble/hashes/index.d.ts +0 -1
  532. package/node_modules/@noble/hashes/index.d.ts.map +0 -1
  533. package/node_modules/@noble/hashes/index.js +0 -33
  534. package/node_modules/@noble/hashes/index.js.map +0 -1
  535. package/node_modules/@noble/hashes/legacy.d.ts +0 -71
  536. package/node_modules/@noble/hashes/legacy.d.ts.map +0 -1
  537. package/node_modules/@noble/hashes/legacy.js +0 -287
  538. package/node_modules/@noble/hashes/legacy.js.map +0 -1
  539. package/node_modules/@noble/hashes/package.json +0 -266
  540. package/node_modules/@noble/hashes/pbkdf2.d.ts +0 -23
  541. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +0 -1
  542. package/node_modules/@noble/hashes/pbkdf2.js +0 -101
  543. package/node_modules/@noble/hashes/pbkdf2.js.map +0 -1
  544. package/node_modules/@noble/hashes/ripemd160.d.ts +0 -13
  545. package/node_modules/@noble/hashes/ripemd160.d.ts.map +0 -1
  546. package/node_modules/@noble/hashes/ripemd160.js +0 -16
  547. package/node_modules/@noble/hashes/ripemd160.js.map +0 -1
  548. package/node_modules/@noble/hashes/scrypt.d.ts +0 -34
  549. package/node_modules/@noble/hashes/scrypt.d.ts.map +0 -1
  550. package/node_modules/@noble/hashes/scrypt.js +0 -232
  551. package/node_modules/@noble/hashes/scrypt.js.map +0 -1
  552. package/node_modules/@noble/hashes/sha1.d.ts +0 -11
  553. package/node_modules/@noble/hashes/sha1.d.ts.map +0 -1
  554. package/node_modules/@noble/hashes/sha1.js +0 -14
  555. package/node_modules/@noble/hashes/sha1.js.map +0 -1
  556. package/node_modules/@noble/hashes/sha2.d.ts +0 -159
  557. package/node_modules/@noble/hashes/sha2.d.ts.map +0 -1
  558. package/node_modules/@noble/hashes/sha2.js +0 -384
  559. package/node_modules/@noble/hashes/sha2.js.map +0 -1
  560. package/node_modules/@noble/hashes/sha256.d.ts +0 -20
  561. package/node_modules/@noble/hashes/sha256.d.ts.map +0 -1
  562. package/node_modules/@noble/hashes/sha256.js +0 -23
  563. package/node_modules/@noble/hashes/sha256.js.map +0 -1
  564. package/node_modules/@noble/hashes/sha3-addons.d.ts +0 -142
  565. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +0 -1
  566. package/node_modules/@noble/hashes/sha3-addons.js +0 -402
  567. package/node_modules/@noble/hashes/sha3-addons.js.map +0 -1
  568. package/node_modules/@noble/hashes/sha3.d.ts +0 -53
  569. package/node_modules/@noble/hashes/sha3.d.ts.map +0 -1
  570. package/node_modules/@noble/hashes/sha3.js +0 -239
  571. package/node_modules/@noble/hashes/sha3.js.map +0 -1
  572. package/node_modules/@noble/hashes/sha512.d.ts +0 -26
  573. package/node_modules/@noble/hashes/sha512.d.ts.map +0 -1
  574. package/node_modules/@noble/hashes/sha512.js +0 -29
  575. package/node_modules/@noble/hashes/sha512.js.map +0 -1
  576. package/node_modules/@noble/hashes/src/_assert.ts +0 -22
  577. package/node_modules/@noble/hashes/src/_blake.ts +0 -50
  578. package/node_modules/@noble/hashes/src/_md.ts +0 -176
  579. package/node_modules/@noble/hashes/src/_u64.ts +0 -91
  580. package/node_modules/@noble/hashes/src/argon2.ts +0 -497
  581. package/node_modules/@noble/hashes/src/blake1.ts +0 -534
  582. package/node_modules/@noble/hashes/src/blake2.ts +0 -486
  583. package/node_modules/@noble/hashes/src/blake2b.ts +0 -10
  584. package/node_modules/@noble/hashes/src/blake2s.ts +0 -20
  585. package/node_modules/@noble/hashes/src/blake3.ts +0 -272
  586. package/node_modules/@noble/hashes/src/crypto.ts +0 -9
  587. package/node_modules/@noble/hashes/src/cryptoNode.ts +0 -15
  588. package/node_modules/@noble/hashes/src/eskdf.ts +0 -187
  589. package/node_modules/@noble/hashes/src/hkdf.ts +0 -88
  590. package/node_modules/@noble/hashes/src/hmac.ts +0 -94
  591. package/node_modules/@noble/hashes/src/index.ts +0 -31
  592. package/node_modules/@noble/hashes/src/legacy.ts +0 -293
  593. package/node_modules/@noble/hashes/src/pbkdf2.ts +0 -122
  594. package/node_modules/@noble/hashes/src/ripemd160.ts +0 -12
  595. package/node_modules/@noble/hashes/src/scrypt.ts +0 -257
  596. package/node_modules/@noble/hashes/src/sha1.ts +0 -10
  597. package/node_modules/@noble/hashes/src/sha2.ts +0 -402
  598. package/node_modules/@noble/hashes/src/sha256.ts +0 -24
  599. package/node_modules/@noble/hashes/src/sha3-addons.ts +0 -499
  600. package/node_modules/@noble/hashes/src/sha3.ts +0 -258
  601. package/node_modules/@noble/hashes/src/sha512.ts +0 -34
  602. package/node_modules/@noble/hashes/src/utils.ts +0 -395
  603. package/node_modules/@noble/hashes/utils.d.ts +0 -161
  604. package/node_modules/@noble/hashes/utils.d.ts.map +0 -1
  605. package/node_modules/@noble/hashes/utils.js +0 -313
  606. 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;
@@ -417,6 +418,33 @@ export interface BlockPolicyStats {
417
418
  deltaRepairsDeferred: number;
418
419
  /** Repair requests sent no FETCH (see the `repair-skipped` event). */
419
420
  repairsSkipped: number;
421
+ /** `repairsSkipped` by reason: the reliable path offered no RTT. */
422
+ repairsSkippedRttUnmeasured: number;
423
+ /** `repairsSkipped` by reason: the RTT did not fit the time left to the deadline. */
424
+ repairsSkippedRttExceedsBudget: number;
425
+ /** `repairsSkipped` by reason: the player gave no presentation delay. */
426
+ repairsSkippedPresentationDelayUnavailable: number;
427
+ /**
428
+ * The most recent skip: its reason, the measured RTT (null when
429
+ * unmeasured), the time that was left to the deadline, and the request's
430
+ * repair priority (0 keyframe/unknown, 1 audio, 2 delta; null when the
431
+ * scheduler did not say). Null until a request is skipped.
432
+ */
433
+ lastRepairSkip: {
434
+ readonly reason: RepairSkipReason;
435
+ readonly rttMs: number | null;
436
+ readonly budgetMs: number;
437
+ readonly priority: RepairPriority | null;
438
+ } | null;
439
+ /** Repair FETCHes sent for keyframe/unknown (P0) blocks, every attempt counted. */
440
+ keyframeRepairFetchesSent: number;
441
+ /**
442
+ * Requests the keyframe late-repair budget extended past the presentation
443
+ * deadline (each one can hold the stream behind its block that long).
444
+ */
445
+ keyframeBudgetHolds: number;
446
+ /** Sum of those extensions in ms: the most video the budget could hold. */
447
+ keyframeBudgetHoldMs: number;
420
448
  deltaBlocksFailed: number;
421
449
  audioBlocksRecoveredInband: number;
422
450
  audioBlocksRecoveredQuic: number;
@@ -451,6 +479,13 @@ function newBlockPolicyStats(
451
479
  deltaRepairsPreempted: 0,
452
480
  deltaRepairsDeferred: 0,
453
481
  repairsSkipped: 0,
482
+ repairsSkippedRttUnmeasured: 0,
483
+ repairsSkippedRttExceedsBudget: 0,
484
+ repairsSkippedPresentationDelayUnavailable: 0,
485
+ lastRepairSkip: null,
486
+ keyframeRepairFetchesSent: 0,
487
+ keyframeBudgetHolds: 0,
488
+ keyframeBudgetHoldMs: 0,
454
489
  deltaBlocksFailed: 0,
455
490
  audioBlocksRecoveredInband: 0,
456
491
  audioBlocksRecoveredQuic: 0,
@@ -932,7 +967,10 @@ function projectFecDiagnosticBlock(block: FecBlockSnapshot) {
932
967
  lastSymbolTs: block.lastSymbolTs,
933
968
  ...(block.completedTs === undefined ? {} : { completedTs: block.completedTs }),
934
969
  deadlineTs: block.deadlineTs,
935
- altaVerified: block.altaVerified,
970
+ // ponytail: the per-packet authenticator is gone, so this is always 0. It
971
+ // stays only because pim-multicast-gateway's normalizeSubscriptionDiagnostics
972
+ // still requires a number here; drop it once that validator stops asking.
973
+ altaVerified: 0,
936
974
  relayBlockSigValid: block.relayBlockSigValid,
937
975
  };
938
976
  }
@@ -963,7 +1001,6 @@ function projectFecDiagnosticConfig(config: FecTrackConfig) {
963
1001
  interleaveMs: config.interleaveMs,
964
1002
  fecMode: config.fecMode,
965
1003
  ...(config.repairTrack === undefined ? {} : { repairTrack: config.repairTrack }),
966
- altaEnabled: config.altaEnabled,
967
1004
  relayBlockSigEnabled: config.relayBlockSigEnabled,
968
1005
  };
969
1006
  }
@@ -1042,13 +1079,14 @@ function repairTrackNamesBySource(
1042
1079
  bySource.set(source, names);
1043
1080
  };
1044
1081
  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
- }
1082
+ // The explicit pointer counts whether or not the source's FEC config is
1083
+ // usable (an unimplemented block profile leaves the track without FEC,
1084
+ // not without its repair track): ownership is membership, not
1085
+ // decodability, so no isFecCatalogConfig gate here.
1086
+ const repairTrack = typeof track.fec === "object" && track.fec !== null
1087
+ ? (track.fec as { readonly repairTrack?: unknown }).repairTrack
1088
+ : undefined;
1089
+ if (typeof repairTrack === "string") add(track.name, repairTrack);
1052
1090
  if (track.packaging === "fec-repair" && Array.isArray(track.depends) && track.depends.length === 1) {
1053
1091
  add(track.depends[0]!, track.name);
1054
1092
  }
@@ -1059,6 +1097,7 @@ function repairTrackNamesBySource(
1059
1097
  export class MulticastManager {
1060
1098
  readonly #fec: FECManager;
1061
1099
  readonly #router: MmtpRouter;
1100
+ #hostMfuTimeoutMs: number | null;
1062
1101
  readonly #transport: MulticastTransport<MmtpIngressContext>;
1063
1102
  #reportedFecDiagnosticsFailure = false;
1064
1103
 
@@ -1170,6 +1209,7 @@ export class MulticastManager {
1170
1209
  this.#emitRepairLifecycle(decision);
1171
1210
  },
1172
1211
  });
1212
+ this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
1173
1213
  this.#transport = new MulticastTransport<MmtpIngressContext>((packet, ingress) => {
1174
1214
  this.#router.feedPacket(packet, "multicast", undefined, ingress);
1175
1215
  });
@@ -1434,7 +1474,6 @@ export class MulticastManager {
1434
1474
  ...(this.#streamFecBaseline ? [this.#streamFecBaseline] : []),
1435
1475
  ...this.#trackFecTiming.values(),
1436
1476
  ];
1437
- if (contributions.length === 0) return;
1438
1477
 
1439
1478
  let deliveryWindowMs: number | undefined;
1440
1479
  let minimumFailbackWindowMs: number | undefined;
@@ -1451,11 +1490,7 @@ export class MulticastManager {
1451
1490
  c.minimumFailbackWindowMs,
1452
1491
  );
1453
1492
  }
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.
1493
+ // Only a positive catalog span contributes elapsed FEC timing.
1459
1494
  const interleaveOk =
1460
1495
  c.interleaveDepthMs !== undefined &&
1461
1496
  c.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS;
@@ -1479,15 +1514,11 @@ export class MulticastManager {
1479
1514
  deliveryWindowMs === undefined
1480
1515
  ? minimumFailbackWindowMs
1481
1516
  : 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
- }
1517
+ // Without a positive span or host failback floor, disable the silence watchdog.
1518
+ this.#transport.setFailbackWindowMs(failbackWindowMs ?? null);
1519
+ // No FEC deadline: restore the host's independent reassembly policy.
1520
+ this.#router.setMfuTimeoutMs(mfuTimeoutMs ?? this.#hostMfuTimeoutMs);
1521
+ this.#router.setReorderWindow(reorderWindowFrames ?? 0);
1491
1522
  }
1492
1523
 
1493
1524
  /**
@@ -1535,10 +1566,10 @@ export class MulticastManager {
1535
1566
  `[MulticastManager] configureTrackFec(${packetId}) catalogTrackName must be non-empty when given`,
1536
1567
  );
1537
1568
  }
1538
- if (config.fecK === undefined || config.fecInterleaveDepthMs === undefined) {
1569
+ if (config.fecK === undefined) {
1539
1570
  throw new Error(
1540
- `[MulticastManager] configureTrackFec(${packetId}) requires fecK and ` +
1541
- "fecInterleaveDepthMs. Derive the per-track FEC geometry from the " +
1571
+ `[MulticastManager] configureTrackFec(${packetId}) requires fecK. ` +
1572
+ "Derive the per-track FEC geometry from the " +
1542
1573
  "stream catalog.",
1543
1574
  );
1544
1575
  }
@@ -1547,7 +1578,10 @@ export class MulticastManager {
1547
1578
  `[MulticastManager] configureTrackFec(${packetId}) fecBlockProfile`,
1548
1579
  );
1549
1580
  assertPositiveGeometry("fecK", config.fecK);
1550
- assertPositiveGeometry("fecInterleaveDepthMs", config.fecInterleaveDepthMs);
1581
+ const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
1582
+ if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
1583
+ throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
1584
+ }
1551
1585
  assertPositiveGeometry("fecSymbolSize", config.fecSymbolSize);
1552
1586
  assertPositiveGeometry("fps", config.fps);
1553
1587
  assertPositiveGeometry("bandwidth", config.bandwidth);
@@ -1578,9 +1612,9 @@ export class MulticastManager {
1578
1612
  // (configureTrack/timeoutMsForPacket); it just never had the repair-symbol
1579
1613
  // and bandwidth inputs needed to compute one.
1580
1614
  const deliveryWindowMs =
1581
- config.fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
1615
+ interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
1582
1616
  ? computeFecDeliveryWindowMs({
1583
- interleaveDepthMs: config.fecInterleaveDepthMs,
1617
+ interleaveDepthMs,
1584
1618
  sourceSymbols: config.fecK,
1585
1619
  repairSymbols: config.fecRepairSymbols,
1586
1620
  symbolSize: config.fecSymbolSize,
@@ -1593,12 +1627,12 @@ export class MulticastManager {
1593
1627
  // The block classifier's geometry comes from the raw catalog cadence
1594
1628
  // fields; a track whose media kind is not known yet classifies fail-closed.
1595
1629
  const trackKind = config.trackKind ?? this.#router.trackKindFor(packetId);
1596
- const geometry = trackKind === undefined
1630
+ const geometry = trackKind === undefined || interleaveDepthMs === 0
1597
1631
  ? undefined
1598
1632
  : deriveBlockClassifierGeometry({
1599
1633
  trackKind,
1600
1634
  framerate: config.fps,
1601
- interleaveDepthMs: config.fecInterleaveDepthMs,
1635
+ interleaveDepthMs,
1602
1636
  timescale: config.timescale,
1603
1637
  keyframeIntervalTicks: config.keyframeIntervalTicks,
1604
1638
  keyframeIntervalMs: config.keyframeIntervalMs,
@@ -1607,7 +1641,7 @@ export class MulticastManager {
1607
1641
  blockProfile,
1608
1642
  k: config.fecK,
1609
1643
  symbolSize: config.fecSymbolSize,
1610
- interleaveDepthMs: config.fecInterleaveDepthMs,
1644
+ interleaveDepthMs,
1611
1645
  fps: config.fps,
1612
1646
  timeoutMs: deliveryWindowMs,
1613
1647
  ...(trackKind === undefined ? {} : { trackKind }),
@@ -1619,7 +1653,7 @@ export class MulticastManager {
1619
1653
 
1620
1654
  this.#trackFecTiming.set(packetId, {
1621
1655
  deliveryWindowMs,
1622
- interleaveDepthMs: config.fecInterleaveDepthMs,
1656
+ interleaveDepthMs,
1623
1657
  fps: config.fps,
1624
1658
  k: config.fecK,
1625
1659
  repairSymbols: config.fecRepairSymbols,
@@ -1642,6 +1676,10 @@ export class MulticastManager {
1642
1676
  | "minimumFailbackWindowMs"
1643
1677
  >,
1644
1678
  ) {
1679
+ const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
1680
+ if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
1681
+ throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
1682
+ }
1645
1683
  const minimumFailbackWindowMs = config.minimumFailbackWindowMs;
1646
1684
  if (
1647
1685
  minimumFailbackWindowMs !== undefined &&
@@ -1671,7 +1709,7 @@ export class MulticastManager {
1671
1709
  config.fecInterleaveDepthMs &&
1672
1710
  config.fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
1673
1711
  ? computeFecDeliveryWindowMs({
1674
- interleaveDepthMs: config.fecInterleaveDepthMs,
1712
+ interleaveDepthMs,
1675
1713
  sourceSymbols: config.fecK,
1676
1714
  repairSymbols: config.fecRepairSymbols,
1677
1715
  symbolSize: config.fecSymbolSize,
@@ -1683,7 +1721,7 @@ export class MulticastManager {
1683
1721
  this.#fec.configure({
1684
1722
  k: config.fecK,
1685
1723
  symbolSize: config.fecSymbolSize,
1686
- interleaveDepthMs: config.fecInterleaveDepthMs,
1724
+ interleaveDepthMs,
1687
1725
  fps: config.fps,
1688
1726
  timeoutMs: deliveryWindowMs,
1689
1727
  });
@@ -1698,28 +1736,28 @@ export class MulticastManager {
1698
1736
  // narrow them below what this baseline already guarantees.
1699
1737
  this.#streamFecBaseline = {
1700
1738
  deliveryWindowMs,
1701
- interleaveDepthMs: config.fecInterleaveDepthMs,
1739
+ interleaveDepthMs,
1702
1740
  fps: config.fps,
1703
1741
  k: config.fecK,
1704
1742
  repairSymbols: config.fecRepairSymbols,
1705
1743
  minimumFailbackWindowMs,
1706
1744
  };
1707
1745
  this.#applyStreamGlobalFecTiming();
1708
- // Wire FecBlockMapper to MmtpRouter so SBN/ESI derivation works for FEC recovery.
1746
+ // Wire the stream-global FecBlockMapper to MmtpRouter. Under iso-ssbg1-v1
1747
+ // (the only profile) the mapper locates no source symbol: a source is
1748
+ // placed only once a repair states its block (SS_Start, SSB_length), and
1749
+ // FecBlockMapper.fromSsId refuses every FEC stream. The router reads the
1750
+ // mapper only for the stream's block profile and K_max when no FEC
1751
+ // manager answers for the packet.
1709
1752
  //
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.
1753
+ // gopDurationMs is the per-frame interval (1000/fps), never the
1754
+ // interleaveDepthMs: the mapper derives its interleave depth D from their
1755
+ // ratio, and passing interleaveDepthMs collapses D to 1 (BLO-3323 L14).
1718
1756
  const k = config.fecK;
1719
1757
  const interleaveMs = config.fecInterleaveDepthMs;
1720
1758
  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.
1759
+ // The stream-global mapper exists only for a stream whose catalog names a
1760
+ // block profile; parseFecBlockProfile refuses the retired k-padded-v1.
1723
1761
  const blockProfile = config.fecBlockProfile === undefined
1724
1762
  ? undefined
1725
1763
  : parseFecBlockProfile(config.fecBlockProfile, "[MulticastManager] configureFec fecBlockProfile");
@@ -1771,6 +1809,7 @@ export class MulticastManager {
1771
1809
 
1772
1810
  setMfuTimeoutMs(ms: number): void {
1773
1811
  this.#router.setMfuTimeoutMs(ms);
1812
+ this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
1774
1813
  }
1775
1814
 
1776
1815
  setTrackCodec(packetId: number, codec: string) {
@@ -1798,6 +1837,7 @@ export class MulticastManager {
1798
1837
  onTrackPacket(packetId: number, cb: TrackPacketCallback) {
1799
1838
  this.#router.onTrackPacket(packetId, cb);
1800
1839
  }
1840
+ /** @deprecated Use onTrackInit(packetId, cb); see MmtpRouter.onInitSegment. */
1801
1841
  onInitSegment(cb: (data: Uint8Array) => void) {
1802
1842
  this.#router.onInitSegment(cb);
1803
1843
  }
@@ -1821,7 +1861,7 @@ export class MulticastManager {
1821
1861
 
1822
1862
  enableMseAssembler(
1823
1863
  packetId: number,
1824
- config: Omit<BlockAssemblerConfig, "k">,
1864
+ config: BlockAssemblerConfig,
1825
1865
  catalogTrackName?: string,
1826
1866
  ) {
1827
1867
  return this.#router.enableMseAssembler(packetId, config, catalogTrackName);
@@ -1906,21 +1946,11 @@ export class MulticastManager {
1906
1946
  ),
1907
1947
  ),
1908
1948
  };
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;
1949
+ // The single relay inlet: the player/UI override, or the catalog's
1950
+ // `multicast.networkSource[{type:"amt"}]` relay, which
1951
+ // `endpointToMulticastConfig` (packages/transport
1952
+ // multicast-catalog-policy.ts) resolves into `amtRelay` via `findAmtRelay`.
1953
+ const amtRelay = config.amtRelay;
1924
1954
  const transportConfig = {
1925
1955
  sourceAddress: config.sourceAddress,
1926
1956
  groupAddress: config.groupAddress,
@@ -1933,9 +1963,8 @@ export class MulticastManager {
1933
1963
  // endpoint-config.ts) deliberately has no implicit relay port — it throws
1934
1964
  // and `MulticastTransport.join` resolves false — so the default is
1935
1965
  // 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.
1966
+ // readers do it. This is the last of the three readers: `resolveNetworkSource`
1967
+ // emits a port-less relay shape.
1939
1968
  // Keyed on the resolved relay, so a DRIAD entry — which pins no relay —
1940
1969
  // never has a port manufactured for it. Blank counts as no relay, the
1941
1970
  // same test `catalogAmtNetworkSource` applies (it trims, then skips) and
@@ -2210,7 +2239,10 @@ export class MulticastManager {
2210
2239
  }
2211
2240
  }
2212
2241
 
2213
- /** Release what the manager and FEC hold for a stream whose packet ID the router retired. */
2242
+ /**
2243
+ * Release what the manager and FEC hold for a stream whose packet ID the
2244
+ * router retired, or whose FEC a catalog reconfiguration no longer configures.
2245
+ */
2214
2246
  #releaseRetiredStream(stream: MmtpStreamIdentity): void {
2215
2247
  // Repair transports abort I/O for a stream on a reset notice
2216
2248
  // (wireRepairFetch); a retired stream's repair fetches end with it.
@@ -2232,10 +2264,10 @@ export class MulticastManager {
2232
2264
  for (const [key, stats] of [...this.#blockPolicyStats]) {
2233
2265
  if (stats.packetId === stream.packetId) this.#blockPolicyStats.delete(key);
2234
2266
  }
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);
2267
+ if (this.#trackFecTiming.delete(stream.packetId)) {
2268
+ this.#applyStreamGlobalFecTiming();
2269
+ }
2270
+ this.#multiTrackFecTracks.delete(stream.packetId);
2239
2271
  this.#fec.releasePacket(stream.packetId);
2240
2272
  }
2241
2273
 
@@ -2302,6 +2334,21 @@ export class MulticastManager {
2302
2334
  * D-17: Builds altGroup → track-name index for getSwitchingSet().
2303
2335
  * D-26: Registers packetId → TrackRole on MmtpRouter for block-complete fanout.
2304
2336
  *
2337
+ * FEC availability is per track (draft-ramadan-moq-fec §5.1). A media track
2338
+ * whose `fec` names no implemented `blockProfile` (only `iso-ssbg1-v1` is
2339
+ * implemented; the retired `k-padded-v1` is not), or an `iso-ssbg1-v1` span
2340
+ * it cannot use, is consumed without FEC: it gets no decoder, and none of
2341
+ * its repair tracks (layer 0 by `fec.repairTrack`, further layers and the
2342
+ * overlay by `depends`) is given an owner, so the router drops their packets
2343
+ * before any decoder. Those legs keep the `repair` role and their owner's
2344
+ * switching set. Neither the call nor any other track's FEC fails on that
2345
+ * account; `trackFecUnavailable(name)` reports the reason. FEC a previous
2346
+ * call configured on a packetId this call does not is released
2347
+ * (FECManager.releasePacket); frames its release gate held are delivered in
2348
+ * order, each gap stalled. FEC wired by hand (setFecDecoder) is left alone.
2349
+ * Geometry a decoder could not configure (K, P, T, `repairTrack`,
2350
+ * algorithm) still throws.
2351
+ *
2305
2352
  * @param catalog - Multi-track catalog (tracks array with name, altGroup, fec, packetId).
2306
2353
  * @param wasmDecoderSource - One WASM FEC decoder for a single FEC stream, or
2307
2354
  * a factory returning a distinct decoder per stream.
@@ -2325,6 +2372,44 @@ export class MulticastManager {
2325
2372
  // mis-roled or rejected on its name, and would land in its own altGroup
2326
2373
  // rather than its owner's.
2327
2374
  const repairNamesBySource = repairTrackNamesBySource(catalog.tracks);
2375
+ // §5.1: classify each media track's FEC before roles are resolved. A track
2376
+ // whose FEC is unavailable still names its layer 0 by `fec.repairTrack`;
2377
+ // that pointer is a catalog fact about the leg, not about the profile, so
2378
+ // the leg stays roled `repair` in its owner's group rather than falling
2379
+ // through to its name. It is never given an owner below.
2380
+ const declaredRepairNames = new Set<string>();
2381
+ for (const names of repairNamesBySource.values()) {
2382
+ for (const name of names) declaredRepairNames.add(name);
2383
+ }
2384
+ const fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
2385
+ for (let i = 0; i < catalog.tracks.length; i++) {
2386
+ const track = catalog.tracks[i]!;
2387
+ if (
2388
+ track.fec === undefined ||
2389
+ track.packaging === "fec-repair" ||
2390
+ declaredRepairNames.has(track.name)
2391
+ ) {
2392
+ continue;
2393
+ }
2394
+ const fecUnavailable = catalogFecUnavailable(track.fec, `$.tracks[${i}].fec`);
2395
+ if (fecUnavailable === undefined) continue;
2396
+ fecUnavailableByTrack.set(track.name, fecUnavailable);
2397
+ const layerZero = (track.fec as { repairTrack?: unknown }).repairTrack;
2398
+ if (typeof layerZero === "string" && layerZero.length > 0) {
2399
+ const names = repairNamesBySource.get(track.name) ?? new Set<string>();
2400
+ names.add(layerZero);
2401
+ repairNamesBySource.set(track.name, names);
2402
+ }
2403
+ }
2404
+ // Every repair leg of a source without FEC goes unowned, including one a
2405
+ // source with FEC also names: the router could not tell the two sources'
2406
+ // symbols apart on it, and the unavailable source's must reach no decoder.
2407
+ const unownedRepairNames = new Set<string>();
2408
+ for (const sourceName of fecUnavailableByTrack.keys()) {
2409
+ for (const repairName of repairNamesBySource.get(sourceName) ?? []) {
2410
+ unownedRepairNames.add(repairName);
2411
+ }
2412
+ }
2328
2413
  const repairOwnerGroup = new Map<string, string>();
2329
2414
  const repairOwnerAltGroup = new Map<string, number | undefined>();
2330
2415
  for (const track of catalog.tracks) {
@@ -2390,11 +2475,15 @@ export class MulticastManager {
2390
2475
  for (let i = 0; i < catalog.tracks.length; i++) {
2391
2476
  const track = catalog.tracks[i]!;
2392
2477
  if (resolvedRoles[i] === "repair" || track.fec === undefined) continue;
2393
- if (!isFecCatalogConfig(track.fec)) {
2478
+ // Malformed geometry fails the call whatever the profile says; an
2479
+ // unavailable profile or span only costs this track its FEC (§5.1).
2480
+ const unavailable = fecUnavailableByTrack.has(track.name);
2481
+ if (!(unavailable ? isFecCatalogGeometry(track.fec) : isFecCatalogConfig(track.fec))) {
2394
2482
  throw new Error(
2395
2483
  `[MulticastManager] invalid fec config for track '${track.name}'`,
2396
2484
  );
2397
2485
  }
2486
+ if (unavailable) continue;
2398
2487
  if (track.packetId !== undefined) fecTrackIndexes.push(i);
2399
2488
  }
2400
2489
 
@@ -2424,10 +2513,32 @@ export class MulticastManager {
2424
2513
  }
2425
2514
  }
2426
2515
 
2427
- // Reset switching-set index and repair packetId set.
2516
+ // Reset switching-set index, repair packetId set and FEC availability.
2428
2517
  this.#switchingSets.clear();
2429
2518
  this.#repairPacketIds.clear();
2430
2519
  this.#router.clearRepairPacketIdOwners();
2520
+ // FEC a previous call configured that this one does not (the source is
2521
+ // gone, lost its `fec`, or its FEC is now unavailable) must not stay
2522
+ // installed: its symbols would still be read as block coordinates and
2523
+ // held for repair legs that no longer have an owner. FEC a caller wired
2524
+ // by hand is not this call's to release.
2525
+ const fecPacketIds = new Set([...fecDecoders.keys()].map((i) => catalog.tracks[i]!.packetId));
2526
+ // The record survives a throw below: a packet this call configures again
2527
+ // is overwritten by its set(), and a released one is dropped by
2528
+ // #releaseRetiredStream.
2529
+ for (const [packetId, catalogTrackName] of this.#multiTrackFecTracks) {
2530
+ if (fecPacketIds.has(packetId)) continue;
2531
+ if (!this.#fec.isTrackConfigured(packetId)) {
2532
+ this.#multiTrackFecTracks.delete(packetId);
2533
+ continue;
2534
+ }
2535
+ this.#router.releaseFecPacket(packetId);
2536
+ this.#releaseRetiredStream({ packetId, catalogTrackName });
2537
+ }
2538
+ this.#fecUnavailableByTrack.clear();
2539
+ for (const [name, reason] of fecUnavailableByTrack) {
2540
+ this.#fecUnavailableByTrack.set(name, reason);
2541
+ }
2431
2542
  const catalogTracksByName = new Map(
2432
2543
  catalog.tracks.map((track) => [track.name, track] as const),
2433
2544
  );
@@ -2460,8 +2571,9 @@ export class MulticastManager {
2460
2571
  continue;
2461
2572
  }
2462
2573
 
2463
- // D-07: Apply per-track FEC config for non-repair tracks.
2464
- if (track.fec !== undefined) {
2574
+ // D-07: Apply per-track FEC config for non-repair tracks. A track whose
2575
+ // FEC is unavailable (§5.1) is consumed like a track without `fec`.
2576
+ if (track.fec !== undefined && !fecUnavailableByTrack.has(track.name)) {
2465
2577
  const fecCfg = track.fec as FecCatalogConfig;
2466
2578
  // Every repair layer and the keyframe overlay route to this source's
2467
2579
  // decoder, not only layer 0. A layer whose packetId had no registered
@@ -2469,6 +2581,7 @@ export class MulticastManager {
2469
2581
  // two sources whose RS_ID ranges overlap would be indistinguishable.
2470
2582
  if (track.packetId !== undefined) {
2471
2583
  for (const repairName of repairNamesBySource.get(track.name) ?? []) {
2584
+ if (unownedRepairNames.has(repairName)) continue;
2472
2585
  const repairTrack = catalogTracksByName.get(repairName);
2473
2586
  if (repairTrack?.packetId !== undefined) {
2474
2587
  this.#router.setRepairPacketIdOwner(repairTrack.packetId, track.packetId);
@@ -2493,17 +2606,18 @@ export class MulticastManager {
2493
2606
  blockProfile,
2494
2607
  k: fecCfg.sourceSymbols,
2495
2608
  symbolSize: fecCfg.symbolSize,
2496
- interleaveDepthMs: fecCfg.interleaveDepthMs,
2609
+ interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
2497
2610
  fps: track.framerate,
2498
2611
  trackKind: "video",
2499
2612
  },
2500
2613
  track.name,
2501
2614
  );
2615
+ this.#multiTrackFecTracks.set(track.packetId, track.name);
2502
2616
  this.#configureTrackMapper(track.packetId, {
2503
2617
  blockProfile,
2504
2618
  k: fecCfg.sourceSymbols,
2505
2619
  symbolSize: fecCfg.symbolSize,
2506
- interleaveDepthMs: fecCfg.interleaveDepthMs,
2620
+ interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
2507
2621
  fps: track.framerate,
2508
2622
  });
2509
2623
  this.#router.setPacketIdType(track.packetId, "video");
@@ -2512,6 +2626,27 @@ export class MulticastManager {
2512
2626
  }
2513
2627
  }
2514
2628
 
2629
+ /**
2630
+ * Why `configureMultiTrack` consumes the named catalog track without FEC
2631
+ * although its `fec` block declares one (draft-ramadan-moq-fec §5.1): no
2632
+ * implemented `blockProfile` (`track_fec_block_profile_unimplemented`, e.g.
2633
+ * the retired `k-padded-v1`; `track_fec_block_profile` when absent), or an
2634
+ * invalid `iso-ssbg1-v1` span (`track_fec`). Absent/zero spans keep in-band
2635
+ * decoding enabled. The same reason the hang
2636
+ * resolver reports (`catalogFecUnavailable`). Undefined for every other
2637
+ * track, and for every track before the first call; each call replaces the
2638
+ * previous call's answers.
2639
+ */
2640
+ trackFecUnavailable(trackName: string): TrackFecUnavailable | undefined {
2641
+ return this.#fecUnavailableByTrack.get(trackName);
2642
+ }
2643
+
2644
+ /** Per-track FEC availability from the last `configureMultiTrack` call. */
2645
+ readonly #fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
2646
+
2647
+ /** packetId → catalog track name of the FEC the last `configureMultiTrack` installed. */
2648
+ readonly #multiTrackFecTracks = new Map<number, string>();
2649
+
2515
2650
  /**
2516
2651
  * Return the track names belonging to the given altGroup switching set.
2517
2652
  * D-17: altGroup groups base+delta+repair into one switching set.
@@ -2570,12 +2705,22 @@ export class MulticastManager {
2570
2705
  /** Record a repair request the scheduler sent no FETCH for. */
2571
2706
  noteRepairSkipped(
2572
2707
  reason: RepairSkipReason,
2573
- measurement: { readonly rttMs: number | null; readonly budgetMs: number },
2708
+ measurement: { readonly rttMs: number | null; readonly budgetMs: number; readonly priority?: RepairPriority },
2574
2709
  sbn: number,
2575
2710
  packetId: number,
2576
2711
  catalogTrackName?: string,
2577
2712
  ): void {
2578
- this.#statsFor(packetId, catalogTrackName).repairsSkipped++;
2713
+ const stats = this.#statsFor(packetId, catalogTrackName);
2714
+ stats.repairsSkipped++;
2715
+ if (reason === "rtt-unmeasured") stats.repairsSkippedRttUnmeasured++;
2716
+ else if (reason === "rtt-exceeds-budget") stats.repairsSkippedRttExceedsBudget++;
2717
+ else stats.repairsSkippedPresentationDelayUnavailable++;
2718
+ stats.lastRepairSkip = {
2719
+ reason,
2720
+ rttMs: measurement.rttMs,
2721
+ budgetMs: measurement.budgetMs,
2722
+ priority: measurement.priority ?? null,
2723
+ };
2579
2724
  this.#emitRepairLifecycle({
2580
2725
  version: 2,
2581
2726
  type: "repair-skipped",
@@ -2586,6 +2731,37 @@ export class MulticastManager {
2586
2731
  });
2587
2732
  }
2588
2733
 
2734
+ /**
2735
+ * Arrival time of the earliest frame the in-order release gate holds for
2736
+ * the stream: the gate releases it as a discontinuity once
2737
+ * `terminalRetentionMsForPacket` has passed since then.
2738
+ */
2739
+ earliestGatedFrameAtMs(packetId: number, catalogTrackName?: string): number | undefined {
2740
+ return this.#router.fecReleaseEarliestHeldAtMs(packetId, catalogTrackName);
2741
+ }
2742
+
2743
+ /** Record a keyframe late-repair budget the scheduler granted a block. */
2744
+ noteKeyframeBudgetGranted(
2745
+ extensionMs: number,
2746
+ _sbn: number,
2747
+ packetId: number,
2748
+ catalogTrackName?: string,
2749
+ ): void {
2750
+ const stats = this.#statsFor(packetId, catalogTrackName);
2751
+ stats.keyframeBudgetHolds++;
2752
+ stats.keyframeBudgetHoldMs += extensionMs;
2753
+ }
2754
+
2755
+ /** Record a repair FETCH the scheduler admitted and sent. */
2756
+ noteRepairFetchSent(
2757
+ priority: RepairPriority,
2758
+ _sbn: number,
2759
+ packetId: number,
2760
+ catalogTrackName?: string,
2761
+ ): void {
2762
+ if (priority === 0) this.#statsFor(packetId, catalogTrackName).keyframeRepairFetchesSent++;
2763
+ }
2764
+
2589
2765
  /**
2590
2766
  * Record a repair-scheduler decision about a delta block: preempted for
2591
2767
  * keyframe/audio work, or never dispatched before its block resolved.
@@ -2620,7 +2796,10 @@ export class MulticastManager {
2620
2796
  const out: Record<string, BlockPolicyStats> = {};
2621
2797
  for (const [key, stats] of this.#blockPolicyStats) {
2622
2798
  if (stats.epoch !== this.#fec.epochFor(stats.packetId)) continue;
2623
- out[key] = { ...stats };
2799
+ out[key] = {
2800
+ ...stats,
2801
+ lastRepairSkip: stats.lastRepairSkip === null ? null : { ...stats.lastRepairSkip },
2802
+ };
2624
2803
  }
2625
2804
  return out;
2626
2805
  }