@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.
@@ -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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
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 response = await fetch(input, { ...init, headers });
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 fetch(`${url}/api${path}`, {
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 fetch(`${url}/api${path}`, {
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 fetch(`${url}/api${path}`, {
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 fetch(`${url}/api${path}`, {
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 fetch(`${url}/api${path}`, {
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 fetch(url, { method: 'GET', signal });
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) {
@@ -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,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=http.spec.d.ts.map
@@ -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":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,GAAG,EACH,GAAG,EACH,IAAI,EACJ,QAAQ,GAET,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,2DAA2D;AAC3D,MAAM,OAAO,GAAiB,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AAChE,MAAM,GAAG,GAAG,4BAA4B,CAAC;AAEzC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC;AACnC,SAAS,CAAC,GAAG,EAAE;IACb,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;AAC/B,CAAC,CAAC,CAAC;AASH,SAAS,SAAS,CAAC,KAAkB;IACnC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC3B,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,CAAC,CAAiB,CAAC;IACnB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY;IACnB,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;AACtC,CAAC;AAED,0EAA0E;AAC1E,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,EAAE,GAAG,GAAwB,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1E,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,UAAkC,EAAE,EAAuB,EAAE,CACzF,IAAI,QAAQ,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAEvE,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,qFAAqF;QACrF,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,CAAC,OAAO,CAClB,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,EACjF,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG,YAAY,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,cAAc,CAC7E,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,CAAC,OAAO,CAClB,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAC7D,gBAAgB,CACjB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,WAAW,IAAI,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,2CAA2C;QAC1E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,yEAAyE;QACzE,MAAM,CAAC,GAAG,SAAS,CAAC;YAClB,GAAG,EAAE,CAAC,IAAI,QAAQ,CAChB,IAAI,cAAc,CAAC;gBACjB,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAC7C,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;YACD,EAAE;SACH,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9H,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,+DAA+D,OAAO,IAAI,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,MAAM,MAAM,CAAC,OAAO,CAClB,cAAc,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAC7H,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAE9E,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,GAAG,SAAS,CAAC;YAClB,YAAY;YACZ,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;SAC7G,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,EAChF,QAAQ,CACT,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,4BAA4B;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,EAClG,QAAQ,CACT,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,oCAAoC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAC/H,QAAQ,CACT,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/C,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChE,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS;IAC/D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,kDAAkD;QAClD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
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)
@@ -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;AAGtG,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"}
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.21",
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.21"
33
+ "@elaraai/e3-types": "1.0.23"
34
34
  },
35
35
  "peerDependencies": {
36
- "@elaraai/east": "1.0.21"
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.21"
45
+ "@elaraai/east-node-std": "1.0.23"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "tsc",