feat: add mail-parser-wasm-worker (#301)

This commit is contained in:
Dream Hunter
2024-06-04 21:57:42 +08:00
committed by GitHub
parent c5d01e09e8
commit da2e72e523
18 changed files with 1260 additions and 1070 deletions
+7 -7
View File
@@ -1,6 +1,6 @@
{ {
"name": "cloudflare_temp_email", "name": "cloudflare_temp_email",
"version": "0.5.0", "version": "0.5.1",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -15,14 +15,14 @@
"deploy": "npm run build && wrangler pages deploy ./dist --branch production" "deploy": "npm run build && wrangler pages deploy ./dist --branch production"
}, },
"dependencies": { "dependencies": {
"@unhead/vue": "^1.9.11", "@unhead/vue": "^1.9.12",
"@vicons/material": "^0.12.0", "@vicons/material": "^0.12.0",
"@vueuse/core": "^10.9.0", "@vueuse/core": "^10.10.0",
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.7.2", "axios": "^1.7.2",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"mail-parser-wasm": "^0.1.6", "mail-parser-wasm": "^0.1.8",
"naive-ui": "^2.38.2", "naive-ui": "^2.38.2",
"postal-mime": "^2.2.5", "postal-mime": "^2.2.5",
"vooks": "^0.2.12", "vooks": "^0.2.12",
@@ -33,14 +33,14 @@
}, },
"devDependencies": { "devDependencies": {
"@vicons/fa": "^0.12.0", "@vicons/fa": "^0.12.0",
"@vitejs/plugin-vue": "^5.0.4", "@vitejs/plugin-vue": "^5.0.5",
"unplugin-auto-import": "^0.17.6", "unplugin-auto-import": "^0.17.6",
"unplugin-vue-components": "^0.27.0", "unplugin-vue-components": "^0.27.0",
"vite": "^5.2.11", "vite": "^5.2.12",
"vite-plugin-pwa": "^0.19.8", "vite-plugin-pwa": "^0.19.8",
"vite-plugin-top-level-await": "^1.4.1", "vite-plugin-top-level-await": "^1.4.1",
"vite-plugin-wasm": "^3.3.0", "vite-plugin-wasm": "^3.3.0",
"workbox-window": "^7.1.0", "workbox-window": "^7.1.0",
"wrangler": "^3.57.1" "wrangler": "^3.58.0"
} }
} }
+872 -872
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -12,3 +12,4 @@ Cargo.lock
# MSVC Windows builds of rustc generate these, which store debugging information # MSVC Windows builds of rustc generate these, which store debugging information
*.pdb *.pdb
web/
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "mail-parser-wasm" name = "mail-parser-wasm"
version = "0.1.6" version = "0.1.8"
edition = "2021" edition = "2021"
description = "A simple mail parser for wasm" description = "A simple mail parser for wasm"
license = "MIT" license = "MIT"
+33 -4
View File
@@ -1,16 +1,45 @@
# mail-parser-wasm # mail-parser-wasm web and cf worker
## usage ## [mail-parser-wasm](https://www.npmjs.com/package/mail-parser-wasm)
### mail-parser-wasm usage
```bash
pnpm add mail-parser-wasm
```
```js ```js
import { parse_message } from 'mail-parser-wasm' import { parse_message } from 'mail-parser-wasm'
const parsedEmail = parse_message(item.raw); const parsedEmail = parse_message(rawEmail);
``` ```
## build ### mail-parser-wasm build
```bash ```bash
wasm-pack build --release wasm-pack build --release
wasm-pack publish wasm-pack publish
``` ```
## [mail-parser-wasm-worker](https://www.npmjs.com/package/mail-parser-wasm-worker)
### mail-parser-wasm-worker usage
```bash
pnpm add mail-parser-wasm-worker
```
```js
import { parse_message_wrapper } from 'mail-parser-wasm-worker'
const parsedEmail = parse_message_wrapper(rawEmail);
```
### mail-parser-wasm-worker build
```bash
wasm-pack build --out-dir web --target web --release
find web/ -type f ! -name '*.json' ! -name '.gitignore' -exec cp {} worker/ \;
# modify worker/package.json version or whatever
pnpm publish worker --no-git-checks
```
+9
View File
@@ -0,0 +1,9 @@
import initAsync, { MessageResult } from './mail_parser_wasm';
import MODULE from './mail_parser_wasm_bg.wasm';
export { initAsync, MODULE };
export * from './mail_parser_wasm';
/**
* @param {string} raw_message
* @returns {MessageResult}
*/
export function parse_message_wrapper(raw_message: string): MessageResult;
+12
View File
@@ -0,0 +1,12 @@
import initAsync, { initSync, parse_message } from './mail_parser_wasm';
import MODULE from './mail_parser_wasm_bg.wasm';
initSync(MODULE);
export { initAsync, MODULE };
export * from './mail_parser_wasm';
export const parse_message_wrapper = (raw_message) => {
initSync(MODULE);
return parse_message(raw_message);
}
+24
View File
@@ -0,0 +1,24 @@
{
"name": "mail-parser-wasm-worker",
"description": "A simple mail parser for worker",
"homepage": "https://github.com/dreamhunter2333/cloudflare_temp_email/tree/main/mail-parser-wasm",
"repository": {
"type": "git",
"url": "https://github.com/dreamhunter2333/cloudflare_temp_email",
"directory": "mail-parser-wasm"
},
"version": "0.1.8",
"license": "MIT",
"files": [
"mail_parser_wasm_bg.wasm",
"mail_parser_wasm.js",
"mail_parser_wasm.d.ts",
"index.js",
"index.d.ts"
],
"module": "index.js",
"types": "index.d.ts",
"sideEffects": [
"./snippets/*"
]
}
+1
View File
@@ -136,6 +136,7 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] {
{ text: '配置子域名邮箱', link: 'feature/subdomain' }, { text: '配置子域名邮箱', link: 'feature/subdomain' },
{ text: '配置 Telegram Bot', link: 'feature/telegram' }, { text: '配置 Telegram Bot', link: 'feature/telegram' },
{ text: '配置 S3 附件', link: 'feature/s3-attachment' }, { text: '配置 S3 附件', link: 'feature/s3-attachment' },
{ text: '配置 worker 使用 wasm 解析邮件', link: 'feature/mail_parser_wasm_worker' },
] ]
}, },
{ {
@@ -0,0 +1,63 @@
# mail-parser-wasm-worker
> [!NOTE]
> 如果你使用了 webhook 转发,或者 telegram bot 接受邮件,但是邮件内容是乱码,或者无法解析,你对解析的需要更高的要求,可以使用这个功能。
## 修改代码
```bash
cd worker
pnpm add mail-parser-wasm-worker
```
编辑 `worker/src/common.ts`, 取消注释这段代码,使用 mail-parser-wasm-worker 来解析邮件
```ts
export const commonParseMail = async (raw_mail: string | undefined | null): Promise<{
sender: string,
subject: string,
text: string,
html: string
} | undefined> => {
if (!raw_mail) {
return undefined;
}
// 取消注释这段代码,使用 mail-parser-wasm-worker 来解析邮件 start
// TODO: WASM parse email
try {
const { parse_message_wrapper } = await import('mail-parser-wasm-worker');
const parsedEmail = parse_message_wrapper(raw_mail);
return {
sender: parsedEmail.sender || "",
subject: parsedEmail.subject || "",
text: parsedEmail.text || "",
html: parsedEmail.body_html || "",
};
} catch (e) {
console.error("Failed use mail-parser-wasm-worker to parse email", e);
}
// 取消注释这段代码,使用 mail-parser-wasm-worker 来解析邮件 end
try {
const { default: PostalMime } = await import('postal-mime');
const parsedEmail = await PostalMime.parse(raw_mail);
return {
sender: parsedEmail.from ? `${parsedEmail.from.name} <${parsedEmail.from.address}>` : "",
subject: parsedEmail.subject || "",
text: parsedEmail.text || "",
html: parsedEmail.html || "",
};
}
catch (e) {
console.error("Failed use PostalMime to parse email", e);
}
return undefined;
}
```
## 部署
```bash
cd worker
pnpm run deploy
```
+4 -4
View File
@@ -11,17 +11,17 @@
"build": "wrangler deploy --dry-run --outdir dist --minify" "build": "wrangler deploy --dry-run --outdir dist --minify"
}, },
"devDependencies": { "devDependencies": {
"@cloudflare/workers-types": "^4.20240512.0", "@cloudflare/workers-types": "^4.20240603.0",
"@eslint/js": "8.56.0", "@eslint/js": "8.56.0",
"eslint": "8.56.0", "eslint": "8.56.0",
"globals": "^15.3.0", "globals": "^15.3.0",
"typescript-eslint": "^7.10.0", "typescript-eslint": "^7.12.0",
"wrangler": "^3.57.1" "wrangler": "^3.58.0"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.588.0", "@aws-sdk/client-s3": "^3.588.0",
"@aws-sdk/s3-request-presigner": "^3.588.0", "@aws-sdk/s3-request-presigner": "^3.588.0",
"hono": "^4.3.9", "hono": "^4.4.3",
"mimetext": "^3.0.24", "mimetext": "^3.0.24",
"postal-mime": "^2.2.5", "postal-mime": "^2.2.5",
"resend": "^3.2.0", "resend": "^3.2.0",
+152 -152
View File
@@ -20,8 +20,8 @@ importers:
specifier: ^3.588.0 specifier: ^3.588.0
version: 3.588.0 version: 3.588.0
hono: hono:
specifier: ^4.3.9 specifier: ^4.4.3
version: 4.3.9 version: 4.4.3
mimetext: mimetext:
specifier: ^3.0.24 specifier: ^3.0.24
version: 3.0.24 version: 3.0.24
@@ -36,8 +36,8 @@ importers:
version: 4.16.3(patch_hash=pnqp5pf7vetkijrc5uah4r5w6m) version: 4.16.3(patch_hash=pnqp5pf7vetkijrc5uah4r5w6m)
devDependencies: devDependencies:
'@cloudflare/workers-types': '@cloudflare/workers-types':
specifier: ^4.20240512.0 specifier: ^4.20240603.0
version: 4.20240512.0 version: 4.20240603.0
'@eslint/js': '@eslint/js':
specifier: 8.56.0 specifier: 8.56.0
version: 8.56.0 version: 8.56.0
@@ -48,11 +48,11 @@ importers:
specifier: ^15.3.0 specifier: ^15.3.0
version: 15.3.0 version: 15.3.0
typescript-eslint: typescript-eslint:
specifier: ^7.10.0 specifier: ^7.12.0
version: 7.10.0(eslint@8.56.0)(typescript@5.4.5) version: 7.12.0(eslint@8.56.0)(typescript@5.4.5)
wrangler: wrangler:
specifier: ^3.57.1 specifier: ^3.58.0
version: 3.57.1(@cloudflare/workers-types@4.20240512.0) version: 3.58.0(@cloudflare/workers-types@4.20240603.0)
packages: packages:
@@ -233,50 +233,50 @@ packages:
resolution: {integrity: sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==} resolution: {integrity: sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
'@babel/runtime-corejs3@7.24.5': '@babel/runtime-corejs3@7.24.6':
resolution: {integrity: sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==} resolution: {integrity: sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/runtime@7.24.5': '@babel/runtime@7.24.6':
resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@cloudflare/kv-asset-handler@0.3.2': '@cloudflare/kv-asset-handler@0.3.2':
resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==}
engines: {node: '>=16.13'} engines: {node: '>=16.13'}
'@cloudflare/workerd-darwin-64@1.20240512.0': '@cloudflare/workerd-darwin-64@1.20240524.0':
resolution: {integrity: sha512-VMp+CsSHFALQiBzPdQ5dDI4T1qwLu0mQ0aeKVNDosXjueN0f3zj/lf+mFil5/9jBbG3t4mG0y+6MMnalP9Lobw==} resolution: {integrity: sha512-ATaXjefbTsrv4mpn4Fdua114RRDXcX5Ky+Mv+f4JTUllgalmqC4CYMN4jxRz9IpJU/fNMN8IEfvUyuJBAcl9Iw==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@cloudflare/workerd-darwin-arm64@1.20240512.0': '@cloudflare/workerd-darwin-arm64@1.20240524.0':
resolution: {integrity: sha512-lZktXGmzMrB5rJqY9+PmnNfv1HKlj/YLZwMjPfF0WVKHUFdvQbAHsi7NlKv6mW9uIvlZnS+K4sIkWc0MDXcRnA==} resolution: {integrity: sha512-wnbsZI4CS0QPCd+wnBHQ40C28A/2Qo4ESi1YhE2735G3UNcc876MWksZhsubd+XH0XPIra6eNFqyw6wRMpQOXA==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@cloudflare/workerd-linux-64@1.20240512.0': '@cloudflare/workerd-linux-64@1.20240524.0':
resolution: {integrity: sha512-wrHvqCZZqXz6Y3MUTn/9pQNsvaoNjbJpuA6vcXsXu8iCzJi911iVW2WUEBX+MpUWD+mBIP0oXni5tTlhkokOPw==} resolution: {integrity: sha512-E8mj+HPBryKwaJAiNsYzXtVjKCL0KvUBZbtxJxlWM4mLSQhT+uwGT3nydb/hFY59rZnQgZslw0oqEWht5TEYiQ==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@cloudflare/workerd-linux-arm64@1.20240512.0': '@cloudflare/workerd-linux-arm64@1.20240524.0':
resolution: {integrity: sha512-YPezHMySL9J9tFdzxz390eBswQ//QJNYcZolz9Dgvb3FEfdpK345cE/bsWbMOqw5ws2f82l388epoenghtYvAg==} resolution: {integrity: sha512-/Fr1W671t2triNCDCBWdStxngnbUfZunZ/2e4kaMLzJDJLYDtYdmvOUCBDzUD4ssqmIMbn9RCQQ0U+CLEoqBqw==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@cloudflare/workerd-windows-64@1.20240512.0': '@cloudflare/workerd-windows-64@1.20240524.0':
resolution: {integrity: sha512-SxKapDrIYSscMR7lGIp/av0l6vokjH4xQ9ACxHgXh+OdOus9azppSmjaPyw4/ePvg7yqpkaNjf9o258IxWtvKQ==} resolution: {integrity: sha512-G+ThDEx57g9mAEKqhWnHaaJgpeGYtyhkmwM/BDpLqPks/rAY5YEfZbY4YL1pNk1kkcZDXGrwIsY8xe9Apf5JdA==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@cloudflare/workers-types@4.20240512.0': '@cloudflare/workers-types@4.20240603.0':
resolution: {integrity: sha512-o2yTEWg+YK/I1t/Me+dA0oarO0aCbjibp6wSeaw52DSE9tDyKJ7S+Qdyw/XsMrKn4t8kF6f/YOba+9O4MJfW9w==} resolution: {integrity: sha512-KmsjZcd/dPWM51FoT08cvUGCq9l3nFEriloQ12mcdJPoW911Gi5S/9Cq4xeFvTrtk9TJ2krvxP23IeobecRmOQ==}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -430,8 +430,8 @@ packages:
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/regexpp@4.10.0': '@eslint-community/regexpp@4.10.1':
resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/eslintrc@2.1.4': '@eslint/eslintrc@2.1.4':
@@ -694,11 +694,11 @@ packages:
'@types/node-forge@1.3.11': '@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
'@types/node@20.12.12': '@types/node@20.14.1':
resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} resolution: {integrity: sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA==}
'@typescript-eslint/eslint-plugin@7.10.0': '@typescript-eslint/eslint-plugin@7.12.0':
resolution: {integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==} resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^7.0.0 '@typescript-eslint/parser': ^7.0.0
@@ -708,8 +708,8 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/parser@7.10.0': '@typescript-eslint/parser@7.12.0':
resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@@ -718,12 +718,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/scope-manager@7.10.0': '@typescript-eslint/scope-manager@7.12.0':
resolution: {integrity: sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==} resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/type-utils@7.10.0': '@typescript-eslint/type-utils@7.12.0':
resolution: {integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==} resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@@ -732,12 +732,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/types@7.10.0': '@typescript-eslint/types@7.12.0':
resolution: {integrity: sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==} resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/typescript-estree@7.10.0': '@typescript-eslint/typescript-estree@7.12.0':
resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@@ -745,14 +745,14 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/utils@7.10.0': '@typescript-eslint/utils@7.12.0':
resolution: {integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==} resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
'@typescript-eslint/visitor-keys@7.10.0': '@typescript-eslint/visitor-keys@7.12.0':
resolution: {integrity: sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==} resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@ungap/structured-clone@1.2.0': '@ungap/structured-clone@1.2.0':
@@ -891,8 +891,8 @@ packages:
data-uri-to-buffer@2.0.2: data-uri-to-buffer@2.0.2:
resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}
debug@4.3.4: debug@4.3.5:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
engines: {node: '>=6.0'} engines: {node: '>=6.0'}
peerDependencies: peerDependencies:
supports-color: '*' supports-color: '*'
@@ -1099,8 +1099,8 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
hono@4.3.9: hono@4.4.3:
resolution: {integrity: sha512-6c5LVE23HnIS8iBhY+XPmYJlPeeClznOi7mBNsAsJCgxo8Ciz75LTjqRUf5wv4RYq8kL+1KPLUZHCtKmbZssNg==} resolution: {integrity: sha512-G7rTruKzrHXPz1KB4B50deKydPA9+aeei+WC1hikP0abN9N+a6yORuweageaqWocYfYNkpoqA5ezGV2mzQasvw==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
html-to-text@9.0.5: html-to-text@9.0.5:
@@ -1162,8 +1162,8 @@ packages:
isexe@2.0.0: isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
jackspeak@3.1.2: jackspeak@3.2.3:
resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} resolution: {integrity: sha512-htOzIMPbpLid/Gq9/zaz9SfExABxqRe1sSCdxntlO/aMD6u0issZQiY25n2GKQUtJ02j7z5sfptlAOMpWWOmvw==}
engines: {node: '>=14'} engines: {node: '>=14'}
js-base64@3.7.7: js-base64@3.7.7:
@@ -1246,8 +1246,8 @@ packages:
mimetext@3.0.24: mimetext@3.0.24:
resolution: {integrity: sha512-UdG1KVfcxeEfo6el91lzFG2WLLTm8DxSK/rosxx5H2Pjla50+DSsjTgr9BRAfAkbQWaxvzcaTO+bHK5ZrdKdfA==} resolution: {integrity: sha512-UdG1KVfcxeEfo6el91lzFG2WLLTm8DxSK/rosxx5H2Pjla50+DSsjTgr9BRAfAkbQWaxvzcaTO+bHK5ZrdKdfA==}
miniflare@3.20240512.0: miniflare@3.20240524.1:
resolution: {integrity: sha512-X0PlKR0AROKpxFoJNmRtCMIuJxj+ngEcyTOlEokj2rAQ0TBwUhB4/1uiPvdI6ofW5NugPOD1uomAv+gLjwsLDQ==} resolution: {integrity: sha512-5d3pRxvd5pT7lX1SsBH9+AjXuyHJnChSNOnYhubfi7pxMek4ZfULwhnUmNUp1R7b2xKuzqdFDZa0fsZuUoFxlw==}
engines: {node: '>=16.13'} engines: {node: '>=16.13'}
hasBin: true hasBin: true
@@ -1559,8 +1559,8 @@ packages:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
typescript-eslint@7.10.0: typescript-eslint@7.12.0:
resolution: {integrity: sha512-thO8nyqptXdfWHQrMJJiJyftpW8aLmwRNs11xA8pSrXneoclFPstQZqXvDWuH1WNL4CHffqHvYUeCHTit6yfhQ==} resolution: {integrity: sha512-D6HKNbQcnNu3BaN4HkQCR16tgG8Q2AMUWPgvhrJksOXu+d6ys07yC06ONiV2kcsEfWC22voB6C3PvK2MqlBZ7w==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@@ -1603,17 +1603,17 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
workerd@1.20240512.0: workerd@1.20240524.0:
resolution: {integrity: sha512-VUBmR1PscAPHEE0OF/G2K7/H1gnr9aDWWZzdkIgWfNKkv8dKFCT75H+GJtUHjfwqz3rYCzaNZmatSXOpLGpF8A==} resolution: {integrity: sha512-LWLe5D8PVHBcqturmBbwgI71r7YPpIMYZoVEH6S4G35EqIJ55cb0n3FipoSyraoIfpcCxCFxX1K6WsRHbP3pFA==}
engines: {node: '>=16'} engines: {node: '>=16'}
hasBin: true hasBin: true
wrangler@3.57.1: wrangler@3.58.0:
resolution: {integrity: sha512-M8YnWUwdrb8AFiRePtVnzlDn02OX4osWvdl8oVh6eyZqqkqXYg7lwlYBr14Qj92pMN4JvMBmDZoukkYHvwpJRg==} resolution: {integrity: sha512-h9gWER7LXLnmHABDNP1p3aqXtchlvSBN8Dp22ZurnkxaLMZ3L3H1Ze1ftiFSs0VRWv0BUnz7AWIUqZmzuBY4Nw==}
engines: {node: '>=16.17.0'} engines: {node: '>=16.17.0'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@cloudflare/workers-types': ^4.20240512.0 '@cloudflare/workers-types': ^4.20240524.0
peerDependenciesMeta: peerDependenciesMeta:
'@cloudflare/workers-types': '@cloudflare/workers-types':
optional: true optional: true
@@ -1714,10 +1714,10 @@ snapshots:
'@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha1-browser': 3.0.0
'@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0
'@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/sha256-js': 3.0.0
'@aws-sdk/client-sso-oidc': 3.588.0(@aws-sdk/client-sts@3.588.0) '@aws-sdk/client-sso-oidc': 3.588.0
'@aws-sdk/client-sts': 3.588.0 '@aws-sdk/client-sts': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/core': 3.588.0 '@aws-sdk/core': 3.588.0
'@aws-sdk/credential-provider-node': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))(@aws-sdk/client-sts@3.588.0) '@aws-sdk/credential-provider-node': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))
'@aws-sdk/middleware-bucket-endpoint': 3.587.0 '@aws-sdk/middleware-bucket-endpoint': 3.587.0
'@aws-sdk/middleware-expect-continue': 3.577.0 '@aws-sdk/middleware-expect-continue': 3.577.0
'@aws-sdk/middleware-flexible-checksums': 3.587.0 '@aws-sdk/middleware-flexible-checksums': 3.587.0
@@ -1772,13 +1772,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0)': '@aws-sdk/client-sso-oidc@3.588.0':
dependencies: dependencies:
'@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0
'@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/sha256-js': 3.0.0
'@aws-sdk/client-sts': 3.588.0 '@aws-sdk/client-sts': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/core': 3.588.0 '@aws-sdk/core': 3.588.0
'@aws-sdk/credential-provider-node': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))(@aws-sdk/client-sts@3.588.0) '@aws-sdk/credential-provider-node': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))
'@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-host-header': 3.577.0
'@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0
'@aws-sdk/middleware-recursion-detection': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0
@@ -1815,7 +1815,6 @@ snapshots:
'@smithy/util-utf8': 3.0.0 '@smithy/util-utf8': 3.0.0
tslib: 2.6.2 tslib: 2.6.2
transitivePeerDependencies: transitivePeerDependencies:
- '@aws-sdk/client-sts'
- aws-crt - aws-crt
'@aws-sdk/client-sso@3.588.0': '@aws-sdk/client-sso@3.588.0':
@@ -1861,13 +1860,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/client-sts@3.588.0': '@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0)':
dependencies: dependencies:
'@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0
'@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/sha256-js': 3.0.0
'@aws-sdk/client-sso-oidc': 3.588.0(@aws-sdk/client-sts@3.588.0) '@aws-sdk/client-sso-oidc': 3.588.0
'@aws-sdk/core': 3.588.0 '@aws-sdk/core': 3.588.0
'@aws-sdk/credential-provider-node': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))(@aws-sdk/client-sts@3.588.0) '@aws-sdk/credential-provider-node': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))
'@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-host-header': 3.577.0
'@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0
'@aws-sdk/middleware-recursion-detection': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0
@@ -1904,6 +1903,7 @@ snapshots:
'@smithy/util-utf8': 3.0.0 '@smithy/util-utf8': 3.0.0
tslib: 2.6.2 tslib: 2.6.2
transitivePeerDependencies: transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- aws-crt - aws-crt
'@aws-sdk/core@3.588.0': '@aws-sdk/core@3.588.0':
@@ -1935,14 +1935,14 @@ snapshots:
'@smithy/util-stream': 3.0.1 '@smithy/util-stream': 3.0.1
tslib: 2.6.2 tslib: 2.6.2
'@aws-sdk/credential-provider-ini@3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))(@aws-sdk/client-sts@3.588.0)': '@aws-sdk/credential-provider-ini@3.588.0(@aws-sdk/client-sso-oidc@3.588.0)(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))':
dependencies: dependencies:
'@aws-sdk/client-sts': 3.588.0 '@aws-sdk/client-sts': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-env': 3.587.0
'@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0
'@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0
'@aws-sdk/credential-provider-sso': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0)) '@aws-sdk/credential-provider-sso': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.588.0) '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))
'@aws-sdk/types': 3.577.0 '@aws-sdk/types': 3.577.0
'@smithy/credential-provider-imds': 3.1.0 '@smithy/credential-provider-imds': 3.1.0
'@smithy/property-provider': 3.1.0 '@smithy/property-provider': 3.1.0
@@ -1953,14 +1953,14 @@ snapshots:
- '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sso-oidc'
- aws-crt - aws-crt
'@aws-sdk/credential-provider-node@3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))(@aws-sdk/client-sts@3.588.0)': '@aws-sdk/credential-provider-node@3.588.0(@aws-sdk/client-sso-oidc@3.588.0)(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))':
dependencies: dependencies:
'@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-env': 3.587.0
'@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0
'@aws-sdk/credential-provider-ini': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))(@aws-sdk/client-sts@3.588.0) '@aws-sdk/credential-provider-ini': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))
'@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0
'@aws-sdk/credential-provider-sso': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0)) '@aws-sdk/credential-provider-sso': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.588.0) '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))
'@aws-sdk/types': 3.577.0 '@aws-sdk/types': 3.577.0
'@smithy/credential-provider-imds': 3.1.0 '@smithy/credential-provider-imds': 3.1.0
'@smithy/property-provider': 3.1.0 '@smithy/property-provider': 3.1.0
@@ -1980,10 +1980,10 @@ snapshots:
'@smithy/types': 3.0.0 '@smithy/types': 3.0.0
tslib: 2.6.2 tslib: 2.6.2
'@aws-sdk/credential-provider-sso@3.588.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))': '@aws-sdk/credential-provider-sso@3.588.0(@aws-sdk/client-sso-oidc@3.588.0)':
dependencies: dependencies:
'@aws-sdk/client-sso': 3.588.0 '@aws-sdk/client-sso': 3.588.0
'@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0)) '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/types': 3.577.0 '@aws-sdk/types': 3.577.0
'@smithy/property-provider': 3.1.0 '@smithy/property-provider': 3.1.0
'@smithy/shared-ini-file-loader': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0
@@ -1993,9 +1993,9 @@ snapshots:
- '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sso-oidc'
- aws-crt - aws-crt
'@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.588.0)': '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.588.0(@aws-sdk/client-sso-oidc@3.588.0))':
dependencies: dependencies:
'@aws-sdk/client-sts': 3.588.0 '@aws-sdk/client-sts': 3.588.0(@aws-sdk/client-sso-oidc@3.588.0)
'@aws-sdk/types': 3.577.0 '@aws-sdk/types': 3.577.0
'@smithy/property-provider': 3.1.0 '@smithy/property-provider': 3.1.0
'@smithy/types': 3.0.0 '@smithy/types': 3.0.0
@@ -2120,9 +2120,9 @@ snapshots:
'@smithy/types': 3.0.0 '@smithy/types': 3.0.0
tslib: 2.6.2 tslib: 2.6.2
'@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.588.0(@aws-sdk/client-sts@3.588.0))': '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.588.0)':
dependencies: dependencies:
'@aws-sdk/client-sso-oidc': 3.588.0(@aws-sdk/client-sts@3.588.0) '@aws-sdk/client-sso-oidc': 3.588.0
'@aws-sdk/types': 3.577.0 '@aws-sdk/types': 3.577.0
'@smithy/property-provider': 3.1.0 '@smithy/property-provider': 3.1.0
'@smithy/shared-ini-file-loader': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0
@@ -2179,12 +2179,12 @@ snapshots:
'@smithy/types': 3.0.0 '@smithy/types': 3.0.0
tslib: 2.6.2 tslib: 2.6.2
'@babel/runtime-corejs3@7.24.5': '@babel/runtime-corejs3@7.24.6':
dependencies: dependencies:
core-js-pure: 3.37.1 core-js-pure: 3.37.1
regenerator-runtime: 0.14.1 regenerator-runtime: 0.14.1
'@babel/runtime@7.24.5': '@babel/runtime@7.24.6':
dependencies: dependencies:
regenerator-runtime: 0.14.1 regenerator-runtime: 0.14.1
@@ -2192,22 +2192,22 @@ snapshots:
dependencies: dependencies:
mime: 3.0.0 mime: 3.0.0
'@cloudflare/workerd-darwin-64@1.20240512.0': '@cloudflare/workerd-darwin-64@1.20240524.0':
optional: true optional: true
'@cloudflare/workerd-darwin-arm64@1.20240512.0': '@cloudflare/workerd-darwin-arm64@1.20240524.0':
optional: true optional: true
'@cloudflare/workerd-linux-64@1.20240512.0': '@cloudflare/workerd-linux-64@1.20240524.0':
optional: true optional: true
'@cloudflare/workerd-linux-arm64@1.20240512.0': '@cloudflare/workerd-linux-arm64@1.20240524.0':
optional: true optional: true
'@cloudflare/workerd-windows-64@1.20240512.0': '@cloudflare/workerd-windows-64@1.20240524.0':
optional: true optional: true
'@cloudflare/workers-types@4.20240512.0': {} '@cloudflare/workers-types@4.20240603.0': {}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
dependencies: dependencies:
@@ -2294,12 +2294,12 @@ snapshots:
eslint: 8.56.0 eslint: 8.56.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.10.0': {} '@eslint-community/regexpp@4.10.1': {}
'@eslint/eslintrc@2.1.4': '@eslint/eslintrc@2.1.4':
dependencies: dependencies:
ajv: 6.12.6 ajv: 6.12.6
debug: 4.3.4 debug: 4.3.5
espree: 9.6.1 espree: 9.6.1
globals: 13.24.0 globals: 13.24.0
ignore: 5.3.1 ignore: 5.3.1
@@ -2317,7 +2317,7 @@ snapshots:
'@humanwhocodes/config-array@0.11.14': '@humanwhocodes/config-array@0.11.14':
dependencies: dependencies:
'@humanwhocodes/object-schema': 2.0.3 '@humanwhocodes/object-schema': 2.0.3
debug: 4.3.4 debug: 4.3.5
minimatch: 3.1.2 minimatch: 3.1.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2691,20 +2691,20 @@ snapshots:
'@types/node-forge@1.3.11': '@types/node-forge@1.3.11':
dependencies: dependencies:
'@types/node': 20.12.12 '@types/node': 20.14.1
'@types/node@20.12.12': '@types/node@20.14.1':
dependencies: dependencies:
undici-types: 5.26.5 undici-types: 5.26.5
'@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.10.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)': '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.10.0 '@eslint-community/regexpp': 4.10.1
'@typescript-eslint/parser': 7.10.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': 7.12.0(eslint@8.56.0)(typescript@5.4.5)
'@typescript-eslint/scope-manager': 7.10.0 '@typescript-eslint/scope-manager': 7.12.0
'@typescript-eslint/type-utils': 7.10.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/type-utils': 7.12.0(eslint@8.56.0)(typescript@5.4.5)
'@typescript-eslint/utils': 7.10.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.12.0(eslint@8.56.0)(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 7.10.0 '@typescript-eslint/visitor-keys': 7.12.0
eslint: 8.56.0 eslint: 8.56.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.1 ignore: 5.3.1
@@ -2715,29 +2715,29 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@7.10.0(eslint@8.56.0)(typescript@5.4.5)': '@typescript-eslint/parser@7.12.0(eslint@8.56.0)(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 7.10.0 '@typescript-eslint/scope-manager': 7.12.0
'@typescript-eslint/types': 7.10.0 '@typescript-eslint/types': 7.12.0
'@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 7.10.0 '@typescript-eslint/visitor-keys': 7.12.0
debug: 4.3.4 debug: 4.3.5
eslint: 8.56.0 eslint: 8.56.0
optionalDependencies: optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@7.10.0': '@typescript-eslint/scope-manager@7.12.0':
dependencies: dependencies:
'@typescript-eslint/types': 7.10.0 '@typescript-eslint/types': 7.12.0
'@typescript-eslint/visitor-keys': 7.10.0 '@typescript-eslint/visitor-keys': 7.12.0
'@typescript-eslint/type-utils@7.10.0(eslint@8.56.0)(typescript@5.4.5)': '@typescript-eslint/type-utils@7.12.0(eslint@8.56.0)(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5)
'@typescript-eslint/utils': 7.10.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.12.0(eslint@8.56.0)(typescript@5.4.5)
debug: 4.3.4 debug: 4.3.5
eslint: 8.56.0 eslint: 8.56.0
ts-api-utils: 1.3.0(typescript@5.4.5) ts-api-utils: 1.3.0(typescript@5.4.5)
optionalDependencies: optionalDependencies:
@@ -2745,13 +2745,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@7.10.0': {} '@typescript-eslint/types@7.12.0': {}
'@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5)': '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/types': 7.10.0 '@typescript-eslint/types': 7.12.0
'@typescript-eslint/visitor-keys': 7.10.0 '@typescript-eslint/visitor-keys': 7.12.0
debug: 4.3.4 debug: 4.3.5
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.4 minimatch: 9.0.4
@@ -2762,20 +2762,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.10.0(eslint@8.56.0)(typescript@5.4.5)': '@typescript-eslint/utils@7.12.0(eslint@8.56.0)(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
'@typescript-eslint/scope-manager': 7.10.0 '@typescript-eslint/scope-manager': 7.12.0
'@typescript-eslint/types': 7.10.0 '@typescript-eslint/types': 7.12.0
'@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5)
eslint: 8.56.0 eslint: 8.56.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
'@typescript-eslint/visitor-keys@7.10.0': '@typescript-eslint/visitor-keys@7.12.0':
dependencies: dependencies:
'@typescript-eslint/types': 7.10.0 '@typescript-eslint/types': 7.12.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@ungap/structured-clone@1.2.0': {} '@ungap/structured-clone@1.2.0': {}
@@ -2858,7 +2858,7 @@ snapshots:
capnp-ts@0.7.0: capnp-ts@0.7.0:
dependencies: dependencies:
debug: 4.3.4 debug: 4.3.5
tslib: 2.6.2 tslib: 2.6.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2907,7 +2907,7 @@ snapshots:
data-uri-to-buffer@2.0.2: {} data-uri-to-buffer@2.0.2: {}
debug@4.3.4: debug@4.3.5:
dependencies: dependencies:
ms: 2.1.2 ms: 2.1.2
@@ -2993,7 +2993,7 @@ snapshots:
eslint@8.56.0: eslint@8.56.0:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
'@eslint-community/regexpp': 4.10.0 '@eslint-community/regexpp': 4.10.1
'@eslint/eslintrc': 2.1.4 '@eslint/eslintrc': 2.1.4
'@eslint/js': 8.56.0 '@eslint/js': 8.56.0
'@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/config-array': 0.11.14
@@ -3003,7 +3003,7 @@ snapshots:
ajv: 6.12.6 ajv: 6.12.6
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.3 cross-spawn: 7.0.3
debug: 4.3.4 debug: 4.3.5
doctrine: 3.0.0 doctrine: 3.0.0
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint-scope: 7.2.2 eslint-scope: 7.2.2
@@ -3130,7 +3130,7 @@ snapshots:
glob@10.4.1: glob@10.4.1:
dependencies: dependencies:
foreground-child: 3.1.1 foreground-child: 3.1.1
jackspeak: 3.1.2 jackspeak: 3.2.3
minimatch: 9.0.4 minimatch: 9.0.4
minipass: 7.1.2 minipass: 7.1.2
path-scurry: 1.11.1 path-scurry: 1.11.1
@@ -3167,7 +3167,7 @@ snapshots:
dependencies: dependencies:
function-bind: 1.1.2 function-bind: 1.1.2
hono@4.3.9: {} hono@4.4.3: {}
html-to-text@9.0.5: html-to-text@9.0.5:
dependencies: dependencies:
@@ -3224,7 +3224,7 @@ snapshots:
isexe@2.0.0: {} isexe@2.0.0: {}
jackspeak@3.1.2: jackspeak@3.2.3:
dependencies: dependencies:
'@isaacs/cliui': 8.0.2 '@isaacs/cliui': 8.0.2
optionalDependencies: optionalDependencies:
@@ -3298,12 +3298,12 @@ snapshots:
mimetext@3.0.24: mimetext@3.0.24:
dependencies: dependencies:
'@babel/runtime': 7.24.5 '@babel/runtime': 7.24.6
'@babel/runtime-corejs3': 7.24.5 '@babel/runtime-corejs3': 7.24.6
js-base64: 3.7.7 js-base64: 3.7.7
mime-types: 2.1.35 mime-types: 2.1.35
miniflare@3.20240512.0: miniflare@3.20240524.1:
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
acorn: 8.11.3 acorn: 8.11.3
@@ -3313,7 +3313,7 @@ snapshots:
glob-to-regexp: 0.4.1 glob-to-regexp: 0.4.1
stoppable: 1.1.0 stoppable: 1.1.0
undici: 5.28.4 undici: 5.28.4
workerd: 1.20240512.0 workerd: 1.20240524.0
ws: 8.17.0 ws: 8.17.0
youch: 3.3.3 youch: 3.3.3
zod: 3.23.8 zod: 3.23.8
@@ -3553,7 +3553,7 @@ snapshots:
dependencies: dependencies:
'@telegraf/types': 7.1.0 '@telegraf/types': 7.1.0
abort-controller: 3.0.0 abort-controller: 3.0.0
debug: 4.3.4 debug: 4.3.5
mri: 1.2.0 mri: 1.2.0
node-fetch: 2.7.0 node-fetch: 2.7.0
p-timeout: 4.1.0 p-timeout: 4.1.0
@@ -3585,11 +3585,11 @@ snapshots:
type-fest@0.20.2: {} type-fest@0.20.2: {}
typescript-eslint@7.10.0(eslint@8.56.0)(typescript@5.4.5): typescript-eslint@7.12.0(eslint@8.56.0)(typescript@5.4.5):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 7.10.0(@typescript-eslint/parser@7.10.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)
'@typescript-eslint/parser': 7.10.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': 7.12.0(eslint@8.56.0)(typescript@5.4.5)
'@typescript-eslint/utils': 7.10.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.12.0(eslint@8.56.0)(typescript@5.4.5)
eslint: 8.56.0 eslint: 8.56.0
optionalDependencies: optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
@@ -3623,15 +3623,15 @@ snapshots:
word-wrap@1.2.5: {} word-wrap@1.2.5: {}
workerd@1.20240512.0: workerd@1.20240524.0:
optionalDependencies: optionalDependencies:
'@cloudflare/workerd-darwin-64': 1.20240512.0 '@cloudflare/workerd-darwin-64': 1.20240524.0
'@cloudflare/workerd-darwin-arm64': 1.20240512.0 '@cloudflare/workerd-darwin-arm64': 1.20240524.0
'@cloudflare/workerd-linux-64': 1.20240512.0 '@cloudflare/workerd-linux-64': 1.20240524.0
'@cloudflare/workerd-linux-arm64': 1.20240512.0 '@cloudflare/workerd-linux-arm64': 1.20240524.0
'@cloudflare/workerd-windows-64': 1.20240512.0 '@cloudflare/workerd-windows-64': 1.20240524.0
wrangler@3.57.1(@cloudflare/workers-types@4.20240512.0): wrangler@3.58.0(@cloudflare/workers-types@4.20240603.0):
dependencies: dependencies:
'@cloudflare/kv-asset-handler': 0.3.2 '@cloudflare/kv-asset-handler': 0.3.2
'@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19)
@@ -3639,7 +3639,7 @@ snapshots:
blake3-wasm: 2.1.5 blake3-wasm: 2.1.5
chokidar: 3.6.0 chokidar: 3.6.0
esbuild: 0.17.19 esbuild: 0.17.19
miniflare: 3.20240512.0 miniflare: 3.20240524.1
nanoid: 3.3.7 nanoid: 3.3.7
path-to-regexp: 6.2.2 path-to-regexp: 6.2.2
resolve: 1.22.8 resolve: 1.22.8
@@ -3648,7 +3648,7 @@ snapshots:
source-map: 0.6.1 source-map: 0.6.1
xxhash-wasm: 1.0.2 xxhash-wasm: 1.0.2
optionalDependencies: optionalDependencies:
'@cloudflare/workers-types': 4.20240512.0 '@cloudflare/workers-types': 4.20240603.0
fsevents: 2.3.3 fsevents: 2.3.3
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
+40
View File
@@ -166,3 +166,43 @@ export const handleListQuery = async (
).bind(...params).first("count") : 0; ).bind(...params).first("count") : 0;
return c.json({ results, count }); return c.json({ results, count });
} }
export const commonParseMail = async (raw_mail: string | undefined | null): Promise<{
sender: string,
subject: string,
text: string,
html: string
} | undefined> => {
if (!raw_mail) {
return undefined;
}
// TODO: WASM parse email
// try {
// const { parse_message_wrapper } = await import('mail-parser-wasm-worker');
// const parsedEmail = parse_message_wrapper(raw_mail);
// return {
// sender: parsedEmail.sender || "",
// subject: parsedEmail.subject || "",
// text: parsedEmail.text || "",
// html: parsedEmail.body_html || "",
// };
// } catch (e) {
// console.error("Failed use mail-parser-wasm-worker to parse email", e);
// }
try {
const { default: PostalMime } = await import('postal-mime');
const parsedEmail = await PostalMime.parse(raw_mail);
return {
sender: parsedEmail.from ? `${parsedEmail.from.name} <${parsedEmail.from.address}>` : "",
subject: parsedEmail.subject || "",
text: parsedEmail.text || "",
html: parsedEmail.html || "",
};
}
catch (e) {
console.error("Failed use PostalMime to parse email", e);
}
return undefined;
}
+1 -1
View File
@@ -1,5 +1,5 @@
export const CONSTANTS = { export const CONSTANTS = {
VERSION: 'v0.5.0', VERSION: 'v0.5.1',
// DB settings // DB settings
ADDRESS_BLOCK_LIST_KEY: 'address_block_list', ADDRESS_BLOCK_LIST_KEY: 'address_block_list',
+12 -11
View File
@@ -3,7 +3,7 @@ import { HonoCustomType } from "../types";
import { CONSTANTS } from "../constants"; import { CONSTANTS } from "../constants";
import { AdminWebhookSettings, WebhookMail } from "../models"; import { AdminWebhookSettings, WebhookMail } from "../models";
import { getBooleanValue } from "../utils"; import { getBooleanValue } from "../utils";
import PostalMime from 'postal-mime'; import { commonParseMail } from "../common";
class WebhookSettings { class WebhookSettings {
@@ -15,10 +15,10 @@ class WebhookSettings {
body: string = JSON.stringify({ body: string = JSON.stringify({
"from": "${from}", "from": "${from}",
"to": "${to}", "to": "${to}",
"headers": "${headers}",
"subject": "${subject}", "subject": "${subject}",
"raw": "${raw}", "raw": "${raw}",
"parsedText": "${parsedText}", "parsedText": "${parsedText}",
"parsedHtml": "${parsedHtml}",
}, null, 2) }, null, 2)
} }
@@ -98,14 +98,14 @@ export async function trigerWebhook(
if (!settings) { if (!settings) {
return; return;
} }
const parsedEmail = await PostalMime.parse(raw_mail); const parsedEmail = await commonParseMail(raw_mail);
const res = await sendWebhook(settings, { const res = await sendWebhook(settings, {
from: parsedEmail.from.address || "", from: parsedEmail?.sender || "",
to: address, to: address,
headers: JSON.stringify(parsedEmail.headers), subject: parsedEmail?.subject || "",
subject: parsedEmail.subject || "",
raw: raw_mail, raw: raw_mail,
parsedText: parsedEmail.text || parsedEmail.html || "" parsedText: parsedEmail?.text || "",
parsedHtml: parsedEmail?.html || ""
}); });
if (!res.success) { if (!res.success) {
console.log(res.message); console.log(res.message);
@@ -119,14 +119,15 @@ async function testWebhookSettings(c: Context<HonoCustomType>): Promise<Response
const raw = await c.env.DB.prepare( const raw = await c.env.DB.prepare(
`SELECT raw FROM raw_mails WHERE address = ? ORDER BY RANDOM() LIMIT 1` `SELECT raw FROM raw_mails WHERE address = ? ORDER BY RANDOM() LIMIT 1`
).bind(address).first<string>("raw"); ).bind(address).first<string>("raw");
const parsedEmail = raw ? await PostalMime.parse(raw) : {} as any;
const parsedEmail = await commonParseMail(raw);
const res = await sendWebhook(settings, { const res = await sendWebhook(settings, {
from: parsedEmail?.from?.address || "test@test.com", from: parsedEmail?.sender || "test@test.com",
to: address, to: address,
headers: JSON.stringify(parsedEmail?.headers || { "X-Test": "test" }),
subject: parsedEmail?.subject || "test subject", subject: parsedEmail?.subject || "test subject",
raw: raw || "test raw email", raw: raw || "test raw email",
parsedText: parsedEmail?.text || parsedEmail?.html || "test parsed text" parsedText: parsedEmail?.text || "test parsed text",
parsedHtml: parsedEmail?.html || "test parsed html"
}); });
if (!res.success) { if (!res.success) {
return c.text(res.message || "send webhook error", 400); return c.text(res.message || "send webhook error", 400);
+1 -1
View File
@@ -9,10 +9,10 @@ export class AdminWebhookSettings {
export type WebhookMail = { export type WebhookMail = {
from: string; from: string;
to: string; to: string;
headers: string;
subject: string; subject: string;
raw: string; raw: string;
parsedText: string; parsedText: string;
parsedHtml: string;
} }
export class CleanupSettings { export class CleanupSettings {
+19 -15
View File
@@ -1,15 +1,15 @@
import { Context } from "hono"; import { Context } from "hono";
import { Jwt } from 'hono/utils/jwt'
import { Telegraf, Context as TgContext, Markup } from "telegraf"; import { Telegraf, Context as TgContext, Markup } from "telegraf";
import { callbackQuery } from "telegraf/filters"; import { callbackQuery } from "telegraf/filters";
import PostalMime from 'postal-mime';
import { CONSTANTS } from "../constants"; import { CONSTANTS } from "../constants";
import { getDomains, getStringValue } from '../utils'; import { getDomains, getStringValue } from '../utils';
import { HonoCustomType } from "../types"; import { HonoCustomType } from "../types";
import { TelegramSettings } from "./settings"; import { TelegramSettings } from "./settings";
import { bindTelegramAddress, deleteTelegramAddress, jwtListToAddressData, tgUserNewAddress, unbindTelegramAddress, unbindTelegramByAddress } from "./common"; import { bindTelegramAddress, deleteTelegramAddress, jwtListToAddressData, tgUserNewAddress, unbindTelegramAddress, unbindTelegramByAddress } from "./common";
import { commonParseMail } from "../common";
const COMMANDS = [ const COMMANDS = [
{ {
@@ -195,13 +195,13 @@ export function newTelegramBot(c: Context<HonoCustomType>, token: string): Teleg
if (!db_address_id) { if (!db_address_id) {
return await ctx.reply("无效地址"); return await ctx.reply("无效地址");
} }
const { raw, id: mailId } = await c.env.DB.prepare( const { raw, id: mailId, created_at } = await c.env.DB.prepare(
`SELECT * FROM raw_mails where address = ? ` `SELECT * FROM raw_mails where address = ? `
+ ` order by id desc limit 1 offset ?` + ` order by id desc limit 1 offset ?`
).bind( ).bind(
queryAddress, mailIndex queryAddress, mailIndex
).first<{ raw: string, id: string }>() || {}; ).first<{ raw: string, id: string, created_at: string }>() || {};
const { mail } = raw ? await parseMail(raw) : { mail: "已经没有邮件了" }; const { mail } = raw ? await parseMail(raw, queryAddress, created_at) : { mail: "已经没有邮件了" };
const settings = await c.env.KV.get<TelegramSettings>(CONSTANTS.TG_KV_SETTINGS_KEY, "json"); const settings = await c.env.KV.get<TelegramSettings>(CONSTANTS.TG_KV_SETTINGS_KEY, "json");
const miniAppButtons = [] const miniAppButtons = []
if (settings?.miniAppUrl && settings?.miniAppUrl?.length > 0 && mailId) { if (settings?.miniAppUrl && settings?.miniAppUrl?.length > 0 && mailId) {
@@ -265,22 +265,26 @@ export async function initTelegramBotCommands(bot: Telegraf) {
await bot.telegram.setMyCommands(COMMANDS); await bot.telegram.setMyCommands(COMMANDS);
} }
const parseMail = async (raw_mail: string | undefined | null) => { const parseMail = async (
raw_mail: string | undefined | null,
address: string, created_at: string | undefined | null
) => {
if (!raw_mail) { if (!raw_mail) {
return {}; return {};
} }
try { try {
const parsedEmail = await PostalMime.parse(raw_mail); const parsedEmail = await commonParseMail(raw_mail);
if (parsedEmail?.text?.length && parsedEmail?.text?.length > 1000) { let parsedText = parsedEmail?.text || "";
parsedEmail.text = parsedEmail.text.substring(0, 1000) + "...消息过长请到miniapp查看"; if (parsedText.length && parsedText.length > 1000) {
parsedText = parsedEmail?.text.substring(0, 1000) + "\n\n...\n消息过长请到miniapp查看";
} }
return { return {
isHtml: false, isHtml: false,
mail: `From: ${parsedEmail.from ? `${parsedEmail.from.name}[${parsedEmail.from.address}]` : "无发件人"}\n` mail: `From: ${parsedEmail?.sender || "无发件人"}\n`
+ `To: ${parsedEmail.to?.map(t => `${t.name}[${t.address}]`).join(" ")}\n` + `To: ${address}\n`
+ `Subject: ${parsedEmail.subject}\n` + (created_at ? `Date: ${created_at}\n` : "")
+ `Date: ${parsedEmail.date}\n` + `Subject: ${parsedEmail?.subject}\n`
+ `Content:\n${parsedEmail.text || "解析失败,请打开 mini app 查看"}` + `Content:\n${parsedEmail?.text || "解析失败,请打开 mini app 查看"}`
}; };
} catch (e) { } catch (e) {
return { return {
@@ -299,7 +303,7 @@ export async function sendMailToTelegram(
return; return;
} }
const userId = await c.env.KV.get(`${CONSTANTS.TG_KV_PREFIX}:${address}`); const userId = await c.env.KV.get(`${CONSTANTS.TG_KV_PREFIX}:${address}`);
const { mail } = await parseMail(raw_mail); const { mail } = await parseMail(raw_mail, address, new Date().toUTCString());
if (!mail) { if (!mail) {
return; return;
} }
+8 -2
View File
@@ -125,8 +125,14 @@ app.route('/', apiV1)
app.route('/', apiSendMail) app.route('/', apiSendMail)
app.route('/', telegramApi) app.route('/', telegramApi)
app.get('/', async c => c.text("OK")) app.get('/', async c => {
app.get('/health_check', async c => c.text("OK")) if (!c.env.DB) { return c.text("DB is not available", 400); }
return c.text("OK");
})
app.get('/health_check', async c => {
if (!c.env.DB) { return c.text("DB is not available", 400); }
return c.text("OK");
})
app.all('/*', async c => c.text("Not Found", 404)) app.all('/*', async c => c.text("Not Found", 404))