UNPKG

gcl

Version:

码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现

583 lines (504 loc) 22.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createReverseProxy2 = exports.createReverseProxy = exports.download = exports.upload = exports.getJson = exports.postJson = exports.post = exports.get = exports.WebClient = exports.request = undefined; 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("../common/tool"); var _tool2 = _interopRequireDefault(_tool); var _http = require("http"); var _http2 = _interopRequireDefault(_http); var _https = require("https"); var _https2 = _interopRequireDefault(_https); var _url = require("url"); var _url2 = _interopRequireDefault(_url); var _zlib = require("zlib"); var _zlib2 = _interopRequireDefault(_zlib); var _fs = require("fs"); var _fs2 = _interopRequireDefault(_fs); var _path = require("path"); var _path2 = _interopRequireDefault(_path); var _arraystream = require("../collection/arraystream"); var _cookie = require("./cookie"); var _cookie2 = _interopRequireDefault(_cookie); var _tool3 = require("../io/tool"); var _tool4 = _interopRequireDefault(_tool3); var _querystring = require("querystring"); var _iconvLite = require("iconv-lite"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * 处理字符集不标准问题 * @param {*} buffer * @param {*} encoding */ var convert = function convert() { var buffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Buffer(); var coding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "utf-8"; return !coding.eq("utf-8") && !coding.eq("utf8") ? (0, _iconvLite.decode)(buffer, coding) : buffer.toString(); }; /** * request全Tool对象的基本方法可以输入 options=url.parse,stream,func(err,resp,code,cencoding,encoding); 返回req 需要手动完成write与end操作 可以针对GZIP等方式自动解压还原文件内容 */ var request = exports.request = function request(options, stream, func) { options = _tool2.default.merge({ method: "GET", headers: { Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.11 Safari/537.36", "Accept-Encoding": "gzip, deflate" } }, options); var HA = options.protocol.toLowerCase() == "https:" ? _https2.default : _http2.default; return HA.request(options, function (resp) { var contentencoding = resp.headers["content-type"] && resp.headers["content-type"].split("=")[1] || "UTF-8"; var encoding = resp.headers["content-encoding"] || ""; resp.on("error", function (err) { console.log(err); if (func) func.apply(null, [err]); }); stream.on("finish", function () { if (resp.statusCode == 200) { if (func) func.apply(null, [null, resp, resp.statusCode, contentencoding, encoding]); } else { //V.showException(new Error(resp.statusCode + '状态不等于200')); if (func) func.apply(null, [new Error(resp.statusCode + "状态不等于200:" + (stream.toArray ? convert(Buffer.from(stream.toArray()), contentencoding || encoding) : ""))]); } }); switch (encoding.toLowerCase()) { case "gzip": resp.pipe(_zlib2.default.createGunzip()).pipe(stream); break; case "deflate": resp.pipe(_zlib2.default.createInflate()).pipe(stream); break; default: resp.pipe(stream); break; } }); }; var WebClient = exports.WebClient = function () { function WebClient() { (0, _classCallCheck3.default)(this, WebClient); var _pri = pri(this), _ = _pri._, __ = _pri.__; _.cookies = {}; _.timeout = 60000; } (0, _createClass3.default)(WebClient, [{ key: "get", value: function get(url) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var original = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; var _pri2 = pri(this), _ = _pri2._, __ = _pri2.__; data = typeof data == "string" ? data : (0, _querystring.stringify)(data); return _tool2.default.callback2(function (call) { var stream = new _arraystream.ArrayStream(); url = data ? "" + url + (url.indexOf("?") >= 0 ? "&" : "?") + ("" + data).trim("&") : url; var req = request(_tool2.default.merge({ headers: { Cookie: _cookie2.default.toString(_.cookies, url) } }, _url2.default.parse(url), { headers: headers }, method), stream, function (err, resp, code, cencoding, encoding) { if (err) call(err);else { _cookie2.default.merge(_.cookies, _cookie2.default.parse(resp.headers["set-cookie"])); call(null, original ? Buffer.from(stream.toArray()) : convert(Buffer.from(stream.toArray()), cencoding || encoding)); } }); req.on("error", function (e) { call(e); }); req.setTimeout(_.timeout); req.end(); }); } }, { key: "post", value: function post(url) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _pri3 = pri(this), _ = _pri3._, __ = _pri3.__; //兼容JSON格式输入 data = typeof data == "string" ? data : (0, _querystring.stringify)(data); return _tool2.default.callback2(function (call) { var stream = new _arraystream.ArrayStream(); var req = request(_tool2.default.merge({ method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", "Content-Length": Buffer.byteLength(data), Cookie: _cookie2.default.toString(_.cookies, url) } }, _url2.default.parse(url), { headers: headers }, method), stream, function (err, resp, code, cencoding, encoding) { if (err) call(err);else { _cookie2.default.merge(_.cookies, _cookie2.default.parse(resp.headers["set-cookie"])); call(null, convert(Buffer.from(stream.toArray()), cencoding || encoding)); } }); req.on("error", function (e) { call(e); }); req.write(data); req.setTimeout(_.timeout); req.end(); }); } }, { key: "getJson", value: function getJson(url) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _pri4 = pri(this), _ = _pri4._, __ = _pri4.__; data = typeof data == "string" ? data : (0, _querystring.stringify)(data); return _tool2.default.callback2(function (call) { var stream = new _arraystream.ArrayStream(); url = data ? "" + url + (url.indexOf("?") >= 0 ? "&" : "?") + ("" + data).trim("&") : url; var req = request(_tool2.default.merge({ method: "GET", headers: { "Content-Type": "application/x-www-form-urlencoded", "Content-Length": Buffer.byteLength(data), Cookie: _cookie2.default.toString(_.cookies, url) } }, _url2.default.parse(url), { headers: headers }, method), stream, function (err, resp, code, cencoding, encoding) { if (err) call(err);else { _cookie2.default.merge(_.cookies, _cookie2.default.parse(resp.headers["set-cookie"])); call(null, convert(Buffer.from(stream.toArray()), cencoding || encoding)); } }); req.on("error", function (e) { call(e); }); // req.write(V.toJsonString(data)); req.setTimeout(_.timeout); req.end(); }); } /** * post方法实现保留cookie的会话上传文件操作url,path(;分隔的字符串或者文件名数组),func(err,data) * 鸣谢http://www.soso.io/article/48643.html */ }, { key: "postJson", value: function postJson(url) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _pri5 = pri(this), _ = _pri5._, __ = _pri5.__; return _.post(url, _tool2.default.toJsonString(data), _tool2.default.merge({ "Content-Type": "application/json" }, headers), method); } /** * post方法实现保留cookie的会话上传文件操作url,path(;分隔的字符串或者文件名数组),func(err,data) * 鸣谢http://www.soso.io/article/48643.html */ }, { key: "upload", value: function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(url, path) { var _this = this; var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _pri6, _, __, paths, err, ret, boundaryKey, enddata, i, contentlength; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _pri6 = pri(this), _ = _pri6._, __ = _pri6.__; paths = _tool2.default.isArray(path) ? path : path.split(";").filter(function (v) { return _tool2.default.isValid(v); }); err = _tool2.default.sb(); ret = []; boundaryKey = Math.random().toString(16); enddata = "\r\n----" + boundaryKey + "--"; //定义尾部 i = 0; contentlength = 0; _context2.next = 10; return _tool2.default.each(paths, function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(v) { var pjson, isTrue, stat, content; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: pjson = _path2.default.parse(_path2.default.resolve(_path2.default.normalize(v))); v = _path2.default.format(pjson); _context.next = 4; return _tool2.default.callback2(function (call2) { return _fs2.default.exists(v, function (ist) { return call2(null, ist); }); }); case 4: isTrue = _context.sent; if (isTrue) { _context.next = 8; break; } err.append(v + "目标文件未找到"); return _context.abrupt("return", false); case 8: _context.prev = 8; _context.next = 11; return _tool2.default.callback2(_fs2.default.stat, _fs2.default, v); case 11: stat = _context.sent; content = Buffer.from("\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + 'Content-Disposition: form-data; name="' + "file" + i++ + '"; filename="' + pjson.base + '"\r\n' + "Content-Transfer-Encoding: binary\r\n\r\n", "utf-8"); ret.push({ content: content, path: v }); contentlength += content.length + stat.size; _context.next = 20; break; case 17: _context.prev = 17; _context.t0 = _context["catch"](8); err.append(v + "目标文件stat获取出现问题:" + _context.t0.message); case 20: return _context.abrupt("return", false); case 21: case "end": return _context.stop(); } } }, _callee, _this, [[8, 17]]); })); return function (_x20) { return _ref2.apply(this, arguments); }; }(), true); case 10: return _context2.abrupt("return", _tool2.default.callback2(function (call) { var stream = new _arraystream.ArrayStream(); var req = request(_tool2.default.merge({ method: "POST", headers: { "Content-Type": "multipart/form-data; boundary=--" + boundaryKey, "Content-Length": contentlength + Buffer.byteLength(enddata), Cookie: _cookie2.default.toString(_.cookies, url) } }, _url2.default.parse(url), { headers: headers }, method), stream, function (err2, resp, code, cencoding, encoding) { if (err2) call(err.clear() + "\r\n" + err2.stack);else { _cookie2.default.merge(_.cookies, _cookie2.default.parse(resp.headers["set-cookie"])); call(null, convert(Buffer.from(stream.toArray()), cencoding || encoding)); } }); req.on("error", function (e) { call(e); }); req.setTimeout(_.timeout); _tool2.default.each(ret, function (v, call2) { var file = _fs2.default.createReadStream(v.path, { bufferSize: 4 * 1024 }); //写入头部 req.write(v.content); file.on("end", call2); //写入文件 file.pipe(req, { end: false }); }, true).then(function () { return req.end(enddata); }).catch(function (e) { return console.log(e.stack); }); })); case 11: case "end": return _context2.stop(); } } }, _callee2, this); })); function upload(_x16, _x17) { return _ref.apply(this, arguments); } return upload; }() /** * get方法实现保留cookie的会话下载文件操作url,path,func(err,data) */ }, { key: "download", value: function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(url, path) { var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _pri7, _, __, file, opt; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _pri7 = pri(this), _ = _pri7._, __ = _pri7.__; _context3.next = 3; return _tool4.default.createDir(path); case 3: file = _fs2.default.createWriteStream(path); opt = _url2.default.parse(url); opt.headers = _tool2.default.merge({ Cookie: _cookie2.default.toString(_.cookies, url) }, headers); _tool2.default.merge(opt, method, true); return _context3.abrupt("return", _tool2.default.callback2(function (call) { var req = request(opt, file, function (err, resp, code, cencoding, encoding) { if (err) call(err);else { _cookie2.default.merge(_.cookies, _cookie2.default.parse(resp.headers["set-cookie"])); call(null, true); } }); req.on("error", function (e) { call(e); }); req.setTimeout(_.timeout); req.end(); })); case 8: case "end": return _context3.stop(); } } }, _callee3, this); })); function download(_x21, _x22) { return _ref3.apply(this, arguments); } return download; }() }]); return WebClient; }(); /** * 新建WebClient类对象返回get方法的对象url,func(err,data) */ var get = exports.get = function get(url, data, headers, method, original) { return new WebClient().get(url, data, headers, method, original); }; /** * post(url,func):新建WebClient类对象返回post方法的对象url,string || Buffer,func(err,data) */ var post = exports.post = function post(url, data, headers, method) { return new WebClient().post(url, data, headers, method); }; /** * 新建WebClient类对象返回post方法的对象url,string || JSON,func(err,data) */ var postJson = exports.postJson = function postJson(url, data, headers, method) { return new WebClient().postJson(url, data, headers, method); }; /** * 新建WebClient类对象返回post方法的对象url,string || JSON,func(err,data) */ var getJson = exports.getJson = function getJson(url, data, headers, method) { return new WebClient().getJson(url, data, headers, method); }; /** * 新建WebClient类对象返回post方法的文件对象url,path,func(err,data) */ var upload = exports.upload = function upload(url, path, headers, method) { return new WebClient().upload(url, path, headers, method); }; /** * 新建WebClient类对象返回get方法的文件对象url,path,func(err,data) */ var download = exports.download = function download(url, path, headers, method) { return new WebClient().download(url, path, headers, method); }; /** * createReverseProxy(port,[address]):非常简单的TCP代理服务器 */ var createReverseProxy = exports.createReverseProxy = function createReverseProxy(port, address) { if (address) {} else throw new Error("Need address Array(e.g [{host:127.0.0.1,port:1001},{host:127.0.0.1,port:1002}]) as ports"); address = _tool2.default.isArray(address) ? address : [address]; var w = 0; var proxy = function proxy(client, c) { client.pipe(c); c.pipe(client); }; var find = function find() { var start = w; w = (w + 1) % address.length; while (start != w) { var p = address[w]; if (p.err) { if (p.err.passtime.sub("s", new Date()) < 0) { delete p.err; return p; } } else return p; w = (w + 1) % address.length; } return address[start]; }; var tcpServer = net.createServer(function (c) { var p = find(); try { var client = net.createConnection(p.port, p.host, function () { return proxy(client, c); }); } catch (e) { console.log(e.stack); p.err = { e: e, passtime: new Date().add("s", 5) }; c.end(new Buffer(e.message, "utf-8")); } }).listen(port, function () { console.log("Proxy Server listen " + port + " Now!"); }); tcpServer.on("error", function (err) { output("server error ,check the port..." + err); }); return tcpServer; }; /** * createReverseProxy(proxy,host,proxyports):非常简单的TCP代理服务器 */ var createReverseProxy2 = exports.createReverseProxy2 = function createReverseProxy2(port, host, proxyports) { if (proxyports) {} else throw new Error("Need ProxyPorts Array(e.g [1001,1002,1003]) as ports"); proxyports = _tool2.default.isArray(proxyports) ? proxyports : [proxyports]; var w = 0; var proxy = function proxy(client, c) { client.pipe(c); c.pipe(client); }; var tcpServer = net.createServer(function (c) { w = (w + 1) % proxyports.length; var p = proxyports[w]; var client = host ? net.createConnection(p, host, function () { return proxy(client, c); }) : net.createConnection(p, function () { return proxy(client, c); }); }).listen(port, function () { console.log("Proxy Server listen " + port + " Now!"); }); tcpServer.on("error", function (err) { output("server error ,check the port..." + err); }); return tcpServer; }; exports.default = { request: request, WebClient: WebClient, get: get, getJson: getJson, post: post, postJson: postJson, upload: upload, download: download, createReverseProxy: createReverseProxy, createReverseProxy2: createReverseProxy2 }; var pri = _tool2.default.pris(); //# sourceMappingURL=tool.js.map