@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.
- package/README.md +51 -0
- package/lib/base.d.ts +169 -0
- package/lib/base.d.ts.map +1 -0
- package/lib/base.js +481 -0
- package/lib/base.js.map +1 -0
- package/lib/{types/client.d.ts → client.d.ts} +8 -8
- package/lib/client.d.ts.map +1 -0
- package/lib/{esm/client.js → client.js} +27 -11
- package/lib/client.js.map +1 -0
- package/lib/{types/errors.d.ts → errors.d.ts} +5 -5
- package/lib/errors.d.ts.map +1 -0
- package/lib/{esm/errors.js → errors.js} +22 -9
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5 -0
- package/lib/index.js.map +1 -0
- package/lib/{types/sse → sse}/EventSourceParserStream.d.ts +4 -1
- package/lib/sse/EventSourceParserStream.d.ts.map +1 -0
- package/lib/{esm/sse → sse}/EventSourceParserStream.js +5 -4
- package/lib/sse/EventSourceParserStream.js.map +1 -0
- package/lib/sse/TextDecoderStream.d.ts.map +1 -0
- package/lib/{esm/sse → sse}/TextDecoderStream.js +2 -2
- package/lib/sse/TextDecoderStream.js.map +1 -0
- package/lib/{types/sse → sse}/index.d.ts +7 -2
- package/lib/sse/index.d.ts.map +1 -0
- package/lib/{esm/sse → sse}/index.js +3 -3
- package/lib/sse/index.js.map +1 -0
- package/lib/{types/utils.d.ts → utils.d.ts} +1 -1
- package/lib/utils.d.ts.map +1 -0
- package/lib/{esm/utils.js → utils.js} +3 -3
- package/lib/utils.js.map +1 -0
- package/package.json +22 -25
- package/src/base.ts +432 -79
- package/src/client.ts +50 -24
- package/src/errors.ts +28 -15
- package/src/index.ts +4 -4
- package/src/sse/EventSourceParserStream.ts +13 -10
- package/src/sse/TextDecoderStream.ts +16 -11
- package/src/sse/index.ts +14 -8
- package/src/utils.ts +5 -6
- package/lib/cjs/base.js +0 -240
- package/lib/cjs/base.js.map +0 -1
- package/lib/cjs/client.js +0 -115
- package/lib/cjs/client.js.map +0 -1
- package/lib/cjs/errors.js +0 -63
- package/lib/cjs/errors.js.map +0 -1
- package/lib/cjs/index.js +0 -21
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/package.json +0 -3
- package/lib/cjs/sse/EventSourceParserStream.js +0 -41
- package/lib/cjs/sse/EventSourceParserStream.js.map +0 -1
- package/lib/cjs/sse/TextDecoderStream.js +0 -53
- package/lib/cjs/sse/TextDecoderStream.js.map +0 -1
- package/lib/cjs/sse/index.js +0 -27
- package/lib/cjs/sse/index.js.map +0 -1
- package/lib/cjs/utils.js +0 -38
- package/lib/cjs/utils.js.map +0 -1
- package/lib/esm/base.js +0 -235
- package/lib/esm/base.js.map +0 -1
- package/lib/esm/client.js.map +0 -1
- package/lib/esm/errors.js.map +0 -1
- package/lib/esm/index.js +0 -5
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/sse/EventSourceParserStream.js.map +0 -1
- package/lib/esm/sse/TextDecoderStream.js.map +0 -1
- package/lib/esm/sse/index.js.map +0 -1
- package/lib/esm/utils.js.map +0 -1
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/types/base.d.ts +0 -83
- package/lib/types/base.d.ts.map +0 -1
- package/lib/types/client.d.ts.map +0 -1
- package/lib/types/errors.d.ts.map +0 -1
- package/lib/types/index.d.ts +0 -5
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/sse/EventSourceParserStream.d.ts.map +0 -1
- package/lib/types/sse/TextDecoderStream.d.ts.map +0 -1
- package/lib/types/sse/index.d.ts.map +0 -1
- package/lib/types/utils.d.ts.map +0 -1
- /package/lib/{types/sse → sse}/TextDecoderStream.d.ts +0 -0
package/lib/base.js
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
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
|
+
/**
|
|
33
|
+
* True for a 5xx whose Content-Type is not JSON. The application serializes its errors as JSON, so a
|
|
34
|
+
* non-JSON 5xx (HTML/text, or no content-type) is an edge/LB/gateway failure — e.g. a Cloud Run
|
|
35
|
+
* "no available instance" or GFE "try again in 30 seconds" page — which is transient and retryable.
|
|
36
|
+
* Reads only headers (no body consumption), so it is safe to call before deciding to retry.
|
|
37
|
+
*/
|
|
38
|
+
function isNonJsonServerError(res) {
|
|
39
|
+
if (res.status < 500) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const contentType = (res.headers.get('content-type') ?? '').toLowerCase();
|
|
43
|
+
return !contentType.includes('json');
|
|
44
|
+
}
|
|
45
|
+
function normalizeRetryPolicy(policy) {
|
|
46
|
+
const attempts = Math.max(1, Math.floor(policy.attempts ?? DEFAULT_RETRY_ATTEMPTS));
|
|
47
|
+
const baseDelayMs = Math.max(0, policy.baseDelayMs ?? DEFAULT_RETRY_BASE_DELAY_MS);
|
|
48
|
+
const maxDelayMs = Math.max(baseDelayMs, policy.maxDelayMs ?? DEFAULT_RETRY_MAX_DELAY_MS);
|
|
49
|
+
return {
|
|
50
|
+
attempts,
|
|
51
|
+
methods: new Set((policy.methods ?? DEFAULT_RETRY_METHODS).map((method) => method.toUpperCase())),
|
|
52
|
+
statuses: new Set(policy.statuses ?? DEFAULT_RETRY_STATUSES),
|
|
53
|
+
retryNonJsonServerErrors: policy.retryNonJsonServerErrors ?? true,
|
|
54
|
+
retryOnConnectionError: policy.retryOnConnectionError ?? true,
|
|
55
|
+
baseDelayMs,
|
|
56
|
+
maxDelayMs,
|
|
57
|
+
jitter: policy.jitter ?? true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function retryAfterDelayMs(res) {
|
|
61
|
+
const retryAfter = res.headers.get('retry-after');
|
|
62
|
+
if (!retryAfter) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const seconds = Number(retryAfter);
|
|
66
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
67
|
+
return seconds * 1000;
|
|
68
|
+
}
|
|
69
|
+
const retryAt = Date.parse(retryAfter);
|
|
70
|
+
if (!Number.isNaN(retryAt)) {
|
|
71
|
+
return Math.max(0, retryAt - Date.now());
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
function retryDelayMs(policy, attempt, res) {
|
|
76
|
+
const retryAfter = res ? retryAfterDelayMs(res) : undefined;
|
|
77
|
+
const delay = retryAfter ?? Math.min(policy.maxDelayMs, policy.baseDelayMs * 2 ** attempt);
|
|
78
|
+
return policy.jitter ? Math.floor(Math.random() * delay) : delay;
|
|
79
|
+
}
|
|
80
|
+
function toError(err) {
|
|
81
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* True for an AbortSignal-driven failure (caller abort or our timeout). Checks `name` rather than
|
|
85
|
+
* `instanceof Error` because runtimes surface these as a `DOMException` (`TimeoutError`/`AbortError`),
|
|
86
|
+
* which is not always an `Error` subclass in browsers.
|
|
87
|
+
*/
|
|
88
|
+
function isAbortError(err) {
|
|
89
|
+
return (typeof err === 'object' &&
|
|
90
|
+
err !== null &&
|
|
91
|
+
'name' in err &&
|
|
92
|
+
(err.name === 'TimeoutError' || err.name === 'AbortError'));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Browser + Node safe `AbortSignal.timeout(ms)`, with a fallback for runtimes that lack it.
|
|
96
|
+
*/
|
|
97
|
+
function timeoutSignal(ms) {
|
|
98
|
+
const timeoutFn = AbortSignal.timeout;
|
|
99
|
+
if (typeof timeoutFn === 'function') {
|
|
100
|
+
return timeoutFn(ms);
|
|
101
|
+
}
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
setTimeout(() => controller.abort(new DOMException('The operation timed out', 'TimeoutError')), ms);
|
|
104
|
+
return controller.signal;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Merge abort signals (caller + timeout). Uses the standard `AbortSignal.any` when available, with a
|
|
108
|
+
* manual fallback for older runtimes. Returns undefined when there is nothing to combine.
|
|
109
|
+
*/
|
|
110
|
+
function combineAbortSignals(signals) {
|
|
111
|
+
const list = signals.filter((s) => !!s);
|
|
112
|
+
if (list.length === 0) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
if (list.length === 1) {
|
|
116
|
+
return list[0];
|
|
117
|
+
}
|
|
118
|
+
const anyFn = AbortSignal.any;
|
|
119
|
+
if (typeof anyFn === 'function') {
|
|
120
|
+
return anyFn(list);
|
|
121
|
+
}
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
for (const s of list) {
|
|
124
|
+
if (s.aborted) {
|
|
125
|
+
controller.abort(s.reason);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
s.addEventListener('abort', () => controller.abort(s.reason), { once: true });
|
|
129
|
+
}
|
|
130
|
+
return controller.signal;
|
|
131
|
+
}
|
|
132
|
+
async function discardBody(res) {
|
|
133
|
+
try {
|
|
134
|
+
await res.body?.cancel();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Ignore body cleanup failures while retrying the original request.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export class ClientBase {
|
|
141
|
+
_fetch;
|
|
142
|
+
baseUrl;
|
|
143
|
+
errorFactory = (err) => err;
|
|
144
|
+
verboseErrors = true;
|
|
145
|
+
retryPolicy;
|
|
146
|
+
defaultTimeoutMs;
|
|
147
|
+
constructor(baseUrl, fetchImpl) {
|
|
148
|
+
this.baseUrl = removeTrailingSlash(baseUrl);
|
|
149
|
+
this._fetch = fetchPromise(fetchImpl);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Can be subclassed to map to custom errors
|
|
153
|
+
* @param err
|
|
154
|
+
*/
|
|
155
|
+
throwError(err) {
|
|
156
|
+
throw this.errorFactory(err);
|
|
157
|
+
}
|
|
158
|
+
withRetryPolicy(policy) {
|
|
159
|
+
this.retryPolicy = policy || undefined;
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
getRetryPolicy() {
|
|
163
|
+
return this.retryPolicy;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Set a default request timeout (ms) applied to every request unless overridden per-request via
|
|
167
|
+
* `timeoutMs`. Pass `false`/`null`/`0` to clear it. The timeout aborts the whole request
|
|
168
|
+
* (connection + response headers + body consumption) via AbortSignal.
|
|
169
|
+
*/
|
|
170
|
+
withTimeout(timeoutMs) {
|
|
171
|
+
this.defaultTimeoutMs = typeof timeoutMs === 'number' && timeoutMs > 0 ? timeoutMs : undefined;
|
|
172
|
+
return this;
|
|
173
|
+
}
|
|
174
|
+
getTimeout() {
|
|
175
|
+
return this.defaultTimeoutMs;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Resolve the effective timeout for a request: per-request `timeoutMs` wins (a positive number
|
|
179
|
+
* sets it; `false`/`null`/`0` disables it), otherwise the client default applies. SSE streams are
|
|
180
|
+
* never given a total-request timeout.
|
|
181
|
+
*/
|
|
182
|
+
resolveTimeout(params) {
|
|
183
|
+
if (params?.reader === 'sse') {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
const requestTimeout = params?.timeoutMs;
|
|
187
|
+
if (requestTimeout === false || requestTimeout === null) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
if (typeof requestTimeout === 'number') {
|
|
191
|
+
return requestTimeout > 0 ? requestTimeout : undefined;
|
|
192
|
+
}
|
|
193
|
+
const clientTimeout = this.getTimeout();
|
|
194
|
+
return clientTimeout && clientTimeout > 0 ? clientTimeout : undefined;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Resolve a path to a full URL. If the path is already an absolute URL
|
|
198
|
+
* (starts with http:// or https://), it is returned as-is.
|
|
199
|
+
*/
|
|
200
|
+
getUrl(path) {
|
|
201
|
+
if (path.startsWith('http://') || path.startsWith('https://')) {
|
|
202
|
+
return removeTrailingSlash(path);
|
|
203
|
+
}
|
|
204
|
+
return removeTrailingSlash(join(this.baseUrl, path));
|
|
205
|
+
}
|
|
206
|
+
get(path, params) {
|
|
207
|
+
return this.request('GET', path, params);
|
|
208
|
+
}
|
|
209
|
+
del(path, params) {
|
|
210
|
+
return this.request('DELETE', path, params);
|
|
211
|
+
}
|
|
212
|
+
delete(path, params) {
|
|
213
|
+
return this.request('DELETE', path, params);
|
|
214
|
+
}
|
|
215
|
+
post(path, params) {
|
|
216
|
+
return this.request('POST', path, params);
|
|
217
|
+
}
|
|
218
|
+
put(path, params) {
|
|
219
|
+
return this.request('PUT', path, params);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* You can customize the json parser by overriding this method
|
|
223
|
+
* @param text
|
|
224
|
+
* @returns
|
|
225
|
+
*/
|
|
226
|
+
jsonParse(text) {
|
|
227
|
+
return JSON.parse(text);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Can be overridden to create the request
|
|
231
|
+
* @param fetch
|
|
232
|
+
* @param url
|
|
233
|
+
* @param init
|
|
234
|
+
* @returns
|
|
235
|
+
*/
|
|
236
|
+
createRequest(url, init) {
|
|
237
|
+
return Promise.resolve(new Request(url, init));
|
|
238
|
+
}
|
|
239
|
+
handleFetchResponse(_req, _res) { }
|
|
240
|
+
createServerError(req, res, payload) {
|
|
241
|
+
const status = res.status;
|
|
242
|
+
let message = `Server Error: ${status}`;
|
|
243
|
+
if (payload) {
|
|
244
|
+
if (isInvalidJsonPayload(payload)) {
|
|
245
|
+
message += res.statusText ? ` ${res.statusText}` : '';
|
|
246
|
+
message += ': non-JSON response';
|
|
247
|
+
}
|
|
248
|
+
else if (isRecord(payload) && payload.message) {
|
|
249
|
+
message = String(payload.message);
|
|
250
|
+
}
|
|
251
|
+
else if (isRecord(payload) && payload.error) {
|
|
252
|
+
if (typeof payload.error === 'string') {
|
|
253
|
+
message = String(payload.error);
|
|
254
|
+
}
|
|
255
|
+
else if (isRecord(payload.error) && typeof payload.error.message === 'string') {
|
|
256
|
+
message = payload.error.message;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return new ServerError(message, req, res.status, payload, this.verboseErrors);
|
|
261
|
+
}
|
|
262
|
+
async readJSONPayload(res) {
|
|
263
|
+
return res
|
|
264
|
+
.text()
|
|
265
|
+
.then((text) => {
|
|
266
|
+
if (!text) {
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
try {
|
|
271
|
+
return this.jsonParse(text);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
return {
|
|
275
|
+
status: res.status,
|
|
276
|
+
error: 'Not a valid JSON payload',
|
|
277
|
+
message: err instanceof Error ? err.message : String(err),
|
|
278
|
+
text: text,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
})
|
|
283
|
+
.catch((err) => {
|
|
284
|
+
// A timeout/abort during body consumption is a real failure — surface it instead of
|
|
285
|
+
// swallowing it into an error payload that would otherwise be returned as the result.
|
|
286
|
+
if (isAbortError(err)) {
|
|
287
|
+
throw err;
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
status: res.status,
|
|
291
|
+
error: 'Unable to load response content',
|
|
292
|
+
message: err instanceof Error ? err.message : String(err),
|
|
293
|
+
};
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Subclasses You can override this to do something with the response
|
|
298
|
+
* @param res
|
|
299
|
+
*/
|
|
300
|
+
handleResponse(req, res, params) {
|
|
301
|
+
if (params?.reader) {
|
|
302
|
+
if (params.reader === 'sse') {
|
|
303
|
+
return sse(res);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
return params.reader.call(this, res);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
return this.readJSONPayload(res).then((payload) => {
|
|
311
|
+
if (res.ok) {
|
|
312
|
+
return payload;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
this.throwError(this.createServerError(req, res, payload));
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
async request(method, path, params) {
|
|
321
|
+
let url = this.getUrl(path);
|
|
322
|
+
if (params?.query) {
|
|
323
|
+
url += `?${buildQueryString(params.query)}`;
|
|
324
|
+
}
|
|
325
|
+
const headers = this.headers ? Object.assign({}, this.headers) : {};
|
|
326
|
+
const paramsHeaders = params?.headers;
|
|
327
|
+
if (paramsHeaders) {
|
|
328
|
+
for (const key in paramsHeaders) {
|
|
329
|
+
headers[key.toLowerCase()] = paramsHeaders[key];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
let body;
|
|
333
|
+
const payload = params?.payload;
|
|
334
|
+
if (payload) {
|
|
335
|
+
if (params && params.jsonPayload === false) {
|
|
336
|
+
body = payload;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
body = typeof payload !== 'string' ? JSON.stringify(payload) : payload;
|
|
340
|
+
if (!('content-type' in headers)) {
|
|
341
|
+
headers['content-type'] = 'application/json';
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// When using SSE reader, ensure the Accept header requests event-stream
|
|
346
|
+
if (params?.reader === 'sse') {
|
|
347
|
+
headers.accept = 'text/event-stream';
|
|
348
|
+
}
|
|
349
|
+
const normalizedMethod = method.toUpperCase();
|
|
350
|
+
// Resolved once; createRequestInit() then mints a FRESH timeout signal per attempt so each
|
|
351
|
+
// retry gets its own deadline. The signal is set on the Request, so it bounds the connection,
|
|
352
|
+
// the wait for response headers, AND body consumption (handleResponse reads res.text()).
|
|
353
|
+
const timeoutMs = this.resolveTimeout(params);
|
|
354
|
+
const createRequestInit = () => {
|
|
355
|
+
const signal = combineAbortSignals([params?.signal, timeoutMs ? timeoutSignal(timeoutMs) : undefined]);
|
|
356
|
+
const init = {
|
|
357
|
+
method: normalizedMethod,
|
|
358
|
+
headers: Object.assign({}, headers),
|
|
359
|
+
body: body,
|
|
360
|
+
};
|
|
361
|
+
if (signal) {
|
|
362
|
+
init.signal = signal;
|
|
363
|
+
}
|
|
364
|
+
return init;
|
|
365
|
+
};
|
|
366
|
+
const retryPolicy = this.resolveRetryPolicy(params);
|
|
367
|
+
const fetch = await this._fetch;
|
|
368
|
+
if (!retryPolicy) {
|
|
369
|
+
const req = await this.createRequest(url, createRequestInit());
|
|
370
|
+
let res;
|
|
371
|
+
try {
|
|
372
|
+
res = await fetch(req);
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
console.error(`Failed to connect to ${url}`, err);
|
|
376
|
+
this.throwError(new ConnectionError(req, toError(err)));
|
|
377
|
+
}
|
|
378
|
+
this.handleFetchResponse(req, res);
|
|
379
|
+
return this.handleResponse(req, res, params);
|
|
380
|
+
}
|
|
381
|
+
const replayableBody = isReplayableBody(body);
|
|
382
|
+
let lastReq;
|
|
383
|
+
for (let attempt = 0; attempt < retryPolicy.attempts; attempt++) {
|
|
384
|
+
const req = await this.createRequest(url, createRequestInit());
|
|
385
|
+
lastReq = req;
|
|
386
|
+
let res;
|
|
387
|
+
try {
|
|
388
|
+
res = await fetch(req);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
if (!this.shouldRetryConnectionError(retryPolicy, normalizedMethod, attempt, replayableBody)) {
|
|
392
|
+
console.error(`Failed to connect to ${url}`, err);
|
|
393
|
+
this.throwError(new ConnectionError(req, toError(err)));
|
|
394
|
+
}
|
|
395
|
+
await this.waitBeforeRetry(retryPolicy, attempt);
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
this.handleFetchResponse(req, res);
|
|
399
|
+
if (this.shouldRetryResponse(retryPolicy, normalizedMethod, attempt, replayableBody, res)) {
|
|
400
|
+
await discardBody(res);
|
|
401
|
+
await this.waitBeforeRetry(retryPolicy, attempt, res);
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
return this.handleResponse(req, res, params);
|
|
405
|
+
}
|
|
406
|
+
if (lastReq) {
|
|
407
|
+
this.throwError(new ConnectionError(lastReq, new Error(`Retry attempts exhausted for ${normalizedMethod} ${url}`)));
|
|
408
|
+
}
|
|
409
|
+
throw new Error(`Retry attempts exhausted for ${normalizedMethod} ${url}`);
|
|
410
|
+
}
|
|
411
|
+
resolveRetryPolicy(params) {
|
|
412
|
+
if (params?.reader === 'sse' || params?.retryPolicy === false || params?.retryPolicy === null) {
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
415
|
+
const requestPolicy = params?.retryPolicy;
|
|
416
|
+
const clientPolicy = this.getRetryPolicy();
|
|
417
|
+
if (!requestPolicy && !clientPolicy) {
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
420
|
+
const policy = normalizeRetryPolicy({
|
|
421
|
+
...clientPolicy,
|
|
422
|
+
...requestPolicy,
|
|
423
|
+
});
|
|
424
|
+
return policy.attempts > 1 ? policy : undefined;
|
|
425
|
+
}
|
|
426
|
+
shouldRetryResponse(policy, method, attempt, replayableBody, res) {
|
|
427
|
+
const retryableStatus = policy.statuses.has(res.status) || (policy.retryNonJsonServerErrors && isNonJsonServerError(res));
|
|
428
|
+
return attempt < policy.attempts - 1 && replayableBody && policy.methods.has(method) && retryableStatus;
|
|
429
|
+
}
|
|
430
|
+
shouldRetryConnectionError(policy, method, attempt, replayableBody) {
|
|
431
|
+
return (attempt < policy.attempts - 1 &&
|
|
432
|
+
replayableBody &&
|
|
433
|
+
policy.retryOnConnectionError &&
|
|
434
|
+
policy.methods.has(method));
|
|
435
|
+
}
|
|
436
|
+
waitBeforeRetry(policy, attempt, res) {
|
|
437
|
+
const delay = retryDelayMs(policy, attempt, res);
|
|
438
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Perform a request and consume the response as an SSE stream.
|
|
442
|
+
* Calls `onEvent` for each parsed SSE event, then returns the last event.
|
|
443
|
+
*
|
|
444
|
+
* @param method HTTP method
|
|
445
|
+
* @param path URL path (relative to baseUrl) or absolute URL (http:// or https://)
|
|
446
|
+
* @param params Request parameters (payload, headers, query)
|
|
447
|
+
* @param onEvent Callback for each SSE event
|
|
448
|
+
* @returns The last SSE event received, or undefined if the stream was empty
|
|
449
|
+
*/
|
|
450
|
+
async sseRequest(method, path, params, onEvent) {
|
|
451
|
+
const stream = (await this.request(method, path, {
|
|
452
|
+
...params,
|
|
453
|
+
reader: 'sse',
|
|
454
|
+
}));
|
|
455
|
+
const reader = stream.getReader();
|
|
456
|
+
let lastEvent;
|
|
457
|
+
try {
|
|
458
|
+
while (true) {
|
|
459
|
+
const { done, value } = await reader.read();
|
|
460
|
+
if (done)
|
|
461
|
+
break;
|
|
462
|
+
lastEvent = value;
|
|
463
|
+
onEvent(value);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
finally {
|
|
467
|
+
reader.releaseLock();
|
|
468
|
+
}
|
|
469
|
+
return lastEvent;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Expose the fetch method
|
|
473
|
+
* @param input
|
|
474
|
+
* @param init
|
|
475
|
+
* @returns
|
|
476
|
+
*/
|
|
477
|
+
fetch(input, init) {
|
|
478
|
+
return this._fetch.then((fetch) => fetch(input, init));
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=base.js.map
|
package/lib/base.js.map
ADDED
|
@@ -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
|
|
2
|
-
import { RequestError } from
|
|
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,18 @@ 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
|
-
|
|
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<
|
|
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;
|
|
33
|
+
getTimeout(): number | undefined;
|
|
34
34
|
get headers(): Record<string, string>;
|
|
35
35
|
}
|
|
36
36
|
//# 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,UAAU;IAIV,IAAI,OAAO,2BAEV;CACJ"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { ClientBase } from
|
|
1
|
+
import { ClientBase } from './base.js';
|
|
2
2
|
function isAuthorizationHeaderSet(headers) {
|
|
3
3
|
if (!headers)
|
|
4
4
|
return false;
|
|
5
|
-
return
|
|
5
|
+
return 'authorization' in headers;
|
|
6
|
+
}
|
|
7
|
+
function isServerFetchRuntime() {
|
|
8
|
+
const runtime = globalThis;
|
|
9
|
+
return (typeof runtime.window === 'undefined' &&
|
|
10
|
+
(typeof runtime.process?.versions?.node === 'string' ||
|
|
11
|
+
typeof runtime.process?.versions?.bun === 'string' ||
|
|
12
|
+
typeof runtime.Bun !== 'undefined'));
|
|
6
13
|
}
|
|
7
14
|
export class AbstractFetchClient extends ClientBase {
|
|
8
15
|
headers;
|
|
@@ -18,7 +25,11 @@ export class AbstractFetchClient extends ClientBase {
|
|
|
18
25
|
this.headers = this.initialHeaders;
|
|
19
26
|
}
|
|
20
27
|
get initialHeaders() {
|
|
21
|
-
|
|
28
|
+
const headers = { accept: 'application/json' };
|
|
29
|
+
if (isServerFetchRuntime()) {
|
|
30
|
+
headers['accept-encoding'] = 'br, gzip, deflate';
|
|
31
|
+
}
|
|
32
|
+
return headers;
|
|
22
33
|
}
|
|
23
34
|
/**
|
|
24
35
|
* Install an auth callback. If the callback is undefined or null then remove the auth callback.
|
|
@@ -66,24 +77,20 @@ export class AbstractFetchClient extends ClientBase {
|
|
|
66
77
|
init.headers = headers;
|
|
67
78
|
const auth = await this._auth();
|
|
68
79
|
if (auth) {
|
|
69
|
-
init.headers
|
|
80
|
+
init.headers.authorization = auth;
|
|
70
81
|
}
|
|
71
82
|
}
|
|
72
83
|
this.response = undefined;
|
|
73
84
|
const request = await super.createRequest(url, init);
|
|
74
|
-
this.onRequest
|
|
85
|
+
this.onRequest?.(request);
|
|
75
86
|
return request;
|
|
76
87
|
}
|
|
77
|
-
|
|
88
|
+
handleFetchResponse(req, res) {
|
|
78
89
|
this.response = res; // store last response
|
|
79
|
-
this.onResponse
|
|
80
|
-
return super.handleResponse(req, res, params);
|
|
90
|
+
this.onResponse?.(res, req);
|
|
81
91
|
}
|
|
82
92
|
}
|
|
83
93
|
export class FetchClient extends AbstractFetchClient {
|
|
84
|
-
constructor(baseUrl, fetchImpl) {
|
|
85
|
-
super(baseUrl, fetchImpl);
|
|
86
|
-
}
|
|
87
94
|
}
|
|
88
95
|
export class ApiTopic extends ClientBase {
|
|
89
96
|
client;
|
|
@@ -102,6 +109,15 @@ export class ApiTopic extends ClientBase {
|
|
|
102
109
|
handleResponse(req, res, params) {
|
|
103
110
|
return this.client.handleResponse(req, res, params);
|
|
104
111
|
}
|
|
112
|
+
handleFetchResponse(req, res) {
|
|
113
|
+
this.client.handleFetchResponse(req, res);
|
|
114
|
+
}
|
|
115
|
+
getRetryPolicy() {
|
|
116
|
+
return this.client.getRetryPolicy();
|
|
117
|
+
}
|
|
118
|
+
getTimeout() {
|
|
119
|
+
return this.client.getTimeout();
|
|
120
|
+
}
|
|
105
121
|
get headers() {
|
|
106
122
|
return this.client.headers;
|
|
107
123
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export declare class RequestError extends Error {
|
|
2
2
|
status: number;
|
|
3
|
-
payload:
|
|
3
|
+
payload: unknown;
|
|
4
4
|
request: Request;
|
|
5
5
|
request_info: string;
|
|
6
6
|
displayDetails: boolean;
|
|
7
7
|
original_message: string;
|
|
8
|
-
constructor(message: string, request: Request, status: number, payload:
|
|
9
|
-
get details():
|
|
8
|
+
constructor(message: string, request: Request, status: number, payload: unknown, displayDetails?: boolean);
|
|
9
|
+
get details(): unknown;
|
|
10
10
|
}
|
|
11
11
|
export declare class ServerError extends RequestError {
|
|
12
|
-
constructor(message: string, req: Request, status: number, payload:
|
|
13
|
-
updateDetails(details:
|
|
12
|
+
constructor(message: string, req: Request, status: number, payload: unknown, displayDetails?: boolean);
|
|
13
|
+
updateDetails(details: unknown): ServerError;
|
|
14
14
|
}
|
|
15
15
|
export declare class ConnectionError extends RequestError {
|
|
16
16
|
constructor(req: Request, err: Error);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAgCA,qBAAa,YAAa,SAAQ,KAAK;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,UAAO;IAUtG,IAAI,OAAO,YAEV;CACJ;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAC7B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,UAAO;IAIlG,aAAa,CAAC,OAAO,EAAE,OAAO;CAQjC;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACjC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK;CAGvC"}
|