UNPKG

catproxy

Version:

a node proxy or host change tools

89 lines (85 loc) 2.35 kB
/** * websocket通讯入口 * * 所有接受到得消息是一个Object * * { * path: "数据访问路径,相同type下的不同逻辑处理可以用不同的path" * param: "请求参" * } * * * 所有发出的消息是一个Object * * data:{ * //当前请求的状态,如果不是100表示出现错误了 * status: 100, * result: {'当前返回的数据'} * } * */ import Promise from 'promise'; import skt from 'socket.io'; import log from '../log'; import * as receiveMsg from './receiveMsg'; import * as receiveType from './receiveType'; import webCfg from '../config/webCfg'; import monitor from '../monitor/monitor'; import sendMsg from './sendMsg'; var wss; // 方法分发 // 会根据receiveType中定义的不同类型调用不同的事件,每个事件的方法就是receiveType的键 // 方法有三个参数message(当前客户端的消息), ws(当前的client连接), wss (io对象) // 方法返回值 可以是promise或者 值,如果返回值为空,则不会给客户端回写值 let recive = (ws, evtType) => { ws.on(receiveType[evtType], (message, callback) => { log.verbose('收到消息, 消息类型: ' + receiveType[evtType]); let method = receiveMsg[evtType]; let result = null; if (method) { // 调用定义的方法 result = method(message, ws, wss); // 需要向客户端返回结果 if (result) { // 返回的是一个promise if (result.then) { result.then(msg => msg && callback(msg), msg => msg && callback(msg)); } else { callback(result); } } } else { log.warn(`消息${receiveType[evtType]}查找执行方法失败`); } }); }; // 将接受到的消息映射到 receiveMsg中去处理 let distributeReciveMethod = () => { // 有新的客户端建立链接 // 所有请求都在catproxy下 wss.of(webCfg.wsPath).on('connection', ws => { for (let type in receiveType) { recive(ws, type); } }); }; export default (server, catproxy) => { if (wss) { return Promise.resolve(wss); } if (!server) { return Promise.reject('must have server'); } return new Promise(resolve => { wss = skt(server); wss.on('error', err => { log.info('err io', err); }); // 初始化监控 monitor(catproxy); distributeReciveMethod(); // 初始化sendMsg sendMsg(wss.of(webCfg.wsPath)); resolve(wss); }); };