@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
@@ -529,22 +529,19 @@ export interface FECManagerLike {
529
529
  * Returns recovered block bytes if recovery completes, else null.
530
530
  *
531
531
  * `symbolData` is the complete MMTP packet without its Source FEC Payload
532
- * ID, unpadded and possibly a view into the received packet. The manager
533
- * zero-pads it to the packet's own symbol size T.
534
- *
535
- * Optional `alta` carries the detached ALTA authenticator extracted from
536
- * the MMTP header-extension trailer (08-07 Path 2) — present on signed
537
- * source packets, absent on relay-reassembled / unsigned streams. When
538
- * provided, the fec-worker runs verify_detached instead of counting the
539
- * symbol as `altaPending`. */
532
+ * ID, unpadded and possibly a view into the received packet. The decoder
533
+ * builds the ssbg_mode1 symbol (`u16 len || packet || 00h`, zero-filled to
534
+ * the packet's own symbol size T) from it; nothing pads it on the way. */
540
535
  feedSourceSymbol(
541
536
  packetId: number,
542
537
  ssId: number,
543
538
  symbolData: Uint8Array,
544
- alta?: { auth: Uint8Array; payloadEnd: number },
545
539
  catalogTrackName?: string,
546
540
  ): Uint8Array | null;
547
541
 
542
+ /** A block's RSB_length, from one of its repair symbols (optional). */
543
+ noteRepairGroupLength?(sbn: number, packetId: number, rsbLength: number, catalogTrackName?: string): void;
544
+
548
545
  /** Feed a repair symbol to the FEC decoder for a given track.
549
546
  * Returns recovered block bytes if recovery completes, else null. */
550
547
  feedRepairSymbol(
@@ -599,17 +596,14 @@ export interface FECManagerLike {
599
596
  catalogTrackName?: string,
600
597
  ): "pending" | "complete" | "failed" | "untracked";
601
598
 
602
- /** Highest SBN seen for a stream in the current epoch. */
603
- highestSbn?(packetId: number, catalogTrackName?: string): number | undefined;
604
-
605
599
  /** Catalog/reset epoch of a packet's streams. */
606
600
  epochFor?(packetId: number): number;
607
601
 
608
602
  /**
609
603
  * Catalog `fec.interleaveDepthMs` (§5.1 full block span) of a packetId; 0
610
- * when the stream has none.
604
+ * when the stream has none, undefined when the packetId is unconfigured.
611
605
  */
612
- interleaveDepthMsForPacket?(packetId: number): number;
606
+ interleaveDepthMsForPacket?(packetId: number): number | undefined;
613
607
 
614
608
  /**
615
609
  * How long a terminal block stays authoritative before it retires to
@@ -617,7 +611,7 @@ export interface FECManagerLike {
617
611
  * scan never reads a retired, delivered block as lost. Required whenever
618
612
  * blockResolution is.
619
613
  */
620
- terminalRetentionMsForPacket?(packetId: number): number;
614
+ terminalRetentionMsForPacket?(packetId: number): number | undefined;
621
615
 
622
616
  /** Configured codec of a packetId. */
623
617
  codecFor?(packetId: number): string | undefined;
@@ -691,20 +685,17 @@ export interface FECManagerLike {
691
685
  toSsId: number,
692
686
  ): readonly number[] | null;
693
687
 
694
- /** FEC source symbol count K per block. */
695
- readonly k: number;
696
- kForPacket?(packetId: number): number;
697
688
 
698
689
  /**
699
690
  * The longest a block stays open after its last symbol (inactivity fail
700
691
  * bound plus D-28 repair grace). With interleaveDepthMsForPacket it bounds
701
692
  * how long the router keeps a stream's duplicate ledgers.
702
693
  */
703
- blockLifetimeMsForPacket?(packetId: number): number;
694
+ blockLifetimeMsForPacket?(packetId: number): number | undefined;
704
695
 
705
696
  /** FEC symbol size T in bytes (0 = unknown / no FEC). */
706
697
  readonly symbolSize: number;
707
- symbolSizeForPacket?(packetId: number): number;
698
+ symbolSizeForPacket?(packetId: number): number | undefined;
708
699
 
709
700
  /** Update framerate — used to refine FEC block timeout. */
710
701
  setFramerate(fps: number): void;
@@ -961,6 +952,8 @@ export class MmtpRouter {
961
952
  // ── Keyframe loss detection state ───────────────────────────────
962
953
  /** Catalog-derived keyframe loss timeout (ms), or a reader evaluated at each arm. null = not configured (warns on video track registration; Phase-13 keyframe repair stays off). */
963
954
  #keyframeLostTimeoutMs: number | (() => number) | null;
955
+ /** packetIds already warned for running without Phase 13 (non-FEC video only). */
956
+ readonly #warnedNoKeyframeLostTimeout = new Set<number>();
964
957
  /** Why the last reader evaluation left the timer unarmed; null while arming. Dedups the warning. */
965
958
  #keyframeLostUnarmedReason: string | null = null;
966
959
  /** Active keyframe loss timer handle. Single timer per video track — cleared on each rapFlag and on dispose(). */
@@ -977,6 +970,8 @@ export class MmtpRouter {
977
970
  */
978
971
  #onPublisherRestart: ((packetId: number, catalogTrackName: string) => void) | null;
979
972
  #publisherRestarts = 0;
973
+ /** Inits delivered with no onTrackInit handler for their packetId (MOQT-01). */
974
+ #unmappedInitDeliveries = 0;
980
975
  // FEC Payload IDs left unread because their (owner) packetId had no
981
976
  // configured fec.blockProfile (see #noteUnreadableFecPayloadId).
982
977
  #fecPayloadIdsWithoutProfile = 0;
@@ -1324,17 +1319,28 @@ export class MmtpRouter {
1324
1319
  return NO_FEC_GEOMETRY_HORIZON;
1325
1320
  }
1326
1321
  const blockSpanMs = fec.interleaveDepthMsForPacket(packetId);
1322
+ const blockLifetimeMs = fec.blockLifetimeMsForPacket(packetId);
1323
+ // An unconfigured packetId has no FEC geometry (BLO-45953).
1324
+ if (blockSpanMs === undefined || blockLifetimeMs === undefined) return NO_FEC_GEOMETRY_HORIZON;
1327
1325
  // FECManager reports 0 for a stream the catalog gave no block span.
1328
1326
  if (blockSpanMs === 0) return NO_BLOCK_SPAN_HORIZON;
1329
1327
  return {
1330
1328
  kind: "fec-horizon",
1331
- retentionMs: duplicateRetentionMs({
1332
- blockSpanMs,
1333
- blockLifetimeMs: fec.blockLifetimeMsForPacket(packetId),
1334
- }),
1329
+ retentionMs: duplicateRetentionMs({ blockSpanMs, blockLifetimeMs }),
1335
1330
  };
1336
1331
  }
1337
1332
 
1333
+ /**
1334
+ * Init segments delivered for a packetId with no `onTrackInit` handler
1335
+ * since construction, whether the deprecated aggregate `onInitSegment`
1336
+ * callback then received them or nothing did. A supported deployment reads
1337
+ * 0 here; a non-zero value is the evidence that blocks removing the
1338
+ * aggregate callback (MOQT-01, BLO-21181).
1339
+ */
1340
+ get unmappedInitDeliveryCount(): number {
1341
+ return this.#unmappedInitDeliveries;
1342
+ }
1343
+
1338
1344
  /** Publisher restarts detected on the multicast leg since construction. */
1339
1345
  get publisherRestartCount(): number {
1340
1346
  return this.#publisherRestarts;
@@ -1440,8 +1446,8 @@ export class MmtpRouter {
1440
1446
 
1441
1447
  /** Update MFU reassembly timeout. Source and FEC-recovery paths share the
1442
1448
  * parser's single reassembler (BLO-8151), so one update covers both. */
1443
- setMfuTimeoutMs(ms: number): void {
1444
- if (ms <= 0) throw new Error("[MmtpRouter] mfuTimeoutMs must be > 0");
1449
+ setMfuTimeoutMs(ms: number | null): void {
1450
+ if (ms !== null && ms <= 0) throw new Error("[MmtpRouter] mfuTimeoutMs must be > 0");
1445
1451
  this.#parser.setMfuTimeoutMs(ms);
1446
1452
  }
1447
1453
 
@@ -1454,18 +1460,14 @@ export class MmtpRouter {
1454
1460
 
1455
1461
  /** Register MMTP packetId → track type mapping.
1456
1462
  * Call BEFORE packets arrive to ensure correct routing from the first packet.
1457
- * If keyframeLostTimeoutMs is not provided, Phase 13 keyframe repair is
1458
- * disabled (video still routes/decodes normally). framerate is OPTIONAL per
1459
- * draft-ietf-moq-catalogformat-01 §3.2.23, so we can't require the timeout. */
1463
+ * Without keyframeLostTimeoutMs a track WITHOUT FEC has no Phase 13
1464
+ * keyframe repair (video still routes/decodes normally); that is warned at
1465
+ * its first keyframe, once the FEC configuration is known (see
1466
+ * #noteEmittedKeyframe). Nothing is warned here: an FEC track never uses
1467
+ * the timer, and at registration the FEC configuration may not be applied
1468
+ * yet. framerate is OPTIONAL per draft-ietf-moq-catalogformat-01 §3.2.23,
1469
+ * so we can't require the timeout. */
1460
1470
  setPacketIdType(packetId: number, trackType: "video" | "audio"): void {
1461
- if (trackType === "video" && this.#keyframeLostTimeoutMs === null) {
1462
- console.warn(
1463
- "[MmtpRouter] keyframeLostTimeoutMs not configured — Phase 13 keyframe " +
1464
- "repair disabled for this track. Set it via setKeyframeLostTimeoutMs() " +
1465
- "or provide in constructor config to enable: " +
1466
- "Math.ceil(groupDurationMs * KEYFRAME_LOST_TIMEOUT_SLACK).",
1467
- );
1468
- }
1469
1471
  if (trackType === "video") this.#videoPacketIds.add(packetId);
1470
1472
  else this.#audioPacketIds.add(packetId);
1471
1473
  // Sync track info to parser for codec-aware keyframe detection.
@@ -1533,7 +1535,15 @@ export class MmtpRouter {
1533
1535
  this.#trackPacketCallbacks.set(packetId, cb);
1534
1536
  }
1535
1537
 
1536
- /** Register an init segment callback (ftyp+moov from MMTP MPU metadata). */
1538
+ /**
1539
+ * Register an init segment callback (ftyp+moov from MMTP MPU metadata).
1540
+ * Receives an init only for a packetId with no `onTrackInit` handler.
1541
+ *
1542
+ * @deprecated Use onTrackInit(packetId, cb). Still delivered as a fallback;
1543
+ * removed in the 1.0.0 major, no earlier than one minor release after this
1544
+ * deprecation reaches the `latest` dist-tag (BLO-21181). Count fallback
1545
+ * deliveries with `unmappedInitDeliveryCount`.
1546
+ */
1537
1547
  onInitSegment(cb: (data: Uint8Array) => void): void {
1538
1548
  this.#onInitSegment = cb;
1539
1549
  }
@@ -1551,20 +1561,19 @@ export class MmtpRouter {
1551
1561
  * multi-sample CMAF segments instead of per-frame callbacks. */
1552
1562
  enableMseAssembler(
1553
1563
  packetId: number,
1554
- config: Omit<BlockAssemblerConfig, "k">,
1564
+ config: BlockAssemblerConfig,
1555
1565
  catalogTrackName?: string,
1556
1566
  ): CmafBlockAssembler {
1557
- const k = this.#kForPacket(packetId);
1558
1567
  const assemblerKey = this.#mseAssemblerKey(packetId, catalogTrackName);
1559
1568
  const previous = this.#mseAssemblers.get(assemblerKey);
1560
1569
  if (previous) {
1561
1570
  previous.flush();
1562
1571
  previous.dispose();
1563
1572
  }
1564
- const assembler = new CmafBlockAssembler({ ...config, k });
1573
+ const assembler = new CmafBlockAssembler(config);
1565
1574
  this.#mseAssemblers.set(assemblerKey, assembler);
1566
1575
  console.log(
1567
- `[MmtpRouter] MSE assembler enabled for packetId=${packetId}${catalogTrackName === undefined ? "" : ` track=${catalogTrackName}`} (K=${k}, ${config.trackType})`,
1576
+ `[MmtpRouter] MSE assembler enabled for packetId=${packetId}${catalogTrackName === undefined ? "" : ` track=${catalogTrackName}`} (${config.trackType})`,
1568
1577
  );
1569
1578
  return assembler;
1570
1579
  }
@@ -1702,6 +1711,24 @@ export class MmtpRouter {
1702
1711
  this.#fecMappersByPacketId.set(packetId, mapper);
1703
1712
  }
1704
1713
 
1714
+ /**
1715
+ * Release the router side of a packetId whose FEC is ending: drop its block
1716
+ * mapper and end its FEC release gating. Frames the gate holds are released
1717
+ * in order, each gap stalled (no block will resolve it), not stranded. Call
1718
+ * before FECManager.releasePacket, while the gate can still read its blocks.
1719
+ */
1720
+ releaseFecPacket(packetId: number): void {
1721
+ this.#fecMappersByPacketId.delete(packetId);
1722
+ // Released frames reach FECManager (noteReleasedRap): defer the pokes it
1723
+ // requests, as for every other drain, and drop this packet's.
1724
+ this.#withDeferredFecPokes(() => {
1725
+ this.#parser.endFecRelease(packetId);
1726
+ for (const [key, poke] of this.#pendingFecPokes) {
1727
+ if (poke.packetId === packetId) this.#pendingFecPokes.delete(key);
1728
+ }
1729
+ });
1730
+ }
1731
+
1705
1732
  registerManifestTrack(context: ManifestTrackContext): void {
1706
1733
  if (!this.#manifestVerifier) throw new Error("manifest verifier is not configured");
1707
1734
  this.#manifestVerifier.registerTrack(context);
@@ -1856,121 +1883,26 @@ export class MmtpRouter {
1856
1883
  this.#noteUnreadableFecPayloadId(ownerPacketId, "repair");
1857
1884
  return;
1858
1885
  }
1859
- if (this.#isIsoPacket(ownerPacketId)) {
1860
- this.#handleIsoRepair(ownerPacketId, catalogTrackName, parsed, "moq");
1861
- return;
1862
- }
1863
- const repairSbn = this.#deriveRepairSbn(parsed.ssStart, parsed.ssbLength, ownerPacketId);
1864
- if (repairSbn === null) return;
1865
- const repairEsi = this.#kForPacket(ownerPacketId) + parsed.rsId;
1866
-
1867
- if (
1868
- !this.#feedFecTransportSymbol(
1869
- ownerPacketId,
1870
- repairSbn,
1871
- repairEsi,
1872
- parsed.symbolData,
1873
- "moq",
1874
- catalogTrackName,
1875
- )
1876
- ) return;
1877
-
1878
- // NOTE: Do NOT call trackBlock for repair packets (same as multicast repair path).
1879
- const recovered = catalogTrackName === undefined
1880
- ? this.#fecManager.feedRepairSymbol(
1881
- ownerPacketId,
1882
- parsed.ssStart,
1883
- parsed.ssbLength,
1884
- parsed.rsId,
1885
- parsed.symbolData,
1886
- )
1887
- : this.#fecManager.feedRepairSymbol(
1888
- ownerPacketId,
1889
- parsed.ssStart,
1890
- parsed.ssbLength,
1891
- parsed.rsId,
1892
- parsed.symbolData,
1893
- catalogTrackName,
1894
- );
1895
- if (recovered) {
1896
- const alreadyCompleted = catalogTrackName === undefined
1897
- ? this.#fecManager.isBlockCompleted(repairSbn, ownerPacketId)
1898
- : this.#fecManager.isBlockCompleted(repairSbn, ownerPacketId, catalogTrackName);
1899
- if (catalogTrackName === undefined) {
1900
- this.#fecManager.cancelBlockTimeout(repairSbn, ownerPacketId);
1901
- } else {
1902
- this.#fecManager.cancelBlockTimeout(repairSbn, ownerPacketId, catalogTrackName);
1903
- }
1904
- if (!alreadyCompleted) {
1905
- this.#fecManager.countRecovery(ownerPacketId, repairSbn, catalogTrackName);
1906
- if (catalogTrackName === undefined) {
1907
- this.#fecManager.markBlockCompleted(repairSbn, ownerPacketId);
1908
- } else {
1909
- this.#fecManager.markBlockCompleted(repairSbn, ownerPacketId, catalogTrackName);
1910
- }
1911
- this.#routeRecoveredBlock(
1912
- repairSbn,
1913
- recovered,
1914
- ownerPacketId,
1915
- catalogTrackName,
1916
- );
1917
- }
1918
- }
1886
+ this.#handleIsoRepair(ownerPacketId, catalogTrackName, parsed, "moq");
1919
1887
  }
1920
1888
  }
1921
1889
 
1922
- // ── SBN/ESI derivation ──────────────────────────────────────────
1923
-
1924
- #kForPacket(packetId?: number): number {
1925
- // Same packet-scoped rule as #deriveSbnEsi: once the packet ID is known,
1926
- // only its explicitly registered mapper may stand in for the FEC
1927
- // manager's per-packet K — never the default single-track mapper.
1928
- if (packetId != null)
1929
- return (
1930
- this.#fecManager?.kForPacket?.(packetId) ??
1931
- this.#fecMappersByPacketId.get(packetId)?.k ??
1932
- this.#fecManager?.k ??
1933
- 4
1934
- );
1935
- return this.#defaultFecMapper?.k ?? this.#fecManager?.k ?? 4;
1936
- }
1890
+ // ── Packet FEC geometry and block profile ───────────────────────
1937
1891
 
1938
1892
  #symbolSizeForPacket(packetId?: number): number {
1939
- if (packetId != null) return this.#fecManager?.symbolSizeForPacket?.(packetId) ?? this.#fecManager?.symbolSize ?? 0;
1893
+ // A packetId's own T only: an unconfigured one never borrows the
1894
+ // stream-global T (BLO-45953).
1895
+ if (packetId != null) return this.#fecManager?.symbolSizeForPacket?.(packetId) ?? 0;
1940
1896
  return this.#fecManager?.symbolSize ?? 0;
1941
1897
  }
1942
1898
 
1943
- /** Derive SBN/ESI from SS_ID using packet-scoped FEC geometry. */
1944
- #deriveSbnEsi(ssId: number, packetId?: number): { sbn: number; esi: number } {
1945
- // A default mapper describes legacy single-track geometry. Once a packet
1946
- // ID is known, only its explicitly registered mapper may override the
1947
- // FECManager's packet-scoped K. Falling back to the default video mapper
1948
- // here maps audio source symbols with video K while repair SBNs correctly
1949
- // use the audio SSB_length, splitting one block across two coordinates.
1950
- const mapper = packetId == null
1951
- ? this.#defaultFecMapper
1952
- : this.#fecMappersByPacketId.get(packetId) ?? null;
1953
- if (mapper) return mapper.fromSsId(ssId);
1954
- const k = this.#kForPacket(packetId);
1955
- return { sbn: Math.floor(ssId / k), esi: ssId % k };
1956
- }
1957
-
1958
- #deriveRepairSbn(
1959
- ssStart: number,
1960
- ssbLength: number,
1961
- packetId?: number,
1962
- ): number | null {
1963
- const k = this.#kForPacket(packetId);
1964
- if (ssbLength <= 0 || ssbLength > k || ssStart % k !== 0) return null;
1965
- return Math.floor(ssStart / k);
1966
- }
1967
-
1968
1899
  /**
1969
1900
  * The configured block profile of a packetId, or undefined while it is
1970
1901
  * unconfigured. With an FEC manager its per-packet configuration is the
1971
1902
  * only source. A router without one still recovers symbols through its
1972
1903
  * registered mapper, built with the catalog's explicit profile: the
1973
- * packet's own mapper, else the default one (the #deriveSbnEsi rule).
1904
+ * packet's own mapper, else the default one. A NullBlockMapper (a stream
1905
+ * without an FEC instance) states none.
1974
1906
  */
1975
1907
  #configuredBlockProfile(packetId: number): FecBlockProfile | undefined {
1976
1908
  if (this.#fecManager) return this.#fecManager.blockProfileForPacket(packetId);
@@ -1979,9 +1911,10 @@ export class MmtpRouter {
1979
1911
  }
1980
1912
 
1981
1913
  /**
1982
- * The block profile an FEC coordinate of `packetId` is read under. Throws
1983
- * while none is configured: the two profiles carry identical wire tuples
1984
- * with different block math, so there is no default to fall back to.
1914
+ * The block profile an FEC coordinate of `packetId` is read under:
1915
+ * `iso-ssbg1-v1`, the only one (`k-padded-v1` is retired and refused).
1916
+ * Throws while none is configured: such a packet has no FEC geometry, and
1917
+ * nothing is inferred from the wire or defaulted.
1985
1918
  * Packet ingress leaves such a packet's FEC Payload ID unread first
1986
1919
  * (#noteUnreadableFecPayloadId); a throw here is a wiring fault on a path
1987
1920
  * that cannot hold an unconfigured packet.
@@ -1997,8 +1930,20 @@ export class MmtpRouter {
1997
1930
  return profile;
1998
1931
  }
1999
1932
 
2000
- #isIsoPacket(packetId: number): boolean {
2001
- return this.#blockProfileFor(packetId) === "iso-ssbg1-v1";
1933
+ /**
1934
+ * The block coordinates (SS_Start, ESI) of an FEC source: range membership
1935
+ * in a block a repair already stated (ISO/IEC 23008-1 C.5.3). Null while no
1936
+ * repair has stated its block, while its packetId has no configured block
1937
+ * profile, and without an FEC manager: SS_ID alone locates no block, so
1938
+ * nothing is derived from it.
1939
+ */
1940
+ #locateFecSource(
1941
+ packetId: number,
1942
+ catalogTrackName: string | undefined,
1943
+ ssId: number,
1944
+ ): { sbn: number; esi: number } | null {
1945
+ if (this.#configuredBlockProfile(packetId) === undefined) return null;
1946
+ return this.#fecManager?.locateIsoSource?.(packetId, catalogTrackName, ssId) ?? null;
2002
1947
  }
2003
1948
 
2004
1949
  /**
@@ -2023,14 +1968,12 @@ export class MmtpRouter {
2023
1968
  }
2024
1969
 
2025
1970
  /**
2026
- * The release-gate anchor of a recovered symbol: its block (SBN) under
2027
- * k-padded-v1, its own SS_ID under iso-ssbg1-v1, where a frame is gated by
2028
- * the SS_IDs between it and the last released frame.
1971
+ * The release-gate anchor of a recovered symbol: its own SS_ID, SS_Start +
1972
+ * ESI modulo 2^32 (C.5.2), where a frame is gated by the SS_IDs between it
1973
+ * and the last released frame.
2029
1974
  */
2030
- #fecAnchorForRecovered(ownerPacketId: number | undefined, blockId: number, index: number): number {
2031
- return ownerPacketId !== undefined && this.#isIsoPacket(ownerPacketId)
2032
- ? serial32Add(blockId, index)
2033
- : blockId;
1975
+ #fecAnchorForRecovered(blockStart: number, index: number): number {
1976
+ return serial32Add(blockStart, index);
2034
1977
  }
2035
1978
 
2036
1979
  /**
@@ -2038,14 +1981,13 @@ export class MmtpRouter {
2038
1981
  * block `[SS_Start, SS_Start + SSB_length)`; repair ESI = SSB_length +
2039
1982
  * RS_ID (K' = SSB_length). The held sources it placed (and those of a
2040
1983
  * repair-less span in front of it) are fed as first-arrival sources, then
2041
- * the repair, the order they had on the wire, so a loss-free block is clean
2042
- * on its repair exactly as under k-padded-v1. A repair contradicting a known
2043
- * block is dropped.
1984
+ * the repair, the order they had on the wire, so a loss-free block completes
1985
+ * clean on its repair. A repair contradicting a known block is dropped.
2044
1986
  */
2045
1987
  #handleIsoRepair(
2046
1988
  ownerPacketId: number,
2047
1989
  catalogTrackName: string | undefined,
2048
- repair: { ssStart: number; ssbLength: number; rsId: number; symbolData: Uint8Array },
1990
+ repair: { ssStart: number; ssbLength: number; rsbLength: number; rsId: number; symbolData: Uint8Array },
2049
1991
  source: "multicast" | "moq",
2050
1992
  ): void {
2051
1993
  const fec = this.#fecManager;
@@ -2071,6 +2013,7 @@ export class MmtpRouter {
2071
2013
  catalogTrackName,
2072
2014
  )) return;
