UNPKG

vesh

Version:

码农nodejs版本VESH框架,使用函数责任链模式 实现了 默认文件跳转,自定义错误页,空文件处理,URL解析,Querystring与Form参数解析,PostFiles解析,MVC自动映射,SQL自动服务化,可继承页面,静态文件,json,tjson,jsonp,tjsonp,string,void,xjson,xjosnp等等6种JSON格式,http与https等等操作

999 lines (876 loc) 36.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WsApp = exports.HttpsApp = exports.App = exports.AModuler = undefined; var _keys = require("babel-runtime/core-js/object/keys"); var _keys2 = _interopRequireDefault(_keys); var _get2 = require("babel-runtime/helpers/get"); var _get3 = _interopRequireDefault(_get2); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); var _apply = require("babel-runtime/core-js/reflect/apply"); var _apply2 = _interopRequireDefault(_apply); var _regenerator = require("babel-runtime/regenerator"); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _tool = require("gcl/com/coooders/common/tool"); var _tool2 = _interopRequireDefault(_tool); var _http = require("http"); var _http2 = _interopRequireDefault(_http); var _middler = require("gcl/com/coooders/bean/middler"); var _middler2 = _interopRequireDefault(_middler); var _ni = require("gcl/com/coooders/db/ni"); var _ni2 = _interopRequireDefault(_ni); var _https = require("https"); var _https2 = _interopRequireDefault(_https); var _ws = require("ws"); var _ws2 = _interopRequireDefault(_ws); var _arraystream = require("gcl/com/coooders/collection/arraystream"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * VESH框架View层核心控件. * 处理器基类,定义init(),onrequest(request,response,session,[next]),onresponse(request,response,session,[next]),dispose()方法分别用于初始化,处理请求,对返回值进行过滤,销毁等一系列操作,Moduler之间按照责任链方式进行串联,任何返回真,或者对最后一个参数异步调用为真的方法都视作中止责任链,沿当前路径原路返回。 */ // import mosca from 'mosca'; var AModuler = exports.AModuler = function () { function AModuler(name) { (0, _classCallCheck3.default)(this, AModuler); pri(this, { name: name }); } (0, _createClass3.default)(AModuler, [{ key: "init", value: function init() { return false; } }, { key: "onrequest", value: function onrequest(req, rep, session) { return false; } }, { key: "onresponse", value: function onresponse(req, rep, session) { return false; } }, { key: "dispose", value: function dispose() { return false; } }, { key: "Name", get: function get() { return pri(this).__.name; } }]); return AModuler; }(); /** * VESH框架View层核心容器类 */ var App = exports.App = function () { function App(config) { var pris = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; (0, _classCallCheck3.default)(this, App); if (!config) throw new Error("VESH:必须输入GCL.com.coooders.io.config.config对象实例"); var that = this; var _pri = pri(this, _tool2.default.merge({ config: config, middler: new _middler2.default.Middler(config), server: null, port: 80, errcall: function errcall(err, rep) { var _pri2 = pri(that), _ = _pri2._, __ = _pri2.__; console.log(err); __.log.error("VESH:" + (err.status || "") + err.message); //rep.setHeader('content-encoding', 'UTF-8'); rep.writeHead(500, { "Content-Type": "text/plain" }); rep.end(err.message, "UTF-8"); } }, pris)), _ = _pri._, __ = _pri.__; _tool2.default.merge(__, { log: __.middler.getObjectByAppName("VESH.view", "com.coooders.Project.VESH.Logger"), ni: new _ni2.default.NiTemplateManager(__.middler, "Ni"), modulers: __.middler.getObjectByAppName("VESH.view", "com.coooders.Project.VESH.HttpModulers"), factory: __.middler.getObjectByAppName("VESH.view", "com.coooders.Project.VESH.SessionDataManagerFactory") }, true); if (__.log) { //判断处理windows下无法监听标准错误的Bug if (_tool2.default.environment && _tool2.default.environment.os != "windows") process.stderr.on("data", function (data) { return __.log.error("VESH:" + data); }); } else throw new Error("VESH:必须定义VESH.view/com.coooders.Project.VESH.Logger对象"); if (!__.factory) throw new Error("VESH:必须定义VESH.view/com.coooders.Project.VESH.SessionDataManagerFactory"); if (__.modulers && __.modulers.length > 0) { //todo可能是异步的 __.modulers.forEach(function (v) { return v.init(); }); } else throw new Error("VESH:必须定义VESH.view/com.coooders.Project.VESH.HttpModulers对象"); } (0, _createClass3.default)(App, [{ key: "deal", value: function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(req, rep) { var _this = this; var _pri3, _, __, session, data; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _pri3 = pri(this), _ = _pri3._, __ = _pri3.__; __.log.info("HttpServer:" + _tool2.default.toJsonString(req.header) + " " + req.url); _context3.prev = 2; session = __.factory.getValue() || function () { throw new Error("VESH:必须定义VESH.view/com.coooders.Project.VESH.SessionDataManager对象"); }(); _context3.next = 6; return session.init(__.config, __.middler, __.log, __.ni, req, rep, __.idic); case 6: // console.log(123, req.url, Object.keys(__.idic).join(), this); data = {}; data.modulers = 0; //module处理 _context3.next = 10; return _tool2.default.whileC(function () { return session.IsEnd ? null : __.modulers[data.modulers++]; }, function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(v) { var ret; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; if (!v.onrequest) { _context.next = 7; break; } _context.next = 4; return _tool2.default.callback2(function (call) { return v.onrequest(req, rep, session, call); }); case 4: _context.t0 = _context.sent; _context.next = 8; break; case 7: _context.t0 = false; case 8: ret = _context.t0; if (ret) { session.end(200); } _context.next = 17; break; case 12: _context.prev = 12; _context.t1 = _context["catch"](0); __.log.error("VESH:" + (v.Name ? v.Name + ": " : " ") + (_context.t1.status || "") + _context.t1.message); console.log("VESH:" + (v.Name ? v.Name + ": " : " ") + (_context.t1.status || "") + _context.t1.message); session.end(_context.t1.status || 500, _context.t1.message); case 17: return _context.abrupt("return", false); case 18: case "end": return _context.stop(); } } }, _callee, _this, [[0, 12]]); })); return function (_x4) { return _ref2.apply(this, arguments); }; }(), true); case 10: _context3.next = 12; return session.update(); case 12: data.modulers--; //whileC默认会多判断一次 //console.log(data.modulers, __.modulers[data.modulers--]); _context3.next = 15; return _tool2.default.whileC(function () { return __.modulers[data.modulers-- - 1]; }, function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(v) { return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; if (!v.onresponse) { _context2.next = 7; break; } _context2.next = 4; return _tool2.default.callback2(v.onresponse, v, req, rep, session); case 4: _context2.t0 = _context2.sent; _context2.next = 8; break; case 7: _context2.t0 = false; case 8: return _context2.abrupt("return", _context2.t0); case 11: _context2.prev = 11; _context2.t1 = _context2["catch"](0); __.log.error("VESH:" + (v.Name ? v.Name + ":" : "") + (_context2.t1.status || "") + _context2.t1.message); console.log("VESH onresponse:" + (v.Name ? v.Name + ": " : " ") + (_context2.t1.status || "") + _context2.t1.message); session.end(_context2.t1.status || 500, _context2.t1.message); data.modulers = 0; case 17: return _context2.abrupt("return", false); case 18: case "end": return _context2.stop(); } } }, _callee2, _this, [[0, 11]]); })); return function (_x5) { return _ref3.apply(this, arguments); }; }(), true); case 15: _context3.next = 17; return session.flush(); case 17: if (!_context3.sent) { _context3.next = 19; break; } rep.end(); case 19: _context3.next = 24; break; case 21: _context3.prev = 21; _context3.t0 = _context3["catch"](2); __.errcall(_context3.t0, rep); case 24: return _context3.abrupt("return", false); case 25: case "end": return _context3.stop(); } } }, _callee3, this, [[2, 21]]); })); function deal(_x2, _x3) { return _ref.apply(this, arguments); } return deal; }() }, { key: "deal1", value: function deal1(req, rep) { rep.end("ok"); } }, { key: "createServer", value: function createServer() { var _pri4 = pri(this), _ = _pri4._, __ = _pri4.__; var server = _http2.default.createServer(function (req, rep) { //尝试打断this传递 使用app的this进行传递 return (0, _apply2.default)(_.deal, _, [req, rep]); }); //传递__ 因为deal中的this是server 不是 app; // pri(server, __); return server; } }, { key: "start", value: function start() { var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 80; var _pri5 = pri(this), _ = _pri5._, __ = _pri5.__; if (__.server) { throw new Error("服务已经启动于" + __.port + "端口,请关闭后重新启动"); } else { __.port = port; // 创建服务器 __.server = _.createServer().listen(__.port); __.server.on("timeout", function () { return __.log.info("HttpServer:连接超时"); }); __.server.on("connection", function () { return __.log.info("HttpServer:发生新的连接"); }); __.server.on("clientError", function (err) { return __.log.error("HttpServer:发生客户端错误" + err.stack); }); process.on("SIGTERM", function () { console.log("Received SIGTERM. Exiting."); __.server.close(function () { _.dispose(); process.exit(0); }); }); } } }, { key: "stop", value: function stop() { var _pri6 = pri(this), _ = _pri6._, __ = _pri6.__; if (__.server) { __.server.close(); __.server.removeAllListeners(); __.server = null; } } }, { key: "dispose", value: function dispose() { var _pri7 = pri(this), _ = _pri7._, __ = _pri7.__; __.middler.setObjectByAppName("VESH.view", "com.coooders.Project.VESH.Logger", __.log); __.modulers.forEach(function (v) { if (v.dispose) _tool2.default.tryC(function () { return v.dispose(); }); }); } }, { key: "Config", get: function get() { return pri(this).__.config; } }, { key: "Middler", get: function get() { return pri(this).__.middler; } }, { key: "Ni", get: function get() { return pri(this).__.ni; } }, { key: "Modulers", get: function get() { return pri(this).__.modulers; } }, { key: "Factory", get: function get() { return pri(this).__.factory; } }, { key: "Log", get: function get() { return pri(this).__.log; } }]); return App; }(); /** * Https * @param {配置文件} config * @param {秘钥} key * @param {加密文件} cert */ var HttpsApp = exports.HttpsApp = function (_App) { (0, _inherits3.default)(HttpsApp, _App); function HttpsApp(config) { var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var cert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; (0, _classCallCheck3.default)(this, HttpsApp); var _this2 = (0, _possibleConstructorReturn3.default)(this, (HttpsApp.__proto__ || (0, _getPrototypeOf2.default)(HttpsApp)).call(this, config)); _this2.key = key; _this2.cert = cert; if (!(_tool2.default.isValid(key) && _tool2.default.isValid(cert))) throw new Error("请输入key,cert文件作为第二第三个参数"); return _this2; } (0, _createClass3.default)(HttpsApp, [{ key: "createServer", value: function createServer() { var _pri8 = pri(this), _ = _pri8._, __ = _pri8.__; var server = _https2.default.createServer({ key: this.key, cert: this.cert }, function (req, rep) { //尝试打断this传递 使用app的this进行传递 return (0, _apply2.default)(_.deal, _, [req, rep]); }); //传递__ 因为deal中的this是server 不是 app; // pri(server, __); return server; } }]); return HttpsApp; }(App); /** * github: https://github.com/LearnBoost/socket.io 抛弃ScoketIO 因为其不是纯粹的websocket * https://cloud.tencent.com/developer/article/1006065 * https://cloud.tencent.com/developer/article/1005550?from=15425 多项对比选择ws * https://www.npmjs.com/package/ws#api-docs * nginx 异步通讯服务通过 支持 ws 和 wss * todo session.send(sessionIDs) 测试, * @param {配置文件} config * @param {配置参数} pris */ var WsApp = exports.WsApp = function (_App2) { (0, _inherits3.default)(WsApp, _App2); function WsApp(config) { var pris = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; (0, _classCallCheck3.default)(this, WsApp); pris = _tool2.default.merge({ debug: false, events: {}, idic: {}, queue: [], //大量队列进行数据查询 timeout: 60000, prefix: "/ws", callback: function callback() {} }, pris); var events = _tool2.default.merge({ //非open connect close error message外都是 message下的二级事件,只有二级事件才有消息ID ping: function ping(data, ws) { //真实数据是 data.data data.ID = _tool2.default.SNOWID(); data.preID = data.ID; ws.send(_tool2.default.toJsonString(data)); } //对ping的处理自动过滤 和回复 }, pris.events || {}); var _callback = pris.callback; delete pris.callback; var _this3 = (0, _possibleConstructorReturn3.default)(this, (WsApp.__proto__ || (0, _getPrototypeOf2.default)(WsApp)).call(this, config, _tool2.default.merge(pris, { //接收消息 {event,data:{event,ID,preID,data},error}; //发送消息 {event,ID,preID,data} send: function send(ws) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; data.ID = data.ID || _tool2.default.SNOWID(); ws.send(typeof data == "string" ? data : _tool2.default.toJsonString(data)); }, checker: new (function () { function _class() { (0, _classCallCheck3.default)(this, _class); var _pri9 = pri(this, { go: false, run: function run() { if (__.go) { setTimeout(function () { _.check(); __.run(); }, 1000); } } }), _ = _pri9._, __ = _pri9.__; } (0, _createClass3.default)(_class, [{ key: "check", value: function check() { var _pri10 = pri(this), __ = _pri10.__; __.check && __.check(); } }, { key: "start", value: function start(check) { var _pri11 = pri(this), __ = _pri11.__; __.go = true; __.check = check; __.run(); } }, { key: "stop", value: function stop() { pri(this).__.go = false; } }]); return _class; }())() }))); var _pri12 = pri(_this3, { callback: function callback(ret, ws) { try { switch (ret.event) { case "error": case "open": case "connect": case "close": default: case "message": { //上行消息 pris.debug && (ret.error ? console.error(ret.error || "", ws.tsessionID) : console.log(ret.event || "", ret.data, ws.tsessionID)); try { ret.data = !!ret.data && typeof ret.data == "string" ? _tool2.default.json(ret.data) : ret.data || {}; } catch (e) {} //preload events[ret.event] && events[ret.event](ret, ws); //尝试进行消息处理 需要req,rep,session events[ret.data.event] && events[ret.data.event](ret.data, ws); //_topic和_sendkey成为服务唯一秘钥 // console.log(ret.data.data); var url = !!ret.data.event && ret.data.event.indexOf("/") >= 0 ? ret.data.event : pris.prefix + "/" + ret.event; url = url + (url.indexOf(".") >= 0 ? "" : ".string"); var req = { headers: _tool2.default.merge({ "content-type": "ws", protocol: "ws://", "accept-encoding-vesh": "ws" }, ws.headers), url: url, method: "POST", form: ret.data.data, querystring: {}, message: ret, webSocket: ws }; var rep = new _arraystream.ArrayStream(); rep.event = req.url; rep.statusCode = 200; rep.headers = { "content-type": "application/json" }; rep.setHeader = function (k, v) { rep.headers[k] = v; }; rep.getHeader = function (k, v) { return rep.headers[k]; }; rep.writeHead = function (code) { var contenttype = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; rep.statusCode = code; for (var k in contenttype) { rep.setHeader(k, contenttype[k]); } }; rep.end = function (sb) { if (rep.IsEnd) return; rep.IsEnd = true; var data = sb || Buffer.from(rep.toArray()).toString(); //特别处理 如果没有data则不会下行 data && __.send(req.webSocket, { event: rep.event, sessionID: req.webSocket.tsessionID, preID: req.message.data.ID, data: data }); }; _.deal(req, rep); } break; } } catch (e) { pris.debug && console.log(190, e.stack); events["error"] && events["error"]({ event: "error", error: e }, ws); _callback({ event: "error", error: e }, ws); } finally { _callback(ret, ws); } } }), _ = _pri12._, __ = _pri12.__; return _this3; } (0, _createClass3.default)(WsApp, [{ key: "createServer", value: function createServer() { //pri 不传递 __ 的内容 var _pri13 = pri(this, {}), _ = _pri13._, __ = _pri13.__; var server = (0, _get3.default)(WsApp.prototype.__proto__ || (0, _getPrototypeOf2.default)(WsApp.prototype), "createServer", this).call(this); var wss = new _ws2.default.WebSocketServer({ noServer: true }); __.checker.start(function () { var queue = __.queue.concat(); var ret = []; __.queue = []; var client = null; do { try { client = queue.shift(); if (client && client.readyState == _ws2.default.OPEN && client.lastUpdate < +new Date() - __.timeout * 2) { if (client.tsessionID) delete __.idic[client.tsessionID]; __.debug && console.log("会话超时关闭!", client.tsessionID); client.close(); } else ret.push(client); } catch (e) { console.log(e.message); } } while (!!client); __.queue = __.queue.concat(ret); // wss.clients.forEach(function(client) { // console.log(276,client); // //超出2倍心跳 // if (client.readyState !== socket.OPEN || client.lastUpdate<(+new Date - __.timeout*2)) { // client.close(); // } // }); }); // const wss = new socket.WebSocketServer({}); /** * port: 8080, perMessageDeflate: { zlibDeflateOptions: { // See zlib defaults. chunkSize: 1024, memLevel: 7, level: 3 }, zlibInflateOptions: { chunkSize: 10 * 1024 }, // Other options settable: clientNoContextTakeover: true, // Defaults to negotiated value. serverNoContextTakeover: true, // Defaults to negotiated value. serverMaxWindowBits: 10, // Defaults to negotiated value. // Below options specified as default values. concurrencyLimit: 10, // Limits zlib concurrency for perf. threshold: 1024 // Size (in bytes) below which messages // should not be compressed if context takeover is disabled. } */ wss.on("connection", function connection(ws, req) { //第二步 ws.on("error", function (e) { // console.log('error',e.stack); __.callback({ event: "error", error: e }, ws); }); ws.on("close", function (code, reason) { reason = Buffer.from(reason).toString("utf-8"); if (ws.tsessionID) delete __.idic[ws.tsessionID]; // console.log('close',code,reason); __.callback({ event: "close", data: { code: code, reason: reason } }, ws); }); ws.on("message", function (message, isBinary) { ws.lastUpdate = +new Date(); __.queue.push(ws); //检查对象 if (isBinary) { message = Buffer.from(message); __.callback({ event: "message", data: { event: "message", data: message } }, ws); } else { message = Buffer.from(message).toString("utf-8"); __.callback({ event: "message", data: message }, ws); } console.log("559 message", isBinary, message); // ws.send(message); // ws.send(JSON.stringify({type:'msg',data:'message'})); //广播 // wss.clients.forEach(function each(client) { // if (client.readyState === socket.OPEN) { // client.send(data, { binary: isBinary }); // } // }); }); __.callback({ event: "open" }, ws); ws.lastUpdate = +new Date(); ws.headers = _tool2.default.merge({}, req.headers); ws.tsessionID = _tool2.default.GUID(); __.queue.push(ws); __.idic[ws.tsessionID] = ws; console.log("open情况下的websocket设置", (0, _keys2.default)(__.idic).join()); // console.log(220,'connection'); //生成session信息准备进行备用。生成sessionID之后准备备用 //这里的tsessionID就是标记ws备用可发送的意思。 // ws.send(JSON.stringify({type:'msg',data:'message'})); // ... //第一步应该先生成sessionID 进行会话保持,完全等待客户端心跳进行自动应答,保证延时时间内不响应即可关闭会话。 //生成session对象 开始按照逻辑进行deal处理 //第二步按照Socket方式进行异步通讯 参照路径方式进行 按照preload进行异步处理 其它消息进行异步处理。 }); wss.on("error", function (e) { __.callback({ event: "error", error: e }); }); server.on("upgrade", function upgrade(request, socket, head) { // const { pathname } = parse(request.url); wss.handleUpgrade(request, socket, head, function done(ws) { //第一步 wss.emit("connection", ws, request); }); }); //传递__ 因为deal中的this是server 不是 app; // pri(server, __); return server; } }]); return WsApp; }(App); // /** // * Mqtt // * https://blog.csdn.net/ziyue13/article/details/121032362 // * @param {配置文件} config // * @param {秘钥} key // * @param {加密文件} cert // */ // export const MqttApp = class extends App { // //https://www.php1.cn/detail/RS485__RS232_DeX_50f1b7d9.html // constructor(config,sendkey="!@#$") { // super(config,{ // port:1883, // sendkey, // ascoltatore:{ // type: 'mongo', // url: '',//'mongodb://localhost:27017/mqtt', // pubsubCollection: 'ascoltatori', // mongo: {} // }}); // } // createServer(conf) { // const { _, __ } = pri(this); // const server = mosca.createServer(V.merge({ // port:__.port, // ascoltatore:__.ascoltatore, // },conf)); // //传递__ 因为deal中的this是server 不是 app; // pri(server, __); // return server; // } // start(port = 1883,dburl) { // const { _, __ } = pri(this); // if (__.server) { // throw new Error('服务已经启动于' + __.port + '端口,请关闭后重新启动'); // } else { // __.port = port; // if(!dburl) throw new Error('请输入Mongo数据库链接地址!'); // // 创建服务器 // __.server = _.createServer({port:port,ascoltatore:{url:dburl}}); // __.server.on('timeout', () => __.log.info('MqttApp:连接超时')); // __.server.on('clientConnected', () => __.log.info('MqttApp:发生新的连接')); // __.server.on('ready', () => __.log.info('MqttApp:服务上线')); // __.server.on('published', (packet,client) => { // __.log.info('MqttApp:收到新消息',packet,client.id); // try{ // var form = V.json(packet.payload || '{}'); // //_topic和_sendkey成为服务唯一秘钥 // if(form._topic && __.sendkey.eq(form._sendkey)){ // //这里直接转发mqtt内容 // form._topic.split(';').map(v=>{ // __.server.publish({topic:v,payload:V.toJsonString(form.data || {})}); // }) // return; // } // var req = { // headers:{ // "content-type":"content-type", // host:"127.0.0.1",port, // protocol:'mqtt://', // 'accept-encoding-vesh':'mqtt', // }, // topic:packet.topic, // url:form._url || '/', // method:'POST', // form:form, // querystring:{} // }; // var rep = new ArrayStream(); // rep.topic = packet.topic; // rep.statusCode = 200; // rep.headers = {"content-type":"application/json"}; // rep.setHeader = function(k,v){rep.headers[k]=v;}; // rep.end = function(sb){ // if(rep.IsEnd) return; // rep.IsEnd = true; // rep.topic && rep.topic.split(';').map(v=>__.server.publish({topic:v,payload:sb || Buffer.from(rep.toArray()).toString()})); // }; // _.deal(req,rep); // }catch(e){ // __.server.publish({topic:"client.error",payload:V.toJsonString({ // id:client.id, // error:e.stack // })}); // } // return; // }); // __.server.on('clientError', (err) => __.log.error('MqttApp:发生客户端错误' + err.stack)); // process.on('SIGTERM', function() { // console.log("Received SIGTERM. Exiting."); // __.server.close(function() { // _.dispose(); // process.exit(0); // }); // }); // } // } // stop() { // const { _, __ } = pri(this); // if (__.server) { // __.server.close && __.server.close(); // __.server.removeAllListeners && __.server.removeAllListeners(); // __.server = null; // } // } // async deal(req,rep){ // const { _, __ } = pri(this); // __.log.info('MqttApp:' + V.toJsonString(req.header) + " " + req.url); // try { // const session = __.factory.getValue() || (function() { throw new Error('VESH:必须定义VESH.view/com.coooders.Project.VESH.SessionDataManager对象'); })(); // await session.init(__.config, __.middler, __.log, __.ni, req, rep); // session.topic = req.topic; // const data = {}; // data.modulers = 0; // //module处理 // await V.whileC(() => session.IsEnd ? null : __.modulers[data.modulers++], async v => { // try { // if({ // FormModuler:1, // FilesModuler:1 // }[v.Name]) return false; // const ret = v.onrequest ? await V.callback2(call => v.onrequest(req, rep, session, call)) : false; // if (ret) { // session.end(200); // } // } catch (err) { // __.log.error('VESH:' + (v.Name ? (v.Name + ': ') : ' ') + (err.status || '') + err.message); // console.log('VESH:' + (v.Name ? (v.Name + ': ') : ' ') + (err.status || '') + err.message); // session.end(err.status || 500, err.message); // } // //if (session.IsEnd) console.log('VESH-end:' + v.Name); // return false; // }, true); // await session.update(); // data.modulers--; //whileC默认会多判断一次 // //console.log(data.modulers, __.modulers[data.modulers--]); // await V.whileC(() => __.modulers[data.modulers-- - 1], async v => { // try { // if({ // FormModuler:1, // FilesModuler:1 // }[v.Name]) return false; // return v.onresponse ? await V.callback2(v.onresponse, v, req, rep, session) : false; // } catch (err) { // __.log.error('VESH:' + (v.Name ? (v.Name + ':') : '') + (err.status || '') + err.message); // console.log('VESH onresponse:' + (v.Name ? (v.Name + ': ') : ' ') + (err.status || '') + err.message); // session.end(err.status || 500, err.message); // data.modulers = 0; // } // return false; // }, true); // rep.topic = session.topic; // if (await session.flush()) // rep.end(); // } catch (e) { // __.errcall(e, rep); // } // return false; // } // }; exports.default = { AModuler: AModuler, App: App, HttpsApp: HttpsApp, WsApp: WsApp }; var ___ = {}; var pri = _tool2.default.pris(); //# sourceMappingURL=app.js.map