@apifuse/provider-sdk 2.2.0-beta.61 → 2.2.0-beta.63

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 (258) hide show
  1. package/AUTHORING.md +268 -9
  2. package/CHANGELOG.md +8 -0
  3. package/README.md +1 -0
  4. package/bin/apifuse-check.ts +84 -2
  5. package/bin/apifuse-dev.ts +11 -31
  6. package/bin/apifuse-migrate-deployment.ts +200 -0
  7. package/bin/apifuse-pack-check.ts +11 -4
  8. package/bin/apifuse-pack-types.ts +191 -4
  9. package/bin/apifuse-record.ts +44 -32
  10. package/bin/apifuse-test.ts +3 -1
  11. package/dist/cli/commands.d.ts +1 -1
  12. package/dist/cli/commands.js +11 -0
  13. package/dist/cli/deployment-intent.d.ts +178 -0
  14. package/dist/cli/deployment-intent.js +277 -0
  15. package/dist/cli/migrate-deployment-intent.d.ts +132 -0
  16. package/dist/cli/migrate-deployment-intent.js +1552 -0
  17. package/dist/cli/migrate-provider-shape.d.ts +5 -1
  18. package/dist/cli/migrate-provider-shape.js +4 -2
  19. package/dist/cli/resolver-runtime.d.ts +21 -0
  20. package/dist/cli/resolver-runtime.js +31 -0
  21. package/dist/define.d.ts +3 -0
  22. package/dist/define.js +5 -0
  23. package/dist/dev.d.ts +3 -1
  24. package/dist/dev.js +6 -1
  25. package/dist/engine.d.ts +35 -1
  26. package/dist/engine.js +21 -2
  27. package/dist/error-resolution.d.ts +1 -0
  28. package/dist/error-resolution.js +54 -0
  29. package/dist/errors.d.ts +39 -1
  30. package/dist/errors.js +50 -0
  31. package/dist/handle-meta.d.ts +18 -2
  32. package/dist/handle-meta.js +30 -2
  33. package/dist/handle.d.ts +33 -12
  34. package/dist/handle.js +69 -24
  35. package/dist/i18n/error-messages.d.ts +86 -0
  36. package/dist/i18n/error-messages.js +192 -0
  37. package/dist/i18n/index.d.ts +1 -0
  38. package/dist/i18n/index.js +1 -0
  39. package/dist/i18n/keys.d.ts +12 -0
  40. package/dist/i18n/keys.js +76 -5
  41. package/dist/index.d.ts +10 -2
  42. package/dist/index.js +9 -1
  43. package/dist/lint.d.ts +10 -0
  44. package/dist/lint.js +440 -57
  45. package/dist/provider.d.ts +7 -5
  46. package/dist/provider.js +4 -2
  47. package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
  48. package/dist/runtime/browser-telemetry-binding.js +83 -0
  49. package/dist/runtime/browser-telemetry.d.ts +76 -0
  50. package/dist/runtime/browser-telemetry.js +165 -0
  51. package/dist/runtime/browser.d.ts +3 -0
  52. package/dist/runtime/browser.js +208 -47
  53. package/dist/runtime/cache-telemetry.d.ts +71 -0
  54. package/dist/runtime/cache-telemetry.js +177 -0
  55. package/dist/runtime/cache.js +67 -7
  56. package/dist/runtime/capability-response.d.ts +3 -0
  57. package/dist/runtime/capability-response.js +56 -0
  58. package/dist/runtime/capability-telemetry.d.ts +46 -0
  59. package/dist/runtime/capability-telemetry.js +68 -0
  60. package/dist/runtime/diagnostic-env.d.ts +3 -0
  61. package/dist/runtime/diagnostic-env.js +10 -1
  62. package/dist/runtime/engine-mode.d.ts +74 -0
  63. package/dist/runtime/engine-mode.js +152 -0
  64. package/dist/runtime/handle.js +15 -10
  65. package/dist/runtime/http-telemetry-binding.d.ts +10 -0
  66. package/dist/runtime/http-telemetry-binding.js +152 -0
  67. package/dist/runtime/http-telemetry-guard.d.ts +16 -0
  68. package/dist/runtime/http-telemetry-guard.js +202 -0
  69. package/dist/runtime/http-telemetry.d.ts +104 -0
  70. package/dist/runtime/http-telemetry.js +190 -0
  71. package/dist/runtime/http.d.ts +31 -0
  72. package/dist/runtime/http.js +356 -174
  73. package/dist/runtime/instrumentation.js +92 -13
  74. package/dist/runtime/ocr-telemetry.d.ts +82 -0
  75. package/dist/runtime/ocr-telemetry.js +192 -0
  76. package/dist/runtime/ocr.js +30 -8
  77. package/dist/runtime/request-telemetry.d.ts +2 -0
  78. package/dist/runtime/request-telemetry.js +2 -1
  79. package/dist/runtime/resolver-runtime-options.d.ts +14 -0
  80. package/dist/runtime/resolver-runtime-options.js +33 -0
  81. package/dist/runtime/resolver-shared.d.ts +3 -2
  82. package/dist/runtime/resolver-shared.js +4 -4
  83. package/dist/runtime/resolver-telemetry.d.ts +1 -0
  84. package/dist/runtime/resolver-telemetry.js +1 -1
  85. package/dist/runtime/resolver-vendors/browser.d.ts +2 -0
  86. package/dist/runtime/resolver-vendors/browser.js +46 -0
  87. package/dist/runtime/resolver-vendors/hosts.d.ts +21 -0
  88. package/dist/runtime/resolver-vendors/hosts.js +35 -0
  89. package/dist/runtime/resolver-vendors/hypersolutions.js +2 -2
  90. package/dist/runtime/resolver-vendors/types.d.ts +5 -4
  91. package/dist/runtime/resolver.d.ts +4 -1
  92. package/dist/runtime/resolver.js +46 -13
  93. package/dist/runtime/state-telemetry.d.ts +79 -0
  94. package/dist/runtime/state-telemetry.js +194 -0
  95. package/dist/runtime/state.d.ts +3 -0
  96. package/dist/runtime/state.js +26 -7
  97. package/dist/runtime/stealth-cookies.d.ts +5 -1
  98. package/dist/runtime/stealth-cookies.js +21 -1
  99. package/dist/runtime/stealth-owned-headers.d.ts +26 -0
  100. package/dist/runtime/stealth-owned-headers.js +37 -0
  101. package/dist/runtime/stealth-telemetry.d.ts +92 -0
  102. package/dist/runtime/stealth-telemetry.js +179 -0
  103. package/dist/runtime/stealth.d.ts +4 -1
  104. package/dist/runtime/stealth.js +228 -85
  105. package/dist/runtime/stt-telemetry.d.ts +77 -0
  106. package/dist/runtime/stt-telemetry.js +176 -0
  107. package/dist/runtime/stt.js +15 -6
  108. package/dist/server/error-stack-frames.d.ts +35 -0
  109. package/dist/server/error-stack-frames.js +219 -0
  110. package/dist/server/index.d.ts +9 -0
  111. package/dist/server/index.js +5 -0
  112. package/dist/server/sdk-version.d.ts +3 -0
  113. package/dist/server/sdk-version.js +19 -0
  114. package/dist/server/self-test.js +1 -18
  115. package/dist/server/sensitive-values.d.ts +1 -1
  116. package/dist/server/sensitive-values.js +9 -0
  117. package/dist/server/serve-implementation.d.ts +53 -2
  118. package/dist/server/serve-implementation.js +369 -123
  119. package/dist/server/types.d.ts +1 -0
  120. package/dist/server/types.js +7 -0
  121. package/dist/stateful/stateful-provider-owner-forwarder.js +22 -0
  122. package/dist/stateful/stateful-provider-runtime-context.d.ts +3 -0
  123. package/dist/stateful/stateful-provider-runtime-context.js +1 -0
  124. package/dist/types.d.ts +94 -1
  125. package/package.json +6 -1
  126. package/src/cli/commands.ts +14 -0
  127. package/src/cli/deployment-intent.ts +364 -0
  128. package/src/cli/migrate-deployment-intent.ts +1908 -0
  129. package/src/cli/migrate-provider-shape.ts +10 -4
  130. package/src/cli/resolver-runtime.ts +72 -0
  131. package/src/define.ts +13 -0
  132. package/src/dev.ts +9 -2
  133. package/src/engine.ts +38 -2
  134. package/src/error-resolution.ts +58 -0
  135. package/src/errors.ts +77 -1
  136. package/src/handle-meta.ts +39 -4
  137. package/src/handle.ts +121 -38
  138. package/src/i18n/error-messages.ts +255 -0
  139. package/src/i18n/index.ts +1 -0
  140. package/src/i18n/keys.ts +80 -6
  141. package/src/index.ts +91 -0
  142. package/src/lint.ts +552 -57
  143. package/src/provider.ts +20 -0
  144. package/src/runtime/browser-telemetry-binding.ts +92 -0
  145. package/src/runtime/browser-telemetry.ts +289 -0
  146. package/src/runtime/browser.ts +249 -65
  147. package/src/runtime/cache-telemetry.ts +247 -0
  148. package/src/runtime/cache.ts +68 -17
  149. package/src/runtime/capability-response.ts +53 -0
  150. package/src/runtime/capability-telemetry.ts +101 -0
  151. package/src/runtime/diagnostic-env.ts +11 -1
  152. package/src/runtime/engine-mode.ts +233 -0
  153. package/src/runtime/handle.ts +20 -10
  154. package/src/runtime/http-telemetry-binding.ts +162 -0
  155. package/src/runtime/http-telemetry-guard.ts +208 -0
  156. package/src/runtime/http-telemetry.ts +292 -0
  157. package/src/runtime/http.ts +457 -204
  158. package/src/runtime/instrumentation.ts +105 -16
  159. package/src/runtime/ocr-telemetry.ts +308 -0
  160. package/src/runtime/ocr.ts +109 -74
  161. package/src/runtime/request-telemetry.ts +2 -1
  162. package/src/runtime/resolver-runtime-options.ts +50 -0
  163. package/src/runtime/resolver-shared.ts +9 -4
  164. package/src/runtime/resolver-telemetry.ts +1 -1
  165. package/src/runtime/resolver-vendors/browser.ts +65 -7
  166. package/src/runtime/resolver-vendors/hosts.ts +43 -0
  167. package/src/runtime/resolver-vendors/hypersolutions.ts +2 -2
  168. package/src/runtime/resolver-vendors/types.ts +5 -4
  169. package/src/runtime/resolver.ts +64 -21
  170. package/src/runtime/state-telemetry.ts +298 -0
  171. package/src/runtime/state.ts +46 -45
  172. package/src/runtime/stealth-cookies.ts +24 -1
  173. package/src/runtime/stealth-owned-headers.ts +41 -0
  174. package/src/runtime/stealth-telemetry.ts +304 -0
  175. package/src/runtime/stealth.ts +355 -150
  176. package/src/runtime/stt-telemetry.ts +282 -0
  177. package/src/runtime/stt.ts +93 -71
  178. package/src/server/error-stack-frames.ts +214 -0
  179. package/src/server/index.ts +66 -0
  180. package/src/server/sdk-version.ts +22 -0
  181. package/src/server/self-test.ts +1 -21
  182. package/src/server/sensitive-values.ts +14 -0
  183. package/src/server/serve-implementation.ts +601 -157
  184. package/src/server/types.ts +7 -0
  185. package/src/stateful/stateful-provider-owner-forwarder.ts +23 -0
  186. package/src/stateful/stateful-provider-runtime-context.ts +4 -0
  187. package/src/types.ts +99 -1
  188. package/src/cli/__tests__/fixtures/migrate-operation-declaration/approval-override.ts.txt +0 -6
  189. package/src/cli/__tests__/fixtures/migrate-operation-declaration/codemod-syntax.ts.txt +0 -3
  190. package/src/cli/__tests__/fixtures/migrate-operation-declaration/connection-precedence.ts.txt +0 -10
  191. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-ambiguous-a.ts.txt +0 -3
  192. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-ambiguous-b.ts.txt +0 -3
  193. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-ambiguous-barrel.ts.txt +0 -2
  194. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-ambiguous-index.ts.txt +0 -3
  195. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-computed.ts.txt +0 -6
  196. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-cycle-a.ts.txt +0 -1
  197. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-cycle-b.ts.txt +0 -1
  198. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-cycle-index.ts.txt +0 -3
  199. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-daiso-barrel.ts.txt +0 -7
  200. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-daiso-catalog.ts.txt +0 -19
  201. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-daiso-docs.ts.txt +0 -6
  202. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-daiso-index.ts.txt +0 -3
  203. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-daiso-stores.ts.txt +0 -8
  204. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-indirect-config.ts.txt +0 -5
  205. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-nonstatic.ts.txt +0 -4
  206. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-package-index.ts.txt +0 -3
  207. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-reexport-index.ts.txt +0 -3
  208. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-reexport-leaf.ts.txt +0 -10
  209. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-reexport-one.ts.txt +0 -1
  210. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-reexport-two.ts.txt +0 -1
  211. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-runtime-composed-index.ts.txt +0 -3
  212. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-runtime-composed-one.ts.txt +0 -6
  213. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-runtime-composed-two.ts.txt +0 -6
  214. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-runtime-mixed-index.ts.txt +0 -14
  215. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-runtime-registry.ts.txt +0 -3
  216. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-star-package-barrel.ts.txt +0 -2
  217. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-star-package-index.ts.txt +0 -3
  218. package/src/cli/__tests__/fixtures/migrate-operation-declaration/discovery-star-package-leaf.ts.txt +0 -3
  219. package/src/cli/__tests__/fixtures/migrate-operation-declaration/docs-conflict.ts.txt +0 -8
  220. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-hoisted-array-spread.ts.txt +0 -15
  221. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-imported-array-spread.ts.txt +0 -9
  222. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-kebab-operation-id.ts.txt +0 -17
  223. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-map.ts.txt +0 -5
  224. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-mixed-array-spread.ts.txt +0 -24
  225. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-operation.ts.txt +0 -16
  226. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-snake-operation-id.ts.txt +0 -21
  227. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-duplicate-provider.ts.txt +0 -11
  228. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-id-unresolved.ts.txt +0 -7
  229. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-map.ts.txt +0 -3
  230. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-one-to-many.ts.txt +0 -18
  231. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-one-to-one.ts.txt +0 -13
  232. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoist-all.ts.txt +0 -31
  233. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoisted-const.ts.txt +0 -11
  234. package/src/cli/__tests__/fixtures/migrate-operation-declaration/imported-spread.ts.txt +0 -11
  235. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-map.ts.txt +0 -11
  236. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-cast-tail.ts.txt +0 -21
  237. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-ekitan.ts.txt +0 -11
  238. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-override.ts.txt +0 -14
  239. package/src/cli/__tests__/fixtures/migrate-operation-declaration/locale-canonical-en.json +0 -1
  240. package/src/cli/__tests__/fixtures/migrate-operation-declaration/locale-canonical-ja.json +0 -1
  241. package/src/cli/__tests__/fixtures/migrate-operation-declaration/locale-canonical-ko.json +0 -1
  242. package/src/cli/__tests__/fixtures/migrate-operation-declaration/locale-existing-operation-namespace-en.json +0 -8
  243. package/src/cli/__tests__/fixtures/migrate-operation-declaration/missing-english-locale.ts.txt +0 -7
  244. package/src/cli/__tests__/fixtures/migrate-operation-declaration/no-safety.ts.txt +0 -6
  245. package/src/cli/__tests__/fixtures/migrate-operation-declaration/non-literal.ts.txt +0 -7
  246. package/src/cli/__tests__/fixtures/migrate-operation-declaration/redundant-approval.ts.txt +0 -6
  247. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-binding-ambiguous.ts.txt +0 -12
  248. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-imported-other.ts.txt +0 -7
  249. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-imported.ts.txt +0 -5
  250. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-key-ambiguous.ts.txt +0 -19
  251. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-shorthand.ts.txt +0 -9
  252. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-typed.ts.txt +0 -11
  253. package/src/cli/__tests__/fixtures/migrate-operation-declaration/registry-unrelated.ts.txt +0 -13
  254. package/src/cli/__tests__/fixtures/migrate-operation-declaration/safety-conflict.ts.txt +0 -7
  255. package/src/cli/__tests__/fixtures/migrate-operation-declaration/stream.ts.txt +0 -7
  256. package/src/cli/__tests__/fixtures/migrate-operation-declaration/tool-router-spread.ts.txt +0 -15
  257. package/src/cli/__tests__/fixtures/migrate-operation-declaration/unparseable.ts.txt +0 -4
  258. package/src/cli/__tests__/fixtures/migrate-operation-declaration/verbatim-template.ts.txt +0 -12