2073
2015
  fec.noteBlockActivity?.(blockStart, ownerPacketId, catalogTrackName);
2016
+ fec.noteRepairGroupLength?.(blockStart, ownerPacketId, repair.rsbLength, catalogTrackName);
2074
2017
  const alreadyCompleted = fec.isBlockCompleted(blockStart, ownerPacketId, catalogTrackName);
2075
2018
  const recovered = fec.feedRepairSymbol(
2076
2019
  ownerPacketId,
@@ -2118,7 +2061,7 @@ export class MmtpRouter {
2118
2061
  }
2119
2062
  if (payload.oversized) continue;
2120
2063
  const alreadyCompleted = fec.isBlockCompleted(blockStart, ownerPacketId, catalogTrackName);
2121
- const recovered = fec.feedSourceSymbol(ownerPacketId, ssId, payload.symbolData, undefined, catalogTrackName);
2064
+ const recovered = fec.feedSourceSymbol(ownerPacketId, ssId, payload.symbolData, catalogTrackName);
2122
2065
  if (!recovered || alreadyCompleted) continue;
2123
2066
  fec.cancelBlockTimeout(blockStart, ownerPacketId, catalogTrackName);
2124
2067
  fec.countRecovery(ownerPacketId, blockStart, catalogTrackName);
@@ -2154,14 +2097,17 @@ export class MmtpRouter {
2154
2097
  }
2155
2098
 
2156
2099
  /** Route a recovered FEC block through the parser + dedup pipeline.
2157
- * Sync WASM decoders return K fixed-width source symbols concatenated. */
2100
+ * Sync WASM decoders return the block's K' = SSB_length fixed-width
2101
+ * ssbg_mode1 source symbols concatenated. */
2158
2102
  routeRecoveredBlock(
2159
2103
  blockId: number,
2160
2104
  data: Uint8Array,
2161
2105
  packetId: number,
2162
2106
  catalogTrackName?: string,
2163
2107
  ): void {
2164
- this.#routeRecoveredBlock(blockId, data, packetId, catalogTrackName);
2108
+ // A Worker-recovered block arrives here whole: defer the gate's drains
2109
+ // until all its frames are in, as the in-band recovery path does.
2110
+ this.#withDeferredFecPokes(() => this.#routeRecoveredBlock(blockId, data, packetId, catalogTrackName));
2165
2111
  }
2166
2112
 
2167
2113
  /** Route a single recovered source symbol through the parser + dedup pipeline.
@@ -2637,10 +2583,21 @@ export class MmtpRouter {
2637
2583
  #noteEmittedKeyframe(packetId: number, keyframe: boolean): void {
2638
2584
  if (!keyframe) return;
2639
2585
  if (!this.#videoPacketIds.has(packetId)) return;
2640
- if (this.#keyframeLostTimeoutMs === null) return;
2641
- // FEC tracks resolve lost keyframes through block deadlines and the
2642
- // release gate's stall decision, never through this timer.
2586
+ // FEC tracks resolve lost keyframes through block deadlines, the D-28
2587
+ // repair FETCH and the release gate's stall decision, never through this
2588
+ // timer, so an unconfigured timer is no loss there and is not warned.
2643
2589
  if (this.#isFecTrack(packetId)) return;
2590
+ if (this.#keyframeLostTimeoutMs === null) {
2591
+ if (!this.#warnedNoKeyframeLostTimeout.has(packetId)) {
2592
+ this.#warnedNoKeyframeLostTimeout.add(packetId);
2593
+ console.warn(
2594
+ `[MmtpRouter] keyframeLostTimeoutMs not configured — Phase 13 keyframe ` +
2595
+ `repair disabled for packetId=${packetId}, a video track without FEC. ` +
2596
+ "Set it via setKeyframeLostTimeoutMs() or provide in constructor config to enable.",
2597
+ );
2598
+ }
2599
+ return;
2600
+ }
2644
2601
  this.#lastKeyframeGroupId++;
2645
2602
  this.#armKeyframeLostTimer();
2646
2603
  }
@@ -2655,7 +2612,10 @@ export class MmtpRouter {
2655
2612
  #withDeferredFecPokes(work: () => void): void {
2656
2613
  this.#fecPokeDepth++;
2657
2614
  try {
2658
- work();
2615
+ // The gate's own drains wait for the packet too: a recovered block's
2616
+ // frames are pushed one at a time, and a drain on the first would
2617
+ // release past the others before they arrive.
2618
+ this.#parser.deferFecRelease(work);
2659
2619
  } finally {
2660
2620
  this.#fecPokeDepth--;
2661
2621
  if (this.#fecPokeDepth === 0 && this.#pendingFecPokes.size > 0 && !this.#disposed) {
@@ -2668,6 +2628,14 @@ export class MmtpRouter {
2668
2628
  }
2669
2629
  }
2670
2630
 
2631
+ /**
2632
+ * Arrival time of the earliest frame the FEC release gate holds for this
2633
+ * stream (see FecReleaseSequencer.earliestHeldArrivalMs), or undefined.
2634
+ */
2635
+ fecReleaseEarliestHeldAtMs(packetId: number, catalogTrackName?: string): number | undefined {
2636
+ return this.#parser.fecReleaseEarliestHeldAtMs(packetId, catalogTrackName);
2637
+ }
2638
+
2671
2639
  #requestFecPoke(packetId: number, catalogTrackName: string | undefined): void {
2672
2640
  if (this.#disposed) return;
2673
2641
  if (this.#fecPokeDepth > 0) {
@@ -2697,37 +2665,22 @@ export class MmtpRouter {
2697
2665
  resolvedLoss: (packetId, catalogTrackName, fromSbn, toSbn, releasedSbn) => {
2698
2666
  const fec = this.#fecManager;
2699
2667
  if (!fec?.blockResolution) return [];
2700
- if (this.#isIsoPacket(packetId)) {
2701
- // iso-ssbg1-v1 frames are anchored by their packet's SS_ID: wait
2702
- // until every block that could hold the SS_IDs between the last
2703
- // released frame and this one is stated and resolved.
2704
- const head = fromSbn === releasedSbn ? toSbn : fromSbn;
2705
- return fec.isoSpanResolution?.(packetId, catalogTrackName, releasedSbn, head) ?? null;
2706
- }
2707
- const highest = fec.highestSbn?.(packetId, catalogTrackName);
2708
- const lost: number[] = [];
2709
- for (let sbn = fromSbn; sbn <= toSbn; sbn++) {
2710
- const resolution = fec.blockResolution(sbn, packetId, catalogTrackName);
2711
- if (resolution === "pending") return null;
2712
- if (resolution === "failed") {
2713
- lost.push(sbn);
2714
- } else if (resolution === "untracked") {
2715
- // releasedSbn is the block of the frame the gate last released, so
2716
- // its media arrived: untracked there means it resolved and retired,
2717
- // not that it vanished. Counting it would conceal a delivered block.
2718
- if (sbn === releasedSbn) continue;
2719
- // Not seen yet: a block at or past the stream's frontier may
2720
- // still start. Behind the frontier it vanished without trace.
2721
- if (highest === undefined || sbn > highest) return null;
2722
- lost.push(sbn);
2723
- }
2724
- }
2725
- return lost;
2668
+ // A frame is anchored by its packet's SS_ID (iso-ssbg1-v1, C.5.2): wait
2669
+ // until every block that could hold the SS_IDs between the last
2670
+ // released frame and this one is stated and resolved.
2671
+ const head = fromSbn === releasedSbn ? toSbn : fromSbn;
2672
+ return fec.isoSpanResolution?.(packetId, catalogTrackName, releasedSbn, head) ?? null;
2726
2673
  },
2727
2674
  // The retention window itself: a frame is never still held when a block
2728
2675
  // it waits on retires. Only consulted while resolvedLoss holds a gap,
2729
2676
  // which needs blockResolution, so the check above guarantees the method.
2730
- holdLimitMs: (packetId) => this.#fecManager?.terminalRetentionMsForPacket?.(packetId) ?? Infinity,
2677
+ // A packetId the manager no longer has configured (released) has no
2678
+ // block left to wait on: release its frames now (BLO-45953).
2679
+ holdLimitMs: (packetId) => {
2680
+ const fec = this.#fecManager;
2681
+ if (!fec?.terminalRetentionMsForPacket) return Infinity;
2682
+ return fec.terminalRetentionMsForPacket(packetId) ?? 0;
2683
+ },
2731
2684
  decide: (before, after, lostBlocks, discontinuity) => {
2732
2685
  const decision = this.#decideGap(before, after, lostBlocks, discontinuity);
2733
2686
  this.#onFrameGap?.(decision);
@@ -2813,9 +2766,10 @@ export class MmtpRouter {
2813
2766
 
2814
2767
  /**
2815
2768
  * The most media units a gap between two released frames can hold: the
2816
- * FEC blocks from `before`'s SBN to `after`'s, times D, the media units one
2817
- * block touches (ceil(interleaveDepthMs / unit duration), §5.1). Null when
2818
- * either SBN, the unit duration or the catalog interleave is unknown.
2769
+ * FEC blocks between `before`'s anchor and `after`'s, times D, the media
2770
+ * units one block touches (ceil(interleaveDepthMs / unit duration), §5.1).
2771
+ * Null when either anchor, the unit duration or the catalog interleave is
2772
+ * unknown.
2819
2773
  */
2820
2774
  #maxMissingUnits(before: ParserFrameMeta, after: ParserFrameMeta): number | null {
2821
2775
  const from = before.fecSbn;
@@ -2828,12 +2782,10 @@ export class MmtpRouter {
2828
2782
  const numerator = BigInt(Math.ceil(interleaveMs)) * BigInt(timing.mediaTimescale);
2829
2783
  const denominator = BigInt(timing.durationTicks) * 1000n;
2830
2784
  const unitsPerBlock = (numerator + denominator - 1n) / denominator;
2831
- // iso-ssbg1-v1 anchors are SS_IDs: every block holds at least one, so the
2785
+ // Anchors are SS_IDs (C.5.2): every block holds at least one, so the
2832
2786
  // serial SS_ID distance bounds the blocks between them.
2833
2787
  const blocks = BigInt(
2834
- (this.#isIsoPacket(after.packetId)
2835
- ? (serial32Precedes(from, to) ? serial32Distance(from, to) : serial32Distance(to, from))
2836
- : Math.abs(to - from)) + 1,
2788
+ (serial32Precedes(from, to) ? serial32Distance(from, to) : serial32Distance(to, from)) + 1,
2837
2789
  );
2838
2790
  const bound = unitsPerBlock * blocks;
2839
2791
  return bound > BigInt(Number.MAX_SAFE_INTEGER) ? null : Number(bound);
@@ -2899,8 +2851,9 @@ export class MmtpRouter {
2899
2851
  const cb = this.#trackInitCallbacks.get(packetId);
2900
2852
  if (cb) {
2901
2853
  cb(data);
2902
- } else if (this.#onInitSegment) {
2903
- this.#onInitSegment(data);
2854
+ } else {
2855
+ this.#unmappedInitDeliveries++;
2856
+ this.#onInitSegment?.(data);
2904
2857
  }
2905
2858
  console.log(
2906
2859
  `[MmtpRouter] Init delivered for packetId=${packetId}${catalogTrackName === undefined ? "" : ` track=${catalogTrackName}`} (${data.byteLength}B)`,
@@ -2971,9 +2924,14 @@ export class MmtpRouter {
2971
2924
  if (!info.isRepair && this.#manifestVerifier && !manifestAdmitted) {
2972
2925
  let identity = manifestIdentity;
2973
2926
  if (!identity && info.fecPayloadId && !fecUnreadable && (this.#resolveManifestIdentityForRoute || this.#resolveManifestIdentity)) {
2974
- const coordinates = this.#deriveSbnEsi(info.fecPayloadId.ssId, info.packetId);
2927
+ // A source resolves with its block coordinates (SS_Start, ESI), the
2928
+ // pair a recovered symbol of the same block resolves with. SS_ID alone
2929
+ // locates no block (C.5.3): until a repair states this source's block
2930
+ // it has none, its identity stays absent, and the verifier's
2931
+ // missing-identity policy below applies.
2975
2932
  const catalogTrackName = catalogTrackNameForPacket(ingress, info.packetId);
2976
- identity = (this.#resolveManifestIdentityForRoute
2933
+ const coordinates = this.#locateFecSource(info.packetId, catalogTrackName, info.fecPayloadId.ssId);
2934
+ identity = coordinates === null ? undefined : (this.#resolveManifestIdentityForRoute
2977
2935
  ? this.#resolveManifestIdentityForRoute({
2978
2936
  packetId: info.packetId,
2979
2937
  sbn: coordinates.sbn,
@@ -3042,92 +3000,7 @@ export class MmtpRouter {
3042
3000
  // NOTE: Do NOT call trackBlock for repair packets. Only source symbols
3043
3001
  // should count toward block completion — repair inflates blocksClean stats
3044
3002
  // and masks blocks that actually needed FEC recovery.
3045
- if (this.#isIsoPacket(ownerPacketId)) {
3046
- this.#handleIsoRepair(ownerPacketId, catalogTrackNameForPacket(ingress, ownerPacketId), repair, source);
3047
- return;
3048
- }
3049
- const repairSbn = this.#deriveRepairSbn(repair.ssStart, repair.ssbLength, ownerPacketId);
3050
- if (repairSbn === null) return;
3051
- const repairEsi = this.#kForPacket(ownerPacketId) + repair.rsId;
3052
-
3053
- if (
3054
- !this.#feedFecTransportSymbol(
3055
- ownerPacketId,
3056
- repairSbn,
3057
- repairEsi,
3058
- repair.symbolData,
3059
- source,
3060
- catalogTrackNameForPacket(ingress, ownerPacketId),
3061
- )
3062
- ) return;
3063
-
3064
- // Repair symbols are block progress too. The deadline measures
3065
- // inactivity, not total block lifetime.
3066
- const repairCatalogTrackName = catalogTrackNameForPacket(ingress, ownerPacketId);
3067
- if (repairCatalogTrackName === undefined) {
3068
- this.#fecManager.noteBlockActivity?.(repairSbn, ownerPacketId);
3069
- } else {
3070
- this.#fecManager.noteBlockActivity?.(
3071
- repairSbn,
3072
- ownerPacketId,
3073
- repairCatalogTrackName,
3074
- );
3075
- }
3076
-
3077
- const recovered = repairCatalogTrackName === undefined
3078
- ? this.#fecManager.feedRepairSymbol(
3079
- ownerPacketId,
3080
- repair.ssStart,
3081
- repair.ssbLength,
3082
- repair.rsId,
3083
- repair.symbolData,
3084
- )
3085
- : this.#fecManager.feedRepairSymbol(
3086
- ownerPacketId,
3087
- repair.ssStart,
3088
- repair.ssbLength,
3089
- repair.rsId,
3090
- repair.symbolData,
3091
- repairCatalogTrackName,
3092
- );
3093
- if (recovered) {
3094
- const alreadyCompleted = repairCatalogTrackName === undefined
3095
- ? this.#fecManager.isBlockCompleted(repairSbn, ownerPacketId)
3096
- : this.#fecManager.isBlockCompleted(
3097
- repairSbn,
3098
- ownerPacketId,
3099
- repairCatalogTrackName,
3100
- );
3101
- if (repairCatalogTrackName === undefined) {
3102
- this.#fecManager.cancelBlockTimeout(repairSbn, ownerPacketId);
3103
- } else {
3104
- this.#fecManager.cancelBlockTimeout(
3105
- repairSbn,
3106
- ownerPacketId,
3107
- repairCatalogTrackName,
3108
- );
3109
- }
3110
- // Skip routing if block was already completed via source path (all K sources
3111
- // arrived). The parser's feed() already played every frame.
3112
- if (!alreadyCompleted) {
3113
- this.#fecManager.countRecovery(ownerPacketId, repairSbn, repairCatalogTrackName);
3114
- if (repairCatalogTrackName === undefined) {
3115
- this.#fecManager.markBlockCompleted(repairSbn, ownerPacketId);
3116
- } else {
3117
- this.#fecManager.markBlockCompleted(
3118
- repairSbn,
3119
- ownerPacketId,
3120
- repairCatalogTrackName,
3121
- );
3122
- }
3123
- this.#routeRecoveredBlock(
3124
- repairSbn,
3125
- recovered,
3126
- ownerPacketId,
3127
- catalogTrackNameForPacket(ingress, ownerPacketId),
3128
- );
3129
- }
3130
- }
3003
+ this.#handleIsoRepair(ownerPacketId, catalogTrackNameForPacket(ingress, ownerPacketId), repair, source);
3131
3004
  }
3132
3005
  } else {
3133
3006
  // Drop source packets with unknown packetId — not in catalog.
@@ -3169,14 +3042,13 @@ export class MmtpRouter {
3169
3042
  // The FEC Payload ID FEC may read: none while the packetId has no
3170
3043
  // configured block profile (fecUnreadable above).
3171
3044
  const fecPayloadId = fecUnreadable ? null : info.fecPayloadId;
3172
- // iso-ssbg1-v1 locates a source by range membership in a block a repair
3173
- // already stated; until then it is held, unplaced (BLO-35597 iso:3).
3174
- const isoSource = this.#fecManager !== null && fecPayloadId != null &&
3175
- this.#isIsoPacket(info.packetId);
3176
- const coords = this.#fecManager && fecPayloadId
3177
- ? (isoSource
3178
- ? this.#fecManager.locateIsoSource?.(info.packetId, catalogTrackName, fecPayloadId.ssId) ?? undefined
3179
- : this.#deriveSbnEsi(fecPayloadId.ssId, info.packetId))
3045
+ // An FEC source is located by range membership in a block a repair
3046
+ // already stated; until then it is held, unplaced (BLO-35597 iso:3). A
3047
+ // readable FEC Payload ID implies a configured block profile
3048
+ // (fecUnreadable above), and iso-ssbg1-v1 is the only one.
3049
+ const fecSource = this.#fecManager !== null && fecPayloadId != null;
3050
+ const coords = fecSource && fecPayloadId
3051
+ ? this.#locateFecSource(info.packetId, catalogTrackName, fecPayloadId.ssId) ?? undefined
3180
3052
  : undefined;
3181
3053
  // Note the packet's FEC block (none without an FEC coordinate) before
3182
3054
  // any ledger lookup, the restart check below included.
@@ -3217,16 +3089,12 @@ export class MmtpRouter {
3217
3089
  }
3218
3090
  if (this.#fecManager && fecPayloadId && coords) {
3219
3091
  const fecId = fecPayloadId;
3220
- const symbolSize = this.#symbolSizeForPacket(info.packetId);
3221
-
3222
3092
  // The mmtp-packet source symbol protects the complete MMTP packet
3223
3093
  // before SS_ID is appended, self-delimiting and zero-padded to T.
3224
3094
  const rawSymbol = packet.subarray(0, packet.length - 4);
3225
- // iso-ssbg1-v1 symbols carry a two-octet length (C.3.3): admission
3095
+ // ssbg_mode1 symbols carry a two-octet length (C.3.3): admission
3226
3096
  // refuses length + 2 > T.
3227
- const oversized = isoSource
3228
- ? !(this.#fecManager.isoSourceFits?.(info.packetId, rawSymbol.length) ?? false)
3229
- : symbolSize > 0 && rawSymbol.length > symbolSize;
3097
+ const oversized = !(this.#fecManager.isoSourceFits?.(info.packetId, rawSymbol.length) ?? false);
3230
3098
 
3231
3099
  // NOTE: trackBlock() is deferred to AFTER #feedViaParser (below).
3232
3100
  // Reason: trackBlock synchronously fires onBlockComplete when the
@@ -3269,9 +3137,9 @@ export class MmtpRouter {
3269
3137
  );
3270
3138
  sourceSymbolTrackable = sourceSymbolAccepted;
3271
3139
  } else {
3272
- // FECManager zero-pads a short symbol to T itself and then owns that
3273
- // buffer outright, so it can transfer it to the FEC Worker without
3274
- // copying it again. Padding here as well cost a second T-byte
3140
+ // The exact protected packet travels unpadded: the decoder builds
3141
+ // the ssbg_mode1 symbol itself, and FECManager owns any copy it
3142
+ // hands the FEC Worker. Padding here cost a second T-byte
3275
3143
  // allocation and copy per short packet (BLO-36599).
3276
3144
  const symbolData = rawSymbol;
3277
3145
 
@@ -3296,8 +3164,8 @@ export class MmtpRouter {
3296
3164
 
3297
3165
  // Compute FEC block info for the MSE assembler.
3298
3166
  fecInfo = { sbn: coords.sbn, esi: coords.esi, oversized };
3299
- } else if (isoSource && this.#fecManager && fecPayloadId) {
3300
- // iso-ssbg1-v1 source whose block no repair has stated yet: route its
3167
+ } else if (fecSource && this.#fecManager && fecPayloadId) {
3168
+ // An FEC source whose block no repair has stated yet: route its
3301
3169
  // media now and hold its FEC symbol until a repair places it.
3302
3170
  const ssId = fecPayloadId.ssId;
3303
3171
  if (overlapCopy) {
@@ -3340,9 +3208,8 @@ export class MmtpRouter {
3340
3208
  this.#feedViaParser(packet, info, fecInfo, {
3341
3209
  source,
3342
3210
  catalogTrackName,
3343
- ...(isoSource && info.fecPayloadId
3344
- ? { fecSbn: info.fecPayloadId.ssId }
3345
- : fecInfo === undefined ? {} : { fecSbn: fecInfo.sbn }),
3211
+ // An FEC source frame is anchored by its own SS_ID (C.5.2).
3212
+ ...(fecSource && fecPayloadId ? { fecSbn: fecPayloadId.ssId } : {}),
3346
3213
  }, parsed);
3347
3214
  }
3348
3215
  // The frame this packet completed can commit an in-place switch that
@@ -3357,15 +3224,15 @@ export class MmtpRouter {
3357
3224
  // → #flushBlock. Without this ordering, the K-th frame was lost on
3358
3225
  // every block — only K-1 frames per block were ever emitted to MSE.
3359
3226
  // Only first-arriving symbols count toward completion or playback.
3227
+ // A source symbol is accepted only once placed, so it has coords.
3360
3228
  if (
3361
3229
  this.#fecManager &&
3362
3230
  fecPayloadId &&
3231
+ coords &&
3363
3232
  sourceSymbolAccepted &&
3364
3233
  sourceSymbolTrackable
3365
3234
  ) {
3366
- const { sbn, esi } = isoSource && coords
3367
- ? coords
3368
- : this.#deriveSbnEsi(fecPayloadId.ssId, info.packetId);
3235
+ const { sbn, esi } = coords;
3369
3236
  if (
3370
3237
  this.#classifyPacketId(info.packetId) !== null &&
3371
3238
  this.#fecManager.isTrackConfigured?.(info.packetId) !== false
@@ -3403,13 +3270,11 @@ export class MmtpRouter {
3403
3270
  info.packetId,
3404
3271
  sourceFec.ssId,
3405
3272
  sourceFec.symbolData,
3406
- undefined,
3407
3273
  )
3408
3274
  : this.#fecManager.feedSourceSymbol(
3409
3275
  info.packetId,
3410
3276
  sourceFec.ssId,
3411
3277
  sourceFec.symbolData,
3412
- undefined,
3413
3278
  catalogTrackName,
3414
3279
  );
3415
3280
  if (recovered) {
@@ -4051,7 +3916,6 @@ export class MmtpRouter {
4051
3916
  // (FI=1/2/3) of a larger MFU. Route through the reassembler so
4052
3917
  // multi-packet MFUs (e.g., keyframes spanning 15+ packets) are
4053
3918
  // properly assembled before reaching the decoder.
4054
- const k = this.#kForPacket(ownerPacketId);
4055
3919
  const packetSymbolSize = this.#symbolSizeForPacket(ownerPacketId);
4056
3920
  if (ownerPacketId === undefined) {
4057
3921
  throw new Error("[MmtpRouter] a recovered FEC block needs its owner packetId to read its fec.blockProfile");
@@ -4064,10 +3928,8 @@ export class MmtpRouter {
4064
3928
  );
4065
3929
  }
4066
3930
  const symbolSize = packetSymbolSize;
4067
- // iso-ssbg1-v1 returns K' = SSB_length symbols; k-padded-v1 the authored
4068
- // prefix of a K-symbol block, walked up to K.
3931
+ // An iso-ssbg1-v1 block decodes to K' = SSB_length ssbg_mode1 symbols.
4069
3932
  const result = processFecBlock(recovered, {
4070
- ...(blockProfile === "k-padded-v1" ? { k } : {}),
4071
3933
  symbolSize,
4072
3934
  ownerPacketId,
4073
3935
  blockProfile,
@@ -4163,9 +4025,6 @@ export class MmtpRouter {
4163
4025
  {
4164
4026
  ...identity,
4165
4027
  packetId: ownerPacketId,
4166
- ...(ownerPacketId !== undefined && this.#isIsoPacket(ownerPacketId)
4167
- ? {}
4168
- : { ssId: blockId * this.#kForPacket(ownerPacketId) + symbol.index }),
4169
4028
  },
4170
4029
  symbol.rawSymbol,
4171
4030
  () => {
@@ -4348,7 +4207,7 @@ export class MmtpRouter {
4348
4207
  rapFlag: sym.fragment.rapFlag,
4349
4208
  recovered: true,
4350
4209
  deliveryProvenance,
4351
- fecSbn: this.#fecAnchorForRecovered(ownerPacketId, blockId, sym.index),
4210
+ fecSbn: this.#fecAnchorForRecovered(blockId, sym.index),
4352
4211
  ...(catalogTrackName === undefined ? {} : { catalogTrackName }),
4353
4212
  });
4354
4213
  continue;
@@ -4484,7 +4343,7 @@ export class MmtpRouter {
4484
4343
  ...(assembled.deliveryProvenance === undefined
4485
4344
  ? {}
4486
4345
  : { deliveryProvenance: assembled.deliveryProvenance }),
4487
- fecSbn: this.#fecAnchorForRecovered(ownerPacketId, blockId, sym.index),
4346
+ fecSbn: this.#fecAnchorForRecovered(blockId, sym.index),
4488
4347
  ...(recoveredCatalogTrackName === undefined
4489
4348
  ? {}
4490
4349
  : { catalogTrackName: recoveredCatalogTrackName }),
@@ -4669,7 +4528,7 @@ export class MmtpRouter {
4669
4528
  rapFlag: sym.fragment.rapFlag,
4670
4529
  recovered: true,
4671
4530
  deliveryProvenance,
4672
- fecSbn: this.#fecAnchorForRecovered(ownerPacketId, blockId, sym.index),
4531
+ fecSbn: this.#fecAnchorForRecovered(blockId, sym.index),
4673
4532
  ...(catalogTrackName === undefined ? {} : { catalogTrackName }),
4674
4533
  });
4675
4534
  } else {
@@ -4759,7 +4618,7 @@ export class MmtpRouter {
4759
4618
  rapFlag: assembled.rapFlag,
4760
4619
  recovered: true,
4761
4620
  deliveryProvenance,
4762
- fecSbn: this.#fecAnchorForRecovered(ownerPacketId, blockId, sym.index),
4621
+ fecSbn: this.#fecAnchorForRecovered(blockId, sym.index),
4763
4622
  ...(assembled.catalogTrackName === undefined
4764
4623
  ? {}
4765
4624
  : { catalogTrackName: assembled.catalogTrackName }),
@@ -4806,7 +4665,7 @@ export class MmtpRouter {
4806
4665
  : { sampleNumber: sym.fragment.sampleNumber }),
4807
4666
  recovered: true,
4808
4667
  deliveryProvenance,
4809
- fecSbn: this.#fecAnchorForRecovered(ownerPacketId, blockId, sym.index),
4668
+ fecSbn: this.#fecAnchorForRecovered(blockId, sym.index),
4810
4669
  ...(catalogTrackName === undefined ? {} : { catalogTrackName }),
4811
4670
  });
4812
4671
  continue;