interface IOptions { socketClientAddr: string; heartBeatMsg?: any; heartBeatInterval?: number; hooksOnOpen: () => void; hookOnError: (err: any) => void; hookOnClose: (ev: CloseEvent) => void; hookOnMessage: (ev: MessageEvent) => void; } export default class SignalSimple { private socketClient: WebSocket; private options: IOptions; private heartbeatIntervalId: number = 0; constructor(options: IOptions) { this.socketClient = new WebSocket(options.socketClientAddr); this.options = options; this.socketClient.addEventListener('open', this.onOpen); this.socketClient.addEventListener('error', this.onError); this.socketClient.addEventListener('close', this.onClose) this.socketClient.addEventListener('message', this.onMessage); } private onOpen = () => { console.log(`SignalSimple: ${this.options.socketClientAddr}连ζŽ₯成功`); this.options.hooksOnOpen(); this.clearHearBeat(); this.heartbeatIntervalId = window.setInterval(this.sendHeartBeat, this.options.heartBeatInterval); } private onError = (err: any) => { console.error(`SignalSimple: ${this.options.socketClientAddr} on error`); this.options.hookOnError(err); this.clearHearBeat(); } private onClose = (ev: any) => { console.error(`SignalSimple: ${this.options.socketClientAddr} on close`); this.options.hookOnClose(ev); this.clearHearBeat(); } private onMessage = (ev: MessageEvent) => { console.log(`SignalSimple: signal receive message: ${JSON.stringify(JSON.parse(ev.data), undefined, 2)}`); this.options.hookOnMessage(ev); } public close = () => { console.log('SignalSimple: signal instance close invoke') this.socketClient?.close(); this.clearHearBeat(); this.socketClient?.removeEventListener('open', this.onOpen); this.socketClient?.removeEventListener('error', this.onError); this.socketClient?.removeEventListener('close', this.onClose); this.socketClient?.removeEventListener('message', this.onMessage); } public sendMsg = (message: any) => { if (this.socketClient?.readyState === 1) { if (typeof message == 'object') { message = JSON.stringify(message); } this.socketClient!.send(message.toString()); if (message.type === 'heartbeat') { return; } console.log(`SignalSimple: signal send message: ${message.toString()}`) } else { console.error('SignalSimple: Websocket send message failed'); } }; private sendHeartBeat = () => { this.sendMsg(this.options.heartBeatMsg) }; private clearHearBeat = () => { window.clearInterval(this.heartbeatIntervalId); this.heartbeatIntervalId = 0; } }