gcl
Version:
码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现
583 lines (504 loc) • 22.1 kB
JavaScript
;
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