@apifuse/provider-sdk 2.1.0-beta.9 → 2.2.0-beta.10

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 (263) hide show
  1. package/AUTHORING.md +240 -0
  2. package/CHANGELOG.md +93 -0
  3. package/README.md +26 -10
  4. package/SUBMISSION.md +11 -12
  5. package/bin/apifuse-check.ts +44 -59
  6. package/bin/apifuse-create.ts +1 -1
  7. package/bin/apifuse-dev.ts +27 -52
  8. package/bin/apifuse-pack-check.ts +36 -0
  9. package/bin/apifuse-pack-smoke.ts +22 -81
  10. package/bin/apifuse-pack-types.ts +266 -0
  11. package/bin/apifuse-perf.ts +45 -127
  12. package/bin/apifuse-record.ts +53 -70
  13. package/bin/apifuse-submit-check.ts +2177 -353
  14. package/bin/apifuse-sync-assets.ts +117 -0
  15. package/bin/apifuse.ts +1 -1
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/bin/submit-check-xml-semantics.ts +204 -0
  18. package/bin/submit-check-xml.ts +134 -0
  19. package/dist/auth-turn/auth-turn.v1.schema.json +89 -0
  20. package/dist/auth-turn/fixtures/invalid/empty-kind.json +4 -0
  21. package/dist/auth-turn/fixtures/invalid/expires-at-not-string.json +5 -0
  22. package/dist/auth-turn/fixtures/invalid/missing-kind.json +3 -0
  23. package/dist/auth-turn/fixtures/invalid/missing-turn-id.json +3 -0
  24. package/dist/auth-turn/fixtures/invalid/timing-unknown-field.json +7 -0
  25. package/dist/auth-turn/fixtures/invalid/turn-id-snake-case.json +4 -0
  26. package/dist/auth-turn/fixtures/invalid/unknown-top-level-field.json +5 -0
  27. package/dist/auth-turn/fixtures/valid/abort.json +8 -0
  28. package/dist/auth-turn/fixtures/valid/challenge.json +17 -0
  29. package/dist/auth-turn/fixtures/valid/complete.json +13 -0
  30. package/dist/auth-turn/fixtures/valid/form.json +14 -0
  31. package/dist/auth-turn/fixtures/valid/message.json +13 -0
  32. package/dist/auth-turn/fixtures/valid/multi_choice.json +15 -0
  33. package/dist/auth-turn/fixtures/valid/pending.json +5 -0
  34. package/dist/auth-turn/fixtures/valid/poll.json +9 -0
  35. package/dist/auth-turn/fixtures/valid/redirect.json +16 -0
  36. package/dist/auth-turn/fixtures/valid/retry.json +8 -0
  37. package/dist/auth-turn/fixtures/valid/unknown-kind.json +7 -0
  38. package/dist/auth-turn/index.d.ts +195 -0
  39. package/dist/auth-turn/index.js +133 -0
  40. package/dist/auth.d.ts +76 -0
  41. package/dist/auth.js +427 -0
  42. package/dist/ceremonies/index.d.ts +1 -1
  43. package/dist/ceremonies/index.js +14 -48
  44. package/dist/cli/commands.d.ts +1 -1
  45. package/dist/cli/commands.js +8 -0
  46. package/dist/cli/create.d.ts +3 -0
  47. package/dist/cli/create.js +47 -33
  48. package/dist/cli/prompt-assets.d.ts +80 -0
  49. package/dist/cli/prompt-assets.js +743 -0
  50. package/dist/cli/templates/provider/.agents/skills/fixtures-and-recording/SKILL.md.tpl +58 -0
  51. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +65 -0
  52. package/dist/cli/templates/provider/.agents/skills/normalization-standards/SKILL.md.tpl +57 -0
  53. package/dist/cli/templates/provider/.agents/skills/pagination-and-counts/SKILL.md.tpl +52 -0
  54. package/dist/cli/templates/provider/.agents/skills/upstream-contract-verification/SKILL.md.tpl +45 -0
  55. package/dist/cli/templates/provider/.agents/skills/upstream-notes/README.md.tpl +13 -0
  56. package/dist/cli/templates/provider/.dockerignore.tpl +22 -0
  57. package/dist/cli/templates/provider/.gitignore.tpl +22 -0
  58. package/dist/cli/templates/provider/AGENTS.md.tpl +96 -0
  59. package/dist/cli/templates/provider/Dockerfile.tpl +7 -0
  60. package/dist/cli/templates/provider/README.md.tpl +163 -0
  61. package/dist/cli/templates/provider/dev.ts.tpl +5 -0
  62. package/dist/cli/templates/provider/domain/README.md.tpl +3 -0
  63. package/dist/cli/templates/provider/index.test.ts.tpl +13 -0
  64. package/dist/cli/templates/provider/index.ts.tpl +15 -0
  65. package/dist/cli/templates/provider/mappers/README.md.tpl +3 -0
  66. package/dist/cli/templates/provider/meta.ts.tpl +7 -0
  67. package/dist/cli/templates/provider/operations/index.ts.tpl +5 -0
  68. package/dist/cli/templates/provider/operations/ping.ts.tpl +24 -0
  69. package/dist/cli/templates/provider/schemas/ping.ts.tpl +24 -0
  70. package/dist/cli/templates/provider/start.ts.tpl +5 -0
  71. package/dist/cli/templates/provider/upstream/README.md.tpl +3 -0
  72. package/dist/config/loader.d.ts +149 -8
  73. package/dist/config/loader.js +378 -89
  74. package/dist/contract-serialization.d.ts +2 -2
  75. package/dist/contract-serialization.js +3 -6
  76. package/dist/contract-types.d.ts +2 -2
  77. package/dist/contract.d.ts +3 -3
  78. package/dist/contract.js +5 -6
  79. package/dist/define.d.ts +13 -1
  80. package/dist/define.js +245 -178
  81. package/dist/dev.d.ts +1 -1
  82. package/dist/dev.js +1 -1
  83. package/dist/errors.d.ts +4 -1
  84. package/dist/errors.js +48 -0
  85. package/dist/i18n/catalog.d.ts +2 -2
  86. package/dist/i18n/catalog.js +4 -10
  87. package/dist/i18n/index.d.ts +2 -2
  88. package/dist/i18n/index.js +2 -2
  89. package/dist/i18n/keys.d.ts +2 -2
  90. package/dist/index.d.ts +44 -41
  91. package/dist/index.js +39 -36
  92. package/dist/lint.d.ts +1 -0
  93. package/dist/lint.js +35 -15
  94. package/dist/provider.d.ts +11 -9
  95. package/dist/provider.js +9 -8
  96. package/dist/public-schema-field-lint.d.ts +1 -1
  97. package/dist/recipes/gov-api.js +1 -1
  98. package/dist/runtime/auth-flow.d.ts +1 -1
  99. package/dist/runtime/auth-flow.js +4 -2
  100. package/dist/runtime/browser.d.ts +1 -1
  101. package/dist/runtime/browser.js +214 -25
  102. package/dist/runtime/cache.d.ts +1 -1
  103. package/dist/runtime/cache.js +4 -8
  104. package/dist/runtime/choice.d.ts +1 -1
  105. package/dist/runtime/choice.js +31 -35
  106. package/dist/runtime/credential.d.ts +1 -1
  107. package/dist/runtime/credential.js +1 -1
  108. package/dist/runtime/env.d.ts +1 -1
  109. package/dist/runtime/executor.d.ts +1 -1
  110. package/dist/runtime/executor.js +15 -3
  111. package/dist/runtime/http.d.ts +2 -2
  112. package/dist/runtime/http.js +160 -344
  113. package/dist/runtime/insights.d.ts +1 -1
  114. package/dist/runtime/insights.js +6 -13
  115. package/dist/runtime/instrumentation.d.ts +2 -2
  116. package/dist/runtime/instrumentation.js +56 -19
  117. package/dist/runtime/keyring.js +1 -1
  118. package/dist/runtime/namespace.js +1 -1
  119. package/dist/runtime/otlp.d.ts +1 -1
  120. package/dist/runtime/perf.d.ts +1 -1
  121. package/dist/runtime/provider.d.ts +1 -1
  122. package/dist/runtime/provider.js +1 -2
  123. package/dist/runtime/proxy-errors.d.ts +1 -1
  124. package/dist/runtime/proxy-errors.js +9 -7
  125. package/dist/runtime/proxy-nodemaven.d.ts +35 -0
  126. package/dist/runtime/proxy-nodemaven.js +128 -0
  127. package/dist/runtime/proxy-retry-policy.d.ts +40 -0
  128. package/dist/runtime/proxy-retry-policy.js +326 -0
  129. package/dist/runtime/proxy-telemetry.d.ts +2 -1
  130. package/dist/runtime/proxy-telemetry.js +55 -52
  131. package/dist/runtime/redis.d.ts +1 -1
  132. package/dist/runtime/redis.js +2 -4
  133. package/dist/runtime/request-options.d.ts +1 -1
  134. package/dist/runtime/secrets.d.ts +27 -0
  135. package/dist/runtime/secrets.js +51 -0
  136. package/dist/runtime/state.d.ts +2 -2
  137. package/dist/runtime/state.js +15 -4
  138. package/dist/runtime/stealth.d.ts +7 -4
  139. package/dist/runtime/stealth.js +257 -215
  140. package/dist/runtime/stt.d.ts +1 -1
  141. package/dist/runtime/stt.js +11 -15
  142. package/dist/runtime/trace.d.ts +2 -2
  143. package/dist/runtime/trace.js +2 -4
  144. package/dist/runtime/waterfall.d.ts +1 -1
  145. package/dist/schema.d.ts +1 -1
  146. package/dist/schema.js +7 -15
  147. package/dist/serve.d.ts +1 -1
  148. package/dist/serve.js +1 -1
  149. package/dist/server/index.d.ts +7 -3
  150. package/dist/server/index.js +6 -2
  151. package/dist/server/self-test-input-tokens.d.ts +1 -0
  152. package/dist/server/self-test-input-tokens.js +37 -0
  153. package/dist/server/self-test-redaction.d.ts +20 -0
  154. package/dist/server/self-test-redaction.js +70 -0
  155. package/dist/server/self-test-token.d.ts +30 -0
  156. package/dist/server/self-test-token.js +50 -0
  157. package/dist/server/self-test.d.ts +199 -0
  158. package/dist/server/self-test.js +1113 -0
  159. package/dist/server/serve.d.ts +14 -3
  160. package/dist/server/serve.js +135 -64
  161. package/dist/server/types.d.ts +10 -9
  162. package/dist/server/types.js +3 -7
  163. package/dist/stealth/profiles.d.ts +1 -1
  164. package/dist/stealth/profiles.js +5 -14
  165. package/dist/stream.d.ts +1 -1
  166. package/dist/testing/index.d.ts +2 -2
  167. package/dist/testing/index.js +2 -2
  168. package/dist/testing/run.d.ts +1 -1
  169. package/dist/testing/run.js +12 -15
  170. package/dist/types.d.ts +237 -1
  171. package/dist/user-input.d.ts +30 -0
  172. package/dist/user-input.js +66 -0
  173. package/package.json +16 -5
  174. package/src/auth-turn/auth-turn.v1.schema.json +89 -0
  175. package/src/auth-turn/fixtures/invalid/empty-kind.json +4 -0
  176. package/src/auth-turn/fixtures/invalid/expires-at-not-string.json +5 -0
  177. package/src/auth-turn/fixtures/invalid/missing-kind.json +3 -0
  178. package/src/auth-turn/fixtures/invalid/missing-turn-id.json +3 -0
  179. package/src/auth-turn/fixtures/invalid/timing-unknown-field.json +7 -0
  180. package/src/auth-turn/fixtures/invalid/turn-id-snake-case.json +4 -0
  181. package/src/auth-turn/fixtures/invalid/unknown-top-level-field.json +5 -0
  182. package/src/auth-turn/fixtures/valid/abort.json +8 -0
  183. package/src/auth-turn/fixtures/valid/challenge.json +17 -0
  184. package/src/auth-turn/fixtures/valid/complete.json +13 -0
  185. package/src/auth-turn/fixtures/valid/form.json +14 -0
  186. package/src/auth-turn/fixtures/valid/message.json +13 -0
  187. package/src/auth-turn/fixtures/valid/multi_choice.json +15 -0
  188. package/src/auth-turn/fixtures/valid/pending.json +5 -0
  189. package/src/auth-turn/fixtures/valid/poll.json +9 -0
  190. package/src/auth-turn/fixtures/valid/redirect.json +16 -0
  191. package/src/auth-turn/fixtures/valid/retry.json +8 -0
  192. package/src/auth-turn/fixtures/valid/unknown-kind.json +7 -0
  193. package/src/auth-turn/index.ts +177 -0
  194. package/src/auth.ts +728 -0
  195. package/src/ceremonies/index.ts +33 -121
  196. package/src/cli/commands.ts +10 -0
  197. package/src/cli/create.ts +69 -99
  198. package/src/cli/prompt-assets.ts +865 -0
  199. package/src/cli/templates/provider/.agents/skills/fixtures-and-recording/SKILL.md.tpl +58 -0
  200. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +65 -0
  201. package/src/cli/templates/provider/.agents/skills/normalization-standards/SKILL.md.tpl +57 -0
  202. package/src/cli/templates/provider/.agents/skills/pagination-and-counts/SKILL.md.tpl +52 -0
  203. package/src/cli/templates/provider/.agents/skills/upstream-contract-verification/SKILL.md.tpl +45 -0
  204. package/src/cli/templates/provider/.agents/skills/upstream-notes/README.md.tpl +13 -0
  205. package/src/cli/templates/provider/AGENTS.md.tpl +96 -0
  206. package/src/cli/templates/provider/README.md.tpl +7 -4
  207. package/src/config/loader.ts +543 -208
  208. package/src/contract-serialization.ts +5 -11
  209. package/src/contract-types.ts +2 -2
  210. package/src/contract.ts +13 -28
  211. package/src/define.ts +397 -528
  212. package/src/dev.ts +4 -9
  213. package/src/errors.ts +58 -5
  214. package/src/i18n/catalog.ts +10 -32
  215. package/src/i18n/index.ts +2 -2
  216. package/src/i18n/keys.ts +5 -11
  217. package/src/index.ts +64 -41
  218. package/src/lint.ts +122 -159
  219. package/src/provider.ts +40 -9
  220. package/src/public-schema-field-lint.ts +7 -33
  221. package/src/recipes/gov-api.ts +2 -5
  222. package/src/runtime/auth-flow.ts +6 -6
  223. package/src/runtime/browser.ts +320 -151
  224. package/src/runtime/cache.ts +20 -67
  225. package/src/runtime/choice.ts +79 -132
  226. package/src/runtime/credential.ts +2 -2
  227. package/src/runtime/env.ts +1 -1
  228. package/src/runtime/executor.ts +23 -20
  229. package/src/runtime/http.ts +216 -539
  230. package/src/runtime/insights.ts +15 -53
  231. package/src/runtime/instrumentation.ts +78 -65
  232. package/src/runtime/keyring.ts +7 -19
  233. package/src/runtime/namespace.ts +2 -7
  234. package/src/runtime/otlp.ts +12 -23
  235. package/src/runtime/perf.ts +1 -1
  236. package/src/runtime/provider.ts +4 -9
  237. package/src/runtime/proxy-errors.ts +29 -42
  238. package/src/runtime/proxy-nodemaven.ts +178 -0
  239. package/src/runtime/proxy-retry-policy.ts +469 -0
  240. package/src/runtime/proxy-telemetry.ts +79 -77
  241. package/src/runtime/redis.ts +4 -12
  242. package/src/runtime/request-options.ts +4 -13
  243. package/src/runtime/secrets.ts +64 -0
  244. package/src/runtime/state.ts +41 -110
  245. package/src/runtime/stealth.ts +331 -369
  246. package/src/runtime/stt.ts +38 -94
  247. package/src/runtime/trace.ts +14 -44
  248. package/src/runtime/waterfall.ts +5 -18
  249. package/src/schema.ts +23 -84
  250. package/src/serve.ts +1 -1
  251. package/src/server/index.ts +44 -3
  252. package/src/server/self-test-input-tokens.ts +46 -0
  253. package/src/server/self-test-redaction.ts +97 -0
  254. package/src/server/self-test-token.ts +70 -0
  255. package/src/server/self-test.ts +1450 -0
  256. package/src/server/serve.ts +206 -216
  257. package/src/server/types.ts +7 -19
  258. package/src/stealth/profiles.ts +10 -26
  259. package/src/stream.ts +8 -19
  260. package/src/testing/index.ts +2 -2
  261. package/src/testing/run.ts +24 -64
  262. package/src/types.ts +274 -1
  263. package/src/user-input.ts +118 -0
