@vertesia/api-fetch-client 1.2.0 → 1.3.0-dev.20260620.061059Z

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 (80) hide show
  1. package/README.md +51 -0
  2. package/lib/base.d.ts +169 -0
  3. package/lib/base.d.ts.map +1 -0
  4. package/lib/base.js +481 -0
  5. package/lib/base.js.map +1 -0
  6. package/lib/{types/client.d.ts → client.d.ts} +8 -8
  7. package/lib/client.d.ts.map +1 -0
  8. package/lib/{esm/client.js → client.js} +27 -11
  9. package/lib/client.js.map +1 -0
  10. package/lib/{types/errors.d.ts → errors.d.ts} +5 -5
  11. package/lib/errors.d.ts.map +1 -0
  12. package/lib/{esm/errors.js → errors.js} +22 -9
  13. package/lib/errors.js.map +1 -0
  14. package/lib/index.d.ts +5 -0
  15. package/lib/index.d.ts.map +1 -0
  16. package/lib/index.js +5 -0
  17. package/lib/index.js.map +1 -0
  18. package/lib/{types/sse → sse}/EventSourceParserStream.d.ts +4 -1
  19. package/lib/sse/EventSourceParserStream.d.ts.map +1 -0
  20. package/lib/{esm/sse → sse}/EventSourceParserStream.js +5 -4
  21. package/lib/sse/EventSourceParserStream.js.map +1 -0
  22. package/lib/sse/TextDecoderStream.d.ts.map +1 -0
  23. package/lib/{esm/sse → sse}/TextDecoderStream.js +2 -2
  24. package/lib/sse/TextDecoderStream.js.map +1 -0
  25. package/lib/{types/sse → sse}/index.d.ts +7 -2
  26. package/lib/sse/index.d.ts.map +1 -0
  27. package/lib/{esm/sse → sse}/index.js +3 -3
  28. package/lib/sse/index.js.map +1 -0
  29. package/lib/{types/utils.d.ts → utils.d.ts} +1 -1
  30. package/lib/utils.d.ts.map +1 -0
  31. package/lib/{esm/utils.js → utils.js} +3 -3
  32. package/lib/utils.js.map +1 -0
  33. package/package.json +22 -25
  34. package/src/base.ts +432 -79
  35. package/src/client.ts +50 -24
  36. package/src/errors.ts +28 -15
  37. package/src/index.ts +4 -4
  38. package/src/sse/EventSourceParserStream.ts +13 -10
  39. package/src/sse/TextDecoderStream.ts +16 -11
  40. package/src/sse/index.ts +14 -8
  41. package/src/utils.ts +5 -6
  42. package/lib/cjs/base.js +0 -240
  43. package/lib/cjs/base.js.map +0 -1
  44. package/lib/cjs/client.js +0 -115
  45. package/lib/cjs/client.js.map +0 -1
  46. package/lib/cjs/errors.js +0 -63
  47. package/lib/cjs/errors.js.map +0 -1
  48. package/lib/cjs/index.js +0 -21
  49. package/lib/cjs/index.js.map +0 -1
  50. package/lib/cjs/package.json +0 -3
  51. package/lib/cjs/sse/EventSourceParserStream.js +0 -41
  52. package/lib/cjs/sse/EventSourceParserStream.js.map +0 -1
  53. package/lib/cjs/sse/TextDecoderStream.js +0 -53
  54. package/lib/cjs/sse/TextDecoderStream.js.map +0 -1
  55. package/lib/cjs/sse/index.js +0 -27
  56. package/lib/cjs/sse/index.js.map +0 -1
  57. package/lib/cjs/utils.js +0 -38
  58. package/lib/cjs/utils.js.map +0 -1
  59. package/lib/esm/base.js +0 -235
  60. package/lib/esm/base.js.map +0 -1
  61. package/lib/esm/client.js.map +0 -1
  62. package/lib/esm/errors.js.map +0 -1
  63. package/lib/esm/index.js +0 -5
  64. package/lib/esm/index.js.map +0 -1
  65. package/lib/esm/sse/EventSourceParserStream.js.map +0 -1
  66. package/lib/esm/sse/TextDecoderStream.js.map +0 -1
  67. package/lib/esm/sse/index.js.map +0 -1
  68. package/lib/esm/utils.js.map +0 -1
  69. package/lib/tsconfig.tsbuildinfo +0 -1
  70. package/lib/types/base.d.ts +0 -83
  71. package/lib/types/base.d.ts.map +0 -1
  72. package/lib/types/client.d.ts.map +0 -1
  73. package/lib/types/errors.d.ts.map +0 -1
  74. package/lib/types/index.d.ts +0 -5
  75. package/lib/types/index.d.ts.map +0 -1
  76. package/lib/types/sse/EventSourceParserStream.d.ts.map +0 -1
  77. package/lib/types/sse/TextDecoderStream.d.ts.map +0 -1
  78. package/lib/types/sse/index.d.ts.map +0 -1
  79. package/lib/types/utils.d.ts.map +0 -1
  80. /package/lib/{types/sse → sse}/TextDecoderStream.d.ts +0 -0
