UNPKG

sardines-utils

Version:
313 lines (312 loc) 15 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var _this = this; Object.defineProperty(exports, "__esModule", { value: true }); var fetch = require("isomorphic-fetch"); var path = require("path"); var fs = require("fs"); var sardines_interfaces_1 = require("./sardines_interfaces"); exports.sardineAppName = 'sardines'; exports.sardineRepoModuleName = '/repository'; exports.genServiceIdentitySting = function (serviceIdentity) { return serviceIdentity.application + ":" + serviceIdentity.module + ":" + serviceIdentity.name + ":" + serviceIdentity.version; }; exports.parseServiceIdentity = function (identityString) { if (!identityString) return null; var parts = identityString.split(':'); if (parts.length !== 3 && parts.length !== 4) return null; return { application: parts[0], module: parts[1], name: parts[2], version: parts.length === 4 ? parts[3] : '*' }; }; var RepositoryService; (function (RepositoryService) { RepositoryService["signIn"] = "signIn"; RepositoryService["signOut"] = "signOut"; RepositoryService["signUp"] = "signUp"; RepositoryService["queryService"] = "queryService"; RepositoryService["createOrUpdateSource"] = "createOrUpdateSource"; RepositoryService["createOrUpdateApplication"] = "createOrUpdateApplication"; RepositoryService["createOrUpdateService"] = "createOrUpdateService"; })(RepositoryService = exports.RepositoryService || (exports.RepositoryService = {})); exports.readSardinesConfigFile = function (sardinesConfigFile) { if (!fs.existsSync(sardinesConfigFile)) { throw ("Sardines configure file [" + sardinesConfigFile + "] does not exist"); } if (!fs.lstatSync(sardinesConfigFile).isFile()) { throw ("Sardines configure file [" + sardinesConfigFile + "] is invalid"); } if (path.extname(sardinesConfigFile).toLowerCase() !== '.json') { throw ("Sardines configure file [" + sardinesConfigFile + "] must in JSON format"); } var sardinesConfig = null; try { sardinesConfig = JSON.parse(fs.readFileSync(sardinesConfigFile).toString()); } catch (e) { throw ("Sardines configure file [" + sardinesConfigFile + "] has broken"); } if (!sardinesConfig || JSON.stringify(sardinesConfig) === JSON.stringify({})) { throw ("Sardines configure file [" + sardinesConfigFile + "] is empty"); } if (!sardinesConfig.application || typeof sardinesConfig.application !== 'string') { throw ("Application name is missing in sardines configure file [" + sardinesConfigFile + "]"); } if (!sardinesConfig.repositoryEntries || !Array.isArray(sardinesConfig.repositoryEntries) || sardinesConfig.repositoryEntries.length === 0) { throw ("Repository entries are missing in sardines configure file [" + sardinesConfigFile + "]"); } if (sardinesConfig.srcRootDir && typeof sardinesConfig.srcRootDir !== 'string') { throw ("srcRootDir is wrong in sardines configure file [" + sardinesConfigFile + "]"); } if (sardinesConfig.sardinesDir && typeof sardinesConfig.sardinesDir !== 'string') { throw ("sardinesDir is wrong in sardines configure file [" + sardinesConfigFile + "]"); } if (!sardinesConfig.srcRootDir) sardinesConfig.srcRootDir = './src'; if (!sardinesConfig.sardinesDir) sardinesConfig.sardinesDir = 'sardines'; for (var _i = 0, _a = sardinesConfig.repositoryEntries; _i < _a.length; _i++) { var entry = _a[_i]; if (!entry.user && !entry.password) entry.password = 'anonymous'; if (!entry.user) entry.user = 'anonymous'; } if (!sardinesConfig.drivers || !sardinesConfig.drivers.length) { sardinesConfig.drivers = [{ name: 'sardines-service-driver-http', locationType: sardines_interfaces_1.Sardines.LocationType.npm, protocols: ['http', 'https'] }]; } return sardinesConfig; }; var entries = []; exports.setupRepositoryEntries = function (repoEntries) { if (!repoEntries || !Array.isArray(repoEntries) || repoEntries.length == 0) { throw 'Repository entry is empty'; } entries = repoEntries.reverse(); }; exports.setupRepositoryEntriesBySardinesConfig = function (config) { exports.setupRepositoryEntries(config.repositoryEntries); }; exports.setupRepositoryEntriesByConfigFile = function (sardinesConfigFile) { var sardinesConfig = null; sardinesConfig = exports.readSardinesConfigFile(sardinesConfigFile); exports.setupRepositoryEntriesBySardinesConfig(sardinesConfig); return sardinesConfig; }; var requestRepoServiceOnSingleEntry = function (entry, service) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } return __awaiter(_this, void 0, void 0, function () { var addr, pvdr, url, body, method, res, resJson; return __generator(this, function (_a) { switch (_a.label) { case 0: addr = entry.address; pvdr = addr.providerInfo; if (!(addr.type === 'native-http')) return [3, 7]; url = "" + pvdr.host + (pvdr.port && pvdr.port !== 80 ? ':' + pvdr.port : ''); url = path.join(url, "/" + exports.sardineRepoModuleName + "/" + service); url = pvdr.protocol + "://" + url; body = {}; if (service === RepositoryService.signIn) { body = { account: { name: entry.user }, password: entry.password }; } else if (service === RepositoryService.queryService) { body = { service: args[0], token: entry.token }; } else if (service === RepositoryService.signUp) { body = { username: args[0], password: args[1], token: entry.token }; } else if (service === RepositoryService.createOrUpdateSource) { body = { source: args[0], token: entry.token }; } else if (service === RepositoryService.createOrUpdateApplication) { body = { application: args[0], token: entry.token }; } else if (service === RepositoryService.createOrUpdateService) { body = { service: args[0], token: entry.token }; } method = 'post'; if (service === RepositoryService.signIn || service === RepositoryService.signUp) method = 'put'; else if (service === RepositoryService.signOut) method = 'get'; return [4, fetch(url, { method: method, body: JSON.stringify(body), headers: { 'content-type': 'application/json' } })]; case 1: res = _a.sent(); return [4, res.text()]; case 2: res = _a.sent(); resJson = null; try { resJson = JSON.parse(res); } catch (e) { } if (!(res === 'Invalid token' || res === 'token expired' || (resJson && ['token expired', 'Invalid token'].indexOf(resJson.error) >= 0))) return [3, 5]; return [4, requestRepoServiceOnSingleEntry(entry, RepositoryService.signIn)]; case 3: _a.sent(); return [4, requestRepoServiceOnSingleEntry.apply(void 0, [entry, service].concat(args))]; case 4: return [2, _a.sent()]; case 5: if (res.toLowerCase() === 'not found' || res.toLowerCase() === 'method not allowed') { throw "Can not access service [" + service + "] at URL: " + url; } else if (res && res.indexOf('error') > 0) { res = JSON.parse(res); throw res; } _a.label = 6; case 6: if (service === RepositoryService.signIn || service === RepositoryService.signUp) { entry.token = res; if (service === RepositoryService.signUp) { entry.user = args[0]; entry.password = args[1]; } } else if (resJson && resJson.res !== undefined) { return [2, resJson.res]; } else if (resJson) { return [2, resJson]; } return [2, res]; case 7: return [2]; } }); }); }; var requestRepoService = function (service) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } return __awaiter(_this, void 0, void 0, function () { var failedEntries, res, i, entry, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: failedEntries = []; res = null; i = entries.length - 1; _a.label = 1; case 1: if (!(i >= 0)) return [3, 8]; entry = entries[i]; _a.label = 2; case 2: _a.trys.push([2, 6, , 7]); if (!!entry.token) return [3, 4]; return [4, requestRepoServiceOnSingleEntry(entry, RepositoryService.signIn)]; case 3: _a.sent(); _a.label = 4; case 4: return [4, requestRepoServiceOnSingleEntry.apply(void 0, [entry, service].concat(args))]; case 5: res = _a.sent(); return [3, 8]; case 6: e_1 = _a.sent(); console.error("ERROR when requesting repository service [" + service + "]:", e_1); failedEntries.push(entries.pop()); return [3, 7]; case 7: i--; return [3, 1]; case 8: Array.prototype.unshift.apply(entries, failedEntries); return [2, res]; } }); }); }; exports.queryService = function (serviceIdentity) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, requestRepoService(RepositoryService.queryService, serviceIdentity)]; case 1: return [2, _a.sent()]; } }); }); }; exports.createUser = function (username, password) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, requestRepoService(RepositoryService.signUp, username, password)]; case 1: return [2, _a.sent()]; } }); }); }; exports.createOrUpdateSource = function (source) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, requestRepoService(RepositoryService.createOrUpdateSource, source)]; case 1: return [2, _a.sent()]; } }); }); }; exports.createOrUpdateApplication = function (application) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, requestRepoService(RepositoryService.createOrUpdateApplication, application)]; case 1: return [2, _a.sent()]; } }); }); }; exports.createOrUpdateService = function (service) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, requestRepoService(RepositoryService.createOrUpdateService, service)]; case 1: return [2, _a.sent()]; } }); }); };