@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockcast/mmt-container",
3
- "version": "0.3.0",
3
+ "version": "0.4.0-main.1cd3cdea89da",
4
4
  "description": "MMTP/LOC container parsing for MMT over MoQ and SSM",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -152,7 +152,8 @@
152
152
  },
153
153
  "./catalog.schema.json": "./schemas/catalog.schema.json",
154
154
  "./test-vectors/catalog-validation.json": "./test-vectors/catalog-validation.json",
155
- "./test-vectors/align.json": "./test-vectors/align.json"
155
+ "./test-vectors/align.json": "./test-vectors/align.json",
156
+ "./test-vectors/catalog-timing.json": "./test-vectors/catalog-timing.json"
156
157
  },
157
158
  "files": [
158
159
  "dist",
@@ -177,21 +178,13 @@
177
178
  },
178
179
  "dependencies": {
179
180
  "@noble/hashes": "^1.8.0",
180
- "@blockcast/mmt-fec": "^0.3.0",
181
- "@blockcast/mmt-manifest-verify": "^0.3.0",
182
- "@blockcast/fec-worker": "^0.3.0",
183
- "@blockcast/mmt-alta-parse": "^0.3.0",
184
- "@blockcast/mmt-base": "^0.3.0",
181
+ "@blockcast/mmt-fec": "0.3.0-main.1cd3cdea89da",
182
+ "@blockcast/mmt-manifest-verify": "0.3.0-main.1cd3cdea89da",
183
+ "@blockcast/fec-worker": "0.3.0-main.1cd3cdea89da",
184
+ "@blockcast/mmt-base": "0.3.0-main.1cd3cdea89da",
185
185
  "ajv": "^8.17.1",
186
186
  "ajv-formats": "^3.0.1"
187
187
  },
