vesh
Version:
码农nodejs版本VESH框架,使用函数责任链模式 实现了 默认文件跳转,自定义错误页,空文件处理,URL解析,Querystring与Form参数解析,PostFiles解析,MVC自动映射,SQL自动服务化,可继承页面,静态文件,json,tjson,jsonp,tjsonp,string,void,xjson,xjosnp等等6种JSON格式,http与https等等操作
1,186 lines (1,047 loc) • 41 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.FilesModuler = exports.CacheModuler = exports.LimitModuler = exports.EmptyModuler = exports.InitSessionModuler = exports.CookieModuler = exports._FilesModuler = exports.FormModuler = exports.HeaderModuler = exports.StatusModuler = exports.DefaultModuler = undefined;
var _regenerator = require("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _tool = require("gcl/com/coooders/common/tool");
var _tool2 = _interopRequireDefault(_tool);
var _ni = require("gcl/com/coooders/db/ni");
var _ni2 = _interopRequireDefault(_ni);
var _app = require("./app");
var _querystring = require("querystring");
var _querystring2 = _interopRequireDefault(_querystring);
var _httpErrors = require("http-errors");
var _httpErrors2 = _interopRequireDefault(_httpErrors);
var _arraystream = require("gcl/com/coooders/collection/arraystream");
var _iconvLite = require("iconv-lite");
var _iconvLite2 = _interopRequireDefault(_iconvLite);
var _url = require("url");
var _url2 = _interopRequireDefault(_url);
var _zlib = require("zlib");
var _zlib2 = _interopRequireDefault(_zlib);
var _cookie = require("gcl/com/coooders/net/cookie");
var _cookie2 = _interopRequireDefault(_cookie);
var _mime = require("gcl/com/coooders/net/mime");
var _tool3 = require("gcl/com/coooders/io/tool");
var _tool4 = _interopRequireDefault(_tool3);
var _fs = require("fs");
var _fs2 = _interopRequireDefault(_fs);
var _busboy = require("busboy");
var _busboy2 = _interopRequireDefault(_busboy);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* 使用判断如果未根目录就自动设置默认页面地址
*/
var DefaultModuler = exports.DefaultModuler = function (_AModuler) {
(0, _inherits3.default)(DefaultModuler, _AModuler);
function DefaultModuler() {
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
var isRedirect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
(0, _classCallCheck3.default)(this, DefaultModuler);
var _this = (0, _possibleConstructorReturn3.default)(this, (DefaultModuler.__proto__ || (0, _getPrototypeOf2.default)(DefaultModuler)).call(this, "DefaultModuler"));
pri(_this, { path: path.split("?")[0], isRedirect: isRedirect });
return _this;
}
(0, _createClass3.default)(DefaultModuler, [{
key: "onrequest",
value: function onrequest(req, rep, session) {
var _pri = pri(this),
_ = _pri._,
__ = _pri.__;
var query = req.url.split("?");
if (query[0].length <= 1) {
req.url = __.path + (query[1] || "");
if (__.isRedirect) session.redirect(req.url);
}
return false;
}
}]);
return DefaultModuler;
}(_app.AModuler);
/**
* StatusCode进行判断自动转向指定的错误页
*/
var StatusModuler = exports.StatusModuler = function (_AModuler2) {
(0, _inherits3.default)(StatusModuler, _AModuler2);
function StatusModuler() {
var paths = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var valid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "htm;html";
(0, _classCallCheck3.default)(this, StatusModuler);
var _this2 = (0, _possibleConstructorReturn3.default)(this, (StatusModuler.__proto__ || (0, _getPrototypeOf2.default)(StatusModuler)).call(this, "StatusModuler"));
var __ = {};
valid.split(";").filter(function (v) {
return _tool2.default.isValid(v);
}).forEach(function (k) {
return __[k] = true;
});
pri(_this2, { paths: paths, valid: __ });
return _this2;
}
(0, _createClass3.default)(StatusModuler, [{
key: "onresponse",
value: function onresponse(req, rep, session) {
var _pri2 = pri(this),
_ = _pri2._,
__ = _pri2.__;
if (__.paths[rep.statusCode + ""] && __.valid[session.extend]) session.redirect(__.paths[rep.statusCode + ""]);
return false;
}
}]);
return StatusModuler;
}(_app.AModuler);
/**
* 用于添加reponse的静态头部
*/
var HeaderModuler = exports.HeaderModuler = function (_AModuler3) {
(0, _inherits3.default)(HeaderModuler, _AModuler3);
function HeaderModuler() {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck3.default)(this, HeaderModuler);
var _this3 = (0, _possibleConstructorReturn3.default)(this, (HeaderModuler.__proto__ || (0, _getPrototypeOf2.default)(HeaderModuler)).call(this, "HeaderModuler"));
pri(_this3, { data: data });
return _this3;
}
(0, _createClass3.default)(HeaderModuler, [{
key: "onrequest",
value: function onrequest(req, rep, session) {
var _pri3 = pri(this),
_ = _pri3._,
__ = _pri3.__;
if (req.headers["host"] && req.headers["origin"] && req.headers["host"] !== req.headers["origin"].split("//")[1]) {
if (!__.data["Access-Control-Allow-Origin"]) rep.setHeader("Access-Control-Allow-Origin", req.headers["origin"]);
if (!__.data["Access-Control-Allow-Credentials"]) rep.setHeader("Access-Control-Allow-Credentials", "true");
}
for (var k in __.data) {
rep.setHeader(k, __.data[k]);
}return false;
}
}]);
return HeaderModuler;
}(_app.AModuler);
/**
* 使用querystring和raw-body完成SessionDataManager.QueryString,Form的管理和设置
*/
var FormModuler = exports.FormModuler = function (_AModuler4) {
(0, _inherits3.default)(FormModuler, _AModuler4);
function FormModuler() {
var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Math.pow(2, 20) * 4;
(0, _classCallCheck3.default)(this, FormModuler);
var _this4 = (0, _possibleConstructorReturn3.default)(this, (FormModuler.__proto__ || (0, _getPrototypeOf2.default)(FormModuler)).call(this, "FormModuler"));
pri(_this4, {
size: size,
fregex: /[/\\][^/\\]+$/g,
dregex: /\.[^/\\\.]+$/g
});
return _this4;
}
(0, _createClass3.default)(FormModuler, [{
key: "parse",
value: function parse(req, rep, session, func) {
var _pri4 = pri(this),
_ = _pri4._,
__ = _pri4.__;
var callback = func;
req.headers["content-type"] = req.headers["content-type"] || "text/plain";
switch (req.headers["content-type"].split(";")[0].toLowerCase()) {
case "ws":
case "mqtt":
session.form = req.form || {};
func(null, false);
return;
case "application/x-www-form-urlencoded":
callback = function callback(err, data) {
try {
if (err) func((0, _httpErrors2.default)(415, err));else {
session.orgform = data;
session.form = _querystring2.default.parse(data); // 判断size长度,判断content-type 分别继续进行处理
func(null, false);
}
} catch (e) {
func((0, _httpErrors2.default)(500, e));
}
};
break;
case "application/json":
callback = function callback(err, data) {
try {
if (err) func((0, _httpErrors2.default)(415, err));else {
session.orgform = data;
session.form = _tool2.default.json(data); // 判断size长度,判断content-type 分别继续进行处理
func(null, false);
}
} catch (e) {
func((0, _httpErrors2.default)(500, e));
}
};
break;
case "text/xml":
case "application/xml":
callback = function callback(err, data) {
try {
if (err) func((0, _httpErrors2.default)(415, err));else {
session.orgform = data;
session.form = _tool2.default.xml().toJson(data); // 判断size长度,判断content-type 分别继续进行处理
func(null, false);
}
} catch (e) {
func((0, _httpErrors2.default)(500, e));
}
};
break;
case "text/plain":
callback = function callback(err, data) {
try {
if (err) func((0, _httpErrors2.default)(415, err));else {
session.orgform = data;
session.form = data; // 判断size长度,判断content-type 分别继续进行处理
func(null, false);
}
} catch (e) {
func((0, _httpErrors2.default)(500, e));
}
};
break;
case "application/octet-stream":
//未测试
callback = function callback(err, data, encoding) {
try {
if (err) func((0, _httpErrors2.default)(415, err));else {
session.orgform = data;
session.form = _iconvLite2.default.decode(data, encoding || "utf-8"); // 判断GB2312进行处理
func(null, false);
}
} catch (e) {
func((0, _httpErrors2.default)(500, e));
}
};
break;
case "multipart/form-data":
func(null, false);
return;
default:
func((0, _httpErrors2.default)(415, new Error("Invalid Content-Type:" + req.headers["content-type"])));
return;
}
//需要Form处理
var encoding = (req.headers["content-encoding"] || "identity").toLowerCase() || "";
var cencoding = "utf-8";
var length = req.headers["content-length"] || __.size;
var stream = new _arraystream.ArrayStream(length);
stream.on("error", callback);
stream.on("finish", function (err) {
return callback(err, Buffer.from(stream.toArray()).toString("utf-8"), cencoding);
});
switch (encoding.toLowerCase()) {
case "gzip":
req.pipe(_zlib2.default.createGunzip()).pipe(stream);
break;
case "deflate":
req.pipe(_zlib2.default.createInflate()).pipe(stream);
break;
default:
case "identity":
req.pipe(stream);
break;
}
}
}, {
key: "onrequest",
value: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(req, rep, session) {
var _pri5, _, __, query;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_pri5 = pri(this), _ = _pri5._, __ = _pri5.__;
session.url = _url2.default.parse((req.protocol || "http://") + req.headers.host + req.url.replace(/\/+/g, "/"));
session.querystring = _querystring2.default.parse(session.url.query, null, null, {
decodeURIComponent: decodeURIComponent
});
//兼容无后缀和多点的情况
query = session.url.pathname.match(__.fregex);
query = query && query[0].substr(1).replace(__.dregex, ""); // || session.url.pathname;
session.status = query;
session.filename = query;
if (!(req.method === "POST")) {
_context.next = 12;
break;
}
_context.next = 10;
return _tool2.default.callback2(function (call) {
return _.parse(req, rep, session, call);
});
case 10:
_context.next = 13;
break;
case 12:
return _context.abrupt("return", false);
case 13:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function onrequest(_x7, _x8, _x9) {
return _ref.apply(this, arguments);
}
return onrequest;
}()
}, {
key: "onresponse",
value: function onresponse(req, rep, session) {
delete session.querystring;
delete session.form;
delete session.filename;
return false;
}
}]);
return FormModuler;
}(_app.AModuler);
/**
* 文件处理
*/
var _FilesModuler = exports._FilesModuler = function (_AModuler5) {
(0, _inherits3.default)(_FilesModuler, _AModuler5);
function _FilesModuler(path) {
var limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Math.pow(2, 20) * 10;
(0, _classCallCheck3.default)(this, _FilesModuler);
var _this5 = (0, _possibleConstructorReturn3.default)(this, (_FilesModuler.__proto__ || (0, _getPrototypeOf2.default)(_FilesModuler)).call(this, "FilesModuler"));
pri(_this5, {
limit: limit,
postfile: function () {
function postfile(path) {
(0, _classCallCheck3.default)(this, postfile);
pri(this, { path: path });
var that = this;
this.stream = _fs2.default.createWriteStream(path);
this.stream.on("error", function (err) {
return _tool2.default.showException("", err);
});
this.stream.on("finish", function () {
return delete that.stream;
});
}
(0, _createClass3.default)(postfile, [{
key: "save",
value: function () {
var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(path) {
var _pri6, __;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_pri6 = pri(this), __ = _pri6.__;
_context2.next = 3;
return _tool4.default.copyFile(__.path, path);
case 3:
return _context2.abrupt("return", _context2.sent);
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function save(_x11) {
return _ref2.apply(this, arguments);
}
return save;
}()
}, {
key: "remove",
value: function remove() {
var _pri7 = pri(this),
__ = _pri7.__;
_fs2.default.unlink(__.path, function () {});
return false;
}
}, {
key: "end",
value: function end() {
if (this.stream) this.stream.end();
delete this.stream;
}
}]);
return postfile;
}(),
check: function check(session, req) {
if (req.isEnd) {
var isF = true;
(session.Files ? session.Files : []).forEach(function (v) {
isF = v.isEnd && isF;
});
return isF;
}
return false;
}
});
_this5.path = _tool4.default.formatPath(path);
return _this5;
}
(0, _createClass3.default)(_FilesModuler, [{
key: "parse",
value: function parse(datas, spliter, rest) {
//将二进制数据根据常用字符串\r\n进行匹配和分割
var strs = Buffer.from(spliter).toJSON().data;
var l = 0,
r = rest ? rest : 0;
var buffer = [],
ret = [];
while (l < datas.length) {
if (datas[l] == strs[r]) {
//开始进入第二步测试
if (r < strs.length - 1) r++;else {
//匹配成功 同时处理越次匹配这种事
if (buffer.length > 0) ret.push(buffer);
ret.push({ isspliter: true });
buffer = [];
r = 0;
}
} else if (r > 0) {
//说明匹配失败 l回退
l = l - r;
if (l < 0) {
//说明数据回退到上次获取的结尾之前,需要进行补充 补充内容是 strs[0-abs(l)]
for (var i = 0; i <= Math.abs(l); i++) {
buffer.push(strs[i]);
}l = 0;
} else buffer.push(datas[l]);
r = 0;
} else buffer.push(datas[l]);
l++;
}
ret.push(buffer);
return { datas: ret, rest: r };
}
}, {
key: "onrequest",
value: function onrequest(req, rep, session, call) {
var _pri8 = pri(this),
_ = _pri8._,
__ = _pri8.__;
session.Files = [];
req.headers["content-type"] = req.headers["content-type"] || "";
if (req.method === "POST" && req.headers["content-type"].toLowerCase().trim().startWith("multipart/form-data")) {
var length = req.headers["content-length"],
received = 0;
if (length > __.limit) {
session.end(400, _tool2.default.format("request size is too large:{length}>{limit}", {
limit: __.limit,
length: length
}));
return false;
}
var key = _tool2.default.GUID();
var boundaryKey = req.headers["content-type"].split(";")[1].split("=")[1];
//.trim('-').trim('"').trim("'");//兼容IOS
var boundaryKey2 = boundaryKey.trim("-").trim('"').trim("'");
// console.log(291,boundaryKey);
session.checker = new _tool4.default.checker(function () {
//使用多流截止检查
delete session.checker;
call(null, false);
});
req.on("error", call);
req.on("end", function () {
if (received != length) session.end(400, "request size did not match content length:" + length + "!=" + receive);
});
session.checker.push(req);
var fileStream = null,
file = null,
rest = 0;
//首先有\r\n进行处理
req.on("data", function (data) {
received += data.length;
var datas = _.parse(data, "\r\n", rest);
var strs = datas.datas;
rest = datas.rest;
//确定文件头部位置
if (strs.length > 1) {
//说明找到了头部和头部相关的位置
var isHead = false,
hasWrite = false,
buffer = 0;
strs.forEach(function (v) {
if (v.isspliter) {
buffer++;
} else {
var v2 = Buffer.from(v).toString("utf-8");
// switch (v2) {
// case '--' + boundaryKey:
// case '----' + boundaryKey:
// if (file) {
// console.log('关闭文件并重新开启文件');
// }
// console.log('关闭文件并重新开启文件2',v2);
// break;
// case 'Content-Transfer-Encoding: binary':
// case 'Content-Type: application/octet-stream':
// console.log(v2);
// break;
// case '':
// if (isHead) {
// isHead = false;
// buffer = -1;
// return;
// }
// console.log('空');
// break;
// case '--' + boundaryKey + '--':
// case '----' + boundaryKey + '--':
// //传送结束
// console.log('结束',v2);
// break;
// default:
// //修正上传文件类型类型不为流时 不写入
// if (v2.toLowerCase().startWith('content-type:'))
// console.log('content-type:');
// if (v2.indexOf('Content-Disposition:') >= 0) {
// console.log('Content-Disposition:');
// } else {
// //主要数据入口
// console.log('数据',v.length);
// }
// break;
// }
switch (v2) {
case "--" + boundaryKey2:
case "----" + boundaryKey2:
case "--" + boundaryKey:
case "----" + boundaryKey:
if (file) {
//关闭文件并重新开启文件
file.end();
// if (!file.filename) {
// file.remove();
// session.Files.pop();
// }
file = null;
}
var path = _.path + _tool2.default.environment.splitChar + key + session.Files.length + ".tmp";
file = new __.postfile(path);
file.length = length;
session.Files.push(file);
session.checker.push(file.stream);
buffer = 0;
isHead = true;
hasWrite = false;
break;
case "Content-Transfer-Encoding: binary":
case "Content-Type: application/octet-stream":
break;
case "":
if (isHead) {
isHead = false;
buffer = -1;
return;
}
break;
case "--" + boundaryKey2 + "--":
case "----" + boundaryKey2 + "--":
case "--" + boundaryKey + "--":
case "----" + boundaryKey + "--":
//传送结束
if (file) {
//关闭文件并重新开启文件
file.end();
file = null;
}
break;
default:
//修正上传文件类型类型不为流时 不写入
if (v2.toLowerCase().startWith("content-type:")) break;
if (v2.indexOf("Content-Disposition:") >= 0) {
var desc = v2.split('"');
if (file) {
file.name = desc[1];
file.filename = desc[3];
}
} else {
//主要数据入口
while (buffer > 0) {
buffer--;
if (hasWrite && file) {
//
file.stream.write(Buffer.from("\r\n"));
}
}
if (v.length > 0) {
hasWrite = true;
file && file.stream.write(Buffer.from(v));
}
}
break;
}
}
});
} else if (strs[0].length > 0 && file) file.stream.write(Buffer.from(strs[0]));
});
} else call(null, false);
}
}, {
key: "init",
value: function init() {
_tool4.default.createDir(this.path);
}
}, {
key: "onresponse",
value: function onresponse(req, rep, session) {
if (session.Files.length > 0) session.Files.forEach(function (v) {
return v.remove();
});
return false;
}
}]);
return _FilesModuler;
}(_app.AModuler);
/**
* Cookie处理
*/
var CookieModuler = exports.CookieModuler = function (_AModuler6) {
(0, _inherits3.default)(CookieModuler, _AModuler6);
function CookieModuler() {
(0, _classCallCheck3.default)(this, CookieModuler);
return (0, _possibleConstructorReturn3.default)(this, (CookieModuler.__proto__ || (0, _getPrototypeOf2.default)(CookieModuler)).call(this, "CookieModuler"));
}
(0, _createClass3.default)(CookieModuler, [{
key: "onrequest",
value: function onrequest(req, rep, session) {
session.Cookies = req.headers["cookie"] ? _cookie2.default.serverParse(req.headers["cookie"]) : {};
session.SetCookies = {};
return false;
}
}, {
key: "onresponse",
value: function onresponse(req, rep, session) {
if (!session.isStatic) for (var i in session.SetCookies) {
if (i) {
!session.isInterrupt() && rep.setHeader("Set-Cookie", _cookie2.default.toHeaderArray(_tool2.default.getValue(session.SetCookies, {})));
//delete session.Cookies;
return false;
}
}return false;
}
}]);
return CookieModuler;
}(_app.AModuler);
/**
* 会话初始化Moduler
*/
var InitSessionModuler = exports.InitSessionModuler = function (_AModuler7) {
(0, _inherits3.default)(InitSessionModuler, _AModuler7);
function InitSessionModuler() {
(0, _classCallCheck3.default)(this, InitSessionModuler);
return (0, _possibleConstructorReturn3.default)(this, (InitSessionModuler.__proto__ || (0, _getPrototypeOf2.default)(InitSessionModuler)).call(this, "InitSessionModuler"));
}
(0, _createClass3.default)(InitSessionModuler, [{
key: "onrequest",
value: function () {
var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(req, rep, session) {
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return session.initSession(session.param("sessionID") || session.param("SessionID") || session.WebSocket && session.WebSocket.tsessionID);
case 2:
return _context3.abrupt("return", false);
case 3:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function onrequest(_x12, _x13, _x14) {
return _ref3.apply(this, arguments);
}
return onrequest;
}()
}, {
key: "onresponse",
value: function onresponse(req, rep, session) {
//这时如果刚刚登录或者已经登录应该进行session的Reset操作 要求如果是WebSocket请求,那么把WebSocket的tsessionID和SessionID进行绑定交换
// 放弃绑定各管各的
// session.WebSocket &&
// session.resetWebSocketSessionID(
// session.param("sessionID") ||
// session.param("SessionID") ||
// (session.WebSocket && session.WebSocket.tsessionID)
// );
// console.log(494, Object.keys(session.WSSessionMap).length);
return false;
}
}]);
return InitSessionModuler;
}(_app.AModuler);
/**
* 空返回值处理
*/
var EmptyModuler = exports.EmptyModuler = function (_AModuler8) {
(0, _inherits3.default)(EmptyModuler, _AModuler8);
function EmptyModuler() {
(0, _classCallCheck3.default)(this, EmptyModuler);
return (0, _possibleConstructorReturn3.default)(this, (EmptyModuler.__proto__ || (0, _getPrototypeOf2.default)(EmptyModuler)).call(this, "EmptyModuler"));
}
(0, _createClass3.default)(EmptyModuler, [{
key: "onresponse",
value: function onresponse(req, rep, session) {
switch (rep.getHeader("content-type") + "") {
case "undefined":
if (rep.statusCode == 200) {
rep.setHeader("Content-Type", _mime.MIME.txt);
session.end(404, "no such file or action:" + session.url.pathname);
} else {
rep.setHeader("Content-Type", _mime.MIME.html + ";charset=utf-8");
}
return false;
default:
return false;
}
}
}]);
return EmptyModuler;
}(_app.AModuler);
/**
* 限速Module
*/
/**
*
* @param {限制单位时间数量} count
* @param {定义单位时间} time
* @param {提示错误信息} time
*/
var LimitModuler = exports.LimitModuler = function (_AModuler9) {
(0, _inherits3.default)(LimitModuler, _AModuler9);
function LimitModuler() {
var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "访问人数过多,请稍后重试!";
var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
var time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
var limit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10000000;
(0, _classCallCheck3.default)(this, LimitModuler);
var _this9 = (0, _possibleConstructorReturn3.default)(this, (LimitModuler.__proto__ || (0, _getPrototypeOf2.default)(LimitModuler)).call(this, "LimitModuler"));
pri(_this9, { count: count, time: time, error: error, limit: limit });
return _this9;
}
(0, _createClass3.default)(LimitModuler, [{
key: "onrequest",
value: function onrequest(req, rep, session) {
var _pri9 = pri(this),
__ = _pri9.__;
session.testLimit("limitModule", __.error, __.count, __.time, __.limit);
return false;
}
}]);
return LimitModuler;
}(_app.AModuler);
/**
* 缓存Moduler处理
*/
var CacheModuler = exports.CacheModuler = function (_AModuler10) {
(0, _inherits3.default)(CacheModuler, _AModuler10);
function CacheModuler() {
(0, _classCallCheck3.default)(this, CacheModuler);
var _this10 = (0, _possibleConstructorReturn3.default)(this, (CacheModuler.__proto__ || (0, _getPrototypeOf2.default)(CacheModuler)).call(this, "CacheModuler"));
pri(_this10, { idic: {} });
return _this10;
}
(0, _createClass3.default)(CacheModuler, [{
key: "onrequest",
value: function onrequest(req, rep, session) {
var _pri10 = pri(this),
_ = _pri10._,
__ = _pri10.__;
if (__.idic[_tool2.default.hash(req.url)]) {
var data = __.idic[_tool2.default.hash(req.url)];
if (data.date.getTime() > new Date().getTime()) {
//缓存可用
for (var k in data.headers) {
rep.setHeader(k, data.headers[k]);
}
var stream = new _arraystream.ArrayStream();
stream.write(data.data);
session.writeStream(stream);
return true;
} else return false;
} else return false;
}
}, {
key: "onresponse",
value: function onresponse(req, rep, session, call) {
var _pri11 = pri(this),
_ = _pri11._,
__ = _pri11.__;
if (_tool2.default.isValid(rep.getHeader("content-type"))) {
var stream = new _arraystream.ArrayStream();
var sb = session.clearWrite();
if (_tool2.default.isValid(sb)) stream.write(sb, session.encoding);
var ss = session.clearStreams();
session.writeStream(stream);
if (ss && ss.length > 0) {
_tool2.default.each(ss, function (v, next) {
v.on("error", function (err) {
return session.Log.error("VESH:" + err.stack);
});
v.on("end", function () {
v.removeAllListeners("err");
v.removeAllListeners("end");
if (next) next();
});
//写入文件
v.pipe(stream, { end: false });
}).then(function () {
if (stream.buf.length > 0) __.idic[_tool2.default.hash(req.url)] = {
data: Buffer.from(Array.prototype.slice.call(stream.buf, 0)),
date: new Date().add("n", 2),
headers: { "content-type": rep.getHeader("content-type") }
};
call(null, false);
});
} else return false;
} else return false;
}
}]);
return CacheModuler;
}(_app.AModuler);
/**
* 文件处理
*/
var FilesModuler = exports.FilesModuler = function (_AModuler11) {
(0, _inherits3.default)(FilesModuler, _AModuler11);
function FilesModuler(path) {
var limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Math.pow(2, 20) * 10;
(0, _classCallCheck3.default)(this, FilesModuler);
var _this11 = (0, _possibleConstructorReturn3.default)(this, (FilesModuler.__proto__ || (0, _getPrototypeOf2.default)(FilesModuler)).call(this, "FilesModuler"));
pri(_this11, {
limit: limit,
postfile: function () {
function postfile(path) {
(0, _classCallCheck3.default)(this, postfile);
pri(this, { path: path });
var that = this;
this.stream = _fs2.default.createWriteStream(path);
this.stream.on("error", function (err) {
return _tool2.default.showException("", err);
});
this.stream.on("finish", function () {
return delete that.stream;
});
}
(0, _createClass3.default)(postfile, [{
key: "save",
value: function () {
var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(path) {
var _pri12, __;
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_pri12 = pri(this), __ = _pri12.__;
_context4.next = 3;
return _tool4.default.copyFile(__.path, path);
case 3:
return _context4.abrupt("return", _context4.sent);
case 4:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function save(_x20) {
return _ref4.apply(this, arguments);
}
return save;
}()
}, {
key: "remove",
value: function remove() {
var _pri13 = pri(this),
__ = _pri13.__;
_fs2.default.unlink(__.path, function () {});
return false;
}
}, {
key: "end",
value: function end() {
if (this.stream) this.stream.end();
delete this.stream;
}
}]);
return postfile;
}(),
check: function check(session, req) {
if (req.isEnd) {
var isF = true;
(session.Files ? session.Files : []).forEach(function (v) {
isF = v.isEnd && isF;
});
return isF;
}
return false;
}
});
_this11.path = _tool4.default.formatPath(path);
return _this11;
}
(0, _createClass3.default)(FilesModuler, [{
key: "onrequest",
value: function onrequest(req, rep, session, call) {
var _pri14 = pri(this),
_ = _pri14._,
__ = _pri14.__;
session.Files = [];
req.headers["content-type"] = req.headers["content-type"] || "";
if (req.method === "POST" && req.headers["content-type"].toLowerCase().trim().startWith("multipart/form-data")) {
var length = req.headers["content-length"],
received = 0;
if (length > __.limit) {
session.end(400, _tool2.default.format("request size is too large:{length}>{limit}", {
limit: __.limit,
length: length
}));
return false;
}
var key = _tool2.default.GUID();
var boundaryKey = req.headers["content-type"].split(";")[1].split("=")[1];
//.trim('-').trim('"').trim("'");//兼容IOS
var boundaryKey2 = boundaryKey.trim("-").trim('"').trim("'");
// console.log(291,boundaryKey);
session.checker = new _tool4.default.checker(function () {
//使用多流截止检查
delete session.checker;
call(null, false);
});
req.on("error", call);
req.on("end", function () {
// console.log(600,'request end!')
});
session.checker.push(req);
var busboy = null;
var file = null;
try {
busboy = (0, _busboy2.default)({ headers: req.headers, limits: __.limit });
busboy.on("file", function (fieldname, fileStream, _ref5) {
var filename = _ref5.filename,
encoding = _ref5.encoding,
mimeType = _ref5.mimeType;
if (!filename) return fileStream.resume();
console.log("File [" + fieldname + "]: filename: %j, encoding: %j, mimeType: %j", filename, encoding, mimeType);
filename = Buffer.from(filename, "latin1").toString("utf-8");
// if (file) {
// //关闭文件并重新开启文件
// file.end();
// // if (!file.filename) {
// // file.remove();
// // session.Files.pop();
// // }
// file = null;
// }
var path = _.path + _tool2.default.environment.splitChar + key + session.Files.length + ".tmp";
var file = new __.postfile(path);
file.name = filename.split(".");
file.name.pop();
file.name = file.name.join(".");
file.filename = filename;
file.encoding = encoding;
file.mimeType = mimeType;
file.length = 1;
session.Files.push(file);
session.checker.push(file.stream);
fileStream.on("close", function () {
// console.log('File Received!');
received = length;
if (file) file.end();
// if (!file.filename) {
// file.remove();
// session.Files.pop();
// }
file = null;
});
fileStream.on("error", function (e) {
console.log("File error!", e.message);
if (file) file.end();
// if (!file.filename) {
// file.remove();
// session.Files.pop();
// }
file = null;
call(e);
});
fileStream.pipe(file.stream);
// file.on('data', (data) => {
// console.log(`File [${name}] got ${data.length} bytes`);
// }).on('close', () => {
// console.log(`File [${name}] done`);
// });
});
busboy.on("field", function (name, val, info) {
console.log("Field [" + name + "]: value: %j", val);
});
busboy.on("close", function () {
// console.log('Done parsing form!',received,length);
if (file) {
file.end();
req.unpipe(busboy);
busboy.removeAllListeners();
received = length;
}
if (received != length) session.end(400, "request size did not match content length:" + length + "!=" + received);
file = null;
});
req.pipe(busboy);
} catch (err) {
if (file) {
req.unpipe(busboy);
busboy.removeAllListeners();
}
call(err);
}
} else call(null, false);
}
}, {
key: "init",
value: function init() {
_tool4.default.createDir(this.path);
}
}, {
key: "onresponse",
value: function onresponse(req, rep, session) {
if (session.Files.length > 0) session.Files.forEach(function (v) {
return v.remove();
});
return false;
}
}]);
return FilesModuler;
}(_app.AModuler);
exports.default = {
DefaultModuler: DefaultModuler,
StatusModuler: StatusModuler,
HeaderModuler: HeaderModuler,
FormModuler: FormModuler,
FilesModuler: FilesModuler,
CookieModuler: CookieModuler,
EmptyModuler: EmptyModuler,
CacheModuler: CacheModuler,
InitSessionModuler: InitSessionModuler,
LimitModuler: LimitModuler
};
var pri = _tool2.default.pris();
//# sourceMappingURL=modulers.js.map