UNPKG

deep-package-manager

Version:
187 lines (148 loc) 4.27 kB
/** * Created by AlexanderC on 2/12/16. */ 'use strict'; 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;