@@ -0,0 +1,5 @@
1
+ import { pingOperation } from "./ping";
2
+
3
+ export const operations = {
4
+ ping: pingOperation,
5
+ };
@@ -0,0 +1,24 @@
1
+ import { defineOperation } from "@apifuse/provider-sdk/provider";
2
+
3
+ import { pingInputSchema, pingOutputSchema } from "../schemas/ping";
4
+
5
+ export const pingOperation = defineOperation({
6
+ descriptionKey: "operations.ping.description",
7
+ input: pingInputSchema,
8
+ output: pingOutputSchema,
9
+ handler: async ({{HANDLER_CTX}}, input) => {
10
+ {{BROWSER_HANDLER_BLOCK}}
11
+ return {
12
+ ok: true,
13
+ message: "{{DISPLAY_NAME}} received: " + input.value{{BROWSER_RESPONSE_FIELDS}},
14
+ };
15
+ },
16
+ fixtures: {
17
+ request: { value: "hello" },
18
+ response: { ok: true, message: "{{DISPLAY_NAME}} received: hello" },
19
+ },
20
+ healthCheckUnsupported: {
21
+ reason:
22
+ "Generated local-only scaffold operation. Replace this with a real healthCheck for upstream-backed bounty operations when safe; keep healthCheckUnsupported only for destructive, paid, credential-sensitive, or otherwise unprobeable operations with a specific rationale.",
23
+ },
24
+ });
@@ -0,0 +1,24 @@
1
+ import { describeKey, z } from "@apifuse/provider-sdk/provider";
2
+
3
+ export const pingInputSchema = describeKey(
4
+ z.object({
5
+ value: describeKey(z.string(), "schemaDescriptions.input.value"),
6
+ }),
7
+ "schemaDescriptions.input.root",
8
+ );
9
+
10
+ export const pingOutputSchema = describeKey(
11
+ z.object({
12
+ ok: describeKey(z.boolean(), "schemaDescriptions.output.ok"),
13
+ message: describeKey(z.string(), "schemaDescriptions.output.message"),
14
+ pageTitle: describeKey(
15
+ z.string().optional(),
16
+ "schemaDescriptions.output.pageTitle",
17
+ ),
18
+ frameCount: describeKey(
19
+ z.number().int().nonnegative().optional(),
20
+ "schemaDescriptions.output.frameCount",
21
+ ),
22
+ }),
23
+ "schemaDescriptions.output.root",
24
+ );
@@ -0,0 +1,5 @@
1
+ import { serve } from "@apifuse/provider-sdk";
2
+
3
+ import provider from "./index";
4
+
5
+ await serve(provider, { port: Number(process.env.APIFUSE__RUNTIME__PORT) || 3000 });
@@ -0,0 +1,3 @@
1
+ # Upstream
2
+
3
+ Put upstream HTTP clients, auth ceremony helpers, request builders, and protocol-specific types here once the provider talks to the real upstream service.
@@ -1,5 +1,9 @@
1
- import Redis from "ioredis";
2
- import type { ProviderProxyPolicy, TraceConfig } from "../types";
1
+ import { Redis } from "ioredis";
2
+ import type { ProviderProxyPolicy, TraceConfig } from "../types.js";
3
+ import { type ProxyProtocol } from "../runtime/proxy-nodemaven.js";
4
+ export type { ProxyProtocol } from "../runtime/proxy-nodemaven.js";
5
+ /** Proxy vendors the SDK resolves natively (as opposed to the static env path). */
6
+ export type ProxyVendorName = "smartproxy" | "nodemaven";
3
7
  export declare const SMARTPROXY_APP_KEY_ENV = "APIFUSE__PROXY__SMARTPROXY_APP_KEY";
