@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
package/dist/runtime/trace.js
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { sanitizeSpanNameForOutput } from "../trace-sanitization.js";
|
|
3
|
+
import { diagnosticStructuredRedactor, redactDiagnosticAttributeKey, copyDiagnosticAttributeTypes, redactedKeyAllocator, isRedactedKey, redactCriticalDiagnosticText, diagnosticAttributeRedactor, REDACTION_FAILED, redactDiagnosticText, } from "./diagnostic-redactor.js";
|
|
2
4
|
import { exportSpansOTLP } from "./otlp.js";
|
|
5
|
+
import { REDACTED_QUERY_VALUE } from "./request-options.js";
|
|
6
|
+
const TRACE_RESOURCE_ATTRIBUTE_SANITIZER = Symbol.for("@apifuse/provider-sdk/runtime/trace-resource-attribute-sanitizer");
|
|
3
7
|
export const TRACE_RECORDER = Symbol.for("@apifuse/provider-sdk/runtime/trace-recorder");
|
|
8
|
+
const TRACE_EXPORT_METADATA = Symbol.for("@apifuse/provider-sdk/runtime/trace-export-metadata");
|
|
9
|
+
function assertValidTraceId(traceId) {
|
|
10
|
+
if (!/^[0-9a-f]{32}$/.test(traceId) || /^0{32}$/.test(traceId)) {
|
|
11
|
+
throw new TypeError("traceId must be 32 lowercase hexadecimal characters and non-zero");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Updates request metadata before its pending root span completes and exports. */
|
|
15
|
+
export function updateTraceContextExportMetadata(trace, input) {
|
|
16
|
+
trace[TRACE_EXPORT_METADATA]?.update(input);
|
|
17
|
+
}
|
|
4
18
|
function buildOTLPExportOptions(config) {
|
|
5
19
|
if (config?.exporter !== "otlp") {
|
|
6
20
|
return undefined;
|
|
@@ -22,23 +36,76 @@ export function resolveTraceContextOptions(config) {
|
|
|
22
36
|
exportOptions: buildOTLPExportOptions(config),
|
|
23
37
|
};
|
|
24
38
|
}
|
|
25
|
-
function normalizeAttributeValue(value) {
|
|
26
|
-
if (typeof value === "
|
|
27
|
-
|
|
39
|
+
function normalizeAttributeValue(value, redact, retainBigints = false) {
|
|
40
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
41
|
+
// Typed columns are contracts: unlike string tokens, number/boolean/bigint
|
|
42
|
+
// values only consult the registry at >=8 characters in string form.
|
|
43
|
+
const text = String(value);
|
|
44
|
+
if (text.length < 8)
|
|
45
|
+
return value;
|
|
46
|
+
const redacted = redactDiagnosticText(text, diagnosticStructuredRedactor(redact));
|
|
47
|
+
return redacted === text ? value : redacted;
|
|
48
|
+
}
|
|
49
|
+
if (typeof value === "bigint") {
|
|
50
|
+
// Bigints are not valid OTLP attribute primitives, so retain their prior
|
|
51
|
+
// string normalization while still checking their diagnostic form.
|
|
52
|
+
const text = String(value);
|
|
53
|
+
if (text.length < 8)
|
|
54
|
+
return retainBigints ? value : text;
|
|
55
|
+
const redacted = redactDiagnosticText(text, diagnosticStructuredRedactor(redact));
|
|
56
|
+
return retainBigints && redacted === text ? value : redacted;
|
|
28
57
|
}
|
|
29
58
|
if (value === null || value === undefined) {
|
|
30
59
|
return undefined;
|
|
31
60
|
}
|
|
32
|
-
return String(value);
|
|
61
|
+
return redactDiagnosticText(String(value), redact);
|
|
33
62
|
}
|
|
34
|
-
function normalizeAttributes(attributes) {
|
|
63
|
+
function normalizeAttributes(attributes, redact, retainBigints = false) {
|
|
35
64
|
if (!attributes) {
|
|
36
65
|
return {};
|
|
37
66
|
}
|
|
67
|
+
const nextKey = redactedKeyAllocator(Object.keys(attributes));
|
|
38
68
|
const normalizedEntries = Object.entries(attributes)
|
|
39
|
-
.map(([key, value]) =>
|
|
69
|
+
.map(([key, value]) => {
|
|
70
|
+
const redactedKey = isRedactedKey(key) ? key : redactDiagnosticAttributeKey(key, redact);
|
|
71
|
+
const keyChanged = redactedKey !== key;
|
|
72
|
+
const normalizedKey = keyChanged ? nextKey() : key;
|
|
73
|
+
// Once a key changes, its original sensitivity classification is no
|
|
74
|
+
// longer available to later output sanitizers. Suppress the value here.
|
|
75
|
+
const normalizedValue = keyChanged
|
|
76
|
+
? redactedKey === REDACTION_FAILED
|
|
77
|
+
? REDACTION_FAILED
|
|
78
|
+
: REDACTED_QUERY_VALUE
|
|
79
|
+
: normalizeAttributeValue(value, diagnosticAttributeRedactor(key, redact, value), retainBigints);
|
|
80
|
+
return [normalizedKey, normalizedValue];
|
|
81
|
+
})
|
|
40
82
|
.filter((entry) => entry[1] !== undefined);
|
|
41
|
-
return Object.fromEntries(normalizedEntries);
|
|
83
|
+
return copyDiagnosticAttributeTypes(attributes, Object.fromEntries(normalizedEntries));
|
|
84
|
+
}
|
|
85
|
+
function prepareResourceAttributesForExport(attributes, redact, sanitize) {
|
|
86
|
+
if (!attributes)
|
|
87
|
+
return undefined;
|
|
88
|
+
if (sanitize) {
|
|
89
|
+
const sanitized = sanitize({ ...attributes });
|
|
90
|
+
if (!sanitized || typeof sanitized !== "object") {
|
|
91
|
+
throw new Error("resource attribute sanitizer returned no attributes");
|
|
92
|
+
}
|
|
93
|
+
return sanitized;
|
|
94
|
+
}
|
|
95
|
+
const nextKey = redactedKeyAllocator(Object.keys(attributes));
|
|
96
|
+
return Object.fromEntries(Object.entries(attributes).map(([key, value]) => {
|
|
97
|
+
const redactedKey = isRedactedKey(key) ? key : redactDiagnosticAttributeKey(key, redact);
|
|
98
|
+
const keyChanged = redactedKey !== key;
|
|
99
|
+
const sanitizedKey = keyChanged ? nextKey() : sanitizeSpanNameForOutput(key);
|
|
100
|
+
return [
|
|
101
|
+
sanitizedKey,
|
|
102
|
+
keyChanged
|
|
103
|
+
? redactedKey === REDACTION_FAILED
|
|
104
|
+
? REDACTION_FAILED
|
|
105
|
+
: REDACTED_QUERY_VALUE
|
|
106
|
+
: sanitizeSpanNameForOutput(value, diagnosticAttributeRedactor(key, redact, value)),
|
|
107
|
+
];
|
|
108
|
+
}));
|
|
42
109
|
}
|
|
43
110
|
function insertCompletedSpan(completed, entry, maxSpans) {
|
|
44
111
|
const insertAt = completed.findIndex((existingEntry) => existingEntry.sequence > entry.sequence);
|
|
@@ -52,56 +119,133 @@ function insertCompletedSpan(completed, entry, maxSpans) {
|
|
|
52
119
|
completed.splice(0, completed.length - maxSpans);
|
|
53
120
|
}
|
|
54
121
|
}
|
|
122
|
+
/** Hands the hook a copy whose attributes are detached from the recorded span; a hook that returns nothing fails closed. */
|
|
123
|
+
function prepareSpanForExport(span, sanitize) {
|
|
124
|
+
const copy = {
|
|
125
|
+
...span,
|
|
126
|
+
attributes: copyDiagnosticAttributeTypes(span.attributes, { ...span.attributes }),
|
|
127
|
+
};
|
|
128
|
+
if (!sanitize)
|
|
129
|
+
return copy;
|
|
130
|
+
const sanitized = sanitize(copy);
|
|
131
|
+
if (!sanitized || typeof sanitized !== "object") {
|
|
132
|
+
throw new Error("sanitizeSpanForExport returned no span");
|
|
133
|
+
}
|
|
134
|
+
return sanitized;
|
|
135
|
+
}
|
|
55
136
|
export function getTraceRecorder(trace) {
|
|
56
137
|
return trace[TRACE_RECORDER] ?? null;
|
|
57
138
|
}
|
|
139
|
+
const droppedOTLPSpans = new Map();
|
|
140
|
+
/** Internal, read-only process counters; no reset can re-arm a warning. */
|
|
141
|
+
export function getDroppedOTLPSpanCount(reason) {
|
|
142
|
+
return droppedOTLPSpans.get(reason) ?? 0;
|
|
143
|
+
}
|
|
144
|
+
function warnDroppedOTLPSpans(reason, count) {
|
|
145
|
+
const previous = getDroppedOTLPSpanCount(reason);
|
|
146
|
+
const total = previous + count;
|
|
147
|
+
droppedOTLPSpans.set(reason, total);
|
|
148
|
+
if (previous !== 0)
|
|
149
|
+
return;
|
|
150
|
+
try {
|
|
151
|
+
console.warn(`[apifuse] OTLP export skipped; reason=${reason}; dropped_spans=${total}`);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Warning sinks are best-effort. The counter/latch survives a failed sink.
|
|
155
|
+
}
|
|
156
|
+
}
|
|
58
157
|
export function createTraceContext(options = {}) {
|
|
158
|
+
if (options.traceId !== undefined)
|
|
159
|
+
assertValidTraceId(options.traceId);
|
|
59
160
|
const maxSpans = options.maxSpans ?? 1000;
|
|
60
161
|
const completed = [];
|
|
61
162
|
const activeSpanStorage = new AsyncLocalStorage();
|
|
62
163
|
let sequence = 0;
|
|
63
|
-
|
|
164
|
+
// Export configuration (which can carry collector credentials) stays in this closure;
|
|
165
|
+
// the context object handed to provider code never exposes it.
|
|
166
|
+
const exportOptions = options.exportOptions;
|
|
167
|
+
const resourceAttributeOptions = options.resourceAttributes;
|
|
168
|
+
const exportResourceAttributes = resourceAttributeOptions
|
|
169
|
+
? { ...resourceAttributeOptions }
|
|
170
|
+
: undefined;
|
|
171
|
+
const exportResourceAttributeSanitizer = resourceAttributeOptions?.[TRACE_RESOURCE_ATTRIBUTE_SANITIZER];
|
|
172
|
+
// One trace id per context so every export batch of this request shares it and
|
|
173
|
+
// two processes can never mint the same id.
|
|
174
|
+
let exportTraceId = options.traceId ?? crypto.randomUUID().replace(/-/g, "");
|
|
175
|
+
let exportScheduled = false;
|
|
176
|
+
// One pending batch per context: roots completing before the flush share it, and a span is
|
|
177
|
+
// handed to the exporter exactly once, so later roots never re-send earlier spans.
|
|
64
178
|
const scheduleExport = () => {
|
|
65
|
-
if (!
|
|
179
|
+
if (!exportOptions || exportScheduled) {
|
|
66
180
|
return;
|
|
67
181
|
}
|
|
68
|
-
|
|
182
|
+
exportScheduled = true;
|
|
69
183
|
setImmediate(() => {
|
|
70
|
-
|
|
184
|
+
exportScheduled = false;
|
|
185
|
+
const pending = completed.filter((entry) => !entry.exported);
|
|
186
|
+
for (const entry of pending)
|
|
187
|
+
entry.exported = true;
|
|
188
|
+
if (pending.length === 0)
|
|
189
|
+
return;
|
|
190
|
+
// Sanitization runs off the request path; a faulty sanitizer drops the batch, never the request.
|
|
191
|
+
let spans;
|
|
192
|
+
let resourceAttributes;
|
|
193
|
+
try {
|
|
194
|
+
spans = pending.map((entry) => prepareSpanForExport(entry.span, options.sanitizeSpanForExport));
|
|
195
|
+
resourceAttributes = prepareResourceAttributesForExport(exportResourceAttributes, options.redact, exportResourceAttributeSanitizer);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
try {
|
|
199
|
+
console.warn("[apifuse] OTLP export skipped; span sanitization failed.");
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// A broken diagnostic sink must not escape this detached callback.
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// A matching trace ID cannot be replaced with non-hex text on the wire. Emit less.
|
|
207
|
+
if (redactCriticalDiagnosticText(exportTraceId, options.redact) !== exportTraceId) {
|
|
208
|
+
warnDroppedOTLPSpans("unverifiable_trace_id", pending.length);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
void exportSpansOTLP(spans, exportOptions, resourceAttributes, exportTraceId);
|
|
71
212
|
});
|
|
72
213
|
};
|
|
73
214
|
const recorder = {
|
|
74
215
|
async runSpan(name, fn, spanOptions = {}) {
|
|
75
216
|
const pendingSpan = {
|
|
76
217
|
id: crypto.randomUUID(),
|
|
77
|
-
name,
|
|
218
|
+
name: redactCriticalDiagnosticText(name, options.redact),
|
|
78
219
|
startedAt: Date.now(),
|
|
79
220
|
parentId: activeSpanStorage.getStore()?.id,
|
|
80
221
|
sequence: sequence++,
|
|
81
|
-
attributes: normalizeAttributes(spanOptions.attributes),
|
|
222
|
+
attributes: normalizeAttributes(spanOptions.attributes, options.redact, true),
|
|
82
223
|
};
|
|
83
224
|
const finalize = (status, extraAttributes, error) => {
|
|
84
225
|
const endedAt = Date.now();
|
|
85
226
|
const duration = endedAt - pendingSpan.startedAt;
|
|
86
227
|
const attributes = {
|
|
87
228
|
...pendingSpan.attributes,
|
|
88
|
-
...
|
|
229
|
+
...extraAttributes,
|
|
89
230
|
};
|
|
90
231
|
if (attributes.duration_ms === undefined) {
|
|
91
232
|
attributes.duration_ms = duration;
|
|
92
233
|
}
|
|
93
234
|
const span = {
|
|
94
|
-
id: pendingSpan.id,
|
|
95
|
-
|
|
235
|
+
id: redactCriticalDiagnosticText(pendingSpan.id, options.redact),
|
|
236
|
+
// Recheck at recording: harvest and live env reads may follow span start.
|
|
237
|
+
name: redactCriticalDiagnosticText(pendingSpan.name, options.redact),
|
|
96
238
|
startedAt: pendingSpan.startedAt,
|
|
97
239
|
endedAt,
|
|
98
240
|
duration_ms: duration,
|
|
99
241
|
status,
|
|
100
|
-
attributes,
|
|
101
|
-
...(error ? { error } : {}),
|
|
102
|
-
...(pendingSpan.parentId
|
|
242
|
+
attributes: normalizeAttributes(attributes, options.redact),
|
|
243
|
+
...(error ? { error: redactDiagnosticText(error, options.redact) } : {}),
|
|
244
|
+
...(pendingSpan.parentId
|
|
245
|
+
? { parentId: redactCriticalDiagnosticText(pendingSpan.parentId, options.redact) }
|
|
246
|
+
: {}),
|
|
103
247
|
};
|
|
104
|
-
insertCompletedSpan(completed, { sequence: pendingSpan.sequence, span }, maxSpans);
|
|
248
|
+
insertCompletedSpan(completed, { sequence: pendingSpan.sequence, span, exported: false }, maxSpans);
|
|
105
249
|
options.onSpan?.(span);
|
|
106
250
|
if (!pendingSpan.parentId) {
|
|
107
251
|
scheduleExport();
|
|
@@ -123,18 +267,25 @@ export function createTraceContext(options = {}) {
|
|
|
123
267
|
});
|
|
124
268
|
},
|
|
125
269
|
};
|
|
126
|
-
traceContext = {
|
|
270
|
+
const traceContext = {
|
|
127
271
|
span(name, fn) {
|
|
128
272
|
return recorder.runSpan(name, fn);
|
|
129
273
|
},
|
|
130
274
|
getSpans() {
|
|
131
275
|
return completed.map((entry) => ({ ...entry.span }));
|
|
132
276
|
},
|
|
133
|
-
...(options.exportOptions ? { _exportOptions: options.exportOptions } : {}),
|
|
134
|
-
...(options.resourceAttributes
|
|
135
|
-
? { _resourceAttributes: { ...options.resourceAttributes } }
|
|
136
|
-
: {}),
|
|
137
277
|
[TRACE_RECORDER]: recorder,
|
|
278
|
+
[TRACE_EXPORT_METADATA]: {
|
|
279
|
+
update(input) {
|
|
280
|
+
if (input.traceId !== undefined) {
|
|
281
|
+
assertValidTraceId(input.traceId);
|
|
282
|
+
exportTraceId = input.traceId;
|
|
283
|
+
}
|
|
284
|
+
if (input.resourceAttributes !== undefined && exportResourceAttributes) {
|
|
285
|
+
Object.assign(exportResourceAttributes, input.resourceAttributes);
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
},
|
|
138
289
|
};
|
|
139
290
|
return traceContext;
|
|
140
291
|
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime boundary lint: provider runtime source must reach the outside world
|
|
3
|
+
* through the SDK context (`ctx.http`, `ctx.stealth`, `ctx.env`,
|
|
4
|
+
* `ctx.credential`, `ctx.browser`), not through ambient Node/Bun globals.
|
|
5
|
+
*
|
|
6
|
+
* Three rules, reported at `error` level: a finding fails `apifuse check` and
|
|
7
|
+
* `apifuse submit-check` (official and standalone mode alike). The first
|
|
8
|
+
* release reported them at `warn` as a migration window; the window closed once
|
|
9
|
+
* the fleet's request-path hits were fixed or acknowledged. A deliberate
|
|
10
|
+
* exception is acknowledged in code (see below), never through a hidden
|
|
11
|
+
* allowlist.
|
|
12
|
+
*
|
|
13
|
+
* - `process-env-direct-read`: `process.env.X`, `process.env["X"]`, a bare
|
|
14
|
+
* `process.env` object use, and the `Bun.env` equivalents. Runtime bootstrap
|
|
15
|
+
* keys (`APIFUSE__RUNTIME__*`) are exempt everywhere because `serve()`
|
|
16
|
+
* callers read the port and pod identity before a context exists.
|
|
17
|
+
* - `node-runtime-module-import`: value imports of `fs`, `fs/promises`, `net`,
|
|
18
|
+
* `tls`, `dgram`, `http`, `https`, `http2`, `child_process` (with or without
|
|
19
|
+
* the `node:` prefix) via import/export declarations, `require()`, or dynamic
|
|
20
|
+
* `import()`, plus the Bun equivalents `Bun.spawn`, `Bun.spawnSync`, `Bun.$`,
|
|
21
|
+
* `Bun.file`, `Bun.write`. Type-only imports are not runtime reach and are
|
|
22
|
+
* ignored.
|
|
23
|
+
* - `direct-fetch-call`: a call to the global `fetch` (bare identifier, or
|
|
24
|
+
* `globalThis`/`window`/`self`/`global` member). A bare `fetch` call whose
|
|
25
|
+
* enclosing scope declares a `fetch` binding (parameter, variable, import,
|
|
26
|
+
* function, catch clause) is calling that binding, not the global, and is
|
|
27
|
+
* left alone; the check is lexical, so a wrapper that takes `fetch` as a
|
|
28
|
+
* parameter does not hide a global `fetch()` elsewhere in the same file.
|
|
29
|
+
* `ctx.stealth.fetch()` is a member call and never matches.
|
|
30
|
+
*
|
|
31
|
+
* Files are parsed with the script kind their extension implies (`.ts` as
|
|
32
|
+
* TypeScript, `.tsx` as TSX, …). Parsing everything as TSX would make a
|
|
33
|
+
* generic arrow (`<T>(value: T) => value`) or an angle-bracket assertion in an
|
|
34
|
+
* ordinary `.ts` file read as JSX, and everything after it would silently drop
|
|
35
|
+
* out of the AST.
|
|
36
|
+
*
|
|
37
|
+
* Scope is the provider *runtime* source: JavaScript/TypeScript files under
|
|
38
|
+
* `providerSourceFiles` minus tests, recorded fixtures, the root bootstrap
|
|
39
|
+
* entrypoints (`dev.ts`, `start.ts`, `deploy.ts`) and the operator tooling
|
|
40
|
+
* directories (`scripts/`, `tools/`, `bin/`). Tooling legitimately reads the
|
|
41
|
+
* ambient environment and the filesystem when a human runs it; the rule is
|
|
42
|
+
* about code the pod executes on behalf of a request.
|
|
43
|
+
*
|
|
44
|
+
* A deliberate exception is acknowledged with the same escape hatch the submit
|
|
45
|
+
* check uses: `// @apifuse-allow <rule>: <reason>` on the finding line or the
|
|
46
|
+
* line directly above it. Acknowledged findings are reported as information so
|
|
47
|
+
* `apifuse check` still lists them.
|
|
48
|
+
*/
|
|
49
|
+
import type { LintDiagnostic, ProviderLintInformation, ProviderLintResult } from "./lint.js";
|
|
50
|
+
import { type TypeScriptCompilerModuleLike, type TypeScriptModule } from "./typescript-module.js";
|
|
51
|
+
export declare const PROCESS_ENV_DIRECT_READ_RULE = "process-env-direct-read";
|
|
52
|
+
export declare const NODE_RUNTIME_MODULE_IMPORT_RULE = "node-runtime-module-import";
|
|
53
|
+
export declare const DIRECT_FETCH_CALL_RULE = "direct-fetch-call";
|
|
54
|
+
export declare const RUNTIME_BOUNDARY_RULES: readonly ["process-env-direct-read", "node-runtime-module-import", "direct-fetch-call"];
|
|
55
|
+
export type RuntimeBoundaryRule = (typeof RUNTIME_BOUNDARY_RULES)[number];
|
|
56
|
+
/**
|
|
57
|
+
* Environment names a provider may read from `process.env` directly. These
|
|
58
|
+
* are consumed before `serve()` builds a context (port, pod identity), so
|
|
59
|
+
* `ctx.env` cannot carry them. The whole `APIFUSE__RUNTIME__` family is the
|
|
60
|
+
* bootstrap contract; nothing else is exempt.
|
|
61
|
+
*/
|
|
62
|
+
export declare const BOOTSTRAP_ENV_NAME_PREFIX = "APIFUSE__RUNTIME__";
|
|
63
|
+
export declare function isBootstrapEnvName(name: string): boolean;
|
|
64
|
+
export declare const TEST_SOURCE_FILE_PATTERN: RegExp;
|
|
65
|
+
type RuntimeBoundaryFinding = {
|
|
66
|
+
rule: RuntimeBoundaryRule;
|
|
67
|
+
/** 1-based line. */
|
|
68
|
+
line: number;
|
|
69
|
+
/** What was reached: the env name, module specifier, or call text. */
|
|
70
|
+
subject: string;
|
|
71
|
+
};
|
|
72
|
+
type RuntimeBoundaryFileReport = {
|
|
73
|
+
findings: RuntimeBoundaryFinding[];
|
|
74
|
+
acknowledged: Array<RuntimeBoundaryFinding & {
|
|
75
|
+
reason: string;
|
|
76
|
+
}>;
|
|
77
|
+
};
|
|
78
|
+
/** True for the files the runtime boundary rules look at. */
|
|
79
|
+
export declare function isRuntimeBoundarySourceFile(relativePath: string): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Script kind for a provider source file, from its extension. `.tsx`/`.jsx`
|
|
82
|
+
* enable JSX; everything else (`.ts`, `.mts`, `.cts`, `.js`, `.mjs`, `.cjs`,
|
|
83
|
+
* and the synthetic names used for in-memory sources) does not, so a generic
|
|
84
|
+
* arrow or `<T>value` assertion in a `.ts` file parses as TypeScript instead
|
|
85
|
+
* of swallowing the rest of the file as unterminated JSX.
|
|
86
|
+
*/
|
|
87
|
+
export declare function scriptKindForSourceFile(ts: TypeScriptModule, fileName: string): import("typescript").ScriptKind;
|
|
88
|
+
export declare function analyzeRuntimeBoundary(ts: TypeScriptModule, fileName: string, source: string): RuntimeBoundaryFileReport;
|
|
89
|
+
export type RuntimeBoundaryLintInput = {
|
|
90
|
+
authFlowSource?: string;
|
|
91
|
+
providerSourceFiles?: Record<string, string>;
|
|
92
|
+
operations?: Record<string, {
|
|
93
|
+
handler?: unknown;
|
|
94
|
+
source?: string;
|
|
95
|
+
}>;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Lint the provider runtime boundary. Returns error-level diagnostics (one per
|
|
99
|
+
* file and rule, listing every line) and information entries for findings
|
|
100
|
+
* acknowledged with `@apifuse-allow`.
|
|
101
|
+
*/
|
|
102
|
+
export declare function lintRuntimeBoundary(ts: TypeScriptModule, provider: RuntimeBoundaryLintInput, readOperationSource: (operation: {
|
|
103
|
+
handler?: unknown;
|
|
104
|
+
source?: string;
|
|
105
|
+
}) => string): {
|
|
106
|
+
diagnostics: LintDiagnostic[];
|
|
107
|
+
information: ProviderLintInformation[];
|
|
108
|
+
};
|
|
109
|
+
export type LintRuntimeBoundarySourcesOptions = {
|
|
110
|
+
/**
|
|
111
|
+
* A loaded TypeScript compiler API module to parse with (`typescript` 6.x
|
|
112
|
+
* or `@typescript/typescript6`). When omitted the SDK resolves one from its
|
|
113
|
+
* own install location, trying `typescript` first and falling back to
|
|
114
|
+
* `@typescript/typescript6` when `typescript` is the 7.x native shell
|
|
115
|
+
* without `createSourceFile`. A caller whose dependency tree pins its own
|
|
116
|
+
* compiler module (the APIFuse monorepo contract check) passes it here so
|
|
117
|
+
* the parse does not depend on what hoists next to the SDK.
|
|
118
|
+
*/
|
|
119
|
+
typescript?: TypeScriptCompilerModuleLike;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Lint provider runtime source files for the runtime boundary rules without a
|
|
123
|
+
* provider definition: `files` maps provider-root-relative paths to source
|
|
124
|
+
* text (the same shape `apifuse check` collects as `providerSourceFiles`).
|
|
125
|
+
* Out-of-scope paths (tests, recorded fixtures, `.d.ts`, the root
|
|
126
|
+
* `dev.ts`/`start.ts`/`deploy.ts`, `scripts/`, `tools/`, `bin/`) are skipped
|
|
127
|
+
* with `isRuntimeBoundarySourceFile`. Diagnostics carry
|
|
128
|
+
* `field: "sourceFiles.<path>"`; `@apifuse-allow` acknowledgements come back
|
|
129
|
+
* as `information`.
|
|
130
|
+
*
|
|
131
|
+
* Parses with `options.typescript` when given, otherwise with the compiler
|
|
132
|
+
* module resolved from the installed SDK (see `getTypeScript`). This is the
|
|
133
|
+
* entry point the platform contract check uses to apply the rules with the
|
|
134
|
+
* monorepo's SDK pin instead of each provider's own pin.
|
|
135
|
+
*/
|
|
136
|
+
export declare function lintRuntimeBoundarySources(files: Record<string, string>, options?: LintRuntimeBoundarySourcesOptions): ProviderLintResult;
|
|
137
|
+
export {};
|