import { Injectable } from '@angular/core'; import { KstConfig } from '../config/chat.config'; import { ChatMessage } from '../store/entities'; import { Store } from '@ngrx/store'; import { IChatState } from '../store/reducers/chat.state'; import { MessageChanged } from '../store/chat.actions/actions'; @Injectable() export class ChatSocketClient { socketClient: WebSocket; server: string; session: string; constructor( private _store: Store) { this.server = KstConfig.websocket.url; this.init(); } init() { let self = this; self.socketClient = new WebSocket(this.server); self.socketClient.onopen = () => { self.socketClient.send(self.createData({ "msg": "connect", "version": "1", "support": ["1"] })); }; self.socketClient.onmessage = (event) => { if (event.type === 'message') { const data = JSON.parse(event.data); if (data.msg === 'ping') { self.socketClient.send(self.createData({ msg: 'pong' })); } if (data.msg === 'connected') { self.session = data.session; } if (data.msg === 'changed') { if (data.collection === 'stream-room-messages') { // 接收到消息 const messages = data.fields.args; messages.forEach(item => { if (item.ts && !(item.ts instanceof Date)) { item.ts = new Date(item.ts.$date); } if (item._updatedAt && !(item._updatedAt instanceof Date)) { item._updatedAt = new Date(item._updatedAt.$date); } if (item.editedAt && !(item.editedAt instanceof Date)) { item.editedAt = new Date(item.editedAt.$date); } }); self._store.dispatch(new MessageChanged(messages)); } } } }; } login(token: string) { this.socketClient.send(this.createData({ "msg": "method", "method": "login", "id": "42", "params": [ { "resume": token } ] })); } /** * 订阅消息 * @param token * @param roomId */ subRoom(token: string, roomId: string) { this.login(token); this.socketClient.send(this.createData({ "msg": "sub", "id": "1", "name": "stream-room-messages", "params": [ roomId, false ] })); } createData(data: any) { return new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); } }