@blockcast/mmt-container 0.1.0 → 0.3.0-main.ef68de90edb3

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 (799) hide show
  1. package/README.md +524 -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 +80 -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/block-policy.d.ts +314 -0
  22. package/dist/block-policy.d.ts.map +1 -0
  23. package/dist/block-policy.js +466 -0
  24. package/dist/block-policy.js.map +7 -0
  25. package/dist/browser-runtime.js +26549 -0
  26. package/dist/browser-runtime.js.map +7 -0
  27. package/dist/carp-catalog.d.ts +429 -0
  28. package/dist/carp-catalog.d.ts.map +1 -0
  29. package/dist/carp-catalog.js +985 -0
  30. package/dist/carp-catalog.js.map +7 -0
  31. package/dist/catalog-fec-params.d.ts +275 -0
  32. package/dist/catalog-fec-params.d.ts.map +1 -0
  33. package/dist/catalog-fec-params.js +702 -0
  34. package/dist/catalog-fec-params.js.map +7 -0
  35. package/dist/catalog-network-source.d.ts +42 -0
  36. package/dist/catalog-network-source.d.ts.map +1 -0
  37. package/dist/catalog-network-source.js +47 -0
  38. package/dist/catalog-network-source.js.map +7 -0
  39. package/dist/catalog-validator.d.ts +18 -0
  40. package/dist/catalog-validator.d.ts.map +1 -0
  41. package/dist/catalog-validator.js +7747 -0
  42. package/dist/catalog-validator.js.map +7 -0
  43. package/dist/cmaf-block-assembler.d.ts +285 -0
  44. package/dist/cmaf-block-assembler.d.ts.map +1 -0
  45. package/dist/cmaf-block-assembler.js +1966 -0
  46. package/dist/cmaf-block-assembler.js.map +7 -0
  47. package/dist/cmaf-group-batcher.d.ts +38 -0
  48. package/dist/cmaf-group-batcher.d.ts.map +1 -0
  49. package/dist/cmaf-group-batcher.js +176 -0
  50. package/dist/cmaf-group-batcher.js.map +7 -0
  51. package/dist/cmcd-producer.d.ts +104 -0
  52. package/dist/cmcd-producer.d.ts.map +1 -0
  53. package/dist/cmcd-producer.js +183 -0
  54. package/dist/cmcd-producer.js.map +7 -0
  55. package/dist/codec-utils.d.ts +384 -0
  56. package/dist/codec-utils.d.ts.map +1 -0
  57. package/dist/codec-utils.js +1546 -0
  58. package/dist/codec-utils.js.map +7 -0
  59. package/dist/conceal-timeline.d.ts +146 -0
  60. package/dist/conceal-timeline.d.ts.map +1 -0
  61. package/dist/conceal-timeline.js +137 -0
  62. package/dist/conceal-timeline.js.map +7 -0
  63. package/dist/delivery-gap.d.ts +75 -0
  64. package/dist/delivery-gap.d.ts.map +1 -0
  65. package/dist/delivery-gap.js +88 -0
  66. package/dist/delivery-gap.js.map +7 -0
  67. package/dist/duplicate-ledger.d.ts +197 -0
  68. package/dist/duplicate-ledger.d.ts.map +1 -0
  69. package/dist/duplicate-ledger.js +226 -0
  70. package/dist/duplicate-ledger.js.map +7 -0
  71. package/dist/fec-codec.d.ts +32 -0
  72. package/dist/fec-codec.d.ts.map +1 -0
  73. package/dist/fec-codec.js +47 -0
  74. package/dist/fec-codec.js.map +7 -0
  75. package/dist/fec-manager.d.ts +583 -0
  76. package/dist/fec-manager.d.ts.map +1 -0
  77. package/dist/fec-manager.js +3899 -0
  78. package/dist/fec-manager.js.map +7 -0
  79. package/dist/fec-starvation-detector.d.ts +59 -0
  80. package/dist/fec-starvation-detector.d.ts.map +1 -0
  81. package/dist/fec-starvation-detector.js +60 -0
  82. package/dist/fec-starvation-detector.js.map +7 -0
  83. package/dist/fec-state.d.ts +131 -0
  84. package/dist/fec-state.d.ts.map +1 -0
  85. package/dist/fec-state.js +87 -0
  86. package/dist/fec-state.js.map +7 -0
  87. package/dist/fec-worker-setup.d.ts +94 -0
  88. package/dist/fec-worker-setup.d.ts.map +1 -0
  89. package/dist/fec-worker-setup.js +673 -0
  90. package/dist/fec-worker-setup.js.map +7 -0
  91. package/dist/fmp4-completion.d.ts +30 -0
  92. package/dist/fmp4-completion.d.ts.map +1 -0
  93. package/dist/fmp4-completion.js +21 -0
  94. package/dist/fmp4-completion.js.map +7 -0
  95. package/dist/fmp4-reader.d.ts +37 -0
  96. package/dist/fmp4-reader.d.ts.map +1 -0
  97. package/dist/fmp4-reader.js +100 -0
  98. package/dist/fmp4-reader.js.map +7 -0
  99. package/dist/index.d.ts +44 -3
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +460 -14
  102. package/dist/index.js.map +7 -1
  103. package/dist/iso-block-locator.d.ts +118 -0
  104. package/dist/iso-block-locator.d.ts.map +1 -0
  105. package/dist/iso-block-locator.js +289 -0
  106. package/dist/iso-block-locator.js.map +7 -0
  107. package/dist/iso-bmff-timing.d.ts +78 -0
  108. package/dist/iso-bmff-timing.d.ts.map +1 -0
  109. package/dist/iso-bmff-timing.js +593 -0
  110. package/dist/iso-bmff-timing.js.map +7 -0
  111. package/dist/loc.d.ts +70 -75
  112. package/dist/loc.d.ts.map +1 -1
  113. package/dist/loc.js +106 -192
  114. package/dist/loc.js.map +7 -1
  115. package/dist/manifest-auth-plan.d.ts +30 -0
  116. package/dist/manifest-auth-plan.d.ts.map +1 -0
  117. package/dist/manifest-auth-plan.js +1266 -0
  118. package/dist/manifest-auth-plan.js.map +7 -0
  119. package/dist/media-router.d.ts +262 -0
  120. package/dist/media-router.d.ts.map +1 -0
  121. package/dist/media-router.js +584 -0
  122. package/dist/media-router.js.map +7 -0
  123. package/dist/mfu-reassembler.d.ts +313 -9
  124. package/dist/mfu-reassembler.d.ts.map +1 -1
  125. package/dist/mfu-reassembler.js +3051 -285
  126. package/dist/mfu-reassembler.js.map +7 -1
  127. package/dist/mfu-reassembly-policy.d.ts +24 -0
  128. package/dist/mfu-reassembly-policy.d.ts.map +1 -0
  129. package/dist/mfu-reassembly-policy.js +99 -0
  130. package/dist/mfu-reassembly-policy.js.map +7 -0
  131. package/dist/mmtp-container-parser.d.ts +568 -0
  132. package/dist/mmtp-container-parser.d.ts.map +1 -0
  133. package/dist/mmtp-container-parser.js +6580 -0
  134. package/dist/mmtp-container-parser.js.map +7 -0
  135. package/dist/mmtp-container-parser.no-modules.js +9616 -0
  136. package/dist/mmtp-container-parser.no-modules.js.map +7 -0
  137. package/dist/mmtp-decode-pipeline.d.ts +138 -0
  138. package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
  139. package/dist/mmtp-decode-pipeline.js +6814 -0
  140. package/dist/mmtp-decode-pipeline.js.map +7 -0
  141. package/dist/mmtp-router.d.ts +679 -0
  142. package/dist/mmtp-router.d.ts.map +1 -0
  143. package/dist/mmtp-router.js +11278 -0
  144. package/dist/mmtp-router.js.map +7 -0
  145. package/dist/mmtp-to-cmaf.d.ts +187 -0
  146. package/dist/mmtp-to-cmaf.d.ts.map +1 -0
  147. package/dist/mmtp-to-cmaf.js +716 -0
  148. package/dist/mmtp-to-cmaf.js.map +7 -0
  149. package/dist/multicast-auth-catalog.d.ts +115 -0
  150. package/dist/multicast-auth-catalog.d.ts.map +1 -0
  151. package/dist/multicast-auth-catalog.js +202 -0
  152. package/dist/multicast-auth-catalog.js.map +7 -0
  153. package/dist/multicast-input.d.ts +141 -0
  154. package/dist/multicast-input.d.ts.map +1 -0
  155. package/dist/multicast-input.js +390 -0
  156. package/dist/multicast-input.js.map +7 -0
  157. package/dist/multicast-manager.d.ts +669 -0
  158. package/dist/multicast-manager.d.ts.map +1 -0
  159. package/dist/multicast-manager.js +19101 -0
  160. package/dist/multicast-manager.js.map +7 -0
  161. package/dist/multicast-transport.d.ts +271 -0
  162. package/dist/multicast-transport.d.ts.map +1 -0
  163. package/dist/multicast-transport.js +2264 -0
  164. package/dist/multicast-transport.js.map +7 -0
  165. package/dist/multicast-unwrap.d.ts +57 -0
  166. package/dist/multicast-unwrap.d.ts.map +1 -0
  167. package/dist/multicast-unwrap.js +418 -0
  168. package/dist/multicast-unwrap.js.map +7 -0
  169. package/dist/no-modules.d.ts +10 -0
  170. package/dist/no-modules.d.ts.map +1 -0
  171. package/dist/no-modules.js +9491 -0
  172. package/dist/no-modules.js.map +7 -0
  173. package/dist/phase14-catalog-override.d.ts +126 -0
  174. package/dist/phase14-catalog-override.d.ts.map +1 -0
  175. package/dist/phase14-catalog-override.js +155 -0
  176. package/dist/phase14-catalog-override.js.map +7 -0
  177. package/dist/repair-fetch.d.ts +270 -0
  178. package/dist/repair-fetch.d.ts.map +1 -0
  179. package/dist/repair-fetch.js +381 -0
  180. package/dist/repair-fetch.js.map +7 -0
  181. package/dist/repair-layers.d.ts +158 -0
  182. package/dist/repair-layers.d.ts.map +1 -0
  183. package/dist/repair-layers.js +344 -0
  184. package/dist/repair-layers.js.map +7 -0
  185. package/dist/sample-combiner.d.ts +212 -0
  186. package/dist/sample-combiner.d.ts.map +1 -0
  187. package/dist/sample-combiner.js +595 -0
  188. package/dist/sample-combiner.js.map +7 -0
  189. package/dist/signaling.d.ts +29 -0
  190. package/dist/signaling.d.ts.map +1 -0
  191. package/dist/signaling.js +572 -0
  192. package/dist/signaling.js.map +7 -0
  193. package/dist/source-auth.d.ts +2 -0
  194. package/dist/source-auth.d.ts.map +1 -0
  195. package/dist/source-auth.js +1209 -0
  196. package/dist/source-auth.js.map +7 -0
  197. package/dist/switching-set-alignment.d.ts +61 -0
  198. package/dist/switching-set-alignment.d.ts.map +1 -0
  199. package/dist/switching-set-alignment.js +70 -0
  200. package/dist/switching-set-alignment.js.map +7 -0
  201. package/dist/timestamp-codec.d.ts +34 -0
  202. package/dist/timestamp-codec.d.ts.map +1 -0
  203. package/dist/timestamp-codec.js +473 -0
  204. package/dist/timestamp-codec.js.map +7 -0
  205. package/dist/track-pipeline-setup.d.ts +83 -0
  206. package/dist/track-pipeline-setup.d.ts.map +1 -0
  207. package/dist/track-pipeline-setup.js +291 -0
  208. package/dist/track-pipeline-setup.js.map +7 -0
  209. package/dist/track-pipeline.d.ts +121 -0
  210. package/dist/track-pipeline.d.ts.map +1 -0
  211. package/dist/track-pipeline.js +209 -0
  212. package/dist/track-pipeline.js.map +7 -0
  213. package/dist/track-session.d.ts +414 -0
  214. package/dist/track-session.d.ts.map +1 -0
  215. package/dist/track-session.js +754 -0
  216. package/dist/track-session.js.map +7 -0
  217. package/dist/transport-pool.d.ts +69 -0
  218. package/dist/transport-pool.d.ts.map +1 -0
  219. package/dist/transport-pool.js +74 -0
  220. package/dist/transport-pool.js.map +7 -0
  221. package/dist/wasm-mfu-reassembler.d.ts +97 -0
  222. package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
  223. package/dist/wasm-mfu-reassembler.js +2133 -0
  224. package/dist/wasm-mfu-reassembler.js.map +7 -0
  225. package/dist/wasm-mmtp-container-parser.d.ts +10 -0
  226. package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
  227. package/dist/wasm-mmtp-container-parser.js +6834 -0
  228. package/dist/wasm-mmtp-container-parser.js.map +7 -0
  229. package/node_modules/@blockcast/fec-worker/README.md +223 -0
  230. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  231. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +38 -0
  232. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +1 -0
  233. package/node_modules/@blockcast/fec-worker/dist/block-order.js +78 -0
  234. package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +1 -0
  235. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +93 -0
  236. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
  237. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +346 -0
  238. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
  239. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +380 -0
  240. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
  241. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
  242. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
  243. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
  244. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
  245. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +859 -0
  246. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
  247. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
  248. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
  249. package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
  250. package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
  251. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
  252. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
  253. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +370 -0
  254. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
  255. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
  256. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
  257. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
  258. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
  259. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +194 -0
  260. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
  261. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +62 -0
  262. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
  263. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
  264. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
  265. package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
  266. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
  267. package/node_modules/@blockcast/fec-worker/package.json +59 -0
  268. package/node_modules/@blockcast/fec-worker/src/block-order.ts +93 -0
  269. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +392 -0
  270. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +399 -0
  271. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1502 -0
  272. package/node_modules/@blockcast/fec-worker/src/index.ts +35 -0
  273. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +589 -0
  274. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
  275. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +209 -0
  276. package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
  277. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  278. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  279. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  280. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  281. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  282. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  283. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  284. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  285. package/node_modules/@blockcast/mmt-base/README.md +134 -0
  286. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  287. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +55 -0
  288. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
  289. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
  290. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
  291. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -0
  292. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  293. package/node_modules/@blockcast/mmt-base/dist/index.js +7 -0
  294. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  295. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +292 -0
  296. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  297. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +612 -0
  298. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  299. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +18 -0
  300. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
  301. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
  302. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
  303. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
  304. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
  305. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
  306. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
  307. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
  308. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
  309. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
  310. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
  311. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
  312. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
  313. package/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
  314. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +1 -0
  315. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  316. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +145 -0
  317. package/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
  318. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
  319. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
  320. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
  321. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
  322. package/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
  323. package/node_modules/@blockcast/mmt-fec/README.md +271 -0
  324. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  325. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +82 -0
  326. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
  327. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +296 -0
  328. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
  329. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +106 -0
  330. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
  331. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +288 -0
  332. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
  333. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
  334. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
  335. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
  336. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
  337. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
  338. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
  339. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
  340. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
  341. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +205 -0
  342. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
  343. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +240 -0
  344. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
  345. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +28 -0
  346. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
  347. package/node_modules/@blockcast/mmt-fec/dist/index.js +28 -0
  348. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
  349. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
  350. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
  351. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
  352. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
  353. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +258 -0
  354. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
  355. package/node_modules/@blockcast/mmt-fec/dist/oti.js +382 -0
  356. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
  357. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
  358. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
  359. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
  360. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
  361. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +82 -0
  362. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +1 -0
  363. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +170 -0
  364. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +1 -0
  365. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  366. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  367. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  368. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  369. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  370. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  371. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  372. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  373. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +134 -0
  374. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  375. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +55 -0
  376. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
  377. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
  378. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
  379. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -0
  380. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  381. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +7 -0
  382. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  383. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +292 -0
  384. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  385. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +612 -0
  386. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  387. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +18 -0
  388. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
  389. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
  390. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
  391. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
  392. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
  393. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
  394. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
  395. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
  396. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
  397. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
  398. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
  399. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
  400. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
  401. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
  402. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +1 -0
  403. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
  404. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +145 -0
  405. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
  406. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
  407. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
  408. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
  409. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
  410. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
  411. package/node_modules/@blockcast/mmt-fec/package.json +79 -0
  412. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +371 -0
  413. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +439 -0
  414. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
  415. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
  416. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +310 -0
  417. package/node_modules/@blockcast/mmt-fec/src/index.ts +94 -0
  418. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
  419. package/node_modules/@blockcast/mmt-fec/src/oti.ts +463 -0
  420. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
  421. package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +195 -0
  422. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  423. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
  424. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
  425. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
  426. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
  427. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
  428. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
  429. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
  430. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
  431. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
  432. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
  433. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
  434. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
  435. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +99 -0
  436. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
  437. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +492 -0
  438. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
  439. package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
  440. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
  441. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
  442. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
  443. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +669 -0
  444. package/node_modules/@noble/hashes/LICENSE +21 -0
  445. package/node_modules/@noble/hashes/README.md +521 -0
  446. package/node_modules/@noble/hashes/_assert.d.ts +17 -0
  447. package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
  448. package/node_modules/@noble/hashes/_assert.js +18 -0
  449. package/node_modules/@noble/hashes/_assert.js.map +1 -0
  450. package/node_modules/@noble/hashes/_blake.d.ts +14 -0
  451. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  452. package/node_modules/@noble/hashes/_blake.js +50 -0
  453. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  454. package/node_modules/@noble/hashes/_md.d.ts +51 -0
  455. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  456. package/node_modules/@noble/hashes/_md.js +162 -0
  457. package/node_modules/@noble/hashes/_md.js.map +1 -0
  458. package/node_modules/@noble/hashes/_u64.d.ts +55 -0
  459. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  460. package/node_modules/@noble/hashes/_u64.js +90 -0
  461. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  462. package/node_modules/@noble/hashes/argon2.d.ts +32 -0
  463. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  464. package/node_modules/@noble/hashes/argon2.js +401 -0
  465. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  466. package/node_modules/@noble/hashes/blake1.d.ts +106 -0
  467. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  468. package/node_modules/@noble/hashes/blake1.js +459 -0
  469. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  470. package/node_modules/@noble/hashes/blake2.d.ts +116 -0
  471. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  472. package/node_modules/@noble/hashes/blake2.js +420 -0
  473. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  474. package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
  475. package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
  476. package/node_modules/@noble/hashes/blake2b.js +14 -0
  477. package/node_modules/@noble/hashes/blake2b.js.map +1 -0
  478. package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
  479. package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
  480. package/node_modules/@noble/hashes/blake2s.js +24 -0
  481. package/node_modules/@noble/hashes/blake2s.js.map +1 -0
  482. package/node_modules/@noble/hashes/blake3.d.ts +54 -0
  483. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  484. package/node_modules/@noble/hashes/blake3.js +255 -0
  485. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  486. package/node_modules/@noble/hashes/crypto.d.ts +2 -0
  487. package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
  488. package/node_modules/@noble/hashes/crypto.js +5 -0
  489. package/node_modules/@noble/hashes/crypto.js.map +1 -0
  490. package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
  491. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
  492. package/node_modules/@noble/hashes/cryptoNode.js +18 -0
  493. package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
  494. package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
  495. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  496. package/node_modules/@noble/hashes/eskdf.js +166 -0
  497. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  498. package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
  499. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
  500. package/node_modules/@noble/hashes/esm/_assert.js +15 -0
  501. package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
  502. package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
  503. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
  504. package/node_modules/@noble/hashes/esm/_blake.js +45 -0
  505. package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
  506. package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
  507. package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
  508. package/node_modules/@noble/hashes/esm/_md.js +155 -0
  509. package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
  510. package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
  511. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
  512. package/node_modules/@noble/hashes/esm/_u64.js +67 -0
  513. package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
  514. package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
  515. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
  516. package/node_modules/@noble/hashes/esm/argon2.js +392 -0
  517. package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
  518. package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
  519. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
  520. package/node_modules/@noble/hashes/esm/blake1.js +452 -0
  521. package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
  522. package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
  523. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
  524. package/node_modules/@noble/hashes/esm/blake2.js +413 -0
  525. package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
  526. package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
  527. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
  528. package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
  529. package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
  530. package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
  531. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
  532. package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
  533. package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
  534. package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
  535. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
  536. package/node_modules/@noble/hashes/esm/blake3.js +251 -0
  537. package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
  538. package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
  539. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
  540. package/node_modules/@noble/hashes/esm/crypto.js +2 -0
  541. package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
  542. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
  543. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
  544. package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
  545. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
  546. package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
  547. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
  548. package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
  549. package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
  550. package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
  551. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
  552. package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
  553. package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
  554. package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
  555. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
  556. package/node_modules/@noble/hashes/esm/hmac.js +86 -0
  557. package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
  558. package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
  559. package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
  560. package/node_modules/@noble/hashes/esm/index.js +33 -0
  561. package/node_modules/@noble/hashes/esm/index.js.map +1 -0
  562. package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
  563. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
  564. package/node_modules/@noble/hashes/esm/legacy.js +281 -0
  565. package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
  566. package/node_modules/@noble/hashes/esm/package.json +10 -0
  567. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
  568. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
  569. package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
  570. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
  571. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
  572. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
  573. package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
  574. package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
  575. package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
  576. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
  577. package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
  578. package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
  579. package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
  580. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
  581. package/node_modules/@noble/hashes/esm/sha1.js +11 -0
  582. package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
  583. package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
  584. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
  585. package/node_modules/@noble/hashes/esm/sha2.js +375 -0
  586. package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
  587. package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
  588. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
  589. package/node_modules/@noble/hashes/esm/sha256.js +20 -0
  590. package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
  591. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
  592. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
  593. package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
  594. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
  595. package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
  596. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
  597. package/node_modules/@noble/hashes/esm/sha3.js +234 -0
  598. package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
  599. package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
  600. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
  601. package/node_modules/@noble/hashes/esm/sha512.js +26 -0
  602. package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
  603. package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
  604. package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
  605. package/node_modules/@noble/hashes/esm/utils.js +281 -0
  606. package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
  607. package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
  608. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  609. package/node_modules/@noble/hashes/hkdf.js +88 -0
  610. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  611. package/node_modules/@noble/hashes/hmac.d.ts +35 -0
  612. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  613. package/node_modules/@noble/hashes/hmac.js +91 -0
  614. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  615. package/node_modules/@noble/hashes/index.d.ts +1 -0
  616. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  617. package/node_modules/@noble/hashes/index.js +33 -0
  618. package/node_modules/@noble/hashes/index.js.map +1 -0
  619. package/node_modules/@noble/hashes/legacy.d.ts +71 -0
  620. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  621. package/node_modules/@noble/hashes/legacy.js +287 -0
  622. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  623. package/node_modules/@noble/hashes/package.json +266 -0
  624. package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
  625. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  626. package/node_modules/@noble/hashes/pbkdf2.js +101 -0
  627. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  628. package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
  629. package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
  630. package/node_modules/@noble/hashes/ripemd160.js +16 -0
  631. package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
  632. package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
  633. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  634. package/node_modules/@noble/hashes/scrypt.js +232 -0
  635. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  636. package/node_modules/@noble/hashes/sha1.d.ts +11 -0
  637. package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
  638. package/node_modules/@noble/hashes/sha1.js +14 -0
  639. package/node_modules/@noble/hashes/sha1.js.map +1 -0
  640. package/node_modules/@noble/hashes/sha2.d.ts +159 -0
  641. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  642. package/node_modules/@noble/hashes/sha2.js +384 -0
  643. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  644. package/node_modules/@noble/hashes/sha256.d.ts +20 -0
  645. package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
  646. package/node_modules/@noble/hashes/sha256.js +23 -0
  647. package/node_modules/@noble/hashes/sha256.js.map +1 -0
  648. package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
  649. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  650. package/node_modules/@noble/hashes/sha3-addons.js +402 -0
  651. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  652. package/node_modules/@noble/hashes/sha3.d.ts +53 -0
  653. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  654. package/node_modules/@noble/hashes/sha3.js +239 -0
  655. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  656. package/node_modules/@noble/hashes/sha512.d.ts +26 -0
  657. package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
  658. package/node_modules/@noble/hashes/sha512.js +29 -0
  659. package/node_modules/@noble/hashes/sha512.js.map +1 -0
  660. package/node_modules/@noble/hashes/src/_assert.ts +22 -0
  661. package/node_modules/@noble/hashes/src/_blake.ts +50 -0
  662. package/node_modules/@noble/hashes/src/_md.ts +176 -0
  663. package/node_modules/@noble/hashes/src/_u64.ts +91 -0
  664. package/node_modules/@noble/hashes/src/argon2.ts +497 -0
  665. package/node_modules/@noble/hashes/src/blake1.ts +534 -0
  666. package/node_modules/@noble/hashes/src/blake2.ts +486 -0
  667. package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
  668. package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
  669. package/node_modules/@noble/hashes/src/blake3.ts +272 -0
  670. package/node_modules/@noble/hashes/src/crypto.ts +9 -0
  671. package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
  672. package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
  673. package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
  674. package/node_modules/@noble/hashes/src/hmac.ts +94 -0
  675. package/node_modules/@noble/hashes/src/index.ts +31 -0
  676. package/node_modules/@noble/hashes/src/legacy.ts +293 -0
  677. package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
  678. package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
  679. package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
  680. package/node_modules/@noble/hashes/src/sha1.ts +10 -0
  681. package/node_modules/@noble/hashes/src/sha2.ts +402 -0
  682. package/node_modules/@noble/hashes/src/sha256.ts +24 -0
  683. package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
  684. package/node_modules/@noble/hashes/src/sha3.ts +258 -0
  685. package/node_modules/@noble/hashes/src/sha512.ts +34 -0
  686. package/node_modules/@noble/hashes/src/utils.ts +395 -0
  687. package/node_modules/@noble/hashes/utils.d.ts +161 -0
  688. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  689. package/node_modules/@noble/hashes/utils.js +313 -0
  690. package/node_modules/@noble/hashes/utils.js.map +1 -0
  691. package/package.json +179 -8
  692. package/schemas/catalog.schema.json +357 -0
  693. package/src/align.ts +239 -0
  694. package/src/audio-init-parser.ts +189 -0
  695. package/src/audio-ring-buffer.ts +120 -0
  696. package/src/authored-timing.ts +63 -0
  697. package/src/block-policy.ts +903 -0
  698. package/src/carp-catalog.ts +1065 -0
  699. package/src/catalog-fec-params.ts +729 -0
  700. package/src/catalog-network-source.ts +74 -0
  701. package/src/catalog-validator.ts +34 -0
  702. package/src/cmaf-block-assembler.ts +1255 -0
  703. package/src/cmaf-group-batcher.ts +104 -0
  704. package/src/cmcd-producer.ts +329 -0
  705. package/src/codec-utils.ts +1984 -0
  706. package/src/conceal-timeline.ts +293 -0
  707. package/src/delivery-gap.ts +147 -0
  708. package/src/duplicate-ledger.ts +372 -0
  709. package/src/fec-codec.ts +61 -0
  710. package/src/fec-manager.ts +4298 -0
  711. package/src/fec-starvation-detector.ts +128 -0
  712. package/src/fec-state.ts +219 -0
  713. package/src/fec-worker-setup.ts +283 -0
  714. package/src/fmp4-completion.ts +47 -0
  715. package/src/fmp4-reader.ts +112 -0
  716. package/src/index.ts +590 -21
  717. package/src/iso-block-locator.ts +329 -0
  718. package/src/iso-bmff-timing.ts +813 -0
  719. package/src/loc.ts +128 -154
  720. package/src/manifest-auth-plan.ts +107 -0
  721. package/src/media-router.ts +841 -0
  722. package/src/mfu-reassembler.ts +3480 -155
  723. package/src/mfu-reassembly-policy.ts +134 -0
  724. package/src/mmtp-container-parser.ts +2380 -0
  725. package/src/mmtp-decode-pipeline.ts +406 -0
  726. package/src/mmtp-router.ts +4860 -0
  727. package/src/mmtp-to-cmaf.ts +977 -0
  728. package/src/multicast-auth-catalog.ts +340 -0
  729. package/src/multicast-input.ts +793 -0
  730. package/src/multicast-manager.ts +2783 -0
  731. package/src/multicast-transport.ts +1058 -0
  732. package/src/multicast-unwrap.ts +132 -0
  733. package/src/no-modules.ts +21 -0
  734. package/src/phase14-catalog-override.ts +336 -0
  735. package/src/repair-fetch.ts +772 -0
  736. package/src/repair-layers.ts +533 -0
  737. package/src/sample-combiner.ts +938 -0
  738. package/src/signaling.ts +78 -0
  739. package/src/source-auth.ts +1 -0
  740. package/src/switching-set-alignment.ts +109 -0
  741. package/src/timestamp-codec.ts +265 -0
  742. package/src/track-pipeline-setup.ts +205 -0
  743. package/src/track-pipeline.ts +332 -0
  744. package/src/track-session.ts +1010 -0
  745. package/src/transport-pool.ts +128 -0
  746. package/src/wasm-mfu-reassembler.ts +405 -0
  747. package/src/wasm-mmtp-container-parser.ts +23 -0
  748. package/test-vectors/align.json +199 -0
  749. package/test-vectors/catalog/README.md +106 -0
  750. package/test-vectors/catalog/negative/archive-origin-with-path.json +33 -0
  751. package/test-vectors/catalog/negative/archive-unknown-field.json +34 -0
  752. package/test-vectors/catalog/negative/fec-block-profile-missing.json +51 -0
  753. package/test-vectors/catalog/negative/fec-block-profile-unknown.json +52 -0
  754. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +28 -0
  755. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +33 -0
  756. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +31 -0
  757. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +32 -0
  758. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +34 -0
  759. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +24 -0
  760. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +33 -0
  761. package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
  762. package/test-vectors/catalog/negative/media-track-repair-layer.json +16 -0
  763. package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
  764. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
  765. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
  766. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
  767. package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
  768. package/test-vectors/catalog/negative/multicast-network-source-empty.json +44 -0
  769. package/test-vectors/catalog/negative/multicast-packet-id-signaling.json +26 -0
  770. package/test-vectors/catalog/negative/network-source-object.json +25 -0
  771. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +24 -0
  772. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +27 -0
  773. package/test-vectors/catalog/negative/repair-track-legacy-shape.json +19 -0
  774. package/test-vectors/catalog/negative/track-role-empty.json +16 -0
  775. package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
  776. package/test-vectors/catalog/positive/archive-origin.json +34 -0
  777. package/test-vectors/catalog/positive/fec-iso-ssbg1.json +52 -0
  778. package/test-vectors/catalog/positive/fec-layered-repair.json +106 -0
  779. package/test-vectors/catalog/positive/fec-multicast.json +52 -0
  780. package/test-vectors/catalog/positive/flat-av.json +30 -0
  781. package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
  782. package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +43 -0
  783. package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
  784. package/test-vectors/catalog/positive/track-role.json +49 -0
  785. package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
  786. package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
  787. package/test-vectors/catalog-multicast-auth-v1.json +26 -0
  788. package/test-vectors/catalog-validation.json +732 -0
  789. package/test-vectors/catalog-validator-public-api.mjs +25 -0
  790. package/test-vectors/generate-source-auth-fixture.mjs +114 -0
  791. package/test-vectors/hevc-x265-repeat-headers-v1.json +40 -0
  792. package/test-vectors/source-auth-v1.json +61 -0
  793. package/test-vectors/source-contiguity-v1.json +131 -0
  794. package/test-vectors/subsample-placement-v1.json +230 -0
  795. package/dist/mmtp.d.ts +0 -73
  796. package/dist/mmtp.d.ts.map +0 -1
  797. package/dist/mmtp.js +0 -210
  798. package/dist/mmtp.js.map +0 -1
  799. package/src/mmtp.ts +0 -277