package/README.md CHANGED
@@ -140,6 +140,54 @@ try {
140
140
  }
141
141
  ```
142
142
 
143
+ ## Retries
144
+
145
+ Retries are disabled by default. Enable them explicitly on a client or a single request:
146
+
147
+ ```typescript
148
+ const client = new FetchClient('https://api.example.com')
149
+ .withRetryPolicy({
150
+ attempts: 3,
151
+ methods: ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE'],
152
+ statuses: [502, 503, 504],
153
+ baseDelayMs: 250,
154
+ maxDelayMs: 4000
155
+ });
156
+
157
+ // POST requests are not retried by the default method list. Opt in only when
158
+ // the operation is safe to replay.
159
+ await client.post('/workflow/execute', {
160
+ payload,
161
+ retryPolicy: { methods: ['POST'] }
162
+ });
163
+
164
+ // Disable a client-level retry policy for one request.
165
+ await client.get('/no-retry', { retryPolicy: false });
166
+ ```
167
+
168
+ ## Timeouts
169
+
170
+ No request timeout is applied by default. Set a default on the client (applies to every request) and/or override it per request. The timeout aborts the **whole** request — connection, response headers, **and** body consumption (JSON parse) — using a browser-standard `AbortSignal`, so it behaves the same in the browser and in Node (no `undici`-specific configuration).
171
+
172
+ ```typescript
173
+ // Default timeout (ms) for every request on this client.
174
+ const client = new FetchClient('https://api.example.com').withTimeout(60_000);
175
+
176
+ // Override for a single slow request (e.g. one that blocks on an LLM).
177
+ await client.post('/long-running', { payload, timeoutMs: 30 * 60_000 });
178
+
179
+ // Disable the client default for one request.
180
+ await client.get('/no-timeout', { timeoutMs: false });
181
+
182
+ // Combine with a caller-supplied AbortSignal — whichever aborts first wins.
183
+ await client.get('/data', { signal: controller.signal, timeoutMs: 5_000 });
184
+ ```
185
+
186
+ - `timeoutMs`: a positive number sets the timeout; `false`/`null`/`0` disables it for that request (overriding the client default); omitted falls back to the client default (`withTimeout` / `defaultTimeoutMs`).
187
+ - On timeout the request rejects as a connection failure. When a retry policy is enabled, a timed-out attempt is retried like any other connection error, with a **fresh deadline per attempt**.
188
+ - SSE requests (`reader: 'sse'`) are never given a total-request timeout — they are long-lived by design; apply your own idle/close handling to the stream.
189
+ - `ApiTopic` sub-clients inherit the parent client's default timeout, so setting it once on the root client covers all topics.
190
+
143
191
  ### Custom Error Factory
144
192
 
145
193
  Transform errors before they're thrown:
@@ -256,6 +304,9 @@ The main client class for making HTTP requests.
256
304
  | `payload` | `object \| BodyInit` | Request body |
257
305
  | `reader` | `'sse' \| function` | Custom response reader |
258
306
  | `jsonPayload` | `boolean` | Auto-serialize payload as JSON (default: true) |
307
+ | `retryPolicy` | `IRequestRetryPolicy \| false` | Per-request retry policy; `false` disables the client default |
308
+ | `timeoutMs` | `number \| false \| null` | Per-request timeout (ms). Positive sets it; `false`/`null`/`0` disables; omitted uses the client default |
309
+ | `signal` | `AbortSignal` | Caller abort signal, merged with the timeout signal |
259
310
 
260
311
  ### Error Classes
261
312
 
package/lib/base.d.ts ADDED
@@ -0,0 +1,169 @@
1
+ import { type RequestError } from './errors.js';
2
+ import { type ServerSentEvent } from './sse/index.js';
3
+ export type FETCH_FN = (input: RequestInfo, init?: RequestInit) => Promise<Response>;
4
+ type IPrimitives = string | number | boolean | null | undefined | string[] | number[] | boolean[];
5
+ export interface IRequestRetryPolicy {
6
+ /**
7
+ * Total attempts, including the first request. Defaults to 3 when a retry policy is enabled.
8
+ */
9
+ attempts?: number;
10
+ /**
11
+ * HTTP methods that may be retried. Defaults to idempotent methods.
12
+ */
13
+ methods?: string[];
14
+ /**
15
+ * HTTP response statuses that should be retried. Defaults to 502, 503, and 504.
16
+ */
17
+ statuses?: number[];
18
+ /**
19
+ * Also retry any 5xx whose body is not JSON — e.g. an HTML error page from a load balancer,
20
+ * gateway, or Cloud Run ("no available instance" / "try again in 30 seconds"). These originate
21
+ * at the edge, not the application (which serializes its errors as JSON), so they are transient
22
+ * and safe to retry even when the exact status (often 500) is not in `statuses`. Defaults to true.
23
+ */
24
+ retryNonJsonServerErrors?: boolean;
25
+ /**
26
+ * Retry network failures thrown by fetch. Defaults to true.
27
+ */
28
+ retryOnConnectionError?: boolean;
29
+ /**
30
+ * Initial backoff delay in milliseconds. Defaults to 250.
31
+ */
32
+ baseDelayMs?: number;
33
+ /**
34
+ * Maximum backoff delay in milliseconds. Defaults to 4000.
35
+ */
36
+ maxDelayMs?: number;
37
+ /**
38
+ * Use full jitter for backoff delays. Defaults to true.
39
+ */
40
+ jitter?: boolean;
41
+ }
42
+ type NormalizedRetryPolicy = {
43
+ attempts: number;
44
+ methods: Set<string>;
45
+ statuses: Set<number>;
46
+ retryNonJsonServerErrors: boolean;
47
+ retryOnConnectionError: boolean;
48
+ baseDelayMs: number;
49
+ maxDelayMs: number;
50
+ jitter: boolean;
51
+ };
52
+ export interface IRequestParams {
53
+ query?: Record<string, IPrimitives> | null;
54
+ headers?: Record<string, string> | null;
55
+ reader?: 'sse' | ((response: Response) => unknown);
56
+ /**
57
+ * Set to false to disable automatic JSON payload serialization
58
+ * If you need to post other data than a json payload, set this to false and use the `payload` property to set the desired payload
59
+ */
60
+ jsonPayload?: boolean;
61
+ /**
62
+ * Opt-in retry policy for this request. Retries are disabled by default.
63
+ * Set to false to disable a client-level retry policy for this request.
64
+ */
65
+ retryPolicy?: IRequestRetryPolicy | false | null;
66
+ /**
67
+ * Per-request timeout in milliseconds. Aborts the whole request — connection, response headers,
68
+ * AND body consumption (JSON parse) — via a browser-standard AbortSignal. A positive number sets
69
+ * the timeout; `false`/`null`/`0` disables it for this request (overriding any client default).
70
+ * When omitted, the client-level default (`withTimeout` / `defaultTimeoutMs`) applies.
71
+ * Not applied to SSE (`reader: 'sse'`) requests, which are long-lived by design.
72
+ */
73
+ timeoutMs?: number | false | null;
74
+ /**
75
+ * Caller-supplied AbortSignal. Merged with the timeout signal — whichever aborts first wins.
76
+ */
77
+ signal?: AbortSignal;
78
+ }
79
+ export interface IRequestParamsWithPayload extends IRequestParams {
80
+ payload?: object | BodyInit | null;
81
+ }
82
+ export declare function fetchPromise(fetchImpl?: FETCH_FN | Promise<FETCH_FN>): Promise<FETCH_FN>;
83
+ export declare abstract class ClientBase {
84
+ _fetch: Promise<FETCH_FN>;
85
+ baseUrl: string;
86
+ errorFactory: (err: RequestError) => Error;
87
+ verboseErrors: boolean;
88
+ retryPolicy?: IRequestRetryPolicy;
89
+ defaultTimeoutMs?: number;
90
+ abstract get headers(): Record<string, string>;
91
+ constructor(baseUrl: string, fetchImpl?: FETCH_FN | Promise<FETCH_FN>);
92
+ /**
93
+ * Can be subclassed to map to custom errors
94
+ * @param err
95
+ */
96
+ throwError(err: RequestError): never;
97
+ withRetryPolicy(policy?: IRequestRetryPolicy | null): this;
98
+ getRetryPolicy(): IRequestRetryPolicy | undefined;
99
+ /**
100
+ * Set a default request timeout (ms) applied to every request unless overridden per-request via
101
+ * `timeoutMs`. Pass `false`/`null`/`0` to clear it. The timeout aborts the whole request
102
+ * (connection + response headers + body consumption) via AbortSignal.
103
+ */
104
+ withTimeout(timeoutMs?: number | false | null): this;
105
+ getTimeout(): number | undefined;
106
+ /**
107
+ * Resolve the effective timeout for a request: per-request `timeoutMs` wins (a positive number
108
+ * sets it; `false`/`null`/`0` disables it), otherwise the client default applies. SSE streams are
109
+ * never given a total-request timeout.
110
+ */
111
+ protected resolveTimeout(params: IRequestParams | undefined): number | undefined;
112
+ /**
113
+ * Resolve a path to a full URL. If the path is already an absolute URL
114
+ * (starts with http:// or https://), it is returned as-is.
115
+ */
116
+ getUrl(path: string): string;
117
+ get<T = unknown>(path: string, params?: IRequestParams): Promise<T>;
118
+ del<T = unknown>(path: string, params?: IRequestParams): Promise<T>;
119
+ delete(path: string, params?: IRequestParams): Promise<unknown>;
120
+ post<T = unknown>(path: string, params?: IRequestParamsWithPayload): Promise<T>;
121
+ put<T = unknown>(path: string, params?: IRequestParamsWithPayload): Promise<T>;
122
+ /**
123
+ * You can customize the json parser by overriding this method
124
+ * @param text
125
+ * @returns
126
+ */
127
+ jsonParse(text: string): unknown;
128
+ /**
129
+ * Can be overridden to create the request
130
+ * @param fetch
131
+ * @param url
132
+ * @param init
133
+ * @returns
134
+ */
135
+ createRequest(url: string, init: RequestInit): Promise<Request>;
136
+ handleFetchResponse(_req: Request, _res: Response): void;
137
+ createServerError(req: Request, res: Response, payload: unknown): RequestError;
138
+ readJSONPayload(res: Response): Promise<unknown>;
139
+ /**
140
+ * Subclasses You can override this to do something with the response
141
+ * @param res
142
+ */
143
+ handleResponse<T = unknown>(req: Request, res: Response, params: IRequestParamsWithPayload | undefined): T | Promise<T>;
144
+ request<T = unknown>(method: string, path: string, params?: IRequestParamsWithPayload): Promise<T>;
145
+ protected resolveRetryPolicy(params: IRequestParamsWithPayload | undefined): NormalizedRetryPolicy | undefined;
146
+ private shouldRetryResponse;
147
+ private shouldRetryConnectionError;
148
+ private waitBeforeRetry;
149
+ /**
150
+ * Perform a request and consume the response as an SSE stream.
151
+ * Calls `onEvent` for each parsed SSE event, then returns the last event.
152
+ *
153
+ * @param method HTTP method
154
+ * @param path URL path (relative to baseUrl) or absolute URL (http:// or https://)
155
+ * @param params Request parameters (payload, headers, query)
156
+ * @param onEvent Callback for each SSE event
157
+ * @returns The last SSE event received, or undefined if the stream was empty
158
+ */
159
+ sseRequest(method: string, path: string, params: IRequestParamsWithPayload | undefined, onEvent: (event: ServerSentEvent) => void): Promise<ServerSentEvent | undefined>;
160
+ /**
161
+ * Expose the fetch method
162
+ * @param input
163
+ * @param init
164
+ * @returns
165
+ */
166
+ fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
167
+ }
168
+ export {};
169
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}