tempmail-sdk 1.1.8 → 1.2.0

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.
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateEmail = generateEmail;
7
+ exports.getEmails = getEmails;
8
+ const ws_1 = __importDefault(require("ws"));
9
+ const normalize_1 = require("../normalize");
10
+ const CHANNEL = 'tempmail-cn';
11
+ const DEFAULT_HOST = 'tempmail.cn';
12
+ const CONNECT_TIMEOUT_MS = 15000;
13
+ const HANDSHAKE_WAIT_MS = 1000;
14
+ const INITIAL_SYNC_WAIT_MS = 80;
15
+ const SOCKET_IO_VERSIONS = [4, 3];
16
+ const DEFAULT_HEADERS = {
17
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',
18
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
19
+ 'Cache-Control': 'no-cache',
20
+ DNT: '1',
21
+ Pragma: 'no-cache',
22
+ };
23
+ const mailboxes = new Map();
24
+ function getState(email) {
25
+ const key = email.trim().toLowerCase();
26
+ let st = mailboxes.get(key);
27
+ if (!st) {
28
+ st = { emails: [], seenIds: new Set(), ws: null };
29
+ mailboxes.set(key, st);
30
+ }
31
+ return st;
32
+ }
33
+ function sleep(ms) {
34
+ return new Promise((resolve) => setTimeout(resolve, ms));
35
+ }
36
+ function normalizeHost(domain) {
37
+ const raw = String(domain || '').trim();
38
+ if (!raw) {
39
+ return DEFAULT_HOST;
40
+ }
41
+ let host = raw;
42
+ if (/^https?:\/\//i.test(host)) {
43
+ try {
44
+ host = new URL(host).host;
45
+ }
46
+ catch {
47
+ host = raw;
48
+ }
49
+ }
50
+ else if (host.includes('/')) {
51
+ try {
52
+ host = new URL(`https://${host}`).host;
53
+ }
54
+ catch {
55
+ host = host.split('/')[0];
56
+ }
57
+ }
58
+ host = host.replace(/^\.+|\.+$/g, '');
59
+ const at = host.lastIndexOf('@');
60
+ if (at >= 0) {
61
+ host = host.slice(at + 1);
62
+ }
63
+ return host || DEFAULT_HOST;
64
+ }
65
+ function splitAddress(email) {
66
+ const trimmed = email.trim();
67
+ const at = trimmed.indexOf('@');
68
+ if (at <= 0 || at === trimmed.length - 1) {
69
+ throw new Error('tempmail-cn: invalid email address');
70
+ }
71
+ return {
72
+ local: trimmed.slice(0, at),
73
+ host: normalizeHost(trimmed.slice(at + 1)),
74
+ };
75
+ }
76
+ function socketUrl(host, eio) {
77
+ return `wss://${host}/socket.io/?EIO=${eio}&transport=websocket`;
78
+ }
79
+ function socketHeaders(host) {
80
+ return {
81
+ ...DEFAULT_HEADERS,
82
+ Origin: `https://${host}`,
83
+ Referer: `https://${host}/`,
84
+ };
85
+ }
86
+ function sendEvent(ws, event, payload) {
87
+ ws.send(`42${JSON.stringify([event, payload])}`);
88
+ }
89
+ function parseEventPacket(packet) {
90
+ if (!packet.startsWith('42')) {
91
+ return null;
92
+ }
93
+ try {
94
+ const decoded = JSON.parse(packet.slice(2));
95
+ if (!Array.isArray(decoded) || typeof decoded[0] !== 'string') {
96
+ return null;
97
+ }
98
+ return { event: decoded[0], payload: decoded[1] };
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ function stableMessageId(raw, recipientEmail) {
105
+ const headers = raw?.headers || {};
106
+ return String(raw?.id ??
107
+ raw?.messageId ??
108
+ headers['message-id'] ??
109
+ headers.messageId ??
110
+ `${headers.from || raw?.from || ''}\n${headers.subject || raw?.subject || ''}\n${headers.date || raw?.date || ''}\n${recipientEmail}`);
111
+ }
112
+ function flattenMail(raw, recipientEmail) {
113
+ const headers = raw?.headers || {};
114
+ return {
115
+ id: stableMessageId(raw, recipientEmail),
116
+ from: headers.from || raw?.from || '',
117
+ to: recipientEmail,
118
+ subject: headers.subject || raw?.subject || '',
119
+ text: raw?.text || raw?.body || '',
120
+ html: raw?.html || '',
121
+ date: headers.date || raw?.date || '',
122
+ isRead: false,
123
+ attachments: Array.isArray(raw?.attachments) ? raw.attachments : [],
124
+ };
125
+ }
126
+ async function connectSocket(host) {
127
+ let lastError = null;
128
+ for (const version of SOCKET_IO_VERSIONS) {
129
+ try {
130
+ return await new Promise((resolve, reject) => {
131
+ const ws = new ws_1.default(socketUrl(host, version), {
132
+ handshakeTimeout: CONNECT_TIMEOUT_MS,
133
+ headers: socketHeaders(host),
134
+ });
135
+ let timer;
136
+ let sentConnect = false;
137
+ let settled = false;
138
+ const cleanup = () => {
139
+ if (timer) {
140
+ clearTimeout(timer);
141
+ timer = undefined;
142
+ }
143
+ ws.off('message', onMessage);
144
+ ws.off('error', onError);
145
+ ws.off('close', onClose);
146
+ };
147
+ const resolveOnce = () => {
148
+ if (settled)
149
+ return;
150
+ settled = true;
151
+ cleanup();
152
+ resolve(ws);
153
+ };
154
+ const rejectOnce = (err) => {
155
+ if (settled)
156
+ return;
157
+ settled = true;
158
+ cleanup();
159
+ try {
160
+ ws.close();
161
+ }
162
+ catch {
163
+ /* ignore close errors */
164
+ }
165
+ reject(err);
166
+ };
167
+ const armHandshakeFallback = () => {
168
+ if (timer)
169
+ return;
170
+ timer = setTimeout(resolveOnce, HANDSHAKE_WAIT_MS);
171
+ };
172
+ const onMessage = (data) => {
173
+ const packet = data.toString();
174
+ if (packet === '2') {
175
+ try {
176
+ ws.send('3');
177
+ }
178
+ catch {
179
+ /* ignore send errors during probing */
180
+ }
181
+ return;
182
+ }
183
+ if (!sentConnect) {
184
+ if (!packet.startsWith('0')) {
185
+ rejectOnce(new Error(`tempmail-cn: unexpected open packet for EIO=${version}`));
186
+ return;
187
+ }
188
+ sentConnect = true;
189
+ try {
190
+ ws.send('40');
191
+ }
192
+ catch (error) {
193
+ rejectOnce(error instanceof Error ? error : new Error(String(error)));
194
+ return;
195
+ }
196
+ armHandshakeFallback();
197
+ return;
198
+ }
199
+ if (packet.startsWith('40')) {
200
+ resolveOnce();
201
+ }
202
+ };
203
+ const onError = (error) => rejectOnce(error);
204
+ const onClose = () => rejectOnce(new Error(`tempmail-cn: websocket closed during EIO=${version} handshake`));
205
+ ws.on('message', onMessage);
206
+ ws.once('error', onError);
207
+ ws.once('close', onClose);
208
+ });
209
+ }
210
+ catch (error) {
211
+ lastError = error instanceof Error ? error : new Error(String(error));
212
+ }
213
+ }
214
+ throw lastError || new Error('tempmail-cn: websocket handshake failed');
215
+ }
216
+ async function requestShortId(host) {
217
+ const ws = await connectSocket(host);
218
+ return await new Promise((resolve, reject) => {
219
+ const timer = setTimeout(() => {
220
+ cleanup();
221
+ try {
222
+ ws.close();
223
+ }
224
+ catch {
225
+ /* ignore close errors */
226
+ }
227
+ reject(new Error('tempmail-cn: timed out waiting for shortid'));
228
+ }, CONNECT_TIMEOUT_MS);
229
+ const cleanup = () => {
230
+ clearTimeout(timer);
231
+ ws.off('message', onMessage);
232
+ ws.off('error', onError);
233
+ ws.off('close', onClose);
234
+ };
235
+ const finish = (value) => {
236
+ cleanup();
237
+ try {
238
+ ws.close();
239
+ }
240
+ catch {
241
+ /* ignore close errors */
242
+ }
243
+ resolve(value);
244
+ };
245
+ const fail = (error) => {
246
+ cleanup();
247
+ try {
248
+ ws.close();
249
+ }
250
+ catch {
251
+ /* ignore close errors */
252
+ }
253
+ reject(error);
254
+ };
255
+ const onMessage = (data) => {
256
+ const packet = data.toString();
257
+ if (packet === '2') {
258
+ ws.send('3');
259
+ return;
260
+ }
261
+ const decoded = parseEventPacket(packet);
262
+ if (!decoded || decoded.event !== 'shortid' || typeof decoded.payload !== 'string') {
263
+ return;
264
+ }
265
+ finish(decoded.payload);
266
+ };
267
+ const onError = (error) => fail(error);
268
+ const onClose = () => fail(new Error('tempmail-cn: websocket closed before shortid arrived'));
269
+ ws.on('message', onMessage);
270
+ ws.once('error', onError);
271
+ ws.once('close', onClose);
272
+ sendEvent(ws, 'request shortid', true);
273
+ });
274
+ }
275
+ async function ensureMailbox(email) {
276
+ const st = getState(email);
277
+ if (st.ws?.readyState === ws_1.default.OPEN) {
278
+ return;
279
+ }
280
+ if (st.connectPromise) {
281
+ return st.connectPromise;
282
+ }
283
+ const { local, host } = splitAddress(email);
284
+ st.connectPromise = (async () => {
285
+ try {
286
+ const ws = await connectSocket(host);
287
+ st.ws = ws;
288
+ const detach = () => {
289
+ if (st.ws === ws) {
290
+ st.ws = null;
291
+ }
292
+ st.connectPromise = undefined;
293
+ };
294
+ ws.on('message', (data) => {
295
+ const packet = data.toString();
296
+ if (packet === '2') {
297
+ try {
298
+ ws.send('3');
299
+ }
300
+ catch {
301
+ /* ignore late pong failures */
302
+ }
303
+ return;
304
+ }
305
+ const decoded = parseEventPacket(packet);
306
+ if (!decoded || decoded.event !== 'mail' || !decoded.payload) {
307
+ return;
308
+ }
309
+ const normalized = (0, normalize_1.normalizeEmail)(flattenMail(decoded.payload, email), email);
310
+ if (!normalized.id || st.seenIds.has(normalized.id)) {
311
+ return;
312
+ }
313
+ st.seenIds.add(normalized.id);
314
+ st.emails.push(normalized);
315
+ });
316
+ ws.on('close', detach);
317
+ ws.on('error', detach);
318
+ sendEvent(ws, 'set shortid', local);
319
+ await sleep(INITIAL_SYNC_WAIT_MS);
320
+ }
321
+ catch (error) {
322
+ st.connectPromise = undefined;
323
+ throw error;
324
+ }
325
+ })();
326
+ return st.connectPromise;
327
+ }
328
+ async function generateEmail(domain) {
329
+ const host = normalizeHost(domain);
330
+ const shortid = await requestShortId(host);
331
+ return {
332
+ channel: CHANNEL,
333
+ email: `${shortid}@${host}`,
334
+ };
335
+ }
336
+ async function getEmails(email) {
337
+ await ensureMailbox(email);
338
+ const st = getState(email);
339
+ return [...st.emails];
340
+ }
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG1haWwtY24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXJzL3RlbXBtYWlsLWNuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBMFdBLHNDQU9DO0FBRUQsOEJBSUM7QUF2WEQsNENBQTJCO0FBRTNCLDRDQUE4QztBQUU5QyxNQUFNLE9BQU8sR0FBWSxhQUFhLENBQUM7QUFDdkMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQy9CLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFbEMsTUFBTSxlQUFlLEdBQTJCO0lBQzlDLFlBQVksRUFDViwrSEFBK0g7SUFDakksaUJBQWlCLEVBQUUsaURBQWlEO0lBQ3BFLGVBQWUsRUFBRSxVQUFVO0lBQzNCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsTUFBTSxFQUFFLFVBQVU7Q0FDbkIsQ0FBQztBQVNGLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0FBRTlDLFNBQVMsUUFBUSxDQUFDLEtBQWE7SUFDN0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZDLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1IsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFD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QUssQ0FBQyxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgeyBJbnRlcm5hbEVtYWlsSW5mbywgRW1haWwsIENoYW5uZWwgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4uL25vcm1hbGl6ZSc7XG5cbmNvbnN0IENIQU5ORUw6IENoYW5uZWwgPSAndGVtcG1haWwtY24nO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJ3RlbXBtYWlsLmNuJztcbmNvbnN0IENPTk5FQ1RfVElNRU9VVF9NUyA9IDE1MDAwO1xuY29uc3QgSEFORFNIQUtFX1dBSVRfTVMgPSAxMDAwO1xuY29uc3QgSU5JVElBTF9TWU5DX1dBSVRfTVMgPSA4MDtcbmNvbnN0IFNPQ0tFVF9JT19WRVJTSU9OUyA9IFs0LCAzXTtcblxuY29uc3QgREVGQVVMVF9IRUFERVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnVXNlci1BZ2VudCc6XG4gICAgJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xNDYuMC4wLjAgU2FmYXJpLzUzNy4zNiBFZGcvMTQ2LjAuMC4wJyxcbiAgJ0FjY2VwdC1MYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOSxlbjtxPTAuOCxlbi1HQjtxPTAuNyxlbi1VUztxPTAuNicsXG4gICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyxcbiAgRE5UOiAnMScsXG4gIFByYWdtYTogJ25vLWNhY2hlJyxcbn07XG5cbnR5cGUgQm94U3RhdGUgPSB7XG4gIGVtYWlsczogRW1haWxbXTtcbiAgc2VlbklkczogU2V0PHN0cmluZz47XG4gIHdzOiBXZWJTb2NrZXQgfCBudWxsO1xuICBjb25uZWN0UHJvbWlzZT86IFByb21pc2U8dm9pZD47XG59O1xuXG5jb25zdCBtYWlsYm94ZXMgPSBuZXcgTWFwPHN0cmluZywgQm94U3RhdGU+KCk7XG5cbmZ1bmN0aW9uIGdldFN0YXRlKGVtYWlsOiBzdHJpbmcpOiBCb3hTdGF0ZSB7XG4gIGNvbnN0IGtleSA9IGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBsZXQgc3QgPSBtYWlsYm94ZXMuZ2V0KGtleSk7XG4gIGlmICghc3QpIHtcbiAgICBzdCA9IHsgZW1haWxzOiBbXSwgc2VlbklkczogbmV3IFNldCgpLCB3czogbnVsbCB9O1xuICAgIG1haWxib3hlcy5zZXQoa2V5LCBzdCk7XG4gIH1cbiAgcmV0dXJuIHN0O1xufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIb3N0KGRvbWFpbj86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCByYXcgPSBTdHJpbmcoZG9tYWluIHx8ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSB7XG4gICAgcmV0dXJuIERFRkFVTFRfSE9TVDtcbiAgfVxuXG4gIGxldCBob3N0ID0gcmF3O1xuICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdChob3N0KSkge1xuICAgIHRyeSB7XG4gICAgICBob3N0ID0gbmV3IFVSTChob3N0KS5ob3N0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgaG9zdCA9IHJhdztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcygnLycpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGhvc3QgPSBuZXcgVVJMKGBodHRwczovLyR7aG9zdH1gKS5ob3N0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgaG9zdCA9IGhvc3Quc3BsaXQoJy8nKVswXTtcbiAgICB9XG4gIH1cblxuICBob3N0ID0gaG9zdC5yZXBsYWNlKC9eXFwuK3xcXC4rJC9nLCAnJyk7XG4gIGNvbnN0IGF0ID0gaG9zdC5sYXN0SW5kZXhPZignQCcpO1xuICBpZiAoYXQgPj0gMCkge1xuICAgIGhvc3QgPSBob3N0LnNsaWNlKGF0ICsgMSk7XG4gIH1cbiAgcmV0dXJuIGhvc3QgfHwgREVGQVVMVF9IT1NUO1xufVxuXG5mdW5jdGlvbiBzcGxpdEFkZHJlc3MoZW1haWw6IHN0cmluZyk6IHsgbG9jYWw6IHN0cmluZzsgaG9zdDogc3RyaW5nIH0ge1xuICBjb25zdCB0cmltbWVkID0gZW1haWwudHJpbSgpO1xuICBjb25zdCBhdCA9IHRyaW1tZWQuaW5kZXhPZignQCcpO1xuICBpZiAoYXQgPD0gMCB8fCBhdCA9PT0gdHJpbW1lZC5sZW5ndGggLSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW1wbWFpbC1jbjogaW52YWxpZCBlbWFpbCBhZGRyZXNzJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsb2NhbDogdHJpbW1lZC5zbGljZSgwLCBhdCksXG4gICAgaG9zdDogbm9ybWFsaXplSG9zdCh0cmltbWVkLnNsaWNlKGF0ICsgMSkpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzb2NrZXRVcmwoaG9zdDogc3RyaW5nLCBlaW86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgd3NzOi8vJHtob3N0fS9zb2NrZXQuaW8vP0VJTz0ke2Vpb30mdHJhbnNwb3J0PXdlYnNvY2tldGA7XG59XG5cbmZ1bmN0aW9uIHNvY2tldEhlYWRlcnMoaG9zdDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiB7XG4gICAgLi4uREVGQVVMVF9IRUFERVJTLFxuICAgIE9yaWdpbjogYGh0dHBzOi8vJHtob3N0fWAsXG4gICAgUmVmZXJlcjogYGh0dHBzOi8vJHtob3N0fS9gLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzZW5kRXZlbnQod3M6IFdlYlNvY2tldCwgZXZlbnQ6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHZvaWQge1xuICB3cy5zZW5kKGA0MiR7SlNPTi5zdHJpbmdpZnkoW2V2ZW50LCBwYXlsb2FkXSl9YCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnRQYWNrZXQocGFja2V0OiBzdHJpbmcpOiB7IGV2ZW50OiBzdHJpbmc7IHBheWxvYWQ6IGFueSB9IHwgbnVsbCB7XG4gIGlmICghcGFja2V0LnN0YXJ0c1dpdGgoJzQyJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKHBhY2tldC5zbGljZSgyKSk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZWQpIHx8IHR5cGVvZiBkZWNvZGVkWzBdICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7IGV2ZW50OiBkZWNvZGVkWzBdLCBwYXlsb2FkOiBkZWNvZGVkWzFdIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YWJsZU1lc3NhZ2VJZChyYXc6IGFueSwgcmVjaXBpZW50RW1haWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhlYWRlcnMgPSByYXc/LmhlYWRlcnMgfHwge307XG4gIHJldHVybiBTdHJpbmcoXG4gICAgcmF3Py5pZCA/P1xuICAgICAgcmF3Py5tZXNzYWdlSWQgPz9cbiAgICAgIGhlYWRlcnNbJ21lc3NhZ2UtaWQnXSA/P1xuICAgICAgaGVhZGVycy5tZXNzYWdlSWQgPz9cbiAgICAgIGAke2hlYWRlcnMuZnJvbSB8fCByYXc/LmZyb20gfHwgJyd9XFxuJHtoZWFkZXJzLnN1YmplY3QgfHwgcmF3Py5zdWJqZWN0IHx8ICcnfVxcbiR7aGVhZGVycy5kYXRlIHx8IHJhdz8uZGF0ZSB8fCAnJ31cXG4ke3JlY2lwaWVudEVtYWlsfWAsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5NYWlsKHJhdzogYW55LCByZWNpcGllbnRFbWFpbDogc3RyaW5nKTogYW55IHtcbiAgY29uc3QgaGVhZGVycyA9IHJhdz8uaGVhZGVycyB8fCB7fTtcbiAgcmV0dXJuIHtcbiAgICBpZDogc3RhYmxlTWVzc2FnZUlkKHJhdywgcmVjaXBpZW50RW1haWwpLFxuICAgIGZyb206IGhlYWRlcnMuZnJvbSB8fCByYXc/LmZyb20gfHwgJycsXG4gICAgdG86IHJlY2lwaWVudEVtYWlsLFxuICAgIHN1YmplY3Q6IGhlYWRlcnMuc3ViamVjdCB8fCByYXc/LnN1YmplY3QgfHwgJycsXG4gICAgdGV4dDogcmF3Py50ZXh0IHx8IHJhdz8uYm9keSB8fCAnJyxcbiAgICBodG1sOiByYXc/Lmh0bWwgfHwgJycsXG4gICAgZGF0ZTogaGVhZGVycy5kYXRlIHx8IHJhdz8uZGF0ZSB8fCAnJyxcbiAgICBpc1JlYWQ6IGZhbHNlLFxuICAgIGF0dGFjaG1lbnRzOiBBcnJheS5pc0FycmF5KHJhdz8uYXR0YWNobWVudHMpID8gcmF3LmF0dGFjaG1lbnRzIDogW10sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RTb2NrZXQoaG9zdDogc3RyaW5nKTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IHZlcnNpb24gb2YgU09DS0VUX0lPX1ZFUlNJT05TKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxXZWJTb2NrZXQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHNvY2tldFVybChob3N0LCB2ZXJzaW9uKSwge1xuICAgICAgICAgIGhhbmRzaGFrZVRpbWVvdXQ6IENPTk5FQ1RfVElNRU9VVF9NUyxcbiAgICAgICAgICBoZWFkZXJzOiBzb2NrZXRIZWFkZXJzKGhvc3QpLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgdGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc2VudENvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cy5vZmYoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgICAgICAgIHdzLm9mZignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICB3cy5vZmYoJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZU9uY2UgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgcmVzb2x2ZSh3cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVqZWN0T25jZSA9IChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBpZ25vcmUgY2xvc2UgZXJyb3JzICovXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFybUhhbmRzaGFrZUZhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh0aW1lcikgcmV0dXJuO1xuICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dChyZXNvbHZlT25jZSwgSEFORFNIQUtFX1dBSVRfTVMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uTWVzc2FnZSA9IChkYXRhOiBXZWJTb2NrZXQuUmF3RGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhY2tldCA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgICBpZiAocGFja2V0ID09PSAnMicpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdzLnNlbmQoJzMnKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvKiBpZ25vcmUgc2VuZCBlcnJvcnMgZHVyaW5nIHByb2JpbmcgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZW50Q29ubmVjdCkge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuc3RhcnRzV2l0aCgnMCcpKSB7XG4gICAgICAgICAgICAgIHJlamVjdE9uY2UobmV3IEVycm9yKGB0ZW1wbWFpbC1jbjogdW5leHBlY3RlZCBvcGVuIHBhY2tldCBmb3IgRUlPPSR7dmVyc2lvbn1gKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbnRDb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdzLnNlbmQoJzQwJyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3RPbmNlKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFybUhhbmRzaGFrZUZhbGxiYWNrKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYWNrZXQuc3RhcnRzV2l0aCgnNDAnKSkge1xuICAgICAgICAgICAgcmVzb2x2ZU9uY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHJlamVjdE9uY2UoZXJyb3IpO1xuICAgICAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4gcmVqZWN0T25jZShuZXcgRXJyb3IoYHRlbXBtYWlsLWNuOiB3ZWJzb2NrZXQgY2xvc2VkIGR1cmluZyBFSU89JHt2ZXJzaW9ufSBoYW5kc2hha2VgKSk7XG5cbiAgICAgICAgd3Mub24oJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgICAgICB3cy5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB3cy5vbmNlKCdjbG9zZScsIG9uQ2xvc2UpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCd0ZW1wbWFpbC1jbjogd2Vic29ja2V0IGhhbmRzaGFrZSBmYWlsZWQnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFNob3J0SWQoaG9zdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgd3MgPSBhd2FpdCBjb25uZWN0U29ja2V0KGhvc3QpO1xuXG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgY2xvc2UgZXJyb3JzICovXG4gICAgICB9XG4gICAgICByZWplY3QobmV3IEVycm9yKCd0ZW1wbWFpbC1jbjogdGltZWQgb3V0IHdhaXRpbmcgZm9yIHNob3J0aWQnKSk7XG4gICAgfSwgQ09OTkVDVF9USU1FT1VUX01TKTtcblxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgd3Mub2ZmKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcbiAgICAgIHdzLm9mZignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHdzLm9mZignY2xvc2UnLCBvbkNsb3NlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZmluaXNoID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlIGNsb3NlIGVycm9ycyAqL1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZhaWwgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICB0cnkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGlnbm9yZSBjbG9zZSBlcnJvcnMgKi9cbiAgICAgIH1cbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTWVzc2FnZSA9IChkYXRhOiBXZWJTb2NrZXQuUmF3RGF0YSkgPT4ge1xuICAgICAgY29uc3QgcGFja2V0ID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgaWYgKHBhY2tldCA9PT0gJzInKSB7XG4gICAgICAgIHdzLnNlbmQoJzMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb2RlZCA9IHBhcnNlRXZlbnRQYWNrZXQocGFja2V0KTtcbiAgICAgIGlmICghZGVjb2RlZCB8fCBkZWNvZGVkLmV2ZW50ICE9PSAnc2hvcnRpZCcgfHwgdHlwZW9mIGRlY29kZWQucGF5bG9hZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZmluaXNoKGRlY29kZWQucGF5bG9hZCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiBmYWlsKGVycm9yKTtcbiAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4gZmFpbChuZXcgRXJyb3IoJ3RlbXBtYWlsLWNuOiB3ZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBzaG9ydGlkIGFycml2ZWQnKSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gICAgd3Mub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgICB3cy5vbmNlKCdjbG9zZScsIG9uQ2xvc2UpO1xuXG4gICAgc2VuZEV2ZW50KHdzLCAncmVxdWVzdCBzaG9ydGlkJywgdHJ1ZSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVNYWlsYm94KGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3QgPSBnZXRTdGF0ZShlbWFpbCk7XG4gIGlmIChzdC53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHN0LmNvbm5lY3RQcm9taXNlKSB7XG4gICAgcmV0dXJuIHN0LmNvbm5lY3RQcm9taXNlO1xuICB9XG5cbiAgY29uc3QgeyBsb2NhbCwgaG9zdCB9ID0gc3BsaXRBZGRyZXNzKGVtYWlsKTtcblxuICBzdC5jb25uZWN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgY29ubmVjdFNvY2tldChob3N0KTtcbiAgICAgIHN0LndzID0gd3M7XG5cbiAgICAgIGNvbnN0IGRldGFjaCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHN0LndzID09PSB3cykge1xuICAgICAgICAgIHN0LndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdC5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIH07XG5cbiAgICAgIHdzLm9uKCdtZXNzYWdlJywgKGRhdGE6IFdlYlNvY2tldC5SYXdEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHBhY2tldCA9PT0gJzInKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdzLnNlbmQoJzMnKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIGlnbm9yZSBsYXRlIHBvbmcgZmFpbHVyZXMgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IHBhcnNlRXZlbnRQYWNrZXQocGFja2V0KTtcbiAgICAgICAgaWYgKCFkZWNvZGVkIHx8IGRlY29kZWQuZXZlbnQgIT09ICdtYWlsJyB8fCAhZGVjb2RlZC5wYXlsb2FkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUVtYWlsKGZsYXR0ZW5NYWlsKGRlY29kZWQucGF5bG9hZCwgZW1haWwpLCBlbWFpbCk7XG4gICAgICAgIGlmICghbm9ybWFsaXplZC5pZCB8fCBzdC5zZWVuSWRzLmhhcyhub3JtYWxpemVkLmlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0LnNlZW5JZHMuYWRkKG5vcm1hbGl6ZWQuaWQpO1xuICAgICAgICBzdC5lbWFpbHMucHVzaChub3JtYWxpemVkKTtcbiAgICAgIH0pO1xuXG4gICAgICB3cy5vbignY2xvc2UnLCBkZXRhY2gpO1xuICAgICAgd3Mub24oJ2Vycm9yJywgZGV0YWNoKTtcblxuICAgICAgc2VuZEV2ZW50KHdzLCAnc2V0IHNob3J0aWQnLCBsb2NhbCk7XG4gICAgICBhd2FpdCBzbGVlcChJTklUSUFMX1NZTkNfV0FJVF9NUyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN0LmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiBzdC5jb25uZWN0UHJvbWlzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWwoZG9tYWluPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8SW50ZXJuYWxFbWFpbEluZm8+IHtcbiAgY29uc3QgaG9zdCA9IG5vcm1hbGl6ZUhvc3QoZG9tYWluKTtcbiAgY29uc3Qgc2hvcnRpZCA9IGF3YWl0IHJlcXVlc3RTaG9ydElkKGhvc3QpO1xuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6IENIQU5ORUwsXG4gICAgZW1haWw6IGAke3Nob3J0aWR9QCR7aG9zdH1gLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgYXdhaXQgZW5zdXJlTWFpbGJveChlbWFpbCk7XG4gIGNvbnN0IHN0ID0gZ2V0U3RhdGUoZW1haWwpO1xuICByZXR1cm4gWy4uLnN0LmVtYWlsc107XG59XG4iXX0=
package/dist/retry.d.ts CHANGED
@@ -26,5 +26,18 @@ export interface RetryOptions {
26
26
  * @param fn 要执行的异步操作
27
27
  * @param options 重试配置
28
28
  */
29
+ export type RetryWithAttemptsResult<T> = {
30
+ ok: true;
31
+ value: T;
32
+ attempts: number;
33
+ } | {
34
+ ok: false;
35
+ error: unknown;
36
+ attempts: number;
37
+ };
38
+ /**
39
+ * 与 withRetry 相同,额外返回尝试次数(成功或最终失败时均有效)
40
+ */
41
+ export declare function withRetryWithAttempts<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<RetryWithAttemptsResult<T>>;
29
42
  export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
30
43
  export declare function fetchWithTimeout(url: string, init?: RequestInit, timeoutMs?: number): Promise<Response>;
package/dist/retry.js CHANGED
@@ -4,6 +4,7 @@
4
4
  * 提供请求重试、超时控制、指数退避等错误恢复机制
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.withRetryWithAttempts = withRetryWithAttempts;
7
8
  exports.withRetry = withRetry;
8
9
  exports.fetchWithTimeout = fetchWithTimeout;
9
10
  const logger_1 = require("./logger");
@@ -60,24 +61,19 @@ function sleep(ms) {
60
61
  return new Promise(resolve => setTimeout(resolve, ms));
61
62
  }
62
63
  /**
63
- * 带重试的异步操作执行器
64
- * - 自动重试可恢复的错误(网络错误、超时、HTTP 4xx/5xx)
65
- * - 指数退避避免过度请求
66
- * - 不可恢复的错误(SDK 内部参数校验错误等)直接抛出不重试
67
- *
68
- * @param fn 要执行的异步操作
69
- * @param options 重试配置
64
+ * 与 withRetry 相同,额外返回尝试次数(成功或最终失败时均有效)
70
65
  */
71
- async function withRetry(fn, options) {
66
+ async function withRetryWithAttempts(fn, options) {
72
67
  const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
73
68
  let lastError;
74
69
  for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
70
+ const attempts = attempt + 1;
75
71
  try {
76
72
  const result = await fn();
77
73
  if (attempt > 0) {
78
74
  logger_1.logger.info(`第 ${attempt + 1} 次尝试成功`);
79
75
  }
80
- return result;
76
+ return { ok: true, value: result, attempts };
81
77
  }
82
78
  catch (error) {
83
79
  lastError = error;
@@ -90,7 +86,7 @@ async function withRetry(fn, options) {
90
86
  else if (!opts.shouldRetry(error)) {
91
87
  logger_1.logger.debug(`不可重试的错误: ${errorMsg}`);
92
88
  }
93
- throw error;
89
+ return { ok: false, error, attempts };
94
90
  }
95
91
  /* 指数退避等待 */
96
92
  const delay = Math.min(opts.initialDelay * Math.pow(2, attempt), opts.maxDelay);
@@ -98,7 +94,13 @@ async function withRetry(fn, options) {
98
94
  await sleep(delay);
99
95
  }
100
96
  }
101
- throw lastError;
97
+ return { ok: false, error: lastError, attempts: opts.maxRetries + 1 };
98
+ }
99
+ async function withRetry(fn, options) {
100
+ const r = await withRetryWithAttempts(fn, options);
101
+ if (r.ok)
102
+ return r.value;
103
+ throw r.error;
102
104
  }
103
105
  /**
104
106
  * 带超时控制的 fetch 包装
@@ -158,4 +160,4 @@ async function fetchWithTimeout(url, init, timeoutMs) {
158
160
  clearTimeout(timeoutId);
159
161
  }
160
162
  }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7QUF3RkgsOEJBaUNDO0FBZ0NELDRDQWlDQztBQXhMRCxxQ0FBa0M7QUFDbEMscUNBQXFDO0FBa0JyQyxNQUFNLHFCQUFxQixHQUEyQjtJQUNwRCxVQUFVLEVBQUUsQ0FBQztJQUNiLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsT0FBTyxFQUFFLEtBQUs7SUFDZCxXQUFXLEVBQUUsa0JBQWtCO0NBQ2hDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQVU7SUFDcEMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV6QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFbkUsaUJBQWlCO0lBQ2pCLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLElBQUksT0FBTyxDQUFD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S0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2xDLEdBQUcsSUFBSTtZQUNQLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtTQUMxQixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsZ0JBQWdCLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO1lBQVMsQ0FBQztRQUNULFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog6YCa55So6YeN6K+V5bel5YW3XG4gKiDmj5Dkvpvor7fmsYLph43or5XjgIHotoXml7bmjqfliLbjgIHmjIfmlbDpgIDpgb/nrYnplJnor6/mgaLlpI3mnLrliLZcbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbi8qKlxuICog6YeN6K+V6YWN572u6YCJ6aG5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqIOacgOWkp+mHjeivleasoeaVsO+8iOS4jeWQq+mmluasoeivt+axgu+8ie+8jOm7mOiupCAyICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiDliJ3lp4vph43or5Xlu7bov5/vvIjmr6vnp5LvvInvvIzpu5jorqQgMTAwMCAqL1xuICBpbml0aWFsRGVsYXk/OiBudW1iZXI7XG4gIC8qKiDmnIDlpKfph43or5Xlu7bov5/vvIjmr6vnp5LvvInvvIzpu5jorqQgNTAwMCAqL1xuICBtYXhEZWxheT86IG51bWJlcjtcbiAgLyoqIOivt+axgui2heaXtuaXtumXtO+8iOavq+enku+8ie+8jOm7mOiupCAxNTAwMCAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiog5piv5ZCm5a+56K+l6ZSZ6K+v6L+b6KGM6YeN6K+V55qE5Yik5pat5Ye95pWwICovXG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiBhbnkpID0+IGJvb2xlYW47XG59XG5cbmNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUzogUmVxdWlyZWQ8UmV0cnlPcHRpb25zPiA9IHtcbiAgbWF4UmV0cmllczogMixcbiAgaW5pdGlhbERlbGF5OiAxMDAwLFxuICBtYXhEZWxheTogNTAwMCxcbiAgdGltZW91dDogMTUwMDAsXG4gIHNob3VsZFJldHJ5OiBkZWZhdWx0U2hvdWxkUmV0cnksXG59O1xuXG4vKipcbiAqIOm7mOiupOmHjeivleWIpOaWrVxuICog5Lul5LiL6ZSZ6K+v57G75Z6L5Lya6Kem5Y+R6YeN6K+V77yaXG4gKiAtIOe9kee7nOi/nuaOpemUmeivr++8iGZldGNoIGZhaWxlZCwgRUNPTk5SRUZVU0VELCBFQ09OTlJFU0VUIOetie+8iVxuICogLSDotoXml7bplJnor6/vvIh0aW1lb3V0LCBhYm9ydO+8iVxuICogLSBETlMg6Kej5p6Q5aSx6LSlXG4gKiAtIEhUVFAgNDI5IOmZkOa1gVxuICogLSBIVFRQIDR4eC81eHgg5pyN5Yqh56uv6ZSZ6K+v77yI5ZCr54q25oCB56CB55qE6ZSZ6K+v5raI5oGv77yJXG4gKiDku4UgU0RLIOWGhemDqOeahOWPguaVsOagoemqjOexu+mUmeivr+S4jemHjeivlVxuICovXG5mdW5jdGlvbiBkZWZhdWx0U2hvdWxkUmV0cnkoZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbWVzc2FnZSA9IFN0cmluZyhlcnJvci5tZXNzYWdlIHx8IGVycm9yIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8qIOe9kee7nOe6p+WIq+mUmeivryDihpIg6YeN6K+VICovXG4gIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdmZXRjaCBmYWlsZWQnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnbmV0d29yaycpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCdlY29ubnJlZnVzZWQnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnZWNvbm5yZXNldCcpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCdldGltZWRvdXQnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygndGltZW91dCcpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCdzb2NrZXQgaGFuZyB1cCcpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCdkbnMnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnYWJvcnQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogSFRUUCA0Mjkg6ZmQ5rWBIOKGkiDph43or5UgKi9cbiAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJzQyOScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3RvbyBtYW55IHJlcXVlc3RzJykgfHwgbWVzc2FnZS5pbmNsdWRlcygncmF0ZSBsaW1pdCcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiBIVFRQIDR4eC81eHgg6ZSZ6K+v77yI5ZCr54q25oCB56CB55qE6ZSZ6K+v5raI5oGv77yJ4oaSIOmHjeivlSAqL1xuICBjb25zdCBzdGF0dXNNYXRjaCA9IG1lc3NhZ2UubWF0Y2goLzpcXHMqKFxcZHszfSkvKTtcbiAgaWYgKHN0YXR1c01hdGNoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gcGFyc2VJbnQoc3RhdHVzTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gc3RhdHVzID49IDQwMDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiDkvJHnnKDmjIflrprmr6vnp5JcbiAqL1xuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICog5bim6YeN6K+V55qE5byC5q2l5pON5L2c5omn6KGM5ZmoXG4gKiAtIOiHquWKqOmHjeivleWPr+aBouWkjeeahOmUmeivr++8iOe9kee7nOmUmeivr+OAgei2heaXtuOAgUhUVFAgNHh4LzV4eO+8iVxuICogLSDmjIfmlbDpgIDpgb/pgb/lhY3ov4fluqbor7fmsYJcbiAqIC0g5LiN5Y+v5oGi5aSN55qE6ZSZ6K+v77yIU0RLIOWGhemDqOWPguaVsOagoemqjOmUmeivr+etie+8ieebtOaOpeaKm+WHuuS4jemHjeivlVxuICpcbiAqIEBwYXJhbSBmbiDopoHmiafooYznmoTlvILmraXmk43kvZxcbiAqIEBwYXJhbSBvcHRpb25zIOmHjeivlemFjee9rlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+LCBvcHRpb25zPzogUmV0cnlPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG9wdHMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuICBsZXQgbGFzdEVycm9yOiBhbnk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gb3B0cy5tYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICAgIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhg56ysICR7YXR0ZW1wdCArIDF9IOasoeWwneivleaIkOWKn2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpO1xuXG4gICAgICAvKiDmnIDlkI7kuIDmrKHlsJ3or5XlpLHotKXmiJbkuI3lj6/ph43or5XnmoTplJnor68g4oaSIOebtOaOpeaKm+WHuiAqL1xuICAgICAgaWYgKGF0dGVtcHQgPj0gb3B0cy5tYXhSZXRyaWVzIHx8ICFvcHRzLnNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICBpZiAoYXR0ZW1wdCA+PSBvcHRzLm1heFJldHJpZXMgJiYgb3B0cy5tYXhSZXRyaWVzID4gMCkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YeN6K+VICR7b3B0cy5tYXhSZXRyaWVzfSDmrKHlkI7ku43lpLHotKU6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9wdHMuc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGDkuI3lj6/ph43or5XnmoTplJnor686ICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8qIOaMh+aVsOmAgOmBv+etieW+hSAqL1xuICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbihvcHRzLmluaXRpYWxEZWxheSAqIE1hdGgucG93KDIsIGF0dGVtcHQpLCBvcHRzLm1heERlbGF5KTtcbiAgICAgIGxvZ2dlci53YXJuKGDor7fmsYLlpLHotKUgKCR7ZXJyb3JNc2d9Ke+8jCR7ZGVsYXl9bXMg5ZCO56ysICR7YXR0ZW1wdCArIDJ9IOasoemHjeivlS4uLmApO1xuICAgICAgYXdhaXQgc2xlZXAoZGVsYXkpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IGxhc3RFcnJvcjtcbn1cblxuLyoqXG4gKiDluKbotoXml7bmjqfliLbnmoQgZmV0Y2gg5YyF6KOFXG4gKiDlnKjljp/nlJ8gZmV0Y2gg5Z+656GA5LiK5re75Yqg6LaF5pe25Lit5pat6IO95YqbXG4gKlxuICogQHBhcmFtIHVybCDor7fmsYIgVVJMXG4gKiBAcGFyYW0gaW5pdCBmZXRjaCDpgInpoblcbiAqIEBwYXJhbSB0aW1lb3V0TXMg6LaF5pe25pe26Ze077yI5q+r56eS77yJXG4gKi9cbi8qKlxuICog57yT5a2Y55qE5YWo5bGA6YWN572u5b+r54Wn77yM6YG/5YWN5q+P5qyh6K+35rGC6YO96K+75Y+WXG4gKiDku4XlnKggc2V0Q29uZmlnIOiiq+iwg+eUqOaXtuWkseaViO+8iOmAmui/hyBjb25maWdWZXJzaW9uIOavlOWvue+8iVxuICovXG5sZXQgX2NhY2hlZEZldGNoQ29uZmlnOiB7IGZldGNoRm46IHR5cGVvZiBmZXRjaDsgdGltZW91dDogbnVtYmVyOyB2ZXJzaW9uOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIOiOt+WPlue8k+WtmOeahCBmZXRjaCDphY3nva5cbiAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hDb25maWcoKTogeyBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7IHRpbWVvdXQ6IG51bWJlciB9IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gIC8qIOeugOWNleeahOW8leeUqOavlOWvueWNs+WPr++8jGdldENvbmZpZyDlnKjmnKrlj5jmm7Tml7bov5Tlm57lkIzkuIDlr7nosaEgKi9cbiAgaWYgKCFfY2FjaGVkRmV0Y2hDb25maWcgfHwgX2NhY2hlZEZldGNoQ29uZmlnLmZldGNoRm4gIT09IChjb25maWcuY3VzdG9tRmV0Y2ggfHwgZmV0Y2gpIHx8IF9jYWNoZWRGZXRjaENvbmZpZy50aW1lb3V0ICE9PSAoY29uZmlnLnRpbWVvdXQgPz8gREVGQVVMVF9SRVRSWV9PUFRJT05TLnRpbWVvdXQpKSB7XG4gICAgX2NhY2hlZEZldGNoQ29uZmlnID0ge1xuICAgICAgZmV0Y2hGbjogY29uZmlnLmN1c3RvbUZldGNoIHx8IGZldGNoLFxuICAgICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gREVGQVVMVF9SRVRSWV9PUFRJT05TLnRpbWVvdXQsXG4gICAgICB2ZXJzaW9uOiAwLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIF9jYWNoZWRGZXRjaENvbmZpZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQoXG4gIHVybDogc3RyaW5nLFxuICBpbml0PzogUmVxdWVzdEluaXQsXG4gIHRpbWVvdXRNcz86IG51bWJlcixcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBmZXRjaEZuLCB0aW1lb3V0OiBkZWZhdWx0VGltZW91dCB9ID0gZ2V0RmV0Y2hDb25maWcoKTtcbiAgY29uc3QgZWZmZWN0aXZlVGltZW91dCA9IHRpbWVvdXRNcyA/PyBkZWZhdWx0VGltZW91dDtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGVmZmVjdGl2ZVRpbWVvdXQpO1xuXG4gIC8qXG4gICAqIOWmguaenOiwg+eUqOaWueW3suaPkOS+myBzaWduYWzvvIzpnIDopoHlkIzml7bnm5HlkKzkuKTkuKrkv6Hlj7fvvIjosIPnlKjmlrkgKyDotoXml7bvvIlcbiAgICog5Lu75LiA6Kem5Y+R5YiZ5Lit5pat6K+35rGCXG4gICAqL1xuICBjb25zdCBleHRlcm5hbFNpZ25hbCA9IGluaXQ/LnNpZ25hbDtcbiAgaWYgKGV4dGVybmFsU2lnbmFsKSB7XG4gICAgZXh0ZXJuYWxTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZuKHVybCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtlZmZlY3RpdmVUaW1lb3V0fW1zOiAke3VybH1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7QUErRkgsc0RBcUNDO0FBRUQsOEJBSUM7QUFnQ0QsNENBaUNDO0FBek1ELHFDQUFrQztBQUNsQyxxQ0FBcUM7QUFrQnJDLE1BQU0scUJBQXFCLEdBQTJCO0lBQ3BELFVBQVUsRUFBRSxDQUFDO0lBQ2IsWUFBWSxFQUFFLElBQUk7SUFDbEIsUUFBUSxFQUFFLElBQUk7SUFDZCxPQUFPLEVBQUUsS0FBSztJQUNkLFdBQVcsRUFBRSxrQkFBa0I7Q0FDaEMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBVTtJQUNwQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVuRSxpQkFBaUI7SUFDakIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsSUFB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biAqIOmAmueUqOmHjeivleW3peWFt1xuICog5o+Q5L6b6K+35rGC6YeN6K+V44CB6LaF5pe25o6n5Yi244CB5oyH5pWw6YCA6YG/562J6ZSZ6K+v5oGi5aSN5py65Yi2XG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIOmHjeivlemFjee9rumAiemhuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKiDmnIDlpKfph43or5XmrKHmlbDvvIjkuI3lkKvpppbmrKHor7fmsYLvvInvvIzpu5jorqQgMiAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiog5Yid5aeL6YeN6K+V5bu26L+f77yI5q+r56eS77yJ77yM6buY6K6kIDEwMDAgKi9cbiAgaW5pdGlhbERlbGF5PzogbnVtYmVyO1xuICAvKiog5pyA5aSn6YeN6K+V5bu26L+f77yI5q+r56eS77yJ77yM6buY6K6kIDUwMDAgKi9cbiAgbWF4RGVsYXk/OiBudW1iZXI7XG4gIC8qKiDor7fmsYLotoXml7bml7bpl7TvvIjmr6vnp5LvvInvvIzpu5jorqQgMTUwMDAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIOaYr+WQpuWvueivpemUmeivr+i/m+ihjOmHjeivleeahOWIpOaWreWHveaVsCAqL1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogYW55KSA9PiBib29sZWFuO1xufVxuXG5jb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlM6IFJlcXVpcmVkPFJldHJ5T3B0aW9ucz4gPSB7XG4gIG1heFJldHJpZXM6IDIsXG4gIGluaXRpYWxEZWxheTogMTAwMCxcbiAgbWF4RGVsYXk6IDUwMDAsXG4gIHRpbWVvdXQ6IDE1MDAwLFxuICBzaG91bGRSZXRyeTogZGVmYXVsdFNob3VsZFJldHJ5LFxufTtcblxuLyoqXG4gKiDpu5jorqTph43or5XliKTmlq1cbiAqIOS7peS4i+mUmeivr+exu+Wei+S8muinpuWPkemHjeivle+8mlxuICogLSDnvZHnu5zov57mjqXplJnor6/vvIhmZXRjaCBmYWlsZWQsIEVDT05OUkVGVVNFRCwgRUNPTk5SRVNFVCDnrYnvvIlcbiAqIC0g6LaF5pe26ZSZ6K+v77yIdGltZW91dCwgYWJvcnTvvIlcbiAqIC0gRE5TIOino+aekOWksei0pVxuICogLSBIVFRQIDQyOSDpmZDmtYFcbiAqIC0gSFRUUCA0eHgvNXh4IOacjeWKoeerr+mUmeivr++8iOWQq+eKtuaAgeeggeeahOmUmeivr+a2iOaBr++8iVxuICog5LuFIFNESyDlhoXpg6jnmoTlj4LmlbDmoKHpqoznsbvplJnor6/kuI3ph43or5VcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFNob3VsZFJldHJ5KGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvcikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IubWVzc2FnZSB8fCBlcnJvciB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAvKiDnvZHnu5znuqfliKvplJnor68g4oaSIOmHjeivlSAqL1xuICBpZiAobWVzc2FnZS5pbmNsdWRlcygnZmV0Y2ggZmFpbGVkJykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ25ldHdvcmsnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnZWNvbm5yZWZ1c2VkJykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ2Vjb25ucmVzZXQnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnZXRpbWVkb3V0JykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnc29ja2V0IGhhbmcgdXAnKSB8fFxuICAgICAgbWVzc2FnZS5pbmNsdWRlcygnZG5zJykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ2Fib3J0JykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIEhUVFAgNDI5IOmZkOa1gSDihpIg6YeN6K+VICovXG4gIGlmIChtZXNzYWdlLmluY2x1ZGVzKCc0MjknKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd0b28gbWFueSByZXF1ZXN0cycpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogSFRUUCA0eHgvNXh4IOmUmeivr++8iOWQq+eKtuaAgeeggeeahOmUmeivr+a2iOaBr++8ieKGkiDph43or5UgKi9cbiAgY29uc3Qgc3RhdHVzTWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC86XFxzKihcXGR7M30pLyk7XG4gIGlmIChzdGF0dXNNYXRjaCkge1xuICAgIGNvbnN0IHN0YXR1cyA9IHBhcnNlSW50KHN0YXR1c01hdGNoWzFdLCAxMCk7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSA0MDA7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICog5LyR55yg5oyH5a6a5q+r56eSXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIOW4pumHjeivleeahOW8guatpeaTjeS9nOaJp+ihjOWZqFxuICogLSDoh6rliqjph43or5Xlj6/mgaLlpI3nmoTplJnor6/vvIjnvZHnu5zplJnor6/jgIHotoXml7bjgIFIVFRQIDR4eC81eHjvvIlcbiAqIC0g5oyH5pWw6YCA6YG/6YG/5YWN6L+H5bqm6K+35rGCXG4gKiAtIOS4jeWPr+aBouWkjeeahOmUmeivr++8iFNESyDlhoXpg6jlj4LmlbDmoKHpqozplJnor6/nrYnvvInnm7TmjqXmipvlh7rkuI3ph43or5VcbiAqXG4gKiBAcGFyYW0gZm4g6KaB5omn6KGM55qE5byC5q2l5pON5L2cXG4gKiBAcGFyYW0gb3B0aW9ucyDph43or5XphY3nva5cbiAqL1xuZXhwb3J0IHR5cGUgUmV0cnlXaXRoQXR0ZW1wdHNSZXN1bHQ8VD4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUOyBhdHRlbXB0czogbnVtYmVyIH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd247IGF0dGVtcHRzOiBudW1iZXIgfTtcblxuLyoqXG4gKiDkuI4gd2l0aFJldHJ5IOebuOWQjO+8jOmineWklui/lOWbnuWwneivleasoeaVsO+8iOaIkOWKn+aIluacgOe7iOWksei0peaXtuWdh+acieaViO+8iVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5V2l0aEF0dGVtcHRzPFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgb3B0aW9ucz86IFJldHJ5T3B0aW9ucyxcbik6IFByb21pc2U8UmV0cnlXaXRoQXR0ZW1wdHNSZXN1bHQ8VD4+IHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4uREVGQVVMVF9SRVRSWV9PUFRJT05TLCAuLi5vcHRpb25zIH07XG4gIGxldCBsYXN0RXJyb3I6IGFueTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBvcHRzLm1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IGF0dGVtcHRzID0gYXR0ZW1wdCArIDE7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgICBpZiAoYXR0ZW1wdCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYOesrCAke2F0dGVtcHQgKyAxfSDmrKHlsJ3or5XmiJDlip9gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogcmVzdWx0LCBhdHRlbXB0cyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvci5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcik7XG5cbiAgICAgIC8qIOacgOWQjuS4gOasoeWwneivleWksei0peaIluS4jeWPr+mHjeivleeahOmUmeivryDihpIg55u05o6l5oqb5Ye6ICovXG4gICAgICBpZiAoYXR0ZW1wdCA+PSBvcHRzLm1heFJldHJpZXMgfHwgIW9wdHMuc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIGlmIChhdHRlbXB0ID49IG9wdHMubWF4UmV0cmllcyAmJiBvcHRzLm1heFJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGDph43or5UgJHtvcHRzLm1heFJldHJpZXN9IOasoeWQjuS7jeWksei0pTogJHtlcnJvck1zZ31gKTtcbiAgICAgICAgfSBlbHNlIGlmICghb3B0cy5zaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYOS4jeWPr+mHjeivleeahOmUmeivrzogJHtlcnJvck1zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yLCBhdHRlbXB0cyB9O1xuICAgICAgfVxuXG4gICAgICAvKiDmjIfmlbDpgIDpgb/nrYnlvoUgKi9cbiAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4ob3B0cy5pbml0aWFsRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSwgb3B0cy5tYXhEZWxheSk7XG4gICAgICBsb2dnZXIud2Fybihg6K+35rGC5aSx6LSlICgke2Vycm9yTXNnfSnvvIwke2RlbGF5fW1zIOWQjuesrCAke2F0dGVtcHQgKyAyfSDmrKHph43or5UuLi5gKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBsYXN0RXJyb3IsIGF0dGVtcHRzOiBvcHRzLm1heFJldHJpZXMgKyAxIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oZm46ICgpID0+IFByb21pc2U8VD4sIG9wdGlvbnM/OiBSZXRyeU9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgciA9IGF3YWl0IHdpdGhSZXRyeVdpdGhBdHRlbXB0cyhmbiwgb3B0aW9ucyk7XG4gIGlmIChyLm9rKSByZXR1cm4gci52YWx1ZTtcbiAgdGhyb3cgci5lcnJvcjtcbn1cblxuLyoqXG4gKiDluKbotoXml7bmjqfliLbnmoQgZmV0Y2gg5YyF6KOFXG4gKiDlnKjljp/nlJ8gZmV0Y2gg5Z+656GA5LiK5re75Yqg6LaF5pe25Lit5pat6IO95YqbXG4gKlxuICogQHBhcmFtIHVybCDor7fmsYIgVVJMXG4gKiBAcGFyYW0gaW5pdCBmZXRjaCDpgInpoblcbiAqIEBwYXJhbSB0aW1lb3V0TXMg6LaF5pe25pe26Ze077yI5q+r56eS77yJXG4gKi9cbi8qKlxuICog57yT5a2Y55qE5YWo5bGA6YWN572u5b+r54Wn77yM6YG/5YWN5q+P5qyh6K+35rGC6YO96K+75Y+WXG4gKiDku4XlnKggc2V0Q29uZmlnIOiiq+iwg+eUqOaXtuWkseaViO+8iOmAmui/hyBjb25maWdWZXJzaW9uIOavlOWvue+8iVxuICovXG5sZXQgX2NhY2hlZEZldGNoQ29uZmlnOiB7IGZldGNoRm46IHR5cGVvZiBmZXRjaDsgdGltZW91dDogbnVtYmVyOyB2ZXJzaW9uOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIOiOt+WPlue8k+WtmOeahCBmZXRjaCDphY3nva5cbiAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hDb25maWcoKTogeyBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7IHRpbWVvdXQ6IG51bWJlciB9IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gIC8qIOeugOWNleeahOW8leeUqOavlOWvueWNs+WPr++8jGdldENvbmZpZyDlnKjmnKrlj5jmm7Tml7bov5Tlm57lkIzkuIDlr7nosaEgKi9cbiAgaWYgKCFfY2FjaGVkRmV0Y2hDb25maWcgfHwgX2NhY2hlZEZldGNoQ29uZmlnLmZldGNoRm4gIT09IChjb25maWcuY3VzdG9tRmV0Y2ggfHwgZmV0Y2gpIHx8IF9jYWNoZWRGZXRjaENvbmZpZy50aW1lb3V0ICE9PSAoY29uZmlnLnRpbWVvdXQgPz8gREVGQVVMVF9SRVRSWV9PUFRJT05TLnRpbWVvdXQpKSB7XG4gICAgX2NhY2hlZEZldGNoQ29uZmlnID0ge1xuICAgICAgZmV0Y2hGbjogY29uZmlnLmN1c3RvbUZldGNoIHx8IGZldGNoLFxuICAgICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gREVGQVVMVF9SRVRSWV9PUFRJT05TLnRpbWVvdXQsXG4gICAgICB2ZXJzaW9uOiAwLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIF9jYWNoZWRGZXRjaENvbmZpZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQoXG4gIHVybDogc3RyaW5nLFxuICBpbml0PzogUmVxdWVzdEluaXQsXG4gIHRpbWVvdXRNcz86IG51bWJlcixcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBmZXRjaEZuLCB0aW1lb3V0OiBkZWZhdWx0VGltZW91dCB9ID0gZ2V0RmV0Y2hDb25maWcoKTtcbiAgY29uc3QgZWZmZWN0aXZlVGltZW91dCA9IHRpbWVvdXRNcyA/PyBkZWZhdWx0VGltZW91dDtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGVmZmVjdGl2ZVRpbWVvdXQpO1xuXG4gIC8qXG4gICAqIOWmguaenOiwg+eUqOaWueW3suaPkOS+myBzaWduYWzvvIzpnIDopoHlkIzml7bnm5HlkKzkuKTkuKrkv6Hlj7fvvIjosIPnlKjmlrkgKyDotoXml7bvvIlcbiAgICog5Lu75LiA6Kem5Y+R5YiZ5Lit5pat6K+35rGCXG4gICAqL1xuICBjb25zdCBleHRlcm5hbFNpZ25hbCA9IGluaXQ/LnNpZ25hbDtcbiAgaWYgKGV4dGVybmFsU2lnbmFsKSB7XG4gICAgZXh0ZXJuYWxTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZuKHVybCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtlZmZlY3RpdmVUaW1lb3V0fW1zOiAke3VybH1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export declare function reportTelemetry(operation: string, channel: string, success: boolean, attemptCount: number, channelsTried: number, error: string): void;