@blockcast/mmt-container 0.3.0 → 0.4.0-main.d6f2737828fc

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 (588) hide show
  1. package/README.md +22 -8
  2. package/dist/browser-runtime.js +1185 -1049
  3. package/dist/browser-runtime.js.map +4 -4
  4. package/dist/carp-catalog.d.ts +24 -8
  5. package/dist/carp-catalog.d.ts.map +1 -1
  6. package/dist/carp-catalog.js +21 -8
  7. package/dist/carp-catalog.js.map +2 -2
  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 +59 -17
  11. package/dist/catalog-fec-params.js.map +3 -3
  12. package/dist/catalog-network-source.js +0 -1
  13. package/dist/catalog-network-source.js.map +2 -2
  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/delta-fallback-config.d.ts +42 -0
  19. package/dist/delta-fallback-config.d.ts.map +1 -0
  20. package/dist/delta-fallback-config.js +59 -0
  21. package/dist/delta-fallback-config.js.map +7 -0
  22. package/dist/fec-manager.d.ts +35 -26
  23. package/dist/fec-manager.d.ts.map +1 -1
  24. package/dist/fec-manager.js +300 -273
  25. package/dist/fec-manager.js.map +2 -2
  26. package/dist/fec-state.d.ts +19 -31
  27. package/dist/fec-state.d.ts.map +1 -1
  28. package/dist/fec-state.js +3 -4
  29. package/dist/fec-state.js.map +2 -2
  30. package/dist/fec-worker-setup.d.ts +16 -6
  31. package/dist/fec-worker-setup.d.ts.map +1 -1
  32. package/dist/fec-worker-setup.js +72 -34
  33. package/dist/fec-worker-setup.js.map +2 -2
  34. package/dist/index.d.ts +4 -3
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +12 -0
  37. package/dist/index.js.map +2 -2
  38. package/dist/iso-block-locator.js +0 -1
  39. package/dist/iso-block-locator.js.map +2 -2
  40. package/dist/media-router.d.ts +20 -8
  41. package/dist/media-router.d.ts.map +1 -1
  42. package/dist/media-router.js +46 -21
  43. package/dist/media-router.js.map +2 -2
  44. package/dist/mfu-reassembler.js +0 -1
  45. package/dist/mfu-reassembler.js.map +2 -2
  46. package/dist/mmtp-container-parser.d.ts +5 -0
  47. package/dist/mmtp-container-parser.d.ts.map +1 -1
  48. package/dist/mmtp-container-parser.js +22 -1
  49. package/dist/mmtp-container-parser.js.map +2 -2
  50. package/dist/mmtp-container-parser.no-modules.js +37 -9
  51. package/dist/mmtp-container-parser.no-modules.js.map +2 -2
  52. package/dist/mmtp-decode-pipeline.js +22 -1
  53. package/dist/mmtp-decode-pipeline.js.map +2 -2
  54. package/dist/mmtp-router.d.ts +36 -16
  55. package/dist/mmtp-router.d.ts.map +1 -1
  56. package/dist/mmtp-router.js +126 -213
  57. package/dist/mmtp-router.js.map +2 -2
  58. package/dist/multicast-input.js +0 -1
  59. package/dist/multicast-input.js.map +2 -2
  60. package/dist/multicast-manager.d.ts +33 -3
  61. package/dist/multicast-manager.d.ts.map +1 -1
  62. package/dist/multicast-manager.js +660 -529
  63. package/dist/multicast-manager.js.map +4 -4
  64. package/dist/multicast-transport.d.ts +1 -1
  65. package/dist/multicast-transport.d.ts.map +1 -1
  66. package/dist/multicast-transport.js +42 -14
  67. package/dist/multicast-transport.js.map +3 -3
  68. package/dist/multicast-unwrap.js +0 -1
  69. package/dist/multicast-unwrap.js.map +2 -2
  70. package/dist/no-modules.js +36 -8
  71. package/dist/no-modules.js.map +2 -2
  72. package/dist/repair-fetch.d.ts +30 -19
  73. package/dist/repair-fetch.d.ts.map +1 -1
  74. package/dist/repair-fetch.js +32 -18
  75. package/dist/repair-fetch.js.map +3 -3
  76. package/dist/repair-layers.d.ts +18 -7
  77. package/dist/repair-layers.d.ts.map +1 -1
  78. package/dist/repair-layers.js +11 -4
  79. package/dist/repair-layers.js.map +2 -2
  80. package/dist/signaling.js +0 -4
  81. package/dist/signaling.js.map +2 -2
  82. package/dist/timestamp-codec.js +0 -1
  83. package/dist/timestamp-codec.js.map +2 -2
  84. package/dist/track-session.d.ts +7 -0
  85. package/dist/track-session.d.ts.map +1 -1
  86. package/dist/track-session.js +15 -8
  87. package/dist/track-session.js.map +2 -2
  88. package/dist/wasm-mfu-reassembler.js +0 -1
  89. package/dist/wasm-mfu-reassembler.js.map +2 -2
  90. package/dist/wasm-mmtp-container-parser.js +22 -1
  91. package/dist/wasm-mmtp-container-parser.js.map +2 -2
  92. package/package.json +8 -14
  93. package/schemas/catalog.schema.json +3 -3
  94. package/src/carp-catalog.ts +35 -13
  95. package/src/catalog-fec-params.ts +173 -64
  96. package/src/cmaf-block-assembler.ts +1 -4
  97. package/src/delta-fallback-config.ts +72 -0
  98. package/src/fec-manager.ts +413 -317
  99. package/src/fec-state.ts +20 -32
  100. package/src/fec-worker-setup.ts +105 -55
  101. package/src/index.ts +10 -0
  102. package/src/media-router.ts +59 -21
  103. package/src/mmtp-container-parser.ts +26 -0
  104. package/src/mmtp-router.ts +145 -303
  105. package/src/multicast-manager.ts +172 -60
  106. package/src/multicast-transport.ts +16 -9
  107. package/src/repair-fetch.ts +46 -27
  108. package/src/repair-layers.ts +28 -8
  109. package/src/track-session.ts +28 -9
  110. package/test-vectors/catalog/README.md +34 -17
  111. package/test-vectors/catalog/negative/fec-block-profile-retired.json +52 -0
  112. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +1 -1
  113. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +1 -1
  114. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +1 -1
  115. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +1 -1
  116. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +1 -1
  117. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +1 -1
  118. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +1 -1
  119. package/test-vectors/catalog/negative/multicast-network-source-empty.json +1 -1
  120. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +1 -1
  121. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +1 -1
  122. package/test-vectors/catalog/positive/fec-layered-repair.json +2 -2
  123. package/test-vectors/catalog/positive/fec-multicast.json +2 -1
  124. package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +2 -1
  125. package/test-vectors/catalog-timing.json +356 -0
  126. package/test-vectors/catalog-validation.json +40 -5
  127. package/node_modules/@blockcast/fec-worker/README.md +0 -223
  128. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  129. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +0 -38
  130. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +0 -1
  131. package/node_modules/@blockcast/fec-worker/dist/block-order.js +0 -78
  132. package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +0 -1
  133. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +0 -93
  134. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +0 -1
  135. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +0 -346
  136. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +0 -1
  137. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +0 -380
  138. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +0 -1
  139. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +0 -11
  140. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +0 -1
  141. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +0 -14
  142. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +0 -1
  143. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +0 -859
  144. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +0 -7
  145. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +0 -10
  146. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +0 -1
  147. package/node_modules/@blockcast/fec-worker/dist/index.js +0 -8
  148. package/node_modules/@blockcast/fec-worker/dist/index.js.map +0 -1
  149. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +0 -20
  150. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +0 -1
  151. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +0 -370
  152. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +0 -7
  153. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +0 -104
  154. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +0 -1
  155. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +0 -181
  156. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +0 -1
  157. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +0 -194
  158. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +0 -1
  159. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +0 -62
  160. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +0 -1
  161. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +0 -9
  162. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +0 -1
  163. package/node_modules/@blockcast/fec-worker/dist/transfer.js +0 -13
  164. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +0 -1
  165. package/node_modules/@blockcast/fec-worker/package.json +0 -59
  166. package/node_modules/@blockcast/fec-worker/src/block-order.ts +0 -93
  167. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +0 -392
  168. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +0 -399
  169. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +0 -1502
  170. package/node_modules/@blockcast/fec-worker/src/index.ts +0 -35
  171. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +0 -589
  172. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +0 -222
  173. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +0 -209
  174. package/node_modules/@blockcast/fec-worker/src/transfer.ts +0 -12
  175. package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  176. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  177. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  178. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  179. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  180. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  181. package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  182. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  183. package/node_modules/@blockcast/mmt-base/README.md +0 -134
  184. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  185. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  186. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  187. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  188. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  189. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  190. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  191. package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  192. package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  193. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  194. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  195. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  196. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  197. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  198. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  199. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  200. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  201. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  202. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  203. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  204. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  205. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  206. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  207. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  208. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  209. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  210. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  211. package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  212. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  213. package/node_modules/@blockcast/mmt-base/package.json +0 -49
  214. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  215. package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  216. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  217. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  218. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  219. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  220. package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  221. package/node_modules/@blockcast/mmt-fec/README.md +0 -271
  222. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  223. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +0 -82
  224. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +0 -1
  225. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +0 -296
  226. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +0 -1
  227. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +0 -106
  228. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +0 -1
  229. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +0 -288
  230. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +0 -1
  231. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +0 -46
  232. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +0 -1
  233. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +0 -96
  234. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +0 -1
  235. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +0 -33
  236. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +0 -1
  237. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +0 -57
  238. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +0 -1
  239. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +0 -205
  240. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +0 -1
  241. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +0 -240
  242. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +0 -1
  243. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +0 -28
  244. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +0 -1
  245. package/node_modules/@blockcast/mmt-fec/dist/index.js +0 -28
  246. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +0 -1
  247. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +0 -20
  248. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +0 -1
  249. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +0 -28
  250. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +0 -1
  251. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +0 -258
  252. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +0 -1
  253. package/node_modules/@blockcast/mmt-fec/dist/oti.js +0 -382
  254. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +0 -1
  255. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +0 -41
  256. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +0 -1
  257. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +0 -81
  258. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +0 -1
  259. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +0 -82
  260. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +0 -1
  261. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +0 -170
  262. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +0 -1
  263. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  264. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  265. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  266. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  267. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  268. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  269. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  270. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  271. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +0 -134
  272. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  273. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  274. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  275. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  276. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  277. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  278. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  279. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  280. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  281. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  282. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  283. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  284. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  285. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  286. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  287. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  288. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  289. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  290. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  291. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  292. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  293. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  294. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  295. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  296. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  297. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  298. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  299. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  300. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  301. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +0 -49
  302. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  303. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  304. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  305. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  306. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  309. package/node_modules/@blockcast/mmt-fec/package.json +0 -79
  310. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +0 -371
  311. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +0 -439
  312. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +0 -127
  313. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +0 -68
  314. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +0 -310
  315. package/node_modules/@blockcast/mmt-fec/src/index.ts +0 -94
  316. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +0 -34
  317. package/node_modules/@blockcast/mmt-fec/src/oti.ts +0 -463
  318. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +0 -101
  319. package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +0 -195
  320. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  321. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +0 -28
  322. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +0 -1
  323. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +0 -128
  324. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +0 -1
  325. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +0 -4
  326. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +0 -1
  327. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +0 -4
  328. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +0 -1
  329. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +0 -37
  330. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +0 -1
  331. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +0 -179
  332. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +0 -1
  333. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +0 -99
  334. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +0 -1
  335. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +0 -492
  336. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +0 -1
  337. package/node_modules/@blockcast/mmt-manifest-verify/package.json +0 -45
  338. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +0 -171
  339. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +0 -3
  340. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +0 -230
  341. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +0 -669
  342. package/node_modules/@noble/hashes/LICENSE +0 -21
  343. package/node_modules/@noble/hashes/README.md +0 -521
  344. package/node_modules/@noble/hashes/_assert.d.ts +0 -17
  345. package/node_modules/@noble/hashes/_assert.d.ts.map +0 -1
  346. package/node_modules/@noble/hashes/_assert.js +0 -18
  347. package/node_modules/@noble/hashes/_assert.js.map +0 -1
  348. package/node_modules/@noble/hashes/_blake.d.ts +0 -14
  349. package/node_modules/@noble/hashes/_blake.d.ts.map +0 -1
  350. package/node_modules/@noble/hashes/_blake.js +0 -50
  351. package/node_modules/@noble/hashes/_blake.js.map +0 -1
  352. package/node_modules/@noble/hashes/_md.d.ts +0 -51
  353. package/node_modules/@noble/hashes/_md.d.ts.map +0 -1
  354. package/node_modules/@noble/hashes/_md.js +0 -162
  355. package/node_modules/@noble/hashes/_md.js.map +0 -1
  356. package/node_modules/@noble/hashes/_u64.d.ts +0 -55
  357. package/node_modules/@noble/hashes/_u64.d.ts.map +0 -1
  358. package/node_modules/@noble/hashes/_u64.js +0 -90
  359. package/node_modules/@noble/hashes/_u64.js.map +0 -1
  360. package/node_modules/@noble/hashes/argon2.d.ts +0 -32
  361. package/node_modules/@noble/hashes/argon2.d.ts.map +0 -1
  362. package/node_modules/@noble/hashes/argon2.js +0 -401
  363. package/node_modules/@noble/hashes/argon2.js.map +0 -1
  364. package/node_modules/@noble/hashes/blake1.d.ts +0 -106
  365. package/node_modules/@noble/hashes/blake1.d.ts.map +0 -1
  366. package/node_modules/@noble/hashes/blake1.js +0 -459
  367. package/node_modules/@noble/hashes/blake1.js.map +0 -1
  368. package/node_modules/@noble/hashes/blake2.d.ts +0 -116
  369. package/node_modules/@noble/hashes/blake2.d.ts.map +0 -1
  370. package/node_modules/@noble/hashes/blake2.js +0 -420
  371. package/node_modules/@noble/hashes/blake2.js.map +0 -1
  372. package/node_modules/@noble/hashes/blake2b.d.ts +0 -11
  373. package/node_modules/@noble/hashes/blake2b.d.ts.map +0 -1
  374. package/node_modules/@noble/hashes/blake2b.js +0 -14
  375. package/node_modules/@noble/hashes/blake2b.js.map +0 -1
  376. package/node_modules/@noble/hashes/blake2s.d.ts +0 -20
  377. package/node_modules/@noble/hashes/blake2s.d.ts.map +0 -1
  378. package/node_modules/@noble/hashes/blake2s.js +0 -24
  379. package/node_modules/@noble/hashes/blake2s.js.map +0 -1
  380. package/node_modules/@noble/hashes/blake3.d.ts +0 -54
  381. package/node_modules/@noble/hashes/blake3.d.ts.map +0 -1
  382. package/node_modules/@noble/hashes/blake3.js +0 -255
  383. package/node_modules/@noble/hashes/blake3.js.map +0 -1
  384. package/node_modules/@noble/hashes/crypto.d.ts +0 -2
  385. package/node_modules/@noble/hashes/crypto.d.ts.map +0 -1
  386. package/node_modules/@noble/hashes/crypto.js +0 -5
  387. package/node_modules/@noble/hashes/crypto.js.map +0 -1
  388. package/node_modules/@noble/hashes/cryptoNode.d.ts +0 -2
  389. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +0 -1
  390. package/node_modules/@noble/hashes/cryptoNode.js +0 -18
  391. package/node_modules/@noble/hashes/cryptoNode.js.map +0 -1
  392. package/node_modules/@noble/hashes/eskdf.d.ts +0 -47
  393. package/node_modules/@noble/hashes/eskdf.d.ts.map +0 -1
  394. package/node_modules/@noble/hashes/eskdf.js +0 -166
  395. package/node_modules/@noble/hashes/eskdf.js.map +0 -1
  396. package/node_modules/@noble/hashes/esm/_assert.d.ts +0 -17
  397. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +0 -1
  398. package/node_modules/@noble/hashes/esm/_assert.js +0 -15
  399. package/node_modules/@noble/hashes/esm/_assert.js.map +0 -1
  400. package/node_modules/@noble/hashes/esm/_blake.d.ts +0 -14
  401. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +0 -1
  402. package/node_modules/@noble/hashes/esm/_blake.js +0 -45
  403. package/node_modules/@noble/hashes/esm/_blake.js.map +0 -1
  404. package/node_modules/@noble/hashes/esm/_md.d.ts +0 -51
  405. package/node_modules/@noble/hashes/esm/_md.d.ts.map +0 -1
  406. package/node_modules/@noble/hashes/esm/_md.js +0 -155
  407. package/node_modules/@noble/hashes/esm/_md.js.map +0 -1
  408. package/node_modules/@noble/hashes/esm/_u64.d.ts +0 -55
  409. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +0 -1
  410. package/node_modules/@noble/hashes/esm/_u64.js +0 -67
  411. package/node_modules/@noble/hashes/esm/_u64.js.map +0 -1
  412. package/node_modules/@noble/hashes/esm/argon2.d.ts +0 -32
  413. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +0 -1
  414. package/node_modules/@noble/hashes/esm/argon2.js +0 -392
  415. package/node_modules/@noble/hashes/esm/argon2.js.map +0 -1
  416. package/node_modules/@noble/hashes/esm/blake1.d.ts +0 -106
  417. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +0 -1
  418. package/node_modules/@noble/hashes/esm/blake1.js +0 -452
  419. package/node_modules/@noble/hashes/esm/blake1.js.map +0 -1
  420. package/node_modules/@noble/hashes/esm/blake2.d.ts +0 -116
  421. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +0 -1
  422. package/node_modules/@noble/hashes/esm/blake2.js +0 -413
  423. package/node_modules/@noble/hashes/esm/blake2.js.map +0 -1
  424. package/node_modules/@noble/hashes/esm/blake2b.d.ts +0 -11
  425. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +0 -1
  426. package/node_modules/@noble/hashes/esm/blake2b.js +0 -11
  427. package/node_modules/@noble/hashes/esm/blake2b.js.map +0 -1
  428. package/node_modules/@noble/hashes/esm/blake2s.d.ts +0 -20
  429. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +0 -1
  430. package/node_modules/@noble/hashes/esm/blake2s.js +0 -21
  431. package/node_modules/@noble/hashes/esm/blake2s.js.map +0 -1
  432. package/node_modules/@noble/hashes/esm/blake3.d.ts +0 -54
  433. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +0 -1
  434. package/node_modules/@noble/hashes/esm/blake3.js +0 -251
  435. package/node_modules/@noble/hashes/esm/blake3.js.map +0 -1
  436. package/node_modules/@noble/hashes/esm/crypto.d.ts +0 -2
  437. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +0 -1
  438. package/node_modules/@noble/hashes/esm/crypto.js +0 -2
  439. package/node_modules/@noble/hashes/esm/crypto.js.map +0 -1
  440. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +0 -2
  441. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +0 -1
  442. package/node_modules/@noble/hashes/esm/cryptoNode.js +0 -15
  443. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +0 -1
  444. package/node_modules/@noble/hashes/esm/eskdf.d.ts +0 -47
  445. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +0 -1
  446. package/node_modules/@noble/hashes/esm/eskdf.js +0 -160
  447. package/node_modules/@noble/hashes/esm/eskdf.js.map +0 -1
  448. package/node_modules/@noble/hashes/esm/hkdf.d.ts +0 -36
  449. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +0 -1
  450. package/node_modules/@noble/hashes/esm/hkdf.js +0 -82
  451. package/node_modules/@noble/hashes/esm/hkdf.js.map +0 -1
  452. package/node_modules/@noble/hashes/esm/hmac.d.ts +0 -35
  453. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +0 -1
  454. package/node_modules/@noble/hashes/esm/hmac.js +0 -86
  455. package/node_modules/@noble/hashes/esm/hmac.js.map +0 -1
  456. package/node_modules/@noble/hashes/esm/index.d.ts +0 -2
  457. package/node_modules/@noble/hashes/esm/index.d.ts.map +0 -1
  458. package/node_modules/@noble/hashes/esm/index.js +0 -33
  459. package/node_modules/@noble/hashes/esm/index.js.map +0 -1
  460. package/node_modules/@noble/hashes/esm/legacy.d.ts +0 -71
  461. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +0 -1
  462. package/node_modules/@noble/hashes/esm/legacy.js +0 -281
  463. package/node_modules/@noble/hashes/esm/legacy.js.map +0 -1
  464. package/node_modules/@noble/hashes/esm/package.json +0 -10
  465. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +0 -23
  466. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +0 -1
  467. package/node_modules/@noble/hashes/esm/pbkdf2.js +0 -97
  468. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +0 -1
  469. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +0 -13
  470. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +0 -1
  471. package/node_modules/@noble/hashes/esm/ripemd160.js +0 -13
  472. package/node_modules/@noble/hashes/esm/ripemd160.js.map +0 -1
  473. package/node_modules/@noble/hashes/esm/scrypt.d.ts +0 -34
  474. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +0 -1
  475. package/node_modules/@noble/hashes/esm/scrypt.js +0 -228
  476. package/node_modules/@noble/hashes/esm/scrypt.js.map +0 -1
  477. package/node_modules/@noble/hashes/esm/sha1.d.ts +0 -11
  478. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +0 -1
  479. package/node_modules/@noble/hashes/esm/sha1.js +0 -11
  480. package/node_modules/@noble/hashes/esm/sha1.js.map +0 -1
  481. package/node_modules/@noble/hashes/esm/sha2.d.ts +0 -159
  482. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +0 -1
  483. package/node_modules/@noble/hashes/esm/sha2.js +0 -375
  484. package/node_modules/@noble/hashes/esm/sha2.js.map +0 -1
  485. package/node_modules/@noble/hashes/esm/sha256.d.ts +0 -20
  486. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +0 -1
  487. package/node_modules/@noble/hashes/esm/sha256.js +0 -20
  488. package/node_modules/@noble/hashes/esm/sha256.js.map +0 -1
  489. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +0 -142
  490. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +0 -1
  491. package/node_modules/@noble/hashes/esm/sha3-addons.js +0 -393
  492. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +0 -1
  493. package/node_modules/@noble/hashes/esm/sha3.d.ts +0 -53
  494. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +0 -1
  495. package/node_modules/@noble/hashes/esm/sha3.js +0 -234
  496. package/node_modules/@noble/hashes/esm/sha3.js.map +0 -1
  497. package/node_modules/@noble/hashes/esm/sha512.d.ts +0 -26
  498. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +0 -1
  499. package/node_modules/@noble/hashes/esm/sha512.js +0 -26
  500. package/node_modules/@noble/hashes/esm/sha512.js.map +0 -1
  501. package/node_modules/@noble/hashes/esm/utils.d.ts +0 -161
  502. package/node_modules/@noble/hashes/esm/utils.d.ts.map +0 -1
  503. package/node_modules/@noble/hashes/esm/utils.js +0 -281
  504. package/node_modules/@noble/hashes/esm/utils.js.map +0 -1
  505. package/node_modules/@noble/hashes/hkdf.d.ts +0 -36
  506. package/node_modules/@noble/hashes/hkdf.d.ts.map +0 -1
  507. package/node_modules/@noble/hashes/hkdf.js +0 -88
  508. package/node_modules/@noble/hashes/hkdf.js.map +0 -1
  509. package/node_modules/@noble/hashes/hmac.d.ts +0 -35
  510. package/node_modules/@noble/hashes/hmac.d.ts.map +0 -1
  511. package/node_modules/@noble/hashes/hmac.js +0 -91
  512. package/node_modules/@noble/hashes/hmac.js.map +0 -1
  513. package/node_modules/@noble/hashes/index.d.ts +0 -1
  514. package/node_modules/@noble/hashes/index.d.ts.map +0 -1
  515. package/node_modules/@noble/hashes/index.js +0 -33
  516. package/node_modules/@noble/hashes/index.js.map +0 -1
  517. package/node_modules/@noble/hashes/legacy.d.ts +0 -71
  518. package/node_modules/@noble/hashes/legacy.d.ts.map +0 -1
  519. package/node_modules/@noble/hashes/legacy.js +0 -287
  520. package/node_modules/@noble/hashes/legacy.js.map +0 -1
  521. package/node_modules/@noble/hashes/package.json +0 -266
  522. package/node_modules/@noble/hashes/pbkdf2.d.ts +0 -23
  523. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +0 -1
  524. package/node_modules/@noble/hashes/pbkdf2.js +0 -101
  525. package/node_modules/@noble/hashes/pbkdf2.js.map +0 -1
  526. package/node_modules/@noble/hashes/ripemd160.d.ts +0 -13
  527. package/node_modules/@noble/hashes/ripemd160.d.ts.map +0 -1
  528. package/node_modules/@noble/hashes/ripemd160.js +0 -16
  529. package/node_modules/@noble/hashes/ripemd160.js.map +0 -1
  530. package/node_modules/@noble/hashes/scrypt.d.ts +0 -34
  531. package/node_modules/@noble/hashes/scrypt.d.ts.map +0 -1
  532. package/node_modules/@noble/hashes/scrypt.js +0 -232
  533. package/node_modules/@noble/hashes/scrypt.js.map +0 -1
  534. package/node_modules/@noble/hashes/sha1.d.ts +0 -11
  535. package/node_modules/@noble/hashes/sha1.d.ts.map +0 -1
  536. package/node_modules/@noble/hashes/sha1.js +0 -14
  537. package/node_modules/@noble/hashes/sha1.js.map +0 -1
  538. package/node_modules/@noble/hashes/sha2.d.ts +0 -159
  539. package/node_modules/@noble/hashes/sha2.d.ts.map +0 -1
  540. package/node_modules/@noble/hashes/sha2.js +0 -384
  541. package/node_modules/@noble/hashes/sha2.js.map +0 -1
  542. package/node_modules/@noble/hashes/sha256.d.ts +0 -20
  543. package/node_modules/@noble/hashes/sha256.d.ts.map +0 -1
  544. package/node_modules/@noble/hashes/sha256.js +0 -23
  545. package/node_modules/@noble/hashes/sha256.js.map +0 -1
  546. package/node_modules/@noble/hashes/sha3-addons.d.ts +0 -142
  547. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +0 -1
  548. package/node_modules/@noble/hashes/sha3-addons.js +0 -402
  549. package/node_modules/@noble/hashes/sha3-addons.js.map +0 -1
  550. package/node_modules/@noble/hashes/sha3.d.ts +0 -53
  551. package/node_modules/@noble/hashes/sha3.d.ts.map +0 -1
  552. package/node_modules/@noble/hashes/sha3.js +0 -239
  553. package/node_modules/@noble/hashes/sha3.js.map +0 -1
  554. package/node_modules/@noble/hashes/sha512.d.ts +0 -26
  555. package/node_modules/@noble/hashes/sha512.d.ts.map +0 -1
  556. package/node_modules/@noble/hashes/sha512.js +0 -29
  557. package/node_modules/@noble/hashes/sha512.js.map +0 -1
  558. package/node_modules/@noble/hashes/src/_assert.ts +0 -22
  559. package/node_modules/@noble/hashes/src/_blake.ts +0 -50
  560. package/node_modules/@noble/hashes/src/_md.ts +0 -176
  561. package/node_modules/@noble/hashes/src/_u64.ts +0 -91
  562. package/node_modules/@noble/hashes/src/argon2.ts +0 -497
  563. package/node_modules/@noble/hashes/src/blake1.ts +0 -534
  564. package/node_modules/@noble/hashes/src/blake2.ts +0 -486
  565. package/node_modules/@noble/hashes/src/blake2b.ts +0 -10
  566. package/node_modules/@noble/hashes/src/blake2s.ts +0 -20
  567. package/node_modules/@noble/hashes/src/blake3.ts +0 -272
  568. package/node_modules/@noble/hashes/src/crypto.ts +0 -9
  569. package/node_modules/@noble/hashes/src/cryptoNode.ts +0 -15
  570. package/node_modules/@noble/hashes/src/eskdf.ts +0 -187
  571. package/node_modules/@noble/hashes/src/hkdf.ts +0 -88
  572. package/node_modules/@noble/hashes/src/hmac.ts +0 -94
  573. package/node_modules/@noble/hashes/src/index.ts +0 -31
  574. package/node_modules/@noble/hashes/src/legacy.ts +0 -293
  575. package/node_modules/@noble/hashes/src/pbkdf2.ts +0 -122
  576. package/node_modules/@noble/hashes/src/ripemd160.ts +0 -12
  577. package/node_modules/@noble/hashes/src/scrypt.ts +0 -257
  578. package/node_modules/@noble/hashes/src/sha1.ts +0 -10
  579. package/node_modules/@noble/hashes/src/sha2.ts +0 -402
  580. package/node_modules/@noble/hashes/src/sha256.ts +0 -24
  581. package/node_modules/@noble/hashes/src/sha3-addons.ts +0 -499
  582. package/node_modules/@noble/hashes/src/sha3.ts +0 -258
  583. package/node_modules/@noble/hashes/src/sha512.ts +0 -34
  584. package/node_modules/@noble/hashes/src/utils.ts +0 -395
  585. package/node_modules/@noble/hashes/utils.d.ts +0 -161
  586. package/node_modules/@noble/hashes/utils.d.ts.map +0 -1
  587. package/node_modules/@noble/hashes/utils.js +0 -313
  588. package/node_modules/@noble/hashes/utils.js.map +0 -1
