UNPKG

bitfront-library

Version:

Angular CLI project with components and classes used by other Angular projects of the BIT foundation.

89 lines (87 loc) 4.96 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.DomainCachedService = void 0; var core_1 = require("@angular/core"); var rxjs_1 = require("rxjs"); var operators_1 = require("rxjs/operators"); var base_service_1 = require("../../base/shared/base.service"); var http_utils_service_1 = require("../service/http-utils.service"); var message_service_1 = require("../service/message.service"); var domain_service_1 = require("../service/domain.service"); var session_shared_service_1 = require("../service/session-shared.service"); var i0 = require("@angular/core"); var i1 = require("../service/message.service"); var i2 = require("../service/http-utils.service"); var i3 = require("../service/domain.service"); var i4 = require("../service/session-shared.service"); /** Servicio que devuelve los valores de un dominio ofrecidos por DomainService pero añadiendo un nivel de caché en sesión. De este modo, si N componentes quieren consumir el mismo servicio no provocaremos N llamadas REST. Esto lo hacemos solo con dominios ya que sabemos que no cambiarán durante el ciclo de vida de la aplicación. */ var DomainCachedService = /** @class */ (function (_super) { __extends(DomainCachedService, _super); function DomainCachedService(messageService, http, domainService, sessionShared) { var _this = _super.call(this, messageService, http) || this; _this.messageService = messageService; _this.http = http; _this.domainService = domainService; _this.sessionShared = sessionShared; _this.cachedResolvers = new Map(); return _this; } DomainCachedService.prototype.getDominio = function (dominio) { var _this = this; // comprobamos si ya se ha pedido antes var replay = this.cachedResolvers.get(dominio); if (replay) { // ya tenemos preparado un ReplaySubject para ese dominio, lo devolvemos tal cual // si el valor todavía no ha llegado de servidor, cuando llegue se emitirá // si el valor ya había llegado de servidor, como es un replay=1 se emitirá inmediatamente } else { // es la primera vez que nos piden este dominio, así que hacemos lo siguiente // creamos un ReplaySubject que repetirá el último valor recibido cada vez que se subscriban a él // resolvemos el dominio contra servidor, y su resolución la emitimos contra el replaysubject replay = new rxjs_1.ReplaySubject(1); // solo repetiremos el último valor this.domainService.getDominio(dominio).subscribe(function (r) { replay.next(r); }, function (err) { // si ha fallado, nos libramos del replay para que el siguiente que lo pida vuelva a intentarlo replay.error(err); _this.cachedResolvers.delete(dominio); }); this.cachedResolvers.set(dominio, replay); } // lo que devolvemos debe ser una copia, ya que si un componente manipula el objeto // el resto de componentes que usen el mismo dominio no deben enterarse return replay.pipe(operators_1.map(function (res) { return JSON.parse(JSON.stringify(res)); })); }; DomainCachedService.prototype.setDominio = function (dominio, data) { var replay = new rxjs_1.ReplaySubject(1); replay.next(data); this.cachedResolvers.set(dominio, replay); }; DomainCachedService.ɵfac = function DomainCachedService_Factory(t) { return new (t || DomainCachedService)(i0.ɵɵinject(i1.MessageService), i0.ɵɵinject(i2.HttpUtilsService), i0.ɵɵinject(i3.DomainService), i0.ɵɵinject(i4.SessionSharedService)); }; DomainCachedService.ɵprov = i0.ɵɵdefineInjectable({ token: DomainCachedService, factory: DomainCachedService.ɵfac }); return DomainCachedService; }(base_service_1.BaseCRUDService)); exports.DomainCachedService = DomainCachedService; (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DomainCachedService, [{ type: core_1.Injectable }], function () { return [{ type: i1.MessageService }, { type: i2.HttpUtilsService }, { type: i3.DomainService }, { type: i4.SessionSharedService }]; }, null); })(); //# sourceMappingURL=domain-cached.service.js.map