@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,75 @@
1
+ /**
2
+ * Receiver-measured multicast delivery gap (BLO-35597).
3
+ *
4
+ * The FEC layer gives a block's multicast symbols a late-symbol wait before it
5
+ * declares the block over: the catalog block span plus an allowance for the
6
+ * path's arrival jitter. The catalog can only signal a tolerance it knows in
7
+ * advance (`fec.reorderToleranceMs`); the path the receiver actually sits on
8
+ * is measured here, in-band, from the arrival times of the multicast
9
+ * datagrams themselves.
10
+ *
11
+ * Which statistic, and why not RFC 3550 interarrival jitter
12
+ * ---------------------------------------------------------
13
+ * The wait is an inactivity bound: a block fails when no symbol reaches it for
14
+ * the wait. What it has to outlast is therefore the longest silence the
15
+ * delivery path produces, not the path's average variation.
16
+ *
17
+ * RFC 3550 §6.4.1 `J` is a mean absolute transit-time difference smoothed with
18
+ * gain 1/16. It is the right number for sizing a playout buffer against steady
19
+ * jitter, and the wrong one for a bimodal path. On the path this was measured
20
+ * on (iPhone Safari over Wi-Fi, prod AMT, 2026-09-28, 36,657 datagrams in 57 s)
21
+ * arrivals were either back-to-back (p90 inter-arrival 2 ms) or stalled for
22
+ * one 802.11 power-save beacon interval (102.4 ms; 135 stalls of 50-110 ms,
23
+ * recurring every ~511 ms at the median). Applied to that trace, `J` has a p99
24
+ * of 6 ms: a wait of span + J expires inside every stall, and the stall's
25
+ * symbols then arrive at a block that has already been failed.
26
+ *
27
+ * So the estimator is the largest delivery gap observed over a trailing
28
+ * window: the time between consecutive multicast datagram arrivals, measured
29
+ * on the page thread where the FEC deadlines themselves run (a main-thread or
30
+ * bridge-batching delay is as real to those timers as a radio stall). It is
31
+ * receiver-wide rather than per stream because the stall is a property of the
32
+ * link every stream shares; a quiet stream learns the gap from a busy one.
33
+ *
34
+ * Only a gap that ended in delivery counts. A silence is closed by the first
35
+ * packet after it; if that packet is the in-sequence successor (MMTP
36
+ * packet_sequence_number + 1) of the last one its packet_id delivered, nothing
37
+ * of that flow was lost across the silence: its packets were held and then
38
+ * delivered, which is exactly the lateness a longer wait turns from a failed
39
+ * block into a completed one. If the sequence jumped, the silence was (at
40
+ * least partly) loss -- a tunnel outage, a publisher pause -- and waiting
41
+ * longer would not have delivered anything, so the gap is not taken as
42
+ * jitter.
43
+ *
44
+ * The trailing window is supplied by the caller from the catalog. It must be
45
+ * long enough to contain one recurrence of the stall it has to remember, and
46
+ * nothing here can know that recurrence in advance. The window is also the
47
+ * largest gap reported: a silence longer than the catalog horizon is outside
48
+ * what the estimator models (a backgrounded tab, a long GC), and every bound
49
+ * derived from the wait (block lifetime, terminal retention, the release
50
+ * gate's hold ceiling) must stay a catalog quantity rather than a measurement.
51
+ * `undefined` means no catalog horizon is known: nothing bounds the gap, so
52
+ * none is reported and the catalog tolerance alone applies.
53
+ */
54
+ export declare class DeliveryGapEstimator {
55
+ #private;
56
+ /**
57
+ * @param windowMs trailing window in ms, which also caps the reported gap,
58
+ * or undefined when the catalog gives none (no gap is reported).
59
+ */
60
+ setWindowMs(windowMs: number | undefined): void;
61
+ get windowMs(): number | undefined;
62
+ /**
63
+ * Record one multicast datagram arrival at receiver time `nowMs`, carrying
64
+ * MMTP `packetSequenceNumber` (32-bit, per packet_id) on `packetId`.
65
+ */
66
+ noteArrival(nowMs: number, packetId: number, packetSequenceNumber: number): void;
67
+ /**
68
+ * Largest gap observed within the window ending at `nowMs`, at most the
69
+ * window itself; 0 if none or when no window is set.
70
+ */
71
+ peakGapMs(nowMs: number): number;
72
+ /** Forget everything: a new delivery path starts with no measurement. */
73
+ reset(): void;
74
+ }
75
+ //# sourceMappingURL=delivery-gap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-gap.d.ts","sourceRoot":"","sources":["../src/delivery-gap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,qBAAa,oBAAoB;;IAc/B;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAS/C,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,IAAI;IAsBhF;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOhC,yEAAyE;IACzE,KAAK,IAAI,IAAI;CAwBd"}
@@ -0,0 +1,88 @@
1
+ // src/delivery-gap.ts
2
+ var DeliveryGapEstimator = class {
3
+ /** Most recent arrival, or undefined before the first one since reset. */
4
+ #lastArrivalMs;
5
+ /** Last MMTP packet_sequence_number seen per packet_id. */
6
+ #lastSequence = /* @__PURE__ */ new Map();
7
+ /**
8
+ * Monotonic deque of (arrivalMs, gapMs): gaps strictly decrease from head to
9
+ * tail, so the head is the window maximum. Amortized O(1) per arrival.
10
+ */
11
+ #times = [];
12
+ #gaps = [];
13
+ #head = 0;
14
+ #windowMs;
15
+ /**
16
+ * @param windowMs trailing window in ms, which also caps the reported gap,
17
+ * or undefined when the catalog gives none (no gap is reported).
18
+ */
19
+ setWindowMs(windowMs) {
20
+ if (windowMs !== void 0 && !(Number.isFinite(windowMs) && windowMs > 0)) {
21
+ throw new Error(
22
+ `[DeliveryGap] window must be a finite positive ms value or undefined (got ${windowMs})`
23
+ );
24
+ }
25
+ this.#windowMs = windowMs;
26
+ }
27
+ get windowMs() {
28
+ return this.#windowMs;
29
+ }
30
+ /**
31
+ * Record one multicast datagram arrival at receiver time `nowMs`, carrying
32
+ * MMTP `packetSequenceNumber` (32-bit, per packet_id) on `packetId`.
33
+ */
34
+ noteArrival(nowMs, packetId, packetSequenceNumber) {
35
+ const last = this.#lastArrivalMs;
36
+ const previousSequence = this.#lastSequence.get(packetId);
37
+ this.#lastArrivalMs = nowMs;
38
+ this.#lastSequence.set(packetId, packetSequenceNumber);
39
+ if (last === void 0 || previousSequence === void 0) return;
40
+ if (this.#windowMs === void 0) return;
41
+ if (previousSequence + 1 >>> 0 !== packetSequenceNumber >>> 0) return;
42
+ const gap = nowMs - last;
43
+ this.#evict(nowMs);
44
+ while (this.#gaps.length > this.#head && this.#gaps[this.#gaps.length - 1] <= gap) {
45
+ this.#gaps.pop();
46
+ this.#times.pop();
47
+ }
48
+ this.#gaps.push(gap);
49
+ this.#times.push(nowMs);
50
+ this.#compact();
51
+ }
52
+ /**
53
+ * Largest gap observed within the window ending at `nowMs`, at most the
54
+ * window itself; 0 if none or when no window is set.
55
+ */
56
+ peakGapMs(nowMs) {
57
+ const windowMs = this.#windowMs;
58
+ if (windowMs === void 0) return 0;
59
+ this.#evict(nowMs);
60
+ return this.#gaps.length > this.#head ? Math.min(this.#gaps[this.#head], windowMs) : 0;
61
+ }
62
+ /** Forget everything: a new delivery path starts with no measurement. */
63
+ reset() {
64
+ this.#lastArrivalMs = void 0;
65
+ this.#lastSequence.clear();
66
+ this.#times = [];
67
+ this.#gaps = [];
68
+ this.#head = 0;
69
+ }
70
+ #evict(nowMs) {
71
+ const windowMs = this.#windowMs;
72
+ if (windowMs === void 0) return;
73
+ while (this.#times.length > this.#head && this.#times[this.#head] < nowMs - windowMs) {
74
+ this.#head++;
75
+ }
76
+ }
77
+ #compact() {
78
+ if (this.#head > 0 && this.#head * 2 >= this.#times.length) {
79
+ this.#times = this.#times.slice(this.#head);
80
+ this.#gaps = this.#gaps.slice(this.#head);
81
+ this.#head = 0;
82
+ }
83
+ }
84
+ };
85
+ export {
86
+ DeliveryGapEstimator
87
+ };
88
+ //# sourceMappingURL=delivery-gap.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/delivery-gap.ts"],
4
+ "sourcesContent": ["/**\n * Receiver-measured multicast delivery gap (BLO-35597).\n *\n * The FEC layer gives a block's multicast symbols a late-symbol wait before it\n * declares the block over: the catalog block span plus an allowance for the\n * path's arrival jitter. The catalog can only signal a tolerance it knows in\n * advance (`fec.reorderToleranceMs`); the path the receiver actually sits on\n * is measured here, in-band, from the arrival times of the multicast\n * datagrams themselves.\n *\n * Which statistic, and why not RFC 3550 interarrival jitter\n * ---------------------------------------------------------\n * The wait is an inactivity bound: a block fails when no symbol reaches it for\n * the wait. What it has to outlast is therefore the longest silence the\n * delivery path produces, not the path's average variation.\n *\n * RFC 3550 \u00A76.4.1 `J` is a mean absolute transit-time difference smoothed with\n * gain 1/16. It is the right number for sizing a playout buffer against steady\n * jitter, and the wrong one for a bimodal path. On the path this was measured\n * on (iPhone Safari over Wi-Fi, prod AMT, 2026-09-28, 36,657 datagrams in 57 s)\n * arrivals were either back-to-back (p90 inter-arrival 2 ms) or stalled for\n * one 802.11 power-save beacon interval (102.4 ms; 135 stalls of 50-110 ms,\n * recurring every ~511 ms at the median). Applied to that trace, `J` has a p99\n * of 6 ms: a wait of span + J expires inside every stall, and the stall's\n * symbols then arrive at a block that has already been failed.\n *\n * So the estimator is the largest delivery gap observed over a trailing\n * window: the time between consecutive multicast datagram arrivals, measured\n * on the page thread where the FEC deadlines themselves run (a main-thread or\n * bridge-batching delay is as real to those timers as a radio stall). It is\n * receiver-wide rather than per stream because the stall is a property of the\n * link every stream shares; a quiet stream learns the gap from a busy one.\n *\n * Only a gap that ended in delivery counts. A silence is closed by the first\n * packet after it; if that packet is the in-sequence successor (MMTP\n * packet_sequence_number + 1) of the last one its packet_id delivered, nothing\n * of that flow was lost across the silence: its packets were held and then\n * delivered, which is exactly the lateness a longer wait turns from a failed\n * block into a completed one. If the sequence jumped, the silence was (at\n * least partly) loss -- a tunnel outage, a publisher pause -- and waiting\n * longer would not have delivered anything, so the gap is not taken as\n * jitter.\n *\n * The trailing window is supplied by the caller from the catalog. It must be\n * long enough to contain one recurrence of the stall it has to remember, and\n * nothing here can know that recurrence in advance. The window is also the\n * largest gap reported: a silence longer than the catalog horizon is outside\n * what the estimator models (a backgrounded tab, a long GC), and every bound\n * derived from the wait (block lifetime, terminal retention, the release\n * gate's hold ceiling) must stay a catalog quantity rather than a measurement.\n * `undefined` means no catalog horizon is known: nothing bounds the gap, so\n * none is reported and the catalog tolerance alone applies.\n */\nexport class DeliveryGapEstimator {\n /** Most recent arrival, or undefined before the first one since reset. */\n #lastArrivalMs: number | undefined\n /** Last MMTP packet_sequence_number seen per packet_id. */\n #lastSequence = new Map<number, number>()\n /**\n * Monotonic deque of (arrivalMs, gapMs): gaps strictly decrease from head to\n * tail, so the head is the window maximum. Amortized O(1) per arrival.\n */\n #times: number[] = []\n #gaps: number[] = []\n #head = 0\n #windowMs: number | undefined\n\n /**\n * @param windowMs trailing window in ms, which also caps the reported gap,\n * or undefined when the catalog gives none (no gap is reported).\n */\n setWindowMs(windowMs: number | undefined): void {\n if (windowMs !== undefined && !(Number.isFinite(windowMs) && windowMs > 0)) {\n throw new Error(\n `[DeliveryGap] window must be a finite positive ms value or undefined (got ${windowMs})`,\n )\n }\n this.#windowMs = windowMs\n }\n\n get windowMs(): number | undefined {\n return this.#windowMs\n }\n\n /**\n * Record one multicast datagram arrival at receiver time `nowMs`, carrying\n * MMTP `packetSequenceNumber` (32-bit, per packet_id) on `packetId`.\n */\n noteArrival(nowMs: number, packetId: number, packetSequenceNumber: number): void {\n const last = this.#lastArrivalMs\n const previousSequence = this.#lastSequence.get(packetId)\n this.#lastArrivalMs = nowMs\n this.#lastSequence.set(packetId, packetSequenceNumber)\n if (last === undefined || previousSequence === undefined) return\n if (this.#windowMs === undefined) return\n // MMTP packet_sequence_number is a 32-bit counter that wraps.\n if (((previousSequence + 1) >>> 0) !== (packetSequenceNumber >>> 0)) return\n const gap = nowMs - last\n this.#evict(nowMs)\n // A gap no larger than the current tail can never become the maximum\n // while the tail is still in the window, except as the newest entry.\n while (this.#gaps.length > this.#head && this.#gaps[this.#gaps.length - 1] <= gap) {\n this.#gaps.pop()\n this.#times.pop()\n }\n this.#gaps.push(gap)\n this.#times.push(nowMs)\n this.#compact()\n }\n\n /**\n * Largest gap observed within the window ending at `nowMs`, at most the\n * window itself; 0 if none or when no window is set.\n */\n peakGapMs(nowMs: number): number {\n const windowMs = this.#windowMs\n if (windowMs === undefined) return 0\n this.#evict(nowMs)\n return this.#gaps.length > this.#head ? Math.min(this.#gaps[this.#head], windowMs) : 0\n }\n\n /** Forget everything: a new delivery path starts with no measurement. */\n reset(): void {\n this.#lastArrivalMs = undefined\n this.#lastSequence.clear()\n this.#times = []\n this.#gaps = []\n this.#head = 0\n }\n\n #evict(nowMs: number): void {\n const windowMs = this.#windowMs\n if (windowMs === undefined) return\n while (this.#times.length > this.#head && this.#times[this.#head] < nowMs - windowMs) {\n this.#head++\n }\n }\n\n #compact(): void {\n // Drop consumed head slots once they outnumber live ones.\n if (this.#head > 0 && this.#head * 2 >= this.#times.length) {\n this.#times = this.#times.slice(this.#head)\n this.#gaps = this.#gaps.slice(this.#head)\n this.#head = 0\n }\n }\n}\n"],
5
+ "mappings": ";AAqDO,IAAM,uBAAN,MAA2B;AAAA;AAAA,EAEhC;AAAA;AAAA,EAEA,gBAAgB,oBAAI,IAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,SAAmB,CAAC;AAAA,EACpB,QAAkB,CAAC;AAAA,EACnB,QAAQ;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAoC;AAC9C,QAAI,aAAa,UAAa,EAAE,OAAO,SAAS,QAAQ,KAAK,WAAW,IAAI;AAC1E,YAAM,IAAI;AAAA,QACR,6EAA6E,QAAQ;AAAA,MACvF;AAAA,IACF;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAI,WAA+B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAe,UAAkB,sBAAoC;AAC/E,UAAM,OAAO,KAAK;AAClB,UAAM,mBAAmB,KAAK,cAAc,IAAI,QAAQ;AACxD,SAAK,iBAAiB;AACtB,SAAK,cAAc,IAAI,UAAU,oBAAoB;AACrD,QAAI,SAAS,UAAa,qBAAqB,OAAW;AAC1D,QAAI,KAAK,cAAc,OAAW;AAElC,QAAM,mBAAmB,MAAO,MAAQ,yBAAyB,EAAI;AACrE,UAAM,MAAM,QAAQ;AACpB,SAAK,OAAO,KAAK;AAGjB,WAAO,KAAK,MAAM,SAAS,KAAK,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC,KAAK,KAAK;AACjF,WAAK,MAAM,IAAI;AACf,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,SAAK,MAAM,KAAK,GAAG;AACnB,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAuB;AAC/B,UAAM,WAAW,KAAK;AACtB,QAAI,aAAa,OAAW,QAAO;AACnC,SAAK,OAAO,KAAK;AACjB,WAAO,KAAK,MAAM,SAAS,KAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,GAAG,QAAQ,IAAI;AAAA,EACvF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,iBAAiB;AACtB,SAAK,cAAc,MAAM;AACzB,SAAK,SAAS,CAAC;AACf,SAAK,QAAQ,CAAC;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO,OAAqB;AAC1B,UAAM,WAAW,KAAK;AACtB,QAAI,aAAa,OAAW;AAC5B,WAAO,KAAK,OAAO,SAAS,KAAK,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI,QAAQ,UAAU;AACpF,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,WAAiB;AAEf,QAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,QAAQ;AAC1D,WAAK,SAAS,KAAK,OAAO,MAAM,KAAK,KAAK;AAC1C,WAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,KAAK;AACxC,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,197 @@
1
+ /**
2
+ * MmtpRouter's per-stream duplicate ledgers, retained for the stream's FEC
3
+ * horizon (BLO-36599).
4
+ *
5
+ * The router remembers three kinds of wire number per physical stream, so a
6
+ * second copy of a packet is not parsed or delivered twice:
7
+ *
8
+ * - packet_sequence_numbers received on the direct source path, which a
9
+ * recovered FEC block must not deliver again;
10
+ * - packet_sequence_numbers already handed to the track packet callback;
11
+ * - Source FEC Payload IDs (SS_ID) already parsed for playback, which dedup an
12
+ * overlap copy against its multicast twin.
13
+ *
14
+ * Each of these is useful for as long as FECManager can still re-deliver the
15
+ * number's packet, which ends when its FEC block goes terminal; the ledger
16
+ * keeps one further block lifetime of margin. A block's symbols all arrive
17
+ * within its span, the catalog's `interleaveDepthMs` (draft-ramadan-moq-fec
18
+ * §5.1). After its last symbol FECManager makes the block terminal within one
19
+ * block lifetime (the inactivity fail bound plus the D-28 repair grace, the
20
+ * value `blockLifetimeMsForPacket()` returns). FECManager keeps the terminal
21
+ * record longer than that (`terminalRetentionMsForPacket()`, for the in-order
22
+ * release gate), and that record itself counts late symbols as duplicates, so
23
+ * the ledger need not match it. Measured from a number's first arrival that is
24
+ *
25
+ * retention = interleaveDepthMs + blockLifetime + blockLifetime
26
+ *
27
+ * The bound is a time, not a count, on purpose. A count would need the
28
+ * stream's symbol rate, and the catalog does not give one: the producer closes
29
+ * a block after D media units or after K source symbols, whichever comes
30
+ * first, so one span can hold several blocks (every large keyframe does) and K
31
+ * per span is not an upper bound on the rate. The fixed 2000-entry window this
32
+ * replaces held about 4 s of the 467 packet/s AMT stream and about 40 s of a
33
+ * 47 packet/s audio stream; this one holds each stream for its own horizon.
34
+ *
35
+ * The clock is read only when a stream moves to a new FEC block (or for a
36
+ * packet without an FEC coordinate), never per packet, and no timer is armed:
37
+ * the ledgers rotate lazily.
38
+ *
39
+ * A stream whose horizon cannot be derived while FEC still runs (the FEC
40
+ * manager reports no per-stream geometry, or the catalog gives no block span,
41
+ * in which case FECManager falls back to its fail bound and still recovers
42
+ * blocks) is still re-delivered packets by recovery, so it keeps the count
43
+ * window the router kept for every stream before this change: each ledger
44
+ * holds its newest COUNT_BOUNDED_GENERATION to 2 * COUNT_BOUNDED_GENERATION
45
+ * numbers. Only a router without an FEC manager keeps no ledger: nothing
46
+ * re-delivers a packet.
47
+ */
48
+ /**
49
+ * Generation length, in numbers, of a ledger whose stream has no derivable FEC
50
+ * horizon. This is not a new bound: it is the window every stream kept before
51
+ * BLO-36599 (trim to the newest 2000 once past 4000), kept for exactly the
52
+ * streams the FEC horizon cannot describe.
53
+ */
54
+ export declare const COUNT_BOUNDED_GENERATION = 2000;
55
+ /**
56
+ * RFC 1982 serial-number order on a 32-bit wire counter (MMTP
57
+ * packet_sequence_number, SS_ID): true when `a` precedes `b`. The counters
58
+ * wrap, so plain `<` would report every wrap as a regression.
59
+ */
60
+ export declare function serial32Precedes(a: number, b: number): boolean;
61
+ /** The two FECManager values a stream's duplicate retention is derived from. */
62
+ export interface DuplicateHorizonGeometry {
63
+ /** Catalog `fec.interleaveDepthMs`: the full FEC block span, in ms. */
64
+ readonly blockSpanMs: number;
65
+ /**
66
+ * FECManager's `blockLifetimeMsForPacket()`: the longest a block stays open
67
+ * after its last symbol. Its terminal record is kept at least this long.
68
+ */
69
+ readonly blockLifetimeMs: number;
70
+ }
71
+ /**
72
+ * How long a stream's duplicate ledgers keep a number, or why no FEC horizon
73
+ * is derivable. `'no-fec-manager'`: the router decodes no FEC, so nothing
74
+ * re-delivers a packet and the stream keeps no ledger. `'no-fec-geometry'`:
75
+ * the FEC manager cannot report per-stream geometry. `'no-block-span'`: the
76
+ * stream has no catalog FEC block span (FECManager reports interleaveDepthMs
77
+ * 0, which is also what a stream without FEC reports). FEC may still recover
78
+ * blocks in the last two cases, so they keep count-bounded ledgers.
79
+ */
80
+ export type DuplicateHorizon = {
81
+ readonly kind: 'fec-horizon';
82
+ readonly retentionMs: number;
83
+ } | {
84
+ readonly kind: 'none';
85
+ readonly reason: 'no-fec-manager' | 'no-fec-geometry' | 'no-block-span';
86
+ };
87
+ /** Derive a stream's duplicate retention from its FEC geometry; see the module comment. */
88
+ export declare function duplicateRetentionMs(geometry: DuplicateHorizonGeometry): number;
89
+ /**
90
+ * A set of wire numbers kept in two generations. Rotating retires the older
91
+ * generation and starts a new one, so a number stays a member from the moment
92
+ * it is added until the second rotation after that: at least one full
93
+ * generation. A number already present keeps its first-arrival generation, as
94
+ * a duplicate must be timed from the original. Additions are dropped while
95
+ * `gate.retaining` is false. While `gate.countBounded` is true the set rotates
96
+ * itself each time its newer generation reaches COUNT_BOUNDED_GENERATION.
97
+ *
98
+ * One Set holds both generations. A number is added once, so the Set's
99
+ * insertion order is generation order and the older generation is exactly its
100
+ * first `#olderCount` members; rotating deletes those in place. Two Sets with
101
+ * a clear() per rotation would reallocate and regrow a Set every generation.
102
+ */
103
+ export declare class GenerationalNumberSet {
104
+ #private;
105
+ constructor(gate: {
106
+ readonly retaining: boolean;
107
+ readonly countBounded: boolean;
108
+ });
109
+ has(value: number): boolean;
110
+ add(value: number): void;
111
+ /** Retire the older generation; the current one becomes the older. */
112
+ rotate(): void;
113
+ clear(): void;
114
+ /**
115
+ * Keep every member but forget how many rotations have passed, so no floor
116
+ * is reported until two more rotations. A stream that starts timing its
117
+ * generations calls this: generations rotated by count say nothing about
118
+ * how long ago their members arrived.
119
+ */
120
+ restartAging(): void;
121
+ /**
122
+ * The earliest-arrived member, once it is known to have arrived at least one
123
+ * full generation ago; `undefined` before that.
124
+ *
125
+ * A rotation is triggered by an arriving packet, which is normally the
126
+ * first member of the new generation (a live stream adds its next packet
127
+ * within one packet interval otherwise). From the second rotation on, the
128
+ * older generation therefore began at a rotation, and its first member
129
+ * arrived about one generation length before now. Before the second
130
+ * rotation the first member may be a number that simply arrived early out of
131
+ * order, so no floor is reported.
132
+ */
133
+ get horizonFloor(): number | undefined;
134
+ get size(): number;
135
+ }
136
+ /**
137
+ * One physical stream's three duplicate ledgers and their shared generation
138
+ * clock. `advance()` runs once per packet (and once per recovered block) before
139
+ * any lookup, `predatesHorizon()` included. It does work only when the packet
140
+ * belongs to a different FEC block than the previous one, or carries no FEC
141
+ * coordinate on a stream with an FEC horizon; everything else is a Set lookup.
142
+ */
143
+ export declare class StreamDuplicateLedgers {
144
+ #private;
145
+ /** packet_sequence_numbers received on the direct source path. */
146
+ readonly sourceSeqs: GenerationalNumberSet;
147
+ /** packet_sequence_numbers already handed to the track packet callback. */
148
+ readonly routedSeqs: GenerationalNumberSet;
149
+ /** SS_IDs already parsed for playback. */
150
+ readonly parsedSymbols: GenerationalNumberSet;
151
+ /**
152
+ * @param horizon resolves the stream's current horizon from its FEC
153
+ * geometry. It is read when the stream moves to a new block, so a catalog
154
+ * change applies from the next block.
155
+ * @param now the clock FECManager's deadlines use.
156
+ */
157
+ constructor(horizon: () => DuplicateHorizon, now?: () => number);
158
+ /**
159
+ * Note the FEC block (SBN) of the packet about to be looked up, or
160
+ * `undefined` for a packet without a Source FEC Payload ID. Returns whether
161
+ * the stream keeps ledgers; while it does not, lookups find nothing and
162
+ * additions are dropped. The horizon is read on the first packet after
163
+ * construction or clear(), and again whenever the block changes; a packet
164
+ * without a coordinate never re-reads it, so a stream without FEC
165
+ * coordinates resolves its horizon once, not per packet.
166
+ */
167
+ advance(sbn: number | undefined): boolean;
168
+ /**
169
+ * Whether a packet with these wire numbers predates every number the stream
170
+ * has kept for at least one full FEC horizon (BLO-36599).
171
+ *
172
+ * Within one publisher epoch this cannot happen to a usable packet: it
173
+ * would have been sent before a packet that arrived a whole horizon ago, so
174
+ * no FEC block could still recover it and no reorder window could still place
175
+ * it. A publisher that restarts resets packet_sequence_number and SS_ID,
176
+ * and its first packets land exactly here. The evidence is in-band: two
177
+ * wire counters compared against numbers the stream actually received, with
178
+ * the horizon derived from the catalog. No timer is armed and no count
179
+ * threshold is guessed.
180
+ *
181
+ * Limits, by construction: a stream without an FEC horizon (count-bounded
182
+ * ledgers, or none) reports nothing, and so does a stream younger than two
183
+ * timed generations; a restart whose new counters land inside the retained
184
+ * range is not evidence, and its old numbers age out of the ledgers within
185
+ * one horizon.
186
+ */
187
+ predatesHorizon(packetSequenceNumber: number, ssId: number | undefined): boolean;
188
+ /** Whether the stream keeps ledgers, for its FEC horizon or by count. */
189
+ get retaining(): boolean;
190
+ /** Whether the ledgers are bounded by count because no FEC horizon is derivable. */
191
+ get countBounded(): boolean;
192
+ /** Current retention in ms, or null while the stream has no FEC horizon. */
193
+ get retentionMs(): number | null;
194
+ /** Forget every number (a track reset); the next packet re-derives the horizon. */
195
+ clear(): void;
196
+ }
197
+ //# sourceMappingURL=duplicate-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-ledger.d.ts","sourceRoot":"","sources":["../src/duplicate-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,gFAAgF;AAChF,MAAM,WAAW,wBAAwB;IACvC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9D;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAA;CACxE,CAAA;AAWL,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,CAM/E;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAqB;;gBAQpB,IAAI,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;KAAE;IAIjF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMxB,sEAAsE;IACtE,MAAM,IAAI,IAAI;IAqBd,KAAK,IAAI,IAAI;IAOb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAKpB;;;;;;;;;;;OAWG;IACH,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAGrC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;;;;GAMG;AACH,qBAAa,sBAAsB;;IACjC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,0CAA0C;IAC1C,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAA;IAW7C;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,gBAAgB,EAAE,GAAG,GAAE,MAAM,MAAgC;IAQxF;;;;;;;;OAQG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;IAwCzC;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;IAmBhF,yEAAyE;IACzE,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,oFAAoF;IACpF,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,4EAA4E;IAC5E,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED,mFAAmF;IACnF,KAAK,IAAI,IAAI;CAqBd"}
@@ -0,0 +1,226 @@
1
+ // src/duplicate-ledger.ts
2
+ var COUNT_BOUNDED_GENERATION = 2e3;
3
+ function serial32Precedes(a, b) {
4
+ const distance = b - a >>> 0;
5
+ return distance !== 0 && distance < 2147483648;
6
+ }
7
+ function assertPositiveMs(name, value) {
8
+ if (!Number.isFinite(value) || value <= 0) {
9
+ throw new Error(
10
+ `[DuplicateLedger] ${name}=${value}. Derive a positive ${name} from the stream catalog through FECManager.`
11
+ );
12
+ }
13
+ }
14
+ function duplicateRetentionMs(geometry) {
15
+ assertPositiveMs("blockSpanMs", geometry.blockSpanMs);
16
+ assertPositiveMs("blockLifetimeMs", geometry.blockLifetimeMs);
17
+ const untilTerminalMs = geometry.blockLifetimeMs;
18
+ const terminalRecordMs = geometry.blockLifetimeMs;
19
+ return geometry.blockSpanMs + untilTerminalMs + terminalRecordMs;
20
+ }
21
+ var GenerationalNumberSet = class {
22
+ #members = /* @__PURE__ */ new Set();
23
+ #olderCount = 0;
24
+ #newerCount = 0;
25
+ #rotations = 0;
26
+ #floor = void 0;
27
+ #gate;
28
+ constructor(gate) {
29
+ this.#gate = gate;
30
+ }
31
+ has(value) {
32
+ return this.#members.has(value);
33
+ }
34
+ add(value) {
35
+ if (!this.#gate.retaining || this.#members.has(value)) return;
36
+ this.#members.add(value);
37
+ if (++this.#newerCount >= COUNT_BOUNDED_GENERATION && this.#gate.countBounded) this.rotate();
38
+ }
39
+ /** Retire the older generation; the current one becomes the older. */
40
+ rotate() {
41
+ let retiring = this.#olderCount;
42
+ if (retiring > 0) {
43
+ for (const value of this.#members) {
44
+ this.#members.delete(value);
45
+ if (--retiring === 0) break;
46
+ }
47
+ }
48
+ this.#olderCount = this.#newerCount;
49
+ this.#newerCount = 0;
50
+ this.#rotations++;
51
+ this.#floor = void 0;
52
+ for (const value of this.#members) {
53
+ this.#floor = value;
54
+ break;
55
+ }
56
+ }
57
+ clear() {
58
+ this.#members.clear();
59
+ this.#olderCount = 0;
60
+ this.#newerCount = 0;
61
+ this.restartAging();
62
+ }
63
+ /**
64
+ * Keep every member but forget how many rotations have passed, so no floor
65
+ * is reported until two more rotations. A stream that starts timing its
66
+ * generations calls this: generations rotated by count say nothing about
67
+ * how long ago their members arrived.
68
+ */
69
+ restartAging() {
70
+ this.#rotations = 0;
71
+ this.#floor = void 0;
72
+ }
73
+ /**
74
+ * The earliest-arrived member, once it is known to have arrived at least one
75
+ * full generation ago; `undefined` before that.
76
+ *
77
+ * A rotation is triggered by an arriving packet, which is normally the
78
+ * first member of the new generation (a live stream adds its next packet
79
+ * within one packet interval otherwise). From the second rotation on, the
80
+ * older generation therefore began at a rotation, and its first member
81
+ * arrived about one generation length before now. Before the second
82
+ * rotation the first member may be a number that simply arrived early out of
83
+ * order, so no floor is reported.
84
+ */
85
+ get horizonFloor() {
86
+ if (this.#rotations < 2 || this.#olderCount === 0) return void 0;
87
+ return this.#floor;
88
+ }
89
+ get size() {
90
+ return this.#members.size;
91
+ }
92
+ };
93
+ var StreamDuplicateLedgers = class {
94
+ #horizon;
95
+ #now;
96
+ #retentionMs = null;
97
+ #countBounded = false;
98
+ /** Whether the horizon was read since construction or the last clear(). */
99
+ #horizonRead = false;
100
+ #generationStartMs = 0;
101
+ #lastSbn = void 0;
102
+ /**
103
+ * @param horizon resolves the stream's current horizon from its FEC
104
+ * geometry. It is read when the stream moves to a new block, so a catalog
105
+ * change applies from the next block.
106
+ * @param now the clock FECManager's deadlines use.
107
+ */
108
+ constructor(horizon, now = () => performance.now()) {
109
+ this.#horizon = horizon;
110
+ this.#now = now;
111
+ this.sourceSeqs = new GenerationalNumberSet(this);
112
+ this.routedSeqs = new GenerationalNumberSet(this);
113
+ this.parsedSymbols = new GenerationalNumberSet(this);
114
+ }
115
+ /**
116
+ * Note the FEC block (SBN) of the packet about to be looked up, or
117
+ * `undefined` for a packet without a Source FEC Payload ID. Returns whether
118
+ * the stream keeps ledgers; while it does not, lookups find nothing and
119
+ * additions are dropped. The horizon is read on the first packet after
120
+ * construction or clear(), and again whenever the block changes; a packet
121
+ * without a coordinate never re-reads it, so a stream without FEC
122
+ * coordinates resolves its horizon once, not per packet.
123
+ */
124
+ advance(sbn) {
125
+ if (sbn !== void 0) {
126
+ if (sbn === this.#lastSbn) return this.retaining;
127
+ this.#lastSbn = sbn;
128
+ } else if (this.#horizonRead) {
129
+ if (this.#retentionMs !== null) this.#rotateIfDue(this.#now());
130
+ return this.retaining;
131
+ }
132
+ this.#horizonRead = true;
133
+ const horizon = this.#horizon();
134
+ if (horizon.kind === "none") {
135
+ if (horizon.reason === "no-fec-manager") {
136
+ this.#forget();
137
+ } else {
138
+ this.#retentionMs = null;
139
+ this.#countBounded = true;
140
+ }
141
+ return this.retaining;
142
+ }
143
+ const nowMs = this.#now();
144
+ this.#countBounded = false;
145
+ if (this.#retentionMs === null) {
146
+ this.#retentionMs = horizon.retentionMs;
147
+ this.#generationStartMs = nowMs;
148
+ this.sourceSeqs.restartAging();
149
+ this.routedSeqs.restartAging();
150
+ this.parsedSymbols.restartAging();
151
+ return true;
152
+ }
153
+ this.#retentionMs = horizon.retentionMs;
154
+ this.#rotateIfDue(nowMs);
155
+ return true;
156
+ }
157
+ /**
158
+ * Whether a packet with these wire numbers predates every number the stream
159
+ * has kept for at least one full FEC horizon (BLO-36599).
160
+ *
161
+ * Within one publisher epoch this cannot happen to a usable packet: it
162
+ * would have been sent before a packet that arrived a whole horizon ago, so
163
+ * no FEC block could still recover it and no reorder window could still place
164
+ * it. A publisher that restarts resets packet_sequence_number and SS_ID,
165
+ * and its first packets land exactly here. The evidence is in-band: two
166
+ * wire counters compared against numbers the stream actually received, with
167
+ * the horizon derived from the catalog. No timer is armed and no count
168
+ * threshold is guessed.
169
+ *
170
+ * Limits, by construction: a stream without an FEC horizon (count-bounded
171
+ * ledgers, or none) reports nothing, and so does a stream younger than two
172
+ * timed generations; a restart whose new counters land inside the retained
173
+ * range is not evidence, and its old numbers age out of the ledgers within
174
+ * one horizon.
175
+ */
176
+ predatesHorizon(packetSequenceNumber, ssId) {
177
+ if (this.#retentionMs === null) return false;
178
+ const seqFloor = this.sourceSeqs.horizonFloor;
179
+ if (seqFloor !== void 0 && serial32Precedes(packetSequenceNumber, seqFloor) && !this.sourceSeqs.has(packetSequenceNumber)) {
180
+ return true;
181
+ }
182
+ if (ssId === void 0) return false;
183
+ const ssIdFloor = this.parsedSymbols.horizonFloor;
184
+ return ssIdFloor !== void 0 && serial32Precedes(ssId, ssIdFloor) && !this.parsedSymbols.has(ssId);
185
+ }
186
+ /** Whether the stream keeps ledgers, for its FEC horizon or by count. */
187
+ get retaining() {
188
+ return this.#retentionMs !== null || this.#countBounded;
189
+ }
190
+ /** Whether the ledgers are bounded by count because no FEC horizon is derivable. */
191
+ get countBounded() {
192
+ return this.#countBounded;
193
+ }
194
+ /** Current retention in ms, or null while the stream has no FEC horizon. */
195
+ get retentionMs() {
196
+ return this.#retentionMs;
197
+ }
198
+ /** Forget every number (a track reset); the next packet re-derives the horizon. */
199
+ clear() {
200
+ this.#forget();
201
+ this.#lastSbn = void 0;
202
+ this.#horizonRead = false;
203
+ }
204
+ #forget() {
205
+ this.sourceSeqs.clear();
206
+ this.routedSeqs.clear();
207
+ this.parsedSymbols.clear();
208
+ this.#retentionMs = null;
209
+ this.#countBounded = false;
210
+ }
211
+ #rotateIfDue(nowMs) {
212
+ if (this.#retentionMs === null || nowMs - this.#generationStartMs < this.#retentionMs) return;
213
+ this.sourceSeqs.rotate();
214
+ this.routedSeqs.rotate();
215
+ this.parsedSymbols.rotate();
216
+ this.#generationStartMs = nowMs;
217
+ }
218
+ };
219
+ export {
220
+ COUNT_BOUNDED_GENERATION,
221
+ GenerationalNumberSet,
222
+ StreamDuplicateLedgers,
223
+ duplicateRetentionMs,
224
+ serial32Precedes
225
+ };
226
+ //# sourceMappingURL=duplicate-ledger.js.map