@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
package/src/fec-state.ts CHANGED
@@ -15,20 +15,8 @@
15
15
 
16
16
  import { isFecBlockProfile } from '@blockcast/mmt-base'
17
17
 
18
- /**
19
- * Minimum valid FEC interleave depth in milliseconds, per spec §5.1
20
- * (the interactive/gaming floor; broadcast/ATSC 3.0 ranges up to 10000ms).
21
- *
22
- * A protocol constant, NOT a tuning knob. Values below this floor are almost
23
- * certainly a raw frame count (e.g. `2`) that a caller passed when no framerate
24
- * was available to convert to ms (common on audio tracks). Feeding such a value
25
- * into computeFecTimeout treats it as `2ms`, yielding a near-zero FEC block
26
- * timeout that abandons startup FEC blocks before their repair symbols arrive
27
- * (measured: moqtail startupFailed=4, shaka dropped=5.8% on startup). Timing
28
- * derivations MUST reject sub-floor values and fall back to the established
29
- * timeout instead of collapsing.
30
- */
31
- export const MIN_INTERLEAVE_DEPTH_MS = 33
18
+ /** Smallest positive catalog elapsed span; zero/absence means no elapsed deadline. */
19
+ export const MIN_INTERLEAVE_DEPTH_MS = 1
32
20
 
33
21
  /** Why FEC is not protecting this session. */
34
22
  export type FecInactiveReason = 'no-catalog-fec' | 'reliable-moq' | 'no-multicast-bridge'
