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
JavaScript
;
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