gypsum
Version:
Simple and easy lightweight typescript server side framework on Node.js.
104 lines • 4.7 kB
JavaScript
;
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