@simulatte/doppler 0.1.8 → 0.2.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 (1340) hide show
  1. package/README.md +3 -97
  2. package/package.json +5 -160
  3. package/BRANDING.md +0 -14
  4. package/CHANGELOG.md +0 -145
  5. package/LICENSE +0 -201
  6. package/NOTICE +0 -5
  7. package/SECURITY.md +0 -19
  8. package/src/adapters/adapter-manager.d.ts +0 -200
  9. package/src/adapters/adapter-manager.js +0 -509
  10. package/src/adapters/adapter-manifest.d.ts +0 -290
  11. package/src/adapters/adapter-manifest.js +0 -320
  12. package/src/adapters/adapter-registry.d.ts +0 -192
  13. package/src/adapters/adapter-registry.js +0 -477
  14. package/src/adapters/index.d.ts +0 -89
  15. package/src/adapters/index.js +0 -42
  16. package/src/adapters/lora-loader.d.ts +0 -105
  17. package/src/adapters/lora-loader.js +0 -414
  18. package/src/bootstrap.d.ts +0 -1
  19. package/src/bootstrap.js +0 -30
  20. package/src/bridge/extension/background.d.ts +0 -14
  21. package/src/bridge/extension/background.js +0 -168
  22. package/src/bridge/extension/manifest.json +0 -34
  23. package/src/bridge/extension-client.d.ts +0 -114
  24. package/src/bridge/extension-client.js +0 -409
  25. package/src/bridge/index.d.ts +0 -69
  26. package/src/bridge/index.js +0 -53
  27. package/src/bridge/protocol.d.ts +0 -96
  28. package/src/bridge/protocol.js +0 -130
  29. package/src/browser/browser-converter.d.ts +0 -71
  30. package/src/browser/browser-converter.js +0 -977
  31. package/src/browser/file-picker.d.ts +0 -63
  32. package/src/browser/file-picker.js +0 -281
  33. package/src/browser/gguf-importer.d.ts +0 -136
  34. package/src/browser/gguf-importer.js +0 -532
  35. package/src/browser/gguf-parser-browser.d.ts +0 -14
  36. package/src/browser/gguf-parser-browser.js +0 -17
  37. package/src/browser/quantization.d.ts +0 -69
  38. package/src/browser/quantization.js +0 -328
  39. package/src/browser/safetensors-parser-browser.d.ts +0 -193
  40. package/src/browser/safetensors-parser-browser.js +0 -347
  41. package/src/browser/shard-io-browser.d.ts +0 -57
  42. package/src/browser/shard-io-browser.js +0 -89
  43. package/src/browser/tensor-source-download.d.ts +0 -27
  44. package/src/browser/tensor-source-download.js +0 -245
  45. package/src/browser/tensor-source-file.d.ts +0 -26
  46. package/src/browser/tensor-source-file.js +0 -53
  47. package/src/browser/tensor-source-http.d.ts +0 -29
  48. package/src/browser/tensor-source-http.js +0 -130
  49. package/src/client/doppler-api.browser.d.ts +0 -1
  50. package/src/client/doppler-api.browser.js +0 -304
  51. package/src/client/doppler-api.d.ts +0 -80
  52. package/src/client/doppler-api.js +0 -314
  53. package/src/client/doppler-provider/generation.d.ts +0 -25
  54. package/src/client/doppler-provider/generation.js +0 -126
  55. package/src/client/doppler-provider/index.d.ts +0 -2
  56. package/src/client/doppler-provider/index.js +0 -3
  57. package/src/client/doppler-provider/model-manager.d.ts +0 -71
  58. package/src/client/doppler-provider/model-manager.js +0 -739
  59. package/src/client/doppler-provider/provider.d.ts +0 -5
  60. package/src/client/doppler-provider/provider.js +0 -102
  61. package/src/client/doppler-provider/source-runtime.d.ts +0 -23
  62. package/src/client/doppler-provider/source-runtime.js +0 -641
  63. package/src/client/doppler-provider/types.d.ts +0 -127
  64. package/src/client/doppler-provider/types.js +0 -17
  65. package/src/client/doppler-provider.d.ts +0 -46
  66. package/src/client/doppler-provider.js +0 -36
  67. package/src/client/doppler-registry.d.ts +0 -23
  68. package/src/client/doppler-registry.js +0 -88
  69. package/src/client/doppler-registry.json +0 -24
  70. package/src/config/README.md +0 -69
  71. package/src/config/backward-registry-loader.d.ts +0 -3
  72. package/src/config/backward-registry-loader.js +0 -23
  73. package/src/config/execution-contract-check.d.ts +0 -82
  74. package/src/config/execution-contract-check.js +0 -317
  75. package/src/config/execution-v0-contract-check.d.ts +0 -94
  76. package/src/config/execution-v0-contract-check.js +0 -349
  77. package/src/config/execution-v0-graph-contract-check.d.ts +0 -20
  78. package/src/config/execution-v0-graph-contract-check.js +0 -64
  79. package/src/config/index.d.ts +0 -63
  80. package/src/config/index.js +0 -31
  81. package/src/config/kernel-path-contract-check.d.ts +0 -76
  82. package/src/config/kernel-path-contract-check.js +0 -507
  83. package/src/config/kernel-path-loader.d.ts +0 -170
  84. package/src/config/kernel-path-loader.js +0 -570
  85. package/src/config/kernels/backward-registry.json +0 -99
  86. package/src/config/kernels/kernel-ref-digests.d.ts +0 -1
  87. package/src/config/kernels/kernel-ref-digests.js +0 -226
  88. package/src/config/kernels/kernel-ref.d.ts +0 -17
  89. package/src/config/kernels/kernel-ref.js +0 -75
  90. package/src/config/kernels/moe/gpt-oss.paths.json +0 -49
  91. package/src/config/kernels/registry.d.ts +0 -86
  92. package/src/config/kernels/registry.js +0 -116
  93. package/src/config/kernels/registry.json +0 -7443
  94. package/src/config/loader.d.ts +0 -57
  95. package/src/config/loader.js +0 -578
  96. package/src/config/merge-contract-check.d.ts +0 -16
  97. package/src/config/merge-contract-check.js +0 -383
  98. package/src/config/merge-helpers.d.ts +0 -58
  99. package/src/config/merge-helpers.js +0 -175
  100. package/src/config/merge.d.ts +0 -143
  101. package/src/config/merge.js +0 -414
  102. package/src/config/param-categories.d.ts +0 -17
  103. package/src/config/param-categories.js +0 -72
  104. package/src/config/param-validator.d.ts +0 -26
  105. package/src/config/param-validator.js +0 -280
  106. package/src/config/platforms/amd-rdna3.json +0 -16
  107. package/src/config/platforms/apple-m1.json +0 -16
  108. package/src/config/platforms/apple-m2.json +0 -16
  109. package/src/config/platforms/apple-m3.json +0 -16
  110. package/src/config/platforms/generic.json +0 -14
  111. package/src/config/platforms/loader.d.ts +0 -65
  112. package/src/config/platforms/loader.js +0 -153
  113. package/src/config/platforms/nvidia-rtx30.json +0 -16
  114. package/src/config/platforms/nvidia-rtx40.json +0 -16
  115. package/src/config/presets/kernel-paths/embeddinggemma-f16-f32a.json +0 -60
  116. package/src/config/presets/kernel-paths/embeddinggemma-f32-f32a.json +0 -60
  117. package/src/config/presets/kernel-paths/embeddinggemma-q4k-dequant-f32a.json +0 -60
  118. package/src/config/presets/kernel-paths/gemma2-f16-f16a.json +0 -61
  119. package/src/config/presets/kernel-paths/gemma2-f16-f32a.json +0 -60
  120. package/src/config/presets/kernel-paths/gemma2-q4k-dequant-f16a.json +0 -61
  121. package/src/config/presets/kernel-paths/gemma2-q4k-dequant-f32a-nosubgroups.json +0 -60
  122. package/src/config/presets/kernel-paths/gemma2-q4k-fused-f32a.json +0 -57
  123. package/src/config/presets/kernel-paths/gemma3-f16-fused-f16a-online.json +0 -200
  124. package/src/config/presets/kernel-paths/gemma3-f16-fused-f32a-online-streamingprefill.json +0 -223
  125. package/src/config/presets/kernel-paths/gemma3-f16-fused-f32a-online.json +0 -223
  126. package/src/config/presets/kernel-paths/gemma3-q4k-dequant-f16a-online.json +0 -60
  127. package/src/config/presets/kernel-paths/gemma3-q4k-dequant-f32a-nosubgroups.json +0 -61
  128. package/src/config/presets/kernel-paths/gemma3-q4k-dequant-f32a-online.json +0 -61
  129. package/src/config/presets/kernel-paths/gemma3-q4k-dequant-f32w-f32a-online.json +0 -56
  130. package/src/config/presets/kernel-paths/lfm2-q4k-dequant-f32a-nosubgroups.json +0 -61
  131. package/src/config/presets/kernel-paths/lfm2-q4k-dequant-f32a-online.json +0 -61
  132. package/src/config/presets/kernel-paths/registry.json +0 -138
  133. package/src/config/presets/models/deepseek.json +0 -20
  134. package/src/config/presets/models/diffusion.json +0 -10
  135. package/src/config/presets/models/embeddinggemma.json +0 -74
  136. package/src/config/presets/models/functiongemma.json +0 -31
  137. package/src/config/presets/models/gemma2.json +0 -60
  138. package/src/config/presets/models/gemma3.json +0 -77
  139. package/src/config/presets/models/gpt-oss.json +0 -68
  140. package/src/config/presets/models/janus-text.json +0 -27
  141. package/src/config/presets/models/kimi-k2.json +0 -25
  142. package/src/config/presets/models/lfm2.json +0 -83
  143. package/src/config/presets/models/llama3.json +0 -40
  144. package/src/config/presets/models/mamba.json +0 -34
  145. package/src/config/presets/models/mixtral.json +0 -37
  146. package/src/config/presets/models/modernbert.json +0 -32
  147. package/src/config/presets/models/qwen3.json +0 -49
  148. package/src/config/presets/models/qwen3_5.json +0 -16
  149. package/src/config/presets/models/transformer.json +0 -78
  150. package/src/config/presets/models/translategemma.json +0 -30
  151. package/src/config/presets/platforms/nvidia-gb200-8gpu.json +0 -45
  152. package/src/config/presets/platforms/nvidia-gb200-nvl72.json +0 -45
  153. package/src/config/presets/platforms/nvidia-gh200-nvl2.json +0 -44
  154. package/src/config/presets/platforms/nvidia-gh200.json +0 -44
  155. package/src/config/presets/runtime/compute/f16-activations.json +0 -30
  156. package/src/config/presets/runtime/compute/f16-batched.json +0 -32
  157. package/src/config/presets/runtime/default.json +0 -101
  158. package/src/config/presets/runtime/diagnostics/debug-logits.json +0 -53
  159. package/src/config/presets/runtime/experiments/bench/gemma3-bench-q4k.json +0 -53
  160. package/src/config/presets/runtime/experiments/debug/gemma3-debug-q4k.json +0 -210
  161. package/src/config/presets/runtime/experiments/verify/gemma3-verify.json +0 -39
  162. package/src/config/presets/runtime/kernels/dequant-f16-q4k.json +0 -13
  163. package/src/config/presets/runtime/kernels/dequant-f32-q4k.json +0 -13
  164. package/src/config/presets/runtime/kernels/embeddinggemma-q4k-dequant-f32a.json +0 -37
  165. package/src/config/presets/runtime/kernels/fused-q4k.json +0 -13
  166. package/src/config/presets/runtime/kernels/gemma2-q4k-dequant-f16a.json +0 -33
  167. package/src/config/presets/runtime/kernels/gemma2-q4k-dequant-f32a-nosubgroups.json +0 -33
  168. package/src/config/presets/runtime/kernels/gemma2-q4k-fused-f32a.json +0 -33
  169. package/src/config/presets/runtime/kernels/safe-q4k.json +0 -13
  170. package/src/config/presets/runtime/model/gemma2-debug.json +0 -77
  171. package/src/config/presets/runtime/model/gemma2-pipeline-debug.json +0 -66
  172. package/src/config/presets/runtime/model/gemma2-pipeline.json +0 -75
  173. package/src/config/presets/runtime/model/gemma3-layer-probe.json +0 -85
  174. package/src/config/presets/runtime/model/qwen3-5-layer-probe.json +0 -52
  175. package/src/config/presets/runtime/model/qwen3-5-linear-attn-debug.json +0 -90
  176. package/src/config/presets/runtime/modes/bench.json +0 -37
  177. package/src/config/presets/runtime/modes/debug.json +0 -39
  178. package/src/config/presets/runtime/modes/default.json +0 -10
  179. package/src/config/presets/runtime/modes/embedding-bench.json +0 -28
  180. package/src/config/presets/runtime/modes/embedding.json +0 -54
  181. package/src/config/presets/runtime/modes/low-memory.json +0 -40
  182. package/src/config/presets/runtime/modes/production.json +0 -48
  183. package/src/config/presets/runtime/modes/simulation.json +0 -30
  184. package/src/config/presets/runtime/modes/trace-layers.json +0 -126
  185. package/src/config/presets/runtime/platform/metal-apple-q4k.json +0 -11
  186. package/src/config/quantization-contract-check.d.ts +0 -12
  187. package/src/config/quantization-contract-check.js +0 -91
  188. package/src/config/required-inference-fields-contract-check.d.ts +0 -24
  189. package/src/config/required-inference-fields-contract-check.js +0 -237
  190. package/src/config/runtime-merge.d.ts +0 -5
  191. package/src/config/runtime-merge.js +0 -21
  192. package/src/config/runtime.d.ts +0 -28
  193. package/src/config/runtime.js +0 -61
  194. package/src/config/schema/adapter.schema.d.ts +0 -53
  195. package/src/config/schema/adapter.schema.js +0 -60
  196. package/src/config/schema/backward-registry.schema.d.ts +0 -14
  197. package/src/config/schema/backward-registry.schema.js +0 -46
  198. package/src/config/schema/benchmark.schema.d.ts +0 -54
  199. package/src/config/schema/benchmark.schema.js +0 -74
  200. package/src/config/schema/bridge.schema.d.ts +0 -25
  201. package/src/config/schema/bridge.schema.js +0 -22
  202. package/src/config/schema/browser-suite-metrics.schema.d.ts +0 -17
  203. package/src/config/schema/browser-suite-metrics.schema.js +0 -46
  204. package/src/config/schema/buffer-pool.schema.d.ts +0 -92
  205. package/src/config/schema/buffer-pool.schema.js +0 -50
  206. package/src/config/schema/conversion-report.schema.d.ts +0 -40
  207. package/src/config/schema/conversion-report.schema.js +0 -108
  208. package/src/config/schema/conversion.schema.d.ts +0 -184
  209. package/src/config/schema/conversion.schema.js +0 -13
  210. package/src/config/schema/converter.schema.d.ts +0 -123
  211. package/src/config/schema/converter.schema.js +0 -136
  212. package/src/config/schema/debug.schema.d.ts +0 -250
  213. package/src/config/schema/debug.schema.js +0 -106
  214. package/src/config/schema/diffusion.schema.d.ts +0 -88
  215. package/src/config/schema/diffusion.schema.js +0 -62
  216. package/src/config/schema/distill-training.schema.d.ts +0 -48
  217. package/src/config/schema/distill-training.schema.js +0 -139
  218. package/src/config/schema/distribution.schema.d.ts +0 -155
  219. package/src/config/schema/distribution.schema.js +0 -81
  220. package/src/config/schema/doppler.schema.d.ts +0 -75
  221. package/src/config/schema/doppler.schema.js +0 -341
  222. package/src/config/schema/ecosystem.schema.d.ts +0 -255
  223. package/src/config/schema/ecosystem.schema.js +0 -534
  224. package/src/config/schema/emulation.schema.d.ts +0 -351
  225. package/src/config/schema/emulation.schema.js +0 -299
  226. package/src/config/schema/energy.schema.d.ts +0 -102
  227. package/src/config/schema/energy.schema.js +0 -72
  228. package/src/config/schema/execution-v0.schema.d.ts +0 -187
  229. package/src/config/schema/execution-v0.schema.js +0 -55
  230. package/src/config/schema/gpu-cache.schema.d.ts +0 -26
  231. package/src/config/schema/gpu-cache.schema.js +0 -8
  232. package/src/config/schema/harness.schema.d.ts +0 -32
  233. package/src/config/schema/harness.schema.js +0 -20
  234. package/src/config/schema/hotswap.schema.d.ts +0 -55
  235. package/src/config/schema/hotswap.schema.js +0 -18
  236. package/src/config/schema/index.d.ts +0 -885
  237. package/src/config/schema/index.js +0 -489
  238. package/src/config/schema/inference-defaults.schema.d.ts +0 -276
  239. package/src/config/schema/inference-defaults.schema.js +0 -188
  240. package/src/config/schema/inference.schema.d.ts +0 -298
  241. package/src/config/schema/inference.schema.js +0 -39
  242. package/src/config/schema/intent-bundle.schema.d.ts +0 -28
  243. package/src/config/schema/intent-bundle.schema.js +0 -12
  244. package/src/config/schema/kernel-path.schema.d.ts +0 -183
  245. package/src/config/schema/kernel-path.schema.js +0 -9
  246. package/src/config/schema/kernel-registry.schema.d.ts +0 -199
  247. package/src/config/schema/kernel-registry.schema.js +0 -46
  248. package/src/config/schema/kernel-thresholds.schema.d.ts +0 -302
  249. package/src/config/schema/kernel-thresholds.schema.js +0 -195
  250. package/src/config/schema/kernel-warmup.schema.d.ts +0 -19
  251. package/src/config/schema/kernel-warmup.schema.js +0 -5
  252. package/src/config/schema/kvcache.schema.d.ts +0 -131
  253. package/src/config/schema/kvcache.schema.js +0 -31
  254. package/src/config/schema/loading.schema.d.ts +0 -153
  255. package/src/config/schema/loading.schema.js +0 -84
  256. package/src/config/schema/lora.schema.d.ts +0 -12
  257. package/src/config/schema/lora.schema.js +0 -12
  258. package/src/config/schema/manifest.schema.d.ts +0 -507
  259. package/src/config/schema/manifest.schema.js +0 -146
  260. package/src/config/schema/memory-limits.schema.d.ts +0 -107
  261. package/src/config/schema/memory-limits.schema.js +0 -57
  262. package/src/config/schema/moe.schema.d.ts +0 -78
  263. package/src/config/schema/moe.schema.js +0 -31
  264. package/src/config/schema/platform.schema.d.ts +0 -121
  265. package/src/config/schema/platform.schema.js +0 -1
  266. package/src/config/schema/preset.schema.d.ts +0 -124
  267. package/src/config/schema/preset.schema.js +0 -1
  268. package/src/config/schema/quantization-defaults.schema.d.ts +0 -34
  269. package/src/config/schema/quantization-defaults.schema.js +0 -5
  270. package/src/config/schema/quantization.schema.d.ts +0 -10
  271. package/src/config/schema/quantization.schema.js +0 -33
  272. package/src/config/schema/shared-runtime.schema.d.ts +0 -75
  273. package/src/config/schema/shared-runtime.schema.js +0 -45
  274. package/src/config/schema/speculative.schema.d.ts +0 -21
  275. package/src/config/schema/speculative.schema.js +0 -11
  276. package/src/config/schema/storage.schema.d.ts +0 -123
  277. package/src/config/schema/storage.schema.js +0 -66
  278. package/src/config/schema/tooling.schema.d.ts +0 -29
  279. package/src/config/schema/tooling.schema.js +0 -12
  280. package/src/config/schema/training-metrics.schema.d.ts +0 -89
  281. package/src/config/schema/training-metrics.schema.js +0 -374
  282. package/src/config/schema/training.schema.d.ts +0 -88
  283. package/src/config/schema/training.schema.js +0 -106
  284. package/src/config/schema/tuner.schema.d.ts +0 -39
  285. package/src/config/schema/tuner.schema.js +0 -13
  286. package/src/config/schema/ul-training.schema.d.ts +0 -61
  287. package/src/config/schema/ul-training.schema.js +0 -140
  288. package/src/config/schema/units.schema.d.ts +0 -27
  289. package/src/config/schema/units.schema.js +0 -26
  290. package/src/config/training-defaults.d.ts +0 -24
  291. package/src/config/training-defaults.js +0 -99
  292. package/src/converter/conversion-plan.d.ts +0 -64
  293. package/src/converter/conversion-plan.js +0 -565
  294. package/src/converter/core.d.ts +0 -264
  295. package/src/converter/core.js +0 -1374
  296. package/src/converter/execution-v0-manifest.d.ts +0 -15
  297. package/src/converter/execution-v0-manifest.js +0 -149
  298. package/src/converter/index.d.ts +0 -99
  299. package/src/converter/index.js +0 -60
  300. package/src/converter/manifest-inference.d.ts +0 -20
  301. package/src/converter/manifest-inference.js +0 -513
  302. package/src/converter/parsers/diffusion.d.ts +0 -50
  303. package/src/converter/parsers/diffusion.js +0 -327
  304. package/src/converter/parsers/gguf.d.ts +0 -22
  305. package/src/converter/parsers/gguf.js +0 -46
  306. package/src/converter/parsers/index.d.ts +0 -21
  307. package/src/converter/parsers/index.js +0 -12
  308. package/src/converter/parsers/transformer.d.ts +0 -16
  309. package/src/converter/parsers/transformer.js +0 -29
  310. package/src/converter/quantization-info.d.ts +0 -37
  311. package/src/converter/quantization-info.js +0 -422
  312. package/src/converter/quantizer.d.ts +0 -96
  313. package/src/converter/quantizer.js +0 -429
  314. package/src/converter/rope-config.d.ts +0 -15
  315. package/src/converter/rope-config.js +0 -262
  316. package/src/converter/shard-packer.d.ts +0 -138
  317. package/src/converter/shard-packer.js +0 -425
  318. package/src/converter/tokenizer-utils.d.ts +0 -12
  319. package/src/converter/tokenizer-utils.js +0 -104
  320. package/src/debug/config.d.ts +0 -78
  321. package/src/debug/config.js +0 -347
  322. package/src/debug/history.d.ts +0 -65
  323. package/src/debug/history.js +0 -71
  324. package/src/debug/index.d.ts +0 -268
  325. package/src/debug/index.js +0 -192
  326. package/src/debug/log.d.ts +0 -46
  327. package/src/debug/log.js +0 -132
  328. package/src/debug/perf.d.ts +0 -33
  329. package/src/debug/perf.js +0 -51
  330. package/src/debug/reference/README.md +0 -114
  331. package/src/debug/reference/hf_attn_debug.py +0 -114
  332. package/src/debug/reference/hf_embed_check.py +0 -89
  333. package/src/debug/reference/hf_layer_out.py +0 -100
  334. package/src/debug/reference/hf_qwen35_linear_attn_debug.py +0 -268
  335. package/src/debug/reference/hf_rope_check.py +0 -116
  336. package/src/debug/reference/hf_weights.py +0 -75
  337. package/src/debug/signals.d.ts +0 -63
  338. package/src/debug/signals.js +0 -39
  339. package/src/debug/stats.d.ts +0 -47
  340. package/src/debug/stats.js +0 -160
  341. package/src/debug/tensor.d.ts +0 -125
  342. package/src/debug/tensor.js +0 -268
  343. package/src/debug/trace.d.ts +0 -17
  344. package/src/debug/trace.js +0 -167
  345. package/src/diffusion/image-regression.d.ts +0 -31
  346. package/src/diffusion/image-regression.js +0 -107
  347. package/src/diffusion/index.d.ts +0 -8
  348. package/src/diffusion/index.js +0 -8
  349. package/src/distribution/p2p-control-plane.d.ts +0 -52
  350. package/src/distribution/p2p-control-plane.js +0 -272
  351. package/src/distribution/p2p-observability.d.ts +0 -116
  352. package/src/distribution/p2p-observability.js +0 -303
  353. package/src/distribution/p2p-transport-contract.d.ts +0 -57
  354. package/src/distribution/p2p-transport-contract.js +0 -310
  355. package/src/distribution/p2p-webrtc-browser.d.ts +0 -37
  356. package/src/distribution/p2p-webrtc-browser.js +0 -454
  357. package/src/distribution/shard-delivery.d.ts +0 -251
  358. package/src/distribution/shard-delivery.js +0 -2152
  359. package/src/energy/index.d.ts +0 -2
  360. package/src/energy/index.js +0 -2
  361. package/src/errors/doppler-error.d.ts +0 -21
  362. package/src/errors/doppler-error.js +0 -25
  363. package/src/errors/index.d.ts +0 -1
  364. package/src/errors/index.js +0 -1
  365. package/src/formats/gguf/index.d.ts +0 -8
  366. package/src/formats/gguf/index.js +0 -4
  367. package/src/formats/gguf/types.d.ts +0 -137
  368. package/src/formats/gguf/types.js +0 -460
  369. package/src/formats/index.d.ts +0 -51
  370. package/src/formats/index.js +0 -13
  371. package/src/formats/rdrr/classification.d.ts +0 -39
  372. package/src/formats/rdrr/classification.js +0 -275
  373. package/src/formats/rdrr/groups.d.ts +0 -35
  374. package/src/formats/rdrr/groups.js +0 -73
  375. package/src/formats/rdrr/index.d.ts +0 -25
  376. package/src/formats/rdrr/index.js +0 -19
  377. package/src/formats/rdrr/manifest.d.ts +0 -32
  378. package/src/formats/rdrr/manifest.js +0 -108
  379. package/src/formats/rdrr/parsing.d.ts +0 -27
  380. package/src/formats/rdrr/parsing.js +0 -151
  381. package/src/formats/rdrr/tensor-config-validator.d.ts +0 -42
  382. package/src/formats/rdrr/tensor-config-validator.js +0 -156
  383. package/src/formats/rdrr/types.d.ts +0 -201
  384. package/src/formats/rdrr/types.js +0 -16
  385. package/src/formats/rdrr/validation.d.ts +0 -9
  386. package/src/formats/rdrr/validation.js +0 -213
  387. package/src/formats/safetensors/index.d.ts +0 -8
  388. package/src/formats/safetensors/index.js +0 -4
  389. package/src/formats/safetensors/types.d.ts +0 -67
  390. package/src/formats/safetensors/types.js +0 -102
  391. package/src/formats/tokenizer/index.d.ts +0 -5
  392. package/src/formats/tokenizer/index.js +0 -3
  393. package/src/formats/tokenizer/types.d.ts +0 -9
  394. package/src/formats/tokenizer/types.js +0 -22
  395. package/src/generation/index.d.ts +0 -18
  396. package/src/generation/index.js +0 -12
  397. package/src/gpu/command-recorder.d.ts +0 -175
  398. package/src/gpu/command-recorder.js +0 -498
  399. package/src/gpu/device.d.ts +0 -142
  400. package/src/gpu/device.js +0 -462
  401. package/src/gpu/kernel-runtime.d.ts +0 -20
  402. package/src/gpu/kernel-runtime.js +0 -37
  403. package/src/gpu/kernel-selection-cache.d.ts +0 -13
  404. package/src/gpu/kernel-selection-cache.js +0 -13
  405. package/src/gpu/kernel-selection-log.d.ts +0 -12
  406. package/src/gpu/kernel-selection-log.js +0 -28
  407. package/src/gpu/kernel-selector.d.ts +0 -11
  408. package/src/gpu/kernel-selector.js +0 -10
  409. package/src/gpu/kernel-tuner/benchmarks.d.ts +0 -144
  410. package/src/gpu/kernel-tuner/benchmarks.js +0 -902
  411. package/src/gpu/kernel-tuner/cache.d.ts +0 -55
  412. package/src/gpu/kernel-tuner/cache.js +0 -133
  413. package/src/gpu/kernel-tuner/index.d.ts +0 -59
  414. package/src/gpu/kernel-tuner/index.js +0 -38
  415. package/src/gpu/kernel-tuner/tuner.d.ts +0 -82
  416. package/src/gpu/kernel-tuner/tuner.js +0 -247
  417. package/src/gpu/kernel-tuner/types.d.ts +0 -101
  418. package/src/gpu/kernel-tuner/types.js +0 -4
  419. package/src/gpu/kernel-tuner.d.ts +0 -33
  420. package/src/gpu/kernel-tuner.js +0 -12
  421. package/src/gpu/kernels/README.md +0 -127
  422. package/src/gpu/kernels/attention.d.ts +0 -236
  423. package/src/gpu/kernels/attention.js +0 -1438
  424. package/src/gpu/kernels/attention.wgsl +0 -249
  425. package/src/gpu/kernels/attention_bdpa_decode_f16.wgsl +0 -246
  426. package/src/gpu/kernels/attention_decode.wgsl +0 -233
  427. package/src/gpu/kernels/attention_decode_chunked_f16.wgsl +0 -183
  428. package/src/gpu/kernels/attention_decode_chunked_f16kv.wgsl +0 -208
  429. package/src/gpu/kernels/attention_decode_f16.wgsl +0 -202
  430. package/src/gpu/kernels/attention_decode_f16kv.wgsl +0 -224
  431. package/src/gpu/kernels/attention_decode_online_f16.wgsl +0 -223
  432. package/src/gpu/kernels/attention_decode_online_f16kv.wgsl +0 -225
  433. package/src/gpu/kernels/attention_decode_optimized.wgsl +0 -445
  434. package/src/gpu/kernels/attention_decode_paged_f16.wgsl +0 -172
  435. package/src/gpu/kernels/attention_decode_paged_f16kv.wgsl +0 -174
  436. package/src/gpu/kernels/attention_decode_subgroup.wgsl +0 -233
  437. package/src/gpu/kernels/attention_decode_tiered_f16.wgsl +0 -218
  438. package/src/gpu/kernels/attention_decode_tiered_f16kv.wgsl +0 -220
  439. package/src/gpu/kernels/attention_decode_tiered_int4_f16kv.wgsl +0 -242
  440. package/src/gpu/kernels/attention_decode_tiered_int8_f16kv.wgsl +0 -242
  441. package/src/gpu/kernels/attention_f16.wgsl +0 -214
  442. package/src/gpu/kernels/attention_f16kv.wgsl +0 -242
  443. package/src/gpu/kernels/attention_small.wgsl +0 -260
  444. package/src/gpu/kernels/attention_small_f16.wgsl +0 -240
  445. package/src/gpu/kernels/attention_small_f16kv.wgsl +0 -266
  446. package/src/gpu/kernels/attention_streaming.wgsl +0 -149
  447. package/src/gpu/kernels/attention_streaming_f16.wgsl +0 -147
  448. package/src/gpu/kernels/attention_streaming_f16kv.wgsl +0 -151
  449. package/src/gpu/kernels/backward/adam.d.ts +0 -28
  450. package/src/gpu/kernels/backward/adam.js +0 -203
  451. package/src/gpu/kernels/backward/adam.wgsl +0 -50
  452. package/src/gpu/kernels/backward/attention_backward.d.ts +0 -22
  453. package/src/gpu/kernels/backward/attention_backward.js +0 -364
  454. package/src/gpu/kernels/backward/attention_backward.wgsl +0 -49
  455. package/src/gpu/kernels/backward/bias_add_backward.d.ts +0 -17
  456. package/src/gpu/kernels/backward/bias_add_backward.js +0 -24
  457. package/src/gpu/kernels/backward/bias_add_backward.wgsl +0 -33
  458. package/src/gpu/kernels/backward/conv2d_backward.d.ts +0 -31
  459. package/src/gpu/kernels/backward/conv2d_backward.js +0 -148
  460. package/src/gpu/kernels/backward/conv2d_backward_input.wgsl +0 -83
  461. package/src/gpu/kernels/backward/conv2d_backward_weight.wgsl +0 -70
  462. package/src/gpu/kernels/backward/cross_entropy_backward.d.ts +0 -23
  463. package/src/gpu/kernels/backward/cross_entropy_backward.js +0 -29
  464. package/src/gpu/kernels/backward/cross_entropy_backward.wgsl +0 -39
  465. package/src/gpu/kernels/backward/embed_backward.d.ts +0 -29
  466. package/src/gpu/kernels/backward/embed_backward.js +0 -118
  467. package/src/gpu/kernels/backward/embed_backward.wgsl +0 -73
  468. package/src/gpu/kernels/backward/gelu_backward.d.ts +0 -16
  469. package/src/gpu/kernels/backward/gelu_backward.js +0 -39
  470. package/src/gpu/kernels/backward/gelu_backward.wgsl +0 -38
  471. package/src/gpu/kernels/backward/groupnorm_backward.d.ts +0 -24
  472. package/src/gpu/kernels/backward/groupnorm_backward.js +0 -29
  473. package/src/gpu/kernels/backward/groupnorm_backward.wgsl +0 -143
  474. package/src/gpu/kernels/backward/index.d.ts +0 -17
  475. package/src/gpu/kernels/backward/index.js +0 -23
  476. package/src/gpu/kernels/backward/layernorm_backward.d.ts +0 -22
  477. package/src/gpu/kernels/backward/layernorm_backward.js +0 -135
  478. package/src/gpu/kernels/backward/layernorm_backward.wgsl +0 -194
  479. package/src/gpu/kernels/backward/matmul_backward.d.ts +0 -32
  480. package/src/gpu/kernels/backward/matmul_backward.js +0 -124
  481. package/src/gpu/kernels/backward/matmul_backward.wgsl +0 -90
  482. package/src/gpu/kernels/backward/matmul_transpose_a.wgsl +0 -84
  483. package/src/gpu/kernels/backward/pixel_shuffle_backward.d.ts +0 -22
  484. package/src/gpu/kernels/backward/pixel_shuffle_backward.js +0 -30
  485. package/src/gpu/kernels/backward/pixel_shuffle_backward.wgsl +0 -54
  486. package/src/gpu/kernels/backward/rmsnorm_backward.d.ts +0 -24
  487. package/src/gpu/kernels/backward/rmsnorm_backward.js +0 -101
  488. package/src/gpu/kernels/backward/rmsnorm_backward.wgsl +0 -78
  489. package/src/gpu/kernels/backward/rope_backward.d.ts +0 -25
  490. package/src/gpu/kernels/backward/rope_backward.js +0 -109
  491. package/src/gpu/kernels/backward/rope_backward.wgsl +0 -59
  492. package/src/gpu/kernels/backward/scale_backward.d.ts +0 -16
  493. package/src/gpu/kernels/backward/scale_backward.js +0 -84
  494. package/src/gpu/kernels/backward/scale_backward.wgsl +0 -27
  495. package/src/gpu/kernels/backward/silu_backward.d.ts +0 -16
  496. package/src/gpu/kernels/backward/silu_backward.js +0 -39
  497. package/src/gpu/kernels/backward/silu_backward.wgsl +0 -31
  498. package/src/gpu/kernels/backward/softmax_backward.d.ts +0 -16
  499. package/src/gpu/kernels/backward/softmax_backward.js +0 -43
  500. package/src/gpu/kernels/backward/softmax_backward.wgsl +0 -44
  501. package/src/gpu/kernels/backward/upsample2d_backward.d.ts +0 -21
  502. package/src/gpu/kernels/backward/upsample2d_backward.js +0 -30
  503. package/src/gpu/kernels/backward/upsample2d_backward.wgsl +0 -59
  504. package/src/gpu/kernels/backward/utils.d.ts +0 -45
  505. package/src/gpu/kernels/backward/utils.js +0 -371
  506. package/src/gpu/kernels/bf16_to_f16.wgsl +0 -54
  507. package/src/gpu/kernels/bf16_to_f32.wgsl +0 -70
  508. package/src/gpu/kernels/bias_add.wgsl +0 -42
  509. package/src/gpu/kernels/bias_add_f16.wgsl +0 -47
  510. package/src/gpu/kernels/cast.d.ts +0 -67
  511. package/src/gpu/kernels/cast.js +0 -464
  512. package/src/gpu/kernels/cast_f16_to_f32.wgsl +0 -31
  513. package/src/gpu/kernels/cast_f32_to_f16.wgsl +0 -36
  514. package/src/gpu/kernels/check-finiteness.d.ts +0 -15
  515. package/src/gpu/kernels/check-finiteness.js +0 -149
  516. package/src/gpu/kernels/check-stop.d.ts +0 -31
  517. package/src/gpu/kernels/check-stop.js +0 -170
  518. package/src/gpu/kernels/clamp.d.ts +0 -22
  519. package/src/gpu/kernels/clamp.js +0 -42
  520. package/src/gpu/kernels/clamp.wgsl +0 -24
  521. package/src/gpu/kernels/constants.d.ts +0 -168
  522. package/src/gpu/kernels/constants.js +0 -129
  523. package/src/gpu/kernels/conv2d.d.ts +0 -34
  524. package/src/gpu/kernels/conv2d.js +0 -91
  525. package/src/gpu/kernels/conv2d.wgsl +0 -70
  526. package/src/gpu/kernels/conv2d_f16.wgsl +0 -72
  527. package/src/gpu/kernels/cross_entropy_loss.d.ts +0 -21
  528. package/src/gpu/kernels/cross_entropy_loss.js +0 -60
  529. package/src/gpu/kernels/cross_entropy_loss.wgsl +0 -39
  530. package/src/gpu/kernels/depthwise_conv2d.d.ts +0 -29
  531. package/src/gpu/kernels/depthwise_conv2d.js +0 -109
  532. package/src/gpu/kernels/depthwise_conv2d.wgsl +0 -55
  533. package/src/gpu/kernels/depthwise_conv2d_f16.wgsl +0 -59
  534. package/src/gpu/kernels/dequant.d.ts +0 -108
  535. package/src/gpu/kernels/dequant.js +0 -576
  536. package/src/gpu/kernels/dequant_f16_out.wgsl +0 -151
  537. package/src/gpu/kernels/dequant_f16_out_vec4.wgsl +0 -149
  538. package/src/gpu/kernels/dequant_f16_rowwise.wgsl +0 -139
  539. package/src/gpu/kernels/dequant_f32_rowwise.wgsl +0 -133
  540. package/src/gpu/kernels/dequant_mxfp4.wgsl +0 -120
  541. package/src/gpu/kernels/dequant_mxfp4_expert.wgsl +0 -129
  542. package/src/gpu/kernels/dequant_mxfp4_expert_f16.wgsl +0 -105
  543. package/src/gpu/kernels/dequant_mxfp4_vec4.wgsl +0 -116
  544. package/src/gpu/kernels/dequant_q6k.wgsl +0 -140
  545. package/src/gpu/kernels/dequant_q8_0.wgsl +0 -98
  546. package/src/gpu/kernels/dequant_shared.wgsl +0 -202
  547. package/src/gpu/kernels/dequant_shared_vec4.wgsl +0 -153
  548. package/src/gpu/kernels/dequant_subgroup.wgsl +0 -202
  549. package/src/gpu/kernels/dispatch.d.ts +0 -157
  550. package/src/gpu/kernels/dispatch.js +0 -235
  551. package/src/gpu/kernels/energy.d.ts +0 -113
  552. package/src/gpu/kernels/energy.js +0 -448
  553. package/src/gpu/kernels/energy_eval.wgsl +0 -26
  554. package/src/gpu/kernels/energy_eval_f16.wgsl +0 -30
  555. package/src/gpu/kernels/energy_quintel_grad.wgsl +0 -92
  556. package/src/gpu/kernels/energy_quintel_grad_f16.wgsl +0 -96
  557. package/src/gpu/kernels/energy_quintel_reduce.wgsl +0 -112
  558. package/src/gpu/kernels/energy_quintel_reduce_f16.wgsl +0 -116
  559. package/src/gpu/kernels/energy_quintel_update.wgsl +0 -92
  560. package/src/gpu/kernels/energy_quintel_update_f16.wgsl +0 -96
  561. package/src/gpu/kernels/energy_update.wgsl +0 -25
  562. package/src/gpu/kernels/energy_update_f16.wgsl +0 -30
  563. package/src/gpu/kernels/feature-check.d.ts +0 -42
  564. package/src/gpu/kernels/feature-check.js +0 -70
  565. package/src/gpu/kernels/fused_ffn.d.ts +0 -65
  566. package/src/gpu/kernels/fused_ffn.js +0 -337
  567. package/src/gpu/kernels/fused_ffn.wgsl +0 -420
  568. package/src/gpu/kernels/fused_ffn_f16.wgsl +0 -213
  569. package/src/gpu/kernels/fused_ffn_q4k.wgsl +0 -375
  570. package/src/gpu/kernels/fused_matmul_q4.wgsl +0 -404
  571. package/src/gpu/kernels/fused_matmul_q4_batched.wgsl +0 -194
  572. package/src/gpu/kernels/fused_matmul_q4_batched_f16.wgsl +0 -170
  573. package/src/gpu/kernels/fused_matmul_q4_batched_f16a.wgsl +0 -154
  574. package/src/gpu/kernels/fused_matmul_q4_f16a.wgsl +0 -219
  575. package/src/gpu/kernels/fused_matmul_q4_multicol_f16.wgsl +0 -216
  576. package/src/gpu/kernels/fused_matmul_q4_multicol_f16a.wgsl +0 -204
  577. package/src/gpu/kernels/fused_matmul_residual.d.ts +0 -46
  578. package/src/gpu/kernels/fused_matmul_residual.js +0 -175
  579. package/src/gpu/kernels/fused_matmul_rmsnorm.d.ts +0 -64
  580. package/src/gpu/kernels/fused_matmul_rmsnorm.js +0 -290
  581. package/src/gpu/kernels/fused_matmul_rmsnorm.wgsl +0 -324
  582. package/src/gpu/kernels/fused_matmul_rmsnorm_f16.wgsl +0 -303
  583. package/src/gpu/kernels/fused_swiglu.wgsl +0 -63
  584. package/src/gpu/kernels/fused_swiglu_f16.wgsl +0 -57
  585. package/src/gpu/kernels/gather.d.ts +0 -64
  586. package/src/gpu/kernels/gather.js +0 -137
  587. package/src/gpu/kernels/gather.wgsl +0 -61
  588. package/src/gpu/kernels/gather_f16.wgsl +0 -65
  589. package/src/gpu/kernels/gather_f16_f16_out.wgsl +0 -55
  590. package/src/gpu/kernels/gather_f16_out.wgsl +0 -55
  591. package/src/gpu/kernels/gather_f16_vec4.wgsl +0 -76
  592. package/src/gpu/kernels/gather_f16_vec4_f16_out.wgsl +0 -68
  593. package/src/gpu/kernels/gather_vec4.wgsl +0 -74
  594. package/src/gpu/kernels/gather_vec4_f16_out.wgsl +0 -68
  595. package/src/gpu/kernels/gelu.d.ts +0 -33
  596. package/src/gpu/kernels/gelu.js +0 -55
  597. package/src/gpu/kernels/gelu.wgsl +0 -64
  598. package/src/gpu/kernels/gelu_f16.wgsl +0 -66
  599. package/src/gpu/kernels/gptoss_mxfp4_expert_fused.wgsl +0 -127
  600. package/src/gpu/kernels/gptoss_router_topk.wgsl +0 -119
  601. package/src/gpu/kernels/grouped_pointwise_conv2d.d.ts +0 -27
  602. package/src/gpu/kernels/grouped_pointwise_conv2d.js +0 -103
  603. package/src/gpu/kernels/grouped_pointwise_conv2d.wgsl +0 -44
  604. package/src/gpu/kernels/grouped_pointwise_conv2d_f16.wgsl +0 -48
  605. package/src/gpu/kernels/groupnorm.d.ts +0 -31
  606. package/src/gpu/kernels/groupnorm.js +0 -102
  607. package/src/gpu/kernels/groupnorm_apply.wgsl +0 -41
  608. package/src/gpu/kernels/groupnorm_apply_f16.wgsl +0 -46
  609. package/src/gpu/kernels/groupnorm_stats.wgsl +0 -76
  610. package/src/gpu/kernels/groupnorm_stats_f16.wgsl +0 -79
  611. package/src/gpu/kernels/index.d.ts +0 -374
  612. package/src/gpu/kernels/index.js +0 -315
  613. package/src/gpu/kernels/kernel-base.d.ts +0 -33
  614. package/src/gpu/kernels/kernel-base.js +0 -46
  615. package/src/gpu/kernels/kernel-configs.d.ts +0 -65
  616. package/src/gpu/kernels/kernel-configs.js +0 -50
  617. package/src/gpu/kernels/kernel-tuning.d.ts +0 -42
  618. package/src/gpu/kernels/kernel-tuning.js +0 -149
  619. package/src/gpu/kernels/kv-quantize.d.ts +0 -37
  620. package/src/gpu/kernels/kv-quantize.js +0 -141
  621. package/src/gpu/kernels/kv_quantize_int4.wgsl +0 -119
  622. package/src/gpu/kernels/kv_quantize_int8.wgsl +0 -119
  623. package/src/gpu/kernels/layernorm.d.ts +0 -37
  624. package/src/gpu/kernels/layernorm.js +0 -96
  625. package/src/gpu/kernels/layernorm.wgsl +0 -121
  626. package/src/gpu/kernels/layernorm_f16.wgsl +0 -103
  627. package/src/gpu/kernels/linear-attention-core.d.ts +0 -39
  628. package/src/gpu/kernels/linear-attention-core.js +0 -535
  629. package/src/gpu/kernels/logit-merge.d.ts +0 -110
  630. package/src/gpu/kernels/logit-merge.js +0 -394
  631. package/src/gpu/kernels/matmul-dispatch.d.ts +0 -38
  632. package/src/gpu/kernels/matmul-dispatch.js +0 -155
  633. package/src/gpu/kernels/matmul-selection.d.ts +0 -87
  634. package/src/gpu/kernels/matmul-selection.js +0 -517
  635. package/src/gpu/kernels/matmul.d.ts +0 -111
  636. package/src/gpu/kernels/matmul.js +0 -315
  637. package/src/gpu/kernels/matmul_f16.wgsl +0 -170
  638. package/src/gpu/kernels/matmul_f16_tiled.wgsl +0 -165
  639. package/src/gpu/kernels/matmul_f16w_f32a.wgsl +0 -89
  640. package/src/gpu/kernels/matmul_f16w_f32a_tiled.wgsl +0 -154
  641. package/src/gpu/kernels/matmul_f32.wgsl +0 -100
  642. package/src/gpu/kernels/matmul_gemv.wgsl +0 -80
  643. package/src/gpu/kernels/matmul_gemv_f16a.wgsl +0 -81
  644. package/src/gpu/kernels/matmul_gemv_residual.wgsl +0 -119
  645. package/src/gpu/kernels/matmul_gemv_residual_f16.wgsl +0 -78
  646. package/src/gpu/kernels/matmul_gemv_subgroup.wgsl +0 -345
  647. package/src/gpu/kernels/matmul_gemv_subgroup_f16a.wgsl +0 -514
  648. package/src/gpu/kernels/modulate.d.ts +0 -29
  649. package/src/gpu/kernels/modulate.js +0 -57
  650. package/src/gpu/kernels/modulate.wgsl +0 -40
  651. package/src/gpu/kernels/modulate_f16.wgsl +0 -43
  652. package/src/gpu/kernels/moe.d.ts +0 -164
  653. package/src/gpu/kernels/moe.js +0 -542
  654. package/src/gpu/kernels/moe_gather.wgsl +0 -170
  655. package/src/gpu/kernels/moe_gather_f16.wgsl +0 -82
  656. package/src/gpu/kernels/moe_gather_vec4.wgsl +0 -74
  657. package/src/gpu/kernels/moe_offsets.wgsl +0 -48
  658. package/src/gpu/kernels/pipeline-cache.d.ts +0 -88
  659. package/src/gpu/kernels/pipeline-cache.js +0 -305
  660. package/src/gpu/kernels/pixel_shuffle.d.ts +0 -27
  661. package/src/gpu/kernels/pixel_shuffle.js +0 -57
  662. package/src/gpu/kernels/pixel_shuffle.wgsl +0 -43
  663. package/src/gpu/kernels/pixel_shuffle_f16.wgsl +0 -46
  664. package/src/gpu/kernels/relu.d.ts +0 -18
  665. package/src/gpu/kernels/relu.js +0 -66
  666. package/src/gpu/kernels/relu.wgsl +0 -22
  667. package/src/gpu/kernels/relu_f16.wgsl +0 -24
  668. package/src/gpu/kernels/repeat_channels.d.ts +0 -21
  669. package/src/gpu/kernels/repeat_channels.js +0 -68
  670. package/src/gpu/kernels/repeat_channels.wgsl +0 -28
  671. package/src/gpu/kernels/repeat_channels_f16.wgsl +0 -30
  672. package/src/gpu/kernels/residual.d.ts +0 -74
  673. package/src/gpu/kernels/residual.js +0 -173
  674. package/src/gpu/kernels/residual.wgsl +0 -56
  675. package/src/gpu/kernels/residual_f16.wgsl +0 -36
  676. package/src/gpu/kernels/residual_f16_vec4.wgsl +0 -48
  677. package/src/gpu/kernels/residual_vec4.wgsl +0 -47
  678. package/src/gpu/kernels/rmsnorm.d.ts +0 -53
  679. package/src/gpu/kernels/rmsnorm.js +0 -215
  680. package/src/gpu/kernels/rmsnorm.wgsl +0 -425
  681. package/src/gpu/kernels/rmsnorm_f16.wgsl +0 -172
  682. package/src/gpu/kernels/rope.d.ts +0 -50
  683. package/src/gpu/kernels/rope.js +0 -66
  684. package/src/gpu/kernels/rope.wgsl +0 -344
  685. package/src/gpu/kernels/rope_f16.wgsl +0 -271
  686. package/src/gpu/kernels/rule-matcher.d.ts +0 -30
  687. package/src/gpu/kernels/rule-matcher.js +0 -42
  688. package/src/gpu/kernels/rule-registry.d.ts +0 -7
  689. package/src/gpu/kernels/rule-registry.js +0 -41
  690. package/src/gpu/kernels/sample.d.ts +0 -75
  691. package/src/gpu/kernels/sample.js +0 -567
  692. package/src/gpu/kernels/sample.wgsl +0 -377
  693. package/src/gpu/kernels/sample_f16.wgsl +0 -331
  694. package/src/gpu/kernels/sana_linear_attention.d.ts +0 -27
  695. package/src/gpu/kernels/sana_linear_attention.js +0 -129
  696. package/src/gpu/kernels/sana_linear_attention_apply.wgsl +0 -43
  697. package/src/gpu/kernels/sana_linear_attention_apply_f16.wgsl +0 -46
  698. package/src/gpu/kernels/sana_linear_attention_summary.wgsl +0 -51
  699. package/src/gpu/kernels/sana_linear_attention_summary_f16.wgsl +0 -53
  700. package/src/gpu/kernels/scale.d.ts +0 -35
  701. package/src/gpu/kernels/scale.js +0 -44
  702. package/src/gpu/kernels/scale.wgsl +0 -38
  703. package/src/gpu/kernels/scatter_add.wgsl +0 -88
  704. package/src/gpu/kernels/scatter_add_dynamic.wgsl +0 -59
  705. package/src/gpu/kernels/scatter_add_dynamic_f16.wgsl +0 -52
  706. package/src/gpu/kernels/scatter_add_dynamic_f16_weights.wgsl +0 -50
  707. package/src/gpu/kernels/scatter_add_vec4.wgsl +0 -70
  708. package/src/gpu/kernels/shader-cache.d.ts +0 -56
  709. package/src/gpu/kernels/shader-cache.js +0 -208
  710. package/src/gpu/kernels/silu.d.ts +0 -76
  711. package/src/gpu/kernels/silu.js +0 -406
  712. package/src/gpu/kernels/silu.wgsl +0 -109
  713. package/src/gpu/kernels/silu_f16.wgsl +0 -108
  714. package/src/gpu/kernels/softmax.d.ts +0 -57
  715. package/src/gpu/kernels/softmax.js +0 -125
  716. package/src/gpu/kernels/softmax.wgsl +0 -388
  717. package/src/gpu/kernels/softmax_subgroup.wgsl +0 -175
  718. package/src/gpu/kernels/split_qg.d.ts +0 -50
  719. package/src/gpu/kernels/split_qg.js +0 -46
  720. package/src/gpu/kernels/split_qg.wgsl +0 -58
  721. package/src/gpu/kernels/split_qg_f16.wgsl +0 -62
  722. package/src/gpu/kernels/split_qkv.d.ts +0 -51
  723. package/src/gpu/kernels/split_qkv.js +0 -51
  724. package/src/gpu/kernels/split_qkv.wgsl +0 -71
  725. package/src/gpu/kernels/split_qkv_f16.wgsl +0 -75
  726. package/src/gpu/kernels/topk.wgsl +0 -243
  727. package/src/gpu/kernels/topk_f16.wgsl +0 -108
  728. package/src/gpu/kernels/topk_f16_weights.wgsl +0 -101
  729. package/src/gpu/kernels/transpose.d.ts +0 -21
  730. package/src/gpu/kernels/transpose.js +0 -51
  731. package/src/gpu/kernels/transpose.wgsl +0 -33
  732. package/src/gpu/kernels/types.d.ts +0 -21
  733. package/src/gpu/kernels/types.js +0 -4
  734. package/src/gpu/kernels/uniform-utils.d.ts +0 -48
  735. package/src/gpu/kernels/uniform-utils.js +0 -94
  736. package/src/gpu/kernels/upsample2d.d.ts +0 -25
  737. package/src/gpu/kernels/upsample2d.js +0 -67
  738. package/src/gpu/kernels/upsample2d.wgsl +0 -34
  739. package/src/gpu/kernels/upsample2d_f16.wgsl +0 -38
  740. package/src/gpu/kernels/utils.d.ts +0 -106
  741. package/src/gpu/kernels/utils.js +0 -246
  742. package/src/gpu/multi-model-recorder.d.ts +0 -21
  743. package/src/gpu/multi-model-recorder.js +0 -31
  744. package/src/gpu/partitioned-buffer-pool.d.ts +0 -28
  745. package/src/gpu/partitioned-buffer-pool.js +0 -57
  746. package/src/gpu/perf-guards.d.ts +0 -25
  747. package/src/gpu/perf-guards.js +0 -133
  748. package/src/gpu/profiler.d.ts +0 -114
  749. package/src/gpu/profiler.js +0 -396
  750. package/src/gpu/readback-utils.d.ts +0 -16
  751. package/src/gpu/readback-utils.js +0 -41
  752. package/src/gpu/submit-tracker.d.ts +0 -111
  753. package/src/gpu/submit-tracker.js +0 -242
  754. package/src/gpu/tensor.d.ts +0 -69
  755. package/src/gpu/tensor.js +0 -75
  756. package/src/gpu/uniform-cache.d.ts +0 -109
  757. package/src/gpu/uniform-cache.js +0 -263
  758. package/src/gpu/weight-buffer.d.ts +0 -115
  759. package/src/gpu/weight-buffer.js +0 -118
  760. package/src/hotswap/intent-bundle.d.ts +0 -37
  761. package/src/hotswap/intent-bundle.js +0 -129
  762. package/src/hotswap/manifest.d.ts +0 -42
  763. package/src/hotswap/manifest.js +0 -124
  764. package/src/hotswap/runtime.d.ts +0 -31
  765. package/src/hotswap/runtime.js +0 -150
  766. package/src/index-browser.d.ts +0 -92
  767. package/src/index-browser.js +0 -68
  768. package/src/index-internal.d.ts +0 -2
  769. package/src/index-internal.js +0 -2
  770. package/src/index.d.ts +0 -103
  771. package/src/index.js +0 -76
  772. package/src/inference/README.md +0 -593
  773. package/src/inference/browser-harness-contract-helpers.d.ts +0 -5
  774. package/src/inference/browser-harness-contract-helpers.js +0 -28
  775. package/src/inference/browser-harness-diffusion-energy-suites.d.ts +0 -2
  776. package/src/inference/browser-harness-diffusion-energy-suites.js +0 -269
  777. package/src/inference/browser-harness-model-helpers.d.ts +0 -16
  778. package/src/inference/browser-harness-model-helpers.js +0 -217
  779. package/src/inference/browser-harness-report-helpers.d.ts +0 -7
  780. package/src/inference/browser-harness-report-helpers.js +0 -42
  781. package/src/inference/browser-harness-runtime-helpers.d.ts +0 -61
  782. package/src/inference/browser-harness-runtime-helpers.js +0 -415
  783. package/src/inference/browser-harness-suite-helpers.d.ts +0 -28
  784. package/src/inference/browser-harness-suite-helpers.js +0 -268
  785. package/src/inference/browser-harness-text-helpers.d.ts +0 -27
  786. package/src/inference/browser-harness-text-helpers.js +0 -788
  787. package/src/inference/browser-harness.d.ts +0 -242
  788. package/src/inference/browser-harness.js +0 -990
  789. package/src/inference/decode-buffers.d.ts +0 -108
  790. package/src/inference/decode-buffers.js +0 -181
  791. package/src/inference/decode-ring.d.ts +0 -52
  792. package/src/inference/decode-ring.js +0 -273
  793. package/src/inference/expert-router.d.ts +0 -27
  794. package/src/inference/expert-router.js +0 -55
  795. package/src/inference/functiongemma.d.ts +0 -15
  796. package/src/inference/functiongemma.js +0 -1
  797. package/src/inference/kv-cache/base.d.ts +0 -150
  798. package/src/inference/kv-cache/base.js +0 -1083
  799. package/src/inference/kv-cache/basis-decomposed-paged.d.ts +0 -50
  800. package/src/inference/kv-cache/basis-decomposed-paged.js +0 -276
  801. package/src/inference/kv-cache/index.d.ts +0 -35
  802. package/src/inference/kv-cache/index.js +0 -20
  803. package/src/inference/kv-cache/sliding-window.d.ts +0 -72
  804. package/src/inference/kv-cache/sliding-window.js +0 -243
  805. package/src/inference/kv-cache/tiered.d.ts +0 -89
  806. package/src/inference/kv-cache/tiered.js +0 -576
  807. package/src/inference/kv-cache/types.d.ts +0 -188
  808. package/src/inference/kv-cache/types.js +0 -80
  809. package/src/inference/kv-cache.d.ts +0 -36
  810. package/src/inference/kv-cache.js +0 -18
  811. package/src/inference/moe-router.d.ts +0 -212
  812. package/src/inference/moe-router.js +0 -585
  813. package/src/inference/multi-model-network.d.ts +0 -139
  814. package/src/inference/multi-model-network.js +0 -771
  815. package/src/inference/multi-pipeline-pool.d.ts +0 -62
  816. package/src/inference/multi-pipeline-pool.js +0 -161
  817. package/src/inference/network-evolution.d.ts +0 -55
  818. package/src/inference/network-evolution.js +0 -79
  819. package/src/inference/pipelines/context.d.ts +0 -21
  820. package/src/inference/pipelines/context.js +0 -184
  821. package/src/inference/pipelines/diffusion/helpers.d.ts +0 -29
  822. package/src/inference/pipelines/diffusion/helpers.js +0 -120
  823. package/src/inference/pipelines/diffusion/index.d.ts +0 -3
  824. package/src/inference/pipelines/diffusion/index.js +0 -3
  825. package/src/inference/pipelines/diffusion/init.d.ts +0 -24
  826. package/src/inference/pipelines/diffusion/init.js +0 -138
  827. package/src/inference/pipelines/diffusion/pipeline.d.ts +0 -38
  828. package/src/inference/pipelines/diffusion/pipeline.js +0 -771
  829. package/src/inference/pipelines/diffusion/sana-transformer.d.ts +0 -53
  830. package/src/inference/pipelines/diffusion/sana-transformer.js +0 -738
  831. package/src/inference/pipelines/diffusion/scheduler.d.ts +0 -35
  832. package/src/inference/pipelines/diffusion/scheduler.js +0 -153
  833. package/src/inference/pipelines/diffusion/sd3-transformer.d.ts +0 -20
  834. package/src/inference/pipelines/diffusion/sd3-transformer.js +0 -1194
  835. package/src/inference/pipelines/diffusion/sd3-weights.d.ts +0 -21
  836. package/src/inference/pipelines/diffusion/sd3-weights.js +0 -287
  837. package/src/inference/pipelines/diffusion/text-encoder-gpu.d.ts +0 -87
  838. package/src/inference/pipelines/diffusion/text-encoder-gpu.js +0 -1223
  839. package/src/inference/pipelines/diffusion/text-encoder.d.ts +0 -29
  840. package/src/inference/pipelines/diffusion/text-encoder.js +0 -195
  841. package/src/inference/pipelines/diffusion/types.d.ts +0 -116
  842. package/src/inference/pipelines/diffusion/types.js +0 -1
  843. package/src/inference/pipelines/diffusion/vae.d.ts +0 -20
  844. package/src/inference/pipelines/diffusion/vae.js +0 -1375
  845. package/src/inference/pipelines/diffusion/weights.d.ts +0 -40
  846. package/src/inference/pipelines/diffusion/weights.js +0 -150
  847. package/src/inference/pipelines/dream/energy-head-pipeline.d.ts +0 -29
  848. package/src/inference/pipelines/dream/energy-head-pipeline.js +0 -6
  849. package/src/inference/pipelines/dream/pipeline.d.ts +0 -17
  850. package/src/inference/pipelines/dream/pipeline.js +0 -8
  851. package/src/inference/pipelines/energy/index.d.ts +0 -1
  852. package/src/inference/pipelines/energy/index.js +0 -1
  853. package/src/inference/pipelines/energy/pipeline.d.ts +0 -27
  854. package/src/inference/pipelines/energy/pipeline.js +0 -686
  855. package/src/inference/pipelines/energy/quintel.d.ts +0 -92
  856. package/src/inference/pipelines/energy/quintel.js +0 -218
  857. package/src/inference/pipelines/energy/types.d.ts +0 -63
  858. package/src/inference/pipelines/energy/types.js +0 -1
  859. package/src/inference/pipelines/energy-head/index.d.ts +0 -6
  860. package/src/inference/pipelines/energy-head/index.js +0 -6
  861. package/src/inference/pipelines/energy-head/row-head-pipeline.d.ts +0 -103
  862. package/src/inference/pipelines/energy-head/row-head-pipeline.js +0 -491
  863. package/src/inference/pipelines/factory.d.ts +0 -10
  864. package/src/inference/pipelines/factory.js +0 -6
  865. package/src/inference/pipelines/index.d.ts +0 -22
  866. package/src/inference/pipelines/index.js +0 -19
  867. package/src/inference/pipelines/registry.d.ts +0 -15
  868. package/src/inference/pipelines/registry.js +0 -23
  869. package/src/inference/pipelines/rng.d.ts +0 -2
  870. package/src/inference/pipelines/rng.js +0 -17
  871. package/src/inference/pipelines/structured/index.d.ts +0 -8
  872. package/src/inference/pipelines/structured/index.js +0 -8
  873. package/src/inference/pipelines/structured/json-head-pipeline.d.ts +0 -58
  874. package/src/inference/pipelines/structured/json-head-pipeline.js +0 -196
  875. package/src/inference/pipelines/text/attention/index.d.ts +0 -24
  876. package/src/inference/pipelines/text/attention/index.js +0 -17
  877. package/src/inference/pipelines/text/attention/output-projection.d.ts +0 -12
  878. package/src/inference/pipelines/text/attention/output-projection.js +0 -8
  879. package/src/inference/pipelines/text/attention/projections.d.ts +0 -110
  880. package/src/inference/pipelines/text/attention/projections.js +0 -515
  881. package/src/inference/pipelines/text/attention/record.d.ts +0 -36
  882. package/src/inference/pipelines/text/attention/record.js +0 -685
  883. package/src/inference/pipelines/text/attention/run.d.ts +0 -38
  884. package/src/inference/pipelines/text/attention/run.js +0 -933
  885. package/src/inference/pipelines/text/attention/types.d.ts +0 -98
  886. package/src/inference/pipelines/text/attention/types.js +0 -67
  887. package/src/inference/pipelines/text/attention.d.ts +0 -23
  888. package/src/inference/pipelines/text/attention.js +0 -12
  889. package/src/inference/pipelines/text/bdpa-steamroller.d.ts +0 -22
  890. package/src/inference/pipelines/text/bdpa-steamroller.js +0 -158
  891. package/src/inference/pipelines/text/buffer-types.d.ts +0 -7
  892. package/src/inference/pipelines/text/buffer-types.js +0 -4
  893. package/src/inference/pipelines/text/chat-format.d.ts +0 -46
  894. package/src/inference/pipelines/text/chat-format.js +0 -390
  895. package/src/inference/pipelines/text/config.d.ts +0 -244
  896. package/src/inference/pipelines/text/config.js +0 -703
  897. package/src/inference/pipelines/text/debug-utils/config.d.ts +0 -144
  898. package/src/inference/pipelines/text/debug-utils/config.js +0 -156
  899. package/src/inference/pipelines/text/debug-utils/index.d.ts +0 -53
  900. package/src/inference/pipelines/text/debug-utils/index.js +0 -44
  901. package/src/inference/pipelines/text/debug-utils/logging.d.ts +0 -106
  902. package/src/inference/pipelines/text/debug-utils/logging.js +0 -152
  903. package/src/inference/pipelines/text/debug-utils/tensor.d.ts +0 -119
  904. package/src/inference/pipelines/text/debug-utils/tensor.js +0 -268
  905. package/src/inference/pipelines/text/debug-utils/utils.d.ts +0 -77
  906. package/src/inference/pipelines/text/debug-utils/utils.js +0 -139
  907. package/src/inference/pipelines/text/debug-utils.d.ts +0 -42
  908. package/src/inference/pipelines/text/debug-utils.js +0 -34
  909. package/src/inference/pipelines/text/embed.d.ts +0 -67
  910. package/src/inference/pipelines/text/embed.js +0 -455
  911. package/src/inference/pipelines/text/execution-plan.d.ts +0 -116
  912. package/src/inference/pipelines/text/execution-plan.js +0 -329
  913. package/src/inference/pipelines/text/execution-v0-contract-helpers.d.ts +0 -59
  914. package/src/inference/pipelines/text/execution-v0-contract-helpers.js +0 -937
  915. package/src/inference/pipelines/text/execution-v0-runtime-builders.d.ts +0 -15
  916. package/src/inference/pipelines/text/execution-v0-runtime-builders.js +0 -279
  917. package/src/inference/pipelines/text/execution-v0.d.ts +0 -66
  918. package/src/inference/pipelines/text/execution-v0.js +0 -255
  919. package/src/inference/pipelines/text/ffn/dense.d.ts +0 -40
  920. package/src/inference/pipelines/text/ffn/dense.js +0 -759
  921. package/src/inference/pipelines/text/ffn/index.d.ts +0 -23
  922. package/src/inference/pipelines/text/ffn/index.js +0 -16
  923. package/src/inference/pipelines/text/ffn/moe.d.ts +0 -21
  924. package/src/inference/pipelines/text/ffn/moe.js +0 -49
  925. package/src/inference/pipelines/text/ffn/sandwich.d.ts +0 -25
  926. package/src/inference/pipelines/text/ffn/sandwich.js +0 -196
  927. package/src/inference/pipelines/text/ffn/standard.d.ts +0 -23
  928. package/src/inference/pipelines/text/ffn/standard.js +0 -87
  929. package/src/inference/pipelines/text/ffn/types.d.ts +0 -30
  930. package/src/inference/pipelines/text/ffn/types.js +0 -25
  931. package/src/inference/pipelines/text/ffn.d.ts +0 -31
  932. package/src/inference/pipelines/text/ffn.js +0 -18
  933. package/src/inference/pipelines/text/finiteness-guard-status.d.ts +0 -11
  934. package/src/inference/pipelines/text/finiteness-guard-status.js +0 -21
  935. package/src/inference/pipelines/text/finiteness-policy.d.ts +0 -35
  936. package/src/inference/pipelines/text/finiteness-policy.js +0 -45
  937. package/src/inference/pipelines/text/generator-helpers.d.ts +0 -34
  938. package/src/inference/pipelines/text/generator-helpers.js +0 -175
  939. package/src/inference/pipelines/text/generator-runtime.d.ts +0 -93
  940. package/src/inference/pipelines/text/generator-runtime.js +0 -378
  941. package/src/inference/pipelines/text/generator-steps.d.ts +0 -127
  942. package/src/inference/pipelines/text/generator-steps.js +0 -1197
  943. package/src/inference/pipelines/text/generator.d.ts +0 -41
  944. package/src/inference/pipelines/text/generator.js +0 -1361
  945. package/src/inference/pipelines/text/index.d.ts +0 -5
  946. package/src/inference/pipelines/text/index.js +0 -6
  947. package/src/inference/pipelines/text/init.d.ts +0 -312
  948. package/src/inference/pipelines/text/init.js +0 -1112
  949. package/src/inference/pipelines/text/kernel-path-auto-select.d.ts +0 -12
  950. package/src/inference/pipelines/text/kernel-path-auto-select.js +0 -92
  951. package/src/inference/pipelines/text/kernel-trace.d.ts +0 -152
  952. package/src/inference/pipelines/text/kernel-trace.js +0 -330
  953. package/src/inference/pipelines/text/layer-plan.d.ts +0 -65
  954. package/src/inference/pipelines/text/layer-plan.js +0 -249
  955. package/src/inference/pipelines/text/layer.d.ts +0 -56
  956. package/src/inference/pipelines/text/layer.js +0 -922
  957. package/src/inference/pipelines/text/linear-attention.d.ts +0 -109
  958. package/src/inference/pipelines/text/linear-attention.js +0 -907
  959. package/src/inference/pipelines/text/logits/cpu.d.ts +0 -81
  960. package/src/inference/pipelines/text/logits/cpu.js +0 -91
  961. package/src/inference/pipelines/text/logits/gpu.d.ts +0 -113
  962. package/src/inference/pipelines/text/logits/gpu.js +0 -411
  963. package/src/inference/pipelines/text/logits/index.d.ts +0 -62
  964. package/src/inference/pipelines/text/logits/index.js +0 -306
  965. package/src/inference/pipelines/text/logits/types.d.ts +0 -46
  966. package/src/inference/pipelines/text/logits/types.js +0 -4
  967. package/src/inference/pipelines/text/logits/utils.d.ts +0 -56
  968. package/src/inference/pipelines/text/logits/utils.js +0 -68
  969. package/src/inference/pipelines/text/logits.d.ts +0 -27
  970. package/src/inference/pipelines/text/logits.js +0 -16
  971. package/src/inference/pipelines/text/lora-apply.d.ts +0 -28
  972. package/src/inference/pipelines/text/lora-apply.js +0 -76
  973. package/src/inference/pipelines/text/lora-types.d.ts +0 -39
  974. package/src/inference/pipelines/text/lora-types.js +0 -18
  975. package/src/inference/pipelines/text/lora.d.ts +0 -18
  976. package/src/inference/pipelines/text/lora.js +0 -12
  977. package/src/inference/pipelines/text/model-load.d.ts +0 -58
  978. package/src/inference/pipelines/text/model-load.js +0 -739
  979. package/src/inference/pipelines/text/moe-cache.d.ts +0 -32
  980. package/src/inference/pipelines/text/moe-cache.js +0 -108
  981. package/src/inference/pipelines/text/moe-cpu-gptoss.d.ts +0 -9
  982. package/src/inference/pipelines/text/moe-cpu-gptoss.js +0 -115
  983. package/src/inference/pipelines/text/moe-cpu.d.ts +0 -13
  984. package/src/inference/pipelines/text/moe-cpu.js +0 -120
  985. package/src/inference/pipelines/text/moe-gpu.d.ts +0 -13
  986. package/src/inference/pipelines/text/moe-gpu.js +0 -635
  987. package/src/inference/pipelines/text/moe-helpers.d.ts +0 -12
  988. package/src/inference/pipelines/text/moe-helpers.js +0 -21
  989. package/src/inference/pipelines/text/moe-impl.d.ts +0 -117
  990. package/src/inference/pipelines/text/moe-impl.js +0 -9
  991. package/src/inference/pipelines/text/moe-shape-validator.d.ts +0 -31
  992. package/src/inference/pipelines/text/moe-shape-validator.js +0 -78
  993. package/src/inference/pipelines/text/ops.d.ts +0 -167
  994. package/src/inference/pipelines/text/ops.js +0 -367
  995. package/src/inference/pipelines/text/probes.d.ts +0 -31
  996. package/src/inference/pipelines/text/probes.js +0 -170
  997. package/src/inference/pipelines/text/sampling.d.ts +0 -54
  998. package/src/inference/pipelines/text/sampling.js +0 -249
  999. package/src/inference/pipelines/text/state.d.ts +0 -112
  1000. package/src/inference/pipelines/text/state.js +0 -152
  1001. package/src/inference/pipelines/text/types.d.ts +0 -627
  1002. package/src/inference/pipelines/text/types.js +0 -4
  1003. package/src/inference/pipelines/text/weights.d.ts +0 -110
  1004. package/src/inference/pipelines/text/weights.js +0 -173
  1005. package/src/inference/pipelines/text.d.ts +0 -157
  1006. package/src/inference/pipelines/text.js +0 -608
  1007. package/src/inference/speculative.d.ts +0 -239
  1008. package/src/inference/speculative.js +0 -402
  1009. package/src/inference/test-harness.d.ts +0 -178
  1010. package/src/inference/test-harness.js +0 -359
  1011. package/src/inference/tokenizer.d.ts +0 -72
  1012. package/src/inference/tokenizer.js +0 -239
  1013. package/src/inference/tokenizers/base.d.ts +0 -39
  1014. package/src/inference/tokenizers/base.js +0 -69
  1015. package/src/inference/tokenizers/bpe.d.ts +0 -27
  1016. package/src/inference/tokenizers/bpe.js +0 -180
  1017. package/src/inference/tokenizers/bundled.d.ts +0 -63
  1018. package/src/inference/tokenizers/bundled.js +0 -1009
  1019. package/src/inference/tokenizers/sentencepiece.d.ts +0 -28
  1020. package/src/inference/tokenizers/sentencepiece.js +0 -401
  1021. package/src/inference/tokenizers/types.d.ts +0 -166
  1022. package/src/inference/tokenizers/types.js +0 -7
  1023. package/src/loader/doppler-loader.d.ts +0 -134
  1024. package/src/loader/doppler-loader.js +0 -1052
  1025. package/src/loader/dtype-utils.d.ts +0 -40
  1026. package/src/loader/dtype-utils.js +0 -61
  1027. package/src/loader/embedding-loader.d.ts +0 -56
  1028. package/src/loader/embedding-loader.js +0 -211
  1029. package/src/loader/experts/expert-cache.d.ts +0 -156
  1030. package/src/loader/experts/expert-cache.js +0 -382
  1031. package/src/loader/experts/expert-loader.d.ts +0 -108
  1032. package/src/loader/experts/expert-loader.js +0 -388
  1033. package/src/loader/final-weights-loader.d.ts +0 -68
  1034. package/src/loader/final-weights-loader.js +0 -268
  1035. package/src/loader/index.d.ts +0 -150
  1036. package/src/loader/index.js +0 -124
  1037. package/src/loader/layer-loader.d.ts +0 -63
  1038. package/src/loader/layer-loader.js +0 -418
  1039. package/src/loader/loader-state.d.ts +0 -51
  1040. package/src/loader/loader-state.js +0 -142
  1041. package/src/loader/loader-types.d.ts +0 -236
  1042. package/src/loader/loader-types.js +0 -4
  1043. package/src/loader/manifest-config.d.ts +0 -97
  1044. package/src/loader/manifest-config.js +0 -132
  1045. package/src/loader/memory-monitor.d.ts +0 -112
  1046. package/src/loader/memory-monitor.js +0 -284
  1047. package/src/loader/multi-model-loader.d.ts +0 -51
  1048. package/src/loader/multi-model-loader.js +0 -133
  1049. package/src/loader/quantization-constants.d.ts +0 -23
  1050. package/src/loader/quantization-constants.js +0 -14
  1051. package/src/loader/shard-cache.d.ts +0 -60
  1052. package/src/loader/shard-cache.js +0 -638
  1053. package/src/loader/shard-resolver.d.ts +0 -12
  1054. package/src/loader/shard-resolver.js +0 -105
  1055. package/src/loader/tensors/tensor-loader.d.ts +0 -154
  1056. package/src/loader/tensors/tensor-loader.js +0 -497
  1057. package/src/loader/tensors/tensor-reader.d.ts +0 -22
  1058. package/src/loader/tensors/tensor-reader.js +0 -113
  1059. package/src/loader/tensors/tensor-role.d.ts +0 -7
  1060. package/src/loader/tensors/tensor-role.js +0 -12
  1061. package/src/loader/weight-downcast.d.ts +0 -62
  1062. package/src/loader/weight-downcast.js +0 -213
  1063. package/src/loader/weights.d.ts +0 -22
  1064. package/src/loader/weights.js +0 -4
  1065. package/src/memory/address-table.d.ts +0 -104
  1066. package/src/memory/address-table.js +0 -114
  1067. package/src/memory/buffer-pool.d.ts +0 -204
  1068. package/src/memory/buffer-pool.js +0 -821
  1069. package/src/memory/capability.d.ts +0 -49
  1070. package/src/memory/capability.js +0 -95
  1071. package/src/memory/heap-manager.d.ts +0 -104
  1072. package/src/memory/heap-manager.js +0 -264
  1073. package/src/memory/unified-detect.d.ts +0 -59
  1074. package/src/memory/unified-detect.js +0 -192
  1075. package/src/rules/converter/execution.rules.json +0 -20
  1076. package/src/rules/converter/tensor-roles.rules.json +0 -13
  1077. package/src/rules/converter/tokenizer.rules.json +0 -7
  1078. package/src/rules/execution-rules-contract-check.d.ts +0 -17
  1079. package/src/rules/execution-rules-contract-check.js +0 -245
  1080. package/src/rules/inference/attention.rules.json +0 -54
  1081. package/src/rules/inference/config.rules.json +0 -58
  1082. package/src/rules/inference/dtype.rules.json +0 -99
  1083. package/src/rules/inference/execution.rules.json +0 -45
  1084. package/src/rules/inference/ffn.rules.json +0 -35
  1085. package/src/rules/inference/kernel-path.rules.json +0 -92
  1086. package/src/rules/inference/layer-pattern.rules.json +0 -16
  1087. package/src/rules/inference/layer.rules.json +0 -7
  1088. package/src/rules/inference/moe.rules.json +0 -48
  1089. package/src/rules/kernels/attention.rules.json +0 -61
  1090. package/src/rules/kernels/conv2d.rules.json +0 -6
  1091. package/src/rules/kernels/depthwise-conv2d.rules.json +0 -6
  1092. package/src/rules/kernels/dequant.rules.json +0 -58
  1093. package/src/rules/kernels/energy.rules.json +0 -22
  1094. package/src/rules/kernels/fused-ffn.rules.json +0 -13
  1095. package/src/rules/kernels/fused-matmul-residual.rules.json +0 -6
  1096. package/src/rules/kernels/fused-matmul-rmsnorm.rules.json +0 -8
  1097. package/src/rules/kernels/gather.rules.json +0 -12
  1098. package/src/rules/kernels/gelu.rules.json +0 -11
  1099. package/src/rules/kernels/grouped-pointwise-conv2d.rules.json +0 -6
  1100. package/src/rules/kernels/groupnorm.rules.json +0 -10
  1101. package/src/rules/kernels/kernel-validator.d.ts +0 -24
  1102. package/src/rules/kernels/kernel-validator.js +0 -160
  1103. package/src/rules/kernels/kv_quantize.rules.json +0 -7
  1104. package/src/rules/kernels/layernorm.rules.json +0 -6
  1105. package/src/rules/kernels/matmul.rules.json +0 -60
  1106. package/src/rules/kernels/modulate.rules.json +0 -6
  1107. package/src/rules/kernels/moe.rules.gptoss.json +0 -105
  1108. package/src/rules/kernels/moe.rules.json +0 -11
  1109. package/src/rules/kernels/pixel_shuffle.rules.json +0 -6
  1110. package/src/rules/kernels/relu.rules.json +0 -6
  1111. package/src/rules/kernels/repeat-channels.rules.json +0 -6
  1112. package/src/rules/kernels/residual.rules.json +0 -12
  1113. package/src/rules/kernels/rmsnorm.rules.json +0 -11
  1114. package/src/rules/kernels/rope.rules.json +0 -6
  1115. package/src/rules/kernels/sample.rules.json +0 -6
  1116. package/src/rules/kernels/sana-linear-attention.rules.json +0 -6
  1117. package/src/rules/kernels/scale.rules.json +0 -6
  1118. package/src/rules/kernels/silu.rules.json +0 -21
  1119. package/src/rules/kernels/softmax.rules.json +0 -23
  1120. package/src/rules/kernels/split-qg.rules.json +0 -6
  1121. package/src/rules/kernels/split-qkv.rules.json +0 -6
  1122. package/src/rules/kernels/upsample2d.rules.json +0 -6
  1123. package/src/rules/layer-pattern-contract-check.d.ts +0 -17
  1124. package/src/rules/layer-pattern-contract-check.js +0 -231
  1125. package/src/rules/loader/tensor-loader.rules.json +0 -15
  1126. package/src/rules/loader/weights.rules.json +0 -41
  1127. package/src/rules/rule-registry.d.ts +0 -76
  1128. package/src/rules/rule-registry.js +0 -241
  1129. package/src/rules/tooling/command-runtime.rules.json +0 -56
  1130. package/src/storage/backends/idb-store.d.ts +0 -52
  1131. package/src/storage/backends/idb-store.js +0 -590
  1132. package/src/storage/backends/memory-store.d.ts +0 -36
  1133. package/src/storage/backends/memory-store.js +0 -242
  1134. package/src/storage/backends/opfs-store.d.ts +0 -41
  1135. package/src/storage/backends/opfs-store.js +0 -473
  1136. package/src/storage/blake3.d.ts +0 -17
  1137. package/src/storage/blake3.js +0 -269
  1138. package/src/storage/download-types.d.ts +0 -157
  1139. package/src/storage/download-types.js +0 -48
  1140. package/src/storage/downloader.d.ts +0 -103
  1141. package/src/storage/downloader.js +0 -1121
  1142. package/src/storage/emulated-vram.d.ts +0 -264
  1143. package/src/storage/emulated-vram.js +0 -576
  1144. package/src/storage/export.d.ts +0 -20
  1145. package/src/storage/export.js +0 -159
  1146. package/src/storage/index.d.ts +0 -256
  1147. package/src/storage/index.js +0 -188
  1148. package/src/storage/inventory.d.ts +0 -26
  1149. package/src/storage/inventory.js +0 -218
  1150. package/src/storage/preflight.d.ts +0 -144
  1151. package/src/storage/preflight.js +0 -316
  1152. package/src/storage/quickstart-downloader.d.ts +0 -154
  1153. package/src/storage/quickstart-downloader.js +0 -271
  1154. package/src/storage/quota.d.ts +0 -150
  1155. package/src/storage/quota.js +0 -304
  1156. package/src/storage/registry.d.ts +0 -28
  1157. package/src/storage/registry.js +0 -131
  1158. package/src/storage/reports.d.ts +0 -20
  1159. package/src/storage/reports.js +0 -94
  1160. package/src/storage/shard-manager.d.ts +0 -151
  1161. package/src/storage/shard-manager.js +0 -850
  1162. package/src/storage/source-artifact-store.d.ts +0 -52
  1163. package/src/storage/source-artifact-store.js +0 -234
  1164. package/src/sw.d.ts +0 -1
  1165. package/src/sw.js +0 -187
  1166. package/src/tooling/browser-command-runner.d.ts +0 -28
  1167. package/src/tooling/browser-command-runner.js +0 -82
  1168. package/src/tooling/command-api-constants.d.ts +0 -9
  1169. package/src/tooling/command-api-constants.js +0 -9
  1170. package/src/tooling/command-api-family-normalizers.d.ts +0 -9
  1171. package/src/tooling/command-api-family-normalizers.js +0 -343
  1172. package/src/tooling/command-api-helpers.d.ts +0 -25
  1173. package/src/tooling/command-api-helpers.js +0 -262
  1174. package/src/tooling/command-api.d.ts +0 -173
  1175. package/src/tooling/command-api.js +0 -76
  1176. package/src/tooling/command-envelope.d.ts +0 -81
  1177. package/src/tooling/command-envelope.js +0 -198
  1178. package/src/tooling/command-runner-shared.d.ts +0 -73
  1179. package/src/tooling/command-runner-shared.js +0 -180
  1180. package/src/tooling/command-runner.html +0 -45
  1181. package/src/tooling/conversion-config-materializer.d.ts +0 -24
  1182. package/src/tooling/conversion-config-materializer.js +0 -97
  1183. package/src/tooling/lean-execution-contract-runner.d.ts +0 -43
  1184. package/src/tooling/lean-execution-contract-runner.js +0 -158
  1185. package/src/tooling/lean-execution-contract.d.ts +0 -16
  1186. package/src/tooling/lean-execution-contract.js +0 -228
  1187. package/src/tooling/node-browser-command-runner.d.ts +0 -34
  1188. package/src/tooling/node-browser-command-runner.js +0 -813
  1189. package/src/tooling/node-command-runner.d.ts +0 -36
  1190. package/src/tooling/node-command-runner.js +0 -168
  1191. package/src/tooling/node-convert-worker-pool.d.ts +0 -16
  1192. package/src/tooling/node-convert-worker-pool.js +0 -186
  1193. package/src/tooling/node-convert-worker.d.ts +0 -1
  1194. package/src/tooling/node-convert-worker.js +0 -60
  1195. package/src/tooling/node-convert.d.ts +0 -54
  1196. package/src/tooling/node-converter.d.ts +0 -1
  1197. package/src/tooling/node-converter.js +0 -1315
  1198. package/src/tooling/node-file-fetch.d.ts +0 -1
  1199. package/src/tooling/node-file-fetch.js +0 -38
  1200. package/src/tooling/node-source-runtime.d.ts +0 -19
  1201. package/src/tooling/node-source-runtime.js +0 -586
  1202. package/src/tooling/node-webgpu.d.ts +0 -6
  1203. package/src/tooling/node-webgpu.js +0 -267
  1204. package/src/tooling/opfs-cache.d.ts +0 -11
  1205. package/src/tooling/opfs-cache.js +0 -191
  1206. package/src/tooling/runtime-input-composition.d.ts +0 -38
  1207. package/src/tooling/runtime-input-composition.js +0 -86
  1208. package/src/tooling/source-runtime-bundle.d.ts +0 -137
  1209. package/src/tooling/source-runtime-bundle.js +0 -711
  1210. package/src/tooling/source-runtime-materializer.d.ts +0 -6
  1211. package/src/tooling/source-runtime-materializer.js +0 -93
  1212. package/src/tooling-exports.browser.d.ts +0 -7
  1213. package/src/tooling-exports.browser.js +0 -2
  1214. package/src/tooling-exports.d.ts +0 -22
  1215. package/src/tooling-exports.js +0 -7
  1216. package/src/tooling-exports.shared.d.ts +0 -105
  1217. package/src/tooling-exports.shared.js +0 -92
  1218. package/src/training/README.md +0 -153
  1219. package/src/training/artifacts.d.ts +0 -160
  1220. package/src/training/artifacts.js +0 -896
  1221. package/src/training/attention-backward.d.ts +0 -30
  1222. package/src/training/attention-backward.js +0 -232
  1223. package/src/training/attention-forward.d.ts +0 -22
  1224. package/src/training/attention-forward.js +0 -82
  1225. package/src/training/autograd.d.ts +0 -51
  1226. package/src/training/autograd.js +0 -408
  1227. package/src/training/checkpoint-watch.d.ts +0 -8
  1228. package/src/training/checkpoint-watch.js +0 -139
  1229. package/src/training/checkpoint.d.ts +0 -36
  1230. package/src/training/checkpoint.js +0 -277
  1231. package/src/training/clip.d.ts +0 -9
  1232. package/src/training/clip.js +0 -55
  1233. package/src/training/dataloader.d.ts +0 -8
  1234. package/src/training/dataloader.js +0 -44
  1235. package/src/training/datasets/index.d.ts +0 -12
  1236. package/src/training/datasets/index.js +0 -6
  1237. package/src/training/datasets/jsonl.d.ts +0 -11
  1238. package/src/training/datasets/jsonl.js +0 -50
  1239. package/src/training/datasets/reploid.d.ts +0 -3
  1240. package/src/training/datasets/reploid.js +0 -36
  1241. package/src/training/datasets/text-pairs.d.ts +0 -21
  1242. package/src/training/datasets/text-pairs.js +0 -42
  1243. package/src/training/datasets/token-batch.d.ts +0 -21
  1244. package/src/training/datasets/token-batch.js +0 -52
  1245. package/src/training/datasets/translation-pairs.d.ts +0 -34
  1246. package/src/training/datasets/translation-pairs.js +0 -49
  1247. package/src/training/distillation/artifacts.d.ts +0 -71
  1248. package/src/training/distillation/artifacts.js +0 -132
  1249. package/src/training/distillation/checkpoint-watch.d.ts +0 -10
  1250. package/src/training/distillation/checkpoint-watch.js +0 -58
  1251. package/src/training/distillation/dataset.d.ts +0 -59
  1252. package/src/training/distillation/dataset.js +0 -337
  1253. package/src/training/distillation/eval.d.ts +0 -34
  1254. package/src/training/distillation/eval.js +0 -310
  1255. package/src/training/distillation/index.d.ts +0 -29
  1256. package/src/training/distillation/index.js +0 -29
  1257. package/src/training/distillation/runtime.d.ts +0 -20
  1258. package/src/training/distillation/runtime.js +0 -121
  1259. package/src/training/distillation/scoreboard.d.ts +0 -6
  1260. package/src/training/distillation/scoreboard.js +0 -8
  1261. package/src/training/distillation/stage-a.d.ts +0 -45
  1262. package/src/training/distillation/stage-a.js +0 -338
  1263. package/src/training/distillation/stage-b.d.ts +0 -24
  1264. package/src/training/distillation/stage-b.js +0 -20
  1265. package/src/training/distillation/student-fixture.d.ts +0 -22
  1266. package/src/training/distillation/student-fixture.js +0 -846
  1267. package/src/training/distillation/suite-data.d.ts +0 -45
  1268. package/src/training/distillation/suite-data.js +0 -189
  1269. package/src/training/export.d.ts +0 -32
  1270. package/src/training/export.js +0 -112
  1271. package/src/training/index.d.ts +0 -62
  1272. package/src/training/index.js +0 -51
  1273. package/src/training/lora-pipeline.d.ts +0 -40
  1274. package/src/training/lora-pipeline.js +0 -793
  1275. package/src/training/lora.d.ts +0 -19
  1276. package/src/training/lora.js +0 -71
  1277. package/src/training/loss-scaling.d.ts +0 -21
  1278. package/src/training/loss-scaling.js +0 -80
  1279. package/src/training/loss.d.ts +0 -10
  1280. package/src/training/loss.js +0 -40
  1281. package/src/training/objectives/base.d.ts +0 -58
  1282. package/src/training/objectives/base.js +0 -38
  1283. package/src/training/objectives/cross_entropy.d.ts +0 -18
  1284. package/src/training/objectives/cross_entropy.js +0 -34
  1285. package/src/training/objectives/distill_kd.d.ts +0 -16
  1286. package/src/training/objectives/distill_kd.js +0 -365
  1287. package/src/training/objectives/distill_triplet.d.ts +0 -16
  1288. package/src/training/objectives/distill_triplet.js +0 -408
  1289. package/src/training/objectives/index.d.ts +0 -12
  1290. package/src/training/objectives/index.js +0 -6
  1291. package/src/training/objectives/ul_stage1_joint.d.ts +0 -16
  1292. package/src/training/objectives/ul_stage1_joint.js +0 -188
  1293. package/src/training/objectives/ul_stage2_base.d.ts +0 -16
  1294. package/src/training/objectives/ul_stage2_base.js +0 -218
  1295. package/src/training/operator-artifacts.d.ts +0 -62
  1296. package/src/training/operator-artifacts.js +0 -140
  1297. package/src/training/operator-command.d.ts +0 -5
  1298. package/src/training/operator-command.js +0 -455
  1299. package/src/training/operator-eval.d.ts +0 -48
  1300. package/src/training/operator-eval.js +0 -230
  1301. package/src/training/operator-scoreboard.d.ts +0 -5
  1302. package/src/training/operator-scoreboard.js +0 -44
  1303. package/src/training/optimizer.d.ts +0 -22
  1304. package/src/training/optimizer.js +0 -127
  1305. package/src/training/runner.d.ts +0 -248
  1306. package/src/training/runner.js +0 -1220
  1307. package/src/training/suite.d.ts +0 -299
  1308. package/src/training/suite.js +0 -2196
  1309. package/src/training/tensor-factory.d.ts +0 -9
  1310. package/src/training/tensor-factory.js +0 -13
  1311. package/src/training/trainer.d.ts +0 -89
  1312. package/src/training/trainer.js +0 -299
  1313. package/src/training/ul_dataset.d.ts +0 -47
  1314. package/src/training/ul_dataset.js +0 -151
  1315. package/src/training/ul_schedule.d.ts +0 -6
  1316. package/src/training/ul_schedule.js +0 -29
  1317. package/src/training/workloads.d.ts +0 -164
  1318. package/src/training/workloads.js +0 -530
  1319. package/src/types/chrome.d.ts +0 -36
  1320. package/src/types/chrome.js +0 -1
  1321. package/src/types/gpu.d.ts +0 -185
  1322. package/src/types/gpu.js +0 -5
  1323. package/src/types/index.d.ts +0 -3
  1324. package/src/types/index.js +0 -3
  1325. package/src/types/inference.d.ts +0 -197
  1326. package/src/types/inference.js +0 -5
  1327. package/src/types/model.d.ts +0 -130
  1328. package/src/types/model.js +0 -5
  1329. package/src/utils/index.d.ts +0 -7
  1330. package/src/utils/index.js +0 -7
  1331. package/src/utils/load-json.d.ts +0 -5
  1332. package/src/utils/load-json.js +0 -23
  1333. package/src/utils/plain-object.d.ts +0 -1
  1334. package/src/utils/plain-object.js +0 -3
  1335. package/src/utils/sha256.d.ts +0 -4
  1336. package/src/utils/sha256.js +0 -135
  1337. package/src/version.d.ts +0 -2
  1338. package/src/version.js +0 -2
  1339. package/tools/convert-safetensors-node.js +0 -233
  1340. package/tools/doppler-cli.js +0 -1452
