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,85 @@
|
||||
/**
|
||||
* Console 运行环境类型:同时兼容 Cloudflare Workers 与本地 Bun 运行时。
|
||||
* D1Database / R2Bucket 为本项目实际用到的最小接口子集。
|
||||
*/
|
||||
|
||||
/** # 成员变量: D1 预处理语句最小接口 **/
|
||||
export interface D1PreparedStatement {
|
||||
bind(...values: unknown[]): D1PreparedStatement;
|
||||
first<T = Record<string, unknown>>(colName?: string): Promise<T | null>;
|
||||
all<T = Record<string, unknown>>(): Promise<{ results: T[]; success?: boolean; meta?: unknown }>;
|
||||
run(): Promise<{ success: boolean; meta: { changes?: number; last_row_id?: number } }>;
|
||||
}
|
||||
|
||||
/** # 成员变量: D1 数据库最小接口 **/
|
||||
export interface D1Database {
|
||||
prepare(query: string): D1PreparedStatement;
|
||||
batch<T = unknown>(statements: D1PreparedStatement[]): Promise<T[]>;
|
||||
exec(query: string): Promise<unknown>;
|
||||
}
|
||||
|
||||
/** # 成员变量: R2 对象最小接口 **/
|
||||
export interface R2ObjectBody {
|
||||
arrayBuffer(): Promise<ArrayBuffer>;
|
||||
text(): Promise<string>;
|
||||
json(): Promise<unknown>;
|
||||
}
|
||||
|
||||
/** # 成员变量: R2 桶最小接口 **/
|
||||
export interface R2Bucket {
|
||||
put(
|
||||
key: string,
|
||||
value: ArrayBuffer | Uint8Array | string | ReadableStream | Blob,
|
||||
options?: { httpMetadata?: Record<string, string> },
|
||||
): Promise<unknown>;
|
||||
get(key: string): Promise<R2ObjectBody | null>;
|
||||
delete(keys: string | string[]): Promise<void>;
|
||||
head(key: string): Promise<{ key: string; size: number } | null>;
|
||||
}
|
||||
|
||||
/** # 成员变量: Console env 绑定 **/
|
||||
export interface Env {
|
||||
/** D1 数据库(本地运行时由 LocalD1 提供) **/
|
||||
DB: D1Database;
|
||||
/** R2 桶(本地运行时由 LocalR2 提供) **/
|
||||
R2: R2Bucket;
|
||||
/** Workers 静态资源绑定(本地运行时为空,由 Bun 直接读文件) **/
|
||||
ASSETS?: { fetch(request: Request): Promise<Response> };
|
||||
/** 会话/加密主密钥;未提供时自动生成并持久化到 settings 表 **/
|
||||
SESSION_SECRET?: string;
|
||||
/** Console 对外地址(用于 OAuth redirect_uri 与展示) **/
|
||||
PUBLIC_BASE_URL?: string;
|
||||
/** Cloudflare OAuth 客户端;两个都配置时走真实 OAuth,否则进入本地 sim 模式 **/
|
||||
CF_OAUTH_CLIENT_ID?: string;
|
||||
CF_OAUTH_CLIENT_SECRET?: string;
|
||||
CF_OAUTH_REDIRECT_URI?: string;
|
||||
/** 强制使用 sim 模式("1") **/
|
||||
WMAILHUB_SIM_CF?: string;
|
||||
/** 本地联调:允许 webhook endpoint 指向私网/localhost("1"),生产严禁开启 **/
|
||||
WMAILHUB_ALLOW_PRIVATE_WEBHOOKS?: string;
|
||||
}
|
||||
|
||||
/** # 成员变量: Workers 执行上下文最小接口 **/
|
||||
export interface WorkersExecutionContext {
|
||||
waitUntil(promise: Promise<unknown>): void;
|
||||
passThroughOnException(): void;
|
||||
}
|
||||
|
||||
/** # 成员变量: Workers Cron 触发事件最小接口 **/
|
||||
export interface ScheduledEvent {
|
||||
cron: string;
|
||||
scheduledTime: number;
|
||||
}
|
||||
|
||||
/** # 成员变量: Hono context 变量 **/
|
||||
export interface AppVars {
|
||||
/** 已登录用户 ID(cookie 会话) **/
|
||||
userId?: string;
|
||||
/** 已认证 API/MCP Key 信息 **/
|
||||
apiKeyKind?: "api" | "mcp";
|
||||
apiKeyId?: string;
|
||||
/** internal 路由中已读出的原始请求体(nodeAuth 中间件缓存) **/
|
||||
rawBody?: Uint8Array;
|
||||
/** internal 路由中通过校验的 credential id **/
|
||||
nodeCredentialId?: string;
|
||||
}
|
||||
Reference in New Issue
Block a user