@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,4 +1,5 @@
1
- export const PROVIDER_OBSERVABILITY_TAXONOMY_VERSION = "2026-05-26";
1
+ // Mirrors packages/provider-observability in the platform monorepo (SoT).
2
+ export const PROVIDER_OBSERVABILITY_TAXONOMY_VERSION = "2026-08-07";
2
3
 
3
4
  export const PROVIDER_ERROR_CATEGORIES = [
4
5
  "ok",
@@ -7,6 +8,7 @@ export const PROVIDER_ERROR_CATEGORIES = [
7
8
  "upstream_http",
8
9
  "upstream_rate_limited",
9
10
  "upstream_auth",
11
+ "upstream_rejected",
10
12
  "upstream_schema_drift",
11
13
  "proxy_pool",
12
14
  "anti_bot_blocked",
@@ -16,6 +18,9 @@ export const PROVIDER_ERROR_CATEGORIES = [
16
18
  "output_validation",
17
19
  "provider_error",
18
20
  "internal_error",
21
+ "dependency_unavailable",
22
+ "unsupported_transport",
23
+ "client_cancelled",
19
24
  "unclassified",
20
25
  ] as const;
21
26
 
@@ -26,6 +31,9 @@ export function categoryForStatus(status: number): ProviderErrorCategory {
26
31
  if (status === 408 || status === 504) return "timeout";
27
32
  if (status === 429) return "upstream_rate_limited";
28
33
  if (status === 401 || status === 403) return "upstream_auth";
34
+ // provider-error-contract: 409/410/422 are the deterministic
35
+ // upstream-rejection status class — not a retryable upstream failure.
36
+ if (status === 409 || status === 410 || status === 422) return "upstream_rejected";
29
37
  if (status >= 400) return "upstream_http";
30
38
  return "unclassified";
31
39
  }
@@ -39,3 +47,45 @@ export function isRetryableCategory(category: ProviderErrorCategory): boolean {
39
47
  category === "proxy_pool"
40
48
  );
41
49
  }
50
+
51
+ // Who stopped the request (honest-provider-error-contract). A deliberately
52
+ // small public projection of the internal taxonomy:
53
+ // - client: the request itself is fixable by the caller
54
+ // - upstream_rule: the upstream service refused it under its own business
55
+ // rules (deterministic) or rate limits
56
+ // - upstream_failure: the upstream service malfunctioned — retryable
57
+ // - apifuse: an APIFuse-side fault (provider bug, platform dependency)
58
+ export const PROVIDER_ERROR_SOURCES = [
59
+ "client",
60
+ "upstream_rule",
61
+ "upstream_failure",
62
+ "apifuse",
63
+ ] as const;
64
+
65
+ export type ProviderErrorSource = (typeof PROVIDER_ERROR_SOURCES)[number];
66
+
67
+ export function sourceForCategory(category: ProviderErrorCategory): ProviderErrorSource {
68
+ switch (category) {
69
+ case "input_validation":
70
+ case "credential_expired":
71
+ case "credential_unavailable":
72
+ case "client_cancelled":
73
+ return "client";
74
+ case "upstream_rejected":
75
+ case "upstream_rate_limited":
76
+ return "upstream_rule";
77
+ case "timeout":
78
+ case "network":
79
+ case "upstream_http":
80
+ case "upstream_auth":
81
+ case "upstream_schema_drift":
82
+ case "anti_bot_blocked":
83
+ return "upstream_failure";
84
+ default:
85
+ // ok never reaches error serialization; provider_error,
86
+ // internal_error, output_validation, proxy_pool,
87
+ // dependency_unavailable, unsupported_transport, unclassified are
88
+ // APIFuse-side faults.
89
+ return "apifuse";
90
+ }
91
+ }
package/src/provider.ts CHANGED
@@ -1,9 +1,3 @@
1
- export {
2
- AuthAbortError,
3
- credentialsAuthChallenge,
4
- createAuthFlowHelpers,
5
- defineCredentialsAuth,
6
- } from "./auth.js";
7
1
  export type {
8
2
  CredentialsAuthChallengeDefinition,
9
3
  CredentialsAuthChallengeRequest,
@@ -17,46 +11,201 @@ export type {
17
11
  DefineCredentialsAuthOptions,
18
12
  DefinedCredentialsAuth,
19
13
  } from "./auth.js";
20
- export { createFormCeremony } from "./ceremonies/index.js";
21
14
  export {
22
- assertFreshProviderChoiceIssuedAt,
23
- createProviderChoiceToken,
24
- ProviderChoiceTokenError,
25
- type ProviderChoiceTokenErrorReason,
26
- type ProviderChoiceTokenPayload,
27
- parseProviderChoiceToken,
28
- } from "./choice-token.js";
15
+ AuthAbortError,
16
+ createAuthFlowHelpers,
17
+ credentialsAuthChallenge,
18
+ defineCredentialsAuth,
19
+ } from "./auth.js";
20
+ export { createFormCeremony } from "./ceremonies/index.js";
21
+ export type { JsonPrimitive, JsonValue } from "./contract-json.js";
22
+ export type {
23
+ OperationDefinitionFor,
24
+ ProviderBuilder,
25
+ ProviderContextOf,
26
+ ProviderDeclaration,
27
+ ProviderDefinitionFor,
28
+ } from "./define.js";
29
29
  export {
30
30
  centered,
31
- delayed,
32
31
  defineHealthJourney,
33
32
  defineOperation,
34
33
  defineProvider,
35
34
  defineSmsOtpMatcher,
35
+ delayed,
36
36
  every,
37
37
  } from "./define.js";
38
+ export type {
39
+ ProviderCapabilityKey,
40
+ ProviderEngine,
41
+ ProviderEngineAttachmentInput,
42
+ ProviderEngineBindingCandidates,
43
+ ProviderEngineCapabilitySurface,
44
+ ProviderEngineMode,
45
+ ProviderEngineRequest,
46
+ ProviderEngineResidentSurface,
47
+ ProviderEngineSession,
48
+ ProviderEngineTransport,
49
+ } from "./engine.js";
50
+ export {
51
+ createInProcessProviderEngine,
52
+ createProviderEnvironment,
53
+ ENGINE_OWNED_PROXY_CREDENTIAL_ENV_NAMES,
54
+ ENGINE_OWNED_RESOLVER_CREDENTIAL_ENV_NAMES,
55
+ ENGINE_OWNED_RUNTIME_ENV_NAMES,
56
+ ENGINE_OWNED_TELEMETRY_ENV_NAMES,
57
+ isEngineOwnedEnvName,
58
+ isEngineOwnedProxyCredentialName,
59
+ isEngineOwnedResolverCredentialName,
60
+ isEngineOwnedRuntimeEnvName,
61
+ isEngineOwnedTelemetryEnvName,
62
+ PROVIDER_CAPABILITY_KEYS,
63
+ PROVIDER_ENGINE_MODE_ENV,
64
+ PROVIDER_ENGINE_PROTOCOL_VERSION,
65
+ readEngineProxyCredentials,
66
+ } from "./engine.js";
38
67
  export {
39
68
  AuthError,
69
+ HttpRedirectError,
40
70
  isProviderError,
41
71
  isSessionExpiredError,
42
72
  isTransportError,
73
+ ProviderEgressDeniedError,
74
+ ProviderEngineAuthenticationError,
75
+ ProviderEngineProtocolVersionError,
76
+ ProviderEngineUnavailableError,
43
77
  ProviderError,
78
+ type ProviderErrorObservability,
79
+ SDKError,
44
80
  SessionExpiredError,
45
81
  TransportError,
46
82
  ValidationError,
47
83
  } from "./errors.js";
84
+ export * from "./handle.js";
85
+ export {
86
+ APIFUSE_HANDLE_META_KEY,
87
+ HANDLE_KIND_NAME_PATTERN,
88
+ handleFieldDescription,
89
+ handleFieldNameFor,
90
+ handleHasDirectionalFieldNames,
91
+ isHandleFieldMeta,
92
+ } from "./handle-meta.js";
93
+ export type {
94
+ AssertionExpression,
95
+ AssertionPredicate,
96
+ AssertResult,
97
+ AssertStep,
98
+ AttemptReference,
99
+ BoundedJsonPath,
100
+ CandidateBlock,
101
+ CandidatePolicy,
102
+ CandidateReference,
103
+ CredentialRefDeclaration,
104
+ CredentialReference,
105
+ EstablishedConnectionReference,
106
+ ExtractResult,
107
+ ExtractStep,
108
+ FindFirst,
109
+ GuardAttribution,
110
+ GuardReasonCode,
111
+ GuardResult,
112
+ GuardStep,
113
+ HealthScenario,
114
+ HealthStep,
115
+ JournalPolicy,
116
+ JsonTemplate,
117
+ ManualTriggerPolicy,
118
+ NonEmpty,
119
+ Operand,
120
+ OperationResult,
121
+ OperationStep,
122
+ Quantifier,
123
+ Reference,
124
+ ReferenceNode,
125
+ RelativeDateNode,
126
+ RetryPolicy,
127
+ SafeRegex,
128
+ ScopedAssertionExpression,
129
+ ScopedAssertionPredicate,
130
+ ScopedItemReference,
131
+ ScopedOperand,
132
+ StepBase,
133
+ StepReference,
134
+ ValueType,
135
+ } from "./health-scenario.js";
136
+ export {
137
+ AssertionExpressionSchema,
138
+ AssertionPredicateSchema,
139
+ AssertStepSchema,
140
+ BoundedJsonPathSchema,
141
+ CandidateBlockSchema,
142
+ CandidatePolicySchema,
143
+ CredentialRefDeclarationSchema,
144
+ defineHealthScenario,
145
+ ExtractStepSchema,
146
+ FindFirstSchema,
147
+ GUARD_REASON_CODES,
148
+ GuardStepSchema,
149
+ HealthScenarioSchema,
150
+ HealthStepSchema,
151
+ JournalPolicySchema,
152
+ JsonTemplateSchema,
153
+ ManualTriggerPolicySchema,
154
+ OperandSchema,
155
+ OperationStepSchema,
156
+ QuantifierSchema,
157
+ ReferenceSchema,
158
+ RelativeDateNodeSchema,
159
+ RetryPolicySchema,
160
+ SafeRegexSchema,
161
+ ScopedAssertionExpressionSchema,
162
+ ScopedAssertionPredicateSchema,
163
+ ScopedItemReferenceSchema,
164
+ ScopedOperandSchema,
165
+ StepReferenceSchema,
166
+ ValueTypeSchema,
167
+ } from "./health-scenario.js";
48
168
  export {
49
169
  getProviderLocalePath,
170
+ type ProviderErrorMessageParams,
50
171
  providerLocaleKey,
51
172
  qualifyProviderLocaleKey,
52
173
  } from "./i18n/index.js";
53
174
  export {
54
- type CreateProviderChoiceContextOptions,
55
- createProviderChoiceContext,
56
- createTestProviderChoiceContext,
57
- PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV,
58
- } from "./runtime/choice.js";
175
+ type CreateHandleContextOptions,
176
+ type CreateTestHandleContextOptions,
177
+ createHandleContext,
178
+ createTestHandleContext,
179
+ type HandleNormalizationClass,
180
+ type NormalizedHandle,
181
+ normalizeHandle,
182
+ } from "./runtime/handle.js";
183
+ export type {
184
+ NativeGatewayProxy,
185
+ NativeGatewayProxyResolutionInput,
186
+ NativeGatewayProxySkipReason,
187
+ NativeGatewayProxySynthesisInput,
188
+ NativeGatewayProxySynthesisResult,
189
+ NativeGatewayProxySynthesizer,
190
+ NativeNetworkClientOptions,
191
+ NativeNetworkErrorCode,
192
+ VendorCredentialLookup,
193
+ VendorCredentialResolver,
194
+ } from "./runtime/native-network.js";
195
+ export {
196
+ NativeEgressGrantExpiredError,
197
+ NativeEgressNotDeclaredError,
198
+ NativeIdleTimeoutError,
199
+ NativeNetworkError,
200
+ NativeProxyExpiredError,
201
+ } from "./runtime/native-network-errors.js";
202
+ export {
203
+ createMemoryProviderRuntimeState,
204
+ createUnsupportedProviderRuntimeState,
205
+ } from "./runtime/state.js";
59
206
  export {
207
+ APIFUSE_CONTENT_PROVENANCE_META_KEY,
208
+ APIFUSE_CONTENT_TRUST_META_KEY,
60
209
  APIFUSE_DESCRIPTION_KEY_META_KEY,
61
210
  APIFUSE_REDACTION_MARKER,
62
211
  APIFUSE_SENSITIVE_KIND_META_KEY,
@@ -66,11 +215,13 @@ export {
66
215
  field,
67
216
  fields,
68
217
  isSensitiveSchema,
218
+ publicField,
69
219
  redactPayload,
70
220
  type SensitiveFieldKind,
71
221
  type SensitiveFieldOptions,
72
222
  type SensitivePath,
73
223
  sensitive,
224
+ untrustedContent,
74
225
  z,
75
226
  } from "./schema.js";
76
227
  export type {
@@ -91,31 +242,53 @@ export type {
91
242
  HealthJourneyRunContext,
92
243
  HealthJourneyRunResult,
93
244
  HealthScheduleRandomization,
245
+ HttpAttemptContext,
246
+ HttpHeadersFactory,
247
+ HttpRedirectFailureReason,
248
+ HttpRedirectPolicy,
249
+ HttpRedirectPolicyMode,
94
250
  HttpRetryOptions,
95
251
  HttpRetrySummary,
96
252
  InferSchemaOutput,
253
+ NativeContext,
254
+ NativeNetworkClient,
255
+ NativeNetworkCloseReason,
256
+ NativeNetworkConnectInput,
257
+ NativeNetworkConnection,
258
+ NativeNetworkConnectOptions,
259
+ NativeNetworkDynamicGrantOptions,
260
+ NativeNetworkEgressGrant,
261
+ NativeProviderConfig,
262
+ NativeProxyDrainHandler,
263
+ NativeProxyEgressInfo,
264
+ NativeProxyExpiringEvent,
265
+ NativeProxyExpiringReason,
266
+ NativeTcpDynamicEgressRule,
267
+ NativeTcpEgressGrant,
268
+ NativeTcpEgressRule,
269
+ NativeTcpPortRange,
270
+ NativeTcpTlsMode,
271
+ NativeTlsConnectOptions,
97
272
  OperationApprovalPolicy,
98
273
  OperationContractMetadata,
99
274
  OperationDefinition,
100
- OperationDocMeta,
101
275
  OperationErrorCode,
102
- OperationInputExample,
276
+ OperationExample,
103
277
  OperationLifecycle,
104
278
  OperationObservabilityConfig,
105
279
  OperationObservabilitySensitiveConfig,
106
280
  OperationRelationships,
107
281
  OperationRiskClass,
108
282
  OperationSensitivePath,
109
- OperationToolRouterMetadata,
110
283
  OperationTransport,
111
284
  ProviderAccessVisibility,
112
- ProviderChoiceBindingOptions,
113
- ProviderChoiceContext,
114
- ProviderChoiceIssueOptions,
115
- ProviderChoiceParseOptions,
116
285
  ProviderContext,
286
+ ProviderContextFor,
117
287
  ProviderDefinition,
118
288
  ProviderDeploymentOverrides,
289
+ ProviderErrorStatus,
290
+ ProviderFileRef,
291
+ ProviderFilesContext,
119
292
  ProviderLocale,
120
293
  ProviderLocaleKey,
121
294
  ProviderLocaleKeyInput,
@@ -123,17 +296,24 @@ export type {
123
296
  ProviderProxyPolicy,
124
297
  ProviderPublicConnectionMode,
125
298
  ProviderPublicProfile,
299
+ ProviderResolvedFile,
126
300
  ProviderRuntimeState,
301
+ ProviderRuntimeTarget,
127
302
  ProviderStateDurationString,
128
303
  ProviderStateNamespace,
304
+ ProviderStealthConfig,
129
305
  ProviderSupportLevel,
306
+ ProxiedOAuthConfig,
307
+ RedirectRunReason,
130
308
  SchemaLike,
131
309
  SmsOtpMatcherDefinition,
132
310
  StandardSchemaV1,
133
311
  StateCasResult,
134
312
  StateNamespaceOptions,
313
+ StateNamespaceScope,
135
314
  StateValue,
136
315
  StateWriteOptions,
316
+ StealthChallengeClassification,
137
317
  } from "./types.js";
138
318
  export {
139
319
  HttpRetryAfterPolicy,
@@ -5,10 +5,15 @@ import type {
5
5
  EnvContext,
6
6
  FlowContext,
7
7
  HttpClient,
8
+ OcrContext,
9
+ ProviderRuntimeState,
8
10
  StealthClient,
9
11
  SttContext,
10
12
  } from "../types.js";
13
+ import { createUnsupportedOcrClient } from "./ocr.js";
14
+ import { createUnsupportedResolverClient } from "./resolver-shared.js";
11
15
  import { createUnsupportedSttClient } from "./stt.js";
16
+ import { createTraceContext } from "./trace.js";
12
17
 
13
18
  function normalizeAllowedKeys(allowedKeys: string[]): Set<string> {
14
19
  return new Set(allowedKeys.filter((key) => key.trim().length > 0));
@@ -48,6 +53,7 @@ export function createScratchpad(
48
53
  }
49
54
 
50
55
  export function createFlowContext(options: {
56
+ flowId?: string;
51
57
  http: HttpClient;
52
58
  stealth: StealthClient;
53
59
  env: EnvContext;
@@ -55,20 +61,29 @@ export function createFlowContext(options: {
55
61
  providerId: string;
56
62
  connectionId?: string;
57
63
  externalRef?: string;
64
+ /** Host-agnostic: callers pass an already-scoped runtime state, which this helper forwards verbatim. */
65
+ state?: ProviderRuntimeState;
58
66
  allowedKeys: string[];
59
67
  initialContext?: Record<string, unknown>;
68
+ ocr?: OcrContext;
60
69
  stt?: SttContext;
70
+ trace?: FlowContext["trace"];
61
71
  }): FlowContext {
62
72
  return {
73
+ flowId: options.flowId,
63
74
  connectionId: options.connectionId,
64
75
  externalRef: options.externalRef,
65
76
  tenantId: options.tenantId,
66
77
  providerId: options.providerId,
78
+ trace: options.trace ?? createTraceContext(),
67
79
  http: options.http,
80
+ state: options.state,
68
81
  stealth: options.stealth,
69
82
  env: options.env,
70
83
  context: createScratchpad(options.allowedKeys, options.initialContext),
84
+ ocr: options.ocr ?? createUnsupportedOcrClient(),
71
85
  stt: options.stt ?? createUnsupportedSttClient(),
86
+ resolver: createUnsupportedResolverClient("Resolver is not available in auth flow context"),
72
87
  auth: createAuthFlowHelpers(),
73
88
  };
74
89
  }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Map whose entries carry an expiry and whose size is capped.
3
+ *
4
+ * Expired entries are dropped when read and swept on every insert, so a
5
+ * process that keeps minting new keys does not retain dead values. When the
6
+ * cap is still exceeded after the sweep, the least recently used entry is
7
+ * evicted and counted in `capacityEvictions` so callers can tell the two
8
+ * kinds of removal apart. Callers pass `now` explicitly so a single timestamp
9
+ * is used across a lookup-then-store sequence.
10
+ */
11
+ export class BoundedExpiringMap<K, V> {
12
+ readonly #entries = new Map<K, V>();
13
+ readonly #maxEntries: number;
14
+ readonly #expiresAt: (value: V) => number;
15
+ #capacityEvictions = 0;
16
+
17
+ constructor(maxEntries: number, expiresAt: (value: V) => number) {
18
+ if (!Number.isInteger(maxEntries) || maxEntries <= 0) {
19
+ throw new RangeError("maxEntries must be a positive integer");
20
+ }
21
+ this.#maxEntries = maxEntries;
22
+ this.#expiresAt = expiresAt;
23
+ }
24
+
25
+ get size(): number {
26
+ return this.#entries.size;
27
+ }
28
+
29
+ /** Entries removed to satisfy `maxEntries`; expiry removals are not counted. */
30
+ get capacityEvictions(): number {
31
+ return this.#capacityEvictions;
32
+ }
33
+
34
+ get(key: K, now: number): V | undefined {
35
+ if (!this.#entries.has(key)) return undefined;
36
+ const value = this.#entries.get(key) as V;
37
+ this.#entries.delete(key);
38
+ if (this.#expiresAt(value) <= now) return undefined;
39
+ // Re-insert so Map iteration order doubles as the LRU order.
40
+ this.#entries.set(key, value);
41
+ return value;
42
+ }
43
+
44
+ set(key: K, value: V, now: number): void {
45
+ for (const [existingKey, existing] of this.#entries) {
46
+ if (this.#expiresAt(existing) <= now) this.#entries.delete(existingKey);
47
+ }
48
+ this.#entries.delete(key);
49
+ if (this.#expiresAt(value) <= now) return;
50
+ this.#entries.set(key, value);
51
+ if (this.#entries.size > this.#maxEntries) {
52
+ const oldest = this.#entries.keys().next();
53
+ if (!oldest.done) {
54
+ this.#entries.delete(oldest.value);
55
+ this.#capacityEvictions += 1;
56
+ }
57
+ }
58
+ }
59
+
60
+ delete(key: K): boolean {
61
+ return this.#entries.delete(key);
62
+ }
63
+
64
+ clear(): void {
65
+ this.#entries.clear();
66
+ }
67
+ }
@@ -0,0 +1,92 @@
1
+ import type { BrowserClient } from "../types.js";
2
+ import type { BrowserTelemetrySink } from "./browser-telemetry.js";
3
+ import { observeTelemetryCallback } from "./http-telemetry-guard.js";
4
+
5
+ const methods = new Set(["newPage", "rawPage", "withIsolatedContext", "solveChallenge"]);
6
+ type State = { sink: BrowserTelemetrySink; adapter: BrowserClient };
7
+ const adapters = new WeakMap<object, State>();
8
+ let warned = false;
9
+
10
+ export function isSupportedBrowserBinding(value: unknown): value is BrowserClient {
11
+ if ((typeof value !== "object" && typeof value !== "function") || value === null) return false;
12
+ return [...methods].some((method) => {
13
+ try {
14
+ return typeof Reflect.get(value, method) === "function";
15
+ } catch {
16
+ return false;
17
+ }
18
+ });
19
+ }
20
+
21
+ export function warnUnsupportedBrowserBinding(): void {
22
+ if (warned) return;
23
+ warned = true;
24
+ try {
25
+ console.warn("[apifuse] browser telemetry not attached; reason=unsupported_binding_shape");
26
+ } catch {}
27
+ }
28
+
29
+ export function bindBrowserTelemetry(
30
+ client: BrowserClient,
31
+ sink: BrowserTelemetrySink,
32
+ ): BrowserClient {
33
+ const existing = adapters.get(client as object);
34
+ if (existing) {
35
+ existing.sink = sink;
36
+ return existing.adapter;
37
+ }
38
+ const wrappers = new Map<
39
+ PropertyKey,
40
+ { original: unknown; wrapped: (...args: unknown[]) => unknown }
41
+ >();
42
+ const adapter = new Proxy(Object.create(client) as BrowserClient, {
43
+ get(_target, property) {
44
+ const original = Reflect.get(client, property, client);
45
+ if (typeof property !== "string" || !methods.has(property) || typeof original !== "function")
46
+ return original;
47
+ const cached = wrappers.get(property);
48
+ if (cached && cached.original === original) return cached.wrapped;
49
+ const wrapped = function (this: unknown, ...args: unknown[]) {
50
+ const receiver = this === adapter ? client : this;
51
+ observeTelemetryCallback(state.sink, () => {
52
+ const declared = client.engine;
53
+ const engine =
54
+ declared === "playwright-stealth" ||
55
+ declared === "nodriver" ||
56
+ declared === "selenium-uc"
57
+ ? declared
58
+ : "host";
59
+ return state.sink.recordEngine(engine);
60
+ });
61
+ if (property === "newPage" || property === "rawPage" || property === "withIsolatedContext")
62
+ observeTelemetryCallback(state.sink, () =>
63
+ state.sink.recordPoolAcquire("not_configured"),
64
+ );
65
+ let result: unknown;
66
+ try {
67
+ result = Reflect.apply(original, receiver, args);
68
+ } catch (error) {
69
+ observeTelemetryCallback(state.sink, () => state.sink.recordError("other"));
70
+ throw error;
71
+ }
72
+ try {
73
+ if (result instanceof Promise)
74
+ void Promise.prototype.then.call(result, undefined, () => {
75
+ observeTelemetryCallback(state.sink, () => state.sink.recordError("other"));
76
+ });
77
+ } catch (error) {
78
+ observeTelemetryCallback(state.sink, () => {
79
+ throw error;
80
+ });
81
+ }
82
+ return result;
83
+ };
84
+ wrappers.set(property, { original, wrapped });
85
+ return wrapped;
86
+ },
87
+ });
88
+ const state: State = { sink, adapter };
89
+ adapters.set(client as object, state);
90
+ adapters.set(adapter as object, state);
91
+ return adapter;
92
+ }