@blockcast/mmt-container 0.3.0 → 0.4.0-main.71d61b2a53f2

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 +14743 -14412
  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 +36 -30
  30. package/dist/fec-manager.d.ts.map +1 -1
  31. package/dist/fec-manager.js +303 -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 +6 -11
  54. package/dist/mmtp-container-parser.d.ts.map +1 -1
  55. package/dist/mmtp-container-parser.js +56 -97
  56. package/dist/mmtp-container-parser.js.map +4 -4
  57. package/dist/mmtp-container-parser.no-modules.js +78 -105
  58. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  59. package/dist/mmtp-decode-pipeline.js +56 -97
  60. package/dist/mmtp-decode-pipeline.js.map +4 -4
  61. package/dist/mmtp-router.d.ts +37 -26
  62. package/dist/mmtp-router.d.ts.map +1 -1
  63. package/dist/mmtp-router.js +162 -313
  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 +34 -6
  68. package/dist/multicast-manager.d.ts.map +1 -1
  69. package/dist/multicast-manager.js +709 -658
  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 +77 -104
  78. package/dist/no-modules.js.map +4 -4
  79. package/dist/repair-fetch.d.ts +30 -19
  80. package/dist/repair-fetch.d.ts.map +1 -1
  81. package/dist/repair-fetch.js +33 -24
  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 +56 -97
  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 +414 -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 +27 -18
  113. package/src/mmtp-router.ts +146 -313
  114. package/src/multicast-manager.ts +184 -83
  115. package/src/multicast-transport.ts +16 -9
  116. package/src/repair-fetch.ts +46 -27
  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
