export namespace WS { export type Events = 'error' | 'message' | 'close' | 'open'; export interface Data { timeStamp:number; data:T; }; export type DataEventHandler = (arg:Data)=>void; export type CloseEventHandler = (arg:CloseEvent)=>void; export type EventHandler = (arg:Event) => void; export class JSONWebsocketClient { private socket:WebSocket; private messageHandler:DataEventHandler; private closeHandler:CloseEventHandler; private errorHandler:EventHandler; private openHandler:EventHandler; constructor(ws:string) { this.socket = new WebSocket(ws); this.socket.onopen = this.onOpen.bind(this); this.socket.onclose = this.onClose.bind(this); this.socket.onerror = this.onError.bind(this); this.socket.onmessage = this.onMessage.bind(this); } on(event:'message',handler:DataEventHandler):void; on(event:'close',handler:CloseEventHandler):void; on(event:'open' | 'error',handler:EventHandler):void; on(event:Events,handler:DataEventHandler | CloseEventHandler | EventHandler) { switch(event) { case 'close': this.closeHandler = handler as CloseEventHandler; break; case 'open': this.openHandler = handler as EventHandler; break; case 'message': this.messageHandler = handler as DataEventHandler; break; case 'error': this.errorHandler = handler as EventHandler; break; } } send(data:T) { this.socket.send(JSON.stringify(data)); } private onMessage(ev:MessageEvent) { const data = JSON.parse(ev.data); if(this.messageHandler) { this.messageHandler({data:data,timeStamp:ev.timeStamp}); } } private onError(ev:Event) { if(this.errorHandler) { this.errorHandler(ev); } } private onClose(ev:CloseEvent) { if(this.closeHandler) { this.closeHandler(ev); } } private onOpen(ev:Event) { if(this.openHandler) { this.openHandler(ev); } } } }