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;
|
}
|
}
|
}
|