Aniworld/src/server/web/static/js/shared/websocket-client.js

165 lines
3.9 KiB
JavaScript

/**
* AniWorld - WebSocket Client Module
*
* WebSocket connection management and event handling.
*
* Dependencies: constants.js
*/
var AniWorld = window.AniWorld || {};
AniWorld.WebSocketClient = (function() {
'use strict';
const WS_EVENTS = AniWorld.Constants.WS_EVENTS;
let socket = null;
let isConnected = false;
let eventHandlers = {};
/**
* Initialize WebSocket connection
* @param {Object} handlers - Object mapping event names to handler functions
*/
function init(handlers) {
handlers = handlers || {};
eventHandlers = handlers;
// Check if Socket.IO is available
if (typeof io === 'undefined') {
console.error('Socket.IO not loaded');
return;
}
socket = io();
// Handle connection events
socket.on('connected', function(data) {
console.log('WebSocket connection confirmed', data);
});
socket.on('connect', function() {
isConnected = true;
console.log('Connected to server');
// Subscribe to rooms
if (socket.join) {
socket.join('scan');
socket.join('downloads');
socket.join('queue');
}
// Call custom connect handler if provided
if (eventHandlers.onConnect) {
eventHandlers.onConnect();
}
});
socket.on('disconnect', function() {
isConnected = false;
console.log('Disconnected from server');
// Call custom disconnect handler if provided
if (eventHandlers.onDisconnect) {
eventHandlers.onDisconnect();
}
});
// Set up event handlers for common events
setupDefaultHandlers();
}
/**
* Set up default event handlers
*/
function setupDefaultHandlers() {
if (!socket) return;
// Register any events that have handlers
Object.keys(eventHandlers).forEach(function(eventName) {
if (eventName !== 'onConnect' && eventName !== 'onDisconnect') {
socket.on(eventName, eventHandlers[eventName]);
}
});
}
/**
* Register an event handler
* @param {string} eventName - The event name
* @param {Function} handler - The handler function
*/
function on(eventName, handler) {
if (!socket) {
console.warn('Socket not initialized');
return;
}
eventHandlers[eventName] = handler;
socket.off(eventName); // Remove existing handler
socket.on(eventName, handler);
}
/**
* Remove an event handler
* @param {string} eventName - The event name
*/
function off(eventName) {
if (!socket) return;
delete eventHandlers[eventName];
socket.off(eventName);
}
/**
* Emit an event to the server
* @param {string} eventName - The event name
* @param {*} data - The data to send
*/
function emit(eventName, data) {
if (!socket || !isConnected) {
console.warn('Socket not connected');
return;
}
socket.emit(eventName, data);
}
/**
* Get connection status
* @returns {boolean} True if connected
*/
function getConnectionStatus() {
return isConnected;
}
/**
* Get the socket instance
* @returns {Object} The Socket.IO socket instance
*/
function getSocket() {
return socket;
}
/**
* Disconnect from server
*/
function disconnect() {
if (socket) {
socket.disconnect();
socket = null;
isConnected = false;
}
}
// Public API
return {
init: init,
on: on,
off: off,
emit: emit,
isConnected: getConnectionStatus,
getSocket: getSocket,
disconnect: disconnect
};
})();