@ai-matrx/api 0.1.19 → 0.1.21
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/CHANGELOG.md +12 -0
- package/dist/account.d.cts +1 -1
- package/dist/account.d.ts +1 -1
- package/dist/agents.cjs +12 -12
- package/dist/agents.d.cts +1 -1
- package/dist/agents.d.ts +1 -1
- package/dist/agents.js +2 -2
- package/dist/ai.cjs +3 -3
- package/dist/ai.d.cts +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/ai.js +2 -2
- package/dist/apps.cjs +6 -6
- package/dist/apps.d.cts +1 -1
- package/dist/apps.d.ts +1 -1
- package/dist/apps.js +2 -2
- package/dist/architecture.cjs +11 -11
- package/dist/architecture.d.cts +1 -1
- package/dist/architecture.d.ts +1 -1
- package/dist/architecture.js +2 -2
- package/dist/audio.cjs +5 -5
- package/dist/audio.d.cts +1 -1
- package/dist/audio.d.ts +1 -1
- package/dist/audio.js +2 -2
- package/dist/chat.cjs +12 -12
- package/dist/chat.d.cts +1 -1
- package/dist/chat.d.ts +1 -1
- package/dist/chat.js +2 -2
- package/dist/{chunk-PKYPPATQ.cjs → chunk-2SXAAKGV.cjs} +45 -100
- package/dist/{chunk-JRPLPAIX.js → chunk-ER7WV43R.js} +4 -88
- package/dist/chunk-FNIYADWI.cjs +59 -0
- package/dist/{chunk-PIPE5OML.js → chunk-KIEAFMKB.js} +46 -100
- package/dist/{chunk-EV7AXV2X.cjs → chunk-SME66TWP.cjs} +7 -100
- package/dist/chunk-YTEOFGFC.js +57 -0
- package/dist/code.cjs +7 -7
- package/dist/code.d.cts +1 -1
- package/dist/code.d.ts +1 -1
- package/dist/code.js +2 -2
- package/dist/commerce.d.cts +1 -1
- package/dist/commerce.d.ts +1 -1
- package/dist/communications.cjs +5 -5
- package/dist/communications.d.cts +1 -1
- package/dist/communications.d.ts +1 -1
- package/dist/communications.js +2 -2
- package/dist/computer.cjs +5 -5
- package/dist/computer.d.cts +1 -1
- package/dist/computer.d.ts +1 -1
- package/dist/computer.js +2 -2
- package/dist/content.cjs +5 -5
- package/dist/content.d.cts +1 -1
- package/dist/content.d.ts +1 -1
- package/dist/content.js +2 -2
- package/dist/crm.cjs +3 -3
- package/dist/crm.d.cts +1 -1
- package/dist/crm.d.ts +1 -1
- package/dist/crm.js +2 -2
- package/dist/data.cjs +4 -4
- package/dist/data.d.cts +1 -1
- package/dist/data.d.ts +1 -1
- package/dist/data.js +2 -2
- package/dist/education.cjs +5 -5
- package/dist/education.d.cts +1 -1
- package/dist/education.d.ts +1 -1
- package/dist/education.js +2 -2
- package/dist/files.cjs +21 -21
- package/dist/files.d.cts +1 -1
- package/dist/files.d.ts +1 -1
- package/dist/files.js +2 -2
- package/dist/human-resources.d.cts +1 -1
- package/dist/human-resources.d.ts +1 -1
- package/dist/{index-YFW4xNti.d.cts → index-BXLIDtlM.d.cts} +1 -1
- package/dist/{index-YFW4xNti.d.ts → index-BXLIDtlM.d.ts} +1 -1
- package/dist/index.cjs +86 -129
- package/dist/index.d.cts +8 -123
- package/dist/index.d.ts +8 -123
- package/dist/index.js +8 -15
- package/dist/integrations.cjs +4 -4
- package/dist/integrations.d.cts +1 -1
- package/dist/integrations.d.ts +1 -1
- package/dist/integrations.js +2 -2
- package/dist/intelligence.cjs +11 -8
- package/dist/intelligence.d.cts +2 -2
- package/dist/intelligence.d.ts +2 -2
- package/dist/intelligence.js +6 -3
- package/dist/{keys.generated-BCPbimdi.d.cts → keys.generated-DE-t9kzx.d.cts} +6 -3
- package/dist/{keys.generated-BCPbimdi.d.ts → keys.generated-DE-t9kzx.d.ts} +6 -3
- package/dist/knowledge.cjs +43 -43
- package/dist/knowledge.d.cts +1 -1
- package/dist/knowledge.d.ts +1 -1
- package/dist/knowledge.js +2 -2
- package/dist/legal.cjs +7 -7
- package/dist/legal.d.cts +1 -1
- package/dist/legal.d.ts +1 -1
- package/dist/legal.js +2 -2
- package/dist/marketing.cjs +77 -77
- package/dist/marketing.d.cts +1 -1
- package/dist/marketing.d.ts +1 -1
- package/dist/marketing.js +2 -2
- package/dist/masterwork.cjs +33 -33
- package/dist/masterwork.d.cts +1 -1
- package/dist/masterwork.d.ts +1 -1
- package/dist/masterwork.js +2 -2
- package/dist/media.cjs +12 -12
- package/dist/media.d.cts +1 -1
- package/dist/media.d.ts +1 -1
- package/dist/media.js +2 -2
- package/dist/net.cjs +20 -19
- package/dist/net.js +2 -1
- package/dist/platform.cjs +4 -4
- package/dist/platform.d.cts +1 -1
- package/dist/platform.d.ts +1 -1
- package/dist/platform.js +2 -2
- package/dist/publish.cjs +8 -8
- package/dist/publish.d.cts +1 -1
- package/dist/publish.d.ts +1 -1
- package/dist/publish.js +2 -2
- package/dist/stream.cjs +11 -11
- package/dist/stream.d.cts +1 -1
- package/dist/stream.d.ts +1 -1
- package/dist/stream.js +2 -2
- package/dist/types.d.cts +2 -2
- package/dist/types.d.ts +2 -2
- package/dist/web.cjs +27 -27
- package/dist/web.d.cts +1 -1
- package/dist/web.d.ts +1 -1
- package/dist/web.js +2 -2
- package/dist/workflows.cjs +14 -14
- package/dist/workflows.d.cts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.js +2 -2
- package/package.json +2 -2
|
@@ -143,58 +143,6 @@ function toNetError(err) {
|
|
|
143
143
|
);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
// src/net/retry.ts
|
|
147
|
-
function defaultRetryOn(err) {
|
|
148
|
-
return isNetError(err) && err.retryable;
|
|
149
|
-
}
|
|
150
|
-
function sleep(ms, signal) {
|
|
151
|
-
return new Promise((resolve, reject) => {
|
|
152
|
-
const timer = setTimeout(() => {
|
|
153
|
-
resolve();
|
|
154
|
-
if (signal) signal.removeEventListener("abort", onAbort);
|
|
155
|
-
}, ms);
|
|
156
|
-
const onAbort = () => {
|
|
157
|
-
clearTimeout(timer);
|
|
158
|
-
reject(signal?.reason ?? new Error("Aborted"));
|
|
159
|
-
};
|
|
160
|
-
if (signal) {
|
|
161
|
-
if (signal.aborted) {
|
|
162
|
-
clearTimeout(timer);
|
|
163
|
-
reject(signal.reason);
|
|
164
|
-
} else {
|
|
165
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
async function withRetry(fn, opts = {}) {
|
|
171
|
-
const attempts = Math.max(1, opts.attempts ?? 3);
|
|
172
|
-
const initialDelayMs = opts.initialDelayMs ?? 250;
|
|
173
|
-
const maxDelayMs = opts.maxDelayMs ?? 4e3;
|
|
174
|
-
const factor = opts.backoffFactor ?? 2;
|
|
175
|
-
const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
|
|
176
|
-
const retryOn = opts.retryOn ?? defaultRetryOn;
|
|
177
|
-
let lastErr;
|
|
178
|
-
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
179
|
-
if (opts.signal?.aborted) throw opts.signal.reason;
|
|
180
|
-
try {
|
|
181
|
-
return await fn(attempt);
|
|
182
|
-
} catch (err) {
|
|
183
|
-
lastErr = err;
|
|
184
|
-
if (attempt === attempts || !retryOn(err)) throw err;
|
|
185
|
-
const base = Math.min(
|
|
186
|
-
maxDelayMs,
|
|
187
|
-
initialDelayMs * Math.pow(factor, attempt - 1)
|
|
188
|
-
);
|
|
189
|
-
const jitterAmount = base * jitter * (Math.random() * 2 - 1);
|
|
190
|
-
const delayMs = Math.max(0, Math.round(base + jitterAmount));
|
|
191
|
-
opts.onRetry?.(attempt, err, delayMs);
|
|
192
|
-
await sleep(delayMs, opts.signal);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
throw lastErr;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
146
|
// src/net/resilient-fetch.ts
|
|
199
147
|
var DEFAULTS = {
|
|
200
148
|
connectTimeoutMs: 15e3,
|
|
@@ -263,58 +211,56 @@ async function resilientFetch(url, init = {}, opts = {}) {
|
|
|
263
211
|
}
|
|
264
212
|
}
|
|
265
213
|
|
|
266
|
-
// src/net/
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
if (
|
|
281
|
-
|
|
282
|
-
|
|
214
|
+
// src/net/retry.ts
|
|
215
|
+
function defaultRetryOn(err) {
|
|
216
|
+
return isNetError(err) && err.retryable;
|
|
217
|
+
}
|
|
218
|
+
function sleep(ms, signal) {
|
|
219
|
+
return new Promise((resolve, reject) => {
|
|
220
|
+
const timer = setTimeout(() => {
|
|
221
|
+
resolve();
|
|
222
|
+
if (signal) signal.removeEventListener("abort", onAbort);
|
|
223
|
+
}, ms);
|
|
224
|
+
const onAbort = () => {
|
|
225
|
+
clearTimeout(timer);
|
|
226
|
+
reject(signal?.reason ?? new Error("Aborted"));
|
|
227
|
+
};
|
|
228
|
+
if (signal) {
|
|
229
|
+
if (signal.aborted) {
|
|
230
|
+
clearTimeout(timer);
|
|
231
|
+
reject(signal.reason);
|
|
232
|
+
} else {
|
|
233
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
234
|
+
}
|
|
283
235
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
}, deadline);
|
|
297
|
-
});
|
|
298
|
-
let result;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
async function withRetry(fn, opts = {}) {
|
|
239
|
+
const attempts = Math.max(1, opts.attempts ?? 3);
|
|
240
|
+
const initialDelayMs = opts.initialDelayMs ?? 250;
|
|
241
|
+
const maxDelayMs = opts.maxDelayMs ?? 4e3;
|
|
242
|
+
const factor = opts.backoffFactor ?? 2;
|
|
243
|
+
const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
|
|
244
|
+
const retryOn = opts.retryOn ?? defaultRetryOn;
|
|
245
|
+
let lastErr;
|
|
246
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
247
|
+
if (opts.signal?.aborted) throw opts.signal.reason;
|
|
299
248
|
try {
|
|
300
|
-
|
|
249
|
+
return await fn(attempt);
|
|
301
250
|
} catch (err) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
251
|
+
lastErr = err;
|
|
252
|
+
if (attempt === attempts || !retryOn(err)) throw err;
|
|
253
|
+
const base = Math.min(
|
|
254
|
+
maxDelayMs,
|
|
255
|
+
initialDelayMs * Math.pow(factor, attempt - 1)
|
|
256
|
+
);
|
|
257
|
+
const jitterAmount = base * jitter * (Math.random() * 2 - 1);
|
|
258
|
+
const delayMs = Math.max(0, Math.round(base + jitterAmount));
|
|
259
|
+
opts.onRetry?.(attempt, err, delayMs);
|
|
260
|
+
await sleep(delayMs, opts.signal);
|
|
312
261
|
}
|
|
313
|
-
if (timer !== null) clearTimeout(timer);
|
|
314
|
-
if (result.done) return;
|
|
315
|
-
opts.onHeartbeat?.(Date.now());
|
|
316
|
-
yield result.value;
|
|
317
262
|
}
|
|
263
|
+
throw lastErr;
|
|
318
264
|
}
|
|
319
265
|
|
|
320
266
|
exports.AbortedError = AbortedError;
|
|
@@ -328,7 +274,6 @@ exports.TotalTimeoutError = TotalTimeoutError;
|
|
|
328
274
|
exports.extractErrorMessage = extractErrorMessage;
|
|
329
275
|
exports.isNetError = isNetError;
|
|
330
276
|
exports.isTransportFailure = isTransportFailure;
|
|
331
|
-
exports.monitorStream = monitorStream;
|
|
332
277
|
exports.resilientFetch = resilientFetch;
|
|
333
278
|
exports.toNetError = toNetError;
|
|
334
279
|
exports.withRetry = withRetry;
|
|
@@ -1,90 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { withRetry, isTransportFailure, AbortedError, resilientFetch, TotalTimeoutError } from './chunk-KIEAFMKB.js';
|
|
2
2
|
import { isUuidShape } from '@ai-matrx/kit/uuid';
|
|
3
3
|
import { credentialToHeaders, toCredentialsPort, MATRX_HEADERS } from '@ai-matrx/auth/credentials';
|
|
4
4
|
|
|
5
|
-
// src/core/protocol.ts
|
|
6
|
-
var MATRX_AI_API_VERSION_DEFAULT = "v2";
|
|
7
|
-
var V2_COVERED_AI_PATH_TEMPLATES = [
|
|
8
|
-
"/ai/manual",
|
|
9
|
-
"/ai/chat",
|
|
10
|
-
"/ai/agents/{agent_id}",
|
|
11
|
-
"/ai/agent/{agent_id}",
|
|
12
|
-
// singular alias — behaves identically
|
|
13
|
-
"/ai/conversations/{conversation_id}",
|
|
14
|
-
"/ai/conversation/{conversation_id}",
|
|
15
|
-
// singular alias
|
|
16
|
-
"/ai/prompts/{prompt_id}",
|
|
17
|
-
// saved-prompt execution
|
|
18
|
-
"/ai/mandates/{mandate_key}"
|
|
19
|
-
// THE MANDATE DOOR — `/v2` sibling exists (routers/v2.py)
|
|
20
|
-
];
|
|
21
|
-
function toV2Path(path) {
|
|
22
|
-
const withLead = path.startsWith("/") ? path : `/${path}`;
|
|
23
|
-
if (withLead.startsWith("/api/")) {
|
|
24
|
-
const rest = withLead.slice("/api".length);
|
|
25
|
-
return rest.startsWith("/v2/") ? withLead : `/api/v2${rest}`;
|
|
26
|
-
}
|
|
27
|
-
return withLead.startsWith("/v2/") ? withLead : `/v2${withLead}`;
|
|
28
|
-
}
|
|
29
|
-
var COVERED_INTERPOLATED_PATH = [
|
|
30
|
-
/^(?:\/api)?\/ai\/manual$/,
|
|
31
|
-
/^(?:\/api)?\/ai\/chat$/,
|
|
32
|
-
/^(?:\/api)?\/ai\/agents\/[^/]+$/,
|
|
33
|
-
/^(?:\/api)?\/ai\/agent\/[^/]+$/,
|
|
34
|
-
/^(?:\/api)?\/ai\/conversations\/[^/]+$/,
|
|
35
|
-
/^(?:\/api)?\/ai\/conversation\/[^/]+$/,
|
|
36
|
-
/^(?:\/api)?\/ai\/prompts\/[^/]+$/,
|
|
37
|
-
// `/warm` etc. deliberately don't match
|
|
38
|
-
/^(?:\/api)?\/ai\/mandates\/[^/]+$/
|
|
39
|
-
// the mandate door
|
|
40
|
-
];
|
|
41
|
-
function isCoveredAiPath(path) {
|
|
42
|
-
return COVERED_INTERPOLATED_PATH.some((re) => re.test(path));
|
|
43
|
-
}
|
|
44
|
-
function isV2Path(pathOrUrl) {
|
|
45
|
-
return /\/v2\/ai\//.test(pathOrUrl);
|
|
46
|
-
}
|
|
47
|
-
function toV1FallbackUrl(url) {
|
|
48
|
-
return url.replace(/\/v2\/ai\//, "/ai/");
|
|
49
|
-
}
|
|
50
|
-
function applyAiApiVersion(path, version) {
|
|
51
|
-
if (version !== "v2") return path;
|
|
52
|
-
return isCoveredAiPath(path) ? toV2Path(path) : path;
|
|
53
|
-
}
|
|
54
|
-
async function fetchWithMatrxProtocolFallback(url, init, opts = {}) {
|
|
55
|
-
const { onDowngrade, ...fetchOpts } = opts;
|
|
56
|
-
const logDowngrade = (reason, status2) => {
|
|
57
|
-
console.warn(
|
|
58
|
-
`[matrx] ai_v2_downgrade \u2192 retrying on v1. v2=${url} reason=${reason}`
|
|
59
|
-
);
|
|
60
|
-
onDowngrade?.({ url, reason, ...status2 !== void 0 ? { status: status2 } : {} });
|
|
61
|
-
};
|
|
62
|
-
if (!isV2Path(url)) return resilientFetch(url, init, fetchOpts);
|
|
63
|
-
let result;
|
|
64
|
-
try {
|
|
65
|
-
result = await resilientFetch(url, init, fetchOpts);
|
|
66
|
-
} catch (err) {
|
|
67
|
-
const isAbort = isNetError(err) && err.code === "aborted" || err instanceof Error && err.name === "AbortError";
|
|
68
|
-
if (isAbort) throw err;
|
|
69
|
-
logDowngrade(String(err));
|
|
70
|
-
return resilientFetch(toV1FallbackUrl(url), init, fetchOpts);
|
|
71
|
-
}
|
|
72
|
-
const status = result.response.status;
|
|
73
|
-
if (status === 404 || status === 405 || status >= 500) {
|
|
74
|
-
logDowngrade(`HTTP ${status}`, status);
|
|
75
|
-
return resilientFetch(toV1FallbackUrl(url), init, fetchOpts);
|
|
76
|
-
}
|
|
77
|
-
return result;
|
|
78
|
-
}
|
|
79
|
-
function aiVersionPathOverrides(version) {
|
|
80
|
-
if (version !== "v2") return {};
|
|
81
|
-
const map = {};
|
|
82
|
-
for (const template of V2_COVERED_AI_PATH_TEMPLATES) {
|
|
83
|
-
map[template] = toV2Path(template);
|
|
84
|
-
}
|
|
85
|
-
return map;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
5
|
// src/core/backend-errors.ts
|
|
89
6
|
var BackendApiError = class extends Error {
|
|
90
7
|
/** Machine-readable error code */
|
|
@@ -1049,15 +966,14 @@ async function sendOnWire(request, auth = {}) {
|
|
|
1049
966
|
);
|
|
1050
967
|
}
|
|
1051
968
|
}
|
|
1052
|
-
return
|
|
969
|
+
return resilientFetch(
|
|
1053
970
|
request.url,
|
|
1054
971
|
{ ...request.fetchOptions, method, headers: merged, ...body !== void 0 ? { body } : {} },
|
|
1055
972
|
{
|
|
1056
973
|
...request.signal ? { signal: request.signal } : {},
|
|
1057
974
|
connectTimeoutMs: request.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS,
|
|
1058
975
|
totalTimeoutMs: request.totalTimeoutMs !== void 0 ? request.totalTimeoutMs : null,
|
|
1059
|
-
throwOnHttpError: false
|
|
1060
|
-
...request.onProtocolDowngrade ? { onDowngrade: request.onProtocolDowngrade } : {}
|
|
976
|
+
throwOnHttpError: false
|
|
1061
977
|
}
|
|
1062
978
|
).then((result) => {
|
|
1063
979
|
if (request.onUploadProgress && body !== void 0) {
|
|
@@ -1278,4 +1194,4 @@ async function openJsonOrStream(api, op, args, options) {
|
|
|
1278
1194
|
return { kind: "stream", stream: toStream(op, response, requestId, controller) };
|
|
1279
1195
|
}
|
|
1280
1196
|
|
|
1281
|
-
export { BackendApiError, CONTRACT_SHA256, DEFAULT_MATRX_NDJSON_READ_AHEAD, DEPLOYMENTS, DOMAINS,
|
|
1197
|
+
export { BackendApiError, CONTRACT_SHA256, DEFAULT_MATRX_NDJSON_READ_AHEAD, DEPLOYMENTS, DOMAINS, MatrxApiError, OrganizationContextError, StreamTransportError, WIRE_FETCH_OPTION_KEYS, applyOrganizationContextHeader, assertOrganizationMatchesOperation, assertQueryOrganizationMatchesContext, createApi, createMatrxNdjsonFramer, createMatrxSseFramer, createOrganizationOperation, describeBackendFailure, extractMatrxErrorCode, extractMatrxErrorMessage, getUserMessage, isBinaryType, isGenericUserMessage, isStreamTransportLost, normalizeMatrxStreamEnvelope, openJsonOrStream, openStream, parseCallApiError, parseHttpError, parseHttpErrorBody, parseMatrxSseFrame, parsePersistedBackendError, parseStreamError, readMatrxNdjsonStream, readMatrxSseStream, requireOrganizationContext, sendOnWire, unwrapUpstreamError };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk2SXAAKGV_cjs = require('./chunk-2SXAAKGV.cjs');
|
|
4
|
+
|
|
5
|
+
// src/net/stream-monitor.ts
|
|
6
|
+
var DEFAULTS = {
|
|
7
|
+
heartbeatTimeoutMs: 3e4,
|
|
8
|
+
maxLifetimeMs: 6e5
|
|
9
|
+
};
|
|
10
|
+
async function* monitorStream(source, opts = {}) {
|
|
11
|
+
const heartbeatTimeoutMs = opts.heartbeatTimeoutMs ?? DEFAULTS.heartbeatTimeoutMs;
|
|
12
|
+
const maxLifetimeMs = opts.maxLifetimeMs ?? DEFAULTS.maxLifetimeMs;
|
|
13
|
+
const abort = opts.abortController;
|
|
14
|
+
const startedAt = Date.now();
|
|
15
|
+
const iter = source[Symbol.asyncIterator]();
|
|
16
|
+
while (true) {
|
|
17
|
+
const elapsed = Date.now() - startedAt;
|
|
18
|
+
const remainingLifetime = maxLifetimeMs - elapsed;
|
|
19
|
+
if (remainingLifetime <= 0) {
|
|
20
|
+
abort?.abort("total-timeout");
|
|
21
|
+
throw new chunk2SXAAKGV_cjs.TotalTimeoutError(maxLifetimeMs);
|
|
22
|
+
}
|
|
23
|
+
const deadline = Math.min(heartbeatTimeoutMs, remainingLifetime);
|
|
24
|
+
let timer = null;
|
|
25
|
+
let timedOutKind = null;
|
|
26
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
27
|
+
timer = setTimeout(() => {
|
|
28
|
+
timedOutKind = deadline === remainingLifetime ? "total" : "heartbeat";
|
|
29
|
+
abort?.abort(
|
|
30
|
+
timedOutKind === "total" ? "total-timeout" : "heartbeat-timeout"
|
|
31
|
+
);
|
|
32
|
+
reject(
|
|
33
|
+
timedOutKind === "total" ? new chunk2SXAAKGV_cjs.TotalTimeoutError(maxLifetimeMs) : new chunk2SXAAKGV_cjs.HeartbeatTimeoutError(heartbeatTimeoutMs)
|
|
34
|
+
);
|
|
35
|
+
}, deadline);
|
|
36
|
+
});
|
|
37
|
+
let result;
|
|
38
|
+
try {
|
|
39
|
+
result = await Promise.race([iter.next(), timeoutPromise]);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
if (timer !== null) clearTimeout(timer);
|
|
42
|
+
try {
|
|
43
|
+
const cleanup = iter.return?.(void 0);
|
|
44
|
+
if (cleanup) {
|
|
45
|
+
void Promise.resolve(cleanup).catch(() => {
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
} catch {
|
|
49
|
+
}
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
if (timer !== null) clearTimeout(timer);
|
|
53
|
+
if (result.done) return;
|
|
54
|
+
opts.onHeartbeat?.(Date.now());
|
|
55
|
+
yield result.value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
exports.monitorStream = monitorStream;
|
|
@@ -141,58 +141,6 @@ function toNetError(err) {
|
|
|
141
141
|
);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
// src/net/retry.ts
|
|
145
|
-
function defaultRetryOn(err) {
|
|
146
|
-
return isNetError(err) && err.retryable;
|
|
147
|
-
}
|
|
148
|
-
function sleep(ms, signal) {
|
|
149
|
-
return new Promise((resolve, reject) => {
|
|
150
|
-
const timer = setTimeout(() => {
|
|
151
|
-
resolve();
|
|
152
|
-
if (signal) signal.removeEventListener("abort", onAbort);
|
|
153
|
-
}, ms);
|
|
154
|
-
const onAbort = () => {
|
|
155
|
-
clearTimeout(timer);
|
|
156
|
-
reject(signal?.reason ?? new Error("Aborted"));
|
|
157
|
-
};
|
|
158
|
-
if (signal) {
|
|
159
|
-
if (signal.aborted) {
|
|
160
|
-
clearTimeout(timer);
|
|
161
|
-
reject(signal.reason);
|
|
162
|
-
} else {
|
|
163
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
async function withRetry(fn, opts = {}) {
|
|
169
|
-
const attempts = Math.max(1, opts.attempts ?? 3);
|
|
170
|
-
const initialDelayMs = opts.initialDelayMs ?? 250;
|
|
171
|
-
const maxDelayMs = opts.maxDelayMs ?? 4e3;
|
|
172
|
-
const factor = opts.backoffFactor ?? 2;
|
|
173
|
-
const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
|
|
174
|
-
const retryOn = opts.retryOn ?? defaultRetryOn;
|
|
175
|
-
let lastErr;
|
|
176
|
-
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
177
|
-
if (opts.signal?.aborted) throw opts.signal.reason;
|
|
178
|
-
try {
|
|
179
|
-
return await fn(attempt);
|
|
180
|
-
} catch (err) {
|
|
181
|
-
lastErr = err;
|
|
182
|
-
if (attempt === attempts || !retryOn(err)) throw err;
|
|
183
|
-
const base = Math.min(
|
|
184
|
-
maxDelayMs,
|
|
185
|
-
initialDelayMs * Math.pow(factor, attempt - 1)
|
|
186
|
-
);
|
|
187
|
-
const jitterAmount = base * jitter * (Math.random() * 2 - 1);
|
|
188
|
-
const delayMs = Math.max(0, Math.round(base + jitterAmount));
|
|
189
|
-
opts.onRetry?.(attempt, err, delayMs);
|
|
190
|
-
await sleep(delayMs, opts.signal);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
throw lastErr;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
144
|
// src/net/resilient-fetch.ts
|
|
197
145
|
var DEFAULTS = {
|
|
198
146
|
connectTimeoutMs: 15e3,
|
|
@@ -261,58 +209,56 @@ async function resilientFetch(url, init = {}, opts = {}) {
|
|
|
261
209
|
}
|
|
262
210
|
}
|
|
263
211
|
|
|
264
|
-
// src/net/
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
if (
|
|
279
|
-
|
|
280
|
-
|
|
212
|
+
// src/net/retry.ts
|
|
213
|
+
function defaultRetryOn(err) {
|
|
214
|
+
return isNetError(err) && err.retryable;
|
|
215
|
+
}
|
|
216
|
+
function sleep(ms, signal) {
|
|
217
|
+
return new Promise((resolve, reject) => {
|
|
218
|
+
const timer = setTimeout(() => {
|
|
219
|
+
resolve();
|
|
220
|
+
if (signal) signal.removeEventListener("abort", onAbort);
|
|
221
|
+
}, ms);
|
|
222
|
+
const onAbort = () => {
|
|
223
|
+
clearTimeout(timer);
|
|
224
|
+
reject(signal?.reason ?? new Error("Aborted"));
|
|
225
|
+
};
|
|
226
|
+
if (signal) {
|
|
227
|
+
if (signal.aborted) {
|
|
228
|
+
clearTimeout(timer);
|
|
229
|
+
reject(signal.reason);
|
|
230
|
+
} else {
|
|
231
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
232
|
+
}
|
|
281
233
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
}, deadline);
|
|
295
|
-
});
|
|
296
|
-
let result;
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
async function withRetry(fn, opts = {}) {
|
|
237
|
+
const attempts = Math.max(1, opts.attempts ?? 3);
|
|
238
|
+
const initialDelayMs = opts.initialDelayMs ?? 250;
|
|
239
|
+
const maxDelayMs = opts.maxDelayMs ?? 4e3;
|
|
240
|
+
const factor = opts.backoffFactor ?? 2;
|
|
241
|
+
const jitter = Math.max(0, Math.min(1, opts.jitter ?? 0.25));
|
|
242
|
+
const retryOn = opts.retryOn ?? defaultRetryOn;
|
|
243
|
+
let lastErr;
|
|
244
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
245
|
+
if (opts.signal?.aborted) throw opts.signal.reason;
|
|
297
246
|
try {
|
|
298
|
-
|
|
247
|
+
return await fn(attempt);
|
|
299
248
|
} catch (err) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
249
|
+
lastErr = err;
|
|
250
|
+
if (attempt === attempts || !retryOn(err)) throw err;
|
|
251
|
+
const base = Math.min(
|
|
252
|
+
maxDelayMs,
|
|
253
|
+
initialDelayMs * Math.pow(factor, attempt - 1)
|
|
254
|
+
);
|
|
255
|
+
const jitterAmount = base * jitter * (Math.random() * 2 - 1);
|
|
256
|
+
const delayMs = Math.max(0, Math.round(base + jitterAmount));
|
|
257
|
+
opts.onRetry?.(attempt, err, delayMs);
|
|
258
|
+
await sleep(delayMs, opts.signal);
|
|
310
259
|
}
|
|
311
|
-
if (timer !== null) clearTimeout(timer);
|
|
312
|
-
if (result.done) return;
|
|
313
|
-
opts.onHeartbeat?.(Date.now());
|
|
314
|
-
yield result.value;
|
|
315
260
|
}
|
|
261
|
+
throw lastErr;
|
|
316
262
|
}
|
|
317
263
|
|
|
318
|
-
export { AbortedError, ConnectTimeoutError, HeartbeatTimeoutError, HttpError, NetError, NetworkError, OfflineError, TotalTimeoutError, extractErrorMessage, isNetError, isTransportFailure,
|
|
264
|
+
export { AbortedError, ConnectTimeoutError, HeartbeatTimeoutError, HttpError, NetError, NetworkError, OfflineError, TotalTimeoutError, extractErrorMessage, isNetError, isTransportFailure, resilientFetch, toNetError, withRetry };
|