@elaraai/e3-api-client 1.0.21 → 1.0.23
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/dist/src/http.d.ts +90 -1
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +233 -13
- package/dist/src/http.js.map +1 -1
- package/dist/src/http.spec.d.ts +6 -0
- package/dist/src/http.spec.d.ts.map +1 -0
- package/dist/src/http.spec.js +249 -0
- package/dist/src/http.spec.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/package.json +4 -4
package/dist/src/http.d.ts
CHANGED
|
@@ -22,6 +22,22 @@ export type Response<T> = {
|
|
|
22
22
|
type: 'error';
|
|
23
23
|
value: ValueTypeOf<typeof ErrorType>;
|
|
24
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Tuning for the bounded retry-with-backoff applied to transient HTTP failures.
|
|
27
|
+
*
|
|
28
|
+
* Retries are **on by default** with a conservative policy ({@link DEFAULT_RETRY});
|
|
29
|
+
* pass a partial override to tune it, or `{ attempts: 1 }` to opt out entirely.
|
|
30
|
+
*
|
|
31
|
+
* @see {@link fetchWithRetry} for the retry and idempotency semantics.
|
|
32
|
+
*/
|
|
33
|
+
export interface RetryOptions {
|
|
34
|
+
/** Maximum total attempts, including the first (clamped to ≥ 1; default 4 — i.e. up to 3 retries). */
|
|
35
|
+
attempts?: number;
|
|
36
|
+
/** Base delay for exponential backoff, in milliseconds (default 100). */
|
|
37
|
+
baseDelayMs?: number;
|
|
38
|
+
/** Upper bound on any single backoff delay, in milliseconds (default 2000). */
|
|
39
|
+
maxDelayMs?: number;
|
|
40
|
+
}
|
|
25
41
|
/**
|
|
26
42
|
* Request options for authenticated API calls.
|
|
27
43
|
*
|
|
@@ -30,6 +46,11 @@ export type Response<T> = {
|
|
|
30
46
|
export interface RequestOptions {
|
|
31
47
|
/** Bearer token for authentication (optional depending on server) */
|
|
32
48
|
token: string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Overrides for the transient-failure retry policy (see {@link RetryOptions}).
|
|
51
|
+
* Omit to use the default policy; set `{ attempts: 1 }` to disable retries.
|
|
52
|
+
*/
|
|
53
|
+
retry?: RetryOptions;
|
|
33
54
|
}
|
|
34
55
|
/**
|
|
35
56
|
* API error with typed error details.
|
|
@@ -45,11 +66,75 @@ export declare class ApiError extends Error {
|
|
|
45
66
|
export declare class AuthError extends Error {
|
|
46
67
|
constructor(message: string);
|
|
47
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Whether a thrown `fetch` error is a connection-level failure where the request
|
|
71
|
+
* did not complete, so a retry cannot double-apply. An `AbortError` is never
|
|
72
|
+
* retryable — it is an intentional cancellation.
|
|
73
|
+
*
|
|
74
|
+
* @param err - The value thrown by `fetch`.
|
|
75
|
+
* @returns `true` when the failure is a retryable network fault.
|
|
76
|
+
*/
|
|
77
|
+
export declare function isRetryableNetworkError(err: unknown): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Parse a `Retry-After` header into a delay in milliseconds. Supports both the
|
|
80
|
+
* delta-seconds form (`"120"`) and the HTTP-date form, the latter measured from
|
|
81
|
+
* `nowMs`. Returns `undefined` when the header is absent or unparseable.
|
|
82
|
+
*
|
|
83
|
+
* @param value - The raw `Retry-After` header value, or `null` if absent.
|
|
84
|
+
* @param nowMs - The current time in epoch milliseconds, for the HTTP-date form.
|
|
85
|
+
* @returns The requested delay in milliseconds, or `undefined`.
|
|
86
|
+
*/
|
|
87
|
+
export declare function parseRetryAfter(value: string | null, nowMs: number): number | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* Compute the delay before the next attempt. A server `Retry-After` hint wins
|
|
90
|
+
* (capped at `maxDelayMs`); otherwise exponential backoff with full jitter — a
|
|
91
|
+
* uniform random point in `[0, min(maxDelayMs, baseDelayMs · 2^attempt)]` — which
|
|
92
|
+
* spreads retries so concurrent clients don't lock-step a cold upstream.
|
|
93
|
+
*
|
|
94
|
+
* @param attempt - Zero-based index of the attempt that just failed.
|
|
95
|
+
* @param cfg - The resolved retry policy.
|
|
96
|
+
* @param retryAfterMs - A server `Retry-After` delay in ms, if present.
|
|
97
|
+
* @param rng - Source of randomness for the jitter; injectable for tests.
|
|
98
|
+
* @returns The delay in milliseconds before the next attempt.
|
|
99
|
+
*/
|
|
100
|
+
export declare function computeBackoffMs(attempt: number, cfg: Required<RetryOptions>, retryAfterMs: number | undefined, rng?: () => number): number;
|
|
101
|
+
/**
|
|
102
|
+
* Run `fetch` with a bounded, idempotency-aware retry-with-backoff.
|
|
103
|
+
*
|
|
104
|
+
* The general safety net for transient failures against a freshly-deployed or
|
|
105
|
+
* cold environment. All BEAST2 helpers ({@link get}, {@link post}, {@link put},
|
|
106
|
+
* {@link del}) and the transfer helpers ({@link fetchWithAuth},
|
|
107
|
+
* {@link fetchWithProgress}) route through it.
|
|
108
|
+
*
|
|
109
|
+
* Retries:
|
|
110
|
+
* - a thrown connection-level error — the request never completed, see
|
|
111
|
+
* {@link isRetryableNetworkError} — for **any** method;
|
|
112
|
+
* - a transient response status (`429`/`502`/`503`/`504`) **only** when
|
|
113
|
+
* `idempotent` is set, honouring a `Retry-After` header when present.
|
|
114
|
+
*
|
|
115
|
+
* Never retries a `4xx` other than `429`, a `500` (which may be a real
|
|
116
|
+
* regression), or a transient status on a non-idempotent request — those are
|
|
117
|
+
* returned for the caller to surface. Honours `init.signal`: an abort during a
|
|
118
|
+
* request or a backoff delay rejects immediately with no further attempt.
|
|
119
|
+
*
|
|
120
|
+
* @param input - The request URL.
|
|
121
|
+
* @param init - Standard `fetch` init; a re-readable body (string / `Uint8Array` / `Blob`) is required for a retry to resend it.
|
|
122
|
+
* @param opts - `idempotent` gates transient-status retries; `retry` overrides the {@link DEFAULT_RETRY} policy (set `attempts: 1` to opt out).
|
|
123
|
+
* @returns The final `fetch` response — a success, or the last transient/non-retryable response for the caller to decode.
|
|
124
|
+
* @throws The original error once retries are exhausted or the error is non-retryable; the abort reason if `init.signal` aborts.
|
|
125
|
+
*/
|
|
126
|
+
export declare function fetchWithRetry(input: string | URL, init: RequestInit, opts: {
|
|
127
|
+
idempotent: boolean;
|
|
128
|
+
retry?: RetryOptions;
|
|
129
|
+
}): Promise<globalThis.Response>;
|
|
48
130
|
/**
|
|
49
131
|
* Fetch with consistent auth header injection and 401 → AuthError handling.
|
|
50
132
|
*
|
|
51
133
|
* Use this for multi-step transfer flows where raw `fetch` is needed
|
|
52
|
-
* (e.g. upload/download to presigned URLs, polling endpoints).
|
|
134
|
+
* (e.g. upload/download to presigned URLs, polling endpoints). Transient
|
|
135
|
+
* failures are retried per {@link fetchWithRetry}: thrown network errors for any
|
|
136
|
+
* method, and transient statuses for idempotent methods or requests carrying an
|
|
137
|
+
* `Idempotency-Key`.
|
|
53
138
|
*/
|
|
54
139
|
export declare function fetchWithAuth(input: string, init: RequestInit, options: RequestOptions): Promise<globalThis.Response>;
|
|
55
140
|
/**
|
|
@@ -93,6 +178,10 @@ export declare function putEmpty<T extends EastType>(url: string, path: string,
|
|
|
93
178
|
*
|
|
94
179
|
* Falls back to a single `arrayBuffer()` call if no `onProgress` callback
|
|
95
180
|
* is provided or if the response has no readable body stream.
|
|
181
|
+
*
|
|
182
|
+
* The initial request is retried per {@link fetchWithRetry} (GET is idempotent);
|
|
183
|
+
* once streaming begins a mid-stream failure surfaces, since a partial download
|
|
184
|
+
* cannot be safely resumed.
|
|
96
185
|
*/
|
|
97
186
|
export declare function fetchWithProgress(url: string, onProgress?: (downloaded: number, total: number) => void, signal?: AbortSignal): Promise<Uint8Array>;
|
|
98
187
|
/**
|
package/dist/src/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAgB,SAAS,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC,OAAO,SAAS,CAAC,CAAA;CAAE,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aACZ,OAAO,CAAC,EAAE,OAAO;gBADjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/src/http.js
CHANGED
|
@@ -27,18 +27,234 @@ export class AuthError extends Error {
|
|
|
27
27
|
this.name = 'AuthError';
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Retry layer — bounded, idempotency-aware retry-with-backoff for transient
|
|
32
|
+
// HTTP failures (cold-start / dropped-socket / rate-limit). All fetch helpers
|
|
33
|
+
// below route through fetchWithRetry, so every consumer (client, CLI, the
|
|
34
|
+
// shared compliance suite) is resilient without per-call-site retry code.
|
|
35
|
+
// =============================================================================
|
|
36
|
+
/**
|
|
37
|
+
* Transient HTTP status codes that are safe to retry for an idempotent request.
|
|
38
|
+
*
|
|
39
|
+
* These signal a temporary, server-side condition (rate limiting, a cold or
|
|
40
|
+
* overloaded upstream) rather than a client error, so a second attempt commonly
|
|
41
|
+
* succeeds. `500` is deliberately excluded — it can mask a real regression, so
|
|
42
|
+
* it is surfaced immediately rather than retried.
|
|
43
|
+
*/
|
|
44
|
+
const TRANSIENT_STATUS = new Set([429, 502, 503, 504]);
|
|
45
|
+
/**
|
|
46
|
+
* `errno` codes for connection-level failures where the request never completed,
|
|
47
|
+
* making a retry safe even for a non-idempotent method. Node surfaces these as a
|
|
48
|
+
* `TypeError: fetch failed` carrying the code on `.cause`.
|
|
49
|
+
*/
|
|
50
|
+
const RETRYABLE_NETWORK_CODES = new Set([
|
|
51
|
+
'ECONNRESET', 'ETIMEDOUT', 'EAI_AGAIN', 'ECONNREFUSED', 'EPIPE',
|
|
52
|
+
'UND_ERR_SOCKET', 'UND_ERR_CONNECT_TIMEOUT', 'UND_ERR_HEADERS_TIMEOUT',
|
|
53
|
+
]);
|
|
54
|
+
/** HTTP methods that are idempotent by definition, so retrying is always safe. */
|
|
55
|
+
const IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']);
|
|
56
|
+
/** Default retry policy: conservative, bounded, and on by default. */
|
|
57
|
+
const DEFAULT_RETRY = {
|
|
58
|
+
attempts: 4,
|
|
59
|
+
baseDelayMs: 100,
|
|
60
|
+
maxDelayMs: 2000,
|
|
61
|
+
};
|
|
62
|
+
/** Merge caller overrides onto {@link DEFAULT_RETRY}, clamping to sane bounds. */
|
|
63
|
+
function resolveRetry(retry) {
|
|
64
|
+
return {
|
|
65
|
+
attempts: Math.max(1, Math.trunc(retry?.attempts ?? DEFAULT_RETRY.attempts)),
|
|
66
|
+
baseDelayMs: Math.max(0, retry?.baseDelayMs ?? DEFAULT_RETRY.baseDelayMs),
|
|
67
|
+
maxDelayMs: Math.max(0, retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Whether the given headers carry an `Idempotency-Key` (case-insensitive). */
|
|
71
|
+
function hasIdempotencyKey(headers) {
|
|
72
|
+
if (!headers)
|
|
73
|
+
return false;
|
|
74
|
+
return new Headers(headers).has('Idempotency-Key');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Whether a request may be safely retried on a transient *status*: an idempotent
|
|
78
|
+
* method, or a `POST`/`PATCH` carrying an `Idempotency-Key` (which lets the
|
|
79
|
+
* server dedupe a re-applied call).
|
|
80
|
+
*/
|
|
81
|
+
function isIdempotentRequest(init) {
|
|
82
|
+
const method = (init.method ?? 'GET').toUpperCase();
|
|
83
|
+
if (IDEMPOTENT_METHODS.has(method))
|
|
84
|
+
return true;
|
|
85
|
+
return hasIdempotencyKey(init.headers);
|
|
86
|
+
}
|
|
87
|
+
/** Extract a Node `errno` code from a thrown error or its `.cause`, if any. */
|
|
88
|
+
function errnoCode(err) {
|
|
89
|
+
const cause = (err && typeof err === 'object') ? err.cause : undefined;
|
|
90
|
+
for (const target of [err, cause]) {
|
|
91
|
+
if (target && typeof target === 'object') {
|
|
92
|
+
const code = target.code;
|
|
93
|
+
if (typeof code === 'string')
|
|
94
|
+
return code;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Whether an error is an `AbortError` raised by an aborted {@link AbortSignal}.
|
|
101
|
+
* Duck-typed on `name` rather than `instanceof Error`, since `fetch` rejects an
|
|
102
|
+
* abort with a `DOMException` whose `Error` lineage is not guaranteed across
|
|
103
|
+
* platforms/runtimes.
|
|
104
|
+
*/
|
|
105
|
+
function isAbortError(err) {
|
|
106
|
+
return typeof err === 'object' && err !== null && err.name === 'AbortError';
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Whether a thrown `fetch` error is a connection-level failure where the request
|
|
110
|
+
* did not complete, so a retry cannot double-apply. An `AbortError` is never
|
|
111
|
+
* retryable — it is an intentional cancellation.
|
|
112
|
+
*
|
|
113
|
+
* @param err - The value thrown by `fetch`.
|
|
114
|
+
* @returns `true` when the failure is a retryable network fault.
|
|
115
|
+
*/
|
|
116
|
+
export function isRetryableNetworkError(err) {
|
|
117
|
+
if (isAbortError(err))
|
|
118
|
+
return false;
|
|
119
|
+
const code = errnoCode(err);
|
|
120
|
+
if (code !== undefined && RETRYABLE_NETWORK_CODES.has(code))
|
|
121
|
+
return true;
|
|
122
|
+
// Node's WHATWG fetch reports every connection-level fault as `TypeError: fetch failed`.
|
|
123
|
+
const message = err instanceof Error ? err.message.toLowerCase() : '';
|
|
124
|
+
return message.includes('fetch failed') || message.includes('socket hang up');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Parse a `Retry-After` header into a delay in milliseconds. Supports both the
|
|
128
|
+
* delta-seconds form (`"120"`) and the HTTP-date form, the latter measured from
|
|
129
|
+
* `nowMs`. Returns `undefined` when the header is absent or unparseable.
|
|
130
|
+
*
|
|
131
|
+
* @param value - The raw `Retry-After` header value, or `null` if absent.
|
|
132
|
+
* @param nowMs - The current time in epoch milliseconds, for the HTTP-date form.
|
|
133
|
+
* @returns The requested delay in milliseconds, or `undefined`.
|
|
134
|
+
*/
|
|
135
|
+
export function parseRetryAfter(value, nowMs) {
|
|
136
|
+
if (value === null || value.trim() === '')
|
|
137
|
+
return undefined;
|
|
138
|
+
const seconds = Number(value);
|
|
139
|
+
if (Number.isFinite(seconds))
|
|
140
|
+
return Math.max(0, seconds * 1000);
|
|
141
|
+
const dateMs = Date.parse(value);
|
|
142
|
+
if (Number.isFinite(dateMs))
|
|
143
|
+
return Math.max(0, dateMs - nowMs);
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Compute the delay before the next attempt. A server `Retry-After` hint wins
|
|
148
|
+
* (capped at `maxDelayMs`); otherwise exponential backoff with full jitter — a
|
|
149
|
+
* uniform random point in `[0, min(maxDelayMs, baseDelayMs · 2^attempt)]` — which
|
|
150
|
+
* spreads retries so concurrent clients don't lock-step a cold upstream.
|
|
151
|
+
*
|
|
152
|
+
* @param attempt - Zero-based index of the attempt that just failed.
|
|
153
|
+
* @param cfg - The resolved retry policy.
|
|
154
|
+
* @param retryAfterMs - A server `Retry-After` delay in ms, if present.
|
|
155
|
+
* @param rng - Source of randomness for the jitter; injectable for tests.
|
|
156
|
+
* @returns The delay in milliseconds before the next attempt.
|
|
157
|
+
*/
|
|
158
|
+
export function computeBackoffMs(attempt, cfg, retryAfterMs, rng = Math.random) {
|
|
159
|
+
if (retryAfterMs !== undefined)
|
|
160
|
+
return Math.min(retryAfterMs, cfg.maxDelayMs);
|
|
161
|
+
const ceiling = Math.min(cfg.maxDelayMs, cfg.baseDelayMs * 2 ** attempt);
|
|
162
|
+
return rng() * ceiling;
|
|
163
|
+
}
|
|
164
|
+
/** Resolve after `ms`, or reject early with the abort reason if `signal` fires. */
|
|
165
|
+
function sleep(ms, signal) {
|
|
166
|
+
if (signal?.aborted)
|
|
167
|
+
return Promise.reject(signal.reason);
|
|
168
|
+
if (ms <= 0)
|
|
169
|
+
return Promise.resolve();
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
const onAbort = () => {
|
|
172
|
+
clearTimeout(timer);
|
|
173
|
+
reject(signal?.reason);
|
|
174
|
+
};
|
|
175
|
+
const timer = setTimeout(() => {
|
|
176
|
+
signal?.removeEventListener('abort', onAbort);
|
|
177
|
+
resolve();
|
|
178
|
+
}, ms);
|
|
179
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Run `fetch` with a bounded, idempotency-aware retry-with-backoff.
|
|
184
|
+
*
|
|
185
|
+
* The general safety net for transient failures against a freshly-deployed or
|
|
186
|
+
* cold environment. All BEAST2 helpers ({@link get}, {@link post}, {@link put},
|
|
187
|
+
* {@link del}) and the transfer helpers ({@link fetchWithAuth},
|
|
188
|
+
* {@link fetchWithProgress}) route through it.
|
|
189
|
+
*
|
|
190
|
+
* Retries:
|
|
191
|
+
* - a thrown connection-level error — the request never completed, see
|
|
192
|
+
* {@link isRetryableNetworkError} — for **any** method;
|
|
193
|
+
* - a transient response status (`429`/`502`/`503`/`504`) **only** when
|
|
194
|
+
* `idempotent` is set, honouring a `Retry-After` header when present.
|
|
195
|
+
*
|
|
196
|
+
* Never retries a `4xx` other than `429`, a `500` (which may be a real
|
|
197
|
+
* regression), or a transient status on a non-idempotent request — those are
|
|
198
|
+
* returned for the caller to surface. Honours `init.signal`: an abort during a
|
|
199
|
+
* request or a backoff delay rejects immediately with no further attempt.
|
|
200
|
+
*
|
|
201
|
+
* @param input - The request URL.
|
|
202
|
+
* @param init - Standard `fetch` init; a re-readable body (string / `Uint8Array` / `Blob`) is required for a retry to resend it.
|
|
203
|
+
* @param opts - `idempotent` gates transient-status retries; `retry` overrides the {@link DEFAULT_RETRY} policy (set `attempts: 1` to opt out).
|
|
204
|
+
* @returns The final `fetch` response — a success, or the last transient/non-retryable response for the caller to decode.
|
|
205
|
+
* @throws The original error once retries are exhausted or the error is non-retryable; the abort reason if `init.signal` aborts.
|
|
206
|
+
*/
|
|
207
|
+
export async function fetchWithRetry(input, init, opts) {
|
|
208
|
+
const cfg = resolveRetry(opts.retry);
|
|
209
|
+
const signal = init.signal ?? undefined;
|
|
210
|
+
for (let attempt = 0;; attempt++) {
|
|
211
|
+
if (signal?.aborted)
|
|
212
|
+
throw signal.reason;
|
|
213
|
+
let response;
|
|
214
|
+
try {
|
|
215
|
+
response = await fetch(input, init);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (isAbortError(err))
|
|
219
|
+
throw err;
|
|
220
|
+
if (!isRetryableNetworkError(err) || attempt + 1 >= cfg.attempts)
|
|
221
|
+
throw err;
|
|
222
|
+
await sleep(computeBackoffMs(attempt, cfg, undefined), signal);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
// Success, or a status we never retry (2xx/3xx, 4xx other than 429, 500):
|
|
226
|
+
// hand it back for the caller to decode.
|
|
227
|
+
if (response.ok || !TRANSIENT_STATUS.has(response.status))
|
|
228
|
+
return response;
|
|
229
|
+
// Transient status: retry only for idempotent requests, only if attempts remain.
|
|
230
|
+
if (!opts.idempotent || attempt + 1 >= cfg.attempts)
|
|
231
|
+
return response;
|
|
232
|
+
const retryAfterMs = parseRetryAfter(response.headers.get('retry-after'), Date.now());
|
|
233
|
+
// Drain the discarded response so the socket can be reused. A half-broken
|
|
234
|
+
// cold-start stream can make cancel() reject — that must not abort the retry.
|
|
235
|
+
await response.body?.cancel().catch(() => { });
|
|
236
|
+
await sleep(computeBackoffMs(attempt, cfg, retryAfterMs), signal);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
30
239
|
/**
|
|
31
240
|
* Fetch with consistent auth header injection and 401 → AuthError handling.
|
|
32
241
|
*
|
|
33
242
|
* Use this for multi-step transfer flows where raw `fetch` is needed
|
|
34
|
-
* (e.g. upload/download to presigned URLs, polling endpoints).
|
|
243
|
+
* (e.g. upload/download to presigned URLs, polling endpoints). Transient
|
|
244
|
+
* failures are retried per {@link fetchWithRetry}: thrown network errors for any
|
|
245
|
+
* method, and transient statuses for idempotent methods or requests carrying an
|
|
246
|
+
* `Idempotency-Key`.
|
|
35
247
|
*/
|
|
36
248
|
export async function fetchWithAuth(input, init, options) {
|
|
37
249
|
const headers = { ...init.headers };
|
|
38
250
|
if (options.token) {
|
|
39
251
|
headers['Authorization'] = `Bearer ${options.token}`;
|
|
40
252
|
}
|
|
41
|
-
const
|
|
253
|
+
const withHeaders = { ...init, headers };
|
|
254
|
+
const response = await fetchWithRetry(input, withHeaders, {
|
|
255
|
+
idempotent: isIdempotentRequest(withHeaders),
|
|
256
|
+
retry: options.retry,
|
|
257
|
+
});
|
|
42
258
|
if (response.status === 401) {
|
|
43
259
|
throw new AuthError(await response.text());
|
|
44
260
|
}
|
|
@@ -85,13 +301,13 @@ const STATUS_CODES = {
|
|
|
85
301
|
* @throws {AuthError} On 401 Unauthorized
|
|
86
302
|
*/
|
|
87
303
|
export async function get(url, path, successType, options) {
|
|
88
|
-
const response = await
|
|
304
|
+
const response = await fetchWithRetry(`${url}/api${path}`, {
|
|
89
305
|
method: 'GET',
|
|
90
306
|
headers: {
|
|
91
307
|
'Accept': BEAST2_CONTENT_TYPE,
|
|
92
308
|
...(options.token ? { 'Authorization': `Bearer ${options.token}` } : {}),
|
|
93
309
|
},
|
|
94
|
-
});
|
|
310
|
+
}, { idempotent: true, retry: options.retry });
|
|
95
311
|
return decodeResponse(response, successType);
|
|
96
312
|
}
|
|
97
313
|
/**
|
|
@@ -102,7 +318,7 @@ export async function get(url, path, successType, options) {
|
|
|
102
318
|
*/
|
|
103
319
|
export async function post(url, path, body, requestType, successType, options, extraHeaders) {
|
|
104
320
|
const encode = encodeBeast2For(requestType);
|
|
105
|
-
const response = await
|
|
321
|
+
const response = await fetchWithRetry(`${url}/api${path}`, {
|
|
106
322
|
method: 'POST',
|
|
107
323
|
headers: {
|
|
108
324
|
'Content-Type': BEAST2_CONTENT_TYPE,
|
|
@@ -111,7 +327,7 @@ export async function post(url, path, body, requestType, successType, options, e
|
|
|
111
327
|
...extraHeaders,
|
|
112
328
|
},
|
|
113
329
|
body: encode(body),
|
|
114
|
-
});
|
|
330
|
+
}, { idempotent: hasIdempotencyKey(extraHeaders), retry: options.retry });
|
|
115
331
|
return decodeResponse(response, successType);
|
|
116
332
|
}
|
|
117
333
|
/**
|
|
@@ -121,7 +337,7 @@ export async function post(url, path, body, requestType, successType, options, e
|
|
|
121
337
|
*/
|
|
122
338
|
export async function put(url, path, body, requestType, successType, options) {
|
|
123
339
|
const encode = encodeBeast2For(requestType);
|
|
124
|
-
const response = await
|
|
340
|
+
const response = await fetchWithRetry(`${url}/api${path}`, {
|
|
125
341
|
method: 'PUT',
|
|
126
342
|
headers: {
|
|
127
343
|
'Content-Type': BEAST2_CONTENT_TYPE,
|
|
@@ -129,7 +345,7 @@ export async function put(url, path, body, requestType, successType, options) {
|
|
|
129
345
|
...(options.token ? { 'Authorization': `Bearer ${options.token}` } : {}),
|
|
130
346
|
},
|
|
131
347
|
body: encode(body),
|
|
132
|
-
});
|
|
348
|
+
}, { idempotent: true, retry: options.retry });
|
|
133
349
|
return decodeResponse(response, successType);
|
|
134
350
|
}
|
|
135
351
|
/**
|
|
@@ -138,13 +354,13 @@ export async function put(url, path, body, requestType, successType, options) {
|
|
|
138
354
|
* @throws {AuthError} On 401 Unauthorized
|
|
139
355
|
*/
|
|
140
356
|
export async function del(url, path, successType, options) {
|
|
141
|
-
const response = await
|
|
357
|
+
const response = await fetchWithRetry(`${url}/api${path}`, {
|
|
142
358
|
method: 'DELETE',
|
|
143
359
|
headers: {
|
|
144
360
|
'Accept': BEAST2_CONTENT_TYPE,
|
|
145
361
|
...(options.token ? { 'Authorization': `Bearer ${options.token}` } : {}),
|
|
146
362
|
},
|
|
147
|
-
});
|
|
363
|
+
}, { idempotent: true, retry: options.retry });
|
|
148
364
|
return decodeResponse(response, successType);
|
|
149
365
|
}
|
|
150
366
|
/**
|
|
@@ -153,13 +369,13 @@ export async function del(url, path, successType, options) {
|
|
|
153
369
|
* @throws {AuthError} On 401 Unauthorized
|
|
154
370
|
*/
|
|
155
371
|
export async function putEmpty(url, path, successType, options) {
|
|
156
|
-
const response = await
|
|
372
|
+
const response = await fetchWithRetry(`${url}/api${path}`, {
|
|
157
373
|
method: 'PUT',
|
|
158
374
|
headers: {
|
|
159
375
|
'Accept': BEAST2_CONTENT_TYPE,
|
|
160
376
|
...(options.token ? { 'Authorization': `Bearer ${options.token}` } : {}),
|
|
161
377
|
},
|
|
162
|
-
});
|
|
378
|
+
}, { idempotent: true, retry: options.retry });
|
|
163
379
|
return decodeResponse(response, successType);
|
|
164
380
|
}
|
|
165
381
|
/**
|
|
@@ -192,9 +408,13 @@ async function decodeResponse(response, successType) {
|
|
|
192
408
|
*
|
|
193
409
|
* Falls back to a single `arrayBuffer()` call if no `onProgress` callback
|
|
194
410
|
* is provided or if the response has no readable body stream.
|
|
411
|
+
*
|
|
412
|
+
* The initial request is retried per {@link fetchWithRetry} (GET is idempotent);
|
|
413
|
+
* once streaming begins a mid-stream failure surfaces, since a partial download
|
|
414
|
+
* cannot be safely resumed.
|
|
195
415
|
*/
|
|
196
416
|
export async function fetchWithProgress(url, onProgress, signal) {
|
|
197
|
-
const res = await
|
|
417
|
+
const res = await fetchWithRetry(url, { method: 'GET', signal }, { idempotent: true });
|
|
198
418
|
if (!res.ok)
|
|
199
419
|
throw new Error(`Download failed: ${res.status} ${res.statusText}`);
|
|
200
420
|
if (!onProgress || !res.body) {
|
package/dist/src/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.spec.d.ts","sourceRoot":"","sources":["../../src/http.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Tests for the HTTP retry layer in http.ts.
|
|
7
|
+
*
|
|
8
|
+
* The client is the shared HTTP layer used by the compliance suite, the e3 CLI,
|
|
9
|
+
* and the cloud. A single transient failure (a cold-Lambda dropped socket, or a
|
|
10
|
+
* 429/502/503/504) must not hard-fail a call, but a retry must never double-apply
|
|
11
|
+
* a non-idempotent write nor mask a real 500. These tests pin that contract:
|
|
12
|
+
* which errors/statuses are retried, the idempotency gate, the attempt cap,
|
|
13
|
+
* abort handling, and the backoff/Retry-After policy.
|
|
14
|
+
*/
|
|
15
|
+
import { describe, it, afterEach } from 'node:test';
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
17
|
+
import { encodeBeast2For, variant, IntegerType } from '@elaraai/east';
|
|
18
|
+
import { BEAST2_CONTENT_TYPE } from '@elaraai/e3-types';
|
|
19
|
+
import { fetchWithRetry, parseRetryAfter, computeBackoffMs, isRetryableNetworkError, get, del, post, ApiError, } from './http.js';
|
|
20
|
+
import { ResponseType } from './types.js';
|
|
21
|
+
// Zero-delay policy so the loop tests never actually wait.
|
|
22
|
+
const NO_WAIT = { baseDelayMs: 0, maxDelayMs: 0 };
|
|
23
|
+
const URL = 'https://example.test/api/x';
|
|
24
|
+
const realFetch = globalThis.fetch;
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
globalThis.fetch = realFetch;
|
|
27
|
+
});
|
|
28
|
+
function mockFetch(steps) {
|
|
29
|
+
const state = { calls: 0 };
|
|
30
|
+
globalThis.fetch = (async () => {
|
|
31
|
+
const i = state.calls++;
|
|
32
|
+
return steps[Math.min(i, steps.length - 1)]();
|
|
33
|
+
});
|
|
34
|
+
return state;
|
|
35
|
+
}
|
|
36
|
+
/** A connection-level fetch failure, the way Node's WHATWG fetch reports it. */
|
|
37
|
+
function networkError() {
|
|
38
|
+
throw new TypeError('fetch failed');
|
|
39
|
+
}
|
|
40
|
+
/** An error carrying an errno code on `.cause`, as undici attaches it. */
|
|
41
|
+
function networkErrorWithCause(code) {
|
|
42
|
+
return new TypeError('fetch failed', { cause: Object.assign(new Error('boom'), { code }) });
|
|
43
|
+
}
|
|
44
|
+
const ok = () => new Response('ok', { status: 200 });
|
|
45
|
+
const status = (code, headers = {}) => new Response(`{"error":{"type":"http"}}`, { status: code, headers });
|
|
46
|
+
// ===========================================================================
|
|
47
|
+
// fetchWithRetry — thrown network errors
|
|
48
|
+
// ===========================================================================
|
|
49
|
+
describe('fetchWithRetry: thrown network errors', () => {
|
|
50
|
+
it('retries a thrown "fetch failed" then resolves', async () => {
|
|
51
|
+
const m = mockFetch([networkError, ok]);
|
|
52
|
+
const res = await fetchWithRetry(URL, {}, { idempotent: false, retry: NO_WAIT });
|
|
53
|
+
assert.equal(res.status, 200);
|
|
54
|
+
assert.equal(m.calls, 2);
|
|
55
|
+
});
|
|
56
|
+
it('retries a thrown error even for a non-idempotent request (request never completed)', async () => {
|
|
57
|
+
// POST with no idempotency key: a pre-response network throw is still safe to retry.
|
|
58
|
+
const m = mockFetch([() => Promise.reject(networkErrorWithCause('ECONNRESET')), ok]);
|
|
59
|
+
const res = await fetchWithRetry(URL, { method: 'POST' }, { idempotent: false, retry: NO_WAIT });
|
|
60
|
+
assert.equal(res.status, 200);
|
|
61
|
+
assert.equal(m.calls, 2);
|
|
62
|
+
});
|
|
63
|
+
it('stops after the attempt cap on a persistent network error and rethrows', async () => {
|
|
64
|
+
const m = mockFetch([networkError]);
|
|
65
|
+
await assert.rejects(fetchWithRetry(URL, {}, { idempotent: true, retry: { ...NO_WAIT, attempts: 3 } }), (err) => err instanceof TypeError && err.message === 'fetch failed');
|
|
66
|
+
assert.equal(m.calls, 3);
|
|
67
|
+
});
|
|
68
|
+
it('does not retry a non-network thrown error', async () => {
|
|
69
|
+
const m = mockFetch([() => Promise.reject(new Error('programmer bug'))]);
|
|
70
|
+
await assert.rejects(fetchWithRetry(URL, {}, { idempotent: true, retry: NO_WAIT }), /programmer bug/);
|
|
71
|
+
assert.equal(m.calls, 1);
|
|
72
|
+
});
|
|
73
|
+
it('opts out of retries entirely with attempts: 1', async () => {
|
|
74
|
+
const m = mockFetch([networkError]);
|
|
75
|
+
await assert.rejects(fetchWithRetry(URL, {}, { idempotent: true, retry: { attempts: 1 } }));
|
|
76
|
+
assert.equal(m.calls, 1);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// ===========================================================================
|
|
80
|
+
// fetchWithRetry — transient response statuses + idempotency gate
|
|
81
|
+
// ===========================================================================
|
|
82
|
+
describe('fetchWithRetry: transient statuses', () => {
|
|
83
|
+
for (const code of [429, 502, 503, 504]) {
|
|
84
|
+
it(`retries ${code} for an idempotent request then resolves`, async () => {
|
|
85
|
+
const m = mockFetch([() => Promise.resolve(status(code)), ok]);
|
|
86
|
+
const res = await fetchWithRetry(URL, { method: 'GET' }, { idempotent: true, retry: NO_WAIT });
|
|
87
|
+
assert.equal(res.status, 200);
|
|
88
|
+
assert.equal(m.calls, 2);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
it('does NOT retry a transient status for a non-idempotent request (keyless POST)', async () => {
|
|
92
|
+
const m = mockFetch([() => Promise.resolve(status(503))]);
|
|
93
|
+
const res = await fetchWithRetry(URL, { method: 'POST' }, { idempotent: false, retry: NO_WAIT });
|
|
94
|
+
assert.equal(res.status, 503); // returned as-is for the caller to surface
|
|
95
|
+
assert.equal(m.calls, 1);
|
|
96
|
+
});
|
|
97
|
+
it('does NOT retry a 500 (could mask a real regression)', async () => {
|
|
98
|
+
const m = mockFetch([() => Promise.resolve(status(500))]);
|
|
99
|
+
const res = await fetchWithRetry(URL, { method: 'GET' }, { idempotent: true, retry: NO_WAIT });
|
|
100
|
+
assert.equal(res.status, 500);
|
|
101
|
+
assert.equal(m.calls, 1);
|
|
102
|
+
});
|
|
103
|
+
it('does NOT retry a 4xx other than 429', async () => {
|
|
104
|
+
for (const code of [400, 403, 404, 409, 422]) {
|
|
105
|
+
const m = mockFetch([() => Promise.resolve(status(code))]);
|
|
106
|
+
const res = await fetchWithRetry(URL, { method: 'GET' }, { idempotent: true, retry: NO_WAIT });
|
|
107
|
+
assert.equal(res.status, code);
|
|
108
|
+
assert.equal(m.calls, 1);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
it('stops after the attempt cap on a persistent transient status and returns the last response', async () => {
|
|
112
|
+
const m = mockFetch([() => Promise.resolve(status(503))]);
|
|
113
|
+
const res = await fetchWithRetry(URL, { method: 'GET' }, { idempotent: true, retry: { ...NO_WAIT, attempts: 4 } });
|
|
114
|
+
assert.equal(res.status, 503);
|
|
115
|
+
assert.equal(m.calls, 4);
|
|
116
|
+
});
|
|
117
|
+
it('retries even when draining the discarded transient body rejects (broken cold-start stream)', async () => {
|
|
118
|
+
// A 503 whose body stream cancel() throws must not abort the retry loop.
|
|
119
|
+
const m = mockFetch([
|
|
120
|
+
() => new Response(new ReadableStream({
|
|
121
|
+
start(c) { c.enqueue(new Uint8Array([1])); },
|
|
122
|
+
cancel() { throw new Error('cancel boom'); },
|
|
123
|
+
}), { status: 503 }),
|
|
124
|
+
ok,
|
|
125
|
+
]);
|
|
126
|
+
const res = await fetchWithRetry(URL, { method: 'GET' }, { idempotent: true, retry: NO_WAIT });
|
|
127
|
+
assert.equal(res.status, 200);
|
|
128
|
+
assert.equal(m.calls, 2);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('fetchWithRetry: Retry-After wiring', () => {
|
|
132
|
+
it('reads the Retry-After header and lets it drive the backoff delay (end-to-end)', async () => {
|
|
133
|
+
// baseDelayMs:0 means a working wiring waits ~50ms (the header), while a
|
|
134
|
+
// regression that ignored/misread the header would back off ~0ms.
|
|
135
|
+
const m = mockFetch([() => status(503, { 'retry-after': '0.05' }), ok]);
|
|
136
|
+
const t0 = Date.now();
|
|
137
|
+
const res = await fetchWithRetry(URL, { method: 'GET' }, { idempotent: true, retry: { baseDelayMs: 0, maxDelayMs: 10_000 } });
|
|
138
|
+
const elapsed = Date.now() - t0;
|
|
139
|
+
assert.equal(res.status, 200);
|
|
140
|
+
assert.equal(m.calls, 2);
|
|
141
|
+
assert.ok(elapsed >= 40, `expected the Retry-After (~50ms) to drive the delay, waited ${elapsed}ms`);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
// ===========================================================================
|
|
145
|
+
// fetchWithRetry — AbortSignal
|
|
146
|
+
// ===========================================================================
|
|
147
|
+
describe('fetchWithRetry: AbortSignal', () => {
|
|
148
|
+
it('throws on a pre-aborted signal without calling fetch', async () => {
|
|
149
|
+
const m = mockFetch([ok]);
|
|
150
|
+
const controller = new AbortController();
|
|
151
|
+
controller.abort();
|
|
152
|
+
await assert.rejects(fetchWithRetry(URL, { signal: controller.signal }, { idempotent: true, retry: NO_WAIT }));
|
|
153
|
+
assert.equal(m.calls, 0);
|
|
154
|
+
});
|
|
155
|
+
it('stops retrying when the signal aborts during backoff', async () => {
|
|
156
|
+
const controller = new AbortController();
|
|
157
|
+
// First attempt aborts the controller, then throws a retryable error; the
|
|
158
|
+
// backoff sleep must observe the abort and reject instead of retrying.
|
|
159
|
+
const m = mockFetch([() => { controller.abort(); return Promise.reject(new TypeError('fetch failed')); }]);
|
|
160
|
+
await assert.rejects(fetchWithRetry(URL, { signal: controller.signal }, { idempotent: true, retry: { baseDelayMs: 10_000, maxDelayMs: 10_000 } }));
|
|
161
|
+
assert.equal(m.calls, 1);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
// ===========================================================================
|
|
165
|
+
// Idempotency wiring through the BEAST2 helpers (get / del / post)
|
|
166
|
+
// ===========================================================================
|
|
167
|
+
describe('helper idempotency wiring', () => {
|
|
168
|
+
it('get retries a network error then decodes the success body', async () => {
|
|
169
|
+
const body = encodeBeast2For(ResponseType(IntegerType))(variant('success', 42n));
|
|
170
|
+
const m = mockFetch([
|
|
171
|
+
networkError,
|
|
172
|
+
() => Promise.resolve(new Response(body, { status: 200, headers: { 'Content-Type': BEAST2_CONTENT_TYPE } })),
|
|
173
|
+
]);
|
|
174
|
+
const result = await get(URL, '/x', IntegerType, { token: null, retry: NO_WAIT });
|
|
175
|
+
assert.equal(result, 42n);
|
|
176
|
+
assert.equal(m.calls, 2);
|
|
177
|
+
});
|
|
178
|
+
it('del (idempotent) retries a transient 503 up to the cap, then surfaces ApiError', async () => {
|
|
179
|
+
const m = mockFetch([() => Promise.resolve(status(503))]);
|
|
180
|
+
await assert.rejects(del(URL, '/x', IntegerType, { token: null, retry: { ...NO_WAIT, attempts: 3 } }), ApiError);
|
|
181
|
+
assert.equal(m.calls, 3); // idempotent DELETE retried
|
|
182
|
+
});
|
|
183
|
+
it('keyless POST does NOT retry a transient 503 — surfaces ApiError immediately', async () => {
|
|
184
|
+
const m = mockFetch([() => Promise.resolve(status(503))]);
|
|
185
|
+
await assert.rejects(post(URL, '/x', 1n, IntegerType, IntegerType, { token: null, retry: { ...NO_WAIT, attempts: 3 } }), ApiError);
|
|
186
|
+
assert.equal(m.calls, 1); // non-idempotent, no key → no retry
|
|
187
|
+
});
|
|
188
|
+
it('POST carrying an Idempotency-Key DOES retry a transient 503', async () => {
|
|
189
|
+
const m = mockFetch([() => Promise.resolve(status(503))]);
|
|
190
|
+
await assert.rejects(post(URL, '/x', 1n, IntegerType, IntegerType, { token: null, retry: { ...NO_WAIT, attempts: 3 } }, { 'Idempotency-Key': 'k1' }), ApiError);
|
|
191
|
+
assert.equal(m.calls, 3); // key makes the retry safe
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
// ===========================================================================
|
|
195
|
+
// Pure policy: isRetryableNetworkError / parseRetryAfter / computeBackoffMs
|
|
196
|
+
// ===========================================================================
|
|
197
|
+
describe('isRetryableNetworkError', () => {
|
|
198
|
+
it('treats "fetch failed" as retryable', () => {
|
|
199
|
+
assert.equal(isRetryableNetworkError(new TypeError('fetch failed')), true);
|
|
200
|
+
});
|
|
201
|
+
it('treats "socket hang up" as retryable', () => {
|
|
202
|
+
assert.equal(isRetryableNetworkError(new Error('socket hang up')), true);
|
|
203
|
+
});
|
|
204
|
+
it('treats a retryable errno code (direct or on .cause) as retryable', () => {
|
|
205
|
+
assert.equal(isRetryableNetworkError(Object.assign(new Error('x'), { code: 'ETIMEDOUT' })), true);
|
|
206
|
+
assert.equal(isRetryableNetworkError(networkErrorWithCause('EAI_AGAIN')), true);
|
|
207
|
+
});
|
|
208
|
+
it('treats a plain error as non-retryable', () => {
|
|
209
|
+
assert.equal(isRetryableNetworkError(new Error('boom')), false);
|
|
210
|
+
});
|
|
211
|
+
it('never treats an AbortError as retryable', () => {
|
|
212
|
+
const e = new Error('aborted');
|
|
213
|
+
e.name = 'AbortError';
|
|
214
|
+
assert.equal(isRetryableNetworkError(e), false);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe('parseRetryAfter', () => {
|
|
218
|
+
const now = Date.parse('2020-01-01T00:00:00Z');
|
|
219
|
+
it('parses the delta-seconds form to milliseconds', () => {
|
|
220
|
+
assert.equal(parseRetryAfter('2', now), 2000);
|
|
221
|
+
assert.equal(parseRetryAfter('0', now), 0);
|
|
222
|
+
});
|
|
223
|
+
it('parses the HTTP-date form relative to now', () => {
|
|
224
|
+
const when = new Date(now + 5000).toUTCString();
|
|
225
|
+
assert.equal(parseRetryAfter(when, now), 5000);
|
|
226
|
+
});
|
|
227
|
+
it('returns undefined for an absent or unparseable header', () => {
|
|
228
|
+
assert.equal(parseRetryAfter(null, now), undefined);
|
|
229
|
+
assert.equal(parseRetryAfter(' ', now), undefined);
|
|
230
|
+
assert.equal(parseRetryAfter('soon', now), undefined);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
describe('computeBackoffMs', () => {
|
|
234
|
+
const cfg = { attempts: 4, baseDelayMs: 100, maxDelayMs: 2000 };
|
|
235
|
+
it('honours a Retry-After hint, capped at maxDelayMs', () => {
|
|
236
|
+
assert.equal(computeBackoffMs(0, cfg, 1500), 1500);
|
|
237
|
+
assert.equal(computeBackoffMs(0, cfg, 5000), 2000); // capped
|
|
238
|
+
});
|
|
239
|
+
it('applies full jitter within [0, exponential ceiling]', () => {
|
|
240
|
+
// attempt 2 → ceiling = min(2000, 100·2^2) = 400.
|
|
241
|
+
assert.equal(computeBackoffMs(2, cfg, undefined, () => 1), 400);
|
|
242
|
+
assert.equal(computeBackoffMs(2, cfg, undefined, () => 0), 0);
|
|
243
|
+
assert.equal(computeBackoffMs(2, cfg, undefined, () => 0.5), 200);
|
|
244
|
+
});
|
|
245
|
+
it('caps the exponential ceiling at maxDelayMs', () => {
|
|
246
|
+
assert.equal(computeBackoffMs(10, cfg, undefined, () => 1), 2000);
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
//# sourceMappingURL=http.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.spec.js","sourceRoot":"","sources":["../../src/http.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export { ApiTypes } from './types.js';
|
|
12
12
|
export type { RepositoryStatus, GcRequest, GcResult, GcStartResult, GcStatusResult, AsyncOperationStatus, PackageListItem, PackageImportResult, WorkspaceInfo, WorkspaceStatusResult, DatasetStatus, DatasetStatusInfo, TaskStatus, TaskStatusInfo, WorkspaceStatusSummary, TaskListItem, TaskDetails, DataflowGraph, DataflowGraphTask, LogChunk, TaskExecutionResult, DataflowResult, DataflowEvent, ExecutionStatus, DataflowExecutionSummary, DataflowExecutionState, ExecutionListItem, ExecutionHistoryStatus, TreeKind, ListEntry, DatasetStatusDetail, RunnerValue, ExecuteLimits, Diagnostic, ExecuteResult, FunctionCallRequest, FunctionSignature, OneShotRequest, MutationCallRequest, MutationResult, RecordSignature, RecordCommitInfo, RecordHistoryResult, } from './types.js';
|
|
13
|
-
export { ApiError, AuthError, fetchWithAuth, get, post, put, del, putEmpty, unwrap } from './http.js';
|
|
14
|
-
export type { RequestOptions, Response } from './http.js';
|
|
13
|
+
export { ApiError, AuthError, fetchWithAuth, fetchWithRetry, get, post, put, del, putEmpty, unwrap } from './http.js';
|
|
14
|
+
export type { RequestOptions, RetryOptions, Response } from './http.js';
|
|
15
15
|
export { repoStatus, repoGc, repoGcStart, repoGcStatus, repoCreate, repoRemove, } from './repository.js';
|
|
16
16
|
export { repoList } from './repos.js';
|
|
17
17
|
export { packageList, packageGet, packageImport, packageExport, packageRemove, pollExport, } from './packages.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// Types
|
|
12
12
|
export { ApiTypes } from './types.js';
|
|
13
13
|
// HTTP utilities and auth
|
|
14
|
-
export { ApiError, AuthError, fetchWithAuth, get, post, put, del, putEmpty, unwrap } from './http.js';
|
|
14
|
+
export { ApiError, AuthError, fetchWithAuth, fetchWithRetry, get, post, put, del, putEmpty, unwrap } from './http.js';
|
|
15
15
|
// Repository
|
|
16
16
|
export { repoStatus, repoGc, repoGcStart, repoGcStatus, repoCreate, repoRemove, } from './repository.js';
|
|
17
17
|
// Repos (multi-repo operations)
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA+CtC,0BAA0B;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA+CtC,0BAA0B;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGtH,aAAa;AACb,OAAO,EACL,UAAU,EACV,MAAM,EACN,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,WAAW;AACX,OAAO,EACL,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAEzB,WAAW;AACX,OAAO,EACL,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElE,uBAAuB;AACvB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,wDAAwD;AACxD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE9H,aAAa;AACb,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,QAAQ;AACR,iCAAiC;AACjC,aAAa,EACb,iBAAiB,GAKlB,MAAM,iBAAiB,CAAC;AAEzB,qBAAqB;AACrB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,eAAe,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elaraai/e3-api-client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "East Execution Engine API Client - TypeScript client library for e3 API server",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"directory": "libs/e3/packages/e3-api-client"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@elaraai/e3-types": "1.0.
|
|
33
|
+
"@elaraai/e3-types": "1.0.23"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@elaraai/east": "1.0.
|
|
36
|
+
"@elaraai/east": "1.0.23"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.0.0",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"eslint": "^9.0.0",
|
|
43
43
|
"eslint-plugin-headers": "^1.3.3",
|
|
44
44
|
"typescript": "^5.6.0",
|
|
45
|
-
"@elaraai/east-node-std": "1.0.
|
|
45
|
+
"@elaraai/east-node-std": "1.0.23"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsc",
|