'use strict'; const { Server } = require('socket.io'); const is = require('is-type-of'); const Log = require('../log'); const Conf = require('../config/cache'); const Ps = require('../ps'); const Channel = require('../const/channel'); /** * socket server */ class SocketServer { constructor (app) { this.app = app; this.socket = undefined; const options = Conf.getValue('socketServer'); if (options.enable == false) { return; } let port = Ps.getSocketPort(); if (!port) { throw new Error('[ee-core] [socket/socketServer] socekt port required, and must be a number !'); } Log.coreLogger.info('[ee-core] [socket/socketServer] port is:', port); this.io = new Server(port, options); this.connec(options); } connec (opt = {}) { const app = this.app; this.io.on('connection', (socket) => { const channel = opt.channel || Channel.socketIo.partySoftware; this.socket = socket; socket.on(channel, async (message, callback) => { Log.coreLogger.info('[ee-core] [socket/socketServer] socket id:' + socket.id + ' message cmd: ' + message.cmd); try { // 找函数 const cmd = message.cmd; const args = message.args || message.params; let fn = null; if (is.string(cmd)) { const actions = cmd.split('.'); let obj = app; actions.forEach(key => { obj = obj[key]; if (!obj) throw new Error(`class or function '${key}' not exists`); }); fn = obj; } if (!fn) throw new Error('function not exists'); const result = await fn.call(app, args); if (callback) { callback(result); } } catch (err) { Log.coreLogger.error('[ee-core] [socket/socketServer] throw error:', err); } }); }); } } module.exports = SocketServer;