@@ -0,0 +1,104 @@
1
+ import type { HttpRetrySummary } from "../types.js";
2
+ import { type ClosedEnum, type TelemetryContributor, type TenantNeutral } from "./request-telemetry.js";
3
+ /** The same closed vocabulary used by tenant-visible meta.retry. */
4
+ export type HttpTelemetryErrorCode = "transport_network_error" | "transport_timeout" | "transport_cancelled" | "upstream_http_error" | "other";
5
+ export declare function httpTelemetryErrorCode(code: string | undefined): HttpTelemetryErrorCode;
6
+ export type HttpTelemetryRetryPayload = {
7
+ attempts: number;
8
+ retries: number;
9
+ preset?: ClosedEnum<NonNullable<HttpRetrySummary["preset"]>>;
10
+ transport: ClosedEnum<HttpRetrySummary["transport"]>;
11
+ lastErrorCode?: ClosedEnum<HttpTelemetryErrorCode>;
12
+ /** Last failed attempt's status, preserving the existing meta.retry contract. */
13
+ lastStatus?: number;
14
+ };
15
+ export type HttpAttemptTelemetryEvent = {
16
+ ms: number;
17
+ proxyUsed: boolean;
18
+ status?: number;
19
+ e?: HttpTelemetryErrorCode;
20
+ /** A returned status-retry outcome, rather than a thrown transport error. */
21
+ statusRetry?: boolean;
22
+ /** Operator-only error text. Never projected into the header or tenant metadata. */
23
+ diagnostics?: {
24
+ name: string;
25
+ message: string;
26
+ cause?: {
27
+ name: string;
28
+ message: string;
29
+ };
30
+ };
31
+ };
32
+ export interface HttpTelemetryRequestSink {
33
+ recordAttempt(event: HttpAttemptTelemetryEvent): void;
34
+ /** Called once when the logical HTTP call settles; includes backoff time. */
35
+ finish(ms: number): void;
36
+ toTenantRetryPayload(): TenantNeutral<HttpTelemetryRetryPayload> | undefined;
37
+ }
38
+ export interface HttpTelemetrySink {
39
+ /** Optional, best-effort failure marker; called at most once per logical request. */
40
+ markTelemetryFailed?(): void;
41
+ /** Each call gets independent retry state, including concurrent calls. */
42
+ startRequest(options: {
43
+ retryPreset?: HttpRetrySummary["preset"];
44
+ }): HttpTelemetryRequestSink;
45
+ }
46
+ export type HttpAttemptSample = {
47
+ n: number;
48
+ ms: number;
49
+ status?: number;
50
+ e?: HttpTelemetryErrorCode;
51
+ diagnostics?: HttpAttemptTelemetryEvent["diagnostics"];
52
+ };
53
+ export type HttpTelemetryLogPayload = {
54
+ /** Observer failure; operator-only and never projected into the header. */
55
+ telemetryFailed?: true;
56
+ attempts: number;
57
+ retries: number;
58
+ timeouts: number;
59
+ proxyUsed: boolean;
60
+ /** Most recently completed attempt's status, including successful statuses. */
61
+ lastStatus?: number;
62
+ retryPreset?: HttpRetrySummary["preset"];
63
+ transport: HttpRetrySummary["transport"];
64
+ lastErrorCode?: HttpTelemetryErrorCode;
65
+ attemptSamples: HttpAttemptSample[];
66
+ dropped: number;
67
+ /** Sum of logical call durations, including retry delays. */
68
+ ms: number;
69
+ /** Most recent successful retried call; also the source of tenant meta.retry. */
70
+ retry?: HttpTelemetryRetryPayload;
71
+ };
72
+ export type HttpTelemetryHeaderPayload = {
73
+ attempts: number;
74
+ retries: number;
75
+ timeouts: number;
76
+ proxyUsed: boolean;
77
+ lastStatus?: number;
78
+ retryPreset?: ClosedEnum<NonNullable<HttpRetrySummary["preset"]>>;
79
+ transport: ClosedEnum<HttpRetrySummary["transport"]>;
80
+ lastErrorCode?: ClosedEnum<HttpTelemetryErrorCode>;
81
+ attemptSamples: {
82
+ n: number;
83
+ ms: number;
84
+ status?: number;
85
+ e?: ClosedEnum<HttpTelemetryErrorCode>;
86
+ }[];
87
+ dropped: number;
88
+ ms: number;
89
+ retry?: HttpTelemetryRetryPayload;
90
+ };
91
+ export declare class HttpTelemetryCollector implements HttpTelemetrySink, TelemetryContributor<HttpTelemetryLogPayload, HttpTelemetryHeaderPayload> {
92
+ #private;
93
+ readonly key: "http";
94
+ constructor(options?: {
95
+ redact?: (text: string) => string;
96
+ });
97
+ markTelemetryFailed(): void;
98
+ startRequest(options: {
99
+ retryPreset?: HttpRetrySummary["preset"];
100
+ }): HttpTelemetryRequestSink;
101
+ toTenantRetryPayload(): TenantNeutral<HttpTelemetryRetryPayload> | undefined;
102
+ toLogPayload(): HttpTelemetryLogPayload | undefined;
103
+ toHeaderPayload(log: HttpTelemetryLogPayload): HttpTelemetryHeaderPayload;
104
+ }
@@ -0,0 +1,190 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { closedEnum, } from "./request-telemetry.js";
3
+ export function httpTelemetryErrorCode(code) {
4
+ switch (code) {
5
+ case "transport_network_error":
6
+ case "transport_timeout":
7
+ case "transport_cancelled":
8
+ case "upstream_http_error":
9
+ return code;
10
+ default:
11
+ return "other";
12
+ }
13
+ }
14
+ const MAX_ATTEMPT_SAMPLES = 24;
15
+ const MAX_DIAGNOSTIC_TEXT = 300;
16
+ function integer(value) {
17
+ return Math.max(0, Math.floor(Number.isFinite(value) ? value : 0));
18
+ }
19
+ function saturatingAdd(a, b) {
20
+ if (!Number.isFinite(a) || !Number.isFinite(b))
21
+ return Number.MAX_SAFE_INTEGER;
22
+ return Math.min(Number.MAX_SAFE_INTEGER, integer(a) + integer(b));
23
+ }
24
+ function boundedText(value, redact) {
25
+ let result;
26
+ try {
27
+ result = redact?.(value) ?? value;
28
+ }
29
+ catch {
30
+ return "[REDACTION_FAILED]";
31
+ }
32
+ // Detach caller text through independent UTF-16 storage, preserving lone surrogates.
33
+ const length = Math.min(result.length, MAX_DIAGNOSTIC_TEXT);
34
+ const units = Buffer.alloc(length * 2);
35
+ for (let index = 0; index < length; index++)
36
+ units.writeUInt16LE(result.charCodeAt(index), index * 2);
37
+ return units.toString("utf16le");
38
+ }
39
+ export class HttpTelemetryCollector {
40
+ key = "http";
41
+ #redact;
42
+ #telemetryFailed = false;
43
+ #attempts = 0;
44
+ #retries = 0;
45
+ #timeouts = 0;
46
+ #proxyUsed = false;
47
+ #lastStatus;
48
+ #retryPreset;
49
+ #lastErrorCode;
50
+ #samples = [];
51
+ #dropped = 0;
52
+ #ms = 0;
53
+ #retry;
54
+ constructor(options = {}) {
55
+ this.#redact = options.redact;
56
+ }
57
+ markTelemetryFailed() {
58
+ this.#telemetryFailed = true;
59
+ }
60
+ startRequest(options) {
61
+ const preset = options.retryPreset;
62
+ let attempts = 0;
63
+ let retries = 0;
64
+ let lastErrorCode;
65
+ let lastStatus;
66
+ let retry;
67
+ let finished = false;
68
+ return {
69
+ recordAttempt: (event) => {
70
+ if (attempts > 0) {
71
+ retries = saturatingAdd(retries, 1);
72
+ this.#retries = saturatingAdd(this.#retries, 1);
73
+ }
74
+ attempts = saturatingAdd(attempts, 1);
75
+ this.#attempts = saturatingAdd(this.#attempts, 1);
76
+ if (event.e === "transport_timeout")
77
+ this.#timeouts = saturatingAdd(this.#timeouts, 1);
78
+ this.#proxyUsed ||= event.proxyUsed;
79
+ this.#retryPreset = preset;
80
+ if (event.status !== undefined)
81
+ this.#lastStatus = integer(event.status);
82
+ if (event.e)
83
+ this.#lastErrorCode = event.e;
84
+ if (this.#samples.length < MAX_ATTEMPT_SAMPLES) {
85
+ const text = (value) => boundedText(value, this.#redact);
86
+ this.#samples.push({
87
+ n: attempts,
88
+ ms: saturatingAdd(0, event.ms),
89
+ ...(event.status === undefined ? {} : { status: integer(event.status) }),
90
+ ...(event.e ? { e: event.e } : {}),
91
+ ...(event.diagnostics
92
+ ? {
93
+ diagnostics: {
94
+ name: text(event.diagnostics.name),
95
+ message: text(event.diagnostics.message),
96
+ ...(event.diagnostics.cause
97
+ ? {
98
+ cause: {
99
+ name: text(event.diagnostics.cause.name),
100
+ message: text(event.diagnostics.cause.message),
101
+ },
102
+ }
103
+ : {}),
104
+ },
105
+ }
106
+ : {}),
107
+ });
108
+ }
109
+ else
110
+ this.#dropped = saturatingAdd(this.#dropped, 1);
111
+ if (event.e) {
112
+ lastStatus = event.status;
113
+ // Historically status-retry outcomes set lastStatus only. Preserve those pins.
114
+ if (!event.statusRetry)
115
+ lastErrorCode = event.e;
116
+ }
117
+ else if (attempts > 1) {
118
+ retry = {
119
+ attempts,
120
+ retries,
121
+ ...(preset ? { preset: closedEnum(preset) } : {}),
122
+ transport: closedEnum("native"),
123
+ ...(lastErrorCode ? { lastErrorCode: closedEnum(lastErrorCode) } : {}),
124
+ ...(lastStatus ? { lastStatus: integer(lastStatus) } : {}),
125
+ };
126
+ this.#retry = retry;
127
+ }
128
+ },
129
+ finish: (ms) => {
130
+ if (!finished && attempts > 0)
131
+ this.#ms = saturatingAdd(this.#ms, ms);
132
+ finished = true;
133
+ },
134
+ toTenantRetryPayload: () => (!this.#telemetryFailed && retry ? { ...retry } : undefined),
135
+ };
136
+ }
137
+ toTenantRetryPayload() {
138
+ return !this.#telemetryFailed && this.#retry ? { ...this.#retry } : undefined;
139
+ }
140
+ toLogPayload() {
141
+ if (this.#attempts === 0 && !this.#telemetryFailed)
142
+ return undefined;
143
+ return {
144
+ ...(this.#telemetryFailed ? { telemetryFailed: true } : {}),
145
+ attempts: this.#attempts,
146
+ retries: this.#retries,
147
+ timeouts: this.#timeouts,
148
+ proxyUsed: this.#proxyUsed,
149
+ ...(this.#lastStatus === undefined ? {} : { lastStatus: this.#lastStatus }),
150
+ ...(this.#retryPreset ? { retryPreset: this.#retryPreset } : {}),
151
+ transport: "native",
152
+ ...(this.#lastErrorCode ? { lastErrorCode: this.#lastErrorCode } : {}),
153
+ attemptSamples: this.#samples.map((sample) => ({
154
+ ...sample,
155
+ ...(sample.diagnostics
156
+ ? {
157
+ diagnostics: {
158
+ ...sample.diagnostics,
159
+ ...(sample.diagnostics.cause ? { cause: { ...sample.diagnostics.cause } } : {}),
160
+ },
161
+ }
162
+ : {}),
163
+ })),
164
+ dropped: this.#dropped,
165
+ ms: this.#ms,
166
+ ...(this.#retry ? { retry: { ...this.#retry } } : {}),
167
+ };
168
+ }
169
+ toHeaderPayload(log) {
170
+ return {
171
+ attempts: log.attempts,
172
+ retries: log.retries,
173
+ timeouts: log.timeouts,
174
+ proxyUsed: log.proxyUsed,
175
+ ...(log.lastStatus === undefined ? {} : { lastStatus: log.lastStatus }),
176
+ ...(log.retryPreset ? { retryPreset: closedEnum(log.retryPreset) } : {}),
177
+ transport: closedEnum(log.transport),
178
+ ...(log.lastErrorCode ? { lastErrorCode: closedEnum(log.lastErrorCode) } : {}),
179
+ attemptSamples: log.attemptSamples.map(({ n, ms, status, e }) => ({
180
+ n,
181
+ ms,
182
+ ...(status === undefined ? {} : { status }),
183
+ ...(e ? { e: closedEnum(e) } : {}),
184
+ })),
185
+ dropped: log.dropped,
186
+ ms: log.ms,
187
+ ...(log.retry ? { retry: { ...log.retry } } : {}),
188
+ };
189
+ }
190
+ }
@@ -1,9 +1,40 @@
1
1
  import type { ProxyResolutionOptions } from "../config/loader.js";
2
2
  import type { HttpClient, HttpRetrySummary } from "../types.js";
3
+ import { type HttpTelemetrySink } from "./http-telemetry.js";
3
4
  export type HttpClientOptions = ProxyResolutionOptions & {
4
5
  warn?: (message: string) => void;
5
6
  userAgent?: string;
6
7
  onRetrySummary?: (summary: HttpRetrySummary) => void;
8
+ /**
9
+ * Synchronous observer for HTTP attempts, retries, timeouts, status, duration,
10
+ * and observed proxy use. Observer failures never change transport behavior.
11
+ * All hooks and their property reads are guarded, including `onRetrySummary`
12
+ * and the failure reporter. Invalid asynchronous results are ignored and never
13
+ * awaited. Observer failures set the log-only `telemetryFailed` marker; the
14
+ * marker and redacted error diagnostics are excluded from headers and tenant
15
+ * metadata. Tenant `meta.retry` retains its existing response shape.
16
+ *
17
+ * After `ProviderEngine.attach`, the server wraps supported host HTTP bindings
18
+ * with the request collector. The adapter preserves arguments, direct-call,
19
+ * explicit `.call`/`.apply`, and unbound receivers, plus the original returned
20
+ * promise, response, stream, and error. Streams and SSE are observed at headers
21
+ * without consuming their bodies. SDK clients report every observed attempt
22
+ * and keep any observer configured here; routing is scoped to each call.
23
+ *
24
+ * Binding an existing adapter reuses its identity and replaces its collector:
25
+ * the latest bind receives subsequent calls, the earlier collector receives no
26
+ * further calls, and in-flight calls keep the collector captured at invocation.
27
+ * An opaque host invocation is one observed attempt with zero observed retries;
28
+ * its undisclosed retries and proxy settings cannot be inferred, and tenant
29
+ * `meta.retry` is omitted. Status, duration, and error class remain available
30
+ * in logs and telemetry headers.
31
+ *
32
+ * Non-object bindings and objects without a callable `request`, `get`, `post`,
33
+ * `put`, `delete`, `stream`, or `sse` method are left untouched, with no `http`
34
+ * telemetry sibling and one process-wide warning for this reason:
35
+ * `[apifuse] http telemetry not attached; reason=unsupported_binding_shape`.
36
+ */
37
+ httpTelemetry?: HttpTelemetrySink;
7
38
  signal?: AbortSignal;
8
39
  };
9
40
  export declare function createHttpClient(baseUrl?: string, clientOptions?: HttpClientOptions): HttpClient;