@splitsoftware/splitio-commons 2.2.1-rc.3 → 2.2.1-rc.5
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 +5 -2
- package/README.md +1 -0
- package/cjs/consent/sdkUserConsent.js +5 -3
- package/cjs/evaluator/combiners/and.js +2 -6
- package/cjs/evaluator/combiners/ifelseif.js +6 -6
- package/cjs/evaluator/condition/index.js +6 -5
- package/cjs/evaluator/index.js +7 -7
- package/cjs/evaluator/matchers/index.js +3 -1
- package/cjs/evaluator/matchers/matcherTypes.js +1 -0
- package/cjs/evaluator/matchers/rbsegment.js +56 -0
- package/cjs/evaluator/matchersTransform/index.js +4 -0
- package/cjs/evaluator/parser/index.js +2 -2
- package/cjs/evaluator/value/sanitize.js +1 -0
- package/cjs/listeners/browser.js +2 -5
- package/cjs/logger/constants.js +4 -3
- package/cjs/logger/messages/debug.js +3 -2
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/services/splitApi.js +3 -4
- package/cjs/services/splitHttpClient.js +3 -1
- package/cjs/storages/AbstractSplitsCacheSync.js +5 -2
- package/cjs/storages/KeyBuilder.js +9 -0
- package/cjs/storages/KeyBuilderCS.js +3 -0
- package/cjs/storages/KeyBuilderSS.js +3 -0
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +117 -0
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +9 -14
- package/cjs/storages/inLocalStorage/index.js +5 -1
- package/cjs/storages/inLocalStorage/validateCache.js +2 -1
- package/cjs/storages/inMemory/InMemoryStorage.js +3 -0
- package/cjs/storages/inMemory/InMemoryStorageCS.js +4 -0
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +61 -0
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +1 -0
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +64 -0
- package/cjs/storages/inRedis/index.js +5 -3
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +64 -0
- package/cjs/storages/pluggable/index.js +2 -0
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +54 -4
- 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 +59 -33
- package/cjs/sync/streaming/SSEHandler/index.js +1 -0
- package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +106 -77
- package/cjs/sync/streaming/constants.js +2 -1
- package/cjs/sync/streaming/pushManager.js +3 -16
- package/cjs/sync/syncManagerOnline.js +2 -2
- package/cjs/utils/constants/index.js +6 -2
- package/esm/consent/sdkUserConsent.js +5 -3
- package/esm/evaluator/combiners/and.js +2 -6
- package/esm/evaluator/combiners/ifelseif.js +7 -7
- package/esm/evaluator/condition/index.js +6 -5
- package/esm/evaluator/index.js +7 -7
- package/esm/evaluator/matchers/index.js +3 -1
- package/esm/evaluator/matchers/matcherTypes.js +1 -0
- package/esm/evaluator/matchers/rbsegment.js +52 -0
- package/esm/evaluator/matchersTransform/index.js +4 -0
- package/esm/evaluator/parser/index.js +2 -2
- package/esm/evaluator/value/sanitize.js +1 -0
- package/esm/listeners/browser.js +2 -5
- package/esm/logger/constants.js +1 -0
- package/esm/logger/messages/debug.js +3 -2
- package/esm/logger/messages/warn.js +1 -1
- package/esm/services/splitApi.js +3 -4
- package/esm/services/splitHttpClient.js +3 -1
- package/esm/storages/AbstractSplitsCacheSync.js +5 -2
- package/esm/storages/KeyBuilder.js +9 -0
- package/esm/storages/KeyBuilderCS.js +3 -0
- package/esm/storages/KeyBuilderSS.js +3 -0
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +114 -0
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +9 -14
- package/esm/storages/inLocalStorage/index.js +5 -1
- package/esm/storages/inLocalStorage/validateCache.js +2 -1
- package/esm/storages/inMemory/InMemoryStorage.js +3 -0
- package/esm/storages/inMemory/InMemoryStorageCS.js +4 -0
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +58 -0
- package/esm/storages/inMemory/SplitsCacheInMemory.js +1 -0
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +61 -0
- package/esm/storages/inRedis/index.js +5 -3
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +61 -0
- package/esm/storages/pluggable/index.js +2 -0
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +54 -4
- 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 +59 -33
- package/esm/sync/streaming/SSEHandler/index.js +2 -1
- package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +102 -73
- package/esm/sync/streaming/constants.js +1 -0
- package/esm/sync/streaming/pushManager.js +6 -19
- package/esm/sync/syncManagerOnline.js +2 -2
- package/esm/utils/constants/index.js +5 -1
- package/package.json +1 -1
- package/src/consent/sdkUserConsent.ts +3 -2
- package/src/dtos/types.ts +37 -8
- package/src/evaluator/Engine.ts +1 -1
- package/src/evaluator/combiners/and.ts +5 -4
- package/src/evaluator/combiners/ifelseif.ts +7 -9
- 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 +3 -1
- package/src/evaluator/matchers/matcherTypes.ts +1 -0
- package/src/evaluator/matchers/rbsegment.ts +74 -0
- package/src/evaluator/matchersTransform/index.ts +3 -0
- 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 +5 -4
- package/src/listeners/browser.ts +2 -3
- package/src/logger/constants.ts +1 -0
- package/src/logger/messages/debug.ts +3 -2
- package/src/logger/messages/warn.ts +1 -1
- package/src/sdkManager/index.ts +1 -1
- package/src/services/splitApi.ts +3 -4
- package/src/services/splitHttpClient.ts +3 -1
- package/src/services/types.ts +1 -1
- package/src/storages/AbstractSplitsCacheSync.ts +6 -3
- package/src/storages/KeyBuilder.ts +12 -0
- package/src/storages/KeyBuilderCS.ts +4 -0
- package/src/storages/KeyBuilderSS.ts +4 -0
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +136 -0
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +10 -14
- package/src/storages/inLocalStorage/index.ts +5 -1
- package/src/storages/inLocalStorage/validateCache.ts +3 -1
- package/src/storages/inMemory/InMemoryStorage.ts +3 -0
- package/src/storages/inMemory/InMemoryStorageCS.ts +4 -0
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +68 -0
- package/src/storages/inMemory/SplitsCacheInMemory.ts +1 -0
- package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +79 -0
- package/src/storages/inRedis/index.ts +5 -3
- package/src/storages/pluggable/RBSegmentsCachePluggable.ts +76 -0
- package/src/storages/pluggable/index.ts +2 -0
- package/src/storages/types.ts +33 -1
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +65 -4
- package/src/sync/polling/fetchers/types.ts +1 -0
- 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 +70 -43
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +98 -68
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/parseUtils.ts +2 -2
- package/src/sync/streaming/pushManager.ts +6 -18
- package/src/sync/streaming/types.ts +3 -2
- package/src/sync/syncManagerOnline.ts +2 -2
- package/src/utils/constants/index.ts +6 -1
- package/src/utils/lang/index.ts +1 -1
|
@@ -8,6 +8,7 @@ var KeyBuilder_1 = require("../KeyBuilder");
|
|
|
8
8
|
var KeyBuilderCS_1 = require("../KeyBuilderCS");
|
|
9
9
|
var isLocalStorageAvailable_1 = require("../../utils/env/isLocalStorageAvailable");
|
|
10
10
|
var SplitsCacheInLocal_1 = require("./SplitsCacheInLocal");
|
|
11
|
+
var RBSegmentsCacheInLocal_1 = require("./RBSegmentsCacheInLocal");
|
|
11
12
|
var MySegmentsCacheInLocal_1 = require("./MySegmentsCacheInLocal");
|
|
12
13
|
var InMemoryStorageCS_1 = require("../inMemory/InMemoryStorageCS");
|
|
13
14
|
var constants_1 = require("./constants");
|
|
@@ -32,10 +33,12 @@ function InLocalStorage(options) {
|
|
|
32
33
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
33
34
|
var keys = new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey);
|
|
34
35
|
var splits = new SplitsCacheInLocal_1.SplitsCacheInLocal(settings, keys);
|
|
36
|
+
var rbSegments = new RBSegmentsCacheInLocal_1.RBSegmentsCacheInLocal(settings, keys);
|
|
35
37
|
var segments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, keys);
|
|
36
38
|
var largeSegments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey));
|
|
37
39
|
return {
|
|
38
40
|
splits: splits,
|
|
41
|
+
rbSegments: rbSegments,
|
|
39
42
|
segments: segments,
|
|
40
43
|
largeSegments: largeSegments,
|
|
41
44
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
@@ -44,13 +47,14 @@ function InLocalStorage(options) {
|
|
|
44
47
|
telemetry: (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)(params) ? new TelemetryCacheInMemory_1.TelemetryCacheInMemory(splits, segments) : undefined,
|
|
45
48
|
uniqueKeys: new UniqueKeysCacheInMemoryCS_1.UniqueKeysCacheInMemoryCS(),
|
|
46
49
|
validateCache: function () {
|
|
47
|
-
return (0, validateCache_1.validateCache)(options, settings, keys, splits, segments, largeSegments);
|
|
50
|
+
return (0, validateCache_1.validateCache)(options, settings, keys, splits, rbSegments, segments, largeSegments);
|
|
48
51
|
},
|
|
49
52
|
destroy: function () { },
|
|
50
53
|
// When using shared instantiation with MEMORY we reuse everything but segments (they are customer per key).
|
|
51
54
|
shared: function (matchingKey) {
|
|
52
55
|
return {
|
|
53
56
|
splits: this.splits,
|
|
57
|
+
rbSegments: this.rbSegments,
|
|
54
58
|
segments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey)),
|
|
55
59
|
largeSegments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey)),
|
|
56
60
|
impressions: this.impressions,
|
|
@@ -57,11 +57,12 @@ function validateExpiration(options, settings, keys, currentTimestamp, isThereCa
|
|
|
57
57
|
*
|
|
58
58
|
* @returns `true` if cache is ready to be used, `false` otherwise (cache was cleared or there is no cache)
|
|
59
59
|
*/
|
|
60
|
-
function validateCache(options, settings, keys, splits, segments, largeSegments) {
|
|
60
|
+
function validateCache(options, settings, keys, splits, rbSegments, segments, largeSegments) {
|
|
61
61
|
var currentTimestamp = Date.now();
|
|
62
62
|
var isThereCache = splits.getChangeNumber() > -1;
|
|
63
63
|
if (validateExpiration(options, settings, keys, currentTimestamp, isThereCache)) {
|
|
64
64
|
splits.clear();
|
|
65
|
+
rbSegments.clear();
|
|
65
66
|
segments.clear();
|
|
66
67
|
largeSegments.clear();
|
|
67
68
|
// Update last clear timestamp
|
|
@@ -9,6 +9,7 @@ var ImpressionCountsCacheInMemory_1 = require("./ImpressionCountsCacheInMemory")
|
|
|
9
9
|
var constants_1 = require("../../utils/constants");
|
|
10
10
|
var TelemetryCacheInMemory_1 = require("./TelemetryCacheInMemory");
|
|
11
11
|
var UniqueKeysCacheInMemory_1 = require("./UniqueKeysCacheInMemory");
|
|
12
|
+
var RBSegmentsCacheInMemory_1 = require("./RBSegmentsCacheInMemory");
|
|
12
13
|
/**
|
|
13
14
|
* InMemory storage factory for standalone server-side SplitFactory
|
|
14
15
|
*
|
|
@@ -17,9 +18,11 @@ var UniqueKeysCacheInMemory_1 = require("./UniqueKeysCacheInMemory");
|
|
|
17
18
|
function InMemoryStorageFactory(params) {
|
|
18
19
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, __splitFiltersValidation = _a.sync.__splitFiltersValidation;
|
|
19
20
|
var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
21
|
+
var rbSegments = new RBSegmentsCacheInMemory_1.RBSegmentsCacheInMemory();
|
|
20
22
|
var segments = new SegmentsCacheInMemory_1.SegmentsCacheInMemory();
|
|
21
23
|
var storage = {
|
|
22
24
|
splits: splits,
|
|
25
|
+
rbSegments: rbSegments,
|
|
23
26
|
segments: segments,
|
|
24
27
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
25
28
|
impressionCounts: new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory(),
|
|
@@ -9,6 +9,7 @@ var ImpressionCountsCacheInMemory_1 = require("./ImpressionCountsCacheInMemory")
|
|
|
9
9
|
var constants_1 = require("../../utils/constants");
|
|
10
10
|
var TelemetryCacheInMemory_1 = require("./TelemetryCacheInMemory");
|
|
11
11
|
var UniqueKeysCacheInMemoryCS_1 = require("./UniqueKeysCacheInMemoryCS");
|
|
12
|
+
var RBSegmentsCacheInMemory_1 = require("./RBSegmentsCacheInMemory");
|
|
12
13
|
/**
|
|
13
14
|
* InMemory storage factory for standalone client-side SplitFactory
|
|
14
15
|
*
|
|
@@ -17,10 +18,12 @@ var UniqueKeysCacheInMemoryCS_1 = require("./UniqueKeysCacheInMemoryCS");
|
|
|
17
18
|
function InMemoryStorageCSFactory(params) {
|
|
18
19
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, __splitFiltersValidation = _a.sync.__splitFiltersValidation;
|
|
19
20
|
var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
21
|
+
var rbSegments = new RBSegmentsCacheInMemory_1.RBSegmentsCacheInMemory();
|
|
20
22
|
var segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
21
23
|
var largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
22
24
|
var storage = {
|
|
23
25
|
splits: splits,
|
|
26
|
+
rbSegments: rbSegments,
|
|
24
27
|
segments: segments,
|
|
25
28
|
largeSegments: largeSegments,
|
|
26
29
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
@@ -33,6 +36,7 @@ function InMemoryStorageCSFactory(params) {
|
|
|
33
36
|
shared: function () {
|
|
34
37
|
return {
|
|
35
38
|
splits: this.splits,
|
|
39
|
+
rbSegments: this.rbSegments,
|
|
36
40
|
segments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
37
41
|
largeSegments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
38
42
|
impressions: this.impressions,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RBSegmentsCacheInMemory = void 0;
|
|
4
|
+
var sets_1 = require("../../utils/lang/sets");
|
|
5
|
+
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
|
+
var RBSegmentsCacheInMemory = /** @class */ (function () {
|
|
7
|
+
function RBSegmentsCacheInMemory() {
|
|
8
|
+
this.cache = {};
|
|
9
|
+
this.changeNumber = -1;
|
|
10
|
+
this.segmentsCount = 0;
|
|
11
|
+
}
|
|
12
|
+
RBSegmentsCacheInMemory.prototype.clear = function () {
|
|
13
|
+
this.cache = {};
|
|
14
|
+
this.changeNumber = -1;
|
|
15
|
+
this.segmentsCount = 0;
|
|
16
|
+
};
|
|
17
|
+
RBSegmentsCacheInMemory.prototype.update = function (toAdd, toRemove, changeNumber) {
|
|
18
|
+
var _this = this;
|
|
19
|
+
this.changeNumber = changeNumber;
|
|
20
|
+
var updated = toAdd.map(function (toAdd) { return _this.add(toAdd); }).some(function (result) { return result; });
|
|
21
|
+
return toRemove.map(function (toRemove) { return _this.remove(toRemove.name); }).some(function (result) { return result; }) || updated;
|
|
22
|
+
};
|
|
23
|
+
RBSegmentsCacheInMemory.prototype.add = function (rbSegment) {
|
|
24
|
+
var name = rbSegment.name;
|
|
25
|
+
var previous = this.get(name);
|
|
26
|
+
if (previous && (0, AbstractSplitsCacheSync_1.usesSegments)(previous))
|
|
27
|
+
this.segmentsCount--;
|
|
28
|
+
this.cache[name] = rbSegment;
|
|
29
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(rbSegment))
|
|
30
|
+
this.segmentsCount++;
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
33
|
+
RBSegmentsCacheInMemory.prototype.remove = function (name) {
|
|
34
|
+
var rbSegment = this.get(name);
|
|
35
|
+
if (!rbSegment)
|
|
36
|
+
return false;
|
|
37
|
+
delete this.cache[name];
|
|
38
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(rbSegment))
|
|
39
|
+
this.segmentsCount--;
|
|
40
|
+
return true;
|
|
41
|
+
};
|
|
42
|
+
RBSegmentsCacheInMemory.prototype.getNames = function () {
|
|
43
|
+
return Object.keys(this.cache);
|
|
44
|
+
};
|
|
45
|
+
RBSegmentsCacheInMemory.prototype.get = function (name) {
|
|
46
|
+
return this.cache[name] || null;
|
|
47
|
+
};
|
|
48
|
+
RBSegmentsCacheInMemory.prototype.contains = function (names) {
|
|
49
|
+
var namesArray = (0, sets_1.setToArray)(names);
|
|
50
|
+
var namesInStorage = this.getNames();
|
|
51
|
+
return namesArray.every(function (name) { return namesInStorage.indexOf(name) !== -1; });
|
|
52
|
+
};
|
|
53
|
+
RBSegmentsCacheInMemory.prototype.getChangeNumber = function () {
|
|
54
|
+
return this.changeNumber;
|
|
55
|
+
};
|
|
56
|
+
RBSegmentsCacheInMemory.prototype.usesSegments = function () {
|
|
57
|
+
return this.segmentsCount > 0;
|
|
58
|
+
};
|
|
59
|
+
return RBSegmentsCacheInMemory;
|
|
60
|
+
}());
|
|
61
|
+
exports.RBSegmentsCacheInMemory = RBSegmentsCacheInMemory;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RBSegmentsCacheInRedis = void 0;
|
|
4
|
+
var lang_1 = require("../../utils/lang");
|
|
5
|
+
var constants_1 = require("./constants");
|
|
6
|
+
var sets_1 = require("../../utils/lang/sets");
|
|
7
|
+
var RBSegmentsCacheInRedis = /** @class */ (function () {
|
|
8
|
+
function RBSegmentsCacheInRedis(log, keys, redis) {
|
|
9
|
+
this.log = log;
|
|
10
|
+
this.keys = keys;
|
|
11
|
+
this.redis = redis;
|
|
12
|
+
}
|
|
13
|
+
RBSegmentsCacheInRedis.prototype.get = function (name) {
|
|
14
|
+
return this.redis.get(this.keys.buildRBSegmentKey(name))
|
|
15
|
+
.then(function (maybeRBSegment) { return maybeRBSegment && JSON.parse(maybeRBSegment); });
|
|
16
|
+
};
|
|
17
|
+
RBSegmentsCacheInRedis.prototype.getNames = function () {
|
|
18
|
+
var _this = this;
|
|
19
|
+
return this.redis.keys(this.keys.searchPatternForRBSegmentKeys()).then(function (listOfKeys) { return listOfKeys.map(_this.keys.extractKey); });
|
|
20
|
+
};
|
|
21
|
+
RBSegmentsCacheInRedis.prototype.contains = function (names) {
|
|
22
|
+
var namesArray = (0, sets_1.setToArray)(names);
|
|
23
|
+
return this.getNames().then(function (namesInStorage) {
|
|
24
|
+
return namesArray.every(function (name) { return namesInStorage.includes(name); });
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
RBSegmentsCacheInRedis.prototype.update = function (toAdd, toRemove, changeNumber) {
|
|
28
|
+
var _this = this;
|
|
29
|
+
return Promise.all([
|
|
30
|
+
this.setChangeNumber(changeNumber),
|
|
31
|
+
Promise.all(toAdd.map(function (toAdd) {
|
|
32
|
+
var key = _this.keys.buildRBSegmentKey(toAdd.name);
|
|
33
|
+
var stringifiedNewRBSegment = JSON.stringify(toAdd);
|
|
34
|
+
return _this.redis.set(key, stringifiedNewRBSegment).then(function () { return true; });
|
|
35
|
+
})),
|
|
36
|
+
Promise.all(toRemove.map(function (toRemove) {
|
|
37
|
+
var key = _this.keys.buildRBSegmentKey(toRemove.name);
|
|
38
|
+
return _this.redis.del(key).then(function (status) { return status === 1; });
|
|
39
|
+
}))
|
|
40
|
+
]).then(function (_a) {
|
|
41
|
+
var added = _a[1], removed = _a[2];
|
|
42
|
+
return added.some(function (result) { return result; }) || removed.some(function (result) { return result; });
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
RBSegmentsCacheInRedis.prototype.setChangeNumber = function (changeNumber) {
|
|
46
|
+
return this.redis.set(this.keys.buildRBSegmentsTillKey(), changeNumber + '').then(function (status) { return status === 'OK'; });
|
|
47
|
+
};
|
|
48
|
+
RBSegmentsCacheInRedis.prototype.getChangeNumber = function () {
|
|
49
|
+
var _this = this;
|
|
50
|
+
return this.redis.get(this.keys.buildRBSegmentsTillKey()).then(function (value) {
|
|
51
|
+
var i = parseInt(value, 10);
|
|
52
|
+
return (0, lang_1.isNaNNumber)(i) ? -1 : i;
|
|
53
|
+
}).catch(function (e) {
|
|
54
|
+
_this.log.error(constants_1.LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
55
|
+
return -1;
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
// @TODO implement if required by DataLoader or producer mode
|
|
59
|
+
RBSegmentsCacheInRedis.prototype.clear = function () {
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
};
|
|
62
|
+
return RBSegmentsCacheInRedis;
|
|
63
|
+
}());
|
|
64
|
+
exports.RBSegmentsCacheInRedis = RBSegmentsCacheInRedis;
|
|
@@ -12,6 +12,7 @@ var TelemetryCacheInRedis_1 = require("./TelemetryCacheInRedis");
|
|
|
12
12
|
var UniqueKeysCacheInRedis_1 = require("./UniqueKeysCacheInRedis");
|
|
13
13
|
var ImpressionCountsCacheInRedis_1 = require("./ImpressionCountsCacheInRedis");
|
|
14
14
|
var utils_1 = require("../utils");
|
|
15
|
+
var RBSegmentsCacheInRedis_1 = require("./RBSegmentsCacheInRedis");
|
|
15
16
|
var RD;
|
|
16
17
|
try {
|
|
17
18
|
// Using `require` to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
|
|
@@ -28,7 +29,7 @@ function InRedisStorage(options) {
|
|
|
28
29
|
var prefix = (0, KeyBuilder_1.validatePrefix)(options.prefix);
|
|
29
30
|
function InRedisStorageFactory(params) {
|
|
30
31
|
if (!RD)
|
|
31
|
-
throw new Error('The SDK Redis storage is
|
|
32
|
+
throw new Error('The SDK Redis storage is unavailable. Make sure your runtime environment supports CommonJS (`require`) so the `ioredis` dependency can be imported.');
|
|
32
33
|
var onReadyFromCacheCb = params.onReadyFromCacheCb, onReadyCb = params.onReadyCb, settings = params.settings, log = params.settings.log;
|
|
33
34
|
var metadata = (0, utils_1.metadataBuilder)(settings);
|
|
34
35
|
var keys = new KeyBuilderSS_1.KeyBuilderSS(prefix, metadata);
|
|
@@ -36,9 +37,9 @@ function InRedisStorage(options) {
|
|
|
36
37
|
var telemetry = new TelemetryCacheInRedis_1.TelemetryCacheInRedis(log, keys, redisClient);
|
|
37
38
|
var impressionCountsCache = new ImpressionCountsCacheInRedis_1.ImpressionCountsCacheInRedis(log, keys.buildImpressionsCountKey(), redisClient);
|
|
38
39
|
var uniqueKeysCache = new UniqueKeysCacheInRedis_1.UniqueKeysCacheInRedis(log, keys.buildUniqueKeysKey(), redisClient);
|
|
39
|
-
// RedisAdapter
|
|
40
|
+
// RedisAdapter lets queue operations before connected
|
|
40
41
|
onReadyFromCacheCb();
|
|
41
|
-
//
|
|
42
|
+
// Subscription to Redis connect event in order to emit SDK_READY event on consumer mode
|
|
42
43
|
redisClient.on('connect', function () {
|
|
43
44
|
onReadyCb();
|
|
44
45
|
impressionCountsCache.start();
|
|
@@ -48,6 +49,7 @@ function InRedisStorage(options) {
|
|
|
48
49
|
});
|
|
49
50
|
return {
|
|
50
51
|
splits: new SplitsCacheInRedis_1.SplitsCacheInRedis(log, keys, redisClient, settings.sync.__splitFiltersValidation),
|
|
52
|
+
rbSegments: new RBSegmentsCacheInRedis_1.RBSegmentsCacheInRedis(log, keys, redisClient),
|
|
51
53
|
segments: new SegmentsCacheInRedis_1.SegmentsCacheInRedis(log, keys, redisClient),
|
|
52
54
|
impressions: new ImpressionsCacheInRedis_1.ImpressionsCacheInRedis(log, keys.buildImpressionsKey(), redisClient, metadata),
|
|
53
55
|
impressionCounts: impressionCountsCache,
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RBSegmentsCachePluggable = void 0;
|
|
4
|
+
var lang_1 = require("../../utils/lang");
|
|
5
|
+
var constants_1 = require("./constants");
|
|
6
|
+
var sets_1 = require("../../utils/lang/sets");
|
|
7
|
+
var RBSegmentsCachePluggable = /** @class */ (function () {
|
|
8
|
+
function RBSegmentsCachePluggable(log, keys, wrapper) {
|
|
9
|
+
this.log = log;
|
|
10
|
+
this.keys = keys;
|
|
11
|
+
this.wrapper = wrapper;
|
|
12
|
+
}
|
|
13
|
+
RBSegmentsCachePluggable.prototype.get = function (name) {
|
|
14
|
+
return this.wrapper.get(this.keys.buildRBSegmentKey(name))
|
|
15
|
+
.then(function (maybeRBSegment) { return maybeRBSegment && JSON.parse(maybeRBSegment); });
|
|
16
|
+
};
|
|
17
|
+
RBSegmentsCachePluggable.prototype.getNames = function () {
|
|
18
|
+
var _this = this;
|
|
19
|
+
return this.wrapper.getKeysByPrefix(this.keys.buildRBSegmentKeyPrefix()).then(function (listOfKeys) { return listOfKeys.map(_this.keys.extractKey); });
|
|
20
|
+
};
|
|
21
|
+
RBSegmentsCachePluggable.prototype.contains = function (names) {
|
|
22
|
+
var namesArray = (0, sets_1.setToArray)(names);
|
|
23
|
+
return this.getNames().then(function (namesInStorage) {
|
|
24
|
+
return namesArray.every(function (name) { return namesInStorage.includes(name); });
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
RBSegmentsCachePluggable.prototype.update = function (toAdd, toRemove, changeNumber) {
|
|
28
|
+
var _this = this;
|
|
29
|
+
return Promise.all([
|
|
30
|
+
this.setChangeNumber(changeNumber),
|
|
31
|
+
Promise.all(toAdd.map(function (toAdd) {
|
|
32
|
+
var key = _this.keys.buildRBSegmentKey(toAdd.name);
|
|
33
|
+
var stringifiedNewRBSegment = JSON.stringify(toAdd);
|
|
34
|
+
return _this.wrapper.set(key, stringifiedNewRBSegment).then(function () { return true; });
|
|
35
|
+
})),
|
|
36
|
+
Promise.all(toRemove.map(function (toRemove) {
|
|
37
|
+
var key = _this.keys.buildRBSegmentKey(toRemove.name);
|
|
38
|
+
return _this.wrapper.del(key);
|
|
39
|
+
}))
|
|
40
|
+
]).then(function (_a) {
|
|
41
|
+
var added = _a[1], removed = _a[2];
|
|
42
|
+
return added.some(function (result) { return result; }) || removed.some(function (result) { return result; });
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
RBSegmentsCachePluggable.prototype.setChangeNumber = function (changeNumber) {
|
|
46
|
+
return this.wrapper.set(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
|
|
47
|
+
};
|
|
48
|
+
RBSegmentsCachePluggable.prototype.getChangeNumber = function () {
|
|
49
|
+
var _this = this;
|
|
50
|
+
return this.wrapper.get(this.keys.buildRBSegmentsTillKey()).then(function (value) {
|
|
51
|
+
var i = parseInt(value, 10);
|
|
52
|
+
return (0, lang_1.isNaNNumber)(i) ? -1 : i;
|
|
53
|
+
}).catch(function (e) {
|
|
54
|
+
_this.log.error(constants_1.LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
55
|
+
return -1;
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
// @TODO implement if required by DataLoader or producer mode
|
|
59
|
+
RBSegmentsCachePluggable.prototype.clear = function () {
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
};
|
|
62
|
+
return RBSegmentsCachePluggable;
|
|
63
|
+
}());
|
|
64
|
+
exports.RBSegmentsCachePluggable = RBSegmentsCachePluggable;
|
|
@@ -22,6 +22,7 @@ var UniqueKeysCacheInMemory_1 = require("../inMemory/UniqueKeysCacheInMemory");
|
|
|
22
22
|
var UniqueKeysCacheInMemoryCS_1 = require("../inMemory/UniqueKeysCacheInMemoryCS");
|
|
23
23
|
var utils_1 = require("../utils");
|
|
24
24
|
var constants_2 = require("../pluggable/constants");
|
|
25
|
+
var RBSegmentsCachePluggable_1 = require("./RBSegmentsCachePluggable");
|
|
25
26
|
var NO_VALID_WRAPPER = 'Expecting pluggable storage `wrapper` in options, but no valid wrapper instance was provided.';
|
|
26
27
|
var NO_VALID_WRAPPER_INTERFACE = 'The provided wrapper instance doesn’t follow the expected interface. Check our docs.';
|
|
27
28
|
/**
|
|
@@ -105,6 +106,7 @@ function PluggableStorage(options) {
|
|
|
105
106
|
});
|
|
106
107
|
return {
|
|
107
108
|
splits: new SplitsCachePluggable_1.SplitsCachePluggable(log, keys, wrapper, settings.sync.__splitFiltersValidation),
|
|
109
|
+
rbSegments: new RBSegmentsCachePluggable_1.RBSegmentsCachePluggable(log, keys, wrapper),
|
|
108
110
|
segments: new SegmentsCachePluggable_1.SegmentsCachePluggable(log, keys, wrapper),
|
|
109
111
|
impressions: isPartialConsumer ? new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize) : new ImpressionsCachePluggable_1.ImpressionsCachePluggable(log, keys.buildImpressionsKey(), wrapper, metadata),
|
|
110
112
|
impressionCounts: impressionCountsCache,
|
|
@@ -1,18 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.splitChangesFetcherFactory = void 0;
|
|
4
|
+
var constants_1 = require("../../../utils/constants");
|
|
5
|
+
var settingsValidation_1 = require("../../../utils/settingsValidation");
|
|
6
|
+
var constants_2 = require("../../../logger/constants");
|
|
7
|
+
var PROXY_CHECK_INTERVAL_MILLIS_CS = 60 * 60 * 1000; // 1 hour in Client Side
|
|
8
|
+
var PROXY_CHECK_INTERVAL_MILLIS_SS = 24 * PROXY_CHECK_INTERVAL_MILLIS_CS; // 24 hours in Server Side
|
|
9
|
+
function sdkEndpointOverridden(settings) {
|
|
10
|
+
return settings.urls.sdk !== settingsValidation_1.base.urls.sdk;
|
|
11
|
+
}
|
|
4
12
|
/**
|
|
5
13
|
* Factory of SplitChanges fetcher.
|
|
6
14
|
* SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
|
|
7
15
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
// @TODO breaking: drop support for Split Proxy below v5.10.0 and simplify the implementation
|
|
17
|
+
function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
|
|
18
|
+
var log = settings.log;
|
|
19
|
+
var PROXY_CHECK_INTERVAL_MILLIS = settings.core.key !== undefined ? PROXY_CHECK_INTERVAL_MILLIS_CS : PROXY_CHECK_INTERVAL_MILLIS_SS;
|
|
20
|
+
var lastProxyCheckTimestamp;
|
|
21
|
+
return function splitChangesFetcher(since, noCache, till, rbSince,
|
|
10
22
|
// Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
|
|
11
23
|
decorator) {
|
|
12
|
-
|
|
24
|
+
// Recheck proxy
|
|
25
|
+
if (lastProxyCheckTimestamp && (Date.now() - lastProxyCheckTimestamp) > PROXY_CHECK_INTERVAL_MILLIS) {
|
|
26
|
+
settings.sync.flagSpecVersion = constants_1.FLAG_SPEC_VERSION;
|
|
27
|
+
}
|
|
28
|
+
var splitsPromise = fetchSplitChanges(since, noCache, till, settings.sync.flagSpecVersion === constants_1.FLAG_SPEC_VERSION ? rbSince : undefined)
|
|
29
|
+
// Handle proxy error with spec 1.3
|
|
30
|
+
.catch(function (err) {
|
|
31
|
+
if (err.statusCode === 400 && sdkEndpointOverridden(settings) && settings.sync.flagSpecVersion === constants_1.FLAG_SPEC_VERSION) {
|
|
32
|
+
log.error(constants_2.LOG_PREFIX_SYNC_SPLITS + 'Proxy error detected. Retrying with spec 1.2. If you are using Split Proxy, please upgrade to latest version');
|
|
33
|
+
lastProxyCheckTimestamp = Date.now();
|
|
34
|
+
settings.sync.flagSpecVersion = '1.2'; // fallback to 1.2 spec
|
|
35
|
+
return fetchSplitChanges(since, noCache, till); // retry request without rbSince
|
|
36
|
+
}
|
|
37
|
+
throw err;
|
|
38
|
+
});
|
|
13
39
|
if (decorator)
|
|
14
40
|
splitsPromise = decorator(splitsPromise);
|
|
15
|
-
return splitsPromise
|
|
41
|
+
return splitsPromise
|
|
42
|
+
.then(function (resp) { return resp.json(); })
|
|
43
|
+
.then(function (data) {
|
|
44
|
+
// Using flag spec version 1.2
|
|
45
|
+
if (data.splits) {
|
|
46
|
+
return {
|
|
47
|
+
ff: {
|
|
48
|
+
d: data.splits,
|
|
49
|
+
s: data.since,
|
|
50
|
+
t: data.till
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Proxy recovery
|
|
55
|
+
if (lastProxyCheckTimestamp) {
|
|
56
|
+
log.info(constants_2.LOG_PREFIX_SYNC_SPLITS + 'Proxy error recovered');
|
|
57
|
+
lastProxyCheckTimestamp = undefined;
|
|
58
|
+
return splitChangesFetcher(-1, undefined, undefined, -1)
|
|
59
|
+
.then(function (splitChangesResponse) {
|
|
60
|
+
return Promise.all([storage.splits.clear(), storage.rbSegments.clear()])
|
|
61
|
+
.then(function () { return splitChangesResponse; });
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return data;
|
|
65
|
+
});
|
|
16
66
|
};
|
|
17
67
|
}
|
|
18
68
|
exports.splitChangesFetcherFactory = splitChangesFetcherFactory;
|
|
@@ -34,10 +34,10 @@ function pollingManagerCSFactory(params) {
|
|
|
34
34
|
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
35
35
|
if (!splitsSyncTask.isRunning())
|
|
36
36
|
return; // noop if not doing polling
|
|
37
|
-
var
|
|
38
|
-
if (
|
|
39
|
-
log.info(constants_2.POLLING_SMART_PAUSING, [
|
|
40
|
-
if (
|
|
37
|
+
var usingSegments = storage.splits.usesSegments() || storage.rbSegments.usesSegments();
|
|
38
|
+
if (usingSegments !== mySegmentsSyncTask.isRunning()) {
|
|
39
|
+
log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
|
|
40
|
+
if (usingSegments) {
|
|
41
41
|
startMySegmentsSyncTasks();
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
@@ -49,10 +49,10 @@ function pollingManagerCSFactory(params) {
|
|
|
49
49
|
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
50
50
|
// smart ready
|
|
51
51
|
function smartReady() {
|
|
52
|
-
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
52
|
+
if (!readiness.isReady() && !storage.splits.usesSegments() && !storage.rbSegments.usesSegments())
|
|
53
53
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
54
54
|
}
|
|
55
|
-
if (!storage.splits.usesSegments())
|
|
55
|
+
if (!storage.splits.usesSegments() && !storage.rbSegments.usesSegments())
|
|
56
56
|
setTimeout(smartReady, 0);
|
|
57
57
|
else
|
|
58
58
|
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
@@ -66,7 +66,7 @@ function pollingManagerCSFactory(params) {
|
|
|
66
66
|
start: function () {
|
|
67
67
|
log.info(constants_2.POLLING_START);
|
|
68
68
|
splitsSyncTask.start();
|
|
69
|
-
if (storage.splits.usesSegments())
|
|
69
|
+
if (storage.splits.usesSegments() || storage.rbSegments.usesSegments())
|
|
70
70
|
startMySegmentsSyncTasks();
|
|
71
71
|
},
|
|
72
72
|
// Stop periodic fetching (polling)
|
|
@@ -8,6 +8,6 @@ var splitChangesUpdater_1 = require("../updaters/splitChangesUpdater");
|
|
|
8
8
|
* Creates a sync task that periodically executes a `splitChangesUpdater` task
|
|
9
9
|
*/
|
|
10
10
|
function splitsSyncTaskFactory(fetchSplitChanges, storage, readiness, settings, isClientSide) {
|
|
11
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, splitChangesUpdater_1.splitChangesUpdaterFactory)(settings.log, (0, splitChangesFetcher_1.splitChangesFetcherFactory)(fetchSplitChanges), storage, settings.sync.__splitFiltersValidation, readiness.splits, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, isClientSide), settings.scheduler.featuresRefreshRate, 'splitChangesUpdater');
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, splitChangesUpdater_1.splitChangesUpdaterFactory)(settings.log, (0, splitChangesFetcher_1.splitChangesFetcherFactory)(fetchSplitChanges, settings, storage), storage, settings.sync.__splitFiltersValidation, readiness.splits, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, isClientSide), settings.scheduler.featuresRefreshRate, 'splitChangesUpdater');
|
|
12
12
|
}
|
|
13
13
|
exports.splitsSyncTaskFactory = splitsSyncTaskFactory;
|
|
@@ -12,7 +12,7 @@ var constants_3 = require("../../streaming/constants");
|
|
|
12
12
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
13
13
|
*/
|
|
14
14
|
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
15
|
-
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
15
|
+
var splits = storage.splits, rbSegments = storage.rbSegments, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
16
16
|
var readyOnAlreadyExistentState = true;
|
|
17
17
|
var startingUp = true;
|
|
18
18
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -34,7 +34,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
34
34
|
shouldNotifyUpdate = largeSegments.resetSegments(segmentsData.ls || {}) || shouldNotifyUpdate;
|
|
35
35
|
}
|
|
36
36
|
// Notify update if required
|
|
37
|
-
if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
37
|
+
if ((splits.usesSegments() || rbSegments.usesSegments()) && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
38
38
|
readyOnAlreadyExistentState = false;
|
|
39
39
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
40
40
|
}
|
|
@@ -39,7 +39,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
39
39
|
* Returned promise will not be rejected.
|
|
40
40
|
*
|
|
41
41
|
* @param fetchOnlyNew - if true, only fetch the segments that not exists, i.e., which `changeNumber` is equal to -1.
|
|
42
|
-
* This param is used by SplitUpdateWorker on server-side SDK, to fetch new registered segments on SPLIT_UPDATE notifications.
|
|
42
|
+
* This param is used by SplitUpdateWorker on server-side SDK, to fetch new registered segments on SPLIT_UPDATE or RB_SEGMENT_UPDATE notifications.
|
|
43
43
|
* @param segmentName - segment name to fetch. By passing `undefined` it fetches the list of segments registered at the storage
|
|
44
44
|
* @param noCache - true to revalidate data to fetch on a SEGMENT_UPDATE notifications.
|
|
45
45
|
* @param till - till target for the provided segmentName, for CDN bypass.
|