import Services from "./services"; import { AnkFlag, AnkNetworkMsg, parseNetworkMsgReturn } from "../dist/pkg/sdk_client"; class WebSocketClient { private ws: WebSocket; private messageQueue: string[] = []; constructor(url: string, private services: Services) { this.ws = new WebSocket(url); this.ws.addEventListener('open', (event) => { console.log('WebSocket connection established'); // Once the connection is open, send all messages in the queue while (this.messageQueue.length > 0) { const message = this.messageQueue.shift(); if (message) { this.ws.send(message); } } }); // Listen for messages this.ws.addEventListener('message', (event) => { const msgData = event.data; (async () => { if (typeof(msgData) === 'string') { console.log("Received text message: "+msgData); let res = await services.parseNetworkMessage(msgData); if (res) { if (res.topic === 'new_tx') { // we received a tx window.alert(`New tx\n${res.message}`); await services.updateOwnedOutputsForUser(); } } } else { console.error("Received an invalid message"); } })(); }); // Listen for possible errors this.ws.addEventListener('error', (event) => { console.error('WebSocket error:', event); }); // Listen for when the connection is closed this.ws.addEventListener('close', (event) => { console.log('WebSocket is closed now.'); }); } // Method to send messages public sendMessage(flag: AnkFlag, message: string): void { if (this.ws.readyState === WebSocket.OPEN) { const networkMessage: AnkNetworkMsg = { 'flag': flag, 'content': message } // console.debug("Sending message:", JSON.stringify(networkMessage)); this.ws.send(JSON.stringify(networkMessage)); } else { console.error('WebSocket is not open. ReadyState:', this.ws.readyState); this.messageQueue.push(message); } } public getUrl(): string { return this.ws.url; } // Method to close the WebSocket connection public close(): void { this.ws.close(); } } export { WebSocketClient };