4
8
  export declare const SMARTPROXY_MAX_LIFETIME_MINUTES = 2000;
5
9
  export declare const DEFAULT_SMARTPROXY_POOL_SIZE = 20;
@@ -42,12 +46,33 @@ export type ProxyResolutionOptions = {
42
46
  affinityKey?: string;
43
47
  /** Zero-based proxy-pool attempt index used by SDK transports for failover. */
44
48
  proxyAttempt?: number;
49
+ /**
50
+ * Tunnelling protocols the calling transport can use. When a resolved
51
+ * protocol is not in this set the resolver fails with
52
+ * `PROXY_PROTOCOL_UNSUPPORTED` instead of silently downgrading. Unset means
53
+ * permissive (both protocols allowed).
54
+ */
55
+ transportProtocols?: readonly ProxyProtocol[];
56
+ /**
57
+ * Explicit protocol override. Internal — for the verification harness and
58
+ * tests, or an advanced caller. Normal callers omit it and each vendor uses
59
+ * its own benchmarked default protocol (see VENDOR_DEFAULT_PROTOCOL). Not an
60
+ * env var and not a provider-policy field.
61
+ */
62
+ protocol?: ProxyProtocol;
63
+ /**
64
+ * Gateway pool "refresh" generation. Bumped by transports on pool refresh to
65
+ * derive a fresh gateway session set (ignored by allocation-style vendors,
66
+ * whose refresh is driven by cache invalidation).
67
+ */
68
+ proxyRefreshEpoch?: number;
45
69
  telemetry?: ProxyTelemetrySink;
46
70
  };
