mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-22 19:15:08 +03:00
61 lines
1.6 KiB
TypeScript
61 lines
1.6 KiB
TypeScript
/**
|
|
* @fileoverview WebSocket connection management for real-time chat
|
|
* @description Handles WebSocket connections, message processing, and auto-reconnection
|
|
* @author Cursor
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
import { handleWebSocketMessage } from "./chat/chat";
|
|
import { API_WS_BASE_URL } from "./core/config";
|
|
import { delay } from "./utils/utils";
|
|
|
|
/**
|
|
* Creates a new WebSocket connection to the chat server
|
|
* @returns {WebSocket} New WebSocket instance
|
|
* @private
|
|
*/
|
|
function create(): WebSocket {
|
|
let prefix = "ws://";
|
|
if (location.protocol.includes("https")) {
|
|
prefix = "wss://";
|
|
}
|
|
|
|
return new WebSocket(`${prefix}${API_WS_BASE_URL}/chat/ws`);
|
|
}
|
|
|
|
/**
|
|
* Global WebSocket instance
|
|
* @type {WebSocket}
|
|
*/
|
|
export let websocket: WebSocket = create();
|
|
|
|
/**
|
|
* This function will wait 3 seconds and them attempts to reconnect the WebSocket.
|
|
* If it fails, tries again in an endless loop until the connection is established
|
|
* again.
|
|
*
|
|
* @private
|
|
*/
|
|
async function onError() {
|
|
console.warn("WebSocket disconnected, retrying in 3 seconds...");
|
|
await delay(3000);
|
|
websocket = create();
|
|
|
|
let listener: () => void | null;
|
|
listener = () => {
|
|
console.log("WebSocket successfully reconnected!");
|
|
websocket.removeEventListener("open", listener);
|
|
}
|
|
|
|
websocket.addEventListener("open", listener);
|
|
websocket.addEventListener("error", onError);
|
|
}
|
|
|
|
// --------------
|
|
// Initialization
|
|
// --------------
|
|
|
|
websocket.addEventListener("message", (e) => {
|
|
handleWebSocketMessage(JSON.parse(e.data));
|
|
});
|
|
websocket.addEventListener("error", onError); |