@@ -0,0 +1,729 @@
1
+ // Catalog → per-track FEC geometry resolution.
2
+ //
3
+ // Moved from hang-mmt-fec's js/watch/src/track-fec-params.ts so every player
4
+ // (moq-lib/hang, moqtail, shaka MSF) resolves catalog FEC semantics through
5
+ // one shared implementation — players keep only wiring, not MMT/catalog
6
+ // interpretation. Structural track shape ({ name, type }) keeps this module
7
+ // player-agnostic.
8
+
9
+ import {
10
+ FEC_BLOCK_PROFILES,
11
+ isFecBlockProfile,
12
+ parseFecBlockProfile,
13
+ type FecBlockProfile,
14
+ } from "@blockcast/mmt-base";
15
+ import { catalogFecInterleaveMs, type FecInterleaveCatalog } from "@blockcast/mmt-fec";
16
+ import { resolveGroupDurationMs } from "./carp-catalog.js";
17
+ import { MIN_INTERLEAVE_DEPTH_MS, catalogDeclaresFec, isoBlockSpanUsable } from "./fec-state.js";
18
+ import {
19
+ assembleRepairLayers,
20
+ assertRepairTrackReachable,
21
+ describeRepairTrack,
22
+ rejectRepairFieldsOnMediaTrack,
23
+ rejectRepairTrackGeometry,
24
+ repairReachability,
25
+ dependsTarget,
26
+ readFecBlockProfile,
27
+ RepairContractError,
28
+ type RepairLayerParams,
29
+ type RepairLayersResolution,
30
+ type RepairOverlayParams,
31
+ type RepairSourceGeometry,
32
+ type RepairTrackDescriptor,
33
+ throwRepairContractError,
34
+ validateRepairTrackFields,
35
+ } from "./repair-layers.js";
36
+ import type { RepairTarget } from "./repair-fetch.js";
37
+
38
+ export { catalogFecInterleaveMs, type FecInterleaveCatalog };
39
+ export { FEC_BLOCK_PROFILES, isFecBlockProfile, parseFecBlockProfile, type FecBlockProfile };
40
+ export {
41
+ assembleRepairLayers,
42
+ assertRepairTrackReachable,
43
+ repairReachability,
44
+ type AssembleRepairLayersOptions,
45
+ type RepairReachability,
46
+ dependsTarget,
47
+ describeRepairTrack,
48
+ readFecBlockProfile,
49
+ rejectRepairFieldsOnMediaTrack,
50
+ rejectRepairTrackGeometry,
51
+ REPAIR_TRACK_GEOMETRY_KEYS,
52
+ REPAIR_TRACK_ONLY_KEYS,
53
+ validateRepairTrackFields,
54
+ DEFAULT_REPAIR_PRIORITY,
55
+ MAX_ENCODING_SYMBOL_ID,
56
+ MAX_RAPTORQ_SOURCE_SYMBOLS,
57
+ MAX_REPAIR_SYMBOLS,
58
+ REPAIR_PRIORITY_MAX,
59
+ REPAIR_PRIORITY_MIN,
60
+ RepairContractError,
61
+ type RepairContractCode,
62
+ type RepairContractFail,
63
+ type RepairLayerParams,
64
+ type RepairLayersResolution,
65
+ type RepairOverlayParams,
66
+ type RepairSourceGeometry,
67
+ type RepairTrackDescriptor,
68
+ } from "./repair-layers.js";
69
+
70
+ /**
71
+ * Minimal structural shape of a resolved endpoint track. Callers may carry
72
+ * extra fields (e.g. hang's ResolvedEndpointTrack adds `pid`) — the resolver
73
+ * only reads `name` and `type`.
74
+ */
75
+ export type CatalogTrackRef = {
76
+ name: string;
77
+ type: "video" | "audio" | (string & {});
78
+ };
79
+
80
+ type FecCatalog = FecInterleaveCatalog & {
81
+ algorithm?: unknown;
82
+ /** FEC block profile token (BLO-35597): required on a declared FEC
83
+ * instance, read through `readFecBlockProfile`. */
84
+ blockProfile?: unknown;
85
+ sourceSymbols?: number;
86
+ repairSymbols?: number;
87
+ symbolSize?: number;
88
+ /** Signaled jitter/reorder allowance in ms (added to the block span). */
89
+ reorderToleranceMs?: number;
90
+ /** Layer 0 repair track. Further layers and overlays describe themselves
91
+ * (draft-ramadan-moq-fec §6.3): MSF `tracks[]` entries with
92
+ * `packaging: "fec-repair"`, or hang `repair.renditions` entries, that
93
+ * `depend` on this rendition. */
94
+ repairTrack?: string;
95
+ };
96
+
97
+ /** One self-describing repair rendition of the hang catalog's `repair` block
98
+ * (draft-ramadan-moq-fec §6.3). Mirrors the MSF fec-repair track fields. */
99
+ export type RepairRenditionCatalog = {
100
+ depends?: unknown;
101
+ repairLayer?: unknown;
102
+ repairSymbols?: unknown;
103
+ priority?: unknown;
104
+ scope?: unknown;
105
+ sourceSymbols?: unknown;
106
+ };
107
+
108
+ /** The container fields the FEC and group-duration readers consult. */
109
+ type ContainerCatalog = { kind?: unknown; timescale?: unknown };
110
+
111
+ type RenditionCatalog = KeyframeCadenceCatalog & {
112
+ container?: ContainerCatalog;
113
+ fec?: FecCatalog;
114
+ framerate?: unknown;
115
+ sampleRate?: unknown;
116
+ samplerate?: unknown;
117
+ };
118
+
119
+ type CatalogWithRenditions = {
120
+ video?: { renditions?: Record<string, RenditionCatalog> };
121
+ audio?: { renditions?: Record<string, RenditionCatalog> };
122
+ /** hang-native repair renditions: every repair track beyond layer 0. */
123
+ repair?: { renditions?: Record<string, RepairRenditionCatalog> };
124
+ };
125
+
126
+ /** An MSF/CMSF catalog: `tracks[]` entries, each self-describing. */
127
+ type CatalogWithTracks = {
128
+ tracks?: unknown;
129
+ };
130
+
131
+ /** Either catalog dialect `resolveRepairLayers` reads. */
132
+ export type RepairLayerCatalog = CatalogWithRenditions | CatalogWithTracks;
133
+
134
+ export type GroupDurationCatalog = {
135
+ groupDurationTicks?: number;
136
+ groupDurationMs?: number;
137
+ timescale?: number;
138
+ };
139
+
140
+ /** Rendition fields the group-duration reader consumes. */
141
+ export type GroupDurationRendition = GroupDurationCatalog & {
142
+ container?: ContainerCatalog;
143
+ };
144
+
145
+ /**
146
+ * Largest tick count per Hz of timescale whose millisecond duration
147
+ * `resolveGroupDurationMs` still accepts: `(ticks / timescale) * 1000` must not
148
+ * exceed `Number.MAX_SAFE_INTEGER`, so `ticks <= timescale * (MAX_SAFE / 1000)`
149
+ * (Hz times seconds is ticks).
150
+ */
151
+ const MAX_SAFE_TICKS_PER_HZ = Number.MAX_SAFE_INTEGER / 1000;
152
+
153
+ /** A positive safe-integer Hz timescale, or undefined. */
154
+ function timescaleHz(value: unknown): number | undefined {
155
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : undefined;
156
+ }
157
+
158
+ /**
159
+ * A rendition's publisher group duration in ms, or undefined when the catalog
160
+ * carries none.
161
+ *
162
+ * `groupDurationTicks` over a timescale wins when both are present, through
163
+ * `resolveGroupDurationMs` (draft-ramadan-moq-mmt-00 §4.4.4). The timescale is
164
+ * the MMTP container's when the rendition declares one, else the rendition's
165
+ * own `timescale`. Only the ticks are forwarded: a catalog `groupDurationMs`
166
+ * is often a rounded fraction (21.33 for 1024/48000), which the ticks path
167
+ * never reads but `resolveGroupDurationMs` would reject as a non-integral ms.
168
+ * Ticks with no usable timescale, and ticks that `resolveGroupDurationMs`
169
+ * would reject, fall back to `groupDurationMs` rather than guessing a clock.
170
+ * That rejection is on the product, not the operand: the count must be a safe
171
+ * integer and `(ticks / timescale) * 1000` must stay within
172
+ * `Number.MAX_SAFE_INTEGER`, which a safe-integer count can still exceed when
173
+ * `timescale < 1000`, so the guard below bounds the count by
174
+ * `timescale * (Number.MAX_SAFE_INTEGER / 1000)` and the reader never throws.
175
+ * The production catalog signals both fields on every rendition and no
176
+ * rendition-level timescale, so the `groupDurationMs` fallback is the path it
177
+ * takes.
178
+ */
179
+ export function catalogGroupDurationMs(rendition: GroupDurationRendition | undefined): number | undefined {
180
+ if (!rendition) return undefined;
181
+ const ticks = numericField(rendition.groupDurationTicks);
182
+ const ms = numericField(rendition.groupDurationMs);
183
+ const timescale =
184
+ timescaleHz(rendition.container?.kind === "mmtp" ? rendition.container.timescale : undefined) ??
185
+ timescaleHz(rendition.timescale);
186
+ if (
187
+ ticks !== undefined &&
188
+ timescale !== undefined &&
189
+ Number.isSafeInteger(ticks) &&
190
+ ticks <= timescale * MAX_SAFE_TICKS_PER_HZ
191
+ ) {
192
+ return resolveGroupDurationMs({ groupDurationTicks: ticks }, timescale);
193
+ }
194
+ return ms;
195
+ }
196
+
197
+ /**
198
+ * The group duration of the catalog rendition an endpoint track was resolved
199
+ * from, by type and name (the same lookup `resolveCatalogTrackFec` performs
200
+ * for FEC geometry). Undefined when the rendition is missing or carries no
201
+ * group duration, so a caller that needs one can fail closed by name.
202
+ */
203
+ export function resolveCatalogTrackGroupDurationMs(
204
+ catalog: CatalogWithRenditions | undefined,
205
+ track: CatalogTrackRef,
206
+ ): number | undefined {
207
+ const renditions = track.type === "audio" ? catalog?.audio?.renditions : catalog?.video?.renditions;
208
+ return catalogGroupDurationMs(renditions?.[track.name]);
209
+ }
210
+
211
+ export type KeyframeCadenceCatalog = GroupDurationCatalog & {
212
+ keyframeDurationTicks?: number;
213
+ keyframeDurationMs?: number;
214
+ keyframeIntervalTicks?: number;
215
+ keyframeIntervalMs?: number;
216
+ gopDurationTicks?: number;
217
+ gopDurationMs?: number;
218
+ };
219
+
220
+ /**
221
+ * Why a track's catalog `fec` block resolved to no FEC although it is not a
222
+ * plain no-FEC declaration (BLO-35597): it declares an FEC instance but names
223
+ * no `blockProfile`, or it names a token that is not a known profile
224
+ * (`track_fec_block_profile`), or it names `iso-ssbg1-v1` without the block
225
+ * span that bounds that profile's block location (`track_fec`, on
226
+ * `interleaveDepthMs`). The profile selects the block math and is never
227
+ * defaulted or inferred, and the span is never borrowed from another track, so
228
+ * such a track carries no FEC geometry and no repair track, and it is the only
229
+ * track affected: every other track of the catalog resolves as usual.
230
+ */
231
+ export type TrackFecUnavailable = {
232
+ /** The repair-contract code a catalog validator reports for the same field. */
233
+ readonly code: "track_fec_block_profile" | "track_fec";
234
+ /** JSON path of the offending field: `blockProfile`, or `interleaveDepthMs`. */
235
+ readonly path: string;
236
+ /** What is wrong, worded as the `RepairContractError` a validator throws. */
237
+ readonly message: string;
238
+ };
239
+
240
+ export type TrackFecParams = {
241
+ fecK: number;
242
+ /** The catalog `fec.blockProfile` (BLO-35597, ISO/IEC 23008-1 Annex C).
243
+ * Present exactly when the track has FEC (`fecK > 0`) and absent on no
244
+ * FEC: it selects the block math (`k-padded-v1`: SS_Start = SBN*K over
245
+ * zero-padded K-symbol blocks; `iso-ssbg1-v1`: ssbg_mode1, K' =
246
+ * SSB_length, consecutive SS_IDs), so it is never defaulted. A declared
247
+ * instance that names no known profile has no FEC; `fecUnavailable` says
248
+ * why. */
249
+ fecBlockProfile?: FecBlockProfile;
250
+ /** Present exactly when the track's `fec` block names no usable
251
+ * `blockProfile`, or names `iso-ssbg1-v1` without a usable block span
252
+ * (see `TrackFecUnavailable`). The track then resolves to
253
+ * no FEC (`fecK` 0, no `fecBlockProfile`, no repair track) and this is
254
+ * the reason a caller surfaces. Absent on every other track, with FEC or
255
+ * without. */
256
+ fecUnavailable?: TrackFecUnavailable;
257
+ /** P_0: repair symbols per block on layer 0 (the track-level repairSymbols). */
258
+ fecRepairCount: number;
259
+ /** Total repair symbols per block across the BASE layers: the wire
260
+ * RSB_length on every base layer packet. Equals fecRepairCount on a
261
+ * single-layer track. A keyframe overlay is a separate FEC instance with
262
+ * its own RSB_length and is not included. */
263
+ fecTotalRepairCount: number;
264
+ fecSymbolSize: number;
265
+ fecInterleaveMs: number;
266
+ /** Catalog fec.reorderToleranceMs — signaled jitter/reorder allowance, ADDED
267
+ * to the block span to form a deadline. Deliberately `number | undefined`
268
+ * and NOT floored to 0: a declared 0 ("this path needs no slack") and an
269
+ * absent value ("the encoder never said") must stay distinguishable, or a
270
+ * consumer that wants to fail loud on absence silently reads a default
271
+ * instead — which is exactly how the magic 3.0 survived. */
272
+ fecReorderToleranceMs?: number;
273
+ repairTrackName?: string;
274
+ /** Every base repair layer in order, layer 0 first, with derived RS_ID
275
+ * offsets. Present whenever repairTrackName is. */
276
+ repairLayers?: readonly RepairLayerParams[];
277
+ /** Keyframe overlay instances declared for this track. Present (possibly
278
+ * empty) whenever repairLayers is. */
279
+ repairOverlays?: readonly RepairOverlayParams[];
280
+ fps?: number;
281
+ sampleRate?: number;
282
+ };
283
+
284
+ const NO_FEC: TrackFecParams = {
285
+ fecK: 0,
286
+ fecRepairCount: 0,
287
+ fecTotalRepairCount: 0,
288
+ fecSymbolSize: 0,
289
+ fecInterleaveMs: 0,
290
+ };
291
+
292
+ /**
293
+ * Repair symbols per block a receiver has actually joined: the sum of
294
+ * `repairSymbols` over the BASE layers whose repair track it joined
295
+ * (draft-ramadan-moq-fec 6.3). This is a symbol count, not a count of layers.
296
+ *
297
+ * A keyframe overlay is a separate FEC instance with its own K, its own
298
+ * RSB_length and its own RS_ID space, so it is never added here however it was
299
+ * joined. Counting it would overstate the base instance's P and misreport
300
+ * CMCD `x-bc-fec-p`.
301
+ *
302
+ * Falls back to P_0 when the track declares no layers, which is the
303
+ * single-layer identity rather than a default: with one layer, P_0 is the
304
+ * total.
305
+ */
306
+ export function joinedRepairSymbolCount(
307
+ params: Pick<TrackFecParams, "fecRepairCount" | "repairLayers">,
308
+ joinedRepairTrackNames: Iterable<string>,
309
+ ): number {
310
+ const layers = params.repairLayers;
311
+ if (layers === undefined || layers.length === 0) return params.fecRepairCount;
312
+ const joined = new Set(joinedRepairTrackNames);
313
+ let total = 0;
314
+ for (const layer of layers) {
315
+ if (joined.has(layer.repairTrackName)) total += layer.repairSymbols;
316
+ }
317
+ return total;
318
+ }
319
+
320
+ function recordOf(value: unknown): Record<string, unknown> | undefined {
321
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;
322
+ }
323
+
324
+ /** The MSF `tracks[]` view of a catalog, or undefined for the hang dialect. */
325
+ function msfTracks(catalog: RepairLayerCatalog): { tracks: Record<string, unknown>[] } | undefined {
326
+ const raw = (catalog as CatalogWithTracks).tracks;
327
+ if (!Array.isArray(raw)) return undefined;
328
+ return { tracks: raw.map((t) => recordOf(t) ?? {}) };
329
+ }
330
+
331
+ /**
332
+ * Resolve every repair track of one source track: base layers with derived
333
+ * RS_ID offsets and keyframe overlays (draft-ramadan-moq-fec §6.3), from either
334
+ * catalog dialect.
335
+ *
336
+ * - MSF `tracks[]`: the source is the entry named `source`; repair tracks are
337
+ * `packaging: "fec-repair"` entries. Layer 0 is the source's
338
+ * `fec.repairTrack`; layers 1..n and overlays `depend` on the source.
339
+ * - hang: the source is a `video`/`audio` rendition; repair tracks beyond
340
+ * layer 0 are `repair.renditions` entries that `depend` on it.
341
+ *
342
+ * Returns undefined when the source carries no FEC repair track and nothing
343
+ * depends on it. Throws `RepairContractError` (code + JSON path) on any
344
+ * violation, including a repair rendition whose `depends` names a rendition
345
+ * without FEC, so a player fails closed before joining any repair track.
346
+ */
347
+ export function resolveRepairLayers(
348
+ catalog: RepairLayerCatalog | undefined,
349
+ source: string | CatalogTrackRef,
350
+ ): RepairLayersResolution | undefined {
351
+ if (!catalog) return undefined;
352
+ const sourceName = typeof source === "string" ? source : source.name;
353
+
354
+ // hang dialect first. When a catalog carries hang-native rendition blocks
355
+ // beside a tracks[] switching-set index (the unified ABR ladder catalog),
356
+ // the rendition blocks are authoritative, exactly as they are for hang's own
357
+ // catalog decode. A typed ref resolves only within its own role.
358
+ const hang = catalog as CatalogWithRenditions;
359
+ const roles: Array<"video" | "audio"> =
360
+ typeof source === "string"
361
+ ? ["video", "audio"]
362
+ : source.type === "audio"
363
+ ? ["audio"]
364
+ : source.type === "video"
365
+ ? ["video"]
366
+ : ["video", "audio"];
367
+ const role = roles.find((r) => recordOf(hang[r]?.renditions?.[sourceName]) !== undefined);
368
+ if (role !== undefined) {
369
+ const renditionPath = `$.${role}.renditions[${JSON.stringify(sourceName)}]`;
370
+ const rendition = recordOf(hang[role]!.renditions![sourceName])!;
371
+ rejectRepairFieldsOnMediaTrack(renditionPath, rendition, throwRepairContractError);
372
+ const repairRenditions = recordOf(hang.repair?.renditions) ?? {};
373
+ const descriptors: RepairTrackDescriptor[] = Object.entries(repairRenditions).map(([name, entry]) => {
374
+ const path = `$.repair.renditions[${JSON.stringify(name)}]`;
375
+ const fields = recordOf(entry);
376
+ if (fields === undefined) {
377
+ throwRepairContractError("track_repair_layer", path, "a repair rendition must be an object");
378
+ }
379
+ rejectRepairTrackGeometry(path, fields, throwRepairContractError);
380
+ return describeRepairTrack(name, path, fields);
381
+ });
382
+ const fecOfRendition = (entry: unknown): Record<string, unknown> | undefined => {
383
+ const fec = recordOf(recordOf(entry)?.["fec"]);
384
+ return fec !== undefined && fec["algorithm"] !== "none" ? fec : undefined;
385
+ };
386
+ const mediaRenditions = [
387
+ ...Object.values(recordOf(hang.video?.renditions) ?? {}),
388
+ ...Object.values(recordOf(hang.audio?.renditions) ?? {}),
389
+ ];
390
+ const reachability = repairReachability(mediaRenditions.map((entry) => recordOf(entry)?.["fec"]));
391
+ for (const d of descriptors) {
392
+ validateRepairTrackFields(d, throwRepairContractError);
393
+ assertRepairTrackReachable(d, reachability, throwRepairContractError);
394
+ const target = dependsTarget(d);
395
+ if (target === undefined) continue;
396
+ const targetFec =
397
+ fecOfRendition(hang.video?.renditions?.[target]) ?? fecOfRendition(hang.audio?.renditions?.[target]);
398
+ if (targetFec === undefined) {
399
+ throwRepairContractError(
400
+ "track_repair_depends",
401
+ `${d.path}.depends`,
402
+ `${JSON.stringify(target)} is not a video or audio rendition with FEC`,
403
+ );
404
+ }
405
+ }
406
+ return assembleRepairLayers(
407
+ geometryOf(sourceName, `${renditionPath}.fec`, recordOf(rendition["fec"])),
408
+ descriptors,
409
+ throwRepairContractError,
410
+ );
411
+ }
412
+
413
+ const msf = msfTracks(catalog);
414
+ const msfIndex = msf ? msf.tracks.findIndex((t) => t["name"] === sourceName) : -1;
415
+ if (!msf || msfIndex < 0) return undefined;
416
+ const track = msf.tracks[msfIndex]!;
417
+ const fec = recordOf(track["fec"]);
418
+ const packagingOf = (t: Record<string, unknown>): unknown => t["packaging"];
419
+ const fecOfTrack = (t: Record<string, unknown> | undefined): Record<string, unknown> | undefined => {
420
+ const trackFec = recordOf(t?.["fec"]);
421
+ return trackFec !== undefined && trackFec["algorithm"] !== "none" ? trackFec : undefined;
422
+ };
423
+ // Rule 8 on the resolver path too: a repair track carries no block geometry
424
+ // and a media track carries no repair-track fields. Without this a repair
425
+ // track with its own `fec` would count as a FEC source below and name
426
+ // itself as layer 0, so rule 9 would never see it.
427
+ const descriptors: RepairTrackDescriptor[] = [];
428
+ const mediaTracks: Record<string, unknown>[] = [];
429
+ msf.tracks.forEach((t, i) => {
430
+ const path = `$.tracks[${i}]`;
431
+ if (packagingOf(t) === "fec-repair") {
432
+ rejectRepairTrackGeometry(path, t, throwRepairContractError);
433
+ if (typeof t["name"] === "string") descriptors.push(describeRepairTrack(t["name"], path, t));
434
+ return;
435
+ }
436
+ rejectRepairFieldsOnMediaTrack(path, t, throwRepairContractError);
437
+ mediaTracks.push(t);
438
+ });
439
+ const reachability = repairReachability(mediaTracks.map((t) => t["fec"]));
440
+ for (const d of descriptors) {
441
+ validateRepairTrackFields(d, throwRepairContractError);
442
+ assertRepairTrackReachable(d, reachability, throwRepairContractError);
443
+ const target = dependsTarget(d);
444
+ if (target === undefined) continue;
445
+ const targetTrack = msf.tracks.find((t) => t["name"] === target);
446
+ if (targetTrack === undefined || packagingOf(targetTrack) !== "mmtp" || fecOfTrack(targetTrack) === undefined) {
447
+ throwRepairContractError(
448
+ "track_repair_depends",
449
+ `${d.path}.depends`,
450
+ `${JSON.stringify(target)} is not an mmtp track with FEC`,
451
+ );
452
+ }
453
+ }
454
+ return assembleRepairLayers(geometryOf(sourceName, `$.tracks[${msfIndex}].fec`, fec), descriptors, throwRepairContractError, {
455
+ layerZeroMustBeDeclared: true,
456
+ });
457
+ }
458
+
459
+ /** A MoQ Transport priority (0..255, lower first), or null. */
460
+ function moqtPriority(value: unknown): number | null {
461
+ return Number.isSafeInteger(value) && (value as number) >= 0 && (value as number) <= 255 ? (value as number) : null;
462
+ }
463
+
464
+ /**
465
+ * The on-demand repair target of one source track, read from the catalog:
466
+ * its base layer 0 repair track and the two catalog priorities
467
+ * draft-ramadan-moq-fec §11.4.5 derives the FETCH's SUBSCRIBER_PRIORITY from
468
+ * (see `repairFetchSubscriberPriority`). This is what a player's
469
+ * `ResolveRepairTarget` returns once it knows which track owns the block.
470
+ *
471
+ * - `repairPriority`: layer 0's catalog `priority`, or 240 when it declares
472
+ * none; that value is defined by draft-ramadan-moq-fec §10, not chosen
473
+ * here (`resolveRepairLayers` applies it).
474
+ * - `sourcePriority`: the source track's MSF `tracks[]` entry `priority`
475
+ * (MoQ Transport scale). A catalog with no MSF entry for the track (a hang-only catalog,
476
+ * whose renditions carry no MoQ Transport priority) yields null, and the
477
+ * keyframe repair FETCH is then sent without the parameter.
478
+ *
479
+ * Returns null when the track has no repair track.
480
+ *
481
+ * @throws RepairContractError exactly as `resolveRepairLayers` does.
482
+ */
483
+ export function catalogRepairTarget(
484
+ catalog: RepairLayerCatalog | undefined,
485
+ source: string | CatalogTrackRef,
486
+ ): RepairTarget | null {
487
+ const repair = resolveRepairLayers(catalog, source);
488
+ const layerZero = repair?.baseLayers[0];
489
+ if (!catalog || !layerZero) return null;
490
+ const sourceName = typeof source === "string" ? source : source.name;
491
+ const msf = msfTracks(catalog);
492
+ const entry = msf?.tracks.find((t) => t["name"] === sourceName);
493
+ const sourcePriority =
494
+ entry === undefined ? null : moqtPriority(entry["priority"]);
495
+ return { repairTrack: layerZero.repairTrackName, sourcePriority, repairPriority: layerZero.priority };
496
+ }
497
+
498
+ function geometryOf(name: string, path: string, fec: Record<string, unknown> | undefined): RepairSourceGeometry {
499
+ return {
500
+ name,
501
+ path,
502
+ algorithm: fec?.["algorithm"],
503
+ sourceSymbols: fec?.["sourceSymbols"],
504
+ repairSymbols: fec?.["repairSymbols"],
505
+ repairTrack: fec?.["repairTrack"],
506
+ };
507
+ }
508
+
509
+ function numericField(value: unknown): number | undefined {
510
+ const n = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN;
511
+ return Number.isFinite(n) && n > 0 ? n : undefined;
512
+ }
513
+
514
+ /** Like `numericField` but admits an explicit 0, and still rejects absent,
515
+ * negative and non-finite input. Absence returns undefined so callers can
516
+ * tell "declared none" from "never declared". */
517
+ function nonNegativeField(value: unknown): number | undefined {
518
+ const n = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN;
519
+ return Number.isFinite(n) && n >= 0 ? n : undefined;
520
+ }
521
+
522
+ /**
523
+ * The track-scoped reading of `readFecBlockProfile` (BLO-35597): the same one
524
+ * rule every catalog reader applies (a declared FEC instance names a known
525
+ * profile; a block declaring none may omit it, but a token it carries must be
526
+ * known), with its one failure, `track_fec_block_profile`, returned as the
527
+ * track's reason instead of thrown. A profile problem costs only its own
528
+ * track: it never aborts resolving the catalog's other tracks, and the token
529
+ * is still never defaulted or inferred.
530
+ */
531
+ function blockProfileUnavailable(
532
+ value: unknown,
533
+ path: string,
534
+ declaresFecInstance: boolean,
535
+ ): TrackFecUnavailable | undefined {
536
+ try {
537
+ readFecBlockProfile(value, path, declaresFecInstance, throwRepairContractError);
538
+ return undefined;
539
+ } catch (error) {
540
+ if (!(error instanceof RepairContractError) || error.code !== "track_fec_block_profile") throw error;
541
+ return Object.freeze({ code: "track_fec_block_profile", path: error.path, message: error.message });
542
+ }
543
+ }
544
+
545
+ /**
546
+ * An `iso-ssbg1-v1` instance without a usable block span (`isoBlockSpanUsable`)
547
+ * has no FEC for its track alone, instead of resolving to a configuration the
548
+ * FEC manager refuses for every track it holds.
549
+ */
550
+ function isoSpanUnavailable(fec: unknown, path: string, declaresFecInstance: boolean): TrackFecUnavailable | undefined {
551
+ if (!declaresFecInstance || isoBlockSpanUsable(fec)) return undefined;
552
+ return Object.freeze({
553
+ code: "track_fec",
554
+ path,
555
+ message:
556
+ `[repair-layers:track_fec] ${path}: iso-ssbg1-v1 requires a block span of at least ` +
557
+ `${MIN_INTERLEAVE_DEPTH_MS} ms, which bounds its block location`,
558
+ });
559
+ }
560
+
561
+ /**
562
+ * Per-track FEC geometry, or `NO_FEC` when the rendition declares none (no
563
+ * `fec`, or `algorithm: "none"`) or names no usable `blockProfile` or, under
564
+ * `iso-ssbg1-v1`, no usable block span; the latter two carry `fecUnavailable`.
565
+ *
566
+ * @throws RepairContractError from `resolveRepairLayers` when the rendition
567
+ * declares a `fec` block (any algorithm, `none` included) and the catalog's
568
+ * repair contract is malformed, and `track_fec` when its `fec` declares an FEC
569
+ * instance whose `sourceSymbols` or `symbolSize` is not a positive integer;
570
+ * see `resolveCatalogTrackFec`. An absent or unknown `blockProfile`, or an
571
+ * `iso-ssbg1-v1` span that is absent or below `MIN_INTERLEAVE_DEPTH_MS`, never
572
+ * throws: it is this track's `fecUnavailable`.
573
+ */
574
+ function fecParams(
575
+ catalog: CatalogWithRenditions | undefined,
576
+ track: CatalogTrackRef | undefined,
577
+ rendition: RenditionCatalog | undefined,
578
+ fps?: number,
579
+ sampleRate?: number,
580
+ ): TrackFecParams {
581
+ const mediaRate = sampleRate === undefined ? { fps } : { fps, sampleRate };
582
+ const fec = rendition?.fec;
583
+ // Every caller passes a track with its rendition.
584
+ if (!fec || !track) return { ...NO_FEC, ...mediaRate };
585
+ // The repair contract is enforced for every declared `fec` block, including
586
+ // one that declares no FEC instance (a repair layer may not depend on it).
587
+ const repair = resolveRepairLayers(catalog, track);
588
+ const fecPath = `$.${track.type}.renditions[${JSON.stringify(track.name)}].fec`;
589
+ // One predicate for "this track has FEC", shared with resolveFecState: K
590
+ // and T are positive integers, the algorithm is not `none`, and the block
591
+ // profile is known.
592
+ if (!catalogDeclaresFec(fec)) {
593
+ const declaresFecInstance = fec.algorithm !== "none";
594
+ const kValid = Number.isSafeInteger(fec.sourceSymbols) && (fec.sourceSymbols ?? 0) > 0;
595
+ const tValid = Number.isSafeInteger(fec.symbolSize) && (fec.symbolSize ?? 0) > 0;
596
+ if (declaresFecInstance && !(kValid && tValid)) {
597
+ // Any algorithm but `none` declares an FEC instance, so geometry a
598
+ // decoder cannot configure is a malformed catalog, not "no FEC".
599
+ // Returning NO_FEC would silently drop the track's repair
600
+ // subscription (repairTrackName, repairLayers, repairOverlays).
601
+ throwRepairContractError(
602
+ "track_fec",
603
+ `${fecPath}.${kValid ? "symbolSize" : "sourceSymbols"}`,
604
+ "must be a positive integer",
605
+ );
606
+ }
607
+ // What remains is `algorithm: "none"` (which carries no profile; a token
608
+ // it does carry must still be known) or a declared instance naming no
609
+ // known profile. Neither has FEC; an unusable profile says why, for this
610
+ // track alone.
611
+ const fecUnavailable =
612
+ blockProfileUnavailable(fec.blockProfile, `${fecPath}.blockProfile`, declaresFecInstance) ??
613
+ isoSpanUnavailable(fec, `${fecPath}.interleaveDepthMs`, declaresFecInstance);
614
+ return fecUnavailable === undefined ? { ...NO_FEC, ...mediaRate } : { ...NO_FEC, ...mediaRate, fecUnavailable };
615
+ }
616
+ // The predicate held, so the profile is known: this read cannot fail.
617
+ const fecBlockProfile = readFecBlockProfile(fec.blockProfile, `${fecPath}.blockProfile`, true, throwRepairContractError);
618
+ return {
619
+ fecK: fec.sourceSymbols ?? 0,
620
+ fecBlockProfile,
621
+ fecRepairCount: fec.repairSymbols ?? 0,
622
+ // The wire RSB_length: every base layer's packets carry the base total (§7.1).
623
+ fecTotalRepairCount: repair?.totalBaseRepairSymbols ?? fec.repairSymbols ?? 0,
624
+ fecSymbolSize: fec.symbolSize ?? 0,
625
+ // interleaveDepthMs is the FEC block span in MILLISECONDS (§5.1) — the
626
+ // only interleave key the catalog carries post-BLO-14526. Receivers
627
+ // derive D by positive round-half-up of span / GOP duration where needed.
628
+ fecInterleaveMs: catalogFecInterleaveMs(fec) ?? 0,
629
+ // Additive, never a multiplier on the span: jitter belongs to the network
630
+ // path and the span belongs to the encoder, so scaling one by the other
631
+ // hands one network different slack per track. `numericField` rejects 0,
632
+ // so it cannot be reused here — a declared 0 is a legitimate value.
633
+ fecReorderToleranceMs: nonNegativeField(fec.reorderToleranceMs),
634
+ repairTrackName: fec.repairTrack,
635
+ repairLayers: repair?.baseLayers,
636
+ repairOverlays: repair?.overlays,
637
+ ...mediaRate,
638
+ };
639
+ }
640
+
641
+ /**
642
+ * Resolves per-track FEC geometry from the catalog for the active endpoint tracks.
643
+ *
644
+ * `video`/`audio` (and the top-level names and `catalogFps`) describe the
645
+ * FIRST video and audio track of `tracks`. `forTrack` resolves any track from
646
+ * its OWN rendition, scoped by its type: a second video track (an ABR rung or
647
+ * simulcast variant, possibly sharing a packetId) gets its own framerate,
648
+ * interleave and repair layers, never the first rendition's. A track with no
649
+ * rendition of its type resolves to no FEC (`fecK` 0) and no media rate.
650
+ *
651
+ * The block profile is track-scoped (BLO-35597). A rendition whose `fec`
652
+ * declares an FEC instance but names no `blockProfile`, or whose `fec` (a
653
+ * `none` block included) names a token that is not a known profile, resolves
654
+ * to no FEC: `fecK` 0, no `fecBlockProfile`, no repair track, and
655
+ * `fecUnavailable` carrying the `track_fec_block_profile` reason at the
656
+ * field's JSON path for the caller to surface. Every other track resolves as
657
+ * usual. The profile is never defaulted or inferred; `algorithm: "none"` may
658
+ * omit it.
659
+ *
660
+ * @throws RepairContractError `track_fec` when a rendition's `fec` declares an
661
+ * FEC instance (any `algorithm` but `none`) whose `sourceSymbols` or
662
+ * `symbolSize` is not a positive integer, and when a rendition that declares a
663
+ * `fec` block (any algorithm, `none` included) carries a repair contract that
664
+ * violates draft-ramadan-moq-fec 6.3 (a gap or
665
+ * duplicate in the layer chain, a bad `depends` target, an unreachable repair
666
+ * track, a bound violation). Because the hang dialect validates every `repair.renditions`
667
+ * entry of the catalog, resolving the video track fails on a malformed audio
668
+ * repair rendition too. This is deliberate: a player must fail closed before it
669
+ * joins any repair track. Callers that used to treat this function as total
670
+ * must catch it and surface the catalog error.
671
+ */
672
+ export function resolveCatalogTrackFec(
673
+ catalog: CatalogWithRenditions | undefined,
674
+ tracks: readonly CatalogTrackRef[],
675
+ ): {
676
+ videoTrackName?: string;
677
+ audioTrackName?: string;
678
+ missingVideoRendition?: string;
679
+ missingAudioRendition?: string;
680
+ videoForKeyframeRepair?: KeyframeCadenceCatalog;
681
+ catalogFps?: number;
682
+ video: TrackFecParams;
683
+ audio: TrackFecParams;
684
+ forTrack(track: CatalogTrackRef): TrackFecParams;
685
+ } {
686
+ const videoTrackName = tracks.find((t) => t.type === "video")?.name;
687
+ const audioTrackName = tracks.find((t) => t.type === "audio")?.name;
688
+ const videoRenditions = catalog?.video?.renditions;
689
+ const audioRenditions = catalog?.audio?.renditions;
690
+ const video = videoTrackName ? videoRenditions?.[videoTrackName] : undefined;
691
+ const audio = audioTrackName ? audioRenditions?.[audioTrackName] : undefined;
692
+ const catalogFps = numericField(video?.framerate);
693
+ const sampleRate = numericField(audio?.sampleRate ?? audio?.samplerate);
694
+ const audioFps = sampleRate ? sampleRate / 1024 : undefined;
695
+ const videoParams = fecParams(catalog, videoTrackName ? { name: videoTrackName, type: "video" } : undefined, video, catalogFps);
696
+ const audioParams = fecParams(
697
+ catalog,
698
+ audioTrackName ? { name: audioTrackName, type: "audio" } : undefined,
699
+ audio,
700
+ audioFps,
701
+ sampleRate,
702
+ );
703
+
704
+ const forTrack = (track: CatalogTrackRef): TrackFecParams => {
705
+ if (track.type === "audio") {
706
+ if (track.name === audioTrackName) return audioParams;
707
+ const rendition = audioRenditions?.[track.name];
708
+ if (!rendition) return { ...NO_FEC };
709
+ const rate = numericField(rendition.sampleRate ?? rendition.samplerate);
710
+ return fecParams(catalog, { name: track.name, type: "audio" }, rendition, rate ? rate / 1024 : undefined, rate);
711
+ }
712
+ if (track.name === videoTrackName) return videoParams;
713
+ const rendition = videoRenditions?.[track.name];
714
+ if (!rendition) return { ...NO_FEC };
715
+ return fecParams(catalog, { name: track.name, type: "video" }, rendition, numericField(rendition.framerate));
716
+ };
717
+
718
+ return {
719
+ videoTrackName,
720
+ audioTrackName,
721
+ missingVideoRendition: videoTrackName && videoRenditions && !video ? videoTrackName : undefined,
722
+ missingAudioRendition: audioTrackName && audioRenditions && !audio ? audioTrackName : undefined,
723
+ videoForKeyframeRepair: video,
724
+ catalogFps,
725
+ video: videoParams,
726
+ audio: audioParams,
727
+ forTrack,
728
+ };
729
+ }