unleash-server 5.4.2 → 5.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ const date_fns_1 = require("date-fns");
5
5
  class LastSeenService {
6
6
  constructor({ featureToggleStore }, config, lastSeenInterval = (0, date_fns_1.secondsToMilliseconds)(30)) {
7
7
  this.timers = [];
8
- this.lastSeenToggles = new Set();
8
+ this.lastSeenToggles = new Map();
9
9
  this.featureToggleStore = featureToggleStore;
10
10
  this.logger = config.getLogger('/services/client-metrics/last-seen-service.ts');
11
11
  this.timers.push(setInterval(() => this.store(), lastSeenInterval).unref());
@@ -13,8 +13,8 @@ class LastSeenService {
13
13
  async store() {
14
14
  const count = this.lastSeenToggles.size;
15
15
  if (count > 0) {
16
- const lastSeenToggles = [...this.lastSeenToggles];
17
- this.lastSeenToggles = new Set();
16
+ const lastSeenToggles = Array.from(this.lastSeenToggles.values());
17
+ this.lastSeenToggles = new Map();
18
18
  this.logger.debug(`Updating last seen for ${lastSeenToggles.length} toggles`);
19
19
  await this.featureToggleStore.setLastSeen(lastSeenToggles);
20
20
  }
@@ -22,11 +22,15 @@ class LastSeenService {
22
22
  }
23
23
  updateLastSeen(clientMetrics) {
24
24
  clientMetrics
25
+ .filter((clientMetric) => !this.lastSeenToggles.has(`${clientMetric.featureName}:${clientMetric.environment}`))
25
26
  .filter((clientMetric) => clientMetric.yes > 0 || clientMetric.no > 0)
26
- .forEach((clientMetric) => this.lastSeenToggles.add({
27
- featureName: clientMetric.featureName,
28
- environment: clientMetric.environment,
29
- }));
27
+ .forEach((clientMetric) => {
28
+ const key = `${clientMetric.featureName}:${clientMetric.environment}`;
29
+ this.lastSeenToggles.set(key, {
30
+ featureName: clientMetric.featureName,
31
+ environment: clientMetric.environment,
32
+ });
33
+ });
30
34
  }
31
35
  destroy() {
32
36
  this.timers.forEach(clearInterval);
@@ -1 +1 @@
1
- {"version":3,"file":"last-seen-service.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/last-seen-service.ts"],"names":[],"mappings":";;;AAAA,uCAAiD;AAYjD,MAAa,eAAe;IASxB,YACI,EAAE,kBAAkB,EAA8C,EAClE,MAAsB,EACtB,gBAAgB,GAAG,IAAA,gCAAqB,EAAC,EAAE,CAAC;QAXxC,WAAM,GAAqB,EAAE,CAAC;QAE9B,oBAAe,GAAuB,IAAI,GAAG,EAAE,CAAC;QAWpD,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAC1B,+CAA+C,CAClD,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAC5D,CAAC;IACN,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE;YACX,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;YAClD,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,0BAA0B,eAAe,CAAC,MAAM,UAAU,CAC7D,CAAC;YACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;SAC9D;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,aAAkC;QAC7C,aAAa;aACR,MAAM,CACH,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,CAAC,EAAE,GAAG,CAAC,CAChE;aACA,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YACrB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,WAAW,EAAE,YAAY,CAAC,WAAW;SACxC,CAAC,CACL,CAAC;IACV,CAAC;IAED,OAAO;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;CACJ;AArDD,0CAqDC"}
1
+ {"version":3,"file":"last-seen-service.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/last-seen-service.ts"],"names":[],"mappings":";;;AAAA,uCAAiD;AAYjD,MAAa,eAAe;IASxB,YACI,EAAE,kBAAkB,EAA8C,EAClE,MAAsB,EACtB,gBAAgB,GAAG,IAAA,gCAAqB,EAAC,EAAE,CAAC;QAXxC,WAAM,GAAqB,EAAE,CAAC;QAE9B,oBAAe,GAA+B,IAAI,GAAG,EAAE,CAAC;QAW5D,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAC1B,+CAA+C,CAClD,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAC5D,CAAC;IACN,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE;YACX,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,0BAA0B,eAAe,CAAC,MAAM,UAAU,CAC7D,CAAC;YACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;SAC9D;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,aAAkC;QAC7C,aAAa;aACR,MAAM,CACH,CAAC,YAAY,EAAE,EAAE,CACb,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CACrB,GAAG,YAAY,CAAC,WAAW,IAAI,YAAY,CAAC,WAAW,EAAE,CAC5D,CACR;aACA,MAAM,CACH,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,CAAC,EAAE,GAAG,CAAC,CAChE;aACA,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,WAAW,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;YACtE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC1B,WAAW,EAAE,YAAY,CAAC,WAAW;gBACrC,WAAW,EAAE,YAAY,CAAC,WAAW;aACxC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACX,CAAC;IAED,OAAO;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;CACJ;AA5DD,0CA4DC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const store_1 = __importDefault(require("../../../test/fixtures/store"));
7
+ const events_1 = __importDefault(require("events"));
8
+ const no_logger_1 = __importDefault(require("../../../test/fixtures/no-logger"));
9
+ const last_seen_service_1 = require("./last-seen-service");
10
+ function initLastSeenService(flagEnabled = true) {
11
+ const stores = (0, store_1.default)();
12
+ const eventBus = new events_1.default();
13
+ eventBus.emit = jest.fn();
14
+ const config = {
15
+ eventBus,
16
+ getLogger: no_logger_1.default,
17
+ flagResolver: {
18
+ isEnabled: () => {
19
+ return flagEnabled;
20
+ },
21
+ },
22
+ };
23
+ const lastSeenService = new last_seen_service_1.LastSeenService(stores, config);
24
+ return { lastSeenService, featureToggleStore: stores.featureToggleStore };
25
+ }
26
+ test('should not add duplicates per feature/environment', async () => {
27
+ const { lastSeenService, featureToggleStore } = initLastSeenService();
28
+ lastSeenService.updateLastSeen([
29
+ {
30
+ featureName: 'myFeature',
31
+ environment: 'development',
32
+ yes: 1,
33
+ no: 0,
34
+ appName: 'test',
35
+ timestamp: new Date(),
36
+ },
37
+ ]);
38
+ lastSeenService.updateLastSeen([
39
+ {
40
+ featureName: 'myFeature',
41
+ environment: 'development',
42
+ yes: 1,
43
+ no: 0,
44
+ appName: 'test',
45
+ timestamp: new Date(),
46
+ },
47
+ ]);
48
+ featureToggleStore.setLastSeen = jest.fn();
49
+ await lastSeenService.store();
50
+ expect(featureToggleStore.setLastSeen).toHaveBeenCalledWith([
51
+ {
52
+ environment: 'development',
53
+ featureName: 'myFeature',
54
+ },
55
+ ]);
56
+ });
57
+ //# sourceMappingURL=last-seen-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-seen-service.test.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/last-seen-service.test.ts"],"names":[],"mappings":";;;;;AAAA,yEAAwD;AACxD,oDAAkC;AAClC,iFAAyD;AAEzD,2DAAsD;AAEtD,SAAS,mBAAmB,CAAC,WAAW,GAAG,IAAI;IAC3C,MAAM,MAAM,GAAG,IAAA,eAAY,GAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG,IAAI,gBAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG;QACX,QAAQ;QACR,SAAS,EAAT,mBAAS;QACT,YAAY,EAAE;YACV,SAAS,EAAE,GAAG,EAAE;gBACZ,OAAO,WAAW,CAAC;YACvB,CAAC;SACJ;KACyB,CAAC;IAE/B,MAAM,eAAe,GAAG,IAAI,mCAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;AAC9E,CAAC;AAED,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEtE,eAAe,CAAC,cAAc,CAAC;QAC3B;YACI,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB;KACJ,CAAC,CAAC;IAEH,eAAe,CAAC,cAAc,CAAC;QAC3B;YACI,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB;KACJ,CAAC,CAAC;IACH,kBAAkB,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3C,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;IAE9B,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;QACxD;YACI,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,WAAW;SAC3B;KACJ,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "unleash-server",
3
3
  "description": "Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.",
4
- "version": "5.4.2",
4
+ "version": "5.4.3",
5
5
  "keywords": [
6
6
  "unleash",
7
7
  "feature toggle",