@apifuse/provider-sdk 2.2.0-beta.5 → 2.2.0-beta.50
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 +537 -33
- package/CHANGELOG.md +201 -1
- package/README.md +83 -22
- package/SUBMISSION.md +2 -2
- package/bin/apifuse-check.ts +165 -11
- package/bin/apifuse-dev.ts +57 -13
- package/bin/apifuse-migrate-operation-declaration.ts +55 -0
- package/bin/apifuse-migrate-shape.ts +202 -0
- package/bin/apifuse-pack-check.ts +22 -2
- package/bin/apifuse-pack-smoke.ts +57 -2
- package/bin/apifuse-pack-types.ts +357 -38
- package/bin/apifuse-perf.ts +14 -13
- package/bin/apifuse-record.ts +709 -72
- package/bin/apifuse-submit-check.ts +2344 -324
- package/bin/apifuse-sync-assets.ts +117 -0
- 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 +27 -0
- package/dist/cli/create.d.ts +4 -1
- package/dist/cli/create.js +42 -37
- package/dist/cli/migrate-operation-declaration.d.ts +59 -0
- package/dist/cli/migrate-operation-declaration.js +1178 -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 +52 -0
- package/dist/cli/migrate-provider-shape.js +578 -0
- package/dist/cli/prompt-assets.d.ts +80 -0
- package/dist/cli/prompt-assets.js +743 -0
- package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
- package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
- package/dist/cli/templates/provider/README.md.tpl +5 -5
- 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 +179 -16
- package/dist/config/loader.js +435 -127
- 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 +33 -0
- package/dist/declaration-validation.js +266 -0
- package/dist/define.d.ts +66 -29
- package/dist/define.js +778 -69
- package/dist/dev.d.ts +3 -0
- package/dist/dev.js +1 -1
- package/dist/engine.d.ts +78 -0
- package/dist/engine.js +133 -0
- package/dist/error-observability.d.ts +7 -0
- package/dist/error-observability.js +61 -0
- package/dist/error-resolution.d.ts +4 -0
- package/dist/error-resolution.js +122 -0
- package/dist/errors.d.ts +33 -0
- package/dist/errors.js +40 -0
- package/dist/fixture-sanitization.d.ts +28 -0
- package/dist/fixture-sanitization.js +227 -0
- package/dist/health-scenario.d.ts +1842 -0
- package/dist/health-scenario.js +624 -0
- package/dist/index.d.ts +21 -10
- package/dist/index.js +12 -7
- package/dist/lint.d.ts +23 -11
- package/dist/lint.js +572 -69
- 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 +10 -2
- package/dist/provider.js +4 -1
- package/dist/runtime/auth-flow.d.ts +5 -1
- package/dist/runtime/auth-flow.js +6 -0
- package/dist/runtime/browser.d.ts +1 -0
- package/dist/runtime/browser.js +492 -49
- package/dist/runtime/cache.d.ts +1 -0
- package/dist/runtime/cache.js +169 -15
- package/dist/runtime/choice-wordlist.d.ts +9 -0
- package/dist/runtime/choice-wordlist.js +138 -0
- package/dist/runtime/choice.d.ts +13 -1
- package/dist/runtime/choice.js +490 -102
- package/dist/runtime/chrome149-header-order.d.ts +58 -0
- package/dist/runtime/chrome149-header-order.js +289 -0
- package/dist/runtime/env.js +12 -0
- package/dist/runtime/executor.d.ts +3 -2
- package/dist/runtime/executor.js +26 -25
- package/dist/runtime/http.d.ts +1 -0
- package/dist/runtime/http.js +515 -53
- package/dist/runtime/insights.js +2 -2
- package/dist/runtime/instrumentation.d.ts +2 -2
- package/dist/runtime/instrumentation.js +366 -8
- 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 +96 -0
- package/dist/runtime/native-network.js +1232 -0
- package/dist/runtime/ocr.d.ts +29 -0
- package/dist/runtime/ocr.js +440 -0
- package/dist/runtime/otlp.d.ts +71 -2
- package/dist/runtime/otlp.js +397 -16
- package/dist/runtime/proxy-errors.js +6 -2
- package/dist/runtime/proxy-nodemaven.d.ts +56 -0
- package/dist/runtime/proxy-nodemaven.js +146 -0
- package/dist/runtime/proxy-telemetry.d.ts +80 -1
- package/dist/runtime/proxy-telemetry.js +154 -47
- package/dist/runtime/redirects.d.ts +29 -0
- package/dist/runtime/redirects.js +36 -0
- package/dist/runtime/redis.d.ts +1 -1
- package/dist/runtime/redis.js +4 -2
- package/dist/runtime/request-options.d.ts +68 -1
- package/dist/runtime/request-options.js +548 -0
- package/dist/runtime/resolver-config.d.ts +6 -0
- package/dist/runtime/resolver-config.js +6 -0
- package/dist/runtime/resolver-public.d.ts +1 -0
- package/dist/runtime/resolver-public.js +1 -0
- package/dist/runtime/resolver-shared.d.ts +14 -0
- package/dist/runtime/resolver-shared.js +12 -0
- package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
- package/dist/runtime/resolver-vendors/bindings.js +40 -0
- package/dist/runtime/resolver-vendors/browser.d.ts +22 -0
- package/dist/runtime/resolver-vendors/browser.js +377 -0
- package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
- package/dist/runtime/resolver-vendors/capsolver.js +531 -0
- package/dist/runtime/resolver-vendors/hosts.d.ts +2 -0
- package/dist/runtime/resolver-vendors/hosts.js +33 -0
- package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
- package/dist/runtime/resolver-vendors/twocaptcha.js +408 -0
- package/dist/runtime/resolver-vendors/types.d.ts +94 -0
- package/dist/runtime/resolver-vendors/types.js +96 -0
- package/dist/runtime/resolver.d.ts +72 -0
- package/dist/runtime/resolver.js +771 -0
- package/dist/runtime/secrets.d.ts +27 -0
- package/dist/runtime/secrets.js +51 -0
- package/dist/runtime/state.d.ts +3 -0
- package/dist/runtime/state.js +277 -71
- package/dist/runtime/stealth-cookies.d.ts +20 -0
- package/dist/runtime/stealth-cookies.js +111 -0
- package/dist/runtime/stealth.d.ts +41 -5
- package/dist/runtime/stealth.js +997 -291
- package/dist/runtime/stt.js +1 -12
- 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 +5 -0
- package/dist/runtime/trace.js +43 -10
- 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/index.d.ts +5 -2
- package/dist/server/index.js +2 -2
- 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.d.ts +14 -3
- package/dist/server/self-test.js +129 -58
- package/dist/server/serve-implementation.d.ts +230 -0
- package/dist/server/serve-implementation.js +2265 -0
- package/dist/server/serve.d.ts +1 -70
- package/dist/server/serve.js +1 -1131
- package/dist/server/trace-output.d.ts +6 -0
- package/dist/server/trace-output.js +79 -0
- package/dist/server/types.d.ts +30 -5
- package/dist/server/types.js +13 -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 +215 -0
- package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
- package/dist/stateful/stateful-provider-runtime-context.js +60 -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 +9 -4
- package/dist/stealth/profiles.js +160 -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 +489 -21
- package/dist/trace-sanitization.d.ts +5 -0
- package/dist/trace-sanitization.js +45 -0
- package/dist/types.d.ts +673 -131
- package/dist/types.js +1 -0
- package/package.json +45 -5
- package/src/auth-turn/index.ts +1 -1
- package/src/auth.ts +118 -0
- package/src/ceremonies/index.ts +189 -46
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/approval-override.ts.txt +6 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/codemod-syntax.ts.txt +3 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/connection-precedence.ts.txt +10 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/docs-conflict.ts.txt +8 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-map.ts.txt +5 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-operation.ts.txt +16 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-map.ts.txt +3 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoist-all.ts.txt +31 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoisted-const.ts.txt +11 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/imported-spread.ts.txt +11 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-map.ts.txt +11 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-cast-tail.ts.txt +21 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-ekitan.ts.txt +11 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-override.ts.txt +14 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/missing-english-locale.ts.txt +7 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/no-safety.ts.txt +6 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/non-literal.ts.txt +7 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/redundant-approval.ts.txt +6 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/safety-conflict.ts.txt +7 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/stream.ts.txt +7 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/tool-router-spread.ts.txt +15 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/unparseable.ts.txt +4 -0
- package/src/cli/__tests__/fixtures/migrate-operation-declaration/verbatim-template.ts.txt +12 -0
- package/src/cli/commands.ts +33 -0
- package/src/cli/create.ts +50 -37
- package/src/cli/migrate-operation-declaration.ts +1654 -0
- package/src/cli/migrate-operation-shape.ts +184 -0
- package/src/cli/migrate-provider-shape.ts +772 -0
- package/src/cli/prompt-assets.ts +865 -0
- package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
- package/src/cli/templates/provider/Dockerfile.tpl +1 -1
- package/src/cli/templates/provider/README.md.tpl +5 -5
- 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 +690 -163
- 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 +330 -0
- package/src/define.ts +1048 -131
- package/src/dev.ts +4 -1
- package/src/engine.ts +279 -0
- package/src/error-observability.ts +64 -0
- package/src/error-resolution.ts +127 -0
- package/src/errors.ts +68 -0
- package/src/fixture-sanitization.ts +264 -0
- package/src/health-scenario.ts +875 -0
- package/src/index.ts +220 -13
- package/src/lint.ts +698 -90
- 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 +161 -3
- package/src/runtime/auth-flow.ts +12 -0
- package/src/runtime/browser.ts +661 -63
- package/src/runtime/cache.ts +189 -14
- package/src/runtime/choice-wordlist.ts +145 -0
- package/src/runtime/choice.ts +631 -120
- package/src/runtime/chrome149-header-order.ts +330 -0
- package/src/runtime/env.ts +13 -0
- package/src/runtime/executor.ts +43 -31
- package/src/runtime/http.ts +641 -61
- package/src/runtime/insights.ts +2 -2
- package/src/runtime/instrumentation.ts +520 -15
- package/src/runtime/native-network-errors.ts +99 -0
- package/src/runtime/native-network.ts +1605 -0
- package/src/runtime/ocr.ts +523 -0
- package/src/runtime/otlp.ts +467 -21
- package/src/runtime/proxy-errors.ts +12 -4
- package/src/runtime/proxy-nodemaven.ts +221 -0
- package/src/runtime/proxy-telemetry.ts +244 -75
- package/src/runtime/redirects.ts +66 -0
- package/src/runtime/redis.ts +7 -2
- package/src/runtime/request-options.ts +680 -1
- package/src/runtime/resolver-config.ts +6 -0
- package/src/runtime/resolver-public.ts +23 -0
- package/src/runtime/resolver-shared.ts +33 -0
- package/src/runtime/resolver-vendors/bindings.ts +56 -0
- package/src/runtime/resolver-vendors/browser.ts +533 -0
- package/src/runtime/resolver-vendors/capsolver.ts +707 -0
- package/src/runtime/resolver-vendors/hosts.ts +38 -0
- package/src/runtime/resolver-vendors/twocaptcha.ts +540 -0
- package/src/runtime/resolver-vendors/types.ts +212 -0
- package/src/runtime/resolver.ts +1157 -0
- package/src/runtime/secrets.ts +64 -0
- package/src/runtime/state.ts +394 -77
- package/src/runtime/stealth-cookies.ts +132 -0
- package/src/runtime/stealth.ts +1280 -336
- package/src/runtime/stt.ts +1 -19
- package/src/runtime/timeout.ts +18 -0
- package/src/runtime/trace-config.ts +78 -0
- package/src/runtime/trace.ts +57 -17
- package/src/serve.ts +6 -1
- package/src/server/error-observability.ts +1 -0
- package/src/server/index.ts +34 -2
- package/src/server/self-test-input-tokens.ts +29 -14
- package/src/server/self-test.ts +191 -68
- package/src/server/serve-implementation.ts +3378 -0
- package/src/server/serve.ts +1 -1632
- package/src/server/trace-output.ts +129 -0
- package/src/server/types.ts +13 -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 +287 -0
- package/src/stateful/stateful-provider-runtime-context.ts +92 -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 +202 -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 +658 -15
- package/src/trace-sanitization.ts +63 -0
- package/src/types.ts +788 -174
- package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
- package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
- /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
- /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
- /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
- /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
- /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
- /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
- /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
- /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
- /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
- /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
- /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
- /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
package/src/runtime/stt.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
VerificationCodeCandidateSource,
|
|
15
15
|
VerificationCodeExtractionResult,
|
|
16
16
|
} from "../types.js";
|
|
17
|
+
import { createTimeoutController, isTimeoutLikeError } from "./timeout.js";
|
|
17
18
|
|
|
18
19
|
export const APIFUSE__STT__BACKEND_ENV = "APIFUSE__STT__BACKEND";
|
|
19
20
|
export const APIFUSE__STT__MODEL_ENV = "APIFUSE__STT__MODEL";
|
|
@@ -169,15 +170,6 @@ function normalizeCloudflareLanguage(language: Bcp47Locale | undefined): string
|
|
|
169
170
|
return language?.split("-")[0]?.toLowerCase();
|
|
170
171
|
}
|
|
171
172
|
|
|
172
|
-
function isTimeoutLikeError(error: unknown): error is Error {
|
|
173
|
-
return (
|
|
174
|
-
error instanceof Error &&
|
|
175
|
-
(error.name === "AbortError" ||
|
|
176
|
-
error.name === "TimeoutError" ||
|
|
177
|
-
/\b(timed out|timeout|deadline exceeded)\b/i.test(error.message))
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
173
|
function toSttTransportError(error: unknown): TransportError {
|
|
182
174
|
if (error instanceof TransportError) return error;
|
|
183
175
|
if (isTimeoutLikeError(error)) {
|
|
@@ -194,16 +186,6 @@ function toSttTransportError(error: unknown): TransportError {
|
|
|
194
186
|
});
|
|
195
187
|
}
|
|
196
188
|
|
|
197
|
-
function createTimeoutController(signalTimeoutMs: number): {
|
|
198
|
-
controller: AbortController;
|
|
199
|
-
clear: () => void;
|
|
200
|
-
} {
|
|
201
|
-
const controller = new AbortController();
|
|
202
|
-
const timeout = setTimeout(() => controller.abort(), signalTimeoutMs);
|
|
203
|
-
timeout.unref?.();
|
|
204
|
-
return { controller, clear: () => clearTimeout(timeout) };
|
|
205
|
-
}
|
|
206
|
-
|
|
207
189
|
function toCloudflareInput(request: SttTranscribeRequest): Record<string, unknown> {
|
|
208
190
|
const prompt = resolveSttPrompt(request);
|
|
209
191
|
const input: Record<string, unknown> = {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function isTimeoutLikeError(error: unknown): error is Error {
|
|
2
|
+
return (
|
|
3
|
+
error instanceof Error &&
|
|
4
|
+
(error.name === "AbortError" ||
|
|
5
|
+
error.name === "TimeoutError" ||
|
|
6
|
+
/\b(timed out|timeout|deadline exceeded)\b/i.test(error.message))
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function createTimeoutController(signalTimeoutMs: number): {
|
|
11
|
+
controller: AbortController;
|
|
12
|
+
clear: () => void;
|
|
13
|
+
} {
|
|
14
|
+
const controller = new AbortController();
|
|
15
|
+
const timeout = setTimeout(() => controller.abort(), signalTimeoutMs);
|
|
16
|
+
timeout.unref?.();
|
|
17
|
+
return { controller, clear: () => clearTimeout(timeout) };
|
|
18
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { TraceConfig } from "../types.js";
|
|
2
|
+
|
|
3
|
+
/** SDK-owned environment variable names for server trace output. */
|
|
4
|
+
export const APIFUSE__TRACE__ENABLED = "APIFUSE__TRACE__ENABLED";
|
|
5
|
+
export const APIFUSE__TRACE__EXPORTER = "APIFUSE__TRACE__EXPORTER";
|
|
6
|
+
|
|
7
|
+
type EnvLike = Record<string, string | undefined>;
|
|
8
|
+
|
|
9
|
+
const TRACE_EXPORTER_LOOKUP: Record<NonNullable<TraceConfig["exporter"]>, true> = {
|
|
10
|
+
console: true,
|
|
11
|
+
json: true,
|
|
12
|
+
otlp: true,
|
|
13
|
+
none: true,
|
|
14
|
+
};
|
|
15
|
+
const TRACE_EXPORTERS = new Set(Object.keys(TRACE_EXPORTER_LOOKUP));
|
|
16
|
+
|
|
17
|
+
const emittedWarnings = new Set<string>();
|
|
18
|
+
|
|
19
|
+
function warnOnce(key: string, message: string): void {
|
|
20
|
+
if (emittedWarnings.has(key)) return;
|
|
21
|
+
emittedWarnings.add(key);
|
|
22
|
+
console.warn(message);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function parseEnabled(raw: string | undefined): boolean | undefined {
|
|
26
|
+
if (raw === undefined) return undefined;
|
|
27
|
+
switch (raw.trim().toLowerCase()) {
|
|
28
|
+
case "1":
|
|
29
|
+
case "true":
|
|
30
|
+
case "yes":
|
|
31
|
+
case "on":
|
|
32
|
+
return true;
|
|
33
|
+
case "0":
|
|
34
|
+
case "false":
|
|
35
|
+
case "no":
|
|
36
|
+
case "off":
|
|
37
|
+
return false;
|
|
38
|
+
default:
|
|
39
|
+
warnOnce(
|
|
40
|
+
APIFUSE__TRACE__ENABLED,
|
|
41
|
+
"[apifuse] Invalid APIFUSE__TRACE__ENABLED; falling back to disabled tracing.",
|
|
42
|
+
);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve server trace output configuration from SDK-owned environment
|
|
49
|
+
* variables. Invalid exporter values fail closed so a provider cannot crash at
|
|
50
|
+
* startup because of an observability setting.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveTraceConfigFromEnv(env: EnvLike = process.env): TraceConfig | undefined {
|
|
53
|
+
const enabledRaw = env[APIFUSE__TRACE__ENABLED];
|
|
54
|
+
const exporterRaw = env[APIFUSE__TRACE__EXPORTER];
|
|
55
|
+
|
|
56
|
+
if (enabledRaw === undefined && exporterRaw === undefined) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const enabled = parseEnabled(enabledRaw);
|
|
61
|
+
const normalizedExporter = exporterRaw?.trim().toLowerCase();
|
|
62
|
+
const exporter = TRACE_EXPORTERS.has(normalizedExporter as NonNullable<TraceConfig["exporter"]>)
|
|
63
|
+
? (normalizedExporter as NonNullable<TraceConfig["exporter"]>)
|
|
64
|
+
: exporterRaw === undefined
|
|
65
|
+
? undefined
|
|
66
|
+
: "none";
|
|
67
|
+
if (exporterRaw !== undefined && exporter === "none" && normalizedExporter !== "none") {
|
|
68
|
+
warnOnce(
|
|
69
|
+
APIFUSE__TRACE__EXPORTER,
|
|
70
|
+
`[apifuse] Invalid APIFUSE__TRACE__EXPORTER value "${normalizedExporter ?? exporterRaw}"; supported exporters are "console", "json", "otlp", and "none"; falling back to exporter "none".`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
...(enabled !== undefined ? { enabled } : {}),
|
|
76
|
+
...(exporter !== undefined ? { exporter } : {}),
|
|
77
|
+
};
|
|
78
|
+
}
|
package/src/runtime/trace.ts
CHANGED
|
@@ -21,6 +21,11 @@ export interface CreateTraceContextOptions {
|
|
|
21
21
|
onSpan?: (span: Span) => void;
|
|
22
22
|
exportOptions?: OTLPExportOptions;
|
|
23
23
|
resourceAttributes?: Record<string, string>;
|
|
24
|
+
/**
|
|
25
|
+
* Applied to a detached copy of each span immediately before OTLP export; never touches
|
|
26
|
+
* getSpans() or onSpan. Returning nothing (or throwing) drops that export batch.
|
|
27
|
+
*/
|
|
28
|
+
sanitizeSpanForExport?: (span: Span) => Span | undefined;
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
type SpanHookOptions<T> = {
|
|
@@ -41,6 +46,8 @@ type PendingSpan = {
|
|
|
41
46
|
type CompletedSpanEntry = {
|
|
42
47
|
sequence: number;
|
|
43
48
|
span: Span;
|
|
49
|
+
/** Set once the span has been handed to the exporter so no batch re-sends it. */
|
|
50
|
+
exported: boolean;
|
|
44
51
|
};
|
|
45
52
|
|
|
46
53
|
export interface TraceRecorder {
|
|
@@ -51,8 +58,6 @@ export const TRACE_RECORDER = Symbol.for("@apifuse/provider-sdk/runtime/trace-re
|
|
|
51
58
|
|
|
52
59
|
type InternalTraceContext = TraceContext & {
|
|
53
60
|
[TRACE_RECORDER]: TraceRecorder;
|
|
54
|
-
_exportOptions?: OTLPExportOptions;
|
|
55
|
-
_resourceAttributes?: Record<string, string>;
|
|
56
61
|
};
|
|
57
62
|
|
|
58
63
|
function buildOTLPExportOptions(config?: TraceConfig): OTLPExportOptions | undefined {
|
|
@@ -124,6 +129,20 @@ function insertCompletedSpan(
|
|
|
124
129
|
}
|
|
125
130
|
}
|
|
126
131
|
|
|
132
|
+
/** Hands the hook a copy whose attributes are detached from the recorded span; a hook that returns nothing fails closed. */
|
|
133
|
+
function prepareSpanForExport(
|
|
134
|
+
span: Span,
|
|
135
|
+
sanitize: CreateTraceContextOptions["sanitizeSpanForExport"],
|
|
136
|
+
): Span {
|
|
137
|
+
const copy: Span = { ...span, attributes: { ...span.attributes } };
|
|
138
|
+
if (!sanitize) return copy;
|
|
139
|
+
const sanitized = sanitize(copy);
|
|
140
|
+
if (!sanitized || typeof sanitized !== "object") {
|
|
141
|
+
throw new Error("sanitizeSpanForExport returned no span");
|
|
142
|
+
}
|
|
143
|
+
return sanitized;
|
|
144
|
+
}
|
|
145
|
+
|
|
127
146
|
export function getTraceRecorder(trace: BaseTraceContext): TraceRecorder | null {
|
|
128
147
|
return (trace as Partial<InternalTraceContext>)[TRACE_RECORDER] ?? null;
|
|
129
148
|
}
|
|
@@ -133,20 +152,41 @@ export function createTraceContext(options: CreateTraceContextOptions = {}): Tra
|
|
|
133
152
|
const completed: CompletedSpanEntry[] = [];
|
|
134
153
|
const activeSpanStorage = new AsyncLocalStorage<PendingSpan | undefined>();
|
|
135
154
|
let sequence = 0;
|
|
136
|
-
|
|
137
|
-
|
|
155
|
+
// Export configuration (which can carry collector credentials) stays in this closure;
|
|
156
|
+
// the context object handed to provider code never exposes it.
|
|
157
|
+
const exportOptions = options.exportOptions;
|
|
158
|
+
const exportResourceAttributes = options.resourceAttributes
|
|
159
|
+
? { ...options.resourceAttributes }
|
|
160
|
+
: undefined;
|
|
161
|
+
// One trace id per context so every export batch of this request shares it and
|
|
162
|
+
// two processes can never mint the same id.
|
|
163
|
+
const exportTraceId = crypto.randomUUID().replace(/-/g, "");
|
|
164
|
+
let exportScheduled = false;
|
|
165
|
+
|
|
166
|
+
// One pending batch per context: roots completing before the flush share it, and a span is
|
|
167
|
+
// handed to the exporter exactly once, so later roots never re-send earlier spans.
|
|
138
168
|
const scheduleExport = () => {
|
|
139
|
-
if (!
|
|
169
|
+
if (!exportOptions || exportScheduled) {
|
|
140
170
|
return;
|
|
141
171
|
}
|
|
172
|
+
exportScheduled = true;
|
|
142
173
|
|
|
143
|
-
const spans = completed.map((entry) => ({ ...entry.span }));
|
|
144
174
|
setImmediate(() => {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
175
|
+
exportScheduled = false;
|
|
176
|
+
const pending = completed.filter((entry) => !entry.exported);
|
|
177
|
+
for (const entry of pending) entry.exported = true;
|
|
178
|
+
if (pending.length === 0) return;
|
|
179
|
+
// Sanitization runs off the request path; a faulty sanitizer drops the batch, never the request.
|
|
180
|
+
let spans: Span[];
|
|
181
|
+
try {
|
|
182
|
+
spans = pending.map((entry) =>
|
|
183
|
+
prepareSpanForExport(entry.span, options.sanitizeSpanForExport),
|
|
184
|
+
);
|
|
185
|
+
} catch {
|
|
186
|
+
console.warn("[apifuse] OTLP export skipped; span sanitization failed.");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
void exportSpansOTLP(spans, exportOptions, exportResourceAttributes, exportTraceId);
|
|
150
190
|
});
|
|
151
191
|
};
|
|
152
192
|
|
|
@@ -189,7 +229,11 @@ export function createTraceContext(options: CreateTraceContextOptions = {}): Tra
|
|
|
189
229
|
...(pendingSpan.parentId ? { parentId: pendingSpan.parentId } : {}),
|
|
190
230
|
};
|
|
191
231
|
|
|
192
|
-
insertCompletedSpan(
|
|
232
|
+
insertCompletedSpan(
|
|
233
|
+
completed,
|
|
234
|
+
{ sequence: pendingSpan.sequence, span, exported: false },
|
|
235
|
+
maxSpans,
|
|
236
|
+
);
|
|
193
237
|
options.onSpan?.(span);
|
|
194
238
|
|
|
195
239
|
if (!pendingSpan.parentId) {
|
|
@@ -213,17 +257,13 @@ export function createTraceContext(options: CreateTraceContextOptions = {}): Tra
|
|
|
213
257
|
},
|
|
214
258
|
};
|
|
215
259
|
|
|
216
|
-
traceContext = {
|
|
260
|
+
const traceContext: InternalTraceContext = {
|
|
217
261
|
span(name, fn) {
|
|
218
262
|
return recorder.runSpan(name, fn);
|
|
219
263
|
},
|
|
220
264
|
getSpans() {
|
|
221
265
|
return completed.map((entry) => ({ ...entry.span }));
|
|
222
266
|
},
|
|
223
|
-
...(options.exportOptions ? { _exportOptions: options.exportOptions } : {}),
|
|
224
|
-
...(options.resourceAttributes
|
|
225
|
-
? { _resourceAttributes: { ...options.resourceAttributes } }
|
|
226
|
-
: {}),
|
|
227
267
|
[TRACE_RECORDER]: recorder,
|
|
228
268
|
};
|
|
229
269
|
|
package/src/serve.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { safeProviderErrorObservability } from "../error-observability.js";
|
package/src/server/index.ts
CHANGED
|
@@ -1,4 +1,33 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type {
|
|
2
|
+
ProxyCacheStatus,
|
|
3
|
+
ProxyProtocol,
|
|
4
|
+
ProxyUserAgentSource,
|
|
5
|
+
ProxyVendorName,
|
|
6
|
+
SmartproxyAllocatorBodyClass,
|
|
7
|
+
} from "../config/loader.js";
|
|
8
|
+
export type {
|
|
9
|
+
ProxyTelemetryLogPayload,
|
|
10
|
+
ProxyTelemetryResolvedPayload,
|
|
11
|
+
ProxyTelemetryUnresolvedPayload,
|
|
12
|
+
} from "../runtime/proxy-telemetry.js";
|
|
13
|
+
export {
|
|
14
|
+
createServerApp,
|
|
15
|
+
createServerAppAsync,
|
|
16
|
+
ERROR_OBSERVABILITY_HEADER,
|
|
17
|
+
type ErrorObservabilityDetails,
|
|
18
|
+
type ProviderServerCloseOptions,
|
|
19
|
+
type ProviderServerHandle,
|
|
20
|
+
type ProviderErrorCauseFrame,
|
|
21
|
+
type ProviderServerLogEvent,
|
|
22
|
+
type ProviderServerLogger,
|
|
23
|
+
type ProviderServerOperationExecutor,
|
|
24
|
+
type ProviderServerOperationExecutorInput,
|
|
25
|
+
type ProviderServerOptions,
|
|
26
|
+
type ProviderServerStatefulForwardEnvelope,
|
|
27
|
+
type ServeOptions,
|
|
28
|
+
serve,
|
|
29
|
+
} from "./serve.js";
|
|
30
|
+
export type { ProviderErrorObservability } from "../errors.js";
|
|
2
31
|
export {
|
|
3
32
|
computeSelfTestPlanDigest,
|
|
4
33
|
createSelfTestApp,
|
|
@@ -23,7 +52,10 @@ export {
|
|
|
23
52
|
SelfTestRequestSchema,
|
|
24
53
|
type SelfTestResponse,
|
|
25
54
|
} from "./self-test.js";
|
|
26
|
-
export {
|
|
55
|
+
export {
|
|
56
|
+
type InputDateTokenCalendar,
|
|
57
|
+
resolveHealthCheckInputDateTokens,
|
|
58
|
+
} from "./self-test-input-tokens.js";
|
|
27
59
|
export {
|
|
28
60
|
collectSelfTestSensitiveValues,
|
|
29
61
|
redactSelfTestText,
|
|
@@ -1,46 +1,61 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Relative
|
|
3
|
-
*
|
|
4
|
-
* so
|
|
2
|
+
* Relative date-token resolution for health-check case inputs and fixture
|
|
3
|
+
* requests. The calendar defaults to KST; callers that need UTC must opt in
|
|
4
|
+
* explicitly so UTC and KST do not silently disagree from 15:00–23:59 UTC.
|
|
5
5
|
*
|
|
6
|
-
* Supported token: `+<days>d` or `+<days>d:YYYYMMDD` (1..365 days ahead
|
|
6
|
+
* Supported token: `+<days>d` or `+<days>d:YYYYMMDD` (1..365 days ahead).
|
|
7
7
|
*/
|
|
8
|
-
const
|
|
8
|
+
const RELATIVE_DATE_TOKEN = /^\+(\d{1,3})d(?::(YYYYMMDD))?$/i;
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
export type InputDateTokenCalendar = "KST" | "UTC";
|
|
11
|
+
|
|
12
|
+
function dateFromDaysAhead(
|
|
11
13
|
daysAhead: number,
|
|
12
14
|
now = new Date(),
|
|
13
15
|
format: "YYYY-MM-DD" | "YYYYMMDD" = "YYYY-MM-DD",
|
|
16
|
+
calendar: InputDateTokenCalendar = "KST",
|
|
14
17
|
): string {
|
|
15
|
-
const
|
|
18
|
+
const calendarNow = new Date(now.getTime() + (calendar === "KST" ? 9 * 60 * 60 * 1000 : 0));
|
|
16
19
|
const date = new Date(
|
|
17
|
-
Date.UTC(
|
|
20
|
+
Date.UTC(
|
|
21
|
+
calendarNow.getUTCFullYear(),
|
|
22
|
+
calendarNow.getUTCMonth(),
|
|
23
|
+
calendarNow.getUTCDate() + daysAhead,
|
|
24
|
+
),
|
|
18
25
|
);
|
|
19
26
|
const isoDate = date.toISOString().slice(0, 10);
|
|
20
27
|
return format === "YYYYMMDD" ? isoDate.replace(/-/g, "") : isoDate;
|
|
21
28
|
}
|
|
22
29
|
|
|
23
|
-
export function resolveHealthCheckInputDateTokens(
|
|
30
|
+
export function resolveHealthCheckInputDateTokens(
|
|
31
|
+
value: unknown,
|
|
32
|
+
now = new Date(),
|
|
33
|
+
calendar: InputDateTokenCalendar = "KST",
|
|
34
|
+
): unknown {
|
|
24
35
|
if (typeof value === "string") {
|
|
25
|
-
const relative = value.match(
|
|
36
|
+
const relative = value.match(RELATIVE_DATE_TOKEN);
|
|
26
37
|
if (!relative) return value;
|
|
27
38
|
const daysAhead = Number(relative[1]);
|
|
28
39
|
if (!Number.isInteger(daysAhead) || daysAhead < 1 || daysAhead > 365) {
|
|
29
40
|
return value;
|
|
30
41
|
}
|
|
31
42
|
const format = relative[2]?.toUpperCase() === "YYYYMMDD" ? "YYYYMMDD" : "YYYY-MM-DD";
|
|
32
|
-
return
|
|
43
|
+
return dateFromDaysAhead(daysAhead, now, format, calendar);
|
|
33
44
|
}
|
|
34
45
|
if (Array.isArray(value)) {
|
|
35
|
-
|
|
46
|
+
const resolved = value.map((entry) => resolveHealthCheckInputDateTokens(entry, now, calendar));
|
|
47
|
+
return resolved.some((entry, index) => entry !== value[index]) ? resolved : value;
|
|
36
48
|
}
|
|
37
49
|
if (value && typeof value === "object") {
|
|
38
|
-
|
|
50
|
+
const resolved = Object.fromEntries(
|
|
39
51
|
Object.entries(value).map(([key, entry]) => [
|
|
40
52
|
key,
|
|
41
|
-
resolveHealthCheckInputDateTokens(entry, now),
|
|
53
|
+
resolveHealthCheckInputDateTokens(entry, now, calendar),
|
|
42
54
|
]),
|
|
43
55
|
);
|
|
56
|
+
return Object.entries(resolved).some(([key, entry]) => entry !== Reflect.get(value, key))
|
|
57
|
+
? resolved
|
|
58
|
+
: value;
|
|
44
59
|
}
|
|
45
60
|
return value;
|
|
46
61
|
}
|