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.
- package/README.md +15 -3
- package/dist/config.d.ts +6 -0
- package/dist/config.js +13 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +41 -18
- package/dist/providers/tempmail-cn.d.ts +3 -0
- package/dist/providers/tempmail-cn.js +341 -0
- package/dist/retry.d.ts +13 -0
- package/dist/retry.js +14 -12
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +110 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.js +22 -0
- package/package.json +2 -2
- package/src/config.ts +15 -0
- package/src/index.ts +40 -16
- package/src/providers/tempmail-cn.ts +376 -0
- package/src/retry.ts +21 -4
- package/src/telemetry.ts +138 -0
- package/src/types.ts +2 -2
- package/src/version.ts +19 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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;
|