unleash-server
Version:
Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.
94 lines • 3.51 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProxyRepository = void 0;
const events_1 = __importDefault(require("events"));
const offline_unleash_client_1 = require("../util/offline-unleash-client");
const constants_1 = require("../util/constants");
const unleash_client_1 = require("unleash-client");
const anyEventEmitter_1 = require("../util/anyEventEmitter");
class ProxyRepository extends events_1.default {
constructor(config, stores, services, token) {
super();
this.config = config;
this.logger = config.getLogger('proxy-repository.ts');
this.stores = stores;
this.services = services;
this.token = token;
this.onAnyEvent = this.onAnyEvent.bind(this);
this.interval = config.frontendApi.refreshIntervalInMs;
}
getSegment(id) {
return this.segments.find((segment) => segment.id === id);
}
getToggle(name) {
return this.features.find((feature) => feature.name === name);
}
getToggles() {
return this.features;
}
async start() {
await this.dataPolling();
// Reload cached token data whenever something relevant has changed.
// For now, simply reload all the data on any EventStore event.
this.stores.eventStore.on(anyEventEmitter_1.ANY_EVENT, this.onAnyEvent);
this.emit(unleash_client_1.UnleashEvents.Ready);
this.emit(unleash_client_1.UnleashEvents.Changed);
}
stop() {
this.stores.eventStore.off(anyEventEmitter_1.ANY_EVENT, this.onAnyEvent);
clearTimeout(this.timer);
}
async dataPolling() {
this.timer = setTimeout(async () => {
await this.dataPolling();
}, this.randomizeDelay(this.interval, this.interval * 2)).unref();
await this.loadDataForToken();
}
async loadDataForToken() {
try {
this.features = await this.featuresForToken();
this.segments = await this.segmentsForToken();
}
catch (e) {
this.logger.error(e);
}
}
randomizeDelay(floor, ceiling) {
return Math.floor(Math.random() * (ceiling - floor) + floor);
}
async onAnyEvent() {
try {
await this.loadDataForToken();
}
catch (error) {
this.logger.error(error);
}
}
async featuresForToken() {
return (0, offline_unleash_client_1.mapFeaturesForClient)(await this.services.featureToggleServiceV2.getClientFeatures({
project: await this.projectIdsForToken(),
environment: this.environmentNameForToken(),
}));
}
async segmentsForToken() {
return (0, offline_unleash_client_1.mapSegmentsForClient)(await this.services.segmentService.getAll());
}
async projectIdsForToken() {
if (this.token.projects.includes(constants_1.ALL_PROJECTS)) {
const allProjects = await this.stores.projectStore.getAll();
return allProjects.map((project) => project.id);
}
return this.token.projects;
}
environmentNameForToken() {
if (this.token.environment === constants_1.ALL_ENVS) {
return 'default';
}
return this.token.environment;
}
}
exports.ProxyRepository = ProxyRepository;
//# sourceMappingURL=proxy-repository.js.map