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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/README.md +33 -16
  2. package/dist/browser-runtime.js +14814 -14255
  3. package/dist/browser-runtime.js.map +4 -4
  4. package/dist/carp-catalog.d.ts +24 -19
  5. package/dist/carp-catalog.d.ts.map +1 -1
  6. package/dist/carp-catalog.js +29 -14
  7. package/dist/carp-catalog.js.map +4 -4
  8. package/dist/catalog-fec-params.d.ts +88 -28
  9. package/dist/catalog-fec-params.d.ts.map +1 -1
  10. package/dist/catalog-fec-params.js +60 -23
  11. package/dist/catalog-fec-params.js.map +4 -4
  12. package/dist/catalog-network-source.js +1 -7
  13. package/dist/catalog-network-source.js.map +4 -4
  14. package/dist/cmaf-block-assembler.d.ts +0 -2
  15. package/dist/cmaf-block-assembler.d.ts.map +1 -1
  16. package/dist/cmaf-block-assembler.js +0 -1
  17. package/dist/cmaf-block-assembler.js.map +2 -2
  18. package/dist/cmcd-producer.d.ts.map +1 -1
  19. package/dist/cmcd-producer.js +0 -4
  20. package/dist/cmcd-producer.js.map +2 -2
  21. package/dist/delivery-catalog.d.ts +124 -0
  22. package/dist/delivery-catalog.d.ts.map +1 -0
  23. package/dist/delivery-catalog.js +1857 -0
  24. package/dist/delivery-catalog.js.map +7 -0
  25. package/dist/delta-fallback-config.d.ts +42 -0
  26. package/dist/delta-fallback-config.d.ts.map +1 -0
  27. package/dist/delta-fallback-config.js +59 -0
  28. package/dist/delta-fallback-config.js.map +7 -0
  29. package/dist/fec-manager.d.ts +52 -30
  30. package/dist/fec-manager.d.ts.map +1 -1
  31. package/dist/fec-manager.js +338 -293
  32. package/dist/fec-manager.js.map +4 -4
  33. package/dist/fec-state.d.ts +19 -31
  34. package/dist/fec-state.d.ts.map +1 -1
  35. package/dist/fec-state.js +4 -10
  36. package/dist/fec-state.js.map +4 -4
  37. package/dist/fec-worker-setup.d.ts +18 -14
  38. package/dist/fec-worker-setup.d.ts.map +1 -1
  39. package/dist/fec-worker-setup.js +81 -96
  40. package/dist/fec-worker-setup.js.map +4 -4
  41. package/dist/index.d.ts +5 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +16 -0
  44. package/dist/index.js.map +2 -2
  45. package/dist/iso-block-locator.js +1 -7
  46. package/dist/iso-block-locator.js.map +4 -4
  47. package/dist/media-router.d.ts +20 -8
  48. package/dist/media-router.d.ts.map +1 -1
  49. package/dist/media-router.js +46 -21
  50. package/dist/media-router.js.map +2 -2
  51. package/dist/mfu-reassembler.js +24 -30
  52. package/dist/mfu-reassembler.js.map +4 -4
  53. package/dist/mmtp-container-parser.d.ts +14 -11
  54. package/dist/mmtp-container-parser.d.ts.map +1 -1
  55. package/dist/mmtp-container-parser.js +126 -99
  56. package/dist/mmtp-container-parser.js.map +4 -4
  57. package/dist/mmtp-container-parser.no-modules.js +151 -108
  58. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  59. package/dist/mmtp-decode-pipeline.js +126 -99
  60. package/dist/mmtp-decode-pipeline.js.map +4 -4
  61. package/dist/mmtp-router.d.ts +51 -29
  62. package/dist/mmtp-router.d.ts.map +1 -1
  63. package/dist/mmtp-router.js +260 -326
  64. package/dist/mmtp-router.js.map +4 -4
  65. package/dist/multicast-input.js +1 -7
  66. package/dist/multicast-input.js.map +4 -4
  67. package/dist/multicast-manager.d.ts +72 -6
  68. package/dist/multicast-manager.d.ts.map +1 -1
  69. package/dist/multicast-manager.js +882 -673
  70. package/dist/multicast-manager.js.map +4 -4
  71. package/dist/multicast-transport.d.ts +1 -1
  72. package/dist/multicast-transport.d.ts.map +1 -1
  73. package/dist/multicast-transport.js +44 -26
  74. package/dist/multicast-transport.js.map +4 -4
  75. package/dist/multicast-unwrap.js +29 -35
  76. package/dist/multicast-unwrap.js.map +4 -4
  77. package/dist/no-modules.js +147 -106
  78. package/dist/no-modules.js.map +4 -4
  79. package/dist/repair-fetch.d.ts +116 -21
  80. package/dist/repair-fetch.d.ts.map +1 -1
  81. package/dist/repair-fetch.js +114 -34
  82. package/dist/repair-fetch.js.map +4 -4
  83. package/dist/repair-layers.d.ts +18 -7
  84. package/dist/repair-layers.d.ts.map +1 -1
  85. package/dist/repair-layers.js +12 -10
  86. package/dist/repair-layers.js.map +4 -4
  87. package/dist/signaling.js +2 -11
  88. package/dist/signaling.js.map +4 -4
  89. package/dist/timestamp-codec.js +24 -30
  90. package/dist/timestamp-codec.js.map +4 -4
  91. package/dist/track-session.d.ts +7 -0
  92. package/dist/track-session.d.ts.map +1 -1
  93. package/dist/track-session.js +15 -8
  94. package/dist/track-session.js.map +2 -2
  95. package/dist/wasm-mfu-reassembler.js +1 -7
  96. package/dist/wasm-mfu-reassembler.js.map +4 -4
  97. package/dist/wasm-mmtp-container-parser.js +126 -99
  98. package/dist/wasm-mmtp-container-parser.js.map +4 -4
  99. package/package.json +7 -14
  100. package/schemas/catalog.schema.json +3 -3
  101. package/src/carp-catalog.ts +46 -24
  102. package/src/catalog-fec-params.ts +173 -64
  103. package/src/cmaf-block-assembler.ts +1 -4
  104. package/src/cmcd-producer.ts +0 -6
  105. package/src/delivery-catalog.ts +498 -0
  106. package/src/delta-fallback-config.ts +72 -0
  107. package/src/fec-manager.ts +457 -334
  108. package/src/fec-state.ts +20 -32
  109. package/src/fec-worker-setup.ts +109 -90
  110. package/src/index.ts +32 -0
  111. package/src/media-router.ts +59 -21
  112. package/src/mmtp-container-parser.ts +106 -20
  113. package/src/mmtp-router.ts +189 -330
  114. package/src/multicast-manager.ts +265 -86
  115. package/src/multicast-transport.ts +16 -9
  116. package/src/repair-fetch.ts +273 -43
  117. package/src/repair-layers.ts +28 -8
  118. package/src/track-session.ts +28 -9
  119. package/test-vectors/catalog/README.md +37 -17
  120. package/test-vectors/catalog/negative/fec-block-profile-retired.json +52 -0
  121. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +1 -1
  122. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +1 -1
  123. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +1 -1
  124. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +1 -1
  125. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +1 -1
  126. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +1 -1
  127. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +1 -1
  128. package/test-vectors/catalog/negative/multicast-endpoint-relay-address.json +39 -0
  129. package/test-vectors/catalog/negative/multicast-network-source-empty.json +1 -1
  130. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +1 -1
  131. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +1 -1
  132. package/test-vectors/catalog/positive/fec-layered-repair.json +2 -2
  133. package/test-vectors/catalog/positive/fec-multicast.json +2 -1
  134. package/test-vectors/catalog/positive/multicast-amt-manual-relay.json +38 -0
  135. package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +2 -1
  136. package/test-vectors/catalog-timing.json +356 -0
  137. package/test-vectors/catalog-validation.json +40 -5
  138. package/test-vectors/delivery-catalog/README.md +11 -0
  139. package/test-vectors/delivery-catalog/negative/missing-block-profile.json +58 -0
  140. package/test-vectors/delivery-catalog/negative/packet-id-signaling.json +59 -0
  141. package/test-vectors/delivery-catalog/negative/retired-k-padded-block-profile.json +59 -0
  142. package/test-vectors/delivery-catalog/positive/dash.json +56 -0
  143. package/test-vectors/delivery-catalog/positive/mmtp-source-only.json +43 -0
  144. package/node_modules/@blockcast/fec-worker/README.md +0 -223
  145. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  146. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +0 -38
  147. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +0 -1
  148. package/node_modules/@blockcast/fec-worker/dist/block-order.js +0 -78
  149. package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +0 -1
  150. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +0 -93
  151. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +0 -1
  152. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +0 -346
  153. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +0 -1
  154. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +0 -380
  155. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +0 -1
  156. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +0 -11
  157. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +0 -1
  158. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +0 -14
  159. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +0 -1
  160. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +0 -859
  161. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +0 -7
  162. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +0 -10
  163. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +0 -1
  164. package/node_modules/@blockcast/fec-worker/dist/index.js +0 -8
  165. package/node_modules/@blockcast/fec-worker/dist/index.js.map +0 -1
  166. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +0 -20
  167. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +0 -1
  168. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +0 -370
  169. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +0 -7
  170. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +0 -104
  171. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +0 -1
  172. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +0 -181
  173. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +0 -1
  174. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +0 -194
  175. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +0 -1
  176. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +0 -62
  177. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +0 -1
  178. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +0 -9
  179. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +0 -1
  180. package/node_modules/@blockcast/fec-worker/dist/transfer.js +0 -13
  181. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +0 -1
  182. package/node_modules/@blockcast/fec-worker/package.json +0 -59
  183. package/node_modules/@blockcast/fec-worker/src/block-order.ts +0 -93
  184. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +0 -392
  185. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +0 -399
  186. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +0 -1502
  187. package/node_modules/@blockcast/fec-worker/src/index.ts +0 -35
  188. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +0 -589
  189. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +0 -222
  190. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +0 -209
  191. package/node_modules/@blockcast/fec-worker/src/transfer.ts +0 -12
  192. package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  193. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  194. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  195. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  196. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  197. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  198. package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  199. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  200. package/node_modules/@blockcast/mmt-base/README.md +0 -134
  201. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  202. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  203. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  204. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  205. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  206. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  207. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  208. package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  209. package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  210. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  211. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  212. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  213. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  214. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  215. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  216. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  217. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  218. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  219. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  220. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  221. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  222. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  223. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  224. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  225. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  226. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  227. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  228. package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  229. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  230. package/node_modules/@blockcast/mmt-base/package.json +0 -49
  231. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  232. package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  233. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  234. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  235. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  236. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  237. package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  238. package/node_modules/@blockcast/mmt-fec/README.md +0 -271
  239. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  240. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +0 -82
  241. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +0 -1
  242. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +0 -296
  243. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +0 -1
  244. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +0 -106
  245. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +0 -1
  246. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +0 -288
  247. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +0 -1
  248. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +0 -46
  249. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +0 -1
  250. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +0 -96
  251. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +0 -1
  252. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +0 -33
  253. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +0 -1
  254. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +0 -57
  255. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +0 -1
  256. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +0 -205
  257. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +0 -1
  258. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +0 -240
  259. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +0 -1
  260. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +0 -28
  261. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +0 -1
  262. package/node_modules/@blockcast/mmt-fec/dist/index.js +0 -28
  263. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +0 -1
  264. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +0 -20
  265. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +0 -1
  266. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +0 -28
  267. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +0 -1
  268. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +0 -258
  269. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +0 -1
  270. package/node_modules/@blockcast/mmt-fec/dist/oti.js +0 -382
  271. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +0 -1
  272. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +0 -41
  273. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +0 -1
  274. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +0 -81
  275. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +0 -1
  276. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +0 -82
  277. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +0 -1
  278. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +0 -170
  279. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +0 -1
  280. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  281. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  282. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  283. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  284. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  285. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  286. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  287. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  288. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +0 -134
  289. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  290. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  291. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  292. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  293. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  294. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  295. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  296. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  297. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  298. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  299. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  300. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  301. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  302. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  303. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  304. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  305. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  306. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +0 -49
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  324. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  325. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
  326. package/node_modules/@blockcast/mmt-fec/package.json +0 -79
  327. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +0 -371
  328. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +0 -439
  329. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +0 -127
  330. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +0 -68
  331. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +0 -310
  332. package/node_modules/@blockcast/mmt-fec/src/index.ts +0 -94
  333. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +0 -34
  334. package/node_modules/@blockcast/mmt-fec/src/oti.ts +0 -463
  335. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +0 -101
  336. package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +0 -195
  337. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +0 -28
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +0 -1
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +0 -128
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +0 -1
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +0 -4
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +0 -1
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +0 -4
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +0 -1
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +0 -37
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +0 -1
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +0 -179
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +0 -1
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +0 -99
  351. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +0 -1
  352. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +0 -492
  353. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +0 -1
  354. package/node_modules/@blockcast/mmt-manifest-verify/package.json +0 -45
  355. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +0 -171
  356. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +0 -3
  357. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +0 -230
  358. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +0 -669
  359. package/node_modules/@noble/hashes/LICENSE +0 -21
  360. package/node_modules/@noble/hashes/README.md +0 -521
  361. package/node_modules/@noble/hashes/_assert.d.ts +0 -17
  362. package/node_modules/@noble/hashes/_assert.d.ts.map +0 -1
  363. package/node_modules/@noble/hashes/_assert.js +0 -18
  364. package/node_modules/@noble/hashes/_assert.js.map +0 -1
  365. package/node_modules/@noble/hashes/_blake.d.ts +0 -14
  366. package/node_modules/@noble/hashes/_blake.d.ts.map +0 -1
  367. package/node_modules/@noble/hashes/_blake.js +0 -50
  368. package/node_modules/@noble/hashes/_blake.js.map +0 -1
  369. package/node_modules/@noble/hashes/_md.d.ts +0 -51
  370. package/node_modules/@noble/hashes/_md.d.ts.map +0 -1
  371. package/node_modules/@noble/hashes/_md.js +0 -162
  372. package/node_modules/@noble/hashes/_md.js.map +0 -1
  373. package/node_modules/@noble/hashes/_u64.d.ts +0 -55
  374. package/node_modules/@noble/hashes/_u64.d.ts.map +0 -1
  375. package/node_modules/@noble/hashes/_u64.js +0 -90
  376. package/node_modules/@noble/hashes/_u64.js.map +0 -1
  377. package/node_modules/@noble/hashes/argon2.d.ts +0 -32
  378. package/node_modules/@noble/hashes/argon2.d.ts.map +0 -1
  379. package/node_modules/@noble/hashes/argon2.js +0 -401
  380. package/node_modules/@noble/hashes/argon2.js.map +0 -1
  381. package/node_modules/@noble/hashes/blake1.d.ts +0 -106
  382. package/node_modules/@noble/hashes/blake1.d.ts.map +0 -1
  383. package/node_modules/@noble/hashes/blake1.js +0 -459
  384. package/node_modules/@noble/hashes/blake1.js.map +0 -1
  385. package/node_modules/@noble/hashes/blake2.d.ts +0 -116
  386. package/node_modules/@noble/hashes/blake2.d.ts.map +0 -1
  387. package/node_modules/@noble/hashes/blake2.js +0 -420
  388. package/node_modules/@noble/hashes/blake2.js.map +0 -1
  389. package/node_modules/@noble/hashes/blake2b.d.ts +0 -11
  390. package/node_modules/@noble/hashes/blake2b.d.ts.map +0 -1
  391. package/node_modules/@noble/hashes/blake2b.js +0 -14
  392. package/node_modules/@noble/hashes/blake2b.js.map +0 -1
  393. package/node_modules/@noble/hashes/blake2s.d.ts +0 -20
  394. package/node_modules/@noble/hashes/blake2s.d.ts.map +0 -1
  395. package/node_modules/@noble/hashes/blake2s.js +0 -24
  396. package/node_modules/@noble/hashes/blake2s.js.map +0 -1
  397. package/node_modules/@noble/hashes/blake3.d.ts +0 -54
  398. package/node_modules/@noble/hashes/blake3.d.ts.map +0 -1
  399. package/node_modules/@noble/hashes/blake3.js +0 -255
  400. package/node_modules/@noble/hashes/blake3.js.map +0 -1
  401. package/node_modules/@noble/hashes/crypto.d.ts +0 -2
  402. package/node_modules/@noble/hashes/crypto.d.ts.map +0 -1
  403. package/node_modules/@noble/hashes/crypto.js +0 -5
  404. package/node_modules/@noble/hashes/crypto.js.map +0 -1
  405. package/node_modules/@noble/hashes/cryptoNode.d.ts +0 -2
  406. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +0 -1
  407. package/node_modules/@noble/hashes/cryptoNode.js +0 -18
  408. package/node_modules/@noble/hashes/cryptoNode.js.map +0 -1
  409. package/node_modules/@noble/hashes/eskdf.d.ts +0 -47
  410. package/node_modules/@noble/hashes/eskdf.d.ts.map +0 -1
  411. package/node_modules/@noble/hashes/eskdf.js +0 -166
  412. package/node_modules/@noble/hashes/eskdf.js.map +0 -1
  413. package/node_modules/@noble/hashes/esm/_assert.d.ts +0 -17
  414. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +0 -1
  415. package/node_modules/@noble/hashes/esm/_assert.js +0 -15
  416. package/node_modules/@noble/hashes/esm/_assert.js.map +0 -1
  417. package/node_modules/@noble/hashes/esm/_blake.d.ts +0 -14
  418. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +0 -1
  419. package/node_modules/@noble/hashes/esm/_blake.js +0 -45
  420. package/node_modules/@noble/hashes/esm/_blake.js.map +0 -1
  421. package/node_modules/@noble/hashes/esm/_md.d.ts +0 -51
  422. package/node_modules/@noble/hashes/esm/_md.d.ts.map +0 -1
  423. package/node_modules/@noble/hashes/esm/_md.js +0 -155
  424. package/node_modules/@noble/hashes/esm/_md.js.map +0 -1
  425. package/node_modules/@noble/hashes/esm/_u64.d.ts +0 -55
  426. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +0 -1
  427. package/node_modules/@noble/hashes/esm/_u64.js +0 -67
  428. package/node_modules/@noble/hashes/esm/_u64.js.map +0 -1
  429. package/node_modules/@noble/hashes/esm/argon2.d.ts +0 -32
  430. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +0 -1
  431. package/node_modules/@noble/hashes/esm/argon2.js +0 -392
  432. package/node_modules/@noble/hashes/esm/argon2.js.map +0 -1
  433. package/node_modules/@noble/hashes/esm/blake1.d.ts +0 -106
  434. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +0 -1
  435. package/node_modules/@noble/hashes/esm/blake1.js +0 -452
  436. package/node_modules/@noble/hashes/esm/blake1.js.map +0 -1
  437. package/node_modules/@noble/hashes/esm/blake2.d.ts +0 -116
  438. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +0 -1
  439. package/node_modules/@noble/hashes/esm/blake2.js +0 -413
  440. package/node_modules/@noble/hashes/esm/blake2.js.map +0 -1
  441. package/node_modules/@noble/hashes/esm/blake2b.d.ts +0 -11
  442. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +0 -1
  443. package/node_modules/@noble/hashes/esm/blake2b.js +0 -11
  444. package/node_modules/@noble/hashes/esm/blake2b.js.map +0 -1
  445. package/node_modules/@noble/hashes/esm/blake2s.d.ts +0 -20
  446. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +0 -1
  447. package/node_modules/@noble/hashes/esm/blake2s.js +0 -21
  448. package/node_modules/@noble/hashes/esm/blake2s.js.map +0 -1
  449. package/node_modules/@noble/hashes/esm/blake3.d.ts +0 -54
  450. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +0 -1
  451. package/node_modules/@noble/hashes/esm/blake3.js +0 -251
  452. package/node_modules/@noble/hashes/esm/blake3.js.map +0 -1
  453. package/node_modules/@noble/hashes/esm/crypto.d.ts +0 -2
  454. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +0 -1
  455. package/node_modules/@noble/hashes/esm/crypto.js +0 -2
  456. package/node_modules/@noble/hashes/esm/crypto.js.map +0 -1
  457. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +0 -2
  458. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +0 -1
  459. package/node_modules/@noble/hashes/esm/cryptoNode.js +0 -15
  460. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +0 -1
  461. package/node_modules/@noble/hashes/esm/eskdf.d.ts +0 -47
  462. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +0 -1
  463. package/node_modules/@noble/hashes/esm/eskdf.js +0 -160
  464. package/node_modules/@noble/hashes/esm/eskdf.js.map +0 -1
  465. package/node_modules/@noble/hashes/esm/hkdf.d.ts +0 -36
  466. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +0 -1
  467. package/node_modules/@noble/hashes/esm/hkdf.js +0 -82
  468. package/node_modules/@noble/hashes/esm/hkdf.js.map +0 -1
  469. package/node_modules/@noble/hashes/esm/hmac.d.ts +0 -35
  470. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +0 -1
  471. package/node_modules/@noble/hashes/esm/hmac.js +0 -86
  472. package/node_modules/@noble/hashes/esm/hmac.js.map +0 -1
  473. package/node_modules/@noble/hashes/esm/index.d.ts +0 -2
  474. package/node_modules/@noble/hashes/esm/index.d.ts.map +0 -1
  475. package/node_modules/@noble/hashes/esm/index.js +0 -33
  476. package/node_modules/@noble/hashes/esm/index.js.map +0 -1
  477. package/node_modules/@noble/hashes/esm/legacy.d.ts +0 -71
  478. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +0 -1
  479. package/node_modules/@noble/hashes/esm/legacy.js +0 -281
  480. package/node_modules/@noble/hashes/esm/legacy.js.map +0 -1
  481. package/node_modules/@noble/hashes/esm/package.json +0 -10
  482. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +0 -23
  483. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +0 -1
  484. package/node_modules/@noble/hashes/esm/pbkdf2.js +0 -97
  485. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +0 -1
  486. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +0 -13
  487. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +0 -1
  488. package/node_modules/@noble/hashes/esm/ripemd160.js +0 -13
  489. package/node_modules/@noble/hashes/esm/ripemd160.js.map +0 -1
  490. package/node_modules/@noble/hashes/esm/scrypt.d.ts +0 -34
  491. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +0 -1
  492. package/node_modules/@noble/hashes/esm/scrypt.js +0 -228
  493. package/node_modules/@noble/hashes/esm/scrypt.js.map +0 -1
  494. package/node_modules/@noble/hashes/esm/sha1.d.ts +0 -11
  495. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +0 -1
  496. package/node_modules/@noble/hashes/esm/sha1.js +0 -11
  497. package/node_modules/@noble/hashes/esm/sha1.js.map +0 -1
  498. package/node_modules/@noble/hashes/esm/sha2.d.ts +0 -159
  499. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +0 -1
  500. package/node_modules/@noble/hashes/esm/sha2.js +0 -375
  501. package/node_modules/@noble/hashes/esm/sha2.js.map +0 -1
  502. package/node_modules/@noble/hashes/esm/sha256.d.ts +0 -20
  503. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +0 -1
  504. package/node_modules/@noble/hashes/esm/sha256.js +0 -20
  505. package/node_modules/@noble/hashes/esm/sha256.js.map +0 -1
  506. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +0 -142
  507. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +0 -1
  508. package/node_modules/@noble/hashes/esm/sha3-addons.js +0 -393
  509. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +0 -1
  510. package/node_modules/@noble/hashes/esm/sha3.d.ts +0 -53
  511. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +0 -1
  512. package/node_modules/@noble/hashes/esm/sha3.js +0 -234
  513. package/node_modules/@noble/hashes/esm/sha3.js.map +0 -1
  514. package/node_modules/@noble/hashes/esm/sha512.d.ts +0 -26
  515. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +0 -1
  516. package/node_modules/@noble/hashes/esm/sha512.js +0 -26
  517. package/node_modules/@noble/hashes/esm/sha512.js.map +0 -1
  518. package/node_modules/@noble/hashes/esm/utils.d.ts +0 -161
  519. package/node_modules/@noble/hashes/esm/utils.d.ts.map +0 -1
  520. package/node_modules/@noble/hashes/esm/utils.js +0 -281
  521. package/node_modules/@noble/hashes/esm/utils.js.map +0 -1
  522. package/node_modules/@noble/hashes/hkdf.d.ts +0 -36
  523. package/node_modules/@noble/hashes/hkdf.d.ts.map +0 -1
  524. package/node_modules/@noble/hashes/hkdf.js +0 -88
  525. package/node_modules/@noble/hashes/hkdf.js.map +0 -1
  526. package/node_modules/@noble/hashes/hmac.d.ts +0 -35
  527. package/node_modules/@noble/hashes/hmac.d.ts.map +0 -1
  528. package/node_modules/@noble/hashes/hmac.js +0 -91
  529. package/node_modules/@noble/hashes/hmac.js.map +0 -1
  530. package/node_modules/@noble/hashes/index.d.ts +0 -1
  531. package/node_modules/@noble/hashes/index.d.ts.map +0 -1
  532. package/node_modules/@noble/hashes/index.js +0 -33
  533. package/node_modules/@noble/hashes/index.js.map +0 -1
  534. package/node_modules/@noble/hashes/legacy.d.ts +0 -71
  535. package/node_modules/@noble/hashes/legacy.d.ts.map +0 -1
  536. package/node_modules/@noble/hashes/legacy.js +0 -287
  537. package/node_modules/@noble/hashes/legacy.js.map +0 -1
  538. package/node_modules/@noble/hashes/package.json +0 -266
  539. package/node_modules/@noble/hashes/pbkdf2.d.ts +0 -23
  540. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +0 -1
  541. package/node_modules/@noble/hashes/pbkdf2.js +0 -101
  542. package/node_modules/@noble/hashes/pbkdf2.js.map +0 -1
  543. package/node_modules/@noble/hashes/ripemd160.d.ts +0 -13
  544. package/node_modules/@noble/hashes/ripemd160.d.ts.map +0 -1
  545. package/node_modules/@noble/hashes/ripemd160.js +0 -16
  546. package/node_modules/@noble/hashes/ripemd160.js.map +0 -1
  547. package/node_modules/@noble/hashes/scrypt.d.ts +0 -34
  548. package/node_modules/@noble/hashes/scrypt.d.ts.map +0 -1
  549. package/node_modules/@noble/hashes/scrypt.js +0 -232
  550. package/node_modules/@noble/hashes/scrypt.js.map +0 -1
  551. package/node_modules/@noble/hashes/sha1.d.ts +0 -11
  552. package/node_modules/@noble/hashes/sha1.d.ts.map +0 -1
  553. package/node_modules/@noble/hashes/sha1.js +0 -14
  554. package/node_modules/@noble/hashes/sha1.js.map +0 -1
  555. package/node_modules/@noble/hashes/sha2.d.ts +0 -159
  556. package/node_modules/@noble/hashes/sha2.d.ts.map +0 -1
  557. package/node_modules/@noble/hashes/sha2.js +0 -384
  558. package/node_modules/@noble/hashes/sha2.js.map +0 -1
  559. package/node_modules/@noble/hashes/sha256.d.ts +0 -20
  560. package/node_modules/@noble/hashes/sha256.d.ts.map +0 -1
  561. package/node_modules/@noble/hashes/sha256.js +0 -23
  562. package/node_modules/@noble/hashes/sha256.js.map +0 -1
  563. package/node_modules/@noble/hashes/sha3-addons.d.ts +0 -142
  564. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +0 -1
  565. package/node_modules/@noble/hashes/sha3-addons.js +0 -402
  566. package/node_modules/@noble/hashes/sha3-addons.js.map +0 -1
  567. package/node_modules/@noble/hashes/sha3.d.ts +0 -53
  568. package/node_modules/@noble/hashes/sha3.d.ts.map +0 -1
  569. package/node_modules/@noble/hashes/sha3.js +0 -239
  570. package/node_modules/@noble/hashes/sha3.js.map +0 -1
  571. package/node_modules/@noble/hashes/sha512.d.ts +0 -26
  572. package/node_modules/@noble/hashes/sha512.d.ts.map +0 -1
  573. package/node_modules/@noble/hashes/sha512.js +0 -29
  574. package/node_modules/@noble/hashes/sha512.js.map +0 -1
  575. package/node_modules/@noble/hashes/src/_assert.ts +0 -22
  576. package/node_modules/@noble/hashes/src/_blake.ts +0 -50
  577. package/node_modules/@noble/hashes/src/_md.ts +0 -176
  578. package/node_modules/@noble/hashes/src/_u64.ts +0 -91
  579. package/node_modules/@noble/hashes/src/argon2.ts +0 -497
  580. package/node_modules/@noble/hashes/src/blake1.ts +0 -534
  581. package/node_modules/@noble/hashes/src/blake2.ts +0 -486
  582. package/node_modules/@noble/hashes/src/blake2b.ts +0 -10
  583. package/node_modules/@noble/hashes/src/blake2s.ts +0 -20
  584. package/node_modules/@noble/hashes/src/blake3.ts +0 -272
  585. package/node_modules/@noble/hashes/src/crypto.ts +0 -9
  586. package/node_modules/@noble/hashes/src/cryptoNode.ts +0 -15
  587. package/node_modules/@noble/hashes/src/eskdf.ts +0 -187
  588. package/node_modules/@noble/hashes/src/hkdf.ts +0 -88
  589. package/node_modules/@noble/hashes/src/hmac.ts +0 -94
  590. package/node_modules/@noble/hashes/src/index.ts +0 -31
  591. package/node_modules/@noble/hashes/src/legacy.ts +0 -293
  592. package/node_modules/@noble/hashes/src/pbkdf2.ts +0 -122
  593. package/node_modules/@noble/hashes/src/ripemd160.ts +0 -12
  594. package/node_modules/@noble/hashes/src/scrypt.ts +0 -257
  595. package/node_modules/@noble/hashes/src/sha1.ts +0 -10
  596. package/node_modules/@noble/hashes/src/sha2.ts +0 -402
  597. package/node_modules/@noble/hashes/src/sha256.ts +0 -24
  598. package/node_modules/@noble/hashes/src/sha3-addons.ts +0 -499
  599. package/node_modules/@noble/hashes/src/sha3.ts +0 -258
  600. package/node_modules/@noble/hashes/src/sha512.ts +0 -34
  601. package/node_modules/@noble/hashes/src/utils.ts +0 -395
  602. package/node_modules/@noble/hashes/utils.d.ts +0 -161
  603. package/node_modules/@noble/hashes/utils.d.ts.map +0 -1
  604. package/node_modules/@noble/hashes/utils.js +0 -313
  605. package/node_modules/@noble/hashes/utils.js.map +0 -1
