evtjs
Version:
Javascript API Bindings for the everiToken blockchain.
194 lines (153 loc) • 7.56 kB
JavaScript
;
var _regenerator = require("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _promise = require("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
var _typeof2 = require("babel-runtime/helpers/typeof");
var _typeof3 = _interopRequireDefault(_typeof2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var logger = require("./logger");
var httpModule = undefined;
var httpsModule = undefined;
var agent = undefined;
// if in Node, initialize libraries
if (!((typeof window === "undefined" ? "undefined" : (0, _typeof3.default)(window)) === "object" && typeof window.fetch === "function")) {
httpModule = require("http");
httpsModule = require("https");
agent = new httpsModule.Agent({
keepAlive: true
});
}
module.exports = {
/**
* Fetch a url using fetch in browser and http or https in Node
* @param {String} url
* @param {*} options
*/
fetch: function fetch(url, options) {
var didTimeout = false;
if ((typeof window === "undefined" ? "undefined" : (0, _typeof3.default)(window)) === "object" && typeof window.fetch === "function") {
// Browser with fetch support
if (options.headers) {
options.headers = new Headers(options.headers);
}
return new _promise2.default(function (resolve, reject) {
var timeOutId = null;
if (options.networkTimeout) {
timeOutId = setTimeout(function () {
didTimeout = true;
reject(new Error("Request Timeout."));
}, options.networkTimeout);
}
window.fetch(url, options).then(function (res) {
if (didTimeout) return;
if (timeOutId !== null) clearTimeout(timeOutId);
resolve(res);
}).catch(function (e) {
if (didTimeout) return;
reject(e);
});
});
} else {
// Node
return new _promise2.default(function (res, rej) {
var http = url.startsWith("http:") ? httpModule : httpsModule;
// parse http url
var parsed_url = require("url").parse(url);
// request via http module
var req = {
host: parsed_url.hostname,
port: parsed_url.port || 80,
path: parsed_url.path,
protocol: url.startsWith("http:") ? "http:" : "https:",
headers: options.headers || {},
method: options.method || "GET"
};
if (url.startsWith("https:")) {
req.agent = agent;
}
if (options.body) {
req.headers["Content-Length"] = new Buffer(options.body, "utf8").length;
}
var timeOutId = null;
var reqObj = http.request(req, function (response) {
if (didTimeout) return;
var buf = new Buffer(0);
response.on("data", function (chunk) {
buf = Buffer.concat([buf, chunk]);
});
response.on("end", function () {
if (didTimeout) return;
if (timeOutId !== null) clearTimeout(timeOutId);
logger.verbose("[fetch] finished " + response.statusCode + " " + url);
var parsedResObj = {
json: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
return _context.abrupt("return", JSON.parse(buf.toString("utf8")));
case 4:
_context.prev = 4;
_context.t0 = _context["catch"](0);
throw new Error("error while deserialization: " + buf.toString("utf8"));
case 7:
case "end":
return _context.stop();
}
}
}, _callee, this, [[0, 4]]);
}));
function getJSON() {
return _ref.apply(this, arguments);
}
return getJSON;
}(),
text: function () {
var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt("return", buf.toString("utf8"));
case 1:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function text() {
return _ref2.apply(this, arguments);
}
return text;
}()
};
res(parsedResObj);
});
});
if (options.networkTimeout) {
reqObj.setTimeout(options.networkTimeout, function () {
didTimeout = true;
reqObj.abort();
});
timeOutId = setTimeout(function () {
didTimeout = true;
reqObj.abort();
}, options.networkTimeout);
}
if (options.body) {
reqObj.write(options.body);
}
reqObj.on("error", function (err) {
rej(err);
});
reqObj.end();
});
}
}
};