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.
@@ -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 DEFAULT_HEADERS = {
9
- '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',
10
- 'Content-Type': 'application/json',
11
- 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
12
- 'application-name': 'web',
13
- 'application-version': '4.0.0',
14
- 'cache-control': 'no-cache',
15
- 'dnt': '1',
16
- 'origin': 'https://temp-mail.io',
17
- 'pragma': 'no-cache',
18
- 'referer': 'https://temp-mail.io/',
19
- 'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"',
20
- 'sec-ch-ua-mobile': '?0',
21
- 'sec-ch-ua-platform': '"Windows"',
22
- 'sec-fetch-dest': 'empty',
23
- 'sec-fetch-mode': 'cors',
24
- 'sec-fetch-site': 'same-site',
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: DEFAULT_HEADERS,
35
- body: JSON.stringify({ min_name_length: 100, max_name_length: 100 }),
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 encodedEmail = encodeURIComponent(email);
57
- const response = await fetch(`${BASE_URL}/email/${encodedEmail}/messages`, {
86
+ const headers = await getApiHeaders();
87
+ const response = await fetch(`${BASE_URL}/email/${email}/messages`, {
58
88
  method: 'GET',
59
- headers: DEFAULT_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC1tYWlsLWlvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsc0NBc0JDO0FBT0QsOEJBZ0JDO0FBMUVELDRDQUE4QztBQUU5QyxNQUFNLE9BQU8sR0FBWSxjQUFjLENBQUM7QUFDeEMsTUFBTSxRQUFRLEdBQUcsMENBQTBDLENBQUM7QUFFNUQsTUFBTSxlQUFlLEdBQTJCO0lBQzlDLFlBQVksRUFBRSwrSEFBK0g7SUFDN0ksY0FBYyxFQUFFLGtCQUFrQjtJQUNsQyxpQkFBaUIsRUFBRSxpREFBaUQ7SUFDcEUsa0JBQWtCLEVBQUUsS0FBSztJQUN6QixxQkFBcUIsRUFBRSxPQUFPO0lBQzlCLGVBQWUsRUFBRSxVQUFVO0lBQzNCLEtBQUssRUFBRSxHQUFHO0lBQ1YsUUFBUSxFQUFFLHNCQUFzQjtJQUNoQyxRQUFRLEVBQUUsVUFBVTtJQUNwQixTQUFTLEVBQUUsdUJBQXVCO0lBQ2xDLFdBQVcsRUFBRSxtRUFBbUU7SUFDaEYsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixvQkFBb0IsRUFBRSxXQUFXO0lBQ2pDLGdCQUFnQixFQUFFLE9BQU87SUFDekIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixnQkFBZ0IsRUFBRSxXQUFXO0NBQzlCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGFBQWE7SUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxRQUFRLFlBQVksRUFBRTtRQUNwRCxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUM7S0FDckUsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQU87UUFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztLQUNsQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQWE7SUFDM0MsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsWUFBWSxXQUFXLEVBQUU7UUFDekUsTUFBTSxFQUFFLEtBQUs7UUFDYixPQUFPLEVBQUUsZUFBZTtLQUN6QixDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQyxlQUFlO0lBQ2YsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFBLDBCQUFjLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVtYWlsSW5mbywgRW1haWwsIENoYW5uZWwgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4uL25vcm1hbGl6ZSc7XG5cbmNvbnN0IENIQU5ORUw6IENoYW5uZWwgPSAndGVtcC1tYWlsLWlvJztcbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLmludGVybmFsLnRlbXAtbWFpbC5pby9hcGkvdjMnO1xuXG5jb25zdCBERUZBVUxUX0hFQURFUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xNDQuMC4wLjAgU2FmYXJpLzUzNy4zNiBFZGcvMTQ0LjAuMC4wJyxcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJ2FjY2VwdC1sYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOSxlbjtxPTAuOCxlbi1HQjtxPTAuNyxlbi1VUztxPTAuNicsXG4gICdhcHBsaWNhdGlvbi1uYW1lJzogJ3dlYicsXG4gICdhcHBsaWNhdGlvbi12ZXJzaW9uJzogJzQuMC4wJyxcbiAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tY2FjaGUnLFxuICAnZG50JzogJzEnLFxuICAnb3JpZ2luJzogJ2h0dHBzOi8vdGVtcC1tYWlsLmlvJyxcbiAgJ3ByYWdtYSc6ICduby1jYWNoZScsXG4gICdyZWZlcmVyJzogJ2h0dHBzOi8vdGVtcC1tYWlsLmlvLycsXG4gICdzZWMtY2gtdWEnOiAnXCJOb3QoQTpCcmFuZFwiO3Y9XCI4XCIsIFwiQ2hyb21pdW1cIjt2PVwiMTQ0XCIsIFwiTWljcm9zb2Z0IEVkZ2VcIjt2PVwiMTQ0XCInLFxuICAnc2VjLWNoLXVhLW1vYmlsZSc6ICc/MCcsXG4gICdzZWMtY2gtdWEtcGxhdGZvcm0nOiAnXCJXaW5kb3dzXCInLFxuICAnc2VjLWZldGNoLWRlc3QnOiAnZW1wdHknLFxuICAnc2VjLWZldGNoLW1vZGUnOiAnY29ycycsXG4gICdzZWMtZmV0Y2gtc2l0ZSc6ICdzYW1lLXNpdGUnLFxufTtcblxuLyoqXG4gKiDliJvlu7rkuLTml7bpgq7nrrFcbiAqIEFQSTogUE9TVCAvYXBpL3YzL2VtYWlsL25ld1xuICog6L+U5ZueOiB7IGVtYWlsLCB0b2tlbiB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKCk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2VtYWlsL25ld2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiBERUZBVUxUX0hFQURFUlMsXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtaW5fbmFtZV9sZW5ndGg6IDEwMCwgbWF4X25hbWVfbGVuZ3RoOiAxMDAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZW5lcmF0ZSBlbWFpbDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIGlmICghZGF0YS5lbWFpbCB8fCAhZGF0YS50b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIGVtYWlsJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6IENIQU5ORUwsXG4gICAgZW1haWw6IGRhdGEuZW1haWwsXG4gICAgdG9rZW46IGRhdGEudG9rZW4sXG4gIH07XG59XG5cbi8qKlxuICog6I635Y+W6YKu5Lu25YiX6KGoXG4gKiBBUEk6IEdFVCAvYXBpL3YzL2VtYWlsL3tlbWFpbH0vbWVzc2FnZXNcbiAqIOi/lOWbnjogWyB7IGlkLCBmcm9tLCB0bywgY2MsIHN1YmplY3QsIGJvZHlfdGV4dCwgYm9keV9odG1sLCBjcmVhdGVkX2F0LCBhdHRhY2htZW50cyB9IF1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVtYWlscyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxFbWFpbFtdPiB7XG4gIGNvbnN0IGVuY29kZWRFbWFpbCA9IGVuY29kZVVSSUNvbXBvbmVudChlbWFpbCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2VtYWlsLyR7ZW5jb2RlZEVtYWlsfS9tZXNzYWdlc2AsIHtcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhlYWRlcnM6IERFRkFVTFRfSEVBREVSUyxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBlbWFpbHM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAvLyBBUEkg55u05o6l6L+U5Zue6YKu5Lu25pWw57uEXG4gIGNvbnN0IHJhd0VtYWlscyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW107XG4gIHJldHVybiByYXdFbWFpbHMubWFwKChyYXc6IGFueSkgPT4gbm9ybWFsaXplRW1haWwocmF3LCBlbWFpbCkpO1xufVxuIl19
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC1tYWlsLWlvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2REEsc0NBdUJDO0FBT0QsOEJBZ0JDO0FBMUdELDRDQUE4QztBQUU5QyxNQUFNLE9BQU8sR0FBWSxjQUFjLENBQUM7QUFDeEMsTUFBTSxRQUFRLEdBQUcsMENBQTBDLENBQUM7QUFDNUQsTUFBTSxRQUFRLEdBQUcseUJBQXlCLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxJQUFJLGdCQUFnQixHQUFrQixJQUFJLENBQUM7QUFFM0M7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGVBQWU7SUFDNUIsSUFBSSxnQkFBZ0I7UUFBRSxPQUFPLGdCQUFnQixDQUFDO0lBRTlDLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNyQyxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLGlIQUFpSDthQUNoSTtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxnQkFBZ0I7SUFDbEIsQ0FBQztJQUVELGdCQUFnQixHQUFHLEdBQUcsQ0FBQztJQUN2QixPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsYUFBYTtJQUMxQixNQUFNLFVBQVUsR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO0lBQzNDLE9BQU87UUFDTCxjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLGtCQUFrQixFQUFFLEtBQUs7UUFDekIscUJBQXFCLEVBQUUsT0FBTztRQUM5QixlQUFlLEVBQUUsVUFBVTtRQUMzQixZQUFZLEVBQUUsK0hBQStIO1FBQzdJLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsU0FBUyxFQUFFLHVCQUF1QjtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsYUFBYTtJQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLEVBQUU7UUFDcEQsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPO1FBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQztLQUNuRSxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBTztRQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO0tBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxTQUFTLENBQUMsS0FBYTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSxVQUFVLEtBQUssV0FBVyxFQUFFO1FBQ2xFLE1BQU0sRUFBRSxLQUFLO1FBQ2IsT0FBTztLQUNSLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRW5DLGVBQWU7SUFDZixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUEsMEJBQWMsRUFBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW1haWxJbmZvLCBFbWFpbCwgQ2hhbm5lbCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi4vbm9ybWFsaXplJztcblxuY29uc3QgQ0hBTk5FTDogQ2hhbm5lbCA9ICd0ZW1wLW1haWwtaW8nO1xuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkuaW50ZXJuYWwudGVtcC1tYWlsLmlvL2FwaS92Myc7XG5jb25zdCBQQUdFX1VSTCA9ICdodHRwczovL3RlbXAtbWFpbC5pby9lbic7XG5cbi8qKlxuICog57yT5a2Y5LuO6aG16Z2i5Yqo5oCB6I635Y+W55qEIG1vYmlsZVRlc3RpbmdIZWFkZXIg5YC877yI55So5LqOIFgtQ09SUy1IZWFkZXLvvIlcbiAqL1xubGV0IGNhY2hlZENvcnNIZWFkZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIOS7jiB0ZW1wLW1haWwuaW8g6aG16Z2i55qEIF9fTlVYVF9fIOi/kOihjOaXtumFjee9ruS4reaPkOWPliBtb2JpbGVUZXN0aW5nSGVhZGVyXG4gKiDor6XlgLznlKjkuo4gQVBJIOivt+axgueahCBYLUNPUlMtSGVhZGVyIOWktO+8jOe8uuWwkeatpOWktOS8muWvvOiHtCA0MDAg6ZSZ6K+vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ29yc0hlYWRlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkQ29yc0hlYWRlcikgcmV0dXJuIGNhY2hlZENvcnNIZWFkZXI7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFBBR0VfVVJMLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xNDQuMC4wLjAgU2FmYXJpLzUzNy4zNicsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgY29uc3QgbWF0Y2ggPSBodG1sLm1hdGNoKC9tb2JpbGVUZXN0aW5nSGVhZGVyXFxzKjpcXHMqXCIoW15cIl0rKVwiLyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjYWNoZWRDb3JzSGVhZGVyID0gbWF0Y2hbMV07XG4gICAgICByZXR1cm4gY2FjaGVkQ29yc0hlYWRlcjtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8qIOaPkOWPluWksei0peaXtuS9v+eUqOm7mOiupOWAvCAqL1xuICB9XG5cbiAgY2FjaGVkQ29yc0hlYWRlciA9ICcxJztcbiAgcmV0dXJuIGNhY2hlZENvcnNIZWFkZXI7XG59XG5cbi8qKlxuICog5p6E5bu6IEFQSSDor7fmsYLlpLRcbiAqIOWFs+mUruWktDogQ29udGVudC1UeXBlLCBBcHBsaWNhdGlvbi1OYW1lLCBBcHBsaWNhdGlvbi1WZXJzaW9uLCBYLUNPUlMtSGVhZGVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFwaUhlYWRlcnMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IGNvcnNIZWFkZXIgPSBhd2FpdCBmZXRjaENvcnNIZWFkZXIoKTtcbiAgcmV0dXJuIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICdBcHBsaWNhdGlvbi1OYW1lJzogJ3dlYicsXG4gICAgJ0FwcGxpY2F0aW9uLVZlcnNpb24nOiAnNC4wLjAnLFxuICAgICdYLUNPUlMtSGVhZGVyJzogY29yc0hlYWRlcixcbiAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTQ0LjAuMC4wIFNhZmFyaS81MzcuMzYgRWRnLzE0NC4wLjAuMCcsXG4gICAgJ29yaWdpbic6ICdodHRwczovL3RlbXAtbWFpbC5pbycsXG4gICAgJ3JlZmVyZXInOiAnaHR0cHM6Ly90ZW1wLW1haWwuaW8vJyxcbiAgfTtcbn1cblxuLyoqXG4gKiDliJvlu7rkuLTml7bpgq7nrrFcbiAqIEFQSTogUE9TVCAvYXBpL3YzL2VtYWlsL25ld1xuICog6L+U5ZueOiB7IGVtYWlsLCB0b2tlbiB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKCk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBnZXRBcGlIZWFkZXJzKCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2VtYWlsL25ld2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWluX25hbWVfbGVuZ3RoOiAxMCwgbWF4X25hbWVfbGVuZ3RoOiAxMCB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdlbmVyYXRlIGVtYWlsOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgaWYgKCFkYXRhLmVtYWlsIHx8ICFkYXRhLnRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgZW1haWwnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbDogQ0hBTk5FTCxcbiAgICBlbWFpbDogZGF0YS5lbWFpbCxcbiAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgfTtcbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIEFQSTogR0VUIC9hcGkvdjMvZW1haWwve2VtYWlsfS9tZXNzYWdlc1xuICog6L+U5ZueOiBbIHsgaWQsIGZyb20sIHRvLCBjYywgc3ViamVjdCwgYm9keV90ZXh0LCBib2R5X2h0bWwsIGNyZWF0ZWRfYXQsIGF0dGFjaG1lbnRzIH0gXVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGdldEFwaUhlYWRlcnMoKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtCQVNFX1VSTH0vZW1haWwvJHtlbWFpbH0vbWVzc2FnZXNgLCB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IGVtYWlsczogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIC8vIEFQSSDnm7TmjqXov5Tlm57pgq7ku7bmlbDnu4RcbiAgY29uc3QgcmF3RW1haWxzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbXTtcbiAgcmV0dXJuIHJhd0VtYWlscy5tYXAoKHJhdzogYW55KSA9PiBub3JtYWxpemVFbWFpbChyYXcsIGVtYWlsKSk7XG59XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7QUE2RUgsOEJBaUNDO0FBVUQsNENBc0JDO0FBNUlELHFDQUFrQztBQWtCbEMsTUFBTSxxQkFBcUIsR0FBMkI7SUFDcEQsVUFBVSxFQUFFLENBQUM7SUFDYixZQUFZLEVBQUUsSUFBSTtJQUNsQixRQUFRLEVBQUUsSUFBSTtJQUNkLE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBVyxFQUFFLGtCQUFrQjtDQUNoQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBVTtJQUNwQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVuRSxpQkFBaUI7SUFDakIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSSxLQUFLLFVBQVUsU0FBUyxDQUFJLEVBQW9CLEVBQUUsT0FBc0I7SUFDN0UsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLHFCQUFxQixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDdEQsSUFBSSxTQUFjLENBQUM7SUFFbkIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzFCLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQixlQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFaEQsNkJBQTZCO1lBQzdCLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNELElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEQsZUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLFdBQVcsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNwQyxlQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFFRCxZQUFZO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRixlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsUUFBUSxLQUFLLEtBQUssU0FBUyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RSxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxHQUFXLEVBQ1gsSUFBa0IsRUFDbEIsWUFBb0IscUJBQXFCLENBQUMsT0FBTztJQUVqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFbEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hDLEdBQUcsSUFBSTtZQUNQLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtTQUMxQixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsU0FBUyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOmAmueUqOmHjeivleW3peWFt1xuICog5o+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
- export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'tempmail-la' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail';
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
  }