@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
@@ -0,0 +1,314 @@
1
+ import { statefulSignedHeaders } from "../stateful-signing.js";
2
+ import type {
3
+ ProviderEventDeliveryFailureReason,
4
+ ProviderEventDeliveryFailureRecorder,
5
+ } from "./provider-event-delivery-failures.js";
6
+ import type {
7
+ ProviderEventPublisher,
8
+ ProviderEventPublishOptions,
9
+ PublishAck,
10
+ } from "./provider-event-pipeline.js";
11
+ import {
12
+ NOOP_PROVIDER_EVENT_METRIC_EMITTER,
13
+ providerEventMetricLabels,
14
+ type ProviderEventMetricEmitter,
15
+ } from "./provider-event-pipeline-metrics.js";
16
+ import type { ProviderEvent } from "./provider-events.js";
17
+
18
+ type FetchTransport = (url: string | URL | Request, init?: RequestInit) => Promise<Response>;
19
+
20
+ export type HttpProviderEventEmitterOptions = {
21
+ readonly baseUrl: string;
22
+ readonly secret: string;
23
+ readonly fetch?: FetchTransport;
24
+ readonly clock?: () => Date;
25
+ readonly random?: () => number;
26
+ readonly metricEmitter?: ProviderEventMetricEmitter;
27
+ readonly failureRecorder?: ProviderEventDeliveryFailureRecorder;
28
+ readonly maxBufferedEvents?: number;
29
+ readonly retryBaseMs?: number;
30
+ readonly retryMaxMs?: number;
31
+ readonly maxAttempts?: number;
32
+ readonly jitterRatio?: number;
33
+ };
34
+
35
+ type BufferedEvent = {
36
+ readonly event: ProviderEvent;
37
+ readonly rawBody: string;
38
+ readonly idempotencyKey: string;
39
+ attempts: number;
40
+ dropped: boolean;
41
+ abortController?: AbortController;
42
+ };
43
+
44
+ const DEFAULT_MAX_BUFFERED_EVENTS = 1_000;
45
+ const DEFAULT_RETRY_BASE_MS = 500;
46
+ const DEFAULT_RETRY_MAX_MS = 30_000;
47
+ const DEFAULT_MAX_ATTEMPTS = 10;
48
+ const DEFAULT_JITTER_RATIO = 0.2;
49
+
50
+ export type ProviderEventFlushReport = {
51
+ /** Events delivered during this emitter's lifetime. */
52
+ readonly delivered: number;
53
+ /** Events permanently dropped during this emitter's lifetime. */
54
+ readonly failed: number;
55
+ /** Events still buffered when flush returned. */
56
+ readonly pending: number;
57
+ };
58
+
59
+ const CONSOLE_PROVIDER_EVENT_DELIVERY_FAILURE_RECORDER = {
60
+ record(failure) {
61
+ console.error(
62
+ JSON.stringify({
63
+ event: "provider_event_delivery_failed",
64
+ eventId: failure.eventId,
65
+ reason: failure.reason,
66
+ attempts: failure.attempts,
67
+ }),
68
+ );
69
+ },
70
+ } satisfies ProviderEventDeliveryFailureRecorder;
71
+
72
+ /**
73
+ * Provider-pod HTTP publication with a bounded best-effort delivery guarantee and at-least-once
74
+ * transport retries. This is not durable at-least-once delivery: buffered events can be lost if
75
+ * the process is killed. Graceful shutdown should drain the in-memory buffer with flush().
76
+ */
77
+ export class HttpProviderEventEmitter implements ProviderEventPublisher {
78
+ readonly #baseUrl: string;
79
+ readonly #secret: string;
80
+ readonly #fetch: FetchTransport;
81
+ readonly #clock: () => Date;
82
+ readonly #random: () => number;
83
+ readonly #metricEmitter: ProviderEventMetricEmitter;
84
+ readonly #failureRecorder: ProviderEventDeliveryFailureRecorder;
85
+ readonly #maxBufferedEvents: number;
86
+ readonly #retryBaseMs: number;
87
+ readonly #retryMaxMs: number;
88
+ readonly #maxAttempts: number;
89
+ readonly #jitterRatio: number;
90
+ readonly #queue: BufferedEvent[] = [];
91
+ #drainPromise?: Promise<void>;
92
+ #deliveredCount = 0;
93
+ #failedCount = 0;
94
+
95
+ constructor(options: HttpProviderEventEmitterOptions) {
96
+ if (options.baseUrl.trim().length === 0) {
97
+ throw new Error("Provider event ingest baseUrl is required.");
98
+ }
99
+ if (options.secret.trim().length === 0) {
100
+ throw new Error("Provider event ingest secret is required.");
101
+ }
102
+ this.#baseUrl = options.baseUrl.replace(/\/+$/, "");
103
+ this.#secret = options.secret;
104
+ this.#fetch = options.fetch ?? globalThis.fetch;
105
+ this.#clock = options.clock ?? (() => new Date());
106
+ this.#random = options.random ?? Math.random;
107
+ this.#metricEmitter = options.metricEmitter ?? NOOP_PROVIDER_EVENT_METRIC_EMITTER;
108
+ this.#failureRecorder =
109
+ options.failureRecorder ?? CONSOLE_PROVIDER_EVENT_DELIVERY_FAILURE_RECORDER;
110
+ this.#maxBufferedEvents = positiveInteger(
111
+ options.maxBufferedEvents ?? DEFAULT_MAX_BUFFERED_EVENTS,
112
+ "maxBufferedEvents",
113
+ );
114
+ this.#retryBaseMs = nonnegativeFinite(
115
+ options.retryBaseMs ?? DEFAULT_RETRY_BASE_MS,
116
+ "retryBaseMs",
117
+ );
118
+ this.#retryMaxMs = nonnegativeFinite(options.retryMaxMs ?? DEFAULT_RETRY_MAX_MS, "retryMaxMs");
119
+ this.#maxAttempts = positiveInteger(options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, "maxAttempts");
120
+ this.#jitterRatio = boundedRatio(options.jitterRatio ?? DEFAULT_JITTER_RATIO, "jitterRatio");
121
+ if (this.#retryMaxMs < this.#retryBaseMs) {
122
+ throw new Error("Provider event retryMaxMs must be greater than or equal to retryBaseMs.");
123
+ }
124
+ }
125
+
126
+ publish(event: ProviderEvent, options: ProviderEventPublishOptions): PublishAck {
127
+ const accepted = this.#enqueue(event, options);
128
+ return { accepted, queued: this.#queue.length };
129
+ }
130
+
131
+ pendingCount(): number {
132
+ return this.#queue.length;
133
+ }
134
+
135
+ async flush(timeoutMs = 30_000): Promise<ProviderEventFlushReport> {
136
+ nonnegativeFinite(timeoutMs, "flush timeout");
137
+ this.#ensureDrain();
138
+ if (this.#queue.length === 0 || timeoutMs === 0) return this.#flushReport();
139
+ let timeout: ReturnType<typeof setTimeout> | undefined;
140
+ const timedOut = new Promise<void>((resolve) => {
141
+ timeout = setTimeout(resolve, timeoutMs);
142
+ });
143
+ await Promise.race([this.#drainPromise ?? Promise.resolve(), timedOut]);
144
+ if (timeout) clearTimeout(timeout);
145
+ return this.#flushReport();
146
+ }
147
+
148
+ #flushReport(): ProviderEventFlushReport {
149
+ return {
150
+ delivered: this.#deliveredCount,
151
+ failed: this.#failedCount,
152
+ pending: this.#queue.length,
153
+ };
154
+ }
155
+
156
+ #enqueue(event: ProviderEvent, options: ProviderEventPublishOptions): boolean {
157
+ let rawBody: string;
158
+ try {
159
+ rawBody = JSON.stringify({
160
+ ...event,
161
+ ownerFence: options.ownerFence,
162
+ });
163
+ } catch (error) {
164
+ this.#recordFailure(event, "attempts_exhausted", 0, error);
165
+ return false;
166
+ }
167
+ if (this.#queue.length >= this.#maxBufferedEvents) {
168
+ const oldest = this.#queue.shift();
169
+ if (oldest) {
170
+ oldest.dropped = true;
171
+ oldest.abortController?.abort();
172
+ this.#recordFailure(oldest.event, "buffer_overflow", oldest.attempts);
173
+ }
174
+ }
175
+ this.#queue.push({
176
+ event,
177
+ rawBody,
178
+ idempotencyKey: options.idempotencyKey ?? event.eventId,
179
+ attempts: 0,
180
+ dropped: false,
181
+ });
182
+ this.#ensureDrain();
183
+ return true;
184
+ }
185
+
186
+ #ensureDrain(): void {
187
+ if (this.#drainPromise || this.#queue.length === 0) return;
188
+ this.#drainPromise = Promise.resolve()
189
+ .then(() => this.#drain())
190
+ .finally(() => {
191
+ this.#drainPromise = undefined;
192
+ if (this.#queue.length > 0) this.#ensureDrain();
193
+ });
194
+ }
195
+
196
+ async #drain(): Promise<void> {
197
+ while (this.#queue.length > 0) {
198
+ const current = this.#queue[0];
199
+ if (!current) return;
200
+ current.attempts += 1;
201
+ const delivered = await this.#send(current);
202
+ if (current.dropped) continue;
203
+ if (delivered) {
204
+ if (this.#queue[0] === current) this.#queue.shift();
205
+ this.#deliveredCount += 1;
206
+ continue;
207
+ }
208
+ if (current.attempts >= this.#maxAttempts) {
209
+ if (this.#queue[0] === current) this.#queue.shift();
210
+ this.#recordFailure(current.event, "attempts_exhausted", current.attempts);
211
+ continue;
212
+ }
213
+ await delay(this.#retryDelay(current.attempts));
214
+ }
215
+ }
216
+
217
+ async #send(buffered: BufferedEvent): Promise<boolean> {
218
+ const timestamp = this.#clock().toISOString();
219
+ const path = "/v1/stateful/events";
220
+ const abortController = new AbortController();
221
+ buffered.abortController = abortController;
222
+ try {
223
+ const response = await this.#fetch(`${this.#baseUrl}${path}`, {
224
+ method: "POST",
225
+ headers: {
226
+ "content-type": "application/json",
227
+ "x-apifuse-event-id": buffered.idempotencyKey,
228
+ ...statefulSignedHeaders({
229
+ secret: this.#secret,
230
+ timestamp,
231
+ rawBody: buffered.rawBody,
232
+ method: "POST",
233
+ path,
234
+ }),
235
+ },
236
+ body: buffered.rawBody,
237
+ signal: abortController.signal,
238
+ });
239
+ return response.ok;
240
+ } catch {
241
+ return false;
242
+ } finally {
243
+ if (buffered.abortController === abortController) {
244
+ buffered.abortController = undefined;
245
+ }
246
+ }
247
+ }
248
+
249
+ #retryDelay(attempts: number): number {
250
+ const exponential = Math.min(
251
+ this.#retryMaxMs,
252
+ this.#retryBaseMs * 2 ** Math.max(0, attempts - 1),
253
+ );
254
+ const jitter = 1 + (this.#random() * 2 - 1) * this.#jitterRatio;
255
+ return Math.max(0, Math.round(exponential * jitter));
256
+ }
257
+
258
+ #recordFailure(
259
+ event: ProviderEvent,
260
+ reason: ProviderEventDeliveryFailureReason,
261
+ attempts: number,
262
+ error?: unknown,
263
+ ): void {
264
+ this.#failedCount += 1;
265
+ this.#incrementDropMetric(event);
266
+ try {
267
+ const recorded = this.#failureRecorder.record({
268
+ eventId: event.eventId,
269
+ reason,
270
+ attempts,
271
+ failedAt: this.#clock().toISOString(),
272
+ ...(error ? { error: "Provider event could not be serialized." } : {}),
273
+ });
274
+ void Promise.resolve(recorded).catch(() => {});
275
+ } catch {}
276
+ }
277
+
278
+ #incrementDropMetric(
279
+ event: ProviderEvent,
280
+ emitter: ProviderEventMetricEmitter = this.#metricEmitter,
281
+ ): void {
282
+ try {
283
+ emitter.increment(
284
+ "apifuse_stateful_provider_event_drop_total",
285
+ providerEventMetricLabels(event),
286
+ );
287
+ } catch {}
288
+ }
289
+ }
290
+
291
+ function delay(ms: number): Promise<void> {
292
+ return new Promise((resolve) => setTimeout(resolve, ms));
293
+ }
294
+
295
+ function positiveInteger(value: number, name: string): number {
296
+ if (!Number.isInteger(value) || value <= 0) {
297
+ throw new Error(`Provider event ${name} must be a positive integer.`);
298
+ }
299
+ return value;
300
+ }
301
+
302
+ function nonnegativeFinite(value: number, name: string): number {
303
+ if (!Number.isFinite(value) || value < 0) {
304
+ throw new Error(`Provider event ${name} must be a non-negative finite number.`);
305
+ }
306
+ return value;
307
+ }
308
+
309
+ function boundedRatio(value: number, name: string): number {
310
+ if (!Number.isFinite(value) || value < 0 || value > 1) {
311
+ throw new Error(`Provider event ${name} must be between 0 and 1.`);
312
+ }
313
+ return value;
314
+ }
@@ -0,0 +1,306 @@
1
+ import { z } from "zod";
2
+
3
+ import { statefulSignedHeaders } from "../stateful-signing.js";
4
+ import { StatefulControlPlaneError, type StatefulControlPlaneOperation } from "./errors.js";
5
+ import { parseSessionKey, type SessionKey } from "./session-key.js";
6
+ import type {
7
+ AcquireSessionOwnerInput,
8
+ AcquireSessionOwnerResult,
9
+ ReleaseSessionOwnerInput,
10
+ RenewSessionOwnerInput,
11
+ SessionOwnerRecord,
12
+ SessionOwnerRegistry,
13
+ } from "./stateful-provider-session-runtime.js";
14
+
15
+ type FetchTransport = (url: string | URL | Request, init?: RequestInit) => Promise<Response>;
16
+
17
+ export type SessionOwnerScope = {
18
+ readonly serviceAccountId: string;
19
+ readonly providerId: string;
20
+ readonly connectionId?: string;
21
+ };
22
+
23
+ export type HttpSessionOwnerRegistryOptions = {
24
+ readonly baseUrl: string;
25
+ readonly secret: string;
26
+ readonly scope?: SessionOwnerScope;
27
+ readonly fetch?: FetchTransport;
28
+ readonly clock?: () => Date;
29
+ readonly requestTimeoutMs?: number;
30
+ };
31
+
32
+ const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
33
+
34
+ /**
35
+ * A mutating registry request failed after it may have reached the control plane. Callers must
36
+ * resolve the session owner and reconcile instead of blindly retrying the mutation.
37
+ */
38
+ export class AmbiguousRegistryOperationError extends StatefulControlPlaneError {
39
+ readonly ambiguous = true;
40
+
41
+ constructor(input: {
42
+ readonly operation: Exclude<StatefulControlPlaneOperation, "resolve">;
43
+ readonly message: string;
44
+ readonly cause: unknown;
45
+ }) {
46
+ super({
47
+ code: "STATEFUL_CONTROL_PLANE_OPERATION_AMBIGUOUS",
48
+ message: input.message,
49
+ operation: input.operation,
50
+ cause: input.cause,
51
+ });
52
+ this.name = "AmbiguousRegistryOperationError";
53
+ }
54
+ }
55
+
56
+ const SessionKeySchema = z
57
+ .string()
58
+ .min(1)
59
+ .transform((value, context): SessionKey => {
60
+ try {
61
+ parseSessionKey(value);
62
+ return value as SessionKey;
63
+ } catch (error) {
64
+ context.addIssue({
65
+ code: "custom",
66
+ message: error instanceof Error ? error.message : "Invalid canonical session key.",
67
+ });
68
+ return z.NEVER;
69
+ }
70
+ });
71
+
72
+ const OwnerRecordSchema = z.object({
73
+ sessionKey: SessionKeySchema,
74
+ ownerPodId: z.string().min(1),
75
+ ownerEndpoint: z.string().min(1),
76
+ generation: z.number().int().positive(),
77
+ leaseExpiresAt: z.string().refine(isTimestamp),
78
+ status: z.enum(["acquiring", "connected", "draining", "expired"]),
79
+ lastUsedAt: z.string().refine(isTimestamp),
80
+ });
81
+
82
+ const AcquireResultSchema = z.object({
83
+ record: OwnerRecordSchema,
84
+ acquired: z.boolean(),
85
+ });
86
+
87
+ const ResolveResponseSchema = z.union([
88
+ OwnerRecordSchema,
89
+ z.object({ record: OwnerRecordSchema }).transform((value) => value.record),
90
+ z.object({ data: OwnerRecordSchema }).transform((value) => value.data),
91
+ ]);
92
+
93
+ const AcquireResponseSchema = z.union([
94
+ AcquireResultSchema,
95
+ z.object({ data: AcquireResultSchema }).transform((value) => value.data),
96
+ ]);
97
+
98
+ const RenewResponseSchema = z.union([
99
+ OwnerRecordSchema.nullable(),
100
+ z.object({ record: OwnerRecordSchema.nullable() }).transform((value) => value.record),
101
+ z.object({ data: OwnerRecordSchema.nullable() }).transform((value) => value.data),
102
+ ]);
103
+
104
+ const ReleaseResponseSchema = z.union([
105
+ z.boolean(),
106
+ z.object({ released: z.boolean() }).transform((value) => value.released),
107
+ z.object({ data: z.boolean() }).transform((value) => value.data),
108
+ ]);
109
+
110
+ export type HttpSessionOwnerRecord = Omit<SessionOwnerRecord, "sessionKey"> & {
111
+ readonly sessionKey: SessionKey;
112
+ };
113
+
114
+ export type HttpAcquireSessionOwnerResult = Omit<AcquireSessionOwnerResult, "record"> & {
115
+ readonly record: HttpSessionOwnerRecord;
116
+ };
117
+
118
+ export class HttpSessionOwnerRegistry implements SessionOwnerRegistry {
119
+ readonly #baseUrl: string;
120
+ readonly #secret: string;
121
+ readonly #scope?: SessionOwnerScope;
122
+ readonly #fetch: FetchTransport;
123
+ readonly #clock: () => Date;
124
+ readonly #requestTimeoutMs: number;
125
+
126
+ constructor(options: HttpSessionOwnerRegistryOptions) {
127
+ if (options.baseUrl.trim().length === 0) {
128
+ throw new Error("Stateful control-plane baseUrl is required.");
129
+ }
130
+ if (options.secret.trim().length === 0) {
131
+ throw new Error("Stateful control-plane secret is required.");
132
+ }
133
+ this.#baseUrl = options.baseUrl.replace(/\/+$/, "");
134
+ this.#secret = options.secret;
135
+ this.#scope = options.scope;
136
+ this.#fetch = options.fetch ?? globalThis.fetch;
137
+ this.#clock = options.clock ?? (() => new Date());
138
+ this.#requestTimeoutMs = positiveInteger(
139
+ options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
140
+ "requestTimeoutMs",
141
+ );
142
+ }
143
+
144
+ async resolve(
145
+ sessionKey: SessionKey,
146
+ now?: Date,
147
+ signal?: AbortSignal,
148
+ ): Promise<HttpSessionOwnerRecord | null> {
149
+ const response = await this.#post(
150
+ "resolve",
151
+ {
152
+ ...this.#scope,
153
+ sessionKey,
154
+ ...(now ? { now: now.toISOString() } : {}),
155
+ },
156
+ signal,
157
+ );
158
+ if (response.status === 404) return null;
159
+ return this.#parse(response, "resolve", ResolveResponseSchema);
160
+ }
161
+
162
+ async acquire(
163
+ input: AcquireSessionOwnerInput,
164
+ signal?: AbortSignal,
165
+ ): Promise<HttpAcquireSessionOwnerResult> {
166
+ const response = await this.#post(
167
+ "acquire",
168
+ {
169
+ ...this.#scope,
170
+ ...input,
171
+ ...(input.now ? { now: input.now.toISOString() } : {}),
172
+ },
173
+ signal,
174
+ );
175
+ return this.#parse(response, "acquire", AcquireResponseSchema);
176
+ }
177
+
178
+ async renew(
179
+ input: RenewSessionOwnerInput,
180
+ signal?: AbortSignal,
181
+ ): Promise<HttpSessionOwnerRecord | null> {
182
+ const response = await this.#post(
183
+ "renew",
184
+ {
185
+ ...this.#scope,
186
+ ...input,
187
+ ...(input.now ? { now: input.now.toISOString() } : {}),
188
+ },
189
+ signal,
190
+ );
191
+ return this.#parse(response, "renew", RenewResponseSchema);
192
+ }
193
+
194
+ async release(input: ReleaseSessionOwnerInput, signal?: AbortSignal): Promise<boolean> {
195
+ const response = await this.#post(
196
+ "release",
197
+ {
198
+ ...this.#scope,
199
+ ...input,
200
+ },
201
+ signal,
202
+ );
203
+ return this.#parse(response, "release", ReleaseResponseSchema);
204
+ }
205
+
206
+ async #post(
207
+ operation: StatefulControlPlaneOperation,
208
+ body: unknown,
209
+ callerSignal?: AbortSignal,
210
+ ): Promise<Response> {
211
+ callerSignal?.throwIfAborted();
212
+ const rawBody = JSON.stringify(body);
213
+ const timestamp = this.#clock().toISOString();
214
+ const path = `/v1/stateful/sessions/owners/${operation}`;
215
+ const timeoutSignal = AbortSignal.timeout(this.#requestTimeoutMs);
216
+ const signal = AbortSignal.any(callerSignal ? [callerSignal, timeoutSignal] : [timeoutSignal]);
217
+ try {
218
+ return await this.#fetch(`${this.#baseUrl}${path}`, {
219
+ method: "POST",
220
+ headers: {
221
+ "content-type": "application/json",
222
+ ...statefulSignedHeaders({
223
+ secret: this.#secret,
224
+ timestamp,
225
+ rawBody,
226
+ method: "POST",
227
+ path,
228
+ }),
229
+ },
230
+ body: rawBody,
231
+ signal,
232
+ });
233
+ } catch (cause) {
234
+ const timedOut = timeoutSignal.aborted && !callerSignal?.aborted;
235
+ if (operation !== "resolve") {
236
+ throw new AmbiguousRegistryOperationError({
237
+ operation,
238
+ message: timedOut
239
+ ? `Stateful control-plane ${operation} timed out after ${this.#requestTimeoutMs}ms; resolve the session owner and reconcile before retrying.`
240
+ : `Stateful control-plane ${operation} request failed after it may have committed; resolve the session owner and reconcile before retrying.`,
241
+ cause,
242
+ });
243
+ }
244
+ throw new StatefulControlPlaneError({
245
+ code: "STATEFUL_CONTROL_PLANE_REQUEST_FAILED",
246
+ message: timedOut
247
+ ? `Stateful control-plane resolve timed out after ${this.#requestTimeoutMs}ms; retry resolve or check control-plane availability.`
248
+ : "Stateful control-plane resolve request failed.",
249
+ operation,
250
+ cause,
251
+ });
252
+ }
253
+ }
254
+
255
+ async #parse<T>(
256
+ response: Response,
257
+ operation: StatefulControlPlaneOperation,
258
+ schema: z.ZodType<T>,
259
+ ): Promise<T> {
260
+ if (!response.ok) {
261
+ throw new StatefulControlPlaneError({
262
+ code: "STATEFUL_CONTROL_PLANE_HTTP_ERROR",
263
+ message: `Stateful control-plane ${operation} returned status ${response.status}.`,
264
+ operation,
265
+ status: response.status,
266
+ });
267
+ }
268
+ const rawBody = await response.text();
269
+ let body: unknown;
270
+ try {
271
+ body = JSON.parse(rawBody);
272
+ } catch (cause) {
273
+ throw invalidResponse(operation, response.status, cause);
274
+ }
275
+ const parsed = schema.safeParse(body);
276
+ if (!parsed.success) {
277
+ throw invalidResponse(operation, response.status, parsed.error);
278
+ }
279
+ return parsed.data;
280
+ }
281
+ }
282
+
283
+ function invalidResponse(
284
+ operation: StatefulControlPlaneOperation,
285
+ status: number,
286
+ cause: unknown,
287
+ ): StatefulControlPlaneError {
288
+ return new StatefulControlPlaneError({
289
+ code: "STATEFUL_CONTROL_PLANE_INVALID_RESPONSE",
290
+ message: `Stateful control-plane ${operation} returned an invalid response.`,
291
+ operation,
292
+ status,
293
+ cause,
294
+ });
295
+ }
296
+
297
+ function isTimestamp(value: string): boolean {
298
+ return Number.isFinite(Date.parse(value));
299
+ }
300
+
301
+ function positiveInteger(value: number, name: string): number {
302
+ if (!Number.isInteger(value) || value <= 0) {
303
+ throw new Error(`Stateful control-plane ${name} must be a positive integer.`);
304
+ }
305
+ return value;
306
+ }
@@ -0,0 +1,18 @@
1
+ export * from "../stateful-signing.js";
2
+ export * from "./errors.js";
3
+ export * from "./http-provider-event-emitter.js";
4
+ export * from "./http-session-owner-registry.js";
5
+ export * from "./provider-event-delivery-failures.js";
6
+ export * from "./provider-event-pipeline-metrics.js";
7
+ export * from "./provider-event-pipeline.js";
8
+ export * from "./provider-events.js";
9
+ export * from "./session-key.js";
10
+ export * from "./stateful-provider-adapter-context.js";
11
+ export * from "./stateful-provider-adapter-metrics.js";
12
+ export * from "./stateful-provider-adapter.js";
13
+ export * from "./stateful-provider-observability.js";
14
+ export * from "./stateful-provider-owner-forwarder.js";
15
+ export * from "./stateful-provider-runtime-context.js";
16
+ export * from "./stateful-provider-runtime-executor.js";
17
+ export * from "./stateful-provider-session-routing.js";
18
+ export * from "./stateful-provider-session-runtime.js";