@blockcast/mmt-container 0.1.0-main.0399efef1f07

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 (694) hide show
  1. package/README.md +432 -0
  2. package/dist/.build-stamp +0 -0
  3. package/dist/__tests__/test-utils.d.ts +71 -0
  4. package/dist/__tests__/test-utils.d.ts.map +1 -0
  5. package/dist/align.d.ts +152 -0
  6. package/dist/align.d.ts.map +1 -0
  7. package/dist/align.js +88 -0
  8. package/dist/align.js.map +7 -0
  9. package/dist/audio-init-parser.d.ts +66 -0
  10. package/dist/audio-init-parser.d.ts.map +1 -0
  11. package/dist/audio-init-parser.js +118 -0
  12. package/dist/audio-init-parser.js.map +7 -0
  13. package/dist/audio-ring-buffer.d.ts +50 -0
  14. package/dist/audio-ring-buffer.d.ts.map +1 -0
  15. package/dist/audio-ring-buffer.js +93 -0
  16. package/dist/audio-ring-buffer.js.map +7 -0
  17. package/dist/authored-timing.d.ts +32 -0
  18. package/dist/authored-timing.d.ts.map +1 -0
  19. package/dist/authored-timing.js +32 -0
  20. package/dist/authored-timing.js.map +7 -0
  21. package/dist/browser-runtime.js +20087 -0
  22. package/dist/browser-runtime.js.map +7 -0
  23. package/dist/carp-catalog.d.ts +318 -0
  24. package/dist/carp-catalog.d.ts.map +1 -0
  25. package/dist/carp-catalog.js +873 -0
  26. package/dist/carp-catalog.js.map +7 -0
  27. package/dist/catalog-fec-params.d.ts +202 -0
  28. package/dist/catalog-fec-params.d.ts.map +1 -0
  29. package/dist/catalog-fec-params.js +568 -0
  30. package/dist/catalog-fec-params.js.map +7 -0
  31. package/dist/catalog-network-source.d.ts +19 -0
  32. package/dist/catalog-network-source.d.ts.map +1 -0
  33. package/dist/catalog-network-source.js +22 -0
  34. package/dist/catalog-network-source.js.map +7 -0
  35. package/dist/catalog-validator.d.ts +18 -0
  36. package/dist/catalog-validator.d.ts.map +1 -0
  37. package/dist/catalog-validator.js +7747 -0
  38. package/dist/catalog-validator.js.map +7 -0
  39. package/dist/cmaf-block-assembler.d.ts +217 -0
  40. package/dist/cmaf-block-assembler.d.ts.map +1 -0
  41. package/dist/cmaf-block-assembler.js +1769 -0
  42. package/dist/cmaf-block-assembler.js.map +7 -0
  43. package/dist/cmaf-group-batcher.d.ts +38 -0
  44. package/dist/cmaf-group-batcher.d.ts.map +1 -0
  45. package/dist/cmaf-group-batcher.js +195 -0
  46. package/dist/cmaf-group-batcher.js.map +7 -0
  47. package/dist/cmcd-producer.d.ts +104 -0
  48. package/dist/cmcd-producer.d.ts.map +1 -0
  49. package/dist/cmcd-producer.js +207 -0
  50. package/dist/cmcd-producer.js.map +7 -0
  51. package/dist/codec-utils.d.ts +248 -0
  52. package/dist/codec-utils.d.ts.map +1 -0
  53. package/dist/codec-utils.js +1268 -0
  54. package/dist/codec-utils.js.map +7 -0
  55. package/dist/fec-codec.d.ts +32 -0
  56. package/dist/fec-codec.d.ts.map +1 -0
  57. package/dist/fec-codec.js +47 -0
  58. package/dist/fec-codec.js.map +7 -0
  59. package/dist/fec-manager.d.ts +307 -0
  60. package/dist/fec-manager.d.ts.map +1 -0
  61. package/dist/fec-manager.js +1530 -0
  62. package/dist/fec-manager.js.map +7 -0
  63. package/dist/fec-starvation-detector.d.ts +59 -0
  64. package/dist/fec-starvation-detector.d.ts.map +1 -0
  65. package/dist/fec-starvation-detector.js +75 -0
  66. package/dist/fec-starvation-detector.js.map +7 -0
  67. package/dist/fec-worker-setup.d.ts +88 -0
  68. package/dist/fec-worker-setup.d.ts.map +1 -0
  69. package/dist/fec-worker-setup.js +614 -0
  70. package/dist/fec-worker-setup.js.map +7 -0
  71. package/dist/fmp4-completion.d.ts +30 -0
  72. package/dist/fmp4-completion.d.ts.map +1 -0
  73. package/dist/fmp4-completion.js +21 -0
  74. package/dist/fmp4-completion.js.map +7 -0
  75. package/dist/fmp4-reader.d.ts +37 -0
  76. package/dist/fmp4-reader.d.ts.map +1 -0
  77. package/dist/fmp4-reader.js +100 -0
  78. package/dist/fmp4-reader.js.map +7 -0
  79. package/dist/index.d.ts +47 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +380 -0
  82. package/dist/index.js.map +7 -0
  83. package/dist/iso-bmff-timing.d.ts +78 -0
  84. package/dist/iso-bmff-timing.d.ts.map +1 -0
  85. package/dist/iso-bmff-timing.js +618 -0
  86. package/dist/iso-bmff-timing.js.map +7 -0
  87. package/dist/loc.d.ts +68 -0
  88. package/dist/loc.d.ts.map +1 -0
  89. package/dist/loc.js +143 -0
  90. package/dist/loc.js.map +7 -0
  91. package/dist/manifest-auth-plan.d.ts +30 -0
  92. package/dist/manifest-auth-plan.d.ts.map +1 -0
  93. package/dist/manifest-auth-plan.js +1285 -0
  94. package/dist/manifest-auth-plan.js.map +7 -0
  95. package/dist/media-router.d.ts +251 -0
  96. package/dist/media-router.d.ts.map +1 -0
  97. package/dist/media-router.js +624 -0
  98. package/dist/media-router.js.map +7 -0
  99. package/dist/mfu-reassembler.d.ts +396 -0
  100. package/dist/mfu-reassembler.d.ts.map +1 -0
  101. package/dist/mfu-reassembler.js +3085 -0
  102. package/dist/mfu-reassembler.js.map +7 -0
  103. package/dist/mfu-reassembly-policy.d.ts +24 -0
  104. package/dist/mfu-reassembly-policy.d.ts.map +1 -0
  105. package/dist/mfu-reassembly-policy.js +99 -0
  106. package/dist/mfu-reassembly-policy.js.map +7 -0
  107. package/dist/mmtp-container-parser.d.ts +434 -0
  108. package/dist/mmtp-container-parser.d.ts.map +1 -0
  109. package/dist/mmtp-container-parser.js +6164 -0
  110. package/dist/mmtp-container-parser.js.map +7 -0
  111. package/dist/mmtp-container-parser.no-modules.js +8999 -0
  112. package/dist/mmtp-container-parser.no-modules.js.map +7 -0
  113. package/dist/mmtp-decode-pipeline.d.ts +132 -0
  114. package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
  115. package/dist/mmtp-decode-pipeline.js +6413 -0
  116. package/dist/mmtp-decode-pipeline.js.map +7 -0
  117. package/dist/mmtp-router.d.ts +390 -0
  118. package/dist/mmtp-router.d.ts.map +1 -0
  119. package/dist/mmtp-router.js +9242 -0
  120. package/dist/mmtp-router.js.map +7 -0
  121. package/dist/mmtp-to-cmaf.d.ts +181 -0
  122. package/dist/mmtp-to-cmaf.d.ts.map +1 -0
  123. package/dist/mmtp-to-cmaf.js +802 -0
  124. package/dist/mmtp-to-cmaf.js.map +7 -0
  125. package/dist/multicast-auth-catalog.d.ts +115 -0
  126. package/dist/multicast-auth-catalog.d.ts.map +1 -0
  127. package/dist/multicast-auth-catalog.js +202 -0
  128. package/dist/multicast-auth-catalog.js.map +7 -0
  129. package/dist/multicast-input.d.ts +107 -0
  130. package/dist/multicast-input.d.ts.map +1 -0
  131. package/dist/multicast-input.js +256 -0
  132. package/dist/multicast-input.js.map +7 -0
  133. package/dist/multicast-manager.d.ts +369 -0
  134. package/dist/multicast-manager.d.ts.map +1 -0
  135. package/dist/multicast-manager.js +13400 -0
  136. package/dist/multicast-manager.js.map +7 -0
  137. package/dist/multicast-transport.d.ts +61 -0
  138. package/dist/multicast-transport.d.ts.map +1 -0
  139. package/dist/multicast-transport.js +1665 -0
  140. package/dist/multicast-transport.js.map +7 -0
  141. package/dist/multicast-unwrap.d.ts +57 -0
  142. package/dist/multicast-unwrap.d.ts.map +1 -0
  143. package/dist/multicast-unwrap.js +384 -0
  144. package/dist/multicast-unwrap.js.map +7 -0
  145. package/dist/no-modules.d.ts +9 -0
  146. package/dist/no-modules.d.ts.map +1 -0
  147. package/dist/no-modules.js +8965 -0
  148. package/dist/no-modules.js.map +7 -0
  149. package/dist/phase14-catalog-override.d.ts +126 -0
  150. package/dist/phase14-catalog-override.d.ts.map +1 -0
  151. package/dist/phase14-catalog-override.js +155 -0
  152. package/dist/phase14-catalog-override.js.map +7 -0
  153. package/dist/repair-fetch.d.ts +58 -0
  154. package/dist/repair-fetch.d.ts.map +1 -0
  155. package/dist/repair-fetch.js +127 -0
  156. package/dist/repair-fetch.js.map +7 -0
  157. package/dist/repair-layers.d.ts +141 -0
  158. package/dist/repair-layers.d.ts.map +1 -0
  159. package/dist/repair-layers.js +303 -0
  160. package/dist/repair-layers.js.map +7 -0
  161. package/dist/sample-combiner.d.ts +212 -0
  162. package/dist/sample-combiner.d.ts.map +1 -0
  163. package/dist/sample-combiner.js +616 -0
  164. package/dist/sample-combiner.js.map +7 -0
  165. package/dist/signaling.d.ts +29 -0
  166. package/dist/signaling.d.ts.map +1 -0
  167. package/dist/signaling.js +232 -0
  168. package/dist/signaling.js.map +7 -0
  169. package/dist/source-auth.d.ts +2 -0
  170. package/dist/source-auth.d.ts.map +1 -0
  171. package/dist/source-auth.js +1238 -0
  172. package/dist/source-auth.js.map +7 -0
  173. package/dist/switching-set-alignment.d.ts +61 -0
  174. package/dist/switching-set-alignment.d.ts.map +1 -0
  175. package/dist/switching-set-alignment.js +85 -0
  176. package/dist/switching-set-alignment.js.map +7 -0
  177. package/dist/timestamp-codec.d.ts +34 -0
  178. package/dist/timestamp-codec.d.ts.map +1 -0
  179. package/dist/timestamp-codec.js +456 -0
  180. package/dist/timestamp-codec.js.map +7 -0
  181. package/dist/track-pipeline-setup.d.ts +72 -0
  182. package/dist/track-pipeline-setup.d.ts.map +1 -0
  183. package/dist/track-pipeline-setup.js +306 -0
  184. package/dist/track-pipeline-setup.js.map +7 -0
  185. package/dist/track-pipeline.d.ts +121 -0
  186. package/dist/track-pipeline.d.ts.map +1 -0
  187. package/dist/track-pipeline.js +229 -0
  188. package/dist/track-pipeline.js.map +7 -0
  189. package/dist/track-session.d.ts +398 -0
  190. package/dist/track-session.d.ts.map +1 -0
  191. package/dist/track-session.js +767 -0
  192. package/dist/track-session.js.map +7 -0
  193. package/dist/transport-pool.d.ts +69 -0
  194. package/dist/transport-pool.d.ts.map +1 -0
  195. package/dist/transport-pool.js +88 -0
  196. package/dist/transport-pool.js.map +7 -0
  197. package/dist/wasm-mfu-reassembler.d.ts +92 -0
  198. package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
  199. package/dist/wasm-mfu-reassembler.js +2139 -0
  200. package/dist/wasm-mfu-reassembler.js.map +7 -0
  201. package/dist/wasm-mmtp-container-parser.d.ts +10 -0
  202. package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
  203. package/dist/wasm-mmtp-container-parser.js +6418 -0
  204. package/dist/wasm-mmtp-container-parser.js.map +7 -0
  205. package/node_modules/@blockcast/fec-worker/README.md +213 -0
  206. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  207. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +87 -0
  208. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
  209. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +279 -0
  210. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
  211. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
  212. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
  213. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
  214. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
  215. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
  216. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
  217. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
  218. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
  219. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
  220. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
  221. package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
  222. package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
  223. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
  224. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
  225. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
  226. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
  227. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
  228. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
  229. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
  230. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
  231. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
  232. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
  233. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
  234. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
  235. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
  236. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
  237. package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
  238. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
  239. package/node_modules/@blockcast/fec-worker/package.json +59 -0
  240. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +319 -0
  241. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
  242. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
  243. package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
  244. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
  245. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
  246. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
  247. package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
  248. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  249. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  250. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  251. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  252. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  253. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  254. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  255. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  256. package/node_modules/@blockcast/mmt-base/README.md +120 -0
  257. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  258. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  259. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  260. package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  261. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  262. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +276 -0
  263. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  264. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +645 -0
  265. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  266. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  267. package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  268. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +899 -0
  269. package/node_modules/@blockcast/mmt-fec/README.md +270 -0
  270. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  271. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +82 -0
  272. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
  273. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +296 -0
  274. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
  275. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
  276. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
  277. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
  278. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
  279. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
  280. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
  281. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
  282. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
  283. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
  284. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
  285. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
  286. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
  287. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
  288. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
  289. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
  290. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
  291. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
  292. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
  293. package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
  294. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
  295. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
  296. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
  297. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
  298. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
  299. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +172 -0
  300. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
  301. package/node_modules/@blockcast/mmt-fec/dist/oti.js +254 -0
  302. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
  303. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
  304. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
  305. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
  306. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +276 -0
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +645 -0
  324. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  325. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
  326. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  327. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +899 -0
  328. package/node_modules/@blockcast/mmt-fec/package.json +79 -0
  329. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +371 -0
  330. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
  331. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
  332. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
  333. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
  334. package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
  335. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
  336. package/node_modules/@blockcast/mmt-fec/src/oti.ts +317 -0
  337. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
  351. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +99 -0
  352. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
  353. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +492 -0
  354. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
  355. package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
  356. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
  357. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
  358. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
  359. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +669 -0
  360. package/node_modules/@noble/hashes/LICENSE +21 -0
  361. package/node_modules/@noble/hashes/README.md +521 -0
  362. package/node_modules/@noble/hashes/_assert.d.ts +17 -0
  363. package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
  364. package/node_modules/@noble/hashes/_assert.js +18 -0
  365. package/node_modules/@noble/hashes/_assert.js.map +1 -0
  366. package/node_modules/@noble/hashes/_blake.d.ts +14 -0
  367. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  368. package/node_modules/@noble/hashes/_blake.js +50 -0
  369. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  370. package/node_modules/@noble/hashes/_md.d.ts +51 -0
  371. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  372. package/node_modules/@noble/hashes/_md.js +162 -0
  373. package/node_modules/@noble/hashes/_md.js.map +1 -0
  374. package/node_modules/@noble/hashes/_u64.d.ts +55 -0
  375. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  376. package/node_modules/@noble/hashes/_u64.js +90 -0
  377. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  378. package/node_modules/@noble/hashes/argon2.d.ts +32 -0
  379. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  380. package/node_modules/@noble/hashes/argon2.js +401 -0
  381. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  382. package/node_modules/@noble/hashes/blake1.d.ts +106 -0
  383. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  384. package/node_modules/@noble/hashes/blake1.js +459 -0
  385. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  386. package/node_modules/@noble/hashes/blake2.d.ts +116 -0
  387. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  388. package/node_modules/@noble/hashes/blake2.js +420 -0
  389. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  390. package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
  391. package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
  392. package/node_modules/@noble/hashes/blake2b.js +14 -0
  393. package/node_modules/@noble/hashes/blake2b.js.map +1 -0
  394. package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
  395. package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
  396. package/node_modules/@noble/hashes/blake2s.js +24 -0
  397. package/node_modules/@noble/hashes/blake2s.js.map +1 -0
  398. package/node_modules/@noble/hashes/blake3.d.ts +54 -0
  399. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  400. package/node_modules/@noble/hashes/blake3.js +255 -0
  401. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  402. package/node_modules/@noble/hashes/crypto.d.ts +2 -0
  403. package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
  404. package/node_modules/@noble/hashes/crypto.js +5 -0
  405. package/node_modules/@noble/hashes/crypto.js.map +1 -0
  406. package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
  407. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
  408. package/node_modules/@noble/hashes/cryptoNode.js +18 -0
  409. package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
  410. package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
  411. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  412. package/node_modules/@noble/hashes/eskdf.js +166 -0
  413. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  414. package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
  415. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
  416. package/node_modules/@noble/hashes/esm/_assert.js +15 -0
  417. package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
  418. package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
  419. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
  420. package/node_modules/@noble/hashes/esm/_blake.js +45 -0
  421. package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
  422. package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
  423. package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
  424. package/node_modules/@noble/hashes/esm/_md.js +155 -0
  425. package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
  426. package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
  427. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
  428. package/node_modules/@noble/hashes/esm/_u64.js +67 -0
  429. package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
  430. package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
  431. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
  432. package/node_modules/@noble/hashes/esm/argon2.js +392 -0
  433. package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
  434. package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
  435. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
  436. package/node_modules/@noble/hashes/esm/blake1.js +452 -0
  437. package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
  438. package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
  439. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
  440. package/node_modules/@noble/hashes/esm/blake2.js +413 -0
  441. package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
  442. package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
  443. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
  444. package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
  445. package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
  446. package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
  447. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
  448. package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
  449. package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
  450. package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
  451. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
  452. package/node_modules/@noble/hashes/esm/blake3.js +251 -0
  453. package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
  454. package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
  455. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
  456. package/node_modules/@noble/hashes/esm/crypto.js +2 -0
  457. package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
  458. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
  459. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
  460. package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
  461. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
  462. package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
  463. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
  464. package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
  465. package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
  466. package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
  467. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
  468. package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
  469. package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
  470. package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
  471. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
  472. package/node_modules/@noble/hashes/esm/hmac.js +86 -0
  473. package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
  474. package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
  475. package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
  476. package/node_modules/@noble/hashes/esm/index.js +33 -0
  477. package/node_modules/@noble/hashes/esm/index.js.map +1 -0
  478. package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
  479. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
  480. package/node_modules/@noble/hashes/esm/legacy.js +281 -0
  481. package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
  482. package/node_modules/@noble/hashes/esm/package.json +10 -0
  483. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
  484. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
  485. package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
  486. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
  487. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
  488. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
  489. package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
  490. package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
  491. package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
  492. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
  493. package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
  494. package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
  495. package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
  496. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
  497. package/node_modules/@noble/hashes/esm/sha1.js +11 -0
  498. package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
  499. package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
  500. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
  501. package/node_modules/@noble/hashes/esm/sha2.js +375 -0
  502. package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
  503. package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
  504. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
  505. package/node_modules/@noble/hashes/esm/sha256.js +20 -0
  506. package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
  507. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
  508. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
  509. package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
  510. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
  511. package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
  512. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
  513. package/node_modules/@noble/hashes/esm/sha3.js +234 -0
  514. package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
  515. package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
  516. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
  517. package/node_modules/@noble/hashes/esm/sha512.js +26 -0
  518. package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
  519. package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
  520. package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
  521. package/node_modules/@noble/hashes/esm/utils.js +281 -0
  522. package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
  523. package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
  524. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  525. package/node_modules/@noble/hashes/hkdf.js +88 -0
  526. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  527. package/node_modules/@noble/hashes/hmac.d.ts +35 -0
  528. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  529. package/node_modules/@noble/hashes/hmac.js +91 -0
  530. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  531. package/node_modules/@noble/hashes/index.d.ts +1 -0
  532. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  533. package/node_modules/@noble/hashes/index.js +33 -0
  534. package/node_modules/@noble/hashes/index.js.map +1 -0
  535. package/node_modules/@noble/hashes/legacy.d.ts +71 -0
  536. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  537. package/node_modules/@noble/hashes/legacy.js +287 -0
  538. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  539. package/node_modules/@noble/hashes/package.json +266 -0
  540. package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
  541. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  542. package/node_modules/@noble/hashes/pbkdf2.js +101 -0
  543. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  544. package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
  545. package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
  546. package/node_modules/@noble/hashes/ripemd160.js +16 -0
  547. package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
  548. package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
  549. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  550. package/node_modules/@noble/hashes/scrypt.js +232 -0
  551. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  552. package/node_modules/@noble/hashes/sha1.d.ts +11 -0
  553. package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
  554. package/node_modules/@noble/hashes/sha1.js +14 -0
  555. package/node_modules/@noble/hashes/sha1.js.map +1 -0
  556. package/node_modules/@noble/hashes/sha2.d.ts +159 -0
  557. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  558. package/node_modules/@noble/hashes/sha2.js +384 -0
  559. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  560. package/node_modules/@noble/hashes/sha256.d.ts +20 -0
  561. package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
  562. package/node_modules/@noble/hashes/sha256.js +23 -0
  563. package/node_modules/@noble/hashes/sha256.js.map +1 -0
  564. package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
  565. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  566. package/node_modules/@noble/hashes/sha3-addons.js +402 -0
  567. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  568. package/node_modules/@noble/hashes/sha3.d.ts +53 -0
  569. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  570. package/node_modules/@noble/hashes/sha3.js +239 -0
  571. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  572. package/node_modules/@noble/hashes/sha512.d.ts +26 -0
  573. package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
  574. package/node_modules/@noble/hashes/sha512.js +29 -0
  575. package/node_modules/@noble/hashes/sha512.js.map +1 -0
  576. package/node_modules/@noble/hashes/src/_assert.ts +22 -0
  577. package/node_modules/@noble/hashes/src/_blake.ts +50 -0
  578. package/node_modules/@noble/hashes/src/_md.ts +176 -0
  579. package/node_modules/@noble/hashes/src/_u64.ts +91 -0
  580. package/node_modules/@noble/hashes/src/argon2.ts +497 -0
  581. package/node_modules/@noble/hashes/src/blake1.ts +534 -0
  582. package/node_modules/@noble/hashes/src/blake2.ts +486 -0
  583. package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
  584. package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
  585. package/node_modules/@noble/hashes/src/blake3.ts +272 -0
  586. package/node_modules/@noble/hashes/src/crypto.ts +9 -0
  587. package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
  588. package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
  589. package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
  590. package/node_modules/@noble/hashes/src/hmac.ts +94 -0
  591. package/node_modules/@noble/hashes/src/index.ts +31 -0
  592. package/node_modules/@noble/hashes/src/legacy.ts +293 -0
  593. package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
  594. package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
  595. package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
  596. package/node_modules/@noble/hashes/src/sha1.ts +10 -0
  597. package/node_modules/@noble/hashes/src/sha2.ts +402 -0
  598. package/node_modules/@noble/hashes/src/sha256.ts +24 -0
  599. package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
  600. package/node_modules/@noble/hashes/src/sha3.ts +258 -0
  601. package/node_modules/@noble/hashes/src/sha512.ts +34 -0
  602. package/node_modules/@noble/hashes/src/utils.ts +395 -0
  603. package/node_modules/@noble/hashes/utils.d.ts +161 -0
  604. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  605. package/node_modules/@noble/hashes/utils.js +313 -0
  606. package/node_modules/@noble/hashes/utils.js.map +1 -0
  607. package/package.json +203 -0
  608. package/schemas/catalog.schema.json +360 -0
  609. package/src/align.ts +239 -0
  610. package/src/audio-init-parser.ts +189 -0
  611. package/src/audio-ring-buffer.ts +120 -0
  612. package/src/authored-timing.ts +63 -0
  613. package/src/carp-catalog.ts +845 -0
  614. package/src/catalog-fec-params.ts +535 -0
  615. package/src/catalog-network-source.ts +49 -0
  616. package/src/catalog-validator.ts +34 -0
  617. package/src/cmaf-block-assembler.ts +1167 -0
  618. package/src/cmaf-group-batcher.ts +104 -0
  619. package/src/cmcd-producer.ts +334 -0
  620. package/src/codec-utils.ts +1611 -0
  621. package/src/fec-codec.ts +61 -0
  622. package/src/fec-manager.ts +2081 -0
  623. package/src/fec-starvation-detector.ts +128 -0
  624. package/src/fec-worker-setup.ts +213 -0
  625. package/src/fmp4-completion.ts +47 -0
  626. package/src/fmp4-reader.ts +112 -0
  627. package/src/index.ts +486 -0
  628. package/src/iso-bmff-timing.ts +813 -0
  629. package/src/loc.ts +181 -0
  630. package/src/manifest-auth-plan.ts +107 -0
  631. package/src/media-router.ts +795 -0
  632. package/src/mfu-reassembler.ts +3741 -0
  633. package/src/mfu-reassembly-policy.ts +134 -0
  634. package/src/mmtp-container-parser.ts +1836 -0
  635. package/src/mmtp-decode-pipeline.ts +389 -0
  636. package/src/mmtp-router.ts +3136 -0
  637. package/src/mmtp-to-cmaf.ts +1024 -0
  638. package/src/multicast-auth-catalog.ts +340 -0
  639. package/src/multicast-input.ts +439 -0
  640. package/src/multicast-manager.ts +1720 -0
  641. package/src/multicast-transport.ts +321 -0
  642. package/src/multicast-unwrap.ts +132 -0
  643. package/src/no-modules.ts +20 -0
  644. package/src/phase14-catalog-override.ts +336 -0
  645. package/src/repair-fetch.ts +238 -0
  646. package/src/repair-layers.ts +490 -0
  647. package/src/sample-combiner.ts +938 -0
  648. package/src/signaling.ts +78 -0
  649. package/src/source-auth.ts +1 -0
  650. package/src/switching-set-alignment.ts +109 -0
  651. package/src/timestamp-codec.ts +265 -0
  652. package/src/track-pipeline-setup.ts +189 -0
  653. package/src/track-pipeline.ts +332 -0
  654. package/src/track-session.ts +994 -0
  655. package/src/transport-pool.ts +128 -0
  656. package/src/wasm-mfu-reassembler.ts +389 -0
  657. package/src/wasm-mmtp-container-parser.ts +23 -0
  658. package/test-vectors/align.json +199 -0
  659. package/test-vectors/catalog/README.md +40 -0
  660. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +27 -0
  661. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +32 -0
  662. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +30 -0
  663. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +31 -0
  664. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +33 -0
  665. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +23 -0
  666. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +32 -0
  667. package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
  668. package/test-vectors/catalog/negative/media-track-repair-layer.json +16 -0
  669. package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
  670. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
  671. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
  672. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
  673. package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
  674. package/test-vectors/catalog/negative/network-source-object.json +25 -0
  675. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +23 -0
  676. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
  677. package/test-vectors/catalog/negative/repair-track-legacy-shape.json +19 -0
  678. package/test-vectors/catalog/negative/track-role-empty.json +16 -0
  679. package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
  680. package/test-vectors/catalog/positive/fec-layered-repair.json +104 -0
  681. package/test-vectors/catalog/positive/fec-multicast.json +51 -0
  682. package/test-vectors/catalog/positive/flat-av.json +30 -0
  683. package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
  684. package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
  685. package/test-vectors/catalog/positive/track-role.json +49 -0
  686. package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
  687. package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
  688. package/test-vectors/catalog-multicast-auth-v1.json +26 -0
  689. package/test-vectors/catalog-validation.json +148 -0
  690. package/test-vectors/catalog-validator-public-api.mjs +25 -0
  691. package/test-vectors/generate-source-auth-fixture.mjs +114 -0
  692. package/test-vectors/source-auth-v1.json +61 -0
  693. package/test-vectors/source-contiguity-v1.json +131 -0
  694. package/test-vectors/subsample-placement-v1.json +230 -0
