@mettlelabs/mettle 0.0.0-beta.1 → 0.0.0-beta.1-linux-x64
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/THIRD_PARTY_NOTICES.md +11479 -0
- package/bin/mettle +4 -0
- package/harness/audit-investigation.mjs +203 -0
- package/harness/chunk-13tgmdey.mjs +33761 -0
- package/harness/chunk-1sygmp11.mjs +18142 -0
- package/harness/chunk-1ykxpmaz.mjs +7887 -0
- package/harness/chunk-2gt4cy7x.mjs +2290 -0
- package/harness/chunk-2pm2sayw.mjs +248 -0
- package/harness/chunk-32y07kkp.mjs +3747 -0
- package/harness/chunk-3m7jn5ac.mjs +16242 -0
- package/harness/chunk-3wvjs93w.mjs +538 -0
- package/harness/chunk-4bepyxmq.mjs +113 -0
- package/harness/chunk-4jtnt9k5.mjs +95 -0
- package/harness/chunk-50sbrf09.mjs +18972 -0
- package/harness/chunk-56csr8sw.mjs +322 -0
- package/harness/chunk-5cvb1jnb.mjs +41 -0
- package/harness/chunk-5wgmv4np.mjs +585 -0
- package/harness/chunk-65eyq32y.mjs +225 -0
- package/harness/chunk-6fnh6qhk.mjs +195 -0
- package/harness/chunk-6kgqw9ny.mjs +32303 -0
- package/harness/chunk-7b242j0n.mjs +14 -0
- package/harness/chunk-7bg2gnv2.mjs +7540 -0
- package/harness/chunk-ageqxj9v.mjs +63008 -0
- package/harness/chunk-b0qbt5jd.mjs +14 -0
- package/harness/chunk-b5g1r3fz.mjs +4785 -0
- package/harness/chunk-b71gpkxg.mjs +1514 -0
- package/harness/chunk-bdv1rx4a.mjs +20364 -0
- package/harness/chunk-c1631s2x.mjs +12241 -0
- package/harness/chunk-d5xgxsnp.mjs +74 -0
- package/harness/chunk-erg1fbh0.mjs +0 -0
- package/harness/chunk-fh78v9vn.mjs +19366 -0
- package/harness/chunk-fjx29qvp.mjs +50 -0
- package/harness/chunk-gryka6kg.mjs +39 -0
- package/harness/chunk-jb0r19et.mjs +180 -0
- package/harness/chunk-mfn574ss.mjs +179 -0
- package/harness/chunk-msg872ea.mjs +334 -0
- package/harness/chunk-nz5sv9as.mjs +1642 -0
- package/harness/chunk-p9d3cgvq.mjs +452 -0
- package/harness/chunk-pq6wvwxr.mjs +12 -0
- package/harness/chunk-qcm9arf8.mjs +7736 -0
- package/harness/chunk-qr8zfqjd.mjs +24 -0
- package/harness/chunk-rz2tz6jp.mjs +26 -0
- package/harness/chunk-sbkgc3kn.mjs +8 -0
- package/harness/chunk-v66qvpnb.mjs +169 -0
- package/harness/chunk-vjaxzab3.mjs +136 -0
- package/harness/chunk-vr1n5nza.mjs +1045 -0
- package/harness/chunk-vsf2zajv.mjs +3867 -0
- package/harness/chunk-wq253fj4.mjs +19041 -0
- package/harness/chunk-wyv7ceq4.mjs +0 -0
- package/harness/chunk-xnqknk2r.mjs +198 -0
- package/harness/chunk-xqyc4ca2.mjs +1890 -0
- package/harness/chunk-z6n9thea.mjs +45146 -0
- package/harness/chunk-zty0d3bw.mjs +0 -0
- package/harness/chunk-zvkxtj82.mjs +42 -0
- package/harness/issue-api-token.mjs +35 -0
- package/harness/launcher.mjs +159 -0
- package/harness/sandbox.mjs +132 -0
- package/harness/server.mjs +66322 -0
- package/package.json +13 -15
- package/bin/mettle.js +0 -51
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__commonJS,
|
|
3
|
+
__require
|
|
4
|
+
} from "./chunk-fjx29qvp.mjs";
|
|
5
|
+
|
|
6
|
+
// node_modules/.bun/has-flag@4.0.0/node_modules/has-flag/index.js
|
|
7
|
+
var require_has_flag = __commonJS(function(exports, module) {
|
|
8
|
+
module.exports = (flag, argv = process.argv) => {
|
|
9
|
+
const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
|
|
10
|
+
const position = argv.indexOf(prefix + flag);
|
|
11
|
+
const terminatorPosition = argv.indexOf("--");
|
|
12
|
+
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// node_modules/.bun/supports-color@7.2.0/node_modules/supports-color/index.js
|
|
17
|
+
var require_supports_color = __commonJS(function(exports, module) {
|
|
18
|
+
var os = __require("os");
|
|
19
|
+
var tty = __require("tty");
|
|
20
|
+
var hasFlag = require_has_flag();
|
|
21
|
+
var { env } = process;
|
|
22
|
+
var forceColor;
|
|
23
|
+
if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
|
|
24
|
+
forceColor = 0;
|
|
25
|
+
} else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
|
|
26
|
+
forceColor = 1;
|
|
27
|
+
}
|
|
28
|
+
if ("FORCE_COLOR" in env) {
|
|
29
|
+
if (env.FORCE_COLOR === "true") {
|
|
30
|
+
forceColor = 1;
|
|
31
|
+
} else if (env.FORCE_COLOR === "false") {
|
|
32
|
+
forceColor = 0;
|
|
33
|
+
} else {
|
|
34
|
+
forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function translateLevel(level) {
|
|
38
|
+
if (level === 0) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
level,
|
|
43
|
+
hasBasic: true,
|
|
44
|
+
has256: level >= 2,
|
|
45
|
+
has16m: level >= 3
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function supportsColor(haveStream, streamIsTTY) {
|
|
49
|
+
if (forceColor === 0) {
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
|
|
53
|
+
return 3;
|
|
54
|
+
}
|
|
55
|
+
if (hasFlag("color=256")) {
|
|
56
|
+
return 2;
|
|
57
|
+
}
|
|
58
|
+
if (haveStream && !streamIsTTY && forceColor === undefined) {
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
const min = forceColor || 0;
|
|
62
|
+
if (env.TERM === "dumb") {
|
|
63
|
+
return min;
|
|
64
|
+
}
|
|
65
|
+
if (process.platform === "win32") {
|
|
66
|
+
const osRelease = os.release().split(".");
|
|
67
|
+
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
|
|
68
|
+
return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
69
|
+
}
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
72
|
+
if ("CI" in env) {
|
|
73
|
+
if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => (sign in env)) || env.CI_NAME === "codeship") {
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
return min;
|
|
77
|
+
}
|
|
78
|
+
if ("TEAMCITY_VERSION" in env) {
|
|
79
|
+
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
|
|
80
|
+
}
|
|
81
|
+
if (env.COLORTERM === "truecolor") {
|
|
82
|
+
return 3;
|
|
83
|
+
}
|
|
84
|
+
if ("TERM_PROGRAM" in env) {
|
|
85
|
+
const version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
|
|
86
|
+
switch (env.TERM_PROGRAM) {
|
|
87
|
+
case "iTerm.app":
|
|
88
|
+
return version >= 3 ? 3 : 2;
|
|
89
|
+
case "Apple_Terminal":
|
|
90
|
+
return 2;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (/-256(color)?$/i.test(env.TERM)) {
|
|
94
|
+
return 2;
|
|
95
|
+
}
|
|
96
|
+
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
|
|
97
|
+
return 1;
|
|
98
|
+
}
|
|
99
|
+
if ("COLORTERM" in env) {
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
return min;
|
|
103
|
+
}
|
|
104
|
+
function getSupportLevel(stream) {
|
|
105
|
+
const level = supportsColor(stream, stream && stream.isTTY);
|
|
106
|
+
return translateLevel(level);
|
|
107
|
+
}
|
|
108
|
+
module.exports = {
|
|
109
|
+
supportsColor: getSupportLevel,
|
|
110
|
+
stdout: translateLevel(supportsColor(true, tty.isatty(1))),
|
|
111
|
+
stderr: translateLevel(supportsColor(true, tty.isatty(2)))
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// node_modules/.bun/ms@2.1.3/node_modules/ms/index.js
|
|
116
|
+
var require_ms = __commonJS(function(exports, module) {
|
|
117
|
+
var s = 1000;
|
|
118
|
+
var m = s * 60;
|
|
119
|
+
var h = m * 60;
|
|
120
|
+
var d = h * 24;
|
|
121
|
+
var w = d * 7;
|
|
122
|
+
var y = d * 365.25;
|
|
123
|
+
module.exports = function(val, options) {
|
|
124
|
+
options = options || {};
|
|
125
|
+
var type = typeof val;
|
|
126
|
+
if (type === "string" && val.length > 0) {
|
|
127
|
+
return parse(val);
|
|
128
|
+
} else if (type === "number" && isFinite(val)) {
|
|
129
|
+
return options.long ? fmtLong(val) : fmtShort(val);
|
|
130
|
+
}
|
|
131
|
+
throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
|
|
132
|
+
};
|
|
133
|
+
function parse(str) {
|
|
134
|
+
str = String(str);
|
|
135
|
+
if (str.length > 100) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
|
|
139
|
+
if (!match) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
var n = parseFloat(match[1]);
|
|
143
|
+
var type = (match[2] || "ms").toLowerCase();
|
|
144
|
+
switch (type) {
|
|
145
|
+
case "years":
|
|
146
|
+
case "year":
|
|
147
|
+
case "yrs":
|
|
148
|
+
case "yr":
|
|
149
|
+
case "y":
|
|
150
|
+
return n * y;
|
|
151
|
+
case "weeks":
|
|
152
|
+
case "week":
|
|
153
|
+
case "w":
|
|
154
|
+
return n * w;
|
|
155
|
+
case "days":
|
|
156
|
+
case "day":
|
|
157
|
+
case "d":
|
|
158
|
+
return n * d;
|
|
159
|
+
case "hours":
|
|
160
|
+
case "hour":
|
|
161
|
+
case "hrs":
|
|
162
|
+
case "hr":
|
|
163
|
+
case "h":
|
|
164
|
+
return n * h;
|
|
165
|
+
case "minutes":
|
|
166
|
+
case "minute":
|
|
167
|
+
case "mins":
|
|
168
|
+
case "min":
|
|
169
|
+
case "m":
|
|
170
|
+
return n * m;
|
|
171
|
+
case "seconds":
|
|
172
|
+
case "second":
|
|
173
|
+
case "secs":
|
|
174
|
+
case "sec":
|
|
175
|
+
case "s":
|
|
176
|
+
return n * s;
|
|
177
|
+
case "milliseconds":
|
|
178
|
+
case "millisecond":
|
|
179
|
+
case "msecs":
|
|
180
|
+
case "msec":
|
|
181
|
+
case "ms":
|
|
182
|
+
return n;
|
|
183
|
+
default:
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function fmtShort(ms) {
|
|
188
|
+
var msAbs = Math.abs(ms);
|
|
189
|
+
if (msAbs >= d) {
|
|
190
|
+
return Math.round(ms / d) + "d";
|
|
191
|
+
}
|
|
192
|
+
if (msAbs >= h) {
|
|
193
|
+
return Math.round(ms / h) + "h";
|
|
194
|
+
}
|
|
195
|
+
if (msAbs >= m) {
|
|
196
|
+
return Math.round(ms / m) + "m";
|
|
197
|
+
}
|
|
198
|
+
if (msAbs >= s) {
|
|
199
|
+
return Math.round(ms / s) + "s";
|
|
200
|
+
}
|
|
201
|
+
return ms + "ms";
|
|
202
|
+
}
|
|
203
|
+
function fmtLong(ms) {
|
|
204
|
+
var msAbs = Math.abs(ms);
|
|
205
|
+
if (msAbs >= d) {
|
|
206
|
+
return plural(ms, msAbs, d, "day");
|
|
207
|
+
}
|
|
208
|
+
if (msAbs >= h) {
|
|
209
|
+
return plural(ms, msAbs, h, "hour");
|
|
210
|
+
}
|
|
211
|
+
if (msAbs >= m) {
|
|
212
|
+
return plural(ms, msAbs, m, "minute");
|
|
213
|
+
}
|
|
214
|
+
if (msAbs >= s) {
|
|
215
|
+
return plural(ms, msAbs, s, "second");
|
|
216
|
+
}
|
|
217
|
+
return ms + " ms";
|
|
218
|
+
}
|
|
219
|
+
function plural(ms, msAbs, n, name) {
|
|
220
|
+
var isPlural = msAbs >= n * 1.5;
|
|
221
|
+
return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
export { require_ms, require_supports_color };
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// node_modules/.bun/is-network-error@1.3.2/node_modules/is-network-error/index.js
|
|
2
|
+
var objectToString = Object.prototype.toString;
|
|
3
|
+
var isError = (value) => objectToString.call(value) === "[object Error]";
|
|
4
|
+
var errorMessages = new Set([
|
|
5
|
+
"network error",
|
|
6
|
+
"NetworkError when attempting to fetch resource.",
|
|
7
|
+
"The Internet connection appears to be offline.",
|
|
8
|
+
"Network request failed",
|
|
9
|
+
"fetch failed",
|
|
10
|
+
"terminated",
|
|
11
|
+
" A network error occurred.",
|
|
12
|
+
"Network connection lost"
|
|
13
|
+
]);
|
|
14
|
+
function isNetworkError(error) {
|
|
15
|
+
const isValid = error && isError(error) && error.name === "TypeError" && typeof error.message === "string";
|
|
16
|
+
if (!isValid) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const { message, stack } = error;
|
|
20
|
+
if (message === "Load failed" || message.startsWith("Load failed (") && message.endsWith(")")) {
|
|
21
|
+
return stack === undefined || "__sentry_captured__" in error;
|
|
22
|
+
}
|
|
23
|
+
if (message.startsWith("error sending request for url")) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (message === "Failed to fetch" || message.startsWith("Failed to fetch (") && message.endsWith(")")) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return errorMessages.has(message);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// node_modules/.bun/p-retry@7.1.1/node_modules/p-retry/index.js
|
|
33
|
+
function validateRetries(retries) {
|
|
34
|
+
if (typeof retries === "number") {
|
|
35
|
+
if (retries < 0) {
|
|
36
|
+
throw new TypeError("Expected `retries` to be a non-negative number.");
|
|
37
|
+
}
|
|
38
|
+
if (Number.isNaN(retries)) {
|
|
39
|
+
throw new TypeError("Expected `retries` to be a valid number or Infinity, got NaN.");
|
|
40
|
+
}
|
|
41
|
+
} else if (retries !== undefined) {
|
|
42
|
+
throw new TypeError("Expected `retries` to be a number or Infinity.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function validateNumberOption(name, value, { min = 0, allowInfinity = false } = {}) {
|
|
46
|
+
if (value === undefined) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (typeof value !== "number" || Number.isNaN(value)) {
|
|
50
|
+
throw new TypeError(`Expected \`${name}\` to be a number${allowInfinity ? " or Infinity" : ""}.`);
|
|
51
|
+
}
|
|
52
|
+
if (!allowInfinity && !Number.isFinite(value)) {
|
|
53
|
+
throw new TypeError(`Expected \`${name}\` to be a finite number.`);
|
|
54
|
+
}
|
|
55
|
+
if (value < min) {
|
|
56
|
+
throw new TypeError(`Expected \`${name}\` to be ≥ ${min}.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
class AbortError extends Error {
|
|
61
|
+
constructor(message) {
|
|
62
|
+
super();
|
|
63
|
+
if (message instanceof Error) {
|
|
64
|
+
this.originalError = message;
|
|
65
|
+
({ message } = message);
|
|
66
|
+
} else {
|
|
67
|
+
this.originalError = new Error(message);
|
|
68
|
+
this.originalError.stack = this.stack;
|
|
69
|
+
}
|
|
70
|
+
this.name = "AbortError";
|
|
71
|
+
this.message = message;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function calculateDelay(retriesConsumed, options) {
|
|
75
|
+
const attempt = Math.max(1, retriesConsumed + 1);
|
|
76
|
+
const random = options.randomize ? Math.random() + 1 : 1;
|
|
77
|
+
let timeout = Math.round(random * options.minTimeout * options.factor ** (attempt - 1));
|
|
78
|
+
timeout = Math.min(timeout, options.maxTimeout);
|
|
79
|
+
return timeout;
|
|
80
|
+
}
|
|
81
|
+
function calculateRemainingTime(start, max) {
|
|
82
|
+
if (!Number.isFinite(max)) {
|
|
83
|
+
return max;
|
|
84
|
+
}
|
|
85
|
+
return max - (performance.now() - start);
|
|
86
|
+
}
|
|
87
|
+
async function onAttemptFailure({ error, attemptNumber, retriesConsumed, startTime, options }) {
|
|
88
|
+
const normalizedError = error instanceof Error ? error : new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`);
|
|
89
|
+
if (normalizedError instanceof AbortError) {
|
|
90
|
+
throw normalizedError.originalError;
|
|
91
|
+
}
|
|
92
|
+
const retriesLeft = Number.isFinite(options.retries) ? Math.max(0, options.retries - retriesConsumed) : options.retries;
|
|
93
|
+
const maxRetryTime = options.maxRetryTime ?? Number.POSITIVE_INFINITY;
|
|
94
|
+
const context = Object.freeze({
|
|
95
|
+
error: normalizedError,
|
|
96
|
+
attemptNumber,
|
|
97
|
+
retriesLeft,
|
|
98
|
+
retriesConsumed
|
|
99
|
+
});
|
|
100
|
+
await options.onFailedAttempt(context);
|
|
101
|
+
if (calculateRemainingTime(startTime, maxRetryTime) <= 0) {
|
|
102
|
+
throw normalizedError;
|
|
103
|
+
}
|
|
104
|
+
const consumeRetry = await options.shouldConsumeRetry(context);
|
|
105
|
+
const remainingTime = calculateRemainingTime(startTime, maxRetryTime);
|
|
106
|
+
if (remainingTime <= 0 || retriesLeft <= 0) {
|
|
107
|
+
throw normalizedError;
|
|
108
|
+
}
|
|
109
|
+
if (normalizedError instanceof TypeError && !isNetworkError(normalizedError)) {
|
|
110
|
+
if (consumeRetry) {
|
|
111
|
+
throw normalizedError;
|
|
112
|
+
}
|
|
113
|
+
options.signal?.throwIfAborted();
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
if (!await options.shouldRetry(context)) {
|
|
117
|
+
throw normalizedError;
|
|
118
|
+
}
|
|
119
|
+
if (!consumeRetry) {
|
|
120
|
+
options.signal?.throwIfAborted();
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
const delayTime = calculateDelay(retriesConsumed, options);
|
|
124
|
+
const finalDelay = Math.min(delayTime, remainingTime);
|
|
125
|
+
options.signal?.throwIfAborted();
|
|
126
|
+
if (finalDelay > 0) {
|
|
127
|
+
await new Promise((resolve, reject) => {
|
|
128
|
+
const onAbort = () => {
|
|
129
|
+
clearTimeout(timeoutToken);
|
|
130
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
131
|
+
reject(options.signal.reason);
|
|
132
|
+
};
|
|
133
|
+
const timeoutToken = setTimeout(() => {
|
|
134
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
135
|
+
resolve();
|
|
136
|
+
}, finalDelay);
|
|
137
|
+
if (options.unref) {
|
|
138
|
+
timeoutToken.unref?.();
|
|
139
|
+
}
|
|
140
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
options.signal?.throwIfAborted();
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
async function pRetry(input, options = {}) {
|
|
147
|
+
options = { ...options };
|
|
148
|
+
validateRetries(options.retries);
|
|
149
|
+
if (Object.hasOwn(options, "forever")) {
|
|
150
|
+
throw new Error("The `forever` option is no longer supported. For many use-cases, you can set `retries: Infinity` instead.");
|
|
151
|
+
}
|
|
152
|
+
options.retries ??= 10;
|
|
153
|
+
options.factor ??= 2;
|
|
154
|
+
options.minTimeout ??= 1000;
|
|
155
|
+
options.maxTimeout ??= Number.POSITIVE_INFINITY;
|
|
156
|
+
options.maxRetryTime ??= Number.POSITIVE_INFINITY;
|
|
157
|
+
options.randomize ??= false;
|
|
158
|
+
options.onFailedAttempt ??= () => {};
|
|
159
|
+
options.shouldRetry ??= () => true;
|
|
160
|
+
options.shouldConsumeRetry ??= () => true;
|
|
161
|
+
validateNumberOption("factor", options.factor, { min: 0, allowInfinity: false });
|
|
162
|
+
validateNumberOption("minTimeout", options.minTimeout, { min: 0, allowInfinity: false });
|
|
163
|
+
validateNumberOption("maxTimeout", options.maxTimeout, { min: 0, allowInfinity: true });
|
|
164
|
+
validateNumberOption("maxRetryTime", options.maxRetryTime, { min: 0, allowInfinity: true });
|
|
165
|
+
if (!(options.factor > 0)) {
|
|
166
|
+
options.factor = 1;
|
|
167
|
+
}
|
|
168
|
+
options.signal?.throwIfAborted();
|
|
169
|
+
let attemptNumber = 0;
|
|
170
|
+
let retriesConsumed = 0;
|
|
171
|
+
const startTime = performance.now();
|
|
172
|
+
while (Number.isFinite(options.retries) ? retriesConsumed <= options.retries : true) {
|
|
173
|
+
attemptNumber++;
|
|
174
|
+
try {
|
|
175
|
+
options.signal?.throwIfAborted();
|
|
176
|
+
const result = await input(attemptNumber);
|
|
177
|
+
options.signal?.throwIfAborted();
|
|
178
|
+
return result;
|
|
179
|
+
} catch (error) {
|
|
180
|
+
if (await onAttemptFailure({
|
|
181
|
+
error,
|
|
182
|
+
attemptNumber,
|
|
183
|
+
retriesConsumed,
|
|
184
|
+
startTime,
|
|
185
|
+
options
|
|
186
|
+
})) {
|
|
187
|
+
retriesConsumed++;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
throw new Error("Retry attempts exhausted without throwing an error.");
|
|
192
|
+
}
|
|
193
|
+
export {
|
|
194
|
+
pRetry as default
|
|
195
|
+
};
|