@apifuse/provider-sdk 2.2.0-beta.7 → 2.2.0-beta.70

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 (478) hide show
  1. package/AUTHORING.md +943 -51
  2. package/CHANGELOG.md +273 -1
  3. package/LICENSE +21 -0
  4. package/README.md +117 -29
  5. package/SUBMISSION.md +3 -2
  6. package/bin/apifuse-check.ts +293 -13
  7. package/bin/apifuse-dev.ts +42 -19
  8. package/bin/apifuse-migrate-deployment.ts +200 -0
  9. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  10. package/bin/apifuse-migrate-shape.ts +202 -0
  11. package/bin/apifuse-pack-check.ts +19 -6
  12. package/bin/apifuse-pack-smoke.ts +57 -2
  13. package/bin/apifuse-pack-types.ts +736 -38
  14. package/bin/apifuse-perf.ts +59 -23
  15. package/bin/apifuse-record.ts +923 -94
  16. package/bin/apifuse-submit-check.ts +2313 -281
  17. package/bin/apifuse-test.ts +3 -1
  18. package/bin/submit-check-delimited-text.ts +50 -0
  19. package/dist/auth-turn/index.d.ts +3 -3
  20. package/dist/auth-turn/index.js +1 -1
  21. package/dist/auth.d.ts +14 -0
  22. package/dist/auth.js +67 -0
  23. package/dist/ceremonies/index.d.ts +16 -0
  24. package/dist/ceremonies/index.js +141 -36
  25. package/dist/cli/commands.d.ts +1 -1
  26. package/dist/cli/commands.js +30 -0
  27. package/dist/cli/create.d.ts +1 -1
  28. package/dist/cli/create.js +8 -2
  29. package/dist/cli/deployment-intent.d.ts +178 -0
  30. package/dist/cli/deployment-intent.js +277 -0
  31. package/dist/cli/local-connection.d.ts +111 -0
  32. package/dist/cli/local-connection.js +151 -0
  33. package/dist/cli/migrate-deployment-intent.d.ts +132 -0
  34. package/dist/cli/migrate-deployment-intent.js +1552 -0
  35. package/dist/cli/migrate-operation-declaration.d.ts +70 -0
  36. package/dist/cli/migrate-operation-declaration.js +2206 -0
  37. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  38. package/dist/cli/migrate-operation-shape.js +113 -0
  39. package/dist/cli/migrate-provider-shape.d.ts +56 -0
  40. package/dist/cli/migrate-provider-shape.js +580 -0
  41. package/dist/cli/resolver-runtime.d.ts +21 -0
  42. package/dist/cli/resolver-runtime.js +31 -0
  43. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  44. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  45. package/dist/cli/templates/provider/README.md.tpl +41 -19
  46. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  47. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  48. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  49. package/dist/config/loader.d.ts +202 -16
  50. package/dist/config/loader.js +491 -141
  51. package/dist/contract-serialization.js +4 -8
  52. package/dist/contract-types.d.ts +12 -5
  53. package/dist/contract.js +24 -10
  54. package/dist/declaration-validation.d.ts +34 -0
  55. package/dist/declaration-validation.js +305 -0
  56. package/dist/define.d.ts +71 -29
  57. package/dist/define.js +807 -69
  58. package/dist/dev.d.ts +5 -0
  59. package/dist/dev.js +8 -1
  60. package/dist/engine.d.ts +129 -0
  61. package/dist/engine.js +209 -0
  62. package/dist/error-observability.d.ts +7 -0
  63. package/dist/error-observability.js +61 -0
  64. package/dist/error-resolution.d.ts +18 -0
  65. package/dist/error-resolution.js +243 -0
  66. package/dist/errors.d.ts +74 -0
  67. package/dist/errors.js +99 -0
  68. package/dist/fixture-sanitization.d.ts +28 -0
  69. package/dist/fixture-sanitization.js +371 -0
  70. package/dist/handle-meta.d.ts +90 -0
  71. package/dist/handle-meta.js +73 -0
  72. package/dist/handle.d.ts +226 -0
  73. package/dist/handle.js +345 -0
  74. package/dist/health-scenario.d.ts +1901 -0
  75. package/dist/health-scenario.js +653 -0
  76. package/dist/i18n/catalog.js +21 -1
  77. package/dist/i18n/error-messages.d.ts +86 -0
  78. package/dist/i18n/error-messages.js +192 -0
  79. package/dist/i18n/index.d.ts +1 -0
  80. package/dist/i18n/index.js +1 -0
  81. package/dist/i18n/keys.d.ts +12 -0
  82. package/dist/i18n/keys.js +76 -5
  83. package/dist/i18n/operation-locale-namespace.d.ts +2 -0
  84. package/dist/i18n/operation-locale-namespace.js +7 -0
  85. package/dist/index.d.ts +40 -15
  86. package/dist/index.js +29 -11
  87. package/dist/lint.d.ts +43 -11
  88. package/dist/lint.js +2512 -177
  89. package/dist/native-address.d.ts +43 -0
  90. package/dist/native-address.js +281 -0
  91. package/dist/native-egress-policy.d.ts +31 -0
  92. package/dist/native-egress-policy.js +288 -0
  93. package/dist/observability.d.ts +5 -2
  94. package/dist/observability.js +48 -1
  95. package/dist/provider.d.ts +18 -8
  96. package/dist/provider.js +11 -6
  97. package/dist/runtime/auth-flow.d.ts +6 -1
  98. package/dist/runtime/auth-flow.js +8 -0
  99. package/dist/runtime/bounded-expiring-map.d.ts +21 -0
  100. package/dist/runtime/bounded-expiring-map.js +64 -0
  101. package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
  102. package/dist/runtime/browser-telemetry-binding.js +83 -0
  103. package/dist/runtime/browser-telemetry.d.ts +76 -0
  104. package/dist/runtime/browser-telemetry.js +165 -0
  105. package/dist/runtime/browser.d.ts +4 -0
  106. package/dist/runtime/browser.js +688 -83
  107. package/dist/runtime/cache-telemetry.d.ts +71 -0
  108. package/dist/runtime/cache-telemetry.js +177 -0
  109. package/dist/runtime/cache.d.ts +3 -0
  110. package/dist/runtime/cache.js +245 -23
  111. package/dist/runtime/capability-response.d.ts +3 -0
  112. package/dist/runtime/capability-response.js +56 -0
  113. package/dist/runtime/capability-telemetry.d.ts +46 -0
  114. package/dist/runtime/capability-telemetry.js +68 -0
  115. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  116. package/dist/runtime/chrome149-header-order.js +289 -0
  117. package/dist/runtime/diagnostic-env-values.d.ts +5 -0
  118. package/dist/runtime/diagnostic-env-values.js +57 -0
  119. package/dist/runtime/diagnostic-env.d.ts +14 -0
  120. package/dist/runtime/diagnostic-env.js +44 -0
  121. package/dist/runtime/diagnostic-redactor.d.ts +54 -0
  122. package/dist/runtime/diagnostic-redactor.js +571 -0
  123. package/dist/runtime/egress-lease.d.ts +65 -0
  124. package/dist/runtime/egress-lease.js +236 -0
  125. package/dist/runtime/engine-mode.d.ts +74 -0
  126. package/dist/runtime/engine-mode.js +152 -0
  127. package/dist/runtime/env.js +14 -1
  128. package/dist/runtime/executor.d.ts +3 -2
  129. package/dist/runtime/executor.js +23 -26
  130. package/dist/runtime/handle-wordlist.d.ts +43 -0
  131. package/dist/runtime/handle-wordlist.js +256 -0
  132. package/dist/runtime/handle.d.ts +71 -0
  133. package/dist/runtime/handle.js +908 -0
  134. package/dist/runtime/http-telemetry-binding.d.ts +10 -0
  135. package/dist/runtime/http-telemetry-binding.js +152 -0
  136. package/dist/runtime/http-telemetry-guard.d.ts +16 -0
  137. package/dist/runtime/http-telemetry-guard.js +202 -0
  138. package/dist/runtime/http-telemetry.d.ts +104 -0
  139. package/dist/runtime/http-telemetry.js +190 -0
  140. package/dist/runtime/http.d.ts +34 -0
  141. package/dist/runtime/http.js +680 -121
  142. package/dist/runtime/insights.js +2 -2
  143. package/dist/runtime/instrumentation.d.ts +2 -2
  144. package/dist/runtime/instrumentation.js +462 -19
  145. package/dist/runtime/native-network-errors.d.ts +33 -0
  146. package/dist/runtime/native-network-errors.js +69 -0
  147. package/dist/runtime/native-network.d.ts +105 -0
  148. package/dist/runtime/native-network.js +1433 -0
  149. package/dist/runtime/native-telemetry.d.ts +142 -0
  150. package/dist/runtime/native-telemetry.js +231 -0
  151. package/dist/runtime/ocr-telemetry.d.ts +82 -0
  152. package/dist/runtime/ocr-telemetry.js +192 -0
  153. package/dist/runtime/ocr.d.ts +29 -0
  154. package/dist/runtime/ocr.js +468 -0
  155. package/dist/runtime/otlp.d.ts +71 -2
  156. package/dist/runtime/otlp.js +398 -16
  157. package/dist/runtime/provider.d.ts +7 -0
  158. package/dist/runtime/provider.js +14 -0
  159. package/dist/runtime/proxy-errors.js +6 -2
  160. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  161. package/dist/runtime/proxy-nodemaven.js +147 -0
  162. package/dist/runtime/proxy-retry-policy.d.ts +4 -1
  163. package/dist/runtime/proxy-retry-policy.js +11 -2
  164. package/dist/runtime/proxy-telemetry.d.ts +133 -3
  165. package/dist/runtime/proxy-telemetry.js +218 -70
  166. package/dist/runtime/redirect-hop-headers.d.ts +19 -0
  167. package/dist/runtime/redirect-hop-headers.js +58 -0
  168. package/dist/runtime/redirects.d.ts +61 -0
  169. package/dist/runtime/redirects.js +149 -0
  170. package/dist/runtime/redis.d.ts +1 -1
  171. package/dist/runtime/redis.js +4 -2
  172. package/dist/runtime/request-options.d.ts +75 -1
  173. package/dist/runtime/request-options.js +588 -0
  174. package/dist/runtime/request-telemetry.d.ts +70 -0
  175. package/dist/runtime/request-telemetry.js +229 -0
  176. package/dist/runtime/resolver-config.d.ts +13 -0
  177. package/dist/runtime/resolver-config.js +14 -0
  178. package/dist/runtime/resolver-public.d.ts +3 -0
  179. package/dist/runtime/resolver-public.js +1 -0
  180. package/dist/runtime/resolver-runtime-options.d.ts +14 -0
  181. package/dist/runtime/resolver-runtime-options.js +33 -0
  182. package/dist/runtime/resolver-shared.d.ts +24 -0
  183. package/dist/runtime/resolver-shared.js +69 -0
  184. package/dist/runtime/resolver-span-attributes.d.ts +34 -0
  185. package/dist/runtime/resolver-span-attributes.js +93 -0
  186. package/dist/runtime/resolver-telemetry.d.ts +135 -0
  187. package/dist/runtime/resolver-telemetry.js +204 -0
  188. package/dist/runtime/resolver-usage.d.ts +32 -0
  189. package/dist/runtime/resolver-usage.js +54 -0
  190. package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
  191. package/dist/runtime/resolver-vendors/bindings.js +45 -0
  192. package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
  193. package/dist/runtime/resolver-vendors/browser.js +423 -0
  194. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  195. package/dist/runtime/resolver-vendors/capsolver.js +544 -0
  196. package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
  197. package/dist/runtime/resolver-vendors/hosts.js +68 -0
  198. package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
  199. package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
  200. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  201. package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
  202. package/dist/runtime/resolver-vendors/types.d.ts +125 -0
  203. package/dist/runtime/resolver-vendors/types.js +106 -0
  204. package/dist/runtime/resolver.d.ts +79 -0
  205. package/dist/runtime/resolver.js +1094 -0
  206. package/dist/runtime/state-telemetry.d.ts +79 -0
  207. package/dist/runtime/state-telemetry.js +194 -0
  208. package/dist/runtime/state.d.ts +10 -1
  209. package/dist/runtime/state.js +322 -82
  210. package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
  211. package/dist/runtime/stealth-akamai-sbsd.js +142 -0
  212. package/dist/runtime/stealth-cookies.d.ts +24 -0
  213. package/dist/runtime/stealth-cookies.js +131 -0
  214. package/dist/runtime/stealth-owned-headers.d.ts +39 -0
  215. package/dist/runtime/stealth-owned-headers.js +57 -0
  216. package/dist/runtime/stealth-telemetry.d.ts +92 -0
  217. package/dist/runtime/stealth-telemetry.js +179 -0
  218. package/dist/runtime/stealth.d.ts +45 -6
  219. package/dist/runtime/stealth.js +1775 -320
  220. package/dist/runtime/stt-telemetry.d.ts +77 -0
  221. package/dist/runtime/stt-telemetry.js +176 -0
  222. package/dist/runtime/stt.js +18 -19
  223. package/dist/runtime/timeout.d.ts +5 -0
  224. package/dist/runtime/timeout.js +12 -0
  225. package/dist/runtime/trace-config.d.ts +12 -0
  226. package/dist/runtime/trace-config.js +62 -0
  227. package/dist/runtime/trace.d.ts +17 -0
  228. package/dist/runtime/trace.js +176 -25
  229. package/dist/runtime-boundary-lint.d.ts +137 -0
  230. package/dist/runtime-boundary-lint.js +590 -0
  231. package/dist/schema.d.ts +20 -0
  232. package/dist/schema.js +72 -2
  233. package/dist/serve.d.ts +1 -1
  234. package/dist/serve.js +1 -1
  235. package/dist/server/error-observability.d.ts +1 -0
  236. package/dist/server/error-observability.js +1 -0
  237. package/dist/server/error-stack-frames.d.ts +35 -0
  238. package/dist/server/error-stack-frames.js +219 -0
  239. package/dist/server/index.d.ts +21 -2
  240. package/dist/server/index.js +11 -2
  241. package/dist/server/runtime-diagnostics.d.ts +165 -0
  242. package/dist/server/runtime-diagnostics.js +360 -0
  243. package/dist/server/sdk-version.d.ts +3 -0
  244. package/dist/server/sdk-version.js +19 -0
  245. package/dist/server/self-test-input-tokens.d.ts +2 -1
  246. package/dist/server/self-test-input-tokens.js +18 -14
  247. package/dist/server/self-test-redaction.js +8 -33
  248. package/dist/server/self-test.d.ts +18 -3
  249. package/dist/server/self-test.js +139 -76
  250. package/dist/server/sensitive-values.d.ts +26 -0
  251. package/dist/server/sensitive-values.js +137 -0
  252. package/dist/server/serve-implementation.d.ts +285 -0
  253. package/dist/server/serve-implementation.js +3172 -0
  254. package/dist/server/serve.d.ts +1 -75
  255. package/dist/server/serve.js +1 -1170
  256. package/dist/server/state-backend-report.d.ts +70 -0
  257. package/dist/server/state-backend-report.js +113 -0
  258. package/dist/server/trace-output.d.ts +7 -0
  259. package/dist/server/trace-output.js +111 -0
  260. package/dist/server/types.d.ts +37 -5
  261. package/dist/server/types.js +34 -1
  262. package/dist/stateful/errors.d.ts +19 -0
  263. package/dist/stateful/errors.js +24 -0
  264. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  265. package/dist/stateful/http-provider-event-emitter.js +237 -0
  266. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  267. package/dist/stateful/http-session-owner-registry.js +210 -0
  268. package/dist/stateful/index.d.ts +18 -0
  269. package/dist/stateful/index.js +18 -0
  270. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  271. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  272. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  273. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  274. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  275. package/dist/stateful/provider-event-pipeline.js +1 -0
  276. package/dist/stateful/provider-events.d.ts +101 -0
  277. package/dist/stateful/provider-events.js +289 -0
  278. package/dist/stateful/session-key.d.ts +15 -0
  279. package/dist/stateful/session-key.js +86 -0
  280. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  281. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  282. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  283. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  284. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  285. package/dist/stateful/stateful-provider-adapter.js +287 -0
  286. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  287. package/dist/stateful/stateful-provider-observability.js +161 -0
  288. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  289. package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
  290. package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
  291. package/dist/stateful/stateful-provider-runtime-context.js +61 -0
  292. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  293. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  294. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  295. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  296. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  297. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  298. package/dist/stateful-signing.d.ts +18 -0
  299. package/dist/stateful-signing.js +27 -0
  300. package/dist/stealth/profiles.d.ts +15 -4
  301. package/dist/stealth/profiles.js +169 -211
  302. package/dist/stream-evidence.d.ts +74 -0
  303. package/dist/stream-evidence.js +785 -0
  304. package/dist/stream.js +7 -1
  305. package/dist/testing/index.d.ts +2 -1
  306. package/dist/testing/index.js +2 -1
  307. package/dist/testing/run.d.ts +32 -2
  308. package/dist/testing/run.js +509 -25
  309. package/dist/trace-sanitization.d.ts +6 -0
  310. package/dist/trace-sanitization.js +68 -0
  311. package/dist/types.d.ts +899 -210
  312. package/dist/types.js +1 -0
  313. package/dist/typescript-module.d.ts +39 -0
  314. package/dist/typescript-module.js +72 -0
  315. package/package.json +52 -6
  316. package/src/auth-turn/index.ts +1 -1
  317. package/src/auth.ts +118 -0
  318. package/src/ceremonies/index.ts +189 -46
  319. package/src/cli/commands.ts +37 -0
  320. package/src/cli/create.ts +8 -2
  321. package/src/cli/deployment-intent.ts +364 -0
  322. package/src/cli/local-connection.ts +221 -0
  323. package/src/cli/migrate-deployment-intent.ts +1908 -0
  324. package/src/cli/migrate-operation-declaration.ts +3026 -0
  325. package/src/cli/migrate-operation-shape.ts +184 -0
  326. package/src/cli/migrate-provider-shape.ts +778 -0
  327. package/src/cli/resolver-runtime.ts +72 -0
  328. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  329. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  330. package/src/cli/templates/provider/README.md.tpl +41 -19
  331. package/src/cli/templates/provider/index.ts.tpl +6 -3
  332. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  333. package/src/cli/templates/provider/provider.json.tpl +6 -0
  334. package/src/config/loader.ts +774 -181
  335. package/src/contract-serialization.ts +5 -7
  336. package/src/contract-types.ts +12 -5
  337. package/src/contract.ts +24 -10
  338. package/src/declaration-validation.ts +376 -0
  339. package/src/define.ts +1105 -131
  340. package/src/dev.ts +13 -1
  341. package/src/engine.ts +390 -0
  342. package/src/error-observability.ts +64 -0
  343. package/src/error-resolution.ts +269 -0
  344. package/src/errors.ts +157 -0
  345. package/src/fixture-sanitization.ts +422 -0
  346. package/src/handle-meta.ts +143 -0
  347. package/src/handle.ts +694 -0
  348. package/src/health-scenario.ts +960 -0
  349. package/src/i18n/catalog.ts +23 -1
  350. package/src/i18n/error-messages.ts +255 -0
  351. package/src/i18n/index.ts +1 -0
  352. package/src/i18n/keys.ts +80 -6
  353. package/src/i18n/operation-locale-namespace.ts +10 -0
  354. package/src/index.ts +390 -23
  355. package/src/lint.ts +2975 -234
  356. package/src/native-address.ts +340 -0
  357. package/src/native-egress-policy.ts +358 -0
  358. package/src/observability.ts +51 -1
  359. package/src/provider.ts +207 -27
  360. package/src/runtime/auth-flow.ts +15 -0
  361. package/src/runtime/bounded-expiring-map.ts +67 -0
  362. package/src/runtime/browser-telemetry-binding.ts +92 -0
  363. package/src/runtime/browser-telemetry.ts +289 -0
  364. package/src/runtime/browser.ts +882 -99
  365. package/src/runtime/cache-telemetry.ts +247 -0
  366. package/src/runtime/cache.ts +258 -22
  367. package/src/runtime/capability-response.ts +53 -0
  368. package/src/runtime/capability-telemetry.ts +101 -0
  369. package/src/runtime/chrome149-header-order.ts +330 -0
  370. package/src/runtime/diagnostic-env-values.ts +56 -0
  371. package/src/runtime/diagnostic-env.ts +65 -0
  372. package/src/runtime/diagnostic-redactor.ts +668 -0
  373. package/src/runtime/egress-lease.ts +341 -0
  374. package/src/runtime/engine-mode.ts +233 -0
  375. package/src/runtime/env.ts +15 -1
  376. package/src/runtime/executor.ts +39 -32
  377. package/src/runtime/handle-wordlist.ts +266 -0
  378. package/src/runtime/handle.ts +1180 -0
  379. package/src/runtime/http-telemetry-binding.ts +162 -0
  380. package/src/runtime/http-telemetry-guard.ts +208 -0
  381. package/src/runtime/http-telemetry.ts +292 -0
  382. package/src/runtime/http.ts +896 -150
  383. package/src/runtime/insights.ts +2 -2
  384. package/src/runtime/instrumentation.ts +628 -28
  385. package/src/runtime/native-network-errors.ts +99 -0
  386. package/src/runtime/native-network.ts +1853 -0
  387. package/src/runtime/native-telemetry.ts +366 -0
  388. package/src/runtime/ocr-telemetry.ts +308 -0
  389. package/src/runtime/ocr.ts +564 -0
  390. package/src/runtime/otlp.ts +468 -21
  391. package/src/runtime/provider.ts +15 -0
  392. package/src/runtime/proxy-errors.ts +12 -4
  393. package/src/runtime/proxy-nodemaven.ts +222 -0
  394. package/src/runtime/proxy-retry-policy.ts +12 -1
  395. package/src/runtime/proxy-telemetry.ts +358 -103
  396. package/src/runtime/redirect-hop-headers.ts +71 -0
  397. package/src/runtime/redirects.ts +215 -0
  398. package/src/runtime/redis.ts +7 -2
  399. package/src/runtime/request-options.ts +728 -1
  400. package/src/runtime/request-telemetry.ts +375 -0
  401. package/src/runtime/resolver-config.ts +18 -0
  402. package/src/runtime/resolver-public.ts +44 -0
  403. package/src/runtime/resolver-runtime-options.ts +50 -0
  404. package/src/runtime/resolver-shared.ts +113 -0
  405. package/src/runtime/resolver-span-attributes.ts +139 -0
  406. package/src/runtime/resolver-telemetry.ts +362 -0
  407. package/src/runtime/resolver-usage.ts +99 -0
  408. package/src/runtime/resolver-vendors/bindings.ts +61 -0
  409. package/src/runtime/resolver-vendors/browser.ts +591 -0
  410. package/src/runtime/resolver-vendors/capsolver.ts +727 -0
  411. package/src/runtime/resolver-vendors/hosts.ts +81 -0
  412. package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
  413. package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
  414. package/src/runtime/resolver-vendors/types.ts +261 -0
  415. package/src/runtime/resolver.ts +1543 -0
  416. package/src/runtime/state-telemetry.ts +298 -0
  417. package/src/runtime/state.ts +435 -89
  418. package/src/runtime/stealth-akamai-sbsd.ts +207 -0
  419. package/src/runtime/stealth-cookies.ts +155 -0
  420. package/src/runtime/stealth-owned-headers.ts +67 -0
  421. package/src/runtime/stealth-telemetry.ts +309 -0
  422. package/src/runtime/stealth.ts +2275 -372
  423. package/src/runtime/stt-telemetry.ts +282 -0
  424. package/src/runtime/stt.ts +96 -91
  425. package/src/runtime/timeout.ts +18 -0
  426. package/src/runtime/trace-config.ts +78 -0
  427. package/src/runtime/trace.ts +257 -35
  428. package/src/runtime-boundary-lint.ts +707 -0
  429. package/src/schema.ts +80 -2
  430. package/src/serve.ts +6 -1
  431. package/src/server/error-observability.ts +1 -0
  432. package/src/server/error-stack-frames.ts +214 -0
  433. package/src/server/index.ts +184 -2
  434. package/src/server/runtime-diagnostics.ts +522 -0
  435. package/src/server/sdk-version.ts +22 -0
  436. package/src/server/self-test-input-tokens.ts +29 -14
  437. package/src/server/self-test-redaction.ts +10 -40
  438. package/src/server/self-test.ts +205 -89
  439. package/src/server/sensitive-values.ts +211 -0
  440. package/src/server/serve-implementation.ts +4596 -0
  441. package/src/server/serve.ts +1 -1685
  442. package/src/server/state-backend-report.ts +185 -0
  443. package/src/server/trace-output.ts +189 -0
  444. package/src/server/types.ts +34 -1
  445. package/src/stateful/README.md +146 -0
  446. package/src/stateful/errors.ts +35 -0
  447. package/src/stateful/http-provider-event-emitter.ts +314 -0
  448. package/src/stateful/http-session-owner-registry.ts +306 -0
  449. package/src/stateful/index.ts +18 -0
  450. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  451. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  452. package/src/stateful/provider-event-pipeline.ts +61 -0
  453. package/src/stateful/provider-events.ts +462 -0
  454. package/src/stateful/session-key.ts +111 -0
  455. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  456. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  457. package/src/stateful/stateful-provider-adapter.ts +562 -0
  458. package/src/stateful/stateful-provider-observability.ts +261 -0
  459. package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
  460. package/src/stateful/stateful-provider-runtime-context.ts +96 -0
  461. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  462. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  463. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  464. package/src/stateful-signing.ts +46 -0
  465. package/src/stealth/profiles.ts +212 -231
  466. package/src/stream-evidence.ts +988 -0
  467. package/src/stream.ts +8 -1
  468. package/src/testing/index.ts +10 -1
  469. package/src/testing/run.ts +685 -19
  470. package/src/trace-sanitization.ts +110 -0
  471. package/src/types.ts +1014 -273
  472. package/src/typescript-module.ts +100 -0
  473. package/dist/choice-token.d.ts +0 -24
  474. package/dist/choice-token.js +0 -74
  475. package/dist/runtime/choice.d.ts +0 -15
  476. package/dist/runtime/choice.js +0 -413
  477. package/src/choice-token.ts +0 -165
  478. package/src/runtime/choice.ts +0 -686
