@splitsoftware/splitio-commons 2.2.1-rc.5 → 2.3.0
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 +26 -26
- 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/warn.js +1 -1
- package/cjs/services/splitApi.js +4 -3
- package/cjs/services/splitHttpClient.js +3 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +2 -5
- package/cjs/storages/KeyBuilder.js +0 -9
- package/cjs/storages/KeyBuilderCS.js +0 -3
- package/cjs/storages/KeyBuilderSS.js +0 -3
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +14 -9
- package/cjs/storages/inLocalStorage/index.js +1 -5
- package/cjs/storages/inLocalStorage/validateCache.js +1 -2
- package/cjs/storages/inMemory/InMemoryStorage.js +0 -3
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -1
- package/cjs/storages/inRedis/index.js +0 -2
- package/cjs/storages/pluggable/index.js +0 -2
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +4 -54
- package/cjs/sync/polling/pollingManagerCS.js +7 -7
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +1 -1
- 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 +33 -59
- 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/syncManagerOnline.js +2 -2
- package/cjs/utils/constants/index.js +2 -6
- 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/warn.js +1 -1
- package/esm/services/splitApi.js +4 -3
- package/esm/services/splitHttpClient.js +3 -2
- package/esm/storages/AbstractSplitsCacheSync.js +2 -5
- package/esm/storages/KeyBuilder.js +0 -9
- package/esm/storages/KeyBuilderCS.js +0 -3
- package/esm/storages/KeyBuilderSS.js +0 -3
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +14 -9
- package/esm/storages/inLocalStorage/index.js +1 -5
- package/esm/storages/inLocalStorage/validateCache.js +1 -2
- package/esm/storages/inMemory/InMemoryStorage.js +0 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -1
- package/esm/storages/inRedis/index.js +0 -2
- package/esm/storages/pluggable/index.js +0 -2
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +4 -54
- package/esm/sync/polling/pollingManagerCS.js +7 -7
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +1 -1
- 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 +33 -59
- 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/syncManagerOnline.js +2 -2
- package/esm/utils/constants/index.js +1 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +8 -37
- 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/warn.ts +1 -1
- package/src/sdkFactory/types.ts +1 -1
- package/src/sdkManager/index.ts +1 -1
- package/src/services/splitApi.ts +4 -3
- package/src/services/splitHttpClient.ts +3 -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 +0 -4
- package/src/storages/KeyBuilderSS.ts +0 -4
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +14 -10
- package/src/storages/inLocalStorage/index.ts +1 -5
- package/src/storages/inLocalStorage/validateCache.ts +1 -3
- package/src/storages/inMemory/InMemoryStorage.ts +0 -3
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -4
- package/src/storages/inMemory/SplitsCacheInMemory.ts +0 -1
- 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/sync/polling/fetchers/splitChangesFetcher.ts +4 -65
- package/src/sync/polling/fetchers/types.ts +0 -1
- package/src/sync/polling/pollingManagerCS.ts +7 -7
- package/src/sync/polling/syncTasks/splitsSyncTask.ts +1 -1
- 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 +43 -70
- 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/syncManagerOnline.ts +2 -2
- package/src/utils/constants/index.ts +1 -6
- package/src/utils/lang/index.ts +1 -1
- package/cjs/evaluator/matchers/rbsegment.js +0 -56
- 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 -52
- 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 -74
- 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,61 +0,0 @@
|
|
|
1
|
-
import { isNaNNumber } from '../../utils/lang';
|
|
2
|
-
import { LOG_PREFIX } from './constants';
|
|
3
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
4
|
-
var RBSegmentsCachePluggable = /** @class */ (function () {
|
|
5
|
-
function RBSegmentsCachePluggable(log, keys, wrapper) {
|
|
6
|
-
this.log = log;
|
|
7
|
-
this.keys = keys;
|
|
8
|
-
this.wrapper = wrapper;
|
|
9
|
-
}
|
|
10
|
-
RBSegmentsCachePluggable.prototype.get = function (name) {
|
|
11
|
-
return this.wrapper.get(this.keys.buildRBSegmentKey(name))
|
|
12
|
-
.then(function (maybeRBSegment) { return maybeRBSegment && JSON.parse(maybeRBSegment); });
|
|
13
|
-
};
|
|
14
|
-
RBSegmentsCachePluggable.prototype.getNames = function () {
|
|
15
|
-
var _this = this;
|
|
16
|
-
return this.wrapper.getKeysByPrefix(this.keys.buildRBSegmentKeyPrefix()).then(function (listOfKeys) { return listOfKeys.map(_this.keys.extractKey); });
|
|
17
|
-
};
|
|
18
|
-
RBSegmentsCachePluggable.prototype.contains = function (names) {
|
|
19
|
-
var namesArray = setToArray(names);
|
|
20
|
-
return this.getNames().then(function (namesInStorage) {
|
|
21
|
-
return namesArray.every(function (name) { return namesInStorage.includes(name); });
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
RBSegmentsCachePluggable.prototype.update = function (toAdd, toRemove, changeNumber) {
|
|
25
|
-
var _this = this;
|
|
26
|
-
return Promise.all([
|
|
27
|
-
this.setChangeNumber(changeNumber),
|
|
28
|
-
Promise.all(toAdd.map(function (toAdd) {
|
|
29
|
-
var key = _this.keys.buildRBSegmentKey(toAdd.name);
|
|
30
|
-
var stringifiedNewRBSegment = JSON.stringify(toAdd);
|
|
31
|
-
return _this.wrapper.set(key, stringifiedNewRBSegment).then(function () { return true; });
|
|
32
|
-
})),
|
|
33
|
-
Promise.all(toRemove.map(function (toRemove) {
|
|
34
|
-
var key = _this.keys.buildRBSegmentKey(toRemove.name);
|
|
35
|
-
return _this.wrapper.del(key);
|
|
36
|
-
}))
|
|
37
|
-
]).then(function (_a) {
|
|
38
|
-
var added = _a[1], removed = _a[2];
|
|
39
|
-
return added.some(function (result) { return result; }) || removed.some(function (result) { return result; });
|
|
40
|
-
});
|
|
41
|
-
};
|
|
42
|
-
RBSegmentsCachePluggable.prototype.setChangeNumber = function (changeNumber) {
|
|
43
|
-
return this.wrapper.set(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
|
|
44
|
-
};
|
|
45
|
-
RBSegmentsCachePluggable.prototype.getChangeNumber = function () {
|
|
46
|
-
var _this = this;
|
|
47
|
-
return this.wrapper.get(this.keys.buildRBSegmentsTillKey()).then(function (value) {
|
|
48
|
-
var i = parseInt(value, 10);
|
|
49
|
-
return isNaNNumber(i) ? -1 : i;
|
|
50
|
-
}).catch(function (e) {
|
|
51
|
-
_this.log.error(LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
52
|
-
return -1;
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
// @TODO implement if required by DataLoader or producer mode
|
|
56
|
-
RBSegmentsCachePluggable.prototype.clear = function () {
|
|
57
|
-
return Promise.resolve();
|
|
58
|
-
};
|
|
59
|
-
return RBSegmentsCachePluggable;
|
|
60
|
-
}());
|
|
61
|
-
export { RBSegmentsCachePluggable };
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { IExcludedSegment, IRBSegment, MaybeThenable } from '../../dtos/types';
|
|
2
|
-
import { IStorageAsync, IStorageSync } from '../../storages/types';
|
|
3
|
-
import { ILogger } from '../../logger/types';
|
|
4
|
-
import { IDependencyMatcherValue, ISplitEvaluator } from '../types';
|
|
5
|
-
import { thenable } from '../../utils/promise/thenable';
|
|
6
|
-
import { getMatching, keyParser } from '../../utils/key';
|
|
7
|
-
import { parser } from '../parser';
|
|
8
|
-
import { STANDARD_SEGMENT, RULE_BASED_SEGMENT, LARGE_SEGMENT } from '../../utils/constants';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export function ruleBasedSegmentMatcherContext(segmentName: string, storage: IStorageSync | IStorageAsync, log: ILogger) {
|
|
12
|
-
|
|
13
|
-
return function ruleBasedSegmentMatcher({ key, attributes }: IDependencyMatcherValue, splitEvaluator: ISplitEvaluator): MaybeThenable<boolean> {
|
|
14
|
-
const matchingKey = getMatching(key);
|
|
15
|
-
|
|
16
|
-
function matchConditions(rbsegment: IRBSegment) {
|
|
17
|
-
const conditions = rbsegment.conditions || [];
|
|
18
|
-
|
|
19
|
-
if (!conditions.length) return false;
|
|
20
|
-
|
|
21
|
-
const evaluator = parser(log, conditions, storage);
|
|
22
|
-
|
|
23
|
-
const evaluation = evaluator(
|
|
24
|
-
keyParser(key),
|
|
25
|
-
undefined,
|
|
26
|
-
undefined,
|
|
27
|
-
undefined,
|
|
28
|
-
attributes,
|
|
29
|
-
splitEvaluator
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
return thenable(evaluation) ?
|
|
33
|
-
evaluation.then(evaluation => evaluation ? true : false) :
|
|
34
|
-
evaluation ? true : false;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function isInExcludedSegment({ type, name }: IExcludedSegment) {
|
|
38
|
-
return type === STANDARD_SEGMENT ?
|
|
39
|
-
storage.segments.isInSegment(name, matchingKey) :
|
|
40
|
-
type === RULE_BASED_SEGMENT ?
|
|
41
|
-
ruleBasedSegmentMatcherContext(name, storage, log)({ key, attributes }, splitEvaluator) :
|
|
42
|
-
type === LARGE_SEGMENT && (storage as IStorageSync).largeSegments ?
|
|
43
|
-
(storage as IStorageSync).largeSegments!.isInSegment(name, matchingKey) :
|
|
44
|
-
false;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function isExcluded(rbSegment: IRBSegment) {
|
|
48
|
-
const excluded = rbSegment.excluded || {};
|
|
49
|
-
|
|
50
|
-
if (excluded.keys && excluded.keys.indexOf(matchingKey) !== -1) return true;
|
|
51
|
-
|
|
52
|
-
return (excluded.segments || []).reduce<MaybeThenable<boolean>>((result, excludedSegment) => {
|
|
53
|
-
return thenable(result) ?
|
|
54
|
-
result.then(result => result || isInExcludedSegment(excludedSegment)) :
|
|
55
|
-
result || isInExcludedSegment(excludedSegment);
|
|
56
|
-
}, false);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function isInRBSegment(rbSegment: IRBSegment | null) {
|
|
60
|
-
if (!rbSegment) return false;
|
|
61
|
-
const excluded = isExcluded(rbSegment);
|
|
62
|
-
|
|
63
|
-
return thenable(excluded) ?
|
|
64
|
-
excluded.then(excluded => excluded ? false : matchConditions(rbSegment)) :
|
|
65
|
-
excluded ? false : matchConditions(rbSegment);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const rbSegment = storage.rbSegments.get(segmentName);
|
|
69
|
-
|
|
70
|
-
return thenable(rbSegment) ?
|
|
71
|
-
rbSegment.then(isInRBSegment) :
|
|
72
|
-
isInRBSegment(rbSegment);
|
|
73
|
-
};
|
|
74
|
-
}
|
|
@@ -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
|
-
}
|