一个用于 JavaScript/TypeScript 的 sproto 协议库,这是原版 zhangshiqian1214/sproto-js 的 TypeScript 重构版本。
sproto 是一个轻量级的二进制协议,类似于 Google Protocol Buffers,但更加简洁。本库提供了在 TypeScript 环境中使用 sproto 协议的完整实现。
- 🚀 TypeScript 支持:完整的类型定义和类型安全
- 📦 轻量级:无外部依赖,体积小巧
- 🔧 易于使用:简单的 API 设计
- 🎯 高性能:优化的编解码算法
- 🌐 跨平台:支持 Node.js 和浏览器环境
bun add @imhanxi/sproto-js或使用 npm:
npm install @imhanxi/sproto-js创建 .sproto 文件定义你的协议结构:
# proto/login.sproto
.context {
rid 0 : integer
proto_checksum 1 : string
}
login 101 {
request {
token 0 : string
ctx 1 : context
}
response {
code 0 : integer
account 1 : string
gamenode 2 : string
}
}
将 .sproto 文件编译成 .spb 二进制文件(需要 sproto 编译器)。
import fs from "fs";
import sproto from "@imhanxi/sproto-js";
// 读取编译后的协议文件
const bundle = new Uint8Array(fs.readFileSync("./protocol.spb"));
// 创建 sproto 实例
const sp = sproto.createNew(bundle);
// 创建主机实例
const client = sp.host("base.package");
const clientRequest = client.attach(sp);
// 编码请求数据
const data = {
token: "your-jwt-token",
ctx: {
proto_checksum: "xxxxx",
},
};
const req = clientRequest("login.login", data);
console.log("编码后的请求数据长度:", req.length);
// 解码响应数据
const ret = client.dispatch(req);
console.log("解码结果:", ret);从编译后的协议文件创建 sproto 实例。
参数:
bundle: 编译后的.spb文件内容
返回值:
SprotoInstance: sproto 实例对象
创建协议主机实例。
参数:
packageName: 包名(可选)
返回值:
SprotoHost: 主机实例
创建请求编码函数。
参数:
sp: sproto 实例
返回值:
- 编码函数:
(name: string, args: object) => Uint8Array
解码接收到的数据包。
参数:
buffer: 要解码的数据包
返回值:
- 解码后的对象
| 类型 | 描述 |
|---|---|
| string | 字符串类型 |
| binary | 二进制字符串(字符串的子类型) |
| integer | 整数,最大长度为有符号 52 位(符合 IEEE 754 标准) |
| double | 双精度浮点数,符合 IEEE 754 标准 |
| boolean | 布尔值:true 或 false |
sproto-js/
├── src/
│ └── sproto.ts # 主要实现文件
├── proto/
│ ├── base.sproto # 基础协议定义
│ └── login.sproto # 登录协议定义
├── test.ts # 使用示例
├── package.json
└── README.md
bun run buildbun run test.tsbunx tsc -p tsconfig.jsonMIT License
欢迎提交 Issue 和 Pull Request!