@@ -112,8 +100,10 @@ function isPositiveSafeInteger(value: unknown): boolean {
112
100
  * Whether one catalog `fec` block (a hang rendition's `fec` or an MSF/CMSF
113
101
  * track's `fec`) declares an FEC instance a receiver can configure: source
114
102
  * symbols per block (K) and a symbol size (T) are both positive integers, the
115
- * algorithm is not `none`, and `blockProfile` names a known block profile
116
- * (BLO-35597). Total: it never throws, and answers false for any other value.
103
+ * algorithm is not `none`, `blockProfile` names the implemented profile
104
+ * `iso-ssbg1-v1` (BLO-35597), and the block carries that profile's usable
105
+ * span field (`isoBlockSpanUsable`); zero/absence still permits in-band FEC. Total: it never throws, and answers false for
106
+ * any other value.
117
107
  *
118
108
  * `resolveCatalogTrackFec` reads this predicate, so the players' parameters and
119
109
  * this state never disagree. Of the blocks this rejects, it returns no FEC
@@ -127,14 +117,18 @@ function isPositiveSafeInteger(value: unknown): boolean {
127
117
  * the track's repair subscription.
128
118
  *
129
119
  * The block profile is part of this predicate because the profile selects the
130
- * block math and is never defaulted: without a known one no receiver can
131
- * configure the instance. `resolveCatalogTrackFec` resolves such a track to no
132
- * FEC with a typed `fecUnavailable` reason (`track_fec_block_profile`), scoped
133
- * to that track, so its parameters and this state still agree. The CMSF
134
- * conformance validator (`validateCmsfMmtpCatalog`) still rejects the catalog
135
- * with `track_fec_block_profile`. An `iso-ssbg1-v1` instance without a usable
136
- * block span (`isoBlockSpanUsable`) is likewise no FEC for its track alone,
137
- * with `fecUnavailable` code `track_fec` on its `interleaveDepthMs`.
120
+ * block math and is never defaulted: draft-ramadan-moq-fec §5.1 defines one,
121
+ * `iso-ssbg1-v1`, and a receiver MUST NOT apply FEC under any other token. The
122
+ * retired `k-padded-v1` is simply not a known profile. `resolveCatalogTrackFec`
123
+ * and `MulticastManager.configureMultiTrack` resolve such a track to no FEC
124
+ * with a typed `TrackFecUnavailable` reason (`catalogFecUnavailable`: code
125
+ * `track_fec_block_profile_unimplemented` for an unimplemented token,
126
+ * `track_fec_block_profile` for an absent one), scoped to that track, so their
127
+ * parameters and this state still agree. The CMSF conformance validator
128
+ * (`validateCmsfMmtpCatalog`) rejects the catalog with the same code. An
129
+ * `iso-ssbg1-v1` instance with an invalid span is likewise unavailable for its
130
+ * track alone. Zero or absence supplies no elapsed deadline and uses bounded
131
+ * receiver-local state while decoding in-band FEC.
138
132
  *
139
133
  * The repair-contract resolvers (`resolveRepairLayers`) gate a `depends` target
140
134
  * on `algorithm` alone and never read a source's `symbolSize`. They check its
@@ -153,18 +147,12 @@ export function catalogDeclaresFec(fec: unknown): boolean {
153
147
  )
154
148
  }
155
149
 
156
- /**
157
- * Whether a `fec` block that names `iso-ssbg1-v1` carries the block span its
158
- * block location is bounded by: `interleaveDepthMs`, a finite number of
159
- * milliseconds no smaller than `MIN_INTERLEAVE_DEPTH_MS`. Without it a receiver
160
- * cannot bound the sources it holds before a repair states their block, so the
161
- * instance cannot be configured (BLO-35597). Any other block needs no span here.
162
- */
150
+ /** Validate the optional elapsed span without requiring one for in-band FEC. */
163
151
  export function isoBlockSpanUsable(fec: unknown): boolean {
164
152
  const block = recordOf(fec)
165
153
  if (block === undefined || block['blockProfile'] !== 'iso-ssbg1-v1') return true
166
154
  const ms = block['interleaveDepthMs']
167
- return typeof ms === 'number' && Number.isFinite(ms) && ms >= MIN_INTERLEAVE_DEPTH_MS
155
+ return ms === undefined || (typeof ms === 'number' && Number.isSafeInteger(ms) && ms >= 0)
168
156
  }
169
157
 
170
158
  function requireBoolean(value: unknown, field: string): boolean {
@@ -16,7 +16,11 @@
16
16
  import { parseFecBlockProfile, type FecBlockProfile } from '@blockcast/mmt-base'
17
17
  import type { FecWorkerClient, FecTrackConfig } from '@blockcast/fec-worker'
18
18
  import type { MulticastManager } from './multicast-manager.js'
19
- import { deriveFecRetentionBlocks } from '@blockcast/mmt-fec'
19
+ import {
20
+ deriveFecRetentionBlocks,
21
+ LOCAL_FEC_RETENTION_BLOCKS,
22
+ LOCAL_FEC_TIMEOUT_MS,
23
+ } from '@blockcast/mmt-fec'
20
24
  import { computeFecDeliveryWindowMs } from './track-session.js'
21
25
 
22
26
  /** Asset URLs the helper needs. Callers pass the already-resolved set. */
@@ -39,11 +43,17 @@ export interface FecWorkerSetupOptions {
39
43
  /** Track type from catalog. Never inferred from name. */
40
44
  trackType: 'video' | 'audio'
41
45
  /**
42
- * The catalog `fec.blockProfile` (BLO-35597). Required: `k-padded-v1` or
43
- * `iso-ssbg1-v1`; never defaulted, never inferred.
46
+ * The catalog `fec.blockProfile` (BLO-35597). Required and validated with
47
+ * `parseFecBlockProfile`: `iso-ssbg1-v1` is the only FEC block profile, and
48
+ * any other token (the retired `k-padded-v1` included) throws before a
49
+ * Worker is created. Never defaulted, never inferred.
44
50
  */
45
51
  fecBlockProfile: FecBlockProfile
46
- /** FEC K from catalog (source symbols per block). Under iso-ssbg1-v1 the maximum SSB_length. */
52
+ /**
53
+ * FEC K from catalog: the maximum SSB_length (K_max) of any block. Blocks
54
+ * are variable-length ssbg_mode1 blocks keyed by SS_Start, so K bounds
55
+ * block distance from below; it never strides SS_IDs into blocks.
56
+ */
47
57
  fecK: number
48
58
  /** Symbol size in bytes (T) — the ALTA-adjusted value if ALTA is signed. */
49
59
  fecSymbolSize: number
@@ -57,12 +67,16 @@ export interface FecWorkerSetupOptions {
57
67
  * `fecRepairCount`, which is the same value on a single-layer track.
58
68
  */
59
69
  joinedRepairCount?: number
60
- /** Interleave depth in ms. */
70
+ /** Catalog interleave span in integer milliseconds; zero means no span. */
61
71
  fecInterleaveMs: number
62
72
  /** Explicit catalog jitter/reorder allowance in ms. */
63
73
  fecReorderToleranceMs?: number
64
- /** Duration of one FEC media unit in ms (video frame or audio access unit). */
65
- mediaUnitDurationMs: number
74
+ /**
75
+ * Duration of one FEC media unit in ms (video frame or audio access unit).
76
+ * Required only when the catalog supplies a positive elapsed FEC span. A
77
+ * missing/zero span must not invent a media cadence for its local bound.
78
+ */
79
+ mediaUnitDurationMs?: number
66
80
  /** Optional repair track name (MoQ). Forwarded to FecTrackConfig. */
67
81
  repairTrackName?: string
68
82
  /** Audio sample rate (optional — audio tracks only). */
@@ -100,50 +114,98 @@ export interface FecWorkerSetupResult {
100
114
  export async function setupFecWorkerForTrack(
101
115
  opts: FecWorkerSetupOptions,
102
116
  ): Promise<FecWorkerSetupResult> {
103
- // These two were previously validated as a side effect of calling
104
- // deriveFecInterleaveDepth() here. That call is gone (see below), so the
105
- // guards are explicit — a zero or non-finite span/media-unit must still fail
106
- // closed rather than size a window from a hardcoded depth.
107
- //
108
- // `mediaUnitDurationMs` no longer influences the retention this function
109
- // computes: it survives only as `mediaUnitsPerSecond`, which
110
- // `computeFecDeliveryWindowMs` (track-session.ts) documents as geometry
111
- // accepted for existing callers and deliberately not fed to deadline math.
112
- // The guard stays anyway — this is a trust boundary for a catalog-supplied
113
- // value, and the test `rejects missing media-unit timing instead of using a
114
- // hardcoded depth` pins it. Not dead code. Cite both by symbol, not by line:
115
- // a line number here is invalidated by the next edit to the file it points
116
- // at, and this comment is the guard's only stated defence.
117
- if (!Number.isFinite(opts.fecInterleaveMs) || opts.fecInterleaveMs <= 0) {
118
- // Names the catalog field (`fec.interleaveDepthMs`), not the local option
119
- // (`opts.fecInterleaveMs`), because that is the knob an operator fixes.
117
+ // A zero span is the catalog's no-deadline signal. It still configures the
118
+ // decoder, but its retention and cleanup values are receiver-local. Do not
119
+ // pass it through a timing derivation: that would turn a missing media
120
+ // cadence into a made-up FEC deadline.
121
+ if (
122
+ !Number.isFinite(opts.fecInterleaveMs) ||
123
+ !Number.isSafeInteger(opts.fecInterleaveMs) ||
124
+ opts.fecInterleaveMs < 0
125
+ ) {
120
126
  throw new Error(
121
- `[FEC] interleaveDepthMs (opts.fecInterleaveMs) must be finite and > 0 ` +
127
+ `[FEC] interleaveDepthMs (opts.fecInterleaveMs) must be a finite non-negative integer ` +
122
128
  `(got ${opts.fecInterleaveMs})`,
123
129
  )
124
130
  }
125
- if (!Number.isFinite(opts.mediaUnitDurationMs) || opts.mediaUnitDurationMs <= 0) {
131
+ if (
132
+ opts.fecReorderToleranceMs !== undefined &&
133
+ (!Number.isFinite(opts.fecReorderToleranceMs) || opts.fecReorderToleranceMs < 0)
134
+ ) {
126
135
  throw new Error(
127
- `[FEC] mediaUnitDurationMs must be finite and > 0 (got ${opts.mediaUnitDurationMs})`,
136
+ `[FEC] fecReorderToleranceMs must be finite and >= 0 ` +
137
+ `(got ${opts.fecReorderToleranceMs})`,
138
+ )
139
+ }
140
+ const hasCatalogTiming = opts.fecInterleaveMs > 0
141
+ const validateWorkerGeometry = (): void => {
142
+ // `computeFecDeliveryWindowMs` used to reject a malformed K as a side
143
+ // effect. The no-span path intentionally skips that timing derivation, so
144
+ // keep decoder geometry validation at this trust boundary before creating
145
+ // a Worker. T is likewise checked here because the Worker receives it
146
+ // through the asynchronous configure message.
147
+ if (!Number.isSafeInteger(opts.fecK) || opts.fecK <= 0) {
148
+ throw new Error(`[FEC] fecK must be a finite positive integer (got ${opts.fecK})`)
149
+ }
150
+ if (
151
+ !Number.isSafeInteger(opts.fecSymbolSize) ||
152
+ opts.fecSymbolSize <= 0 ||
153
+ opts.fecSymbolSize % 8 !== 0
154
+ ) {
155
+ throw new Error(
156
+ `[FEC] fecSymbolSize must be a positive 8-byte-aligned integer (got ${opts.fecSymbolSize})`,
157
+ )
158
+ }
159
+ if (!Number.isSafeInteger(opts.fecRepairCount) || opts.fecRepairCount <= 0) {
160
+ throw new Error(
161
+ `[FEC] fecRepairCount must be a finite positive integer (got ${opts.fecRepairCount})`,
162
+ )
163
+ }
164
+ }
165
+ let deliveryWindowMs: number
166
+ let interleaveDepthBlocks: number
167
+ if (!hasCatalogTiming) {
168
+ validateWorkerGeometry()
169
+ deliveryWindowMs = LOCAL_FEC_TIMEOUT_MS
170
+ interleaveDepthBlocks = LOCAL_FEC_RETENTION_BLOCKS
171
+ } else {
172
+ const mediaUnitDurationMs = opts.mediaUnitDurationMs
173
+ if (
174
+ typeof mediaUnitDurationMs !== 'number' ||
175
+ !Number.isFinite(mediaUnitDurationMs) ||
176
+ mediaUnitDurationMs <= 0
177
+ ) {
178
+ throw new Error(
179
+ `[FEC] mediaUnitDurationMs must be finite and > 0 (got ${mediaUnitDurationMs})`,
180
+ )
181
+ }
182
+ validateWorkerGeometry()
183
+ deliveryWindowMs = computeFecDeliveryWindowMs({
184
+ interleaveDepthMs: opts.fecInterleaveMs,
185
+ sourceSymbols: opts.fecK,
186
+ repairSymbols: opts.fecRepairCount,
187
+ symbolSize: opts.fecSymbolSize,
188
+ mediaUnitsPerSecond: 1000 / mediaUnitDurationMs,
189
+ jitterBufferMs: opts.fecReorderToleranceMs,
190
+ })
191
+ // `interleaveDepth` is a decoder block count. It is derived only for a
192
+ // positive catalog span; no-span uses the fixed local count above.
193
+ interleaveDepthBlocks = deriveFecRetentionBlocks(
194
+ deliveryWindowMs,
195
+ opts.fecInterleaveMs,
128
196
  )
129
197
  }
130
198
  const blockProfile = parseFecBlockProfile(
131
199
  opts.fecBlockProfile,
132
200
  `[FEC] ${opts.trackName} fec.blockProfile`,
133
201
  )
134
- const deliveryWindowMs = computeFecDeliveryWindowMs({
135
- interleaveDepthMs: opts.fecInterleaveMs,
136
- sourceSymbols: opts.fecK,
137
- repairSymbols: opts.fecRepairCount,
138
- symbolSize: opts.fecSymbolSize,
139
- mediaUnitsPerSecond: 1000 / opts.mediaUnitDurationMs,
140
- jitterBufferMs: opts.fecReorderToleranceMs,
141
- })
142
202
  // `FecTrackConfig.interleaveDepth` is a BLOCK COUNT, not D. Every consumer
143
- // measures SBN distance with it: the worker's `advanceMediaHorizon` does
144
- // `liveSbn - interleaveDepth`, and `MmtFecDecoder::new` documents its
145
- // argument as "the number of interleaved blocks" before `cleanup_by_sbn`
146
- // subtracts it from an SBN and counts the remainder `blocks_failed`.
203
+ // measures block distance with it: the worker's `advanceMediaHorizon`
204
+ // retires a block more than `interleaveDepth` blocks behind the live SS_ID
205
+ // (`isoBlocksBehind`, a lower bound from K_max), and `MmtFecDecoder::new`
206
+ // documents its argument as "the number of interleaved blocks" before
207
+ // `cleanup_by_ss_start` retires every block that far behind and counts it
208
+ // `blocks_failed`.
147
209
  //
148
210
  // `deriveFecInterleaveDepth` returns D — MEDIA UNITS per block — so feeding
149
211
  // it here mixed units and sized the retention window in the wrong quantity.
@@ -161,19 +223,6 @@ export async function setupFecWorkerForTrack(
161
223
  // On 720p and audio the decoder expired blocks — counting them failed — while
162
224
  // the receiver's own deadline for them had not yet passed.
163
225
  //
164
- // Derive the count from the two quantities that define it, so retention
165
- // always covers the deadline already armed for that block: the blocks that
166
- // can be in flight within one block's budget, plus the one being filled.
167
- //
168
- // `deriveFecRetentionBlocks` is THE one derivation of this horizon -- the
169
- // FECManager's ordered-relay settlement consumes the same function, so the
170
- // two cannot drift apart again (BLO-35597 Decision E). It fails closed above
171
- // the 255 the WASM decoder and the ISO/IEC 23008-1 AL-FEC signaling byte
172
- // accept, rather than clamping to a retention shorter than this window.
173
- const interleaveDepthBlocks = deriveFecRetentionBlocks(
174
- deliveryWindowMs,
175
- opts.fecInterleaveMs,
176
- )
177
226
  // Resolve URL against location.origin when available (browser runtime).
178
227
  // Absolute URLs pass through unchanged per the URL() spec.
179
228
  const origin =
@@ -240,9 +289,10 @@ export async function setupFecWorkerForTrack(
240
289
  k: opts.fecK,
241
290
  symbolSize: opts.fecSymbolSize,
242
291
  interleaveDepthMs: opts.fecInterleaveMs,
243
- // FEC timing is expressed in media units. For audio this is the access-unit
244
- // cadence (for example 1024/48kHz), not a video-only framerate field.
245
- fps: 1000 / opts.mediaUnitDurationMs,
292
+ // No-span tracks have no catalog media cadence. The manager still gets
293
+ // the local cleanup budget, but it must not use a guessed fps for timing
294
+ // or classification.
295
+ ...(hasCatalogTiming ? { fps: 1000 / opts.mediaUnitDurationMs! } : {}),
246
296
  timeoutMs: deliveryWindowMs,
247
297
  }, opts.trackName)
248
298
  } catch (e) {
package/src/index.ts CHANGED
@@ -126,6 +126,7 @@ export {
126
126
  type FecAlgorithm,
127
127
  type FecCatalogConfig,
128
128
  isFecCatalogConfig,
129
+ isFecCatalogGeometry,
129
130
  type MulticastProtocol,
130
131
  type MulticastTrack,
131
132
  type MulticastTrackObject,
@@ -410,7 +411,13 @@ export {
410
411
  type FrameMeta as RouterFrameMeta,
411
412
  type FrameKind,
412
413
  type SourceKind,
414
+ type DeltaFallbackConfig,
413
415
  } from './media-router.js'
416
+ export {
417
+ resolveDeltaFallback,
418
+ type DeltaFallbackTrack,
419
+ type ResolvedDeltaFallback,
420
+ } from './delta-fallback-config.js'
414
421
 
415
422
  // Group-alignment primitive — shared with Go sender + Rust relay.
416
423
  // See align.ts docstring for cross-language contract. Authoritative form
@@ -522,7 +529,10 @@ export {
522
529
  type KeyframeCadenceCatalog,
523
530
  type TrackFecParams,
524
531
  type TrackFecUnavailable,
532
+ catalogFecUnavailable,
525
533
  catalogGroupDurationMs,
534
+ catalogKeyframeCadenceMs,
535
+ catalogFecMediaUnitsPerSecond,
526
536
  type GroupDurationRendition,
527
537
  resolveCatalogTrackGroupDurationMs,
528
538
  joinedRepairSymbolCount,
@@ -161,6 +161,51 @@ interface TrackSourceRecord {
161
161
  emitCount: number
162
162
  }
163
163
 
164
+ /** Catalog-derived inputs to {@link MediaRouter.configureDelta}. */
165
+ export interface DeltaFallbackConfig {
166
+ framerate: number
167
+ sourceSymbols: number
168
+ repairSymbols: number
169
+ deltaFailWindowBlocks?: number
170
+ deltaProbeIntervalMs?: number
171
+ interleaveDepthMs?: number
172
+ }
173
+
174
+ /**
175
+ * The one admission check for {@link DeltaFallbackConfig}, shared by
176
+ * {@link MediaRouter.configureDelta} and `resolveDeltaFallback` so a config the
177
+ * resolver accepts is exactly one configureDelta accepts. Every present number
178
+ * must be finite and positive (`typeof NaN === 'number'`, and `NaN <= 0` is
179
+ * false, so a bare comparison admits it); the fail window is a block count and
180
+ * must be an integer; and a probe interval must be derivable.
181
+ */
182
+ export function assertDeltaFallbackConfig(cfg: DeltaFallbackConfig, prefix: string): void {
183
+ if (!isPositiveFinite(cfg.framerate)) throw new Error(`${prefix}: framerate required and must be > 0`)
184
+ if (!isPositiveFinite(cfg.sourceSymbols))
185
+ throw new Error(`${prefix}: sourceSymbols (K_delta) required and must be > 0`)
186
+ if (!isPositiveFinite(cfg.repairSymbols))
187
+ throw new Error(`${prefix}: repairSymbols (P_delta) required and must be > 0`)
188
+ if (
189
+ cfg.deltaFailWindowBlocks !== undefined &&
190
+ !(Number.isInteger(cfg.deltaFailWindowBlocks) && cfg.deltaFailWindowBlocks > 0)
191
+ ) {
192
+ throw new Error(`${prefix}: deltaFailWindowBlocks must be a positive integer when present`)
193
+ }
194
+ if (cfg.deltaProbeIntervalMs !== undefined && !isPositiveFinite(cfg.deltaProbeIntervalMs))
195
+ throw new Error(`${prefix}: deltaProbeIntervalMs must be > 0 when present`)
196
+ if (cfg.interleaveDepthMs !== undefined && !isPositiveFinite(cfg.interleaveDepthMs))
197
+ throw new Error(`${prefix}: interleaveDepthMs must be > 0 when present`)
198
+ if (cfg.deltaProbeIntervalMs === undefined && cfg.interleaveDepthMs === undefined) {
199
+ throw new Error(
200
+ `${prefix}: either deltaProbeIntervalMs or interleaveDepthMs required for probe interval derivation`
201
+ )
202
+ }
203
+ }
204
+
205
+ function isPositiveFinite(value: unknown): value is number {
206
+ return typeof value === 'number' && Number.isFinite(value) && value > 0
207
+ }
208
+
164
209
  export class MediaRouter {
165
210
  #active: SourceKind = 'moq'
166
211
  #multicastVideoKeyed = false
@@ -339,29 +384,21 @@ export class MediaRouter {
339
384
  * CLAUDE.md: error on bad init — throws if required inputs are absent.
340
385
  *
341
386
  * Calling again resets deltaActive=true and clears the window buffer (stream restart).
387
+ * Pass null on teardown or when a replacement catalog cannot configure this policy.
342
388
  */
343
- configureDelta(cfg: {
344
- framerate: number
345
- sourceSymbols: number
346
- repairSymbols: number
347
- deltaFailWindowBlocks?: number
348
- deltaProbeIntervalMs?: number
349
- interleaveDepthMs?: number
350
- }): void {
351
- if (typeof cfg.framerate !== 'number' || !Number.isFinite(cfg.framerate) || cfg.framerate <= 0) {
352
- throw new Error('[MediaRouter] configureDelta: framerate required and must be > 0')
353
- }
354
- if (typeof cfg.sourceSymbols !== 'number' || cfg.sourceSymbols <= 0) {
355
- throw new Error('[MediaRouter] configureDelta: sourceSymbols (K_delta) required and must be > 0')
356
- }
357
- if (typeof cfg.repairSymbols !== 'number' || cfg.repairSymbols <= 0) {
358
- throw new Error('[MediaRouter] configureDelta: repairSymbols (P_delta) required and must be > 0')
359
- }
360
- if (cfg.deltaProbeIntervalMs === undefined && cfg.interleaveDepthMs === undefined) {
361
- throw new Error(
362
- '[MediaRouter] configureDelta: either deltaProbeIntervalMs or interleaveDepthMs required for probe interval derivation'
363
- )
389
+ configureDelta(cfg: DeltaFallbackConfig | null): void {
390
+ if (cfg === null) {
391
+ this.#deltaConfigured = false
392
+ this.#deltaActive = true
393
+ this.#deltaWindow = []
394
+ this.#deltaWindowSize = 0
395
+ this.#deltaFailThresholdRatio = 0
396
+ this.#deltaRecoverThresholdRatio = 0
397
+ this.#deltaProbeIntervalMs = 0
398
+ this.#lastProbeAt = 0
399
+ return
364
400
  }
401
+ assertDeltaFallbackConfig(cfg, '[MediaRouter] configureDelta')
365
402
 
366
403
  // Derivations — no magic floors, no hardcoded defaults (CLAUDE.md).
367
404
  this.#deltaWindowSize = cfg.deltaFailWindowBlocks ?? Math.ceil(cfg.framerate)
@@ -791,6 +828,7 @@ export class MediaRouter {
791
828
  /** Dispose timers and per-track sources. Call on teardown to prevent
792
829
  * stale timer callbacks firing into garbage-collected closures (WR-03). */
793
830
  dispose(): void {
831
+ this.configureDelta(null)
794
832
  if (this.#audioFallbackTimer) {
795
833
  clearTimeout(this.#audioFallbackTimer)
796
834
  this.#audioFallbackTimer = null
@@ -855,6 +855,24 @@ class FecReleaseSequencer {
855
855
  }
856
856
  }
857
857
 
858
+ /**
859
+ * The packet's FEC ended, so no block will resolve a held gap: release its
860
+ * frames in order, each gap stalled as a discontinuity, and forget its
861
+ * streams, so FEC configured on it again starts from a fresh one.
862
+ */
863
+ endPacket(packetId: number): void {
864
+ for (const [key, stream] of this.#streams) {
865
+ if (stream.packetId !== packetId) continue
866
+ // Frames are held only behind a released one, so `last` is set; each
867
+ // pass releases at least the head.
868
+ while (stream.buf.length > 0 && stream.last !== null) {
869
+ stream.discontinuity = true
870
+ this.#drain(stream)
871
+ }
872
+ this.#streams.delete(key)
873
+ }
874
+ }
875
+
858
876
  discardPacket(packetId: number): void {
859
877
  for (const [key, stream] of this.#streams) {
860
878
  if (stream.packetId !== packetId) continue
@@ -1264,6 +1282,14 @@ export class MmtpContainerParser {
1264
1282
  this.#fecSequencer?.markDiscontinuity(this.#streamKey(packetId, catalogTrackName))
1265
1283
  }
1266
1284
 
1285
+ /**
1286
+ * The FEC of a packet ID ended: release the frames the FEC release gate
1287
+ * holds for it in order, each gap stalled, and forget its gated streams.
1288
+ */
1289
+ endFecRelease(packetId: number): void {
1290
+ this.#fecSequencer?.endPacket(packetId)
1291
+ }
1292
+
1267
1293
  /**
1268
1294
  * MPU and data-unit identity of one MMTP packet, parsed in place (no copy,
1269
1295
  * no reassembly). Null for non-MPU packets and packets that do not parse.