@blockcast/mmt-container 0.1.0 → 0.3.0

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,754 @@
1
+ // src/transport-pool.ts
2
+ var TransportPool = class {
3
+ #subs = /* @__PURE__ */ new Map();
4
+ #options;
5
+ #failedCb = null;
6
+ #stats = { activeSubscriptions: 0, totalAcquires: 0, totalReleases: 0 };
7
+ constructor(options) {
8
+ this.#options = options ?? {};
9
+ }
10
+ /** Register callback for subscription failures. */
11
+ onSubscriptionFailed(cb) {
12
+ this.#failedCb = cb;
13
+ }
14
+ acquireSubscription(keyOrOpts, consumer) {
15
+ const key = typeof keyOrOpts === "string" ? keyOrOpts : keyOrOpts.key;
16
+ const cons = typeof keyOrOpts === "string" ? consumer : keyOrOpts.consumer;
17
+ const mode = typeof keyOrOpts === "object" ? keyOrOpts.mode : "moq";
18
+ let sub = this.#subs.get(key);
19
+ if (!sub) {
20
+ sub = { key, mode, consumers: /* @__PURE__ */ new Set() };
21
+ this.#subs.set(key, sub);
22
+ this.#stats.activeSubscriptions++;
23
+ }
24
+ ;
25
+ sub.consumers.add(cons);
26
+ this.#stats.totalAcquires++;
27
+ return sub;
28
+ }
29
+ /** Release a subscription for a consumer. Closes if last consumer. */
30
+ releaseSubscription(key, consumer) {
31
+ const sub = this.#subs.get(key);
32
+ if (!sub) return;
33
+ sub.consumers.delete(consumer);
34
+ this.#stats.totalReleases++;
35
+ if (sub.consumers.size === 0) {
36
+ this.#subs.delete(key);
37
+ this.#stats.activeSubscriptions--;
38
+ }
39
+ }
40
+ /** Release all subscriptions held by a consumer. */
41
+ releaseAllForConsumer(consumer) {
42
+ for (const [key, sub] of this.#subs) {
43
+ ;
44
+ sub.consumers.delete(consumer);
45
+ if (sub.consumers.size === 0) {
46
+ this.#subs.delete(key);
47
+ this.#stats.activeSubscriptions--;
48
+ }
49
+ }
50
+ }
51
+ /** Report a subscription failure. */
52
+ reportFailure(key, error) {
53
+ const sub = this.#subs.get(key);
54
+ if (sub) this.#failedCb?.({ key, consumers: sub.consumers, error });
55
+ }
56
+ /** Get stats. */
57
+ get stats() {
58
+ return this.#stats;
59
+ }
60
+ /** Clean up all subscriptions. */
61
+ dispose() {
62
+ this.#subs.clear();
63
+ this.#failedCb = null;
64
+ this.#stats.activeSubscriptions = 0;
65
+ }
66
+ /** Number of active subscriptions. */
67
+ get size() {
68
+ return this.#subs.size;
69
+ }
70
+ };
71
+
72
+ // src/track-session.ts
73
+ import { fecBlockBudgetMs } from "@blockcast/mmt-fec";
74
+ function computeFecLossWindowMs(fecInterleaveMs, fecK, jitterBufferMs) {
75
+ return computeFecDeliveryWindowMs({
76
+ interleaveDepthMs: fecInterleaveMs,
77
+ sourceSymbols: fecK,
78
+ jitterBufferMs
79
+ });
80
+ }
81
+ function computeFecDeliveryWindowMs(config) {
82
+ const fecInterleaveMs = config.interleaveDepthMs;
83
+ const fecK = config.sourceSymbols;
84
+ if (!Number.isFinite(fecInterleaveMs) || fecInterleaveMs <= 0) {
85
+ throw new Error(
86
+ `[TrackSession] fecInterleaveMs=${fecInterleaveMs}. Derive a positive FEC interleave window from the stream catalog.`
87
+ );
88
+ }
89
+ if (!Number.isFinite(fecK) || fecK <= 0) {
90
+ throw new Error(
91
+ `[TrackSession] fecK=${fecK}. Derive a positive FEC source-symbol count from the stream catalog.`
92
+ );
93
+ }
94
+ if (config.jitterBufferMs === void 0) return Math.ceil(fecInterleaveMs);
95
+ return fecBlockBudgetMs(fecInterleaveMs, config.jitterBufferMs);
96
+ }
97
+ function computeFecDeliveryWindowMediaUnits(config, timestampTimescale) {
98
+ if (!Number.isFinite(timestampTimescale) || timestampTimescale <= 0) {
99
+ throw new Error(
100
+ `[TrackSession] timestampTimescale=${timestampTimescale}. Derive a positive media timescale from the container.`
101
+ );
102
+ }
103
+ const deliveryWindow = Math.ceil(
104
+ computeFecDeliveryWindowMs(config) * timestampTimescale / 1e3
105
+ );
106
+ if (!Number.isSafeInteger(deliveryWindow)) {
107
+ throw new Error("[TrackSession] FEC delivery window exceeds the media timestamp range.");
108
+ }
109
+ return deliveryWindow;
110
+ }
111
+ var TrackSession = class {
112
+ #state = "idle";
113
+ #subscription = null;
114
+ #hysteresisTimer = null;
115
+ #joinDeadlineTimer = null;
116
+ #previousPrimary = null;
117
+ #manager;
118
+ // Single suppression authority flag (BLO-9413 failback coherence): every
119
+ // suppress this session fires is recorded here, and every path that leaves
120
+ // a suppressed state unwinds through #unsuppress(). Before this flag,
121
+ // unsubscribe() only un-suppressed from multicast/amt — a session torn down
122
+ // from `failing` (exactly where a starving track sits) was re-subscribed to
123
+ // unicast with the host's media still muted: MoQ playing into a dead sink.
124
+ #suppressFired = false;
125
+ // Single FEC authority flag: set by the fec-setup edges (joinStarted,
126
+ // enterUnicastFallback), cleared by the fec-teardown edge in #transition.
127
+ // Setup and teardown are paired by construction, so a takeover timeout that
128
+ // parks the session in `unicast` keeps the decoder the still-joined
129
+ // transport is feeding, and the later unsubscribe still tears it down.
130
+ #fecArmed = false;
131
+ constructor(config, manager) {
132
+ this.config = config;
133
+ this.#manager = manager;
134
+ }
135
+ // -----------------------------------------------------------------------
136
+ // State
137
+ // -----------------------------------------------------------------------
138
+ get state() {
139
+ return this.#state;
140
+ }
141
+ get subscription() {
142
+ return this.#subscription;
143
+ }
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() {
147
+ return this.#suppressFired;
148
+ }
149
+ /** Current active transport mode, or null if idle. */
150
+ get transport() {
151
+ switch (this.#state) {
152
+ case "multicast":
153
+ return "multicast";
154
+ case "amt":
155
+ return "amt";
156
+ case "unicast":
157
+ return "moq";
158
+ case "unicast-fallback":
159
+ return "moq";
160
+ // SSM bridge absent — MoQ unicast is the only source
161
+ case "joining":
162
+ return "moq";
163
+ // MoQ still primary during join
164
+ case "failing":
165
+ return this.#previousPrimary;
166
+ default:
167
+ return null;
168
+ }
169
+ }
170
+ // -----------------------------------------------------------------------
171
+ // Computed (no magic numbers)
172
+ // -----------------------------------------------------------------------
173
+ /** Audio worklet latency: max(fecInterleaveMs, frameDurationMs * fecK).
174
+ * Returns undefined if frame duration unknown (no initData). */
175
+ get audioLatencyMs() {
176
+ const fd = this.frameDurationMs;
177
+ if (fd === void 0) {
178
+ return this.config.fecInterleaveMs > 0 ? this.config.fecInterleaveMs : void 0;
179
+ }
180
+ return Math.max(this.config.fecInterleaveMs, fd * this.config.fecK);
181
+ }
182
+ /** Frame duration in ms, derived from frameSamples + sampleRate. */
183
+ get frameDurationMs() {
184
+ const { frameSamples, sampleRate } = this.config;
185
+ if (!frameSamples || !sampleRate || sampleRate <= 0) return void 0;
186
+ return frameSamples / sampleRate * 1e3;
187
+ }
188
+ // -----------------------------------------------------------------------
189
+ // Transitions (Patent Claim 9)
190
+ // -----------------------------------------------------------------------
191
+ /** idle → unicast: player subscribes to this track. */
192
+ subscribe() {
193
+ if (this.#state !== "idle") return;
194
+ this.#transition("unicast");
195
+ if (this.config.trackType === "audio") {
196
+ const latency = this.audioLatencyMs;
197
+ if (latency !== void 0) {
198
+ this.#manager.mmtp?.onTrackEvent?.(this.config.trackName, { type: "latency", latencyMs: latency }, this.config);
199
+ }
200
+ }
201
+ }
202
+ /** unicast → joining: multicast/AMT capability detected, join in progress. */
203
+ joinStarted() {
204
+ if (this.#state !== "unicast") return;
205
+ this.#transition("joining");
206
+ this.#armFec();
207
+ }
208
+ /**
209
+ * any non-fallback state → unicast-fallback. Used when the SSM bridge is
210
+ * absent (vanilla Chromium / no extension) and the host falls back to a
211
+ * MoQ unicast subscription per track. Terminal-ish: activateMulticast,
212
+ * failbackAll, and transportFailed are no-ops while in this state.
213
+ *
214
+ * Fires fec-setup so the per-track repair worker spins up — repair packets
215
+ * still flow over the MoQ repair-track subscription, so FEC source+repair
216
+ * can converge as in the multicast path.
217
+ *
218
+ * Audio latency is NOT re-emitted here: subscribe() already fires latency
219
+ * once on the idle → unicast edge, and enterUnicastFallback is only ever
220
+ * reached from a non-idle state (SessionManager skips idle sessions).
221
+ */
222
+ enterUnicastFallback() {
223
+ if (this.#state === "unicast-fallback") return;
224
+ this.#clearHysteresis();
225
+ this.#transition("unicast-fallback");
226
+ this.#suppress();
227
+ this.#armFec();
228
+ }
229
+ /**
230
+ * unicast-fallback → unicast. Called when the SSM bridge appears mid-session
231
+ * (extension installed after fallback engaged). Host first aborts the fallback
232
+ * drainers, then transitions sessions back to unicast so the regular
233
+ * multicast/AMT preference chain can take over via joinStarted().
234
+ */
235
+ exitUnicastFallback() {
236
+ if (this.#state !== "unicast-fallback") return;
237
+ this.#transition("unicast");
238
+ this.#unsuppress();
239
+ }
240
+ /**
241
+ * joining → multicast or amt: RAP received on the joined transport (Claim 9d).
242
+ * Resets audio worklet, then suppresses MoQ.
243
+ */
244
+ rapReceived(mode) {
245
+ if (this.#state !== "joining") return;
246
+ this.#previousPrimary = mode;
247
+ this.#transition(mode);
248
+ if (this.config.trackType === "audio") {
249
+ this.#manager.mmtp?.onTrackEvent?.(this.config.trackName, { type: "reset" }, this.config);
250
+ }
251
+ this.#suppress();
252
+ }
253
+ /** multicast/amt → failing: loss detected, start hysteresis timer (Claim 9f). */
254
+ lossDetected() {
255
+ if (this.#state !== "multicast" && this.#state !== "amt") return;
256
+ this.#previousPrimary = this.#state;
257
+ this.#transition("failing");
258
+ const hysteresisMs = computeFecLossWindowMs(
259
+ this.config.fecInterleaveMs,
260
+ this.config.fecK,
261
+ this.config.fecReorderToleranceMs
262
+ );
263
+ this.#hysteresisTimer = setTimeout(() => {
264
+ this.hysteresisExpired();
265
+ }, hysteresisMs);
266
+ }
267
+ /** failing → previous primary: loss recovered within hysteresis window. */
268
+ lossRecovered() {
269
+ if (this.#state !== "failing") return;
270
+ this.#clearHysteresis();
271
+ if (this.#previousPrimary) {
272
+ this.#transition(this.#previousPrimary);
273
+ }
274
+ }
275
+ /**
276
+ * Transport failed (AMT relay down, multicast interface gone).
277
+ * Try next transport in preference chain.
278
+ */
279
+ transportFailed() {
280
+ this.#clearHysteresis();
281
+ if (this.#state === "unicast-fallback") return;
282
+ const current = this.#previousPrimary ?? this.transport;
283
+ const prefs = this.config.preferredTransports;
284
+ const currentIdx = current ? prefs.indexOf(current) : -1;
285
+ const nextMode = prefs[currentIdx + 1];
286
+ if (nextMode !== void 0 && nextMode !== "moq") {
287
+ this.#previousPrimary = nextMode;
288
+ this.#transition("joining");
289
+ this.#unsuppress();
290
+ return;
291
+ }
292
+ const from = this.#state;
293
+ this.#previousPrimary = null;
294
+ this.#transition("unicast");
295
+ this.#disarmFec();
296
+ this.#unsuppress();
297
+ if (from !== "unicast" && this.config.trackType === "audio") {
298
+ this.#manager.mmtp?.onTrackEvent?.(this.config.trackName, { type: "reset" }, this.config);
299
+ }
300
+ }
301
+ /** Hysteresis expired → failback to next transport (Claim 9g). */
302
+ hysteresisExpired() {
303
+ if (this.#state !== "failing") return;
304
+ this.#clearHysteresis();
305
+ this.transportFailed();
306
+ }
307
+ /** → idle: player unsubscribes / tab close / cleanup. */
308
+ unsubscribe() {
309
+ this.#clearHysteresis();
310
+ if (this.#state !== "idle") {
311
+ this.#transition("idle");
312
+ this.#unsuppress();
313
+ }
314
+ }
315
+ /** True when SessionManager.enterUnicastFallback put this track into the
316
+ * host-driven unicast subscription mode. Host can iterate sessions to
317
+ * decide whether to keep its fallback drainer alive across MediaRouter
318
+ * arbitration events. */
319
+ get isUnicastFallback() {
320
+ return this.#state === "unicast-fallback";
321
+ }
322
+ /**
323
+ * True while this track owns a FEC decoder (fec-setup fired, fec-teardown
324
+ * not yet). Stays true across a takeover timeout that parked the session in
325
+ * `unicast`; SessionManager.failbackAll uses it to release such sessions.
326
+ */
327
+ get isFecArmed() {
328
+ return this.#fecArmed;
329
+ }
330
+ /**
331
+ * Start the deadline a `joining` entry deferred while the join was inactive
332
+ * (SessionManager.joinActive). The track gets the FULL deadline from here,
333
+ * because that is when media can first arrive. No-op outside `joining` and
334
+ * when a deadline is already running, so it never shortens or restarts one.
335
+ *
336
+ * The `joinActive` guard is what makes this safe to call from anywhere: a
337
+ * track parked in `joining` with a deferred (null) timer satisfies the other
338
+ * two, so without it a host calling this while the join is still inactive
339
+ * would arm the exact deadline the gate exists to defer -- silently
340
+ * reinstating BLO-34289. It is a no-op for the internal caller, which writes
341
+ * `#joinActive = true` before iterating the sessions.
342
+ */
343
+ armDeferredJoinDeadline() {
344
+ if (this.#state !== "joining" || this.#joinDeadlineTimer !== null) return;
345
+ if (!this.#manager.joinActive) return;
346
+ this.#armJoinDeadline(this.#manager.takeoverDeadlineMs);
347
+ }
348
+ dispose() {
349
+ this.#clearHysteresis();
350
+ this.#clearJoinDeadline();
351
+ this.#state = "idle";
352
+ this.#subscription = null;
353
+ this.#disarmFec();
354
+ }
355
+ // -----------------------------------------------------------------------
356
+ // Internal
357
+ // -----------------------------------------------------------------------
358
+ #transition(to, opts) {
359
+ const from = this.#state;
360
+ if (from === to) return;
361
+ const joinDeadlineMs = to === "joining" ? this.#manager.takeoverDeadlineMs : void 0;
362
+ this.#state = to;
363
+ if (from === "joining") this.#clearJoinDeadline();
364
+ if (joinDeadlineMs !== void 0 && this.#manager.joinActive) {
365
+ this.#armJoinDeadline(joinDeadlineMs);
366
+ }
367
+ const fecActive = (s) => s === "joining" || s === "multicast" || s === "amt" || s === "failing" || s === "unicast-fallback";
368
+ if (!fecActive(to) && !opts?.retainFec) this.#disarmFec();
369
+ this.#manager.callbacks?.onStateChange?.(this.config.trackName, from, to);
370
+ }
371
+ #clearHysteresis() {
372
+ if (this.#hysteresisTimer !== null) {
373
+ clearTimeout(this.#hysteresisTimer);
374
+ this.#hysteresisTimer = null;
375
+ }
376
+ }
377
+ #armJoinDeadline(deadlineMs) {
378
+ this.#clearJoinDeadline();
379
+ if (deadlineMs === 0) return;
380
+ this.#joinDeadlineTimer = setTimeout(() => {
381
+ this.#joinDeadlineTimer = null;
382
+ if (this.#state !== "joining") return;
383
+ this.#transition("unicast", { retainFec: true });
384
+ this.#manager.callbacks?.onTakeoverTimeout?.(this.config.trackName);
385
+ }, deadlineMs);
386
+ }
387
+ #clearJoinDeadline() {
388
+ if (this.#joinDeadlineTimer !== null) {
389
+ clearTimeout(this.#joinDeadlineTimer);
390
+ this.#joinDeadlineTimer = null;
391
+ }
392
+ }
393
+ /** Fire fec-setup exactly once per FEC epoch. */
394
+ #armFec() {
395
+ if (this.#fecArmed) return;
396
+ this.#fecArmed = true;
397
+ this.#manager.mmtp?.onTrackEvent?.(this.config.trackName, { type: "fec-setup" }, this.config);
398
+ }
399
+ /** Fire fec-teardown for an armed decoder; no-op when none is armed. */
400
+ #disarmFec() {
401
+ if (!this.#fecArmed) return;
402
+ this.#fecArmed = false;
403
+ this.#manager.mmtp?.onTrackEvent?.(this.config.trackName, { type: "fec-teardown" }, this.config);
404
+ }
405
+ /** Fire onSuppress(true) exactly once per suppression epoch. */
406
+ #suppress() {
407
+ if (this.#suppressFired) return;
408
+ this.#suppressFired = true;
409
+ this.#manager.callbacks?.onSuppress?.(this.config.trackName, true);
410
+ }
411
+ /** Unwind an outstanding suppression; no-op when none is outstanding. */
412
+ #unsuppress() {
413
+ if (!this.#suppressFired) return;
414
+ this.#suppressFired = false;
415
+ this.#manager.callbacks?.onSuppress?.(this.config.trackName, false);
416
+ }
417
+ };
418
+ var MAX_TAKEOVER_DEADLINE_MS = 2147483647;
419
+ var JOIN_DEFER_WARN_MS = 3e4;
420
+ var SessionManager = class {
421
+ constructor(poolOptions) {
422
+ this.sessions = /* @__PURE__ */ new Map();
423
+ this.callbacks = null;
424
+ this.#takeoverDeadlineMs = void 0;
425
+ this.#joinActive = true;
426
+ this.#joinDeferWarnTimer = null;
427
+ this.pool = new TransportPool(poolOptions);
428
+ this.pool.onSubscriptionFailed((sub) => {
429
+ for (const trackName of sub.consumers) {
430
+ const session = this.sessions.get(trackName);
431
+ if (session) session.transportFailed();
432
+ }
433
+ });
434
+ }
435
+ #takeoverDeadlineMs;
436
+ #joinActive;
437
+ #joinDeferWarnTimer;
438
+ /**
439
+ * Takeover deadline (BLO-9413/D9): the time a session may sit in `joining`
440
+ * without a RAP before returning to `unicast` and firing onTakeoverTimeout.
441
+ * MoQ is never suppressed during `joining`, so expiry abandons the takeover
442
+ * without a playback glitch. The host derives it from the catalog (RAP
443
+ * cadence from groupDurationTicks/timescale plus the signaled FEC delivery
444
+ * window or reorder tolerance) and sets it before addTrack(). There is no
445
+ * default: an unset value fails addTrack() closed, and reading the getter
446
+ * before assignment throws the same way, so no host ever holds a
447
+ * `number | undefined` it could coalesce back into a default.
448
+ * `hasTakeoverDeadline` answers whether one was admitted. A declared 0
449
+ * disables the deadline. The value is an integer number of milliseconds:
450
+ * setTimeout truncates fractions, so a host that divides ticks by a
451
+ * timescale must round before assigning.
452
+ *
453
+ * Assignment validates, so the diagnostic lands at the host's own call site.
454
+ * That is what bounds the blast radius: `joining` is entered from
455
+ * joinStarted(), from the transportFailed() failover branch -- itself
456
+ * reachable from a setTimeout via hysteresisExpired(), where no caller could
457
+ * catch a throw -- and from the activateMulticast()/activateAmt()/pool-failure
458
+ * loops, where a throw on one session would abandon its siblings mid-loop
459
+ * (the split-brain those loops exist to prevent). Refusing a bad value at
460
+ * assignment means no host mutation can make an already-admitted session
461
+ * throw out of a transport edge.
462
+ */
463
+ get takeoverDeadlineMs() {
464
+ return this.#requireTakeoverDeadlineMs();
465
+ }
466
+ set takeoverDeadlineMs(value) {
467
+ if (!Number.isInteger(value) || value < 0 || value > MAX_TAKEOVER_DEADLINE_MS) {
468
+ throw new Error(
469
+ `[SessionManager] takeoverDeadlineMs must be an integer from 0 to ${MAX_TAKEOVER_DEADLINE_MS} (0 disables it, larger values overflow setTimeout); got ${String(value)}`
470
+ );
471
+ }
472
+ this.#takeoverDeadlineMs = value;
473
+ }
474
+ /** True once the host has admitted a deadline; a declared 0 counts. */
475
+ get hasTakeoverDeadline() {
476
+ return this.#takeoverDeadlineMs !== void 0;
477
+ }
478
+ /**
479
+ * Whether the transport the joining tracks are waiting on is actually
480
+ * subscribed. The takeover deadline is a media-arrival budget and media
481
+ * cannot arrive before the join exists, so while this is false, entering
482
+ * `joining` arms no deadline; flipping it true starts the FULL deadline for
483
+ * every track already parked there.
484
+ *
485
+ * Default true, which is the arm-on-`joining` behaviour every host had
486
+ * before: a host that only calls joinStarted() after its own join resolves
487
+ * (moqtail-private's player, post-BLO-33339) is already at the right edge and
488
+ * needs no gate. A host that arms joinStarted() up front — to have FEC
489
+ * decoders ready before the first datagram — sets this false before addTrack()
490
+ * and true when its subscribe settles. Charging a slow subscribe (bridge
491
+ * reconnect, AMT relay handshake) against the media budget expired the
492
+ * deadline before the subscription existed and abandoned the join on the
493
+ * happy path. BLO-34289.
494
+ *
495
+ * The deadline is a media budget (group cadence plus FEC delivery window) and
496
+ * budgets nothing for reaching the stream, so ideally it starts at
497
+ * MulticastTransport.onDataPlaneLive, the join's first accepted packet. Over
498
+ * AMT that is measurably later than a settled subscribe: the subscribe
499
+ * settles once the gateway has sent its Membership Update, and the relay's
500
+ * upstream join plus a path RTT (0.4-0.8 s measured to the prod relay) still
501
+ * precede the first packet. But RFC 7450 gives a gateway no signal that the
502
+ * relay has traffic for its (S,G), so a join whose source never sends never
503
+ * reaches that edge. Starting the deadline there is therefore sound only when
504
+ * the provider bounds the join phase itself, with a typed subscription error
505
+ * for a join that delivers nothing (MulticastTransport forwards it to
506
+ * onFailback). A host whose provider makes no such guarantee flips this true
507
+ * when the subscribe settles and accepts that join latency is charged to the
508
+ * media budget; holding it until the first packet would park a silent join
509
+ * in `joining` forever.
510
+ *
511
+ * The flag tracks the host's primary join, not per-track transport state. A
512
+ * track that fails over to the next transport in its own chain while this is
513
+ * false (transportFailed's failover branch also enters `joining`) has that
514
+ * deadline gated on the primary join activating, not on its own transport.
515
+ * Under the documented usage -- false once at setup, true once the subscribe
516
+ * settles -- the two coincide.
517
+ *
518
+ * The gate is on the ENTRY into `joining`, and false cannot take back a
519
+ * deadline already running: the `true -> false` edge arms the warn below and
520
+ * clears nothing. So set it false BEFORE the `joining` entry it is meant to
521
+ * gate. A host that instead flipped it false after a `transportFailed()`
522
+ * failover had already entered `joining` would leave the full deadline
523
+ * counting against a subscribe that had not begun -- BLO-34289 again, on the
524
+ * failover edge. Clearing running deadlines on that edge is deliberately NOT
525
+ * done: this flag is manager-wide, so one transport's brief false would
526
+ * cancel an unrelated track's live deadline and then re-arm it at FULL length
527
+ * on the next activation (armDeferredJoinDeadline sees `joining` + a null
528
+ * timer and cannot tell a cleared deadline from a deferred one). Every
529
+ * unrelated transport blip would restart the whole budget, so under repeated
530
+ * failover a track that should have timed out is extended indefinitely and
531
+ * never advances. Only a false that never returns true loses the timer
532
+ * outright, and JOIN_DEFER_WARN_MS already covers that.
533
+ *
534
+ * Leaving this false is not free: see JOIN_DEFER_WARN_MS.
535
+ */
536
+ get joinActive() {
537
+ return this.#joinActive;
538
+ }
539
+ set joinActive(active) {
540
+ const wasActive = this.#joinActive;
541
+ this.#joinActive = active;
542
+ if (!active) {
543
+ if (wasActive) this.#armJoinDeferWarn();
544
+ return;
545
+ }
546
+ this.#clearJoinDeferWarn();
547
+ if (wasActive) return;
548
+ for (const [, session] of this.sessions) session.armDeferredJoinDeadline();
549
+ }
550
+ #armJoinDeferWarn() {
551
+ this.#joinDeferWarnTimer = setTimeout(() => {
552
+ this.#joinDeferWarnTimer = null;
553
+ const deferred = [...this.sessions.values()].filter((s) => s.state === "joining").length;
554
+ console.warn(
555
+ `[SessionManager] joinActive has been false for ${JOIN_DEFER_WARN_MS} ms and ${deferred} track(s) sit in 'joining' with no takeover deadline. Set joinActive = true when the subscribe settles, on every exit path including failures, or these tracks never time out, never release their FEC decoders, and never advance to the next transport.`
556
+ );
557
+ }, JOIN_DEFER_WARN_MS);
558
+ }
559
+ #clearJoinDeferWarn() {
560
+ if (this.#joinDeferWarnTimer === null) return;
561
+ clearTimeout(this.#joinDeferWarnTimer);
562
+ this.#joinDeferWarnTimer = null;
563
+ }
564
+ /** Narrow to MMTP callbacks (onTrackEvent). Safe — optional chaining handles PIM-only consumers. */
565
+ get mmtp() {
566
+ return this.callbacks;
567
+ }
568
+ // -----------------------------------------------------------------------
569
+ // Track management
570
+ // -----------------------------------------------------------------------
571
+ /**
572
+ * The admitted takeover deadline. Throws only when the host never set one,
573
+ * every other invalid value being refused by the setter, and returns a
574
+ * declared 0 as 0. The getter and addTrack() both route through it, so a
575
+ * session cannot exist without an admitted deadline, which is what makes
576
+ * the #transition() read unable to throw on an already-admitted session.
577
+ */
578
+ #requireTakeoverDeadlineMs() {
579
+ const value = this.#takeoverDeadlineMs;
580
+ if (value === void 0) {
581
+ throw new Error(
582
+ "[SessionManager] takeoverDeadlineMs is unset; set a catalog-derived takeover deadline (0 disables it) before adding tracks"
583
+ );
584
+ }
585
+ return value;
586
+ }
587
+ /** Add a track session from catalog config. */
588
+ addTrack(config) {
589
+ if (this.sessions.has(config.trackName)) {
590
+ throw new Error(`[SessionManager] Track "${config.trackName}" already exists`);
591
+ }
592
+ this.#requireTakeoverDeadlineMs();
593
+ const session = new TrackSession(config, this);
594
+ this.sessions.set(config.trackName, session);
595
+ return session;
596
+ }
597
+ /** Remove a track session. Releases subscription with grace period. */
598
+ removeTrack(trackName) {
599
+ const session = this.sessions.get(trackName);
600
+ if (!session) return;
601
+ session.unsubscribe();
602
+ const subKey = session.config.multicastKey ?? session.config.moqTrackName;
603
+ if (subKey) this.pool.releaseSubscription(subKey, trackName);
604
+ session.dispose();
605
+ this.sessions.delete(trackName);
606
+ }
607
+ // -----------------------------------------------------------------------
608
+ // Atomic multi-track operations
609
+ // -----------------------------------------------------------------------
610
+ /**
611
+ * All tracks with multicast RAP → multicast state (atomic).
612
+ * Called when MediaRouter fires onSourceSwitch('multicast').
613
+ * Prevents split-brain between video and audio.
614
+ *
615
+ * A takeover deadline can return a track from `joining` to `unicast` while
616
+ * the multicast socket keeps delivering packets and the track keeps its FEC
617
+ * decoder armed. If a valid RAP arrives later, that late-RAP edge suppresses
618
+ * unicast and promotes multicast without a second fec-setup.
619
+ */
620
+ activateMulticast() {
621
+ for (const [, session] of this.sessions) {
622
+ if (session.state === "unicast") {
623
+ session.joinStarted();
624
+ }
625
+ if (session.state === "joining") {
626
+ session.rapReceived("multicast");
627
+ }
628
+ }
629
+ }
630
+ /**
631
+ * All tracks with AMT RAP → amt state (atomic).
632
+ */
633
+ activateAmt() {
634
+ for (const [, session] of this.sessions) {
635
+ if (session.state === "unicast") {
636
+ session.joinStarted();
637
+ }
638
+ if (session.state === "joining") {
639
+ session.rapReceived("amt");
640
+ }
641
+ }
642
+ }
643
+ /**
644
+ * All tracks → unicast (failback, atomic).
645
+ * Called when MulticastManager fires onFailback().
646
+ * unicast-fallback sessions are skipped — the host owns those subscriptions
647
+ * and they must drain uninterrupted across transport-state events.
648
+ *
649
+ * Coherence invariant (BLO-9413): after this returns, every non-fallback
650
+ * session is `unicast` (or `idle`), unsuppressed, and without a FEC decoder.
651
+ * unsubscribe() unwinds any outstanding suppression regardless of the state
652
+ * it tears down from (`failing` included; see TrackSession.#suppressFired),
653
+ * and a session that a takeover timeout parked in `unicast` with its decoder
654
+ * still armed is cycled too, because this transport edge is what releases
655
+ * that decoder (unsubscribe fires fec-teardown).
656
+ */
657
+ failbackAll() {
658
+ for (const [, session] of this.sessions) {
659
+ const parkedWithFec = session.state === "unicast" && session.isFecArmed;
660
+ if (parkedWithFec || session.state !== "idle" && session.state !== "unicast" && session.state !== "unicast-fallback") {
661
+ session.unsubscribe();
662
+ session.subscribe();
663
+ }
664
+ }
665
+ }
666
+ /**
667
+ * All tracks → unicast-fallback (atomic).
668
+ * Called by the host when the multicast gateway is absent and
669
+ * the player will subscribe to source tracks over MoQ unicast and feed
670
+ * packets via MulticastManager.feedUnicastSource() (or manager.router
671
+ * directly). Sessions in this state stay terminal until the host calls
672
+ * unsubscribe() / disposes the SessionManager.
673
+ */
674
+ enterUnicastFallback() {
675
+ for (const [, session] of this.sessions) {
676
+ if (session.state === "idle") continue;
677
+ session.enterUnicastFallback();
678
+ }
679
+ }
680
+ /**
681
+ * True if any session is currently in unicast-fallback. Hosts use this to
682
+ * gate `multicastTrack.close()` on failback events — closing the shared
683
+ * broadcast would kill the host's fallback drainers.
684
+ */
685
+ hasActiveFallback() {
686
+ for (const [, session] of this.sessions) {
687
+ if (session.isUnicastFallback) return true;
688
+ }
689
+ return false;
690
+ }
691
+ /**
692
+ * All fallback tracks → unicast (atomic).
693
+ * Called when the SSM bridge appears mid-session and the host has aborted
694
+ * the fallback drainers. The session re-enters the regular preference chain
695
+ * via joinStarted() (issued by the host immediately after).
696
+ */
697
+ exitUnicastFallback() {
698
+ for (const [, session] of this.sessions) {
699
+ if (session.isUnicastFallback) session.exitUnicastFallback();
700
+ }
701
+ }
702
+ // -----------------------------------------------------------------------
703
+ // Cleanup lifecycle
704
+ // -----------------------------------------------------------------------
705
+ /** Tab closed — release all subscriptions for this tab (grace period). */
706
+ tabClosed(tabId) {
707
+ for (const [trackName, session] of this.sessions) {
708
+ session.unsubscribe();
709
+ this.pool.releaseAllForConsumer(trackName);
710
+ }
711
+ }
712
+ /** Bridge WebTransport connection dropped — same as tab close. */
713
+ bridgeDisconnected() {
714
+ this.tabClosed("bridge");
715
+ }
716
+ /**
717
+ * Track selection changed (user or ABR).
718
+ * Old track released (grace period), new track subscribed.
719
+ */
720
+ trackSelectionChanged(oldTrackName, newConfig) {
721
+ this.removeTrack(oldTrackName);
722
+ const session = this.addTrack(newConfig);
723
+ session.subscribe();
724
+ }
725
+ // -----------------------------------------------------------------------
726
+ // Query
727
+ // -----------------------------------------------------------------------
728
+ /** Get a track session by name. */
729
+ getTrack(trackName) {
730
+ return this.sessions.get(trackName);
731
+ }
732
+ // -----------------------------------------------------------------------
733
+ // Cleanup
734
+ // -----------------------------------------------------------------------
735
+ dispose() {
736
+ this.#clearJoinDeferWarn();
737
+ for (const [, session] of this.sessions) {
738
+ session.dispose();
739
+ }
740
+ this.sessions.clear();
741
+ this.pool.dispose();
742
+ this.callbacks = null;
743
+ }
744
+ };
745
+ export {
746
+ JOIN_DEFER_WARN_MS,
747
+ MAX_TAKEOVER_DEADLINE_MS,
748
+ SessionManager,
749
+ TrackSession,
750
+ computeFecDeliveryWindowMediaUnits,
751
+ computeFecDeliveryWindowMs,
752
+ computeFecLossWindowMs
753
+ };
754
+ //# sourceMappingURL=track-session.js.map