@apifuse/provider-sdk 2.2.0-beta.26 → 2.2.0-beta.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/bin/apifuse-dev.ts +2 -2
  3. package/bin/apifuse-pack-smoke.ts +1 -1
  4. package/bin/apifuse-pack-types.ts +2 -1
  5. package/bin/apifuse-perf.ts +2 -4
  6. package/bin/apifuse-record.ts +1 -1
  7. package/dist/auth-turn/index.d.ts +1 -1
  8. package/dist/auth-turn/index.js +1 -1
  9. package/dist/ceremonies/index.js +52 -11
  10. package/dist/config/loader.d.ts +1 -1
  11. package/dist/config/loader.js +4 -2
  12. package/dist/contract-serialization.d.ts +1 -20
  13. package/dist/contract-serialization.js +8 -587
  14. package/dist/contract.d.ts +0 -2
  15. package/dist/contract.js +5 -9
  16. package/dist/index.d.ts +9 -8
  17. package/dist/index.js +6 -8
  18. package/dist/provider.d.ts +3 -2
  19. package/dist/provider.js +2 -2
  20. package/dist/runtime/auth-flow.js +1 -1
  21. package/dist/runtime/http.d.ts +1 -0
  22. package/dist/runtime/http.js +135 -12
  23. package/dist/runtime/instrumentation.js +1 -1
  24. package/dist/runtime/native-network-errors.d.ts +33 -0
  25. package/dist/runtime/native-network-errors.js +69 -0
  26. package/dist/runtime/native-network.d.ts +2 -33
  27. package/dist/runtime/native-network.js +2 -68
  28. package/dist/runtime/redis.d.ts +1 -1
  29. package/dist/runtime/redis.js +4 -2
  30. package/dist/runtime/resolver-config.d.ts +6 -0
  31. package/dist/runtime/resolver-config.js +6 -0
  32. package/dist/runtime/resolver-shared.d.ts +3 -0
  33. package/dist/runtime/resolver-shared.js +12 -0
  34. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +2 -1
  35. package/dist/runtime/resolver-vendors/twocaptcha.js +80 -43
  36. package/dist/runtime/resolver-vendors/types.d.ts +1 -1
  37. package/dist/runtime/resolver.d.ts +6 -10
  38. package/dist/runtime/resolver.js +19 -18
  39. package/dist/runtime/state.js +5 -115
  40. package/dist/runtime/stealth-cookies.d.ts +20 -0
  41. package/dist/runtime/stealth-cookies.js +111 -0
  42. package/dist/runtime/stealth.js +7 -130
  43. package/dist/schema.d.ts +0 -63
  44. package/dist/schema.js +8 -808
  45. package/dist/serve.d.ts +1 -1
  46. package/dist/serve.js +1 -1
  47. package/dist/server/index.d.ts +1 -1
  48. package/dist/server/index.js +1 -1
  49. package/dist/server/self-test.d.ts +13 -0
  50. package/dist/server/self-test.js +124 -46
  51. package/dist/server/serve-implementation.d.ts +199 -0
  52. package/dist/server/serve-implementation.js +2054 -0
  53. package/dist/server/serve.d.ts +1 -187
  54. package/dist/server/serve.js +1 -1827
  55. package/dist/stateful/errors.d.ts +5 -0
  56. package/dist/stateful/errors.js +10 -0
  57. package/dist/stateful/stateful-provider-session-routing.d.ts +1 -5
  58. package/dist/stateful/stateful-provider-session-routing.js +2 -10
  59. package/dist/stream.js +7 -1
  60. package/package.json +27 -2
  61. package/src/auth-turn/index.ts +1 -1
  62. package/src/ceremonies/index.ts +68 -18
  63. package/src/config/loader.ts +5 -2
  64. package/src/contract-serialization.ts +8 -859
  65. package/src/contract.ts +5 -16
  66. package/src/index.ts +18 -34
  67. package/src/provider.ts +12 -24
  68. package/src/runtime/auth-flow.ts +1 -1
  69. package/src/runtime/http.ts +155 -11
  70. package/src/runtime/instrumentation.ts +1 -1
  71. package/src/runtime/native-network-errors.ts +99 -0
  72. package/src/runtime/native-network.ts +16 -97
  73. package/src/runtime/redis.ts +7 -2
  74. package/src/runtime/resolver-config.ts +6 -0
  75. package/src/runtime/resolver-shared.ts +17 -0
  76. package/src/runtime/resolver-vendors/twocaptcha.ts +100 -49
  77. package/src/runtime/resolver-vendors/types.ts +1 -0
  78. package/src/runtime/resolver.ts +47 -22
  79. package/src/runtime/state.ts +5 -144
  80. package/src/runtime/stealth-cookies.ts +132 -0
  81. package/src/runtime/stealth.ts +14 -157
  82. package/src/schema.ts +9 -1060
  83. package/src/serve.ts +6 -1
  84. package/src/server/index.ts +1 -0
  85. package/src/server/self-test.ts +184 -59
  86. package/src/server/serve-implementation.ts +3024 -0
  87. package/src/server/serve.ts +1 -2661
  88. package/src/stateful/errors.ts +12 -0
  89. package/src/stateful/stateful-provider-session-routing.ts +2 -11
  90. package/src/stream.ts +8 -1
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export * from "./ceremonies/index.js";
3
3
  export * from "./choice-token.js";
4
4
  export type { ApiFuseConfig, BrowserConfig, ProxyProtocol, ProxyResolutionOptions, ProxyResolutionSource, ProxyVendorName, ResolvedProxyConfig, SessionConfig, } from "./config/loader.js";
5
5
  export { defineConfig, loadApiFuseConfig, resolveProxy } from "./config/loader.js";
6
- export { canonicalJson, digestProviderContract, extractProviderContract, type JsonPrimitive, type JsonValue, OutputTextTrustProjectionError, PROVIDER_CONTRACT_SCHEMA_VERSION, type ProviderContractOperation, type ProviderContractSnapshot, } from "./contract.js";
6
+ export { canonicalJson, digestProviderContract, extractProviderContract, type JsonPrimitive, type JsonValue, PROVIDER_CONTRACT_SCHEMA_VERSION, type ProviderContractOperation, type ProviderContractSnapshot, } from "./contract.js";
7
7
  export { centered, delayed, defineHealthJourney, defineOperation, defineProvider, defineSmsOtpMatcher, defineStreamOperation, every, type ProviderConfig, } from "./define.js";
8
8
  export type { DevServerOptions } from "./dev.js";
9
9
  export { createDevServer, startDevServer } from "./dev.js";
@@ -16,29 +16,30 @@ export * from "./recipes/gov-api.js";
16
16
  export * from "./recipes/rest-api.js";
17
17
  export { createFlowContext, createScratchpad } from "./runtime/auth-flow.js";
18
18
  export type { BrowserClientOptions } from "./runtime/browser.js";
19
- export { BrowserClient, createBrowserClient } from "./runtime/browser.js";
20
19
  export { APIFUSE__CACHE__KEY_PEPPER_ENV, createBypassProviderCache, createProviderCache, type ProviderCacheOptions, resetProviderCacheForTests, } from "./runtime/cache.js";