47
71
  export type ProxyCacheStatus = "memory_hit" | "redis_hit" | "allocator" | "soft_stale_refresh" | "lock_wait" | "redis_error" | "redis_corrupt" | "disabled";
48
72
  export type SmartproxyAllocatorBodyClass = "network_error" | "http_error" | "empty" | "json_without_proxies" | "text_without_proxies" | "usable_proxy_endpoints";
49
73
  export type ProxyResolutionTelemetryEvent = {
50
- provider: "smartproxy";
74
+ provider: ProxyVendorName;
75
+ protocol?: ProxyProtocol;
51
76
  cacheStatus: ProxyCacheStatus;
52
77
  cacheHit: boolean;
53
78
  resolutionMs: number;
@@ -64,7 +89,7 @@ export type ProxyResolutionTelemetryEvent = {
64
89
  refreshes?: number;
65
90
  };
66
91
  export type ProxyAttemptTelemetryEvent = {
67
- provider: "smartproxy";
92
+ provider: ProxyVendorName;
68
93
  attempt: number;
69
94
  poolIndex?: number;
70
95
  proxyHash?: string;
@@ -73,22 +98,40 @@ export type ProxyAttemptTelemetryEvent = {
73
98
  status?: number;
74
99
  durationMs?: number;
75
100
  };
101
+ export type ProxyVendorFailoverTelemetryEvent = {
102
+ /** Vendor that failed or was skipped. */
103
+ vendor: ProxyVendorName;
104
+ /** Vendor tried next, or undefined when the chain is exhausted. */
105
+ nextVendor?: ProxyVendorName;
106
+ phase: "resolution" | "transport";
107
+ reason: "no_credentials" | "allocation_failed" | "pool_exhausted" | "protocol_unsupported";
108
+ attempt?: number;
109
+ };
76
110
  export type ProxyTelemetrySink = {
77
111
  recordProxyResolution(event: ProxyResolutionTelemetryEvent): void;
78
112
  recordProxyAttempt?(event: ProxyAttemptTelemetryEvent): void;
113
+ recordProxyVendorFailover?(event: ProxyVendorFailoverTelemetryEvent): void;
79
114
  };
80
115
  export type ResolvedProxyConfig = {
81
116
  shouldWarn: boolean;
82
117
  url?: string;
83
- source?: "explicit" | "env" | "config" | "smartproxy-allocator";
118
+ source?: "explicit" | "env" | "config" | "smartproxy-allocator" | "nodemaven-gateway";
119
+ protocol?: ProxyProtocol;
84
120
  diagnostics?: Record<string, string | number | boolean>;
85
121
  };
122
+ export type ProxyResolutionErrorCode = "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED" | "PROXY_PROTOCOL_UNSUPPORTED";
86
123
  export declare class ProxyResolutionError extends Error {
87
- readonly code: "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED";
124
+ readonly code: ProxyResolutionErrorCode;
88
125
  readonly telemetry?: ProxyResolutionTelemetryEvent;
89
- constructor(code: "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED", message: string, options?: {
126
+ readonly vendor?: ProxyVendorName;
127
+ readonly vendorChain?: ProxyVendorName[];
128
+ readonly protocol?: ProxyProtocol;
129
+ constructor(code: ProxyResolutionErrorCode, message: string, options?: {
90
130
  cause?: unknown;
91
131
  telemetry?: ProxyResolutionTelemetryEvent;
132
+ vendor?: ProxyVendorName;
133
+ vendorChain?: ProxyVendorName[];
134
+ protocol?: ProxyProtocol;
92
135
  });
93
136
  }
94
137
  type ProxyRedisClient = Pick<Redis, "connect" | "del" | "eval" | "get" | "on" | "pttl" | "set" | "status">;
@@ -99,9 +142,107 @@ export declare function __setProxyRedisForTests(redis: ProxyRedisClient | undefi
99
142
  export declare function __setSmartproxyAllocatorDeadlineMsForTests(deadlineMs: number | undefined): void;
100
143
  export declare function resolveProxyConfig(options?: ProxyResolutionOptions): ResolvedProxyConfig;
101
144
  export declare function resolveProxyConfigAsync(options?: ProxyResolutionOptions): Promise<ResolvedProxyConfig>;
145
+ /**
146
+ * Guard the No-MITM invariant: a resolved proxy URL must use a tunnelling scheme
147
+ * (http CONNECT or socks5) so the client TLS handshake reaches the origin
148
+ * end-to-end. Anything else would intercept TLS and break fingerprinting.
149
+ */
150
+ export declare function assertTunnelingScheme(url: string): void;
151
+ /**
152
+ * Ordered list of SDK-native proxy vendors declared by the policy. `providers`
153
+ * takes precedence over the legacy singular `provider`; the platform default
154
+ * env is the final fallback. Non-registry names (decodo/custom) are dropped so
155
+ * an all-static chain falls through to the legacy env-URL path unchanged.
156
+ */
157
+ export declare function resolveVendorChain(policy: ProviderProxyPolicy): ProxyVendorName[];
158
+ /**
159
+ * Total attempt span across a policy's vendor chain — the sum of each vendor's
160
+ * pool size. Transports use this so successive attempts rotate a vendor's pool
161
+ * and then fail over to the next vendor via the flat attempt index. With one
162
+ * vendor this equals that vendor's pool size (today's behaviour).
163
+ */
164
+ export declare function resolvePolicyProxyPoolSpan(policy: ProviderProxyPolicy): number;
165
+ /**
166
+ * Absolute upper bound on a chain's attempt span — the sum of each vendor's
167
+ * *maximum* pool size. Unlike `resolvePolicyProxyPoolSpan` (the configured
168
+ * span), this backstop is independent of `session.poolSize`, so it never
169
+ * truncates a legitimately large pool below the point where the flat attempt
170
+ * index would cross into the next vendor (e.g. a 50-slot NodeMaven pool).
171
+ */
172
+ export declare function maxPolicyProxyPoolSpan(policy: ProviderProxyPolicy): number;
173
+ /**
174
+ * Transport-retry attempt cap for a policy-managed request. A transport failure
175
+ * rotates the flat attempt index onto the *next* endpoint (and, once the index
176
+ * passes the primary vendor's pool span, the *next vendor*), so the cap must be
177
+ * the chain's full pool span for failover to reach the fallback vendor — the
178
+ * per-endpoint retry budget (default 3) never gets there.
179
+ *
180
+ * The span only widens beyond the caller's retry budget when ALL hold:
181
+ * - the request is policy-allocator managed (not a caller-supplied proxy URL);
182
+ * - the caller did NOT pin an explicit retry policy — `HttpRetryOptions.attempts`
183
+ * is the documented total-attempt ceiling and must be honoured verbatim;
184
+ * - the method is safe/idempotent — an unsafe request must never be duplicated
185
+ * across the pool even if some framework default would allow it;
186
+ * - the policy resolves a non-empty *registry* vendor chain (smartproxy /
187
+ * nodemaven). Static vendors (custom / decodo) and credential-less policies
188
+ * resolve no allocator pool, so every attempt would hit the same endpoint
189
+ * with no possible crossover — they keep the retry budget.
190
+ *
191
+ * The widened cap is bounded by the chain's true maximum span (sum of each
192
+ * vendor's max pool size), so a large NodeMaven pool (≤50) stays reachable and
193
+ * a pathological chain can never spin unbounded.
194
+ */
195
+ /**
196
+ * True when a policy request is in *implicit chain-rotation* mode: successive
197
+ * transport attempts rotate the flat index across the concatenated vendor pool
198
+ * spans (and, past the primary vendor's span, into the fallback vendor). This is
199
+ * the ONLY mode in which the transport loop widens its attempt cap AND
200
+ * de-duplicates repeated endpoints — the two behaviours must share one predicate
201
+ * so they never diverge. It holds when ALL of the widening conditions hold:
202
+ * - the request is policy-allocator managed (not a caller-supplied proxy URL);
203
+ * - the caller did NOT pin an explicit retry policy — its `attempts` ceiling is
204
+ * the documented contract and must be honoured verbatim against whatever
205
+ * endpoint each attempt resolves (even a repeated one), so no de-duplication;
206
+ * - the method is safe/idempotent — an unsafe request is never duplicated;
207
+ * - the policy resolves a non-empty registry vendor chain (smartproxy /
208
+ * nodemaven). Static vendors (custom / decodo) resolve the same URL every
209
+ * attempt, so there is nothing to rotate or de-duplicate.
210
+ */
211
+ export declare function policyRotatesTransportVendorChain(input: {
212
+ policy: ProviderProxyPolicy | undefined;
213
+ usesPolicyAllocator: boolean;
214
+ explicitRetry: boolean;
215
+ method: string;
216
+ }): boolean;
217
+ export declare function resolvePolicyTransportAttemptCap(input: {
218
+ policy: ProviderProxyPolicy | undefined;
219
+ usesPolicyAllocator: boolean;
220
+ retryAttempts: number;
221
+ explicitRetry: boolean;
222
+ method: string;
223
+ }): number;
224
+ /**
225
+ * A registry vendor chain (smartproxy/nodemaven) resolves a potentially
226
+ * *different* endpoint per flat attempt index, so a transport retry should
227
+ * advance across endpoints and de-duplicate once the chain stops yielding new
228
+ * ones. Static/custom/decodo policies (empty registry chain) resolve the *same*
229
+ * URL every attempt by design — retrying that same endpoint is intended, so the
230
+ * transport loop must not de-duplicate them.
231
+ */
232
+ export declare function policyResolvesRegistryVendorChain(policy: ProviderProxyPolicy | undefined): boolean;
233
+ /** Map a resolved proxy source label to the vendor that served it. */
234
+ export declare function vendorFromResolvedSource(source: ResolvedProxyConfig["source"]): ProxyVendorName | undefined;
235
+ /**
236
+ * Map a flat attempt index into (vendorIndex, poolIndex) by concatenating each
237
+ * vendor's pool space in chain order. With a single vendor this reduces to
238
+ * `attempt % poolSize`, preserving today's behaviour exactly.
239
+ */
240
+ export declare function mapFlatAttempt(flat: number, sizes: readonly number[]): {
241
+ vendorIndex: number;
242
+ poolIndex: number;
243
+ };
102
244
  export declare function clearProxyResolutionCache(): void;
103
245
  export declare function invalidateProxyResolutionCache(options?: ProxyResolutionOptions): boolean;
104
246
  export declare function invalidateProxyResolutionCacheAsync(options?: ProxyResolutionOptions): Promise<boolean>;
105
247
  export declare function defineConfig(config: ApiFuseConfig): ApiFuseConfig;
106
248
  export declare function loadApiFuseConfig(dir?: string): Promise<ApiFuseConfig>;
107
- export {};