@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.
- package/AUTHORING.md +943 -51
- package/CHANGELOG.md +273 -1
- package/LICENSE +21 -0
- package/README.md +117 -29
- package/SUBMISSION.md +3 -2
- package/bin/apifuse-check.ts +293 -13
- package/bin/apifuse-dev.ts +42 -19
- package/bin/apifuse-migrate-deployment.ts +200 -0
- package/bin/apifuse-migrate-operation-declaration.ts +55 -0
- package/bin/apifuse-migrate-shape.ts +202 -0
- package/bin/apifuse-pack-check.ts +19 -6
- package/bin/apifuse-pack-smoke.ts +57 -2
- package/bin/apifuse-pack-types.ts +736 -38
- package/bin/apifuse-perf.ts +59 -23
- package/bin/apifuse-record.ts +923 -94
- package/bin/apifuse-submit-check.ts +2313 -281
- package/bin/apifuse-test.ts +3 -1
- package/bin/submit-check-delimited-text.ts +50 -0
- package/dist/auth-turn/index.d.ts +3 -3
- package/dist/auth-turn/index.js +1 -1
- package/dist/auth.d.ts +14 -0
- package/dist/auth.js +67 -0
- package/dist/ceremonies/index.d.ts +16 -0
- package/dist/ceremonies/index.js +141 -36
- package/dist/cli/commands.d.ts +1 -1
- package/dist/cli/commands.js +30 -0
- package/dist/cli/create.d.ts +1 -1
- package/dist/cli/create.js +8 -2
- package/dist/cli/deployment-intent.d.ts +178 -0
- package/dist/cli/deployment-intent.js +277 -0
- package/dist/cli/local-connection.d.ts +111 -0
- package/dist/cli/local-connection.js +151 -0
- package/dist/cli/migrate-deployment-intent.d.ts +132 -0
- package/dist/cli/migrate-deployment-intent.js +1552 -0
- package/dist/cli/migrate-operation-declaration.d.ts +70 -0
- package/dist/cli/migrate-operation-declaration.js +2206 -0
- package/dist/cli/migrate-operation-shape.d.ts +44 -0
- package/dist/cli/migrate-operation-shape.js +113 -0
- package/dist/cli/migrate-provider-shape.d.ts +56 -0
- package/dist/cli/migrate-provider-shape.js +580 -0
- package/dist/cli/resolver-runtime.d.ts +21 -0
- package/dist/cli/resolver-runtime.js +31 -0
- package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
- package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
- package/dist/cli/templates/provider/README.md.tpl +41 -19
- package/dist/cli/templates/provider/index.ts.tpl +6 -3
- package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
- package/dist/cli/templates/provider/provider.json.tpl +6 -0
- package/dist/config/loader.d.ts +202 -16
- package/dist/config/loader.js +491 -141
- package/dist/contract-serialization.js +4 -8
- package/dist/contract-types.d.ts +12 -5
- package/dist/contract.js +24 -10
- package/dist/declaration-validation.d.ts +34 -0
- package/dist/declaration-validation.js +305 -0
- package/dist/define.d.ts +71 -29
- package/dist/define.js +807 -69
- package/dist/dev.d.ts +5 -0
- package/dist/dev.js +8 -1
- package/dist/engine.d.ts +129 -0
- package/dist/engine.js +209 -0
- package/dist/error-observability.d.ts +7 -0
- package/dist/error-observability.js +61 -0
- package/dist/error-resolution.d.ts +18 -0
- package/dist/error-resolution.js +243 -0
- package/dist/errors.d.ts +74 -0
- package/dist/errors.js +99 -0
- package/dist/fixture-sanitization.d.ts +28 -0
- package/dist/fixture-sanitization.js +371 -0
- package/dist/handle-meta.d.ts +90 -0
- package/dist/handle-meta.js +73 -0
- package/dist/handle.d.ts +226 -0
- package/dist/handle.js +345 -0
- package/dist/health-scenario.d.ts +1901 -0
- package/dist/health-scenario.js +653 -0
- package/dist/i18n/catalog.js +21 -1
- package/dist/i18n/error-messages.d.ts +86 -0
- package/dist/i18n/error-messages.js +192 -0
- package/dist/i18n/index.d.ts +1 -0
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/keys.d.ts +12 -0
- package/dist/i18n/keys.js +76 -5
- package/dist/i18n/operation-locale-namespace.d.ts +2 -0
- package/dist/i18n/operation-locale-namespace.js +7 -0
- package/dist/index.d.ts +40 -15
- package/dist/index.js +29 -11
- package/dist/lint.d.ts +43 -11
- package/dist/lint.js +2512 -177
- package/dist/native-address.d.ts +43 -0
- package/dist/native-address.js +281 -0
- package/dist/native-egress-policy.d.ts +31 -0
- package/dist/native-egress-policy.js +288 -0
- package/dist/observability.d.ts +5 -2
- package/dist/observability.js +48 -1
- package/dist/provider.d.ts +18 -8
- package/dist/provider.js +11 -6
- package/dist/runtime/auth-flow.d.ts +6 -1
- package/dist/runtime/auth-flow.js +8 -0
- package/dist/runtime/bounded-expiring-map.d.ts +21 -0
- package/dist/runtime/bounded-expiring-map.js +64 -0
- package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
- package/dist/runtime/browser-telemetry-binding.js +83 -0
- package/dist/runtime/browser-telemetry.d.ts +76 -0
- package/dist/runtime/browser-telemetry.js +165 -0
- package/dist/runtime/browser.d.ts +4 -0
- package/dist/runtime/browser.js +688 -83
- package/dist/runtime/cache-telemetry.d.ts +71 -0
- package/dist/runtime/cache-telemetry.js +177 -0
- package/dist/runtime/cache.d.ts +3 -0
- package/dist/runtime/cache.js +245 -23
- package/dist/runtime/capability-response.d.ts +3 -0
- package/dist/runtime/capability-response.js +56 -0
- package/dist/runtime/capability-telemetry.d.ts +46 -0
- package/dist/runtime/capability-telemetry.js +68 -0
- package/dist/runtime/chrome149-header-order.d.ts +58 -0
- package/dist/runtime/chrome149-header-order.js +289 -0
- package/dist/runtime/diagnostic-env-values.d.ts +5 -0
- package/dist/runtime/diagnostic-env-values.js +57 -0
- package/dist/runtime/diagnostic-env.d.ts +14 -0
- package/dist/runtime/diagnostic-env.js +44 -0
- package/dist/runtime/diagnostic-redactor.d.ts +54 -0
- package/dist/runtime/diagnostic-redactor.js +571 -0
- package/dist/runtime/egress-lease.d.ts +65 -0
- package/dist/runtime/egress-lease.js +236 -0
- package/dist/runtime/engine-mode.d.ts +74 -0
- package/dist/runtime/engine-mode.js +152 -0
- package/dist/runtime/env.js +14 -1
- package/dist/runtime/executor.d.ts +3 -2
- package/dist/runtime/executor.js +23 -26
- package/dist/runtime/handle-wordlist.d.ts +43 -0
- package/dist/runtime/handle-wordlist.js +256 -0
- package/dist/runtime/handle.d.ts +71 -0
- package/dist/runtime/handle.js +908 -0
- package/dist/runtime/http-telemetry-binding.d.ts +10 -0
- package/dist/runtime/http-telemetry-binding.js +152 -0
- package/dist/runtime/http-telemetry-guard.d.ts +16 -0
- package/dist/runtime/http-telemetry-guard.js +202 -0
- package/dist/runtime/http-telemetry.d.ts +104 -0
- package/dist/runtime/http-telemetry.js +190 -0
- package/dist/runtime/http.d.ts +34 -0
- package/dist/runtime/http.js +680 -121
- package/dist/runtime/insights.js +2 -2
- package/dist/runtime/instrumentation.d.ts +2 -2
- package/dist/runtime/instrumentation.js +462 -19
- package/dist/runtime/native-network-errors.d.ts +33 -0
- package/dist/runtime/native-network-errors.js +69 -0
- package/dist/runtime/native-network.d.ts +105 -0
- package/dist/runtime/native-network.js +1433 -0
- package/dist/runtime/native-telemetry.d.ts +142 -0
- package/dist/runtime/native-telemetry.js +231 -0
- package/dist/runtime/ocr-telemetry.d.ts +82 -0
- package/dist/runtime/ocr-telemetry.js +192 -0
- package/dist/runtime/ocr.d.ts +29 -0
- package/dist/runtime/ocr.js +468 -0
- package/dist/runtime/otlp.d.ts +71 -2
- package/dist/runtime/otlp.js +398 -16
- package/dist/runtime/provider.d.ts +7 -0
- package/dist/runtime/provider.js +14 -0
- package/dist/runtime/proxy-errors.js +6 -2
- package/dist/runtime/proxy-nodemaven.d.ts +56 -0
- package/dist/runtime/proxy-nodemaven.js +147 -0
- package/dist/runtime/proxy-retry-policy.d.ts +4 -1
- package/dist/runtime/proxy-retry-policy.js +11 -2
- package/dist/runtime/proxy-telemetry.d.ts +133 -3
- package/dist/runtime/proxy-telemetry.js +218 -70
- package/dist/runtime/redirect-hop-headers.d.ts +19 -0
- package/dist/runtime/redirect-hop-headers.js +58 -0
- package/dist/runtime/redirects.d.ts +61 -0
- package/dist/runtime/redirects.js +149 -0
- package/dist/runtime/redis.d.ts +1 -1
- package/dist/runtime/redis.js +4 -2
- package/dist/runtime/request-options.d.ts +75 -1
- package/dist/runtime/request-options.js +588 -0
- package/dist/runtime/request-telemetry.d.ts +70 -0
- package/dist/runtime/request-telemetry.js +229 -0
- package/dist/runtime/resolver-config.d.ts +13 -0
- package/dist/runtime/resolver-config.js +14 -0
- package/dist/runtime/resolver-public.d.ts +3 -0
- package/dist/runtime/resolver-public.js +1 -0
- package/dist/runtime/resolver-runtime-options.d.ts +14 -0
- package/dist/runtime/resolver-runtime-options.js +33 -0
- package/dist/runtime/resolver-shared.d.ts +24 -0
- package/dist/runtime/resolver-shared.js +69 -0
- package/dist/runtime/resolver-span-attributes.d.ts +34 -0
- package/dist/runtime/resolver-span-attributes.js +93 -0
- package/dist/runtime/resolver-telemetry.d.ts +135 -0
- package/dist/runtime/resolver-telemetry.js +204 -0
- package/dist/runtime/resolver-usage.d.ts +32 -0
- package/dist/runtime/resolver-usage.js +54 -0
- package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
- package/dist/runtime/resolver-vendors/bindings.js +45 -0
- package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
- package/dist/runtime/resolver-vendors/browser.js +423 -0
- package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
- package/dist/runtime/resolver-vendors/capsolver.js +544 -0
- package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
- package/dist/runtime/resolver-vendors/hosts.js +68 -0
- package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
- package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
- package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
- package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
- package/dist/runtime/resolver-vendors/types.d.ts +125 -0
- package/dist/runtime/resolver-vendors/types.js +106 -0
- package/dist/runtime/resolver.d.ts +79 -0
- package/dist/runtime/resolver.js +1094 -0
- package/dist/runtime/state-telemetry.d.ts +79 -0
- package/dist/runtime/state-telemetry.js +194 -0
- package/dist/runtime/state.d.ts +10 -1
- package/dist/runtime/state.js +322 -82
- package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
- package/dist/runtime/stealth-akamai-sbsd.js +142 -0
- package/dist/runtime/stealth-cookies.d.ts +24 -0
- package/dist/runtime/stealth-cookies.js +131 -0
- package/dist/runtime/stealth-owned-headers.d.ts +39 -0
- package/dist/runtime/stealth-owned-headers.js +57 -0
- package/dist/runtime/stealth-telemetry.d.ts +92 -0
- package/dist/runtime/stealth-telemetry.js +179 -0
- package/dist/runtime/stealth.d.ts +45 -6
- package/dist/runtime/stealth.js +1775 -320
- package/dist/runtime/stt-telemetry.d.ts +77 -0
- package/dist/runtime/stt-telemetry.js +176 -0
- package/dist/runtime/stt.js +18 -19
- package/dist/runtime/timeout.d.ts +5 -0
- package/dist/runtime/timeout.js +12 -0
- package/dist/runtime/trace-config.d.ts +12 -0
- package/dist/runtime/trace-config.js +62 -0
- package/dist/runtime/trace.d.ts +17 -0
- package/dist/runtime/trace.js +176 -25
- package/dist/runtime-boundary-lint.d.ts +137 -0
- package/dist/runtime-boundary-lint.js +590 -0
- package/dist/schema.d.ts +20 -0
- package/dist/schema.js +72 -2
- package/dist/serve.d.ts +1 -1
- package/dist/serve.js +1 -1
- package/dist/server/error-observability.d.ts +1 -0
- package/dist/server/error-observability.js +1 -0
- package/dist/server/error-stack-frames.d.ts +35 -0
- package/dist/server/error-stack-frames.js +219 -0
- package/dist/server/index.d.ts +21 -2
- package/dist/server/index.js +11 -2
- package/dist/server/runtime-diagnostics.d.ts +165 -0
- package/dist/server/runtime-diagnostics.js +360 -0
- package/dist/server/sdk-version.d.ts +3 -0
- package/dist/server/sdk-version.js +19 -0
- package/dist/server/self-test-input-tokens.d.ts +2 -1
- package/dist/server/self-test-input-tokens.js +18 -14
- package/dist/server/self-test-redaction.js +8 -33
- package/dist/server/self-test.d.ts +18 -3
- package/dist/server/self-test.js +139 -76
- package/dist/server/sensitive-values.d.ts +26 -0
- package/dist/server/sensitive-values.js +137 -0
- package/dist/server/serve-implementation.d.ts +285 -0
- package/dist/server/serve-implementation.js +3172 -0
- package/dist/server/serve.d.ts +1 -75
- package/dist/server/serve.js +1 -1170
- package/dist/server/state-backend-report.d.ts +70 -0
- package/dist/server/state-backend-report.js +113 -0
- package/dist/server/trace-output.d.ts +7 -0
- package/dist/server/trace-output.js +111 -0
- package/dist/server/types.d.ts +37 -5
- package/dist/server/types.js +34 -1
- package/dist/stateful/errors.d.ts +19 -0
- package/dist/stateful/errors.js +24 -0
- package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
- package/dist/stateful/http-provider-event-emitter.js +237 -0
- package/dist/stateful/http-session-owner-registry.d.ts +44 -0
- package/dist/stateful/http-session-owner-registry.js +210 -0
- package/dist/stateful/index.d.ts +18 -0
- package/dist/stateful/index.js +18 -0
- package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
- package/dist/stateful/provider-event-delivery-failures.js +43 -0
- package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
- package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
- package/dist/stateful/provider-event-pipeline.d.ts +50 -0
- package/dist/stateful/provider-event-pipeline.js +1 -0
- package/dist/stateful/provider-events.d.ts +101 -0
- package/dist/stateful/provider-events.js +289 -0
- package/dist/stateful/session-key.d.ts +15 -0
- package/dist/stateful/session-key.js +86 -0
- package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
- package/dist/stateful/stateful-provider-adapter-context.js +42 -0
- package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
- package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
- package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
- package/dist/stateful/stateful-provider-adapter.js +287 -0
- package/dist/stateful/stateful-provider-observability.d.ts +62 -0
- package/dist/stateful/stateful-provider-observability.js +161 -0
- package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
- package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
- package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
- package/dist/stateful/stateful-provider-runtime-context.js +61 -0
- package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
- package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
- package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
- package/dist/stateful/stateful-provider-session-routing.js +345 -0
- package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
- package/dist/stateful/stateful-provider-session-runtime.js +245 -0
- package/dist/stateful-signing.d.ts +18 -0
- package/dist/stateful-signing.js +27 -0
- package/dist/stealth/profiles.d.ts +15 -4
- package/dist/stealth/profiles.js +169 -211
- package/dist/stream-evidence.d.ts +74 -0
- package/dist/stream-evidence.js +785 -0
- package/dist/stream.js +7 -1
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/run.d.ts +32 -2
- package/dist/testing/run.js +509 -25
- package/dist/trace-sanitization.d.ts +6 -0
- package/dist/trace-sanitization.js +68 -0
- package/dist/types.d.ts +899 -210
- package/dist/types.js +1 -0
- package/dist/typescript-module.d.ts +39 -0
- package/dist/typescript-module.js +72 -0
- package/package.json +52 -6
- package/src/auth-turn/index.ts +1 -1
- package/src/auth.ts +118 -0
- package/src/ceremonies/index.ts +189 -46
- package/src/cli/commands.ts +37 -0
- package/src/cli/create.ts +8 -2
- package/src/cli/deployment-intent.ts +364 -0
- package/src/cli/local-connection.ts +221 -0
- package/src/cli/migrate-deployment-intent.ts +1908 -0
- package/src/cli/migrate-operation-declaration.ts +3026 -0
- package/src/cli/migrate-operation-shape.ts +184 -0
- package/src/cli/migrate-provider-shape.ts +778 -0
- package/src/cli/resolver-runtime.ts +72 -0
- package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
- package/src/cli/templates/provider/Dockerfile.tpl +1 -1
- package/src/cli/templates/provider/README.md.tpl +41 -19
- package/src/cli/templates/provider/index.ts.tpl +6 -3
- package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
- package/src/cli/templates/provider/provider.json.tpl +6 -0
- package/src/config/loader.ts +774 -181
- package/src/contract-serialization.ts +5 -7
- package/src/contract-types.ts +12 -5
- package/src/contract.ts +24 -10
- package/src/declaration-validation.ts +376 -0
- package/src/define.ts +1105 -131
- package/src/dev.ts +13 -1
- package/src/engine.ts +390 -0
- package/src/error-observability.ts +64 -0
- package/src/error-resolution.ts +269 -0
- package/src/errors.ts +157 -0
- package/src/fixture-sanitization.ts +422 -0
- package/src/handle-meta.ts +143 -0
- package/src/handle.ts +694 -0
- package/src/health-scenario.ts +960 -0
- package/src/i18n/catalog.ts +23 -1
- package/src/i18n/error-messages.ts +255 -0
- package/src/i18n/index.ts +1 -0
- package/src/i18n/keys.ts +80 -6
- package/src/i18n/operation-locale-namespace.ts +10 -0
- package/src/index.ts +390 -23
- package/src/lint.ts +2975 -234
- package/src/native-address.ts +340 -0
- package/src/native-egress-policy.ts +358 -0
- package/src/observability.ts +51 -1
- package/src/provider.ts +207 -27
- package/src/runtime/auth-flow.ts +15 -0
- package/src/runtime/bounded-expiring-map.ts +67 -0
- package/src/runtime/browser-telemetry-binding.ts +92 -0
- package/src/runtime/browser-telemetry.ts +289 -0
- package/src/runtime/browser.ts +882 -99
- package/src/runtime/cache-telemetry.ts +247 -0
- package/src/runtime/cache.ts +258 -22
- package/src/runtime/capability-response.ts +53 -0
- package/src/runtime/capability-telemetry.ts +101 -0
- package/src/runtime/chrome149-header-order.ts +330 -0
- package/src/runtime/diagnostic-env-values.ts +56 -0
- package/src/runtime/diagnostic-env.ts +65 -0
- package/src/runtime/diagnostic-redactor.ts +668 -0
- package/src/runtime/egress-lease.ts +341 -0
- package/src/runtime/engine-mode.ts +233 -0
- package/src/runtime/env.ts +15 -1
- package/src/runtime/executor.ts +39 -32
- package/src/runtime/handle-wordlist.ts +266 -0
- package/src/runtime/handle.ts +1180 -0
- package/src/runtime/http-telemetry-binding.ts +162 -0
- package/src/runtime/http-telemetry-guard.ts +208 -0
- package/src/runtime/http-telemetry.ts +292 -0
- package/src/runtime/http.ts +896 -150
- package/src/runtime/insights.ts +2 -2
- package/src/runtime/instrumentation.ts +628 -28
- package/src/runtime/native-network-errors.ts +99 -0
- package/src/runtime/native-network.ts +1853 -0
- package/src/runtime/native-telemetry.ts +366 -0
- package/src/runtime/ocr-telemetry.ts +308 -0
- package/src/runtime/ocr.ts +564 -0
- package/src/runtime/otlp.ts +468 -21
- package/src/runtime/provider.ts +15 -0
- package/src/runtime/proxy-errors.ts +12 -4
- package/src/runtime/proxy-nodemaven.ts +222 -0
- package/src/runtime/proxy-retry-policy.ts +12 -1
- package/src/runtime/proxy-telemetry.ts +358 -103
- package/src/runtime/redirect-hop-headers.ts +71 -0
- package/src/runtime/redirects.ts +215 -0
- package/src/runtime/redis.ts +7 -2
- package/src/runtime/request-options.ts +728 -1
- package/src/runtime/request-telemetry.ts +375 -0
- package/src/runtime/resolver-config.ts +18 -0
- package/src/runtime/resolver-public.ts +44 -0
- package/src/runtime/resolver-runtime-options.ts +50 -0
- package/src/runtime/resolver-shared.ts +113 -0
- package/src/runtime/resolver-span-attributes.ts +139 -0
- package/src/runtime/resolver-telemetry.ts +362 -0
- package/src/runtime/resolver-usage.ts +99 -0
- package/src/runtime/resolver-vendors/bindings.ts +61 -0
- package/src/runtime/resolver-vendors/browser.ts +591 -0
- package/src/runtime/resolver-vendors/capsolver.ts +727 -0
- package/src/runtime/resolver-vendors/hosts.ts +81 -0
- package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
- package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
- package/src/runtime/resolver-vendors/types.ts +261 -0
- package/src/runtime/resolver.ts +1543 -0
- package/src/runtime/state-telemetry.ts +298 -0
- package/src/runtime/state.ts +435 -89
- package/src/runtime/stealth-akamai-sbsd.ts +207 -0
- package/src/runtime/stealth-cookies.ts +155 -0
- package/src/runtime/stealth-owned-headers.ts +67 -0
- package/src/runtime/stealth-telemetry.ts +309 -0
- package/src/runtime/stealth.ts +2275 -372
- package/src/runtime/stt-telemetry.ts +282 -0
- package/src/runtime/stt.ts +96 -91
- package/src/runtime/timeout.ts +18 -0
- package/src/runtime/trace-config.ts +78 -0
- package/src/runtime/trace.ts +257 -35
- package/src/runtime-boundary-lint.ts +707 -0
- package/src/schema.ts +80 -2
- package/src/serve.ts +6 -1
- package/src/server/error-observability.ts +1 -0
- package/src/server/error-stack-frames.ts +214 -0
- package/src/server/index.ts +184 -2
- package/src/server/runtime-diagnostics.ts +522 -0
- package/src/server/sdk-version.ts +22 -0
- package/src/server/self-test-input-tokens.ts +29 -14
- package/src/server/self-test-redaction.ts +10 -40
- package/src/server/self-test.ts +205 -89
- package/src/server/sensitive-values.ts +211 -0
- package/src/server/serve-implementation.ts +4596 -0
- package/src/server/serve.ts +1 -1685
- package/src/server/state-backend-report.ts +185 -0
- package/src/server/trace-output.ts +189 -0
- package/src/server/types.ts +34 -1
- package/src/stateful/README.md +146 -0
- package/src/stateful/errors.ts +35 -0
- package/src/stateful/http-provider-event-emitter.ts +314 -0
- package/src/stateful/http-session-owner-registry.ts +306 -0
- package/src/stateful/index.ts +18 -0
- package/src/stateful/provider-event-delivery-failures.ts +80 -0
- package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
- package/src/stateful/provider-event-pipeline.ts +61 -0
- package/src/stateful/provider-events.ts +462 -0
- package/src/stateful/session-key.ts +111 -0
- package/src/stateful/stateful-provider-adapter-context.ts +59 -0
- package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
- package/src/stateful/stateful-provider-adapter.ts +562 -0
- package/src/stateful/stateful-provider-observability.ts +261 -0
- package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
- package/src/stateful/stateful-provider-runtime-context.ts +96 -0
- package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
- package/src/stateful/stateful-provider-session-routing.ts +546 -0
- package/src/stateful/stateful-provider-session-runtime.ts +403 -0
- package/src/stateful-signing.ts +46 -0
- package/src/stealth/profiles.ts +212 -231
- package/src/stream-evidence.ts +988 -0
- package/src/stream.ts +8 -1
- package/src/testing/index.ts +10 -1
- package/src/testing/run.ts +685 -19
- package/src/trace-sanitization.ts +110 -0
- package/src/types.ts +1014 -273
- package/src/typescript-module.ts +100 -0
- package/dist/choice-token.d.ts +0 -24
- package/dist/choice-token.js +0 -74
- package/dist/runtime/choice.d.ts +0 -15
- package/dist/runtime/choice.js +0 -413
- package/src/choice-token.ts +0 -165
- package/src/runtime/choice.ts +0 -686
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { PROVIDER_OBSERVABILITY_TAXONOMY_VERSION } from "../observability.js";
|
|
2
|
+
import type { ProxyTelemetrySink } from "../config/loader.js";
|
|
3
|
+
import type { ProxyTelemetryLogPayload } from "./proxy-telemetry.js";
|
|
4
|
+
import type { ResolverTelemetryLogPayload } from "./resolver-telemetry.js";
|
|
5
|
+
import type { Span, TraceContext } from "./trace.js";
|
|
6
|
+
|
|
7
|
+
export const PROVIDER_TELEMETRY_HEADER = "X-ApiFuse-Provider-Telemetry";
|
|
8
|
+
|
|
9
|
+
export type TelemetryKey =
|
|
10
|
+
| "proxy"
|
|
11
|
+
| "resolver"
|
|
12
|
+
| "http"
|
|
13
|
+
| "stealth"
|
|
14
|
+
| "native"
|
|
15
|
+
| "browser"
|
|
16
|
+
| "ocr"
|
|
17
|
+
| "stt"
|
|
18
|
+
| "cache"
|
|
19
|
+
| "state"
|
|
20
|
+
| "events";
|
|
21
|
+
|
|
22
|
+
declare const CLOSED_ENUM: unique symbol;
|
|
23
|
+
|
|
24
|
+
/** A string from an SDK-declared, closed observability taxonomy. */
|
|
25
|
+
export type ClosedEnum<T extends string> = T & { readonly [CLOSED_ENUM]: true };
|
|
26
|
+
|
|
27
|
+
/** Brands a value from an SDK-declared closed string union without changing it. */
|
|
28
|
+
export function closedEnum<T extends string>(value: T): ClosedEnum<T> {
|
|
29
|
+
return value as ClosedEnum<T>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Explicit exemption for the existing implementation-shaped cache key list. */
|
|
33
|
+
export type TenantOpaqueKeys = string[] & { readonly __tenantOpaqueCacheKeys: true };
|
|
34
|
+
|
|
35
|
+
/** Names the deliberate tenant cache-key exemption without changing its wire value. */
|
|
36
|
+
export function tenantOpaqueKeys(value: string[]): TenantOpaqueKeys {
|
|
37
|
+
return value as TenantOpaqueKeys;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Compile-time projection for the gateway ingestion contract. Plain strings,
|
|
42
|
+
* URLs, hostnames, free text, unknown values, and escape-hatch properties reduce to `never`.
|
|
43
|
+
*/
|
|
44
|
+
export type GatewayIngestible<T> = 0 extends 1 & T
|
|
45
|
+
? never
|
|
46
|
+
: T extends object
|
|
47
|
+
? keyof T extends never
|
|
48
|
+
? never
|
|
49
|
+
: {
|
|
50
|
+
[K in keyof T]: 0 extends 1 & T[K]
|
|
51
|
+
? never
|
|
52
|
+
: unknown extends T[K]
|
|
53
|
+
? never
|
|
54
|
+
: [NonNullable<T[K]>] extends [number | boolean | ClosedEnum<string>]
|
|
55
|
+
? T[K]
|
|
56
|
+
: [NonNullable<T[K]>] extends [readonly (infer U)[]]
|
|
57
|
+
? 0 extends 1 & U
|
|
58
|
+
? never
|
|
59
|
+
: unknown extends U
|
|
60
|
+
? never
|
|
61
|
+
: [U] extends [number | boolean | ClosedEnum<string> | GatewayIngestible<U>]
|
|
62
|
+
? T[K]
|
|
63
|
+
: never
|
|
64
|
+
: [NonNullable<T[K]>] extends [object]
|
|
65
|
+
? [NonNullable<T[K]>] extends [GatewayIngestible<NonNullable<T[K]>>]
|
|
66
|
+
? T[K]
|
|
67
|
+
: never
|
|
68
|
+
: never;
|
|
69
|
+
}
|
|
70
|
+
: never;
|
|
71
|
+
|
|
72
|
+
/** Compile-time projection for tenant-visible, identity-neutral metadata. */
|
|
73
|
+
export type TenantNeutral<T> = 0 extends 1 & T
|
|
74
|
+
? never
|
|
75
|
+
: T extends object
|
|
76
|
+
? {
|
|
77
|
+
[K in keyof T]: K extends
|
|
78
|
+
| `vendor${string}`
|
|
79
|
+
| "provider"
|
|
80
|
+
| "engine"
|
|
81
|
+
| "model"
|
|
82
|
+
| `${string}Host`
|
|
83
|
+
? never
|
|
84
|
+
: 0 extends 1 & T[K]
|
|
85
|
+
? never
|
|
86
|
+
: unknown extends T[K]
|
|
87
|
+
? never
|
|
88
|
+
: [NonNullable<T[K]>] extends [string[] & { readonly __tenantOpaqueCacheKeys: true }]
|
|
89
|
+
? K extends "keys"
|
|
90
|
+
? T[K]
|
|
91
|
+
: never
|
|
92
|
+
: [NonNullable<T[K]>] extends [number | boolean | ClosedEnum<string>]
|
|
93
|
+
? T[K]
|
|
94
|
+
: [NonNullable<T[K]>] extends [object]
|
|
95
|
+
? [NonNullable<T[K]>] extends [TenantNeutral<NonNullable<T[K]>>]
|
|
96
|
+
? T[K]
|
|
97
|
+
: never
|
|
98
|
+
: never;
|
|
99
|
+
}
|
|
100
|
+
: never;
|
|
101
|
+
|
|
102
|
+
export interface SpanIndex {
|
|
103
|
+
readonly spans: readonly Span[];
|
|
104
|
+
readonly byName: ReadonlyMap<string, readonly Span[]>;
|
|
105
|
+
count(name: string): number;
|
|
106
|
+
durationMs(name: string): number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface TelemetryContributor<Log extends object, Header extends object> {
|
|
110
|
+
readonly key: TelemetryKey;
|
|
111
|
+
toLogPayload(spans: SpanIndex): Log | undefined;
|
|
112
|
+
toHeaderPayload(
|
|
113
|
+
log: Log,
|
|
114
|
+
): 0 extends 1 & Header
|
|
115
|
+
? never
|
|
116
|
+
: [Header] extends [GatewayIngestible<Header>]
|
|
117
|
+
? Header | undefined
|
|
118
|
+
: never;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export type RequestTelemetryLogPayload = {
|
|
122
|
+
proxy?: ProxyTelemetryLogPayload;
|
|
123
|
+
resolver?: ResolverTelemetryLogPayload;
|
|
124
|
+
} & Partial<Record<Exclude<TelemetryKey, "proxy" | "resolver">, object>>;
|
|
125
|
+
|
|
126
|
+
type RegisteredTelemetryContributor = {
|
|
127
|
+
readonly key: TelemetryKey;
|
|
128
|
+
toLogPayload(spans: SpanIndex): object | undefined;
|
|
129
|
+
toHeaderPayload(log: object): object | undefined;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
type ProviderTelemetryEnvelope = {
|
|
133
|
+
v: 1;
|
|
134
|
+
taxonomy: typeof PROVIDER_OBSERVABILITY_TAXONOMY_VERSION;
|
|
135
|
+
truncated?: true;
|
|
136
|
+
} & Partial<Record<Exclude<TelemetryKey, "events">, object>>;
|
|
137
|
+
|
|
138
|
+
const MAX_HEADER_BYTES = 4_096;
|
|
139
|
+
const MAX_INGESTIBLE_ARRAY_LENGTH = 64;
|
|
140
|
+
const MAX_INGESTIBLE_OBJECT_KEYS = 32;
|
|
141
|
+
const MAX_INGESTIBLE_DEPTH = 4;
|
|
142
|
+
const INGESTIBLE_TOKEN = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/;
|
|
143
|
+
/** @internal */
|
|
144
|
+
export const HEADER_PRIORITY = [
|
|
145
|
+
"proxy",
|
|
146
|
+
"resolver",
|
|
147
|
+
"native",
|
|
148
|
+
"http",
|
|
149
|
+
"stealth",
|
|
150
|
+
"browser",
|
|
151
|
+
"ocr",
|
|
152
|
+
"stt",
|
|
153
|
+
"cache",
|
|
154
|
+
"state",
|
|
155
|
+
] as const satisfies readonly Exclude<TelemetryKey, "events">[];
|
|
156
|
+
const warnedInvalidKeys = new Set<TelemetryKey>();
|
|
157
|
+
|
|
158
|
+
function createSpanIndex(trace: TraceContext): SpanIndex {
|
|
159
|
+
const spans = trace.getSpans().slice();
|
|
160
|
+
const mutableByName = new Map<string, Span[]>();
|
|
161
|
+
for (const span of spans) {
|
|
162
|
+
const named = mutableByName.get(span.name);
|
|
163
|
+
if (named) named.push(span);
|
|
164
|
+
else mutableByName.set(span.name, [span]);
|
|
165
|
+
}
|
|
166
|
+
const byName = new Map<string, readonly Span[]>(mutableByName);
|
|
167
|
+
return {
|
|
168
|
+
spans,
|
|
169
|
+
byName,
|
|
170
|
+
count(name): number {
|
|
171
|
+
return byName.get(name)?.length ?? 0;
|
|
172
|
+
},
|
|
173
|
+
durationMs(name): number {
|
|
174
|
+
return (byName.get(name) ?? []).reduce((total, span) => total + span.duration_ms, 0);
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
180
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
181
|
+
const prototype = Object.getPrototypeOf(value);
|
|
182
|
+
return prototype === Object.prototype || prototype === null;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Bounded structural defence in depth against casts and accidental free text.
|
|
187
|
+
* Closed-enum brands are erased at runtime; the type-level guard is the contract,
|
|
188
|
+
* while this check only enforces safe token shapes and collection bounds.
|
|
189
|
+
*/
|
|
190
|
+
export function isGatewayIngestible(value: unknown): boolean {
|
|
191
|
+
const ancestors = new Set<object>();
|
|
192
|
+
const visit = (candidate: unknown, depth: number): boolean => {
|
|
193
|
+
if (typeof candidate === "number") return Number.isFinite(candidate);
|
|
194
|
+
if (typeof candidate === "boolean") return true;
|
|
195
|
+
if (typeof candidate === "string") return INGESTIBLE_TOKEN.test(candidate);
|
|
196
|
+
if (candidate === null || typeof candidate !== "object") return false;
|
|
197
|
+
if (depth >= MAX_INGESTIBLE_DEPTH || ancestors.has(candidate)) return false;
|
|
198
|
+
|
|
199
|
+
if (Array.isArray(candidate)) {
|
|
200
|
+
if (candidate.length > MAX_INGESTIBLE_ARRAY_LENGTH) return false;
|
|
201
|
+
ancestors.add(candidate);
|
|
202
|
+
const valid = candidate.every(
|
|
203
|
+
(item, index) => Object.hasOwn(candidate, index) && visit(item, depth + 1),
|
|
204
|
+
);
|
|
205
|
+
ancestors.delete(candidate);
|
|
206
|
+
return valid;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (!isPlainRecord(candidate)) return false;
|
|
210
|
+
const keys = Object.keys(candidate);
|
|
211
|
+
if (keys.length > MAX_INGESTIBLE_OBJECT_KEYS) return false;
|
|
212
|
+
ancestors.add(candidate);
|
|
213
|
+
const valid = keys.every((key) => visit(candidate[key], depth + 1));
|
|
214
|
+
ancestors.delete(candidate);
|
|
215
|
+
return valid;
|
|
216
|
+
};
|
|
217
|
+
try {
|
|
218
|
+
return visit(value, 0);
|
|
219
|
+
} catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function encodeEnvelope(envelope: ProviderTelemetryEnvelope): string {
|
|
225
|
+
return Buffer.from(JSON.stringify(envelope), "utf8").toString("base64url");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function warnInvalidSibling(key: TelemetryKey): void {
|
|
229
|
+
if (warnedInvalidKeys.has(key)) return;
|
|
230
|
+
warnedInvalidKeys.add(key);
|
|
231
|
+
try {
|
|
232
|
+
console.warn(
|
|
233
|
+
`[provider-sdk] Dropped invalid telemetry sibling "${key}"; contributors must return serializable log objects and bounded gateway-safe header values.`,
|
|
234
|
+
);
|
|
235
|
+
} catch {
|
|
236
|
+
// A host-provided console must not let telemetry fail the request path.
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function isProxySink(value: unknown): value is ProxyTelemetrySink {
|
|
241
|
+
if (value === null || typeof value !== "object") return false;
|
|
242
|
+
try {
|
|
243
|
+
return typeof Reflect.get(value, "recordProxyResolution") === "function";
|
|
244
|
+
} catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** One finalisation owner for every request-scoped telemetry contributor. */
|
|
250
|
+
export class RequestTelemetry {
|
|
251
|
+
readonly trace: TraceContext;
|
|
252
|
+
readonly contributors: Readonly<
|
|
253
|
+
Partial<
|
|
254
|
+
Record<
|
|
255
|
+
TelemetryKey,
|
|
256
|
+
{
|
|
257
|
+
readonly key: TelemetryKey;
|
|
258
|
+
toLogPayload(spans: SpanIndex): object | undefined;
|
|
259
|
+
}
|
|
260
|
+
>
|
|
261
|
+
>
|
|
262
|
+
>;
|
|
263
|
+
readonly #registered: Partial<Record<TelemetryKey, RegisteredTelemetryContributor>> = {};
|
|
264
|
+
readonly #exposed: Partial<
|
|
265
|
+
Record<
|
|
266
|
+
TelemetryKey,
|
|
267
|
+
{
|
|
268
|
+
readonly key: TelemetryKey;
|
|
269
|
+
toLogPayload(spans: SpanIndex): object | undefined;
|
|
270
|
+
}
|
|
271
|
+
>
|
|
272
|
+
> = {};
|
|
273
|
+
#proxy: ProxyTelemetrySink | undefined;
|
|
274
|
+
|
|
275
|
+
constructor(trace: TraceContext) {
|
|
276
|
+
this.trace = trace;
|
|
277
|
+
this.contributors = this.#exposed;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
register<Log extends object, Header extends object>(
|
|
281
|
+
contributor: TelemetryContributor<Log, Header> &
|
|
282
|
+
(0 extends 1 & Log
|
|
283
|
+
? never
|
|
284
|
+
: 0 extends 1 & Header
|
|
285
|
+
? never
|
|
286
|
+
: [Header] extends [GatewayIngestible<Header>]
|
|
287
|
+
? unknown
|
|
288
|
+
: never),
|
|
289
|
+
): void {
|
|
290
|
+
if (this.#registered[contributor.key]) {
|
|
291
|
+
throw new TypeError(`Telemetry contributor "${contributor.key}" is already registered.`);
|
|
292
|
+
}
|
|
293
|
+
const registered: RegisteredTelemetryContributor = {
|
|
294
|
+
key: contributor.key,
|
|
295
|
+
toLogPayload: (spans) => contributor.toLogPayload(spans),
|
|
296
|
+
toHeaderPayload: (log) => contributor.toHeaderPayload(log as Log),
|
|
297
|
+
};
|
|
298
|
+
this.#registered[contributor.key] = registered;
|
|
299
|
+
this.#exposed[contributor.key] = contributor;
|
|
300
|
+
if (contributor.key === "proxy" && isProxySink(contributor)) this.#proxy = contributor;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
get proxy(): ProxyTelemetrySink | undefined {
|
|
304
|
+
return this.#proxy;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
toLogPayload(): RequestTelemetryLogPayload | undefined {
|
|
308
|
+
const spans = createSpanIndex(this.trace);
|
|
309
|
+
const payload: Partial<Record<TelemetryKey, object>> = {};
|
|
310
|
+
for (const key of Object.keys(this.#registered) as TelemetryKey[]) {
|
|
311
|
+
const contributor = this.#registered[key];
|
|
312
|
+
if (!contributor) continue;
|
|
313
|
+
try {
|
|
314
|
+
const sibling = contributor.toLogPayload(spans);
|
|
315
|
+
if (sibling === undefined) continue;
|
|
316
|
+
JSON.stringify(sibling);
|
|
317
|
+
payload[key] = sibling;
|
|
318
|
+
} catch {
|
|
319
|
+
warnInvalidSibling(key);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return Object.keys(payload).length > 0 ? (payload as RequestTelemetryLogPayload) : undefined;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
toHeaderValue(): string | undefined {
|
|
326
|
+
const spans = createSpanIndex(this.trace);
|
|
327
|
+
const siblings: Partial<Record<Exclude<TelemetryKey, "events">, object>> = {};
|
|
328
|
+
for (const key of HEADER_PRIORITY) {
|
|
329
|
+
const contributor = this.#registered[key];
|
|
330
|
+
if (!contributor) continue;
|
|
331
|
+
try {
|
|
332
|
+
const log = contributor.toLogPayload(spans);
|
|
333
|
+
if (log === undefined) continue;
|
|
334
|
+
const projected = contributor.toHeaderPayload(log);
|
|
335
|
+
if (projected === undefined) continue;
|
|
336
|
+
if (!isGatewayIngestible(projected)) {
|
|
337
|
+
warnInvalidSibling(key);
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
const serialized = JSON.stringify(projected);
|
|
341
|
+
const decoded: unknown = JSON.parse(serialized);
|
|
342
|
+
if (!isGatewayIngestible(decoded) || !isPlainRecord(decoded)) {
|
|
343
|
+
warnInvalidSibling(key);
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
siblings[key] = decoded;
|
|
347
|
+
} catch {
|
|
348
|
+
warnInvalidSibling(key);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if (Object.keys(siblings).length === 0) return undefined;
|
|
353
|
+
|
|
354
|
+
// Gateway uses permissive json.Unmarshal (unknown keys are ignored) but
|
|
355
|
+
// requires v === 1. The observability taxonomy is additive and independent.
|
|
356
|
+
const envelope: ProviderTelemetryEnvelope = {
|
|
357
|
+
v: 1,
|
|
358
|
+
taxonomy: PROVIDER_OBSERVABILITY_TAXONOMY_VERSION,
|
|
359
|
+
...siblings,
|
|
360
|
+
};
|
|
361
|
+
let encoded = encodeEnvelope(envelope);
|
|
362
|
+
if (encoded.length <= MAX_HEADER_BYTES) return encoded;
|
|
363
|
+
|
|
364
|
+
for (let index = HEADER_PRIORITY.length - 1; index >= 0; index -= 1) {
|
|
365
|
+
const key = HEADER_PRIORITY[index];
|
|
366
|
+
if (!key || !(key in envelope)) continue;
|
|
367
|
+
delete envelope[key];
|
|
368
|
+
if (!HEADER_PRIORITY.some((candidate) => candidate in envelope)) return undefined;
|
|
369
|
+
envelope.truncated = true;
|
|
370
|
+
encoded = encodeEnvelope(envelope);
|
|
371
|
+
if (encoded.length <= MAX_HEADER_BYTES) return encoded;
|
|
372
|
+
}
|
|
373
|
+
return undefined;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ProviderChallengeKind } from "../types.js";
|
|
2
|
+
|
|
3
|
+
export const APIFUSE__RESOLVER__2CAPTCHA__API_KEY = "APIFUSE__RESOLVER__2CAPTCHA__API_KEY";
|
|
4
|
+
export const APIFUSE__RESOLVER__CAPSOLVER__API_KEY = "APIFUSE__RESOLVER__CAPSOLVER__API_KEY";
|
|
5
|
+
export const APIFUSE__RESOLVER__CAPMONSTER__API_KEY = "APIFUSE__RESOLVER__CAPMONSTER__API_KEY";
|
|
6
|
+
export const APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY =
|
|
7
|
+
"APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY";
|
|
8
|
+
export const APIFUSE__RESOLVER__TIMEOUT_MS = "APIFUSE__RESOLVER__TIMEOUT_MS";
|
|
9
|
+
export const APIFUSE__CDP_POOL__URL = "APIFUSE__CDP_POOL__URL";
|
|
10
|
+
export const DEFAULT_RESOLVER_TIMEOUT_MS = 180_000;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* SBSD is solved on the provider's own admitted session, so the transport profile must be
|
|
14
|
+
* declared up front. Other kinds, including `akamai_sensor`, keep the profile optional.
|
|
15
|
+
*/
|
|
16
|
+
export function kindRequiresClientProfile(kind: ProviderChallengeKind): boolean {
|
|
17
|
+
return kind === "akamai_sbsd";
|
|
18
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export {
|
|
2
|
+
APIFUSE__CDP_POOL__URL,
|
|
3
|
+
APIFUSE__RESOLVER__2CAPTCHA__API_KEY,
|
|
4
|
+
APIFUSE__RESOLVER__CAPMONSTER__API_KEY,
|
|
5
|
+
APIFUSE__RESOLVER__CAPSOLVER__API_KEY,
|
|
6
|
+
APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY,
|
|
7
|
+
APIFUSE__RESOLVER__TIMEOUT_MS,
|
|
8
|
+
bindResolverSignal,
|
|
9
|
+
createResolverClient,
|
|
10
|
+
createResolverClientFromEnv,
|
|
11
|
+
createUnsupportedResolverClient,
|
|
12
|
+
DEFAULT_RESOLVER_VENDOR_PREFERENCE,
|
|
13
|
+
DEFAULT_RESOLVER_TIMEOUT_MS,
|
|
14
|
+
getResolverSolutionSource,
|
|
15
|
+
invalidateCachedResolverSolution,
|
|
16
|
+
invalidateResolverSolution,
|
|
17
|
+
RESOLVER_ADAPTER_REGISTRY,
|
|
18
|
+
RESOLVER_INSTRUMENTATION_METADATA,
|
|
19
|
+
resolveProviderResolverVendors,
|
|
20
|
+
type ResolverAdapterFactory,
|
|
21
|
+
type ResolverInstrumentationMetadata,
|
|
22
|
+
type ResolverRuntimeOptions,
|
|
23
|
+
type ResolverSolutionSource,
|
|
24
|
+
} from "./resolver.js";
|
|
25
|
+
export {
|
|
26
|
+
type ResolverCacheReadTelemetryEvent,
|
|
27
|
+
type ResolverCacheWriteTelemetryEvent,
|
|
28
|
+
type ResolverFailoverTelemetryEvent,
|
|
29
|
+
type ResolverIdentityTelemetryEvent,
|
|
30
|
+
type ResolverOutcomeTelemetryEvent,
|
|
31
|
+
type ResolverTelemetryAttemptOutcome,
|
|
32
|
+
type ResolverTelemetryCacheStatus,
|
|
33
|
+
type ResolverTelemetryCacheWriteReason,
|
|
34
|
+
type ResolverTelemetryErrorClass,
|
|
35
|
+
type ResolverTelemetryIdentitySource,
|
|
36
|
+
type ResolverTelemetryOutcome,
|
|
37
|
+
type ResolverTelemetryPhase,
|
|
38
|
+
type ResolverTelemetrySink,
|
|
39
|
+
type ResolverVendorAttemptTelemetryEvent,
|
|
40
|
+
} from "./resolver-telemetry.js";
|
|
41
|
+
export type {
|
|
42
|
+
ResolverPaidUsageContext,
|
|
43
|
+
ResolverVendorUnavailableReason,
|
|
44
|
+
} from "./resolver-vendors/types.js";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ProviderCache, ProviderDefinition, ProviderProxyPolicy } from "../types.js";
|
|
2
|
+
import type { ResolverRuntimeOptions } from "./resolver.js";
|
|
3
|
+
import type { ResolverTelemetrySink } from "./resolver-telemetry.js";
|
|
4
|
+
import type { BrowserTelemetrySink } from "./browser-telemetry.js";
|
|
5
|
+
|
|
6
|
+
/** Normalize the `proxy` declaration shorthand (`true`/`false`) into the policy object the resolver chain consumes. */
|
|
7
|
+
export function resolveNativeProxyPolicy(
|
|
8
|
+
provider: ProviderDefinition,
|
|
9
|
+
): ProviderProxyPolicy | undefined {
|
|
10
|
+
if (typeof provider.proxy === "object") return provider.proxy;
|
|
11
|
+
if (provider.proxy === true) return { mode: "optional" };
|
|
12
|
+
if (provider.proxy === false) return { mode: "disabled" };
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* One option set for every SDK-built resolver chain — the server's ctx.resolver and automatic
|
|
18
|
+
* SBSD solve, and the CLI helper contexts — so they share allowed hosts, cache, identity scope,
|
|
19
|
+
* proxy intent, and the telemetry sink. `identityScope` is server-owned; CLI contexts pass none.
|
|
20
|
+
*/
|
|
21
|
+
export function createResolverRuntimeOptions(
|
|
22
|
+
provider: ProviderDefinition,
|
|
23
|
+
cache: ProviderCache,
|
|
24
|
+
identityScope: string | undefined,
|
|
25
|
+
proxyPolicy: ProviderProxyPolicy | undefined,
|
|
26
|
+
proxyClientOptions: Omit<
|
|
27
|
+
NonNullable<ResolverRuntimeOptions["proxyIntent"]>,
|
|
28
|
+
"mode" | "userAgent"
|
|
29
|
+
>,
|
|
30
|
+
stealthProfile: { readonly userAgent: string } | undefined,
|
|
31
|
+
telemetry: ResolverTelemetrySink,
|
|
32
|
+
browserTelemetry?: BrowserTelemetrySink,
|
|
33
|
+
): ResolverRuntimeOptions {
|
|
34
|
+
return {
|
|
35
|
+
allowedHosts: provider.allowedHosts,
|
|
36
|
+
cache,
|
|
37
|
+
telemetry,
|
|
38
|
+
browserTelemetry,
|
|
39
|
+
...(identityScope === undefined ? {} : { identityScope }),
|
|
40
|
+
...(proxyPolicy
|
|
41
|
+
? {
|
|
42
|
+
proxyIntent: {
|
|
43
|
+
mode: proxyPolicy.mode,
|
|
44
|
+
...proxyClientOptions,
|
|
45
|
+
...(stealthProfile ? { userAgent: stealthProfile.userAgent } : {}),
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
: {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { ProviderError } from "../errors.js";
|
|
2
|
+
import type { ChallengeSolution, ProviderChallenge, ResolverContext } from "../types.js";
|
|
3
|
+
import type { TraceRecorder } from "./trace.js";
|
|
4
|
+
import type { ResolverTelemetryOutcome, ResolverTelemetrySink } from "./resolver-telemetry.js";
|
|
5
|
+
import type { BrowserTelemetrySink } from "./browser-telemetry.js";
|
|
6
|
+
|
|
7
|
+
type ResolverTelemetryBinding = (
|
|
8
|
+
sink: ResolverTelemetrySink,
|
|
9
|
+
browserSink?: BrowserTelemetrySink,
|
|
10
|
+
) => ResolverContext;
|
|
11
|
+
const telemetryBindings = new WeakMap<ResolverContext, ResolverTelemetryBinding>();
|
|
12
|
+
|
|
13
|
+
/** Internal contract: reconstruct a chain with a new request sink, without mutating the host chain. */
|
|
14
|
+
export function registerResolverTelemetryBinding(
|
|
15
|
+
resolver: ResolverContext,
|
|
16
|
+
bind: ResolverTelemetryBinding,
|
|
17
|
+
): void {
|
|
18
|
+
telemetryBindings.set(resolver, bind);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Preserve reconstruction across SDK wrappers without capturing their current request sink. */
|
|
22
|
+
export function inheritResolverTelemetryBinding(
|
|
23
|
+
resolver: ResolverContext,
|
|
24
|
+
wrapper: ResolverContext,
|
|
25
|
+
): void {
|
|
26
|
+
const bind = telemetryBindings.get(resolver);
|
|
27
|
+
if (bind) telemetryBindings.set(wrapper, bind);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** SDK chains expose each vendor invocation; opaque host resolvers expose one custom invocation. */
|
|
31
|
+
export function bindResolverTelemetry(
|
|
32
|
+
resolver: ResolverContext,
|
|
33
|
+
sink: ResolverTelemetrySink | undefined,
|
|
34
|
+
browserSink?: BrowserTelemetrySink,
|
|
35
|
+
): ResolverContext {
|
|
36
|
+
if (!sink) return resolver;
|
|
37
|
+
const metadata = (
|
|
38
|
+
resolver as ResolverContext & {
|
|
39
|
+
readonly [RESOLVER_INSTRUMENTATION_METADATA]?: { readonly target: ResolverContext };
|
|
40
|
+
}
|
|
41
|
+
)[RESOLVER_INSTRUMENTATION_METADATA];
|
|
42
|
+
if (metadata) return bindResolverTelemetry(metadata.target, sink, browserSink);
|
|
43
|
+
const bind = telemetryBindings.get(resolver);
|
|
44
|
+
if (bind) return bind(sink, browserSink);
|
|
45
|
+
const wrapper: ResolverSolveWithRecorder = {
|
|
46
|
+
async solve(challenge, signal, recorder) {
|
|
47
|
+
const startedAt = Date.now();
|
|
48
|
+
let outcome: ResolverTelemetryOutcome = "error";
|
|
49
|
+
try {
|
|
50
|
+
const solution = await (resolver as ResolverSolveWithRecorder).solve(
|
|
51
|
+
challenge,
|
|
52
|
+
signal,
|
|
53
|
+
recorder,
|
|
54
|
+
);
|
|
55
|
+
outcome = "solved";
|
|
56
|
+
return solution;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
outcome = signal?.aborted
|
|
59
|
+
? "aborted"
|
|
60
|
+
: error instanceof ProviderError && error.code === "RESOLVER_CHAIN_EXHAUSTED"
|
|
61
|
+
? "exhausted"
|
|
62
|
+
: "error";
|
|
63
|
+
throw error;
|
|
64
|
+
} finally {
|
|
65
|
+
const ms = Date.now() - startedAt;
|
|
66
|
+
sink.recordVendorAttempt({
|
|
67
|
+
vendor: "custom",
|
|
68
|
+
phase: outcome === "solved" ? "poll_result" : "create_task",
|
|
69
|
+
outcome: outcome === "solved" ? "ok" : "error",
|
|
70
|
+
ms,
|
|
71
|
+
});
|
|
72
|
+
sink.recordOutcome({ outcome, solveMs: ms, challengeKind: challenge.kind });
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
// Rebinding this wrapper returns to the original host, never to its previous sink.
|
|
77
|
+
registerResolverTelemetryBinding(wrapper, createOpaqueResolverTelemetryBinding(resolver));
|
|
78
|
+
return wrapper;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function createOpaqueResolverTelemetryBinding(resolver: ResolverContext): ResolverTelemetryBinding {
|
|
82
|
+
return (sink, browserSink) => bindResolverTelemetry(resolver, sink, browserSink);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export const RESOLVER_INSTRUMENTATION_METADATA = Symbol.for(
|
|
86
|
+
"@apifuse/provider-sdk/runtime/resolver-instrumentation-metadata",
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Internal solve surface. The instrumentation layer threads its recorder as a
|
|
91
|
+
* third argument so vendor-level spans (`resolver.vendor.*`) attach to the
|
|
92
|
+
* active trace. Every wrapper that re-exposes `solve` must forward the extra
|
|
93
|
+
* arguments; a wrapper typed against the public two-argument `ResolverContext`
|
|
94
|
+
* silently drops the recorder and vendor spans vanish.
|
|
95
|
+
*/
|
|
96
|
+
export type ResolverSolveWithRecorder = {
|
|
97
|
+
solve(
|
|
98
|
+
challenge: ProviderChallenge,
|
|
99
|
+
signal?: AbortSignal,
|
|
100
|
+
traceRecorder?: TraceRecorder,
|
|
101
|
+
): Promise<ChallengeSolution>;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export function createUnsupportedResolverClient(reason?: string): ResolverContext {
|
|
105
|
+
return {
|
|
106
|
+
async solve() {
|
|
107
|
+
throw new ProviderError(reason ?? "Resolver runtime is not configured", {
|
|
108
|
+
code: "RESOLVER_UNAVAILABLE",
|
|
109
|
+
fix: "Declare resolver on the provider definition and configure vendor credentials.",
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|