/** * Gateway 升级示例 - 支持新旧协议 */ import { RegisterMessage, MessageValidator, ProtocolConverter, isRegisterMessage } from '@jrsoft/subway-protocol'; // 扩展的客户端信息存储 interface ExtendedClient { ws: any; // WebSocket clientId: string; clientType: string; clientInfo: Record; protocolVersion: string; registeredAt: Date; sessionId?: string; } export class UpgradedWebSocketHandler { private clients = new Map(); /** * 处理注册消息 - 支持新旧格式 */ handleRegister(ws: any, rawMessage: any) { // 1. 标准化消息格式 const message = ProtocolConverter.normalizeMessage(rawMessage); if (!message || !isRegisterMessage(message)) { this.sendError(ws, 'Invalid register message'); return; } // 2. 验证消息 if (!MessageValidator.validateRegisterMessage(message)) { this.sendError(ws, 'Register message validation failed'); return; } const registerMsg = message as RegisterMessage; // 3. 提取信息(支持简单和完整格式) const client: ExtendedClient = { ws, clientId: registerMsg.clientId, clientType: registerMsg.clientType || 'device', clientInfo: registerMsg.clientInfo || {}, protocolVersion: registerMsg.version || '1.0', registeredAt: new Date(), sessionId: this.generateSessionId() }; // 4. 存储客户端 this.clients.set(registerMsg.clientId, client); // 5. 记录协议版本信息 console.log(`Client registered:`, { clientId: client.clientId, clientType: client.clientType, protocolVersion: client.protocolVersion, capabilities: client.clientInfo.capabilities || [] }); // 6. 发送确认(根据协议版本调整响应) const ack = this.createRegisterAck(client); ws.send(JSON.stringify(ack)); } /** * 创建注册确认消息 */ private createRegisterAck(client: ExtendedClient) { const isNewProtocol = parseFloat(client.protocolVersion) >= 1.0; const ack: any = { type: 'register_ack', clientId: client.clientId, success: true }; // 新协议包含更多信息 if (isNewProtocol) { ack.sessionId = client.sessionId; ack.timestamp = new Date().toISOString(); ack.version = '1.0'; } return ack; } /** * 获取客户端信息(包括扩展信息) */ getClientInfo(clientId: string): ExtendedClient | undefined { return this.clients.get(clientId); } /** * 根据客户端类型获取所有客户端 */ getClientsByType(clientType: string): ExtendedClient[] { return Array.from(this.clients.values()) .filter(client => client.clientType === clientType); } /** * 发送错误消息 */ private sendError(ws: any, message: string) { ws.send(JSON.stringify({ type: 'error', message, timestamp: new Date().toISOString() })); } /** * 生成会话ID */ private generateSessionId(): string { return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; } } // 使用示例 const handler = new UpgradedWebSocketHandler(); // 处理旧格式消息 handler.handleRegister(mockWs, { type: 'register', clientId: 'device001' }); // 处理新格式消息 handler.handleRegister(mockWs, { type: 'register', clientId: 'backend-server', clientType: 'backend', clientInfo: { version: '1.0.0', platform: 'nodejs', capabilities: ['command', 'program'] }, timestamp: new Date().toISOString(), version: '1.0' });