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
JavaScript
;
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