configcat-node
Version:
Official ConfigCat SDK to help you access your feature flags from a Node.js application.
101 lines (100 loc) • 4.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpConfigFetcher = void 0;
var tslib_1 = require("tslib");
var configcat_common_1 = require("configcat-common");
var http = require("http");
var https = require("https");
var tunnel = require("tunnel");
var url_1 = require("url");
var HttpConfigFetcher = /** @class */ (function () {
function HttpConfigFetcher() {
}
HttpConfigFetcher.prototype.handleResponse = function (response, resolve, reject) {
try {
var _a = response, statusCode_1 = _a.statusCode, reasonPhrase_1 = _a.statusMessage;
if (statusCode_1 === 200) {
var eTag_1 = response.headers["etag"];
var chunks_1 = [];
response
.on("data", function (chunk) { return chunks_1.push(chunk); })
.on("end", function () {
try {
resolve({ statusCode: statusCode_1, reasonPhrase: reasonPhrase_1, eTag: eTag_1, body: Buffer.concat(chunks_1).toString() });
}
catch (err) {
reject(err);
}
})
.on("error", function (err) { return reject(new configcat_common_1.FetchError("failure", err)); });
}
else {
// Consume response data to free up memory
response.resume();
resolve({ statusCode: statusCode_1, reasonPhrase: reasonPhrase_1 });
}
}
catch (err) {
reject(err);
}
};
HttpConfigFetcher.prototype.fetchLogic = function (options, lastEtag) {
var _this = this;
return new Promise(function (resolve, reject) {
try {
options.logger.debug("HttpConfigFetcher.fetchLogic() called.");
var baseUrl = options.getUrl();
var isBaseUrlSecure = baseUrl.startsWith("https");
var agent = void 0;
if (options.proxy) {
try {
var proxy = new url_1.URL(options.proxy);
var agentFactory = void 0;
if (proxy.protocol === "https:") {
agentFactory = isBaseUrlSecure ? tunnel.httpsOverHttps : tunnel.httpOverHttps;
}
else {
agentFactory = isBaseUrlSecure ? tunnel.httpsOverHttp : tunnel.httpOverHttp;
}
agent = agentFactory({
proxy: {
host: proxy.hostname,
port: proxy.port,
proxyAuth: (proxy.username && proxy.password) ? "".concat(proxy.username, ":").concat(proxy.password) : null
}
});
}
catch (err) {
options.logger.log(configcat_common_1.LogLevel.Error, 0, configcat_common_1.FormattableLogMessage.from("PROXY")(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["Failed to parse `options.proxy`: '", "'."], ["Failed to parse \\`options.proxy\\`: '", "'."])), options.proxy), err);
}
}
var requestOptions = {
agent: agent,
headers: {
"User-Agent": options.clientVersion,
"If-None-Match": lastEtag !== null && lastEtag !== void 0 ? lastEtag : null
},
timeout: options.requestTimeoutMs,
};
options.logger.debug(JSON.stringify(requestOptions));
var request_1 = (isBaseUrlSecure ? https : http).get(baseUrl, requestOptions, function (response) { return _this.handleResponse(response, resolve, reject); })
.on("timeout", function () {
try {
request_1.destroy();
}
finally {
reject(new configcat_common_1.FetchError("timeout", options.requestTimeoutMs));
}
})
.on("error", function (err) { return reject(new configcat_common_1.FetchError("failure", err)); })
.end();
}
catch (err) {
reject(err);
}
});
};
return HttpConfigFetcher;
}());
exports.HttpConfigFetcher = HttpConfigFetcher;
var templateObject_1;