@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,56 @@
|
|
|
1
|
+
export const CAPABILITY_BODY_UNAVAILABLE = "<body unavailable>";
|
|
2
|
+
/** Read optional diagnostic response text without letting a body stall the request failure. */
|
|
3
|
+
export async function readCapabilityErrorBody(response, signal) {
|
|
4
|
+
if (signal.aborted)
|
|
5
|
+
return CAPABILITY_BODY_UNAVAILABLE;
|
|
6
|
+
let timer;
|
|
7
|
+
let onAbort;
|
|
8
|
+
let reader;
|
|
9
|
+
let unavailableWon = false;
|
|
10
|
+
const cancelBody = (reason) => {
|
|
11
|
+
const cancellation = reader ? reader.cancel(reason) : response.body?.cancel(reason);
|
|
12
|
+
if (cancellation)
|
|
13
|
+
void cancellation.catch(() => { });
|
|
14
|
+
};
|
|
15
|
+
const unavailable = new Promise((resolve) => {
|
|
16
|
+
onAbort = () => {
|
|
17
|
+
unavailableWon = true;
|
|
18
|
+
resolve(CAPABILITY_BODY_UNAVAILABLE);
|
|
19
|
+
cancelBody(signal.reason);
|
|
20
|
+
};
|
|
21
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
22
|
+
timer = setTimeout(() => {
|
|
23
|
+
unavailableWon = true;
|
|
24
|
+
resolve(CAPABILITY_BODY_UNAVAILABLE);
|
|
25
|
+
cancelBody(new Error("capability error body read timeout"));
|
|
26
|
+
}, 250);
|
|
27
|
+
});
|
|
28
|
+
const body = Promise.resolve()
|
|
29
|
+
.then(async () => {
|
|
30
|
+
if (unavailableWon)
|
|
31
|
+
return CAPABILITY_BODY_UNAVAILABLE;
|
|
32
|
+
if (!response.body)
|
|
33
|
+
return response.text();
|
|
34
|
+
reader = response.body.getReader();
|
|
35
|
+
const decoder = new TextDecoder();
|
|
36
|
+
let text = "";
|
|
37
|
+
while (true) {
|
|
38
|
+
if (unavailableWon)
|
|
39
|
+
return CAPABILITY_BODY_UNAVAILABLE;
|
|
40
|
+
const chunk = await reader.read();
|
|
41
|
+
if (chunk.done)
|
|
42
|
+
return text + decoder.decode();
|
|
43
|
+
text += decoder.decode(chunk.value, { stream: true });
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
.catch(() => CAPABILITY_BODY_UNAVAILABLE);
|
|
47
|
+
try {
|
|
48
|
+
return await Promise.race([body, unavailable]);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
if (timer !== undefined)
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
if (onAbort)
|
|
54
|
+
signal.removeEventListener("abort", onAbort);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
/** Internal capture facts, isolated across concurrent calls and never attached to caller results. */
|
|
3
|
+
export type CapabilityFacts = {
|
|
4
|
+
status?: number;
|
|
5
|
+
finishReason?: string;
|
|
6
|
+
diagnostics?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const capabilityFacts: AsyncLocalStorage<CapabilityFacts>;
|
|
9
|
+
export declare function tagCapability<T extends object>(context: T, facts: {
|
|
10
|
+
backend: string;
|
|
11
|
+
engine: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
}): T;
|
|
14
|
+
export declare function capabilityMetadata(context: object): {
|
|
15
|
+
backend: string;
|
|
16
|
+
engine: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
} | undefined;
|
|
19
|
+
export declare function captureCapability(facts: CapabilityFacts): void;
|
|
20
|
+
export declare function registerCapabilityInput(input: {
|
|
21
|
+
kind: string;
|
|
22
|
+
data?: string;
|
|
23
|
+
url?: string;
|
|
24
|
+
}): void;
|
|
25
|
+
/**
|
|
26
|
+
* Formats capability diagnostics after credential redaction.
|
|
27
|
+
* When `stripPayload` is enabled, long base64-shaped runs are replaced as a
|
|
28
|
+
* defence in depth; this may replace an unregistered long identifier, while
|
|
29
|
+
* protecting against the more likely case of payload data in an upstream body.
|
|
30
|
+
*/
|
|
31
|
+
export declare function capabilityText(value: string, redact?: (text: string) => string, stripPayload?: boolean): string;
|
|
32
|
+
export declare function capabilityErrorText(error: unknown): string;
|
|
33
|
+
export declare const integer: (n: number | undefined) => number;
|
|
34
|
+
export declare const add: (a: number, b: number) => number;
|
|
35
|
+
export declare function inputBytes(input: {
|
|
36
|
+
kind: string;
|
|
37
|
+
data?: string;
|
|
38
|
+
}): number | undefined;
|
|
39
|
+
/** All capability hooks use the HTTP observer guard, including failure reporting. */
|
|
40
|
+
export declare function observeCapability(sink: {
|
|
41
|
+
markTelemetryFailed?(): void;
|
|
42
|
+
}, callback: () => unknown): void;
|
|
43
|
+
type RootRunner = <T>(callback: () => Promise<T>) => Promise<T>;
|
|
44
|
+
export declare function bindCapabilityRoot<T extends object>(context: T, run: RootRunner): T;
|
|
45
|
+
export declare function runCapabilitySpan<T>(context: object, callback: () => Promise<T>): Promise<T>;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import { registerDiagnosticValue } from "./diagnostic-env.js";
|
|
4
|
+
import { redactDiagnosticText } from "./diagnostic-redactor.js";
|
|
5
|
+
import { observeTelemetry } from "./http-telemetry-guard.js";
|
|
6
|
+
import { boundedText } from "./resolver-telemetry.js";
|
|
7
|
+
export const capabilityFacts = new AsyncLocalStorage();
|
|
8
|
+
const metadata = new WeakMap();
|
|
9
|
+
export function tagCapability(context, facts) {
|
|
10
|
+
metadata.set(context, facts);
|
|
11
|
+
return context;
|
|
12
|
+
}
|
|
13
|
+
export function capabilityMetadata(context) {
|
|
14
|
+
return metadata.get(context);
|
|
15
|
+
}
|
|
16
|
+
export function captureCapability(facts) {
|
|
17
|
+
const current = capabilityFacts.getStore();
|
|
18
|
+
if (current)
|
|
19
|
+
Object.assign(current, facts);
|
|
20
|
+
}
|
|
21
|
+
export function registerCapabilityInput(input) {
|
|
22
|
+
// Payloads are measurements, never redaction needles. Only bounded URLs belong
|
|
23
|
+
// in the request inventory; structural stripping covers oversized URL echoes.
|
|
24
|
+
if (input.kind === "url" && input.url && Buffer.byteLength(input.url) <= 2048)
|
|
25
|
+
registerDiagnosticValue(input.url.trim());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Formats capability diagnostics after credential redaction.
|
|
29
|
+
* When `stripPayload` is enabled, long base64-shaped runs are replaced as a
|
|
30
|
+
* defence in depth; this may replace an unregistered long identifier, while
|
|
31
|
+
* protecting against the more likely case of payload data in an upstream body.
|
|
32
|
+
*/
|
|
33
|
+
export function capabilityText(value, redact, stripPayload = false) {
|
|
34
|
+
const stripped = value
|
|
35
|
+
.replace(/(?:authorization|proxy-authorization|cookie|set-cookie)\s*["']?\s*[:=]\s*[^\r\n]+/gi, "[REDACTED]")
|
|
36
|
+
.replace(/Bearer\s+[^\r\n]+/gi, "[REDACTED]")
|
|
37
|
+
.replace(/https?:\/\/[^\s"'<>]+/gi, "[REDACTED]")
|
|
38
|
+
.replace(/data:[^\s"']+/gi, "[BASE64_STRIPPED]");
|
|
39
|
+
return boundedText(stripPayload ? stripped.replace(/[A-Za-z0-9+/=]{64,}/g, "[BASE64_STRIPPED]") : stripped, (text) => redactDiagnosticText(text, redact));
|
|
40
|
+
}
|
|
41
|
+
export function capabilityErrorText(error) {
|
|
42
|
+
if (!(error instanceof Error))
|
|
43
|
+
return String(error);
|
|
44
|
+
const details = "details" in error ? error.details : undefined;
|
|
45
|
+
const body = details && typeof details === "object" && "body" in details ? details.body : undefined;
|
|
46
|
+
return `${error.message}${typeof body === "string" ? ` ${body}` : ""}`;
|
|
47
|
+
}
|
|
48
|
+
export const integer = (n) => Math.min(Number.MAX_SAFE_INTEGER, Math.max(0, Math.floor(Number.isFinite(n ?? 0) ? (n ?? 0) : 0)));
|
|
49
|
+
export const add = (a, b) => Math.min(Number.MAX_SAFE_INTEGER, integer(a) + integer(b));
|
|
50
|
+
export function inputBytes(input) {
|
|
51
|
+
if (input.kind !== "base64" || input.data === undefined)
|
|
52
|
+
return undefined;
|
|
53
|
+
return Buffer.byteLength(input.data.trim(), "base64");
|
|
54
|
+
}
|
|
55
|
+
/** All capability hooks use the HTTP observer guard, including failure reporting. */
|
|
56
|
+
export function observeCapability(sink, callback) {
|
|
57
|
+
observeTelemetry(callback, () => {
|
|
58
|
+
observeTelemetry(() => sink.markTelemetryFailed?.(), () => { });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const roots = new WeakMap();
|
|
62
|
+
export function bindCapabilityRoot(context, run) {
|
|
63
|
+
roots.set(context, run);
|
|
64
|
+
return context;
|
|
65
|
+
}
|
|
66
|
+
export function runCapabilitySpan(context, callback) {
|
|
67
|
+
return roots.get(context)?.(callback) ?? callback();
|
|
68
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** @internal Chromium 149 DeprecatedCaseFoldingHash for an LChar string. */
|
|
2
|
+
export declare function chrome149CaseFoldingHash(name: string): number;
|
|
3
|
+
/** @internal Numeric rapidhash fixture from Chromium's string_hasher_test.cc. */
|
|
4
|
+
export declare function chrome149RapidhashFixture(): {
|
|
5
|
+
full: bigint;
|
|
6
|
+
masked: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* HTTPHeaderMap insertion sequence of the fixed headers in a real Chrome
|
|
10
|
+
* 149.0.7827.155 page fetch/XHR (insertion order, not bucket order). Caller
|
|
11
|
+
* headers precede all of these (core/fetch/fetch_manager.cc:1128-1130).
|
|
12
|
+
*
|
|
13
|
+
* platform/loader/fetch/resource_request_utils.cc:146 UpgradeResourceRequestForLoader
|
|
14
|
+
* :166 context.UpgradeResourceRequestForLoader
|
|
15
|
+
* -> core/loader/frame_fetch_context.cc:1000 AddClientHintsIfNecessary
|
|
16
|
+
* Set sec-ch-ua @737, sec-ch-ua-mobile @748, sec-ch-ua-platform @761
|
|
17
|
+
* -> :1001 AddReducedAcceptLanguageIfNecessary is a no-op
|
|
18
|
+
* (kReduceAcceptLanguage[HTTP] are FEATURE_DISABLED_BY_DEFAULT,
|
|
19
|
+
* services/network/public/cpp/features.cc:204,214)
|
|
20
|
+
* :214 context.PrepareRequest
|
|
21
|
+
* -> core/loader/frame_fetch_context.cc:419 SetHTTPUserAgent
|
|
22
|
+
* -> :455 probe::PrepareRequest, which only touches the map when a
|
|
23
|
+
* DevTools session has set an Accept-Language override:
|
|
24
|
+
* InspectorEmulationAgent::PrepareRequest (inspector_emulation_agent.cc
|
|
25
|
+
* :626-636, Emulation.setUserAgentOverride acceptLanguage; skips a key
|
|
26
|
+
* the page already set) or InspectorNetworkAgent::PrepareRequest
|
|
27
|
+
* (inspector_network_agent.cc:1524-1547, Network.setExtraHTTPHeaders;
|
|
28
|
+
* overwrites)
|
|
29
|
+
*
|
|
30
|
+
* Accept-Language is therefore NOT a map key in real Chrome. //net appends it
|
|
31
|
+
* in URLRequestHttpJob::AddExtraHeaders (net/url_request/url_request_http_job.cc
|
|
32
|
+
* :784-797) after Accept-Encoding, and only when the request does not already
|
|
33
|
+
* carry one (SetHeaderIfMissing), which is why a caller-supplied Accept-Language
|
|
34
|
+
* stays at its map bucket and is never emitted twice. al-placement-capture.json
|
|
35
|
+
* (B: no locale, C: --accept-lang=ja) confirms both the four-key map and the
|
|
36
|
+
* downstream slot.
|
|
37
|
+
*
|
|
38
|
+
* Every earlier corpus (placement-rule-sweep, expansion-sweep, holdout-capture,
|
|
39
|
+
* m1-capture) was captured through Playwright `newContext({ locale })`, which
|
|
40
|
+
* sets that override (Emulation.setUserAgentOverride acceptLanguage) and so
|
|
41
|
+
* inserts Accept-Language into the map as a fifth fixed key. Those fixtures still
|
|
42
|
+
* validate the hash and table mechanics;
|
|
43
|
+
* the tests interpret them through that harness insertion list. No production
|
|
44
|
+
* path uses it.
|
|
45
|
+
*/
|
|
46
|
+
export declare const CHROME149_FIXED_MAP_INSERTION: readonly ["sec-ch-ua", "sec-ch-ua-mobile", "sec-ch-ua-platform", "User-Agent"];
|
|
47
|
+
/**
|
|
48
|
+
* @internal Header-name order model parameterised by the fixed map insertion
|
|
49
|
+
* sequence. Production always passes {@link CHROME149_FIXED_MAP_INSERTION};
|
|
50
|
+
* tests pass the DevTools-harness sequence to validate corpora captured through
|
|
51
|
+
* Playwright's `locale` option.
|
|
52
|
+
*/
|
|
53
|
+
export declare function chrome149HeaderOrderForMapInsertion(callerNames: Iterable<string>, fixedMapInsertion: readonly string[]): string[];
|
|
54
|
+
/**
|
|
55
|
+
* @internal Predict real Chrome 149's non-pseudo HTTP/2 fetch/XHR header-name
|
|
56
|
+
* order for the given caller header names (no DevTools session attached).
|
|
57
|
+
*/
|
|
58
|
+
export declare function chrome149HeaderOrder(callerNames: Iterable<string>): string[];
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
const U64_MASK = (1n << 64n) - 1n;
|
|
2
|
+
const RAPID_SEED = 0xbdd89aa982704029n;
|
|
3
|
+
const RAPID_SECRET = [0x2d358dccaa6c78a5n, 0x8bb84b93962eacc9n, 0x4b33a62ed433d4a3n];
|
|
4
|
+
function latin1CaseFold(character) {
|
|
5
|
+
if (character >= 0x41 && character <= 0x5a)
|
|
6
|
+
return character + 0x20;
|
|
7
|
+
if (character === 0xb5)
|
|
8
|
+
return 0x03bc;
|
|
9
|
+
if ((character >= 0xc0 && character <= 0xd6) || (character >= 0xd8 && character <= 0xde))
|
|
10
|
+
return character + 0x20;
|
|
11
|
+
return character;
|
|
12
|
+
}
|
|
13
|
+
function multiply128(a, b) {
|
|
14
|
+
const product = (a & U64_MASK) * (b & U64_MASK);
|
|
15
|
+
return [product & U64_MASK, (product >> 64n) & U64_MASK];
|
|
16
|
+
}
|
|
17
|
+
function rapidMix(a, b) {
|
|
18
|
+
const [low, high] = multiply128(a, b);
|
|
19
|
+
return low ^ high;
|
|
20
|
+
}
|
|
21
|
+
class PlainByteHashReader {
|
|
22
|
+
bytes;
|
|
23
|
+
compressionFactor = 1;
|
|
24
|
+
expansionFactor = 1;
|
|
25
|
+
constructor(bytes) {
|
|
26
|
+
this.bytes = bytes;
|
|
27
|
+
}
|
|
28
|
+
read64(offset) {
|
|
29
|
+
let result = 0n;
|
|
30
|
+
for (let index = 0; index < 8; index += 1) {
|
|
31
|
+
result |= BigInt(this.bytes[offset + index] ?? 0) << BigInt(index * 8);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
read32(offset) {
|
|
36
|
+
let result = 0n;
|
|
37
|
+
for (let index = 0; index < 4; index += 1) {
|
|
38
|
+
result |= BigInt(this.bytes[offset + index] ?? 0) << BigInt(index * 8);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
readSmall(offset, length) {
|
|
43
|
+
return ((BigInt(this.bytes[offset] ?? 0) << 56n) |
|
|
44
|
+
(BigInt(this.bytes[offset + (length >> 1)] ?? 0) << 32n) |
|
|
45
|
+
BigInt(this.bytes[offset + length - 1] ?? 0));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
class CaseFoldingLatin1HashReader {
|
|
49
|
+
input;
|
|
50
|
+
compressionFactor = 1;
|
|
51
|
+
expansionFactor = 2;
|
|
52
|
+
constructor(input) {
|
|
53
|
+
this.input = input;
|
|
54
|
+
}
|
|
55
|
+
fold(offset) {
|
|
56
|
+
return BigInt(latin1CaseFold(this.input.charCodeAt(offset)));
|
|
57
|
+
}
|
|
58
|
+
read64(offset) {
|
|
59
|
+
return (this.fold(offset) |
|
|
60
|
+
(this.fold(offset + 1) << 16n) |
|
|
61
|
+
(this.fold(offset + 2) << 32n) |
|
|
62
|
+
(this.fold(offset + 3) << 48n));
|
|
63
|
+
}
|
|
64
|
+
read32(offset) {
|
|
65
|
+
return this.fold(offset) | (this.fold(offset + 1) << 16n);
|
|
66
|
+
}
|
|
67
|
+
readSmall(offset, length) {
|
|
68
|
+
if (length !== 2) {
|
|
69
|
+
throw new Error(`CaseFoldingHashReader<LChar> received length ${length}; expected 2.`);
|
|
70
|
+
}
|
|
71
|
+
return this.fold(offset);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function rapidHash(reader, producedLength) {
|
|
75
|
+
const x = reader.compressionFactor;
|
|
76
|
+
const y = reader.expansionFactor;
|
|
77
|
+
if (producedLength % y !== 0)
|
|
78
|
+
throw new Error("Invalid rapidhash reader length.");
|
|
79
|
+
let seed = RAPID_SEED;
|
|
80
|
+
seed ^= rapidMix(seed ^ RAPID_SECRET[0], RAPID_SECRET[1]) ^ BigInt(producedLength);
|
|
81
|
+
seed &= U64_MASK;
|
|
82
|
+
let offset = 0;
|
|
83
|
+
let a;
|
|
84
|
+
let b;
|
|
85
|
+
if (producedLength <= 16) {
|
|
86
|
+
if (producedLength >= 4) {
|
|
87
|
+
const last = offset + Math.trunc(((producedLength - 4) * x) / y);
|
|
88
|
+
a = (reader.read32(offset) << 32n) | reader.read32(last);
|
|
89
|
+
const delta = Math.trunc((((producedLength & 24) >> (producedLength >> 3)) * x) / y);
|
|
90
|
+
b = (reader.read32(offset + delta) << 32n) | reader.read32(last - delta);
|
|
91
|
+
}
|
|
92
|
+
else if (producedLength > 0) {
|
|
93
|
+
a = reader.readSmall(offset, producedLength);
|
|
94
|
+
b = 0n;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
a = 0n;
|
|
98
|
+
b = 0n;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
let remaining = producedLength;
|
|
103
|
+
if (remaining > 48) {
|
|
104
|
+
let see1 = seed;
|
|
105
|
+
let see2 = seed;
|
|
106
|
+
do {
|
|
107
|
+
seed = rapidMix(reader.read64(offset) ^ RAPID_SECRET[0], reader.read64(offset + Math.trunc((8 * x) / y)) ^ seed);
|
|
108
|
+
see1 = rapidMix(reader.read64(offset + Math.trunc((16 * x) / y)) ^ RAPID_SECRET[1], reader.read64(offset + Math.trunc((24 * x) / y)) ^ see1);
|
|
109
|
+
see2 = rapidMix(reader.read64(offset + Math.trunc((32 * x) / y)) ^ RAPID_SECRET[2], reader.read64(offset + Math.trunc((40 * x) / y)) ^ see2);
|
|
110
|
+
offset += Math.trunc((48 * x) / y);
|
|
111
|
+
remaining -= 48;
|
|
112
|
+
} while (remaining >= 48);
|
|
113
|
+
seed ^= see1 ^ see2;
|
|
114
|
+
}
|
|
115
|
+
if (remaining > 16) {
|
|
116
|
+
seed = rapidMix(reader.read64(offset) ^ RAPID_SECRET[2], reader.read64(offset + Math.trunc((8 * x) / y)) ^ seed ^ RAPID_SECRET[1]);
|
|
117
|
+
if (remaining > 32) {
|
|
118
|
+
seed = rapidMix(reader.read64(offset + Math.trunc((16 * x) / y)) ^ RAPID_SECRET[2], reader.read64(offset + Math.trunc((24 * x) / y)) ^ seed);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
a = reader.read64(offset + Math.trunc(((remaining - 16) * x) / y));
|
|
122
|
+
b = reader.read64(offset + Math.trunc(((remaining - 8) * x) / y));
|
|
123
|
+
}
|
|
124
|
+
a ^= RAPID_SECRET[1];
|
|
125
|
+
b ^= seed;
|
|
126
|
+
[a, b] = multiply128(a, b);
|
|
127
|
+
return rapidMix(a ^ RAPID_SECRET[0] ^ BigInt(producedLength), b ^ RAPID_SECRET[1]);
|
|
128
|
+
}
|
|
129
|
+
function maskTopEightBits(hash) {
|
|
130
|
+
const masked = Number(hash & 0xffffffn);
|
|
131
|
+
return masked === 0 ? 0x800000 : masked;
|
|
132
|
+
}
|
|
133
|
+
/** @internal Chromium 149 DeprecatedCaseFoldingHash for an LChar string. */
|
|
134
|
+
export function chrome149CaseFoldingHash(name) {
|
|
135
|
+
const reader = new CaseFoldingLatin1HashReader(name);
|
|
136
|
+
return maskTopEightBits(rapidHash(reader, name.length * reader.expansionFactor));
|
|
137
|
+
}
|
|
138
|
+
/** @internal Numeric rapidhash fixture from Chromium's string_hasher_test.cc. */
|
|
139
|
+
export function chrome149RapidhashFixture() {
|
|
140
|
+
const fixture = [0x41, 0x95, 0xff, 0x50, 0x01];
|
|
141
|
+
const full = rapidHash(new PlainByteHashReader(fixture), fixture.length);
|
|
142
|
+
return { full, masked: maskTopEightBits(full) };
|
|
143
|
+
}
|
|
144
|
+
function asciiCaseKey(name) {
|
|
145
|
+
let result = "";
|
|
146
|
+
for (let index = 0; index < name.length; index += 1) {
|
|
147
|
+
const character = name.charCodeAt(index);
|
|
148
|
+
result += String.fromCharCode(character >= 0x41 && character <= 0x5a ? character + 0x20 : character);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
class WtfHeaderHashMap {
|
|
153
|
+
table = [];
|
|
154
|
+
keyCount = 0;
|
|
155
|
+
insertWithoutExpansion(key) {
|
|
156
|
+
const mask = this.table.length - 1;
|
|
157
|
+
let index = chrome149CaseFoldingHash(key) & mask;
|
|
158
|
+
let probeCount = 0;
|
|
159
|
+
const keyCaseFolded = asciiCaseKey(key);
|
|
160
|
+
for (;;) {
|
|
161
|
+
const stored = this.table[index];
|
|
162
|
+
if (stored === undefined) {
|
|
163
|
+
this.table[index] = key;
|
|
164
|
+
this.keyCount += 1;
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
if (asciiCaseKey(stored) === keyCaseFolded)
|
|
168
|
+
return false;
|
|
169
|
+
probeCount += 1;
|
|
170
|
+
index = (index + probeCount) & mask;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
rehash(newSize) {
|
|
174
|
+
const oldTable = this.table;
|
|
175
|
+
this.table = Array(newSize);
|
|
176
|
+
this.keyCount = 0;
|
|
177
|
+
for (const key of oldTable) {
|
|
178
|
+
if (key !== undefined)
|
|
179
|
+
this.insertWithoutExpansion(key);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
insert(key) {
|
|
183
|
+
if (this.table.length === 0)
|
|
184
|
+
this.table = Array(8);
|
|
185
|
+
if (!this.insertWithoutExpansion(key))
|
|
186
|
+
return;
|
|
187
|
+
if (this.keyCount * 2 >= this.table.length)
|
|
188
|
+
this.rehash(this.table.length * 2);
|
|
189
|
+
}
|
|
190
|
+
iterationOrder() {
|
|
191
|
+
return this.table.filter((key) => key !== undefined);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* HTTPHeaderMap insertion sequence of the fixed headers in a real Chrome
|
|
196
|
+
* 149.0.7827.155 page fetch/XHR (insertion order, not bucket order). Caller
|
|
197
|
+
* headers precede all of these (core/fetch/fetch_manager.cc:1128-1130).
|
|
198
|
+
*
|
|
199
|
+
* platform/loader/fetch/resource_request_utils.cc:146 UpgradeResourceRequestForLoader
|
|
200
|
+
* :166 context.UpgradeResourceRequestForLoader
|
|
201
|
+
* -> core/loader/frame_fetch_context.cc:1000 AddClientHintsIfNecessary
|
|
202
|
+
* Set sec-ch-ua @737, sec-ch-ua-mobile @748, sec-ch-ua-platform @761
|
|
203
|
+
* -> :1001 AddReducedAcceptLanguageIfNecessary is a no-op
|
|
204
|
+
* (kReduceAcceptLanguage[HTTP] are FEATURE_DISABLED_BY_DEFAULT,
|
|
205
|
+
* services/network/public/cpp/features.cc:204,214)
|
|
206
|
+
* :214 context.PrepareRequest
|
|
207
|
+
* -> core/loader/frame_fetch_context.cc:419 SetHTTPUserAgent
|
|
208
|
+
* -> :455 probe::PrepareRequest, which only touches the map when a
|
|
209
|
+
* DevTools session has set an Accept-Language override:
|
|
210
|
+
* InspectorEmulationAgent::PrepareRequest (inspector_emulation_agent.cc
|
|
211
|
+
* :626-636, Emulation.setUserAgentOverride acceptLanguage; skips a key
|
|
212
|
+
* the page already set) or InspectorNetworkAgent::PrepareRequest
|
|
213
|
+
* (inspector_network_agent.cc:1524-1547, Network.setExtraHTTPHeaders;
|
|
214
|
+
* overwrites)
|
|
215
|
+
*
|
|
216
|
+
* Accept-Language is therefore NOT a map key in real Chrome. //net appends it
|
|
217
|
+
* in URLRequestHttpJob::AddExtraHeaders (net/url_request/url_request_http_job.cc
|
|
218
|
+
* :784-797) after Accept-Encoding, and only when the request does not already
|
|
219
|
+
* carry one (SetHeaderIfMissing), which is why a caller-supplied Accept-Language
|
|
220
|
+
* stays at its map bucket and is never emitted twice. al-placement-capture.json
|
|
221
|
+
* (B: no locale, C: --accept-lang=ja) confirms both the four-key map and the
|
|
222
|
+
* downstream slot.
|
|
223
|
+
*
|
|
224
|
+
* Every earlier corpus (placement-rule-sweep, expansion-sweep, holdout-capture,
|
|
225
|
+
* m1-capture) was captured through Playwright `newContext({ locale })`, which
|
|
226
|
+
* sets that override (Emulation.setUserAgentOverride acceptLanguage) and so
|
|
227
|
+
* inserts Accept-Language into the map as a fifth fixed key. Those fixtures still
|
|
228
|
+
* validate the hash and table mechanics;
|
|
229
|
+
* the tests interpret them through that harness insertion list. No production
|
|
230
|
+
* path uses it.
|
|
231
|
+
*/
|
|
232
|
+
export const CHROME149_FIXED_MAP_INSERTION = [
|
|
233
|
+
"sec-ch-ua",
|
|
234
|
+
"sec-ch-ua-mobile",
|
|
235
|
+
"sec-ch-ua-platform",
|
|
236
|
+
"User-Agent",
|
|
237
|
+
];
|
|
238
|
+
/**
|
|
239
|
+
* Appended after PopulateResourceRequest has iterated the map: Fetch Metadata
|
|
240
|
+
* and Referer by the network service, then //net's Accept-Encoding and
|
|
241
|
+
* Accept-Language, then the HTTP/2 Priority header (net/spdy/spdy_http_utils.cc).
|
|
242
|
+
*/
|
|
243
|
+
const DOWNSTREAM_SUFFIX = [
|
|
244
|
+
"sec-fetch-site",
|
|
245
|
+
"sec-fetch-mode",
|
|
246
|
+
"sec-fetch-dest",
|
|
247
|
+
"referer",
|
|
248
|
+
];
|
|
249
|
+
/**
|
|
250
|
+
* @internal Header-name order model parameterised by the fixed map insertion
|
|
251
|
+
* sequence. Production always passes {@link CHROME149_FIXED_MAP_INSERTION};
|
|
252
|
+
* tests pass the DevTools-harness sequence to validate corpora captured through
|
|
253
|
+
* Playwright's `locale` option.
|
|
254
|
+
*/
|
|
255
|
+
export function chrome149HeaderOrderForMapInsertion(callerNames, fixedMapInsertion) {
|
|
256
|
+
const unique = new Map();
|
|
257
|
+
for (const name of callerNames) {
|
|
258
|
+
const key = asciiCaseKey(name);
|
|
259
|
+
if (!unique.has(key))
|
|
260
|
+
unique.set(key, name);
|
|
261
|
+
}
|
|
262
|
+
const headerMap = new WtfHeaderHashMap();
|
|
263
|
+
for (const key of [...unique.keys()].sort())
|
|
264
|
+
headerMap.insert(unique.get(key));
|
|
265
|
+
for (const name of fixedMapInsertion)
|
|
266
|
+
headerMap.insert(name);
|
|
267
|
+
const order = headerMap.iterationOrder().map((name) => name.toLowerCase());
|
|
268
|
+
// SetAcceptHeader adds */* only when the caller Accept was absent.
|
|
269
|
+
if (!order.includes("accept"))
|
|
270
|
+
order.push("accept");
|
|
271
|
+
order.push(...DOWNSTREAM_SUFFIX);
|
|
272
|
+
// URLRequestHttpJob::AddExtraHeaders: Accept-Encoding, then Accept-Language,
|
|
273
|
+
// each only if the request does not already carry it.
|
|
274
|
+
if (!order.includes("accept-encoding"))
|
|
275
|
+
order.push("accept-encoding");
|
|
276
|
+
if (!order.includes("accept-language"))
|
|
277
|
+
order.push("accept-language");
|
|
278
|
+
// CreateSpdyHeadersFromHttpRequest appends the default Priority only if absent.
|
|
279
|
+
if (!order.includes("priority"))
|
|
280
|
+
order.push("priority");
|
|
281
|
+
return order;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* @internal Predict real Chrome 149's non-pseudo HTTP/2 fetch/XHR header-name
|
|
285
|
+
* order for the given caller header names (no DevTools session attached).
|
|
286
|
+
*/
|
|
287
|
+
export function chrome149HeaderOrder(callerNames) {
|
|
288
|
+
return chrome149HeaderOrderForMapInsertion(callerNames, CHROME149_FIXED_MAP_INSERTION);
|
|
289
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function resolvedStringVariants(value: string | undefined): string[];
|
|
2
|
+
export declare function urlCredentialComponents(value: string, options: {
|
|
3
|
+
includePathAndQuery: boolean;
|
|
4
|
+
}): string[];
|
|
5
|
+
export declare function otlpHeaderCredentialValues(value: string): string[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export function resolvedStringVariants(value) {
|
|
2
|
+
if (value === undefined)
|
|
3
|
+
return [];
|
|
4
|
+
return [...new Set([value, value.trim()])].filter((candidate) => candidate.length > 0);
|
|
5
|
+
}
|
|
6
|
+
function decodedComponent(value) {
|
|
7
|
+
try {
|
|
8
|
+
return decodeURIComponent(value);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function urlCredentialComponents(value, options) {
|
|
15
|
+
let url;
|
|
16
|
+
try {
|
|
17
|
+
url = new URL(value.trim());
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
const username = decodedComponent(url.username);
|
|
23
|
+
const password = decodedComponent(url.password);
|
|
24
|
+
const components = [username, password, username && password ? `${username}:${password}` : ""];
|
|
25
|
+
if (options.includePathAndQuery) {
|
|
26
|
+
for (const segment of url.pathname.split("/")) {
|
|
27
|
+
if (segment)
|
|
28
|
+
components.push(decodedComponent(segment));
|
|
29
|
+
}
|
|
30
|
+
for (const [key, entryValue] of url.searchParams) {
|
|
31
|
+
if (key)
|
|
32
|
+
components.push(key);
|
|
33
|
+
if (entryValue) {
|
|
34
|
+
components.push(entryValue, `${key}=${entryValue}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [...new Set(components.flatMap((component) => resolvedStringVariants(component)))];
|
|
39
|
+
}
|
|
40
|
+
export function otlpHeaderCredentialValues(value) {
|
|
41
|
+
const variants = resolvedStringVariants(value);
|
|
42
|
+
for (const member of value.split(",")) {
|
|
43
|
+
const separator = member.indexOf("=");
|
|
44
|
+
if (separator <= 0)
|
|
45
|
+
continue;
|
|
46
|
+
const headerValue = decodedComponent(member.slice(separator + 1).trim());
|
|
47
|
+
variants.push(...resolvedStringVariants(headerValue));
|
|
48
|
+
const headerName = decodedComponent(member.slice(0, separator).trim()).toLowerCase();
|
|
49
|
+
if (headerName === "authorization" || headerName === "proxy-authorization") {
|
|
50
|
+
// A transport may echo just the credential without its HTTP auth scheme.
|
|
51
|
+
const credential = /^(?:Bearer|Basic)\s+(.+)$/i.exec(headerValue)?.[1];
|
|
52
|
+
if (credential)
|
|
53
|
+
variants.push(...resolvedStringVariants(credential));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return [...new Set(variants)];
|
|
57
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CompiledDiagnosticSensitiveValues } from "./diagnostic-redactor.js";
|
|
2
|
+
type EnvObserver = (name: string, value: string) => void;
|
|
3
|
+
export interface DiagnosticEnvScope {
|
|
4
|
+
observe: EnvObserver;
|
|
5
|
+
finished: boolean;
|
|
6
|
+
staticValues?: CompiledDiagnosticSensitiveValues;
|
|
7
|
+
register?: (values: readonly string[]) => void;
|
|
8
|
+
}
|
|
9
|
+
/** Resolve and register atomically, before any consumer can use a live env credential. */
|
|
10
|
+
export declare function readDiagnosticEnv(name: string, env?: Readonly<Record<string, string | undefined>>): string | undefined;
|
|
11
|
+
/** Register a runtime-discovered sensitive value in the active request inventory. */
|
|
12
|
+
export declare function registerDiagnosticValue(value: string): void;
|
|
13
|
+
export declare function withDiagnosticEnv<T>(observer: EnvObserver | DiagnosticEnvScope, fn: () => T): T;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { otlpHeaderCredentialValues, resolvedStringVariants, urlCredentialComponents, } from "./diagnostic-env-values.js";
|
|
3
|
+
import { registerProcessDiagnosticValues, suppressProcessDiagnosticValues, withAppDiagnosticFallback, } from "./diagnostic-redactor.js";
|
|
4
|
+
const observers = new AsyncLocalStorage();
|
|
5
|
+
/** Resolve and register atomically, before any consumer can use a live env credential. */
|
|
6
|
+
export function readDiagnosticEnv(name, env = process.env) {
|
|
7
|
+
const value = env[name];
|
|
8
|
+
if (value !== undefined) {
|
|
9
|
+
const scope = observers.getStore();
|
|
10
|
+
if (scope && !scope.finished)
|
|
11
|
+
scope.observe(name, value);
|
|
12
|
+
else {
|
|
13
|
+
// ALS survives the response. Finished requests register into the app's
|
|
14
|
+
// inherited fallback lifetime, never a dead request's private inventory.
|
|
15
|
+
if (Buffer.byteLength(value) > 64 * 1024)
|
|
16
|
+
suppressProcessDiagnosticValues();
|
|
17
|
+
else
|
|
18
|
+
registerProcessDiagnosticValues([
|
|
19
|
+
...resolvedStringVariants(value),
|
|
20
|
+
...urlCredentialComponents(value, {
|
|
21
|
+
includePathAndQuery: name === "APIFUSE__CDP_POOL__URL",
|
|
22
|
+
}),
|
|
23
|
+
...(name === "OTEL_EXPORTER_OTLP_HEADERS" || name === "OTEL_EXPORTER_OTLP_TRACES_HEADERS"
|
|
24
|
+
? otlpHeaderCredentialValues(value)
|
|
25
|
+
: []),
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
/** Register a runtime-discovered sensitive value in the active request inventory. */
|
|
32
|
+
export function registerDiagnosticValue(value) {
|
|
33
|
+
if (value.length < 4)
|
|
34
|
+
return;
|
|
35
|
+
const scope = observers.getStore();
|
|
36
|
+
if (scope && !scope.finished && scope.register) {
|
|
37
|
+
scope.register([value]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function withDiagnosticEnv(observer, fn) {
|
|
41
|
+
const scope = typeof observer === "function" ? { observe: observer, finished: false } : observer;
|
|
42
|
+
const run = () => observers.run(scope, fn);
|
|
43
|
+
return scope.staticValues ? withAppDiagnosticFallback(scope.staticValues, run) : run();
|
|
44
|
+
}
|