UNPKG

gypsum

Version:

Simple and easy lightweight typescript server side framework on Node.js.

104 lines 4.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const state_1 = require("../state"); const context_1 = require("../context"); const types_1 = require("../types"); const logger_1 = require("../misc/logger"); function initSocket(io) { io.use((socket, next) => { if (socket.handshake.query && socket.handshake.query.app) { let namespace = socket.handshake.query.app; let appName = namespace.split('/')[0]; let app = state_1.State.apps.find(_app => _app.name === appName); if (app) { if ('onHandShake' in app) app.onHandShake(socket, namespace, next); else next(); } else { next(new Error(`undefined app name: ${appName}`)); } } else { next(new Error('invalid handshake query!')); } }); for (let i = 0; i < state_1.State.apps.length; i++) { if (state_1.State.apps[i].$get('apiType') === types_1.API_TYPES.REST) continue; let ns = io.of(state_1.State.apps[i].name.toLowerCase()); state_1.State.ioNamespaces[state_1.State.apps[i].name.toLowerCase()] = ns; initializeApp(ns, state_1.State.apps[i]); let appNamespaces = state_1.State.apps[i].$get('namespaces'); if (appNamespaces && appNamespaces.length) { for (let i = 0; i < appNamespaces.length; i++) { let namespace = `${state_1.State.apps[i].name.toLowerCase()}/${appNamespaces[i].toLowerCase()}`; let ns = io.of(namespace); state_1.State.ioNamespaces[namespace] = ns; initializeApp(ns, state_1.State.apps[i], namespace); } } } process.on('message', msg => { if (msg.data && msg.action === 'response') { let response = msg.data; let namespace = msg.namespace; if (state_1.State.ioNamespaces[namespace]) { if ((response.domain === types_1.RESPONSE_DOMAINS.ROOM) && response.room) { state_1.State.ioNamespaces[namespace].to(response.room).emit(response.crud, response); } else if (response.domain === types_1.RESPONSE_DOMAINS.ALL) { state_1.State.ioNamespaces[namespace].emit(response.crud, response); } } } else if (msg.data && (msg.action === 'join room' || msg.action === 'leave room')) { let rooms = msg.data.rooms; let socketIds = msg.data.socketIds; let ns = state_1.State.ioNamespaces[msg.namespace]; let action = msg.action === 'join room' ? 'join' : 'leave'; if (ns && rooms && socketIds && socketIds.length) { let nsSockets = ns.sockets; for (let i = 0; i < socketIds.length; i++) { if (nsSockets[socketIds[i]]) { for (let room of rooms) nsSockets[socketIds[i]][action](room); } } } } }); } exports.initSocket = initSocket; function initializeApp(io, app, ns = app.name) { io.on('connection', (socket) => { const logger = new logger_1.Logger('ioServer'); if ('onConnect' in app) app.onConnect(socket); logger.info(`socket connected: { socketId: ${socket.id}, pid: ${process.pid}, namespace: ${ns} }`); logger.info('Implementing socket web services'); let appModels = app.publicModels; if (appModels && appModels.length) { for (let i = 0; i < appModels.length; i++) { let model = appModels[i]; if (model.$get('apiType') === types_1.API_TYPES.REST) continue; let services = model.$getServices(); for (let service in services) { if (services[service].apiType === types_1.API_TYPES.REST) continue; logger.info(`app ${ns} is listening on '${services[service].event}' event`); socket.on(services[service].event, context_1.Context.Socket(app.name, ns, socket, model, services[service])); } } } socket.on('disconnect', () => { if ('onDisconnect' in app) app.onDisconnect(socket, ns); io.emit('user disconnected'); socket.disconnect(); }); }); } //# sourceMappingURL=io.js.map