@@ -1,2152 +0,0 @@
1
- import { log } from '../debug/index.js';
2
- import { getExpectedShardHash } from '../formats/rdrr/index.js';
3
- import {
4
- computeHash,
5
- createStreamingHasher,
6
- createShardWriter,
7
- deleteShard,
8
- getShardStoredSize,
9
- loadShard as loadShardFromStore,
10
- shardExists,
11
- streamShardRange,
12
- } from '../storage/shard-manager.js';
13
- import { ERROR_CODES, createDopplerError } from '../errors/doppler-error.js';
14
- import { DEFAULT_DISTRIBUTION_CONFIG } from '../config/schema/distribution.schema.js';
15
- import {
16
- P2P_TRANSPORT_CONTRACT_VERSION,
17
- P2P_TRANSPORT_ERROR_CODES,
18
- assertSupportedP2PTransportContract,
19
- createP2PTransportError,
20
- normalizeP2PTransportError,
21
- normalizeP2PTransportResult,
22
- isP2PTransportRetryable,
23
- } from './p2p-transport-contract.js';
24
- import {
25
- normalizeP2PControlPlaneConfig,
26
- resolveP2PSessionToken,
27
- evaluateP2PPolicyDecision,
28
- } from './p2p-control-plane.js';
29
- import { createBrowserWebRTCDataPlaneTransport } from './p2p-webrtc-browser.js';
30
-
31
- const DISTRIBUTION_SOURCE_CACHE = 'cache';
32
- const DISTRIBUTION_SOURCE_P2P = 'p2p';
33
- const DISTRIBUTION_SOURCE_HTTP = 'http';
34
- const DISTRIBUTION_DECISION_TRACE_SCHEMA_VERSION = 1;
35
- const DISTRIBUTION_DELIVERY_METRICS_SCHEMA_VERSION = 1;
36
- const DISTRIBUTION_DELIVERY_METRICS_EVENT_SCHEMA_VERSION = 1;
37
-
38
- const DISTRIBUTION_SOURCES = Object.freeze(
39
- [...DEFAULT_DISTRIBUTION_CONFIG.sourceOrder]
40
- );
41
- const DEFAULT_SOURCE_MATRIX = Object.freeze({
42
- cache: { ...DEFAULT_DISTRIBUTION_CONFIG.sourceMatrix.cache },
43
- p2p: { ...DEFAULT_DISTRIBUTION_CONFIG.sourceMatrix.p2p },
44
- http: { ...DEFAULT_DISTRIBUTION_CONFIG.sourceMatrix.http },
45
- });
46
-
47
- const DEFAULT_P2P_TIMEOUT_MS = DEFAULT_DISTRIBUTION_CONFIG.p2p.timeoutMs;
48
- const DEFAULT_P2P_MAX_RETRIES = DEFAULT_DISTRIBUTION_CONFIG.p2p.maxRetries;
49
- const DEFAULT_P2P_RETRY_DELAY_MS = DEFAULT_DISTRIBUTION_CONFIG.p2p.retryDelayMs;
50
- const DEFAULT_P2P_RATE_LIMIT_PER_MINUTE = DEFAULT_DISTRIBUTION_CONFIG.p2p.abuse.rateLimitPerMinute;
51
- const DEFAULT_P2P_MAX_CONSECUTIVE_FAILURES = DEFAULT_DISTRIBUTION_CONFIG.p2p.abuse.maxConsecutiveFailures;
52
- const DEFAULT_P2P_QUARANTINE_MS = DEFAULT_DISTRIBUTION_CONFIG.p2p.abuse.quarantineMs;
53
- const DEFAULT_P2P_CONTROL_PLANE_TOKEN_REFRESH_SKEW_MS = DEFAULT_DISTRIBUTION_CONFIG.p2p.controlPlane.tokenRefreshSkewMs;
54
-
55
- const inFlightDeliveries = new Map();
56
- const p2pTransportPolicyState = new WeakMap();
57
-
58
- function normalizeDistributionSourceOrder(rawSources = []) {
59
- if (rawSources === undefined || rawSources === null) {
60
- return [...DISTRIBUTION_SOURCES];
61
- }
62
- if (!Array.isArray(rawSources)) {
63
- throw new Error('distribution.sourceOrder must be an array when provided.');
64
- }
65
-
66
- const normalized = [];
67
- const seen = new Set();
68
-
69
- for (const value of rawSources) {
70
- const source = String(value || '').trim().toLowerCase();
71
- if (!DISTRIBUTION_SOURCES.includes(source)) {
72
- throw new Error(`distribution.sourceOrder contains unsupported source "${source || value}".`);
73
- }
74
- if (seen.has(source)) continue;
75
- seen.add(source);
76
- normalized.push(source);
77
- }
78
-
79
- if (normalized.length === 0) {
80
- throw new Error('distribution.sourceOrder must include at least one supported source.');
81
- }
82
- return normalized;
83
- }
84
-
85
- function normalizeInteger(value, fallback, allowZero = false) {
86
- const parsed = Number(value);
87
- const min = allowZero ? 0 : 1;
88
- return Number.isFinite(parsed) && parsed >= min && Number.isInteger(parsed)
89
- ? parsed
90
- : fallback;
91
- }
92
-
93
- function normalizeRequiredInteger(value, label, { allowZero = false, fallback = null } = {}) {
94
- if (value === undefined || value === null) {
95
- if (fallback !== null) {
96
- return fallback;
97
- }
98
- throw new Error(`${label} is required.`);
99
- }
100
- const parsed = Number(value);
101
- const min = allowZero ? 0 : 1;
102
- if (!Number.isInteger(parsed) || parsed < min) {
103
- throw new Error(
104
- `${label} must be a ${allowZero ? 'non-negative' : 'positive'} integer when provided.`
105
- );
106
- }
107
- return parsed;
108
- }
109
-
110
- function normalizeContentEncodings(value) {
111
- if (!value) return [];
112
- return value
113
- .split(',')
114
- .map((entry) => entry.trim().toLowerCase())
115
- .filter(Boolean);
116
- }
117
-
118
- function normalizeManifestVersionSet(value) {
119
- if (value === undefined || value === null) return null;
120
- const normalized = String(value).trim();
121
- return normalized || null;
122
- }
123
-
124
- function normalizeSamplingRate(value, fallback = 1, label = 'distribution.sourceDecision.trace.samplingRate') {
125
- if (value === undefined || value === null) {
126
- return fallback;
127
- }
128
- const parsed = Number(value);
129
- if (!Number.isFinite(parsed)) {
130
- throw new Error(`${label} must be a finite number between 0 and 1 when provided.`);
131
- }
132
- if (parsed < 0 || parsed > 1) {
133
- throw new Error(`${label} must be between 0 and 1 when provided.`);
134
- }
135
- return parsed;
136
- }
137
-
138
- function normalizeOptionalToken(value) {
139
- if (value === undefined || value === null) {
140
- return null;
141
- }
142
- const normalized = String(value).trim();
143
- return normalized || null;
144
- }
145
-
146
- function normalizeOptionalTimestamp(value) {
147
- if (value === undefined || value === null) {
148
- return null;
149
- }
150
- const parsed = Number(value);
151
- if (!Number.isFinite(parsed) || parsed <= 0) {
152
- return null;
153
- }
154
- return Math.floor(parsed);
155
- }
156
-
157
- function hashStringToUnitInterval(value) {
158
- let hash = 2166136261;
159
- for (let i = 0; i < value.length; i += 1) {
160
- hash ^= value.charCodeAt(i);
161
- hash = Math.imul(hash, 16777619);
162
- }
163
- return (hash >>> 0) / 4294967295;
164
- }
165
-
166
- function shouldEmitDecisionTrace(config, shardIndex, expectedManifestVersionSet, sourceOrder) {
167
- if (config.enabled !== true) {
168
- return false;
169
- }
170
- const samplingRate = normalizeSamplingRate(config.samplingRate, 1);
171
- if (samplingRate >= 1) {
172
- return true;
173
- }
174
- if (samplingRate <= 0) {
175
- return false;
176
- }
177
- if (config.deterministic !== false) {
178
- const seed = [
179
- String(shardIndex),
180
- normalizeManifestVersionSet(expectedManifestVersionSet) ?? '',
181
- Array.isArray(sourceOrder) ? sourceOrder.join(',') : '',
182
- ].join('|');
183
- return hashStringToUnitInterval(seed) < samplingRate;
184
- }
185
- return Math.random() < samplingRate;
186
- }
187
-
188
- function createShardSizeMismatchError(message, details = {}) {
189
- const error = createDopplerError(
190
- ERROR_CODES.DISTRIBUTION_SHARD_SIZE_MISMATCH,
191
- message
192
- );
193
- Object.assign(error, details);
194
- return error;
195
- }
196
-
197
- function parseContentLengthHeader(response, shardIndex) {
198
- const raw = response?.headers?.get?.('content-length');
199
- if (raw == null || raw === '') return null;
200
- const parsed = Number(raw);
201
- if (!Number.isInteger(parsed) || parsed < 0) {
202
- throw createShardSizeMismatchError(
203
- `Invalid content-length header for shard ${shardIndex}: ${raw}`,
204
- {
205
- code: 'http_content_length_invalid',
206
- headerValue: raw,
207
- }
208
- );
209
- }
210
- return parsed;
211
- }
212
-
213
- function parseContentRangeHeader(response, shardIndex) {
214
- const raw = response?.headers?.get?.('content-range');
215
- if (raw == null || raw.trim() === '') return null;
216
- const match = /^bytes\s+(\d+)-(\d+)\/(\d+|\*)$/iu.exec(raw.trim());
217
- if (!match) {
218
- throw createShardSizeMismatchError(
219
- `Invalid content-range header for shard ${shardIndex}: ${raw}`,
220
- {
221
- code: 'http_content_range_invalid',
222
- headerValue: raw,
223
- }
224
- );
225
- }
226
- const start = Number(match[1]);
227
- const end = Number(match[2]);
228
- const total = match[3] === '*' ? null : Number(match[3]);
229
- if (!Number.isInteger(start) || !Number.isInteger(end) || end < start) {
230
- throw createShardSizeMismatchError(
231
- `Invalid content-range byte span for shard ${shardIndex}: ${raw}`,
232
- {
233
- code: 'http_content_range_invalid_span',
234
- headerValue: raw,
235
- }
236
- );
237
- }
238
- if (total != null && (!Number.isInteger(total) || total <= 0 || total <= end)) {
239
- throw createShardSizeMismatchError(
240
- `Invalid content-range total size for shard ${shardIndex}: ${raw}`,
241
- {
242
- code: 'http_content_range_invalid_total',
243
- headerValue: raw,
244
- }
245
- );
246
- }
247
- return {
248
- start,
249
- end,
250
- total,
251
- length: end - start + 1,
252
- };
253
- }
254
-
255
- function assertHttpResponseBoundaryHeaders(response, shardIndex, contentLength, contentRange) {
256
- if (response.status === 206 && !contentRange) {
257
- throw createShardSizeMismatchError(
258
- `Shard ${shardIndex} returned HTTP 206 without content-range header.`,
259
- {
260
- code: 'http_content_range_missing',
261
- }
262
- );
263
- }
264
- if (contentRange && response.status !== 206) {
265
- throw createShardSizeMismatchError(
266
- `Shard ${shardIndex} returned content-range header with unexpected HTTP ${response.status}.`,
267
- {
268
- code: 'http_content_range_unexpected_status',
269
- status: response.status,
270
- }
271
- );
272
- }
273
- if (
274
- contentLength != null
275
- && contentRange
276
- && contentLength !== contentRange.length
277
- ) {
278
- throw createShardSizeMismatchError(
279
- `Shard ${shardIndex} content-length/content-range mismatch: content-length=${contentLength}, range-length=${contentRange.length}.`,
280
- {
281
- code: 'http_header_length_mismatch',
282
- contentLength,
283
- contentRangeLength: contentRange.length,
284
- }
285
- );
286
- }
287
- }
288
-
289
- function assertHttpResumeAlignment(
290
- response,
291
- shardIndex,
292
- resumeOffset,
293
- contentRange
294
- ) {
295
- if (!Number.isInteger(resumeOffset) || resumeOffset <= 0) {
296
- return { resetState: false };
297
- }
298
- if (response.status === 200) {
299
- return { resetState: true };
300
- }
301
- if (response.status !== 206 || !contentRange) {
302
- throw createShardSizeMismatchError(
303
- `Shard ${shardIndex} resume response mismatch: expected HTTP 206 with content-range for offset ${resumeOffset}, got HTTP ${response.status}.`,
304
- {
305
- code: 'http_resume_response_mismatch',
306
- status: response.status,
307
- resumeOffset,
308
- }
309
- );
310
- }
311
- if (contentRange.start !== resumeOffset) {
312
- throw createShardSizeMismatchError(
313
- `Shard ${shardIndex} resume content-range start mismatch: expected ${resumeOffset}, got ${contentRange.start}.`,
314
- {
315
- code: 'http_resume_offset_mismatch',
316
- resumeOffset,
317
- contentRangeStart: contentRange.start,
318
- }
319
- );
320
- }
321
- return { resetState: false };
322
- }
323
-
324
- function assertHttpPayloadBoundary(shardIndex, bytesReceived, contentLength, contentRange, expectedSize) {
325
- if (contentLength != null && bytesReceived !== contentLength) {
326
- throw createShardSizeMismatchError(
327
- `Shard ${shardIndex} content-length mismatch: expected ${contentLength}, received ${bytesReceived}.`,
328
- {
329
- code: 'http_content_length_mismatch',
330
- contentLength,
331
- bytesReceived,
332
- }
333
- );
334
- }
335
- if (contentRange && bytesReceived !== contentRange.length) {
336
- throw createShardSizeMismatchError(
337
- `Shard ${shardIndex} content-range mismatch: expected ${contentRange.length} bytes, received ${bytesReceived}.`,
338
- {
339
- code: 'http_content_range_length_mismatch',
340
- contentRangeLength: contentRange.length,
341
- bytesReceived,
342
- }
343
- );
344
- }
345
- if (contentRange?.total != null && Number.isFinite(expectedSize)) {
346
- const normalizedExpectedSize = Math.floor(expectedSize);
347
- if (normalizedExpectedSize >= 0 && contentRange.total !== normalizedExpectedSize) {
348
- throw createShardSizeMismatchError(
349
- `Shard ${shardIndex} content-range total mismatch: expected ${normalizedExpectedSize}, got ${contentRange.total}.`,
350
- {
351
- code: 'http_content_range_total_mismatch',
352
- expectedSize: normalizedExpectedSize,
353
- contentRangeTotal: contentRange.total,
354
- }
355
- );
356
- }
357
- }
358
- }
359
-
360
- function assertP2PPayloadRangeStart(
361
- shardIndex,
362
- rangeStart,
363
- expectedStart
364
- ) {
365
- if (rangeStart == null) {
366
- return;
367
- }
368
- if (!Number.isInteger(rangeStart) || rangeStart < 0) {
369
- throw createShardSizeMismatchError(
370
- `Shard ${shardIndex} p2p payload rangeStart must be a non-negative integer.`,
371
- {
372
- code: 'p2p_range_start_invalid',
373
- rangeStart,
374
- }
375
- );
376
- }
377
- if (rangeStart !== expectedStart) {
378
- throw createShardSizeMismatchError(
379
- `Shard ${shardIndex} p2p resume range mismatch: expected start ${expectedStart}, got ${rangeStart}.`,
380
- {
381
- code: 'p2p_resume_offset_mismatch',
382
- expectedStart,
383
- rangeStart,
384
- }
385
- );
386
- }
387
- }
388
-
389
- function assertP2PTotalSize(shardIndex, totalSize, expectedSize) {
390
- if (totalSize == null || !Number.isFinite(expectedSize)) {
391
- return;
392
- }
393
- const normalizedExpectedSize = Math.floor(expectedSize);
394
- if (totalSize !== normalizedExpectedSize) {
395
- throw createShardSizeMismatchError(
396
- `Shard ${shardIndex} p2p totalSize mismatch: expected ${normalizedExpectedSize}, got ${totalSize}.`,
397
- {
398
- code: 'p2p_total_size_mismatch',
399
- expectedSize: normalizedExpectedSize,
400
- totalSize,
401
- }
402
- );
403
- }
404
- }
405
-
406
- function assertP2PPayloadBoundary(
407
- shardIndex,
408
- rangeStart,
409
- payloadBytes,
410
- totalSize,
411
- writeToStore
412
- ) {
413
- if (totalSize == null) {
414
- return;
415
- }
416
- if (!Number.isInteger(rangeStart) || rangeStart < 0) {
417
- throw createShardSizeMismatchError(
418
- `Shard ${shardIndex} p2p payload rangeStart must be a non-negative integer for boundary checks.`,
419
- {
420
- code: 'p2p_payload_range_start_invalid',
421
- rangeStart,
422
- }
423
- );
424
- }
425
- if (!Number.isInteger(payloadBytes) || payloadBytes < 0) {
426
- throw createShardSizeMismatchError(
427
- `Shard ${shardIndex} p2p payload size must be a non-negative integer for boundary checks.`,
428
- {
429
- code: 'p2p_payload_size_invalid',
430
- payloadBytes,
431
- }
432
- );
433
- }
434
- if (rangeStart + payloadBytes > totalSize) {
435
- throw createShardSizeMismatchError(
436
- `Shard ${shardIndex} p2p payload exceeds total size: start=${rangeStart}, bytes=${payloadBytes}, total=${totalSize}.`,
437
- {
438
- code: 'p2p_payload_exceeds_total',
439
- rangeStart,
440
- payloadBytes,
441
- totalSize,
442
- }
443
- );
444
- }
445
- if (!writeToStore && rangeStart === 0 && payloadBytes !== totalSize) {
446
- throw createShardSizeMismatchError(
447
- `Shard ${shardIndex} p2p payload size mismatch: expected ${totalSize}, got ${payloadBytes}.`,
448
- {
449
- code: 'p2p_payload_size_mismatch',
450
- payloadBytes,
451
- totalSize,
452
- }
453
- );
454
- }
455
- }
456
-
457
- function assertRequiredContentEncoding(response, requiredEncoding, context) {
458
- if (!requiredEncoding) return;
459
- const required = requiredEncoding.trim().toLowerCase();
460
- if (!required) return;
461
- const found = normalizeContentEncodings(response.headers.get('content-encoding'));
462
- if (!found.includes(required)) {
463
- const foundValue = found.length > 0 ? found.join(', ') : 'none';
464
- throw new Error(`Missing required content-encoding "${required}" for ${context} (found: ${foundValue})`);
465
- }
466
- }
467
-
468
- function buildShardUrl(baseUrl, shardInfo) {
469
- const base = String(baseUrl || '').replace(/\/$/, '');
470
- const filename = String(shardInfo?.filename || '').replace(/^\/+/, '');
471
- return `${base}/${filename}`;
472
- }
473
-
474
- function bytesToHex(bytes) {
475
- return Array.from(bytes)
476
- .map((byte) => byte.toString(16).padStart(2, '0'))
477
- .join('');
478
- }
479
-
480
- function normalizeP2PConfig(config = {}) {
481
- const enabled = config?.enabled === true;
482
- const rawTimeoutMs = config?.timeoutMs;
483
- const rawMaxRetries = config?.maxRetries;
484
- const rawRetryDelayMs = config?.retryDelayMs;
485
- const rawSecurity = config?.security && typeof config.security === 'object'
486
- ? config.security
487
- : {};
488
- const rawAbuse = config?.abuse && typeof config.abuse === 'object'
489
- ? config.abuse
490
- : {};
491
- const rawControlPlane = config?.controlPlane && typeof config.controlPlane === 'object'
492
- ? config.controlPlane
493
- : {};
494
- const rawWebRTC = config?.webrtc && typeof config.webrtc === 'object'
495
- ? config.webrtc
496
- : {};
497
-
498
- let transport = config?.transport;
499
- if (typeof transport !== 'function' && rawWebRTC.enabled === true) {
500
- transport = createBrowserWebRTCDataPlaneTransport(rawWebRTC);
501
- }
502
- if (typeof transport !== 'function') {
503
- transport = null;
504
- }
505
-
506
- const contractVersion = assertSupportedP2PTransportContract(
507
- config?.contractVersion ?? P2P_TRANSPORT_CONTRACT_VERSION
508
- );
509
-
510
- return {
511
- enabled,
512
- timeoutMs: normalizeRequiredInteger(
513
- rawTimeoutMs,
514
- 'distribution.p2p.timeoutMs',
515
- { fallback: DEFAULT_P2P_TIMEOUT_MS }
516
- ),
517
- maxRetries: normalizeRequiredInteger(
518
- rawMaxRetries,
519
- 'distribution.p2p.maxRetries',
520
- { allowZero: true, fallback: DEFAULT_P2P_MAX_RETRIES }
521
- ),
522
- retryDelayMs: normalizeRequiredInteger(
523
- rawRetryDelayMs,
524
- 'distribution.p2p.retryDelayMs',
525
- { allowZero: true, fallback: DEFAULT_P2P_RETRY_DELAY_MS }
526
- ),
527
- transport,
528
- contractVersion,
529
- controlPlane: normalizeP2PControlPlaneConfig({
530
- ...DEFAULT_DISTRIBUTION_CONFIG.p2p.controlPlane,
531
- ...rawControlPlane,
532
- tokenRefreshSkewMs: rawControlPlane.tokenRefreshSkewMs
533
- ?? DEFAULT_P2P_CONTROL_PLANE_TOKEN_REFRESH_SKEW_MS,
534
- }),
535
- security: {
536
- requireSessionToken: rawSecurity.requireSessionToken === true,
537
- sessionToken: normalizeOptionalToken(rawSecurity.sessionToken),
538
- tokenExpiresAtMs: normalizeOptionalTimestamp(rawSecurity.tokenExpiresAtMs),
539
- },
540
- abuse: {
541
- rateLimitPerMinute: normalizeRequiredInteger(
542
- rawAbuse.rateLimitPerMinute,
543
- 'distribution.p2p.abuse.rateLimitPerMinute',
544
- { allowZero: true, fallback: DEFAULT_P2P_RATE_LIMIT_PER_MINUTE }
545
- ),
546
- maxConsecutiveFailures: normalizeRequiredInteger(
547
- rawAbuse.maxConsecutiveFailures,
548
- 'distribution.p2p.abuse.maxConsecutiveFailures',
549
- { fallback: DEFAULT_P2P_MAX_CONSECUTIVE_FAILURES }
550
- ),
551
- quarantineMs: normalizeRequiredInteger(
552
- rawAbuse.quarantineMs,
553
- 'distribution.p2p.abuse.quarantineMs',
554
- { allowZero: true, fallback: DEFAULT_P2P_QUARANTINE_MS }
555
- ),
556
- },
557
- };
558
- }
559
-
560
- function getP2PTransportPolicyState(transport) {
561
- if (typeof transport !== 'function') {
562
- return null;
563
- }
564
- let state = p2pTransportPolicyState.get(transport);
565
- if (!state) {
566
- state = {
567
- requestTimestamps: [],
568
- consecutiveFailures: 0,
569
- quarantinedUntilMs: 0,
570
- };
571
- p2pTransportPolicyState.set(transport, state);
572
- }
573
- return state;
574
- }
575
-
576
- function createP2PPolicyDeniedError(message, details = {}) {
577
- return createP2PTransportError(
578
- P2P_TRANSPORT_ERROR_CODES.policyDenied,
579
- message,
580
- details,
581
- false
582
- );
583
- }
584
-
585
- function isSessionTokenExpiredOrExpiring(tokenExpiresAtMs, nowMs = Date.now(), skewMs = 0) {
586
- if (!Number.isFinite(tokenExpiresAtMs)) {
587
- return false;
588
- }
589
- const threshold = nowMs + Math.max(0, Math.floor(skewMs));
590
- return threshold >= tokenExpiresAtMs;
591
- }
592
-
593
- function applyControlPlaneSessionUpdate(p2pConfig, sessionUpdate) {
594
- if (!sessionUpdate || !p2pConfig?.security) {
595
- return;
596
- }
597
- if (sessionUpdate.hasSessionToken === true) {
598
- p2pConfig.security.sessionToken = normalizeOptionalToken(sessionUpdate.sessionToken);
599
- }
600
- if (sessionUpdate.hasTokenExpiresAtMs === true) {
601
- p2pConfig.security.tokenExpiresAtMs = normalizeOptionalTimestamp(sessionUpdate.tokenExpiresAtMs);
602
- }
603
- }
604
-
605
- async function refreshP2PSessionTokenFromControlPlane(p2pConfig, context, nowMs = Date.now()) {
606
- const controlPlane = p2pConfig?.controlPlane;
607
- if (!controlPlane?.enabled || typeof controlPlane.tokenProvider !== 'function') {
608
- return;
609
- }
610
-
611
- const requiresSessionToken = p2pConfig?.security?.requireSessionToken === true;
612
- const token = p2pConfig?.security?.sessionToken ?? null;
613
- const tokenExpiresAtMs = p2pConfig?.security?.tokenExpiresAtMs ?? null;
614
- let reason = null;
615
-
616
- if (requiresSessionToken && !token) {
617
- reason = 'missing';
618
- } else if (isSessionTokenExpiredOrExpiring(tokenExpiresAtMs, nowMs, 0)) {
619
- reason = 'expired';
620
- } else if (
621
- isSessionTokenExpiredOrExpiring(tokenExpiresAtMs, nowMs, controlPlane.tokenRefreshSkewMs)
622
- ) {
623
- reason = 'refresh';
624
- }
625
-
626
- if (!reason) {
627
- return;
628
- }
629
-
630
- const sessionUpdate = await resolveP2PSessionToken(controlPlane, {
631
- ...context,
632
- reason,
633
- nowMs,
634
- currentSessionToken: token,
635
- currentTokenExpiresAtMs: tokenExpiresAtMs,
636
- });
637
- applyControlPlaneSessionUpdate(p2pConfig, sessionUpdate);
638
-
639
- if (requiresSessionToken && !p2pConfig.security.sessionToken) {
640
- throw createP2PPolicyDeniedError(
641
- `P2P shard ${context?.shardIndex} requires a session token from control plane.`,
642
- {
643
- shardIndex: context?.shardIndex ?? null,
644
- policyReason: 'session_token_missing_after_refresh',
645
- }
646
- );
647
- }
648
- }
649
-
650
- async function enforceP2PControlPlanePolicy(p2pConfig, context, nowMs = Date.now()) {
651
- const controlPlane = p2pConfig?.controlPlane;
652
- if (!controlPlane?.enabled || typeof controlPlane.policyEvaluator !== 'function') {
653
- return;
654
- }
655
- const decision = await evaluateP2PPolicyDecision(controlPlane, {
656
- ...context,
657
- nowMs,
658
- currentSessionToken: p2pConfig?.security?.sessionToken ?? null,
659
- currentTokenExpiresAtMs: p2pConfig?.security?.tokenExpiresAtMs ?? null,
660
- });
661
- applyControlPlaneSessionUpdate(p2pConfig, decision.sessionUpdate);
662
- if (decision.allow !== false) {
663
- return;
664
- }
665
- throw createP2PPolicyDeniedError(
666
- `P2P shard ${context?.shardIndex} denied by control-plane policy.`,
667
- {
668
- shardIndex: context?.shardIndex ?? null,
669
- policyReason: decision.reason ?? 'policy_denied_control_plane',
670
- controlPlaneMetadata: decision.metadata ?? null,
671
- }
672
- );
673
- }
674
-
675
- function enforceP2PSecurityAndAbusePolicy(p2pConfig, state, shardIndex, nowMs = Date.now()) {
676
- const security = p2pConfig?.security ?? {};
677
- const abuse = p2pConfig?.abuse ?? {};
678
-
679
- if (security.requireSessionToken === true && !security.sessionToken) {
680
- throw createP2PPolicyDeniedError(
681
- `P2P shard ${shardIndex} requires a session token.`,
682
- {
683
- shardIndex,
684
- policyReason: 'session_token_missing',
685
- }
686
- );
687
- }
688
- if (
689
- Number.isFinite(security.tokenExpiresAtMs)
690
- && nowMs >= security.tokenExpiresAtMs
691
- ) {
692
- throw createP2PPolicyDeniedError(
693
- `P2P shard ${shardIndex} session token expired.`,
694
- {
695
- shardIndex,
696
- policyReason: 'session_token_expired',
697
- tokenExpiresAtMs: security.tokenExpiresAtMs,
698
- }
699
- );
700
- }
701
-
702
- if (!state) {
703
- return;
704
- }
705
-
706
- if (Number.isFinite(state.quarantinedUntilMs) && nowMs < state.quarantinedUntilMs) {
707
- throw createP2PPolicyDeniedError(
708
- `P2P shard ${shardIndex} transport is quarantined.`,
709
- {
710
- shardIndex,
711
- policyReason: 'transport_quarantined',
712
- quarantinedUntilMs: state.quarantinedUntilMs,
713
- }
714
- );
715
- }
716
-
717
- const limit = Number.isFinite(abuse.rateLimitPerMinute)
718
- ? Math.max(0, Math.floor(abuse.rateLimitPerMinute))
719
- : 0;
720
- if (limit > 0) {
721
- const cutoff = nowMs - 60000;
722
- state.requestTimestamps = state.requestTimestamps.filter((stamp) => stamp >= cutoff);
723
- if (state.requestTimestamps.length >= limit) {
724
- throw createP2PPolicyDeniedError(
725
- `P2P shard ${shardIndex} transport rate limit exceeded.`,
726
- {
727
- shardIndex,
728
- policyReason: 'rate_limited',
729
- rateLimitPerMinute: limit,
730
- }
731
- );
732
- }
733
- state.requestTimestamps.push(nowMs);
734
- }
735
- }
736
-
737
- function markP2PTransportSuccess(state) {
738
- if (!state) {
739
- return;
740
- }
741
- state.consecutiveFailures = 0;
742
- state.quarantinedUntilMs = 0;
743
- }
744
-
745
- function markP2PTransportFailure(p2pConfig, state, normalizedError, nowMs = Date.now()) {
746
- if (!state) {
747
- return;
748
- }
749
- if (!normalizedError || normalizedError.code === P2P_TRANSPORT_ERROR_CODES.aborted) {
750
- return;
751
- }
752
- const maxFailures = Number.isFinite(p2pConfig?.abuse?.maxConsecutiveFailures)
753
- ? Math.max(1, Math.floor(p2pConfig.abuse.maxConsecutiveFailures))
754
- : DEFAULT_P2P_MAX_CONSECUTIVE_FAILURES;
755
- const quarantineMs = Number.isFinite(p2pConfig?.abuse?.quarantineMs)
756
- ? Math.max(0, Math.floor(p2pConfig.abuse.quarantineMs))
757
- : DEFAULT_P2P_QUARANTINE_MS;
758
- state.consecutiveFailures += 1;
759
- if (quarantineMs > 0 && state.consecutiveFailures >= maxFailures) {
760
- state.quarantinedUntilMs = nowMs + quarantineMs;
761
- }
762
- }
763
-
764
- function normalizeAntiRollbackConfig(config = {}) {
765
- const antiRollback = config?.antiRollback && typeof config.antiRollback === 'object'
766
- ? config.antiRollback
767
- : {};
768
- return {
769
- enabled: antiRollback.enabled !== false,
770
- requireExpectedHash: antiRollback.requireExpectedHash !== false,
771
- requireExpectedSize: antiRollback.requireExpectedSize === true,
772
- requireManifestVersionSet: antiRollback.requireManifestVersionSet !== false,
773
- };
774
- }
775
-
776
- function normalizeDecisionTraceConfig(config = {}) {
777
- const sourceDecision = config?.sourceDecision && typeof config.sourceDecision === 'object'
778
- ? config.sourceDecision
779
- : {};
780
- const trace = sourceDecision.trace && typeof sourceDecision.trace === 'object'
781
- ? sourceDecision.trace
782
- : {};
783
- return {
784
- deterministic: sourceDecision.deterministic !== false,
785
- enabled: trace.enabled === true,
786
- includeSkippedSources: trace.includeSkippedSources !== false,
787
- samplingRate: normalizeSamplingRate(trace.samplingRate, 1),
788
- };
789
- }
790
-
791
- function normalizeSourceMatrix(config = {}) {
792
- const matrix = config?.sourceMatrix && typeof config.sourceMatrix === 'object'
793
- ? config.sourceMatrix
794
- : {};
795
- const defaultMatrix = DEFAULT_SOURCE_MATRIX;
796
- const normalized = {};
797
- for (const source of DISTRIBUTION_SOURCES) {
798
- const entry = matrix[source] && typeof matrix[source] === 'object'
799
- ? matrix[source]
800
- : {};
801
- normalized[source] = {
802
- onHit: entry.onHit === 'return' ? 'return' : defaultMatrix[source].onHit,
803
- onMiss: entry.onMiss === 'terminal' ? 'terminal' : 'next',
804
- onFailure: entry.onFailure === 'terminal' ? 'terminal' : 'next',
805
- };
806
- }
807
- return normalized;
808
- }
809
-
810
- function createDecisionTrace(order, plan, shardIndex, deterministic, expectedManifestVersionSet) {
811
- return {
812
- schemaVersion: DISTRIBUTION_DECISION_TRACE_SCHEMA_VERSION,
813
- deterministic: deterministic === true,
814
- shardIndex,
815
- expectedManifestVersionSet: normalizeManifestVersionSet(expectedManifestVersionSet),
816
- sourceOrder: [...order],
817
- plan: plan.map((entry) => ({
818
- source: entry.source,
819
- enabled: entry.enabled,
820
- reason: entry.reason,
821
- })),
822
- attempts: [],
823
- };
824
- }
825
-
826
- function appendDecisionTraceAttempt(trace, entry) {
827
- if (!trace) return;
828
- trace.attempts.push({
829
- source: entry.source,
830
- status: entry.status,
831
- reason: entry.reason ?? null,
832
- code: entry.code ?? null,
833
- message: entry.message ?? null,
834
- durationMs: Number.isFinite(entry.durationMs) ? entry.durationMs : null,
835
- bytes: Number.isFinite(entry.bytes) ? entry.bytes : null,
836
- hash: typeof entry.hash === 'string' ? entry.hash : null,
837
- path: typeof entry.path === 'string' ? entry.path : null,
838
- manifestVersionSet: normalizeManifestVersionSet(entry.manifestVersionSet),
839
- });
840
- }
841
-
842
- function attachDecisionTrace(result, trace) {
843
- if (!trace) return result;
844
- return {
845
- ...result,
846
- decisionTrace: trace,
847
- };
848
- }
849
-
850
- function createSourceCounter() {
851
- return {
852
- cache: 0,
853
- p2p: 0,
854
- http: 0,
855
- };
856
- }
857
-
858
- function createLatencySummary(durations) {
859
- const values = durations.filter((value) => Number.isFinite(value));
860
- if (values.length === 0) {
861
- return {
862
- count: 0,
863
- min: null,
864
- max: null,
865
- avg: null,
866
- };
867
- }
868
- let sum = 0;
869
- let min = Number.POSITIVE_INFINITY;
870
- let max = Number.NEGATIVE_INFINITY;
871
- for (const value of values) {
872
- sum += value;
873
- if (value < min) min = value;
874
- if (value > max) max = value;
875
- }
876
- return {
877
- count: values.length,
878
- min,
879
- max,
880
- avg: sum / values.length,
881
- };
882
- }
883
-
884
- function appendAttemptLogAttempt(logEntries, entry) {
885
- if (!Array.isArray(logEntries)) return;
886
- logEntries.push({
887
- source: entry.source,
888
- status: entry.status,
889
- code: entry.code ?? null,
890
- durationMs: Number.isFinite(entry.durationMs) ? entry.durationMs : null,
891
- writeDurationMs: Number.isFinite(entry.writeDurationMs) ? entry.writeDurationMs : null,
892
- });
893
- }
894
-
895
- function createDeliveryMetrics(order, result, attempts, totalDurationMs) {
896
- const sourceAttempts = createSourceCounter();
897
- const retries = createSourceCounter();
898
- const failureCodes = {};
899
- const p2pDurations = [];
900
- const httpDurations = [];
901
- let storageWriteMs = Number.isFinite(result?.writeDurationMs) ? result.writeDurationMs : null;
902
- let attemptCount = 0;
903
- const attemptsBySource = createSourceCounter();
904
-
905
- for (const attempt of attempts) {
906
- if (attempt?.status !== 'success' && attempt?.status !== 'failed') {
907
- continue;
908
- }
909
- attemptCount += 1;
910
- const source = attempt?.source;
911
- if (source === DISTRIBUTION_SOURCE_CACHE || source === DISTRIBUTION_SOURCE_P2P || source === DISTRIBUTION_SOURCE_HTTP) {
912
- sourceAttempts[source] += 1;
913
- attemptsBySource[source] += 1;
914
- if (source === DISTRIBUTION_SOURCE_P2P && Number.isFinite(attempt.durationMs)) {
915
- p2pDurations.push(attempt.durationMs);
916
- }
917
- if (source === DISTRIBUTION_SOURCE_HTTP && Number.isFinite(attempt.durationMs)) {
918
- httpDurations.push(attempt.durationMs);
919
- }
920
- }
921
- if (attempt.status === 'failed') {
922
- const code = typeof attempt.code === 'string' && attempt.code
923
- ? attempt.code
924
- : 'unknown';
925
- failureCodes[code] = (failureCodes[code] ?? 0) + 1;
926
- }
927
- if (storageWriteMs == null && Number.isFinite(attempt.writeDurationMs)) {
928
- storageWriteMs = attempt.writeDurationMs;
929
- }
930
- }
931
-
932
- for (const source of [DISTRIBUTION_SOURCE_CACHE, DISTRIBUTION_SOURCE_P2P, DISTRIBUTION_SOURCE_HTTP]) {
933
- retries[source] = Math.max(0, attemptsBySource[source] - 1);
934
- }
935
-
936
- return {
937
- schemaVersion: DISTRIBUTION_DELIVERY_METRICS_SCHEMA_VERSION,
938
- totalDurationMs: Number.isFinite(totalDurationMs) ? totalDurationMs : 0,
939
- sourceOrder: Array.isArray(order) ? [...order] : [...DISTRIBUTION_SOURCES],
940
- successSource: result?.source ?? null,
941
- attemptCount,
942
- sourceAttempts,
943
- retries,
944
- failureCodes,
945
- p2pRttMs: createLatencySummary(p2pDurations),
946
- httpRttMs: createLatencySummary(httpDurations),
947
- storageWriteMs,
948
- };
949
- }
950
-
951
- async function emitDeliveryMetricsHook(hook, payload) {
952
- if (typeof hook !== 'function') {
953
- return;
954
- }
955
- try {
956
- await hook(payload);
957
- } catch (error) {
958
- log.warn(
959
- 'Distribution',
960
- `delivery metrics hook failed: ${error?.message || String(error)}`
961
- );
962
- }
963
- }
964
-
965
- function assertExpectedHash(resultHash, expectedHash, shardIndex) {
966
- if (!expectedHash) return;
967
- if (!resultHash) {
968
- const error = createDopplerError(
969
- ERROR_CODES.DISTRIBUTION_SHARD_HASH_MISMATCH,
970
- `Shard ${shardIndex} missing hash result`
971
- );
972
- error.code = 'hash_missing';
973
- throw error;
974
- }
975
- if (resultHash !== expectedHash) {
976
- const error = createDopplerError(
977
- ERROR_CODES.DISTRIBUTION_SHARD_HASH_MISMATCH,
978
- `Hash mismatch for shard ${shardIndex}: expected ${expectedHash}, got ${resultHash}`
979
- );
980
- error.code = 'hash_mismatch';
981
- error.expectedHash = expectedHash;
982
- error.actualHash = resultHash;
983
- throw error;
984
- }
985
- }
986
-
987
- function assertExpectedSize(bytes, expectedSize, shardIndex) {
988
- if (!Number.isFinite(expectedSize)) return;
989
- const expected = Math.floor(expectedSize);
990
- const actual = Number.isFinite(bytes) ? Math.floor(bytes) : -1;
991
- if (expected < 0 || actual < 0) return;
992
- if (actual !== expected) {
993
- const error = createDopplerError(
994
- ERROR_CODES.DISTRIBUTION_SHARD_SIZE_MISMATCH,
995
- `Size mismatch for shard ${shardIndex}: expected ${expected}, got ${actual}`
996
- );
997
- error.code = 'size_mismatch';
998
- error.expectedSize = expected;
999
- error.actualSize = actual;
1000
- throw error;
1001
- }
1002
- }
1003
-
1004
- function assertExpectedManifestVersionSet(resultVersionSet, expectedVersionSet, shardIndex, source) {
1005
- const expected = normalizeManifestVersionSet(expectedVersionSet);
1006
- if (!expected) return;
1007
- const actual = normalizeManifestVersionSet(resultVersionSet);
1008
- if (!actual) {
1009
- const error = createDopplerError(
1010
- ERROR_CODES.DISTRIBUTION_SHARD_MANIFEST_VERSION_SET_MISMATCH,
1011
- `Shard ${shardIndex} source "${source}" missing manifestVersionSet while antiRollback.requireManifestVersionSet=true.`
1012
- );
1013
- error.code = 'manifest_version_set_missing';
1014
- error.expectedManifestVersionSet = expected;
1015
- error.actualManifestVersionSet = actual;
1016
- throw error;
1017
- }
1018
- if (actual !== expected) {
1019
- const error = createDopplerError(
1020
- ERROR_CODES.DISTRIBUTION_SHARD_MANIFEST_VERSION_SET_MISMATCH,
1021
- `Shard ${shardIndex} source "${source}" manifestVersionSet mismatch: expected ${expected}, got ${actual}`
1022
- );
1023
- error.code = 'manifest_version_set_mismatch';
1024
- error.expectedManifestVersionSet = expected;
1025
- error.actualManifestVersionSet = actual;
1026
- throw error;
1027
- }
1028
- }
1029
-
1030
- function parseDownloadOptions(options = {}) {
1031
- return {
1032
- algorithm: options.algorithm,
1033
- onProgress: options.onProgress ?? null,
1034
- onDeliveryMetrics: options.onDeliveryMetrics ?? null,
1035
- signal: options.signal,
1036
- requiredEncoding: options.requiredEncoding ?? null,
1037
- writeToStore: options.writeToStore ?? false,
1038
- expectedHash: options.expectedHash ?? null,
1039
- expectedSize: Number.isFinite(options.expectedSize) ? Math.floor(options.expectedSize) : null,
1040
- expectedManifestVersionSet: normalizeManifestVersionSet(options.expectedManifestVersionSet),
1041
- maxRetries: options.maxRetries,
1042
- initialRetryDelayMs: options.initialRetryDelayMs,
1043
- maxRetryDelayMs: options.maxRetryDelayMs,
1044
- };
1045
- }
1046
-
1047
- function createDeliveryKey(baseUrl, shardIndex, options, order, sourceMatrix) {
1048
- return [
1049
- String(baseUrl || ''),
1050
- String(shardIndex),
1051
- String(options.algorithm || ''),
1052
- String(options.expectedHash || ''),
1053
- String(options.expectedSize ?? ''),
1054
- String(options.expectedManifestVersionSet ?? ''),
1055
- JSON.stringify(sourceMatrix || null),
1056
- String(options.writeToStore === true),
1057
- order.join(','),
1058
- ].join('|');
1059
- }
1060
-
1061
- function createAbortError(label = 'operation aborted') {
1062
- const error = new Error(label);
1063
- error.name = 'AbortError';
1064
- return error;
1065
- }
1066
-
1067
- function awaitWithSignal(promise, signal, label) {
1068
- if (!signal) return promise;
1069
- if (signal.aborted) {
1070
- return Promise.reject(createAbortError(label));
1071
- }
1072
- return new Promise((resolve, reject) => {
1073
- const onAbort = () => reject(createAbortError(label));
1074
- signal.addEventListener('abort', onAbort, { once: true });
1075
- promise.then(
1076
- (value) => {
1077
- signal.removeEventListener('abort', onAbort);
1078
- resolve(value);
1079
- },
1080
- (error) => {
1081
- signal.removeEventListener('abort', onAbort);
1082
- reject(error);
1083
- }
1084
- );
1085
- });
1086
- }
1087
-
1088
- async function withTimeout(promise, timeoutMs, label = 'operation') {
1089
- if (!timeoutMs || timeoutMs <= 0) {
1090
- return promise;
1091
- }
1092
-
1093
- let timer;
1094
- const timeout = new Promise((_, reject) => {
1095
- timer = setTimeout(() => {
1096
- const error = new Error(`${label} timed out after ${timeoutMs}ms`);
1097
- error.name = 'TimeoutError';
1098
- reject(error);
1099
- }, timeoutMs);
1100
- });
1101
-
1102
- try {
1103
- return await Promise.race([promise, timeout]);
1104
- } finally {
1105
- clearTimeout(timer);
1106
- }
1107
- }
1108
-
1109
- export function resolveShardDeliveryPlan(options = {}) {
1110
- const order = normalizeDistributionSourceOrder(options.sourceOrder);
1111
- const plan = [];
1112
- for (const source of order) {
1113
- if (source === DISTRIBUTION_SOURCE_CACHE) {
1114
- const enabled = options.enableSourceCache !== false;
1115
- plan.push({
1116
- source,
1117
- enabled,
1118
- reason: enabled ? 'enabled' : 'cache_disabled',
1119
- });
1120
- continue;
1121
- }
1122
- if (source === DISTRIBUTION_SOURCE_P2P) {
1123
- const enabled = options.p2pEnabled === true && options.p2pTransportAvailable === true;
1124
- let reason = 'enabled';
1125
- if (options.p2pEnabled !== true) {
1126
- reason = 'p2p_disabled';
1127
- } else if (options.p2pTransportAvailable !== true) {
1128
- reason = 'p2p_transport_unconfigured';
1129
- }
1130
- plan.push({ source, enabled, reason });
1131
- continue;
1132
- }
1133
- if (source === DISTRIBUTION_SOURCE_HTTP) {
1134
- const enabled = options.httpEnabled !== false;
1135
- plan.push({
1136
- source,
1137
- enabled,
1138
- reason: enabled ? 'enabled' : 'http_disabled',
1139
- });
1140
- continue;
1141
- }
1142
- }
1143
- return { order, plan };
1144
- }
1145
-
1146
- async function seedHasherFromStoredPrefix(hasher, shardIndex, expectedPrefixBytes) {
1147
- if (!Number.isInteger(expectedPrefixBytes) || expectedPrefixBytes <= 0) {
1148
- return;
1149
- }
1150
- let hashedBytes = 0;
1151
- for await (const chunk of streamShardRange(shardIndex, 0, expectedPrefixBytes)) {
1152
- if (!chunk?.byteLength) continue;
1153
- const remaining = expectedPrefixBytes - hashedBytes;
1154
- if (remaining <= 0) break;
1155
- const next = chunk.byteLength > remaining
1156
- ? chunk.subarray(0, remaining)
1157
- : chunk;
1158
- hasher.update(next);
1159
- hashedBytes += next.byteLength;
1160
- if (hashedBytes >= expectedPrefixBytes) break;
1161
- }
1162
- if (hashedBytes !== expectedPrefixBytes) {
1163
- throw createShardSizeMismatchError(
1164
- `Shard ${shardIndex} stored resume prefix mismatch: expected ${expectedPrefixBytes} bytes, read ${hashedBytes}.`,
1165
- {
1166
- code: 'resume_state_prefix_mismatch',
1167
- expectedPrefixBytes,
1168
- actualPrefixBytes: hashedBytes,
1169
- }
1170
- );
1171
- }
1172
- }
1173
-
1174
- async function resolvePersistedResumeOffset(writeToStore, shardIndex, expectedSize) {
1175
- if (!writeToStore) return 0;
1176
- const storedSize = await getShardStoredSize(shardIndex);
1177
- const resumeOffset = Number.isFinite(storedSize)
1178
- ? Math.max(0, Math.floor(storedSize))
1179
- : 0;
1180
- if (resumeOffset <= 0) return 0;
1181
- if (Number.isFinite(expectedSize)) {
1182
- const normalizedExpected = Math.max(0, Math.floor(expectedSize));
1183
- if (resumeOffset > normalizedExpected) {
1184
- throw createShardSizeMismatchError(
1185
- `Shard ${shardIndex} stored resume bytes exceed expected size: stored=${resumeOffset}, expected=${normalizedExpected}.`,
1186
- {
1187
- code: 'resume_state_oversize',
1188
- storedBytes: resumeOffset,
1189
- expectedSize: normalizedExpected,
1190
- }
1191
- );
1192
- }
1193
- if (resumeOffset === normalizedExpected) {
1194
- return 0;
1195
- }
1196
- }
1197
- return resumeOffset;
1198
- }
1199
-
1200
- async function createHttpTransferState(writeToStore, shardIndex, algorithm, resumeOffset = 0) {
1201
- const normalizedResumeOffset = Number.isInteger(resumeOffset) && resumeOffset > 0
1202
- ? resumeOffset
1203
- : 0;
1204
- const hasher = await createStreamingHasher(algorithm);
1205
- if (normalizedResumeOffset > 0) {
1206
- await seedHasherFromStoredPrefix(hasher, shardIndex, normalizedResumeOffset);
1207
- }
1208
- return {
1209
- hasher,
1210
- chunks: writeToStore ? null : [],
1211
- writer: writeToStore
1212
- ? await createShardWriter(shardIndex, {
1213
- append: normalizedResumeOffset > 0,
1214
- expectedOffset: normalizedResumeOffset,
1215
- })
1216
- : null,
1217
- writerClosed: false,
1218
- receivedBytes: normalizedResumeOffset,
1219
- writeDurationMs: 0,
1220
- };
1221
- }
1222
-
1223
- async function resetHttpTransferState(state, writeToStore, shardIndex, algorithm) {
1224
- await state.writer?.abort?.();
1225
- state.hasher = await createStreamingHasher(algorithm);
1226
- state.chunks = writeToStore ? null : [];
1227
- state.writer = writeToStore ? await createShardWriter(shardIndex) : null;
1228
- state.writerClosed = false;
1229
- state.receivedBytes = 0;
1230
- state.writeDurationMs = 0;
1231
- }
1232
-
1233
- async function appendHttpTransferChunk(state, chunk) {
1234
- const bytes = chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk);
1235
- state.hasher.update(bytes);
1236
- if (state.writer) {
1237
- const writeStart = performance.now();
1238
- await state.writer.write(bytes);
1239
- state.writeDurationMs += performance.now() - writeStart;
1240
- } else if (state.chunks) {
1241
- state.chunks.push(bytes.slice(0));
1242
- }
1243
- state.receivedBytes += bytes.byteLength;
1244
- }
1245
-
1246
- async function finalizeHttpTransferState(state, startTime, shardIndex) {
1247
- const hashBytes = await state.hasher.finalize();
1248
- const hash = bytesToHex(hashBytes);
1249
- if (state.writer) {
1250
- const closeStart = performance.now();
1251
- await state.writer.close();
1252
- state.writerClosed = true;
1253
- state.writeDurationMs += performance.now() - closeStart;
1254
- const elapsed = (performance.now() - startTime) / 1000;
1255
- const speed = elapsed > 0 ? state.receivedBytes / elapsed : 0;
1256
- const speedDisplay = `${(speed / (1024 * 1024)).toFixed(2)}MB/s`;
1257
- log.verbose(
1258
- 'Distribution',
1259
- `Shard ${shardIndex}: http stream (${state.receivedBytes} bytes, ${elapsed.toFixed(2)}s, ${speedDisplay})`
1260
- );
1261
- return {
1262
- buffer: null,
1263
- bytes: state.receivedBytes,
1264
- hash,
1265
- wrote: true,
1266
- source: DISTRIBUTION_SOURCE_HTTP,
1267
- path: 'http-stream-store',
1268
- writeDurationMs: state.writeDurationMs,
1269
- };
1270
- }
1271
-
1272
- const buffer = !state.chunks || state.chunks.length === 0
1273
- ? new ArrayBuffer(0)
1274
- : await new Blob(state.chunks).arrayBuffer();
1275
- return {
1276
- buffer,
1277
- bytes: buffer.byteLength,
1278
- hash,
1279
- wrote: false,
1280
- source: DISTRIBUTION_SOURCE_HTTP,
1281
- path: 'http-stream-buffer',
1282
- writeDurationMs: null,
1283
- };
1284
- }
1285
-
1286
- async function abortHttpTransferState(state) {
1287
- if (state.writer && !state.writerClosed) {
1288
- await state.writer.abort?.();
1289
- state.writerClosed = true;
1290
- }
1291
- }
1292
-
1293
- async function persistHttpTransferState(state) {
1294
- if (!state.writer || state.writerClosed) {
1295
- return;
1296
- }
1297
- if (state.receivedBytes > 0) {
1298
- const closeStart = performance.now();
1299
- await state.writer.close();
1300
- state.writerClosed = true;
1301
- state.writeDurationMs += performance.now() - closeStart;
1302
- return;
1303
- }
1304
- await state.writer.abort?.();
1305
- state.writerClosed = true;
1306
- }
1307
-
1308
- async function clearPersistedShardState(shardIndex) {
1309
- const deleted = await deleteShard(shardIndex);
1310
- if (deleted) {
1311
- return;
1312
- }
1313
- const writer = await createShardWriter(shardIndex, {
1314
- append: false,
1315
- expectedOffset: 0,
1316
- });
1317
- await writer.abort?.();
1318
- }
1319
-
1320
- async function downloadShardFromHttp(baseUrl, shardInfo, shardIndex, options = {}) {
1321
- const {
1322
- signal,
1323
- algorithm,
1324
- onProgress,
1325
- requiredEncoding,
1326
- writeToStore = false,
1327
- } = options;
1328
-
1329
- if (!algorithm) {
1330
- throw new Error('Missing hash algorithm for shard download.');
1331
- }
1332
-
1333
- const startTime = performance.now();
1334
- const url = buildShardUrl(baseUrl, shardInfo);
1335
- let lastError;
1336
- const maxRetries = normalizeRequiredInteger(
1337
- options.maxRetries,
1338
- 'download.maxRetries',
1339
- { allowZero: true, fallback: 3 }
1340
- );
1341
- const initialRetryDelayMs = normalizeRequiredInteger(
1342
- options.initialRetryDelayMs,
1343
- 'download.initialRetryDelayMs',
1344
- { allowZero: true, fallback: 1000 }
1345
- );
1346
- const maxRetryDelayMs = normalizeRequiredInteger(
1347
- options.maxRetryDelayMs,
1348
- 'download.maxRetryDelayMs',
1349
- { allowZero: true, fallback: 30000 }
1350
- );
1351
- const progressTotalBytes = Number.isFinite(options.expectedSize)
1352
- ? Math.floor(options.expectedSize)
1353
- : (Number.isFinite(shardInfo?.size) ? Math.floor(shardInfo.size) : 0);
1354
- let retryDelay = initialRetryDelayMs;
1355
- const disablePersistedResume = options.__disablePersistedResume === true;
1356
- let resumeOffset = 0;
1357
- if (!disablePersistedResume) {
1358
- try {
1359
- resumeOffset = await resolvePersistedResumeOffset(
1360
- writeToStore,
1361
- shardIndex,
1362
- options.expectedSize
1363
- );
1364
- } catch (error) {
1365
- if (writeToStore && error?.code === 'resume_state_oversize') {
1366
- await clearPersistedShardState(shardIndex);
1367
- resumeOffset = 0;
1368
- } else {
1369
- throw error;
1370
- }
1371
- }
1372
- }
1373
- const startedWithResume = resumeOffset > 0;
1374
- let transferState;
1375
- try {
1376
- transferState = await createHttpTransferState(
1377
- writeToStore,
1378
- shardIndex,
1379
- algorithm,
1380
- resumeOffset
1381
- );
1382
- } catch (error) {
1383
- if (writeToStore && error?.code === 'resume_state_prefix_mismatch') {
1384
- await clearPersistedShardState(shardIndex);
1385
- resumeOffset = 0;
1386
- transferState = await createHttpTransferState(
1387
- writeToStore,
1388
- shardIndex,
1389
- algorithm,
1390
- 0
1391
- );
1392
- } else {
1393
- throw error;
1394
- }
1395
- }
1396
-
1397
- for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
1398
- try {
1399
- const resumeOffset = transferState.receivedBytes;
1400
- const requestHeaders = resumeOffset > 0
1401
- ? { range: `bytes=${resumeOffset}-` }
1402
- : undefined;
1403
- const response = await fetch(url, { signal, headers: requestHeaders });
1404
- if (!response.ok) {
1405
- const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
1406
- error.status = response.status;
1407
- throw error;
1408
- }
1409
-
1410
- assertRequiredContentEncoding(response, requiredEncoding, `shard ${shardIndex}`);
1411
- const contentLength = parseContentLengthHeader(response, shardIndex);
1412
- const contentRange = parseContentRangeHeader(response, shardIndex);
1413
- assertHttpResponseBoundaryHeaders(response, shardIndex, contentLength, contentRange);
1414
- const { resetState } = assertHttpResumeAlignment(
1415
- response,
1416
- shardIndex,
1417
- resumeOffset,
1418
- contentRange
1419
- );
1420
- if (resetState) {
1421
- await resetHttpTransferState(transferState, writeToStore, shardIndex, algorithm);
1422
- }
1423
-
1424
- if (!response.body) {
1425
- const buffer = await response.arrayBuffer();
1426
- assertHttpPayloadBoundary(
1427
- shardIndex,
1428
- buffer.byteLength,
1429
- contentLength,
1430
- contentRange,
1431
- options.expectedSize
1432
- );
1433
- await appendHttpTransferChunk(transferState, new Uint8Array(buffer));
1434
- const total = progressTotalBytes > 0 ? progressTotalBytes : transferState.receivedBytes;
1435
- const percent = total > 0
1436
- ? Math.min(100, Math.floor((transferState.receivedBytes / total) * 100))
1437
- : 100;
1438
- onProgress?.({
1439
- shardIndex,
1440
- receivedBytes: transferState.receivedBytes,
1441
- totalBytes: total,
1442
- percent,
1443
- });
1444
-
1445
- const finalized = await finalizeHttpTransferState(transferState, startTime, shardIndex);
1446
- const result = {
1447
- ...finalized,
1448
- path: finalized.wrote ? finalized.path : 'http-blob',
1449
- manifestVersionSet: options.expectedManifestVersionSet ?? null,
1450
- };
1451
- if (
1452
- writeToStore
1453
- && startedWithResume
1454
- && options.__resumeRecoveryAttempted !== true
1455
- && options.expectedHash
1456
- && result.hash !== options.expectedHash
1457
- ) {
1458
- await clearPersistedShardState(shardIndex);
1459
- return downloadShardFromHttp(baseUrl, shardInfo, shardIndex, {
1460
- ...options,
1461
- __disablePersistedResume: true,
1462
- __resumeRecoveryAttempted: true,
1463
- });
1464
- }
1465
- return result;
1466
- }
1467
-
1468
- const reader = response.body.getReader();
1469
- let attemptBytes = 0;
1470
-
1471
- try {
1472
- while (true) {
1473
- const { done, value } = await reader.read();
1474
- if (done) break;
1475
-
1476
- if (value?.length) {
1477
- await appendHttpTransferChunk(transferState, value);
1478
- attemptBytes += value.length;
1479
- }
1480
-
1481
- const total = progressTotalBytes > 0 ? progressTotalBytes : transferState.receivedBytes;
1482
- onProgress?.({
1483
- shardIndex,
1484
- receivedBytes: transferState.receivedBytes,
1485
- totalBytes: total,
1486
- percent: total > 0 ? (transferState.receivedBytes / total) * 100 : 0,
1487
- });
1488
- }
1489
-
1490
- assertHttpPayloadBoundary(
1491
- shardIndex,
1492
- attemptBytes,
1493
- contentLength,
1494
- contentRange,
1495
- options.expectedSize
1496
- );
1497
- const finalized = await finalizeHttpTransferState(transferState, startTime, shardIndex);
1498
- const result = {
1499
- ...finalized,
1500
- manifestVersionSet: options.expectedManifestVersionSet ?? null,
1501
- };
1502
- if (
1503
- writeToStore
1504
- && startedWithResume
1505
- && options.__resumeRecoveryAttempted !== true
1506
- && options.expectedHash
1507
- && result.hash !== options.expectedHash
1508
- ) {
1509
- await clearPersistedShardState(shardIndex);
1510
- return downloadShardFromHttp(baseUrl, shardInfo, shardIndex, {
1511
- ...options,
1512
- __disablePersistedResume: true,
1513
- __resumeRecoveryAttempted: true,
1514
- });
1515
- }
1516
- return result;
1517
- } catch (error) {
1518
- throw error;
1519
- }
1520
- } catch (error) {
1521
- lastError = error;
1522
-
1523
- if (error?.name === 'AbortError') {
1524
- if (writeToStore) {
1525
- await persistHttpTransferState(transferState);
1526
- } else {
1527
- await abortHttpTransferState(transferState);
1528
- }
1529
- throw error;
1530
- }
1531
-
1532
- if (Number.isInteger(error?.status) && error.status >= 400 && error.status < 500 && error.status !== 429) {
1533
- await abortHttpTransferState(transferState);
1534
- throw error;
1535
- }
1536
- if (typeof error?.code === 'string' && error.code.startsWith('http_')) {
1537
- await abortHttpTransferState(transferState);
1538
- throw error;
1539
- }
1540
-
1541
- if (attempt < maxRetries) {
1542
- await new Promise((resolve) => setTimeout(resolve, retryDelay));
1543
- retryDelay = Math.min(retryDelay * 2, maxRetryDelayMs);
1544
- continue;
1545
- }
1546
-
1547
- if (writeToStore) {
1548
- await persistHttpTransferState(transferState);
1549
- } else {
1550
- await abortHttpTransferState(transferState);
1551
- }
1552
- }
1553
- }
1554
-
1555
- if (writeToStore) {
1556
- await persistHttpTransferState(transferState);
1557
- } else {
1558
- await abortHttpTransferState(transferState);
1559
- }
1560
- throw lastError;
1561
- }
1562
-
1563
- async function downloadShardFromP2P(shardIndex, shardInfo, p2pConfig, options = {}) {
1564
- const transport = p2pConfig.transport;
1565
- if (!p2pConfig.enabled || typeof transport !== 'function') {
1566
- throw createP2PTransportError(
1567
- P2P_TRANSPORT_ERROR_CODES.unconfigured,
1568
- 'P2P transport is not configured',
1569
- { shardIndex }
1570
- );
1571
- }
1572
- const transportState = getP2PTransportPolicyState(transport);
1573
-
1574
- const writeToStore = options.writeToStore === true;
1575
- const algorithm = options.algorithm;
1576
- if (writeToStore && !algorithm) {
1577
- throw new Error(`Missing hash algorithm for shard ${shardIndex} p2p transfer.`);
1578
- }
1579
-
1580
- const expectedSize = Number.isFinite(options.expectedSize)
1581
- ? Math.floor(options.expectedSize)
1582
- : null;
1583
- const disablePersistedResume = options.__disablePersistedResume === true;
1584
- let seededResumeOffset = 0;
1585
- let transferState = null;
1586
- if (writeToStore) {
1587
- if (!disablePersistedResume) {
1588
- try {
1589
- seededResumeOffset = await resolvePersistedResumeOffset(
1590
- true,
1591
- shardIndex,
1592
- expectedSize
1593
- );
1594
- } catch (error) {
1595
- if (error?.code === 'resume_state_oversize') {
1596
- await clearPersistedShardState(shardIndex);
1597
- seededResumeOffset = 0;
1598
- } else {
1599
- throw error;
1600
- }
1601
- }
1602
- }
1603
- try {
1604
- transferState = await createHttpTransferState(
1605
- true,
1606
- shardIndex,
1607
- algorithm,
1608
- seededResumeOffset
1609
- );
1610
- } catch (error) {
1611
- if (error?.code === 'resume_state_prefix_mismatch') {
1612
- await clearPersistedShardState(shardIndex);
1613
- seededResumeOffset = 0;
1614
- transferState = await createHttpTransferState(true, shardIndex, algorithm, 0);
1615
- } else {
1616
- throw error;
1617
- }
1618
- }
1619
- }
1620
- const startedWithResume = writeToStore && seededResumeOffset > 0;
1621
-
1622
- const startTime = performance.now();
1623
- let lastError = null;
1624
- const maxRetries = Math.max(0, p2pConfig.maxRetries);
1625
- for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
1626
- try {
1627
- const requestResumeOffset = transferState?.receivedBytes ?? 0;
1628
- const nowMs = Date.now();
1629
- const attemptContext = {
1630
- shardIndex,
1631
- attempt,
1632
- maxRetries,
1633
- resumeOffset: requestResumeOffset,
1634
- expectedHash: options.expectedHash ?? null,
1635
- expectedSize: options.expectedSize ?? null,
1636
- expectedManifestVersionSet: options.expectedManifestVersionSet ?? null,
1637
- };
1638
- await refreshP2PSessionTokenFromControlPlane(
1639
- p2pConfig,
1640
- attemptContext,
1641
- nowMs
1642
- );
1643
- await enforceP2PControlPlanePolicy(
1644
- p2pConfig,
1645
- attemptContext,
1646
- nowMs
1647
- );
1648
- enforceP2PSecurityAndAbusePolicy(
1649
- p2pConfig,
1650
- transportState,
1651
- shardIndex,
1652
- nowMs
1653
- );
1654
- const transportResult = await withTimeout(
1655
- transport({
1656
- shardIndex,
1657
- shardInfo,
1658
- signal: options.signal,
1659
- source: DISTRIBUTION_SOURCE_P2P,
1660
- timeoutMs: p2pConfig.timeoutMs,
1661
- contractVersion: p2pConfig.contractVersion,
1662
- attempt,
1663
- maxRetries,
1664
- resumeOffset: requestResumeOffset,
1665
- expectedHash: options.expectedHash ?? null,
1666
- expectedSize: options.expectedSize ?? null,
1667
- expectedManifestVersionSet: options.expectedManifestVersionSet ?? null,
1668
- }),
1669
- p2pConfig.timeoutMs,
1670
- `P2P shard ${shardIndex}`
1671
- );
1672
- const payload = normalizeP2PTransportResult(
1673
- transportResult,
1674
- `P2P transport result for shard ${shardIndex}`
1675
- );
1676
- if (!payload) {
1677
- throw createP2PTransportError(
1678
- P2P_TRANSPORT_ERROR_CODES.payloadInvalid,
1679
- `P2P transport returned empty payload for shard ${shardIndex}`,
1680
- { shardIndex }
1681
- );
1682
- }
1683
-
1684
- const payloadRangeStart = payload.rangeStart;
1685
- const payloadTotalSize = payload.totalSize;
1686
- assertP2PTotalSize(shardIndex, payloadTotalSize, expectedSize);
1687
-
1688
- const onProgress = options.onProgress ?? null;
1689
- const transferResult = await (async () => {
1690
- if (!writeToStore) {
1691
- assertP2PPayloadRangeStart(shardIndex, payloadRangeStart, 0);
1692
- assertP2PPayloadBoundary(
1693
- shardIndex,
1694
- 0,
1695
- payload.data.byteLength,
1696
- payloadTotalSize,
1697
- false
1698
- );
1699
- onProgress?.({
1700
- shardIndex,
1701
- receivedBytes: payload.data.byteLength,
1702
- totalBytes: expectedSize ?? payloadTotalSize ?? payload.data.byteLength,
1703
- percent: 100,
1704
- });
1705
- return {
1706
- buffer: payload.data,
1707
- bytes: payload.data.byteLength,
1708
- source: DISTRIBUTION_SOURCE_P2P,
1709
- path: 'p2p-transport',
1710
- wrote: false,
1711
- writeDurationMs: null,
1712
- };
1713
- }
1714
-
1715
- let effectiveRangeStart = payloadRangeStart;
1716
- if (effectiveRangeStart == null) {
1717
- effectiveRangeStart = requestResumeOffset;
1718
- }
1719
- if (requestResumeOffset > 0 && effectiveRangeStart === 0) {
1720
- await resetHttpTransferState(transferState, true, shardIndex, algorithm);
1721
- } else {
1722
- assertP2PPayloadRangeStart(
1723
- shardIndex,
1724
- effectiveRangeStart,
1725
- transferState.receivedBytes
1726
- );
1727
- }
1728
- assertP2PPayloadBoundary(
1729
- shardIndex,
1730
- effectiveRangeStart,
1731
- payload.data.byteLength,
1732
- payloadTotalSize,
1733
- true
1734
- );
1735
- await appendHttpTransferChunk(transferState, new Uint8Array(payload.data));
1736
- onProgress?.({
1737
- shardIndex,
1738
- receivedBytes: transferState.receivedBytes,
1739
- totalBytes: expectedSize ?? payloadTotalSize ?? transferState.receivedBytes,
1740
- percent: 100,
1741
- });
1742
- const finalized = await finalizeHttpTransferState(transferState, startTime, shardIndex);
1743
- if (Number.isFinite(expectedSize)) {
1744
- assertExpectedSize(finalized.bytes, expectedSize, shardIndex);
1745
- } else if (Number.isInteger(payloadTotalSize)) {
1746
- assertExpectedSize(finalized.bytes, payloadTotalSize, shardIndex);
1747
- }
1748
- return {
1749
- ...finalized,
1750
- source: DISTRIBUTION_SOURCE_P2P,
1751
- path: 'p2p-stream-store',
1752
- };
1753
- })();
1754
- const result = {
1755
- ...transferResult,
1756
- manifestVersionSet: normalizeManifestVersionSet(
1757
- payload.manifestVersionSet ?? options.expectedManifestVersionSet
1758
- ),
1759
- };
1760
- if (!result.hash && result.buffer instanceof ArrayBuffer) {
1761
- result.hash = await computeHash(result.buffer, options.algorithm);
1762
- }
1763
- if (writeToStore) {
1764
- try {
1765
- assertExpectedManifestVersionSet(
1766
- result.manifestVersionSet,
1767
- options.expectedManifestVersionSet,
1768
- shardIndex,
1769
- DISTRIBUTION_SOURCE_P2P
1770
- );
1771
- if (Number.isFinite(expectedSize)) {
1772
- assertExpectedSize(result.bytes, expectedSize, shardIndex);
1773
- }
1774
- if (options.expectedHash) {
1775
- assertExpectedHash(result.hash, options.expectedHash, shardIndex);
1776
- }
1777
- } catch (verificationError) {
1778
- await clearPersistedShardState(shardIndex);
1779
- if (
1780
- startedWithResume
1781
- && options.__resumeRecoveryAttempted !== true
1782
- && options.expectedHash
1783
- && verificationError?.code === 'hash_mismatch'
1784
- ) {
1785
- return downloadShardFromP2P(shardIndex, shardInfo, p2pConfig, {
1786
- ...options,
1787
- __disablePersistedResume: true,
1788
- __resumeRecoveryAttempted: true,
1789
- });
1790
- }
1791
- throw verificationError;
1792
- }
1793
- }
1794
- markP2PTransportSuccess(transportState);
1795
- return result;
1796
- } catch (error) {
1797
- if (typeof error?.code === 'string' && error.code.startsWith('p2p_')) {
1798
- if (writeToStore) {
1799
- await clearPersistedShardState(shardIndex);
1800
- }
1801
- throw error;
1802
- }
1803
-
1804
- const normalized = normalizeP2PTransportError(error, {
1805
- shardIndex,
1806
- attempt,
1807
- maxRetries,
1808
- label: `P2P shard ${shardIndex}`,
1809
- });
1810
- lastError = normalized;
1811
- markP2PTransportFailure(
1812
- p2pConfig,
1813
- transportState,
1814
- normalized,
1815
- Date.now()
1816
- );
1817
- if (normalized?.code === P2P_TRANSPORT_ERROR_CODES.aborted) {
1818
- if (writeToStore) {
1819
- await persistHttpTransferState(transferState);
1820
- }
1821
- const abortError = createAbortError(normalized.message || 'P2P transport aborted');
1822
- throw abortError;
1823
- }
1824
- if (attempt < maxRetries && isP2PTransportRetryable(normalized)) {
1825
- await new Promise((resolve) => setTimeout(resolve, p2pConfig.retryDelayMs));
1826
- continue;
1827
- }
1828
- if (writeToStore) {
1829
- await persistHttpTransferState(transferState);
1830
- }
1831
- throw normalized;
1832
- }
1833
- }
1834
-
1835
- if (writeToStore) {
1836
- await persistHttpTransferState(transferState);
1837
- }
1838
- throw lastError;
1839
- }
1840
-
1841
- async function executeDeliveryPlan(
1842
- baseUrl,
1843
- shardIndex,
1844
- shardInfo,
1845
- plan,
1846
- p2p,
1847
- options,
1848
- trace,
1849
- decisionTraceConfig,
1850
- sourceMatrix,
1851
- attemptLog
1852
- ) {
1853
- let lastError = null;
1854
- const enabledSources = plan.filter((entry) => entry.enabled);
1855
-
1856
- for (const step of plan) {
1857
- if (!step.enabled) {
1858
- if (decisionTraceConfig.includeSkippedSources === true) {
1859
- appendDecisionTraceAttempt(trace, {
1860
- source: step.source,
1861
- status: 'skipped',
1862
- reason: step.reason,
1863
- });
1864
- }
1865
- appendAttemptLogAttempt(attemptLog, {
1866
- source: step.source,
1867
- status: 'skipped',
1868
- });
1869
- continue;
1870
- }
1871
-
1872
- const attemptStart = performance.now();
1873
- try {
1874
- let result = null;
1875
- if (step.source === DISTRIBUTION_SOURCE_CACHE) {
1876
- if (!(await shardExists(shardIndex))) {
1877
- const cacheMiss = new Error(`Shard ${shardIndex} missing from local cache`);
1878
- cacheMiss.code = 'cache_miss';
1879
- throw cacheMiss;
1880
- }
1881
- const buffer = await loadShardFromStore(shardIndex, { verify: false });
1882
- result = {
1883
- buffer,
1884
- bytes: buffer.byteLength,
1885
- hash: await computeHash(buffer, options.algorithm),
1886
- wrote: false,
1887
- source: DISTRIBUTION_SOURCE_CACHE,
1888
- path: 'cache',
1889
- manifestVersionSet: options.expectedManifestVersionSet ?? null,
1890
- writeDurationMs: null,
1891
- };
1892
- } else if (step.source === DISTRIBUTION_SOURCE_P2P) {
1893
- result = await downloadShardFromP2P(shardIndex, shardInfo, p2p, options);
1894
- if (!result.hash) {
1895
- if (!(result.buffer instanceof ArrayBuffer)) {
1896
- throw new Error(`Shard ${shardIndex} p2p result missing hash and buffer.`);
1897
- }
1898
- result.hash = await computeHash(result.buffer, options.algorithm);
1899
- }
1900
- } else if (step.source === DISTRIBUTION_SOURCE_HTTP) {
1901
- result = await downloadShardFromHttp(baseUrl, shardInfo, shardIndex, { ...options });
1902
- }
1903
-
1904
- assertExpectedManifestVersionSet(
1905
- result.manifestVersionSet,
1906
- options.expectedManifestVersionSet,
1907
- shardIndex,
1908
- step.source
1909
- );
1910
- assertExpectedHash(result.hash, options.expectedHash, shardIndex);
1911
- assertExpectedSize(result.bytes, options.expectedSize, shardIndex);
1912
-
1913
- appendDecisionTraceAttempt(trace, {
1914
- source: step.source,
1915
- status: 'success',
1916
- durationMs: performance.now() - attemptStart,
1917
- bytes: result.bytes,
1918
- hash: result.hash,
1919
- path: result.path,
1920
- manifestVersionSet: result.manifestVersionSet,
1921
- });
1922
- appendAttemptLogAttempt(attemptLog, {
1923
- source: step.source,
1924
- status: 'success',
1925
- durationMs: performance.now() - attemptStart,
1926
- writeDurationMs: result.writeDurationMs,
1927
- });
1928
- return result;
1929
- } catch (error) {
1930
- if (error?.name === 'AbortError') {
1931
- throw error;
1932
- }
1933
- lastError = error;
1934
- appendDecisionTraceAttempt(trace, {
1935
- source: step.source,
1936
- status: 'failed',
1937
- reason: step.reason,
1938
- code: error?.code || null,
1939
- message: error?.message || String(error),
1940
- durationMs: performance.now() - attemptStart,
1941
- });
1942
- appendAttemptLogAttempt(attemptLog, {
1943
- source: step.source,
1944
- status: 'failed',
1945
- code: error?.code || null,
1946
- durationMs: performance.now() - attemptStart,
1947
- });
1948
- const enabledIndex = enabledSources.findIndex((entry) => entry.source === step.source);
1949
- const isLastEnabled = enabledIndex === enabledSources.length - 1;
1950
- const transitionType = (
1951
- error?.code === 'cache_miss'
1952
- || error?.code === 'p2p_unconfigured'
1953
- || error?.code === P2P_TRANSPORT_ERROR_CODES.unconfigured
1954
- || error?.code === P2P_TRANSPORT_ERROR_CODES.unavailable
1955
- )
1956
- ? 'onMiss'
1957
- : 'onFailure';
1958
- const transition = sourceMatrix?.[step.source]?.[transitionType] || 'next';
1959
- if (isLastEnabled || transition === 'terminal') {
1960
- log.warn('Distribution', `All shard delivery sources failed for shard ${shardIndex}: ${error.message}`);
1961
- throw error;
1962
- }
1963
- log.warn('Distribution', `Shard ${shardIndex} source "${step.source}" failed (${error.code || 'error'}): ${error.message}`);
1964
- continue;
1965
- }
1966
- }
1967
-
1968
- throw lastError || new Error(`No shard delivery source available for shard ${shardIndex}`);
1969
- }
1970
-
1971
- export async function downloadShard(
1972
- baseUrl,
1973
- shardIndex,
1974
- shardInfo,
1975
- options = {}
1976
- ) {
1977
- const {
1978
- sourceOrder,
1979
- distributionConfig = {},
1980
- distribution = {},
1981
- maxRetries,
1982
- initialRetryDelayMs,
1983
- maxRetryDelayMs,
1984
- requiredEncoding,
1985
- algorithm,
1986
- signal,
1987
- onProgress = null,
1988
- onDeliveryMetrics = null,
1989
- writeToStore = false,
1990
- enableSourceCache = true,
1991
- p2pTransport,
1992
- expectedSize,
1993
- } = options;
1994
-
1995
- if (!algorithm) {
1996
- throw new Error('Missing hash algorithm for shard download verification.');
1997
- }
1998
-
1999
- const activeConfig = {
2000
- ...(distributionConfig || {}),
2001
- ...distribution,
2002
- sourceOrder: sourceOrder || distributionConfig?.sourceOrder || distributionConfig?.sources,
2003
- };
2004
-
2005
- const antiRollback = normalizeAntiRollbackConfig(activeConfig);
2006
- const decisionTraceConfig = normalizeDecisionTraceConfig(activeConfig);
2007
- const sourceMatrix = normalizeSourceMatrix(activeConfig);
2008
- const order = normalizeDistributionSourceOrder(activeConfig.sourceOrder);
2009
-
2010
- const p2p = normalizeP2PConfig({
2011
- ...activeConfig.p2p,
2012
- transport: activeConfig?.p2p?.transport || p2pTransport,
2013
- });
2014
-
2015
- const downloadOptions = parseDownloadOptions({
2016
- ...options,
2017
- algorithm,
2018
- onProgress,
2019
- onDeliveryMetrics,
2020
- signal,
2021
- requiredEncoding: requiredEncoding ?? activeConfig.requiredContentEncoding ?? null,
2022
- expectedHash:
2023
- options.expectedHash
2024
- ?? getExpectedShardHash(shardInfo, algorithm)
2025
- ?? activeConfig.expectedHash
2026
- ?? null,
2027
- expectedSize: expectedSize ?? shardInfo?.size ?? null,
2028
- expectedManifestVersionSet: options.expectedManifestVersionSet ?? null,
2029
- writeToStore,
2030
- maxRetries: maxRetries ?? activeConfig.maxRetries,
2031
- initialRetryDelayMs: initialRetryDelayMs ?? activeConfig.initialRetryDelayMs,
2032
- maxRetryDelayMs: maxRetryDelayMs ?? activeConfig.maxRetryDelayMs,
2033
- });
2034
-
2035
- if (antiRollback.enabled && antiRollback.requireExpectedHash && !downloadOptions.expectedHash) {
2036
- throw createDopplerError(
2037
- ERROR_CODES.DISTRIBUTION_SHARD_HASH_MISMATCH,
2038
- `Missing expected hash for shard ${shardIndex} while antiRollback.requireExpectedHash=true.`
2039
- );
2040
- }
2041
-
2042
- if (
2043
- antiRollback.enabled
2044
- && antiRollback.requireExpectedSize
2045
- && !Number.isFinite(downloadOptions.expectedSize)
2046
- ) {
2047
- throw createDopplerError(
2048
- ERROR_CODES.DISTRIBUTION_SHARD_SIZE_MISMATCH,
2049
- `Missing expected size for shard ${shardIndex} while antiRollback.requireExpectedSize=true.`
2050
- );
2051
- }
2052
-
2053
- if (
2054
- antiRollback.enabled
2055
- && antiRollback.requireManifestVersionSet
2056
- && !downloadOptions.expectedManifestVersionSet
2057
- ) {
2058
- throw createDopplerError(
2059
- ERROR_CODES.DISTRIBUTION_SHARD_MANIFEST_VERSION_SET_MISMATCH,
2060
- `Missing expected manifestVersionSet for shard ${shardIndex} while antiRollback.requireManifestVersionSet=true.`
2061
- );
2062
- }
2063
-
2064
- const planResult = resolveShardDeliveryPlan({
2065
- sourceOrder: order,
2066
- enableSourceCache,
2067
- p2pEnabled: p2p.enabled,
2068
- p2pTransportAvailable: typeof p2p.transport === 'function',
2069
- httpEnabled: true,
2070
- });
2071
-
2072
- const trace = decisionTraceConfig.enabled
2073
- && shouldEmitDecisionTrace(
2074
- decisionTraceConfig,
2075
- shardIndex,
2076
- downloadOptions.expectedManifestVersionSet,
2077
- order
2078
- )
2079
- ? createDecisionTrace(
2080
- order,
2081
- planResult.plan,
2082
- shardIndex,
2083
- decisionTraceConfig.deterministic,
2084
- downloadOptions.expectedManifestVersionSet
2085
- )
2086
- : null;
2087
-
2088
- const dedupeKey = createDeliveryKey(baseUrl, shardIndex, downloadOptions, order, sourceMatrix);
2089
- if (inFlightDeliveries.has(dedupeKey)) {
2090
- return await awaitWithSignal(
2091
- inFlightDeliveries.get(dedupeKey),
2092
- signal,
2093
- `Shard ${shardIndex} delivery aborted`
2094
- );
2095
- }
2096
-
2097
- const deliveryPromise = (async () => {
2098
- const deliveryStart = performance.now();
2099
- const attemptLog = [];
2100
- const result = await executeDeliveryPlan(
2101
- baseUrl,
2102
- shardIndex,
2103
- shardInfo,
2104
- planResult.plan,
2105
- p2p,
2106
- downloadOptions,
2107
- trace,
2108
- decisionTraceConfig,
2109
- sourceMatrix,
2110
- attemptLog
2111
- );
2112
- const metrics = createDeliveryMetrics(
2113
- order,
2114
- result,
2115
- attemptLog,
2116
- performance.now() - deliveryStart
2117
- );
2118
- const resultWithMetrics = {
2119
- ...result,
2120
- deliveryMetrics: metrics,
2121
- };
2122
- await emitDeliveryMetricsHook(downloadOptions.onDeliveryMetrics, {
2123
- schemaVersion: DISTRIBUTION_DELIVERY_METRICS_EVENT_SCHEMA_VERSION,
2124
- shardIndex,
2125
- source: result.source ?? null,
2126
- path: result.path ?? null,
2127
- expectedManifestVersionSet: downloadOptions.expectedManifestVersionSet ?? null,
2128
- deliveryMetrics: metrics,
2129
- decisionTrace: trace ?? null,
2130
- });
2131
- return attachDecisionTrace(resultWithMetrics, trace);
2132
- })();
2133
-
2134
- inFlightDeliveries.set(dedupeKey, deliveryPromise);
2135
- try {
2136
- return await awaitWithSignal(
2137
- deliveryPromise,
2138
- signal,
2139
- `Shard ${shardIndex} delivery aborted`
2140
- );
2141
- } finally {
2142
- inFlightDeliveries.delete(dedupeKey);
2143
- }
2144
- }
2145
-
2146
- export function getSourceOrder(config = {}) {
2147
- return normalizeDistributionSourceOrder(config.sourceOrder || config.sources || DISTRIBUTION_SOURCES);
2148
- }
2149
-
2150
- export function getInFlightShardDeliveryCount() {
2151
- return inFlightDeliveries.size;
2152
- }