@@ -1,20 +1,22 @@
1
1
  // src/track-session.ts
2
2
  import { fecBlockBudgetMs } from "@blockcast/mmt-fec";
3
3
  function computeFecDeliveryWindowMs(config) {
4
- const fecInterleaveMs = config.interleaveDepthMs;
5
4
  const fecK = config.sourceSymbols;
6
- if (!Number.isFinite(fecInterleaveMs) || fecInterleaveMs <= 0) {
5
+ if (!Number.isFinite(fecK) || fecK <= 0) {
7
6
  throw new Error(
8
- `[TrackSession] fecInterleaveMs=${fecInterleaveMs}. Derive a positive FEC interleave window from the stream catalog.`
7
+ `[TrackSession] fecK=${fecK}. Derive a positive FEC source-symbol count from the stream catalog.`
9
8
  );
10
9
  }
11
- if (!Number.isFinite(fecK) || fecK <= 0) {
10
+ return fecSpanDeliveryWindowMs(config.interleaveDepthMs, config.jitterBufferMs);
11
+ }
12
+ function fecSpanDeliveryWindowMs(interleaveDepthMs, jitterBufferMs) {
13
+ if (!Number.isFinite(interleaveDepthMs) || interleaveDepthMs <= 0) {
12
14
  throw new Error(
13
- `[TrackSession] fecK=${fecK}. Derive a positive FEC source-symbol count from the stream catalog.`
15
+ `[TrackSession] fecInterleaveMs=${interleaveDepthMs}. Derive a positive FEC interleave window from the stream catalog.`
14
16
  );
15
17
  }
16
- if (config.jitterBufferMs === void 0) return Math.ceil(fecInterleaveMs);
17
- return fecBlockBudgetMs(fecInterleaveMs, config.jitterBufferMs);
18
+ if (jitterBufferMs === void 0) return Math.ceil(interleaveDepthMs);
19
+ return fecBlockBudgetMs(interleaveDepthMs, jitterBufferMs);
18
20
  }
19
21
 
20
22
  // src/delivery-gap.ts
@@ -106,7 +108,9 @@ var DeliveryGapEstimator = class {
106
108
  import {
107
109
  deriveFecInterleaveDepth as deriveFecInterleaveDepth2,
108
110
  deriveFecRetentionBlocks,
109
- tryDeriveFecRetentionBlocks
111
+ tryDeriveFecRetentionBlocks,
112
+ LOCAL_FEC_RETENTION_BLOCKS,
113
+ LOCAL_FEC_TIMEOUT_MS
110
114
  } from "@blockcast/mmt-fec";
111
115
 
112
116
  // ../mmt-alta-parse/dist/index.js
@@ -146,49 +150,21 @@ function serial32Precedes(a, b) {
146
150
  const distance = serial32Distance(a, b);
147
151
  return distance !== 0 && distance < SERIAL32_HALF;
148
152
  }
149
- function kStrideBlockStart(sbn, k) {
150
- assertUint32(sbn, "sbn");
151
- if (!Number.isInteger(k) || k < 1 || k >= SERIAL32_HALF) {
152
- throw new RangeError(`k must be a positive integer below 2^31 (got ${k})`);
153
- }
154
- const high = Math.floor(sbn / 65536);
155
- const low = sbn % 65536;
156
- return (high * k % SERIAL32_SPAN * 65536 + low * k) % SERIAL32_SPAN;
157
- }
158
- function kStrideBlockPrecedes(a, b, k) {
159
- return serial32Precedes(kStrideBlockStart(a, k), kStrideBlockStart(b, k));
160
- }
161
- function kStrideBlocksBehind(a, b, k) {
162
- const from = kStrideBlockStart(a, k);
163
- const to = kStrideBlockStart(b, k);
164
- if (!serial32Precedes(from, to))
165
- return 0;
166
- return Math.ceil(serial32Distance(from, to) / k);
167
- }
168
- function isKStrideBlock(sbn, k) {
169
- return Number.isInteger(sbn) && sbn >= 0 && sbn < SERIAL32_SPAN && Number.isInteger(k) && k >= 1 && k < SERIAL32_HALF;
170
- }
171
- function kStrideNextBlock(sbn, k) {
172
- assertUint32(sbn, "sbn");
173
- kStrideBlockStart(sbn, k);
174
- return (sbn + 1) * k >= SERIAL32_SPAN ? 0 : sbn + 1;
175
- }
176
153
 
177
154
  // ../mmt-base/dist/fec-block-profile.js
178
155
  var FEC_BLOCK_PROFILES = Object.freeze([
179
- "k-padded-v1",
180
156
  "iso-ssbg1-v1"
181
157
  ]);
182
158
  function isFecBlockProfile(value) {
183
- return value === "k-padded-v1" || value === "iso-ssbg1-v1";
159
+ return value === "iso-ssbg1-v1";
184
160
  }
185
161
  function parseFecBlockProfile(value, where) {
186
162
  if (isFecBlockProfile(value))
187
163
  return value;
188
164
  if (value === void 0) {
189
- throw new Error(`${where} is required: name the FEC block profile ("k-padded-v1" or "iso-ssbg1-v1")`);
165
+ throw new Error(`${where} is required: name the FEC block profile ("iso-ssbg1-v1")`);
190
166
  }
191
- throw new Error(`${where} must be "k-padded-v1" or "iso-ssbg1-v1" (got ${JSON.stringify(value)})`);
167
+ throw new Error(`${where} must be "iso-ssbg1-v1" (got ${JSON.stringify(value)})`);
192
168
  }
193
169
  var SSBG1_LENGTH_FIELD_BYTES = 2;
194
170
  function ssbg1MaxPacketLength(symbolSize) {
@@ -441,7 +417,7 @@ var IsoBlockLocator = class _IsoBlockLocator {
441
417
  };
442
418
 
443
419
  // src/fec-state.ts
444
- var MIN_INTERLEAVE_DEPTH_MS = 33;
420
+ var MIN_INTERLEAVE_DEPTH_MS = 1;
445
421
  var FEC_INACTIVE_REASONS = Object.freeze([
446
422
  "no-catalog-fec",
447
423
  "reliable-moq",
@@ -836,7 +812,6 @@ var FECManager = class _FECManager {
836
812
  constructor() {
837
813
  // Per-track WASM RaptorQ decoders, keyed by physical stream identity.
838
814
  this.#fecDecoders = /* @__PURE__ */ new Map();
839
- /** @deprecated Use setFecDecoder(packetId, ...). Backwards-compat shim. */
840
815
  // Per-track Worker-backed FEC decoders, keyed by physical stream identity.
841
816
  // Worker-backed tracks use async decode — recovered frames arrive via onFrame callback,
842
817
  // not synchronous return from feedSourceSymbol/feedRepairSymbol.
@@ -851,10 +826,9 @@ var FECManager = class _FECManager {
851
826
  // source/repair symbols do not split across two RaptorQ states.
852
827
  this.#syncDecoderBlockOwners = /* @__PURE__ */ new Map();
853
828
  this.#decoderBlockOwners = /* @__PURE__ */ new WeakMap();
854
- this.#fecK = 4;
855
829
  this.#fecSymbolSize = 0;
856
- this.#fecTimeoutMs = 500;
857
- // default 500ms; refined by setFramerate() when fps known
830
+ this.#fecTimeoutMs = LOCAL_FEC_TIMEOUT_MS;
831
+ // local default; refined by setFramerate() when fps known
858
832
  this.#trackConfigs = /* @__PURE__ */ new Map();
859
833
  this.#fecStats = newFecCounters();
860
834
  this.#fecTrackStats = /* @__PURE__ */ new Map();
@@ -894,10 +868,10 @@ var FECManager = class _FECManager {
894
868
  this.#blockSourceEsis = /* @__PURE__ */ new Map();
895
869
  // Authored SSB_length per block (ISO/IEC 23008-1 §C.5.3), learned from the
896
870
  // first repair symbol. The FFmpeg moq_mmt publisher closes a block every D
897
- // media units, usually before it holds K symbols, and fec-raptorq
898
- // force_complete() encodes it as a K-symbol RaptorQ block whose ESIs
899
- // SSB_length..K-1 are zero padding that is never sent. Such a block is clean
900
- // at SSB_length source arrivals and recoverable from SSB_length received
871
+ // media units, usually before it holds K symbols; under iso-ssbg1-v1
872
+ // (ssbg_mode1) that block is K' = SSB_length symbols, its repair ESIs start
873
+ // at SSB_length, and K is only the maximum. Such a block is clean at
874
+ // SSB_length source arrivals and recoverable from SSB_length received
901
875
  // symbols; waiting for K fails every one of them.
902
876
  this.#blockAuthoredLengths = /* @__PURE__ */ new Map();
903
877
  this.#ssbLengthConflictCount = 0;
@@ -1014,14 +988,16 @@ var FECManager = class _FECManager {
1014
988
  this.#resolvedBlockClasses = /* @__PURE__ */ new Map();
1015
989
  // Blocks already reported through onBlockRepaired (once per block).
1016
990
  this.#repairedBlocks = /* @__PURE__ */ new Set();
1017
- // Blocks created without any symbol because every symbol vanished.
991
+ // Blocks created before any symbol of theirs was tracked: the repair-less
992
+ // spans placeIsoRepair materializes (onBlockVanished).
1018
993
  this.#materializedBlocks = /* @__PURE__ */ new Set();
1019
994
  // packetIds whose ordered-relay horizon became underivable and fell back to
1020
995
  // the datagram deadline. Bounds the warn in #derivableOrderedHorizon to once
1021
996
  // per stream. Not only throws: the ordinary out-of-range case is detected by
1022
997
  // arithmetic and never throws at all.
1023
998
  this.#orderedHorizonWarnedFor = /* @__PURE__ */ new Set();
1024
- // Highest SBN seen per stream and when, for vanished-block detection.
999
+ // Newest block start (SS_Start) seen per stream and when: the frontier for
1000
+ // source-discontinuity detection and isoSpanResolution.
1025
1001
  this.#highestSbn = /* @__PURE__ */ new Map();
1026
1002
  // iso-ssbg1-v1 block location per stream (streamKey). A source belongs to a
1027
1003
  // block only once a repair symbol stated the block's (SS_Start, SSB_length).
@@ -1115,7 +1091,10 @@ var FECManager = class _FECManager {
1115
1091
  #releasedWorkerClients;
1116
1092
  #syncDecoderBlockOwners;
1117
1093
  #decoderBlockOwners;
1118
- #fecK;
1094
+ // The stream-global K a configure() call stated, reported as fecStats.k.
1095
+ // It never resolves a packetId: a packetId has only its own track config
1096
+ // (BLO-45953), and K does not feed the delivery-window math.
1097
+ #streamK;
1119
1098
  #fecSymbolSize;
1120
1099
  #fecTimeoutMs;
1121
1100
  #trackConfigs;
@@ -1277,7 +1256,8 @@ var FECManager = class _FECManager {
1277
1256
  this.#completedBlocks.add(key);
1278
1257
  if (clean) this.#cleanlyCompletedBlocks.add(key);
1279
1258
  this.#indexBlockKey(key, sbn, packetId);
1280
- const expiresAtMs = nowMs + this.terminalRetentionMsForPacket(packetId);
1259
+ const config = this.#trackConfig(packetId);
1260
+ const expiresAtMs = nowMs + config.interleaveDepthMs + 2 * this.#blockLifetimeMs(config);
1281
1261
  this.#terminalExpiryMs.set(key, expiresAtMs);
1282
1262
  let queue = this.#terminalQueues.get(packetId);
1283
1263
  if (!queue) {
@@ -1313,8 +1293,9 @@ var FECManager = class _FECManager {
1313
1293
  * retention the Worker and the WASM decoder are configured with, because it
1314
1294
  * comes from the same function they do (`deriveFecRetentionBlocks`, over the
1315
1295
  * block's delivery window and its span). The decoder retires every block
1316
- * more than this many SBNs behind the newest one it saw (`cleanup_by_sbn`),
1317
- * so settling earlier than this would decide a block the decoder would still
1296
+ * more than this many blocks behind the newest SS_Start it saw, counted
1297
+ * from below by `isoBlocksBehindLowerBound` (`cleanup_by_ss_start`), so
1298
+ * settling earlier than this would decide a block the decoder would still
1318
1299
  * have recovered.
1319
1300
  *
1320
1301
  * This used to call `deriveFecInterleaveDepth`, which returns D -- MEDIA
@@ -1327,6 +1308,14 @@ var FECManager = class _FECManager {
1327
1308
  * derivation; do not re-derive a horizon at either call site.
1328
1309
  */
1329
1310
  #orderedHorizonBlocksFor(packetId, config) {
1311
+ if (config.interleaveDepthMs === 0) {
1312
+ if (Number.isFinite(config.timeoutMs) && config.timeoutMs > 0) {
1313
+ return LOCAL_FEC_RETENTION_BLOCKS;
1314
+ }
1315
+ throw new Error(
1316
+ `[FECManager] packetId=${packetId}: local FEC cleanup requires a positive timeout (got ${config.timeoutMs})`
1317
+ );
1318
+ }
1330
1319
  if (!_FECManager.#hasOrderedGeometry(config)) {
1331
1320
  throw new Error(
1332
1321
  `[FECManager] packetId=${packetId}: ordered-relay settlement derives the decoder's interleave horizon from the catalog interleaveDepthMs (>= ${MIN_INTERLEAVE_DEPTH_MS}ms), the media-unit rate and the block delivery window; got interleaveDepthMs=${config.interleaveDepthMs} fps=${String(config.fps)} timeoutMs=${config.timeoutMs}.`
@@ -1340,7 +1329,7 @@ var FECManager = class _FECManager {
1340
1329
  * two can never disagree about which streams settle by stream order.
1341
1330
  */
1342
1331
  static #hasOrderedGeometry(config) {
1343
- return config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS && // `fps` is no longer an input to the horizon, but it still gates WHICH
1332
+ return _FECManager.#hasCatalogTiming(config) && // `fps` is no longer an input to the horizon, but it still gates WHICH
1344
1333
  // streams settle by stream order at all: a track with no usable
1345
1334
  // media-unit rate fell back to datagram semantics before this and must
1346
1335
  // keep doing so. Removing this widens ordered-relay settlement to streams
@@ -1380,6 +1369,9 @@ var FECManager = class _FECManager {
1380
1369
  * argument: narrower IS the failing direction.
1381
1370
  */
1382
1371
  #derivableOrderedHorizon(config, packetId) {
1372
+ if (config.interleaveDepthMs === 0) {
1373
+ return Number.isFinite(config.timeoutMs) && config.timeoutMs > 0 ? LOCAL_FEC_RETENTION_BLOCKS : void 0;
1374
+ }
1383
1375
  if (!_FECManager.#hasOrderedGeometry(config)) return void 0;
1384
1376
  try {
1385
1377
  const blocks = tryDeriveFecRetentionBlocks(config.timeoutMs, config.interleaveDepthMs);
@@ -1412,19 +1404,20 @@ var FECManager = class _FECManager {
1412
1404
  /**
1413
1405
  * The stream's interleave horizon, or undefined when its geometry cannot
1414
1406
  * define one. Two different streams reach that case, with different causes:
1415
- * a packetId that was never configured, and so resolves to the manager
1416
- * defaults (explicitly configured tracks are refused an underivable geometry
1407
+ * a packetId that was never configured, which has no geometry at all
1408
+ * (explicitly configured tracks are refused an underivable geometry
1417
1409
  * at config time — #upsertTrackConfig, setMulticastSymbolDelivery); or a
1418
1410
  * configured track whose timeoutMs was later widened past the 255-block
1419
1411
  * ceiling without re-validating, which #derivableOrderedHorizon catches
1420
1412
  * rather than throwing from the packet-feed path. Either way the stream
1421
- * keeps datagram semantics instead of throwing. The manager defaults can
1413
+ * keeps datagram semantics instead of throwing. A track's configuration can
1422
1414
  * also change under a stream that already holds blocks, so a caller cannot
1423
1415
  * assume a horizon that was defined when a block was held is still defined
1424
1416
  * (see #advanceOrderedFrontier).
1425
1417
  */
1426
1418
  #orderedHorizonBlocks(packetId) {
1427
- return this.#derivableOrderedHorizon(this.#resolveTrackConfig(packetId), packetId);
1419
+ const config = this.#trackConfigs.get(packetId);
1420
+ return config === void 0 ? void 0 : this.#derivableOrderedHorizon(config, packetId);
1428
1421
  }
1429
1422
  /** True while a block of an ordered-relay stream can still receive symbols. */
1430
1423
  #withinOrderedHorizon(key) {
@@ -1458,7 +1451,7 @@ var FECManager = class _FECManager {
1458
1451
  */
1459
1452
  #advanceOrderedFrontier(streamKey, sbn, packetId, catalogTrackName) {
1460
1453
  const previous = this.#orderedFrontiers.get(streamKey);
1461
- const frontier = previous === void 0 || this.#blockPrecedes(previous, sbn, packetId) ? sbn : previous;
1454
+ const frontier = previous === void 0 || this.#blockPrecedes(previous, sbn) ? sbn : previous;
1462
1455
  if (frontier !== previous) this.#orderedFrontiers.set(streamKey, frontier);
1463
1456
  const pending = this.#orderedPendingBlocks.get(streamKey);
1464
1457
  if (!pending) return;
@@ -1493,7 +1486,7 @@ var FECManager = class _FECManager {
1493
1486
  if (this.#completedBlocks.has(key) || this.#pendingWorkerCleanups.has(key) || this.#repairRequestedBlocks.has(key)) return;
1494
1487
  const authoredLength = this.#blockAuthoredLengths.get(key);
1495
1488
  const received = (this.#blockSourceCounts.get(key) ?? 0) + (this.#blockRepairRsIds.get(key)?.size ?? 0);
1496
- if (this.onRepairNeeded && (authoredLength === void 0 || received < authoredLength)) {
1489
+ if (this.#hasCatalogTimingForPacket(packetId) && this.onRepairNeeded && (authoredLength === void 0 || received < authoredLength)) {
1497
1490
  this.#requestRepair(sbn, packetId, catalogTrackName, true);
1498
1491
  return;
1499
1492
  }
@@ -1649,7 +1642,7 @@ var FECManager = class _FECManager {
1649
1642
  }
1650
1643
  #requestRepair(sbn, packetId, catalogTrackName, settledByOrder = false) {
1651
1644
  const key = this.#blockKey(sbn, packetId, catalogTrackName);
1652
- if (this.#completedBlocks.has(key) || !this.onRepairNeeded || this.#repairRequestedBlocks.has(key)) return;
1645
+ if (this.#completedBlocks.has(key) || !this.#hasCatalogTimingForPacket(packetId) || !this.onRepairNeeded || this.#repairRequestedBlocks.has(key)) return;
1653
1646
  const deadline = this.#repairDeadlines.get(key);
1654
1647
  if (deadline?.handle != null) clearTimeout(deadline.handle);
1655
1648
  this.#repairDeadlines.set(key, null);
@@ -1729,6 +1722,7 @@ var FECManager = class _FECManager {
1729
1722
  }
1730
1723
  /** A block's live class without creating classifier state for the stream. */
1731
1724
  #peekClass(sbn, packetId, catalogTrackName) {
1725
+ if (!this.#hasCatalogTimingForPacket(packetId)) return "unknown";
1732
1726
  const classifier = this.#classifiers.get(this.#streamKey(packetId, catalogTrackName));
1733
1727
  if (classifier) return classifier.classOf(sbn);
1734
1728
  return this.#geometryFor(packetId, catalogTrackName).trackKind === "audio" ? "audio" : "unknown";
@@ -1750,8 +1744,8 @@ var FECManager = class _FECManager {
1750
1744
  // Deliberately one block tighter than deriveFecRetentionBlocks over the same
1751
1745
  // inputs (that function's `+ 1`). Different question: the retention horizon
1752
1746
  // asks how long the decoder still ACCEPTS symbols for a block, this asks how
1753
- // far back a block that vanished entirely may still be repairable (see
1754
- // #noteSbnSeen).
1747
+ // many blocks a stream can live behind (or ahead of) its frontier before a
1748
+ // source symbol there is a discontinuity rather than loss (see #noteSbnSeen).
1755
1749
  // The extra block of retention is slack for a block still being fed; a block
1756
1750
  // nothing has been heard from does not get it. Not the units defect — but it
1757
1751
  // is the next place the two can drift, so change both or neither.
@@ -1760,27 +1754,28 @@ var FECManager = class _FECManager {
1760
1754
  return Math.ceil(config.timeoutMs / config.interleaveDepthMs);
1761
1755
  }
1762
1756
  /**
1763
- * Record that a symbol for block `sbn` arrived and materialise any blocks
1764
- * that vanished entirely between the stream's highest SBN and this one.
1757
+ * Record that a symbol for block `sbn` (the block's SS_Start) arrived and
1758
+ * advance the stream's frontier, the newest block start seen.
1765
1759
  *
1766
- * The newest ceil(timeoutMs / interleaveDepthMs) vanished blocks may still
1767
- * be repairable, so they get the normal repair and fail deadlines, armed
1768
- * from now. Older ones are already past their fail bound and fail now, as
1769
- * class `unknown`. A SOURCE symbol whose SBN goes back further than one
1770
- * live window, or jumps further than the stream could have produced since
1771
- * its last symbol, is a source discontinuity, not loss. A repair symbol can
1772
- * only advance the frontier: a D-28 fetch legitimately answers for an old
1773
- * block, so it never signals a discontinuity.
1760
+ * A SOURCE symbol whose block goes back further than one live window, or
1761
+ * jumps further than the stream could have produced since its last symbol,
1762
+ * is a source discontinuity, not loss. A repair symbol can only advance the
1763
+ * frontier: a D-28 fetch legitimately answers for an old block, so it never
1764
+ * signals a discontinuity.
1774
1765
  *
1775
1766
  * The producer closes a block at its Dth media-unit boundary OR when K
1776
- * source symbols filled it, so one interleave span can start several
1777
- * blocks (every large keyframe does). What bounds a forward jump is
1778
- * therefore packet evidence, not a block rate: with the MMTP
1779
- * packet_sequence_number (contiguous per packet_id, ISO/IEC 23008-1) of
1780
- * both source symbols, every block strictly between them holds at least one
1781
- * of the packets sent strictly between them, and K-closes can add at most
1782
- * one block per K of those packets on top of the D-closes elapsed time
1783
- * allows. Without it, only the D-close rate is known.
1767
+ * source symbols filled it, so one interleave span can start several blocks
1768
+ * (every large keyframe does). What bounds a forward jump is therefore
1769
+ * packet evidence, not a block rate: SS_ID advances by one per FEC source
1770
+ * packet (ISO/IEC 23008-1 C.5.2) and the MMTP packet_sequence_number by one
1771
+ * per packet of the packet_id, so with both source symbols'
1772
+ * packet_sequence_number a block start can move at most the packets sent
1773
+ * between them plus the anchor's own offset into its block (< K). Without
1774
+ * it, only the D-close rate is known.
1775
+ *
1776
+ * Vanished blocks are not enumerated here: their starts are unknown until a
1777
+ * repair states them. The SS_IDs between two stated blocks become one
1778
+ * repair-less span when the later block's repair arrives (placeIsoRepair).
1784
1779
  */
1785
1780
  #noteSbnSeen(sbn, packetId, catalogTrackName, symbol, packetSequenceNumber) {
1786
1781
  const streamKey = this.#streamKey(packetId, catalogTrackName);
@@ -1789,7 +1784,7 @@ var FECManager = class _FECManager {
1789
1784
  const anchor = this.#sourceAnchors.get(streamKey);
1790
1785
  const psn = symbol === "source" && packetSequenceNumber !== void 0 && Number.isSafeInteger(packetSequenceNumber) && packetSequenceNumber >= 0 && packetSequenceNumber <= 4294967295 ? packetSequenceNumber : void 0;
1791
1786
  const anchorHere = () => {
1792
- if (psn !== void 0 && (anchor === void 0 || !this.#blockPrecedes(sbn, anchor.sbn, packetId))) {
1787
+ if (psn !== void 0 && (anchor === void 0 || !this.#blockPrecedes(sbn, anchor.sbn))) {
1793
1788
  this.#sourceAnchors.set(streamKey, { sbn, psn, atMs: now });
1794
1789
  }
1795
1790
  };
@@ -1805,9 +1800,9 @@ var FECManager = class _FECManager {
1805
1800
  anchorHere();
1806
1801
  return;
1807
1802
  }
1808
- const config = this.#resolveTrackConfig(packetId);
1803
+ const config = this.#trackConfig(packetId);
1809
1804
  const window = this.#liveWindowBlocks(config);
1810
- if (!this.#blockPrecedes(previous.sbn, sbn, packetId)) {
1805
+ if (!this.#blockPrecedes(previous.sbn, sbn)) {
1811
1806
  if (symbol === "source" && window !== null && this.#blocksBehind(sbn, previous.sbn, packetId) > window) {
1812
1807
  discontinuity();
1813
1808
  return;
@@ -1818,15 +1813,9 @@ var FECManager = class _FECManager {
1818
1813
  const missing = this.#blocksBehind(previous.sbn, sbn, packetId) - 1;
1819
1814
  let plausible = true;
1820
1815
  if (window !== null) {
1821
- if (this.#isIso(packetId) && psn !== void 0 && anchor !== void 0 && this.#blockPrecedes(anchor.sbn, sbn, packetId) && psn !== anchor.psn) {
1816
+ if (psn !== void 0 && anchor !== void 0 && this.#blockPrecedes(anchor.sbn, sbn) && psn !== anchor.psn) {
1822
1817
  const sent = psn - anchor.psn >>> 0;
1823
1818
  plausible = sent <= 2147483647 && serial32Distance(anchor.sbn, sbn) <= sent + config.k;
1824
- } else if (psn !== void 0 && anchor !== void 0 && this.#blockPrecedes(anchor.sbn, sbn, packetId) && psn !== anchor.psn) {
1825
- const sent = psn - anchor.psn >>> 0;
1826
- const between = this.#blocksBehind(anchor.sbn, sbn, packetId) - 1;
1827
- const dCloses = window + Math.ceil((now - anchor.atMs) / config.interleaveDepthMs);
1828
- const kCloses = config.k > 0 ? Math.ceil(sent / config.k) : sent;
1829
- plausible = sent <= 2147483647 && between <= sent - 1 && between <= dCloses + kCloses;
1830
1819
  } else {
1831
1820
  plausible = missing <= window + Math.ceil((now - previous.atMs) / config.interleaveDepthMs);
1832
1821
  }
@@ -1838,48 +1827,31 @@ var FECManager = class _FECManager {
1838
1827
  }
1839
1828
  this.#highestSbn.set(streamKey, { sbn, atMs: now });
1840
1829
  anchorHere();
1841
- if (this.#isIso(packetId)) return;
1842
- if (missing <= 0 || window === null) return;
1843
- let vanished = previous.sbn;
1844
- for (let i = 0; i < missing; i++) {
1845
- vanished = this.#nextBlock(vanished, packetId);
1846
- this.#materializeBlock(
1847
- vanished,
1848
- packetId,
1849
- catalogTrackName,
1850
- this.#blocksBehind(vanished, sbn, packetId) <= window
1851
- );
1852
- }
1853
1830
  }
1854
1831
  /*
1855
- * Block order for one stream (BLO-35597 iso:5). SS_ID is a 32-bit serial
1856
- * number (ISO/IEC 23008-1 C.5.2), so blocks are ordered by RFC 1982
1857
- * comparison of their first SS_ID (sbn * K mod 2^32). That is identical to
1858
- * comparing SBNs with < for every stream that has not wrapped SS_ID; only
1859
- * the order across the wrap changes. A block outside K-stride geometry has
1860
- * no SS_ID position, so it keeps the SBN order it always had.
1861
- */
1862
- #blockPrecedes(a, b, packetId) {
1863
- if (this.#isIso(packetId)) return serial32Precedes(a, b);
1864
- const k = this.kForPacket(packetId);
1865
- return isKStrideBlock(a, k) && isKStrideBlock(b, k) ? kStrideBlockPrecedes(a, b, k) : a < b;
1866
- }
1867
- /** Blocks `a` lies behind `b` (0 when it does not precede it). */
1868
- #blocksBehind(a, b, packetId) {
1869
- if (this.#isIso(packetId)) return isoBlocksBehindLowerBound(a, b, this.kForPacket(packetId));
1870
- const k = this.kForPacket(packetId);
1871
- return isKStrideBlock(a, k) && isKStrideBlock(b, k) ? kStrideBlocksBehind(a, b, k) : Math.max(0, b - a);
1832
+ * Block order for one stream (BLO-35597 iso:5). A block is keyed by its
1833
+ * SS_Start and SS_ID is a 32-bit serial number (ISO/IEC 23008-1 C.5.2), so
1834
+ * blocks are ordered by RFC 1982 comparison of their starts. Only configured
1835
+ * streams hold blocks: every entry point refuses an unconfigured packetId.
1836
+ */
1837
+ #blockPrecedes(a, b) {
1838
+ return serial32Precedes(a, b);
1872
1839
  }
1873
- /** The block after `sbn`, stepping to block 0 where SS_ID wraps. */
1874
- #nextBlock(sbn, packetId) {
1875
- const k = this.kForPacket(packetId);
1876
- return isKStrideBlock(sbn, k) ? kStrideNextBlock(sbn, k) : sbn + 1;
1840
+ /**
1841
+ * Blocks `a` lies behind `b` (0 when it does not precede it). Blocks vary
1842
+ * in length (K' = SSB_length <= K), so only a lower bound is known: the one
1843
+ * metric the decoder and the worker retire by too.
1844
+ */
1845
+ #blocksBehind(a, b, packetId) {
1846
+ return isoBlocksBehindLowerBound(a, b, this.#trackConfig(packetId).k);
1877
1847
  }
1878
1848
  #materializeBlock(sbn, packetId, catalogTrackName, repairable) {
1879
1849
  const key = this.#blockKey(sbn, packetId, catalogTrackName);
1880
1850
  if (this.#blockResolutionFor(key) !== "untracked") return;
1881
1851
  this.#materializedBlocks.add(key);
1882
- this.#classifierFor(packetId, catalogTrackName).touch(sbn);
1852
+ if (this.#hasCatalogTimingForPacket(packetId)) {
1853
+ this.#classifierFor(packetId, catalogTrackName).touch(sbn);
1854
+ }
1883
1855
  this.onBlockVanished?.(sbn, packetId, catalogTrackName);
1884
1856
  if (repairable) {
1885
1857
  this.noteBlockActivity(sbn, packetId, catalogTrackName, true);
@@ -1918,21 +1890,39 @@ var FECManager = class _FECManager {
1918
1890
  });
1919
1891
  if (this.#lifecycleTrace.length > 64) this.#lifecycleTrace.splice(0, 32);
1920
1892
  }
1921
- #defaultTrackConfig() {
1922
- return {
1923
- k: this.#fecK,
1924
- symbolSize: this.#fecSymbolSize,
1925
- interleaveDepthMs: this.#fecInterleaveDepthMs,
1926
- fps: this.#fecFps,
1927
- timeoutMs: this.#fecTimeoutMs
1928
- };
1893
+ /**
1894
+ * A configured packetId's track config. There is no manager-wide default
1895
+ * (BLO-45953): an unconfigured packetId does no FEC work, so every caller
1896
+ * here is reached only behind a configuration gate and this throw marks a
1897
+ * broken invariant, never a packet-path outcome.
1898
+ */
1899
+ #trackConfig(packetId) {
1900
+ const config = this.#trackConfigs.get(packetId);
1901
+ if (config === void 0) {
1902
+ throw new Error(
1903
+ `[FECManager] packetId=${packetId} was never configured; configure the track from its catalog (configureTrack/setFecWorker/setFecDecoder) first`
1904
+ );
1905
+ }
1906
+ return config;
1929
1907
  }
1930
- #resolveTrackConfig(packetId) {
1931
- return this.#trackConfigs.get(packetId) ?? this.#defaultTrackConfig();
1908
+ /**
1909
+ * Whether this track has the catalog's elapsed-time FEC policy. A zero span
1910
+ * is a deliberate no-deadline signal; it still leaves the wire geometry
1911
+ * usable for in-band decode, but it cannot drive classification, repair
1912
+ * fetches or layer adaptation.
1913
+ */
1914
+ static #hasCatalogTiming(config) {
1915
+ return Number.isSafeInteger(config.interleaveDepthMs) && config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS;
1916
+ }
1917
+ #hasCatalogTimingForPacket(packetId) {
1918
+ const config = this.#trackConfigs.get(packetId);
1919
+ return config !== void 0 && _FECManager.#hasCatalogTiming(config);
1932
1920
  }
1933
1921
  #computeTimeout(config) {
1934
- if (config.timeoutMs && config.timeoutMs > 0) return config.timeoutMs;
1935
- if (config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS) {
1922
+ if (typeof config.timeoutMs === "number" && Number.isFinite(config.timeoutMs) && config.timeoutMs > 0) {
1923
+ return config.timeoutMs;
1924
+ }
1925
+ if (Number.isSafeInteger(config.interleaveDepthMs) && config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS) {
1936
1926
  return Math.max(
1937
1927
  this.#fecTimeoutMs,
1938
1928
  computeFecDeliveryWindowMs({
@@ -1957,14 +1947,17 @@ var FECManager = class _FECManager {
1957
1947
  */
1958
1948
  #refreshDeliveryGapWindow() {
1959
1949
  let windowMs;
1960
- const consider = (geometry) => {
1950
+ const consider = (geometry, packetId) => {
1951
+ if (!this.#hasCatalogTimingForPacket(packetId)) return;
1961
1952
  if (geometry?.trackKind !== "video" || geometry.mode !== "classifying") return;
1962
1953
  const { ticks, timescale } = geometry.keyframeInterval;
1963
1954
  const ms = ticks / timescale * 1e3;
1964
1955
  if (Number.isFinite(ms) && ms > 0 && (windowMs === void 0 || ms > windowMs)) windowMs = ms;
1965
1956
  };
1966
- for (const geometry of this.#streamGeometries.values()) consider(geometry);
1967
- for (const config of this.#trackConfigs.values()) consider(config.geometry);
1957
+ for (const [streamKey, geometry] of this.#streamGeometries) {
1958
+ consider(geometry, this.#parseStreamKey(streamKey).packetId);
1959
+ }
1960
+ for (const [packetId, config] of this.#trackConfigs) consider(config.geometry, packetId);
1968
1961
  this.#deliveryGaps.setWindowMs(windowMs);
1969
1962
  }
1970
1963
  /**
@@ -1992,6 +1985,7 @@ var FECManager = class _FECManager {
1992
1985
  return Math.max(config.timeoutMs, Math.ceil(config.interleaveDepthMs + gapMs));
1993
1986
  }
1994
1987
  #repairDeadlineMs(config, waitMs = this.#multicastWaitMs(config)) {
1988
+ if (!_FECManager.#hasCatalogTiming(config)) return waitMs;
1995
1989
  const halfFailBoundMs = Math.ceil(waitMs / 2);
1996
1990
  if (config.k > 0 && config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS && config.fps !== void 0 && Number.isFinite(config.fps) && config.fps > 0) {
1997
1991
  const mediaUnitMs = 1e3 / config.fps;
@@ -2006,10 +2000,12 @@ var FECManager = class _FECManager {
2006
2000
  }
2007
2001
  /**
2008
2002
  * One block lifetime: the inactivity fail bound plus the D-28 repair grace,
2009
- * at the widest wait the catalog allows (#maxMulticastWaitMs). Everything
2010
- * derived from it (terminal retention, the release gate's hold ceiling, the
2011
- * duplicate ledgers, the owed-cleanup bound) is compared across time, so it
2012
- * must not follow the live measurement.
2003
+ * at the widest wait the catalog allows (#maxMulticastWaitMs). For a track
2004
+ * without a catalog span this is receiver-local cleanup time only; no repair
2005
+ * grace is added. Everything derived from it (terminal retention, the
2006
+ * release gate's hold ceiling, the duplicate ledgers, the owed-cleanup
2007
+ * bound) is compared across time, so it must not follow the live
2008
+ * measurement.
2013
2009
  */
2014
2010
  #blockLifetimeMs(config) {
2015
2011
  const waitMs = this.#maxMulticastWaitMs(config);
@@ -2025,6 +2021,7 @@ var FECManager = class _FECManager {
2025
2021
  return Math.min(waitMs + this.#repairGraceMs(config, waitMs), this.#blockLifetimeMs(config));
2026
2022
  }
2027
2023
  #repairGraceMs(config, waitMs) {
2024
+ if (!_FECManager.#hasCatalogTiming(config)) return 0;
2028
2025
  return Math.max(1, waitMs - this.#repairDeadlineMs(config, waitMs));
2029
2026
  }
2030
2027
  #armBlockTimeout(sbn, packetId, catalogTrackName, delayMs) {
@@ -2111,51 +2108,72 @@ var FECManager = class _FECManager {
2111
2108
  * stream; every other field stays per packetId.
2112
2109
  */
2113
2110
  #upsertTrackConfig(packetId, config, catalogTrackName) {
2114
- const previous = this.#trackConfigs.get(packetId) ?? this.#defaultTrackConfig();
2111
+ const previousTrack = this.#trackConfigs.get(packetId);
2112
+ const k = config.k ?? previousTrack?.k;
2113
+ if (k === void 0 || !Number.isSafeInteger(k) || k <= 0) {
2114
+ throw new Error(
2115
+ `[FECManager] packetId=${packetId}: fec.k=${String(k)} must be a positive integer; configure the track from its catalog`
2116
+ );
2117
+ }
2118
+ const previous = previousTrack ?? {};
2115
2119
  const streamScopedGeometry = catalogTrackName !== void 0 && config.geometry !== void 0 ? config.geometry : void 0;
2116
2120
  if (streamScopedGeometry !== void 0) {
2117
2121
  const { geometry: _streamGeometry, ...packetLevel } = config;
2118
2122
  config = packetLevel;
2119
2123
  }
2120
2124
  const timingChanged = config.k !== void 0 || config.interleaveDepthMs !== void 0 || config.fps !== void 0;
2125
+ if (config.timeoutMs !== void 0 && (!Number.isFinite(config.timeoutMs) || config.timeoutMs < 0)) {
2126
+ throw new Error(
2127
+ `[FECManager] packetId=${packetId}: timeoutMs=${config.timeoutMs} must be a finite non-negative cleanup budget`
2128
+ );
2129
+ }
2121
2130
  if (config.blockProfile !== void 0) {
2122
2131
  parseFecBlockProfile(config.blockProfile, `packetId=${packetId} fec.blockProfile`);
2123
2132
  }
2124
2133
  const blockProfile = config.blockProfile ?? previous.blockProfile;
2125
2134
  if (blockProfile === void 0) {
2126
2135
  throw new Error(
2127
- `[FECManager] packetId=${packetId}: fec.blockProfile is required ("k-padded-v1" or "iso-ssbg1-v1"); configure the track from its catalog`
2136
+ `[FECManager] packetId=${packetId}: fec.blockProfile is required ("iso-ssbg1-v1"); configure the track from its catalog`
2128
2137
  );
2129
2138
  }
2130
- if (blockProfile === "iso-ssbg1-v1") {
2131
- const ownInterleaveDepthMs = config.interleaveDepthMs ?? this.#trackConfigs.get(packetId)?.interleaveDepthMs;
2132
- if (ownInterleaveDepthMs === void 0 || !Number.isFinite(ownInterleaveDepthMs) || ownInterleaveDepthMs < MIN_INTERLEAVE_DEPTH_MS) {
2133
- throw new Error(
2134
- `[FECManager] packetId=${packetId}: iso-ssbg1-v1 requires the catalog fec.interleaveDepthMs (>= ${MIN_INTERLEAVE_DEPTH_MS} ms; got ${String(ownInterleaveDepthMs)}): it bounds how long block location keeps stated blocks and held sources`
2135
- );
2136
- }
2139
+ const ownInterleaveDepthMs = config.interleaveDepthMs ?? previousTrack?.interleaveDepthMs ?? 0;
2140
+ if (!Number.isSafeInteger(ownInterleaveDepthMs) || ownInterleaveDepthMs !== 0 && ownInterleaveDepthMs < MIN_INTERLEAVE_DEPTH_MS) {
2141
+ throw new Error(
2142
+ `[FECManager] packetId=${packetId}: fec.interleaveDepthMs must be absent, 0, or a finite value >= ${MIN_INTERLEAVE_DEPTH_MS} ms (got ${String(ownInterleaveDepthMs)})`
2143
+ );
2137
2144
  }
2145
+ const hasCatalogTiming = _FECManager.#hasCatalogTiming({ interleaveDepthMs: ownInterleaveDepthMs });
2138
2146
  const next = {
2139
2147
  blockProfile,
2140
- k: config.k ?? previous.k,
2141
- symbolSize: config.symbolSize != null && config.symbolSize > 0 ? config.symbolSize : previous.symbolSize,
2142
- interleaveDepthMs: config.interleaveDepthMs ?? previous.interleaveDepthMs,
2143
- fps: config.fps ?? previous.fps,
2144
- timeoutMs: config.timeoutMs ?? (timingChanged ? 0 : previous.timeoutMs),
2148
+ k,
2149
+ symbolSize: config.symbolSize != null && config.symbolSize > 0 ? config.symbolSize : previousTrack?.symbolSize ?? 0,
2150
+ interleaveDepthMs: ownInterleaveDepthMs,
2151
+ fps: config.fps ?? previous.fps ?? this.#fecFps,
2152
+ timeoutMs: config.timeoutMs ?? (timingChanged ? 0 : previous.timeoutMs ?? 0),
2145
2153
  ...(config.trackKind ?? previous.trackKind) === void 0 ? {} : { trackKind: config.trackKind ?? previous.trackKind },
2146
2154
  ...(config.codec ?? previous.codec) === void 0 ? {} : { codec: config.codec ?? previous.codec },
2147
2155
  ...(config.geometry ?? previous.geometry) === void 0 ? {} : { geometry: config.geometry ?? previous.geometry }
2148
2156
  };
2149
- next.timeoutMs = this.#computeTimeout(next);
2157
+ if (!hasCatalogTiming) {
2158
+ next.timeoutMs = config.timeoutMs !== void 0 && config.timeoutMs > 0 ? config.timeoutMs : previousTrack !== void 0 && previousTrack.interleaveDepthMs === 0 ? previousTrack.timeoutMs : LOCAL_FEC_TIMEOUT_MS;
2159
+ } else {
2160
+ next.timeoutMs = this.#computeTimeout(next);
2161
+ }
2150
2162
  if (this.#multicastSymbolDelivery === "ordered-relay") {
2151
2163
  this.#orderedHorizonBlocksFor(packetId, next);
2152
2164
  }
2153
- if (previous.blockProfile !== void 0 && (previous.blockProfile !== blockProfile || blockProfile === "iso-ssbg1-v1" && previous.k !== next.k)) {
2165
+ const timingPolicyChanged = _FECManager.#hasCatalogTiming({ interleaveDepthMs: previous.interleaveDepthMs ?? 0 }) !== hasCatalogTiming;
2166
+ if (timingPolicyChanged && !hasCatalogTiming) {
2167
+ for (const key of [...this.#repairDeadlines.keys()]) {
2168
+ if (this.#belongsToPacket(key, packetId)) this.#clearRepairDeadline(key);
2169
+ }
2170
+ }
2171
+ if (previous.blockProfile !== void 0 && previous.k !== next.k) {
2154
2172
  this.#dropIsoLocators(packetId);
2155
2173
  }
2156
2174
  this.#trackConfigs.set(packetId, next);
2157
2175
  this.#refreshDeliveryGapWindow();
2158
- let policyChanged = config.geometry !== void 0 && JSON.stringify(config.geometry) !== JSON.stringify(previous.geometry) || config.trackKind !== void 0 && config.trackKind !== previous.trackKind;
2176
+ let policyChanged = timingPolicyChanged || config.geometry !== void 0 && JSON.stringify(config.geometry) !== JSON.stringify(previous.geometry) || config.trackKind !== void 0 && config.trackKind !== previous.trackKind;
2159
2177
  if (streamScopedGeometry !== void 0) {
2160
2178
  const streamKey = this.#streamKey(packetId, catalogTrackName);
2161
2179
  if (JSON.stringify(streamScopedGeometry) !== JSON.stringify(this.#streamGeometries.get(streamKey))) {
@@ -2170,20 +2188,14 @@ var FECManager = class _FECManager {
2170
2188
  if (!this.#belongsToPacket(key, packetId)) continue;
2171
2189
  const stream = this.#parseStreamKey(key);
2172
2190
  const geometry = this.#geometryFor(stream.packetId, stream.catalogTrackName);
2173
- if (JSON.stringify(geometry) === JSON.stringify(classifier.geometry)) continue;
2191
+ if (hasCatalogTiming && JSON.stringify(geometry) === JSON.stringify(classifier.geometry)) continue;
2174
2192
  this.#classifiers.delete(key);
2193
+ if (!hasCatalogTiming) continue;
2175
2194
  this.#applyClassifierChanges(stream.packetId, stream.catalogTrackName, classifier.retire());
2176
2195
  }
2177
2196
  }
2178
2197
  return next;
2179
2198
  }
2180
- #normalizeSymbolData(packetId, data) {
2181
- const symbolSize = this.symbolSizeForPacket(packetId);
2182
- if (symbolSize <= 0 || data.byteLength === symbolSize) return data;
2183
- const normalized = new Uint8Array(symbolSize);
2184
- normalized.set(data.subarray(0, symbolSize));
2185
- return normalized;
2186
- }
2187
2199
  #blockKeysFor(sbn, packetId, catalogTrackName) {
2188
2200
  if (packetId != null && catalogTrackName !== void 0) {
2189
2201
  return [this.#blockKey(sbn, packetId, catalogTrackName)];
@@ -2244,7 +2256,7 @@ var FECManager = class _FECManager {
2244
2256
  ...stats,
2245
2257
  packetId,
2246
2258
  blocksComplete: trackTotal,
2247
- k: this.#resolveTrackConfig(packetId).k,
2259
+ k: this.#trackConfigs.get(packetId)?.k,
2248
2260
  recoveryRate: trackAffected > 0 ? stats.blocksRecovered / trackAffected * 100 : 100,
2249
2261
  packetLossRate: trackTotal > 0 ? trackAffected / trackTotal * 100 : 0
2250
2262
  };
@@ -2256,7 +2268,7 @@ var FECManager = class _FECManager {
2256
2268
  (block) => block.multicastSymbols > 0 && block.moqSymbols > 0
2257
2269
  ).length,
2258
2270
  recentBlockPathCounts: Array.from(this.#blockPathCounts.values()).slice(-24),
2259
- k: this.#fecK,
2271
+ k: this.#streamK,
2260
2272
  // True recovery rate: of blocks that HAD loss, how many were recovered?
2261
2273
  recoveryRate: affected > 0 ? s.blocksRecovered / affected * 100 : 100,
2262
2274
  packetLossRate: total > 0 ? affected / total * 100 : 0,
@@ -2551,15 +2563,20 @@ var FECManager = class _FECManager {
2551
2563
  }
2552
2564
  }
2553
2565
  }
2554
- /** Record a transport symbol and reject later duplicates of the same packetId/SBN/ESI. */
2566
+ /**
2567
+ * Record a transport symbol and reject later duplicates of the same
2568
+ * packetId/SBN/ESI. `sbn` is the block's SS_Start. A packetId with no
2569
+ * configured block profile has no block geometry: its symbol is refused
2570
+ * (false) and no block state is created for it.
2571
+ */
2555
2572
  feedSymbolFromSource(packetId, sbn, esi, _data, source, catalogTrackName) {
2573
+ if (!this.#hasBlockProfile(packetId)) return false;
2556
2574
  const blockKey = this.#blockKey(sbn, packetId, catalogTrackName);
2557
2575
  const streamKey = this.#streamKey(packetId, catalogTrackName);
2558
2576
  if (source === "multicast" && this.#multicastSymbolDelivery === "ordered-relay") {
2559
2577
  this.#advanceOrderedFrontier(streamKey, sbn, packetId, catalogTrackName);
2560
2578
  }
2561
- const k = this.kForPacket(packetId);
2562
- const sourceSymbols = this.#isIso(packetId) ? this.#isoLocatorFor(packetId, catalogTrackName).blockAt(sbn)?.length ?? k : k;
2579
+ const sourceSymbols = this.#isoLocatorFor(packetId, catalogTrackName).blockAt(sbn)?.length ?? this.#trackConfig(packetId).k;
2563
2580
  const isSourceSymbol = esi >= 0 && esi < sourceSymbols;
2564
2581
  const isStartupPartial = this.#startupPartialBlocks.has(blockKey);
2565
2582
  const isReadyMulticastRepair = this.#startupRequireRepairReady && source === "multicast" && !isSourceSymbol && this.#startupRepairReadyPackets.has(streamKey);
@@ -2677,14 +2694,14 @@ var FECManager = class _FECManager {
2677
2694
  for (const [key] of this.#activeBlocks) {
2678
2695
  const { packetId, sbn } = this.#parseBlockKey(key);
2679
2696
  const count = this.#blockSourceCounts.get(key) ?? 0;
2680
- const k = this.#blockAuthoredLengths.get(key) ?? this.kForPacket(packetId);
2697
+ const k = this.#blockAuthoredLengths.get(key) ?? this.#trackConfig(packetId).k;
2681
2698
  blocks.push({ sbn, packetId, state: "collecting", sourceCount: count, k, progress: k > 0 ? Math.min(count / k, 1) : 0 });
2682
2699
  }
2683
2700
  const completed = [...this.#completedBlocks].slice(-16);
2684
2701
  for (const key of completed) {
2685
2702
  const { packetId, sbn } = this.#parseBlockKey(key);
2686
2703
  if (!this.#activeBlocks.has(key)) {
2687
- const k = this.kForPacket(packetId);
2704
+ const k = this.#trackConfig(packetId).k;
2688
2705
  blocks.push({ sbn, packetId, state: "complete", sourceCount: k, k, progress: 1 });
2689
2706
  }
2690
2707
  }
@@ -2695,25 +2712,23 @@ var FECManager = class _FECManager {
2695
2712
  get wasmDecoder() {
2696
2713
  return this.#fecDecoders.values().next().value?.client ?? null;
2697
2714
  }
2698
- get k() {
2699
- return this.#fecK;
2700
- }
2715
+ /** A configured packetId's K; undefined for an unconfigured one (no FEC work). */
2701
2716
  kForPacket(packetId) {
2702
- return this.#resolveTrackConfig(packetId).k;
2717
+ return this.#trackConfigs.get(packetId)?.k;
2703
2718
  }
2704
2719
  /** FEC symbol size in bytes. */
2705
2720
  get symbolSize() {
2706
2721
  return this.#fecSymbolSize;
2707
2722
  }
2708
2723
  symbolSizeForPacket(packetId) {
2709
- return this.#resolveTrackConfig(packetId).symbolSize;
2724
+ return this.#trackConfigs.get(packetId)?.symbolSize;
2710
2725
  }
2711
2726
  /** FEC block span in milliseconds (0 = no interleaving). */
2712
2727
  get interleaveDepthMs() {
2713
2728
  return this.#fecInterleaveDepthMs;
2714
2729
  }
2715
2730
  interleaveDepthMsForPacket(packetId) {
2716
- return this.#resolveTrackConfig(packetId).interleaveDepthMs;
2731
+ return this.#trackConfigs.get(packetId)?.interleaveDepthMs;
2717
2732
  }
2718
2733
  /**
2719
2734
  * Record one multicast MMTP packet arrival (every packet of the leg, FEC
@@ -2731,7 +2746,8 @@ var FECManager = class _FECManager {
2731
2746
  * plus the larger of the catalog tolerance and the measured delivery gap.
2732
2747
  */
2733
2748
  timeoutMsForPacket(packetId) {
2734
- return this.#multicastWaitMs(this.#resolveTrackConfig(packetId));
2749
+ const config = this.#trackConfigs.get(packetId);
2750
+ return config === void 0 ? void 0 : this.#multicastWaitMs(config);
2735
2751
  }
2736
2752
  /**
2737
2753
  * Largest multicast delivery gap measured over the current window (ms), and
@@ -2787,27 +2803,31 @@ var FECManager = class _FECManager {
2787
2803
  }
2788
2804
  /** Resolved per-track D-28 repair request deadline in milliseconds. */
2789
2805
  repairDeadlineMsForPacket(packetId) {
2790
- return this.#repairDeadlineMs(this.#resolveTrackConfig(packetId));
2806
+ const config = this.#trackConfigs.get(packetId);
2807
+ return config === void 0 ? void 0 : this.#repairDeadlineMs(config);
2791
2808
  }
2792
2809
  /**
2793
2810
  * One block lifetime: the longest a block stays open after its last symbol
2794
2811
  * (inactivity fail bound plus D-28 repair grace).
2795
2812
  */
2796
2813
  blockLifetimeMsForPacket(packetId) {
2797
- return this.#blockLifetimeMs(this.#resolveTrackConfig(packetId));
2814
+ const config = this.#trackConfigs.get(packetId);
2815
+ return config === void 0 ? void 0 : this.#blockLifetimeMs(config);
2798
2816
  }
2799
2817
  /**
2800
2818
  * How long a terminal (clean, recovered or failed) block stays authoritative,
2801
2819
  * for late symbols and for the in-order release gate. It is also the gate's
2802
2820
  * hold ceiling (MmtpRouter's holdLimitMs): a retired block reads back as
2803
2821
  * untracked, which the gate counts as lost, so no frame may still be waiting
2804
- * on a block that can retire. The window is one interleave depth for a gap's
2805
- * last block to finish arriving, one block lifetime to fail it, and one more
2806
- * for an owed Worker cleanup that can keep a failing block pending. Every
2807
- * term comes from the track's catalog geometry; there is no separate cap.
2822
+ * on a block that can retire. With a positive catalog span the window is one
2823
+ * interleave depth for a gap's last block to finish arriving, one block
2824
+ * lifetime to fail it, and one more for an owed Worker cleanup. With an
2825
+ * absent/zero span it is a receiver-local cleanup bound only; it creates no
2826
+ * catalog FEC deadline.
2808
2827
  */
2809
2828
  terminalRetentionMsForPacket(packetId) {
2810
- const config = this.#resolveTrackConfig(packetId);
2829
+ const config = this.#trackConfigs.get(packetId);
2830
+ if (config === void 0) return void 0;
2811
2831
  return config.interleaveDepthMs + 2 * this.#blockLifetimeMs(config);
2812
2832
  }
2813
2833
  /** Remaining fetch budget for a specific repair-requested block. */
@@ -2818,7 +2838,8 @@ var FECManager = class _FECManager {
2818
2838
  if (deadlineMs !== void 0) {
2819
2839
  return Math.max(1, Math.ceil(deadlineMs - performance.now()));
2820
2840
  }
2821
- const trackConfig = this.#resolveTrackConfig(packetId);
2841
+ const trackConfig = this.#trackConfigs.get(packetId);
2842
+ if (trackConfig === void 0) return void 0;
2822
2843
  return Math.max(1, trackConfig.timeoutMs - this.#repairDeadlineMs(trackConfig));
2823
2844
  }
2824
2845
  /** True once configureTrack/setFecDecoder/setFecWorker configured this packetId. */
@@ -2829,14 +2850,19 @@ var FECManager = class _FECManager {
2829
2850
  blockProfileForPacket(packetId) {
2830
2851
  return this.#trackConfigs.get(packetId)?.blockProfile;
2831
2852
  }
2832
- #isIso(packetId) {
2833
- return this.#trackConfigs.get(packetId)?.blockProfile === "iso-ssbg1-v1";
2853
+ /**
2854
+ * Whether a packetId has a configured block geometry. iso-ssbg1-v1 is the
2855
+ * only profile, so every configured track has it; a packetId never
2856
+ * configured (or released) has none and gets no FEC block tracking.
2857
+ */
2858
+ #hasBlockProfile(packetId) {
2859
+ return this.#trackConfigs.get(packetId)?.blockProfile !== void 0;
2834
2860
  }
2835
2861
  #isoLocatorFor(packetId, catalogTrackName) {
2836
2862
  const streamKey = this.#streamKey(packetId, catalogTrackName);
2837
2863
  let locator = this.#isoLocators.get(streamKey);
2838
2864
  if (!locator) {
2839
- locator = new IsoBlockLocator(this.kForPacket(packetId), this.#isoRetentionBlocks(packetId));
2865
+ locator = new IsoBlockLocator(this.#trackConfig(packetId).k, this.#isoRetentionBlocks(packetId));
2840
2866
  this.#isoLocators.set(streamKey, locator);
2841
2867
  }
2842
2868
  return locator;
@@ -2867,12 +2893,14 @@ var FECManager = class _FECManager {
2867
2893
  */
2868
2894
  #isoRetentionBlocks(packetId) {
2869
2895
  const config = this.#trackConfigs.get(packetId);
2870
- if (config?.blockProfile !== "iso-ssbg1-v1" || !(config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS)) {
2896
+ if (config?.blockProfile === void 0) {
2871
2897
  throw new Error(
2872
- `[FECManager] packetId=${packetId} has no iso-ssbg1-v1 block span to derive block-location retention from`
2898
+ `[FECManager] packetId=${packetId} has no configured iso-ssbg1-v1 block profile`
2873
2899
  );
2874
2900
  }
2875
- const blocks = Math.ceil(this.terminalRetentionMsForPacket(packetId) / config.interleaveDepthMs) + 1;
2901
+ if (!_FECManager.#hasCatalogTiming(config)) return LOCAL_FEC_RETENTION_BLOCKS;
2902
+ const terminalRetentionMs = config.interleaveDepthMs + 2 * this.#blockLifetimeMs(config);
2903
+ const blocks = Math.ceil(terminalRetentionMs / config.interleaveDepthMs) + 1;
2876
2904
  if (!Number.isSafeInteger(blocks) || blocks <= 0) {
2877
2905
  throw new Error(`[FECManager] packetId=${packetId} iso-ssbg1-v1 retention of ${blocks} blocks is not derivable`);
2878
2906
  }
@@ -2880,7 +2908,8 @@ var FECManager = class _FECManager {
2880
2908
  }
2881
2909
  /** Whether an iso-ssbg1-v1 protected packet fits one ssbg_mode1 symbol (len + 2 <= T). */
2882
2910
  isoSourceFits(packetId, packetLength) {
2883
- return ssbg1FitsSymbol(packetLength, this.symbolSizeForPacket(packetId));
2911
+ const symbolSize = this.#trackConfigs.get(packetId)?.symbolSize;
2912
+ return symbolSize !== void 0 && ssbg1FitsSymbol(packetLength, symbolSize);
2884
2913
  }
2885
2914
  /**
2886
2915
  * Locate an iso-ssbg1-v1 source by range membership in a block a repair
@@ -2941,11 +2970,11 @@ var FECManager = class _FECManager {
2941
2970
  * that could hold them is pending or not yet stated by a repair, else the
2942
2971
  * starts of the blocks that failed or vanished.
2943
2972
  *
2944
- * `untracked` reads exactly as in the k-padded-v1 release gate
2945
- * (MmtpRouter #createFecReleaseGate): a block holding either released
2946
- * frame's SS_ID (`fromSsId` or `toSsId`) delivered that frame, so untracked
2947
- * there means it resolved and retired; a block starting after the stream's frontier (`highestSbn`,
2948
- * an SS_Start here) may still be heard from; a block at or behind the
2973
+ * `untracked` reads as the release gate reads it (MmtpRouter
2974
+ * #createFecReleaseGate): a block holding either released frame's SS_ID
2975
+ * (`fromSsId` or `toSsId`) delivered that frame, so untracked there means it
2976
+ * resolved and retired; a block starting after the stream's frontier
2977
+ * (`highestSbn`, an SS_Start) may still be heard from; a block at or behind the
2949
2978
  * frontier that no symbol of this manager ever reached vanished, and its
2950
2979
  * media is lost.
2951
2980
  */
@@ -3013,6 +3042,7 @@ var FECManager = class _FECManager {
3013
3042
  }
3014
3043
  /** Current classifier mode of a stream. */
3015
3044
  classifierModeFor(packetId, catalogTrackName) {
3045
+ if (!this.#hasCatalogTimingForPacket(packetId)) return { mode: "all-protected", reason: null };
3016
3046
  const classifier = this.#classifierFor(packetId, catalogTrackName);
3017
3047
  return { mode: classifier.mode, reason: classifier.reason };
3018
3048
  }
@@ -3022,10 +3052,12 @@ var FECManager = class _FECManager {
3022
3052
  * it does not. A stream with no classifier yet has shown nothing against it.
3023
3053
  */
3024
3054
  mpuBoundsRapsFor(packetId, catalogTrackName) {
3055
+ if (!this.#hasCatalogTimingForPacket(packetId)) return false;
3025
3056
  return this.#classifiers.get(this.#streamKey(packetId, catalogTrackName))?.mpuBoundsRaps ?? true;
3026
3057
  }
3027
3058
  /** A block's class now, or frozen at its resolution. */
3028
3059
  blockClassFor(sbn, packetId, catalogTrackName) {
3060
+ if (!this.#hasCatalogTimingForPacket(packetId)) return "unknown";
3029
3061
  const frozen = this.#resolvedBlockClasses.get(this.#blockKey(sbn, packetId, catalogTrackName));
3030
3062
  if (frozen !== void 0) return frozen;
3031
3063
  return this.#peekClass(sbn, packetId, catalogTrackName);
@@ -3047,7 +3079,7 @@ var FECManager = class _FECManager {
3047
3079
  * invariant (consecutive MPUs exactly one keyframe interval apart).
3048
3080
  */
3049
3081
  noteReleasedRap(packetId, catalogTrackName, mpu, presentationTime, mediaTimescale) {
3050
- if (!this.#trackConfigs.has(packetId)) return;
3082
+ if (!this.#trackConfigs.has(packetId) || !this.#hasCatalogTimingForPacket(packetId)) return;
3051
3083
  this.#applyClassifierChanges(
3052
3084
  packetId,
3053
3085
  catalogTrackName,
@@ -3063,27 +3095,34 @@ var FECManager = class _FECManager {
3063
3095
  // -----------------------------------------------------------------------
3064
3096
  /** Configure FEC parameters. */
3065
3097
  configure(config) {
3066
- if (config.k != null) this.#fecK = config.k;
3098
+ if (config.interleaveDepthMs != null && (!Number.isSafeInteger(config.interleaveDepthMs) || config.interleaveDepthMs < 0)) {
3099
+ throw new Error(
3100
+ `[FECManager] interleaveDepthMs=${config.interleaveDepthMs} must be a non-negative safe integer in milliseconds`
3101
+ );
3102
+ }
3103
+ if (config.timeoutMs != null && (!Number.isFinite(config.timeoutMs) || config.timeoutMs < 0)) {
3104
+ throw new Error(
3105
+ `[FECManager] timeoutMs=${config.timeoutMs} must be a finite non-negative cleanup budget`
3106
+ );
3107
+ }
3108
+ if (config.k != null && (!Number.isSafeInteger(config.k) || config.k <= 0)) {
3109
+ throw new Error(`[FECManager] k=${config.k} must be a positive integer`);
3110
+ }
3111
+ if (config.k != null) this.#streamK = config.k;
3067
3112
  if (config.symbolSize != null && config.symbolSize > 0) this.#fecSymbolSize = config.symbolSize;
3068
3113
  if (config.interleaveDepthMs != null) this.#fecInterleaveDepthMs = config.interleaveDepthMs;
3069
3114
  if (config.fps != null && Number.isFinite(config.fps) && config.fps > 0) {
3070
3115
  this.#fecFps = config.fps;
3071
3116
  }
3072
- if (config.interleaveDepthMs != null && config.interleaveDepthMs > 0 && config.interleaveDepthMs < MIN_INTERLEAVE_DEPTH_MS) {
3073
- console.warn(`[FECManager] interleaveDepthMs=${config.interleaveDepthMs} looks like frame count, not milliseconds (\xA75.1 requires ms). Expected range: ${MIN_INTERLEAVE_DEPTH_MS}-10000ms.`);
3074
- }
3075
3117
  if (config.timeoutMs != null && config.timeoutMs > 0) {
3076
3118
  this.#fecTimeoutMs = config.timeoutMs;
3077
- } else if (config.interleaveDepthMs != null && config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS) {
3078
- this.#fecTimeoutMs = computeFecDeliveryWindowMs({
3079
- interleaveDepthMs: config.interleaveDepthMs,
3080
- sourceSymbols: this.#fecK,
3081
- symbolSize: this.#fecSymbolSize,
3082
- mediaUnitsPerSecond: config.fps
3083
- });
3119
+ } else if (config.interleaveDepthMs === 0) {
3120
+ this.#fecTimeoutMs = LOCAL_FEC_TIMEOUT_MS;
3121
+ } else if (config.interleaveDepthMs != null && Number.isSafeInteger(config.interleaveDepthMs) && config.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS) {
3122
+ this.#fecTimeoutMs = fecSpanDeliveryWindowMs(config.interleaveDepthMs);
3084
3123
  }
3085
3124
  for (const [packetId, track] of this.#trackConfigs) {
3086
- if (track.timeoutMs < this.#fecTimeoutMs) {
3125
+ if (_FECManager.#hasCatalogTiming(track) && track.timeoutMs < this.#fecTimeoutMs) {
3087
3126
  this.#trackConfigs.set(packetId, { ...track, timeoutMs: this.#fecTimeoutMs });
3088
3127
  }
3089
3128
  }
@@ -3142,7 +3181,7 @@ var FECManager = class _FECManager {
3142
3181
  );
3143
3182
  }
3144
3183
  if (config) this.#upsertTrackConfig(packetId, config, catalogTrackName);
3145
- const workerK = this.#resolveTrackConfig(packetId).k;
3184
+ const workerK = this.#trackConfig(packetId).k;
3146
3185
  this.#workerClients.set(streamKey, client);
3147
3186
  this.#releasedWorkerClients.delete(client);
3148
3187
  client.onFrame((data, meta) => {
@@ -3322,7 +3361,7 @@ var FECManager = class _FECManager {
3322
3361
  return;
3323
3362
  }
3324
3363
  this.#settleOwedCleanup(key, "cleanup-ack-timeout");
3325
- }, Math.ceil(this.#liveBlockLifetimeMs(this.#resolveTrackConfig(packetId))))
3364
+ }, Math.ceil(this.#liveBlockLifetimeMs(this.#trackConfig(packetId))))
3326
3365
  };
3327
3366
  this.#pendingWorkerCleanupBounds.set(key, bound);
3328
3367
  }
@@ -3363,16 +3402,11 @@ var FECManager = class _FECManager {
3363
3402
  if (this.#fpsDetected || fps <= 0) return;
3364
3403
  this.#fpsDetected = true;
3365
3404
  this.#fecFps = fps;
3366
- if (this.#fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS) {
3367
- this.#fecTimeoutMs = computeFecDeliveryWindowMs({
3368
- interleaveDepthMs: this.#fecInterleaveDepthMs,
3369
- sourceSymbols: this.#fecK,
3370
- symbolSize: this.#fecSymbolSize,
3371
- mediaUnitsPerSecond: fps
3372
- });
3405
+ if (Number.isSafeInteger(this.#fecInterleaveDepthMs) && this.#fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS) {
3406
+ this.#fecTimeoutMs = fecSpanDeliveryWindowMs(this.#fecInterleaveDepthMs);
3373
3407
  }
3374
3408
  for (const [packetId, config] of this.#trackConfigs) {
3375
- if (config.fps !== void 0 || config.interleaveDepthMs < MIN_INTERLEAVE_DEPTH_MS) continue;
3409
+ if (config.fps !== void 0 || !Number.isSafeInteger(config.interleaveDepthMs) || config.interleaveDepthMs < MIN_INTERLEAVE_DEPTH_MS) continue;
3376
3410
  this.#trackConfigs.set(packetId, {
3377
3411
  ...config,
3378
3412
  fps,
@@ -3404,35 +3438,28 @@ var FECManager = class _FECManager {
3404
3438
  feedSourceSymbol(packetId, ssId, symbolData, alta, catalogTrackName) {
3405
3439
  this.#fecStats.sourcePackets++;
3406
3440
  this.#statsForPacket(packetId).sourcePackets++;
3407
- let sbn;
3408
- let fecData;
3409
- if (this.#isIso(packetId)) {
3410
- const locator = this.#isoLocatorFor(packetId, catalogTrackName);
3411
- const located = locator.locate(ssId);
3412
- if (located === null) {
3413
- throw new Error(
3414
- `[FECManager] iso-ssbg1-v1 source SS_ID=${ssId} (packetId=${packetId}) has no stated block; hold it until a repair places it (placeIsoRepair)`
3415
- );
3416
- }
3417
- locator.observe(ssId);
3418
- if (!ssbg1FitsSymbol(symbolData.byteLength, this.symbolSizeForPacket(packetId))) {
3419
- this.#isoSourceOversizeCount++;
3420
- return null;
3421
- }
3422
- sbn = located.block.start;
3423
- fecData = symbolData;
3424
- } else {
3425
- fecData = this.#normalizeSymbolData(packetId, symbolData);
3426
- sbn = Math.floor(ssId / this.kForPacket(packetId));
3441
+ if (!this.#hasBlockProfile(packetId)) return null;
3442
+ const locator = this.#isoLocatorFor(packetId, catalogTrackName);
3443
+ const located = locator.locate(ssId);
3444
+ if (located === null) {
3445
+ throw new Error(
3446
+ `[FECManager] iso-ssbg1-v1 source SS_ID=${ssId} (packetId=${packetId}) has no stated block; hold it until a repair places it (placeIsoRepair)`
3447
+ );
3448
+ }
3449
+ locator.observe(ssId);
3450
+ if (!ssbg1FitsSymbol(symbolData.byteLength, this.#trackConfig(packetId).symbolSize)) {
3451
+ this.#isoSourceOversizeCount++;
3452
+ return null;
3427
3453
  }
3454
+ const sbn = located.block.start;
3428
3455
  const blockKey = this.#blockKey(sbn, packetId, catalogTrackName);
3429
3456
  const syncBlockOwner = this.#syncDecoderBlockOwners.get(blockKey);
3430
3457
  const workerClient = this.#routableWorkerForPacket(packetId, catalogTrackName);
3431
3458
  if (workerClient && !syncBlockOwner) {
3432
3459
  if (!this.#claimDecoderBlock(workerClient, sbn, catalogTrackName)) return null;
3433
- const buf = fecData !== symbolData ? fecData.buffer : fecData.buffer.slice(
3434
- fecData.byteOffset,
3435
- fecData.byteOffset + fecData.byteLength
3460
+ const buf = symbolData.buffer.slice(
3461
+ symbolData.byteOffset,
3462
+ symbolData.byteOffset + symbolData.byteLength
3436
3463
  );
3437
3464
  if (alta) {
3438
3465
  const authBuf = alta.auth.buffer.slice(
@@ -3455,7 +3482,7 @@ var FECManager = class _FECManager {
3455
3482
  this.#syncDecoderBlockOwners.set(blockKey, client);
3456
3483
  let recovered = null;
3457
3484
  try {
3458
- recovered = client.add_source(ssId, fecData, performance.now());
3485
+ recovered = client.add_source(ssId, symbolData, performance.now());
3459
3486
  } catch {
3460
3487
  }
3461
3488
  this.#retireIsoUnplaced(client, packetId, catalogTrackName);
@@ -3474,7 +3501,8 @@ var FECManager = class _FECManager {
3474
3501
  feedRepairSymbol(packetId, ssStart, ssbLength, rsId, repairData, catalogTrackName) {
3475
3502
  this.#fecStats.repairPackets++;
3476
3503
  this.#statsForPacket(packetId).repairPackets++;
3477
- const symbolSize = this.symbolSizeForPacket(packetId);
3504
+ if (!this.#hasBlockProfile(packetId)) return null;
3505
+ const symbolSize = this.#trackConfig(packetId).symbolSize;
3478
3506
  if (symbolSize > 0 && repairData.byteLength !== symbolSize) {
3479
3507
  this.#repairSymbolSizeMismatchCount++;
3480
3508
  if (this.#repairSymbolSizeMismatchCount <= 5 || this.#repairSymbolSizeMismatchCount % 100 === 0) {
@@ -3485,18 +3513,12 @@ var FECManager = class _FECManager {
3485
3513
  return null;
3486
3514
  }
3487
3515
  const fecData = repairData;
3488
- const k = this.kForPacket(packetId);
3489
- let sbn;
3490
- if (this.#isIso(packetId)) {
3491
- const block = this.#isoLocatorFor(packetId, catalogTrackName).blockAt(ssStart);
3492
- if (ssbLength <= 0 || ssbLength > k || block === void 0 || block.span || block.length !== ssbLength) {
3493
- return null;
3494
- }
3495
- sbn = ssStart;
3496
- } else {
3497
- if (ssbLength <= 0 || ssbLength > k || ssStart % k !== 0) return null;
3498
- sbn = Math.floor(ssStart / k);
3516
+ const k = this.#trackConfig(packetId).k;
3517
+ const block = this.#isoLocatorFor(packetId, catalogTrackName).blockAt(ssStart);
3518
+ if (ssbLength <= 0 || ssbLength > k || block === void 0 || block.span || block.length !== ssbLength) {
3519
+ return null;
3499
3520
  }
3521
+ const sbn = ssStart;
3500
3522
  this.#noteSbnSeen(sbn, packetId, catalogTrackName, "repair");
3501
3523
  this.noteBlockActivity(sbn, packetId, catalogTrackName);
3502
3524
  const blockKey = this.#blockKey(sbn, packetId, catalogTrackName);
@@ -3534,8 +3556,9 @@ var FECManager = class _FECManager {
3534
3556
  * Record a block's authored SSB_length from a repair symbol. Returns false,
3535
3557
  * leaving the block unchanged, when the symbol contradicts the block: a
3536
3558
  * different SSB_length than an earlier repair symbol declared is dropped,
3537
- * and an SSB_length that places an already-received source ESI inside the
3538
- * zero padding fails the block, since its geometry can no longer be trusted.
3559
+ * and an SSB_length that places an already-received source ESI at or past
3560
+ * the block's end fails the block, since its geometry can no longer be
3561
+ * trusted.
3539
3562
  */
3540
3563
  #noteAuthoredLength(blockKey, sbn, packetId, ssbLength, catalogTrackName) {
3541
3564
  const known = this.#blockAuthoredLengths.get(blockKey);
@@ -3602,7 +3625,7 @@ var FECManager = class _FECManager {
3602
3625
  * a sweep tied to expiry alone would never run there.
3603
3626
  */
3604
3627
  #retireIsoUnplaced(decoder, packetId, catalogTrackName) {
3605
- if (!this.#isIso(packetId)) return;
3628
+ if (!this.#hasBlockProfile(packetId)) return;
3606
3629
  const newest = this.#isoLocators.get(this.#streamKey(packetId, catalogTrackName))?.newest;
3607
3630
  if (newest === void 0) return;
3608
3631
  try {
@@ -3647,11 +3670,13 @@ var FECManager = class _FECManager {
3647
3670
  this.#failBlock(sbn, packetId, catalogTrackName);
3648
3671
  return;
3649
3672
  }
3650
- this.#applyClassifierChanges(
3651
- packetId,
3652
- catalogTrackName,
3653
- this.#classifierFor(packetId, catalogTrackName).observe(sbn, evidence)
3654
- );
3673
+ if (_FECManager.#hasCatalogTiming(trackConfig)) {
3674
+ this.#applyClassifierChanges(
3675
+ packetId,
3676
+ catalogTrackName,
3677
+ this.#classifierFor(packetId, catalogTrackName).observe(sbn, evidence)
3678
+ );
3679
+ }
3655
3680
  const count = (this.#blockSourceCounts.get(key) ?? 0) + 1;
3656
3681
  this.#blockSourceCounts.set(key, count);
3657
3682
  if (count === 1) this.#indexBlockKey(key, sbn, packetId);
@@ -3695,6 +3720,7 @@ var FECManager = class _FECManager {
3695
3720
  }
3696
3721
  /** Refresh deadlines after accepted block activity. */
3697
3722
  noteBlockActivity(sbn, packetId, catalogTrackName, sourceProgress = false) {
3723
+ if (!this.#trackConfigs.has(packetId)) return;
3698
3724
  const key = this.#blockKey(sbn, packetId, catalogTrackName);
3699
3725
  if (this.#completedBlocks.has(key)) return;
3700
3726
  if (this.#pendingWorkerCleanups.has(key)) return;
@@ -3704,13 +3730,13 @@ var FECManager = class _FECManager {
3704
3730
  this.#holdForOrderedSettlement(key, sbn, packetId, catalogTrackName);
3705
3731
  return;
3706
3732
  }
3707
- const trackConfig = this.#resolveTrackConfig(packetId);
3733
+ const trackConfig = this.#trackConfig(packetId);
3708
3734
  const timeoutMs = this.#multicastWaitMs(trackConfig);
3709
3735
  if (!(timeoutMs > 0)) {
3710
3736
  throw new Error(`[FECManager] packetId=${packetId} has no positive fail bound (timeoutMs=${timeoutMs})`);
3711
3737
  }
3712
3738
  const repairDeadline = this.#repairDeadlines.get(key);
3713
- if (this.onRepairNeeded && !repairRequested && (repairDeadline === void 0 || sourceProgress)) {
3739
+ if (this.#hasCatalogTimingForPacket(packetId) && this.onRepairNeeded && !repairRequested && (repairDeadline === void 0 || sourceProgress)) {
3714
3740
  this.#armRepairDeadline(
3715
3741
  key,
3716
3742
  sbn,
@@ -3780,6 +3806,7 @@ var FECManager = class _FECManager {
3780
3806
  }
3781
3807
  /** Mark a block as completed externally (e.g., after routing recovered data). */
3782
3808
  markBlockCompleted(sbn, packetId, catalogTrackName) {
3809
+ if (packetId != null && !this.#trackConfigs.has(packetId)) return;
3783
3810
  for (const key of this.#blockKeysFor(sbn, packetId, catalogTrackName)) {
3784
3811
  this.#resolveCompleted(key);
3785
3812
  }