fully-api
Version:
API framework for Fully Stacked, LLC REST-ful APIs
249 lines • 11.4 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Settings = void 0;
const aws_sdk_1 = __importDefault(require("aws-sdk"));
const os_1 = __importDefault(require("os"));
const Q = require('q');
const fs_1 = __importDefault(require("fs"));
const request_1 = __importDefault(require("request"));
const ErrorObj_1 = require("./ErrorObj");
class Settings {
constructor(file) {
this.s3 = new aws_sdk_1.default.S3();
this.file = file;
}
init(b, rs, f) {
const deferred = Q.defer();
this.bucket = b;
this.file = f ? f : this.file;
this.remoteSettings = rs;
if (this.remoteSettings === undefined || this.remoteSettings === null || this.remoteSettings === false) {
try {
this.data = require(this.file);
// Settings.prototype.data = require(this.file);
this.port = process.env.PORT || this.data.server_port;
deferred.resolve(true);
}
catch (e) {
deferred.reject(e);
}
}
else {
this.s3.getObject({ Bucket: this.bucket, Key: this.file }, function (err, res) {
if (!err) {
const f = JSON.parse(res.Body.toString());
this.data = JSON.parse(JSON.stringify(f));
deferred.resolve(true);
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'se0001', __filename, 'init', 'error getting file from s3', 'S3 error', err);
deferred.reject(errorObj);
}
});
}
return deferred.promise;
}
registerIp() {
const deferred = Q.defer();
this.port = process.env.PORT || this.data.server_port;
// MAKE SURE THAT THE IP FOR THIS SERVER IS IN THE LIST
const interfaces = os_1.default.networkInterfaces();
const ips = this.data.servers;
let addedIp = false;
for (const i in interfaces) {
for (const j in interfaces[i]) {
const address = interfaces[i][j];
if (address.family === 'IPv4' && !address.internal) {
const addressWithPort = address.address + ':' + this.port;
if (ips.indexOf(addressWithPort) == -1) {
ips.push(addressWithPort);
addedIp = true;
}
}
}
}
if (addedIp) {
this.data.servers = ips;
this.save(true)
.then(function (save_res) {
deferred.resolve(true);
})
.fail(function (err) {
const errorObj = new ErrorObj_1.ErrorObj(500, 'se0002', __filename, 'registerIp', 'error saving ip of server', 'Error', err);
deferred.reject(errorObj);
});
}
else {
deferred.resolve(true);
}
return deferred.promise;
}
reload() {
const s = this;
const deferred = Q.defer();
s.init(this.bucket, this.remoteSettings, this.file)
.then(function (res) {
deferred.resolve(res);
})
.fail(function (err) {
if (err !== undefined && err !== null && typeof (err.addToError) === 'function') {
deferred.reject(err.addToError(__filename, 'reload'));
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'se1002', __filename, 'reload', 'error reloading settings', 'Error reloading settings', err);
deferred.reject(errorObj);
}
});
return deferred.promise;
}
// IF REMOTE SETTINGS IS FALSE, THIS GETS BYPASSED
reloadNetwork() {
const deferred = Q.defer();
if (this.remoteSettings === true) {
const settings = this;
this.port = process.env.PORT || this.data.server_port;
const interfaces = os_1.default.networkInterfaces();
const myIps = [];
for (const i in interfaces) {
for (const j in interfaces[i]) {
const address = interfaces[i][j];
if (address.family === 'IPv4' && !address.internal) {
const addressWithPort = address.address + ':' + this.port;
if (myIps.indexOf(addressWithPort) == -1) {
myIps.push(addressWithPort);
}
}
}
}
const ips = settings.data.servers;
const headers = {
'Content-Type': 'application/json'
};
const postData = {
'username': settings.data.reload_user,
'password': settings.data.reload_pass
};
if ((myIps.length !== ips.length && myIps.length > 0)) {
// LOGIN
request_1.default.post({
url: 'http://' + myIps[0] + '/common/accounts/signin/1.0.0',
headers,
body: postData,
json: true
}, function (err, res, body) {
if (!err && res.statusCode == 200) {
headers[settings.data.token_header] = body.data[settings.data.token_header];
// CALL EACH SERVER IN THE REGISTRY AND TELL IT TO RELOAD
Q.all(ips.map(function (ip) {
const inner_deferred = Q.defer();
if (myIps.indexOf(ip) == -1) {
request_1.default.post({
headers,
url: 'http://' + ip + '/common/internalSystem/reload/1.0.0'
}, function (err, res, bod) {
if (!err && res.statusCode == 200) {
inner_deferred.resolve({ 'ip': ip });
}
else {
settings.data.servers.splice(settings.data.servers.indexOf(ip), 1);
settings.save(false)
.then(function (res) {
inner_deferred.resolve({ 'ip': ip });
})
.fail(function (err) {
if (err !== undefined && err !== null && typeof (err.addToError) === 'function') {
inner_deferred.reject(err.addToError(__filename, 'reloadNetwork'));
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'sr1003', __filename, 'reloadNetwork', 'error reloading network', 'Error reloading network', err);
inner_deferred.reject(errorObj);
}
});
}
});
}
else {
// DON'T RELOAD SELF, JUST MARK AS COMPLETE
inner_deferred.resolve({ 'ip': ip });
}
return inner_deferred.promise;
}))
.then(function (res) {
deferred.resolve(true);
})
.fail(function (err) {
if (err !== undefined && err !== null && typeof (err.addToError) === 'function') {
deferred.reject(err.addToError(__filename, 'reloadNetwork'));
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'sr1004', __filename, 'reloadNetwork', 'error reloading network', 'Error reloading network', err);
deferred.reject(errorObj);
}
});
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'se0003', __filename, 'reloadNetwork', 'error signing into api to reload servers', 'Network reload error', err);
deferred.reject(errorObj);
}
});
}
else {
deferred.resolve(true);
}
}
else {
deferred.resolve(true);
}
return deferred.promise;
}
save(doNetworkReload) {
const s = this;
const deferred = Q.defer();
if (this.remoteSettings === undefined || this.remoteSettings === null || this.remoteSettings === false) {
const fswrite = Q.denodeify(fs_1.default.writeFile);
fswrite(this.file, JSON.stringify(this.constructor.prototype.data, null, 4))
.then(function (write_res) {
deferred.resolve(true);
})
.fail(function (err) {
const errorObj = new ErrorObj_1.ErrorObj(500, 'se0004', __filename, 'save', 'external error with fswrite', 'External error', err);
deferred.reject(errorObj);
});
}
else {
this.s3.putObject({ Bucket: this.bucket, Key: this.file, Body: JSON.stringify(this.constructor.prototype.data, null, 4) }, function (err, save_res) {
if (!err) {
if (doNetworkReload === true) {
s.reloadNetwork()
.then(function (reload_res) {
deferred.resolve(true);
})
.fail(function (err) {
if (err !== undefined && err !== null && typeof (err.addToError) === 'function') {
deferred.reject(err.addToError(__filename, 'save'));
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'sr1005', __filename, 'save', 'error saving settings remotely', 'Error saving settings remotely', err);
deferred.reject(errorObj);
}
});
}
else {
deferred.resolve(true);
}
}
else {
const errorObj = new ErrorObj_1.ErrorObj(500, 'se0005', __filename, 'save', 'error saving file to s3', 'S3 error', err);
deferred.reject(errorObj);
}
});
}
return deferred.promise;
}
;
}
exports.Settings = Settings;
//# sourceMappingURL=settings.js.map