1
0
Fork 0
mirror of https://github.com/nbtca/ServerlessMQ.git synced 2026-09-19 23:05:59 +08:00
Message Queue host on Cloudflare Workers / webhook to websocket
  • TypeScript 92.3%
  • CSS 6.4%
  • HTML 1.3%
Find a file
2025-10-23 16:03:22 +08:00
.husky chore: ignore static files 2025-09-03 11:10:18 +08:00
.vscode feat: basic websocket 2025-05-06 19:23:57 +08:00
backend perf: optimize webhook 2025-10-23 16:03:22 +08:00
frontend revert logging 2025-09-14 21:35:02 +08:00
.gitignore chore: ignore static files 2025-09-03 11:10:18 +08:00
.nvmrc chore: update node version 2025-09-03 11:24:57 +08:00
biome.json chore: ignore static files 2025-09-03 11:10:18 +08:00
commitlint.config.ts chore: add commit lint 2025-05-17 14:55:08 +08:00
package.json chore: update packages & add kysely 2025-10-23 15:22:53 +08:00
pnpm-lock.yaml chore: update packages & add kysely 2025-10-23 15:22:53 +08:00
pnpm-workspace.yaml chore: add frontend 2025-09-03 11:05:19 +08:00
README.md feat: expand hmac signature header support 2025-10-20 11:15:22 +08:00

Serverless MQ

A serverless message queue for Cloudflare Workers Based on Durable Objects.

项目简介

这是一个基于 Durable Objects 的无服务器消息队列,旨在基于 Cloudflare Workers 提供简单的消息处理能力。

项目结构

这是一个使用 pnpm workspace 管理的 monorepo 项目:

  • backend/ - Cloudflare Workers 后端服务
  • frontend/ - React 前端应用
  • 根目录包含共享的工具配置husky、commitlint、biome等

开发命令

# 安装依赖
pnpm install

# 启动后端开发服务器
pnpm dev

# 启动前端开发服务器
pnpm dev:frontend

# 构建前端
pnpm build:frontend

# 部署到生产环境
pnpm deploy

# 代码格式化
pnpm format

# 代码检查
pnpm lint

接入流程

1. 部署服务

# 开发环境
pnpm dev

# 部署到生产环境  
pnpm deploy

2. 配置鉴权信息

wrangler.jsonc 中配置全局密钥:

{
  "vars": {
    "GLOBAL_SECRET": "your-secret-key",
    "GLOBAL_TOKEN": "your-auth-token"
  }
}

也可以为特定主题配置独立的密钥:

  • TOKEN_<TOPIC>: 特定主题的Token
  • SECRET_<TOPIC>: 特定主题的Secret

3. 鉴权方式

系统支持两种鉴权方式(二选一):

方式一Bearer Token 鉴权

  • Header: Authorization: Bearer <token>
  • 查询参数: ?token=<token>
  • 其他Header: X-Auth-Token: <token>

方式二HMAC-SHA256 签名鉴权

  • Header: X-Hub-Signature-256 或任何以 -Signature-256 -Signature-Sha-256 结尾的Header
  • 算法: 使用配置的Secret作为HMAC密钥对请求body进行SHA256签名
  • 格式: sha256=<hex_signature>

4. API端点

WebSocket连接

GET /<topic>
升级协议: WebSocket
鉴权: Token方式GET请求无body不支持签名鉴权

Webhook推送

POST /<topic>
Content-Type: application/json
鉴权: Token或签名方式
Body: 任意JSON数据

5. 使用示例

客户端A推送方

// 使用Token鉴权
fetch('https://your-domain.com/service_1', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer your-token',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    message: 'Hello World',
    timestamp: Date.now()
  })
});

// 或使用签名鉴权
const signature = await generateHMACSignature(secret, jsonBody);
fetch('https://your-domain.com/service_1', {
  method: 'POST',
  headers: {
    'X-App-Signature-256': `sha256=${signature}`,
    'Content-Type': 'application/json'
  },
  body: jsonBody
});

客户端B订阅方

// WebSocket连接
const ws = new WebSocket('wss://your-domain.com/service_1?token=your-token');

ws.onmessage = (event) => {
  const packet = JSON.parse(event.data);
  
  // 处理不同类型的消息
  switch(packet.type) {
    case 'webhook':
      // 处理Webhook消息
      console.log('收到Webhook:', packet.data.body);
      break;
    case 'activebroadcast':
      // 处理客户端状态变化
      console.log('当前连接的客户端:', packet.data.clients);
      break;
    default:
      // 处理其他客户端发送的消息
      console.log('收到消息:', packet);
  }
};

6. 消息包结构

Webhook消息包

{
  type: 'webhook',
  data: {
    body: any,        // 原始请求体
    headers: object,  // 请求头
    method: string,   // HTTP方法
    topic: string,    // 主题名称
    url: string       // 请求URL
  }
}

客户端状态广播包

{
  type: 'activebroadcast',
  data: {
    clients: [{
      address: string,  // 客户端IP
      headers: object   // 连接时的Headers
    }]
  }
}

7. 特性

  • 实时通信: 基于WebSocket的实时消息推送
  • 多种鉴权: 支持Token和HMAC签名两种安全鉴权方式
  • 主题隔离: 不同主题间完全隔离,支持独立配置
  • 客户端状态: 自动广播客户端连接/断开状态
  • CORS支持: 内置跨域支持
  • 错误处理: 完善的错误处理和状态码返回

开发工具

https://biomejs.dev/

  • 格式化(暂存区)代码
npm run format
  • (暂存区)代码检查
npm run lint

全局格式化和 lint如有必要

npx @biomejs/biome format --write ./src
npx @biomejs/biome lint ./src --fix