jsm-core
Version:
Core library for JSM project
103 lines (102 loc) • 4.38 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const socket_io_1 = require("socket.io");
const typedi_1 = __importDefault(require("typedi"));
const jsm_logger_1 = __importStar(require("jsm-logger"));
const logger = (0, jsm_logger_1.default)(jsm_logger_1.LoggerContext.LOADER, 'socket');
exports.default = ({ httpServer }) => {
const io = new socket_io_1.Server(httpServer, {
// Optional: Configure CORS for Socket.IO
cors: {
origin: "*", // Adjust to your frontend's URL in production
methods: ["GET", "POST"]
}
});
// ... (Socket.IO initialization) ...
// const pubClient = createClient({ url: config.cacheManager.redis.url,
// username: config.cacheManager.redis.user,
// password: config.cacheManager.redis.password,
// }); // Use your Redis config from src/config/index.ts
// const subClient = pubClient.clone();
// Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
// io.adapter(createAdapter(pubClient, subClient));
// });
io.on('connection', (socket) => {
logger.success(`Socket.io client connected: ${socket.id}`);
logger.value('Socket namespace', socket.nsp.name);
// You can add more event listeners here
socket.on('error', (error) => {
logger.error(`Socket.io error: ${error.message}`);
});
socket.on('connect_error', (error) => {
logger.error(`Socket.io connection error: ${error.message}`);
});
socket.on('connect_timeout', (timeout) => {
logger.error(`Socket.io connection timeout: ${timeout}`);
});
socket.on('reconnect_attempt', (attempt) => {
logger.event(`Socket.io reconnect attempt: ${attempt}`);
});
socket.on('reconnect', (attempt) => {
logger.event(`Socket.io reconnected: ${socket.id} on attempt ${attempt}`);
});
socket.on('reconnect_error', (error) => {
logger.error(`Socket.io reconnect error: ${error.message}`);
});
socket.on('reconnect_failed', () => {
logger.error(`Socket.io reconnect failed for client: ${socket.id}`);
});
// Handle disconnection
socket.on('disconnect', (reason) => {
logger.event(`Socket.io client disconnected: ${socket.id}, reason: ${reason}`);
});
});
// Add namespace error handling
io.engine.on('connection_error', (err) => {
logger.error('Socket.io connection error:', {
message: err.message,
description: err.description,
context: err.context,
type: err.type
});
});
typedi_1.default.set('io', io);
logger.success('Socket.io server initialized and attached to HTTP server');
return io; // Return the Socket.IO instance
};