import AdvancedWebSocket from './advanced-websocket' class EventEmitter extends EventTarget { constructor() { super() } emit(name: string, data: any) { this.dispatchEvent(new CustomEvent(name, { detail: data })) } on(name: string, callback: (data: any) => void) { this.addEventListener(name, callback) } once(name: string, callback: (data: any) => void) { this.addEventListener(name, callback, { once: true }) } off(name: string, callback: (data: any) => void) { this.removeEventListener(name, callback) } } export const EventQue = new EventEmitter() export const handleResponse = ({ type, data, error, responseCode }: { type: string, data: any, error?: string, responseCode?: string }, callback: (result: any) => void) => { if (responseCode) { EventQue.emit(responseCode, { type, data, error }) callback({ type, data, error }) } else callback({ type, data, error }) } export function websocketRequest(socket: AdvancedWebSocket, type: string, data: any) { return new Promise((res, rej) => { let timeout: any const result = ({ detail: { data, error } }: { detail: { data: any, error?: string } }) => { clearTimeout(timeout) if (error) rej(error) else res(data) } const responseCode = `${Math.random() * 100000000}${new Date().getTime()}` try { timeout = setTimeout(() => { EventQue.off(responseCode, result) rej(new Error(`Request timed out after 120 seconds, type: ${type} data: ${JSON.stringify(data)}`)) }, 120000) EventQue.once(responseCode, result) socket.sendEncrypted(JSON.stringify({ type, data, responseCode })) } catch (e) { clearTimeout(timeout) EventQue.off(responseCode, result) rej(e) } }) }