tempmail-sdk 1.0.3 → 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.js +20 -2
- package/dist/providers/guerrillamail.d.ts +22 -0
- package/dist/providers/guerrillamail.js +71 -0
- package/dist/providers/maildrop.d.ts +21 -0
- package/dist/providers/maildrop.js +180 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +17 -1
- package/src/providers/guerrillamail.ts +78 -0
- package/src/providers/maildrop.ts +210 -0
- package/src/types.ts +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/tempmail-sdk)
|
|
4
4
|
[](https://www.gnu.org/licenses/gpl-3.0)
|
|
5
5
|
|
|
6
|
-
临时邮箱 SDK(TypeScript/Node.js),支持
|
|
6
|
+
临时邮箱 SDK(TypeScript/Node.js),支持 11 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
|
|
7
7
|
|
|
8
8
|
## 安装
|
|
9
9
|
|
|
@@ -24,6 +24,8 @@ npm install tempmail-sdk
|
|
|
24
24
|
| `awamail` | awamail.com | ✅ | Session Cookie 自动管理 |
|
|
25
25
|
| `mail-tm` | mail.tm | ✅ | 自动注册账号获取 Bearer Token |
|
|
26
26
|
| `dropmail` | dropmail.me | ✅ | GraphQL API |
|
|
27
|
+
| `guerrillamail` | guerrillamail.com | ✅ | 公开 JSON API |
|
|
28
|
+
| `maildrop` | maildrop.cc | ✅ | GraphQL API,自带反垃圾 |
|
|
27
29
|
|
|
28
30
|
> **提示:** 使用 `TempEmailClient` 类时无需手动处理 Token,SDK 自动管理。
|
|
29
31
|
|
|
@@ -74,7 +76,9 @@ console.log(channels);
|
|
|
74
76
|
// { channel: 'temp-mail-io', name: 'Temp Mail IO', website: 'temp-mail.io' },
|
|
75
77
|
// { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
|
|
76
78
|
// { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
|
|
77
|
-
// { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' }
|
|
79
|
+
// { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
|
|
80
|
+
// { channel: 'guerrillamail', name: 'Guerrilla Mail', website: 'guerrillamail.com' },
|
|
81
|
+
// { channel: 'maildrop', name: 'Maildrop', website: 'maildrop.cc' }
|
|
78
82
|
// ]
|
|
79
83
|
|
|
80
84
|
const info = getChannelInfo('tempmail');
|
|
@@ -186,7 +190,7 @@ for (const email of result2.emails) {
|
|
|
186
190
|
|------|------|:----:|------|
|
|
187
191
|
| `channel` | `Channel` | ✅ | 渠道标识 |
|
|
188
192
|
| `email` | `string` | ✅ | 邮箱地址 |
|
|
189
|
-
| `token` | `string` | 部分 | 访问令牌(`tempmail-lol`、`awamail`、`mail-tm`、`dropmail` 必填) |
|
|
193
|
+
| `token` | `string` | 部分 | 访问令牌(`tempmail-lol`、`awamail`、`mail-tm`、`dropmail`、`guerrillamail`、`maildrop` 必填) |
|
|
190
194
|
|
|
191
195
|
**返回值:** `GetEmailsResult`
|
|
192
196
|
|
package/dist/index.js
CHANGED
|
@@ -47,6 +47,8 @@ const tempMailIO = __importStar(require("./providers/temp-mail-io"));
|
|
|
47
47
|
const awamail = __importStar(require("./providers/awamail"));
|
|
48
48
|
const mailTm = __importStar(require("./providers/mail-tm"));
|
|
49
49
|
const dropmail = __importStar(require("./providers/dropmail"));
|
|
50
|
+
const guerrillamail = __importStar(require("./providers/guerrillamail"));
|
|
51
|
+
const maildropProvider = __importStar(require("./providers/maildrop"));
|
|
50
52
|
const retry_1 = require("./retry");
|
|
51
53
|
const logger_1 = require("./logger");
|
|
52
54
|
var normalize_1 = require("./normalize");
|
|
@@ -71,9 +73,11 @@ const providers = {
|
|
|
71
73
|
'awamail': awamail,
|
|
72
74
|
'mail-tm': mailTm,
|
|
73
75
|
'dropmail': dropmail,
|
|
76
|
+
'guerrillamail': guerrillamail,
|
|
77
|
+
'maildrop': maildropProvider,
|
|
74
78
|
};
|
|
75
79
|
/** 所有支持的渠道列表,用于随机选择和遍历 */
|
|
76
|
-
const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail'];
|
|
80
|
+
const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail', 'guerrillamail', 'maildrop'];
|
|
77
81
|
/** 渠道信息映射表 */
|
|
78
82
|
const channelInfoMap = {
|
|
79
83
|
'tempmail': { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
|
|
@@ -85,6 +89,8 @@ const channelInfoMap = {
|
|
|
85
89
|
'awamail': { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
|
|
86
90
|
'mail-tm': { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
|
|
87
91
|
'dropmail': { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
|
|
92
|
+
'guerrillamail': { channel: 'guerrillamail', name: 'Guerrilla Mail', website: 'guerrillamail.com' },
|
|
93
|
+
'maildrop': { channel: 'maildrop', name: 'Maildrop', website: 'maildrop.cc' },
|
|
88
94
|
};
|
|
89
95
|
/**
|
|
90
96
|
* 获取所有支持的渠道列表
|
|
@@ -157,6 +163,10 @@ async function generateEmailOnce(channel, options) {
|
|
|
157
163
|
return mailTm.generateEmail();
|
|
158
164
|
case 'dropmail':
|
|
159
165
|
return dropmail.generateEmail();
|
|
166
|
+
case 'guerrillamail':
|
|
167
|
+
return guerrillamail.generateEmail();
|
|
168
|
+
case 'maildrop':
|
|
169
|
+
return maildropProvider.generateEmail();
|
|
160
170
|
default:
|
|
161
171
|
throw new Error(`Unknown channel: ${channel}`);
|
|
162
172
|
}
|
|
@@ -247,6 +257,14 @@ async function getEmailsOnce(channel, email, token) {
|
|
|
247
257
|
if (!token)
|
|
248
258
|
throw new Error('Token is required for dropmail channel');
|
|
249
259
|
return dropmail.getEmails(token, email);
|
|
260
|
+
case 'guerrillamail':
|
|
261
|
+
if (!token)
|
|
262
|
+
throw new Error('Token is required for guerrillamail channel');
|
|
263
|
+
return guerrillamail.getEmails(token, email);
|
|
264
|
+
case 'maildrop':
|
|
265
|
+
if (!token)
|
|
266
|
+
throw new Error('Token is required for maildrop channel');
|
|
267
|
+
return maildropProvider.getEmails(token, email);
|
|
250
268
|
default:
|
|
251
269
|
throw new Error(`Unknown channel: ${channel}`);
|
|
252
270
|
}
|
|
@@ -312,4 +330,4 @@ exports.default = {
|
|
|
312
330
|
getEmails,
|
|
313
331
|
TempEmailClient,
|
|
314
332
|
};
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0VBLG9DQUVDO0FBUUQsd0NBRUM7QUFtQkQsc0NBT0M7QUF5REQsOEJBMkJDO0FBaE1ELCtEQUFpRDtBQUNqRCxzRUFBd0Q7QUFDeEQsc0VBQXdEO0FBQ3hELHlFQUEyRDtBQUMzRCxvRUFBc0Q7QUFDdEQscUVBQXVEO0FBQ3ZELDZEQUErQztBQUMvQyw0REFBOEM7QUFDOUMsK0RBQWlEO0FBRWpELG1DQUFrRDtBQUNsRCxxQ0FBa0M7QUFHbEMseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUN2QixpQ0FBb0U7QUFBM0Qsa0dBQUEsU0FBUyxPQUFBO0FBQUUseUdBQUEsZ0JBQWdCLE9BQUE7QUFDcEMsbUNBQTZGO0FBQXBGLGtHQUFBLFFBQVEsT0FBQTtBQUFjLHFHQUFBLFdBQVcsT0FBQTtBQUFFLHFHQUFBLFdBQVcsT0FBQTtBQUFFLG1HQUFBLFNBQVMsT0FBQTtBQUFFLGdHQUFBLE1BQU0sT0FBQTtBQUUxRSw0QkFBNEI7QUFDNUIsTUFBTSxTQUFTLEdBQUc7SUFDaEIsVUFBVSxFQUFFLFFBQVE7SUFDcEIsY0FBYyxFQUFFLFdBQVc7SUFDM0IsY0FBYyxFQUFFLFdBQVc7SUFDM0IsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixhQUFhLEVBQUUsVUFBVTtJQUN6QixjQUFjLEVBQUUsVUFBVTtJQUMxQixTQUFTLEVBQUUsT0FBTztJQUNsQixTQUFTLEVBQUUsTUFBTTtJQUNqQixVQUFVLEVBQUUsUUFBUTtDQUNyQixDQUFDO0FBRUYsMEJBQTBCO0FBQzFCLE1BQU0sV0FBVyxHQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUs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SSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO1lBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUFyQ0QsMENBcUNDO0FBRUQsa0JBQWU7SUFDYixZQUFZO0lBQ1osY0FBYztJQUNkLGFBQWE7SUFDYixTQUFTO0lBQ1QsZUFBZTtDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVtcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwnO1xuaW1wb3J0ICogYXMgbGluc2hpRW1haWwgZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLWVtYWlsJztcbmltcG9ydCAqIGFzIHRlbXBtYWlsTG9sIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsLWxvbCc7XG5pbXBvcnQgKiBhcyBjaGF0Z3B0T3JnVWsgZnJvbSAnLi9wcm92aWRlcnMvY2hhdGdwdC1vcmctdWsnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxMYSBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sYSc7XG5pbXBvcnQgKiBhcyB0ZW1wTWFpbElPIGZyb20gJy4vcHJvdmlkZXJzL3RlbXAtbWFpbC1pbyc7XG5pbXBvcnQgKiBhcyBhd2FtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2F3YW1haWwnO1xuaW1wb3J0ICogYXMgbWFpbFRtIGZyb20gJy4vcHJvdmlkZXJzL21haWwtdG0nO1xuaW1wb3J0ICogYXMgZHJvcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvZHJvcG1haWwnO1xuaW1wb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBFbWFpbCwgRW1haWxBdHRhY2htZW50LCBHZXRFbWFpbHNSZXN1bHQsIEdlbmVyYXRlRW1haWxPcHRpb25zLCBHZXRFbWFpbHNPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB3aXRoUmV0cnksIFJldHJ5T3B0aW9ucyB9IGZyb20gJy4vcmV0cnknO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi9ub3JtYWxpemUnO1xuZXhwb3J0IHsgd2l0aFJldHJ5LCBmZXRjaFdpdGhUaW1lb3V0LCBSZXRyeU9wdGlvbnMgfSBmcm9tICcuL3JldHJ5JztcbmV4cG9ydCB7IExvZ0xldmVsLCBMb2dIYW5kbGVyLCBzZXRMb2dMZXZlbCwgZ2V0TG9nTGV2ZWwsIHNldExvZ2dlciwgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG4vKiog5rig6YGT5ZCN56ew5YiwIHByb3ZpZGVyIOWunueOsOeahOaYoOWwhOihqCAqL1xuY29uc3QgcHJvdmlkZXJzID0ge1xuICAndGVtcG1haWwnOiB0ZW1wbWFpbCxcbiAgJ2xpbnNoaS1lbWFpbCc6IGxpbnNoaUVtYWlsLFxuICAndGVtcG1haWwtbG9sJzogdGVtcG1haWxMb2wsXG4gICdjaGF0Z3B0LW9yZy11ayc6IGNoYXRncHRPcmdVayxcbiAgJ3RlbXBtYWlsLWxhJzogdGVtcG1haWxMYSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHRlbXBNYWlsSU8sXG4gICdhd2FtYWlsJzogYXdhbWFpbCxcbiAgJ21haWwtdG0nOiBtYWlsVG0sXG4gICdkcm9wbWFpbCc6IGRyb3BtYWlsLFxufTtcblxuLyoqIOaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqO+8jOeUqOS6jumaj+acuumAieaLqeWSjOmBjeWOhiAqL1xuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11aycsICd0ZW1wbWFpbC1sYScsICd0ZW1wLW1haWwtaW8nLCAnYXdhbWFpbCcsICdtYWlsLXRtJywgJ2Ryb3BtYWlsJ107XG5cbi8qKlxuICog5rig6YGT5L+h5oGv77yM5YyF5ZCr5rig6YGT5qCH6K+G44CB5pi+56S65ZCN56ew5ZKM5a+55bqU572R56uZXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbEluZm8ge1xuICAvKiog5rig6YGT5qCH6K+GICovXG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIC8qKiDmuKDpgZPmmL7npLrlkI3np7AgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiog5a+55bqU55qE5Li05pe26YKu566x5pyN5Yqh572R56uZICovXG4gIHdlYnNpdGU6IHN0cmluZztcbn1cblxuLyoqIOa4oOmBk+S/oeaBr+aYoOWwhOihqCAqL1xuY29uc3QgY2hhbm5lbEluZm9NYXA6IFJlY29yZDxDaGFubmVsLCBDaGFubmVsSW5mbz4gPSB7XG4gICd0ZW1wbWFpbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsJywgbmFtZTogJ1RlbXBNYWlsJywgd2Vic2l0ZTogJ3RlbXBtYWlsLmluZycgfSxcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcbiAgJ3RlbXBtYWlsLWxvbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsLWxvbCcsIG5hbWU6ICdUZW1wTWFpbCBMT0wnLCB3ZWJzaXRlOiAndGVtcG1haWwubG9sJyB9LFxuICAnY2hhdGdwdC1vcmctdWsnOiB7IGNoYW5uZWw6ICdjaGF0Z3B0LW9yZy11aycsIG5hbWU6ICdDaGF0R1BUIE1haWwnLCB3ZWJzaXRlOiAnbWFpbC5jaGF0Z3B0Lm9yZy51aycgfSxcbiAgJ3RlbXBtYWlsLWxhJzogeyBjaGFubmVsOiAndGVtcG1haWwtbGEnLCBuYW1lOiAnVGVtcE1haWwgTEEnLCB3ZWJzaXRlOiAndGVtcG1haWwubGEnIH0sXG4gICd0ZW1wLW1haWwtaW8nOiB7IGNoYW5uZWw6ICd0ZW1wLW1haWwtaW8nLCBuYW1lOiAnVGVtcCBNYWlsIElPJywgd2Vic2l0ZTogJ3RlbXAtbWFpbC5pbycgfSxcbiAgJ2F3YW1haWwnOiB7IGNoYW5uZWw6ICdhd2FtYWlsJywgbmFtZTogJ0F3YU1haWwnLCB3ZWJzaXRlOiAnYXdhbWFpbC5jb20nIH0sXG4gICdtYWlsLXRtJzogeyBjaGFubmVsOiAnbWFpbC10bScsIG5hbWU6ICdNYWlsLnRtJywgd2Vic2l0ZTogJ21haWwudG0nIH0sXG4gICdkcm9wbWFpbCc6IHsgY2hhbm5lbDogJ2Ryb3BtYWlsJywgbmFtZTogJ0Ryb3BNYWlsJywgd2Vic2l0ZTogJ2Ryb3BtYWlsLm1lJyB9LFxufTtcblxuLyoqXG4gKiDojrflj5bmiYDmnInmlK/mjIHnmoTmuKDpgZPliJfooahcbiAqXG4gKiBAcmV0dXJucyDmiYDmnInmuKDpgZPnmoTkv6Hmga/mlbDnu4RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNoYW5uZWxzID0gbGlzdENoYW5uZWxzKCk7XG4gKiBjaGFubmVscy5mb3JFYWNoKGNoID0+IGNvbnNvbGUubG9nKGAke2NoLm5hbWV9ICgke2NoLndlYnNpdGV9KWApKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xuICByZXR1cm4gYWxsQ2hhbm5lbHMubWFwKGNoID0+IGNoYW5uZWxJbmZvTWFwW2NoXSk7XG59XG5cbi8qKlxuICog6I635Y+W5oyH5a6a5rig6YGT55qE6K+m57uG5L+h5oGvXG4gKlxuICogQHBhcmFtIGNoYW5uZWwgLSDmuKDpgZPmoIfor4ZcbiAqIEByZXR1cm5zIOa4oOmBk+S/oeaBr++8jOS4jeWtmOWcqOaXtui/lOWbniB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxJbmZvKGNoYW5uZWw6IENoYW5uZWwpOiBDaGFubmVsSW5mbyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjaGFubmVsSW5mb01hcFtjaGFubmVsXTtcbn1cblxuLyoqXG4gKiDliJvlu7rkuLTml7bpgq7nrrFcbiAqXG4gKiDplJnor6/lpITnkIbnrZbnlaXvvJpcbiAqIC0g572R57uc6ZSZ6K+v44CB6LaF5pe244CB5pyN5Yqh56uvIDV4eCDplJnor68g4oaSIOiHquWKqOmHjeivle+8iOm7mOiupCAyIOasoe+8jOaMh+aVsOmAgOmBv++8iVxuICogLSA0eHgg5a6i5oi356uv6ZSZ6K+v44CB5Y+C5pWw6ZSZ6K+vIOKGkiDnm7TmjqXmipvlh7rlvILluLhcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIOWIm+W7uumAiemhue+8jOWPr+aMh+Wumua4oOmBk+OAgeacieaViOaXtumVv+OAgeWfn+WQjeetiVxuICogQHJldHVybnMg6YKu566x5L+h5oGv77yM5YyF5ZCr5Zyw5Z2A44CB5Luk54mM562JXG4gKiBAdGhyb3dzIOmHjeivleiAl+WwveWQjuS7jeWksei0peaXtuaKm+WHuuW8guW4uFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZW1haWxJbmZvID0gYXdhaXQgZ2VuZXJhdGVFbWFpbCh7IGNoYW5uZWw6ICd0ZW1wLW1haWwtaW8nIH0pO1xuICogY29uc29sZS5sb2coZW1haWxJbmZvLmVtYWlsKTsgLy8g5Li05pe26YKu566x5Zyw5Z2AXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWwob3B0aW9uczogR2VuZXJhdGVFbWFpbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIGNvbnN0IGNoYW5uZWwgPSBvcHRpb25zLmNoYW5uZWwgfHwgYWxsQ2hhbm5lbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsQ2hhbm5lbHMubGVuZ3RoKV07XG5cbiAgbG9nZ2VyLmluZm8oYOWIm+W7uuS4tOaXtumCrueusSwg5rig6YGTOiAke2NoYW5uZWx9YCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsLCBvcHRpb25zKSwgb3B0aW9ucy5yZXRyeSk7XG4gIGxvZ2dlci5pbmZvKGDpgq7nrrHliJvlu7rmiJDlip86ICR7cmVzdWx0LmVtYWlsfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIOWNleasoeWIm+W7uumCrueuse+8iOS4jeWQq+mHjeivlemAu+i+ke+8iVxuICog5qC55o2u5rig6YGT57G75Z6L5YiG5Y+R5Yiw5a+55bqU55qEIHByb3ZpZGVyIOWunueOsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsOiBDaGFubmVsLCBvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgJ3RlbXBtYWlsJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZHVyYXRpb24gfHwgMzApO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICByZXR1cm4gbGluc2hpRW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxvbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiB8fCBudWxsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1sYSc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMYS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcC1tYWlsLWlvJzpcbiAgICAgIHJldHVybiB0ZW1wTWFpbElPLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdhd2FtYWlsJzpcbiAgICAgIHJldHVybiBhd2FtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsLXRtJzpcbiAgICAgIHJldHVybiBtYWlsVG0uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIHJldHVybiBkcm9wbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqXG4gKiDplJnor6/lpITnkIbnrZbnlaXvvJpcbiAqIC0g572R57uc6ZSZ6K+v44CB6LaF5pe244CB5pyN5Yqh56uvIDV4eCDplJnor68g4oaSIOiHquWKqOmHjeivle+8iOm7mOiupCAyIOasoe+8iVxuICogLSDph43or5XogJflsL3lkI7ov5Tlm54geyBzdWNjZXNzOiBmYWxzZSwgZW1haWxzOiBbXSB977yM5LiN5oqb5byC5bi4XG4gKiAtIOWPguaVsOagoemqjOmUmeivr++8iOe8uuWwkSBjaGFubmVsIC8gdG9rZW7vvInnm7TmjqXmipvlh7pcbiAqXG4gKiDov5nnp43orr7orqHorqnosIPnlKjmlrnlnKjova7or6LlnLrmma/kuIvkuI3kvJrlm6DnvZHnu5zms6LliqjogIzkuK3mlq3mlbTkuKrmtYHnqIvvvIxcbiAqIOWPqumcgOajgOafpSBzdWNjZXNzIOWtl+auteWNs+WPr+WIpOaWreacrOasoeivt+axguaYr+WQpuaIkOWKn+OAglxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0g6I635Y+W6YCJ6aG577yM5YyF5ZCr5rig6YGT44CB6YKu566x5Zyw5Z2A44CB5Luk54mMXG4gKiBAcmV0dXJucyDpgq7ku7bnu5PmnpzvvIzljIXlkKsgc3VjY2VzcyDmoIforrDlkozpgq7ku7bliJfooahcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEVtYWlscyh7XG4gKiAgIGNoYW5uZWw6IGVtYWlsSW5mby5jaGFubmVsLFxuICogICBlbWFpbDogZW1haWxJbmZvLmVtYWlsLFxuICogICB0b2tlbjogZW1haWxJbmZvLnRva2VuLFxuICogfSk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlsc1swXS5zdWJqZWN0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKG9wdGlvbnM6IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcblxuICBpZiAoIWNoYW5uZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYW5uZWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAoIWVtYWlsICYmIGNoYW5uZWwgIT09ICd0ZW1wbWFpbC1sb2wnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGDojrflj5bpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfSwg6YKu566xOiAke2VtYWlsfWApO1xuICB0cnkge1xuICAgIGNvbnN0IGVtYWlscyA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZXRFbWFpbHNPbmNlKGNoYW5uZWwsIGVtYWlsLCB0b2tlbiksIG9wdGlvbnMucmV0cnkpO1xuICAgIGlmIChlbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYOiOt+WPluWIsCAke2VtYWlscy5sZW5ndGh9IOWwgemCruS7tiwg5rig6YGTOiAke2NoYW5uZWx9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyhg5pqC5peg6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY2hhbm5lbCwgZW1haWwsIGVtYWlscywgc3VjY2VzczogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIC8qXG4gICAgICog6YeN6K+V6ICX5bC95ZCO5LuN54S25aSx6LSlIOKGkiDov5Tlm57nqbrnu5PmnpzogIzpnZ7mipvlvILluLhcbiAgICAgKiDov5nmoLfosIPnlKjmlrnlnKjova7or6LlnLrmma/kuIvkuI3kvJrlm6DkuLrkuIDmrKHnvZHnu5zms6LliqjogIzkuK3mlq3mlbTkuKrmtYHnqItcbiAgICAgKi9cbiAgICBsb2dnZXIuZXJyb3IoYOiOt+WPlumCruS7tuWksei0pSwg5rig6YGTOiAke2NoYW5uZWx9LCDplJnor686ICR7ZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuICAgIHJldHVybiB7IGNoYW5uZWwsIGVtYWlsLCBlbWFpbHM6IFtdLCBzdWNjZXNzOiBmYWxzZSB9O1xuICB9XG59XG5cbi8qKlxuICog5Y2V5qyh6I635Y+W6YKu5Lu277yI5LiN5ZCr6YeN6K+V6YC76L6R77yJXG4gKiDmoLnmja7muKDpgZPnsbvlnovliIblj5HliLDlr7nlupTnmoQgcHJvdmlkZXIg5a6e546w77yM5bm25qCh6aqM5b+F6ZyA55qEIHRva2VuIOWPguaVsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFbWFpbHNPbmNlKGNoYW5uZWw6IENoYW5uZWwsIGVtYWlsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogUHJvbWlzZTxFbWFpbFtdPiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgJ3RlbXBtYWlsJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICByZXR1cm4gbGluc2hpRW1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1sb2wnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgdGVtcG1haWwtbG9sIGNoYW5uZWwnKTtcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAndGVtcG1haWwtbGEnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsTGEuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICdhd2FtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIGF3YW1haWwgY2hhbm5lbCcpO1xuICAgICAgcmV0dXJuIGF3YW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnbWFpbC10bSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsLXRtIGNoYW5uZWwnKTtcbiAgICAgIHJldHVybiBtYWlsVG0uZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZHJvcG1haWwgY2hhbm5lbCcpO1xuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2hhbm5lbDogJHtjaGFubmVsfWApO1xuICB9XG59XG5cbi8qKlxuICog5Li05pe26YKu566x5a6i5oi356uvXG4gKiDlsIHoo4Xkuobpgq7nrrHliJvlu7rlkozpgq7ku7bojrflj5bnmoTlrozmlbTmtYHnqIvvvIzoh6rliqjnrqHnkIbpgq7nrrHkv6Hmga/lkozorqTor4Hku6TniYxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBUZW1wRW1haWxDbGllbnQoKTtcbiAqIGNvbnN0IGVtYWlsSW5mbyA9IGF3YWl0IGNsaWVudC5nZW5lcmF0ZSh7IGNoYW5uZWw6ICdtYWlsLXRtJyB9KTtcbiAqIGNvbnNvbGUubG9nKCfpgq7nrrE6JywgZW1haWxJbmZvLmVtYWlsKTtcbiAqXG4gKiAvLyDova7or6Lojrflj5bpgq7ku7ZcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5nZXRFbWFpbHMoKTtcbiAqIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICogICBjb25zb2xlLmxvZygn6YKu5Lu25pWwOicsIHJlc3VsdC5lbWFpbHMubGVuZ3RoKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVGVtcEVtYWlsQ2xpZW50IHtcbiAgcHJpdmF0ZSBlbWFpbEluZm86IEVtYWlsSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiDliJvlu7rkuLTml7bpgq7nrrHlubbnvJPlrZjpgq7nrrHkv6Hmga9cbiAgICog5ZCO57ut6LCD55SoIGdldEVtYWlscygpIOaXtuiHquWKqOS9v+eUqOatpOmCrueuseeahOa4oOmBk+OAgeWcsOWdgOWSjOS7pOeJjFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUob3B0aW9uczogR2VuZXJhdGVFbWFpbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8RW1haWxJbmZvPiB7XG4gICAgdGhpcy5lbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmVtYWlsSW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgq7nrrHnmoTpgq7ku7bliJfooahcbiAgICog5b+F6aG75YWI6LCD55SoIGdlbmVyYXRlKCkg5Yib5bu66YKu566xXG4gICAqXG4gICAqIEB0aHJvd3Mg5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe25oqb5Ye65byC5bi4XG4gICAqL1xuICBhc3luYyBnZXRFbWFpbHMoKTogUHJvbWlzZTxHZXRFbWFpbHNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuZW1haWxJbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVtYWlsIGdlbmVyYXRlZC4gQ2FsbCBnZW5lcmF0ZSgpIGZpcnN0LicpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRFbWFpbHMoe1xuICAgICAgY2hhbm5lbDogdGhpcy5lbWFpbEluZm8uY2hhbm5lbCxcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsSW5mby5lbWFpbCxcbiAgICAgIHRva2VuOiB0aGlzLmVtYWlsSW5mby50b2tlbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nvJPlrZjnmoTpgq7nrrHkv6Hmga9cbiAgICog5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGdldEVtYWlsSW5mbygpOiBFbWFpbEluZm8gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBsaXN0Q2hhbm5lbHMsXG4gIGdldENoYW5uZWxJbmZvLFxuICBnZW5lcmF0ZUVtYWlsLFxuICBnZXRFbWFpbHMsXG4gIFRlbXBFbWFpbENsaWVudCxcbn07XG4iXX0=
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEVBLG9DQUVDO0FBUUQsd0NBRUM7QUFtQkQsc0NBT0M7QUE2REQsOEJBMkJDO0FBMU1ELCtEQUFpRDtBQUNqRCxzRUFBd0Q7QUFDeEQsc0VBQXdEO0FBQ3hELHlFQUEyRDtBQUMzRCxvRUFBc0Q7QUFDdEQscUVBQXVEO0FBQ3ZELDZEQUErQztBQUMvQyw0REFBOEM7QUFDOUMsK0RBQWlEO0FBQ2pELHlFQUEyRDtBQUMzRCx1RUFBeUQ7QUFFekQsbUNBQWtEO0FBQ2xELHFDQUFrQztBQUdsQyx5Q0FBNkM7QUFBcEMsMkdBQUEsY0FBYyxPQUFBO0FBQ3ZCLGlDQUFvRTtBQUEzRCxrR0FBQSxTQUFTLE9BQUE7QUFBRSx5R0FBQSxnQkFBZ0IsT0FBQTtBQUNwQyxtQ0FBNkY7QUFBcEYsa0dBQUEsUUFBUSxPQUFBO0FBQWMscUdBQUEsV0FBVyxPQUFBO0FBQUUscUdBQUEsV0FBVyxPQUFBO0FBQUUsbUdBQUEsU0FBUyxPQUFBO0FBQUUsZ0dBQUEsTUFBTSxPQUFBO0FBRTFFLDRCQUE0QjtBQUM1QixNQUFNLFNBQVMsR0FBRztJQUNoQixVQUFVLEVBQUUsUUFBUTtJQUNwQixjQUFjLEVBQUUsV0FBVztJQUMzQixjQUFjLEVBQUUsV0FBVztJQUMzQixnQkFBZ0IsRUFBRSxZQUFZO0lBQzlCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLGNBQWMsRUFBRSxVQUFVO0lBQzFCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLGVBQWUsRUFBRSxhQUFhO0lBQzlCLFVBQVUsRUFBRSxnQkFBZ0I7Q0FDN0IsQ0FBQztBQUVGLDBCQUEwQjtBQUMxQixNQUFNLFdBQVcsR0FBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVB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Q0FBQztDQUNGO0FBckNELDBDQXFDQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBtYWlsIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaUVtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2xpbnNoaS1lbWFpbCc7XG5pbXBvcnQgKiBhcyB0ZW1wbWFpbExvbCBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sb2wnO1xuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcbmltcG9ydCAqIGFzIHRlbXBtYWlsTGEgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbGEnO1xuaW1wb3J0ICogYXMgdGVtcE1haWxJTyBmcm9tICcuL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8nO1xuaW1wb3J0ICogYXMgYXdhbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9hd2FtYWlsJztcbmltcG9ydCAqIGFzIG1haWxUbSBmcm9tICcuL3Byb3ZpZGVycy9tYWlsLXRtJztcbmltcG9ydCAqIGFzIGRyb3BtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2Ryb3BtYWlsJztcbmltcG9ydCAqIGFzIGd1ZXJyaWxsYW1haWwgZnJvbSAnLi9wcm92aWRlcnMvZ3VlcnJpbGxhbWFpbCc7XG5pbXBvcnQgKiBhcyBtYWlsZHJvcFByb3ZpZGVyIGZyb20gJy4vcHJvdmlkZXJzL21haWxkcm9wJztcbmltcG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEVtYWlsQXR0YWNobWVudCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFJldHJ5LCBSZXRyeU9wdGlvbnMgfSBmcm9tICcuL3JldHJ5JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBFbWFpbCwgRW1haWxBdHRhY2htZW50LCBHZXRFbWFpbHNSZXN1bHQsIEdlbmVyYXRlRW1haWxPcHRpb25zLCBHZXRFbWFpbHNPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4vbm9ybWFsaXplJztcbmV4cG9ydCB7IHdpdGhSZXRyeSwgZmV0Y2hXaXRoVGltZW91dCwgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi9yZXRyeSc7XG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nSGFuZGxlciwgc2V0TG9nTGV2ZWwsIGdldExvZ0xldmVsLCBzZXRMb2dnZXIsIGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLyoqIOa4oOmBk+WQjeensOWIsCBwcm92aWRlciDlrp7njrDnmoTmmKDlsITooaggKi9cbmNvbnN0IHByb3ZpZGVycyA9IHtcbiAgJ3RlbXBtYWlsJzogdGVtcG1haWwsXG4gICdsaW5zaGktZW1haWwnOiBsaW5zaGlFbWFpbCxcbiAgJ3RlbXBtYWlsLWxvbCc6IHRlbXBtYWlsTG9sLFxuICAnY2hhdGdwdC1vcmctdWsnOiBjaGF0Z3B0T3JnVWssXG4gICd0ZW1wbWFpbC1sYSc6IHRlbXBtYWlsTGEsXG4gICd0ZW1wLW1haWwtaW8nOiB0ZW1wTWFpbElPLFxuICAnYXdhbWFpbCc6IGF3YW1haWwsXG4gICdtYWlsLXRtJzogbWFpbFRtLFxuICAnZHJvcG1haWwnOiBkcm9wbWFpbCxcbiAgJ2d1ZXJyaWxsYW1haWwnOiBndWVycmlsbGFtYWlsLFxuICAnbWFpbGRyb3AnOiBtYWlsZHJvcFByb3ZpZGVyLFxufTtcblxuLyoqIOaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqO+8jOeUqOS6jumaj+acuumAieaLqeWSjOmBjeWOhiAqL1xuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11aycsICd0ZW1wbWFpbC1sYScsICd0ZW1wLW1haWwtaW8nLCAnYXdhbWFpbCcsICdtYWlsLXRtJywgJ2Ryb3BtYWlsJywgJ2d1ZXJyaWxsYW1haWwnLCAnbWFpbGRyb3AnXTtcblxuLyoqXG4gKiDmuKDpgZPkv6Hmga/vvIzljIXlkKvmuKDpgZPmoIfor4bjgIHmmL7npLrlkI3np7Dlkozlr7nlupTnvZHnq5lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XG4gIC8qKiDmuKDpgZPmoIfor4YgKi9cbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgLyoqIOa4oOmBk+aYvuekuuWQjeensCAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiDlr7nlupTnmoTkuLTml7bpgq7nrrHmnI3liqHnvZHnq5kgKi9cbiAgd2Vic2l0ZTogc3RyaW5nO1xufVxuXG4vKiog5rig6YGT5L+h5oGv5pig5bCE6KGoICovXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcbiAgJ3RlbXBtYWlsJzogeyBjaGFubmVsOiAndGVtcG1haWwnLCBuYW1lOiAnVGVtcE1haWwnLCB3ZWJzaXRlOiAndGVtcG1haWwuaW5nJyB9LFxuICAnbGluc2hpLWVtYWlsJzogeyBjaGFubmVsOiAnbGluc2hpLWVtYWlsJywgbmFtZTogJ+S4tOaXtumCrueusScsIHdlYnNpdGU6ICdsaW5zaGktZW1haWwuY29tJyB9LFxuICAndGVtcG1haWwtbG9sJzogeyBjaGFubmVsOiAndGVtcG1haWwtbG9sJywgbmFtZTogJ1RlbXBNYWlsIExPTCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sb2wnIH0sXG4gICdjaGF0Z3B0LW9yZy11ayc6IHsgY2hhbm5lbDogJ2NoYXRncHQtb3JnLXVrJywgbmFtZTogJ0NoYXRHUFQgTWFpbCcsIHdlYnNpdGU6ICdtYWlsLmNoYXRncHQub3JnLnVrJyB9LFxuICAndGVtcG1haWwtbGEnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1sYScsIG5hbWU6ICdUZW1wTWFpbCBMQScsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sYScgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ21haWwtdG0nOiB7IGNoYW5uZWw6ICdtYWlsLXRtJywgbmFtZTogJ01haWwudG0nLCB3ZWJzaXRlOiAnbWFpbC50bScgfSxcbiAgJ2Ryb3BtYWlsJzogeyBjaGFubmVsOiAnZHJvcG1haWwnLCBuYW1lOiAnRHJvcE1haWwnLCB3ZWJzaXRlOiAnZHJvcG1haWwubWUnIH0sXG4gICdndWVycmlsbGFtYWlsJzogeyBjaGFubmVsOiAnZ3VlcnJpbGxhbWFpbCcsIG5hbWU6ICdHdWVycmlsbGEgTWFpbCcsIHdlYnNpdGU6ICdndWVycmlsbGFtYWlsLmNvbScgfSxcbiAgJ21haWxkcm9wJzogeyBjaGFubmVsOiAnbWFpbGRyb3AnLCBuYW1lOiAnTWFpbGRyb3AnLCB3ZWJzaXRlOiAnbWFpbGRyb3AuY2MnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICpcbiAqIEByZXR1cm5zIOaJgOaciea4oOmBk+eahOS/oeaBr+aVsOe7hFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY2hhbm5lbHMgPSBsaXN0Q2hhbm5lbHMoKTtcbiAqIGNoYW5uZWxzLmZvckVhY2goY2ggPT4gY29uc29sZS5sb2coYCR7Y2gubmFtZX0gKCR7Y2gud2Vic2l0ZX0pYCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q2hhbm5lbHMoKTogQ2hhbm5lbEluZm9bXSB7XG4gIHJldHVybiBhbGxDaGFubmVscy5tYXAoY2ggPT4gY2hhbm5lbEluZm9NYXBbY2hdKTtcbn1cblxuLyoqXG4gKiDojrflj5bmjIflrprmuKDpgZPnmoTor6bnu4bkv6Hmga9cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbCAtIOa4oOmBk+agh+ivhlxuICogQHJldHVybnMg5rig6YGT5L+h5oGv77yM5LiN5a2Y5Zyo5pe26L+U5ZueIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbm5lbEluZm8oY2hhbm5lbDogQ2hhbm5lbCk6IENoYW5uZWxJbmZvIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNoYW5uZWxJbmZvTWFwW2NoYW5uZWxdO1xufVxuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueusVxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDnvZHnu5zplJnor6/jgIHotoXml7bjgIHmnI3liqHnq68gNXh4IOmUmeivryDihpIg6Ieq5Yqo6YeN6K+V77yI6buY6K6kIDIg5qyh77yM5oyH5pWw6YCA6YG/77yJXG4gKiAtIDR4eCDlrqLmiLfnq6/plJnor6/jgIHlj4LmlbDplJnor68g4oaSIOebtOaOpeaKm+WHuuW8guW4uFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0g5Yib5bu66YCJ6aG577yM5Y+v5oyH5a6a5rig6YGT44CB5pyJ5pWI5pe26ZW/44CB5Z+f5ZCN562JXG4gKiBAcmV0dXJucyDpgq7nrrHkv6Hmga/vvIzljIXlkKvlnLDlnYDjgIHku6TniYznrYlcbiAqIEB0aHJvd3Mg6YeN6K+V6ICX5bC95ZCO5LuN5aSx6LSl5pe25oqb5Ye65byC5bi4XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycgfSk7XG4gKiBjb25zb2xlLmxvZyhlbWFpbEluZm8uZW1haWwpOyAvLyDkuLTml7bpgq7nrrHlnLDlnYBcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFbWFpbChvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8+IHtcbiAgY29uc3QgY2hhbm5lbCA9IG9wdGlvbnMuY2hhbm5lbCB8fCBhbGxDaGFubmVsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGxDaGFubmVscy5sZW5ndGgpXTtcblxuICBsb2dnZXIuaW5mbyhg5Yib5bu65Li05pe26YKu566xLCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdlbmVyYXRlRW1haWxPbmNlKGNoYW5uZWwsIG9wdGlvbnMpLCBvcHRpb25zLnJldHJ5KTtcbiAgbG9nZ2VyLmluZm8oYOmCrueuseWIm+W7uuaIkOWKnzogJHtyZXN1bHQuZW1haWx9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICog5Y2V5qyh5Yib5bu66YKu566x77yI5LiN5ZCr6YeN6K+V6YC76L6R77yJXG4gKiDmoLnmja7muKDpgZPnsbvlnovliIblj5HliLDlr7nlupTnmoQgcHJvdmlkZXIg5a6e546wXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWxPbmNlKGNoYW5uZWw6IENoYW5uZWwsIG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zKTogUHJvbWlzZTxFbWFpbEluZm8+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluIHx8IG51bGwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxhJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExhLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgcmV0dXJuIG1haWxUbS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdndWVycmlsbGFtYWlsJzpcbiAgICAgIHJldHVybiBndWVycmlsbGFtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsZHJvcCc6XG4gICAgICByZXR1cm4gbWFpbGRyb3BQcm92aWRlci5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqXG4gKiDplJnor6/lpITnkIbnrZbnlaXvvJpcbiAqIC0g572R57uc6ZSZ6K+v44CB6LaF5pe244CB5pyN5Yqh56uvIDV4eCDplJnor68g4oaSIOiHquWKqOmHjeivle+8iOm7mOiupCAyIOasoe+8iVxuICogLSDph43or5XogJflsL3lkI7ov5Tlm54geyBzdWNjZXNzOiBmYWxzZSwgZW1haWxzOiBbXSB977yM5LiN5oqb5byC5bi4XG4gKiAtIOWPguaVsOagoemqjOmUmeivr++8iOe8uuWwkSBjaGFubmVsIC8gdG9rZW7vvInnm7TmjqXmipvlh7pcbiAqXG4gKiDov5nnp43orr7orqHorqnosIPnlKjmlrnlnKjova7or6LlnLrmma/kuIvkuI3kvJrlm6DnvZHnu5zms6LliqjogIzkuK3mlq3mlbTkuKrmtYHnqIvvvIxcbiAqIOWPqumcgOajgOafpSBzdWNjZXNzIOWtl+auteWNs+WPr+WIpOaWreacrOasoeivt+axguaYr+WQpuaIkOWKn+OAglxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0g6I635Y+W6YCJ6aG577yM5YyF5ZCr5rig6YGT44CB6YKu566x5Zyw5Z2A44CB5Luk54mMXG4gKiBAcmV0dXJucyDpgq7ku7bnu5PmnpzvvIzljIXlkKsgc3VjY2VzcyDmoIforrDlkozpgq7ku7bliJfooahcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEVtYWlscyh7XG4gKiAgIGNoYW5uZWw6IGVtYWlsSW5mby5jaGFubmVsLFxuICogICBlbWFpbDogZW1haWxJbmZvLmVtYWlsLFxuICogICB0b2tlbjogZW1haWxJbmZvLnRva2VuLFxuICogfSk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlsc1swXS5zdWJqZWN0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKG9wdGlvbnM6IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcblxuICBpZiAoIWNoYW5uZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYW5uZWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAoIWVtYWlsICYmIGNoYW5uZWwgIT09ICd0ZW1wbWFpbC1sb2wnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGDojrflj5bpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfSwg6YKu566xOiAke2VtYWlsfWApO1xuICB0cnkge1xuICAgIGNvbnN0IGVtYWlscyA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZXRFbWFpbHNPbmNlKGNoYW5uZWwsIGVtYWlsLCB0b2tlbiksIG9wdGlvbnMucmV0cnkpO1xuICAgIGlmIChlbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYOiOt+WPluWIsCAke2VtYWlscy5sZW5ndGh9IOWwgemCruS7tiwg5rig6YGTOiAke2NoYW5uZWx9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyhg5pqC5peg6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY2hhbm5lbCwgZW1haWwsIGVtYWlscywgc3VjY2VzczogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIC8qXG4gICAgICog6YeN6K+V6ICX5bC95ZCO5LuN54S25aSx6LSlIOKGkiDov5Tlm57nqbrnu5PmnpzogIzpnZ7mipvlvILluLhcbiAgICAgKiDov5nmoLfosIPnlKjmlrnlnKjova7or6LlnLrmma/kuIvkuI3kvJrlm6DkuLrkuIDmrKHnvZHnu5zms6LliqjogIzkuK3mlq3mlbTkuKrmtYHnqItcbiAgICAgKi9cbiAgICBsb2dnZXIuZXJyb3IoYOiOt+WPlumCruS7tuWksei0pSwg5rig6YGTOiAke2NoYW5uZWx9LCDplJnor686ICR7ZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuICAgIHJldHVybiB7IGNoYW5uZWwsIGVtYWlsLCBlbWFpbHM6IFtdLCBzdWNjZXNzOiBmYWxzZSB9O1xuICB9XG59XG5cbi8qKlxuICog5Y2V5qyh6I635Y+W6YKu5Lu277yI5LiN5ZCr6YeN6K+V6YC76L6R77yJXG4gKiDmoLnmja7muKDpgZPnsbvlnovliIblj5HliLDlr7nlupTnmoQgcHJvdmlkZXIg5a6e546w77yM5bm25qCh6aqM5b+F6ZyA55qEIHRva2VuIOWPguaVsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFbWFpbHNPbmNlKGNoYW5uZWw6IENoYW5uZWwsIGVtYWlsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogUHJvbWlzZTxFbWFpbFtdPiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgJ3RlbXBtYWlsJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICByZXR1cm4gbGluc2hpRW1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1sb2wnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgdGVtcG1haWwtbG9sIGNoYW5uZWwnKTtcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAndGVtcG1haWwtbGEnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsTGEuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICdhd2FtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIGF3YW1haWwgY2hhbm5lbCcpO1xuICAgICAgcmV0dXJuIGF3YW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnbWFpbC10bSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsLXRtIGNoYW5uZWwnKTtcbiAgICAgIHJldHVybiBtYWlsVG0uZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZHJvcG1haWwgY2hhbm5lbCcpO1xuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2d1ZXJyaWxsYW1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZ3VlcnJpbGxhbWFpbCBjaGFubmVsJyk7XG4gICAgICByZXR1cm4gZ3VlcnJpbGxhbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdtYWlsZHJvcCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsZHJvcCBjaGFubmVsJyk7XG4gICAgICByZXR1cm4gbWFpbGRyb3BQcm92aWRlci5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIOS4tOaXtumCrueuseWuouaIt+err1xuICog5bCB6KOF5LqG6YKu566x5Yib5bu65ZKM6YKu5Lu26I635Y+W55qE5a6M5pW05rWB56iL77yM6Ieq5Yqo566h55CG6YKu566x5L+h5oGv5ZKM6K6k6K+B5Luk54mMXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBjbGllbnQgPSBuZXcgVGVtcEVtYWlsQ2xpZW50KCk7XG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBjbGllbnQuZ2VuZXJhdGUoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zb2xlLmxvZygn6YKu566xOicsIGVtYWlsSW5mby5lbWFpbCk7XG4gKlxuICogLy8g6L2u6K+i6I635Y+W6YKu5Lu2XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuZ2V0RW1haWxzKCk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAqICAgY29uc29sZS5sb2coJ+mCruS7tuaVsDonLCByZXN1bHQuZW1haWxzLmxlbmd0aCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBFbWFpbENsaWVudCB7XG4gIHByaXZhdGUgZW1haWxJbmZvOiBFbWFpbEluZm8gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICog5Yib5bu65Li05pe26YKu566x5bm257yT5a2Y6YKu566x5L+h5oGvXG4gICAqIOWQjue7reiwg+eUqCBnZXRFbWFpbHMoKSDml7boh6rliqjkvb/nlKjmraTpgq7nrrHnmoTmuKDpgZPjgIHlnLDlnYDlkozku6TniYxcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xuICAgIHRoaXMuZW1haWxJbmZvID0gYXdhaXQgZ2VuZXJhdGVFbWFpbChvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6YKu566x55qE6YKu5Lu25YiX6KGoXG4gICAqIOW/hemhu+WFiOiwg+eUqCBnZW5lcmF0ZSgpIOWIm+W7uumCrueusVxuICAgKlxuICAgKiBAdGhyb3dzIOacquiwg+eUqCBnZW5lcmF0ZSgpIOaXtuaKm+WHuuW8guW4uFxuICAgKi9cbiAgYXN5bmMgZ2V0RW1haWxzKCk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHtcbiAgICAgIGNoYW5uZWw6IHRoaXMuZW1haWxJbmZvLmNoYW5uZWwsXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbEluZm8uZW1haWwsXG4gICAgICB0b2tlbjogdGhpcy5lbWFpbEluZm8udG9rZW4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN57yT5a2Y55qE6YKu566x5L+h5oGvXG4gICAqIOacquiwg+eUqCBnZW5lcmF0ZSgpIOaXtui/lOWbniBudWxsXG4gICAqL1xuICBnZXRFbWFpbEluZm8oKTogRW1haWxJbmZvIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbGlzdENoYW5uZWxzLFxuICBnZXRDaGFubmVsSW5mbyxcbiAgZ2VuZXJhdGVFbWFpbCxcbiAgZ2V0RW1haWxzLFxuICBUZW1wRW1haWxDbGllbnQsXG59O1xuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guerrilla Mail 渠道实现
|
|
3
|
+
* API 文档: https://www.guerrillamail.com/GuerrillaMailAPI.html
|
|
4
|
+
*
|
|
5
|
+
* 特点:
|
|
6
|
+
* - 无需认证,公开 JSON API
|
|
7
|
+
* - 通过 sid_token 维持会话
|
|
8
|
+
* - 邮箱有效期 60 分钟
|
|
9
|
+
*/
|
|
10
|
+
import { EmailInfo, Email } from '../types';
|
|
11
|
+
/**
|
|
12
|
+
* 创建临时邮箱
|
|
13
|
+
* API: GET ajax.php?f=get_email_address
|
|
14
|
+
* 返回 email_addr + sid_token(用于后续获取邮件)
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateEmail(): Promise<EmailInfo>;
|
|
17
|
+
/**
|
|
18
|
+
* 获取邮件列表
|
|
19
|
+
* API: GET ajax.php?f=check_email&seq=0&sid_token=xxx
|
|
20
|
+
* 返回 list 数组,每个元素包含 mail_id, mail_from, mail_subject, mail_body 等
|
|
21
|
+
*/
|
|
22
|
+
export declare function getEmails(token: string, email: string): Promise<Email[]>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Guerrilla Mail 渠道实现
|
|
4
|
+
* API 文档: https://www.guerrillamail.com/GuerrillaMailAPI.html
|
|
5
|
+
*
|
|
6
|
+
* 特点:
|
|
7
|
+
* - 无需认证,公开 JSON API
|
|
8
|
+
* - 通过 sid_token 维持会话
|
|
9
|
+
* - 邮箱有效期 60 分钟
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.generateEmail = generateEmail;
|
|
13
|
+
exports.getEmails = getEmails;
|
|
14
|
+
const normalize_1 = require("../normalize");
|
|
15
|
+
const CHANNEL = 'guerrillamail';
|
|
16
|
+
const BASE_URL = 'https://api.guerrillamail.com/ajax.php';
|
|
17
|
+
/**
|
|
18
|
+
* 创建临时邮箱
|
|
19
|
+
* API: GET ajax.php?f=get_email_address
|
|
20
|
+
* 返回 email_addr + sid_token(用于后续获取邮件)
|
|
21
|
+
*/
|
|
22
|
+
async function generateEmail() {
|
|
23
|
+
const response = await fetch(`${BASE_URL}?f=get_email_address&lang=en`, {
|
|
24
|
+
method: 'GET',
|
|
25
|
+
headers: {
|
|
26
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`Failed to generate email: ${response.status}`);
|
|
31
|
+
}
|
|
32
|
+
const data = await response.json();
|
|
33
|
+
if (!data.email_addr || !data.sid_token) {
|
|
34
|
+
throw new Error('Failed to generate email: missing email_addr or sid_token');
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
channel: CHANNEL,
|
|
38
|
+
email: data.email_addr,
|
|
39
|
+
token: data.sid_token,
|
|
40
|
+
expiresAt: data.email_timestamp ? (data.email_timestamp + 3600) * 1000 : undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 获取邮件列表
|
|
45
|
+
* API: GET ajax.php?f=check_email&seq=0&sid_token=xxx
|
|
46
|
+
* 返回 list 数组,每个元素包含 mail_id, mail_from, mail_subject, mail_body 等
|
|
47
|
+
*/
|
|
48
|
+
async function getEmails(token, email) {
|
|
49
|
+
const response = await fetch(`${BASE_URL}?f=check_email&seq=0&sid_token=${encodeURIComponent(token)}`, {
|
|
50
|
+
method: 'GET',
|
|
51
|
+
headers: {
|
|
52
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(`Failed to get emails: ${response.status}`);
|
|
57
|
+
}
|
|
58
|
+
const data = await response.json();
|
|
59
|
+
const list = Array.isArray(data.list) ? data.list : [];
|
|
60
|
+
return list.map((item) => (0, normalize_1.normalizeEmail)({
|
|
61
|
+
id: item.mail_id,
|
|
62
|
+
from: item.mail_from,
|
|
63
|
+
to: email,
|
|
64
|
+
subject: item.mail_subject,
|
|
65
|
+
text: item.mail_body || item.mail_excerpt || '',
|
|
66
|
+
html: item.mail_body || '',
|
|
67
|
+
date: item.mail_date || '',
|
|
68
|
+
isRead: item.mail_read === 1,
|
|
69
|
+
}, email));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VlcnJpbGxhbWFpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlcnMvZ3VlcnJpbGxhbWFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7O0FBYUgsc0NBd0JDO0FBT0QsOEJBeUJDO0FBbEVELDRDQUE4QztBQUU5QyxNQUFNLE9BQU8sR0FBWSxlQUFlLENBQUM7QUFDekMsTUFBTSxRQUFRLEdBQUcsd0NBQXdDLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxhQUFhO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSw4QkFBOEIsRUFBRTtRQUN0RSxNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLFlBQVksRUFBRSw4REFBOEQ7U0FDN0U7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBTztRQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVU7UUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ25GLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxRQUFRLGtDQUFrQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQ3JHLE1BQU0sRUFBRSxLQUFLO1FBQ2IsT0FBTyxFQUFFO1lBQ1AsWUFBWSxFQUFFLDhEQUE4RDtTQUM3RTtLQUNGLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFdkQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDBCQUFjLEVBQUM7UUFDNUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPO1FBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztRQUNwQixFQUFFLEVBQUUsS0FBSztRQUNULE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWTtRQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRTtRQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFO1FBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUM7S0FDN0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR3VlcnJpbGxhIE1haWwg5rig6YGT5a6e546wXG4gKiBBUEkg5paH5qGjOiBodHRwczovL3d3dy5ndWVycmlsbGFtYWlsLmNvbS9HdWVycmlsbGFNYWlsQVBJLmh0bWxcbiAqIFxuICog54m554K5OlxuICogLSDml6DpnIDorqTor4HvvIzlhazlvIAgSlNPTiBBUElcbiAqIC0g6YCa6L+HIHNpZF90b2tlbiDnu7TmjIHkvJror51cbiAqIC0g6YKu566x5pyJ5pWI5pyfIDYwIOWIhumSn1xuICovXG5cbmltcG9ydCB7IEVtYWlsSW5mbywgRW1haWwsIENoYW5uZWwgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4uL25vcm1hbGl6ZSc7XG5cbmNvbnN0IENIQU5ORUw6IENoYW5uZWwgPSAnZ3VlcnJpbGxhbWFpbCc7XG5jb25zdCBCQVNFX1VSTCA9ICdodHRwczovL2FwaS5ndWVycmlsbGFtYWlsLmNvbS9hamF4LnBocCc7XG5cbi8qKlxuICog5Yib5bu65Li05pe26YKu566xXG4gKiBBUEk6IEdFVCBhamF4LnBocD9mPWdldF9lbWFpbF9hZGRyZXNzXG4gKiDov5Tlm54gZW1haWxfYWRkciArIHNpZF90b2tlbu+8iOeUqOS6juWQjue7reiOt+WPlumCruS7tu+8iVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFbWFpbCgpOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfT9mPWdldF9lbWFpbF9hZGRyZXNzJmxhbmc9ZW5gLCB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYnLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZW5lcmF0ZSBlbWFpbDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIGlmICghZGF0YS5lbWFpbF9hZGRyIHx8ICFkYXRhLnNpZF90b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIGVtYWlsOiBtaXNzaW5nIGVtYWlsX2FkZHIgb3Igc2lkX3Rva2VuJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6IENIQU5ORUwsXG4gICAgZW1haWw6IGRhdGEuZW1haWxfYWRkcixcbiAgICB0b2tlbjogZGF0YS5zaWRfdG9rZW4sXG4gICAgZXhwaXJlc0F0OiBkYXRhLmVtYWlsX3RpbWVzdGFtcCA/IChkYXRhLmVtYWlsX3RpbWVzdGFtcCArIDM2MDApICogMTAwMCA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIEFQSTogR0VUIGFqYXgucGhwP2Y9Y2hlY2tfZW1haWwmc2VxPTAmc2lkX3Rva2VuPXh4eFxuICog6L+U5ZueIGxpc3Qg5pWw57uE77yM5q+P5Liq5YWD57Sg5YyF5ZCrIG1haWxfaWQsIG1haWxfZnJvbSwgbWFpbF9zdWJqZWN0LCBtYWlsX2JvZHkg562JXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbWFpbHModG9rZW46IHN0cmluZywgZW1haWw6IHN0cmluZyk6IFByb21pc2U8RW1haWxbXT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfT9mPWNoZWNrX2VtYWlsJnNlcT0wJnNpZF90b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0b2tlbil9YCwge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2JyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IGVtYWlsczogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheShkYXRhLmxpc3QpID8gZGF0YS5saXN0IDogW107XG5cbiAgcmV0dXJuIGxpc3QubWFwKChpdGVtOiBhbnkpID0+IG5vcm1hbGl6ZUVtYWlsKHtcbiAgICBpZDogaXRlbS5tYWlsX2lkLFxuICAgIGZyb206IGl0ZW0ubWFpbF9mcm9tLFxuICAgIHRvOiBlbWFpbCxcbiAgICBzdWJqZWN0OiBpdGVtLm1haWxfc3ViamVjdCxcbiAgICB0ZXh0OiBpdGVtLm1haWxfYm9keSB8fCBpdGVtLm1haWxfZXhjZXJwdCB8fCAnJyxcbiAgICBodG1sOiBpdGVtLm1haWxfYm9keSB8fCAnJyxcbiAgICBkYXRlOiBpdGVtLm1haWxfZGF0ZSB8fCAnJyxcbiAgICBpc1JlYWQ6IGl0ZW0ubWFpbF9yZWFkID09PSAxLFxuICB9LCBlbWFpbCkpO1xufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maildrop 渠道实现
|
|
3
|
+
* API: GraphQL endpoint https://api.maildrop.cc/graphql
|
|
4
|
+
*
|
|
5
|
+
* 特点:
|
|
6
|
+
* - 无需认证,公开 GraphQL API
|
|
7
|
+
* - 自带反垃圾过滤
|
|
8
|
+
* - 邮箱名即用户名(任意字符串@maildrop.cc)
|
|
9
|
+
* - 无过期时间限制
|
|
10
|
+
*/
|
|
11
|
+
import { EmailInfo, Email } from '../types';
|
|
12
|
+
/**
|
|
13
|
+
* 创建临时邮箱
|
|
14
|
+
* Maildrop 无需注册,任意用户名即可接收邮件
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateEmail(): Promise<EmailInfo>;
|
|
17
|
+
/**
|
|
18
|
+
* 获取邮件列表
|
|
19
|
+
* 先查 inbox 获取邮件 ID 列表,再逐封获取完整内容
|
|
20
|
+
*/
|
|
21
|
+
export declare function getEmails(token: string, email: string): Promise<Email[]>;
|
|
@@ -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
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 支持的临时邮箱渠道标识
|
|
3
3
|
* 每个渠道对应一个第三方临时邮箱服务商
|
|
4
4
|
*/
|
|
5
|
-
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'tempmail-la' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail';
|
|
5
|
+
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'tempmail-la' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail' | 'guerrillamail' | 'maildrop';
|
|
6
6
|
/**
|
|
7
7
|
* 创建临时邮箱后返回的邮箱信息
|
|
8
8
|
* 包含邮箱地址、认证令牌和生命周期信息
|
package/dist/types.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5pSv5oyB55qE5Li05pe26YKu566x5rig6YGT5qCH6K+GXG4gKiDmr4/
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5pSv5oyB55qE5Li05pe26YKu566x5rig6YGT5qCH6K+GXG4gKiDmr4/kuKrmuKDpgZPlr7nlupTkuIDkuKrnrKzkuInmlrnkuLTml7bpgq7nrrHmnI3liqHllYZcbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbm5lbCA9ICd0ZW1wbWFpbCcgfCAnbGluc2hpLWVtYWlsJyB8ICd0ZW1wbWFpbC1sb2wnIHwgJ2NoYXRncHQtb3JnLXVrJyB8ICd0ZW1wbWFpbC1sYScgfCAndGVtcC1tYWlsLWlvJyB8ICdhd2FtYWlsJyB8ICdtYWlsLXRtJyB8ICdkcm9wbWFpbCcgfCAnZ3VlcnJpbGxhbWFpbCcgfCAnbWFpbGRyb3AnO1xuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueuseWQjui/lOWbnueahOmCrueuseS/oeaBr1xuICog5YyF5ZCr6YKu566x5Zyw5Z2A44CB6K6k6K+B5Luk54mM5ZKM55Sf5ZG95ZGo5pyf5L+h5oGvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxJbmZvIHtcbiAgLyoqIOWIm+W7uuivpemCrueuseaJgOS9v+eUqOeahOa4oOmBkyAqL1xuICBjaGFubmVsOiBDaGFubmVsO1xuICAvKiog5Li05pe26YKu566x5Zyw5Z2AICovXG4gIGVtYWlsOiBzdHJpbmc7XG4gIC8qKiDorqTor4Hku6TniYzvvIzpg6jliIbmuKDpgZPlnKjojrflj5bpgq7ku7bml7bpnIDopoHmraTku6TniYwgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG4gIC8qKiDpgq7nrrHov4fmnJ/ml7bpl7TvvIhJU08gODYwMSDlrZfnrKbkuLLmiJYgVW5peCDml7bpl7TmiLPvvIkgKi9cbiAgZXhwaXJlc0F0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAvKiog6YKu566x5Yib5bu65pe26Ze077yISVNPIDg2MDEg5a2X56ym5Liy77yJICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiDmoIflh4bljJbpgq7ku7bpmYTku7ZcbiAqIOS4jeWQjOa4oOmBk+eahOmZhOS7tuWtl+auteWQjeS4jeWQjO+8jFNESyDnu5/kuIDlvZLkuIDljJbkuLrmraTnu5PmnoRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbEF0dGFjaG1lbnQge1xuICAvKiog6ZmE5Lu25paH5Lu25ZCNICovXG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIC8qKiDpmYTku7blpKflsI/vvIjlrZfoioLvvIkgKi9cbiAgc2l6ZT86IG51bWJlcjtcbiAgLyoqIE1JTUUg57G75Z6L77yM5aaCIGFwcGxpY2F0aW9uL3BkZiAqL1xuICBjb250ZW50VHlwZT86IHN0cmluZztcbiAgLyoqIOmZhOS7tuS4i+i9veWcsOWdgCAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICog5qCH5YeG5YyW6YKu5Lu25qC85byPIC0g5omA5pyJ5o+Q5L6b5ZWG6L+U5Zue57uf5LiA57uT5p6EXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWwge1xuICAvKiog6YKu5Lu25ZSv5LiA5qCH6K+GICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiDlj5Hku7bkurrpgq7nrrHlnLDlnYAgKi9cbiAgZnJvbTogc3RyaW5nO1xuICAvKiog5pS25Lu25Lq66YKu566x5Zyw5Z2AICovXG4gIHRvOiBzdHJpbmc7XG4gIC8qKiDpgq7ku7bkuLvpopggKi9cbiAgc3ViamVjdDogc3RyaW5nO1xuICAvKiog57qv5paH5pys5YaF5a65ICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIEhUTUwg5YaF5a65ICovXG4gIGh0bWw6IHN0cmluZztcbiAgLyoqIElTTyA4NjAxIOagvOW8j+eahOaXpeacn+Wtl+espuS4siAqL1xuICBkYXRlOiBzdHJpbmc7XG4gIC8qKiDmmK/lkKblt7Lor7sgKi9cbiAgaXNSZWFkOiBib29sZWFuO1xuICAvKiog6ZmE5Lu25YiX6KGoICovXG4gIGF0dGFjaG1lbnRzOiBFbWFpbEF0dGFjaG1lbnRbXTtcbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooajnmoTov5Tlm57nu5PmnpxcbiAqIHN1Y2Nlc3Mg5Li6IGZhbHNlIOaXtuihqOekuuivt+axguWksei0pe+8iOmHjeivleiAl+Wwve+8ie+8jGVtYWlscyDkuLrnqbrmlbDnu4RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRFbWFpbHNSZXN1bHQge1xuICAvKiog5omA5L2/55So55qE5rig6YGTICovXG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIC8qKiDmn6Xor6LnmoTpgq7nrrHlnLDlnYAgKi9cbiAgZW1haWw6IHN0cmluZztcbiAgLyoqIOmCruS7tuWIl+ihqO+8jOWksei0peaXtuS4uuepuuaVsOe7hCAqL1xuICBlbWFpbHM6IEVtYWlsW107XG4gIC8qKiDor7fmsYLmmK/lkKbmiJDlip/vvIxmYWxzZSDooajnpLrph43or5XogJflsL3lkI7ku43lpLHotKUgKi9cbiAgc3VjY2VzczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiDph43or5XphY3nva5cbiAqIFNESyDlhoXpg6jlr7nnvZHnu5zplJnor6/jgIHotoXml7bjgIE1eHgg5pyN5Yqh56uv6ZSZ6K+v6Ieq5Yqo6YeN6K+VXG4gKiA0eHgg5a6i5oi356uv6ZSZ6K+v77yI5aaC5Y+C5pWw6ZSZ6K+v77yJ5LiN5Lya6YeN6K+VXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyDoh6rlrprkuYnph43or5XnrZbnlaXvvJrmnIDlpJrph43or5UgMyDmrKHvvIzpppbmrKHlu7bov58gMiDnp5JcbiAqIGNvbnN0IGVtYWlsID0gYXdhaXQgZ2VuZXJhdGVFbWFpbCh7XG4gKiAgIGNoYW5uZWw6ICdtYWlsLXRtJyxcbiAqICAgcmV0cnk6IHsgbWF4UmV0cmllczogMywgaW5pdGlhbERlbGF5OiAyMDAwIH0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5Q29uZmlnIHtcbiAgLyoqIOacgOWkp+mHjeivleasoeaVsO+8iOS4jeWQq+mmluasoeivt+axgu+8ie+8jOm7mOiupCAyICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiDliJ3lp4vph43or5Xlu7bov5/vvIjmr6vnp5LvvInvvIzph4fnlKjmjIfmlbDpgIDpgb/nrZbnlaXvvIzpu5jorqQgMTAwMCAqL1xuICBpbml0aWFsRGVsYXk/OiBudW1iZXI7XG4gIC8qKiDmnIDlpKfph43or5Xlu7bov5/kuIrpmZDvvIjmr6vnp5LvvInvvIzpu5jorqQgNTAwMCAqL1xuICBtYXhEZWxheT86IG51bWJlcjtcbiAgLyoqIOWNleasoeivt+axgui2heaXtuaXtumXtO+8iOavq+enku+8ie+8jOm7mOiupCAxNTAwMCAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueuseeahOmAiemhuVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8g5L2/55So5oyH5a6a5rig6YGT5Yib5bu66YKu566xXG4gKiBjb25zdCBlbWFpbCA9IGF3YWl0IGdlbmVyYXRlRW1haWwoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKlxuICogLy8g6ZqP5py66YCJ5oup5rig6YGTXG4gKiBjb25zdCBlbWFpbCA9IGF3YWl0IGdlbmVyYXRlRW1haWwoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlRW1haWxPcHRpb25zIHtcbiAgLyoqIOaMh+Wumua4oOmBk++8jOS4jeS8oOWImemaj+acuumAieaLqSAqL1xuICBjaGFubmVsPzogQ2hhbm5lbDtcbiAgLyoqIOmCrueuseacieaViOaXtumVvyAqL1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgLyoqIOaMh+WumumCrueuseWfn+WQjSAqL1xuICBkb21haW4/OiBzdHJpbmcgfCBudWxsO1xuICAvKiog6YeN6K+V6YWN572u77yM5LiN5Lyg5YiZ5L2/55So6buY6K6k5YC877yI5pyA5aSa6YeN6K+VIDIg5qyh77yJICovXG4gIHJldHJ5PzogUmV0cnlDb25maWc7XG59XG5cbi8qKlxuICog6I635Y+W6YKu5Lu25YiX6KGo55qE6YCJ6aG5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRFbWFpbHMoe1xuICogICBjaGFubmVsOiBlbWFpbEluZm8uY2hhbm5lbCxcbiAqICAgZW1haWw6IGVtYWlsSW5mby5lbWFpbCxcbiAqICAgdG9rZW46IGVtYWlsSW5mby50b2tlbixcbiAqIH0pO1xuICogaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5lbWFpbHMubGVuZ3RoID4gMCkge1xuICogICBjb25zb2xlLmxvZygn5pS25Yiw6YKu5Lu2OicsIHJlc3VsdC5lbWFpbHMpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RW1haWxzT3B0aW9ucyB7XG4gIC8qKiDmuKDpgZPmoIfor4bvvIzlv4XloasgKi9cbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgLyoqIOmCrueuseWcsOWdgO+8jOW/heWhqyAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiog6K6k6K+B5Luk54mMICovXG4gIHRva2VuPzogc3RyaW5nO1xuICAvKiog6YeN6K+V6YWN572u77yM5LiN5Lyg5YiZ5L2/55So6buY6K6k5YC877yI5pyA5aSa6YeN6K+VIDIg5qyh77yJICovXG4gIHJldHJ5PzogUmV0cnlDb25maWc7XG59XG4iXX0=
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -7,6 +7,8 @@ import * as tempMailIO from './providers/temp-mail-io';
|
|
|
7
7
|
import * as awamail from './providers/awamail';
|
|
8
8
|
import * as mailTm from './providers/mail-tm';
|
|
9
9
|
import * as dropmail from './providers/dropmail';
|
|
10
|
+
import * as guerrillamail from './providers/guerrillamail';
|
|
11
|
+
import * as maildropProvider from './providers/maildrop';
|
|
10
12
|
import { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
|
|
11
13
|
import { withRetry, RetryOptions } from './retry';
|
|
12
14
|
import { logger } from './logger';
|
|
@@ -27,10 +29,12 @@ const providers = {
|
|
|
27
29
|
'awamail': awamail,
|
|
28
30
|
'mail-tm': mailTm,
|
|
29
31
|
'dropmail': dropmail,
|
|
32
|
+
'guerrillamail': guerrillamail,
|
|
33
|
+
'maildrop': maildropProvider,
|
|
30
34
|
};
|
|
31
35
|
|
|
32
36
|
/** 所有支持的渠道列表,用于随机选择和遍历 */
|
|
33
|
-
const allChannels: Channel[] = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail'];
|
|
37
|
+
const allChannels: Channel[] = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail', 'guerrillamail', 'maildrop'];
|
|
34
38
|
|
|
35
39
|
/**
|
|
36
40
|
* 渠道信息,包含渠道标识、显示名称和对应网站
|
|
@@ -55,6 +59,8 @@ const channelInfoMap: Record<Channel, ChannelInfo> = {
|
|
|
55
59
|
'awamail': { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
|
|
56
60
|
'mail-tm': { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
|
|
57
61
|
'dropmail': { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
|
|
62
|
+
'guerrillamail': { channel: 'guerrillamail', name: 'Guerrilla Mail', website: 'guerrillamail.com' },
|
|
63
|
+
'maildrop': { channel: 'maildrop', name: 'Maildrop', website: 'maildrop.cc' },
|
|
58
64
|
};
|
|
59
65
|
|
|
60
66
|
/**
|
|
@@ -132,6 +138,10 @@ async function generateEmailOnce(channel: Channel, options: GenerateEmailOptions
|
|
|
132
138
|
return mailTm.generateEmail();
|
|
133
139
|
case 'dropmail':
|
|
134
140
|
return dropmail.generateEmail();
|
|
141
|
+
case 'guerrillamail':
|
|
142
|
+
return guerrillamail.generateEmail();
|
|
143
|
+
case 'maildrop':
|
|
144
|
+
return maildropProvider.generateEmail();
|
|
135
145
|
default:
|
|
136
146
|
throw new Error(`Unknown channel: ${channel}`);
|
|
137
147
|
}
|
|
@@ -220,6 +230,12 @@ async function getEmailsOnce(channel: Channel, email: string, token?: string): P
|
|
|
220
230
|
case 'dropmail':
|
|
221
231
|
if (!token) throw new Error('Token is required for dropmail channel');
|
|
222
232
|
return dropmail.getEmails(token, email);
|
|
233
|
+
case 'guerrillamail':
|
|
234
|
+
if (!token) throw new Error('Token is required for guerrillamail channel');
|
|
235
|
+
return guerrillamail.getEmails(token, email);
|
|
236
|
+
case 'maildrop':
|
|
237
|
+
if (!token) throw new Error('Token is required for maildrop channel');
|
|
238
|
+
return maildropProvider.getEmails(token, email);
|
|
223
239
|
default:
|
|
224
240
|
throw new Error(`Unknown channel: ${channel}`);
|
|
225
241
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guerrilla Mail 渠道实现
|
|
3
|
+
* API 文档: https://www.guerrillamail.com/GuerrillaMailAPI.html
|
|
4
|
+
*
|
|
5
|
+
* 特点:
|
|
6
|
+
* - 无需认证,公开 JSON API
|
|
7
|
+
* - 通过 sid_token 维持会话
|
|
8
|
+
* - 邮箱有效期 60 分钟
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { EmailInfo, Email, Channel } from '../types';
|
|
12
|
+
import { normalizeEmail } from '../normalize';
|
|
13
|
+
|
|
14
|
+
const CHANNEL: Channel = 'guerrillamail';
|
|
15
|
+
const BASE_URL = 'https://api.guerrillamail.com/ajax.php';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 创建临时邮箱
|
|
19
|
+
* API: GET ajax.php?f=get_email_address
|
|
20
|
+
* 返回 email_addr + sid_token(用于后续获取邮件)
|
|
21
|
+
*/
|
|
22
|
+
export async function generateEmail(): Promise<EmailInfo> {
|
|
23
|
+
const response = await fetch(`${BASE_URL}?f=get_email_address&lang=en`, {
|
|
24
|
+
method: 'GET',
|
|
25
|
+
headers: {
|
|
26
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`Failed to generate email: ${response.status}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const data = await response.json();
|
|
35
|
+
|
|
36
|
+
if (!data.email_addr || !data.sid_token) {
|
|
37
|
+
throw new Error('Failed to generate email: missing email_addr or sid_token');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
channel: CHANNEL,
|
|
42
|
+
email: data.email_addr,
|
|
43
|
+
token: data.sid_token,
|
|
44
|
+
expiresAt: data.email_timestamp ? (data.email_timestamp + 3600) * 1000 : undefined,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 获取邮件列表
|
|
50
|
+
* API: GET ajax.php?f=check_email&seq=0&sid_token=xxx
|
|
51
|
+
* 返回 list 数组,每个元素包含 mail_id, mail_from, mail_subject, mail_body 等
|
|
52
|
+
*/
|
|
53
|
+
export async function getEmails(token: string, email: string): Promise<Email[]> {
|
|
54
|
+
const response = await fetch(`${BASE_URL}?f=check_email&seq=0&sid_token=${encodeURIComponent(token)}`, {
|
|
55
|
+
method: 'GET',
|
|
56
|
+
headers: {
|
|
57
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`Failed to get emails: ${response.status}`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const data = await response.json();
|
|
66
|
+
const list = Array.isArray(data.list) ? data.list : [];
|
|
67
|
+
|
|
68
|
+
return list.map((item: any) => normalizeEmail({
|
|
69
|
+
id: item.mail_id,
|
|
70
|
+
from: item.mail_from,
|
|
71
|
+
to: email,
|
|
72
|
+
subject: item.mail_subject,
|
|
73
|
+
text: item.mail_body || item.mail_excerpt || '',
|
|
74
|
+
html: item.mail_body || '',
|
|
75
|
+
date: item.mail_date || '',
|
|
76
|
+
isRead: item.mail_read === 1,
|
|
77
|
+
}, email));
|
|
78
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maildrop 渠道实现
|
|
3
|
+
* API: GraphQL endpoint https://api.maildrop.cc/graphql
|
|
4
|
+
*
|
|
5
|
+
* 特点:
|
|
6
|
+
* - 无需认证,公开 GraphQL API
|
|
7
|
+
* - 自带反垃圾过滤
|
|
8
|
+
* - 邮箱名即用户名(任意字符串@maildrop.cc)
|
|
9
|
+
* - 无过期时间限制
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { EmailInfo, Email, Channel } from '../types';
|
|
13
|
+
|
|
14
|
+
const CHANNEL: Channel = 'maildrop';
|
|
15
|
+
const GRAPHQL_URL = 'https://api.maildrop.cc/graphql';
|
|
16
|
+
const DOMAIN = 'maildrop.cc';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 解码 RFC 2047 编码的邮件头(如发件人、主题)
|
|
20
|
+
* 支持 Base64 (B) 和 Quoted-Printable (Q) 编码
|
|
21
|
+
*/
|
|
22
|
+
function decodeRfc2047(str: string): string {
|
|
23
|
+
if (!str) return '';
|
|
24
|
+
return str.replace(/=\?([^?]+)\?(B|Q)\?([^?]*)\?=/gi, (_, charset, encoding, encoded) => {
|
|
25
|
+
try {
|
|
26
|
+
if (encoding.toUpperCase() === 'B') {
|
|
27
|
+
return Buffer.from(encoded, 'base64').toString('utf-8');
|
|
28
|
+
}
|
|
29
|
+
/* Quoted-Printable: _=空格,=XX=十六进制字节 */
|
|
30
|
+
const decoded = encoded
|
|
31
|
+
.replace(/_/g, ' ')
|
|
32
|
+
.replace(/=([0-9A-Fa-f]{2})/g, (_m: string, hex: string) => String.fromCharCode(parseInt(hex, 16)));
|
|
33
|
+
return decoded;
|
|
34
|
+
} catch {
|
|
35
|
+
return encoded;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 从原始 MIME 邮件源码中提取纯文本正文
|
|
42
|
+
* maildrop 的 data 字段返回完整 MIME 源码,需要解析出 text/plain 部分
|
|
43
|
+
*/
|
|
44
|
+
function extractTextFromMime(raw: string): string {
|
|
45
|
+
if (!raw) return '';
|
|
46
|
+
|
|
47
|
+
/* 分离邮件头和正文(双换行分隔) */
|
|
48
|
+
const headerBodySplit = raw.indexOf('\r\n\r\n');
|
|
49
|
+
if (headerBodySplit === -1) return raw;
|
|
50
|
+
|
|
51
|
+
const headers = raw.substring(0, headerBodySplit);
|
|
52
|
+
const body = raw.substring(headerBodySplit + 4);
|
|
53
|
+
|
|
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
|
+
|
|
60
|
+
for (const part of parts) {
|
|
61
|
+
/* 查找 text/plain 部分 */
|
|
62
|
+
if (part.match(/Content-Type:\s*text\/plain/i)) {
|
|
63
|
+
const partHeaderEnd = part.indexOf('\r\n\r\n');
|
|
64
|
+
if (partHeaderEnd === -1) continue;
|
|
65
|
+
|
|
66
|
+
const partHeaders = part.substring(0, partHeaderEnd);
|
|
67
|
+
let content = part.substring(partHeaderEnd + 4).replace(/\r\n$/, '').replace(/--$/, '').trim();
|
|
68
|
+
|
|
69
|
+
/* 处理 Content-Transfer-Encoding */
|
|
70
|
+
if (partHeaders.match(/Content-Transfer-Encoding:\s*base64/i)) {
|
|
71
|
+
try {
|
|
72
|
+
content = Buffer.from(content.replace(/\s/g, ''), 'base64').toString('utf-8');
|
|
73
|
+
} catch { /* 解码失败则保留原文 */ }
|
|
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) => String.fromCharCode(parseInt(hex, 16)));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return content.trim();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* 非 multipart:检查整体编码 */
|
|
86
|
+
if (headers.match(/Content-Transfer-Encoding:\s*base64/i)) {
|
|
87
|
+
try {
|
|
88
|
+
return Buffer.from(body.replace(/\s/g, ''), 'base64').toString('utf-8').trim();
|
|
89
|
+
} catch { /* 解码失败 */ }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return body.trim();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 生成随机用户名
|
|
97
|
+
*/
|
|
98
|
+
function randomUsername(length: number = 10): string {
|
|
99
|
+
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
100
|
+
let result = '';
|
|
101
|
+
for (let i = 0; i < length; i++) {
|
|
102
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 发送 GraphQL 请求
|
|
109
|
+
* 使用 operationName + variables 的标准 GraphQL 格式
|
|
110
|
+
*/
|
|
111
|
+
async function graphqlRequest(
|
|
112
|
+
operationName: string,
|
|
113
|
+
query: string,
|
|
114
|
+
variables: Record<string, string> = {},
|
|
115
|
+
): Promise<any> {
|
|
116
|
+
const response = await fetch(GRAPHQL_URL, {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers: {
|
|
119
|
+
'Content-Type': 'application/json',
|
|
120
|
+
'Origin': 'https://maildrop.cc',
|
|
121
|
+
'Referer': 'https://maildrop.cc/',
|
|
122
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify({ operationName, variables, query }),
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
throw new Error(`Maildrop GraphQL request failed: ${response.status}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const data = await response.json();
|
|
132
|
+
if (data.errors && data.errors.length > 0) {
|
|
133
|
+
throw new Error(`Maildrop GraphQL error: ${data.errors[0].message}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return data.data;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 创建临时邮箱
|
|
141
|
+
* Maildrop 无需注册,任意用户名即可接收邮件
|
|
142
|
+
*/
|
|
143
|
+
export async function generateEmail(): Promise<EmailInfo> {
|
|
144
|
+
const username = randomUsername();
|
|
145
|
+
const email = `${username}@${DOMAIN}`;
|
|
146
|
+
|
|
147
|
+
/* 验证邮箱可用:查询一次 inbox 确认 API 正常 */
|
|
148
|
+
await graphqlRequest(
|
|
149
|
+
'GetInbox',
|
|
150
|
+
'query GetInbox($mailbox: String!) { inbox(mailbox: $mailbox) { id } }',
|
|
151
|
+
{ mailbox: username },
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
channel: CHANNEL,
|
|
156
|
+
email,
|
|
157
|
+
token: username,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 获取邮件列表
|
|
163
|
+
* 先查 inbox 获取邮件 ID 列表,再逐封获取完整内容
|
|
164
|
+
*/
|
|
165
|
+
export async function getEmails(token: string, email: string): Promise<Email[]> {
|
|
166
|
+
const mailbox = token || email.split('@')[0];
|
|
167
|
+
|
|
168
|
+
/* 查询收件箱列表 */
|
|
169
|
+
const inboxData = await graphqlRequest(
|
|
170
|
+
'GetInbox',
|
|
171
|
+
'query GetInbox($mailbox: String!) { inbox(mailbox: $mailbox) { id headerfrom subject date } }',
|
|
172
|
+
{ mailbox },
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
const inbox = inboxData?.inbox;
|
|
176
|
+
if (!Array.isArray(inbox) || inbox.length === 0) {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* 逐封获取完整邮件内容 */
|
|
181
|
+
const emails: Email[] = [];
|
|
182
|
+
for (const item of inbox) {
|
|
183
|
+
try {
|
|
184
|
+
const msgData = await graphqlRequest(
|
|
185
|
+
'GetMessage',
|
|
186
|
+
'query GetMessage($mailbox: String!, $id: String!) { message(mailbox: $mailbox, id: $id) { id headerfrom subject date data html } }',
|
|
187
|
+
{ mailbox, id: item.id },
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
const msg = msgData?.message;
|
|
191
|
+
if (msg) {
|
|
192
|
+
emails.push({
|
|
193
|
+
id: msg.id || item.id,
|
|
194
|
+
from: decodeRfc2047(msg.headerfrom || item.headerfrom || ''),
|
|
195
|
+
to: email,
|
|
196
|
+
subject: decodeRfc2047(msg.subject || item.subject || ''),
|
|
197
|
+
text: extractTextFromMime(msg.data || ''),
|
|
198
|
+
html: msg.html || '',
|
|
199
|
+
date: msg.date || item.date || '',
|
|
200
|
+
isRead: false,
|
|
201
|
+
attachments: [],
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
} catch {
|
|
205
|
+
/* 单封邮件获取失败不影响整体 */
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return emails;
|
|
210
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 支持的临时邮箱渠道标识
|
|
3
3
|
* 每个渠道对应一个第三方临时邮箱服务商
|
|
4
4
|
*/
|
|
5
|
-
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'tempmail-la' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail';
|
|
5
|
+
export type Channel = 'tempmail' | 'linshi-email' | 'tempmail-lol' | 'chatgpt-org-uk' | 'tempmail-la' | 'temp-mail-io' | 'awamail' | 'mail-tm' | 'dropmail' | 'guerrillamail' | 'maildrop';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* 创建临时邮箱后返回的邮箱信息
|