165 lines
3.9 KiB
JavaScript
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
|
|
};
|
|
})();
|