@@ -1,48 +1,155 @@
1
1
  import type {
2
2
  ProxyAttemptTelemetryEvent,
3
3
  ProxyCacheStatus,
4
+ ProxyProtocol,
4
5
  ProxyResolutionTelemetryEvent,
5
6
  ProxyTelemetrySink,
7
+ ProxyUserAgentSource,
8
+ ProxyVendorFailoverTelemetryEvent,
9
+ ProxyVendorName,
6
10
  SmartproxyAllocatorBodyClass,
7
11
  } from "../config/loader.js";
12
+ import {
13
+ closedEnum,
14
+ RequestTelemetry,
15
+ type ClosedEnum,
16
+ type TelemetryContributor,
17
+ } from "./request-telemetry.js";
18
+ import { createTraceContext } from "./trace.js";
8
19
 
9
- export const PROVIDER_TELEMETRY_HEADER = "X-ApiFuse-Provider-Telemetry";
10
-
11
- type ProviderTelemetryHeader = {
12
- v: 1;
13
- proxy?: {
14
- provider: "smartproxy";
15
- cacheStatus: ProxyCacheStatus;
16
- cacheHit: boolean;
17
- resolutionMs: number;
18
- allocatorMs?: number;
19
- allocatorStatus?: number;
20
- allocatorBodyClass?: SmartproxyAllocatorBodyClass;
21
- allocatorAttempts?: number;
22
- lockWaitMs?: number;
23
- redisReadMs?: number;
24
- redisWriteMs?: number;
25
- poolAgeMs?: number;
26
- poolExpiresInMs?: number;
27
- attempts: number;
28
- refreshes?: number;
29
- attemptSamples?: CompactProxyAttemptSample[];
30
- };
20
+ export { PROVIDER_TELEMETRY_HEADER } from "./request-telemetry.js";
21
+
22
+ declare const PROXY_HASH: unique symbol;
23
+ /** Bounded hexadecimal host hash used in proxy attempt samples. */
24
+ export type ProxyHash = ClosedEnum<string> & { readonly [PROXY_HASH]: true };
25
+
26
+ export type ProxyTelemetryResolvedPayload = {
27
+ kind: "resolved";
28
+ provider: ProxyVendorName;
29
+ userAgentSource?: ProxyUserAgentSource;
30
+ protocol?: ProxyProtocol;
31
+ cacheStatus: ProxyCacheStatus;
32
+ cacheHit: boolean;
33
+ resolutionMs: number;
34
+ allocatorMs?: number;
35
+ allocatorStatus?: number;
36
+ allocatorBodyClass?: SmartproxyAllocatorBodyClass;
37
+ allocatorAttempts?: number;
38
+ lockWaitMs?: number;
39
+ redisReadMs?: number;
40
+ redisWriteMs?: number;
41
+ poolAgeMs?: number;
42
+ poolExpiresInMs?: number;
43
+ attempts: number;
44
+ refreshes?: number;
45
+ attemptSamples?: {
46
+ n: number;
47
+ a: number;
48
+ i?: number;
49
+ h?: string;
50
+ o: ProxyAttemptTelemetryEvent["outcome"];
51
+ c?: string;
52
+ s?: number;
53
+ d?: number;
54
+ }[];
55
+ /** Distinct vendors attempted across the resolution chain, in order seen. */
56
+ vendors?: ProxyVendorName[];
57
+ /** Cross-vendor failover events (bounded). */
58
+ failovers?: {
59
+ v: ProxyVendorName;
60
+ nx?: ProxyVendorName;
61
+ p: ProxyVendorFailoverTelemetryEvent["phase"];
62
+ r: ProxyVendorFailoverTelemetryEvent["reason"];
63
+ a?: number;
64
+ }[];
31
65
  };
32
66
 
33
- type CompactProxyAttemptSample = {
34
- n: number;
35
- a: number;
36
- i?: number;
37
- h?: string;
38
- o: "ok" | "error";
39
- c?: string;
40
- s?: number;
41
- d?: number;
67
+ export type ProxyTelemetryUnresolvedPayload = {
68
+ kind: "unresolved";
69
+ /** Distinct vendors that failed resolution or recorded a failover, in order seen. */
70
+ vendors: ProxyVendorName[];
71
+ cacheStatus?: ProxyCacheStatus;
72
+ cacheHit?: boolean;
73
+ resolutionMs?: number;
74
+ allocatorMs?: number;
75
+ allocatorStatus?: number;
76
+ allocatorBodyClass?: SmartproxyAllocatorBodyClass;
77
+ allocatorAttempts?: number;
78
+ lockWaitMs?: number;
79
+ redisReadMs?: number;
80
+ redisWriteMs?: number;
81
+ poolAgeMs?: number;
82
+ poolExpiresInMs?: number;
83
+ attempts?: number;
84
+ refreshes?: number;
85
+ failovers?: {
86
+ v: ProxyVendorName;
87
+ nx?: ProxyVendorName;
88
+ p: ProxyVendorFailoverTelemetryEvent["phase"];
89
+ r: ProxyVendorFailoverTelemetryEvent["reason"];
90
+ a?: number;
91
+ }[];
92
+ attemptSamples?: {
93
+ n: number;
94
+ a: number;
95
+ i?: number;
96
+ h?: string;
97
+ o: ProxyAttemptTelemetryEvent["outcome"];
98
+ c?: string;
99
+ s?: number;
100
+ d?: number;
101
+ }[];
102
+ };
103
+
104
+ export type ProxyTelemetryLogPayload =
105
+ | ProxyTelemetryResolvedPayload
106
+ | ProxyTelemetryUnresolvedPayload;
107
+
108
+ /** Concrete gateway-safe projection of the unchanged proxy sibling. */
109
+ export type ProxyTelemetryHeaderPayload = {
110
+ kind: ClosedEnum<"resolved" | "unresolved">;
111
+ provider?: ClosedEnum<ProxyVendorName>;
112
+ userAgentSource?: ClosedEnum<ProxyUserAgentSource>;
113
+ protocol?: ClosedEnum<ProxyProtocol>;
114
+ cacheStatus?: ClosedEnum<ProxyCacheStatus>;
115
+ cacheHit?: boolean;
116
+ resolutionMs?: number;
117
+ allocatorMs?: number;
118
+ allocatorStatus?: number;
119
+ allocatorBodyClass?: ClosedEnum<SmartproxyAllocatorBodyClass>;
120
+ allocatorAttempts?: number;
121
+ lockWaitMs?: number;
122
+ redisReadMs?: number;
123
+ redisWriteMs?: number;
124
+ poolAgeMs?: number;
125
+ poolExpiresInMs?: number;
126
+ attempts?: number;
127
+ refreshes?: number;
128
+ attemptSamples?: {
129
+ n: number;
130
+ a: number;
131
+ i?: number;
132
+ h?: ProxyHash;
133
+ o: ClosedEnum<ProxyAttemptTelemetryEvent["outcome"]>;
134
+ c?: ClosedEnum<string>;
135
+ s?: number;
136
+ d?: number;
137
+ }[];
138
+ vendors?: ClosedEnum<ProxyVendorName>[];
139
+ failovers?: {
140
+ v: ClosedEnum<ProxyVendorName>;
141
+ nx?: ClosedEnum<ProxyVendorName>;
142
+ p: ClosedEnum<ProxyVendorFailoverTelemetryEvent["phase"]>;
143
+ r: ClosedEnum<ProxyVendorFailoverTelemetryEvent["reason"]>;
144
+ a?: number;
145
+ }[];
42
146
  };
43
147
 
44
- const MAX_HEADER_BYTES = 4_096;
45
148
  const MAX_PROXY_ATTEMPT_SAMPLES = 24;
149
+ const MAX_PROXY_FAILOVER_SAMPLES = 12;
150
+ const MAX_RETAINED_PROXY_RESOLUTIONS = 64;
151
+ const PROXY_HEADER_TOKEN = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/;
152
+ const PROXY_HEADER_HASH = /^[0-9a-f]{1,16}$/;
46
153
 
47
154
  const CACHE_STATUS_SEVERITY: Record<ProxyCacheStatus, number> = {
48
155
  disabled: 0,
@@ -69,17 +176,52 @@ function worseStatus(left: ProxyCacheStatus, right: ProxyCacheStatus): ProxyCach
69
176
  return CACHE_STATUS_SEVERITY[right] > CACHE_STATUS_SEVERITY[left] ? right : left;
70
177
  }
71
178
 
72
- function encodeBase64Url(value: string): string {
73
- return Buffer.from(value, "utf8").toString("base64url");
179
+ function aggregateResolution(
180
+ acc: ProxyResolutionTelemetryEvent,
181
+ event: ProxyResolutionTelemetryEvent,
182
+ ): ProxyResolutionTelemetryEvent {
183
+ return {
184
+ provider: event.provider,
185
+ userAgentSource: event.userAgentSource ?? acc.userAgentSource,
186
+ cacheStatus: worseStatus(acc.cacheStatus, event.cacheStatus),
187
+ cacheHit: acc.cacheHit && event.cacheHit,
188
+ resolutionMs: acc.resolutionMs + event.resolutionMs,
189
+ allocatorMs: sumOptional(acc.allocatorMs, event.allocatorMs),
190
+ allocatorStatus: event.allocatorStatus ?? acc.allocatorStatus,
191
+ allocatorBodyClass: event.allocatorBodyClass ?? acc.allocatorBodyClass,
192
+ allocatorAttempts: sumOptional(acc.allocatorAttempts, event.allocatorAttempts),
193
+ lockWaitMs: sumOptional(acc.lockWaitMs, event.lockWaitMs),
194
+ redisReadMs: sumOptional(acc.redisReadMs, event.redisReadMs),
195
+ redisWriteMs: sumOptional(acc.redisWriteMs, event.redisWriteMs),
196
+ poolAgeMs: maxOptional(acc.poolAgeMs, event.poolAgeMs),
197
+ poolExpiresInMs: maxOptional(acc.poolExpiresInMs, event.poolExpiresInMs),
198
+ attempts: acc.attempts + event.attempts,
199
+ refreshes: sumOptional(acc.refreshes, event.refreshes),
200
+ };
74
201
  }
75
202
 
76
- export class ProxyTelemetryCollector implements ProxyTelemetrySink {
203
+ export class ProxyTelemetryCollector
204
+ implements
205
+ ProxyTelemetrySink,
206
+ TelemetryContributor<ProxyTelemetryLogPayload, ProxyTelemetryHeaderPayload>
207
+ {
208
+ readonly key = "proxy" as const;
77
209
  #events: ProxyResolutionTelemetryEvent[] = [];
210
+ #resolutionCount = 0;
211
+ #aggregateResolution: ProxyResolutionTelemetryEvent | undefined;
212
+ #lastSuccessfulResolution: ProxyResolutionTelemetryEvent | undefined;
213
+ #vendors: ProxyVendorName[] = [];
78
214
  #attempts: ProxyAttemptTelemetryEvent[] = [];
215
+ #failovers: ProxyVendorFailoverTelemetryEvent[] = [];
216
+ #unresolvedVendors: ProxyVendorName[] = [];
79
217
 
80
218
  recordProxyResolution(event: ProxyResolutionTelemetryEvent): void {
81
- this.#events.push({
82
- provider: "smartproxy",
219
+ const outcome = event.outcome === "error" ? "error" : "ok";
220
+ const normalized: ProxyResolutionTelemetryEvent = {
221
+ provider: event.provider,
222
+ outcome,
223
+ ...(event.userAgentSource ? { userAgentSource: event.userAgentSource } : {}),
224
+ ...(event.protocol ? { protocol: event.protocol } : {}),
83
225
  cacheStatus: event.cacheStatus,
84
226
  cacheHit: event.cacheHit,
85
227
  resolutionMs: Math.max(0, Math.floor(event.resolutionMs)),
@@ -109,13 +251,47 @@ export class ProxyTelemetryCollector implements ProxyTelemetrySink {
109
251
  attempts: Math.max(1, Math.floor(event.attempts || 1)),
110
252
  refreshes:
111
253
  event.refreshes === undefined ? undefined : Math.max(0, Math.floor(event.refreshes)),
254
+ };
255
+ this.#resolutionCount += 1;
256
+ if (this.#events.length < MAX_RETAINED_PROXY_RESOLUTIONS) this.#events.push(normalized);
257
+ this.#aggregateResolution = this.#aggregateResolution
258
+ ? aggregateResolution(this.#aggregateResolution, normalized)
259
+ : normalized;
260
+ if (outcome === "ok") this.#lastSuccessfulResolution = normalized;
261
+ if (!this.#vendors.includes(event.provider)) this.#vendors.push(event.provider);
262
+ if (outcome === "error" && !this.#unresolvedVendors.includes(event.provider)) {
263
+ this.#unresolvedVendors.push(event.provider);
264
+ }
265
+ }
266
+
267
+ /** Number of raw resolution events retained for bounded-history verification. */
268
+ get retainedResolutionEventCount(): number {
269
+ return this.#events.length;
270
+ }
271
+
272
+ /** Total resolutions included in the incremental aggregate. */
273
+ get resolutionEventCount(): number {
274
+ return this.#resolutionCount;
275
+ }
276
+
277
+ recordProxyVendorFailover(event: ProxyVendorFailoverTelemetryEvent): void {
278
+ if (this.#failovers.length >= MAX_PROXY_FAILOVER_SAMPLES) return;
279
+ this.#failovers.push({
280
+ vendor: event.vendor,
281
+ ...(event.nextVendor ? { nextVendor: event.nextVendor } : {}),
282
+ phase: event.phase,
283
+ reason: event.reason,
284
+ ...(event.attempt === undefined ? {} : { attempt: Math.max(0, Math.floor(event.attempt)) }),
112
285
  });
286
+ if (!this.#unresolvedVendors.includes(event.vendor)) {
287
+ this.#unresolvedVendors.push(event.vendor);
288
+ }
113
289
  }
114
290
 
115
291
  recordProxyAttempt(event: ProxyAttemptTelemetryEvent): void {
116
292
  if (this.#attempts.length >= MAX_PROXY_ATTEMPT_SAMPLES) return;
117
293
  this.#attempts.push({
118
- provider: "smartproxy",
294
+ provider: event.provider,
119
295
  attempt: Math.max(1, Math.floor(event.attempt || 1)),
120
296
  ...(event.poolIndex === undefined
121
297
  ? {}
@@ -130,75 +306,154 @@ export class ProxyTelemetryCollector implements ProxyTelemetrySink {
130
306
  });
131
307
  }
132
308
 
133
- toHeaderValue(): string | undefined {
134
- const [first, ...rest] = this.#events;
135
- if (!first) return undefined;
136
-
137
- const aggregate = rest.reduce<ProxyResolutionTelemetryEvent>(
138
- (acc, event) => ({
139
- provider: "smartproxy",
140
- cacheStatus: worseStatus(acc.cacheStatus, event.cacheStatus),
141
- cacheHit: acc.cacheHit && event.cacheHit,
142
- resolutionMs: acc.resolutionMs + event.resolutionMs,
143
- allocatorMs: sumOptional(acc.allocatorMs, event.allocatorMs),
144
- allocatorStatus: event.allocatorStatus ?? acc.allocatorStatus,
145
- allocatorBodyClass: event.allocatorBodyClass ?? acc.allocatorBodyClass,
146
- allocatorAttempts: sumOptional(acc.allocatorAttempts, event.allocatorAttempts),
147
- lockWaitMs: sumOptional(acc.lockWaitMs, event.lockWaitMs),
148
- redisReadMs: sumOptional(acc.redisReadMs, event.redisReadMs),
149
- redisWriteMs: sumOptional(acc.redisWriteMs, event.redisWriteMs),
150
- poolAgeMs: maxOptional(acc.poolAgeMs, event.poolAgeMs),
151
- poolExpiresInMs: maxOptional(acc.poolExpiresInMs, event.poolExpiresInMs),
152
- attempts: acc.attempts + event.attempts,
153
- refreshes: sumOptional(acc.refreshes, event.refreshes),
154
- }),
155
- first,
156
- );
157
- const payload: ProviderTelemetryHeader = {
158
- v: 1,
159
- proxy: {
160
- provider: "smartproxy",
161
- cacheStatus: aggregate.cacheStatus,
162
- cacheHit: aggregate.cacheHit,
163
- resolutionMs: aggregate.resolutionMs,
164
- ...(aggregate.allocatorMs !== undefined ? { allocatorMs: aggregate.allocatorMs } : {}),
165
- ...(aggregate.allocatorStatus !== undefined
166
- ? { allocatorStatus: aggregate.allocatorStatus }
167
- : {}),
168
- ...(aggregate.allocatorBodyClass !== undefined
169
- ? { allocatorBodyClass: aggregate.allocatorBodyClass }
170
- : {}),
171
- ...(aggregate.allocatorAttempts !== undefined
172
- ? { allocatorAttempts: aggregate.allocatorAttempts }
173
- : {}),
174
- ...(aggregate.lockWaitMs !== undefined ? { lockWaitMs: aggregate.lockWaitMs } : {}),
175
- ...(aggregate.redisReadMs !== undefined ? { redisReadMs: aggregate.redisReadMs } : {}),
176
- ...(aggregate.redisWriteMs !== undefined ? { redisWriteMs: aggregate.redisWriteMs } : {}),
177
- ...(aggregate.poolAgeMs !== undefined ? { poolAgeMs: aggregate.poolAgeMs } : {}),
178
- ...(aggregate.poolExpiresInMs !== undefined
179
- ? { poolExpiresInMs: aggregate.poolExpiresInMs }
180
- : {}),
181
- attempts: aggregate.attempts,
182
- ...(aggregate.refreshes !== undefined ? { refreshes: aggregate.refreshes } : {}),
183
- ...(this.#attempts.length > 0
309
+ toLogPayload(): ProxyTelemetryLogPayload | undefined {
310
+ const aggregate = this.#aggregateResolution;
311
+ const attemptSamples = this.#attempts.map((attempt, index) => ({
312
+ n: index + 1,
313
+ a: attempt.attempt,
314
+ ...(attempt.poolIndex === undefined ? {} : { i: attempt.poolIndex }),
315
+ ...(attempt.proxyHash ? { h: attempt.proxyHash } : {}),
316
+ o: attempt.outcome,
317
+ ...(attempt.errorCode ? { c: attempt.errorCode } : {}),
318
+ ...(attempt.status === undefined ? {} : { s: attempt.status }),
319
+ ...(attempt.durationMs === undefined ? {} : { d: attempt.durationMs }),
320
+ }));
321
+ const failovers = this.#failovers.map((failover) => ({
322
+ v: failover.vendor,
323
+ ...(failover.nextVendor ? { nx: failover.nextVendor } : {}),
324
+ p: failover.phase,
325
+ r: failover.reason,
326
+ ...(failover.attempt === undefined ? {} : { a: failover.attempt }),
327
+ }));
328
+
329
+ if (!this.#lastSuccessfulResolution) {
330
+ if (!aggregate && failovers.length === 0) return undefined;
331
+ return {
332
+ kind: "unresolved",
333
+ vendors: [...this.#unresolvedVendors],
334
+ ...(aggregate
184
335
  ? {
185
- attemptSamples: this.#attempts.map((attempt, index) => ({
186
- n: index + 1,
187
- a: attempt.attempt,
188
- ...(attempt.poolIndex === undefined ? {} : { i: attempt.poolIndex }),
189
- ...(attempt.proxyHash ? { h: attempt.proxyHash } : {}),
190
- o: attempt.outcome,
191
- ...(attempt.errorCode ? { c: attempt.errorCode } : {}),
192
- ...(attempt.status === undefined ? {} : { s: attempt.status }),
193
- ...(attempt.durationMs === undefined ? {} : { d: attempt.durationMs }),
194
- })),
336
+ cacheStatus: aggregate.cacheStatus,
337
+ cacheHit: aggregate.cacheHit,
338
+ resolutionMs: aggregate.resolutionMs,
339
+ ...(aggregate.allocatorMs !== undefined
340
+ ? { allocatorMs: aggregate.allocatorMs }
341
+ : {}),
342
+ ...(aggregate.allocatorStatus !== undefined
343
+ ? { allocatorStatus: aggregate.allocatorStatus }
344
+ : {}),
345
+ ...(aggregate.allocatorBodyClass !== undefined
346
+ ? { allocatorBodyClass: aggregate.allocatorBodyClass }
347
+ : {}),
348
+ ...(aggregate.allocatorAttempts !== undefined
349
+ ? { allocatorAttempts: aggregate.allocatorAttempts }
350
+ : {}),
351
+ ...(aggregate.lockWaitMs !== undefined ? { lockWaitMs: aggregate.lockWaitMs } : {}),
352
+ ...(aggregate.redisReadMs !== undefined
353
+ ? { redisReadMs: aggregate.redisReadMs }
354
+ : {}),
355
+ ...(aggregate.redisWriteMs !== undefined
356
+ ? { redisWriteMs: aggregate.redisWriteMs }
357
+ : {}),
358
+ ...(aggregate.poolAgeMs !== undefined ? { poolAgeMs: aggregate.poolAgeMs } : {}),
359
+ ...(aggregate.poolExpiresInMs !== undefined
360
+ ? { poolExpiresInMs: aggregate.poolExpiresInMs }
361
+ : {}),
362
+ attempts: aggregate.attempts,
363
+ ...(aggregate.refreshes !== undefined ? { refreshes: aggregate.refreshes } : {}),
195
364
  }
196
365
  : {}),
197
- },
366
+ ...(failovers.length > 0 ? { failovers } : {}),
367
+ ...(attemptSamples.length > 0 ? { attemptSamples } : {}),
368
+ };
369
+ }
370
+
371
+ // The serving vendor/protocol is the last successful resolution.
372
+ if (!aggregate) return undefined;
373
+ const serving = this.#lastSuccessfulResolution;
374
+ return {
375
+ kind: "resolved",
376
+ provider: serving.provider,
377
+ ...(aggregate.userAgentSource ? { userAgentSource: aggregate.userAgentSource } : {}),
378
+ ...(serving.protocol ? { protocol: serving.protocol } : {}),
379
+ cacheStatus: aggregate.cacheStatus,
380
+ cacheHit: aggregate.cacheHit,
381
+ resolutionMs: aggregate.resolutionMs,
382
+ ...(aggregate.allocatorMs !== undefined ? { allocatorMs: aggregate.allocatorMs } : {}),
383
+ ...(aggregate.allocatorStatus !== undefined
384
+ ? { allocatorStatus: aggregate.allocatorStatus }
385
+ : {}),
386
+ ...(aggregate.allocatorBodyClass !== undefined
387
+ ? { allocatorBodyClass: aggregate.allocatorBodyClass }
388
+ : {}),
389
+ ...(aggregate.allocatorAttempts !== undefined
390
+ ? { allocatorAttempts: aggregate.allocatorAttempts }
391
+ : {}),
392
+ ...(aggregate.lockWaitMs !== undefined ? { lockWaitMs: aggregate.lockWaitMs } : {}),
393
+ ...(aggregate.redisReadMs !== undefined ? { redisReadMs: aggregate.redisReadMs } : {}),
394
+ ...(aggregate.redisWriteMs !== undefined ? { redisWriteMs: aggregate.redisWriteMs } : {}),
395
+ ...(aggregate.poolAgeMs !== undefined ? { poolAgeMs: aggregate.poolAgeMs } : {}),
396
+ ...(aggregate.poolExpiresInMs !== undefined
397
+ ? { poolExpiresInMs: aggregate.poolExpiresInMs }
398
+ : {}),
399
+ attempts: aggregate.attempts,
400
+ ...(aggregate.refreshes !== undefined ? { refreshes: aggregate.refreshes } : {}),
401
+ ...(attemptSamples.length > 0 ? { attemptSamples } : {}),
402
+ ...(this.#vendors.length > 1 ? { vendors: [...this.#vendors] } : {}),
403
+ ...(failovers.length > 0 ? { failovers } : {}),
198
404
  };
405
+ }
406
+
407
+ toHeaderPayload(log: ProxyTelemetryLogPayload): ProxyTelemetryHeaderPayload {
408
+ const attemptSamples = log.attemptSamples?.map((sample) => ({
409
+ n: sample.n,
410
+ a: sample.a,
411
+ ...(sample.i === undefined ? {} : { i: sample.i }),
412
+ ...(sample.h && PROXY_HEADER_HASH.test(sample.h)
413
+ ? { h: closedEnum(sample.h) as ProxyHash }
414
+ : {}),
415
+ o: closedEnum(sample.o),
416
+ ...(sample.c && PROXY_HEADER_TOKEN.test(sample.c) ? { c: closedEnum(sample.c) } : {}),
417
+ ...(sample.s === undefined ? {} : { s: sample.s }),
418
+ ...(sample.d === undefined ? {} : { d: sample.d }),
419
+ }));
420
+ const failovers = log.failovers?.map((failover) => ({
421
+ ...failover,
422
+ v: closedEnum(failover.v),
423
+ ...(failover.nx ? { nx: closedEnum(failover.nx) } : {}),
424
+ p: closedEnum(failover.p),
425
+ r: closedEnum(failover.r),
426
+ }));
427
+ if (log.kind === "resolved") {
428
+ return {
429
+ ...log,
430
+ kind: closedEnum(log.kind),
431
+ provider: closedEnum(log.provider),
432
+ ...(log.userAgentSource ? { userAgentSource: closedEnum(log.userAgentSource) } : {}),
433
+ ...(log.protocol ? { protocol: closedEnum(log.protocol) } : {}),
434
+ cacheStatus: closedEnum(log.cacheStatus),
435
+ ...(log.allocatorBodyClass
436
+ ? { allocatorBodyClass: closedEnum(log.allocatorBodyClass) }
437
+ : {}),
438
+ ...(attemptSamples ? { attemptSamples } : {}),
439
+ ...(log.vendors ? { vendors: log.vendors.map((vendor) => closedEnum(vendor)) } : {}),
440
+ ...(failovers ? { failovers } : {}),
441
+ } as ProxyTelemetryHeaderPayload;
442
+ }
443
+ return {
444
+ ...log,
445
+ kind: closedEnum(log.kind),
446
+ vendors: log.vendors.map((vendor) => closedEnum(vendor)),
447
+ ...(log.cacheStatus ? { cacheStatus: closedEnum(log.cacheStatus) } : {}),
448
+ ...(log.allocatorBodyClass ? { allocatorBodyClass: closedEnum(log.allocatorBodyClass) } : {}),
449
+ ...(failovers ? { failovers } : {}),
450
+ ...(attemptSamples ? { attemptSamples } : {}),
451
+ } as ProxyTelemetryHeaderPayload;
452
+ }
199
453
 
200
- const encoded = encodeBase64Url(JSON.stringify(payload));
201
- if (encoded.length > MAX_HEADER_BYTES) return undefined;
202
- return encoded;
454
+ toHeaderValue(): string | undefined {
455
+ const telemetry = new RequestTelemetry(createTraceContext());
456
+ telemetry.register(this);
457
+ return telemetry.toHeaderValue();
203
458
  }
204
459
  }
@@ -0,0 +1,71 @@
1
+ import { getPublicSuffix } from "tough-cookie";
2
+
3
+ /**
4
+ * Request-body header names a redirect drops when it changes the method
5
+ * (Fetch "request-body-header name").
6
+ */
7
+ const REDIRECT_BODY_HEADERS: ReadonlySet<string> = new Set([
8
+ "content-encoding",
9
+ "content-language",
10
+ "content-location",
11
+ "content-type",
12
+ ]);
13
+
14
+ /**
15
+ * Credentials a redirect never carries to another origin. Fetch removes
16
+ * `Authorization` on a cross-origin redirect; `Proxy-Authorization` is a
17
+ * credential of the same kind.
18
+ */
19
+ const CROSS_ORIGIN_CREDENTIAL_HEADERS: ReadonlySet<string> = new Set([
20
+ "authorization",
21
+ "proxy-authorization",
22
+ ]);
23
+
24
+ /** One redirect hop: the URL the headers were sent to, and the next request. */
25
+ export interface RedirectHop {
26
+ readonly from: string;
27
+ readonly to: string;
28
+ readonly methodChanged: boolean;
29
+ }
30
+
31
+ /**
32
+ * Schemeful site (HTML "same site"): scheme plus registrable domain from the
33
+ * public suffix list, or the bare host when there is none (an IP address or
34
+ * a single-label host).
35
+ */
36
+ function schemefulSite(url: URL): string {
37
+ const host = url.hostname;
38
+ const registrable = getPublicSuffix(host, { allowSpecialUseDomain: true, ignoreError: true });
39
+ return `${url.protocol}//${registrable ?? host}`;
40
+ }
41
+
42
+ /**
43
+ * The caller headers the next redirect hop carries, derived from the headers
44
+ * the previous hop sent. Both stealth redirect walkers compute every hop's
45
+ * headers here, so the rules hold on every path:
46
+ *
47
+ * - a method change drops the request-body headers;
48
+ * - a cross-origin hop drops `Authorization` and `Proxy-Authorization`;
49
+ * - a cross-site hop drops an explicit `Cookie`, after which the session
50
+ * cookie jar supplies cookies by its own domain rules, as a browser does.
51
+ *
52
+ * A header dropped on one hop stays dropped for the rest of the chain.
53
+ */
54
+ export function redirectHopHeaders<T>(
55
+ hop: RedirectHop,
56
+ headers: Readonly<Record<string, T>>,
57
+ ): Record<string, T> {
58
+ const from = new URL(hop.from);
59
+ const to = new URL(hop.to);
60
+ const crossOrigin = from.origin !== to.origin;
61
+ const crossSite = schemefulSite(from) !== schemefulSite(to);
62
+ return Object.fromEntries(
63
+ Object.entries(headers).filter(([name]) => {
64
+ const lower = name.toLowerCase();
65
+ if (hop.methodChanged && REDIRECT_BODY_HEADERS.has(lower)) return false;
66
+ if (crossOrigin && CROSS_ORIGIN_CREDENTIAL_HEADERS.has(lower)) return false;
67
+ if (crossSite && lower === "cookie") return false;
68
+ return true;
69
+ }),
70
+ );
71
+ }