@vertesia/api-fetch-client 1.3.0 → 1.4.0-dev.20260614.160504Z

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 +25 -0
  2. package/lib/base.d.ts +135 -0
  3. package/lib/base.d.ts.map +1 -0
  4. package/lib/base.js +374 -0
  5. package/lib/base.js.map +1 -0
  6. package/lib/{types/client.d.ts → client.d.ts} +7 -8
  7. package/lib/client.d.ts.map +1 -0
  8. package/lib/{esm/client.js → client.js} +24 -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 +21 -25
  34. package/src/base.ts +297 -79
  35. package/src/client.ts +46 -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,31 @@ 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
+
143
168
  ### Custom Error Factory
144
169
 
145
170
  Transform errors before they're thrown:
package/lib/base.d.ts ADDED
@@ -0,0 +1,135 @@
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
+ * Retry network failures thrown by fetch. Defaults to true.
20
+ */
21
+ retryOnConnectionError?: boolean;
22
+ /**
23
+ * Initial backoff delay in milliseconds. Defaults to 250.
24
+ */
25
+ baseDelayMs?: number;
26
+ /**
27
+ * Maximum backoff delay in milliseconds. Defaults to 4000.
28
+ */
29
+ maxDelayMs?: number;
30
+ /**
31
+ * Use full jitter for backoff delays. Defaults to true.
32
+ */
33
+ jitter?: boolean;
34
+ }
35
+ type NormalizedRetryPolicy = {
36
+ attempts: number;
37
+ methods: Set<string>;
38
+ statuses: Set<number>;
39
+ retryOnConnectionError: boolean;
40
+ baseDelayMs: number;
41
+ maxDelayMs: number;
42
+ jitter: boolean;
43
+ };
44
+ export interface IRequestParams {
45
+ query?: Record<string, IPrimitives> | null;
46
+ headers?: Record<string, string> | null;
47
+ reader?: 'sse' | ((response: Response) => unknown);
48
+ /**
49
+ * Set to false to disable automatic JSON payload serialization
50
+ * 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
51
+ */
52
+ jsonPayload?: boolean;
53
+ /**
54
+ * Opt-in retry policy for this request. Retries are disabled by default.
55
+ * Set to false to disable a client-level retry policy for this request.
56
+ */
57
+ retryPolicy?: IRequestRetryPolicy | false | null;
58
+ }
59
+ export interface IRequestParamsWithPayload extends IRequestParams {
60
+ payload?: object | BodyInit | null;
61
+ }
62
+ export declare function fetchPromise(fetchImpl?: FETCH_FN | Promise<FETCH_FN>): Promise<FETCH_FN>;
63
+ export declare abstract class ClientBase {
64
+ _fetch: Promise<FETCH_FN>;
65
+ baseUrl: string;
66
+ errorFactory: (err: RequestError) => Error;
67
+ verboseErrors: boolean;
68
+ retryPolicy?: IRequestRetryPolicy;
69
+ abstract get headers(): Record<string, string>;
70
+ constructor(baseUrl: string, fetchImpl?: FETCH_FN | Promise<FETCH_FN>);
71
+ /**
72
+ * Can be subclassed to map to custom errors
73
+ * @param err
74
+ */
75
+ throwError(err: RequestError): never;
76
+ withRetryPolicy(policy?: IRequestRetryPolicy | null): this;
77
+ getRetryPolicy(): IRequestRetryPolicy | undefined;
78
+ /**
79
+ * Resolve a path to a full URL. If the path is already an absolute URL
80
+ * (starts with http:// or https://), it is returned as-is.
81
+ */
82
+ getUrl(path: string): string;
83
+ get<T = unknown>(path: string, params?: IRequestParams): Promise<T>;
84
+ del<T = unknown>(path: string, params?: IRequestParams): Promise<T>;
85
+ delete(path: string, params?: IRequestParams): Promise<unknown>;
86
+ post<T = unknown>(path: string, params?: IRequestParamsWithPayload): Promise<T>;
87
+ put<T = unknown>(path: string, params?: IRequestParamsWithPayload): Promise<T>;
88
+ /**
89
+ * You can customize the json parser by overriding this method
90
+ * @param text
91
+ * @returns
92
+ */
93
+ jsonParse(text: string): unknown;
94
+ /**
95
+ * Can be overridden to create the request
96
+ * @param fetch
97
+ * @param url
98
+ * @param init
99
+ * @returns
100
+ */
101
+ createRequest(url: string, init: RequestInit): Promise<Request>;
102
+ handleFetchResponse(_req: Request, _res: Response): void;
103
+ createServerError(req: Request, res: Response, payload: unknown): RequestError;
104
+ readJSONPayload(res: Response): Promise<unknown>;
105
+ /**
106
+ * Subclasses You can override this to do something with the response
107
+ * @param res
108
+ */
109
+ handleResponse<T = unknown>(req: Request, res: Response, params: IRequestParamsWithPayload | undefined): T | Promise<T>;
110
+ request<T = unknown>(method: string, path: string, params?: IRequestParamsWithPayload): Promise<T>;
111
+ protected resolveRetryPolicy(params: IRequestParamsWithPayload | undefined): NormalizedRetryPolicy | undefined;
112
+ private shouldRetryResponse;
113
+ private shouldRetryConnectionError;
114
+ private waitBeforeRetry;
115
+ /**
116
+ * Perform a request and consume the response as an SSE stream.
117
+ * Calls `onEvent` for each parsed SSE event, then returns the last event.
118
+ *
119
+ * @param method HTTP method
120
+ * @param path URL path (relative to baseUrl) or absolute URL (http:// or https://)
121
+ * @param params Request parameters (payload, headers, query)
122
+ * @param onEvent Callback for each SSE event
123
+ * @returns The last SSE event received, or undefined if the stream was empty
124
+ */
125
+ sseRequest(method: string, path: string, params: IRequestParamsWithPayload | undefined, onEvent: (event: ServerSentEvent) => void): Promise<ServerSentEvent | undefined>;
126
+ /**
127
+ * Expose the fetch method
128
+ * @param input
129
+ * @param init
130
+ * @returns
131
+ */
132
+ fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
133
+ }
134
+ export {};
135
+ //# 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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"}
package/lib/base.js ADDED
@@ -0,0 +1,374 @@
1
+ import { ConnectionError, ServerError } from './errors.js';
2
+ import { sse } from './sse/index.js';
3
+ import { buildQueryString, join, removeTrailingSlash } from './utils.js';
4
+ const DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE'];
5
+ const DEFAULT_RETRY_STATUSES = [502, 503, 504];
6
+ const DEFAULT_RETRY_ATTEMPTS = 3;
7
+ const DEFAULT_RETRY_BASE_DELAY_MS = 250;
8
+ const DEFAULT_RETRY_MAX_DELAY_MS = 4000;
9
+ function isRecord(value) {
10
+ return value !== null && typeof value === 'object';
11
+ }
12
+ export function fetchPromise(fetchImpl) {
13
+ if (fetchImpl) {
14
+ return Promise.resolve(fetchImpl);
15
+ }
16
+ else if (typeof globalThis.fetch === 'function') {
17
+ return Promise.resolve(globalThis.fetch);
18
+ }
19
+ else {
20
+ // install an error impl
21
+ return Promise.resolve(() => {
22
+ throw new Error('No Fetch implementation found');
23
+ });
24
+ }
25
+ }
26
+ function isInvalidJsonPayload(payload) {
27
+ return isRecord(payload) && payload.error === 'Not a valid JSON payload' && typeof payload.text === 'string';
28
+ }
29
+ function isReplayableBody(body) {
30
+ return !body || typeof ReadableStream === 'undefined' || !(body instanceof ReadableStream);
31
+ }
32
+ function normalizeRetryPolicy(policy) {
33
+ const attempts = Math.max(1, Math.floor(policy.attempts ?? DEFAULT_RETRY_ATTEMPTS));
34
+ const baseDelayMs = Math.max(0, policy.baseDelayMs ?? DEFAULT_RETRY_BASE_DELAY_MS);
35
+ const maxDelayMs = Math.max(baseDelayMs, policy.maxDelayMs ?? DEFAULT_RETRY_MAX_DELAY_MS);
36
+ return {
37
+ attempts,
38
+ methods: new Set((policy.methods ?? DEFAULT_RETRY_METHODS).map((method) => method.toUpperCase())),
39
+ statuses: new Set(policy.statuses ?? DEFAULT_RETRY_STATUSES),
40
+ retryOnConnectionError: policy.retryOnConnectionError ?? true,
41
+ baseDelayMs,
42
+ maxDelayMs,
43
+ jitter: policy.jitter ?? true,
44
+ };
45
+ }
46
+ function retryAfterDelayMs(res) {
47
+ const retryAfter = res.headers.get('retry-after');
48
+ if (!retryAfter) {
49
+ return undefined;
50
+ }
51
+ const seconds = Number(retryAfter);
52
+ if (Number.isFinite(seconds) && seconds >= 0) {
53
+ return seconds * 1000;
54
+ }
55
+ const retryAt = Date.parse(retryAfter);
56
+ if (!Number.isNaN(retryAt)) {
57
+ return Math.max(0, retryAt - Date.now());
58
+ }
59
+ return undefined;
60
+ }
61
+ function retryDelayMs(policy, attempt, res) {
62
+ const retryAfter = res ? retryAfterDelayMs(res) : undefined;
63
+ const delay = retryAfter ?? Math.min(policy.maxDelayMs, policy.baseDelayMs * 2 ** attempt);
64
+ return policy.jitter ? Math.floor(Math.random() * delay) : delay;
65
+ }
66
+ function toError(err) {
67
+ return err instanceof Error ? err : new Error(String(err));
68
+ }
69
+ async function discardBody(res) {
70
+ try {
71
+ await res.body?.cancel();
72
+ }
73
+ catch {
74
+ // Ignore body cleanup failures while retrying the original request.
75
+ }
76
+ }
77
+ export class ClientBase {
78
+ _fetch;
79
+ baseUrl;
80
+ errorFactory = (err) => err;
81
+ verboseErrors = true;
82
+ retryPolicy;
83
+ constructor(baseUrl, fetchImpl) {
84
+ this.baseUrl = removeTrailingSlash(baseUrl);
85
+ this._fetch = fetchPromise(fetchImpl);
86
+ }
87
+ /**
88
+ * Can be subclassed to map to custom errors
89
+ * @param err
90
+ */
91
+ throwError(err) {
92
+ throw this.errorFactory(err);
93
+ }
94
+ withRetryPolicy(policy) {
95
+ this.retryPolicy = policy || undefined;
96
+ return this;
97
+ }
98
+ getRetryPolicy() {
99
+ return this.retryPolicy;
100
+ }
101
+ /**
102
+ * Resolve a path to a full URL. If the path is already an absolute URL
103
+ * (starts with http:// or https://), it is returned as-is.
104
+ */
105
+ getUrl(path) {
106
+ if (path.startsWith('http://') || path.startsWith('https://')) {
107
+ return removeTrailingSlash(path);
108
+ }
109
+ return removeTrailingSlash(join(this.baseUrl, path));
110
+ }
111
+ get(path, params) {
112
+ return this.request('GET', path, params);
113
+ }
114
+ del(path, params) {
115
+ return this.request('DELETE', path, params);
116
+ }
117
+ delete(path, params) {
118
+ return this.request('DELETE', path, params);
119
+ }
120
+ post(path, params) {
121
+ return this.request('POST', path, params);
122
+ }
123
+ put(path, params) {
124
+ return this.request('PUT', path, params);
125
+ }
126
+ /**
127
+ * You can customize the json parser by overriding this method
128
+ * @param text
129
+ * @returns
130
+ */
131
+ jsonParse(text) {
132
+ return JSON.parse(text);
133
+ }
134
+ /**
135
+ * Can be overridden to create the request
136
+ * @param fetch
137
+ * @param url
138
+ * @param init
139
+ * @returns
140
+ */
141
+ createRequest(url, init) {
142
+ return Promise.resolve(new Request(url, init));
143
+ }
144
+ handleFetchResponse(_req, _res) { }
145
+ createServerError(req, res, payload) {
146
+ const status = res.status;
147
+ let message = `Server Error: ${status}`;
148
+ if (payload) {
149
+ if (isInvalidJsonPayload(payload)) {
150
+ message += res.statusText ? ` ${res.statusText}` : '';
151
+ message += ': non-JSON response';
152
+ }
153
+ else if (isRecord(payload) && payload.message) {
154
+ message = String(payload.message);
155
+ }
156
+ else if (isRecord(payload) && payload.error) {
157
+ if (typeof payload.error === 'string') {
158
+ message = String(payload.error);
159
+ }
160
+ else if (isRecord(payload.error) && typeof payload.error.message === 'string') {
161
+ message = payload.error.message;
162
+ }
163
+ }
164
+ }
165
+ return new ServerError(message, req, res.status, payload, this.verboseErrors);
166
+ }
167
+ async readJSONPayload(res) {
168
+ return res
169
+ .text()
170
+ .then((text) => {
171
+ if (!text) {
172
+ return undefined;
173
+ }
174
+ else {
175
+ try {
176
+ return this.jsonParse(text);
177
+ }
178
+ catch (err) {
179
+ return {
180
+ status: res.status,
181
+ error: 'Not a valid JSON payload',
182
+ message: err instanceof Error ? err.message : String(err),
183
+ text: text,
184
+ };
185
+ }
186
+ }
187
+ })
188
+ .catch((err) => {
189
+ return {
190
+ status: res.status,
191
+ error: 'Unable to load response content',
192
+ message: err instanceof Error ? err.message : String(err),
193
+ };
194
+ });
195
+ }
196
+ /**
197
+ * Subclasses You can override this to do something with the response
198
+ * @param res
199
+ */
200
+ handleResponse(req, res, params) {
201
+ if (params?.reader) {
202
+ if (params.reader === 'sse') {
203
+ return sse(res);
204
+ }
205
+ else {
206
+ return params.reader.call(this, res);
207
+ }
208
+ }
209
+ else {
210
+ return this.readJSONPayload(res).then((payload) => {
211
+ if (res.ok) {
212
+ return payload;
213
+ }
214
+ else {
215
+ this.throwError(this.createServerError(req, res, payload));
216
+ }
217
+ });
218
+ }
219
+ }
220
+ async request(method, path, params) {
221
+ let url = this.getUrl(path);
222
+ if (params?.query) {
223
+ url += `?${buildQueryString(params.query)}`;
224
+ }
225
+ const headers = this.headers ? Object.assign({}, this.headers) : {};
226
+ const paramsHeaders = params?.headers;
227
+ if (paramsHeaders) {
228
+ for (const key in paramsHeaders) {
229
+ headers[key.toLowerCase()] = paramsHeaders[key];
230
+ }
231
+ }
232
+ let body;
233
+ const payload = params?.payload;
234
+ if (payload) {
235
+ if (params && params.jsonPayload === false) {
236
+ body = payload;
237
+ }
238
+ else {
239
+ body = typeof payload !== 'string' ? JSON.stringify(payload) : payload;
240
+ if (!('content-type' in headers)) {
241
+ headers['content-type'] = 'application/json';
242
+ }
243
+ }
244
+ }
245
+ // When using SSE reader, ensure the Accept header requests event-stream
246
+ if (params?.reader === 'sse') {
247
+ headers.accept = 'text/event-stream';
248
+ }
249
+ const normalizedMethod = method.toUpperCase();
250
+ const createRequestInit = () => {
251
+ return {
252
+ method: normalizedMethod,
253
+ headers: Object.assign({}, headers),
254
+ body: body,
255
+ };
256
+ };
257
+ const retryPolicy = this.resolveRetryPolicy(params);
258
+ const fetch = await this._fetch;
259
+ if (!retryPolicy) {
260
+ const req = await this.createRequest(url, createRequestInit());
261
+ let res;
262
+ try {
263
+ res = await fetch(req);
264
+ }
265
+ catch (err) {
266
+ console.error(`Failed to connect to ${url}`, err);
267
+ this.throwError(new ConnectionError(req, toError(err)));
268
+ }
269
+ this.handleFetchResponse(req, res);
270
+ return this.handleResponse(req, res, params);
271
+ }
272
+ const replayableBody = isReplayableBody(body);
273
+ let lastReq;
274
+ for (let attempt = 0; attempt < retryPolicy.attempts; attempt++) {
275
+ const req = await this.createRequest(url, createRequestInit());
276
+ lastReq = req;
277
+ let res;
278
+ try {
279
+ res = await fetch(req);
280
+ }
281
+ catch (err) {
282
+ if (!this.shouldRetryConnectionError(retryPolicy, normalizedMethod, attempt, replayableBody)) {
283
+ console.error(`Failed to connect to ${url}`, err);
284
+ this.throwError(new ConnectionError(req, toError(err)));
285
+ }
286
+ await this.waitBeforeRetry(retryPolicy, attempt);
287
+ continue;
288
+ }
289
+ this.handleFetchResponse(req, res);
290
+ if (this.shouldRetryResponse(retryPolicy, normalizedMethod, attempt, replayableBody, res)) {
291
+ await discardBody(res);
292
+ await this.waitBeforeRetry(retryPolicy, attempt, res);
293
+ continue;
294
+ }
295
+ return this.handleResponse(req, res, params);
296
+ }
297
+ if (lastReq) {
298
+ this.throwError(new ConnectionError(lastReq, new Error(`Retry attempts exhausted for ${normalizedMethod} ${url}`)));
299
+ }
300
+ throw new Error(`Retry attempts exhausted for ${normalizedMethod} ${url}`);
301
+ }
302
+ resolveRetryPolicy(params) {
303
+ if (params?.reader === 'sse' || params?.retryPolicy === false || params?.retryPolicy === null) {
304
+ return undefined;
305
+ }
306
+ const requestPolicy = params?.retryPolicy;
307
+ const clientPolicy = this.getRetryPolicy();
308
+ if (!requestPolicy && !clientPolicy) {
309
+ return undefined;
310
+ }
311
+ const policy = normalizeRetryPolicy({
312
+ ...clientPolicy,
313
+ ...requestPolicy,
314
+ });
315
+ return policy.attempts > 1 ? policy : undefined;
316
+ }
317
+ shouldRetryResponse(policy, method, attempt, replayableBody, res) {
318
+ return (attempt < policy.attempts - 1 &&
319
+ replayableBody &&
320
+ policy.methods.has(method) &&
321
+ policy.statuses.has(res.status));
322
+ }
323
+ shouldRetryConnectionError(policy, method, attempt, replayableBody) {
324
+ return (attempt < policy.attempts - 1 &&
325
+ replayableBody &&
326
+ policy.retryOnConnectionError &&
327
+ policy.methods.has(method));
328
+ }
329
+ waitBeforeRetry(policy, attempt, res) {
330
+ const delay = retryDelayMs(policy, attempt, res);
331
+ return new Promise((resolve) => setTimeout(resolve, delay));
332
+ }
333
+ /**
334
+ * Perform a request and consume the response as an SSE stream.
335
+ * Calls `onEvent` for each parsed SSE event, then returns the last event.
336
+ *
337
+ * @param method HTTP method
338
+ * @param path URL path (relative to baseUrl) or absolute URL (http:// or https://)
339
+ * @param params Request parameters (payload, headers, query)
340
+ * @param onEvent Callback for each SSE event
341
+ * @returns The last SSE event received, or undefined if the stream was empty
342
+ */
343
+ async sseRequest(method, path, params, onEvent) {
344
+ const stream = (await this.request(method, path, {
345
+ ...params,
346
+ reader: 'sse',
347
+ }));
348
+ const reader = stream.getReader();
349
+ let lastEvent;
350
+ try {
351
+ while (true) {
352
+ const { done, value } = await reader.read();
353
+ if (done)
354
+ break;
355
+ lastEvent = value;
356
+ onEvent(value);
357
+ }
358
+ }
359
+ finally {
360
+ reader.releaseLock();
361
+ }
362
+ return lastEvent;
363
+ }
364
+ /**
365
+ * Expose the fetch method
366
+ * @param input
367
+ * @param init
368
+ * @returns
369
+ */
370
+ fetch(input, init) {
371
+ return this._fetch.then((fetch) => fetch(input, init));
372
+ }
373
+ }
374
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { ClientBase, FETCH_FN, IRequestParamsWithPayload } from "./base.js";
2
- import { RequestError } from "./errors.js";
1
+ import { ClientBase, type FETCH_FN, type IRequestParamsWithPayload } from './base.js';
2
+ import type { RequestError } from './errors.js';
3
3
  export declare class AbstractFetchClient<T extends AbstractFetchClient<T>> extends ClientBase {
4
4
  headers: Record<string, string>;
5
5
  _auth?: () => Promise<string>;
@@ -7,9 +7,7 @@ export declare class AbstractFetchClient<T extends AbstractFetchClient<T>> exten
7
7
  onResponse?: (res: Response, req: Request) => void;
8
8
  response?: Response;
9
9
  constructor(baseUrl: string, fetchImpl?: FETCH_FN | Promise<FETCH_FN>);
10
- get initialHeaders(): {
11
- accept: string;
12
- };
10
+ get initialHeaders(): Record<string, string>;
13
11
  /**
14
12
  * Install an auth callback. If the callback is undefined or null then remove the auth callback.
15
13
  * @param authCb a function returning a promise that resolves to the value to use for the authorization header
@@ -21,16 +19,17 @@ export declare class AbstractFetchClient<T extends AbstractFetchClient<T>> exten
21
19
  withHeaders(headers: Record<string, string>): T;
22
20
  setHeader(key: string, value: string | undefined): void;
23
21
  createRequest(url: string, init: RequestInit): Promise<Request>;
24
- handleResponse(req: Request, res: Response, params: IRequestParamsWithPayload | undefined): Promise<any>;
22
+ handleFetchResponse(req: Request, res: Response): void;
25
23
  }
26
24
  export declare class FetchClient extends AbstractFetchClient<FetchClient> {
27
- constructor(baseUrl: string, fetchImpl?: FETCH_FN | Promise<FETCH_FN>);
28
25
  }
29
26
  export declare abstract class ApiTopic extends ClientBase {
30
27
  client: ClientBase;
31
28
  constructor(client: ClientBase, basePath: string);
32
29
  createRequest(url: string, init: RequestInit): Promise<Request>;
33
- handleResponse(req: Request, res: Response, params: IRequestParamsWithPayload | undefined): Promise<any>;
30
+ handleResponse<T = unknown>(req: Request, res: Response, params: IRequestParamsWithPayload | undefined): T | Promise<T>;
31
+ handleFetchResponse(req: Request, res: Response): void;
32
+ getRetryPolicy(): import("./base.js").IRequestRetryPolicy | undefined;
34
33
  get headers(): Record<string, string>;
35
34
  }
36
35
  //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqBhD,qBAAa,mBAAmB,CAAC,CAAC,SAAS,mBAAmB,CAAC,CAAC,CAAC,CAAE,SAAQ,UAAU;IACjF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9B,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnD,QAAQ,CAAC,EAAE,QAAQ,CAAC;gBAER,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMrE,IAAI,cAAc,2BAMjB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;IAKxD,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,KAAK,GAExB,CAAC;IAG/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAMZ,CAAC;IAG/B,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAQb,CAAC;IAG/B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;IAQ1C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW;IAelD,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI;CAIzD;AAED,qBAAa,WAAY,SAAQ,mBAAmB,CAAC,WAAW,CAAC;CAAG;AAEpE,8BAAsB,QAAS,SAAQ,UAAU;IAElC,MAAM,EAAE,UAAU;gBAAlB,MAAM,EAAE,UAAU,EACzB,QAAQ,EAAE,MAAM;IAUpB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D,cAAc,CAAC,CAAC,GAAG,OAAO,EACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,yBAAyB,GAAG,SAAS,GAC9C,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI;IAItD,cAAc;IAId,IAAI,OAAO,2BAEV;CACJ"}