tempmail-sdk 1.0.2 → 1.1.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 +7 -3
- package/dist/index.d.ts +94 -1
- package/dist/index.js +169 -37
- package/dist/logger.d.ts +73 -0
- package/dist/logger.js +100 -0
- package/dist/normalize.d.ts +7 -0
- package/dist/normalize.js +47 -2
- package/dist/providers/guerrillamail.d.ts +22 -0
- package/dist/providers/guerrillamail.js +71 -0
- package/dist/providers/mail-tm.js +8 -3
- package/dist/providers/maildrop.d.ts +21 -0
- package/dist/providers/maildrop.js +180 -0
- package/dist/providers/temp-mail-io.js +54 -24
- package/dist/retry.d.ts +38 -0
- package/dist/retry.js +121 -0
- package/dist/types.d.ts +88 -1
- package/dist/types.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +165 -42
- package/src/logger.ts +106 -0
- package/src/normalize.ts +46 -1
- package/src/providers/guerrillamail.ts +78 -0
- package/src/providers/mail-tm.ts +7 -2
- package/src/providers/maildrop.ts +210 -0
- package/src/providers/temp-mail-io.ts +55 -23
- package/src/retry.ts +146 -0
- package/src/types.ts +89 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Maildrop 渠道实现
|
|
4
|
+
* API: GraphQL endpoint https://api.maildrop.cc/graphql
|
|
5
|
+
*
|
|
6
|
+
* 特点:
|
|
7
|
+
* - 无需认证,公开 GraphQL API
|
|
8
|
+
* - 自带反垃圾过滤
|
|
9
|
+
* - 邮箱名即用户名(任意字符串@maildrop.cc)
|
|
10
|
+
* - 无过期时间限制
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.generateEmail = generateEmail;
|
|
14
|
+
exports.getEmails = getEmails;
|
|
15
|
+
const CHANNEL = 'maildrop';
|
|
16
|
+
const GRAPHQL_URL = 'https://api.maildrop.cc/graphql';
|
|
17
|
+
const DOMAIN = 'maildrop.cc';
|
|
18
|
+
/**
|
|
19
|
+
* 解码 RFC 2047 编码的邮件头(如发件人、主题)
|
|
20
|
+
* 支持 Base64 (B) 和 Quoted-Printable (Q) 编码
|
|
21
|
+
*/
|
|
22
|
+
function decodeRfc2047(str) {
|
|
23
|
+
if (!str)
|
|
24
|
+
return '';
|
|
25
|
+
return str.replace(/=\?([^?]+)\?(B|Q)\?([^?]*)\?=/gi, (_, charset, encoding, encoded) => {
|
|
26
|
+
try {
|
|
27
|
+
if (encoding.toUpperCase() === 'B') {
|
|
28
|
+
return Buffer.from(encoded, 'base64').toString('utf-8');
|
|
29
|
+
}
|
|
30
|
+
/* Quoted-Printable: _=空格,=XX=十六进制字节 */
|
|
31
|
+
const decoded = encoded
|
|
32
|
+
.replace(/_/g, ' ')
|
|
33
|
+
.replace(/=([0-9A-Fa-f]{2})/g, (_m, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
34
|
+
return decoded;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return encoded;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 从原始 MIME 邮件源码中提取纯文本正文
|
|
43
|
+
* maildrop 的 data 字段返回完整 MIME 源码,需要解析出 text/plain 部分
|
|
44
|
+
*/
|
|
45
|
+
function extractTextFromMime(raw) {
|
|
46
|
+
if (!raw)
|
|
47
|
+
return '';
|
|
48
|
+
/* 分离邮件头和正文(双换行分隔) */
|
|
49
|
+
const headerBodySplit = raw.indexOf('\r\n\r\n');
|
|
50
|
+
if (headerBodySplit === -1)
|
|
51
|
+
return raw;
|
|
52
|
+
const headers = raw.substring(0, headerBodySplit);
|
|
53
|
+
const body = raw.substring(headerBodySplit + 4);
|
|
54
|
+
/* 检查是否为 multipart 邮件 */
|
|
55
|
+
const boundaryMatch = headers.match(/boundary="?([^";\r\n]+)"?/i);
|
|
56
|
+
if (boundaryMatch) {
|
|
57
|
+
const boundary = boundaryMatch[1];
|
|
58
|
+
const parts = body.split('--' + boundary);
|
|
59
|
+
for (const part of parts) {
|
|
60
|
+
/* 查找 text/plain 部分 */
|
|
61
|
+
if (part.match(/Content-Type:\s*text\/plain/i)) {
|
|
62
|
+
const partHeaderEnd = part.indexOf('\r\n\r\n');
|
|
63
|
+
if (partHeaderEnd === -1)
|
|
64
|
+
continue;
|
|
65
|
+
const partHeaders = part.substring(0, partHeaderEnd);
|
|
66
|
+
let content = part.substring(partHeaderEnd + 4).replace(/\r\n$/, '').replace(/--$/, '').trim();
|
|
67
|
+
/* 处理 Content-Transfer-Encoding */
|
|
68
|
+
if (partHeaders.match(/Content-Transfer-Encoding:\s*base64/i)) {
|
|
69
|
+
try {
|
|
70
|
+
content = Buffer.from(content.replace(/\s/g, ''), 'base64').toString('utf-8');
|
|
71
|
+
}
|
|
72
|
+
catch { /* 解码失败则保留原文 */ }
|
|
73
|
+
}
|
|
74
|
+
else if (partHeaders.match(/Content-Transfer-Encoding:\s*quoted-printable/i)) {
|
|
75
|
+
content = content
|
|
76
|
+
.replace(/=\r?\n/g, '')
|
|
77
|
+
.replace(/=([0-9A-Fa-f]{2})/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
78
|
+
}
|
|
79
|
+
return content.trim();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/* 非 multipart:检查整体编码 */
|
|
84
|
+
if (headers.match(/Content-Transfer-Encoding:\s*base64/i)) {
|
|
85
|
+
try {
|
|
86
|
+
return Buffer.from(body.replace(/\s/g, ''), 'base64').toString('utf-8').trim();
|
|
87
|
+
}
|
|
88
|
+
catch { /* 解码失败 */ }
|
|
89
|
+
}
|
|
90
|
+
return body.trim();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 生成随机用户名
|
|
94
|
+
*/
|
|
95
|
+
function randomUsername(length = 10) {
|
|
96
|
+
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
97
|
+
let result = '';
|
|
98
|
+
for (let i = 0; i < length; i++) {
|
|
99
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 发送 GraphQL 请求
|
|
105
|
+
* 使用 operationName + variables 的标准 GraphQL 格式
|
|
106
|
+
*/
|
|
107
|
+
async function graphqlRequest(operationName, query, variables = {}) {
|
|
108
|
+
const response = await fetch(GRAPHQL_URL, {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: {
|
|
111
|
+
'Content-Type': 'application/json',
|
|
112
|
+
'Origin': 'https://maildrop.cc',
|
|
113
|
+
'Referer': 'https://maildrop.cc/',
|
|
114
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
115
|
+
},
|
|
116
|
+
body: JSON.stringify({ operationName, variables, query }),
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
throw new Error(`Maildrop GraphQL request failed: ${response.status}`);
|
|
120
|
+
}
|
|
121
|
+
const data = await response.json();
|
|
122
|
+
if (data.errors && data.errors.length > 0) {
|
|
123
|
+
throw new Error(`Maildrop GraphQL error: ${data.errors[0].message}`);
|
|
124
|
+
}
|
|
125
|
+
return data.data;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 创建临时邮箱
|
|
129
|
+
* Maildrop 无需注册,任意用户名即可接收邮件
|
|
130
|
+
*/
|
|
131
|
+
async function generateEmail() {
|
|
132
|
+
const username = randomUsername();
|
|
133
|
+
const email = `${username}@${DOMAIN}`;
|
|
134
|
+
/* 验证邮箱可用:查询一次 inbox 确认 API 正常 */
|
|
135
|
+
await graphqlRequest('GetInbox', 'query GetInbox($mailbox: String!) { inbox(mailbox: $mailbox) { id } }', { mailbox: username });
|
|
136
|
+
return {
|
|
137
|
+
channel: CHANNEL,
|
|
138
|
+
email,
|
|
139
|
+
token: username,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 获取邮件列表
|
|
144
|
+
* 先查 inbox 获取邮件 ID 列表,再逐封获取完整内容
|
|
145
|
+
*/
|
|
146
|
+
async function getEmails(token, email) {
|
|
147
|
+
const mailbox = token || email.split('@')[0];
|
|
148
|
+
/* 查询收件箱列表 */
|
|
149
|
+
const inboxData = await graphqlRequest('GetInbox', 'query GetInbox($mailbox: String!) { inbox(mailbox: $mailbox) { id headerfrom subject date } }', { mailbox });
|
|
150
|
+
const inbox = inboxData?.inbox;
|
|
151
|
+
if (!Array.isArray(inbox) || inbox.length === 0) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
/* 逐封获取完整邮件内容 */
|
|
155
|
+
const emails = [];
|
|
156
|
+
for (const item of inbox) {
|
|
157
|
+
try {
|
|
158
|
+
const msgData = await graphqlRequest('GetMessage', 'query GetMessage($mailbox: String!, $id: String!) { message(mailbox: $mailbox, id: $id) { id headerfrom subject date data html } }', { mailbox, id: item.id });
|
|
159
|
+
const msg = msgData?.message;
|
|
160
|
+
if (msg) {
|
|
161
|
+
emails.push({
|
|
162
|
+
id: msg.id || item.id,
|
|
163
|
+
from: decodeRfc2047(msg.headerfrom || item.headerfrom || ''),
|
|
164
|
+
to: email,
|
|
165
|
+
subject: decodeRfc2047(msg.subject || item.subject || ''),
|
|
166
|
+
text: extractTextFromMime(msg.data || ''),
|
|
167
|
+
html: msg.html || '',
|
|
168
|
+
date: msg.date || item.date || '',
|
|
169
|
+
isRead: false,
|
|
170
|
+
attachments: [],
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
/* 单封邮件获取失败不影响整体 */
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return emails;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbGRyb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXJzL21haWxkcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7O0FBcUlILHNDQWdCQztBQU1ELDhCQTZDQztBQXBNRCxNQUFNLE9BQU8sR0FBWSxVQUFVLENBQUM7QUFDcEMsTUFBTSxXQUFXLEdBQUcsaUNBQWlDLENBQUM7QUFDdEQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDO0FBRTdCOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLEdBQVc7SUFDaEMsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN0RixJQUFJLENBQUM7WUFDSCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUNELHVDQUF1QztZQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPO2lCQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztpQkFDbEIsT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUMsRUFBVSxFQUFFLEdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FB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gZPlrp7njrBcbiAqIEFQSTogR3JhcGhRTCBlbmRwb2ludCBodHRwczovL2FwaS5tYWlsZHJvcC5jYy9ncmFwaHFsXG4gKiBcbiAqIOeJueeCuTpcbiAqIC0g5peg6ZyA6K6k6K+B77yM5YWs5byAIEdyYXBoUUwgQVBJXG4gKiAtIOiHquW4puWPjeWeg+Wcvui/h+a7pFxuICogLSDpgq7nrrHlkI3ljbPnlKjmiLflkI3vvIjku7vmhI/lrZfnrKbkuLJAbWFpbGRyb3AuY2PvvIlcbiAqIC0g5peg6L+H5pyf5pe26Ze06ZmQ5Yi2XG4gKi9cblxuaW1wb3J0IHsgRW1haWxJbmZvLCBFbWFpbCwgQ2hhbm5lbCB9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgQ0hBTk5FTDogQ2hhbm5lbCA9ICdtYWlsZHJvcCc7XG5jb25zdCBHUkFQSFFMX1VSTCA9ICdodHRwczovL2FwaS5tYWlsZHJvcC5jYy9ncmFwaHFsJztcbmNvbnN0IERPTUFJTiA9ICdtYWlsZHJvcC5jYyc7XG5cbi8qKlxuICog6Kej56CBIFJGQyAyMDQ3IOe8lueggeeahOmCruS7tuWktO+8iOWmguWPkeS7tuS6uuOAgeS4u+mimO+8iVxuICog5pSv5oyBIEJhc2U2NCAoQikg5ZKMIFF1b3RlZC1QcmludGFibGUgKFEpIOe8lueggVxuICovXG5mdW5jdGlvbiBkZWNvZGVSZmMyMDQ3KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC89XFw/KFteP10rKVxcPyhCfFEpXFw/KFteP10qKVxcPz0vZ2ksIChfLCBjaGFyc2V0LCBlbmNvZGluZywgZW5jb2RlZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZW5jb2RpbmcudG9VcHBlckNhc2UoKSA9PT0gJ0InKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShlbmNvZGVkLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9XG4gICAgICAvKiBRdW90ZWQtUHJpbnRhYmxlOiBfPeepuuagvO+8jD1YWD3ljYHlha3ov5vliLblrZfoioIgKi9cbiAgICAgIGNvbnN0IGRlY29kZWQgPSBlbmNvZGVkXG4gICAgICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAgICAgLnJlcGxhY2UoLz0oWzAtOUEtRmEtZl17Mn0pL2csIChfbTogc3RyaW5nLCBoZXg6IHN0cmluZykgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSkpO1xuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIOS7juWOn+WniyBNSU1FIOmCruS7tua6kOeggeS4reaPkOWPlue6r+aWh+acrOato+aWh1xuICogbWFpbGRyb3Ag55qEIGRhdGEg5a2X5q616L+U5Zue5a6M5pW0IE1JTUUg5rqQ56CB77yM6ZyA6KaB6Kej5p6Q5Ye6IHRleHQvcGxhaW4g6YOo5YiGXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUZXh0RnJvbU1pbWUocmF3OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXJhdykgcmV0dXJuICcnO1xuXG4gIC8qIOWIhuemu+mCruS7tuWktOWSjOato+aWh++8iOWPjOaNouihjOWIhumalO+8iSAqL1xuICBjb25zdCBoZWFkZXJCb2R5U3BsaXQgPSByYXcuaW5kZXhPZignXFxyXFxuXFxyXFxuJyk7XG4gIGlmIChoZWFkZXJCb2R5U3BsaXQgPT09IC0xKSByZXR1cm4gcmF3O1xuXG4gIGNvbnN0IGhlYWRlcnMgPSByYXcuc3Vic3RyaW5nKDAsIGhlYWRlckJvZHlTcGxpdCk7XG4gIGNvbnN0IGJvZHkgPSByYXcuc3Vic3RyaW5nKGhlYWRlckJvZHlTcGxpdCArIDQpO1xuXG4gIC8qIOajgOafpeaYr+WQpuS4uiBtdWx0aXBhcnQg6YKu5Lu2ICovXG4gIGNvbnN0IGJvdW5kYXJ5TWF0Y2ggPSBoZWFkZXJzLm1hdGNoKC9ib3VuZGFyeT1cIj8oW15cIjtcXHJcXG5dKylcIj8vaSk7XG4gIGlmIChib3VuZGFyeU1hdGNoKSB7XG4gICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyeU1hdGNoWzFdO1xuICAgIGNvbnN0IHBhcnRzID0gYm9keS5zcGxpdCgnLS0nICsgYm91bmRhcnkpO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAvKiDmn6Xmib4gdGV4dC9wbGFpbiDpg6jliIYgKi9cbiAgICAgIGlmIChwYXJ0Lm1hdGNoKC9Db250ZW50LVR5cGU6XFxzKnRleHRcXC9wbGFpbi9pKSkge1xuICAgICAgICBjb25zdCBwYXJ0SGVhZGVyRW5kID0gcGFydC5pbmRleE9mKCdcXHJcXG5cXHJcXG4nKTtcbiAgICAgICAgaWYgKHBhcnRIZWFkZXJFbmQgPT09IC0xKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwYXJ0SGVhZGVycyA9IHBhcnQuc3Vic3RyaW5nKDAsIHBhcnRIZWFkZXJFbmQpO1xuICAgICAgICBsZXQgY29udGVudCA9IHBhcnQuc3Vic3RyaW5nKHBhcnRIZWFkZXJFbmQgKyA0KS5yZXBsYWNlKC9cXHJcXG4kLywgJycpLnJlcGxhY2UoLy0tJC8sICcnKS50cmltKCk7XG5cbiAgICAgICAgLyog5aSE55CGIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgKi9cbiAgICAgICAgaWYgKHBhcnRIZWFkZXJzLm1hdGNoKC9Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOlxccypiYXNlNjQvaSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29udGVudCA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQucmVwbGFjZSgvXFxzL2csICcnKSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICAgIH0gY2F0Y2ggeyAvKiDop6PnoIHlpLHotKXliJnkv53nlZnljp/mlocgKi8gfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnRIZWFkZXJzLm1hdGNoKC9Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOlxccypxdW90ZWQtcHJpbnRhYmxlL2kpKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC89XFxyP1xcbi9nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC89KFswLTlBLUZhLWZdezJ9KS9nLCAoXywgaGV4OiBzdHJpbmcpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250ZW50LnRyaW0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiDpnZ4gbXVsdGlwYXJ077ya5qOA5p+l5pW05L2T57yW56CBICovXG4gIGlmIChoZWFkZXJzLm1hdGNoKC9Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOlxccypiYXNlNjQvaSkpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJvZHkucmVwbGFjZSgvXFxzL2csICcnKSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHsgLyog6Kej56CB5aSx6LSlICovIH1cbiAgfVxuXG4gIHJldHVybiBib2R5LnRyaW0oKTtcbn1cblxuLyoqXG4gKiDnlJ/miJDpmo/mnLrnlKjmiLflkI1cbiAqL1xuZnVuY3Rpb24gcmFuZG9tVXNlcm5hbWUobGVuZ3RoOiBudW1iZXIgPSAxMCk6IHN0cmluZyB7XG4gIGNvbnN0IGNoYXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiDlj5HpgIEgR3JhcGhRTCDor7fmsYJcbiAqIOS9v+eUqCBvcGVyYXRpb25OYW1lICsgdmFyaWFibGVzIOeahOagh+WHhiBHcmFwaFFMIOagvOW8j1xuICovXG5hc3luYyBmdW5jdGlvbiBncmFwaHFsUmVxdWVzdChcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nLFxuICBxdWVyeTogc3RyaW5nLFxuICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goR1JBUEhRTF9VUkwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ09yaWdpbic6ICdodHRwczovL21haWxkcm9wLmNjJyxcbiAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vbWFpbGRyb3AuY2MvJyxcbiAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNicsXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG9wZXJhdGlvbk5hbWUsIHZhcmlhYmxlcywgcXVlcnkgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1haWxkcm9wIEdyYXBoUUwgcmVxdWVzdCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgaWYgKGRhdGEuZXJyb3JzICYmIGRhdGEuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1haWxkcm9wIEdyYXBoUUwgZXJyb3I6ICR7ZGF0YS5lcnJvcnNbMF0ubWVzc2FnZX1gKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhLmRhdGE7XG59XG5cbi8qKlxuICog5Yib5bu65Li05pe26YKu566xXG4gKiBNYWlsZHJvcCDml6DpnIDms6jlhozvvIzku7vmhI/nlKjmiLflkI3ljbPlj6/mjqXmlLbpgq7ku7ZcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWwoKTogUHJvbWlzZTxFbWFpbEluZm8+IHtcbiAgY29uc3QgdXNlcm5hbWUgPSByYW5kb21Vc2VybmFtZSgpO1xuICBjb25zdCBlbWFpbCA9IGAke3VzZXJuYW1lfUAke0RPTUFJTn1gO1xuXG4gIC8qIOmqjOivgemCrueuseWPr+eUqO+8muafpeivouS4gOasoSBpbmJveCDnoa7orqQgQVBJIOato+W4uCAqL1xuICBhd2FpdCBncmFwaHFsUmVxdWVzdChcbiAgICAnR2V0SW5ib3gnLFxuICAgICdxdWVyeSBHZXRJbmJveCgkbWFpbGJveDogU3RyaW5nISkgeyBpbmJveChtYWlsYm94OiAkbWFpbGJveCkgeyBpZCB9IH0nLFxuICAgIHsgbWFpbGJveDogdXNlcm5hbWUgfSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6IENIQU5ORUwsXG4gICAgZW1haWwsXG4gICAgdG9rZW46IHVzZXJuYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIOiOt+WPlumCruS7tuWIl+ihqFxuICog5YWI5p+lIGluYm94IOiOt+WPlumCruS7tiBJRCDliJfooajvvIzlho3pgJDlsIHojrflj5blrozmlbTlhoXlrrlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVtYWlscyh0b2tlbjogc3RyaW5nLCBlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxFbWFpbFtdPiB7XG4gIGNvbnN0IG1haWxib3ggPSB0b2tlbiB8fCBlbWFpbC5zcGxpdCgnQCcpWzBdO1xuXG4gIC8qIOafpeivouaUtuS7tueuseWIl+ihqCAqL1xuICBjb25zdCBpbmJveERhdGEgPSBhd2FpdCBncmFwaHFsUmVxdWVzdChcbiAgICAnR2V0SW5ib3gnLFxuICAgICdxdWVyeSBHZXRJbmJveCgkbWFpbGJveDogU3RyaW5nISkgeyBpbmJveChtYWlsYm94OiAkbWFpbGJveCkgeyBpZCBoZWFkZXJmcm9tIHN1YmplY3QgZGF0ZSB9IH0nLFxuICAgIHsgbWFpbGJveCB9LFxuICApO1xuXG4gIGNvbnN0IGluYm94ID0gaW5ib3hEYXRhPy5pbmJveDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGluYm94KSB8fCBpbmJveC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKiDpgJDlsIHojrflj5blrozmlbTpgq7ku7blhoXlrrkgKi9cbiAgY29uc3QgZW1haWxzOiBFbWFpbFtdID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpbmJveCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtc2dEYXRhID0gYXdhaXQgZ3JhcGhxbFJlcXVlc3QoXG4gICAgICAgICdHZXRNZXNzYWdlJyxcbiAgICAgICAgJ3F1ZXJ5IEdldE1lc3NhZ2UoJG1haWxib3g6IFN0cmluZyEsICRpZDogU3RyaW5nISkgeyBtZXNzYWdlKG1haWxib3g6ICRtYWlsYm94LCBpZDogJGlkKSB7IGlkIGhlYWRlcmZyb20gc3ViamVjdCBkYXRlIGRhdGEgaHRtbCB9IH0nLFxuICAgICAgICB7IG1haWxib3gsIGlkOiBpdGVtLmlkIH0sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtc2cgPSBtc2dEYXRhPy5tZXNzYWdlO1xuICAgICAgaWYgKG1zZykge1xuICAgICAgICBlbWFpbHMucHVzaCh7XG4gICAgICAgICAgaWQ6IG1zZy5pZCB8fCBpdGVtLmlkLFxuICAgICAgICAgIGZyb206IGRlY29kZVJmYzIwNDcobXNnLmhlYWRlcmZyb20gfHwgaXRlbS5oZWFkZXJmcm9tIHx8ICcnKSxcbiAgICAgICAgICB0bzogZW1haWwsXG4gICAgICAgICAgc3ViamVjdDogZGVjb2RlUmZjMjA0Nyhtc2cuc3ViamVjdCB8fCBpdGVtLnN1YmplY3QgfHwgJycpLFxuICAgICAgICAgIHRleHQ6IGV4dHJhY3RUZXh0RnJvbU1pbWUobXNnLmRhdGEgfHwgJycpLFxuICAgICAgICAgIGh0bWw6IG1zZy5odG1sIHx8ICcnLFxuICAgICAgICAgIGRhdGU6IG1zZy5kYXRlIHx8IGl0ZW0uZGF0ZSB8fCAnJyxcbiAgICAgICAgICBpc1JlYWQ6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiDljZXlsIHpgq7ku7bojrflj5blpLHotKXkuI3lvbHlk43mlbTkvZMgKi9cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW1haWxzO1xufVxuIl19
|
|
@@ -5,34 +5,64 @@ exports.getEmails = getEmails;
|
|
|
5
5
|
const normalize_1 = require("../normalize");
|
|
6
6
|
const CHANNEL = 'temp-mail-io';
|
|
7
7
|
const BASE_URL = 'https://api.internal.temp-mail.io/api/v3';
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
8
|
+
const PAGE_URL = 'https://temp-mail.io/en';
|
|
9
|
+
/**
|
|
10
|
+
* 缓存从页面动态获取的 mobileTestingHeader 值(用于 X-CORS-Header)
|
|
11
|
+
*/
|
|
12
|
+
let cachedCorsHeader = null;
|
|
13
|
+
/**
|
|
14
|
+
* 从 temp-mail.io 页面的 __NUXT__ 运行时配置中提取 mobileTestingHeader
|
|
15
|
+
* 该值用于 API 请求的 X-CORS-Header 头,缺少此头会导致 400 错误
|
|
16
|
+
*/
|
|
17
|
+
async function fetchCorsHeader() {
|
|
18
|
+
if (cachedCorsHeader)
|
|
19
|
+
return cachedCorsHeader;
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetch(PAGE_URL, {
|
|
22
|
+
headers: {
|
|
23
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36',
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const html = await response.text();
|
|
27
|
+
const match = html.match(/mobileTestingHeader\s*:\s*"([^"]+)"/);
|
|
28
|
+
if (match) {
|
|
29
|
+
cachedCorsHeader = match[1];
|
|
30
|
+
return cachedCorsHeader;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
/* 提取失败时使用默认值 */
|
|
35
|
+
}
|
|
36
|
+
cachedCorsHeader = '1';
|
|
37
|
+
return cachedCorsHeader;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 构建 API 请求头
|
|
41
|
+
* 关键头: Content-Type, Application-Name, Application-Version, X-CORS-Header
|
|
42
|
+
*/
|
|
43
|
+
async function getApiHeaders() {
|
|
44
|
+
const corsHeader = await fetchCorsHeader();
|
|
45
|
+
return {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
'Application-Name': 'web',
|
|
48
|
+
'Application-Version': '4.0.0',
|
|
49
|
+
'X-CORS-Header': corsHeader,
|
|
50
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0',
|
|
51
|
+
'origin': 'https://temp-mail.io',
|
|
52
|
+
'referer': 'https://temp-mail.io/',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
26
55
|
/**
|
|
27
56
|
* 创建临时邮箱
|
|
28
57
|
* API: POST /api/v3/email/new
|
|
29
58
|
* 返回: { email, token }
|
|
30
59
|
*/
|
|
31
60
|
async function generateEmail() {
|
|
61
|
+
const headers = await getApiHeaders();
|
|
32
62
|
const response = await fetch(`${BASE_URL}/email/new`, {
|
|
33
63
|
method: 'POST',
|
|
34
|
-
headers
|
|
35
|
-
body: JSON.stringify({ min_name_length:
|
|
64
|
+
headers,
|
|
65
|
+
body: JSON.stringify({ min_name_length: 10, max_name_length: 10 }),
|
|
36
66
|
});
|
|
37
67
|
if (!response.ok) {
|
|
38
68
|
throw new Error(`Failed to generate email: ${response.status}`);
|
|
@@ -53,10 +83,10 @@ async function generateEmail() {
|
|
|
53
83
|
* 返回: [ { id, from, to, cc, subject, body_text, body_html, created_at, attachments } ]
|
|
54
84
|
*/
|
|
55
85
|
async function getEmails(email) {
|
|
56
|
-
const
|
|
57
|
-
const response = await fetch(`${BASE_URL}/email/${
|
|
86
|
+
const headers = await getApiHeaders();
|
|
87
|
+
const response = await fetch(`${BASE_URL}/email/${email}/messages`, {
|
|
58
88
|
method: 'GET',
|
|
59
|
-
headers
|
|
89
|
+
headers,
|
|
60
90
|
});
|
|
61
91
|
if (!response.ok) {
|
|
62
92
|
throw new Error(`Failed to get emails: ${response.status}`);
|
|
@@ -66,4 +96,4 @@ async function getEmails(email) {
|
|
|
66
96
|
const rawEmails = Array.isArray(data) ? data : [];
|
|
67
97
|
return rawEmails.map((raw) => (0, normalize_1.normalizeEmail)(raw, email));
|
|
68
98
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC1tYWlsLWlvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2REEsc0NBdUJDO0FBT0QsOEJBZ0JDO0FBMUdELDRDQUE4QztBQUU5QyxNQUFNLE9BQU8sR0FBWSxjQUFjLENBQUM7QUFDeEMsTUFBTSxRQUFRLEdBQUcsMENBQTBDLENBQUM7QUFDNUQsTUFBTSxRQUFRLEdBQUcseUJBQXlCLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxJQUFJLGdCQUFnQixHQUFrQixJQUFJLENBQUM7QUFFM0M7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGVBQWU7SUFDNUIsSUFBSSxnQkFBZ0I7UUFBRSxPQUFPLGdCQUFnQixDQUFDO0lBRTlDLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNyQyxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLGlIQUFpSDthQUNoSTtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxnQkFBZ0I7SUFDbEIsQ0FBQztJQUVELGdCQUFnQixHQUFHLEdBQUcsQ0FBQztJQUN2QixPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsYUFBYTtJQUMxQixNQUFNLFVBQVUsR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO0lBQzNDLE9BQU87UUFDTCxjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLGtCQUFrQixFQUFFLEtBQUs7UUFDekIscUJBQXFCLEVBQUUsT0FBTztRQUM5QixlQUFlLEVBQUUsVUFBVTtRQUMzQixZQUFZLEVBQUUsK0hBQStIO1FBQzdJLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsU0FBUyxFQUFFLHVCQUF1QjtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsYUFBYTtJQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLEVBQUU7UUFDcEQsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPO1FBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQztLQUNuRSxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBTztRQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO0tBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxTQUFTLENBQUMsS0FBYTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSxVQUFVLEtBQUssV0FBVyxFQUFFO1FBQ2xFLE1BQU0sRUFBRSxLQUFLO1FBQ2IsT0FBTztLQUNSLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRW5DLGVBQWU7SUFDZixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUEsMEJBQWMsRUFBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW1haWxJbmZvLCBFbWFpbCwgQ2hhbm5lbCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi4vbm9ybWFsaXplJztcblxuY29uc3QgQ0hBTk5FTDogQ2hhbm5lbCA9ICd0ZW1wLW1haWwtaW8nO1xuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkuaW50ZXJuYWwudGVtcC1tYWlsLmlvL2FwaS92Myc7XG5jb25zdCBQQUdFX1VSTCA9ICdodHRwczovL3RlbXAtbWFpbC5pby9lbic7XG5cbi8qKlxuICog57yT5a2Y5LuO6aG16Z2i5Yqo5oCB6I635Y+W55qEIG1vYmlsZVRlc3RpbmdIZWFkZXIg5YC877yI55So5LqOIFgtQ09SUy1IZWFkZXLvvIlcbiAqL1xubGV0IGNhY2hlZENvcnNIZWFkZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIOS7jiB0ZW1wLW1haWwuaW8g6aG16Z2i55qEIF9fTlVYVF9fIOi/kOihjOaXtumFjee9ruS4reaPkOWPliBtb2JpbGVUZXN0aW5nSGVhZGVyXG4gKiDor6XlgLznlKjkuo4gQVBJIOivt+axgueahCBYLUNPUlMtSGVhZGVyIOWktO+8jOe8uuWwkeatpOWktOS8muWvvOiHtCA0MDAg6ZSZ6K+vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ29yc0hlYWRlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkQ29yc0hlYWRlcikgcmV0dXJuIGNhY2hlZENvcnNIZWFkZXI7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFBBR0VfVVJMLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xNDQuMC4wLjAgU2FmYXJpLzUzNy4zNicsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgY29uc3QgbWF0Y2ggPSBodG1sLm1hdGNoKC9tb2JpbGVUZXN0aW5nSGVhZGVyXFxzKjpcXHMqXCIoW15cIl0rKVwiLyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjYWNoZWRDb3JzSGVhZGVyID0gbWF0Y2hbMV07XG4gICAgICByZXR1cm4gY2FjaGVkQ29yc0hlYWRlcjtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8qIOaPkOWPluWksei0peaXtuS9v+eUqOm7mOiupOWAvCAqL1xuICB9XG5cbiAgY2FjaGVkQ29yc0hlYWRlciA9ICcxJztcbiAgcmV0dXJuIGNhY2hlZENvcnNIZWFkZXI7XG59XG5cbi8qKlxuICog5p6E5bu6IEFQSSDor7fmsYLlpLRcbiAqIOWFs+mUruWktDogQ29udGVudC1UeXBlLCBBcHBsaWNhdGlvbi1OYW1lLCBBcHBsaWNhdGlvbi1WZXJzaW9uLCBYLUNPUlMtSGVhZGVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFwaUhlYWRlcnMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IGNvcnNIZWFkZXIgPSBhd2FpdCBmZXRjaENvcnNIZWFkZXIoKTtcbiAgcmV0dXJuIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICdBcHBsaWNhdGlvbi1OYW1lJzogJ3dlYicsXG4gICAgJ0FwcGxpY2F0aW9uLVZlcnNpb24nOiAnNC4wLjAnLFxuICAgICdYLUNPUlMtSGVhZGVyJzogY29yc0hlYWRlcixcbiAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTQ0LjAuMC4wIFNhZmFyaS81MzcuMzYgRWRnLzE0NC4wLjAuMCcsXG4gICAgJ29yaWdpbic6ICdodHRwczovL3RlbXAtbWFpbC5pbycsXG4gICAgJ3JlZmVyZXInOiAnaHR0cHM6Ly90ZW1wLW1haWwuaW8vJyxcbiAgfTtcbn1cblxuLyoqXG4gKiDliJvlu7rkuLTml7bpgq7nrrFcbiAqIEFQSTogUE9TVCAvYXBpL3YzL2VtYWlsL25ld1xuICog6L+U5ZueOiB7IGVtYWlsLCB0b2tlbiB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKCk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBnZXRBcGlIZWFkZXJzKCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2VtYWlsL25ld2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWluX25hbWVfbGVuZ3RoOiAxMCwgbWF4X25hbWVfbGVuZ3RoOiAxMCB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdlbmVyYXRlIGVtYWlsOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgaWYgKCFkYXRhLmVtYWlsIHx8ICFkYXRhLnRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgZW1haWwnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbDogQ0hBTk5FTCxcbiAgICBlbWFpbDogZGF0YS5lbWFpbCxcbiAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgfTtcbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIEFQSTogR0VUIC9hcGkvdjMvZW1haWwve2VtYWlsfS9tZXNzYWdlc1xuICog6L+U5ZueOiBbIHsgaWQsIGZyb20sIHRvLCBjYywgc3ViamVjdCwgYm9keV90ZXh0LCBib2R5X2h0bWwsIGNyZWF0ZWRfYXQsIGF0dGFjaG1lbnRzIH0gXVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGdldEFwaUhlYWRlcnMoKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtCQVNFX1VSTH0vZW1haWwvJHtlbWFpbH0vbWVzc2FnZXNgLCB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IGVtYWlsczogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIC8vIEFQSSDnm7TmjqXov5Tlm57pgq7ku7bmlbDnu4RcbiAgY29uc3QgcmF3RW1haWxzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbXTtcbiAgcmV0dXJuIHJhd0VtYWlscy5tYXAoKHJhdzogYW55KSA9PiBub3JtYWxpemVFbWFpbChyYXcsIGVtYWlsKSk7XG59XG4iXX0=
|
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通用重试工具
|
|
3
|
+
* 提供请求重试、超时控制、指数退避等错误恢复机制
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 重试配置选项
|
|
7
|
+
*/
|
|
8
|
+
export interface RetryOptions {
|
|
9
|
+
/** 最大重试次数(不含首次请求),默认 2 */
|
|
10
|
+
maxRetries?: number;
|
|
11
|
+
/** 初始重试延迟(毫秒),默认 1000 */
|
|
12
|
+
initialDelay?: number;
|
|
13
|
+
/** 最大重试延迟(毫秒),默认 5000 */
|
|
14
|
+
maxDelay?: number;
|
|
15
|
+
/** 请求超时时间(毫秒),默认 15000 */
|
|
16
|
+
timeout?: number;
|
|
17
|
+
/** 是否对该错误进行重试的判断函数 */
|
|
18
|
+
shouldRetry?: (error: any) => boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 带重试的异步操作执行器
|
|
22
|
+
* - 自动重试可恢复的错误(网络错误、超时、5xx)
|
|
23
|
+
* - 指数退避避免过度请求
|
|
24
|
+
* - 不可恢复的错误(4xx 参数错误等)直接抛出不重试
|
|
25
|
+
*
|
|
26
|
+
* @param fn 要执行的异步操作
|
|
27
|
+
* @param options 重试配置
|
|
28
|
+
*/
|
|
29
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
30
|
+
/**
|
|
31
|
+
* 带超时控制的 fetch 包装
|
|
32
|
+
* 在原生 fetch 基础上添加超时中断能力
|
|
33
|
+
*
|
|
34
|
+
* @param url 请求 URL
|
|
35
|
+
* @param init fetch 选项
|
|
36
|
+
* @param timeoutMs 超时时间(毫秒)
|
|
37
|
+
*/
|
|
38
|
+
export declare function fetchWithTimeout(url: string, init?: RequestInit, timeoutMs?: number): Promise<Response>;
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 通用重试工具
|
|
4
|
+
* 提供请求重试、超时控制、指数退避等错误恢复机制
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.withRetry = withRetry;
|
|
8
|
+
exports.fetchWithTimeout = fetchWithTimeout;
|
|
9
|
+
const logger_1 = require("./logger");
|
|
10
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
11
|
+
maxRetries: 2,
|
|
12
|
+
initialDelay: 1000,
|
|
13
|
+
maxDelay: 5000,
|
|
14
|
+
timeout: 15000,
|
|
15
|
+
shouldRetry: defaultShouldRetry,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* 默认重试判断
|
|
19
|
+
* 网络错误、超时、HTTP 4xx/5xx 错误均可重试
|
|
20
|
+
* 仅参数校验类错误(由 SDK 内部抛出)不重试
|
|
21
|
+
*/
|
|
22
|
+
function defaultShouldRetry(error) {
|
|
23
|
+
if (!error)
|
|
24
|
+
return false;
|
|
25
|
+
const message = String(error.message || error || '').toLowerCase();
|
|
26
|
+
/* 网络级别错误 → 重试 */
|
|
27
|
+
if (message.includes('fetch failed') ||
|
|
28
|
+
message.includes('network') ||
|
|
29
|
+
message.includes('econnrefused') ||
|
|
30
|
+
message.includes('econnreset') ||
|
|
31
|
+
message.includes('etimedout') ||
|
|
32
|
+
message.includes('timeout') ||
|
|
33
|
+
message.includes('socket hang up') ||
|
|
34
|
+
message.includes('dns') ||
|
|
35
|
+
message.includes('abort')) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
/* HTTP 4xx/5xx 错误 → 重试 */
|
|
39
|
+
const statusMatch = message.match(/:\s*(\d{3})/);
|
|
40
|
+
if (statusMatch) {
|
|
41
|
+
const status = parseInt(statusMatch[1], 10);
|
|
42
|
+
return status >= 400;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 休眠指定毫秒
|
|
48
|
+
*/
|
|
49
|
+
function sleep(ms) {
|
|
50
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 带重试的异步操作执行器
|
|
54
|
+
* - 自动重试可恢复的错误(网络错误、超时、5xx)
|
|
55
|
+
* - 指数退避避免过度请求
|
|
56
|
+
* - 不可恢复的错误(4xx 参数错误等)直接抛出不重试
|
|
57
|
+
*
|
|
58
|
+
* @param fn 要执行的异步操作
|
|
59
|
+
* @param options 重试配置
|
|
60
|
+
*/
|
|
61
|
+
async function withRetry(fn, options) {
|
|
62
|
+
const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
|
|
63
|
+
let lastError;
|
|
64
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
65
|
+
try {
|
|
66
|
+
const result = await fn();
|
|
67
|
+
if (attempt > 0) {
|
|
68
|
+
logger_1.logger.info(`第 ${attempt + 1} 次尝试成功`);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
lastError = error;
|
|
74
|
+
const errorMsg = error.message || String(error);
|
|
75
|
+
/* 最后一次尝试失败或不可重试的错误 → 直接抛出 */
|
|
76
|
+
if (attempt >= opts.maxRetries || !opts.shouldRetry(error)) {
|
|
77
|
+
if (attempt >= opts.maxRetries && opts.maxRetries > 0) {
|
|
78
|
+
logger_1.logger.error(`重试 ${opts.maxRetries} 次后仍失败: ${errorMsg}`);
|
|
79
|
+
}
|
|
80
|
+
else if (!opts.shouldRetry(error)) {
|
|
81
|
+
logger_1.logger.debug(`不可重试的错误: ${errorMsg}`);
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
/* 指数退避等待 */
|
|
86
|
+
const delay = Math.min(opts.initialDelay * Math.pow(2, attempt), opts.maxDelay);
|
|
87
|
+
logger_1.logger.warn(`请求失败 (${errorMsg}),${delay}ms 后第 ${attempt + 2} 次重试...`);
|
|
88
|
+
await sleep(delay);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
throw lastError;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 带超时控制的 fetch 包装
|
|
95
|
+
* 在原生 fetch 基础上添加超时中断能力
|
|
96
|
+
*
|
|
97
|
+
* @param url 请求 URL
|
|
98
|
+
* @param init fetch 选项
|
|
99
|
+
* @param timeoutMs 超时时间(毫秒)
|
|
100
|
+
*/
|
|
101
|
+
async function fetchWithTimeout(url, init, timeoutMs = DEFAULT_RETRY_OPTIONS.timeout) {
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
104
|
+
try {
|
|
105
|
+
const response = await fetch(url, {
|
|
106
|
+
...init,
|
|
107
|
+
signal: controller.signal,
|
|
108
|
+
});
|
|
109
|
+
return response;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error.name === 'AbortError') {
|
|
113
|
+
throw new Error(`Request timeout after ${timeoutMs}ms: ${url}`);
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
clearTimeout(timeoutId);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7QUE2RUgsOEJBaUNDO0FBVUQsNENBc0JDO0FBNUlELHFDQUFrQztBQWtCbEMsTUFBTSxxQkFBcUIsR0FBMkI7SUFDcEQsVUFBVSxFQUFFLENBQUM7SUFDYixZQUFZLEVBQUUsSUFBSTtJQUNsQixRQUFRLEVBQUUsSUFBSTtJQUNkLE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBVyxFQUFFLGtCQUFrQjtDQUNoQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBVTtJQUNwQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVuRSxpQkFBaUI7SUFDakIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FB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bEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hDLEdBQUcsSUFBSTtZQUNQLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtTQUMxQixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsU0FBUyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOmAmueUqOmHjeivleW3peWFt1xuICog5o+Q5L6b6K+35rGC6YeN6K+V44CB6LaF5pe25o6n5Yi244CB5oyH5pWw6YCA6YG/562J6ZSZ6K+v5oGi5aSN5py65Yi2XG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG4vKipcbiAqIOmHjeivlemFjee9rumAiemhuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKiDmnIDlpKfph43or5XmrKHmlbDvvIjkuI3lkKvpppbmrKHor7fmsYLvvInvvIzpu5jorqQgMiAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiog5Yid5aeL6YeN6K+V5bu26L+f77yI5q+r56eS77yJ77yM6buY6K6kIDEwMDAgKi9cbiAgaW5pdGlhbERlbGF5PzogbnVtYmVyO1xuICAvKiog5pyA5aSn6YeN6K+V5bu26L+f77yI5q+r56eS77yJ77yM6buY6K6kIDUwMDAgKi9cbiAgbWF4RGVsYXk/OiBudW1iZXI7XG4gIC8qKiDor7fmsYLotoXml7bml7bpl7TvvIjmr6vnp5LvvInvvIzpu5jorqQgMTUwMDAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIOaYr+WQpuWvueivpemUmeivr+i/m+ihjOmHjeivleeahOWIpOaWreWHveaVsCAqL1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogYW55KSA9PiBib29sZWFuO1xufVxuXG5jb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlM6IFJlcXVpcmVkPFJldHJ5T3B0aW9ucz4gPSB7XG4gIG1heFJldHJpZXM6IDIsXG4gIGluaXRpYWxEZWxheTogMTAwMCxcbiAgbWF4RGVsYXk6IDUwMDAsXG4gIHRpbWVvdXQ6IDE1MDAwLFxuICBzaG91bGRSZXRyeTogZGVmYXVsdFNob3VsZFJldHJ5LFxufTtcblxuLyoqXG4gKiDpu5jorqTph43or5XliKTmlq1cbiAqIOe9kee7nOmUmeivr+OAgei2heaXtuOAgUhUVFAgNHh4LzV4eCDplJnor6/lnYflj6/ph43or5VcbiAqIOS7heWPguaVsOagoemqjOexu+mUmeivr++8iOeUsSBTREsg5YaF6YOo5oqb5Ye677yJ5LiN6YeN6K+VXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTaG91bGRSZXRyeShlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBtZXNzYWdlID0gU3RyaW5nKGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyog572R57uc57qn5Yir6ZSZ6K+vIOKGkiDph43or5UgKi9cbiAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ2ZldGNoIGZhaWxlZCcpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCduZXR3b3JrJykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ2Vjb25ucmVmdXNlZCcpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCdlY29ubnJlc2V0JykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ2V0aW1lZG91dCcpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCd0aW1lb3V0JykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ3NvY2tldCBoYW5nIHVwJykgfHxcbiAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ2RucycpIHx8XG4gICAgICBtZXNzYWdlLmluY2x1ZGVzKCdhYm9ydCcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiBIVFRQIDR4eC81eHgg6ZSZ6K+vIOKGkiDph43or5UgKi9cbiAgY29uc3Qgc3RhdHVzTWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC86XFxzKihcXGR7M30pLyk7XG4gIGlmIChzdGF0dXNNYXRjaCkge1xuICAgIGNvbnN0IHN0YXR1cyA9IHBhcnNlSW50KHN0YXR1c01hdGNoWzFdLCAxMCk7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSA0MDA7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICog5LyR55yg5oyH5a6a5q+r56eSXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIOW4pumHjeivleeahOW8guatpeaTjeS9nOaJp+ihjOWZqFxuICogLSDoh6rliqjph43or5Xlj6/mgaLlpI3nmoTplJnor6/vvIjnvZHnu5zplJnor6/jgIHotoXml7bjgIE1eHjvvIlcbiAqIC0g5oyH5pWw6YCA6YG/6YG/5YWN6L+H5bqm6K+35rGCXG4gKiAtIOS4jeWPr+aBouWkjeeahOmUmeivr++8iDR4eCDlj4LmlbDplJnor6/nrYnvvInnm7TmjqXmipvlh7rkuI3ph43or5VcbiAqXG4gKiBAcGFyYW0gZm4g6KaB5omn6KGM55qE5byC5q2l5pON5L2cXG4gKiBAcGFyYW0gb3B0aW9ucyDph43or5XphY3nva5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPiwgb3B0aW9ucz86IFJldHJ5T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICBjb25zdCBvcHRzID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcbiAgbGV0IGxhc3RFcnJvcjogYW55O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG9wdHMubWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgICBpZiAoYXR0ZW1wdCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYOesrCAke2F0dGVtcHQgKyAxfSDmrKHlsJ3or5XmiJDlip9gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgbGFzdEVycm9yID0gZXJyb3I7XG4gICAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yLm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKTtcblxuICAgICAgLyog5pyA5ZCO5LiA5qyh5bCd6K+V5aSx6LSl5oiW5LiN5Y+v6YeN6K+V55qE6ZSZ6K+vIOKGkiDnm7TmjqXmipvlh7ogKi9cbiAgICAgIGlmIChhdHRlbXB0ID49IG9wdHMubWF4UmV0cmllcyB8fCAhb3B0cy5zaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gb3B0cy5tYXhSZXRyaWVzICYmIG9wdHMubWF4UmV0cmllcyA+IDApIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmHjeivlSAke29wdHMubWF4UmV0cmllc30g5qyh5ZCO5LuN5aSx6LSlOiAke2Vycm9yTXNnfWApO1xuICAgICAgICB9IGVsc2UgaWYgKCFvcHRzLnNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1Zyhg5LiN5Y+v6YeN6K+V55qE6ZSZ6K+vOiAke2Vycm9yTXNnfWApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvKiDmjIfmlbDpgIDpgb/nrYnlvoUgKi9cbiAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4ob3B0cy5pbml0aWFsRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSwgb3B0cy5tYXhEZWxheSk7XG4gICAgICBsb2dnZXIud2Fybihg6K+35rGC5aSx6LSlICgke2Vycm9yTXNnfSnvvIwke2RlbGF5fW1zIOWQjuesrCAke2F0dGVtcHQgKyAyfSDmrKHph43or5UuLi5gKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBsYXN0RXJyb3I7XG59XG5cbi8qKlxuICog5bim6LaF5pe25o6n5Yi255qEIGZldGNoIOWMheijhVxuICog5Zyo5Y6f55SfIGZldGNoIOWfuuehgOS4iua3u+WKoOi2heaXtuS4reaWreiDveWKm1xuICpcbiAqIEBwYXJhbSB1cmwg6K+35rGCIFVSTFxuICogQHBhcmFtIGluaXQgZmV0Y2gg6YCJ6aG5XG4gKiBAcGFyYW0gdGltZW91dE1zIOi2heaXtuaXtumXtO+8iOavq+enku+8iVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoVGltZW91dChcbiAgdXJsOiBzdHJpbmcsXG4gIGluaXQ/OiBSZXF1ZXN0SW5pdCxcbiAgdGltZW91dE1zOiBudW1iZXIgPSBERUZBVUxUX1JFVFJZX09QVElPTlMudGltZW91dCxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXM6ICR7dXJsfWApO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgfVxufVxuIl19
|
package/dist/types.d.ts
CHANGED
|
@@ -1,18 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 支持的临时邮箱渠道标识
|
|
3
|
+
* 每个渠道对应一个第三方临时邮箱服务商
|
|
4
|
+
*/
|
|
5
|
+
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'tempmail-la' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail' | 'guerrillamail' | 'maildrop';
|
|
6
|
+
/**
|
|
7
|
+
* 创建临时邮箱后返回的邮箱信息
|
|
8
|
+
* 包含邮箱地址、认证令牌和生命周期信息
|
|
9
|
+
*/
|
|
2
10
|
export interface EmailInfo {
|
|
11
|
+
/** 创建该邮箱所使用的渠道 */
|
|
3
12
|
channel: Channel;
|
|
13
|
+
/** 临时邮箱地址 */
|
|
4
14
|
email: string;
|
|
15
|
+
/** 认证令牌,部分渠道在获取邮件时需要此令牌 */
|
|
5
16
|
token?: string;
|
|
17
|
+
/** 邮箱过期时间(ISO 8601 字符串或 Unix 时间戳) */
|
|
6
18
|
expiresAt?: string | number;
|
|
19
|
+
/** 邮箱创建时间(ISO 8601 字符串) */
|
|
7
20
|
createdAt?: string;
|
|
8
21
|
}
|
|
9
22
|
/**
|
|
10
23
|
* 标准化邮件附件
|
|
24
|
+
* 不同渠道的附件字段名不同,SDK 统一归一化为此结构
|
|
11
25
|
*/
|
|
12
26
|
export interface EmailAttachment {
|
|
27
|
+
/** 附件文件名 */
|
|
13
28
|
filename: string;
|
|
29
|
+
/** 附件大小(字节) */
|
|
14
30
|
size?: number;
|
|
31
|
+
/** MIME 类型,如 application/pdf */
|
|
15
32
|
contentType?: string;
|
|
33
|
+
/** 附件下载地址 */
|
|
16
34
|
url?: string;
|
|
17
35
|
}
|
|
18
36
|
/**
|
|
@@ -38,19 +56,88 @@ export interface Email {
|
|
|
38
56
|
/** 附件列表 */
|
|
39
57
|
attachments: EmailAttachment[];
|
|
40
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* 获取邮件列表的返回结果
|
|
61
|
+
* success 为 false 时表示请求失败(重试耗尽),emails 为空数组
|
|
62
|
+
*/
|
|
41
63
|
export interface GetEmailsResult {
|
|
64
|
+
/** 所使用的渠道 */
|
|
42
65
|
channel: Channel;
|
|
66
|
+
/** 查询的邮箱地址 */
|
|
43
67
|
email: string;
|
|
68
|
+
/** 邮件列表,失败时为空数组 */
|
|
44
69
|
emails: Email[];
|
|
70
|
+
/** 请求是否成功,false 表示重试耗尽后仍失败 */
|
|
45
71
|
success: boolean;
|
|
46
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* 重试配置
|
|
75
|
+
* SDK 内部对网络错误、超时、5xx 服务端错误自动重试
|
|
76
|
+
* 4xx 客户端错误(如参数错误)不会重试
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* // 自定义重试策略:最多重试 3 次,首次延迟 2 秒
|
|
81
|
+
* const email = await generateEmail({
|
|
82
|
+
* channel: 'mail-tm',
|
|
83
|
+
* retry: { maxRetries: 3, initialDelay: 2000 },
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export interface RetryConfig {
|
|
88
|
+
/** 最大重试次数(不含首次请求),默认 2 */
|
|
89
|
+
maxRetries?: number;
|
|
90
|
+
/** 初始重试延迟(毫秒),采用指数退避策略,默认 1000 */
|
|
91
|
+
initialDelay?: number;
|
|
92
|
+
/** 最大重试延迟上限(毫秒),默认 5000 */
|
|
93
|
+
maxDelay?: number;
|
|
94
|
+
/** 单次请求超时时间(毫秒),默认 15000 */
|
|
95
|
+
timeout?: number;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 创建临时邮箱的选项
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* // 使用指定渠道创建邮箱
|
|
103
|
+
* const email = await generateEmail({ channel: 'mail-tm' });
|
|
104
|
+
*
|
|
105
|
+
* // 随机选择渠道
|
|
106
|
+
* const email = await generateEmail();
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
47
109
|
export interface GenerateEmailOptions {
|
|
110
|
+
/** 指定渠道,不传则随机选择 */
|
|
48
111
|
channel?: Channel;
|
|
112
|
+
/** 邮箱有效时长 */
|
|
49
113
|
duration?: number;
|
|
114
|
+
/** 指定邮箱域名 */
|
|
50
115
|
domain?: string | null;
|
|
116
|
+
/** 重试配置,不传则使用默认值(最多重试 2 次) */
|
|
117
|
+
retry?: RetryConfig;
|
|
51
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* 获取邮件列表的选项
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* const result = await getEmails({
|
|
125
|
+
* channel: emailInfo.channel,
|
|
126
|
+
* email: emailInfo.email,
|
|
127
|
+
* token: emailInfo.token,
|
|
128
|
+
* });
|
|
129
|
+
* if (result.success && result.emails.length > 0) {
|
|
130
|
+
* console.log('收到邮件:', result.emails);
|
|
131
|
+
* }
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
52
134
|
export interface GetEmailsOptions {
|
|
135
|
+
/** 渠道标识,必填 */
|
|
53
136
|
channel: Channel;
|
|
137
|
+
/** 邮箱地址,必填 */
|
|
54
138
|
email: string;
|
|
139
|
+
/** 认证令牌 */
|
|
55
140
|
token?: string;
|
|
141
|
+
/** 重试配置,不传则使用默认值(最多重试 2 次) */
|
|
142
|
+
retry?: RetryConfig;
|
|
56
143
|
}
|