188
- "bundledDependencies": [
189
- "@blockcast/mmt-fec",
190
- "@blockcast/mmt-manifest-verify",
191
- "@blockcast/fec-worker",
192
- "@blockcast/mmt-alta-parse",
193
- "@blockcast/mmt-base"
194
- ],
195
188
  "devDependencies": {
196
189
  "@blockcast/mmt-transport": "file:../transport",
197
190
  "esbuild": "^0.28.0",
@@ -206,13 +206,13 @@
206
206
  "properties": {
207
207
  "algorithm": { "enum": ["raptorq", "reed-solomon"] },
208
208
  "blockProfile": {
209
- "enum": ["k-padded-v1", "iso-ssbg1-v1"],
210
- "description": "FEC block profile (ISO/IEC 23008-1 Annex C). Required whenever algorithm declares an FEC instance (anything but \"none\"); never defaulted or inferred. k-padded-v1: zero-padded K-symbol blocks, SS_Start = SBN*K. iso-ssbg1-v1: ssbg_mode1, K' = SSB_length, consecutive SS_IDs."
209
+ "enum": ["iso-ssbg1-v1"],
210
+ "description": "FEC block profile (ISO/IEC 23008-1 Annex C, draft-ramadan-moq-fec 5.1). Required whenever algorithm declares an FEC instance (anything but \"none\"); never defaulted or inferred. The only profile is iso-ssbg1-v1: ssbg_mode1, K' = SSB_length, consecutive SS_IDs. Any other token, the retired k-padded-v1 included, is invalid; a receiver treats such a track as having no FEC."
211
211
  },
212
212
  "sourceSymbols": { "$ref": "#/$defs/positiveInteger" },
213
213
  "repairSymbols": { "$ref": "#/$defs/positiveInteger" },
214
214
  "symbolSize": { "$ref": "#/$defs/positiveInteger" },
215
- "interleaveDepthMs": { "$ref": "#/$defs/positiveInteger" },
215
+ "interleaveDepthMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
216
216
  "reorderToleranceMs": { "$ref": "#/$defs/nonNegativeNumber" },
217
217
  "repairTrack": { "type": "string", "minLength": 1 },
218
218
  "repairContainer": { "const": "native" },
@@ -169,11 +169,11 @@ export interface FecCatalogConfig {
169
169
  algorithm: FecAlgorithm;
170
170
  /** FEC block profile (BLO-35597, ISO/IEC 23008-1 Annex C). REQUIRED when
171
171
  * `algorithm` declares an FEC instance (anything but `"none"`); optional
172
- * on `"none"`, where a present token must still be known. Never defaulted
173
- * and never inferred from the wire: `k-padded-v1` (zero-padded K-symbol
174
- * blocks, SS_Start = SBN*K) and `iso-ssbg1-v1` (ssbg_mode1, K' =
175
- * SSB_length, consecutive SS_IDs) carry identical wire tuples whose repair
176
- * math differs. */
172
+ * on `"none"`, where a present token must still be implemented. The only
173
+ * profile is `iso-ssbg1-v1` (ssbg_mode1, K' = SSB_length, consecutive
174
+ * SS_IDs; draft-ramadan-moq-fec §5.1). Never defaulted and never inferred
175
+ * from the wire: a track naming any other token (the retired `k-padded-v1`
176
+ * included) has no FEC (`TrackFecUnavailable`). */
177
177
  blockProfile?: FecBlockProfile;
178
178
  /** K — source symbols per block (REQUIRED). */
179
179
  sourceSymbols: number;
@@ -181,8 +181,8 @@ export interface FecCatalogConfig {
181
181
  repairSymbols: number;
182
182
  /** T — bytes per symbol, 8-byte aligned (REQUIRED). */
183
183
  symbolSize: number;
184
- /** FEC block span in MILLISECONDS (OPTIONAL, default 0 = single-group blocks).
185
- * D is the positive round-half-up value of interleaveDepthMs / GOP_duration_ms.
184
+ /** First-to-last source/repair send span in milliseconds.
185
+ * Zero or absence means no elapsed deadline; in-band FEC remains usable.
186
186
  * BLO-14526: renamed from the legacy `interleaveDepth` count-era key — no fallback read. */
187
187
  interleaveDepthMs?: number;
188
188
  /** Declared jitter/reorder allowance in MILLISECONDS.
@@ -241,7 +241,14 @@ export interface FecCatalogConfig {
241
241
  jitterBufferMs?: number;
242
242
  }
243
243
 
244
- export function isFecCatalogConfig(obj: unknown): obj is FecCatalogConfig {
244
+ /**
245
+ * Whether a catalog `fec` block carries the FEC instance geometry a receiver
246
+ * configures, its block profile aside: a supported `algorithm`, positive
247
+ * `sourceSymbols`, `repairSymbols` and `symbolSize` (8-byte aligned for
248
+ * RaptorQ), and a non-empty `repairTrack`. A block that fails this is
249
+ * malformed whatever its profile. Total: never throws.
250
+ */
251
+ export function isFecCatalogGeometry(obj: unknown): boolean {
245
252
  if (typeof obj !== "object" || obj === null) return false;
246
253
  const o = obj as Record<string, unknown>;
247
254
  const algorithm = o["algorithm"];
@@ -253,11 +260,24 @@ export function isFecCatalogConfig(obj: unknown): obj is FecCatalogConfig {
253
260
  typeof o["repairSymbols"] === "number" && o["repairSymbols"] >= 1 &&
254
261
  typeof symbolSize === "number" && symbolSize >= 1 &&
255
262
  (algorithm !== "raptorq" || symbolSize % 8 === 0) &&
256
- typeof o["repairTrack"] === "string" && (o["repairTrack"] as string).length > 0 &&
257
- (isFecBlockProfile(o["blockProfile"]) || (algorithm === "none" && o["blockProfile"] === undefined))
263
+ typeof o["repairTrack"] === "string" && (o["repairTrack"] as string).length > 0
258
264
  );
259
265
  }
260
266
 
267
+ /**
268
+ * Whether a catalog `fec` block is a complete `FecCatalogConfig`: its geometry
269
+ * holds (`isFecCatalogGeometry`) and it names the implemented block profile,
270
+ * `iso-ssbg1-v1` (BLO-35597). On `algorithm: "none"` the profile may be
271
+ * omitted. Any other token, the retired `k-padded-v1` included, is not a
272
+ * known profile, so this is false for it; a receiver resolves such a track to
273
+ * no FEC (`TrackFecUnavailable`) rather than failing the session.
274
+ */
275
+ export function isFecCatalogConfig(obj: unknown): obj is FecCatalogConfig {
276
+ if (!isFecCatalogGeometry(obj)) return false;
277
+ const o = obj as Record<string, unknown>;
278
+ return isFecBlockProfile(o["blockProfile"]) || (o["algorithm"] === "none" && o["blockProfile"] === undefined);
279
+ }
280
+
261
281
  // ── Multicast Catalog Extension (CARP §4.1-4.4) ───────────────
262
282
 
263
283
  export type MulticastProtocol = "ssm" | "asm" | "amt" | "atsc3";
@@ -298,17 +318,6 @@ export interface MulticastEndpoint {
298
318
  * type-narrow with `typeof t === "string"` to handle both.
299
319
  */
300
320
  tracks: MulticastTrack[];
301
- /**
302
- * AMT relay hostname.
303
- *
304
- * @deprecated Superseded by catalog-level `multicast.networkSource`
305
- * (`{type: "amt", discovery, relay}`). Retained so a catalog published
306
- * before the migration still parses; emitters MUST NOT write it, and
307
- * `catalog.schema.json` already rejects it (`additionalProperties: false`
308
- * on the endpoint), as does moq-rs `MulticastEndpoint`
309
- * (`deny_unknown_fields`, and it carries no relay field at all).
310
- */
311
- relayAddress?: string;
312
321
  /**
313
322
  * Aggregate bandwidth of this endpoint in bits per second.
314
323
  * RECOMMENDED per draft §4.1 — enables capacity-aware joins.
@@ -671,6 +680,7 @@ export type CmsfCatalogErrorCode =
671
680
  | "track_fec"
672
681
  | "track_fec_bounds"
673
682
  | "track_fec_block_profile"
683
+ | "track_fec_block_profile_unimplemented"
674
684
  | "track_repair_track"
675
685
  | "track_repair_depends"
676
686
  | "track_repair_layer"
@@ -681,6 +691,7 @@ export type CmsfCatalogErrorCode =
681
691
  | "multicast_auth"
682
692
  | "multicast_track"
683
693
  | "multicast_packet_id"
694
+ | "multicast_relay_address"
684
695
  | "archive_object"
685
696
  | "archive_origin";
686
697
 
@@ -843,8 +854,9 @@ export function validateCmsfMmtpCatalog(value: unknown): CmsfCatalog {
843
854
  "repair layers are self-describing fec-repair tracks (depends, repairLayer); fec.enhancementRepair is not supported",
844
855
  );
845
856
  }
846
- if (config["interleaveDepthMs"] !== undefined && !positiveInteger(config["interleaveDepthMs"])) {
847
- catalogError("track_fec", `${path}.fec.interleaveDepthMs`, "must be a positive integer");
857
+ if (config["interleaveDepthMs"] !== undefined &&
858
+ (!Number.isSafeInteger(config["interleaveDepthMs"]) || (config["interleaveDepthMs"] as number) < 0)) {
859
+ catalogError("track_fec", `${path}.fec.interleaveDepthMs`, "must be a non-negative safe integer");
848
860
  }
849
861
  if (algorithm !== "none") {
850
862
  for (const field of ["sourceSymbols", "repairSymbols", "symbolSize"] as const) {
@@ -856,7 +868,7 @@ export function validateCmsfMmtpCatalog(value: unknown): CmsfCatalog {
856
868
  catalogError("track_fec", `${path}.fec.repairTrack`, "must be a non-empty string");
857
869
  }
858
870
  }
859
- // Required on a declared FEC instance, optional but known on "none".
871
+ // Required on a declared FEC instance, optional but implemented on "none".
860
872
  readFecBlockProfile(config["blockProfile"], `${path}.fec.blockProfile`, algorithm !== "none", catalogError);
861
873
  }
862
874
  }
@@ -935,6 +947,16 @@ export function validateCmsfMmtpCatalog(value: unknown): CmsfCatalog {
935
947
  for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {
936
948
  const endpoint = endpoints[endpointIndex];
937
949
  if (typeof endpoint !== "object" || endpoint === null || Array.isArray(endpoint)) continue;
950
+ // The endpoint relay moved to `multicast.networkSource[{type:"amt",relay}]`.
951
+ // Refuse rather than ignore: a dropped relay strands an AMT endpoint
952
+ // with no tunnel and reads as a gateway failure, not a bad catalog.
953
+ if ("relayAddress" in endpoint) {
954
+ catalogError(
955
+ "multicast_relay_address",
956
+ `$.multicast.endpoints[${endpointIndex}].relayAddress`,
957
+ 'relayAddress is retired; publish the relay as multicast.networkSource[{type:"amt",relay}]',
958
+ );
959
+ }
938
960
  const refs = (endpoint as Record<string, unknown>)["tracks"];
939
961
  if (!Array.isArray(refs)) continue;
940
962
  const packetIds = new Map<number, string>();
@@ -14,7 +14,7 @@ import {
14
14
  } from "@blockcast/mmt-base";
15
15
  import { catalogFecInterleaveMs, type FecInterleaveCatalog } from "@blockcast/mmt-fec";
16
16
  import { resolveGroupDurationMs } from "./carp-catalog.js";
17
- import { MIN_INTERLEAVE_DEPTH_MS, catalogDeclaresFec, isoBlockSpanUsable } from "./fec-state.js";
17
+ import { catalogDeclaresFec, isoBlockSpanUsable } from "./fec-state.js";
18
18
  import {
19
19
  assembleRepairLayers,
20
20
  assertRepairTrackReachable,
@@ -217,20 +217,77 @@ export type KeyframeCadenceCatalog = GroupDurationCatalog & {
217
217
  gopDurationMs?: number;
218
218
  };
219
219
 
220
+ function positiveNumber(value: number | undefined): number | undefined {
221
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
222
+ }
223
+
224
+ /**
225
+ * A rendition's explicit keyframe cadence in ms: `keyframeInterval*`, then
226
+ * `keyframeDuration*`, then `gopDuration*`, each preferring integer ticks over
227
+ * the timescale to the ms field. Undefined when none is stated; a group
228
+ * duration is not a keyframe cadence and is never substituted.
229
+ */
230
+ export function catalogKeyframeCadenceMs(rendition: KeyframeCadenceCatalog | undefined): number | undefined {
231
+ if (!rendition) return undefined;
232
+ const timescale = positiveNumber(rendition.timescale);
233
+ const ticksToMs = (ticks: number | undefined) => {
234
+ const value = positiveNumber(ticks);
235
+ return value !== undefined && timescale !== undefined ? (value * 1000) / timescale : undefined;
236
+ };
237
+ return (
238
+ ticksToMs(rendition.keyframeIntervalTicks) ??
239
+ positiveNumber(rendition.keyframeIntervalMs) ??
240
+ ticksToMs(rendition.keyframeDurationTicks) ??
241
+ positiveNumber(rendition.keyframeDurationMs) ??
242
+ ticksToMs(rendition.gopDurationTicks) ??
243
+ positiveNumber(rendition.gopDurationMs)
244
+ );
245
+ }
246
+
247
+ /**
248
+ * Media units per second an FEC track's block geometry is built on, read only
249
+ * from what the catalog states: video frames per second from `framerate`;
250
+ * audio AAC access units (1024 samples) per second from the endpoint sample
251
+ * rate, then the catalog `sampleRate`, then `timescale` (MP4-shaped audio).
252
+ * The first value present is the one validated, so a declared but unusable
253
+ * rate is not replaced by the next. Undefined when no usable rate is stated:
254
+ * there is no default, since this sizes interleave geometry. A video track
255
+ * never reads its timescale as a rate.
256
+ */
257
+ export function catalogFecMediaUnitsPerSecond(
258
+ type: "video" | "audio",
259
+ rendition: { framerate?: number; sampleRate?: number; timescale?: number } | undefined,
260
+ endpointSampleRate?: number,
261
+ ): number | undefined {
262
+ if (type === "video") return positiveNumber(rendition?.framerate);
263
+ const sampleRate = positiveNumber(endpointSampleRate ?? rendition?.sampleRate ?? rendition?.timescale);
264
+ return sampleRate === undefined ? undefined : sampleRate / 1024;
265
+ }
266
+
220
267
  /**
221
268
  * Why a track's catalog `fec` block resolved to no FEC although it is not a
222
- * plain no-FEC declaration (BLO-35597): it declares an FEC instance but names
223
- * no `blockProfile`, or it names a token that is not a known profile
224
- * (`track_fec_block_profile`), or it names `iso-ssbg1-v1` without the block
225
- * span that bounds that profile's block location (`track_fec`, on
226
- * `interleaveDepthMs`). The profile selects the block math and is never
227
- * defaulted or inferred, and the span is never borrowed from another track, so
228
- * such a track carries no FEC geometry and no repair track, and it is the only
229
- * track affected: every other track of the catalog resolves as usual.
269
+ * plain no-FEC declaration (BLO-35597, draft-ramadan-moq-fec §5.1):
270
+ *
271
+ * - `track_fec_block_profile_unimplemented`: its `blockProfile` is a token
272
+ * this library does not implement. Only `iso-ssbg1-v1` is implemented; the
273
+ * retired `k-padded-v1` lands here.
274
+ * - `track_fec_block_profile`: it declares an FEC instance but names no
275
+ * `blockProfile`, or the value is not a non-empty string.
276
+ * - `track_fec_block_span`: retained for compatibility with older consumers;
277
+ * absence no longer disables in-band FEC.
278
+ * - `track_fec` (on `interleaveDepthMs`): it names `iso-ssbg1-v1` with a
279
+ * declared span that is not a non-negative safe integer in milliseconds.
280
+ *
281
+ * The profile selects the block math and is never defaulted or inferred, and
282
+ * the span is never borrowed from another track. Per §5.1 a receiver consumes
283
+ * such a track's source without FEC and does not join its repair tracks, so it
284
+ * carries no FEC geometry and no repair track; it is the only track affected,
285
+ * and neither the session nor any other track's FEC fails on its account.
230
286
  */
231
287
  export type TrackFecUnavailable = {
232
- /** The repair-contract code a catalog validator reports for the same field. */
233
- readonly code: "track_fec_block_profile" | "track_fec";
288
+ /** The repair-contract code a catalog validator reports for the same field
289
+ * (`track_fec_block_span` excepted: an omitted span is valid shape). */
290
+ readonly code: "track_fec_block_profile" | "track_fec_block_profile_unimplemented" | "track_fec_block_span" | "track_fec";
234
291
  /** JSON path of the offending field: `blockProfile`, or `interleaveDepthMs`. */
235
292
  readonly path: string;
236
293
  /** What is wrong, worded as the `RepairContractError` a validator throws. */
@@ -241,13 +298,11 @@ export type TrackFecParams = {
241
298
  fecK: number;
242
299
  /** The catalog `fec.blockProfile` (BLO-35597, ISO/IEC 23008-1 Annex C).
243
300
  * Present exactly when the track has FEC (`fecK > 0`) and absent on no
244
- * FEC: it selects the block math (`k-padded-v1`: SS_Start = SBN*K over
245
- * zero-padded K-symbol blocks; `iso-ssbg1-v1`: ssbg_mode1, K' =
246
- * SSB_length, consecutive SS_IDs), so it is never defaulted. A declared
247
- * instance that names no known profile has no FEC; `fecUnavailable` says
248
- * why. */
301
+ * FEC. The only profile is `iso-ssbg1-v1` (ssbg_mode1, K' = SSB_length,
302
+ * consecutive SS_IDs); it is never defaulted. A declared instance that
303
+ * names no implemented profile has no FEC; `fecUnavailable` says why. */
249
304
  fecBlockProfile?: FecBlockProfile;
250
- /** Present exactly when the track's `fec` block names no usable
305
+ /** Present exactly when the track's `fec` block names no implemented
251
306
  * `blockProfile`, or names `iso-ssbg1-v1` without a usable block span
252
307
  * (see `TrackFecUnavailable`). The track then resolves to
253
308
  * no FEC (`fecK` 0, no `fecBlockProfile`, no repair track) and this is
@@ -340,9 +395,15 @@ function msfTracks(catalog: RepairLayerCatalog): { tracks: Record<string, unknow
340
395
  * layer 0 are `repair.renditions` entries that `depend` on it.
341
396
  *
342
397
  * Returns undefined when the source carries no FEC repair track and nothing
343
- * depends on it. Throws `RepairContractError` (code + JSON path) on any
344
- * violation, including a repair rendition whose `depends` names a rendition
345
- * without FEC, so a player fails closed before joining any repair track.
398
+ * depends on it, and when the source's FEC is unavailable
399
+ * (`catalogFecUnavailable`: no implemented `blockProfile`, the retired
400
+ * `k-padded-v1` included, or an `iso-ssbg1-v1` span it cannot use). Per
401
+ * draft-ramadan-moq-fec §5.1 a receiver joins none of that source's repair
402
+ * tracks, so it gets no layers; the catalog's repair contract is still
403
+ * enforced for it as for every source. Throws `RepairContractError` (code +
404
+ * JSON path) on any violation, including a repair rendition whose `depends`
405
+ * names a rendition without FEC, so a player fails closed before joining any
406
+ * repair track.
346
407
  */
347
408
  export function resolveRepairLayers(
348
409
  catalog: RepairLayerCatalog | undefined,
@@ -403,11 +464,12 @@ export function resolveRepairLayers(
403
464
  );
404
465
  }
405
466
  }
406
- return assembleRepairLayers(
467
+ const layers = assembleRepairLayers(
407
468
  geometryOf(sourceName, `${renditionPath}.fec`, recordOf(rendition["fec"])),
408
469
  descriptors,
409
470
  throwRepairContractError,
410
471
  );
472
+ return catalogFecUnavailable(rendition["fec"], `${renditionPath}.fec`) === undefined ? layers : undefined;
411
473
  }
412
474
 
413
475
  const msf = msfTracks(catalog);
@@ -451,9 +513,13 @@ export function resolveRepairLayers(
451
513
  );
452
514
  }
453
515
  }
454
- return assembleRepairLayers(geometryOf(sourceName, `$.tracks[${msfIndex}].fec`, fec), descriptors, throwRepairContractError, {
455
- layerZeroMustBeDeclared: true,
456
- });
516
+ const layers = assembleRepairLayers(
517
+ geometryOf(sourceName, `$.tracks[${msfIndex}].fec`, fec),
518
+ descriptors,
519
+ throwRepairContractError,
520
+ { layerZeroMustBeDeclared: true },
521
+ );
522
+ return catalogFecUnavailable(fec, `$.tracks[${msfIndex}].fec`) === undefined ? layers : undefined;
457
523
  }
458
524
 
459
525
  /** A MoQ Transport priority (0..255, lower first), or null. */
@@ -476,7 +542,9 @@ function moqtPriority(value: unknown): number | null {
476
542
  * whose renditions carry no MoQ Transport priority) yields null, and the
477
543
  * keyframe repair FETCH is then sent without the parameter.
478
544
  *
479
- * Returns null when the track has no repair track.
545
+ * Returns null without a positive elapsed span, or when the track has no repair track, including when its FEC is
546
+ * unavailable (`catalogFecUnavailable`): draft-ramadan-moq-fec §5.1 forbids
547
+ * joining that track's repair tracks, so there is nothing to FETCH.
480
548
  *
481
549
  * @throws RepairContractError exactly as `resolveRepairLayers` does.
482
550
  */
@@ -490,6 +558,13 @@ export function catalogRepairTarget(
490
558
  const sourceName = typeof source === "string" ? source : source.name;
491
559
  const msf = msfTracks(catalog);
492
560
  const entry = msf?.tracks.find((t) => t["name"] === sourceName);
561
+ const hang = catalog as CatalogWithRenditions;
562
+ const roles: Array<"video" | "audio"> = typeof source === "string" ? ["video", "audio"]
563
+ : source.type === "video" ? ["video"] : source.type === "audio" ? ["audio"] : ["video", "audio"];
564
+ const rendition = roles.map((role) => hang[role]?.renditions?.[sourceName]).find((r) => recordOf(r) !== undefined);
565
+ const fec = rendition === undefined ? recordOf(entry?.["fec"]) : recordOf(rendition.fec);
566
+ // Unicast repair requires a known elapsed FEC deadline (§11.4).
567
+ if (!fec || !(catalogFecInterleaveMs(fec) ?? 0)) return null;
493
568
  const sourcePriority =
494
569
  entry === undefined ? null : moqtPriority(entry["priority"]);
495
570
  return { repairTrack: layerZero.repairTrackName, sourcePriority, repairPriority: layerZero.priority };
@@ -521,12 +596,13 @@ function nonNegativeField(value: unknown): number | undefined {
521
596
 
522
597
  /**
523
598
  * The track-scoped reading of `readFecBlockProfile` (BLO-35597): the same one
524
- * rule every catalog reader applies (a declared FEC instance names a known
525
- * profile; a block declaring none may omit it, but a token it carries must be
526
- * known), with its one failure, `track_fec_block_profile`, returned as the
527
- * track's reason instead of thrown. A profile problem costs only its own
528
- * track: it never aborts resolving the catalog's other tracks, and the token
529
- * is still never defaulted or inferred.
599
+ * rule every catalog reader applies (a declared FEC instance names the
600
+ * implemented profile; a block declaring none may omit it, but a token it
601
+ * carries must be implemented), with its two failures,
602
+ * `track_fec_block_profile_unimplemented` and `track_fec_block_profile`,
603
+ * returned as the track's reason instead of thrown. A profile problem costs
604
+ * only its own track: it never aborts resolving the catalog's other tracks, and
605
+ * the token is still never defaulted or inferred.
530
606
  */
531
607
  function blockProfileUnavailable(
532
608
  value: unknown,
@@ -537,39 +613,74 @@ function blockProfileUnavailable(
537
613
  readFecBlockProfile(value, path, declaresFecInstance, throwRepairContractError);
538
614
  return undefined;
539
615
  } catch (error) {
540
- if (!(error instanceof RepairContractError) || error.code !== "track_fec_block_profile") throw error;
541
- return Object.freeze({ code: "track_fec_block_profile", path: error.path, message: error.message });
616
+ if (
617
+ !(error instanceof RepairContractError) ||
618
+ (error.code !== "track_fec_block_profile" && error.code !== "track_fec_block_profile_unimplemented")
619
+ ) {
620
+ throw error;
621
+ }
622
+ return Object.freeze({ code: error.code, path: error.path, message: error.message });
542
623
  }
543
624
  }
544
625
 
545
- /**
546
- * An `iso-ssbg1-v1` instance without a usable block span (`isoBlockSpanUsable`)
547
- * has no FEC for its track alone, instead of resolving to a configuration the
548
- * FEC manager refuses for every track it holds.
549
- */
550
- function isoSpanUnavailable(fec: unknown, path: string, declaresFecInstance: boolean): TrackFecUnavailable | undefined {
626
+ /** Invalid declared spans disable the track; absence/zero still permits in-band FEC. */
627
+ function isoSpanUnavailable(
628
+ fec: Record<string, unknown>,
629
+ path: string,
630
+ declaresFecInstance: boolean,
631
+ ): TrackFecUnavailable | undefined {
551
632
  if (!declaresFecInstance || isoBlockSpanUsable(fec)) return undefined;
633
+
552
634
  return Object.freeze({
553
635
  code: "track_fec",
554
636
  path,
555
637
  message:
556
- `[repair-layers:track_fec] ${path}: iso-ssbg1-v1 requires a block span of at least ` +
557
- `${MIN_INTERLEAVE_DEPTH_MS} ms, which bounds its block location`,
638
+ `[repair-layers:track_fec] ${path}: must be a non-negative safe integer in milliseconds`,
558
639
  });
559
640
  }
560
641
 
642
+ /**
643
+ * Whether one catalog `fec` block leaves its track without FEC although it is
644
+ * not a plain no-FEC declaration (draft-ramadan-moq-fec §5.1), and why: the
645
+ * one track-scoped availability rule both catalog dialects apply. The hang
646
+ * resolver (`resolveCatalogTrackFec`, `resolveRepairLayers`) and the MSF
647
+ * `tracks[]` ingest (`MulticastManager.configureMultiTrack`) read it, so they
648
+ * cannot disagree about which tracks keep FEC.
649
+ *
650
+ * Returns the reason (`TrackFecUnavailable`) when the block names no
651
+ * implemented `blockProfile` (the retired `k-padded-v1` included; on
652
+ * `algorithm: "none"` only a present token is read) or, for a declared
653
+ * `iso-ssbg1-v1` instance, carries no usable block span. Returns undefined for
654
+ * a non-object and for every block whose FEC is available. It reads only the
655
+ * profile and the span: malformed geometry (`sourceSymbols`, `symbolSize`, ...)
656
+ * is the caller's to reject, and takes precedence. Never throws.
657
+ *
658
+ * @param fec the track's catalog `fec` value.
659
+ * @param fecPath JSON path of that `fec` block; the reason's `path` extends it.
660
+ */
661
+ export function catalogFecUnavailable(fec: unknown, fecPath: string): TrackFecUnavailable | undefined {
662
+ const block = recordOf(fec);
663
+ if (block === undefined) return undefined;
664
+ const declaresFecInstance = block["algorithm"] !== "none";
665
+ return (
666
+ blockProfileUnavailable(block["blockProfile"], `${fecPath}.blockProfile`, declaresFecInstance) ??
667
+ isoSpanUnavailable(block, `${fecPath}.interleaveDepthMs`, declaresFecInstance)
668
+ );
669
+ }
670
+
561
671
  /**
562
672
  * Per-track FEC geometry, or `NO_FEC` when the rendition declares none (no
563
- * `fec`, or `algorithm: "none"`) or names no usable `blockProfile` or, under
564
- * `iso-ssbg1-v1`, no usable block span; the latter two carry `fecUnavailable`.
673
+ * `fec`, or `algorithm: "none"`) or its FEC is unavailable
674
+ * (`catalogFecUnavailable`: no implemented `blockProfile`, or an
675
+ * `iso-ssbg1-v1` span it cannot use), which carries `fecUnavailable`.
565
676
  *
566
677
  * @throws RepairContractError from `resolveRepairLayers` when the rendition
567
678
  * declares a `fec` block (any algorithm, `none` included) and the catalog's
568
679
  * repair contract is malformed, and `track_fec` when its `fec` declares an FEC
569
680
  * instance whose `sourceSymbols` or `symbolSize` is not a positive integer;
570
- * see `resolveCatalogTrackFec`. An absent or unknown `blockProfile`, or an
571
- * `iso-ssbg1-v1` span that is absent or below `MIN_INTERLEAVE_DEPTH_MS`, never
572
- * throws: it is this track's `fecUnavailable`.
681
+ * see `resolveCatalogTrackFec`. An absent or unimplemented `blockProfile`, or
682
+ * an invalid `iso-ssbg1-v1` span,
683
+ * never throws: it is this track's `fecUnavailable`.
573
684
  */
574
685
  function fecParams(
575
686
  catalog: CatalogWithRenditions | undefined,
@@ -605,15 +716,13 @@ function fecParams(
605
716
  );
606
717
  }
607
718
  // What remains is `algorithm: "none"` (which carries no profile; a token
608
- // it does carry must still be known) or a declared instance naming no
609
- // known profile. Neither has FEC; an unusable profile says why, for this
610
- // track alone.
611
- const fecUnavailable =
612
- blockProfileUnavailable(fec.blockProfile, `${fecPath}.blockProfile`, declaresFecInstance) ??
613
- isoSpanUnavailable(fec, `${fecPath}.interleaveDepthMs`, declaresFecInstance);
719
+ // it does carry must still be implemented) or a declared instance whose
720
+ // FEC is unavailable (§5.1). Neither has FEC; the reason says why, for
721
+ // this track alone.
722
+ const fecUnavailable = catalogFecUnavailable(fec, fecPath);
614
723
  return fecUnavailable === undefined ? { ...NO_FEC, ...mediaRate } : { ...NO_FEC, ...mediaRate, fecUnavailable };
615
724
  }
616
- // The predicate held, so the profile is known: this read cannot fail.
725
+ // The predicate held, so the profile is implemented: this read cannot fail.
617
726
  const fecBlockProfile = readFecBlockProfile(fec.blockProfile, `${fecPath}.blockProfile`, true, throwRepairContractError);
618
727
  return {
619
728
  fecK: fec.sourceSymbols ?? 0,
@@ -622,9 +731,7 @@ function fecParams(
622
731
  // The wire RSB_length: every base layer's packets carry the base total (§7.1).
623
732
  fecTotalRepairCount: repair?.totalBaseRepairSymbols ?? fec.repairSymbols ?? 0,
624
733
  fecSymbolSize: fec.symbolSize ?? 0,
625
- // interleaveDepthMs is the FEC block span in MILLISECONDS (§5.1) — the
626
- // only interleave key the catalog carries post-BLO-14526. Receivers
627
- // derive D by positive round-half-up of span / GOP duration where needed.
734
+ // Zero/absence leaves the elapsed deadline unknown; geometry stays in-band.
628
735
  fecInterleaveMs: catalogFecInterleaveMs(fec) ?? 0,
629
736
  // Additive, never a multiplier on the span: jitter belongs to the network
630
737
  // path and the span belongs to the encoder, so scaling one by the other
@@ -648,14 +755,16 @@ function fecParams(
648
755
  * interleave and repair layers, never the first rendition's. A track with no
649
756
  * rendition of its type resolves to no FEC (`fecK` 0) and no media rate.
650
757
  *
651
- * The block profile is track-scoped (BLO-35597). A rendition whose `fec`
652
- * declares an FEC instance but names no `blockProfile`, or whose `fec` (a
653
- * `none` block included) names a token that is not a known profile, resolves
654
- * to no FEC: `fecK` 0, no `fecBlockProfile`, no repair track, and
655
- * `fecUnavailable` carrying the `track_fec_block_profile` reason at the
656
- * field's JSON path for the caller to surface. Every other track resolves as
657
- * usual. The profile is never defaulted or inferred; `algorithm: "none"` may
658
- * omit it.
758
+ * The block profile is track-scoped (BLO-35597, draft-ramadan-moq-fec §5.1).
759
+ * `iso-ssbg1-v1` is the only implemented profile. A rendition whose `fec`
760
+ * declares an FEC instance but names no `blockProfile`
761
+ * (`track_fec_block_profile`), or whose `fec` (a `none` block included) names
762
+ * any other token (`track_fec_block_profile_unimplemented`; the retired
763
+ * `k-padded-v1` is one), resolves to no FEC: `fecK` 0, no `fecBlockProfile`,
764
+ * no repair track, layers or overlays, and `fecUnavailable` carrying the
765
+ * reason at the field's JSON path for the caller to surface. Every other track
766
+ * resolves as usual. The profile is never defaulted or inferred;
767
+ * `algorithm: "none"` may omit it.
659
768
  *
660
769
  * @throws RepairContractError `track_fec` when a rendition's `fec` declares an
661
770
  * FEC instance (any `algorithm` but `none`) whose `sourceSymbols` or
@@ -200,8 +200,6 @@ export interface CmafAudioConcealStats {
200
200
  }
201
201
 
202
202
  export interface BlockAssemblerConfig {
203
- /** Number of source symbols per FEC block */
204
- k: number
205
203
  /** Timescale for CMAF segments (default 1_000_000 = microseconds) */
206
204
  timescale?: number
207
205
  /** ISO track ID (default 1) */
@@ -272,7 +270,7 @@ export class CmafBlockAssembler {
272
270
  #config: Required<
273
271
  Pick<
274
272
  BlockAssemblerConfig,
275
- 'k' | 'timescale' | 'trackId' | 'trackType' | 'admitAuthoredTiming'
273
+ 'timescale' | 'trackId' | 'trackType' | 'admitAuthoredTiming'
276
274
  >
277
275
  >
278
276
  #pendingRecovered = new Map<number, BlockFrame>()
@@ -832,7 +830,6 @@ export class CmafBlockAssembler {
832
830
 
833
831
  constructor(config: BlockAssemblerConfig) {
834
832
  this.#config = {
835
- k: config.k,
836
833
  timescale: config.timescale ?? 1_000_000,
837
834
  trackId: config.trackId ?? 1,
838
835
  trackType: config.trackType,
@@ -97,12 +97,6 @@ function buildFecParams(stats: FecTrackStats): CmcdParams {
97
97
  params['x-bc-fec-p'] = cfg.repairCount
98
98
  params['x-bc-fec-recovery'] = parseFloat((stats.recoveryRate / 100).toFixed(4))
99
99
 
100
- // ALTA keys: omit entirely when altaEnabled is false (D-09)
101
- if (cfg.altaEnabled) {
102
- params['x-bc-alta-verified'] = stats.altaVerified > 0
103
- params['x-bc-alta-failures'] = stats.altaFailed
104
- }
105
-
106
100
  return params
107
101
  }
108
102