UNPKG

fully-api

Version:

API framework for Fully Stacked, LLC REST-ful APIs

249 lines 11.4 kB
"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