96 lines
3 KiB
JavaScript
96 lines
3 KiB
JavaScript
import { config } from "./config.js";
|
|
import { isOnline, updateOnlineStatus } from "./storage.js";
|
|
|
|
let socket = null;
|
|
let reconnectTimer = null;
|
|
let currentOnMessageCallback = null;
|
|
|
|
export const websocket = {
|
|
connect(onMessageCallback) {
|
|
if (!isOnline) return;
|
|
currentOnMessageCallback = onMessageCallback;
|
|
|
|
this.disconnect(false);
|
|
|
|
const httpUrl = config.wahaUrl;
|
|
if (!httpUrl) {
|
|
console.warn('[WS] Config wahaUrl is empty. Cannot connect.');
|
|
return;
|
|
}
|
|
|
|
let wsUrl = httpUrl.replace(/^http:/i, 'ws:').replace(/^https:/i, 'wss:');
|
|
wsUrl = wsUrl.replace(/\/$/, '') + '/ws';
|
|
|
|
const apiKey = config.apiKey;
|
|
const session = config.session;
|
|
const events = ['session.status', 'message', 'message.any'];
|
|
|
|
const queryParams = new URLSearchParams();
|
|
if (apiKey) {
|
|
queryParams.append('x-api-key', apiKey);
|
|
}
|
|
queryParams.append('session', session);
|
|
events.forEach(event => queryParams.append('events', event));
|
|
|
|
const fullWsUrl = `${wsUrl}?${queryParams.toString()}`;
|
|
console.log('[WS] Connecting to:', fullWsUrl);
|
|
|
|
try {
|
|
socket = new WebSocket(fullWsUrl);
|
|
|
|
socket.onopen = () => {
|
|
console.log('[WS] Connection successfully established');
|
|
if (reconnectTimer) {
|
|
clearTimeout(reconnectTimer);
|
|
reconnectTimer = null;
|
|
}
|
|
};
|
|
|
|
socket.onmessage = (event) => {
|
|
try {
|
|
const data = JSON.parse(event.data);
|
|
if (currentOnMessageCallback) {
|
|
currentOnMessageCallback(data);
|
|
}
|
|
} catch (e) {
|
|
console.error('[WS] Failed to parse message JSON:', e);
|
|
}
|
|
};
|
|
|
|
socket.onerror = (error) => {
|
|
console.error('[WS] WebSocket Error occurred:', error);
|
|
};
|
|
|
|
socket.onclose = (event) => {
|
|
console.log(`[WS] Connection closed (code: ${event.code}). Reconnecting in 5 seconds...`);
|
|
socket = null;
|
|
|
|
reconnectTimer = setTimeout(() => {
|
|
updateOnlineStatus();
|
|
this.connect(currentOnMessageCallback);
|
|
}, 5000);
|
|
};
|
|
} catch (e) {
|
|
console.error('[WS] Failed to initialize WebSocket client:', e);
|
|
}
|
|
},
|
|
|
|
disconnect(clearCallback = true) {
|
|
if (reconnectTimer) {
|
|
clearTimeout(reconnectTimer);
|
|
reconnectTimer = null;
|
|
}
|
|
if (clearCallback) {
|
|
currentOnMessageCallback = null;
|
|
}
|
|
if (socket) {
|
|
socket.onclose = null;
|
|
socket.onerror = null;
|
|
socket.onopen = null;
|
|
socket.onmessage = null;
|
|
socket.close();
|
|
socket = null;
|
|
console.log('[WS] Connection closed explicitly');
|
|
}
|
|
}
|
|
};
|