New file |
| | |
| | | import { WEBSOCKET_BASE_URL } from '@/config/setting'; |
| | | |
| | | export default class WebSocketClient { |
| | | |
| | | constructor(path) { |
| | | this.url = WEBSOCKET_BASE_URL + path; |
| | | this.webSocket = null; |
| | | this.heartbeatInterval = null; // Store the interval ID |
| | | this.heartbeatFrequency = 30000; // Heartbeat every 30 seconds |
| | | } |
| | | |
| | | connect() { |
| | | if (!this.url) { |
| | | console.error('WebSocketClient: Cannot connect without url.'); |
| | | return; |
| | | } |
| | | |
| | | this.webSocket = new WebSocket(this.url); |
| | | |
| | | this.webSocket.onopen = (event) => { |
| | | console.log('websocket connection opened.'); |
| | | // Start the heartbeat |
| | | this.startHeartbeat(); |
| | | }; |
| | | |
| | | this.webSocket.onmessage = (event) => { |
| | | // console.log('websocket message received:', event.data); |
| | | this.onMessage(event.data); |
| | | }; |
| | | |
| | | this.webSocket.onerror = (event) => { |
| | | console.error('websocket error observed:', event); |
| | | }; |
| | | |
| | | this.webSocket.onclose = (event) => { |
| | | console.log('websocket connection closed!'); |
| | | // Clear the heartbeat |
| | | this.stopHeartbeat(); |
| | | this.reconnect(); |
| | | }; |
| | | } |
| | | |
| | | sendMessage(message) { |
| | | if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) { |
| | | this.webSocket.send(message); |
| | | } else { |
| | | console.error('WebSocketClient: Cannot send message, WebSocket connection is not open.'); |
| | | } |
| | | } |
| | | |
| | | // Override |
| | | onMessage(data) { |
| | | } |
| | | |
| | | close() { |
| | | if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) { |
| | | this.webSocket.close(); |
| | | } |
| | | } |
| | | |
| | | reconnect() { |
| | | setTimeout(() => { |
| | | console.log('WebSocketClient: Attempting to reconnect...'); |
| | | this.connect(); |
| | | }, 3000); |
| | | } |
| | | |
| | | startHeartbeat() { |
| | | if(this.heartbeatInterval) { |
| | | clearInterval(this.heartbeatInterval); |
| | | } |
| | | this.heartbeatInterval = setInterval(() => { |
| | | this.sendMessage('1'); |
| | | }, this.heartbeatFrequency); |
| | | } |
| | | |
| | | stopHeartbeat() { |
| | | if (this.heartbeatInterval) { |
| | | clearInterval(this.heartbeatInterval); |
| | | this.heartbeatInterval = null; |
| | | } |
| | | } |
| | | } |