universal-message
Version:
A universal message communication library for JavaScript/TypeScript that works across different environments including Worker threads, WebSocket, and other communication channels
458 lines (346 loc) • 12.1 kB
Markdown
# Universal Message
[English](README.md) | [中文](README.zh.md)
一个强大的通用 JavaScript/TypeScript 消息通信库,支持 Worker 线程、WebSocket 和其他通信渠道之间的无缝通信。
## 特性
- 🚀 **通用性**: 支持多种通信渠道(Worker 线程、WebSocket、MessagePort 等)
- 🔌 **插件系统**: 可扩展的插件架构,支持自定义消息编码/解码,内置复杂类型支持
- 🎯 **类型安全**: 完整的 TypeScript 支持,深度对象访问智能路径补全(`obj.prop.array.0.field`)
- 📦 **零依赖**: 轻量级,无外部依赖
- 🔄 **双向通信**: 支持客户端-服务器和点对点通信模式
- ⚡ **基于 Promise**: 现代的 async/await API 和 Promise 支持,带超时处理
- 🏗️ **远程类**: 完整的远程类实例化和方法调用支持
- 📡 **共享对象**: 跨环境对象共享和同步
- 🛡️ **错误处理**: 全面的错误处理,保留堆栈跟踪信息
- 🎨 **自定义序列化**: 高级 JSON 序列化,支持 Date、Map、Set、RegExp、Buffer、BigInt 等
## 安装
```bash
npm install universal-message
```
```bash
yarn add universal-message
```
```bash
pnpm add universal-message
```
## 快速开始
### 基本用法
```typescript
import { MessageServer, MessageClient } from 'universal-message';
// 服务器端
const server = new MessageServer({
on: (callback) => {
// 设置消息监听器(如 WebSocket onmessage, Worker onmessage)
worker.onmessage = callback;
},
send: (data) => {
// 设置消息发送器(如 WebSocket send, Worker postMessage)
worker.postMessage(data);
}
});
// 客户端
const client = new MessageClient({
on: (callback) => {
// 设置消息监听器
self.onmessage = callback;
},
send: (data) => {
// 设置消息发送器
self.postMessage(data);
}
});
```
### Worker 线程示例
```typescript
// main.ts
import { Worker } from 'worker_threads';
import { MessageServer } from 'universal-message';
const worker = new Worker('./worker.js');
const server = new MessageServer({
on: (callback) => worker.on('message', callback),
send: (data) => worker.postMessage(data)
});
// 发送消息并等待响应
const result = await server.send('calculate', { a: 10, b: 20 });
console.log(result); // 30
// 创建远程类实例
const calc = await server.newClass('Calculator');
const sum = await calc.call('add', 10, 20); // 30
// worker.js
import { parentPort } from 'worker_threads';
import { MessageClient } from 'universal-message';
const client = new MessageClient({
on: (callback) => parentPort?.on('message', callback),
send: (data) => parentPort?.postMessage(data)
});
// 注册类以供远程访问
class Calculator {
add(a, b) { return a + b; }
multiply(a, b) { return a * b; }
}
client.addClass(Calculator);
// 监听消息
client.on('calculate', ({ a, b }) => {
return a + b;
});
```
### WebSocket 示例
```typescript
// 服务器端
import { MessageServer } from 'universal-message';
const ws = new WebSocket('ws://localhost:8080');
const server = new MessageServer({
on: (callback) => {
ws.onmessage = (event) => callback(JSON.parse(event.data));
},
send: (data) => {
ws.send(JSON.stringify(data));
}
});
// 使用类型安全
const user = await server.send<User>('getUser', { id: 123 });
// 客户端(类似的 WebSocket 设置)
```
### MessagePort 示例
```typescript
// 创建 MessageChannel
const channel = new MessageChannel();
// Port 1 - 服务器
const server = new MessageServer({
on: (callback) => channel.port1.onmessage = callback,
send: (data) => channel.port1.postMessage(data)
});
// Port 2 - 客户端
const client = new MessageClient({
on: (callback) => channel.port2.onmessage = callback,
send: (data) => channel.port2.postMessage(data)
});
```
## API 参考
### MessageServer
具有增强远程功能的服务器端消息处理器。
#### 方法
- `send<T>(key: string, data?: any, timeout?: number): Promise<T>` - 发送消息并等待响应
- `on(key: string, callback: Function)` - 监听消息
- `hasOn(key: string): boolean` - 检查消息监听器是否存在
- `remove(key: string)` - 移除消息监听器
- `removeAll(key: string)` - 移除监听器并通知另一端
- `emit<T>(key: string, data?: any, callback?: Function): Promise<T>` - send 的别名
- `newClass<T>(target: string | Class, constructorArgs?: any[]): Promise<RemoteClass<T>>` - 创建远程类实例
- `staticClass<T>(target: string | Class): StaticMethods<T>` - 访问静态类方法
- `addShared<T>(key: string, value?: T): SharedObject<T>` - 创建或访问共享对象
### MessageClient
具有类注册功能的客户端消息处理器。
#### 方法
- `send<T>(key: string, data?: any, timeout?: number): Promise<T>` - 发送消息并等待响应
- `on(key: string, callback: Function)` - 监听消息
- `hasOn(key: string): boolean` - 检查消息监听器是否存在
- `remove(key: string)` - 移除消息监听器
- `addClass<T>(className: string, classConstructor: T)` - 注册类以供远程访问
- `addShared<T>(key: string, value?: T): SharedObject<T>` - 创建或访问共享对象
### MessageShared
为服务器和客户端提供共享对象功能的基类。
#### 共享对象
```typescript
// 跨环境创建或访问共享对象
const sharedCounter = client.shared('counter', 0);
// 获取值
const count = await sharedCounter.value(); // 0
// 设置值
await sharedCounter.set('', 5);
// 在共享对象上调用方法
const sharedArray = client.shared('myArray', [1, 2, 3]);
await sharedArray.call('push', 4); // [1, 2, 3, 4]
// 删除属性
await sharedArray.del('0'); // 移除第一个元素
```
## 插件系统
Universal Message 支持强大的插件系统来扩展功能:
```typescript
import { MessagePlugin } from 'universal-message';
// 自定义插件示例
class LoggingPlugin extends MessagePlugin {
name = 'logging-plugin';
async onSend(data) {
console.log('发送:', data);
return data;
}
async onMessage(data) {
console.log('接收:', data);
return data;
}
}
// 添加插件
server.addPlugin(new LoggingPlugin());
// 移除插件
server.removePlugin('logging-plugin');
```
### 内置插件
- **MessageEcoderPlugin**: 处理复杂数据类型的编码/解码,包括:
- **ECoderAbortController**: AbortController 序列化,带信号传播
- **ECoderClassTransformer**: 使用 class-transformer 自动类实例序列化
### 自定义编码器
为特定数据类型创建自定义编码器:
```typescript
import { MessageEcoder } from 'universal-message';
const CustomEncoder: MessageEcoder<MyClass> = {
target: (data) => data instanceof MyClass,
key: 'MyClass',
encode: (data, tool) => {
// 自定义序列化逻辑
return { customData: data.serialize() };
},
decode: (data, tool) => {
// 自定义反序列化逻辑
return MyClass.deserialize(data.customData);
},
update: (newValue, target, tool) => {
// 如果需要,处理更新
target.update(newValue);
}
};
```
## 远程类使用
Universal Message 提供强大的远程类实例化和方法调用功能:
```typescript
// 定义具有复杂功能的类
class DatabaseManager {
private connections = new Map();
constructor(config: DbConfig) {
this.config = config;
}
async connect(database: string) {
// 连接逻辑
return `Connected to ${database}`;
}
async query(sql: string, params: any[]) {
// 查询逻辑
return { rows: [], count: 0 };
}
static getDrivers() {
return ['mysql', 'postgres', 'sqlite'];
}
}
// 客户端 - 注册类
client.addClass('DatabaseManager', DatabaseManager);
// 服务器端 - 使用具有完整类型安全的远程类
const db = await server.newClass<DatabaseManager>('DatabaseManager', [{ host: 'localhost' }]);
// 调用实例方法
const result = await db.call('connect', 'myapp');
const rows = await db.call('query', 'SELECT * FROM users', []);
// 访问静态方法
const drivers = await db.static.call('getDrivers');
// 类型安全的深度属性访问
const config = await db.get('config');
const host = await db.get('config.host'); // 类型安全的深度访问
await db.set('config.timeout', 5000);
```
### 高级类型安全
使用 TypeScript,你可以获得深度对象路径的智能自动补全:
```typescript
class User {
profile = {
personal: {
name: 'John',
age: 30,
addresses: [
{ street: '123 Main St', city: 'NYC' }
]
},
settings: {
theme: 'dark',
notifications: { email: true, push: false }
}
};
updateProfile(data: any) { /* ... */ }
}
const user = await server.newClass<User>('User');
// 所有这些路径都有完整的类型检查和自动补全:
const name = await user.get('profile.personal.name'); // string
const age = await user.get('profile.personal.age'); // number
const street = await user.get('profile.personal.addresses.0.street'); // string
const theme = await user.get('profile.settings.theme'); // string
const emailNotif = await user.get('profile.settings.notifications.email'); // boolean
// 带参数类型检查的方法调用
await user.call('updateProfile', { name: 'Jane' });
```
## 高级特性
### 复杂数据类型支持
Universal Message 包含高级 JSON 序列化,支持:
```typescript
// 日期、Map、Set、正则表达式、错误、URL
const complexData = {
timestamp: new Date(),
userMap: new Map([['user1', { id: 1 }], ['user2', { id: 2 }]]),
tags: new Set(['admin', 'user']),
pattern: /^[a-z]+$/i,
config: new URL('https://api.example.com'),
lastError: new Error('连接失败')
};
await server.send('processData', complexData);
// 所有类型都会自动正确序列化和反序列化
// BigInt 支持
const bigNumber = BigInt('12345678901234567890');
await server.send('calculateLarge', bigNumber);
// Buffer/ArrayBuffer 支持(Node.js 和 Web)
const buffer = Buffer.from('Hello World');
const arrayBuffer = new ArrayBuffer(16);
await server.send('processBytes', { buffer, arrayBuffer });
```
### AbortController 支持
内置可取消操作支持:
```typescript
const controller = new AbortController();
// 发送带取消控制器的操作
const promise = server.send('longRunningTask', {
signal: controller.signal
});
// 5 秒后取消
setTimeout(() => controller.abort(), 5000);
try {
const result = await promise;
} catch (error) {
if (error.name === 'AbortError') {
console.log('操作已取消');
}
}
```
### Class-Transformer 集成
自动类实例序列化:
```typescript
import { Transform, Type } from 'class-transformer';
class Address {
street: string;
city: string;
}
class Person {
name: string;
@Type(() => Date)
birthDate: Date;
@Type(() => Address)
address: Address;
}
// 实例会自动序列化,保留装饰器
const person = new Person();
person.name = 'John';
person.birthDate = new Date();
person.address = new Address();
await server.send('processPerson', person);
// Person 实例在另一端正确重构
```
### 错误处理与堆栈跟踪
```typescript
try {
const result = await server.send('riskyOperation', data, 10000); // 10秒超时
} catch (error) {
if (error.code === 'TIMEOUT') {
console.log('操作超时');
} else {
console.log('错误:', error.message);
console.log('堆栈:', error.stack); // 跨环境保留
}
}
```
## 贡献
欢迎贡献!请随时提交 Pull Request。
## 许可证
MIT 许可证。详情请查看 [LICENSE](LICENSE)。