feat: WmailHub v1.0.0 —— Cloudflare Email Workers 邮件接收与转发平台(本地可用版本)
- Console:React 19 + antd 6.6.5 前端(登录 admin/admin)+ Hono 管理 API (Nodes/Domains/Mailboxes/Emails/Webhooks/Keys/OAuth/Admin) - Node:Bun 转发节点(HMAC 签名、有限重试、心跳、结构化日志、优雅退出) - Email Worker:Cloudflare email handler + 本地联调入口 - shared:HMAC 协议(docs/04)、wmh_ Key(32 位)、AES-GCM 加密、SSRF 防护 - 邮件管线:postal-mime 解析、附件、catch-all、限额、malformed 降级、TTL 1 天 - Webhook:签名投递、指数退避重试、SSRF 校验、投递日志 - API v1 + MCP(JSON-RPC,六工具,凭据 kind 隔离) - Cloudflare OAuth:真实 + 本地 sim 模式,自动安装管线(幂等,无需手工命令) - 测试:bun test 41 例(协议安全/管线/TTL/Webhook/SSRF/MCP/OAuth/鉴权)+ Playwright UI 冒烟 - LOGO/favicon 由 codex CLI 生成
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* 前端构建:bun build 打包 React SPA → console/public/
|
||||
* 产物:index.html + assets/main.js + logo/favicon。
|
||||
*/
|
||||
|
||||
import { cpSync, mkdirSync } from "node:fs";
|
||||
import path from "node:path";
|
||||
|
||||
const ROOT = path.resolve(import.meta.dir, "..");
|
||||
const FRONTEND = path.join(ROOT, "console/frontend");
|
||||
const PUBLIC = path.join(ROOT, "console/public");
|
||||
|
||||
mkdirSync(path.join(PUBLIC, "assets"), { recursive: true });
|
||||
|
||||
const result = await Bun.build({
|
||||
entrypoints: [path.join(FRONTEND, "src/main.tsx")],
|
||||
outdir: path.join(PUBLIC, "assets"),
|
||||
naming: "[name].[ext]",
|
||||
target: "browser",
|
||||
minify: true,
|
||||
splitting: false,
|
||||
sourcemap: process.env.WMAILHUB_DEV ? "linked" : "none",
|
||||
});
|
||||
|
||||
if (!result.success) {
|
||||
for (const log of result.logs) console.error(log);
|
||||
console.error("[build] frontend build failed");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
cpSync(path.join(FRONTEND, "index.html"), path.join(PUBLIC, "index.html"));
|
||||
cpSync(path.join(ROOT, "assets/logo.svg"), path.join(PUBLIC, "logo.svg"));
|
||||
cpSync(path.join(ROOT, "assets/favicon.svg"), path.join(PUBLIC, "favicon.svg"));
|
||||
cpSync(path.join(ROOT, "assets/favicon.ico"), path.join(PUBLIC, "favicon.ico"));
|
||||
|
||||
console.log("[build] frontend -> console/public OK");
|
||||
Reference in New Issue
Block a user