@@ -1,222 +0,0 @@
1
- /**
2
- * @blockcast/fec-worker — Shred Worker Main-Thread Client
3
- *
4
- * Thin wrapper over the shred (Reed-Solomon) worker, mirroring
5
- * {@link FecWorkerClient}'s shape. Spawns one Worker, speaks the
6
- * {@link ShredWorkerCommand}/{@link ShredWorkerEvent} protocol, and keeps the
7
- * datagram read loop + wire parse + WASM FEC off the main thread.
8
- *
9
- * Typical wiring for a WebTransport datagram source (fully off-thread):
10
- *
11
- * const client = new ShredWorkerClient(new URL("./shred-fec-worker.js", import.meta.url));
12
- * client.onRecovered((data, meta) => renderRecoveredSet(data, meta));
13
- * client.configure({ maxSlots: 5000, symbolSize: 512, wasmUrl: "/vendor/fec/mmt_wasm.js" });
14
- * client.attachStream(wt.datagrams.readable); // transferred; main does no read() per packet
15
- *
16
- * For sources that demux on the main thread (moqtail OBJECT_DATAGRAM callback,
17
- * IWA multicast bridge), push each raw frame with {@link feedShred} instead.
18
- *
19
- * {@link feedShred} is a fire-and-forget `postMessage` with no native
20
- * backpressure, so a consumer that decodes slower than the ingest rate (a
21
- * backgrounded/throttled tab, WASM RS falling behind a ~4k shred/s feed) would
22
- * grow the worker's inbound message queue without limit — the queue lives in the
23
- * renderer process and has been observed to reach multiple GB, GC-thrashing the
24
- * page into a wedge. The client bounds it with an in-flight window keyed off the
25
- * worker's own periodic stats heartbeat (no per-frame ack round-trip); see
26
- * {@link ShredWorkerClientOptions.maxInflight}.
27
- */
28
-
29
- import type {
30
- ShredWorkerCommand,
31
- ShredWorkerConfig,
32
- ShredWorkerEvent,
33
- ShredWorkerStats,
34
- ShredWorkerErrorCode,
35
- RecoveredMeta,
36
- } from "./shred-worker-types.js";
37
-
38
- /** Construction-time options for {@link ShredWorkerClient}. */
39
- export interface ShredWorkerClientOptions {
40
- /**
41
- * Cap on frames posted via {@link ShredWorkerClient.feedShred} but not yet
42
- * drained by the worker, before further frames are dropped ("skip-to-live" at
43
- * the worker boundary). Bounds the worker's inbound message queue — the sole
44
- * unbounded structure on the main-thread-demux (`feedShred`) path.
45
- *
46
- * The drain signal is the worker's periodic `stats` heartbeat: the monotonic
47
- * total of frames it has taken off the queue (`shredsRx + malformed +
48
- * versionMismatch`). No per-frame acknowledgement crosses the boundary, so the
49
- * bound is heartbeat-granular — size it above one heartbeat's worth of ingest
50
- * (default 250ms heartbeat × ~4k frames/s ≈ ~1k frames).
51
- *
52
- * Default {@link DEFAULT_MAX_INFLIGHT} (8192 frames ≈ ~10 MB at ~1.3 KB/frame).
53
- * Set to `0` (or any value `<= 0`) to disable the bound entirely — only do so
54
- * for a source with its own backpressure (e.g. a bounded {@link
55
- * ShredWorkerClient.attachStream} producer). Note the bound assumes `feedShred`
56
- * is the sole ingest path; mixing it with `attachStream` (whose frames also
57
- * advance the heartbeat total) makes the window under-count and benignly
58
- * disables the drop.
59
- */
60
- maxInflight?: number;
61
- }
62
-
63
- /** Default {@link ShredWorkerClientOptions.maxInflight} (~10 MB of queued frames). */
64
- export const DEFAULT_MAX_INFLIGHT = 8192;
65
-
66
- export class ShredWorkerClient {
67
- readonly #worker: Worker;
68
- #onRecovered: ((data: ArrayBuffer, meta: RecoveredMeta) => void) | null = null;
69
- #onStats: ((stats: ShredWorkerStats) => void) | null = null;
70
- #onError: ((message: string, code?: ShredWorkerErrorCode) => void) | null = null;
71
- #disposed = false;
72
-
73
- /** feedShred in-flight backpressure accounting (see ShredWorkerClientOptions.maxInflight). */
74
- readonly #maxInflight: number;
75
- #sent = 0; // frames posted via feedShred (monotonic)
76
- #processed = 0; // worker-consumed total from the last stats heartbeat (monotonic)
77
- #droppedBackpressure = 0; // frames dropped by the in-flight guard (monotonic)
78
-
79
- /**
80
- * @param workerOrUrl - A URL (a Worker is created internally, `type: module`)
81
- * or a pre-created Worker (for testing via constructor injection).
82
- * @param opts - Optional {@link ShredWorkerClientOptions}.
83
- */
84
- constructor(workerOrUrl: Worker | URL, opts: ShredWorkerClientOptions = {}) {
85
- this.#maxInflight = opts.maxInflight ?? DEFAULT_MAX_INFLIGHT;
86
- this.#worker =
87
- workerOrUrl instanceof URL
88
- ? new Worker(workerOrUrl, { type: "module" })
89
- : workerOrUrl;
90
- this.#worker.onmessage = (e: MessageEvent<ShredWorkerEvent>) =>
91
- this.#handleEvent(e.data);
92
- this.#worker.onerror = (e) =>
93
- this.#onError?.(formatWorkerError(e), "worker-runtime");
94
- this.#worker.onmessageerror = () =>
95
- this.#onError?.("failed to deserialize worker message", "worker-message");
96
- }
97
-
98
- /** Configure the decoder (WASM load + ShredFecBuffer construction happen in the worker). */
99
- configure(config: ShredWorkerConfig): void {
100
- if (this.#disposed) throw new Error("[ShredWorkerClient] disposed");
101
- this.#post({ type: "configure", config });
102
- }
103
-
104
- /**
105
- * Hand the worker a stream of raw shred frames to batch-drain. The stream is
106
- * transferred — the caller must not use it afterward. One active stream at a
107
- * time; attaching a new one cancels the previous.
108
- */
109
- attachStream(readable: ReadableStream<Uint8Array>): void {
110
- if (this.#disposed) return;
111
- this.#post({ type: "attachStream", readable }, [readable]);
112
- }
113
-
114
- /**
115
- * Feed one already-demuxed raw shred frame. `frame` is transferred zero-copy;
116
- * the caller must not access it afterward.
117
- *
118
- * Dropped (frame NOT transferred, so the caller's buffer stays intact) when the
119
- * in-flight window is full — i.e. the worker is more than `maxInflight` frames
120
- * behind. This is the memory bound: a slow/wedged consumer costs bounded
121
- * skip-to-live drops (see {@link droppedBackpressure}), never an unbounded
122
- * renderer-heap blow-up.
123
- */
124
- feedShred(frame: ArrayBuffer): void {
125
- if (this.#disposed) return;
126
- if (this.#maxInflight > 0 && this.#sent - this.#processed >= this.#maxInflight) {
127
- this.#droppedBackpressure++;
128
- return;
129
- }
130
- this.#sent++;
131
- this.#post({ type: "feedShred", frame }, [frame]);
132
- }
133
-
134
- /** Explicitly drive loss recovery (in addition to the worker's internal timer). */
135
- recoverAll(nowMs: number = Date.now()): void {
136
- if (this.#disposed) return;
137
- this.#post({ type: "recoverAll", nowMs });
138
- }
139
-
140
- /** Register callback for recovered/completed FEC sets. `data` is a transferred buffer. */
141
- onRecovered(cb: (data: ArrayBuffer, meta: RecoveredMeta) => void): void {
142
- this.#onRecovered = cb;
143
- }
144
-
145
- /** Register callback for the coalesced stats heartbeat. */
146
- onStats(cb: (stats: ShredWorkerStats) => void): void {
147
- this.#onStats = cb;
148
- }
149
-
150
- /** Register callback for worker errors. */
151
- onError(cb: (message: string, code?: ShredWorkerErrorCode) => void): void {
152
- this.#onError = cb;
153
- }
154
-
155
- /**
156
- * Frames dropped by the in-flight backpressure guard since construction
157
- * (monotonic). Surface this in the UI so sustained loss is visible rather than
158
- * silent — a rising counter means the consumer can't keep pace with ingest.
159
- */
160
- get droppedBackpressure(): number {
161
- return this.#droppedBackpressure;
162
- }
163
-
164
- /**
165
- * Frames posted via {@link feedShred} but not yet reported drained by the
166
- * worker's last stats heartbeat (best-effort, heartbeat-granular; never < 0).
167
- */
168
- get inflight(): number {
169
- return Math.max(0, this.#sent - this.#processed);
170
- }
171
-
172
- /** Dispose the worker. Idempotent. */
173
- dispose(): void {
174
- if (this.#disposed) return;
175
- this.#disposed = true;
176
- try {
177
- this.#worker.postMessage({ type: "dispose" } satisfies ShredWorkerCommand);
178
- } catch {
179
- /* worker may already be gone */
180
- }
181
- this.#worker.terminate();
182
- }
183
-
184
- #post(cmd: ShredWorkerCommand, transfer: Transferable[] = []): void {
185
- this.#worker.postMessage(cmd, transfer);
186
- }
187
-
188
- #handleEvent(event: ShredWorkerEvent): void {
189
- switch (event.type) {
190
- case "recovered":
191
- this.#onRecovered?.(event.data, event.meta);
192
- break;
193
- case "stats":
194
- // The worker's monotonic consumed-frame total is the drain signal for
195
- // the feedShred in-flight guard. shredsRx counts only valid frames;
196
- // malformed + versionMismatch are consumed off the queue too, so the
197
- // sum is the true "frames taken off the queue" and keeps the window
198
- // from inflating (and false-dropping) on a malformed/skewed source.
199
- this.#processed =
200
- event.stats.shredsRx + event.stats.malformed + event.stats.versionMismatch;
201
- this.#onStats?.(event.stats);
202
- break;
203
- case "error":
204
- if (event.code) this.#onError?.(event.message, event.code);
205
- else this.#onError?.(event.message);
206
- break;
207
- }
208
- }
209
- }
210
-
211
- function formatWorkerError(event: ErrorEvent): string {
212
- const parts = ["Worker error"];
213
- if (event.message) parts.push(event.message);
214
- if (event.filename) {
215
- const loc = [event.filename];
216
- if (event.lineno) loc.push(String(event.lineno));
217
- if (event.colno) loc.push(String(event.colno));
218
- parts.push(`at ${loc.join(":")}`);
219
- }
220
- if (event.error instanceof Error && event.error.stack) parts.push(event.error.stack);
221
- return parts.join(": ");
222
- }
@@ -1,209 +0,0 @@
1
- /**
2
- * @blockcast/fec-worker — Shred (Reed-Solomon) Worker Protocol
3
- *
4
- * A sibling codec to the RaptorQ/MMTP worker (`fec-worker.ts`). Solana-style
5
- * shred streams carry a different FEC payload identity than MMTP source/repair
6
- * symbols — a shred is `(slot, fecSetIndex, localIndex, numData, numCoding,
7
- * isCoding, lastInSet)`, not a flat `ssId` — so they need their own command
8
- * shape. The transport harness (Worker spawn, onmessage plumbing, zero-copy
9
- * `toOwnedArrayBuffer` transfers) is shared; the decoder WASM is not.
10
- *
11
- * The worker owns the batch-drain: the consumer transfers a WebTransport
12
- * `datagrams.readable` (or any `ReadableStream<Uint8Array>` of raw shred
13
- * frames) into the Worker via {@link ShredWorkerCommand} `attachStream`, and
14
- * the read loop + wire parse + `ShredFecBuffer.add_shred` all run off the main
15
- * thread. Only recovered FEC sets (and coalesced stats) cross back. A
16
- * `feedShred` command covers sources that have already demuxed the shred bytes
17
- * on the main thread (e.g. a moqtail OBJECT_DATAGRAM callback, or the IWA
18
- * multicast bridge).
19
- *
20
- * Types here are importable from both main thread and Worker contexts.
21
- */
22
-
23
- // --- Wire format ------------------------------------------------------------
24
-
25
- /**
26
- * Wire header layout the worker parses. Mirrors the deployed shred player's
27
- * `onShredBytes` exactly (libmmt shred-forwarder `emit_frame`) so the off-thread
28
- * path is bit-identical to the proven on-thread path.
29
- *
30
- * v3 (28-byte header):
31
- * [0] version u8 (3 or 4; any other version is dropped, not misframed)
32
- * [1-8] slot u64 LE
33
- * [9-12] fecSetIndex u32 LE
34
- * [13-16] localIndex u32 LE (data: 0..numData; coding: numData+position)
35
- * [17] flags u8 (bit0 = DATA_COMPLETE, bit1 = IS_CODING_SHRED)
36
- * [18] numData u8 (coding shreds only; 0 on data — WASM infers)
37
- * [19] numCoding u8 (coding shreds only; 0 on data)
38
- * [20-27] sendTsUs u64 LE (µs since epoch, 0 when unstamped)
39
- * [28+] erasureShard (equal length across the FEC set)
40
- *
41
- * DATA_COMPLETE (last data shred in the set) is passed to `add_shred` as its
42
- * `lastInSet` argument — the WASM uses it to infer numData for a set that
43
- * received only data shreds (no coding).
44
- *
45
- * v4 has the same 28-byte header, but its body is the full canonical Agave
46
- * shred (signature, headers, erasure shard, chained Merkle root, proof, and
47
- * the retransmitter signature on resigned variants) — the form a validator TVU
48
- * accepts (BLO-41383). The worker recovers the exact v3 erasure-shard view
49
- * from it with the forwarder's own `erasure_shard()` slice, so both versions
50
- * reach `add_shred` byte-identical:
51
- * variant = shred[64]; data 0x9_/0xb_, coding 0x6_/0x7_ (chained merkle;
52
- * 0xb_/0x7_ resigned), must agree with IS_CODING_SHRED
53
- * length = 1203 (data) / 1228 (coding), exactly
54
- * shard start = 64 (data: after the signature) / 89 (coding headers)
55
- * shard end = length - (32 root + 20 * (variant & 0x0f) proof
56
- * + 64 retransmitter signature if resigned)
57
- */
58
- export const SHRED_WIRE_VERSION = 3;
59
- /** Wire version whose body is the full canonical shred (see above). */
60
- export const SHRED_WIRE_VERSION_FULL = 4;
61
- export const SHRED_HEADER_LEN = 28;
62
- export const SHRED_FLAG_DATA_COMPLETE = 0x01;
63
- export const SHRED_FLAG_IS_CODING = 0x02;
64
-
65
- // --- Config -----------------------------------------------------------------
66
-
67
- /** Per-decoder configuration for the shred FEC worker. */
68
- export interface ShredWorkerConfig {
69
- /** Ring capacity in slots (matches `new ShredFecBuffer(maxSlots, symbolSize)`). */
70
- maxSlots: number;
71
- /** Symbol size in bytes (Solana shred payloads are fixed-size within a set). */
72
- symbolSize: number;
73
- /**
74
- * Module URL for the shred WASM (wasm-bindgen ESM exporting `default` init +
75
- * `ShredFecBuffer`). The worker `import()`s it and calls `await default()`.
76
- * Ignored when `self.__SHRED_WASM_BINDINGS__` is pre-injected (tests / custom
77
- * loaders), mirroring the RaptorQ worker's `__MMT_WASM_BINDINGS__` contract.
78
- */
79
- wasmUrl?: string;
80
- /**
81
- * How often (ms) the worker coalesces and posts a `stats` event. The read
82
- * loop never posts per-shred; only recovered frames and this heartbeat cross
83
- * the boundary. Default 250ms.
84
- */
85
- statsIntervalMs?: number;
86
- /**
87
- * How often (ms) the worker runs `try_recover_all(now)` to drain timed-out
88
- * FEC sets that `add_shred` didn't complete (loss scenarios). Default 50ms,
89
- * matching the player's on-thread recovery timer. Set to 0 to disable (the
90
- * consumer may instead drive it explicitly with `recoverAll`).
91
- */
92
- recoverIntervalMs?: number;
93
- }
94
-
95
- // --- Stats ------------------------------------------------------------------
96
-
97
- /**
98
- * First-shred-per-slot sample, collected by the worker and drained into each
99
- * coalesced `stats` heartbeat. Lets the main thread run app-specific,
100
- * slot-derived stats (e.g. the turbine-leg latency estimator, per-slot latency
101
- * percentiles) WITHOUT re-parsing the wire header — the worker stays the single
102
- * source of truth for parsing, and these cross the boundary aggregated (a
103
- * handful per heartbeat), never per-packet.
104
- */
105
- export interface SlotSample {
106
- /** Slot number (first shred of this slot the worker saw). */
107
- slot: bigint;
108
- /** Publisher send timestamp (µs since epoch) of that first shred, 0 when unstamped. */
109
- sendTsUs: bigint;
110
- /** Frame byte length of that first shred. */
111
- bytes: number;
112
- }
113
-
114
- /** Aggregate shred-decode counters, emitted on the coalesced `stats` heartbeat. */
115
- export interface ShredWorkerStats {
116
- /** Total shred frames parsed (data + coding). */
117
- shredsRx: number;
118
- /** Data (source) shreds observed. */
119
- sourceShreds: number;
120
- /** Coding (repair) shreds observed. */
121
- repairShreds: number;
122
- /** FEC sets completed (direct completion + FEC recovery). */
123
- fecSetsCompleted: number;
124
- /** Bytes handed back as recovered/completed sets. */
125
- bytesReassembled: number;
126
- /** Sets recovered specifically via `try_recover_all` (loss recovery). */
127
- fecSetsRecovered: number;
128
- /** Current `ShredFecBuffer.pending_fec_sets()`, or -1 when unavailable. */
129
- pendingFecSets: number;
130
- /** Frames dropped for being shorter than the v3 header. */
131
- malformed: number;
132
- /** Frames dropped for carrying a non-v3 version byte (forwarder/worker skew). */
133
- versionMismatch: number;
134
- /** Highest slot number observed (as a string — bigint isn't JSON-safe for UI). */
135
- currentSlot: string;
136
- /** First-shred-per-slot samples parsed since the previous heartbeat (drained each emit). */
137
- slotSamples: SlotSample[];
138
- }
139
-
140
- /** Stable identities for worker failures whose message text carries live values. */
141
- export type ShredWorkerErrorCode =
142
- | "wasm-load-failed"
143
- | "wasm-bindings-missing"
144
- | "not-configured"
145
- | "stream-read-failed"
146
- | "unknown-command"
147
- | "worker-runtime"
148
- | "worker-message";
149
-
150
- // --- Recovered frame metadata ----------------------------------------------
151
-
152
- /** Metadata attached to each recovered set the worker emits. */
153
- export interface RecoveredMeta {
154
- /**
155
- * Slot the recovered set belongs to. Attributed on both the direct-completion
156
- * path and the identity-carrying recovery drain
157
- * (`try_recover_all_with_identity`); only 0n on the legacy `ShredReassembler`
158
- * fallback, which has no identity variant. Do NOT branch on `slot === 0n` as
159
- * "unattributed" — that would drop the majority of recovered sets.
160
- */
161
- slot: bigint;
162
- /** FEC set index within the slot (0 only on the legacy identity-less fallback). */
163
- fecSetIndex: number;
164
- /**
165
- * Publisher send timestamp (µs since epoch), 0 when unstamped/unknown. On
166
- * direct completion this is the completing shred's stamp; on the recovery
167
- * drain it is the set's first-seen shred stamp (shreds of a set are sent µs
168
- * apart, so the two are equivalent latency baselines).
169
- */
170
- sendTsUs: bigint;
171
- /** True when produced by loss recovery (`try_recover_all`) rather than direct completion. */
172
- recovered: boolean;
173
- }
174
-
175
- // --- Commands (main -> worker) ----------------------------------------------
176
-
177
- /** Discriminated union of all commands sent from the main thread to the shred worker. */
178
- export type ShredWorkerCommand =
179
- | { type: "configure"; config: ShredWorkerConfig }
180
- | {
181
- /**
182
- * Hand the worker a stream of raw shred frames to batch-drain. Each
183
- * chunk is one wire frame (one WebTransport datagram). The stream is
184
- * transferred (add to the postMessage transfer list) — the main thread
185
- * must not touch it afterward.
186
- */
187
- type: "attachStream";
188
- readable: ReadableStream<Uint8Array>;
189
- }
190
- | {
191
- /**
192
- * Feed one already-demuxed raw shred frame. `frame` is transferred
193
- * zero-copy — the caller must not access it after posting. Use this for
194
- * sources whose demux stays on the main thread (moqtail OBJECT_DATAGRAM
195
- * callback, IWA multicast bridge).
196
- */
197
- type: "feedShred";
198
- frame: ArrayBuffer;
199
- }
200
- | { type: "recoverAll"; nowMs: number }
201
- | { type: "dispose" };
202
-
203
- // --- Events (worker -> main) ------------------------------------------------
204
-
205
- /** Discriminated union of all events emitted from the shred worker to the main thread. */
206
- export type ShredWorkerEvent =
207
- | { type: "recovered"; data: ArrayBuffer; meta: RecoveredMeta }
208
- | { type: "stats"; stats: ShredWorkerStats }
209
- | { type: "error"; message: string; code?: ShredWorkerErrorCode };
@@ -1,12 +0,0 @@
1
- /**
2
- * Return a fresh ArrayBuffer containing exactly the bytes in `view`.
3
- *
4
- * Worker outputs must not transfer buffers that might be owned by a WASM
5
- * binding or by a larger shared packet. A fresh JS-owned buffer gives
6
- * postMessage() exclusive ownership without detaching unrelated memory.
7
- */
8
- export function toOwnedArrayBuffer(view: Uint8Array): ArrayBuffer {
9
- const copy = new Uint8Array(view.byteLength);
10
- copy.set(view);
11
- return copy.buffer;
12
- }
@@ -1,181 +0,0 @@
1
- # @blockcast/mmt-alta-parse
2
-
3
- Zero-dependency leaf package that extracts the detached **ALTA authenticator trailer** from an MMTP source packet. ALTA (Authenticated Lightweight TESLA-like Algorithm) is Blockcast's sender-authentication scheme for multicast streams: each MMTP source packet carries a detached signature trailer that downstream consumers (the FEC worker, the FFI core) verify against a catalog-published public key. This package is **the parser only** — it locates the trailer, returns the raw authenticator bytes, and tells the caller where the signed payload ends. Signature verification (Ed25519 / P-256) lives in the consumer that has crypto and the public key in hand.
4
-
5
- It is split into a leaf package with zero `@blockcast/*` dependencies so both `@blockcast/mmt-container` (wire-path parsing) and `@blockcast/fec-worker` (FEC-recovered-source parsing) can share one implementation without creating a package cycle.
6
-
7
- ## Install
8
-
9
- ```bash
10
- pnpm add @blockcast/mmt-alta-parse
11
- ```
12
-
13
- ## Quick start
14
-
15
- ```ts
16
- import { extractAltaTrailer } from "@blockcast/mmt-alta-parse"
17
-
18
- // `wirePacket` is a full MMTP packet as it came off the network (Uint8Array).
19
- const trailer = extractAltaTrailer(wirePacket)
20
-
21
- if (trailer === null) {
22
- // Packet has no ALTA trailer. This is normal for:
23
- // - non-MPU packets (repair, signaling)
24
- // - unsigned streams
25
- // - malformed / truncated packets
26
- return
27
- }
28
-
29
- // `trailer.auth` — the authenticator bytes (no ext_type/ext_length prefix)
30
- // `trailer.signedEnd` — byte offset where the signed payload ends inside wirePacket.
31
- // The signer signed wirePacket.subarray(0, signedEnd).
32
-
33
- const signedPayload = wirePacket.subarray(0, trailer.signedEnd)
34
- // Hand off to a verifier with the catalog-published public key:
35
- // ed25519.verify_detached(trailer.auth, signedPayload, publicKey)
36
- ```
37
-
38
- For FEC-recovered source symbols (where the upstream FEC pipeline has already stripped the 4-byte Source FEC Payload ID), pass `{ skipFecId: true }`:
39
-
40
- ```ts
41
- const trailer = extractAltaTrailer(recoveredSymbol, { skipFecId: true })
42
- ```
43
-
44
- ## Exports
45
-
46
- Per `package.json` (single entry point, ESM only):
47
-
48
- | Export | Kind | Purpose |
49
- |--------|------|---------|
50
- | `extractAltaTrailer(packet, options?)` | function | Parse a wire MMTP packet and return its `AltaTrailer` or `null`. |
51
- | `AltaTrailer` | type | `{ auth: Uint8Array; signedEnd: number }` |
52
- | `MMTP_EXT_TYPE_ALTA_AUTH` | const `0xf0a1` | The MMTP header-extension `ext_type` assigned to the detached ALTA trailer. |
53
- | `MMTP_EXT_TRAILER_HEADER_SIZE` | const `4` | Fixed size of the trailer's `[ext_type][ext_length]` prefix (2 + 2 bytes BE). |
54
-
55
- The package has no runtime dependencies — `package.json` lists `"dependencies": {}`.
56
-
57
- ## ALTA wire format
58
-
59
- The detached ALTA authenticator is appended **after** the declared MPU payload bytes and **before** the optional 4-byte Source FEC Payload ID. ISO/IEC 23008-1 defines `payload_length` as a length-after-field value: it includes the six MPU-header bytes following the field, the MFU data-unit header when present, and the media bytes. The MMTP header-extension `X` bit stays `0` — non-ALTA receivers treat the trailing bytes as data past `payload_length` and discard them per ISO/IEC 23008-1 §9.2.2 ("may be discarded without impacting correct processing").
60
-
61
- Wire layout for a signed source packet:
62
-
63
- ```
64
- | MMTP hdr | length (2) | remaining MPU hdr (6) | MFU hdr? | MFU data | TRAILER | SS_ID? (4) |
65
- \_______________________________________________________/
66
- payload_length bytes start after the field
67
- ^
68
- |
69
- signedEnd
70
- ```
71
-
72
- In MPU-payload coordinates, `signedEnd` is exactly `2 + payload_length`; the returned packet-relative offset also includes the complete, possibly extended MMTP header.
73
-
74
- The trailer itself is:
75
-
76
- ```
77
- | ext_type (2 BE) | ext_length (2 BE) | auth (ext_length bytes) |
78
- 0xf0a1
79
- ```
80
-
81
- - `ext_type = 0xf0a1` identifies the trailer as ALTA. Anything else is rejected (`null` return).
82
- - `ext_length` is the authenticator length in bytes — 64 for Ed25519, 64 for P-256 raw `(r,s)`, or whatever the signer minted.
83
- - The signed range is everything from byte 0 through `signedEnd-1` of the wire packet — i.e. the MMTP header, MPU header, MFU header, and MFU payload, but **not** the trailer itself or the optional FEC payload ID.
84
-
85
- This is the **detached trailer** form (a.k.a. "Path 2 / 08-07") from `draft-ramadan-moq-mmt` §12. It coexists with FEC: the signer signs the source-packet bytes **before** they enter the FEC encoder, so a receiver that recovers a missing source symbol from repair gets the same signed bytes the sender minted. This is the "sign-before-encode" rule — see the parent monorepo Phase 8 spec.
86
-
87
- ### When `extractAltaTrailer` returns `null`
88
-
89
- The function returns `null` (rather than throwing) for every non-trailer outcome — see `src/index.ts:69-115`:
90
-
91
- | Condition | Why |
92
- |-----------|-----|
93
- | Packet shorter than `MMTP_HEADER_SIZE + MPU_HEADER_SIZE` (20 B) | Truncated/malformed |
94
- | Packet type ≠ MPU (`0x00`) | Repair and signaling packets aren't signed per-packet |
95
- | Fragment type ≠ 2 (MFU) | Only timed or non-timed MFU media packets carry trailers |
96
- | `payload_length` cannot contain the MPU-header remainder, structurally required DU header, and media | The declaration ends inside headers or describes a header-only MFU |
97
- | `2 + payload_length` exceeds the pre-FEC packet boundary | Truncated/malformed declaration |
98
- | No bytes between MFU data and SS_ID for the 4-byte trailer header | Unsigned stream |
99
- | `ext_type` ≠ `0xf0a1` | Some other header-extension lives in that slot |
100
- | Declared `ext_length` does not end exactly at the SS_ID boundary | Malformed or ambiguous trailer suffix |
101
-
102
- Callers should treat `null` as "no signature on this packet" and route based on stream policy (require-signed vs allow-unsigned).
103
-
104
- ## Verification flow (where this package fits)
105
-
106
- ```
107
- catalog (CMSF)
108
- │
109
- alta.publicKey (SPKI bytes)
110
- │
111
- ▼
112
- ┌─────────────────────────────────────────────────────┐
113
- │ @blockcast/mmt-container :: mmtp-router │
114
- │ wirePacket → extractAltaTrailer(packet) ──────────┼──► this package
115
- │ ⇒ { auth, signedEnd } │
116
- │ │
117
- │ feedSourceSymbol(..., { auth, payloadEnd: signedEnd })
118
- └────────────────────────┬────────────────────────────┘
119
- │
120
- ▼
121
- ┌─────────────────────────────────────────────────────┐
122
- │ @blockcast/fec-worker (configured with publicKey)│
123
- │ ed25519.verify_detached(auth, │
124
- │ symbol[0..payloadEnd], │
125
- │ publicKey) │
126
- │ → emits altaVerified per packet → FecTrackStats │
127
- └─────────────────────────────────────────────────────┘
128
- ```
129
-
130
- Concretely, in `packages/container/src/mmtp-router.ts:798`, the router calls `extractAltaTrailer(packet)` for every signed source packet on the wire, packages the result as `{ auth, payloadEnd: signedEnd }`, and hands it to the FEC manager. The FEC worker (configured with `alta.publicKey` from the CMSF catalog at `configure()` time) does the actual Ed25519 / P-256 verification and increments per-track `altaVerified` / `altaFailed` counters in `FecTrackStats`. Those counters surface in CMCD as `x-bc-alta-verified` (see `packages/container/src/cmcd-producer.ts:93`).
131
-
132
- ## Why not TESLA
133
-
134
- TESLA (RFC 4082) is the IETF reference for sender-authenticated multicast: it uses delayed-disclosure of MAC keys to amortize signing cost, but at the protocol level it carries 10–20% authentication overhead per stream (depending on key chain depth and disclosure interval). ALTA is Blockcast's lighter variant — same threat model (verify each packet was minted by the legitimate sender, not a rogue injector on the multicast group), measurably lower overhead (~6.91% in production multicast tests). The parent monorepo's `CLAUDE.md` calls this out at `packages/alta/`. ALTA replaces the v2 stub verifier in v3.0 / Phase 8.
135
-
136
- ## Relation to DRM
137
-
138
- ALTA and DRM solve **different** problems and are orthogonal:
139
-
140
- | | ALTA | DRM (Widevine / PlayReady / FairPlay / ClearKey) |
141
- |---|---|---|
142
- | Authenticates | the **sender** | the **receiver** |
143
- | Question | "Did this packet come from the legitimate broadcaster?" | "Is this device authorized to play this content?" |
144
- | Wire layer | Per-MMTP-packet detached trailer | Sample-level CENC encryption + license server |
145
- | Catalog field | `alta.publicKey` | `contentProtection[]` (planned in v4 / M7) |
146
-
147
- A stream can use both — ALTA on the multicast wire (so receivers reject injected packets), CENC + DRM at the sample level (so unauthorized devices can't play). They don't interact.
148
-
149
- ## Specifications
150
-
151
- - **ISO/IEC 23008-1:2023** §9.2.2 (MMTP packet header), §9.2.3 (MPU/MFU header) — the host packet structure
152
- - **draft-ramadan-moq-mmt** §12 — detached authenticator trailer ("Path 2 / 08-07") wire format
153
- - **RFC 8032** — Ed25519 signature algorithm (a typical inhabitant of the trailer)
154
- - **NIST FIPS 186-4** — ECDSA over P-256 (alternative inhabitant)
155
- - **RFC 4082** — TESLA (the heavier scheme ALTA replaces; included for context, not a dependency)
156
- - ATSC A/331 §A — referenced by libmmt for catalog-style key/signaling distribution patterns
157
-
158
- This package is agnostic to the signature algorithm — it only carries opaque bytes.
159
-
160
- ## Related packages
161
-
162
- | Package | Role |
163
- |---------|------|
164
- | `@blockcast/mmt-container` | Consumes this parser via `mmtp-router.ts`; provides the CMSF catalog that distributes `alta.publicKey` to the FEC worker. |
165
- | `@blockcast/fec-worker` | Verifier — receives `{ auth, payloadEnd }` and the catalog public key at configure time, performs the actual Ed25519 / P-256 verification, increments `altaVerified` / `altaFailed` in `FecTrackStats`. |
166
- | `@blockcast/mmt-fec` | Surfaces verification counters to the application via FEC stats snapshots. |
167
-
168
- ## Testing
169
-
170
- ```bash
171
- pnpm test # vitest run
172
- pnpm test:watch # vitest in watch mode
173
- pnpm typecheck # tsc --noEmit
174
- pnpm build # tsc → dist/
175
- ```
176
-
177
- Direct tests in `src/index.test.ts` cover canonical complete/fragmented declarations, ALTA-only and ALTA+FEC suffixes, malformed lengths, and rejection of obsolete boundary conventions. Coverage is also exercised through the re-exported parser in `@blockcast/mmt-container`.
178
-
179
- ## License
180
-
181
- Apache-2.0 — see `LICENSE`.