@@ -269,7 +269,7 @@ export class MulticastTransport<TPacketContext = never> {
269
269
  // inside the window, instead of a clear+set pair on every packet.
270
270
  #watchdog: ReturnType<typeof setTimeout> | null = null
271
271
  #lastPacketAtMs = 0
272
- #failbackWindowMs: number | null = null
272
+ #failbackWindowMs: number | null | undefined
273
273
  #onTakeover: (() => void) | null = null
274
274
  #onFailback: ((reason: MulticastFailbackReason) => void) | null = null
275
275
  // Data-plane-live edge: the first packet this join accepted. Everything
@@ -644,18 +644,24 @@ export class MulticastTransport<TPacketContext = never> {
644
644
  return this.#dataPlaneLive
645
645
  }
646
646
 
647
- setFailbackWindowMs(windowMs: number): void {
648
- if (!Number.isFinite(windowMs) || windowMs <= 0) {
647
+ setFailbackWindowMs(windowMs: number | null): void {
648
+ if (windowMs !== null && (!Number.isFinite(windowMs) || windowMs <= 0)) {
649
649
  throw new Error(
650
650
  `[MulticastTransport] failbackWindowMs=${windowMs}. ` +
651
651
  `Derive a positive failback window from the stream catalog.`,
652
652
  )
653
653
  }
654
654
  this.#failbackWindowMs = windowMs
655
- // An armed timer was scheduled against the previous window; re-derive its
656
- // wake-up from the last packet so a narrower window is not enforced late.
657
- if (this.#watchdog !== null) {
658
- clearTimeout(this.#watchdog)
655
+ if (windowMs === null) {
656
+ if (this.#watchdog !== null) clearTimeout(this.#watchdog)
657
+ this.#watchdog = null
658
+ return
659
+ }
660
+ // Re-enable against the last packet even when the previous policy disabled
661
+ // the watchdog: a silent live stream may never deliver another packet.
662
+ if (this.#watchdog !== null) clearTimeout(this.#watchdog)
663
+ this.#watchdog = null
664
+ if (this.#dataPlaneLive && this.#onFailback) {
659
665
  const silentMs = performance.now() - this.#lastPacketAtMs
660
666
  this.#armWatchdog(Math.max(0, Math.ceil(windowMs - silentMs)))
661
667
  }
@@ -1022,7 +1028,8 @@ export class MulticastTransport<TPacketContext = never> {
1022
1028
  }
1023
1029
  if (this.#watchdog !== null) return
1024
1030
  if (!this.#onFailback) return
1025
- if (this.#failbackWindowMs === null) {
1031
+ if (this.#failbackWindowMs === null) return
1032
+ if (this.#failbackWindowMs === undefined) {
1026
1033
  throw new Error(
1027
1034
  '[MulticastTransport] Failback watchdog requires a catalog-derived window',
1028
1035
  )
@@ -1033,7 +1040,7 @@ export class MulticastTransport<TPacketContext = never> {
1033
1040
  #armWatchdog(delayMs: number): void {
1034
1041
  this.#watchdog = setTimeout(() => {
1035
1042
  this.#watchdog = null
1036
- if (this.#disposed || !this.#onFailback || this.#failbackWindowMs === null) return
1043
+ if (this.#disposed || !this.#onFailback || this.#failbackWindowMs == null) return
1037
1044
  const silentMs = performance.now() - this.#lastPacketAtMs
1038
1045
  if (silentMs < this.#failbackWindowMs) {
1039
1046
  this.#armWatchdog(Math.ceil(this.#failbackWindowMs - silentMs))
@@ -1,14 +1,19 @@
1
1
  /**
2
2
  * D-28 shared repair-fetch scheduler.
3
3
  *
4
- * Player-agnostic orchestration for per-SBN on-demand MoQ FEC repair
4
+ * Player-agnostic orchestration for per-block on-demand MoQ FEC repair
5
5
  * backfill. Each player (moqtail client, hang watch, Shaka MSF bridge)
6
- * supplies only its protocol verb via {@link RepairFetchTransport}:
6
+ * supplies only its protocol verb via {@link RepairFetchTransport}, fetching
7
+ * one block's repair group. Blocks are `iso-ssbg1-v1` (ISO/IEC 23008-1
8
+ * ssbg_mode1, the only FEC block profile), so that group's MoQ id is the
9
+ * 62-bit wrap-epoch-extended SS_Start, `extSsStart(wrapEpoch, ssStart)` from
10
+ * `@blockcast/mmt-fec` -- never the 32-bit block key itself (see
11
+ * `RepairFetchRequest.sbn`):
7
12
  *
8
- * - moqtail: standalone FETCH (FetchType.Standalone) for group [sbn, sbn+1)
9
- * - moq-lite/hang: Subscribe with startGroup=sbn, endGroup=sbn (the relay
10
- * propagates startGroup upstream to pull the past group from the origin's
11
- * producer cache)
13
+ * - moqtail: standalone FETCH (FetchType.Standalone) of that one group
14
+ * - moq-lite/hang: Subscribe with startGroup = endGroup = that group (the
15
+ * relay propagates startGroup upstream to pull the past group from the
16
+ * origin's producer cache)
12
17
  *
13
18
  * Everything else — registration, fire-time repair-track resolution,
14
19
  * keyframe-first admission, preemption, feeding symbols, and in-flight slot
@@ -52,14 +57,42 @@
52
57
  * than sent and cancelled -- and an admitted FETCH holds the block open to
53
58
  * that deadline, so the multicast span elapsing never aborts it.
54
59
  *
60
+ * Keyframe late-repair budget: a block that may hold a RAP may be given a
61
+ * longer deadline than the playout budget (`keyframeRepairBudgetMs`). Losing
62
+ * such a block costs every frame up to the next keyframe, so holding it open
63
+ * for a FETCH that lands within the budget trades a short hold for a GOP-long
64
+ * freeze. At a small playout budget (a low-latency target) the presentation
65
+ * deadline alone leaves less than one round trip by the time the multicast
66
+ * wait gives up on the block, so every keyframe request would be refused
67
+ * (`rtt-exceeds-budget`). Eligible (`keyframeBudgetEligible`): a `keyframe`
68
+ * block (in-band RAP evidence), and an `unknown` block only while its
69
+ * stream's classifier is `classifying`, where `unknown` means the window rule
70
+ * could not exclude a RAP. Under `all-protected` every block reads `unknown`
71
+ * whatever it holds, so there only RAP evidence earns the budget. Never
72
+ * audio (P1) or delta (P2), and never a block its repair group cannot
73
+ * complete (received sources + RSB_length < K'). The hold ends when its
74
+ * FETCH ends without making the block decodable, not at the budget.
75
+ *
76
+ * Every deadline is capped by the release gate's hold ceiling measured the
77
+ * way the gate measures it: from the earliest frame it holds for the stream
78
+ * (a surviving frame of the block itself is routed before a repair symbol
79
+ * states the block, so before its anchor), never later than from the anchor.
80
+ * A FETCH landing after the gate forced that frame out would recover media
81
+ * the gate then drops as stale.
82
+ *
55
83
  * The scheduler arms no timers. A fetch ends when its transport completes or
56
84
  * throws, when it is preempted, when any later scheduling event finds it past
57
85
  * its presentation deadline, when its block resolves (recovered, or failed at
58
86
  * that deadline), on track reset, or on dispose.
59
87
  */
60
88
 
61
- import type { FecBlockProfile } from '@blockcast/mmt-base'
62
- import { repairPriorityForClass, type BlockClass, type RepairPriority } from './block-policy.js'
89
+ import { parseFecBlockProfile, type FecBlockProfile } from '@blockcast/mmt-base'
90
+ import {
91
+ repairPriorityForClass,
92
+ type BlockClass,
93
+ type ClassifierMode,
94
+ type RepairPriority,
95
+ } from './block-policy.js'
63
96
  import type { RepairLifecycleObserver } from './multicast-manager.js'
64
97
  import { REPAIR_PRIORITY_MIN } from './repair-layers.js'
65
98
 
@@ -112,18 +145,24 @@ export interface RepairFetchRequest {
112
145
  /** Repair track whose block `sbn` is fetched. */
113
146
  readonly repairTrack: string
114
147
  /**
115
- * The block's key, by `blockProfile` (BLO-35597 D2a):
116
- * - `k-padded-v1`: the source block number, which IS the repair-track MoQ
117
- * group id (fetch `[sbn, sbn]`).
118
- * - `iso-ssbg1-v1`: the block's 32-bit SS_Start. The MoQ group id is the
119
- * 62-bit `extSsStart(wrapEpoch, sbn)`; a receiver that knows only a lost
120
- * SS_ID fetches `repairFetchRange(lostSsId, kMax, anchor)`, where `anchor`
121
- * is `{ previousBlockStart }` (the extended start of the last block
122
- * delimited before it) or `{ reference }` (an epoch reference). Never use
123
- * it as a group id directly.
148
+ * The block's key: its 32-bit SS_Start (ISO/IEC 23008-1 C.5.3). The field
149
+ * keeps its historical name, but ssbg_mode1 blocks have no source block
150
+ * number (BLO-35597 D2a). The repair group's MoQ id is the 62-bit
151
+ * `extSsStart(wrapEpoch, sbn)`; a receiver that knows only a lost SS_ID
152
+ * fetches `repairFetchRange(lostSsId, kMax, anchor)`, where `anchor` is
153
+ * `{ previousBlockStart }` (the extended start of the last block delimited
154
+ * before it) or `{ reference }` (an epoch reference). Never use it as a
155
+ * group id directly: SS_Start wraps at 2^32, a MoQ group id never goes
156
+ * backwards.
124
157
  */
125
158
  readonly sbn: number
126
- /** The block profile `sbn` is keyed by (the catalog `fec.blockProfile`). */
159
+ /**
160
+ * The block profile `sbn` is keyed by: the catalog `fec.blockProfile`,
161
+ * which is always `iso-ssbg1-v1`. Required, and validated with
162
+ * `parseFecBlockProfile` when the request is queued, so a stream configured
163
+ * with any other token (the retired `k-padded-v1` included) never reaches
164
+ * the transport.
165
+ */
127
166
  readonly blockProfile: FecBlockProfile
128
167
  /** The source packetId the block belongs to. */
129
168
  readonly packetId: number
@@ -224,6 +263,30 @@ export function repairFetchSubscriberPriority(
224
263
  return { kind: 'carry', subscriberPriority: Math.max(repair, REPAIR_PRIORITY_MIN) }
225
264
  }
226
265
 
266
+ /** What `RepairFetchHost.fecManager.blockSymbolCounts` reports for one open block. */
267
+ export interface BlockSymbolCounts {
268
+ readonly sources: number
269
+ readonly repairs: number
270
+ readonly authoredLength: number | undefined
271
+ readonly repairGroupLength: number | undefined
272
+ }
273
+
274
+ /**
275
+ * Whether a block of `blockClass` may get the keyframe late-repair budget:
276
+ * a `keyframe` block always (in-band RAP evidence), an `unknown` block only
277
+ * while its stream's classifier is `classifying` (the window rule could not
278
+ * exclude a RAP). An `all-protected` stream reads `unknown` for every block,
279
+ * delta-only ones included, so there `unknown` is no evidence of a RAP and
280
+ * earns no hold. Audio and delta never do.
281
+ */
282
+ export function keyframeBudgetEligible(
283
+ blockClass: BlockClass,
284
+ classifierMode: ClassifierMode | undefined,
285
+ ): boolean {
286
+ if (blockClass === 'keyframe') return true
287
+ return blockClass === 'unknown' && classifierMode === 'classifying'
288
+ }
289
+
227
290
  export interface WireRepairFetchOptions {
228
291
  resolveTarget: ResolveRepairTarget
229
292
  transport: RepairFetchTransport
@@ -250,6 +313,20 @@ export interface WireRepairFetchOptions {
250
313
  * (`presentation-delay-unavailable`).
251
314
  */
252
315
  presentationDelayMs: (packetId: number, catalogTrackName?: string) => number
316
+ /**
317
+ * How long after the first symbol of a block that may hold a RAP a repair
318
+ * FETCH of it may still land, in ms (optional). Such a block
319
+ * (`keyframeBudgetEligible`) gets the larger of this and
320
+ * `presentationDelayMs`, still never later than the release gate's hold
321
+ * ceiling and never earlier than the multicast wait; RTT admission is
322
+ * unchanged. Losing a keyframe block costs the rest of its GOP, so a player
323
+ * may hold the block (and the frames released after it) while its FETCH is
324
+ * in flight rather than freeze to the next keyframe. Absent, throwing, or
325
+ * not finite and positive: every block gets the presentation deadline
326
+ * alone. Never applied to audio, delta, or an `unknown` block of an
327
+ * `all-protected` stream.
328
+ */
329
+ keyframeRepairBudgetMs?: (packetId: number, catalogTrackName?: string) => number
253
330
  }
254
331
 
255
332
  /** Why the D-28 layer asked for a repair: the block's class at its deadline. */
@@ -273,11 +350,25 @@ export type RepairSkipReason =
273
350
  export interface RepairFetchHost {
274
351
  readonly fecManager: {
275
352
  blockProfileForPacket(packetId: number): FecBlockProfile | undefined
276
- repairFetchTimeoutMsForBlock(sbn: number, packetId: number, catalogTrackName?: string): number
353
+ repairFetchTimeoutMsForBlock(sbn: number, packetId: number, catalogTrackName?: string): number | undefined
277
354
  /** Receiver-local time of the block's first accepted symbol, if any. */
278
355
  blockAnchorAtMs(sbn: number, packetId: number, catalogTrackName?: string): number | undefined
356
+ /** The stream's classifier mode (optional; absent reads as unknown). */
357
+ classifierModeFor?(packetId: number, catalogTrackName?: string): { readonly mode: ClassifierMode }
358
+ /**
359
+ * An open block's received sources and distinct repair symbols, its K'
360
+ * (SSB_length) and RSB_length (optional). The repair group carries
361
+ * RSB_length symbols, so it can complete the block only when
362
+ * sources + RSB_length >= K'; a FETCH that ended leaving fewer than K'
363
+ * distinct symbols cannot be decoding it.
364
+ */
365
+ blockSymbolCounts?(
366
+ sbn: number,
367
+ packetId: number,
368
+ catalogTrackName?: string,
369
+ ): BlockSymbolCounts | undefined
279
370
  /** How long a terminal block stays authoritative: the release-gate hold ceiling. */
280
- terminalRetentionMsForPacket(packetId: number): number
371
+ terminalRetentionMsForPacket(packetId: number): number | undefined
281
372
  /** Keep the block open to `untilAtMs` for an admitted FETCH. */
282
373
  holdBlockForRepair(
283
374
  sbn: number,
@@ -289,6 +380,20 @@ export interface RepairFetchHost {
289
380
  releaseRepairHold(sbn: number, packetId: number, catalogTrackName?: string): void
290
381
  }
291
382
  onRepairSubscribe(cb: RepairSubscribeCallback): void
383
+ /**
384
+ * Arrival time of the earliest frame the in-order release gate holds for
385
+ * the stream, or undefined (optional; absent, the block's anchor bounds the
386
+ * ceiling alone). The gate releases that frame `terminalRetentionMsForPacket`
387
+ * after it, whatever its blocks are doing.
388
+ */
389
+ earliestGatedFrameAtMs?(packetId: number, catalogTrackName?: string): number | undefined
390
+ /** The keyframe budget extended a request's deadline by `extensionMs` (optional). */
391
+ noteKeyframeBudgetGranted?(
392
+ extensionMs: number,
393
+ sbn: number,
394
+ packetId: number,
395
+ catalogTrackName?: string,
396
+ ): void
292
397
  addRepairLifecycleObserver(observer: RepairLifecycleObserver): () => void
293
398
  addTrackResetObserver(observer: (packetId: number, catalogTrackName: string) => void): () => void
294
399
  clearRepairForBlock(sbn: number, packetId: number, catalogTrackName?: string): void
@@ -308,10 +413,24 @@ export interface RepairFetchHost {
308
413
  packetId: number,
309
414
  catalogTrackName?: string,
310
415
  ): void
311
- /** A request the scheduler did not send (see RepairSkipReason). */
416
+ /**
417
+ * A request the scheduler did not send (see RepairSkipReason).
418
+ * `measurement.priority` is the request's repair priority (0 keyframe or
419
+ * unknown, 1 audio, 2 delta).
420
+ */
312
421
  noteRepairSkipped(
313
422
  reason: RepairSkipReason,
314
- measurement: { readonly rttMs: number | null; readonly budgetMs: number },
423
+ measurement: { readonly rttMs: number | null; readonly budgetMs: number; readonly priority?: RepairPriority },
424
+ sbn: number,
425
+ packetId: number,
426
+ catalogTrackName?: string,
427
+ ): void
428
+ /**
429
+ * A FETCH the scheduler admitted and handed to the transport (optional):
430
+ * every attempt, a retry or a reprioritised restart included.
431
+ */
432
+ noteRepairFetchSent?(
433
+ priority: RepairPriority,
315
434
  sbn: number,
316
435
  packetId: number,
317
436
  catalogTrackName?: string,
@@ -339,9 +458,10 @@ interface RepairEntry {
339
458
  subscriberPriority: number | undefined
340
459
  /**
341
460
  * Absolute `performance.now()` millisecond by which a FETCH must land: the
342
- * block's presentation deadline (see the module note).
461
+ * block's presentation deadline (see the module note). Only ever moves
462
+ * later: a block reclassified from delta can gain the keyframe budget.
343
463
  */
344
- readonly deadlineAt: number
464
+ deadlineAt: number
345
465
  /** Monotonic enqueue order, the EDF tie-break. */
346
466
  readonly order: number
347
467
  attempts: number
@@ -404,6 +524,18 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
404
524
  if (reason === 'preempted') releaseHold(entry)
405
525
  }
406
526
 
527
+ /** The keyframe budget for a P0 block, or null: absent, throwing or not positive. */
528
+ const readKeyframeBudget = (packetId: number, catalogTrackName: string | undefined): number | null => {
529
+ const reader = opts.keyframeRepairBudgetMs
530
+ if (reader === undefined) return null
531
+ try {
532
+ const budgetMs = reader(packetId, catalogTrackName)
533
+ return Number.isFinite(budgetMs) && budgetMs > 0 ? budgetMs : null
534
+ } catch {
535
+ return null
536
+ }
537
+ }
538
+
407
539
  const readRtt = (): number | null => {
408
540
  try {
409
541
  const rtt = opts.reliableRttMs()
@@ -427,7 +559,7 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
427
559
  clearRepair(entry.sbn, entry.packetId, entry.catalogTrackName)
428
560
  mc.noteRepairSkipped(
429
561
  rttMs === null ? 'rtt-unmeasured' : 'rtt-exceeds-budget',
430
- { rttMs, budgetMs },
562
+ { rttMs, budgetMs, priority: entry.priority },
431
563
  entry.sbn,
432
564
  entry.packetId,
433
565
  entry.catalogTrackName,
@@ -479,6 +611,7 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
479
611
  const start = (entry: RepairEntry, counted = true): void => {
480
612
  if (!admit(entry, performance.now())) return
481
613
  if (counted) entry.attempts++
614
+ mc.noteRepairFetchSent?.(entry.priority, entry.sbn, entry.packetId, entry.catalogTrackName)
482
615
  const run: FetchRun = { controller: new AbortController(), stopped: null }
483
616
  entry.running = run
484
617
  // Hold the block open to the presentation deadline while this FETCH can
@@ -529,6 +662,45 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
529
662
  .forEach((entry) => start(entry))
530
663
  }
531
664
 
665
+ /**
666
+ * Whether the block may still be decoding from what it holds: false only
667
+ * when the host shows fewer distinct symbols than its K'. A FETCH that
668
+ * ended leaving it short delivered all it could (its group carries no more
669
+ * symbols), so holding the block, and every frame behind it, longer buys
670
+ * nothing: it goes back to its multicast wait. Unknown counts read as
671
+ * decodable (the FEC layer resolves the block).
672
+ */
673
+ const symbolCounts = (
674
+ sbn: number,
675
+ packetId: number,
676
+ catalogTrackName: string | undefined,
677
+ ): BlockSymbolCounts | undefined => {
678
+ try {
679
+ return mc.fecManager.blockSymbolCounts?.(sbn, packetId, catalogTrackName)
680
+ } catch {
681
+ return undefined
682
+ }
683
+ }
684
+ const decodable = (entry: RepairEntry): boolean => {
685
+ const counts = symbolCounts(entry.sbn, entry.packetId, entry.catalogTrackName)
686
+ if (counts === undefined || counts.authoredLength === undefined) return true
687
+ return counts.sources + counts.repairs >= counts.authoredLength
688
+ }
689
+ /**
690
+ * Whether the block's repair group can complete it: its received sources
691
+ * plus every symbol the group carries reach K'. A loss of more sources than
692
+ * the group has repair symbols (every source-only loss among them: the
693
+ * block then already holds the whole group) gets no FETCH-length hold. True
694
+ * while the counts are not known (no repair stated the block yet).
695
+ */
696
+ const groupCanComplete = (sbn: number, packetId: number, catalogTrackName: string | undefined): boolean => {
697
+ const counts = symbolCounts(sbn, packetId, catalogTrackName)
698
+ if (counts === undefined || counts.authoredLength === undefined || counts.repairGroupLength === undefined) {
699
+ return true
700
+ }
701
+ return counts.sources + counts.repairGroupLength >= counts.authoredLength
702
+ }
703
+
532
704
  const finish = (entry: RepairEntry, run: FetchRun, fed: number, error: unknown): void => {
533
705
  if (run.stopped !== null || entry.running !== run || entries.get(entry.key) !== entry) {
534
706
  return
@@ -539,7 +711,7 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
539
711
  // A fetch that ended without feeding anything cannot resolve the block;
540
712
  // release the slot and the hold so failure accounting is not wedged. A
541
713
  // fetch that fed symbols leaves resolution to the FEC layer.
542
- if (fed === 0) {
714
+ if (fed === 0 || !decodable(entry)) {
543
715
  releaseHold(entry)
544
716
  clearRepair(entry.sbn, entry.packetId, entry.catalogTrackName)
545
717
  }
@@ -568,15 +740,18 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
568
740
 
569
741
  // The profile the block key is in; a stream reaching repair was configured
570
742
  // from its catalog, so an absent profile is a wiring fault, not a default.
571
- // Resolved when the request arrives (onRepairSubscribe below), never inside
572
- // execute: there its throw would read as an ordinary fetch failure, warned
573
- // once per block while the stream silently lost unicast repair.
743
+ // Any token other than `iso-ssbg1-v1` (the retired `k-padded-v1` included)
744
+ // is one too: `parseFecBlockProfile` refuses it, whatever an untyped host
745
+ // returns. Resolved when the request arrives (onRepairSubscribe below),
746
+ // never inside execute: there its throw would read as an ordinary fetch
747
+ // failure, warned once per block while the stream silently lost unicast
748
+ // repair.
574
749
  const blockProfileOf = (packetId: number): FecBlockProfile => {
575
- const profile = mc.fecManager.blockProfileForPacket(packetId)
750
+ const profile: unknown = mc.fecManager.blockProfileForPacket(packetId)
576
751
  if (profile === undefined) {
577
752
  throw new Error(`[RepairFetch] packetId=${packetId} has no configured fec.blockProfile`)
578
753
  }
579
- return profile
754
+ return parseFecBlockProfile(profile, `[RepairFetch] packetId=${packetId} fec.blockProfile`)
580
755
  }
581
756
 
582
757
  const execute = async (entry: RepairEntry, run: FetchRun): Promise<void> => {
@@ -630,6 +805,19 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
630
805
  if (wire === null) return
631
806
  entry.priority = promoted
632
807
  entry.subscriberPriority = wire.subscriberPriority
808
+ // A block that turned out to carry a keyframe gets the keyframe budget
809
+ // its request would have had (never a shorter deadline than it had).
810
+ const promotedDeadline = presentationDeadlineAt(
811
+ entry.sbn,
812
+ entry.packetId,
813
+ entry.catalogTrackName,
814
+ performance.now(),
815
+ event.to,
816
+ )
817
+ if (promotedDeadline !== null && promotedDeadline.deadlineAt > entry.deadlineAt) {
818
+ entry.deadlineAt = promotedDeadline.deadlineAt
819
+ noteBudget(entry, promotedDeadline.extensionMs)
820
+ }
633
821
  if (entry.running) {
634
822
  // The running FETCH carries the delta priority. Cancel it and send
635
823
  // the block's repair again under its new class (§11.4.5): a keyframe
@@ -659,18 +847,26 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
659
847
  * is open that long whatever happens, so a FETCH landing inside it still
660
848
  * counts) and above by anchor + the release gate's hold ceiling (a successor
661
849
  * frame may not wait behind a block longer than that). A block no symbol
662
- * reached has no anchor; its deadline is the multicast wait.
850
+ * reached has no anchor; its deadline is the multicast wait. The ceiling is
851
+ * measured from the earlier of the anchor and the earliest frame the gate
852
+ * holds for the stream (see the module note). A block that may hold a RAP
853
+ * (`keyframeBudgetEligible`) uses the larger of the presentation delay and
854
+ * the keyframe budget; `extensionMs` is how much later that made it.
663
855
  */
664
856
  const presentationDeadlineAt = (
665
857
  sbn: number,
666
858
  packetId: number,
667
859
  catalogTrackName: string | undefined,
668
860
  now: number,
669
- ): number | null => {
670
- const waitDeadlineAt =
671
- now + mc.fecManager.repairFetchTimeoutMsForBlock(sbn, packetId, catalogTrackName)
861
+ blockClass: BlockClass,
862
+ ): { readonly deadlineAt: number; readonly extensionMs: number } | null => {
863
+ // Undefined: the packetId is no longer configured (released), so it has
864
+ // no repair budget.
865
+ const waitMs = mc.fecManager.repairFetchTimeoutMsForBlock(sbn, packetId, catalogTrackName)
866
+ if (waitMs === undefined) return null
867
+ const waitDeadlineAt = now + waitMs
672
868
  const anchor = mc.fecManager.blockAnchorAtMs(sbn, packetId, catalogTrackName)
673
- if (anchor === undefined) return waitDeadlineAt
869
+ if (anchor === undefined) return { deadlineAt: waitDeadlineAt, extensionMs: 0 }
674
870
  let delayMs: number
675
871
  try {
676
872
  delayMs = opts.presentationDelayMs(packetId, catalogTrackName)
@@ -678,8 +874,40 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
678
874
  return null
679
875
  }
680
876
  if (!(Number.isFinite(delayMs) && delayMs > 0)) return null
681
- const ceilingAt = anchor + mc.fecManager.terminalRetentionMsForPacket(packetId)
682
- return Math.max(waitDeadlineAt, Math.min(anchor + delayMs, ceilingAt))
877
+ const retentionMs = mc.fecManager.terminalRetentionMsForPacket(packetId)
878
+ if (retentionMs === undefined) return null
879
+ const ceilingAt = Math.min(anchor, earliestGatedFrameAt(packetId, catalogTrackName) ?? anchor) + retentionMs
880
+ const deadlineAt = (delay: number): number => Math.max(waitDeadlineAt, Math.min(anchor + delay, ceilingAt))
881
+ const base = deadlineAt(delayMs)
882
+ const budgetMs =
883
+ keyframeBudgetEligible(blockClass, classifierMode(packetId, catalogTrackName)) &&
884
+ groupCanComplete(sbn, packetId, catalogTrackName)
885
+ ? readKeyframeBudget(packetId, catalogTrackName)
886
+ : null
887
+ if (budgetMs === null || budgetMs <= delayMs) return { deadlineAt: base, extensionMs: 0 }
888
+ const extended = deadlineAt(budgetMs)
889
+ return { deadlineAt: extended, extensionMs: extended - base }
890
+ }
891
+
892
+ const earliestGatedFrameAt = (packetId: number, catalogTrackName: string | undefined): number | undefined => {
893
+ try {
894
+ const at = mc.earliestGatedFrameAtMs?.(packetId, catalogTrackName)
895
+ return at !== undefined && Number.isFinite(at) ? at : undefined
896
+ } catch {
897
+ return undefined
898
+ }
899
+ }
900
+
901
+ const classifierMode = (packetId: number, catalogTrackName: string | undefined): ClassifierMode | undefined => {
902
+ try {
903
+ return mc.fecManager.classifierModeFor?.(packetId, catalogTrackName).mode
904
+ } catch {
905
+ return undefined
906
+ }
907
+ }
908
+
909
+ const noteBudget = (entry: Pick<RepairEntry, 'sbn' | 'packetId' | 'catalogTrackName'>, extensionMs: number): void => {
910
+ if (extensionMs > 0) mc.noteKeyframeBudgetGranted?.(extensionMs, entry.sbn, entry.packetId, entry.catalogTrackName)
683
911
  }
684
912
 
685
913
  mc.onRepairSubscribe((sbn, packetId, catalogTrackName, blockClass) => {
@@ -729,12 +957,13 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
729
957
  return
730
958
  }
731
959
  const now = performance.now()
732
- const deadlineAt = presentationDeadlineAt(sbn, packetId, catalogTrackName, now)
733
- if (deadlineAt === null) {
960
+ const priority = repairPriorityForClass(blockClass)
961
+ const deadline = presentationDeadlineAt(sbn, packetId, catalogTrackName, now, blockClass)
962
+ if (deadline === null) {
734
963
  clearRepair(sbn, packetId, catalogTrackName)
735
964
  mc.noteRepairSkipped(
736
965
  'presentation-delay-unavailable',
737
- { rttMs: readRtt(), budgetMs: 0 },
966
+ { rttMs: readRtt(), budgetMs: 0, priority },
738
967
  sbn,
739
968
  packetId,
740
969
  catalogTrackName,
@@ -746,14 +975,15 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
746
975
  ...identity,
747
976
  repairTrack: target.repairTrack,
748
977
  blockProfile,
749
- priority: repairPriorityForClass(blockClass),
978
+ priority,
750
979
  subscriberPriority: wire.subscriberPriority,
751
- deadlineAt,
980
+ deadlineAt: deadline.deadlineAt,
752
981
  order: enqueueOrder++,
753
982
  attempts: 0,
754
983
  running: null,
755
984
  }
756
985
  entries.set(key, entry)
986
+ noteBudget(entry, deadline.extensionMs)
757
987
  if (entry.priority < 2) preemptDeltas()
758
988
  dispatch()
759
989
  })
@@ -20,7 +20,7 @@
20
20
  // rendition's `fec.repairTrack` and needs no `repair.renditions` entry; an
21
21
  // entry there is optional and, when present, must agree with the source.
22
22
 
23
- import { parseFecBlockProfile, type FecBlockProfile } from "@blockcast/mmt-base";
23
+ import { isFecBlockProfile, parseFecBlockProfile, type FecBlockProfile } from "@blockcast/mmt-base";
24
24
 
25
25
  /** Lowest MoQT-scale priority a repair track may declare. */
26
26
  export const REPAIR_PRIORITY_MIN = 192;
@@ -44,7 +44,8 @@ export type RepairContractCode =
44
44
  | "track_repair_overlay"
45
45
  | "track_repair_geometry"
46
46
  | "track_fec_bounds"
47
- | "track_fec_block_profile";
47
+ | "track_fec_block_profile"
48
+ | "track_fec_block_profile_unimplemented";
48
49
 
49
50
  /** Reports one contract violation and never returns. */
50
51
  export type RepairContractFail = (code: RepairContractCode, path: string, message: string) => never;
@@ -69,12 +70,23 @@ export const throwRepairContractError: RepairContractFail = (code, path, message
69
70
  * the one rule both catalog dialects, the CMSF validator and the per-track
70
71
  * resolver apply.
71
72
  *
72
- * A `fec` block that declares an FEC instance (any `algorithm` other than
73
- * `"none"`) MUST name its block profile, so an absent or unknown token fails
74
- * with `track_fec_block_profile` at `path`. A block declaring no FEC instance
75
- * may omit it (returns undefined), but a token it does carry must be known.
76
- * The token is never defaulted and never inferred: `k-padded-v1` and
77
- * `iso-ssbg1-v1` carry identical wire tuples whose repair math differs.
73
+ * draft-ramadan-moq-fec §5.1 defines exactly one profile, `iso-ssbg1-v1`, and
74
+ * it is the only one this library implements. A `fec` block that declares an
75
+ * FEC instance (any `algorithm` other than `"none"`) MUST name it; a block
76
+ * declaring no FEC instance may omit the token (returns undefined), but a token
77
+ * it does carry must be implemented. Failures are reported at `path`:
78
+ *
79
+ * - `track_fec_block_profile_unimplemented`: a non-empty string that names no
80
+ * implemented profile. The retired Blockcast-private `k-padded-v1` is one
81
+ * such token; a near-miss such as `"iso-ssbg1"` is another, never
82
+ * normalized.
83
+ * - `track_fec_block_profile`: no token on a declared FEC instance, or a value
84
+ * that is not a non-empty string.
85
+ *
86
+ * The token is never defaulted and never inferred from the wire. A receiver
87
+ * treats either failure as "FEC unavailable" for that track alone (it consumes
88
+ * the source without FEC and joins none of its repair tracks); a conformance
89
+ * validator rejects the catalog.
78
90
  *
79
91
  * @param path JSON path of the `blockProfile` field, for the error.
80
92
  */
@@ -97,6 +109,14 @@ export function readFecBlockProfile(
97
109
  fail: RepairContractFail,
98
110
  ): FecBlockProfile | undefined {
99
111
  if (value === undefined && !declaresFecInstance) return undefined;
112
+ if (isFecBlockProfile(value)) return value;
113
+ if (typeof value === "string" && value.length > 0) {
114
+ return fail(
115
+ "track_fec_block_profile_unimplemented",
116
+ path,
117
+ `${JSON.stringify(value)} is not an implemented FEC block profile; only "iso-ssbg1-v1" is implemented`,
118
+ );
119
+ }
100
120
  try {
101
121
  return parseFecBlockProfile(value, "blockProfile");
102
122
  } catch (error) {