21
20
  export { type CreateProviderChoiceContextOptions, createProviderChoiceContext, createTestProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "./runtime/choice.js";
22
21
  export { type CreateCredentialContextOptions, createCredentialContext, } from "./runtime/credential.js";
23
22
  export { createEnvContext } from "./runtime/env.js";
24
23
  export { executeOperation } from "./runtime/executor.js";
25
24
  export { createHttpClient } from "./runtime/http.js";
26
- export { createNativeNetworkClient, createEnvVendorCredentialResolver, deriveNativeCredentialAffinityKey, NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, resolveNativeGatewayProxy, type NativeGatewayProxy, type NativeGatewayProxyResolutionInput, type NativeGatewayProxySkipReason, type NativeGatewayProxySynthesizer, type NativeGatewayProxySynthesisResult, type NativeGatewayProxySynthesisInput, type NativeNetworkClientOptions, type NativeNetworkErrorCode, type VendorCredentialLookup, type VendorCredentialResolver, } from "./runtime/native-network.js";
25
+ export { NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, } from "./runtime/native-network-errors.js";
26
+ export type { NativeGatewayProxy, NativeGatewayProxyResolutionInput, NativeGatewayProxySkipReason, NativeGatewayProxySynthesizer, NativeGatewayProxySynthesisResult, NativeGatewayProxySynthesisInput, NativeNetworkClientOptions, NativeNetworkErrorCode, VendorCredentialLookup, VendorCredentialResolver, } from "./runtime/native-network.js";
27
27
  export type { Insight, InsightSeverity } from "./runtime/insights.js";
28
28
  export { generateInsights } from "./runtime/insights.js";
29
29
  export { type InstrumentationOptions, type InstrumentedProviderContext, wrapWithInstrumentation, } from "./runtime/instrumentation.js";
30
- export { type PrevalidateResult, prevalidate } from "./runtime/prevalidate.js";
30
+ export type { PrevalidateResult } from "./runtime/prevalidate.js";
31
31
  export { getProviderBaseUrl } from "./runtime/provider.js";
32
- export { APIFUSE__CDP_POOL__URL, APIFUSE__RESOLVER__2CAPTCHA__API_KEY, APIFUSE__RESOLVER__CAPMONSTER__API_KEY, APIFUSE__RESOLVER__CAPSOLVER__API_KEY, APIFUSE__RESOLVER__TIMEOUT_MS, createResolverClientFromEnv, createUnsupportedResolverClient, DEFAULT_RESOLVER_TIMEOUT_MS, invalidateResolverSolution, type ResolverRuntimeOptions, } from "./runtime/resolver.js";
32
+ export { APIFUSE__CDP_POOL__URL, APIFUSE__RESOLVER__2CAPTCHA__API_KEY, APIFUSE__RESOLVER__CAPMONSTER__API_KEY, APIFUSE__RESOLVER__CAPSOLVER__API_KEY, APIFUSE__RESOLVER__TIMEOUT_MS, DEFAULT_RESOLVER_TIMEOUT_MS, } from "./runtime/resolver-config.js";
33
+ export { createUnsupportedResolverClient } from "./runtime/resolver-shared.js";
34
+ export type { ResolverRuntimeOptions } from "./runtime/resolver.js";
33
35
  export type { ResolverVendorTransport } from "./runtime/resolver-vendors/types.js";
34
36
  export { assertRequiredSecretsPresent, listMissingRequiredSecrets, MISSING_SECRET_CODE, } from "./runtime/secrets.js";
35
37
  export { createUnsupportedProviderRuntimeState, UnsupportedProviderStateError, } from "./runtime/state.js";
36
- export { createStealthClient } from "./runtime/stealth.js";
37
38
  export { APIFUSE__OCR__API_KEY_ENV, APIFUSE__OCR__BACKEND_ENV, APIFUSE__OCR__BASE_URL_ENV, APIFUSE__OCR__CLOUDFLARE_API_TOKEN_ENV, APIFUSE__OCR__MODEL_ENV, CLOUDFLARE_ACCOUNT_ID_ENV, CLOUDFLARE_WORKERS_AI_OCR_BACKEND, createCloudflareWorkersAiOcrClient, createOcrClientFromEnv, createOpenAiCompatibleOcrClient, createUnsupportedOcrClient, DEFAULT_CLOUDFLARE_WORKERS_AI_OCR_MODEL, extractCaptchaCandidates, OPENAI_COMPATIBLE_OCR_BACKEND, } from "./runtime/ocr.js";
38
39
  export { APIFUSE__STT__BACKEND_ENV, APIFUSE__STT__CLOUDFLARE_API_TOKEN_ENV, APIFUSE__STT__MODEL_ENV, createSttClientFromEnv, createUnsupportedSttClient, extractVerificationCode, resolveSttPrompt, } from "./runtime/stt.js";
39
40
  export { type CreateTraceContextOptions, createTraceContext, type Span, type TraceContext, } from "./runtime/trace.js";
40
- export { APIFUSE_TEXT_TRUST_META_KEY, APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, AUTO_TRUSTED_ZOD_STRING_FORMATS, collectOutputTextTrust, collectSensitivePaths, describeKey, field, fields, findUnclassifiedOutputTextPaths, isSensitiveSchema, OutputTextTrustCollectionError, OutputTextTrustSchemaError, redactPayload, type OutputTextTrustMap, type SensitiveFieldKind, type SensitiveFieldOptions, type SensitivePath, sensitive, textTrust, type TextTrust, type TextTrustMetadata, z, } from "./schema.js";
41
- export { createServerApp, ERROR_OBSERVABILITY_HEADER, type ServeOptions, serve, } from "./server/index.js";
41
+ export { APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, collectSensitivePaths, describeKey, field, fields, isSensitiveSchema, redactPayload, type SensitiveFieldKind, type SensitiveFieldOptions, type SensitivePath, sensitive, z, } from "./schema.js";
42
+ export { createServerApp, createServerAppAsync, ERROR_OBSERVABILITY_HEADER, type ServeOptions, serve, } from "./server/serve.js";
42
43
  export { getStealthProfile, listStealthProfiles } from "./stealth/profiles.js";
43
44
  export * from "./stream.js";
44
45
  export type { ApiFuseResponse, AuthConfig, AuthContext, AuthFlowDefinition, AuthFlowInputHandler, AuthFlowStartHandler, AuthMode, AuthTurn, Bcp47Locale, BrowserCookie, BrowserEngine, BrowserOptions, BrowserResourceBody, BrowserResourceDecision, BrowserResourceMethod, BrowserResourcePolicy, BrowserResourceRequest, BrowserResourceRoute, ChallengeSolution, ConnectionMode, ContextDeclaration, CookieJar, ContextScratchpad, CredentialContext, CredentialDeclaration, E164PhoneNumber, EnvContext, FlowContext, FlowContextStore, HealthCheckAssertionContext, HealthCheckCase, HealthCheckCaseResult, HealthCheckSuite, HealthCheckUnsupported, HealthJourneyDefinition, HealthJourneyEventContext, HealthJourneyGatewayContext, HealthJourneyJournalContext, HealthJourneyManualTriggerPolicy, HealthJourneyRunContext, HealthJourneyRunResult, HealthJourneySchedule, HealthScheduleRandomization, HealthJourneySmsContext, HealthJourneyStep, HttpClient, HttpMethod, HttpRedirectFailureReason, HttpRedirectPolicy, HttpRedirectPolicyMode, HttpResponse, HttpRetryOptions, HttpRetrySummary, HttpStreamResponse, IanaTimeZone, InferSchemaOutput, Iso3166Alpha2CountryCode, Iso4217CurrencyCode, Iso8601Duration, NativeContext, NativeNetworkClient, NativeNetworkCloseReason, NativeNetworkConnection, NativeNetworkConnectInput, NativeNetworkConnectOptions, NativeNetworkDynamicGrantOptions, NativeNetworkEgressGrant, NativeProviderConfig, NativeProviderContext, NativeProxyDrainHandler, NativeProxyEgressInfo, NativeProxyExpiringEvent, NativeProxyExpiringReason, NativeTcpDynamicEgressRule, NativeTcpEgressGrant, NativeTcpEgressRule, NativeTcpPortRange, NativeTcpTlsMode, NativeTlsConnectOptions, OcrCaptchaCandidate, OcrCaptchaOptions, OcrCaptchaResult, OcrContext, OcrImageInput, OcrRecognizeRequest, OcrResult, OcrWarning, OperationAnnotations, OperationApprovalPolicy, OperationContractMetadata, OperationDefinition, OperationDeprecationMetadata, OperationDocMeta, OperationErrorCode, ProviderErrorStatus, OperationHandlerResult, OperationInputExample, OperationLifecycle, OperationObservabilityConfig, OperationObservabilitySensitiveConfig, OperationRelationships, OperationRiskClass, OperationSensitivePath, OperationToolRouterMetadata, OperationTransport, OperationTransportKind, ProbeInterval, ProviderAccessConfig, ProviderAccessVisibility, ProviderCache, ProviderCacheGetOrSetOptions, ProviderCacheKeyOptions, ProviderCacheLookupMeta, ProviderCacheResponseMeta, ProviderCacheResult, ProviderChoiceBindingOptions, ProviderChoiceContext, ProviderChoiceIssueOptions, ProviderChoiceParseOptions, ProviderChallenge, ProviderChallengeKind, ProviderContext, ProviderDefinition, ProviderDeploymentOverrides, ProviderFileRef, ProviderFilesContext, ProviderHealthMonitorConfig, ProviderHealthProbeConfig, ProviderLocale, ProviderLocaleKey, ProviderLocaleKeyInput, ProviderLogoProfile, ProviderLogoSource, ProviderMeta, ProviderOcrConfig, ProviderProxyConfig, ProviderProxyMode, ProviderProxyPolicy, ProxiedOAuthConfig, ProviderProxyProvider, ProviderProxySessionAffinity, ProviderPublicConnectionMode, ProviderPublicProfile, ProviderReviewed, ProviderResolvedFile, ProviderResolverConfig, ProviderResolverVendor, ProviderRuntimeState, ProviderSecretDeclaration, ProviderStateDurationString, ProviderStateNamespace, ProviderStreamEvent, ProviderSttConfig, ProviderSttMode, ProviderSupportLevel, RequestOptions, RedirectRunReason, ResolverContext, Rfc3339Instant, SchemaLike, SmsOrigin, SmsOtpExtractionPattern, SmsOtpMatcherDefinition, SseMessage, StandardSchemaV1, StateCasResult, StateNamespaceOptions, StateNamespaceScope, StateValue, StateWriteOptions, StealthClient, StealthCookieStore, StealthCookieStoreV1, StealthFetchOptions, StealthPlatform, StealthProfile, StealthRedirectHop, StealthRedirectRunOptions, StealthRedirectRunResult, StealthResponse, StealthSession, StealthSessionCookies, SttAudioInput, SttContext, SttPromptPolicy, SttSegment, SttTranscribeMode, SttTranscribeRequest, SttTranscript, SttUnsupportedOptionPolicy, SttUsage, SttVerificationCodeOptions, SttWarning, TraceConfig, TraceSpan, VerificationCodeCandidate, VerificationCodeCandidateSource, VerificationCodeExtractionResult, } from "./types.js";
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ export * from "./auth.js";
3
3
  export * from "./ceremonies/index.js";
4
4
  export * from "./choice-token.js";
5
5
  export { defineConfig, loadApiFuseConfig, resolveProxy } from "./config/loader.js";
6
- export { canonicalJson, digestProviderContract, extractProviderContract, OutputTextTrustProjectionError, PROVIDER_CONTRACT_SCHEMA_VERSION, } from "./contract.js";
6
+ export { canonicalJson, digestProviderContract, extractProviderContract, PROVIDER_CONTRACT_SCHEMA_VERSION, } from "./contract.js";
7
7
  export { centered, delayed, defineHealthJourney, defineOperation, defineProvider, defineSmsOtpMatcher, defineStreamOperation, every, } from "./define.js";
8
8
  export { createDevServer, startDevServer } from "./dev.js";
9
9
  export * from "./errors.js";
@@ -14,27 +14,25 @@ export { lintOperation, lintProvider, } from "./lint.js";
14
14
  export * from "./recipes/gov-api.js";
15
15
  export * from "./recipes/rest-api.js";
16
16
  export { createFlowContext, createScratchpad } from "./runtime/auth-flow.js";
17
- export { BrowserClient, createBrowserClient } from "./runtime/browser.js";
18
17
  export { APIFUSE__CACHE__KEY_PEPPER_ENV, createBypassProviderCache, createProviderCache, resetProviderCacheForTests, } from "./runtime/cache.js";
19
18
  export { createProviderChoiceContext, createTestProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "./runtime/choice.js";
20
19
  export { createCredentialContext, } from "./runtime/credential.js";
21
20
  export { createEnvContext } from "./runtime/env.js";
22
21
  export { executeOperation } from "./runtime/executor.js";
23
22
  export { createHttpClient } from "./runtime/http.js";
24
- export { createNativeNetworkClient, createEnvVendorCredentialResolver, deriveNativeCredentialAffinityKey, NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, resolveNativeGatewayProxy, } from "./runtime/native-network.js";
23
+ export { NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, } from "./runtime/native-network-errors.js";
25
24
  export { generateInsights } from "./runtime/insights.js";
26
25
  export { wrapWithInstrumentation, } from "./runtime/instrumentation.js";
27
- export { prevalidate } from "./runtime/prevalidate.js";
28
26
  export { getProviderBaseUrl } from "./runtime/provider.js";
29
- export { APIFUSE__CDP_POOL__URL, APIFUSE__RESOLVER__2CAPTCHA__API_KEY, APIFUSE__RESOLVER__CAPMONSTER__API_KEY, APIFUSE__RESOLVER__CAPSOLVER__API_KEY, APIFUSE__RESOLVER__TIMEOUT_MS, createResolverClientFromEnv, createUnsupportedResolverClient, DEFAULT_RESOLVER_TIMEOUT_MS, invalidateResolverSolution, } from "./runtime/resolver.js";
27
+ export { APIFUSE__CDP_POOL__URL, APIFUSE__RESOLVER__2CAPTCHA__API_KEY, APIFUSE__RESOLVER__CAPMONSTER__API_KEY, APIFUSE__RESOLVER__CAPSOLVER__API_KEY, APIFUSE__RESOLVER__TIMEOUT_MS, DEFAULT_RESOLVER_TIMEOUT_MS, } from "./runtime/resolver-config.js";
28
+ export { createUnsupportedResolverClient } from "./runtime/resolver-shared.js";
30
29
  export { assertRequiredSecretsPresent, listMissingRequiredSecrets, MISSING_SECRET_CODE, } from "./runtime/secrets.js";
31
30
  export { createUnsupportedProviderRuntimeState, UnsupportedProviderStateError, } from "./runtime/state.js";
32
- export { createStealthClient } from "./runtime/stealth.js";
33
31
  export { APIFUSE__OCR__API_KEY_ENV, APIFUSE__OCR__BACKEND_ENV, APIFUSE__OCR__BASE_URL_ENV, APIFUSE__OCR__CLOUDFLARE_API_TOKEN_ENV, APIFUSE__OCR__MODEL_ENV, CLOUDFLARE_ACCOUNT_ID_ENV, CLOUDFLARE_WORKERS_AI_OCR_BACKEND, createCloudflareWorkersAiOcrClient, createOcrClientFromEnv, createOpenAiCompatibleOcrClient, createUnsupportedOcrClient, DEFAULT_CLOUDFLARE_WORKERS_AI_OCR_MODEL, extractCaptchaCandidates, OPENAI_COMPATIBLE_OCR_BACKEND, } from "./runtime/ocr.js";
34
32
  export { APIFUSE__STT__BACKEND_ENV, APIFUSE__STT__CLOUDFLARE_API_TOKEN_ENV, APIFUSE__STT__MODEL_ENV, createSttClientFromEnv, createUnsupportedSttClient, extractVerificationCode, resolveSttPrompt, } from "./runtime/stt.js";
35
33
  export { createTraceContext, } from "./runtime/trace.js";
36
- export { APIFUSE_TEXT_TRUST_META_KEY, APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, AUTO_TRUSTED_ZOD_STRING_FORMATS, collectOutputTextTrust, collectSensitivePaths, describeKey, field, fields, findUnclassifiedOutputTextPaths, isSensitiveSchema, OutputTextTrustCollectionError, OutputTextTrustSchemaError, redactPayload, sensitive, textTrust, z, } from "./schema.js";
37
- export { createServerApp, ERROR_OBSERVABILITY_HEADER, serve, } from "./server/index.js";
34
+ export { APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, collectSensitivePaths, describeKey, field, fields, isSensitiveSchema, redactPayload, sensitive, z, } from "./schema.js";
35
+ export { createServerApp, createServerAppAsync, ERROR_OBSERVABILITY_HEADER, serve, } from "./server/serve.js";
38
36
  export { getStealthProfile, listStealthProfiles } from "./stealth/profiles.js";
39
37
  export * from "./stream.js";
40
38
  export { DEFAULT_OPERATION_TRANSPORT, HttpRetryAfterPolicy, HttpRetryDelayStrategy, HttpRetryJitter, HttpRetryPreset, HttpRetryUnsafeMethodPolicy, PROBE_INTERVALS, STREAM_CHUNK_BYTES_MAX, STREAM_CHUNK_BYTES_MIN, STREAM_HEARTBEAT_MS_MAX, STREAM_HEARTBEAT_MS_MIN, STREAM_IDLE_TIMEOUT_MS_MAX, STREAM_IDLE_TIMEOUT_MS_MIN, STREAM_MAX_DURATION_MS_MAX, STREAM_MAX_DURATION_MS_MIN, } from "./types.js";
@@ -6,7 +6,8 @@ export { centered, delayed, defineHealthJourney, defineOperation, defineProvider
6
6
  export { AuthError, HttpRedirectError, isProviderError, isSessionExpiredError, isTransportError, ProviderError, SessionExpiredError, TransportError, ValidationError, } from "./errors.js";
7
7
  export { getProviderLocalePath, providerLocaleKey, qualifyProviderLocaleKey, } from "./i18n/index.js";
8
8
  export { type CreateProviderChoiceContextOptions, createProviderChoiceContext, createTestProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "./runtime/choice.js";
9
- export { APIFUSE_TEXT_TRUST_META_KEY, APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, AUTO_TRUSTED_ZOD_STRING_FORMATS, collectOutputTextTrust, collectSensitivePaths, describeKey, field, fields, findUnclassifiedOutputTextPaths, isSensitiveSchema, OutputTextTrustCollectionError, OutputTextTrustSchemaError, redactPayload, type OutputTextTrustMap, type SensitiveFieldKind, type SensitiveFieldOptions, type SensitivePath, sensitive, textTrust, type TextTrust, type TextTrustMetadata, z, } from "./schema.js";
9
+ export { APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, collectSensitivePaths, describeKey, field, fields, isSensitiveSchema, redactPayload, type SensitiveFieldKind, type SensitiveFieldOptions, type SensitivePath, sensitive, z, } from "./schema.js";
10
10
  export type { AuthAbortData, AuthAbortRetry, AuthFlowTerminalContext, AuthMode, AuthSafeData, AuthSafeJson, FlowContext, HealthCheckAssertionContext, HealthCheckCase, HealthCheckSuite, HealthCheckUnsupported, HealthJourneyDefinition, HealthJourneyEventContext, HealthJourneyManualTriggerPolicy, HealthJourneyRunContext, HealthJourneyRunResult, HealthScheduleRandomization, HttpRedirectFailureReason, HttpRedirectPolicy, HttpRedirectPolicyMode, HttpRetryOptions, HttpRetrySummary, InferSchemaOutput, NativeContext, NativeNetworkClient, NativeNetworkCloseReason, NativeNetworkConnection, NativeNetworkConnectInput, NativeNetworkConnectOptions, NativeNetworkDynamicGrantOptions, NativeNetworkEgressGrant, NativeProviderConfig, NativeProviderContext, NativeProxyDrainHandler, NativeProxyEgressInfo, NativeProxyExpiringEvent, NativeProxyExpiringReason, NativeTcpDynamicEgressRule, NativeTcpEgressGrant, NativeTcpEgressRule, NativeTcpPortRange, NativeTcpTlsMode, NativeTlsConnectOptions, OperationApprovalPolicy, OperationContractMetadata, OperationDefinition, OperationDocMeta, OperationErrorCode, ProviderErrorStatus, OperationInputExample, OperationLifecycle, OperationObservabilityConfig, OperationObservabilitySensitiveConfig, OperationRelationships, OperationRiskClass, OperationSensitivePath, OperationToolRouterMetadata, OperationTransport, ProviderAccessVisibility, ProviderChoiceBindingOptions, ProviderChoiceContext, ProviderChoiceIssueOptions, ProviderChoiceParseOptions, ProviderContext, ProviderDefinition, ProviderDeploymentOverrides, ProviderFileRef, ProviderFilesContext, ProviderLocale, ProviderLocaleKey, ProviderLocaleKeyInput, ProviderLogoProfile, ProviderProxyPolicy, ProxiedOAuthConfig, ProviderPublicConnectionMode, ProviderPublicProfile, ProviderResolvedFile, ProviderRuntimeState, ProviderStateDurationString, ProviderStateNamespace, ProviderSupportLevel, RedirectRunReason, SchemaLike, SmsOtpMatcherDefinition, StandardSchemaV1, StateCasResult, StateNamespaceOptions, StateNamespaceScope, StateValue, StateWriteOptions, } from "./types.js";
11
- export { createNativeNetworkClient, createEnvVendorCredentialResolver, deriveNativeCredentialAffinityKey, NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, resolveNativeGatewayProxy, type NativeGatewayProxy, type NativeGatewayProxyResolutionInput, type NativeGatewayProxySkipReason, type NativeGatewayProxySynthesizer, type NativeGatewayProxySynthesisResult, type NativeGatewayProxySynthesisInput, type NativeNetworkClientOptions, type NativeNetworkErrorCode, type VendorCredentialLookup, type VendorCredentialResolver, } from "./runtime/native-network.js";
11
+ export { NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, } from "./runtime/native-network-errors.js";
12
+ export type { NativeGatewayProxy, NativeGatewayProxyResolutionInput, NativeGatewayProxySkipReason, NativeGatewayProxySynthesizer, NativeGatewayProxySynthesisResult, NativeGatewayProxySynthesisInput, NativeNetworkClientOptions, NativeNetworkErrorCode, VendorCredentialLookup, VendorCredentialResolver, } from "./runtime/native-network.js";
12
13
  export { HttpRetryAfterPolicy, HttpRetryDelayStrategy, HttpRetryJitter, HttpRetryPreset, HttpRetryUnsafeMethodPolicy, } from "./types.js";
package/dist/provider.js CHANGED
@@ -5,6 +5,6 @@ export { centered, delayed, defineHealthJourney, defineOperation, defineProvider
5
5
  export { AuthError, HttpRedirectError, isProviderError, isSessionExpiredError, isTransportError, ProviderError, SessionExpiredError, TransportError, ValidationError, } from "./errors.js";
6
6
  export { getProviderLocalePath, providerLocaleKey, qualifyProviderLocaleKey, } from "./i18n/index.js";
7
7
  export { createProviderChoiceContext, createTestProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "./runtime/choice.js";
8
- export { APIFUSE_TEXT_TRUST_META_KEY, APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, AUTO_TRUSTED_ZOD_STRING_FORMATS, collectOutputTextTrust, collectSensitivePaths, describeKey, field, fields, findUnclassifiedOutputTextPaths, isSensitiveSchema, OutputTextTrustCollectionError, OutputTextTrustSchemaError, redactPayload, sensitive, textTrust, z, } from "./schema.js";
9
- export { createNativeNetworkClient, createEnvVendorCredentialResolver, deriveNativeCredentialAffinityKey, NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, resolveNativeGatewayProxy, } from "./runtime/native-network.js";
8
+ export { APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, collectSensitivePaths, describeKey, field, fields, isSensitiveSchema, redactPayload, sensitive, z, } from "./schema.js";
9
+ export { NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, } from "./runtime/native-network-errors.js";
10
10
  export { HttpRetryAfterPolicy, HttpRetryDelayStrategy, HttpRetryJitter, HttpRetryPreset, HttpRetryUnsafeMethodPolicy, } from "./types.js";
@@ -1,7 +1,7 @@
1
1
  import { ContextAccessError } from "../errors.js";
2
2
  import { createAuthFlowHelpers } from "../auth.js";
3
3
  import { createUnsupportedOcrClient } from "./ocr.js";
4
- import { createUnsupportedResolverClient } from "./resolver.js";
4
+ import { createUnsupportedResolverClient } from "./resolver-shared.js";
5
5
  import { createUnsupportedSttClient } from "./stt.js";
6
6
  function normalizeAllowedKeys(allowedKeys) {
7
7
  return new Set(allowedKeys.filter((key) => key.trim().length > 0));
@@ -4,5 +4,6 @@ export type HttpClientOptions = ProxyResolutionOptions & {
4
4
  warn?: (message: string) => void;
5
5
  userAgent?: string;
6
6
  onRetrySummary?: (summary: HttpRetrySummary) => void;
7
+ signal?: AbortSignal;
7
8
  };
8
9
  export declare function createHttpClient(baseUrl?: string, clientOptions?: HttpClientOptions): HttpClient;
@@ -11,10 +11,42 @@ function isHttpStatusOutcome(outcome) {
11
11
  function isDedupeSkipOutcome(outcome) {
12
12
  return "kind" in outcome && outcome.kind === "dedupe-skip";
13
13
  }
14
- async function sleep(ms) {
14
+ function toAmbientCancellationError(signal, error = signal.reason) {
15
+ if (error instanceof TransportError && error.code === "transport_cancelled") {
16
+ return error;
17
+ }
18
+ return new TransportError("Request cancelled", {
19
+ code: "transport_cancelled",
20
+ status: 0,
21
+ retryable: false,
22
+ ...(error !== undefined
23
+ ? { cause: error instanceof Error ? error : new Error(String(error)) }
24
+ : {}),
25
+ });
26
+ }
27
+ function throwIfAmbientAborted(signal) {
28
+ if (signal?.aborted)
29
+ throw toAmbientCancellationError(signal);
30
+ }
31
+ async function sleep(ms, signal) {
32
+ throwIfAmbientAborted(signal);
15
33
  if (ms <= 0)
16
34
  return;
17
- await new Promise((resolve) => setTimeout(resolve, ms));
35
+ if (!signal) {
36
+ await new Promise((resolve) => setTimeout(resolve, ms));
37
+ return;
38
+ }
39
+ await new Promise((resolve, reject) => {
40
+ const onAbort = () => {
41
+ clearTimeout(timer);
42
+ reject(toAmbientCancellationError(signal));
43
+ };
44
+ const timer = setTimeout(() => {
45
+ signal.removeEventListener("abort", onAbort);
46
+ resolve();
47
+ }, ms);
48
+ signal.addEventListener("abort", onAbort, { once: true });
49
+ });
18
50
  }
19
51
  function toUpstreamHttpError(status) {
20
52
  return new TransportError(`Upstream request failed with status ${status}`, {
@@ -53,7 +85,17 @@ function parseJson(body) {
53
85
  function isTimeoutMessage(message) {
54
86
  return /\b(timed out|timeout|deadline exceeded)\b/i.test(message);
55
87
  }
56
- function toHttpTransportError(error) {
88
+ function toHttpTransportError(error, ambientSignal, timeoutSignal) {
89
+ if (ambientSignal?.aborted) {
90
+ return toAmbientCancellationError(ambientSignal, error);
91
+ }
92
+ if (timeoutSignal?.aborted) {
93
+ return new TransportError("Request timed out", {
94
+ code: "transport_timeout",
95
+ status: 0,
96
+ ...(error instanceof Error ? { cause: error } : {}),
97
+ });
98
+ }
57
99
  if (error instanceof TransportError) {
58
100
  if (error.code) {
59
101
  return error;
@@ -125,6 +167,76 @@ function requireNativeResponseBody(response) {
125
167
  }
126
168
  return response.body;
127
169
  }
170
+ function mergeAbortSignals(...signals) {
171
+ const activeSignals = signals.filter((signal) => signal != null);
172
+ if (activeSignals.length === 0)
173
+ return undefined;
174
+ if (activeSignals.length === 1)
175
+ return activeSignals[0];
176
+ return AbortSignal.any(activeSignals);
177
+ }
178
+ function cancelStreamOnAbort(body, signal) {
179
+ if (!signal)
180
+ return body;
181
+ let reader;
182
+ let finished = false;
183
+ let streamController;
184
+ const cleanup = () => signal.removeEventListener("abort", onAbort);
185
+ const onAbort = () => {
186
+ if (finished)
187
+ return;
188
+ finished = true;
189
+ cleanup();
190
+ const reason = toAmbientCancellationError(signal);
191
+ streamController?.error(reason);
192
+ const cancellation = reader ? reader.cancel(reason) : body.cancel(reason);
193
+ void cancellation.catch(() => undefined).finally(() => reader?.releaseLock());
194
+ };
195
+ return new ReadableStream({
196
+ start(controller) {
197
+ streamController = controller;
198
+ signal.addEventListener("abort", onAbort, { once: true });
199
+ if (signal.aborted)
200
+ onAbort();
201
+ },
202
+ async pull(controller) {
203
+ try {
204
+ reader ??= body.getReader();
205
+ const chunk = await reader.read();
206
+ if (finished)
207
+ return;
208
+ if (chunk.done) {
209
+ finished = true;
210
+ cleanup();
211
+ controller.close();
212
+ reader.releaseLock();
213
+ return;
214
+ }
215
+ controller.enqueue(chunk.value);
216
+ }
217
+ catch (error) {
218
+ if (finished)
219
+ return;
220
+ finished = true;
221
+ cleanup();
222
+ controller.error(error);
223
+ reader?.releaseLock();
224
+ }
225
+ },
226
+ async cancel(reason) {
227
+ if (finished)
228
+ return;
229
+ finished = true;
230
+ cleanup();
231
+ try {
232
+ await (reader ? reader.cancel(reason) : body.cancel(reason));
233
+ }
234
+ finally {
235
+ reader?.releaseLock();
236
+ }
237
+ },
238
+ }, { highWaterMark: 0 });
239
+ }
128
240
  function sanitizeStreamErrors(body, serializedUrl) {
129
241
  if (serializedUrl.sensitiveValues.length === 0)
130
242
  return body;
@@ -154,9 +266,9 @@ function sanitizeStreamErrors(body, serializedUrl) {
154
266
  },
155
267
  }, { highWaterMark: 0 });
156
268
  }
157
- function toNativeHttpStreamResponse(response, serializedUrl) {
269
+ function toNativeHttpStreamResponse(response, serializedUrl, signal) {
158
270
  const headers = Object.fromEntries(response.headers.entries());
159
- const body = sanitizeStreamErrors(requireNativeResponseBody(response), serializedUrl);
271
+ const body = sanitizeStreamErrors(cancelStreamOnAbort(requireNativeResponseBody(response), signal), serializedUrl);
160
272
  return {
161
273
  body,
162
274
  headers,
@@ -418,15 +530,18 @@ async function fetchNativeHttp(baseUrl, url, method, options, clientOptions, war
418
530
  const serializedUrl = serializeHttpRequestUrl(baseUrl, url, options);
419
531
  const { requestUrl } = serializedUrl;
420
532
  const controller = options.timeout ? new AbortController() : undefined;
533
+ const signal = mergeAbortSignals(clientOptions.signal, controller?.signal);
421
534
  const timeoutHandle = options.timeout
422
535
  ? setTimeout(() => controller?.abort(), options.timeout)
423
536
  : undefined;
424
537
  let proxy;
425
538
  try {
539
+ throwIfAmbientAborted(clientOptions.signal);
426
540
  // Resolve inside the try (and after the timeout is armed) so allocator
427
541
  // failures are branded as TransportErrors and count against the request
428
542
  // deadline, exactly as an inline resolve would.
429
543
  proxy = await resolveNativeProxy(options, clientOptions, warn, proxyAttemptOffset);
544
+ throwIfAmbientAborted(clientOptions.signal);
430
545
  // For a registry allocator chain, skip an endpoint a prior attempt already
431
546
  // tried rather than re-issuing the same request. Returning the sentinel
432
547
  // (instead of breaking) lets the loop keep advancing the flat offset until
@@ -441,7 +556,7 @@ async function fetchNativeHttp(baseUrl, url, method, options, clientOptions, war
441
556
  headers: options.headers,
442
557
  method,
443
558
  ...(proxy ? { proxy } : {}),
444
- signal: controller?.signal,
559
+ ...(signal ? { signal } : {}),
445
560
  };
446
561
  if (options.body !== undefined) {
447
562
  requestInit.body = normalizeNativeFetchBody(options.body);
@@ -471,7 +586,7 @@ async function fetchNativeHttp(baseUrl, url, method, options, clientOptions, war
471
586
  if (error instanceof SyntaxError) {
472
587
  throw redactSensitiveError(error, serializedUrl.sensitiveValues, serializedUrl.requestUrl, serializedUrl.redactedUrl);
473
588
  }
474
- const transportError = redactSensitiveError(toHttpTransportError(error), serializedUrl.sensitiveValues, serializedUrl.requestUrl, serializedUrl.redactedUrl);
589
+ const transportError = redactSensitiveError(toHttpTransportError(error, clientOptions.signal, controller?.signal), serializedUrl.sensitiveValues, serializedUrl.requestUrl, serializedUrl.redactedUrl);
475
590
  transportError.proxyUsed = Boolean(proxy);
476
591
  throw transportError;
477
592
  }
@@ -484,16 +599,19 @@ async function fetchNativeHttpStream(baseUrl, url, method, options, clientOption
484
599
  const serializedUrl = serializeHttpRequestUrl(baseUrl, url, options);
485
600
  const { requestUrl } = serializedUrl;
486
601
  const controller = options.timeout ? new AbortController() : undefined;
602
+ const signal = mergeAbortSignals(clientOptions.signal, controller?.signal);
487
603
  const timeoutHandle = options.timeout
488
604
  ? setTimeout(() => controller?.abort(), options.timeout)
489
605
  : undefined;
490
606
  try {
607
+ throwIfAmbientAborted(clientOptions.signal);
491
608
  const proxy = await resolveNativeProxy(options, clientOptions, warn);
609
+ throwIfAmbientAborted(clientOptions.signal);
492
610
  const requestInit = {
493
611
  headers: options.headers,
494
612
  method,
495
613
  ...(proxy ? { proxy } : {}),
496
- signal: controller?.signal,
614
+ ...(signal ? { signal } : {}),
497
615
  };
498
616
  if (options.body !== undefined) {
499
617
  requestInit.body = normalizeNativeFetchBody(options.body);
@@ -506,13 +624,15 @@ async function fetchNativeHttpStream(baseUrl, url, method, options, clientOption
506
624
  status: response.status,
507
625
  });
508
626
  }
509
- return toNativeHttpStreamResponse(response, serializedUrl);
627
+ // Per-call timeout remains header-scoped, while the ambient request signal
628
+ // stays attached to the response body for its full consumption lifetime.
629
+ return toNativeHttpStreamResponse(response, serializedUrl, clientOptions.signal);
510
630
  }
511
631
  catch (error) {
512
632
  if (error instanceof SyntaxError) {
513
633
  throw redactSensitiveError(error, serializedUrl.sensitiveValues, serializedUrl.requestUrl, serializedUrl.redactedUrl);
514
634
  }
515
- throw redactSensitiveError(toHttpTransportError(error), serializedUrl.sensitiveValues, serializedUrl.requestUrl, serializedUrl.redactedUrl);
635
+ throw redactSensitiveError(toHttpTransportError(error, clientOptions.signal, controller?.signal), serializedUrl.sensitiveValues, serializedUrl.requestUrl, serializedUrl.redactedUrl);
516
636
  }
517
637
  finally {
518
638
  if (timeoutHandle)
@@ -616,6 +736,7 @@ export function createHttpClient(baseUrl, clientOptions = {}) {
616
736
  const dedupeContext = dedupeAllocatorEndpoints ? { attempted: new Set() } : undefined;
617
737
  const executeOnce = (proxyAttemptOffset = 0) => fetchNativeHttp(baseUrl, url, methodName, attemptOptions, clientOptions, warnOnce, statusRetryEnabled ? retryOptions?.statusCodes : undefined, proxyAttemptOffset, dedupeContext);
618
738
  if (!retryEnabled || !retryOptions) {
739
+ throwIfAmbientAborted(clientOptions.signal);
619
740
  const outcome = await executeOnce();
620
741
  if (isDedupeSkipOutcome(outcome)) {
621
742
  // Single-shot path never de-duplicates (dedupeContext is undefined),
@@ -639,6 +760,7 @@ export function createHttpClient(baseUrl, clientOptions = {}) {
639
760
  // allocations skip offsets.
640
761
  let issued = 0;
641
762
  for (let attempt = 1; attempt <= transportAttemptCap; attempt += 1) {
763
+ throwIfAmbientAborted(clientOptions.signal);
642
764
  // Whether this offset actually issued a request (vs. a skipped duplicate),
643
765
  // so the catch counts a thrown *transport* failure once without
644
766
  // double-counting a status outcome that already incremented before it
@@ -657,7 +779,7 @@ export function createHttpClient(baseUrl, clientOptions = {}) {
657
779
  if (isHttpStatusOutcome(outcome)) {
658
780
  lastStatus = outcome.status;
659
781
  if (outcome.retryable && issued < retryOptions.attempts) {
660
- await sleep(computeProxyTransportRetryDelayMs(retryOptions, attempt, outcome.headers));
782
+ await sleep(computeProxyTransportRetryDelayMs(retryOptions, attempt, outcome.headers), clientOptions.signal);
661
783
  continue;
662
784
  }
663
785
  throw toUpstreamHttpError(outcome.status);
@@ -680,6 +802,7 @@ export function createHttpClient(baseUrl, clientOptions = {}) {
680
802
  return response;
681
803
  }
682
804
  catch (error) {
805
+ throwIfAmbientAborted(clientOptions.signal);
683
806
  if (!issuedThisAttempt)
684
807
  issued += 1;
685
808
  lastError = error;
@@ -694,7 +817,7 @@ export function createHttpClient(baseUrl, clientOptions = {}) {
694
817
  options: retryOptions,
695
818
  proxyUsed,
696
819
  })) {
697
- await sleep(computeProxyTransportRetryDelayMs(retryOptions, attempt));
820
+ await sleep(computeProxyTransportRetryDelayMs(retryOptions, attempt), clientOptions.signal);
698
821
  continue;
699
822
  }
700
823
  throw error;
@@ -1,7 +1,7 @@
1
1
  import { readableBytes, readableLines, readableTextChunks } from "../stream.js";
2
2
  import { parseHttpRequestInvocation, isSensitiveKey, redactSensitiveError, redactSensitiveText, redactUrlQueryParams, requestOptionsFromHttpInvocation, serializeRequestUrl, } from "./request-options.js";
3
3
  import { createTraceContext, getTraceRecorder, } from "./trace.js";
4
- import { RESOLVER_INSTRUMENTATION_METADATA } from "./resolver.js";
4
+ import { RESOLVER_INSTRUMENTATION_METADATA } from "./resolver-shared.js";
5
5
  const BROWSER_PAGE_METHODS = new Set(["goto", "fill", "click", "type", "waitForSelector"]);
6
6
  const DIAGNOSTIC_BASE_URL = "http://apifuse-instrumentation.invalid";
7
7
  function isThenable(value) {
@@ -0,0 +1,33 @@
1
+ import { TransportError } from "../errors.js";
2
+ export type NativeNetworkErrorCode = "native_connection_aborted" | "native_connection_closed" | "native_connection_failed" | "native_connection_idle_timeout" | "native_connection_timeout" | "native_egress_authorization_failed" | "native_egress_grant_expired" | "native_egress_grant_invalid" | "native_egress_grant_limit_exceeded" | "native_egress_input_invalid" | "native_egress_not_declared" | "native_egress_policy_invalid" | "native_dynamic_egress_unsupported" | "native_proxy_expired" | "native_proxy_invalid";
3
+ export declare class NativeNetworkError extends TransportError {
4
+ constructor(message: string, code: NativeNetworkErrorCode, cause?: Error);
5
+ get code(): NativeNetworkErrorCode;
6
+ }
7
+ export declare function safeDiagnosticEgressHost(value: unknown): string;
8
+ export declare class NativeProxyExpiredError extends NativeNetworkError {
9
+ readonly expiresAt: string;
10
+ constructor(expiresAt: string);
11
+ }
12
+ /** Raised before transport setup when a native destination is not authorized. */
13
+ export declare class NativeEgressNotDeclaredError extends NativeNetworkError {
14
+ readonly port: number;
15
+ readonly tls: "required" | "disabled";
16
+ readonly host: string;
17
+ constructor(host: string, port: number, tls: "required" | "disabled");
18
+ }
19
+ /**
20
+ * Raised when the destination was authorized by a grant whose TTL elapsed and
21
+ * its expiry remains in the client's bounded recent-expiry evidence window.
22
+ */
23
+ export declare class NativeEgressGrantExpiredError extends NativeNetworkError {
24
+ readonly port: number;
25
+ readonly tls: "required" | "disabled";
26
+ readonly expiresAt: string;
27
+ readonly host: string;
28
+ constructor(host: string, port: number, tls: "required" | "disabled", expiresAt: string);
29
+ }
30
+ /** Raised when an established connection exceeds its opt-in read-idle window. */
31
+ export declare class NativeIdleTimeoutError extends NativeNetworkError {
32
+ constructor();
33
+ }
@@ -0,0 +1,69 @@
1
+ import { TransportError } from "../errors.js";
2
+ import { canonicalizeEgressHost } from "../native-address.js";
3
+ export class NativeNetworkError extends TransportError {
4
+ constructor(message, code, cause) {
5
+ const isEgressPolicyFailure = code.startsWith("native_egress_") || code === "native_dynamic_egress_unsupported";
6
+ super(message, {
7
+ code,
8
+ status: 0,
9
+ ...(cause ? { cause } : {}),
10
+ ...(isEgressPolicyFailure ? { category: "provider_error", retryable: false } : {}),
11
+ });
12
+ this.name = "NativeNetworkError";
13
+ }
14
+ get code() {
15
+ return super.code;
16
+ }
17
+ }
18
+ export function safeDiagnosticEgressHost(value) {
19
+ const canonical = canonicalizeEgressHost(value);
20
+ return canonical.ok ? canonical.host : `<invalid-host:${canonical.reason}>`;
21
+ }
22
+ export class NativeProxyExpiredError extends NativeNetworkError {
23
+ expiresAt;
24
+ constructor(expiresAt) {
25
+ super("Native connection closed at sticky proxy expiry", "native_proxy_expired");
26
+ this.expiresAt = expiresAt;
27
+ this.name = "NativeProxyExpiredError";
28
+ }
29
+ }
30
+ /** Raised before transport setup when a native destination is not authorized. */
31
+ export class NativeEgressNotDeclaredError extends NativeNetworkError {
32
+ port;
33
+ tls;
34
+ host;
35
+ constructor(host, port, tls) {
36
+ const diagnosticHost = safeDiagnosticEgressHost(host);
37
+ super(`Native ${tls === "required" ? "TLS" : "TCP"} egress is not declared for ${diagnosticHost}:${port}`, "native_egress_not_declared");
38
+ this.port = port;
39
+ this.tls = tls;
40
+ this.host = diagnosticHost;
41
+ this.name = "NativeEgressNotDeclaredError";
42
+ }
43
+ }
44
+ /**
45
+ * Raised when the destination was authorized by a grant whose TTL elapsed and
46
+ * its expiry remains in the client's bounded recent-expiry evidence window.
47
+ */
48
+ export class NativeEgressGrantExpiredError extends NativeNetworkError {
49
+ port;
50
+ tls;
51
+ expiresAt;
52
+ host;
53
+ constructor(host, port, tls, expiresAt) {
54
+ const diagnosticHost = safeDiagnosticEgressHost(host);
55
+ super(`Native ${tls === "required" ? "TLS" : "TCP"} egress grant expired for ${diagnosticHost}:${port}`, "native_egress_grant_expired");
56
+ this.port = port;
57
+ this.tls = tls;
58
+ this.expiresAt = expiresAt;
59
+ this.host = diagnosticHost;
60
+ this.name = "NativeEgressGrantExpiredError";
61
+ }
62
+ }
63
+ /** Raised when an established connection exceeds its opt-in read-idle window. */
64
+ export class NativeIdleTimeoutError extends NativeNetworkError {
65
+ constructor() {
66
+ super("Native network socket timed out while reading.", "native_connection_idle_timeout");
67
+ this.name = "NativeIdleTimeoutError";
68
+ }
69
+ }
@@ -1,40 +1,10 @@
1
1
  import { Socket } from "node:net";
2
2
  import { type TLSSocket } from "node:tls";
3
3
  import { type ProxyProtocol } from "../config/loader.js";
4
- import { TransportError } from "../errors.js";
5
4
  import { type DynamicEgressRuleSnapshot } from "../native-egress-policy.js";
6
5
  import type { NativeNetworkClient, NativeNetworkConnectInput, NativeNetworkConnection, NativeNetworkDynamicGrantOptions, NativeNetworkEgressGrant, NativeProviderConfig, NativeProxyEgressInfo, ProviderProxyPolicy, ProviderProxyProvider, EnvContext } from "../types.js";
7
- export type NativeNetworkErrorCode = "native_connection_aborted" | "native_connection_closed" | "native_connection_failed" | "native_connection_idle_timeout" | "native_connection_timeout" | "native_egress_authorization_failed" | "native_egress_grant_expired" | "native_egress_grant_invalid" | "native_egress_grant_limit_exceeded" | "native_egress_input_invalid" | "native_egress_not_declared" | "native_egress_policy_invalid" | "native_dynamic_egress_unsupported" | "native_proxy_expired" | "native_proxy_invalid";
8
- export declare class NativeNetworkError extends TransportError {
9
- constructor(message: string, code: NativeNetworkErrorCode, cause?: Error);
10
- get code(): NativeNetworkErrorCode;
11
- }
12
- export declare class NativeProxyExpiredError extends NativeNetworkError {
13
- readonly expiresAt: string;
14
- constructor(expiresAt: string);
15
- }
16
- /** Raised before transport setup when a native destination is not authorized. */
17
- export declare class NativeEgressNotDeclaredError extends NativeNetworkError {
18
- readonly port: number;
19
- readonly tls: "required" | "disabled";
20
- readonly host: string;
21
- constructor(host: string, port: number, tls: "required" | "disabled");
22
- }
23
- /**
24
- * Raised when the destination was authorized by a grant whose TTL elapsed and
25
- * its expiry remains in the client's bounded recent-expiry evidence window.
26
- */
27
- export declare class NativeEgressGrantExpiredError extends NativeNetworkError {
28
- readonly port: number;
29
- readonly tls: "required" | "disabled";
30
- readonly expiresAt: string;
31
- readonly host: string;
32
- constructor(host: string, port: number, tls: "required" | "disabled", expiresAt: string);
33
- }
34
- /** Raised when an established connection exceeds its opt-in read-idle window. */
35
- export declare class NativeIdleTimeoutError extends NativeNetworkError {
36
- constructor();
37
- }
6
+ export { NativeEgressGrantExpiredError, NativeEgressNotDeclaredError, NativeIdleTimeoutError, NativeNetworkError, NativeProxyExpiredError, } from "./native-network-errors.js";
7
+ export type { NativeNetworkErrorCode } from "./native-network-errors.js";
38
8
  export type NativeGatewayProxy = NativeProxyEgressInfo & {
39
9
  readonly url: string;
40
10
  };
@@ -124,4 +94,3 @@ export declare function createNativeEgressAuthorization(options: NativeNetworkCl
124
94
  };
125
95
  /** Create the SDK byte-stream runtime with provider-declared egress enforcement. */
126
96
  export declare function createNativeNetworkClient(options?: NativeNetworkClientOptions): NativeNetworkClient;
127
- export {};