/** * 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 }; })();