tempmail-sdk 1.1.3 → 1.1.4
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 +43 -38
- package/demo/poll-emails.ts +290 -28
- package/dist/config.d.ts +16 -0
- package/dist/config.js +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +30 -15
- package/dist/providers/chatgpt-org-uk.js +120 -54
- package/dist/providers/dropmail.js +134 -3
- package/dist/providers/linshi-email.d.ts +1 -1
- package/dist/providers/linshi-email.js +18 -7
- package/dist/providers/linshi-token.d.ts +25 -0
- package/dist/providers/linshi-token.js +69 -0
- package/dist/providers/mail-tm.js +39 -22
- package/dist/providers/smail-pw.d.ts +9 -0
- package/dist/providers/smail-pw.js +356 -0
- package/dist/types.d.ts +6 -1
- package/dist/types.js +1 -1
- package/package.json +1 -1
- package/src/config.ts +16 -0
- package/src/index.ts +29 -13
- package/src/providers/chatgpt-org-uk.ts +131 -53
- package/src/providers/dropmail.ts +161 -2
- package/src/providers/linshi-email.ts +23 -7
- package/src/providers/linshi-token.ts +86 -0
- package/src/providers/mail-tm.ts +39 -21
- package/src/providers/smail-pw.ts +382 -0
- package/src/types.ts +6 -1
- package/test/example.ts +174 -3
- package/dist/providers/tempmail-la.d.ts +0 -15
- package/dist/providers/tempmail-la.js +0 -90
- package/src/providers/tempmail-la.ts +0 -100
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEmail = generateEmail;
|
|
4
|
+
exports.getEmails = getEmails;
|
|
5
|
+
const normalize_1 = require("../normalize");
|
|
6
|
+
const retry_1 = require("../retry");
|
|
7
|
+
const CHANNEL = 'smail-pw';
|
|
8
|
+
const ROOT_DATA_URL = 'https://smail.pw/_root.data';
|
|
9
|
+
const DEFAULT_HEADERS = {
|
|
10
|
+
Accept: '*/*',
|
|
11
|
+
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
|
|
12
|
+
'cache-control': 'no-cache',
|
|
13
|
+
dnt: '1',
|
|
14
|
+
origin: 'https://smail.pw',
|
|
15
|
+
pragma: 'no-cache',
|
|
16
|
+
referer: 'https://smail.pw/',
|
|
17
|
+
'sec-ch-ua': '"Chromium";v="146", "Not-A.Brand";v="24", "Microsoft Edge";v="146"',
|
|
18
|
+
'sec-ch-ua-mobile': '?0',
|
|
19
|
+
'sec-ch-ua-platform': '"Windows"',
|
|
20
|
+
'sec-fetch-dest': 'empty',
|
|
21
|
+
'sec-fetch-mode': 'cors',
|
|
22
|
+
'sec-fetch-site': 'same-origin',
|
|
23
|
+
'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',
|
|
24
|
+
};
|
|
25
|
+
/** Flight/RSC 根为数组时,按出现顺序展开嵌套数组,保留标量与对象(不展开对象键),用于解析交错键值 */
|
|
26
|
+
function flightLinearLeaves(node) {
|
|
27
|
+
if (!Array.isArray(node)) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const out = [];
|
|
31
|
+
for (const el of node) {
|
|
32
|
+
if (Array.isArray(el)) {
|
|
33
|
+
out.push(...flightLinearLeaves(el));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
out.push(el);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
const MAIL_KV_KEYS = new Set(['id', 'to_address', 'from_name', 'from_address']);
|
|
42
|
+
/**
|
|
43
|
+
* 在线性序列中查找 ... "subject", <str>, "time", <num>,再向前成对读取已知字段。
|
|
44
|
+
* 比纯正则更耐受 emails 与 id 之间的 {"_23":4,...} 引用块。
|
|
45
|
+
*/
|
|
46
|
+
function parseSmailEmailsFromLinear(leaves, recipientEmail) {
|
|
47
|
+
const mails = [];
|
|
48
|
+
for (let i = 0; i + 3 < leaves.length; i++) {
|
|
49
|
+
if (leaves[i] !== 'subject') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const subj = leaves[i + 1];
|
|
53
|
+
if (typeof subj !== 'string') {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (leaves[i + 2] !== 'time') {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const timeRaw = leaves[i + 3];
|
|
60
|
+
const timeMs = typeof timeRaw === 'number'
|
|
61
|
+
? timeRaw
|
|
62
|
+
: typeof timeRaw === 'string' && /^\d+$/.test(timeRaw)
|
|
63
|
+
? parseInt(timeRaw, 10)
|
|
64
|
+
: NaN;
|
|
65
|
+
if (!Number.isFinite(timeMs)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const fields = {};
|
|
69
|
+
for (let k = i - 2; k >= 1; k -= 2) {
|
|
70
|
+
const key = leaves[k];
|
|
71
|
+
const val = leaves[k + 1];
|
|
72
|
+
if (typeof key !== 'string' || typeof val !== 'string') {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (MAIL_KV_KEYS.has(key)) {
|
|
76
|
+
fields[key] = val;
|
|
77
|
+
}
|
|
78
|
+
/* 未知键值对跳过(RSC 可能在 subject 前插入其它字符串字段) */
|
|
79
|
+
}
|
|
80
|
+
mails.push({
|
|
81
|
+
id: fields.id || '',
|
|
82
|
+
to_address: fields.to_address || recipientEmail,
|
|
83
|
+
from_name: fields.from_name || '',
|
|
84
|
+
from_address: fields.from_address || '',
|
|
85
|
+
subject: subj,
|
|
86
|
+
date: timeMs,
|
|
87
|
+
text: '',
|
|
88
|
+
html: '',
|
|
89
|
+
attachments: [],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return mails;
|
|
93
|
+
}
|
|
94
|
+
function extractSessionCookie(response) {
|
|
95
|
+
const h = response.headers;
|
|
96
|
+
if (typeof h.getSetCookie === 'function') {
|
|
97
|
+
for (const line of h.getSetCookie()) {
|
|
98
|
+
const m = line.match(/^__session=([^;]+)/);
|
|
99
|
+
if (m)
|
|
100
|
+
return `__session=${m[1]}`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const single = response.headers.get('set-cookie');
|
|
104
|
+
if (single) {
|
|
105
|
+
const m = single.match(/__session=([^;]+)/);
|
|
106
|
+
if (m)
|
|
107
|
+
return `__session=${m[1]}`;
|
|
108
|
+
}
|
|
109
|
+
return '';
|
|
110
|
+
}
|
|
111
|
+
/** RSC/Flight 风格 JSON 文本中提取 @smail.pw 收件地址 */
|
|
112
|
+
function extractInboxEmail(text) {
|
|
113
|
+
const quoted = text.match(/"([a-z0-9][a-z0-9.-]*@smail\.pw)"/i);
|
|
114
|
+
if (quoted)
|
|
115
|
+
return quoted[1];
|
|
116
|
+
const plain = text.match(/\b([a-z0-9][a-z0-9.-]*@smail\.pw)\b/i);
|
|
117
|
+
return plain ? plain[1] : null;
|
|
118
|
+
}
|
|
119
|
+
/** 从响应体解析邮件条目(正则路径,与早期 curl 样本一致) */
|
|
120
|
+
function parseSmailEmailsRegex(text, recipientEmail) {
|
|
121
|
+
const out = [];
|
|
122
|
+
const re = /"id","([^"]+)","to_address","([^"]*)","from_name","([^"]*)","from_address","([^"]*)","subject","([^"]*)","time",(\d+)/g;
|
|
123
|
+
let m;
|
|
124
|
+
while ((m = re.exec(text)) !== null) {
|
|
125
|
+
out.push({
|
|
126
|
+
id: m[1],
|
|
127
|
+
to_address: m[2] || recipientEmail,
|
|
128
|
+
from_name: m[3],
|
|
129
|
+
from_address: m[4],
|
|
130
|
+
subject: m[5],
|
|
131
|
+
date: parseInt(m[6], 10),
|
|
132
|
+
text: '',
|
|
133
|
+
html: '',
|
|
134
|
+
attachments: [],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (out.length > 0) {
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
const re2 = /"id","([^"]+)","from_name","([^"]*)","from_address","([^"]*)","subject","([^"]*)","time",(\d+)/g;
|
|
141
|
+
while ((m = re2.exec(text)) !== null) {
|
|
142
|
+
out.push({
|
|
143
|
+
id: m[1],
|
|
144
|
+
to_address: recipientEmail,
|
|
145
|
+
from_name: m[2],
|
|
146
|
+
from_address: m[3],
|
|
147
|
+
subject: m[4],
|
|
148
|
+
date: parseInt(m[5], 10),
|
|
149
|
+
text: '',
|
|
150
|
+
html: '',
|
|
151
|
+
attachments: [],
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
function mergeMailsById(lists) {
|
|
157
|
+
const map = new Map();
|
|
158
|
+
let anon = 0;
|
|
159
|
+
for (const list of lists) {
|
|
160
|
+
for (const mail of list) {
|
|
161
|
+
let id = String(mail?.id || '');
|
|
162
|
+
if (!id) {
|
|
163
|
+
id = `__smail_${anon++}_${mail?.date ?? ''}_${String(mail?.subject ?? '').slice(0, 48)}`;
|
|
164
|
+
mail.id = id;
|
|
165
|
+
}
|
|
166
|
+
if (!map.has(id)) {
|
|
167
|
+
map.set(id, mail);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return [...map.values()];
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 官方 loader 返回 D1 行:{ id, to_address, from_name, from_address, subject, time }(见 akazwz/smail app/types/email.ts)。
|
|
175
|
+
* Flight 序列化后多为普通 JSON 对象,而非 "id","…" 交错字符串元组,须在整棵树递归收集。
|
|
176
|
+
*/
|
|
177
|
+
function collectPlainRowEmails(root, recipientEmail) {
|
|
178
|
+
const mails = [];
|
|
179
|
+
const seen = new WeakSet();
|
|
180
|
+
function walk(node) {
|
|
181
|
+
if (node === null || node === undefined) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (typeof node !== 'object') {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (seen.has(node)) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
seen.add(node);
|
|
191
|
+
if (Array.isArray(node)) {
|
|
192
|
+
for (const el of node) {
|
|
193
|
+
walk(el);
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const o = node;
|
|
198
|
+
if (typeof o.subject === 'string') {
|
|
199
|
+
const tr = o.time;
|
|
200
|
+
const timeMs = typeof tr === 'number' && Number.isFinite(tr)
|
|
201
|
+
? tr
|
|
202
|
+
: typeof tr === 'string' && /^\d+$/.test(tr)
|
|
203
|
+
? parseInt(tr, 10)
|
|
204
|
+
: NaN;
|
|
205
|
+
if (Number.isFinite(timeMs)) {
|
|
206
|
+
mails.push({
|
|
207
|
+
id: String(o.id ?? ''),
|
|
208
|
+
to_address: String(o.to_address ?? recipientEmail),
|
|
209
|
+
from_name: String(o.from_name ?? ''),
|
|
210
|
+
from_address: String(o.from_address ?? ''),
|
|
211
|
+
subject: o.subject,
|
|
212
|
+
date: timeMs,
|
|
213
|
+
text: '',
|
|
214
|
+
html: '',
|
|
215
|
+
attachments: [],
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const v of Object.values(o)) {
|
|
220
|
+
if (v !== null && typeof v === 'object') {
|
|
221
|
+
walk(v);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
walk(root);
|
|
226
|
+
return mails;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Flight 风格 payload:根为数组,"addresses",[i] 表示 root[i] 为邮箱字符串;
|
|
230
|
+
* "emails",[a,b,...] 中每项为下标,指向 root[idx] 的邮件行(常为嵌套数组,内含 id/to_address/subject/time 键值序列)。
|
|
231
|
+
*/
|
|
232
|
+
function resolveFlightSlot(root, idx, visited) {
|
|
233
|
+
if (idx < 0 || idx >= root.length || visited.has(idx)) {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
visited.add(idx);
|
|
237
|
+
const val = root[idx];
|
|
238
|
+
if (typeof val === 'number' && Number.isInteger(val) && val >= 0 && val < root.length) {
|
|
239
|
+
return resolveFlightSlot(root, val, visited);
|
|
240
|
+
}
|
|
241
|
+
return val;
|
|
242
|
+
}
|
|
243
|
+
function flattenFlightIndices(refs) {
|
|
244
|
+
const out = [];
|
|
245
|
+
for (const r of refs) {
|
|
246
|
+
if (typeof r === 'number' && Number.isInteger(r)) {
|
|
247
|
+
out.push(r);
|
|
248
|
+
}
|
|
249
|
+
else if (typeof r === 'string' && /^\d+$/.test(r)) {
|
|
250
|
+
out.push(parseInt(r, 10));
|
|
251
|
+
}
|
|
252
|
+
else if (Array.isArray(r)) {
|
|
253
|
+
for (const x of r) {
|
|
254
|
+
if (typeof x === 'number' && Number.isInteger(x)) {
|
|
255
|
+
out.push(x);
|
|
256
|
+
}
|
|
257
|
+
else if (typeof x === 'string' && /^\d+$/.test(x)) {
|
|
258
|
+
out.push(parseInt(x, 10));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
}
|
|
265
|
+
function parseSmailEmailsFromFlightRoot(root, recipientEmail) {
|
|
266
|
+
const mails = [];
|
|
267
|
+
for (let i = 0; i < root.length - 1; i++) {
|
|
268
|
+
if (root[i] !== 'emails') {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const refs = root[i + 1];
|
|
272
|
+
if (!Array.isArray(refs)) {
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
for (const r of flattenFlightIndices(refs)) {
|
|
276
|
+
const node = resolveFlightSlot(root, r, new Set());
|
|
277
|
+
if (Array.isArray(node)) {
|
|
278
|
+
const leaves = flightLinearLeaves(node);
|
|
279
|
+
mails.push(...parseSmailEmailsFromLinear(leaves, recipientEmail));
|
|
280
|
+
}
|
|
281
|
+
else if (node !== null && typeof node === 'object') {
|
|
282
|
+
mails.push(...collectPlainRowEmails(node, recipientEmail));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
return mails;
|
|
288
|
+
}
|
|
289
|
+
function parseSmailEmailsFromPayload(text, recipientEmail) {
|
|
290
|
+
const regexMails = parseSmailEmailsRegex(text, recipientEmail);
|
|
291
|
+
let linearMails = [];
|
|
292
|
+
let flightMails = [];
|
|
293
|
+
let plainMails = [];
|
|
294
|
+
try {
|
|
295
|
+
const root = JSON.parse(text);
|
|
296
|
+
plainMails = collectPlainRowEmails(root, recipientEmail);
|
|
297
|
+
if (Array.isArray(root)) {
|
|
298
|
+
flightMails = parseSmailEmailsFromFlightRoot(root, recipientEmail);
|
|
299
|
+
const leaves = flightLinearLeaves(root);
|
|
300
|
+
linearMails = parseSmailEmailsFromLinear(leaves, recipientEmail);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
/* 非 JSON 或结构异常时仅用正则 */
|
|
305
|
+
}
|
|
306
|
+
return mergeMailsById([regexMails, linearMails, flightMails, plainMails]);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* POST intent=generate,保存 Set-Cookie __session,从 RSC 响应中解析邮箱
|
|
310
|
+
*/
|
|
311
|
+
async function generateEmail() {
|
|
312
|
+
const response = await (0, retry_1.fetchWithTimeout)(ROOT_DATA_URL, {
|
|
313
|
+
method: 'POST',
|
|
314
|
+
headers: {
|
|
315
|
+
...DEFAULT_HEADERS,
|
|
316
|
+
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
|
317
|
+
},
|
|
318
|
+
body: 'intent=generate',
|
|
319
|
+
});
|
|
320
|
+
if (!response.ok) {
|
|
321
|
+
throw new Error(`smail.pw generate failed: ${response.status}`);
|
|
322
|
+
}
|
|
323
|
+
const cookie = extractSessionCookie(response);
|
|
324
|
+
if (!cookie) {
|
|
325
|
+
throw new Error('Failed to extract __session cookie');
|
|
326
|
+
}
|
|
327
|
+
const text = await response.text();
|
|
328
|
+
const email = extractInboxEmail(text);
|
|
329
|
+
if (!email) {
|
|
330
|
+
throw new Error('Failed to parse inbox address from smail.pw response');
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
channel: CHANNEL,
|
|
334
|
+
email,
|
|
335
|
+
token: cookie,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* GET _root.data,携带 __session Cookie,解析邮件列表
|
|
340
|
+
*/
|
|
341
|
+
async function getEmails(token, email) {
|
|
342
|
+
const response = await (0, retry_1.fetchWithTimeout)(ROOT_DATA_URL, {
|
|
343
|
+
method: 'GET',
|
|
344
|
+
headers: {
|
|
345
|
+
...DEFAULT_HEADERS,
|
|
346
|
+
Cookie: token,
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
if (!response.ok) {
|
|
350
|
+
throw new Error(`smail.pw get emails failed: ${response.status}`);
|
|
351
|
+
}
|
|
352
|
+
const text = await response.text();
|
|
353
|
+
const rawList = parseSmailEmailsFromPayload(text, email);
|
|
354
|
+
return rawList.map((raw) => (0, normalize_1.normalizeEmail)(raw, email));
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21haWwtcHcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXJzL3NtYWlsLXB3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMFVBLHNDQThCQztBQUtELDhCQWdCQztBQTVYRCw0Q0FBOEM7QUFDOUMsb0NBQTRDO0FBRTVDLE1BQU0sT0FBTyxHQUFZLFVBQVUsQ0FBQztBQUNwQyxNQUFNLGFBQWEsR0FBRyw2QkFBNkIsQ0FBQztBQUVwRCxNQUFNLGVBQWUsR0FBMkI7SUFDOUMsTUFBTSxFQUFFLEtBQUs7SUFDYixpQkFBaUIsRUFBRSxpREFBaUQ7SUFDcEUsZUFBZSxFQUFFLFVBQVU7SUFDM0IsR0FBRyxFQUFFLEdBQUc7SUFDUixNQUFNLEVBQUUsa0JBQWtCO0lBQzFCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE9BQU8sRUFBRSxtQkFBbUI7SUFDNUIsV0FBVyxFQUNULG9FQUFvRTtJQUN0RSxrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLG9CQUFvQixFQUFFLFdBQVc7SUFDakMsZ0JBQWdCLEVBQUUsT0FBTztJQUN6QixnQkFBZ0IsRUFBRSxNQUFNO0lBQ3hCLGdCQUFnQixFQUFFLGFBQWE7SUFDL0IsWUFBWSxFQUNWLCtIQUErSDtDQUNsSSxDQUFDO0FBRUYsNERBQTREO0FBQzVELFNBQVMsa0JBQWtCLENBQUMsSUFBYTtJQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFjLEVBQUUsQ0FBQztJQUMxQixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RD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QUFDLCtCQUErQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsTUFBTSxPQUFPLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBQSwwQkFBYyxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnRlcm5hbEVtYWlsSW5mbywgRW1haWwsIENoYW5uZWwgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4uL25vcm1hbGl6ZSc7XG5pbXBvcnQgeyBmZXRjaFdpdGhUaW1lb3V0IH0gZnJvbSAnLi4vcmV0cnknO1xuXG5jb25zdCBDSEFOTkVMOiBDaGFubmVsID0gJ3NtYWlsLXB3JztcbmNvbnN0IFJPT1RfREFUQV9VUkwgPSAnaHR0cHM6Ly9zbWFpbC5wdy9fcm9vdC5kYXRhJztcblxuY29uc3QgREVGQVVMVF9IRUFERVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBBY2NlcHQ6ICcqLyonLFxuICAnYWNjZXB0LWxhbmd1YWdlJzogJ3poLUNOLHpoO3E9MC45LGVuO3E9MC44LGVuLUdCO3E9MC43LGVuLVVTO3E9MC42JyxcbiAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tY2FjaGUnLFxuICBkbnQ6ICcxJyxcbiAgb3JpZ2luOiAnaHR0cHM6Ly9zbWFpbC5wdycsXG4gIHByYWdtYTogJ25vLWNhY2hlJyxcbiAgcmVmZXJlcjogJ2h0dHBzOi8vc21haWwucHcvJyxcbiAgJ3NlYy1jaC11YSc6XG4gICAgJ1wiQ2hyb21pdW1cIjt2PVwiMTQ2XCIsIFwiTm90LUEuQnJhbmRcIjt2PVwiMjRcIiwgXCJNaWNyb3NvZnQgRWRnZVwiO3Y9XCIxNDZcIicsXG4gICdzZWMtY2gtdWEtbW9iaWxlJzogJz8wJyxcbiAgJ3NlYy1jaC11YS1wbGF0Zm9ybSc6ICdcIldpbmRvd3NcIicsXG4gICdzZWMtZmV0Y2gtZGVzdCc6ICdlbXB0eScsXG4gICdzZWMtZmV0Y2gtbW9kZSc6ICdjb3JzJyxcbiAgJ3NlYy1mZXRjaC1zaXRlJzogJ3NhbWUtb3JpZ2luJyxcbiAgJ1VzZXItQWdlbnQnOlxuICAgICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTQ2LjAuMC4wIFNhZmFyaS81MzcuMzYgRWRnLzE0Ni4wLjAuMCcsXG59O1xuXG4vKiogRmxpZ2h0L1JTQyDmoLnkuLrmlbDnu4Tml7bvvIzmjInlh7rnjrDpobrluo/lsZXlvIDltYzlpZfmlbDnu4TvvIzkv53nlZnmoIfph4/kuI7lr7nosaHvvIjkuI3lsZXlvIDlr7nosaHplK7vvInvvIznlKjkuo7op6PmnpDkuqTplJnplK7lgLwgKi9cbmZ1bmN0aW9uIGZsaWdodExpbmVhckxlYXZlcyhub2RlOiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IG91dDogdW5rbm93bltdID0gW107XG4gIGZvciAoY29uc3QgZWwgb2Ygbm9kZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsKSkge1xuICAgICAgb3V0LnB1c2goLi4uZmxpZ2h0TGluZWFyTGVhdmVzKGVsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5wdXNoKGVsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuY29uc3QgTUFJTF9LVl9LRVlTID0gbmV3IFNldChbJ2lkJywgJ3RvX2FkZHJlc3MnLCAnZnJvbV9uYW1lJywgJ2Zyb21fYWRkcmVzcyddKTtcblxuLyoqXG4gKiDlnKjnur/mgKfluo/liJfkuK3mn6Xmib4gLi4uIFwic3ViamVjdFwiLCA8c3RyPiwgXCJ0aW1lXCIsIDxudW0+77yM5YaN5ZCR5YmN5oiQ5a+56K+75Y+W5bey55+l5a2X5q6144CCXG4gKiDmr5Tnuq/mraPliJnmm7TogJDlj5cgZW1haWxzIOS4jiBpZCDkuYvpl7TnmoQge1wiXzIzXCI6NCwuLi59IOW8leeUqOWdl+OAglxuICovXG5mdW5jdGlvbiBwYXJzZVNtYWlsRW1haWxzRnJvbUxpbmVhcihcbiAgbGVhdmVzOiB1bmtub3duW10sXG4gIHJlY2lwaWVudEVtYWlsOiBzdHJpbmcsXG4pOiBhbnlbXSB7XG4gIGNvbnN0IG1haWxzOiBhbnlbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSArIDMgPCBsZWF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobGVhdmVzW2ldICE9PSAnc3ViamVjdCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJqID0gbGVhdmVzW2kgKyAxXTtcbiAgICBpZiAodHlwZW9mIHN1YmogIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxlYXZlc1tpICsgMl0gIT09ICd0aW1lJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVSYXcgPSBsZWF2ZXNbaSArIDNdO1xuICAgIGNvbnN0IHRpbWVNcyA9XG4gICAgICB0eXBlb2YgdGltZVJhdyA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aW1lUmF3XG4gICAgICAgIDogdHlwZW9mIHRpbWVSYXcgPT09ICdzdHJpbmcnICYmIC9eXFxkKyQvLnRlc3QodGltZVJhdylcbiAgICAgICAgICA/IHBhcnNlSW50KHRpbWVSYXcsIDEwKVxuICAgICAgICAgIDogTmFOO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRpbWVNcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAobGV0IGsgPSBpIC0gMjsgayA+PSAxOyBrIC09IDIpIHtcbiAgICAgIGNvbnN0IGtleSA9IGxlYXZlc1trXTtcbiAgICAgIGNvbnN0IHZhbCA9IGxlYXZlc1trICsgMV07XG4gICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoTUFJTF9LVl9LRVlTLmhhcyhrZXkpKSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gdmFsO1xuICAgICAgfVxuICAgICAgLyog5pyq55+l6ZSu5YC85a+56Lez6L+H77yIUlNDIOWPr+iDveWcqCBzdWJqZWN0IOWJjeaPkuWFpeWFtuWug+Wtl+espuS4suWtl+aute+8iSAqL1xuICAgIH1cblxuICAgIG1haWxzLnB1c2goe1xuICAgICAgaWQ6IGZpZWxkcy5pZCB8fCAnJyxcbiAgICAgIHRvX2FkZHJlc3M6IGZpZWxkcy50b19hZGRyZXNzIHx8IHJlY2lwaWVudEVtYWlsLFxuICAgICAgZnJvbV9uYW1lOiBmaWVsZHMuZnJvbV9uYW1lIHx8ICcnLFxuICAgICAgZnJvbV9hZGRyZXNzOiBmaWVsZHMuZnJvbV9hZGRyZXNzIHx8ICcnLFxuICAgICAgc3ViamVjdDogc3ViaixcbiAgICAgIGRhdGU6IHRpbWVNcyxcbiAgICAgIHRleHQ6ICcnLFxuICAgICAgaHRtbDogJycsXG4gICAgICBhdHRhY2htZW50czogW10sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG1haWxzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U2Vzc2lvbkNvb2tpZShyZXNwb25zZTogUmVzcG9uc2UpOiBzdHJpbmcge1xuICBjb25zdCBoID0gcmVzcG9uc2UuaGVhZGVycyBhcyBIZWFkZXJzICYgeyBnZXRTZXRDb29raWU/OiAoKSA9PiBzdHJpbmdbXSB9O1xuICBpZiAodHlwZW9mIGguZ2V0U2V0Q29va2llID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGguZ2V0U2V0Q29va2llKCkpIHtcbiAgICAgIGNvbnN0IG0gPSBsaW5lLm1hdGNoKC9eX19zZXNzaW9uPShbXjtdKykvKTtcbiAgICAgIGlmIChtKSByZXR1cm4gYF9fc2Vzc2lvbj0ke21bMV19YDtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2luZ2xlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3NldC1jb29raWUnKTtcbiAgaWYgKHNpbmdsZSkge1xuICAgIGNvbnN0IG0gPSBzaW5nbGUubWF0Y2goL19fc2Vzc2lvbj0oW147XSspLyk7XG4gICAgaWYgKG0pIHJldHVybiBgX19zZXNzaW9uPSR7bVsxXX1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqIFJTQy9GbGlnaHQg6aOO5qC8IEpTT04g5paH5pys5Lit5o+Q5Y+WIEBzbWFpbC5wdyDmlLbku7blnLDlnYAgKi9cbmZ1bmN0aW9uIGV4dHJhY3RJbmJveEVtYWlsKHRleHQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBxdW90ZWQgPSB0ZXh0Lm1hdGNoKC9cIihbYS16MC05XVthLXowLTkuLV0qQHNtYWlsXFwucHcpXCIvaSk7XG4gIGlmIChxdW90ZWQpIHJldHVybiBxdW90ZWRbMV07XG4gIGNvbnN0IHBsYWluID0gdGV4dC5tYXRjaCgvXFxiKFthLXowLTldW2EtejAtOS4tXSpAc21haWxcXC5wdylcXGIvaSk7XG4gIHJldHVybiBwbGFpbiA/IHBsYWluWzFdIDogbnVsbDtcbn1cblxuLyoqIOS7juWTjeW6lOS9k+ino+aekOmCruS7tuadoeebru+8iOato+WImei3r+W+hO+8jOS4juaXqeacnyBjdXJsIOagt+acrOS4gOiHtO+8iSAqL1xuZnVuY3Rpb24gcGFyc2VTbWFpbEVtYWlsc1JlZ2V4KHRleHQ6IHN0cmluZywgcmVjaXBpZW50RW1haWw6IHN0cmluZyk6IGFueVtdIHtcbiAgY29uc3Qgb3V0OiBhbnlbXSA9IFtdO1xuICBjb25zdCByZSA9XG4gICAgL1wiaWRcIixcIihbXlwiXSspXCIsXCJ0b19hZGRyZXNzXCIsXCIoW15cIl0qKVwiLFwiZnJvbV9uYW1lXCIsXCIoW15cIl0qKVwiLFwiZnJvbV9hZGRyZXNzXCIsXCIoW15cIl0qKVwiLFwic3ViamVjdFwiLFwiKFteXCJdKilcIixcInRpbWVcIiwoXFxkKykvZztcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgobSA9IHJlLmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgb3V0LnB1c2goe1xuICAgICAgaWQ6IG1bMV0sXG4gICAgICB0b19hZGRyZXNzOiBtWzJdIHx8IHJlY2lwaWVudEVtYWlsLFxuICAgICAgZnJvbV9uYW1lOiBtWzNdLFxuICAgICAgZnJvbV9hZGRyZXNzOiBtWzRdLFxuICAgICAgc3ViamVjdDogbVs1XSxcbiAgICAgIGRhdGU6IHBhcnNlSW50KG1bNl0sIDEwKSxcbiAgICAgIHRleHQ6ICcnLFxuICAgICAgaHRtbDogJycsXG4gICAgICBhdHRhY2htZW50czogW10sXG4gICAgfSk7XG4gIH1cbiAgaWYgKG91dC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGNvbnN0IHJlMiA9XG4gICAgL1wiaWRcIixcIihbXlwiXSspXCIsXCJmcm9tX25hbWVcIixcIihbXlwiXSopXCIsXCJmcm9tX2FkZHJlc3NcIixcIihbXlwiXSopXCIsXCJzdWJqZWN0XCIsXCIoW15cIl0qKVwiLFwidGltZVwiLChcXGQrKS9nO1xuICB3aGlsZSAoKG0gPSByZTIuZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBpZDogbVsxXSxcbiAgICAgIHRvX2FkZHJlc3M6IHJlY2lwaWVudEVtYWlsLFxuICAgICAgZnJvbV9uYW1lOiBtWzJdLFxuICAgICAgZnJvbV9hZGRyZXNzOiBtWzNdLFxuICAgICAgc3ViamVjdDogbVs0XSxcbiAgICAgIGRhdGU6IHBhcnNlSW50KG1bNV0sIDEwKSxcbiAgICAgIHRleHQ6ICcnLFxuICAgICAgaHRtbDogJycsXG4gICAgICBhdHRhY2htZW50czogW10sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gbWVyZ2VNYWlsc0J5SWQobGlzdHM6IGFueVtdW10pOiBhbnlbXSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIGxldCBhbm9uID0gMDtcbiAgZm9yIChjb25zdCBsaXN0IG9mIGxpc3RzKSB7XG4gICAgZm9yIChjb25zdCBtYWlsIG9mIGxpc3QpIHtcbiAgICAgIGxldCBpZCA9IFN0cmluZyhtYWlsPy5pZCB8fCAnJyk7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIGlkID0gYF9fc21haWxfJHthbm9uKyt9XyR7bWFpbD8uZGF0ZSA/PyAnJ31fJHtTdHJpbmcobWFpbD8uc3ViamVjdCA/PyAnJykuc2xpY2UoMCwgNDgpfWA7XG4gICAgICAgIG1haWwuaWQgPSBpZDtcbiAgICAgIH1cbiAgICAgIGlmICghbWFwLmhhcyhpZCkpIHtcbiAgICAgICAgbWFwLnNldChpZCwgbWFpbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubWFwLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiDlrpjmlrkgbG9hZGVyIOi/lOWbniBEMSDooYzvvJp7IGlkLCB0b19hZGRyZXNzLCBmcm9tX25hbWUsIGZyb21fYWRkcmVzcywgc3ViamVjdCwgdGltZSB977yI6KeBIGFrYXp3ei9zbWFpbCBhcHAvdHlwZXMvZW1haWwudHPvvInjgIJcbiAqIEZsaWdodCDluo/liJfljJblkI7lpJrkuLrmma7pgJogSlNPTiDlr7nosaHvvIzogIzpnZ4gXCJpZFwiLFwi4oCmXCIg5Lqk6ZSZ5a2X56ym5Liy5YWD57uE77yM6aG75Zyo5pW05qO15qCR6YCS5b2S5pS26ZuG44CCXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbGFpblJvd0VtYWlscyhyb290OiB1bmtub3duLCByZWNpcGllbnRFbWFpbDogc3RyaW5nKTogYW55W10ge1xuICBjb25zdCBtYWlsczogYW55W10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICBmdW5jdGlvbiB3YWxrKG5vZGU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXMobm9kZSBhcyBvYmplY3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4uYWRkKG5vZGUgYXMgb2JqZWN0KTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsIG9mIG5vZGUpIHtcbiAgICAgICAgd2FsayhlbCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbyA9IG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBvLnN1YmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB0ciA9IG8udGltZTtcbiAgICAgIGNvbnN0IHRpbWVNcyA9XG4gICAgICAgIHR5cGVvZiB0ciA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHRyKVxuICAgICAgICAgID8gdHJcbiAgICAgICAgICA6IHR5cGVvZiB0ciA9PT0gJ3N0cmluZycgJiYgL15cXGQrJC8udGVzdCh0cilcbiAgICAgICAgICAgID8gcGFyc2VJbnQodHIsIDEwKVxuICAgICAgICAgICAgOiBOYU47XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHRpbWVNcykpIHtcbiAgICAgICAgbWFpbHMucHVzaCh7XG4gICAgICAgICAgaWQ6IFN0cmluZyhvLmlkID8/ICcnKSxcbiAgICAgICAgICB0b19hZGRyZXNzOiBTdHJpbmcoby50b19hZGRyZXNzID8/IHJlY2lwaWVudEVtYWlsKSxcbiAgICAgICAgICBmcm9tX25hbWU6IFN0cmluZyhvLmZyb21fbmFtZSA/PyAnJyksXG4gICAgICAgICAgZnJvbV9hZGRyZXNzOiBTdHJpbmcoby5mcm9tX2FkZHJlc3MgPz8gJycpLFxuICAgICAgICAgIHN1YmplY3Q6IG8uc3ViamVjdCxcbiAgICAgICAgICBkYXRlOiB0aW1lTXMsXG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgaHRtbDogJycsXG4gICAgICAgICAgYXR0YWNobWVudHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyhvKSkge1xuICAgICAgaWYgKHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHdhbGsodik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgd2Fsayhyb290KTtcbiAgcmV0dXJuIG1haWxzO1xufVxuXG4vKipcbiAqIEZsaWdodCDpo47moLwgcGF5bG9hZO+8muagueS4uuaVsOe7hO+8jFwiYWRkcmVzc2VzXCIsW2ldIOihqOekuiByb290W2ldIOS4uumCrueuseWtl+espuS4su+8m1xuICogXCJlbWFpbHNcIixbYSxiLC4uLl0g5Lit5q+P6aG55Li65LiL5qCH77yM5oyH5ZCRIHJvb3RbaWR4XSDnmoTpgq7ku7booYzvvIjluLjkuLrltYzlpZfmlbDnu4TvvIzlhoXlkKsgaWQvdG9fYWRkcmVzcy9zdWJqZWN0L3RpbWUg6ZSu5YC85bqP5YiX77yJ44CCXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGbGlnaHRTbG90KHJvb3Q6IHVua25vd25bXSwgaWR4OiBudW1iZXIsIHZpc2l0ZWQ6IFNldDxudW1iZXI+KTogdW5rbm93biB7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSByb290Lmxlbmd0aCB8fCB2aXNpdGVkLmhhcyhpZHgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB2aXNpdGVkLmFkZChpZHgpO1xuICBjb25zdCB2YWwgPSByb290W2lkeF07XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbCkgJiYgdmFsID49IDAgJiYgdmFsIDwgcm9vdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUZsaWdodFNsb3Qocm9vdCwgdmFsLCB2aXNpdGVkKTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuRmxpZ2h0SW5kaWNlcyhyZWZzOiB1bmtub3duW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlZnMpIHtcbiAgICBpZiAodHlwZW9mIHIgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIocikpIHtcbiAgICAgIG91dC5wdXNoKHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnICYmIC9eXFxkKyQvLnRlc3QocikpIHtcbiAgICAgIG91dC5wdXNoKHBhcnNlSW50KHIsIDEwKSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHIpKSB7XG4gICAgICBmb3IgKGNvbnN0IHggb2Ygcikge1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoeCkpIHtcbiAgICAgICAgICBvdXQucHVzaCh4KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiYgL15cXGQrJC8udGVzdCh4KSkge1xuICAgICAgICAgIG91dC5wdXNoKHBhcnNlSW50KHgsIDEwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTbWFpbEVtYWlsc0Zyb21GbGlnaHRSb290KHJvb3Q6IHVua25vd25bXSwgcmVjaXBpZW50RW1haWw6IHN0cmluZyk6IGFueVtdIHtcbiAgY29uc3QgbWFpbHM6IGFueVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBpZiAocm9vdFtpXSAhPT0gJ2VtYWlscycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWZzID0gcm9vdFtpICsgMV07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnMpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIGZsYXR0ZW5GbGlnaHRJbmRpY2VzKHJlZnMpKSB7XG4gICAgICBjb25zdCBub2RlID0gcmVzb2x2ZUZsaWdodFNsb3Qocm9vdCwgciwgbmV3IFNldCgpKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGxlYXZlcyA9IGZsaWdodExpbmVhckxlYXZlcyhub2RlKTtcbiAgICAgICAgbWFpbHMucHVzaCguLi5wYXJzZVNtYWlsRW1haWxzRnJvbUxpbmVhcihsZWF2ZXMsIHJlY2lwaWVudEVtYWlsKSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1haWxzLnB1c2goLi4uY29sbGVjdFBsYWluUm93RW1haWxzKG5vZGUsIHJlY2lwaWVudEVtYWlsKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBtYWlscztcbn1cblxuZnVuY3Rpb24gcGFyc2VTbWFpbEVtYWlsc0Zyb21QYXlsb2FkKHRleHQ6IHN0cmluZywgcmVjaXBpZW50RW1haWw6IHN0cmluZyk6IGFueVtdIHtcbiAgY29uc3QgcmVnZXhNYWlscyA9IHBhcnNlU21haWxFbWFpbHNSZWdleCh0ZXh0LCByZWNpcGllbnRFbWFpbCk7XG4gIGxldCBsaW5lYXJNYWlsczogYW55W10gPSBbXTtcbiAgbGV0IGZsaWdodE1haWxzOiBhbnlbXSA9IFtdO1xuICBsZXQgcGxhaW5NYWlsczogYW55W10gPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByb290ID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyB1bmtub3duO1xuICAgIHBsYWluTWFpbHMgPSBjb2xsZWN0UGxhaW5Sb3dFbWFpbHMocm9vdCwgcmVjaXBpZW50RW1haWwpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJvb3QpKSB7XG4gICAgICBmbGlnaHRNYWlscyA9IHBhcnNlU21haWxFbWFpbHNGcm9tRmxpZ2h0Um9vdChyb290LCByZWNpcGllbnRFbWFpbCk7XG4gICAgICBjb25zdCBsZWF2ZXMgPSBmbGlnaHRMaW5lYXJMZWF2ZXMocm9vdCk7XG4gICAgICBsaW5lYXJNYWlscyA9IHBhcnNlU21haWxFbWFpbHNGcm9tTGluZWFyKGxlYXZlcywgcmVjaXBpZW50RW1haWwpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLyog6Z2eIEpTT04g5oiW57uT5p6E5byC5bi45pe25LuF55So5q2j5YiZICovXG4gIH1cbiAgcmV0dXJuIG1lcmdlTWFpbHNCeUlkKFtyZWdleE1haWxzLCBsaW5lYXJNYWlscywgZmxpZ2h0TWFpbHMsIHBsYWluTWFpbHNdKTtcbn1cblxuLyoqXG4gKiBQT1NUIGludGVudD1nZW5lcmF0Ze+8jOS/neWtmCBTZXQtQ29va2llIF9fc2Vzc2lvbu+8jOS7jiBSU0Mg5ZON5bqU5Lit6Kej5p6Q6YKu566xXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKCk6IFByb21pc2U8SW50ZXJuYWxFbWFpbEluZm8+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KFJPT1RfREFUQV9VUkwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi5ERUZBVUxUX0hFQURFUlMsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JyxcbiAgICB9LFxuICAgIGJvZHk6ICdpbnRlbnQ9Z2VuZXJhdGUnLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzbWFpbC5wdyBnZW5lcmF0ZSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG5cbiAgY29uc3QgY29va2llID0gZXh0cmFjdFNlc3Npb25Db29raWUocmVzcG9uc2UpO1xuICBpZiAoIWNvb2tpZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGV4dHJhY3QgX19zZXNzaW9uIGNvb2tpZScpO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgY29uc3QgZW1haWwgPSBleHRyYWN0SW5ib3hFbWFpbCh0ZXh0KTtcbiAgaWYgKCFlbWFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIGluYm94IGFkZHJlc3MgZnJvbSBzbWFpbC5wdyByZXNwb25zZScpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsOiBDSEFOTkVMLFxuICAgIGVtYWlsLFxuICAgIHRva2VuOiBjb29raWUsXG4gIH07XG59XG5cbi8qKlxuICogR0VUIF9yb290LmRhdGHvvIzmkLrluKYgX19zZXNzaW9uIENvb2tpZe+8jOino+aekOmCruS7tuWIl+ihqFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKHRva2VuOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KFJPT1RfREFUQV9VUkwsIHtcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLkRFRkFVTFRfSEVBREVSUyxcbiAgICAgIENvb2tpZTogdG9rZW4sXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgc21haWwucHcgZ2V0IGVtYWlscyBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgY29uc3QgcmF3TGlzdCA9IHBhcnNlU21haWxFbWFpbHNGcm9tUGF5bG9hZCh0ZXh0LCBlbWFpbCk7XG4gIHJldHVybiByYXdMaXN0Lm1hcCgocmF3KSA9PiBub3JtYWxpemVFbWFpbChyYXcsIGVtYWlsKSk7XG59XG4iXX0=
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 支持的临时邮箱渠道标识
|
|
3
3
|
* 每个渠道对应一个第三方临时邮箱服务商
|
|
4
4
|
*/
|
|
5
|
-
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | '
|
|
5
|
+
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail' | 'guerrillamail' | 'maildrop' | 'smail-pw';
|
|
6
6
|
/**
|
|
7
7
|
* 创建临时邮箱后返回的邮箱信息
|
|
8
8
|
* Token 等认证信息由 SDK 内部维护,不对外暴露
|
|
@@ -116,6 +116,11 @@ export interface RetryConfig {
|
|
|
116
116
|
export interface GenerateEmailOptions {
|
|
117
117
|
/** 指定渠道,不传则随机选择 */
|
|
118
118
|
channel?: Channel;
|
|
119
|
+
/**
|
|
120
|
+
* 为 false 时仅尝试 `channel` 指定的渠道,失败即返回 null,不 Fallback 到其他渠道。
|
|
121
|
+
* 用于按渠道探测可用性。默认 true(保持原有「优先指定渠道、失败后试其他」行为)。
|
|
122
|
+
*/
|
|
123
|
+
channelFallback?: boolean;
|
|
119
124
|
/** 邮箱有效时长 */
|
|
120
125
|
duration?: number;
|
|
121
126
|
/** 指定邮箱域名 */
|
package/dist/types.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5pSv5oyB55qE5Li05pe26YKu566x5rig6YGT5qCH6K+GXG4gKiDmr4/
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5pSv5oyB55qE5Li05pe26YKu566x5rig6YGT5qCH6K+GXG4gKiDmr4/kuKrmuKDpgZPlr7nlupTkuIDkuKrnrKzkuInmlrnkuLTml7bpgq7nrrHmnI3liqHllYZcbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbm5lbCA9ICd0ZW1wbWFpbCcgfCAnbGluc2hpLWVtYWlsJyB8ICd0ZW1wbWFpbC1sb2wnIHwgJ2NoYXRncHQtb3JnLXVrJyB8ICd0ZW1wLW1haWwtaW8nIHwgJ2F3YW1haWwnIHwgJ21haWwtdG0nIHwgJ2Ryb3BtYWlsJyB8ICdndWVycmlsbGFtYWlsJyB8ICdtYWlsZHJvcCcgfCAnc21haWwtcHcnO1xuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueuseWQjui/lOWbnueahOmCrueuseS/oeaBr1xuICogVG9rZW4g562J6K6k6K+B5L+h5oGv55SxIFNESyDlhoXpg6jnu7TmiqTvvIzkuI3lr7nlpJbmmrTpnLJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbEluZm8ge1xuICAvKiog5Yib5bu66K+l6YKu566x5omA5L2/55So55qE5rig6YGTICovXG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIC8qKiDkuLTml7bpgq7nrrHlnLDlnYAgKi9cbiAgZW1haWw6IHN0cmluZztcbiAgLyoqIOmCrueusei/h+acn+aXtumXtO+8iElTTyA4NjAxIOWtl+espuS4suaIliBVbml4IOaXtumXtOaIs++8iSAqL1xuICBleHBpcmVzQXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIC8qKiDpgq7nrrHliJvlu7rml7bpl7TvvIhJU08gODYwMSDlrZfnrKbkuLLvvIkgKi9cbiAgY3JlYXRlZEF0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKjnmoTpgq7nrrHkv6Hmga/vvIzljIXlkKsgdG9rZW4g562J6K6k6K+B5pWw5o2uXG4gKiDkuI3lr7nlpJblr7zlh7rvvIznlKjmiLfml6Dms5Xorr/pl65cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsRW1haWxJbmZvIGV4dGVuZHMgRW1haWxJbmZvIHtcbiAgLyoqIOiupOivgeS7pOeJjO+8jOeUsSBTREsg5YaF6YOo57u05oqkICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIOagh+WHhuWMlumCruS7tumZhOS7tlxuICog5LiN5ZCM5rig6YGT55qE6ZmE5Lu25a2X5q615ZCN5LiN5ZCM77yMU0RLIOe7n+S4gOW9kuS4gOWMluS4uuatpOe7k+aehFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQXR0YWNobWVudCB7XG4gIC8qKiDpmYTku7bmlofku7blkI0gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgLyoqIOmZhOS7tuWkp+Wwj++8iOWtl+iKgu+8iSAqL1xuICBzaXplPzogbnVtYmVyO1xuICAvKiogTUlNRSDnsbvlnovvvIzlpoIgYXBwbGljYXRpb24vcGRmICovXG4gIGNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAvKiog6ZmE5Lu25LiL6L295Zyw5Z2AICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiDmoIflh4bljJbpgq7ku7bmoLzlvI8gLSDmiYDmnInmj5DkvpvllYbov5Tlm57nu5/kuIDnu5PmnoRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbCB7XG4gIC8qKiDpgq7ku7bllK/kuIDmoIfor4YgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIOWPkeS7tuS6uumCrueuseWcsOWdgCAqL1xuICBmcm9tOiBzdHJpbmc7XG4gIC8qKiDmlLbku7bkurrpgq7nrrHlnLDlnYAgKi9cbiAgdG86IHN0cmluZztcbiAgLyoqIOmCruS7tuS4u+mimCAqL1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIC8qKiDnuq/mlofmnKzlhoXlrrkgKi9cbiAgdGV4dDogc3RyaW5nO1xuICAvKiogSFRNTCDlhoXlrrkgKi9cbiAgaHRtbDogc3RyaW5nO1xuICAvKiogSVNPIDg2MDEg5qC85byP55qE5pel5pyf5a2X56ym5LiyICovXG4gIGRhdGU6IHN0cmluZztcbiAgLyoqIOaYr+WQpuW3suivuyAqL1xuICBpc1JlYWQ6IGJvb2xlYW47XG4gIC8qKiDpmYTku7bliJfooaggKi9cbiAgYXR0YWNobWVudHM6IEVtYWlsQXR0YWNobWVudFtdO1xufVxuXG4vKipcbiAqIOiOt+WPlumCruS7tuWIl+ihqOeahOi/lOWbnue7k+aenFxuICogc3VjY2VzcyDkuLogZmFsc2Ug5pe26KGo56S66K+35rGC5aSx6LSl77yI6YeN6K+V6ICX5bC977yJ77yMZW1haWxzIOS4uuepuuaVsOe7hFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEVtYWlsc1Jlc3VsdCB7XG4gIC8qKiDmiYDkvb/nlKjnmoTmuKDpgZMgKi9cbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgLyoqIOafpeivoueahOmCrueuseWcsOWdgCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiog6YKu5Lu25YiX6KGo77yM5aSx6LSl5pe25Li656m65pWw57uEICovXG4gIGVtYWlsczogRW1haWxbXTtcbiAgLyoqIOivt+axguaYr+WQpuaIkOWKn++8jGZhbHNlIOihqOekuumHjeivleiAl+WwveWQjuS7jeWksei0pSAqL1xuICBzdWNjZXNzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIOmHjeivlemFjee9rlxuICogU0RLIOWGhemDqOWvuee9kee7nOmUmeivr+OAgei2heaXtuOAgTV4eCDmnI3liqHnq6/plJnor6/oh6rliqjph43or5VcbiAqIDR4eCDlrqLmiLfnq6/plJnor6/vvIjlpoLlj4LmlbDplJnor6/vvInkuI3kvJrph43or5VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIOiHquWumuS5iemHjeivleetlueVpe+8muacgOWkmumHjeivlSAzIOasoe+8jOmmluasoeW7tui/nyAyIOenklxuICogY29uc3QgZW1haWwgPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKHtcbiAqICAgY2hhbm5lbDogJ21haWwtdG0nLFxuICogICByZXRyeTogeyBtYXhSZXRyaWVzOiAzLCBpbml0aWFsRGVsYXk6IDIwMDAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlDb25maWcge1xuICAvKiog5pyA5aSn6YeN6K+V5qyh5pWw77yI5LiN5ZCr6aaW5qyh6K+35rGC77yJ77yM6buY6K6kIDIgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIOWIneWni+mHjeivleW7tui/n++8iOavq+enku+8ie+8jOmHh+eUqOaMh+aVsOmAgOmBv+etlueVpe+8jOm7mOiupCAxMDAwICovXG4gIGluaXRpYWxEZWxheT86IG51bWJlcjtcbiAgLyoqIOacgOWkp+mHjeivleW7tui/n+S4iumZkO+8iOavq+enku+8ie+8jOm7mOiupCA1MDAwICovXG4gIG1heERlbGF5PzogbnVtYmVyO1xuICAvKiog5Y2V5qyh6K+35rGC6LaF5pe25pe26Ze077yI5q+r56eS77yJ77yM6buY6K6kIDE1MDAwICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICog5Yib5bu65Li05pe26YKu566x55qE6YCJ6aG5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyDkvb/nlKjmjIflrprmuKDpgZPliJvlu7rpgq7nrrFcbiAqIGNvbnN0IGVtYWlsID0gYXdhaXQgZ2VuZXJhdGVFbWFpbCh7IGNoYW5uZWw6ICdtYWlsLXRtJyB9KTtcbiAqXG4gKiAvLyDpmo/mnLrpgInmi6nmuKDpgZNcbiAqIGNvbnN0IGVtYWlsID0gYXdhaXQgZ2VuZXJhdGVFbWFpbCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVFbWFpbE9wdGlvbnMge1xuICAvKiog5oyH5a6a5rig6YGT77yM5LiN5Lyg5YiZ6ZqP5py66YCJ5oupICovXG4gIGNoYW5uZWw/OiBDaGFubmVsO1xuICAvKipcbiAgICog5Li6IGZhbHNlIOaXtuS7heWwneivlSBgY2hhbm5lbGAg5oyH5a6a55qE5rig6YGT77yM5aSx6LSl5Y2z6L+U5ZueIG51bGzvvIzkuI0gRmFsbGJhY2sg5Yiw5YW25LuW5rig6YGT44CCXG4gICAqIOeUqOS6juaMiea4oOmBk+aOoua1i+WPr+eUqOaAp+OAgum7mOiupCB0cnVl77yI5L+d5oyB5Y6f5pyJ44CM5LyY5YWI5oyH5a6a5rig6YGT44CB5aSx6LSl5ZCO6K+V5YW25LuW44CN6KGM5Li677yJ44CCXG4gICAqL1xuICBjaGFubmVsRmFsbGJhY2s/OiBib29sZWFuO1xuICAvKiog6YKu566x5pyJ5pWI5pe26ZW/ICovXG4gIGR1cmF0aW9uPzogbnVtYmVyO1xuICAvKiog5oyH5a6a6YKu566x5Z+f5ZCNICovXG4gIGRvbWFpbj86IHN0cmluZyB8IG51bGw7XG4gIC8qKiDph43or5XphY3nva7vvIzkuI3kvKDliJnkvb/nlKjpu5jorqTlgLzvvIjmnIDlpJrph43or5UgMiDmrKHvvIkgKi9cbiAgcmV0cnk/OiBSZXRyeUNvbmZpZztcbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooajnmoTpgInpoblcbiAqIENoYW5uZWwvRW1haWwvVG9rZW4g562J55SxIFNESyDku44gRW1haWxJbmZvIOS4reiHquWKqOiOt+WPlu+8jOeUqOaIt+aXoOmcgOaJi+WKqOS8oOmAklxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgaW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRFbWFpbHMoaW5mbyk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlscyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRFbWFpbHNPcHRpb25zIHtcbiAgLyoqIOmHjeivlemFjee9ru+8jOS4jeS8oOWImeS9v+eUqOm7mOiupOWAvO+8iOacgOWkmumHjeivlSAyIOasoe+8iSAqL1xuICByZXRyeT86IFJldHJ5Q29uZmlnO1xufVxuIl19
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* TEMPMAIL_PROXY - 代理 URL
|
|
7
7
|
* TEMPMAIL_TIMEOUT - 超时毫秒数
|
|
8
8
|
* TEMPMAIL_INSECURE - 设为 "1" 或 "true" 跳过 SSL 验证
|
|
9
|
+
* DROPMAIL_AUTH_TOKEN / DROPMAIL_API_TOKEN - DropMail GraphQL 的 af_ 令牌(可选;未设置时 SDK 会 /api/token/generate 获取并在将过期时用 /api/token/renew 续期)
|
|
10
|
+
* DROPMAIL_NO_AUTO_TOKEN - 设为 "1" 或 "true" 则禁止自动拉取/续期令牌
|
|
11
|
+
* DROPMAIL_RENEW_LIFETIME - 自动续期请求的 lifetime,默认 1d(与官网 renew 接口一致)
|
|
9
12
|
*
|
|
10
13
|
* Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
|
|
11
14
|
*/
|
|
@@ -20,6 +23,19 @@ export interface SDKConfig {
|
|
|
20
23
|
timeout?: number;
|
|
21
24
|
/** 跳过 SSL 证书验证(调试用) */
|
|
22
25
|
insecure?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* DropMail 渠道专用:GraphQL 端点 `https://dropmail.me/api/graphql/${token}` 中的 token(须为官网生成的 `af_` 前缀令牌)。
|
|
28
|
+
* 也可通过环境变量 DROPMAIL_AUTH_TOKEN 或 DROPMAIL_API_TOKEN 提供。
|
|
29
|
+
* 未配置且未设置 DROPMAIL_NO_AUTO_TOKEN 时,会向 https://dropmail.me/api/token/generate 申请 1h 令牌并内存缓存。
|
|
30
|
+
*/
|
|
31
|
+
dropmailAuthToken?: string;
|
|
32
|
+
/** 为 true 时不自动请求 token(须配置 dropmailAuthToken 或环境变量) */
|
|
33
|
+
dropmailDisableAutoToken?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* 自动管理令牌即将过期时,调用 /api/token/renew 使用的 lifetime(如 1h、1d)。
|
|
36
|
+
* 也可通过环境变量 DROPMAIL_RENEW_LIFETIME 设置。
|
|
37
|
+
*/
|
|
38
|
+
dropmailRenewLifetime?: string;
|
|
23
39
|
/**
|
|
24
40
|
* 自定义 fetch 函数,用于完全控制 HTTP 请求行为
|
|
25
41
|
* 当设置了 proxy 但环境不支持 undici 时,可通过此选项传入支持代理的 fetch 实现
|
package/src/index.ts
CHANGED
|
@@ -2,13 +2,13 @@ import * as tempmail from './providers/tempmail';
|
|
|
2
2
|
import * as linshiEmail from './providers/linshi-email';
|
|
3
3
|
import * as tempmailLol from './providers/tempmail-lol';
|
|
4
4
|
import * as chatgptOrgUk from './providers/chatgpt-org-uk';
|
|
5
|
-
import * as tempmailLa from './providers/tempmail-la';
|
|
6
5
|
import * as tempMailIO from './providers/temp-mail-io';
|
|
7
6
|
import * as awamail from './providers/awamail';
|
|
8
7
|
import * as mailTm from './providers/mail-tm';
|
|
9
8
|
import * as dropmail from './providers/dropmail';
|
|
10
9
|
import * as guerrillamail from './providers/guerrillamail';
|
|
11
10
|
import * as maildropProvider from './providers/maildrop';
|
|
11
|
+
import * as smailPw from './providers/smail-pw';
|
|
12
12
|
import { Channel, EmailInfo, InternalEmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
|
|
13
13
|
import { withRetry, RetryOptions } from './retry';
|
|
14
14
|
import { logger } from './logger';
|
|
@@ -27,6 +27,13 @@ export { normalizeEmail } from './normalize';
|
|
|
27
27
|
export { withRetry, fetchWithTimeout, RetryOptions } from './retry';
|
|
28
28
|
export { LogLevel, LogHandler, setLogLevel, getLogLevel, setLogger, logger } from './logger';
|
|
29
29
|
export { SDKConfig, setConfig, getConfig } from './config';
|
|
30
|
+
export type { SyntheticBrowserProfile } from './providers/linshi-token';
|
|
31
|
+
export {
|
|
32
|
+
deriveLinshiApiPathKey,
|
|
33
|
+
randomSyntheticLinshiKey,
|
|
34
|
+
randomBrowserLikeProfile,
|
|
35
|
+
syntheticVisitorIdFromProfile,
|
|
36
|
+
} from './providers/linshi-token';
|
|
30
37
|
|
|
31
38
|
/** 渠道名称到 provider 实现的映射表 */
|
|
32
39
|
const providers = {
|
|
@@ -34,17 +41,17 @@ const providers = {
|
|
|
34
41
|
'linshi-email': linshiEmail,
|
|
35
42
|
'tempmail-lol': tempmailLol,
|
|
36
43
|
'chatgpt-org-uk': chatgptOrgUk,
|
|
37
|
-
'tempmail-la': tempmailLa,
|
|
38
44
|
'temp-mail-io': tempMailIO,
|
|
39
45
|
'awamail': awamail,
|
|
40
46
|
'mail-tm': mailTm,
|
|
41
47
|
'dropmail': dropmail,
|
|
42
48
|
'guerrillamail': guerrillamail,
|
|
43
49
|
'maildrop': maildropProvider,
|
|
50
|
+
'smail-pw': smailPw,
|
|
44
51
|
};
|
|
45
52
|
|
|
46
53
|
/** 所有支持的渠道列表,用于随机选择和遍历 */
|
|
47
|
-
const allChannels: Channel[] = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', '
|
|
54
|
+
const allChannels: Channel[] = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail', 'guerrillamail', 'maildrop', 'smail-pw'];
|
|
48
55
|
|
|
49
56
|
/**
|
|
50
57
|
* 渠道信息,包含渠道标识、显示名称和对应网站
|
|
@@ -64,13 +71,13 @@ const channelInfoMap: Record<Channel, ChannelInfo> = {
|
|
|
64
71
|
'linshi-email': { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
|
|
65
72
|
'tempmail-lol': { channel: 'tempmail-lol', name: 'TempMail LOL', website: 'tempmail.lol' },
|
|
66
73
|
'chatgpt-org-uk': { channel: 'chatgpt-org-uk', name: 'ChatGPT Mail', website: 'mail.chatgpt.org.uk' },
|
|
67
|
-
'tempmail-la': { channel: 'tempmail-la', name: 'TempMail LA', website: 'tempmail.la' },
|
|
68
74
|
'temp-mail-io': { channel: 'temp-mail-io', name: 'Temp Mail IO', website: 'temp-mail.io' },
|
|
69
75
|
'awamail': { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
|
|
70
76
|
'mail-tm': { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
|
|
71
77
|
'dropmail': { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
|
|
72
78
|
'guerrillamail': { channel: 'guerrillamail', name: 'Guerrilla Mail', website: 'guerrillamail.com' },
|
|
73
79
|
'maildrop': { channel: 'maildrop', name: 'Maildrop', website: 'maildrop.cc' },
|
|
80
|
+
'smail-pw': { channel: 'smail-pw', name: 'Smail.pw', website: 'smail.pw' },
|
|
74
81
|
};
|
|
75
82
|
|
|
76
83
|
/**
|
|
@@ -102,7 +109,8 @@ export function getChannelInfo(channel: Channel): ChannelInfo | undefined {
|
|
|
102
109
|
* 创建临时邮箱
|
|
103
110
|
*
|
|
104
111
|
* 错误处理策略:
|
|
105
|
-
* -
|
|
112
|
+
* - 指定渠道失败时,默认自动尝试其他可用渠道(打乱顺序逐个尝试)
|
|
113
|
+
* - `channelFallback: false` 且指定了 `channel` 时,仅尝试该渠道,失败即返回 null
|
|
106
114
|
* - 未指定渠道时,打乱全部渠道逐个尝试,直到成功
|
|
107
115
|
* - 所有渠道均不可用时返回 null(不抛出异常)
|
|
108
116
|
*
|
|
@@ -121,7 +129,8 @@ export async function generateEmail(options: GenerateEmailOptions = {}): Promise
|
|
|
121
129
|
* - 指定渠道 → 优先尝试该渠道,失败后随机尝试其他渠道
|
|
122
130
|
* - 未指定 → 打乱全部渠道逐个尝试
|
|
123
131
|
*/
|
|
124
|
-
const
|
|
132
|
+
const allowFallback = options.channelFallback !== false;
|
|
133
|
+
const tryOrder = buildChannelOrder(options.channel, allowFallback);
|
|
125
134
|
|
|
126
135
|
for (const ch of tryOrder) {
|
|
127
136
|
logger.info(`创建临时邮箱, 渠道: ${ch}`);
|
|
@@ -154,9 +163,14 @@ export async function generateEmail(options: GenerateEmailOptions = {}): Promise
|
|
|
154
163
|
* 指定渠道时优先尝试该渠道,其余渠道打乱追加
|
|
155
164
|
* 未指定时打乱全部渠道
|
|
156
165
|
*/
|
|
157
|
-
function buildChannelOrder(preferred?: Channel): Channel[] {
|
|
166
|
+
function buildChannelOrder(preferred?: Channel, allowFallback = true): Channel[] {
|
|
158
167
|
const shuffled = [...allChannels].sort(() => Math.random() - 0.5);
|
|
159
|
-
if (!preferred)
|
|
168
|
+
if (!preferred) {
|
|
169
|
+
return shuffled;
|
|
170
|
+
}
|
|
171
|
+
if (!allowFallback) {
|
|
172
|
+
return [preferred];
|
|
173
|
+
}
|
|
160
174
|
const rest = shuffled.filter(ch => ch !== preferred);
|
|
161
175
|
return [preferred, ...rest];
|
|
162
176
|
}
|
|
@@ -175,8 +189,6 @@ async function generateEmailOnce(channel: Channel, options: GenerateEmailOptions
|
|
|
175
189
|
return tempmailLol.generateEmail(options.domain || null);
|
|
176
190
|
case 'chatgpt-org-uk':
|
|
177
191
|
return chatgptOrgUk.generateEmail();
|
|
178
|
-
case 'tempmail-la':
|
|
179
|
-
return tempmailLa.generateEmail();
|
|
180
192
|
case 'temp-mail-io':
|
|
181
193
|
return tempMailIO.generateEmail();
|
|
182
194
|
case 'awamail':
|
|
@@ -189,6 +201,8 @@ async function generateEmailOnce(channel: Channel, options: GenerateEmailOptions
|
|
|
189
201
|
return guerrillamail.generateEmail();
|
|
190
202
|
case 'maildrop':
|
|
191
203
|
return maildropProvider.generateEmail();
|
|
204
|
+
case 'smail-pw':
|
|
205
|
+
return smailPw.generateEmail();
|
|
192
206
|
default:
|
|
193
207
|
throw new Error(`Unknown channel: ${channel}`);
|
|
194
208
|
}
|
|
@@ -259,15 +273,14 @@ async function getEmailsOnce(channel: Channel, email: string, token?: string): P
|
|
|
259
273
|
case 'tempmail':
|
|
260
274
|
return tempmail.getEmails(email);
|
|
261
275
|
case 'linshi-email':
|
|
262
|
-
|
|
276
|
+
if (!token) throw new Error('internal error: token missing for linshi-email');
|
|
277
|
+
return linshiEmail.getEmails(email, token);
|
|
263
278
|
case 'tempmail-lol':
|
|
264
279
|
if (!token) throw new Error('internal error: token missing for tempmail-lol');
|
|
265
280
|
return tempmailLol.getEmails(token, email);
|
|
266
281
|
case 'chatgpt-org-uk':
|
|
267
282
|
if (!token) throw new Error('internal error: token missing for chatgpt-org-uk');
|
|
268
283
|
return chatgptOrgUk.getEmails(token, email);
|
|
269
|
-
case 'tempmail-la':
|
|
270
|
-
return tempmailLa.getEmails(email);
|
|
271
284
|
case 'temp-mail-io':
|
|
272
285
|
return tempMailIO.getEmails(email);
|
|
273
286
|
case 'awamail':
|
|
@@ -285,6 +298,9 @@ async function getEmailsOnce(channel: Channel, email: string, token?: string): P
|
|
|
285
298
|
case 'maildrop':
|
|
286
299
|
if (!token) throw new Error('internal error: token missing for maildrop');
|
|
287
300
|
return maildropProvider.getEmails(token, email);
|
|
301
|
+
case 'smail-pw':
|
|
302
|
+
if (!token) throw new Error('internal error: token missing for smail-pw');
|
|
303
|
+
return smailPw.getEmails(token, email);
|
|
288
304
|
default:
|
|
289
305
|
throw new Error(`Unknown channel: ${channel}`);
|
|
290
306
|
}
|