@splitsoftware/splitio-commons 2.1.1-rc.0 → 2.1.1-rc.1
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/CHANGES.txt +3 -0
- package/README.md +0 -1
- package/cjs/evaluator/combiners/and.js +6 -2
- package/cjs/evaluator/combiners/ifelseif.js +6 -6
- package/cjs/evaluator/condition/index.js +5 -6
- package/cjs/evaluator/index.js +7 -7
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchersTransform/index.js +0 -4
- package/cjs/evaluator/parser/index.js +2 -2
- package/cjs/evaluator/value/sanitize.js +0 -1
- package/cjs/logger/constants.js +3 -4
- package/cjs/logger/messages/debug.js +2 -3
- package/cjs/logger/messages/error.js +1 -1
- package/cjs/logger/messages/warn.js +2 -2
- package/cjs/sdkClient/client.js +29 -19
- package/cjs/sdkClient/clientAttributesDecoration.js +19 -25
- package/cjs/sdkClient/clientInputValidation.js +28 -26
- package/cjs/services/splitApi.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +2 -5
- package/cjs/storages/KeyBuilder.js +0 -9
- package/cjs/storages/KeyBuilderCS.js +1 -4
- package/cjs/storages/KeyBuilderSS.js +0 -3
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +14 -9
- package/cjs/storages/inLocalStorage/index.js +0 -4
- package/cjs/storages/inMemory/InMemoryStorage.js +0 -3
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/cjs/storages/inRedis/index.js +0 -2
- package/cjs/storages/pluggable/index.js +0 -2
- package/cjs/storages/utils.js +1 -0
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +2 -2
- package/cjs/sync/polling/pollingManagerCS.js +7 -7
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +1 -1
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +35 -51
- package/cjs/sync/streaming/SSEHandler/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +77 -106
- package/cjs/sync/streaming/constants.js +1 -2
- package/cjs/sync/streaming/pushManager.js +16 -3
- package/cjs/sync/submitters/impressionsSubmitter.js +3 -2
- package/cjs/sync/syncManagerOnline.js +2 -2
- package/cjs/trackers/strategy/strategyOptimized.js +3 -0
- package/cjs/utils/constants/index.js +2 -3
- package/cjs/utils/inputValidation/eventProperties.js +12 -1
- package/cjs/utils/inputValidation/index.js +3 -1
- package/esm/evaluator/combiners/and.js +6 -2
- package/esm/evaluator/combiners/ifelseif.js +7 -7
- package/esm/evaluator/condition/index.js +5 -6
- package/esm/evaluator/index.js +7 -7
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchersTransform/index.js +0 -4
- package/esm/evaluator/parser/index.js +2 -2
- package/esm/evaluator/value/sanitize.js +0 -1
- package/esm/logger/constants.js +0 -1
- package/esm/logger/messages/debug.js +2 -3
- package/esm/logger/messages/error.js +1 -1
- package/esm/logger/messages/warn.js +2 -2
- package/esm/sdkClient/client.js +29 -19
- package/esm/sdkClient/clientAttributesDecoration.js +19 -25
- package/esm/sdkClient/clientInputValidation.js +29 -27
- package/esm/services/splitApi.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +2 -5
- package/esm/storages/KeyBuilder.js +0 -9
- package/esm/storages/KeyBuilderCS.js +1 -4
- package/esm/storages/KeyBuilderSS.js +0 -3
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +14 -9
- package/esm/storages/inLocalStorage/index.js +0 -4
- package/esm/storages/inMemory/InMemoryStorage.js +0 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/esm/storages/inRedis/index.js +0 -2
- package/esm/storages/pluggable/index.js +0 -2
- package/esm/storages/utils.js +1 -0
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +2 -2
- package/esm/sync/polling/pollingManagerCS.js +7 -7
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +1 -1
- package/esm/sync/polling/updaters/splitChangesUpdater.js +35 -51
- package/esm/sync/streaming/SSEHandler/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +73 -102
- package/esm/sync/streaming/constants.js +0 -1
- package/esm/sync/streaming/pushManager.js +19 -6
- package/esm/sync/submitters/impressionsSubmitter.js +3 -2
- package/esm/sync/syncManagerOnline.js +2 -2
- package/esm/trackers/strategy/strategyOptimized.js +3 -0
- package/esm/utils/constants/index.js +1 -2
- package/esm/utils/inputValidation/eventProperties.js +10 -0
- package/esm/utils/inputValidation/index.js +1 -0
- package/package.json +1 -1
- package/src/dtos/types.ts +8 -32
- package/src/evaluator/Engine.ts +1 -1
- package/src/evaluator/combiners/and.ts +4 -5
- package/src/evaluator/combiners/ifelseif.ts +9 -7
- package/src/evaluator/condition/engineUtils.ts +1 -1
- package/src/evaluator/condition/index.ts +12 -12
- package/src/evaluator/index.ts +7 -7
- package/src/evaluator/matchers/index.ts +1 -3
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchersTransform/index.ts +0 -3
- package/src/evaluator/parser/index.ts +3 -3
- package/src/evaluator/types.ts +2 -2
- package/src/evaluator/value/index.ts +2 -2
- package/src/evaluator/value/sanitize.ts +4 -5
- package/src/logger/constants.ts +0 -1
- package/src/logger/messages/debug.ts +2 -3
- package/src/logger/messages/error.ts +1 -1
- package/src/logger/messages/warn.ts +2 -2
- package/src/sdkClient/client.ts +31 -21
- package/src/sdkClient/clientAttributesDecoration.ts +20 -27
- package/src/sdkClient/clientInputValidation.ts +30 -27
- package/src/sdkManager/index.ts +1 -1
- package/src/services/splitApi.ts +2 -2
- package/src/services/types.ts +1 -1
- package/src/storages/AbstractSplitsCacheSync.ts +3 -6
- package/src/storages/KeyBuilder.ts +0 -12
- package/src/storages/KeyBuilderCS.ts +1 -5
- package/src/storages/KeyBuilderSS.ts +0 -4
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +14 -10
- package/src/storages/inLocalStorage/index.ts +0 -4
- package/src/storages/inMemory/InMemoryStorage.ts +0 -3
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -4
- package/src/storages/inRedis/index.ts +0 -2
- package/src/storages/pluggable/index.ts +0 -2
- package/src/storages/types.ts +1 -33
- package/src/storages/utils.ts +1 -0
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +1 -2
- package/src/sync/polling/fetchers/types.ts +0 -1
- package/src/sync/polling/pollingManagerCS.ts +7 -7
- package/src/sync/polling/types.ts +2 -2
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -2
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
- package/src/sync/polling/updaters/splitChangesUpdater.ts +44 -61
- package/src/sync/streaming/SSEHandler/index.ts +1 -2
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +68 -98
- package/src/sync/streaming/constants.ts +0 -1
- package/src/sync/streaming/parseUtils.ts +2 -2
- package/src/sync/streaming/pushManager.ts +18 -6
- package/src/sync/streaming/types.ts +2 -3
- package/src/sync/submitters/impressionsSubmitter.ts +3 -2
- package/src/sync/submitters/types.ts +23 -33
- package/src/sync/syncManagerOnline.ts +2 -2
- package/src/trackers/strategy/strategyOptimized.ts +3 -0
- package/src/utils/constants/index.ts +1 -2
- package/src/utils/inputValidation/eventProperties.ts +10 -0
- package/src/utils/inputValidation/index.ts +1 -0
- package/src/utils/lang/index.ts +1 -1
- package/types/splitio.d.ts +100 -35
- package/cjs/evaluator/matchers/rbsegment.js +0 -43
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +0 -117
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +0 -61
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +0 -64
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +0 -64
- package/esm/evaluator/matchers/rbsegment.js +0 -39
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +0 -114
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +0 -58
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +0 -61
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +0 -61
- package/src/evaluator/matchers/rbsegment.ts +0 -61
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +0 -136
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +0 -68
- package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +0 -79
- package/src/storages/pluggable/RBSegmentsCachePluggable.ts +0 -76
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { IRBSegment } from '../../dtos/types';
|
|
2
|
-
import { ILogger } from '../../logger/types';
|
|
3
|
-
import { ISettings } from '../../types';
|
|
4
|
-
import { isFiniteNumber, isNaNNumber, toNumber } from '../../utils/lang';
|
|
5
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
6
|
-
import { usesSegments } from '../AbstractSplitsCacheSync';
|
|
7
|
-
import { KeyBuilderCS } from '../KeyBuilderCS';
|
|
8
|
-
import { IRBSegmentsCacheSync } from '../types';
|
|
9
|
-
import { LOG_PREFIX } from './constants';
|
|
10
|
-
|
|
11
|
-
export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
|
|
12
|
-
|
|
13
|
-
private readonly keys: KeyBuilderCS;
|
|
14
|
-
private readonly log: ILogger;
|
|
15
|
-
|
|
16
|
-
constructor(settings: ISettings, keys: KeyBuilderCS) {
|
|
17
|
-
this.keys = keys;
|
|
18
|
-
this.log = settings.log;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
clear() {
|
|
22
|
-
this.getNames().forEach(name => this.remove(name));
|
|
23
|
-
localStorage.removeItem(this.keys.buildRBSegmentsTillKey());
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): boolean {
|
|
27
|
-
this.setChangeNumber(changeNumber);
|
|
28
|
-
const updated = toAdd.map(toAdd => this.add(toAdd)).some(result => result);
|
|
29
|
-
return toRemove.map(toRemove => this.remove(toRemove.name)).some(result => result) || updated;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
private setChangeNumber(changeNumber: number) {
|
|
33
|
-
try {
|
|
34
|
-
localStorage.setItem(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
|
|
35
|
-
localStorage.setItem(this.keys.buildLastUpdatedKey(), Date.now() + '');
|
|
36
|
-
} catch (e) {
|
|
37
|
-
this.log.error(LOG_PREFIX + e);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
private updateSegmentCount(diff: number) {
|
|
42
|
-
const segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
43
|
-
const count = toNumber(localStorage.getItem(segmentsCountKey)) + diff;
|
|
44
|
-
// @ts-expect-error
|
|
45
|
-
if (count > 0) localStorage.setItem(segmentsCountKey, count);
|
|
46
|
-
else localStorage.removeItem(segmentsCountKey);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
private add(rbSegment: IRBSegment): boolean {
|
|
50
|
-
try {
|
|
51
|
-
const name = rbSegment.name;
|
|
52
|
-
const rbSegmentKey = this.keys.buildRBSegmentKey(name);
|
|
53
|
-
const rbSegmentFromLocalStorage = localStorage.getItem(rbSegmentKey);
|
|
54
|
-
const previous = rbSegmentFromLocalStorage ? JSON.parse(rbSegmentFromLocalStorage) : null;
|
|
55
|
-
|
|
56
|
-
localStorage.setItem(rbSegmentKey, JSON.stringify(rbSegment));
|
|
57
|
-
|
|
58
|
-
let usesSegmentsDiff = 0;
|
|
59
|
-
if (previous && usesSegments(previous)) usesSegmentsDiff--;
|
|
60
|
-
if (usesSegments(rbSegment)) usesSegmentsDiff++;
|
|
61
|
-
if (usesSegmentsDiff !== 0) this.updateSegmentCount(usesSegmentsDiff);
|
|
62
|
-
|
|
63
|
-
return true;
|
|
64
|
-
} catch (e) {
|
|
65
|
-
this.log.error(LOG_PREFIX + e);
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private remove(name: string): boolean {
|
|
71
|
-
try {
|
|
72
|
-
const rbSegment = this.get(name);
|
|
73
|
-
if (!rbSegment) return false;
|
|
74
|
-
|
|
75
|
-
localStorage.removeItem(this.keys.buildRBSegmentKey(name));
|
|
76
|
-
|
|
77
|
-
if (usesSegments(rbSegment)) this.updateSegmentCount(-1);
|
|
78
|
-
|
|
79
|
-
return true;
|
|
80
|
-
} catch (e) {
|
|
81
|
-
this.log.error(LOG_PREFIX + e);
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
private getNames(): string[] {
|
|
87
|
-
const len = localStorage.length;
|
|
88
|
-
const accum = [];
|
|
89
|
-
|
|
90
|
-
let cur = 0;
|
|
91
|
-
|
|
92
|
-
while (cur < len) {
|
|
93
|
-
const key = localStorage.key(cur);
|
|
94
|
-
|
|
95
|
-
if (key != null && this.keys.isRBSegmentKey(key)) accum.push(this.keys.extractKey(key));
|
|
96
|
-
|
|
97
|
-
cur++;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return accum;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
get(name: string): IRBSegment | null {
|
|
104
|
-
const item = localStorage.getItem(this.keys.buildRBSegmentKey(name));
|
|
105
|
-
return item && JSON.parse(item);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
contains(names: Set<string>): boolean {
|
|
109
|
-
const namesArray = setToArray(names);
|
|
110
|
-
const namesInStorage = this.getNames();
|
|
111
|
-
return namesArray.every(name => namesInStorage.indexOf(name) !== -1);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
getChangeNumber(): number {
|
|
115
|
-
const n = -1;
|
|
116
|
-
let value: string | number | null = localStorage.getItem(this.keys.buildRBSegmentsTillKey());
|
|
117
|
-
|
|
118
|
-
if (value !== null) {
|
|
119
|
-
value = parseInt(value, 10);
|
|
120
|
-
|
|
121
|
-
return isNaNNumber(value) ? n : value;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return n;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
usesSegments(): boolean {
|
|
128
|
-
const storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
|
|
129
|
-
const splitsWithSegmentsCount = storedCount === null ? 0 : toNumber(storedCount);
|
|
130
|
-
|
|
131
|
-
return isFiniteNumber(splitsWithSegmentsCount) ?
|
|
132
|
-
splitsWithSegmentsCount > 0 :
|
|
133
|
-
true;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { IRBSegment } from '../../dtos/types';
|
|
2
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
3
|
-
import { usesSegments } from '../AbstractSplitsCacheSync';
|
|
4
|
-
import { IRBSegmentsCacheSync } from '../types';
|
|
5
|
-
|
|
6
|
-
export class RBSegmentsCacheInMemory implements IRBSegmentsCacheSync {
|
|
7
|
-
|
|
8
|
-
private cache: Record<string, IRBSegment> = {};
|
|
9
|
-
private changeNumber: number = -1;
|
|
10
|
-
private segmentsCount: number = 0;
|
|
11
|
-
|
|
12
|
-
clear() {
|
|
13
|
-
this.cache = {};
|
|
14
|
-
this.changeNumber = -1;
|
|
15
|
-
this.segmentsCount = 0;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): boolean {
|
|
19
|
-
this.changeNumber = changeNumber;
|
|
20
|
-
const updated = toAdd.map(toAdd => this.add(toAdd)).some(result => result);
|
|
21
|
-
return toRemove.map(toRemove => this.remove(toRemove.name)).some(result => result) || updated;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
private add(rbSegment: IRBSegment): boolean {
|
|
25
|
-
const name = rbSegment.name;
|
|
26
|
-
const previous = this.get(name);
|
|
27
|
-
if (previous && usesSegments(previous)) this.segmentsCount--;
|
|
28
|
-
|
|
29
|
-
this.cache[name] = rbSegment;
|
|
30
|
-
if (usesSegments(rbSegment)) this.segmentsCount++;
|
|
31
|
-
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private remove(name: string): boolean {
|
|
36
|
-
const rbSegment = this.get(name);
|
|
37
|
-
if (!rbSegment) return false;
|
|
38
|
-
|
|
39
|
-
delete this.cache[name];
|
|
40
|
-
|
|
41
|
-
if (usesSegments(rbSegment)) this.segmentsCount--;
|
|
42
|
-
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
private getNames(): string[] {
|
|
47
|
-
return Object.keys(this.cache);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
get(name: string): IRBSegment | null {
|
|
51
|
-
return this.cache[name] || null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
contains(names: Set<string>): boolean {
|
|
55
|
-
const namesArray = setToArray(names);
|
|
56
|
-
const namesInStorage = this.getNames();
|
|
57
|
-
return namesArray.every(name => namesInStorage.indexOf(name) !== -1);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
getChangeNumber(): number {
|
|
61
|
-
return this.changeNumber;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
usesSegments(): boolean {
|
|
65
|
-
return this.segmentsCount > 0;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { isNaNNumber } from '../../utils/lang';
|
|
2
|
-
import { IRBSegmentsCacheAsync } from '../types';
|
|
3
|
-
import { ILogger } from '../../logger/types';
|
|
4
|
-
import { IRBSegment } from '../../dtos/types';
|
|
5
|
-
import { LOG_PREFIX } from './constants';
|
|
6
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
7
|
-
import { RedisAdapter } from './RedisAdapter';
|
|
8
|
-
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
9
|
-
|
|
10
|
-
export class RBSegmentsCacheInRedis implements IRBSegmentsCacheAsync {
|
|
11
|
-
|
|
12
|
-
private readonly log: ILogger;
|
|
13
|
-
private readonly keys: KeyBuilderSS;
|
|
14
|
-
private readonly redis: RedisAdapter;
|
|
15
|
-
|
|
16
|
-
constructor(log: ILogger, keys: KeyBuilderSS, redis: RedisAdapter) {
|
|
17
|
-
this.log = log;
|
|
18
|
-
this.keys = keys;
|
|
19
|
-
this.redis = redis;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
get(name: string): Promise<IRBSegment | null> {
|
|
23
|
-
return this.redis.get(this.keys.buildRBSegmentKey(name))
|
|
24
|
-
.then(maybeRBSegment => maybeRBSegment && JSON.parse(maybeRBSegment));
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
private getNames(): Promise<string[]> {
|
|
28
|
-
return this.redis.keys(this.keys.searchPatternForRBSegmentKeys()).then(
|
|
29
|
-
(listOfKeys) => listOfKeys.map(this.keys.extractKey)
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
contains(names: Set<string>): Promise<boolean> {
|
|
34
|
-
const namesArray = setToArray(names);
|
|
35
|
-
return this.getNames().then(namesInStorage => {
|
|
36
|
-
return namesArray.every(name => namesInStorage.includes(name));
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): Promise<boolean> {
|
|
41
|
-
return Promise.all([
|
|
42
|
-
this.setChangeNumber(changeNumber),
|
|
43
|
-
Promise.all(toAdd.map(toAdd => {
|
|
44
|
-
const key = this.keys.buildRBSegmentKey(toAdd.name);
|
|
45
|
-
const stringifiedNewRBSegment = JSON.stringify(toAdd);
|
|
46
|
-
return this.redis.set(key, stringifiedNewRBSegment).then(() => true);
|
|
47
|
-
})),
|
|
48
|
-
Promise.all(toRemove.map(toRemove => {
|
|
49
|
-
const key = this.keys.buildRBSegmentKey(toRemove.name);
|
|
50
|
-
return this.redis.del(key).then(status => status === 1);
|
|
51
|
-
}))
|
|
52
|
-
]).then(([, added, removed]) => {
|
|
53
|
-
return added.some(result => result) || removed.some(result => result);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
setChangeNumber(changeNumber: number) {
|
|
58
|
-
return this.redis.set(this.keys.buildRBSegmentsTillKey(), changeNumber + '').then(
|
|
59
|
-
status => status === 'OK'
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
getChangeNumber(): Promise<number> {
|
|
64
|
-
return this.redis.get(this.keys.buildRBSegmentsTillKey()).then((value: string | null) => {
|
|
65
|
-
const i = parseInt(value as string, 10);
|
|
66
|
-
|
|
67
|
-
return isNaNNumber(i) ? -1 : i;
|
|
68
|
-
}).catch((e) => {
|
|
69
|
-
this.log.error(LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
70
|
-
return -1;
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// @TODO implement if required by DataLoader or producer mode
|
|
75
|
-
clear() {
|
|
76
|
-
return Promise.resolve();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { isNaNNumber } from '../../utils/lang';
|
|
2
|
-
import { KeyBuilder } from '../KeyBuilder';
|
|
3
|
-
import { IPluggableStorageWrapper, IRBSegmentsCacheAsync } from '../types';
|
|
4
|
-
import { ILogger } from '../../logger/types';
|
|
5
|
-
import { IRBSegment } from '../../dtos/types';
|
|
6
|
-
import { LOG_PREFIX } from './constants';
|
|
7
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
8
|
-
|
|
9
|
-
export class RBSegmentsCachePluggable implements IRBSegmentsCacheAsync {
|
|
10
|
-
|
|
11
|
-
private readonly log: ILogger;
|
|
12
|
-
private readonly keys: KeyBuilder;
|
|
13
|
-
private readonly wrapper: IPluggableStorageWrapper;
|
|
14
|
-
|
|
15
|
-
constructor(log: ILogger, keys: KeyBuilder, wrapper: IPluggableStorageWrapper) {
|
|
16
|
-
this.log = log;
|
|
17
|
-
this.keys = keys;
|
|
18
|
-
this.wrapper = wrapper;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
get(name: string): Promise<IRBSegment | null> {
|
|
22
|
-
return this.wrapper.get(this.keys.buildRBSegmentKey(name))
|
|
23
|
-
.then(maybeRBSegment => maybeRBSegment && JSON.parse(maybeRBSegment));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
private getNames(): Promise<string[]> {
|
|
27
|
-
return this.wrapper.getKeysByPrefix(this.keys.buildRBSegmentKeyPrefix()).then(
|
|
28
|
-
(listOfKeys) => listOfKeys.map(this.keys.extractKey)
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
contains(names: Set<string>): Promise<boolean> {
|
|
33
|
-
const namesArray = setToArray(names);
|
|
34
|
-
return this.getNames().then(namesInStorage => {
|
|
35
|
-
return namesArray.every(name => namesInStorage.includes(name));
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): Promise<boolean> {
|
|
40
|
-
return Promise.all([
|
|
41
|
-
this.setChangeNumber(changeNumber),
|
|
42
|
-
Promise.all(toAdd.map(toAdd => {
|
|
43
|
-
const key = this.keys.buildRBSegmentKey(toAdd.name);
|
|
44
|
-
const stringifiedNewRBSegment = JSON.stringify(toAdd);
|
|
45
|
-
return this.wrapper.set(key, stringifiedNewRBSegment).then(() => true);
|
|
46
|
-
})),
|
|
47
|
-
Promise.all(toRemove.map(toRemove => {
|
|
48
|
-
const key = this.keys.buildRBSegmentKey(toRemove.name);
|
|
49
|
-
return this.wrapper.del(key);
|
|
50
|
-
}))
|
|
51
|
-
]).then(([, added, removed]) => {
|
|
52
|
-
return added.some(result => result) || removed.some(result => result);
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
setChangeNumber(changeNumber: number) {
|
|
57
|
-
return this.wrapper.set(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
getChangeNumber(): Promise<number> {
|
|
61
|
-
return this.wrapper.get(this.keys.buildRBSegmentsTillKey()).then((value) => {
|
|
62
|
-
const i = parseInt(value as string, 10);
|
|
63
|
-
|
|
64
|
-
return isNaNNumber(i) ? -1 : i;
|
|
65
|
-
}).catch((e) => {
|
|
66
|
-
this.log.error(LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
67
|
-
return -1;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// @TODO implement if required by DataLoader or producer mode
|
|
72
|
-
clear() {
|
|
73
|
-
return Promise.resolve();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|