@@ -0,0 +1,669 @@
1
+ import {
2
+ decodeSourceAuthManifestFrame,
3
+ sourceAuthMerkleRoot,
4
+ sourceAuthObjectDigest,
5
+ sourceAuthSignaturePreimage,
6
+ type SourceAuthGroupClose,
7
+ type SourceAuthObjectEntry,
8
+ } from './source-auth.js'
9
+
10
+ export type ManifestAuthMode = 'off' | 'shadow' | 'enforce'
11
+ export type MissingManifestPolicy = 'stall' | 'fallback-shadow'
12
+ export type ManifestFailureReason =
13
+ | 'sigInvalid'
14
+ | 'digestMismatch'
15
+ | 'manifestLate'
16
+ | 'manifestAbsent'
17
+ | 'verifierError'
18
+
19
+ export interface ManifestAuthConfig {
20
+ mode: ManifestAuthMode
21
+ onMissingManifest: MissingManifestPolicy
22
+ }
23
+
24
+ export interface ManifestObjectIdentity {
25
+ trackName: string
26
+ /** Stable v2 auth binding. Defaults to trackName for legacy single-format callers. */
27
+ bindingId?: string
28
+ /** MoQ group ids are u62; values above 2^53 must be passed as bigint. */
29
+ groupId: number | bigint
30
+ objectId: number
31
+ packetId?: number
32
+ ssId?: number
33
+ }
34
+
35
+ export interface ManifestFecBlockMapper {
36
+ readonly d: number
37
+ derive(groupId: number, objectId: number): { ssId: number }
38
+ }
39
+
40
+ export interface ManifestTrackContext {
41
+ broadcastNamespaceId: string
42
+ trackName: string
43
+ /** Stable v2 auth binding. Defaults to trackName for legacy single-format callers. */
44
+ bindingId?: string
45
+ sourceSymbolFormat?: string
46
+ keyEpoch: number
47
+ codec: string
48
+ timing: string
49
+ fecGeometry: string
50
+ manifestFormatVersion: number
51
+ /** Authenticated-catalog binding for the namespace, track, epoch, codec,
52
+ * timing, FEC geometry, and manifest version fields above. */
53
+ authScope: Uint8Array
54
+ publicKey: Uint8Array
55
+ /** Current key first, followed by any catalog-advertised overlap keys. */
56
+ acceptedPublicKeys?: readonly Uint8Array[]
57
+ bitrate: number
58
+ groupDurationMs: number
59
+ mapper: ManifestFecBlockMapper
60
+ manifestChannelAuthenticated: boolean
61
+ }
62
+
63
+ export interface ManifestVerificationStats {
64
+ verified: number
65
+ /** Terminal outcomes only: an object counted here will never be verified. */
66
+ failures: Record<ManifestFailureReason, number>
67
+ /**
68
+ * Objects currently held in quarantine awaiting a manifest — pending, NOT
69
+ * failed, and deliberately disjoint from `failures`. An enforce-mode stall is
70
+ * accounted here first and moves into `failures` only once the verifier gives
71
+ * up on it, so a reason breakdown that ignores this gauge under-reports live
72
+ * stalls by whatever is still in flight (BLO-30007).
73
+ */
74
+ quarantined: number
75
+ quarantinedBytes: number
76
+ }
77
+
78
+ export interface ManifestFailure {
79
+ trackName: string
80
+ bindingId?: string
81
+ groupId: number | bigint
82
+ objectId: number
83
+ reason: ManifestFailureReason
84
+ }
85
+
86
+ export interface ManifestAdmission {
87
+ action: 'play' | 'stall' | 'drop'
88
+ verified: boolean
89
+ reason?: ManifestFailureReason
90
+ }
91
+
92
+ export type SignatureVerifier = (
93
+ publicKey: Uint8Array,
94
+ message: Uint8Array,
95
+ signature: Uint8Array,
96
+ ) => boolean | Promise<boolean>
97
+
98
+ export function manifestBindingId(trackName: string, sourceSymbolFormat: string): string {
99
+ return JSON.stringify([trackName, sourceSymbolFormat])
100
+ }
101
+
102
+ export function createWebCryptoEd25519Verifier(
103
+ subtle: SubtleCrypto = globalThis.crypto.subtle,
104
+ ): SignatureVerifier {
105
+ return async (publicKey, message, signature) => {
106
+ const keyBytes = Uint8Array.from(publicKey)
107
+ const messageBytes = Uint8Array.from(message)
108
+ const signatureBytes = Uint8Array.from(signature)
109
+ const key = await subtle.importKey('raw', keyBytes.buffer, 'Ed25519', false, ['verify'])
110
+ return subtle.verify('Ed25519', key, signatureBytes.buffer, messageBytes.buffer)
111
+ }
112
+ }
113
+
114
+ interface PendingObject {
115
+ identity: ManifestObjectIdentity
116
+ data: Uint8Array
117
+ release: () => void
118
+ discard?: () => void
119
+ bytes: number
120
+ }
121
+
122
+ interface GroupState {
123
+ entries: Map<number, SourceAuthObjectEntry>
124
+ pending: Map<number, PendingObject>
125
+ close?: SourceAuthGroupClose
126
+ /** Close frame that arrived before all object entries (manifest-channel
127
+ * reordering); retried once the entry count matches. */
128
+ pendingClose?: SourceAuthGroupClose
129
+ rootVerified: boolean
130
+ signaturePending?: boolean
131
+ failed?: ManifestFailureReason
132
+ }
133
+
134
+ interface TrackState {
135
+ context: ManifestTrackContext
136
+ groups: Map<bigint, GroupState>
137
+ quarantine: PendingObject[]
138
+ quarantinedBytes: number
139
+ capBytes: number
140
+ manifestEntries: number
141
+ maxManifestEntries: number
142
+ maxGroups: number
143
+ }
144
+
145
+ const FAILURE_REASONS: readonly ManifestFailureReason[] = [
146
+ 'sigInvalid',
147
+ 'digestMismatch',
148
+ 'manifestLate',
149
+ 'manifestAbsent',
150
+ 'verifierError',
151
+ ]
152
+
153
+ const equalBytes = (left: Uint8Array, right: Uint8Array): boolean => {
154
+ if (left.byteLength !== right.byteLength) return false
155
+ let diff = 0
156
+ for (let index = 0; index < left.byteLength; index++) diff |= left[index]! ^ right[index]!
157
+ return diff === 0
158
+ }
159
+
160
+ const isPromiseLike = (value: boolean | Promise<boolean>): value is Promise<boolean> =>
161
+ typeof value === 'object' && value !== null && typeof value.then === 'function'
162
+
163
+ export class ManifestVerifier {
164
+ #config: ManifestAuthConfig
165
+ readonly #verifySignature: SignatureVerifier
166
+ readonly #onFailure?: (failure: ManifestFailure) => void
167
+ readonly #tracks = new Map<string, TrackState>()
168
+ readonly #stats: Omit<ManifestVerificationStats, 'quarantined'> = {
169
+ verified: 0,
170
+ failures: Object.fromEntries(FAILURE_REASONS.map((reason) => [reason, 0])) as Record<ManifestFailureReason, number>,
171
+ quarantinedBytes: 0,
172
+ }
173
+ #disposed = false
174
+
175
+ constructor(options: {
176
+ manifestAuth: ManifestAuthConfig
177
+ verifySignature: SignatureVerifier
178
+ onFailure?: (failure: ManifestFailure) => void
179
+ }) {
180
+ this.#config = { ...options.manifestAuth }
181
+ this.#verifySignature = options.verifySignature
182
+ this.#onFailure = options.onFailure
183
+ }
184
+
185
+ get config(): Readonly<ManifestAuthConfig> {
186
+ return this.#config
187
+ }
188
+
189
+ get stats(): ManifestVerificationStats {
190
+ let quarantined = 0
191
+ for (const track of this.#tracks.values()) quarantined += track.quarantine.length
192
+ return {
193
+ verified: this.#stats.verified,
194
+ failures: { ...this.#stats.failures },
195
+ quarantined,
196
+ quarantinedBytes: this.#stats.quarantinedBytes,
197
+ }
198
+ }
199
+
200
+ setMode(mode: ManifestAuthMode): void {
201
+ this.#config = { ...this.#config, mode }
202
+ if (mode !== 'enforce') this.#releaseAllQuarantine(false)
203
+ }
204
+
205
+ registerTrack(context: ManifestTrackContext): void {
206
+ const bindingId = context.bindingId ?? context.trackName
207
+ if (this.#tracks.has(bindingId)) {
208
+ throw new Error(`manifest binding ${bindingId} is already registered`)
209
+ }
210
+ if (!Number.isFinite(context.bitrate) || context.bitrate <= 0) {
211
+ throw new Error('manifest track bitrate must be > 0')
212
+ }
213
+ if (!Number.isFinite(context.groupDurationMs) || context.groupDurationMs <= 0) {
214
+ throw new Error('manifest track groupDurationMs must be > 0')
215
+ }
216
+ if (context.authScope.byteLength !== 32) throw new Error('manifest authScope must be 32 bytes')
217
+ if (context.publicKey.byteLength !== 32) throw new Error('manifest publicKey must be 32 bytes')
218
+ for (const key of context.acceptedPublicKeys ?? []) {
219
+ if (key.byteLength !== 32) throw new Error('manifest acceptedPublicKeys must contain 32-byte keys')
220
+ }
221
+ for (const [name, value] of Object.entries({
222
+ broadcastNamespaceId: context.broadcastNamespaceId,
223
+ trackName: context.trackName,
224
+ codec: context.codec,
225
+ timing: context.timing,
226
+ fecGeometry: context.fecGeometry,
227
+ })) {
228
+ if (value.length === 0) throw new Error(`manifest ${name} must not be empty`)
229
+ }
230
+ this.#tracks.set(bindingId, {
231
+ context: { ...context, bindingId },
232
+ groups: new Map(),
233
+ quarantine: [],
234
+ quarantinedBytes: 0,
235
+ capBytes: Math.ceil((context.bitrate * context.groupDurationMs) / 8000),
236
+ manifestEntries: 0,
237
+ maxManifestEntries: Math.ceil((context.bitrate * context.groupDurationMs) / (8000 * 52)),
238
+ maxGroups: context.mapper.d + 1,
239
+ })
240
+ }
241
+
242
+ ingestManifestFrame(bindingId: string, frameBytes: Uint8Array): void {
243
+ const track = this.#requireTrack(bindingId)
244
+ try {
245
+ const frame = decodeSourceAuthManifestFrame(frameBytes)
246
+ const groupId = frame.groupId
247
+ const group = this.#group(track, groupId)
248
+ if (frame.kind === 'object') {
249
+ if (group.close || group.signaturePending || group.failed) {
250
+ this.#failure({ trackName: track.context.trackName, bindingId, groupId, objectId: frame.objectId }, 'verifierError')
251
+ return
252
+ }
253
+ if (group.entries.has(frame.objectId)) {
254
+ this.#failure({ trackName: track.context.trackName, bindingId, groupId, objectId: frame.objectId }, 'verifierError')
255
+ return
256
+ }
257
+ if (group.entries.size >= 4096 || track.manifestEntries >= track.maxManifestEntries) {
258
+ this.#failure({ trackName: track.context.trackName, bindingId, groupId, objectId: frame.objectId }, 'verifierError')
259
+ return
260
+ }
261
+ group.entries.set(frame.objectId, frame)
262
+ track.manifestEntries++
263
+ const pending = group.pending.get(frame.objectId)
264
+ if (pending) {
265
+ this.#failure(pending.identity, 'manifestLate')
266
+ this.#resolvePending(track, group, pending, frame)
267
+ }
268
+ if (group.pendingClose && group.entries.size === group.pendingClose.objectCount) {
269
+ const close = group.pendingClose
270
+ group.pendingClose = undefined
271
+ this.#closeGroup(track, groupId, group, close)
272
+ }
273
+ return
274
+ }
275
+ this.#closeGroup(track, groupId, group, frame)
276
+ } catch {
277
+ this.#failure({ trackName: track.context.trackName, bindingId, groupId: 0, objectId: 0 }, 'verifierError')
278
+ }
279
+ }
280
+
281
+ admitObject(
282
+ identity: ManifestObjectIdentity,
283
+ data: Uint8Array,
284
+ release: () => void,
285
+ /**
286
+ * Called instead of `release` when a stalled object is terminally rejected
287
+ * rather than played. A caller that drives a sequence off `release` (the FEC
288
+ * symbol loop in `mmtp-router` does) must pass this, or an enforce-mode
289
+ * discard leaves the sequence waiting on a callback that will never fire.
290
+ * A `drop` returned from this call is the synchronous form of the same
291
+ * outcome and does NOT also invoke `discard`.
292
+ */
293
+ discard?: () => void,
294
+ ): ManifestAdmission {
295
+ if (this.#config.mode === 'off') {
296
+ release()
297
+ return { action: 'play', verified: false }
298
+ }
299
+ const track = this.#tracks.get(identity.bindingId ?? identity.trackName)
300
+ if (!track) {
301
+ release()
302
+ this.#failure(identity, 'verifierError')
303
+ return { action: 'play', verified: false, reason: 'verifierError' }
304
+ }
305
+ try {
306
+ if (!this.#validateIdentity(track, identity)) {
307
+ return this.#rejectOrShadow(identity, release, 'digestMismatch')
308
+ }
309
+ const group = this.#group(track, BigInt(identity.groupId))
310
+ if (group.failed === 'sigInvalid' || group.failed === 'digestMismatch') {
311
+ return this.#rejectOrShadow(identity, release, group.failed)
312
+ }
313
+ const entry = group.entries.get(identity.objectId)
314
+ if (entry) return this.#admitAgainstEntry(track, group, identity, data, release, entry, discard)
315
+ if (this.#config.mode === 'shadow' || this.#config.onMissingManifest === 'fallback-shadow') {
316
+ release()
317
+ this.#failure(identity, 'manifestAbsent')
318
+ return { action: 'play', verified: false, reason: 'manifestAbsent' }
319
+ }
320
+ if (!this.#quarantine(track, group, { identity, data, release, discard, bytes: data.byteLength })) {
321
+ return { action: 'drop', verified: false }
322
+ }
323
+ return { action: 'stall', verified: false }
324
+ } catch {
325
+ release()
326
+ this.#failure(identity, 'verifierError')
327
+ return { action: 'play', verified: false, reason: 'verifierError' }
328
+ }
329
+ }
330
+
331
+ dispose(): void {
332
+ if (this.#disposed) return
333
+ this.#disposed = true
334
+ this.#releaseAllQuarantine(false)
335
+ this.#tracks.clear()
336
+ }
337
+
338
+ #requireTrack(bindingId: string): TrackState {
339
+ const track = this.#tracks.get(bindingId)
340
+ if (!track) throw new Error(`unknown manifest binding ${bindingId}`)
341
+ return track
342
+ }
343
+
344
+ #group(track: TrackState, groupId: bigint): GroupState {
345
+ let group = track.groups.get(groupId)
346
+ if (!group) {
347
+ group = { entries: new Map(), pending: new Map(), rootVerified: false }
348
+ track.groups.set(groupId, group)
349
+ while (track.groups.size > track.maxGroups) {
350
+ const oldest = track.groups.entries().next().value as [bigint, GroupState] | undefined
351
+ if (!oldest) break
352
+ const [oldestId, oldestGroup] = oldest
353
+ for (const pending of [...oldestGroup.pending.values()]) {
354
+ this.#removePending(track, oldestGroup, pending)
355
+ this.#giveUpOnPending(pending)
356
+ // The group aged out with objects still waiting on a manifest that
357
+ // never arrived. That is an absent manifest, not a verifier fault:
358
+ // `verifierError` is reserved for an exception/crash in the verifier
359
+ // itself, so mislabelling here reads on the graduation dashboard as a
360
+ // software bug and hides a benign absent-manifest stall (BLO-30007).
361
+ this.#failure(pending.identity, 'manifestAbsent')
362
+ }
363
+ track.manifestEntries -= oldestGroup.entries.size
364
+ track.groups.delete(oldestId)
365
+ }
366
+ }
367
+ return group
368
+ }
369
+
370
+ #validateIdentity(track: TrackState, identity: ManifestObjectIdentity): boolean {
371
+ const coordinates = track.context.mapper.derive(Number(identity.groupId), identity.objectId)
372
+ return identity.ssId === undefined || coordinates.ssId === identity.ssId
373
+ }
374
+
375
+ #admitAgainstEntry(
376
+ track: TrackState,
377
+ group: GroupState,
378
+ identity: ManifestObjectIdentity,
379
+ data: Uint8Array,
380
+ release: () => void,
381
+ entry: SourceAuthObjectEntry,
382
+ discard?: () => void,
383
+ ): ManifestAdmission {
384
+ if (entry.trueLength !== data.byteLength) {
385
+ return this.#rejectOrShadow(identity, release, 'digestMismatch')
386
+ }
387
+ const digestMatches = equalBytes(sourceAuthObjectDigest(data.subarray(0, entry.trueLength)), entry.digest)
388
+ if (!digestMatches) return this.#rejectOrShadow(identity, release, 'digestMismatch')
389
+ if (!track.context.manifestChannelAuthenticated && !group.rootVerified) {
390
+ if (this.#config.mode === 'shadow') {
391
+ release()
392
+ return { action: 'play', verified: false }
393
+ }
394
+ if (!this.#quarantine(track, group, { identity, data, release, discard, bytes: data.byteLength })) {
395
+ return { action: 'drop', verified: false }
396
+ }
397
+ return { action: 'stall', verified: false }
398
+ }
399
+ release()
400
+ this.#stats.verified++
401
+ return { action: 'play', verified: true }
402
+ }
403
+
404
+ #rejectOrShadow(
405
+ identity: ManifestObjectIdentity,
406
+ release: () => void,
407
+ reason: 'digestMismatch' | 'sigInvalid',
408
+ ): ManifestAdmission {
409
+ this.#failure(identity, reason)
410
+ if (this.#config.mode === 'enforce') {
411
+ console.warn(JSON.stringify({ event: 'manifest-enforce-drop', track: identity.trackName, group: String(identity.groupId), object: identity.objectId, reason }))
412
+ return { action: 'drop', verified: false, reason }
413
+ }
414
+ release()
415
+ return { action: 'play', verified: false, reason }
416
+ }
417
+
418
+ #resolvePending(
419
+ track: TrackState,
420
+ group: GroupState,
421
+ pending: PendingObject,
422
+ entry: SourceAuthObjectEntry,
423
+ ): void {
424
+ this.#removePending(track, group, pending)
425
+ this.#admitAgainstEntry(track, group, pending.identity, pending.data, pending.release, entry, pending.discard)
426
+ }
427
+
428
+ #closeGroup(
429
+ track: TrackState,
430
+ groupId: bigint,
431
+ group: GroupState,
432
+ close: SourceAuthGroupClose,
433
+ ): void {
434
+ if (group.close || group.signaturePending) return
435
+ const entries = [...group.entries.values()]
436
+ if (entries.length !== close.objectCount) {
437
+ // Manifest-channel reordering: the close frame beat some object entries.
438
+ // Stash it (latest-wins on duplicates) so the object-entry path can
439
+ // re-attempt the close once the count matches; quarantined objects stay
440
+ // quarantined, and manifestAbsent below is a signal, not an eviction.
441
+ group.pendingClose = close
442
+ const hadPending = group.pending.size > 0
443
+ if (this.#config.onMissingManifest === 'fallback-shadow' || this.#config.mode === 'shadow') {
444
+ for (const pending of [...group.pending.values()]) {
445
+ this.#removePending(track, group, pending)
446
+ pending.release()
447
+ this.#failure(pending.identity, 'manifestAbsent')
448
+ }
449
+ } else {
450
+ for (const pending of group.pending.values()) {
451
+ this.#failure(pending.identity, 'manifestAbsent')
452
+ }
453
+ }
454
+ if (!hadPending) {
455
+ this.#failure({ trackName: track.context.trackName, groupId, objectId: 0 }, 'manifestAbsent')
456
+ }
457
+ return
458
+ }
459
+ if (!equalBytes(sourceAuthMerkleRoot(entries), close.root)) {
460
+ group.failed = 'digestMismatch'
461
+ this.#failGroup(track, groupId, group, 'digestMismatch')
462
+ return
463
+ }
464
+ const preimage = sourceAuthSignaturePreimage(track.context.authScope, close.groupId, close.objectCount, close.root)
465
+ let signatureValid: boolean | Promise<boolean>
466
+ try {
467
+ signatureValid = this.#verifyAcceptedSignature(track, preimage, close.signature)
468
+ } catch {
469
+ this.#failOpenGroup(track, groupId, group)
470
+ return
471
+ }
472
+ if (isPromiseLike(signatureValid)) {
473
+ group.signaturePending = true
474
+ void signatureValid.then(
475
+ (valid) => {
476
+ if (this.#disposed) return
477
+ group.signaturePending = false
478
+ this.#finishGroupSignature(track, groupId, group, close, valid)
479
+ },
480
+ () => {
481
+ if (this.#disposed) return
482
+ group.signaturePending = false
483
+ this.#failOpenGroup(track, groupId, group)
484
+ },
485
+ )
486
+ return
487
+ }
488
+ this.#finishGroupSignature(track, groupId, group, close, signatureValid)
489
+ }
490
+
491
+ #finishGroupSignature(
492
+ track: TrackState,
493
+ groupId: bigint,
494
+ group: GroupState,
495
+ close: SourceAuthGroupClose,
496
+ signatureValid: boolean,
497
+ ): void {
498
+ if (!signatureValid) {
499
+ group.failed = 'sigInvalid'
500
+ this.#failGroup(track, groupId, group, 'sigInvalid')
501
+ return
502
+ }
503
+ group.failed = undefined
504
+ group.close = close
505
+ group.pendingClose = undefined
506
+ group.rootVerified = true
507
+ for (const pending of [...group.pending.values()]) {
508
+ const entry = group.entries.get(pending.identity.objectId)
509
+ if (entry) this.#resolvePending(track, group, pending, entry)
510
+ else if (this.#config.onMissingManifest === 'fallback-shadow') {
511
+ this.#removePending(track, group, pending)
512
+ pending.release()
513
+ this.#failure(pending.identity, 'manifestAbsent')
514
+ }
515
+ }
516
+ }
517
+
518
+ #verifyAcceptedSignature(
519
+ track: TrackState,
520
+ message: Uint8Array,
521
+ signature: Uint8Array,
522
+ ): boolean | Promise<boolean> {
523
+ const keys = track.context.acceptedPublicKeys ?? [track.context.publicKey]
524
+ const pending: Promise<boolean | 'error'>[] = []
525
+ let hadSynchronousError = false
526
+ for (const key of keys) {
527
+ try {
528
+ const result = this.#verifySignature(key, message, signature)
529
+ if (isPromiseLike(result)) {
530
+ pending.push(Promise.resolve(result).then((valid) => valid, () => 'error' as const))
531
+ } else if (result) {
532
+ return true
533
+ }
534
+ } catch {
535
+ hadSynchronousError = true
536
+ }
537
+ }
538
+ if (pending.length === 0) {
539
+ if (hadSynchronousError) throw new Error('manifest signature verifier unavailable')
540
+ return false
541
+ }
542
+ return Promise.all(pending).then((results) => {
543
+ if (results.some((valid) => valid === true)) return true
544
+ if (hadSynchronousError || results.some((valid) => valid === 'error')) {
545
+ throw new Error('manifest signature verifier unavailable')
546
+ }
547
+ return false
548
+ })
549
+ }
550
+
551
+ #failGroup(
552
+ track: TrackState,
553
+ groupId: bigint,
554
+ group: GroupState,
555
+ reason: 'digestMismatch' | 'sigInvalid',
556
+ ): void {
557
+ if (group.pending.size === 0) {
558
+ this.#failure({ trackName: track.context.trackName, groupId, objectId: 0 }, reason)
559
+ return
560
+ }
561
+ for (const pending of [...group.pending.values()]) {
562
+ this.#removePending(track, group, pending)
563
+ // Same contract as an eviction: a quarantined object that is rejected
564
+ // rather than played must still tell the caller it is finished, or a
565
+ // caller sequencing off `release` waits forever (BLO-30095).
566
+ if (this.#rejectOrShadow(pending.identity, pending.release, reason).action === 'drop') {
567
+ pending.discard?.()
568
+ }
569
+ }
570
+ }
571
+
572
+ #removePending(track: TrackState, group: GroupState, pending: PendingObject): void {
573
+ if (group.pending.get(pending.identity.objectId) === pending) {
574
+ group.pending.delete(pending.identity.objectId)
575
+ }
576
+ const index = track.quarantine.indexOf(pending)
577
+ if (index >= 0) track.quarantine.splice(index, 1)
578
+ track.quarantinedBytes -= pending.bytes
579
+ this.#stats.quarantinedBytes -= pending.bytes
580
+ }
581
+
582
+ #quarantine(track: TrackState, group: GroupState, pending: PendingObject): boolean {
583
+ if (group.pending.has(pending.identity.objectId)) return false
584
+ group.pending.set(pending.identity.objectId, pending)
585
+ track.quarantine.push(pending)
586
+ track.quarantinedBytes += pending.bytes
587
+ this.#stats.quarantinedBytes += pending.bytes
588
+ this.#enforceCap(track)
589
+ return true
590
+ }
591
+
592
+ #enforceCap(track: TrackState): void {
593
+ while (track.quarantinedBytes > track.capBytes && track.quarantine.length > 0) {
594
+ const pending = track.quarantine.shift()!
595
+ const group = track.groups.get(BigInt(pending.identity.groupId))
596
+ if (group) group.pending.delete(pending.identity.objectId)
597
+ track.quarantinedBytes -= pending.bytes
598
+ this.#stats.quarantinedBytes -= pending.bytes
599
+ this.#giveUpOnPending(pending)
600
+ // Quarantine budget ran out while the object was still waiting on a
601
+ // manifest. The manifest was absent when we gave up; the verifier did not
602
+ // fault. Same reason in shadow and enforce so the dashboard reads one
603
+ // taxonomy across modes (BLO-30007).
604
+ this.#failure(pending.identity, 'manifestAbsent')
605
+ console.warn(`[ManifestVerifier] quarantine cap eviction track=${pending.identity.trackName} group=${pending.identity.groupId} object=${pending.identity.objectId} disposition=${this.#config.mode === 'enforce' ? 'drop' : 'fail-open'}`)
606
+ }
607
+ }
608
+
609
+ /**
610
+ * Stop waiting for a manifest that never arrived. In `enforce` the object is
611
+ * discarded: an eviction is a rejection, not a deferred play, so unverified
612
+ * media never reaches the player two groups after the stall was recorded
613
+ * (BLO-30095, CTO disposition on the issue thread).
614
+ *
615
+ * Deliberately NOT used by `#failOpenGroup`/`#failOpenTrack` — failing open on
616
+ * a genuine verifier fault is correct and stays untouched.
617
+ */
618
+ #giveUpOnPending(pending: PendingObject): void {
619
+ if (this.#config.mode !== 'enforce') {
620
+ pending.release()
621
+ return
622
+ }
623
+ pending.discard?.()
624
+ }
625
+
626
+ #failOpenTrack(track: TrackState, reason: 'verifierError'): void {
627
+ for (const pending of [...track.quarantine]) {
628
+ const group = track.groups.get(BigInt(pending.identity.groupId))
629
+ if (group) this.#removePending(track, group, pending)
630
+ pending.release()
631
+ this.#failure(pending.identity, reason)
632
+ }
633
+ }
634
+
635
+ #failOpenGroup(track: TrackState, groupId: bigint, group: GroupState): void {
636
+ const pending = [...group.pending.values()]
637
+ if (pending.length === 0) {
638
+ this.#failure({ trackName: track.context.trackName, groupId, objectId: 0 }, 'verifierError')
639
+ return
640
+ }
641
+ for (const object of pending) {
642
+ this.#removePending(track, group, object)
643
+ object.release()
644
+ this.#failure(object.identity, 'verifierError')
645
+ }
646
+ }
647
+
648
+ #releaseAllQuarantine(countFailure: boolean): void {
649
+ for (const track of this.#tracks.values()) {
650
+ for (const pending of [...track.quarantine]) {
651
+ const group = track.groups.get(BigInt(pending.identity.groupId))
652
+ if (group) this.#removePending(track, group, pending)
653
+ pending.release()
654
+ if (countFailure) this.#failure(pending.identity, 'verifierError')
655
+ }
656
+ }
657
+ }
658
+
659
+ #failure(identity: ManifestObjectIdentity, reason: ManifestFailureReason): void {
660
+ this.#stats.failures[reason]++
661
+ this.#onFailure?.({
662
+ trackName: identity.trackName,
663
+ ...(identity.bindingId === undefined ? {} : { bindingId: identity.bindingId }),
664
+ groupId: identity.groupId,
665
+ objectId: identity.objectId,
666
+ reason,
667
+ })
668
+ }
669
+ }
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 Paul Miller (https://paulmillr.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the “Software”), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.