@alipay-inc/mpaas-mgs-sdk-websocket
Version:
A WebSocket SDK for mPaaS MGS with connection management, reconnection, and event handling
531 lines (407 loc) • 12 kB
Markdown
# mPaaS MGS WebSocket SDK
一个功能完整的 WebSocket 客户端 SDK,专为 mPaaS MGS 平台设计,提供连接管理、自动重连、心跳检测、消息队列等企业级功能。
## 项目特性
- 🔌 **自动连接管理** - 智能连接状态管理和错误处理
- 🔄 **自动重连机制** - 可配置的重连策略,确保连接稳定性
- 💓 **心跳检测** - 定时心跳保持连接活跃
- 📦 **消息队列** - 连接断开时自动缓存消息,连接恢复后重发
- 📊 **连接统计** - 详细的连接和消息统计信息
- 🎯 **事件驱动** - 完整的事件系统,支持各种连接状态监听
- 🛠️ **TypeScript 支持** - 完整的类型定义,提供优秀的开发体验
- 📝 **日志系统** - 可配置的日志级别,便于调试和监控
## 兼容环境
- **浏览器**: 支持现代浏览器(Chrome 58+, Firefox 55+, Safari 11+, Edge 79+)
- **Node.js**: 支持 Node.js 14+ 环境(需要 WebSocket polyfill)
- **TypeScript**: 支持 TypeScript 4.0+
## 安装方法
```bash
npm install mpaas-mgs-sdk-websocket
```
或使用 yarn:
```bash
yarn add mpaas-mgs-sdk-websocket
```
## 快速开始
### 基本使用
```typescript
import { WebSocketClient, WebSocketEventType } from 'mpaas-mgs-sdk-websocket';
// 创建客户端实例
const client = new WebSocketClient({
url: 'wss://your-websocket-server.com',
autoReconnect: true,
heartbeatInterval: 30000
});
// 监听连接事件
client.on(WebSocketEventType.OPEN, () => {
console.log('连接已建立');
});
// 监听消息事件
client.on(WebSocketEventType.MESSAGE, (event) => {
console.log('收到消息:', event.data);
});
// 连接服务器
await client.connect();
// 发送消息
await client.send('Hello WebSocket!');
```
### 高级配置
```typescript
import { WebSocketClient, LogLevel, Logger } from 'mpaas-mgs-sdk-websocket';
// 设置日志级别
Logger.getInstance().setLevel(LogLevel.DEBUG);
// 创建高级配置的客户端
const client = new WebSocketClient({
url: 'wss://your-websocket-server.com',
protocols: ['chat', 'notification'],
timeout: 10000,
autoReconnect: true,
reconnectInterval: 5000,
maxReconnectAttempts: 10,
heartbeatInterval: 30000,
heartbeatMessage: JSON.stringify({ type: 'ping' }),
headers: {
'Authorization': 'Bearer your-token',
'X-Client-Version': '1.0.0'
}
});
```
## API 文档
### WebSocketClient
主要的 WebSocket 客户端类。
#### 构造函数
```typescript
new WebSocketClient(config: WebSocketConfig)
```
#### 配置选项 (WebSocketConfig)
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `url` | `string` | - | WebSocket 服务器 URL(必填) |
| `protocols` | `string \| string[]` | `[]` | 连接协议 |
| `timeout` | `number` | `10000` | 连接超时时间(毫秒) |
| `autoReconnect` | `boolean` | `true` | 是否自动重连 |
| `reconnectInterval` | `number` | `3000` | 重连间隔时间(毫秒) |
| `maxReconnectAttempts` | `number` | `5` | 最大重连次数 |
| `heartbeatInterval` | `number` | `30000` | 心跳间隔时间(毫秒) |
| `heartbeatMessage` | `string` | `'ping'` | 心跳消息内容 |
| `headers` | `Record<string, string>` | `{}` | 自定义请求头 |
#### 主要方法
##### connect(): Promise<void>
连接到 WebSocket 服务器。
```typescript
try {
await client.connect();
console.log('连接成功');
} catch (error) {
console.error('连接失败:', error);
}
```
##### disconnect(code?: number, reason?: string): void
断开 WebSocket 连接。
```typescript
client.disconnect(1000, '正常关闭');
```
##### send(data: string | ArrayBuffer | Blob, options?: SendOptions): Promise<void>
发送消息到服务器。
```typescript
// 发送文本消息
await client.send('Hello World!');
// 发送 JSON 消息
await client.send(JSON.stringify({ type: 'message', content: 'Hello' }));
// 带选项发送
await client.send('message', {
waitForConnection: true,
timeout: 5000
});
```
##### isConnected(): boolean
检查是否已连接。
```typescript
if (client.isConnected()) {
await client.send('message');
}
```
##### getState(): WebSocketState
获取当前连接状态。
```typescript
import { WebSocketState } from 'mpaas-mgs-sdk-websocket';
const state = client.getState();
console.log('当前状态:', state === WebSocketState.OPEN ? '已连接' : '未连接');
```
##### getStats(): WebSocketStats
获取连接统计信息。
```typescript
const stats = client.getStats();
console.log('统计信息:', {
state: stats.state,
connectedAt: stats.connectedAt,
sentMessages: stats.sentMessageCount,
receivedMessages: stats.receivedMessageCount,
reconnectCount: stats.reconnectCount
});
```
##### updateConfig(config: Partial<WebSocketConfig>): void
动态更新配置。
```typescript
client.updateConfig({
heartbeatInterval: 15000,
maxReconnectAttempts: 10
});
```
##### destroy(): void
销毁客户端实例,清理所有资源。
```typescript
client.destroy();
```
### 事件系统
SDK 基于事件驱动架构,支持以下事件:
#### WebSocketEventType
| 事件 | 说明 | 事件数据 |
|------|------|----------|
| `OPEN` | 连接建立 | `Event` |
| `MESSAGE` | 收到消息 | `MessageEvent` |
| `ERROR` | 连接错误 | `Event` |
| `CLOSE` | 连接关闭 | `CloseEvent` |
| `RECONNECTING` | 正在重连 | `{ attempt: number }` |
| `RECONNECTED` | 重连成功 | `Event` |
| `RECONNECT_FAILED` | 重连失败 | `{ maxAttempts: number }` |
#### 事件监听示例
```typescript
import { WebSocketEventType } from 'mpaas-mgs-sdk-websocket';
// 监听连接事件
client.on(WebSocketEventType.OPEN, (event) => {
console.log('WebSocket 连接已建立');
});
// 监听消息事件
client.on(WebSocketEventType.MESSAGE, (event) => {
console.log('收到消息:', event.data);
});
// 监听重连事件
client.on(WebSocketEventType.RECONNECTING, (data) => {
console.log(`正在进行第 ${data.attempt} 次重连...`);
});
// 一次性监听器
client.once(WebSocketEventType.OPEN, () => {
console.log('首次连接成功');
});
// 移除监听器
const messageHandler = (event) => console.log(event.data);
client.on(WebSocketEventType.MESSAGE, messageHandler);
client.off(WebSocketEventType.MESSAGE, messageHandler);
```
### 日志系统
SDK 内置了完整的日志系统:
```typescript
import { Logger, LogLevel } from 'mpaas-mgs-sdk-websocket';
const logger = Logger.getInstance();
// 设置日志级别
logger.setLevel(LogLevel.DEBUG); // DEBUG, INFO, WARN, ERROR, NONE
// 设置日志前缀
logger.setPrefix('[MyApp]');
// 日志输出
logger.debug('调试信息');
logger.info('一般信息');
logger.warn('警告信息');
logger.error('错误信息');
```
## 使用示例
### 聊天应用示例
```typescript
import { WebSocketClient, WebSocketEventType } from 'mpaas-mgs-sdk-websocket';
interface ChatMessage {
type: 'message' | 'join' | 'leave';
user: string;
content: string;
timestamp: number;
}
const chatClient = new WebSocketClient({
url: 'wss://chat.example.com',
autoReconnect: true,
heartbeatInterval: 30000
});
// 发送聊天消息
async function sendChatMessage(user: string, content: string) {
const message: ChatMessage = {
type: 'message',
user,
content,
timestamp: Date.now()
};
await chatClient.send(JSON.stringify(message));
}
// 处理接收的消息
chatClient.on(WebSocketEventType.MESSAGE, (event) => {
try {
const message: ChatMessage = JSON.parse(event.data);
console.log(`[${message.user}]: ${message.content}`);
} catch (error) {
console.error('消息解析失败:', error);
}
});
// 连接并加入聊天
await chatClient.connect();
await sendChatMessage('Alice', 'Hello everyone!');
```
### 实时数据监控示例
```typescript
import { WebSocketClient, WebSocketEventType } from 'mpaas-mgs-sdk-websocket';
const monitorClient = new WebSocketClient({
url: 'wss://monitor.example.com',
autoReconnect: true,
reconnectInterval: 2000,
maxReconnectAttempts: -1, // 无限重连
heartbeatInterval: 10000
});
// 订阅数据流
async function subscribe(channels: string[]) {
const subscribeMessage = {
action: 'subscribe',
channels
};
await monitorClient.send(JSON.stringify(subscribeMessage));
}
// 处理实时数据
monitorClient.on(WebSocketEventType.MESSAGE, (event) => {
const data = JSON.parse(event.data);
switch (data.type) {
case 'metrics':
updateMetricsDashboard(data.payload);
break;
case 'alert':
showAlert(data.payload);
break;
case 'heartbeat':
console.log('服务器心跳正常');
break;
}
});
// 连接并订阅
await monitorClient.connect();
await subscribe(['cpu', 'memory', 'network']);
```
## 错误处理
SDK 提供了完善的错误处理机制:
```typescript
// 连接错误处理
client.on(WebSocketEventType.ERROR, (event) => {
console.error('WebSocket 错误:', event);
});
// 连接关闭处理
client.on(WebSocketEventType.CLOSE, (event) => {
console.log('连接关闭:', {
code: event.code,
reason: event.reason,
wasClean: event.wasClean
});
});
// 重连失败处理
client.on(WebSocketEventType.RECONNECT_FAILED, (data) => {
console.error(`重连失败,已尝试 ${data.maxAttempts} 次`);
// 可以在这里实现自定义的错误恢复逻辑
});
// 发送消息错误处理
try {
await client.send('message');
} catch (error) {
console.error('发送消息失败:', error);
}
```
## 最佳实践
### 1. 连接管理
```typescript
// 推荐:使用 try-catch 处理连接
try {
await client.connect();
} catch (error) {
console.error('初始连接失败,将依赖自动重连机制');
}
// 推荐:在应用退出时优雅关闭
window.addEventListener('beforeunload', () => {
client.disconnect(1000, '页面关闭');
});
```
### 2. 消息处理
```typescript
// 推荐:使用消息队列确保消息不丢失
await client.send('important message', {
waitForConnection: true,
timeout: 10000
});
// 推荐:结构化消息格式
interface AppMessage {
id: string;
type: string;
payload: any;
timestamp: number;
}
async function sendAppMessage(type: string, payload: any) {
const message: AppMessage = {
id: generateId(),
type,
payload,
timestamp: Date.now()
};
await client.send(JSON.stringify(message));
}
```
### 3. 错误处理和监控
```typescript
// 推荐:实现完整的事件监听
client.on(WebSocketEventType.OPEN, () => {
console.log('✅ 连接成功');
// 发送认证消息、订阅数据等
});
client.on(WebSocketEventType.RECONNECTING, (data) => {
console.log(`🔄 重连中... (${data.attempt}/${maxAttempts})`);
// 显示重连状态给用户
});
client.on(WebSocketEventType.RECONNECTED, () => {
console.log('✅ 重连成功');
// 重新订阅数据、同步状态等
});
```
## 开发和构建
### 环境要求
- Node.js 14+
- TypeScript 4.0+
### 安装依赖
```bash
npm install
```
### 开发模式
```bash
npm run dev
```
### 构建项目
```bash
npm run build
```
### 运行测试
```bash
npm test
```
### 代码检查
```bash
npm run lint
```
## 主要项目负责人
- @mPaaS Team
## 参与贡献
欢迎提交 Issue 和 Pull Request 来改进这个项目。
1. Fork 本仓库
2. 创建你的特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交你的修改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启一个 Pull Request
## 许可证
本项目采用 MIT 许可证。详情请参阅 [LEGAL.md](LEGAL.md) 文件。
## 更新日志
### v1.0.0
- 🎉 首次发布
- ✨ 完整的 WebSocket 连接管理
- 🔄 自动重连机制
- 💓 心跳检测功能
- 📦 消息队列支持
- 📊 连接统计功能
- 🎯 事件驱动架构
- 🛠️ TypeScript 支持
- 📝 完整的日志系统