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.
- package/dist/lib/services/client-metrics/last-seen-service.js +11 -7
- package/dist/lib/services/client-metrics/last-seen-service.js.map +1 -1
- package/dist/lib/services/client-metrics/last-seen-service.test.d.ts +1 -0
- package/dist/lib/services/client-metrics/last-seen-service.test.js +57 -0
- package/dist/lib/services/client-metrics/last-seen-service.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -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
|
|
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 =
|
|
17
|
-
this.lastSeenToggles = new
|
|
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) =>
|
|
27
|
-
|
|
28
|
-
|
|
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,
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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