import ReconnectingWebSocket from 'reconnecting-websocket'; /** * ConnectWebSocket 类 * TODO: 优化messageHandler: EventEmitter。暂时传入回调函数 */ class ConnectWebSocket { _url; _socket; _hasInit; _messageHandler; constructor(url) { this._url = url; this._socket = null; this._hasInit = false; this._messageHandler = null; } initSocket() { if (this._hasInit) { return; } if (!this._url) { return; } // 会自动重连,无需处理重连逻辑 this._socket = new ReconnectingWebSocket(this._url, [], { maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3... minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s maxRetries: 5, }); this._hasInit = true; this._socket.addEventListener('open', this._onOpen.bind(this)); this._socket.addEventListener('close', this._onClose.bind(this)); this._socket.addEventListener('error', this._onError.bind(this)); this._socket.addEventListener('message', this._onMessage.bind(this)); } _onOpen() { console.log('连接成功'); } _onClose() { console.log('连接已断开'); } _onError() { console.log('连接 error'); } registerMessageHandler(messageHandler) { this._messageHandler = messageHandler; } _onMessage(msg) { // const data = JSON.parse(msg.data); this._messageHandler && this._messageHandler(msg.data); } sendMessage = (message) => { // 目前只供AI聊天使用 this._socket?.send(message) // this._socket?.send(JSON.stringify(message.data)); }; close() { this._socket?.close(); } } export default ConnectWebSocket;