deep-package-manager
Version:
DEEP Package Manager
187 lines (148 loc) • 4.27 kB
JavaScript
/**
* Created by AlexanderC on 2/12/16.
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RegistryAutoDiscovery = undefined;
var _RegistryConfig = require('./RegistryConfig');
var _fetchyRequest = require('fetchy-request');
var _fetchyRequest2 = _interopRequireDefault(_fetchyRequest);
var _os = require('os');
var _os2 = _interopRequireDefault(_os);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class RegistryAutoDiscovery {
/**
* @param {String} baseHost
*/
constructor(baseHost) {
this._baseHost = baseHost;
this._discoveryFileLocation = RegistryAutoDiscovery._getDiscoveryFileLocation(baseHost);
}
/**
* @param {Function} cb
* @param {String|null} cacheFile
* @param {Number} cacheTtl For one hour by default
* @returns {RegistryAutoDiscovery}
*/
discoverCached(cb, cacheFile = null, cacheTtl = 3600) {
cacheFile = cacheFile || this.DEFAULT_CACHE_FILE;
if (!_fs2.default.existsSync(cacheFile)) {
this.discover((error, registryConfig) => {
if (error) {
cb(error, null);
return;
}
_fsExtra2.default.outputJson(cacheFile, { exp: RegistryAutoDiscovery._ts + cacheTtl, cfg: registryConfig.rawConfig }, () => {
// @todo: fail on the error?
cb(null, registryConfig);
});
});
return this;
}
_fsExtra2.default.readJson(cacheFile, (error, registryRawConfig) => {
if (error || !registryRawConfig.exp || registryRawConfig.exp <= RegistryAutoDiscovery._ts) {
_fsExtra2.default.removeSync(cacheFile);
this.discoverCached(cb, cacheFile);
return;
}
cb(null, new _RegistryConfig.RegistryConfig(registryRawConfig.cfg));
});
return this;
}
/**
* @param {Function} cb
* @returns {RegistryAutoDiscovery}
*/
discover(cb) {
(0, _fetchyRequest2.default)({
uri: this._discoveryFileLocation,
timeout: 3000 // @todo: make it configurable?
}).then(response => {
if (!response.ok) {
cb(response._error || new Error(response.statusText), null);
return;
}
response.text().then(plainJson => {
try {
cb(null, new _RegistryConfig.RegistryConfig(JSON.parse(plainJson.toString())));
} catch (error) {
cb(error, null);
}
}).catch(error => {
cb(error, null);
});
}).catch(error => {
cb(error, null);
});
return this;
}
/**
* @returns {String}
*/
get baseHost() {
return this._baseHost;
}
/**
* @returns {String}
*/
get discoveryFileLocation() {
return this._discoveryFileLocation;
}
/**
* @param {String} baseHost
* @returns {String}
* @private
*/
static _getDiscoveryFileLocation(baseHost) {
let uri = baseHost;
if (!/^https?:\/\//i.test(uri)) {
uri = `http://${uri}`;
}
if (!/\/$/.test(uri)) {
uri += '/';
}
return `${uri}${RegistryAutoDiscovery.AUTO_DISCOVERY_FILE}`;
}
/**
* @returns {String}
*/
get DEFAULT_CACHE_FILE() {
let baseHostEscaped = this._baseHost.replace(/^https?:\/\//i, '').replace(/([^a-z0-9\._\-]+)/i, '-');
return _path2.default.join(RegistryAutoDiscovery.DEFAULT_CONFIG_DIR, `${baseHostEscaped}-${RegistryAutoDiscovery.AUTO_DISCOVERY_FILE}`);
}
/**
* @returns {Number}
* @private
*/
static get _ts() {
return Math.ceil(new Date().getTime() / 1000);
}
/**
* @returns {String}
*/
static get DEFAULT_CONFIG_DIR() {
return _path2.default.join(RegistryAutoDiscovery._homeDir, '.deepRegistry');
}
/**
* @returns {String}
* @private
*/
static get _homeDir() {
return _os2.default.homedir && _os2.default.homedir() || process.env.HOME || process.env.USERPROFILE;
}
/**
* @returns {String}
*/
static get AUTO_DISCOVERY_FILE() {
return 'registry.json';
}
}
exports.RegistryAutoDiscovery = RegistryAutoDiscovery;