UNPKG

sardines-core

Version:
446 lines (445 loc) 22.3 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(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 __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RepositoryClient = void 0; var fetch = require("isomorphic-fetch"); var sardines_1 = require("./interfaces/sardines"); var factory_1 = require("./factory"); var repository_services_1 = require("./repository_services"); var utils = require("./utils"); var RepositoryClient; (function (RepositoryClient) { var _this = this; RepositoryClient.sardineAppName = 'sardines'; RepositoryClient.sardineRepoModuleName = '/repository'; 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["fetchServiceRuntime"] = "fetchServiceRuntime"; })(RepositoryService = RepositoryClient.RepositoryService || (RepositoryClient.RepositoryService = {})); var repoAppName = repository_services_1.Repository.application; var repoServices = {}; for (var _i = 0, _a = repository_services_1.Repository.services; _i < _a.length; _i++) { var service = _a[_i]; repoServices[service.name] = service; } var entries = []; var drivers = {}; var platform = 'nodejs'; RepositoryClient.remoteServices = {}; RepositoryClient.localServices = {}; RepositoryClient.setLocalServices = function (localServiceCache) { if (!localServiceCache) return; sardines_1.Sardines.Transform.mergeServiceCaches(RepositoryClient.localServices, localServiceCache); }; RepositoryClient.setupPlatform = function (p) { platform = p; }; RepositoryClient.setupDrivers = function (driverCache) { for (var driverName in driverCache) { factory_1.Factory.setClass(driverName, driverCache[driverName], 'driver'); drivers[driverName] = true; } }; RepositoryClient.setupRepositoryEntries = function (repoEntries) { if (!repoEntries || !Array.isArray(repoEntries) || repoEntries.length == 0) { throw 'Repository entry is empty'; } entries = repoEntries.reverse(); }; RepositoryClient.setupRepositoryEntriesBySardinesConfig = function (config, initDrivers) { if (initDrivers === void 0) { initDrivers = false; } if (config.repositoryEntries) { RepositoryClient.setupRepositoryEntries(config.repositoryEntries); } if (config.platform) { RepositoryClient.setupPlatform(config.platform); } if (config.remoteServices) { RepositoryClient.remoteServices = config.remoteServices; } if (initDrivers && config.drivers && config.drivers.length > 0) { var tmpDrivers = {}; for (var _i = 0, _a = config.drivers; _i < _a.length; _i++) { var driver = _a[_i]; if (driver.locationType && driver.name && !drivers[driver.name]) { if (driver.locationType === sardines_1.Sardines.LocationType.npm || driver.locationType === sardines_1.Sardines.LocationType.npm_link) { try { tmpDrivers[driver.name] = utils.getDefaultClassFromPackage(require(driver.name)); } catch (e) { console.error("ERROR while loading " + driver.name + ":", e); throw "Can not load driver " + driver.name; } } } } if (Object.keys(tmpDrivers).length > 0) { RepositoryClient.setupDrivers(tmpDrivers); } } }; var ArgumentType; (function (ArgumentType) { ArgumentType[ArgumentType["body"] = 0] = "body"; ArgumentType[ArgumentType["args"] = 1] = "args"; })(ArgumentType || (ArgumentType = {})); var customArguments = function (argType, entry, service) { var args = []; for (var _i = 3; _i < arguments.length; _i++) { args[_i - 3] = arguments[_i]; } var body = {}, customArgs = []; if (service === RepositoryService.signIn) { body = { account: { name: entry.user }, password: entry.password }; customArgs = [{ name: entry.user }, entry.password]; } else if (service === RepositoryService.queryService) { body = { service: args[0], token: entry.token }; customArgs = [args[0], entry.token]; } else if (service === RepositoryService.signUp) { body = { username: args[0], password: args[1], token: entry.token }; customArgs = [args[0], args[1], entry.token]; } else if (service === RepositoryService.createOrUpdateSource) { body = { source: args[0], token: entry.token }; customArgs = [args[0], entry.token]; } else if (service === RepositoryService.createOrUpdateApplication) { body = { application: args[0], token: entry.token }; customArgs = [args[0], entry.token]; } else if (service === RepositoryService.createOrUpdateService) { body = { service: args[0], token: entry.token }; customArgs = [args[0], entry.token]; } else if (service === RepositoryService.fetchServiceRuntime) { body = { serviceIdentity: args[0], token: entry.token }; customArgs = [args[0], entry.token]; } else { body = { data: args[0], token: entry.token }; customArgs = [args[0], entry.token]; } if (argType === ArgumentType.args) return customArgs; else return body; }; var customMethod = function (service) { var method = 'post'; if (service === RepositoryService.signIn || service === RepositoryService.signUp) method = 'put'; else if (service === RepositoryService.signOut) method = 'get'; return method; }; 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 pvdr, driverName, resObj, err, res, url, body, method, fetchRes, driverInst, serviceDefinition, customArgs, e_1, retryLimit; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!repoServices[service]) { throw { type: 'sardines', 'subType': 'repository client', error: "unsupported repository action [" + service + "]" }; } pvdr = entry.providerInfo; driverName = pvdr.driver; if (typeof driverName === 'object') { driverName = driverName[platform]; } resObj = null; err = null; res = null; if (!(driverName === 'native-http')) return [3, 3]; url = "" + pvdr.host + (pvdr.port && pvdr.port !== 80 ? ':' + pvdr.port : ''); url = (url + "/sardines/" + RepositoryClient.sardineRepoModuleName + "/" + service).replace(/\/+/g, '/'); url = pvdr.protocol + "://" + url; body = customArguments.apply(void 0, __spreadArrays([ArgumentType.body, entry, service], args)); method = customMethod(service); return [4, fetch(url, { method: method, body: JSON.stringify(body), headers: { 'content-type': 'application/json' } })]; case 1: fetchRes = _a.sent(); return [4, fetchRes.text()]; case 2: res = _a.sent(); try { resObj = JSON.parse(res); } catch (e) { } if (res.toLowerCase() === 'not found' || res.toLowerCase() === 'method not allowed') { err = utils.unifyErrMesg("Service [" + service + "] does not exist at [" + url + "]", 'sardines', 'repository client'); } else if (resObj && resObj.error) { err = resObj; } return [3, 10]; case 3: if (!(typeof driverName === 'string' && drivers[driverName])) return [3, 9]; driverInst = factory_1.Factory.getInstance(pvdr.driver, pvdr, 'driver', utils.getKey(pvdr)); if (!!driverInst) return [3, 4]; err = utils.unifyErrMesg("no available driver for \"" + pvdr.driver + "\" in cache", 'sardines', 'repository client'); return [3, 8]; case 4: serviceDefinition = repoServices[service]; customArgs = customArguments.apply(void 0, __spreadArrays([ArgumentType.args, entry, service], args)); _a.label = 5; case 5: _a.trys.push([5, 7, , 8]); serviceDefinition.application = repoAppName; return [4, driverInst.invokeService.apply(driverInst, __spreadArrays([sardines_1.Sardines.Transform.fromServiceToEmptyRuntime(serviceDefinition)], customArgs))]; case 6: res = _a.sent(); switch (serviceDefinition.returnType) { case 'string': case 'number': case 'boolean': break; default: resObj = res; break; } return [3, 8]; case 7: e_1 = _a.sent(); err = e_1; console.warn("ERROR of driver [" + driverName + "] when invoked:", e_1); return [3, 8]; case 8: return [3, 10]; case 9: err = utils.unifyErrMesg("no available driver for \"" + pvdr.driver + "\" on platform '" + platform + "'", 'sardines', 'repository client'); _a.label = 10; case 10: if (!(res === 'Invalid token' || res === 'token expired' || (err && typeof err.error === 'string' && err.type === 'repository' && ['token expired', 'Invalid token'].indexOf(err.error) >= 0))) return [3, 16]; retryLimit = 3; if (!(!entry.retryCount || entry.retryCount < retryLimit || !entry.nextRetryOn || Date.now() > entry.nextRetryOn)) return [3, 14]; if (!entry.retryCount || entry.retryCount >= retryLimit) { entry.retryCount = 0; } if (!entry.retryCount) { entry.nextRetryOn = Date.now() + 1000 * 60 * 1; } entry.retryCount++; return [4, utils.sleep(Math.round(Math.random() * 500 + 100))]; case 11: _a.sent(); return [4, requestRepoServiceOnSingleEntry(entry, RepositoryService.signIn)]; case 12: _a.sent(); return [4, requestRepoServiceOnSingleEntry.apply(void 0, __spreadArrays([entry, service], args))]; case 13: return [2, _a.sent()]; case 14: if (!err) { throw res; } else { throw err; } _a.label = 15; case 15: return [3, 17]; case 16: if (err && err.error) { throw err; } else { if (service === RepositoryService.signIn || service === RepositoryService.signUp) { entry.token = res; if (service === RepositoryService.signUp) { entry.user = args[0]; entry.password = args[1]; } } if (resObj && resObj.res !== undefined) { return [2, resObj.res]; } else if (resObj) { return [2, resObj]; } else { return [2, res]; } } _a.label = 17; case 17: 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, error, entriesError, i, entry, e_2; return __generator(this, function (_a) { switch (_a.label) { case 0: failedEntries = []; res = null, error = null, entriesError = {}; 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, __spreadArrays([entry, service], args))]; case 5: res = _a.sent(); error = null; return [3, 8]; case 6: e_2 = _a.sent(); failedEntries.push(entries.pop()); error = e_2; entriesError[i] = e_2; return [3, 7]; case 7: i--; return [3, 1]; case 8: Array.prototype.unshift.apply(entries, failedEntries); if (!error) return [2, res]; else { error = { type: 'sardines', subType: 'repository client', error: "All entries failed on service [" + service + "]", entries: entriesError }; throw error; } return [2]; } }); }); }; RepositoryClient.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()]; } }); }); }; RepositoryClient.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()]; } }); }); }; RepositoryClient.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()]; } }); }); }; RepositoryClient.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()]; } }); }); }; RepositoryClient.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()]; } }); }); }; RepositoryClient.fetchServiceRuntime = function (serviceIdentity) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, requestRepoService(RepositoryService.fetchServiceRuntime, serviceIdentity)]; case 1: return [2, _a.sent()]; } }); }); }; RepositoryClient.exec = function (serviceName, data) { return __awaiter(_this, void 0, void 0, function () { var res, e_3; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4, requestRepoService(serviceName, data)]; case 1: res = _a.sent(); return [2, res]; case 2: e_3 = _a.sent(); throw ("unexpected error in repository client: " + utils.inspect(e_3) + ", request data: " + JSON.stringify(data) + ", service name: " + serviceName); case 3: return [2]; } }); }); }; })(RepositoryClient = exports.RepositoryClient || (exports.RepositoryClient = {}));