@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,229 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
9
+
10
+ // src/track-pipeline.ts
11
+ var AUTO_CHAIN = ["multicast", "amt", "moq"];
12
+ var DEFAULT_POLICY = {
13
+ audio: "crossfade",
14
+ video: "wait"
15
+ };
16
+ var _router, _sourceFactory, _tracks, _capabilities, _onTransportChange, _onQualityChange, _TrackPipeline_instances, resolve_fn, resolveTrack_fn, applyTransport_fn, expandPreferred_fn, isAvailable_fn, defaultPolicy_fn;
17
+ var TrackPipeline = class {
18
+ constructor(router) {
19
+ __privateAdd(this, _TrackPipeline_instances);
20
+ __privateAdd(this, _router);
21
+ __privateAdd(this, _sourceFactory, null);
22
+ __privateAdd(this, _tracks, /* @__PURE__ */ new Map());
23
+ __privateAdd(this, _capabilities, null);
24
+ __privateAdd(this, _onTransportChange, null);
25
+ __privateAdd(this, _onQualityChange, null);
26
+ __privateSet(this, _router, router);
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Configuration
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Register a factory that creates TrackSource instances for a given transport.
33
+ * The factory is called when the pipeline resolves a track to a new transport
34
+ * and needs to wire it into the MediaRouter.
35
+ *
36
+ * The factory returns null if the transport is not available for that track
37
+ * (e.g., no multicast socket for this group).
38
+ */
39
+ setSourceFactory(factory) {
40
+ __privateSet(this, _sourceFactory, factory);
41
+ }
42
+ /** Listen for transport change events (after setTrackSource is called). */
43
+ onTransportChange(cb) {
44
+ __privateSet(this, _onTransportChange, cb);
45
+ }
46
+ /** Listen for ABR-driven quality change requests. */
47
+ onQualityChange(cb) {
48
+ __privateSet(this, _onQualityChange, cb);
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Preferences + Capabilities
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Set per-track transport preferences. Triggers resolution if capabilities
55
+ * are already known. Safe to call multiple times (replaces previous prefs).
56
+ */
57
+ setPreferences(prefs) {
58
+ for (const pref of prefs) {
59
+ const existing = __privateGet(this, _tracks).get(pref.trackName);
60
+ __privateGet(this, _tracks).set(pref.trackName, {
61
+ currentTransport: existing?.currentTransport ?? null,
62
+ preference: pref,
63
+ resolution: existing?.resolution ?? null
64
+ });
65
+ }
66
+ for (const name of __privateGet(this, _tracks).keys()) {
67
+ if (!prefs.find((p) => p.trackName === name)) {
68
+ __privateGet(this, _router).clearTrackSource(name);
69
+ __privateGet(this, _tracks).delete(name);
70
+ }
71
+ }
72
+ if (__privateGet(this, _capabilities)) __privateMethod(this, _TrackPipeline_instances, resolve_fn).call(this);
73
+ }
74
+ /**
75
+ * Update capability snapshot. Triggers re-resolution against current prefs.
76
+ * Called by the IWA's CapabilityObserver, or by the player's extension bridge
77
+ * on capability change events.
78
+ */
79
+ updateCapabilities(caps) {
80
+ __privateSet(this, _capabilities, caps);
81
+ if (__privateGet(this, _tracks).size > 0) __privateMethod(this, _TrackPipeline_instances, resolve_fn).call(this);
82
+ }
83
+ /**
84
+ * Force a specific transport for a track (e.g., user override, debug).
85
+ * Skips the resolver; applies immediately.
86
+ */
87
+ forceTransport(trackName, transport, policy) {
88
+ const state = __privateGet(this, _tracks).get(trackName);
89
+ if (!state) return;
90
+ const effectivePolicy = policy ?? __privateMethod(this, _TrackPipeline_instances, defaultPolicy_fn).call(this, state.preference.trackType);
91
+ __privateMethod(this, _TrackPipeline_instances, applyTransport_fn).call(this, trackName, transport, effectivePolicy);
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // ABR Integration
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Notify the pipeline of an ABR quality change. The pipeline adjusts the
98
+ * transport ceiling and may trigger a transport switch if the new quality
99
+ * exceeds the current transport's capacity.
100
+ */
101
+ notifyQualityChange(trackName, quality) {
102
+ var _a;
103
+ (_a = __privateGet(this, _onQualityChange)) == null ? void 0 : _a.call(this, trackName, quality);
104
+ if (__privateGet(this, _capabilities)) __privateMethod(this, _TrackPipeline_instances, resolve_fn).call(this);
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Query
108
+ // ---------------------------------------------------------------------------
109
+ /** Current transport for a track (null if not yet resolved). */
110
+ getTransport(trackName) {
111
+ return __privateGet(this, _tracks).get(trackName)?.currentTransport ?? null;
112
+ }
113
+ /** Current resolution for a track (null if not yet resolved). */
114
+ getResolution(trackName) {
115
+ return __privateGet(this, _tracks).get(trackName)?.resolution ?? null;
116
+ }
117
+ /** All track names managed by this pipeline. */
118
+ get trackNames() {
119
+ return [...__privateGet(this, _tracks).keys()];
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // Teardown
123
+ // ---------------------------------------------------------------------------
124
+ dispose() {
125
+ for (const name of __privateGet(this, _tracks).keys()) {
126
+ __privateGet(this, _router).clearTrackSource(name);
127
+ }
128
+ __privateGet(this, _tracks).clear();
129
+ __privateSet(this, _capabilities, null);
130
+ __privateSet(this, _onTransportChange, null);
131
+ __privateSet(this, _onQualityChange, null);
132
+ }
133
+ };
134
+ _router = new WeakMap();
135
+ _sourceFactory = new WeakMap();
136
+ _tracks = new WeakMap();
137
+ _capabilities = new WeakMap();
138
+ _onTransportChange = new WeakMap();
139
+ _onQualityChange = new WeakMap();
140
+ _TrackPipeline_instances = new WeakSet();
141
+ // ---------------------------------------------------------------------------
142
+ // Internal
143
+ // ---------------------------------------------------------------------------
144
+ /** Run the resolver and apply transport changes. */
145
+ resolve_fn = function() {
146
+ const caps = __privateGet(this, _capabilities);
147
+ for (const [trackName, state] of __privateGet(this, _tracks)) {
148
+ const resolution = __privateMethod(this, _TrackPipeline_instances, resolveTrack_fn).call(this, state.preference, caps);
149
+ state.resolution = resolution;
150
+ if (resolution.assignedTransport !== state.currentTransport) {
151
+ __privateMethod(this, _TrackPipeline_instances, applyTransport_fn).call(this, trackName, resolution.assignedTransport, resolution.migrationPolicy);
152
+ }
153
+ }
154
+ };
155
+ /** Pure per-track resolution (inline, no dependency on @blockcast/shared). */
156
+ resolveTrack_fn = function(pref, caps) {
157
+ const chain = __privateMethod(this, _TrackPipeline_instances, expandPreferred_fn).call(this, pref.preferred);
158
+ for (let i = 0; i < chain.length; i++) {
159
+ const transport = chain[i];
160
+ if (!__privateMethod(this, _TrackPipeline_instances, isAvailable_fn).call(this, transport, caps)) continue;
161
+ return {
162
+ trackName: pref.trackName,
163
+ assignedTransport: transport,
164
+ reason: i === 0 ? "preferred" : "fallback",
165
+ migrationPolicy: pref.migrationPolicy ?? __privateMethod(this, _TrackPipeline_instances, defaultPolicy_fn).call(this, pref.trackType)
166
+ };
167
+ }
168
+ return {
169
+ trackName: pref.trackName,
170
+ assignedTransport: "moq",
171
+ reason: "capability-limited",
172
+ migrationPolicy: pref.migrationPolicy ?? __privateMethod(this, _TrackPipeline_instances, defaultPolicy_fn).call(this, pref.trackType)
173
+ };
174
+ };
175
+ /** Apply a resolved transport to a track via MediaRouter. */
176
+ applyTransport_fn = function(trackName, transport, policy) {
177
+ var _a, _b;
178
+ const state = __privateGet(this, _tracks).get(trackName);
179
+ if (!state) return;
180
+ const prev = state.currentTransport;
181
+ if (transport === "moq") {
182
+ __privateGet(this, _router).clearTrackSource(trackName);
183
+ state.currentTransport = "moq";
184
+ if (prev !== "moq") {
185
+ (_a = __privateGet(this, _onTransportChange)) == null ? void 0 : _a.call(this, trackName, prev, "moq", policy);
186
+ }
187
+ return;
188
+ }
189
+ if (!__privateGet(this, _sourceFactory)) {
190
+ console.warn(`[TrackPipeline] No source factory registered; cannot create source for ${trackName}/${transport}`);
191
+ return;
192
+ }
193
+ const source = __privateGet(this, _sourceFactory).call(this, trackName, transport);
194
+ if (!source) {
195
+ console.warn(`[TrackPipeline] Factory returned null for ${trackName}/${transport}; keeping current transport`);
196
+ return;
197
+ }
198
+ if (prev && prev !== "moq") {
199
+ __privateGet(this, _router).clearTrackSource(trackName);
200
+ }
201
+ __privateGet(this, _router).setTrackSource(trackName, source, { policy });
202
+ state.currentTransport = transport;
203
+ (_b = __privateGet(this, _onTransportChange)) == null ? void 0 : _b.call(this, trackName, prev, transport, policy);
204
+ };
205
+ expandPreferred_fn = function(preferred) {
206
+ const out = [];
207
+ for (const t of preferred) {
208
+ if (t === "auto") out.push(...AUTO_CHAIN);
209
+ else out.push(t);
210
+ }
211
+ return out;
212
+ };
213
+ isAvailable_fn = function(transport, caps) {
214
+ switch (transport) {
215
+ case "multicast":
216
+ return caps.nativeMulticast.confirmed;
217
+ case "amt":
218
+ return caps.amt.available;
219
+ case "moq":
220
+ return caps.moqRelay.reachable;
221
+ }
222
+ };
223
+ defaultPolicy_fn = function(trackType) {
224
+ return DEFAULT_POLICY[trackType];
225
+ };
226
+ export {
227
+ TrackPipeline
228
+ };
229
+ //# sourceMappingURL=track-pipeline.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/track-pipeline.ts"],
4
+ "sourcesContent": ["/**\n * TrackPipeline \u2014 per-track transport promotion + ABR integration.\n *\n * Coordinates transport promotion (MoQ \u2192 multicast/AMT) on a per-track basis.\n * Shared by both web players (moq-lib, moqtail) and the IWA.\n *\n * Responsibilities:\n * 1. Takes per-track transport preferences and current capabilities\n * 2. Runs the pure resolveTransports() function to get assignments\n * 3. Calls MediaRouter.setTrackSource() per-track with the resolved policy\n * 4. Re-resolves when capabilities change (network switch, multicast detected)\n * 5. Integrates ABR quality changes with track-level subscription management\n *\n * NOT responsible for:\n * - Socket management (that's MulticastTransport / NativeMulticastManager)\n * - FEC decode (that's FECManager)\n * - MMTP parsing (that's MmtpRouter)\n * - Binary MoQ\u2194multicast switching (that's MediaRouter.feedMoq/feedMulticast)\n *\n * Usage:\n * const pipeline = new TrackPipeline(mediaRouter);\n * pipeline.setPreferences(prefs);\n * pipeline.updateCapabilities(caps);\n * // pipeline calls mediaRouter.setTrackSource() automatically\n * // listen for transport changes:\n * pipeline.onTransportChange((trackName, from, to, policy) => { ... });\n */\n\nimport type { MediaRouter, TrackSource } from './media-router.js'\nimport type { MigrationPolicy } from './media-router.js'\n\n// Inline transport types to avoid dep on @blockcast/shared at runtime.\n// These MUST stay compatible with @blockcast/shared/transport-settings.\nexport type TrackTransport = 'multicast' | 'amt' | 'moq' | 'auto'\n\nexport interface TrackTransportPreference {\n trackName: string\n /** Actual media type from catalog (never inferred from name). */\n trackType: 'video' | 'audio'\n preferred: TrackTransport[]\n maxLatencyMs?: number\n migrationPolicy?: MigrationPolicy\n}\n\nexport interface TransportCapabilityReport {\n nativeMulticast: { confirmed: boolean; lastPacketAt?: number }\n amt: { available: boolean; relay?: string; rttMs?: number }\n moqRelay: { reachable: boolean; rttMs?: number }\n networkHint?: 'wifi' | 'cellular' | 'ethernet' | 'unknown'\n observedAt: number\n}\n\nexport interface TrackTransportResolution {\n trackName: string\n assignedTransport: TrackTransport\n reason: 'preferred' | 'fallback' | 'capability-limited' | 'latency-gated' | 'abr-override'\n migrationPolicy: MigrationPolicy\n}\n\n/** Callback for transport change events */\ntype TransportChangeCb = (\n trackName: string,\n from: TrackTransport | null,\n to: TrackTransport,\n policy: MigrationPolicy,\n) => void\n\n/** Callback for ABR quality change requests */\ntype QualityChangeCb = (trackName: string, quality: { name: string; bitrate: number }) => void\n\n/** Factory that creates a TrackSource for a given transport + track */\nexport type TrackSourceFactory = (\n trackName: string,\n transport: TrackTransport,\n) => TrackSource | null\n\n// Default auto expansion: multicast \u2192 amt \u2192 moq\nconst AUTO_CHAIN: Exclude<TrackTransport, 'auto'>[] = ['multicast', 'amt', 'moq']\n\n// Default migration policies\nconst DEFAULT_POLICY: Record<string, MigrationPolicy> = {\n audio: 'crossfade',\n video: 'wait',\n}\n\n/** Per-track state tracked by the pipeline */\ninterface TrackState {\n currentTransport: TrackTransport | null\n preference: TrackTransportPreference\n resolution: TrackTransportResolution | null\n}\n\nexport class TrackPipeline {\n #router: MediaRouter\n #sourceFactory: TrackSourceFactory | null = null\n #tracks = new Map<string, TrackState>()\n #capabilities: TransportCapabilityReport | null = null\n #onTransportChange: TransportChangeCb | null = null\n #onQualityChange: QualityChangeCb | null = null\n\n constructor(router: MediaRouter) {\n this.#router = router\n }\n\n // ---------------------------------------------------------------------------\n // Configuration\n // ---------------------------------------------------------------------------\n\n /**\n * Register a factory that creates TrackSource instances for a given transport.\n * The factory is called when the pipeline resolves a track to a new transport\n * and needs to wire it into the MediaRouter.\n *\n * The factory returns null if the transport is not available for that track\n * (e.g., no multicast socket for this group).\n */\n setSourceFactory(factory: TrackSourceFactory): void {\n this.#sourceFactory = factory\n }\n\n /** Listen for transport change events (after setTrackSource is called). */\n onTransportChange(cb: TransportChangeCb): void {\n this.#onTransportChange = cb\n }\n\n /** Listen for ABR-driven quality change requests. */\n onQualityChange(cb: QualityChangeCb): void {\n this.#onQualityChange = cb\n }\n\n // ---------------------------------------------------------------------------\n // Preferences + Capabilities\n // ---------------------------------------------------------------------------\n\n /**\n * Set per-track transport preferences. Triggers resolution if capabilities\n * are already known. Safe to call multiple times (replaces previous prefs).\n */\n setPreferences(prefs: TrackTransportPreference[]): void {\n for (const pref of prefs) {\n const existing = this.#tracks.get(pref.trackName)\n this.#tracks.set(pref.trackName, {\n currentTransport: existing?.currentTransport ?? null,\n preference: pref,\n resolution: existing?.resolution ?? null,\n })\n }\n // Remove tracks no longer in prefs\n for (const name of this.#tracks.keys()) {\n if (!prefs.find(p => p.trackName === name)) {\n this.#router.clearTrackSource(name)\n this.#tracks.delete(name)\n }\n }\n if (this.#capabilities) this.#resolve()\n }\n\n /**\n * Update capability snapshot. Triggers re-resolution against current prefs.\n * Called by the IWA's CapabilityObserver, or by the player's extension bridge\n * on capability change events.\n */\n updateCapabilities(caps: TransportCapabilityReport): void {\n this.#capabilities = caps\n if (this.#tracks.size > 0) this.#resolve()\n }\n\n /**\n * Force a specific transport for a track (e.g., user override, debug).\n * Skips the resolver; applies immediately.\n */\n forceTransport(trackName: string, transport: TrackTransport, policy?: MigrationPolicy): void {\n const state = this.#tracks.get(trackName)\n if (!state) return\n\n const effectivePolicy = policy ?? this.#defaultPolicy(state.preference.trackType)\n this.#applyTransport(trackName, transport, effectivePolicy)\n }\n\n // ---------------------------------------------------------------------------\n // ABR Integration\n // ---------------------------------------------------------------------------\n\n /**\n * Notify the pipeline of an ABR quality change. The pipeline adjusts the\n * transport ceiling and may trigger a transport switch if the new quality\n * exceeds the current transport's capacity.\n */\n notifyQualityChange(trackName: string, quality: { name: string; bitrate: number }): void {\n this.#onQualityChange?.(trackName, quality)\n // Re-resolve: ABR quality may push a track to a different transport\n if (this.#capabilities) this.#resolve()\n }\n\n // ---------------------------------------------------------------------------\n // Query\n // ---------------------------------------------------------------------------\n\n /** Current transport for a track (null if not yet resolved). */\n getTransport(trackName: string): TrackTransport | null {\n return this.#tracks.get(trackName)?.currentTransport ?? null\n }\n\n /** Current resolution for a track (null if not yet resolved). */\n getResolution(trackName: string): TrackTransportResolution | null {\n return this.#tracks.get(trackName)?.resolution ?? null\n }\n\n /** All track names managed by this pipeline. */\n get trackNames(): string[] {\n return [...this.#tracks.keys()]\n }\n\n // ---------------------------------------------------------------------------\n // Teardown\n // ---------------------------------------------------------------------------\n\n dispose(): void {\n for (const name of this.#tracks.keys()) {\n this.#router.clearTrackSource(name)\n }\n this.#tracks.clear()\n this.#capabilities = null\n this.#onTransportChange = null\n this.#onQualityChange = null\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n /** Run the resolver and apply transport changes. */\n #resolve(): void {\n const caps = this.#capabilities!\n for (const [trackName, state] of this.#tracks) {\n const resolution = this.#resolveTrack(state.preference, caps)\n state.resolution = resolution\n\n if (resolution.assignedTransport !== state.currentTransport) {\n this.#applyTransport(trackName, resolution.assignedTransport, resolution.migrationPolicy)\n }\n }\n }\n\n /** Pure per-track resolution (inline, no dependency on @blockcast/shared). */\n #resolveTrack(\n pref: TrackTransportPreference,\n caps: TransportCapabilityReport,\n ): TrackTransportResolution {\n const chain = this.#expandPreferred(pref.preferred)\n\n for (let i = 0; i < chain.length; i++) {\n const transport = chain[i]!\n if (!this.#isAvailable(transport, caps)) continue\n\n return {\n trackName: pref.trackName,\n assignedTransport: transport,\n reason: i === 0 ? 'preferred' : 'fallback',\n migrationPolicy: pref.migrationPolicy ?? this.#defaultPolicy(pref.trackType),\n }\n }\n\n // Nothing available \u2014 stay on current or fall back to moq\n return {\n trackName: pref.trackName,\n assignedTransport: 'moq',\n reason: 'capability-limited',\n migrationPolicy: pref.migrationPolicy ?? this.#defaultPolicy(pref.trackType),\n }\n }\n\n /** Apply a resolved transport to a track via MediaRouter. */\n #applyTransport(trackName: string, transport: TrackTransport, policy: MigrationPolicy): void {\n const state = this.#tracks.get(trackName)\n if (!state) return\n\n const prev = state.currentTransport\n\n // MoQ is the default binary path \u2014 clear per-track source to fall back\n if (transport === 'moq') {\n this.#router.clearTrackSource(trackName)\n state.currentTransport = 'moq'\n if (prev !== 'moq') {\n this.#onTransportChange?.(trackName, prev, 'moq', policy)\n }\n return\n }\n\n // For multicast/amt: create a TrackSource via the factory\n if (!this.#sourceFactory) {\n console.warn(`[TrackPipeline] No source factory registered; cannot create source for ${trackName}/${transport}`)\n return\n }\n\n const source = this.#sourceFactory(trackName, transport)\n if (!source) {\n console.warn(`[TrackPipeline] Factory returned null for ${trackName}/${transport}; keeping current transport`)\n return\n }\n\n // Clear previous per-track source (if any) before setting new one\n if (prev && prev !== 'moq') {\n this.#router.clearTrackSource(trackName)\n }\n\n this.#router.setTrackSource(trackName, source, { policy })\n state.currentTransport = transport\n this.#onTransportChange?.(trackName, prev, transport, policy)\n }\n\n #expandPreferred(preferred: TrackTransport[]): Exclude<TrackTransport, 'auto'>[] {\n const out: Exclude<TrackTransport, 'auto'>[] = []\n for (const t of preferred) {\n if (t === 'auto') out.push(...AUTO_CHAIN)\n else out.push(t)\n }\n return out\n }\n\n #isAvailable(transport: Exclude<TrackTransport, 'auto'>, caps: TransportCapabilityReport): boolean {\n switch (transport) {\n case 'multicast': return caps.nativeMulticast.confirmed\n case 'amt': return caps.amt.available\n case 'moq': return caps.moqRelay.reachable\n }\n }\n\n #defaultPolicy(trackType: 'video' | 'audio'): MigrationPolicy {\n return DEFAULT_POLICY[trackType]!\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;AA6EA,IAAM,aAAgD,CAAC,aAAa,OAAO,KAAK;AAGhF,IAAM,iBAAkD;AAAA,EACtD,OAAO;AAAA,EACP,OAAO;AACT;AAnFA;AA4FO,IAAM,gBAAN,MAAoB;AAAA,EAQzB,YAAY,QAAqB;AAR5B;AACL;AACA,uCAA4C;AAC5C,gCAAU,oBAAI,IAAwB;AACtC,sCAAkD;AAClD,2CAA+C;AAC/C,yCAA2C;AAGzC,uBAAK,SAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,iBAAiB,SAAmC;AAClD,uBAAK,gBAAiB;AAAA,EACxB;AAAA;AAAA,EAGA,kBAAkB,IAA6B;AAC7C,uBAAK,oBAAqB;AAAA,EAC5B;AAAA;AAAA,EAGA,gBAAgB,IAA2B;AACzC,uBAAK,kBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAe,OAAyC;AACtD,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,mBAAK,SAAQ,IAAI,KAAK,SAAS;AAChD,yBAAK,SAAQ,IAAI,KAAK,WAAW;AAAA,QAC/B,kBAAkB,UAAU,oBAAoB;AAAA,QAChD,YAAY;AAAA,QACZ,YAAY,UAAU,cAAc;AAAA,MACtC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,mBAAK,SAAQ,KAAK,GAAG;AACtC,UAAI,CAAC,MAAM,KAAK,OAAK,EAAE,cAAc,IAAI,GAAG;AAC1C,2BAAK,SAAQ,iBAAiB,IAAI;AAClC,2BAAK,SAAQ,OAAO,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,mBAAK,eAAe,uBAAK,sCAAL;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,MAAuC;AACxD,uBAAK,eAAgB;AACrB,QAAI,mBAAK,SAAQ,OAAO,EAAG,uBAAK,sCAAL;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,WAAmB,WAA2B,QAAgC;AAC3F,UAAM,QAAQ,mBAAK,SAAQ,IAAI,SAAS;AACxC,QAAI,CAAC,MAAO;AAEZ,UAAM,kBAAkB,UAAU,sBAAK,4CAAL,WAAoB,MAAM,WAAW;AACvE,0BAAK,6CAAL,WAAqB,WAAW,WAAW;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,oBAAoB,WAAmB,SAAkD;AA5L3F;AA6LI,6BAAK,sBAAL,8BAAwB,WAAW;AAEnC,QAAI,mBAAK,eAAe,uBAAK,sCAAL;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WAA0C;AACrD,WAAO,mBAAK,SAAQ,IAAI,SAAS,GAAG,oBAAoB;AAAA,EAC1D;AAAA;AAAA,EAGA,cAAc,WAAoD;AAChE,WAAO,mBAAK,SAAQ,IAAI,SAAS,GAAG,cAAc;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,aAAuB;AACzB,WAAO,CAAC,GAAG,mBAAK,SAAQ,KAAK,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAgB;AACd,eAAW,QAAQ,mBAAK,SAAQ,KAAK,GAAG;AACtC,yBAAK,SAAQ,iBAAiB,IAAI;AAAA,IACpC;AACA,uBAAK,SAAQ,MAAM;AACnB,uBAAK,eAAgB;AACrB,uBAAK,oBAAqB;AAC1B,uBAAK,kBAAmB;AAAA,EAC1B;AA0GF;AA9OE;AACA;AACA;AACA;AACA;AACA;AANK;AAAA;AAAA;AAAA;AAAA;AA4IL,aAAQ,WAAS;AACf,QAAM,OAAO,mBAAK;AAClB,aAAW,CAAC,WAAW,KAAK,KAAK,mBAAK,UAAS;AAC7C,UAAM,aAAa,sBAAK,2CAAL,WAAmB,MAAM,YAAY;AACxD,UAAM,aAAa;AAEnB,QAAI,WAAW,sBAAsB,MAAM,kBAAkB;AAC3D,4BAAK,6CAAL,WAAqB,WAAW,WAAW,mBAAmB,WAAW;AAAA,IAC3E;AAAA,EACF;AACF;AAAA;AAGA,kBAAa,SACX,MACA,MAC0B;AAC1B,QAAM,QAAQ,sBAAK,8CAAL,WAAsB,KAAK;AAEzC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,YAAY,MAAM,CAAC;AACzB,QAAI,CAAC,sBAAK,0CAAL,WAAkB,WAAW,MAAO;AAEzC,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,mBAAmB;AAAA,MACnB,QAAQ,MAAM,IAAI,cAAc;AAAA,MAChC,iBAAiB,KAAK,mBAAmB,sBAAK,4CAAL,WAAoB,KAAK;AAAA,IACpE;AAAA,EACF;AAGA,SAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,iBAAiB,KAAK,mBAAmB,sBAAK,4CAAL,WAAoB,KAAK;AAAA,EACpE;AACF;AAAA;AAGA,oBAAe,SAAC,WAAmB,WAA2B,QAA+B;AAjR/F;AAkRI,QAAM,QAAQ,mBAAK,SAAQ,IAAI,SAAS;AACxC,MAAI,CAAC,MAAO;AAEZ,QAAM,OAAO,MAAM;AAGnB,MAAI,cAAc,OAAO;AACvB,uBAAK,SAAQ,iBAAiB,SAAS;AACvC,UAAM,mBAAmB;AACzB,QAAI,SAAS,OAAO;AAClB,+BAAK,wBAAL,8BAA0B,WAAW,MAAM,OAAO;AAAA,IACpD;AACA;AAAA,EACF;AAGA,MAAI,CAAC,mBAAK,iBAAgB;AACxB,YAAQ,KAAK,0EAA0E,SAAS,IAAI,SAAS,EAAE;AAC/G;AAAA,EACF;AAEA,QAAM,SAAS,mBAAK,gBAAL,WAAoB,WAAW;AAC9C,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,6CAA6C,SAAS,IAAI,SAAS,6BAA6B;AAC7G;AAAA,EACF;AAGA,MAAI,QAAQ,SAAS,OAAO;AAC1B,uBAAK,SAAQ,iBAAiB,SAAS;AAAA,EACzC;AAEA,qBAAK,SAAQ,eAAe,WAAW,QAAQ,EAAE,OAAO,CAAC;AACzD,QAAM,mBAAmB;AACzB,2BAAK,wBAAL,8BAA0B,WAAW,MAAM,WAAW;AACxD;AAEA,qBAAgB,SAAC,WAAgE;AAC/E,QAAM,MAAyC,CAAC;AAChD,aAAW,KAAK,WAAW;AACzB,QAAI,MAAM,OAAQ,KAAI,KAAK,GAAG,UAAU;AAAA,QACnC,KAAI,KAAK,CAAC;AAAA,EACjB;AACA,SAAO;AACT;AAEA,iBAAY,SAAC,WAA4C,MAA0C;AACjG,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAa,aAAO,KAAK,gBAAgB;AAAA,IAC9C,KAAK;AAAO,aAAO,KAAK,IAAI;AAAA,IAC5B,KAAK;AAAO,aAAO,KAAK,SAAS;AAAA,EACnC;AACF;AAEA,mBAAc,SAAC,WAA+C;AAC5D,SAAO,eAAe,SAAS;AACjC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,398 @@
1
+ /**
2
+ * TrackSession — per-track transport state machine.
3
+ * SessionManager — orchestrates all sessions + TransportPool.
4
+ *
5
+ * Implements Patent Claim 9 (draft-ramadan-moq-fec APPLICATION-1):
6
+ * (a) subscribe unicast
7
+ * (b) simultaneously join multicast
8
+ * (c) render from unicast during join
9
+ * (d) activate multicast on RAP, suppress unicast
10
+ * (e) cross-transport FEC repair during transition
11
+ * (f) hysteresis before switching away from multicast
12
+ * (g) re-subscribe unicast on sustained failure
13
+ *
14
+ * PIM: manages transport state without inspecting packet contents.
15
+ */
16
+ import { TransportPool, type Subscription, type SubscriptionMode, type TransportPoolOptions } from './transport-pool.js';
17
+ export type TrackState = 'idle' | 'unicast' | 'unicast-fallback' | 'joining' | 'multicast' | 'amt' | 'failing';
18
+ export interface TrackSessionConfig {
19
+ trackName: string;
20
+ trackType: 'video' | 'audio';
21
+ packetId: number;
22
+ /** FEC interleave depth from catalog (ms). Used for hysteresis timer. */
23
+ fecInterleaveMs: number;
24
+ /** Explicit catalog jitter/reorder allowance in ms. */
25
+ fecReorderToleranceMs?: number;
26
+ /** FEC K from catalog. Used for audio worklet latency calculation. */
27
+ fecK: number;
28
+ /** FEC repair symbols per block (P). NOT symbol size. */
29
+ fecRepairCount: number;
30
+ /**
31
+ * Repair symbols per block this receiver actually joined: the sum of
32
+ * `repairSymbols` over the joined BASE layers, not a count of layers
33
+ * (draft-ramadan-moq-fec 6.3). A keyframe overlay is a separate FEC instance
34
+ * and is not included.
35
+ *
36
+ * This is runtime join state, not catalog geometry: a receiver on a clean
37
+ * path joins layer 0 only while a lossy one adds layers, so the catalog's
38
+ * total P is not what this receiver is receiving. Diagnostics that report P
39
+ * (the worker snapshot, CMCD `x-bc-fec-p`) must read this.
40
+ *
41
+ * Absent when the caller joins no layers explicitly, in which case P_0 is
42
+ * what was joined. That is an identity on a single-layer track, not a
43
+ * catalog default: with one layer, P_0 is the total.
44
+ */
45
+ joinedRepairCount?: number;
46
+ /** FEC symbol size in bytes (T). Required for WASM decoder OTI. */
47
+ fecSymbolSize: number;
48
+ /** MoQ repair track name from catalog FEC config. */
49
+ repairTrackName?: string;
50
+ /** Frame samples from initData parsing (audio-init-parser.ts). */
51
+ frameSamples?: number;
52
+ /** Audio sample rate from catalog. */
53
+ sampleRate?: number;
54
+ /** Ordered transport preference: best first. */
55
+ preferredTransports: SubscriptionMode[];
56
+ /** Subscription key for multicast/AMT: "(S,G,port)". */
57
+ multicastKey?: string;
58
+ /** MoQ track name for unicast subscription. */
59
+ moqTrackName?: string;
60
+ /** AMT relay address (if AMT is in preference chain). */
61
+ amtRelay?: string;
62
+ /** MoQ relay URL (for WebTransport subscription). */
63
+ moqRelayUrl?: string;
64
+ }
65
+ export interface SessionManagerCallbacks {
66
+ /** Fired on every transport state transition. */
67
+ onStateChange?(trackName: string, from: TrackState, to: TrackState): void;
68
+ /** Fired to suppress/unsuppress unicast for this track (transport arbitration). */
69
+ onSuppress?(trackName: string, suppressed: boolean): void;
70
+ /**
71
+ * Fired when a track sat in `joining` for SessionManager.takeoverDeadlineMs
72
+ * without a RAP (BLO-9413/D9). The session has already returned to `unicast`
73
+ * (nothing was suppressed, so nothing to restore) and it keeps its FEC
74
+ * decoder armed, because the multicast socket is still joined and the router
75
+ * still admits the stream's symbols. The host should abandon the router-side
76
+ * attempt (e.g. MediaRouter.failbackToMoq()) so the router stops waiting for
77
+ * a keyframe that is never coming; it must not dispose the decoder here. The
78
+ * decoder is released on the next transport edge (unsubscribe, failbackAll,
79
+ * or transportFailed falling back to unicast) through fec-teardown.
80
+ */
81
+ onTakeoverTimeout?(trackName: string): void;
82
+ }
83
+ /**
84
+ * MMTP track events (discriminated union).
85
+ * Each protocol layer defines its own event union — MMTP events cover
86
+ * media resets, latency, and FEC lifecycle.
87
+ */
88
+ export type MmtpTrackEvent = {
89
+ type: 'reset';
90
+ } | {
91
+ type: 'latency';
92
+ latencyMs: number;
93
+ } | {
94
+ type: 'fec-setup';
95
+ } | {
96
+ type: 'fec-teardown';
97
+ };
98
+ /**
99
+ * MMTP application-layer extension of SessionManagerCallbacks.
100
+ * Single onTrackEvent dispatches all MMTP-specific events.
101
+ * PIM consumers use the base SessionManagerCallbacks (no onTrackEvent).
102
+ *
103
+ * IWA can define its own subinterface with its own TrackEvent union
104
+ * (e.g., IwaTrackEvent for socket health, AMT state) using the same pattern.
105
+ */
106
+ export interface MmtpSessionCallbacks extends SessionManagerCallbacks {
107
+ onTrackEvent?(trackName: string, event: MmtpTrackEvent, config: TrackSessionConfig): void;
108
+ }
109
+ /**
110
+ * Loss-hysteresis window covering the signaled FEC block span plus jitter.
111
+ *
112
+ * `fecK` no longer feeds the math; it is still validated as a catalog
113
+ * well-formedness guard and kept in the signature for positional API compat
114
+ * (removal is a follow-up with the next cross-repo pin bump).
115
+ */
116
+ export declare function computeFecLossWindowMs(fecInterleaveMs: number, fecK: number, jitterBufferMs?: number): number;
117
+ export interface FecDeliveryWindowConfig {
118
+ interleaveDepthMs: number;
119
+ sourceSymbols: number;
120
+ repairSymbols?: number;
121
+ symbolSize?: number;
122
+ mediaUnitsPerSecond?: number;
123
+ bandwidthBps?: number;
124
+ /**
125
+ * Explicit jitter/reorder allowance in ms, added once to the complete span.
126
+ * Callers pass their signaled catalog allowance, never a local default.
127
+ */
128
+ jitterBufferMs?: number;
129
+ }
130
+ /**
131
+ * The catalog interleaveDepthMs is the complete FEC block span, including the
132
+ * repair tail. K, P, cadence, and bandwidth must not expand it again. Geometry
133
+ * fields remain accepted for existing callers, but do not feed deadline math.
134
+ */
135
+ export declare function computeFecDeliveryWindowMs(config: FecDeliveryWindowConfig): number;
136
+ /** Convert the shared FEC delivery deadline into an integer media timescale. */
137
+ export declare function computeFecDeliveryWindowMediaUnits(config: FecDeliveryWindowConfig, timestampTimescale: number): number;
138
+ export declare class TrackSession {
139
+ #private;
140
+ readonly config: TrackSessionConfig;
141
+ constructor(config: TrackSessionConfig, manager: SessionManager);
142
+ get state(): TrackState;
143
+ get subscription(): Subscription | null;
144
+ /** True while this session's onSuppress(true) is outstanding (no matching
145
+ * onSuppress(false) yet). Test/assertion surface for failback coherence. */
146
+ get isSuppressed(): boolean;
147
+ /** Current active transport mode, or null if idle. */
148
+ get transport(): SubscriptionMode | null;
149
+ /** Audio worklet latency: max(fecInterleaveMs, frameDurationMs * fecK).
150
+ * Returns undefined if frame duration unknown (no initData). */
151
+ get audioLatencyMs(): number | undefined;
152
+ /** Frame duration in ms, derived from frameSamples + sampleRate. */
153
+ get frameDurationMs(): number | undefined;
154
+ /** idle → unicast: player subscribes to this track. */
155
+ subscribe(): void;
156
+ /** unicast → joining: multicast/AMT capability detected, join in progress. */
157
+ joinStarted(): void;
158
+ /**
159
+ * any non-fallback state → unicast-fallback. Used when the SSM bridge is
160
+ * absent (vanilla Chromium / no extension) and the host falls back to a
161
+ * MoQ unicast subscription per track. Terminal-ish: activateMulticast,
162
+ * failbackAll, and transportFailed are no-ops while in this state.
163
+ *
164
+ * Fires fec-setup so the per-track repair worker spins up — repair packets
165
+ * still flow over the MoQ repair-track subscription, so FEC source+repair
166
+ * can converge as in the multicast path.
167
+ *
168
+ * Audio latency is NOT re-emitted here: subscribe() already fires latency
169
+ * once on the idle → unicast edge, and enterUnicastFallback is only ever
170
+ * reached from a non-idle state (SessionManager skips idle sessions).
171
+ */
172
+ enterUnicastFallback(): void;
173
+ /**
174
+ * unicast-fallback → unicast. Called when the SSM bridge appears mid-session
175
+ * (extension installed after fallback engaged). Host first aborts the fallback
176
+ * drainers, then transitions sessions back to unicast so the regular
177
+ * multicast/AMT preference chain can take over via joinStarted().
178
+ */
179
+ exitUnicastFallback(): void;
180
+ /**
181
+ * joining → multicast or amt: RAP received on the joined transport (Claim 9d).
182
+ * Resets audio worklet, then suppresses MoQ.
183
+ */
184
+ rapReceived(mode: 'multicast' | 'amt'): void;
185
+ /** multicast/amt → failing: loss detected, start hysteresis timer (Claim 9f). */
186
+ lossDetected(): void;
187
+ /** failing → previous primary: loss recovered within hysteresis window. */
188
+ lossRecovered(): void;
189
+ /**
190
+ * Transport failed (AMT relay down, multicast interface gone).
191
+ * Try next transport in preference chain.
192
+ */
193
+ transportFailed(): void;
194
+ /** Hysteresis expired → failback to next transport (Claim 9g). */
195
+ hysteresisExpired(): void;
196
+ /** → idle: player unsubscribes / tab close / cleanup. */
197
+ unsubscribe(): void;
198
+ /** True when SessionManager.enterUnicastFallback put this track into the
199
+ * host-driven unicast subscription mode. Host can iterate sessions to
200
+ * decide whether to keep its fallback drainer alive across MediaRouter
201
+ * arbitration events. */
202
+ get isUnicastFallback(): boolean;
203
+ /**
204
+ * True while this track owns a FEC decoder (fec-setup fired, fec-teardown
205
+ * not yet). Stays true across a takeover timeout that parked the session in
206
+ * `unicast`; SessionManager.failbackAll uses it to release such sessions.
207
+ */
208
+ get isFecArmed(): boolean;
209
+ /**
210
+ * Start the deadline a `joining` entry deferred while the join was inactive
211
+ * (SessionManager.joinActive). The track gets the FULL deadline from here,
212
+ * because that is when media can first arrive. No-op outside `joining` and
213
+ * when a deadline is already running, so it never shortens or restarts one.
214
+ *
215
+ * The `joinActive` guard is what makes this safe to call from anywhere: a
216
+ * track parked in `joining` with a deferred (null) timer satisfies the other
217
+ * two, so without it a host calling this while the join is still inactive
218
+ * would arm the exact deadline the gate exists to defer -- silently
219
+ * reinstating BLO-34289. It is a no-op for the internal caller, which writes
220
+ * `#joinActive = true` before iterating the sessions.
221
+ */
222
+ armDeferredJoinDeadline(): void;
223
+ dispose(): void;
224
+ }
225
+ /**
226
+ * Largest takeover deadline setTimeout represents faithfully. setTimeout
227
+ * coerces its delay to a signed 32-bit int, so a larger value fires on the
228
+ * next tick (Node also warns TimeoutOverflowWarning) instead of after the
229
+ * window the host asked for -- silently inverting the feature. Rejecting it
230
+ * keeps the classic units bug (seconds-as-ms, a wrong timescale) loud.
231
+ */
232
+ export declare const MAX_TAKEOVER_DEADLINE_MS = 2147483647;
233
+ /**
234
+ * How long `joinActive` may stay false before the library says so. The deferral
235
+ * is unbounded by construction -- that is the feature -- so a host that never
236
+ * flips it back parks every track in `joining` with no timer at all: exactly the
237
+ * forever-join the takeover deadline exists to prevent, only silent. MoQ stays
238
+ * unsuppressed so the viewer sees video, but onTakeoverTimeout never fires, the
239
+ * FEC decoder stays armed, and the preference chain never advances past the
240
+ * transport that failed. It looks like a slow join. A host is one un-awaited
241
+ * rejection between `false` and `true` away from it, so the library complains
242
+ * rather than trusting every future host to get all of its exit paths right.
243
+ *
244
+ * Generous against a genuinely slow subscribe -- a bridge reconnect or AMT relay
245
+ * handshake is seconds -- so anything still unsettled here is broken, not slow.
246
+ */
247
+ export declare const JOIN_DEFER_WARN_MS = 30000;
248
+ export declare class SessionManager {
249
+ #private;
250
+ readonly pool: TransportPool;
251
+ readonly sessions: Map<string, TrackSession>;
252
+ callbacks: SessionManagerCallbacks | null;
253
+ /**
254
+ * Takeover deadline (BLO-9413/D9): the time a session may sit in `joining`
255
+ * without a RAP before returning to `unicast` and firing onTakeoverTimeout.
256
+ * MoQ is never suppressed during `joining`, so expiry abandons the takeover
257
+ * without a playback glitch. The host derives it from the catalog (RAP
258
+ * cadence from groupDurationTicks/timescale plus the signaled FEC delivery
259
+ * window or reorder tolerance) and sets it before addTrack(). There is no
260
+ * default: an unset value fails addTrack() closed, and reading the getter
261
+ * before assignment throws the same way, so no host ever holds a
262
+ * `number | undefined` it could coalesce back into a default.
263
+ * `hasTakeoverDeadline` answers whether one was admitted. A declared 0
264
+ * disables the deadline. The value is an integer number of milliseconds:
265
+ * setTimeout truncates fractions, so a host that divides ticks by a
266
+ * timescale must round before assigning.
267
+ *
268
+ * Assignment validates, so the diagnostic lands at the host's own call site.
269
+ * That is what bounds the blast radius: `joining` is entered from
270
+ * joinStarted(), from the transportFailed() failover branch -- itself
271
+ * reachable from a setTimeout via hysteresisExpired(), where no caller could
272
+ * catch a throw -- and from the activateMulticast()/activateAmt()/pool-failure
273
+ * loops, where a throw on one session would abandon its siblings mid-loop
274
+ * (the split-brain those loops exist to prevent). Refusing a bad value at
275
+ * assignment means no host mutation can make an already-admitted session
276
+ * throw out of a transport edge.
277
+ */
278
+ get takeoverDeadlineMs(): number;
279
+ set takeoverDeadlineMs(value: number);
280
+ /** True once the host has admitted a deadline; a declared 0 counts. */
281
+ get hasTakeoverDeadline(): boolean;
282
+ /**
283
+ * Whether the transport the joining tracks are waiting on is actually
284
+ * subscribed. The takeover deadline is a media-arrival budget and media
285
+ * cannot arrive before the join exists, so while this is false, entering
286
+ * `joining` arms no deadline; flipping it true starts the FULL deadline for
287
+ * every track already parked there.
288
+ *
289
+ * Default true, which is the arm-on-`joining` behaviour every host had
290
+ * before: a host that only calls joinStarted() after its own join resolves
291
+ * (moqtail-private's player, post-BLO-33339) is already at the right edge and
292
+ * needs no gate. A host that arms joinStarted() up front — to have FEC
293
+ * decoders ready before the first datagram — sets this false before addTrack()
294
+ * and true when its subscribe settles. Charging a slow subscribe (bridge
295
+ * reconnect, AMT relay handshake) against the media budget expired the
296
+ * deadline before the subscription existed and abandoned the join on the
297
+ * happy path. BLO-34289.
298
+ *
299
+ * The flag tracks the host's primary join, not per-track transport state. A
300
+ * track that fails over to the next transport in its own chain while this is
301
+ * false (transportFailed's failover branch also enters `joining`) has that
302
+ * deadline gated on the primary join activating, not on its own transport.
303
+ * Under the documented usage -- false once at setup, true once the subscribe
304
+ * settles -- the two coincide.
305
+ *
306
+ * The gate is on the ENTRY into `joining`, and false cannot take back a
307
+ * deadline already running: the `true -> false` edge arms the warn below and
308
+ * clears nothing. So set it false BEFORE the `joining` entry it is meant to
309
+ * gate. A host that instead flipped it false after a `transportFailed()`
310
+ * failover had already entered `joining` would leave the full deadline
311
+ * counting against a subscribe that had not begun -- BLO-34289 again, on the
312
+ * failover edge. Clearing running deadlines on that edge is deliberately NOT
313
+ * done: this flag is manager-wide, so one transport's brief false would
314
+ * cancel an unrelated track's live deadline and then re-arm it at FULL length
315
+ * on the next activation (armDeferredJoinDeadline sees `joining` + a null
316
+ * timer and cannot tell a cleared deadline from a deferred one). Every
317
+ * unrelated transport blip would restart the whole budget, so under repeated
318
+ * failover a track that should have timed out is extended indefinitely and
319
+ * never advances. Only a false that never returns true loses the timer
320
+ * outright, and JOIN_DEFER_WARN_MS already covers that.
321
+ *
322
+ * Leaving this false is not free: see JOIN_DEFER_WARN_MS.
323
+ */
324
+ get joinActive(): boolean;
325
+ set joinActive(active: boolean);
326
+ /** Narrow to MMTP callbacks (onTrackEvent). Safe — optional chaining handles PIM-only consumers. */
327
+ get mmtp(): MmtpSessionCallbacks | null;
328
+ constructor(poolOptions?: TransportPoolOptions);
329
+ /** Add a track session from catalog config. */
330
+ addTrack(config: TrackSessionConfig): TrackSession;
331
+ /** Remove a track session. Releases subscription with grace period. */
332
+ removeTrack(trackName: string): void;
333
+ /**
334
+ * All tracks with multicast RAP → multicast state (atomic).
335
+ * Called when MediaRouter fires onSourceSwitch('multicast').
336
+ * Prevents split-brain between video and audio.
337
+ *
338
+ * A takeover deadline can return a track from `joining` to `unicast` while
339
+ * the multicast socket keeps delivering packets and the track keeps its FEC
340
+ * decoder armed. If a valid RAP arrives later, that late-RAP edge suppresses
341
+ * unicast and promotes multicast without a second fec-setup.
342
+ */
343
+ activateMulticast(): void;
344
+ /**
345
+ * All tracks with AMT RAP → amt state (atomic).
346
+ */
347
+ activateAmt(): void;
348
+ /**
349
+ * All tracks → unicast (failback, atomic).
350
+ * Called when MulticastManager fires onFailback().
351
+ * unicast-fallback sessions are skipped — the host owns those subscriptions
352
+ * and they must drain uninterrupted across transport-state events.
353
+ *
354
+ * Coherence invariant (BLO-9413): after this returns, every non-fallback
355
+ * session is `unicast` (or `idle`), unsuppressed, and without a FEC decoder.
356
+ * unsubscribe() unwinds any outstanding suppression regardless of the state
357
+ * it tears down from (`failing` included; see TrackSession.#suppressFired),
358
+ * and a session that a takeover timeout parked in `unicast` with its decoder
359
+ * still armed is cycled too, because this transport edge is what releases
360
+ * that decoder (unsubscribe fires fec-teardown).
361
+ */
362
+ failbackAll(): void;
363
+ /**
364
+ * All tracks → unicast-fallback (atomic).
365
+ * Called by the host when the multicast gateway is absent and
366
+ * the player will subscribe to source tracks over MoQ unicast and feed
367
+ * packets via MulticastManager.feedUnicastSource() (or manager.router
368
+ * directly). Sessions in this state stay terminal until the host calls
369
+ * unsubscribe() / disposes the SessionManager.
370
+ */
371
+ enterUnicastFallback(): void;
372
+ /**
373
+ * True if any session is currently in unicast-fallback. Hosts use this to
374
+ * gate `multicastTrack.close()` on failback events — closing the shared
375
+ * broadcast would kill the host's fallback drainers.
376
+ */
377
+ hasActiveFallback(): boolean;
378
+ /**
379
+ * All fallback tracks → unicast (atomic).
380
+ * Called when the SSM bridge appears mid-session and the host has aborted
381
+ * the fallback drainers. The session re-enters the regular preference chain
382
+ * via joinStarted() (issued by the host immediately after).
383
+ */
384
+ exitUnicastFallback(): void;
385
+ /** Tab closed — release all subscriptions for this tab (grace period). */
386
+ tabClosed(tabId: string): void;
387
+ /** Bridge WebTransport connection dropped — same as tab close. */
388
+ bridgeDisconnected(): void;
389
+ /**
390
+ * Track selection changed (user or ABR).
391
+ * Old track released (grace period), new track subscribed.
392
+ */
393
+ trackSelectionChanged(oldTrackName: string, newConfig: TrackSessionConfig): void;
394
+ /** Get a track session by name. */
395
+ getTrack(trackName: string): TrackSession | undefined;
396
+ dispose(): void;
397
+ }
398
+ //# sourceMappingURL=track-session.d.ts.map