@splitsoftware/splitio-commons 1.16.1-rc.0 → 1.16.1-rc.10
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 +4 -0
- package/cjs/logger/constants.js +5 -4
- package/cjs/logger/messages/info.js +2 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/readiness/readinessManager.js +3 -9
- package/cjs/services/splitApi.js +4 -8
- package/cjs/storages/AbstractSegmentsCacheSync.js +1 -6
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +7 -5
- package/cjs/storages/KeyBuilder.js +0 -3
- package/cjs/storages/KeyBuilderCS.js +6 -0
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +23 -2
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +5 -1
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +6 -15
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +4 -7
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +30 -54
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +25 -27
- package/cjs/sync/streaming/SSEHandler/index.js +7 -8
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +18 -5
- package/cjs/sync/streaming/constants.js +2 -3
- package/cjs/sync/streaming/parseUtils.js +14 -9
- package/cjs/sync/streaming/pushManager.js +29 -53
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -2
- package/cjs/sync/syncManagerOnline.js +14 -24
- package/cjs/utils/constants/index.js +1 -1
- package/cjs/utils/settingsValidation/index.js +1 -5
- package/esm/logger/constants.js +2 -1
- package/esm/logger/messages/info.js +2 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/readiness/readinessManager.js +3 -9
- package/esm/services/splitApi.js +5 -9
- package/esm/storages/AbstractSegmentsCacheSync.js +1 -6
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +5 -3
- package/esm/storages/KeyBuilder.js +0 -3
- package/esm/storages/KeyBuilderCS.js +6 -0
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +23 -2
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +5 -1
- package/esm/storages/inMemory/SplitsCacheInMemory.js +7 -16
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +4 -7
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +31 -55
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +23 -25
- package/esm/sync/streaming/SSEHandler/index.js +8 -9
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +18 -5
- package/esm/sync/streaming/constants.js +1 -2
- package/esm/sync/streaming/parseUtils.js +12 -8
- package/esm/sync/streaming/pushManager.js +31 -54
- package/esm/sync/submitters/telemetrySubmitter.js +0 -2
- package/esm/sync/syncManagerOnline.js +15 -25
- package/esm/utils/constants/index.js +1 -1
- package/esm/utils/settingsValidation/index.js +1 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +14 -8
- package/src/logger/constants.ts +2 -1
- package/src/logger/messages/info.ts +2 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/readiness/readinessManager.ts +3 -7
- package/src/readiness/types.ts +0 -1
- package/src/services/splitApi.ts +6 -11
- package/src/services/splitHttpClient.ts +1 -1
- package/src/services/types.ts +2 -3
- package/src/storages/AbstractSegmentsCacheSync.ts +2 -6
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +6 -4
- package/src/storages/KeyBuilder.ts +0 -3
- package/src/storages/KeyBuilderCS.ts +9 -0
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +26 -2
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +7 -1
- package/src/storages/inMemory/SplitsCacheInMemory.ts +7 -13
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +6 -5
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +7 -10
- package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
- package/src/sync/polling/fetchers/types.ts +2 -2
- package/src/sync/polling/pollingManagerCS.ts +27 -62
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +11 -11
- package/src/sync/polling/types.ts +9 -8
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -24
- package/src/sync/streaming/SSEClient/index.ts +4 -6
- package/src/sync/streaming/SSEHandler/index.ts +11 -13
- package/src/sync/streaming/SSEHandler/types.ts +13 -25
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +21 -7
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
- package/src/sync/streaming/constants.ts +1 -2
- package/src/sync/streaming/parseUtils.ts +19 -11
- package/src/sync/streaming/pushManager.ts +37 -65
- package/src/sync/streaming/types.ts +9 -11
- package/src/sync/submitters/telemetrySubmitter.ts +0 -2
- package/src/sync/submitters/types.ts +1 -3
- package/src/sync/syncManagerOnline.ts +11 -19
- package/src/types.ts +1 -26
- package/src/utils/constants/index.ts +1 -1
- package/src/utils/settingsValidation/index.ts +1 -5
- package/types/dtos/types.d.ts +14 -7
- package/types/logger/constants.d.ts +2 -1
- package/types/readiness/types.d.ts +0 -1
- package/types/services/decorateHeaders.d.ts +2 -0
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +2 -3
- package/types/storages/AbstractSegmentsCacheSync.d.ts +2 -6
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +0 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -0
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +3 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +3 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -2
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +4 -4
- package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
- package/types/sync/polling/fetchers/types.d.ts +2 -2
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +4 -3
- package/types/sync/polling/types.d.ts +7 -13
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -2
- package/types/sync/streaming/SSEHandler/types.d.ts +13 -22
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -2
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +3 -2
- package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
- package/types/sync/streaming/constants.d.ts +1 -2
- package/types/sync/streaming/parseUtils.d.ts +4 -5
- package/types/sync/streaming/pushManager.d.ts +0 -2
- package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +9 -0
- package/types/sync/streaming/pushManager_Spec1_3.d.ts +9 -0
- package/types/sync/streaming/types.d.ts +8 -9
- package/types/sync/submitters/types.d.ts +1 -3
- package/types/types.d.ts +0 -25
- package/types/utils/constants/index.d.ts +1 -1
- package/types/utils/settingsValidation/index.d.ts +0 -2
|
@@ -7,7 +7,7 @@ var mySegmentsUpdater_1 = require("../updaters/mySegmentsUpdater");
|
|
|
7
7
|
/**
|
|
8
8
|
* Creates a sync task that periodically executes a `mySegmentsUpdater` task
|
|
9
9
|
*/
|
|
10
|
-
function mySegmentsSyncTaskFactory(
|
|
11
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(
|
|
10
|
+
function mySegmentsSyncTaskFactory(fetchMemberships, storage, readiness, settings, matchingKey) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMemberships), storage, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
12
12
|
}
|
|
13
13
|
exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mySegmentsUpdaterFactory = void 0;
|
|
4
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
5
|
-
var constants_1 = require("../../../
|
|
5
|
+
var constants_1 = require("../../../readiness/constants");
|
|
6
|
+
var constants_2 = require("../../../logger/constants");
|
|
6
7
|
/**
|
|
7
8
|
* factory of MySegments updater, a task that:
|
|
8
9
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
9
10
|
* - updates `mySegmentsCache`
|
|
10
11
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
11
12
|
*/
|
|
12
|
-
function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
13
|
+
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
14
|
+
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
13
15
|
var readyOnAlreadyExistentState = true;
|
|
14
16
|
var startingUp = true;
|
|
15
17
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -20,29 +22,31 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
20
22
|
}
|
|
21
23
|
// @TODO if allowing pluggable storages, handle async execution
|
|
22
24
|
function updateSegments(segmentsData) {
|
|
25
|
+
var _a, _b, _c, _d;
|
|
23
26
|
var shouldNotifyUpdate;
|
|
24
27
|
if (Array.isArray(segmentsData)) {
|
|
25
|
-
//
|
|
26
|
-
|
|
28
|
+
// Add/Delete the segment names
|
|
29
|
+
segmentsData.forEach(function (_a) {
|
|
30
|
+
var isLS = _a.isLS, name = _a.name, add = _a.add;
|
|
31
|
+
var cache = isLS ? largeSegments : segments;
|
|
32
|
+
if (cache.isInSegment(name) !== add) {
|
|
33
|
+
shouldNotifyUpdate = true;
|
|
34
|
+
if (add)
|
|
35
|
+
cache.addToSegment(name);
|
|
36
|
+
else
|
|
37
|
+
cache.removeFromSegment(name);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
27
40
|
}
|
|
28
41
|
else {
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
shouldNotifyUpdate = true;
|
|
33
|
-
if (add)
|
|
34
|
-
mySegmentsCache.addToSegment(name_1);
|
|
35
|
-
else
|
|
36
|
-
mySegmentsCache.removeFromSegment(name_1);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
shouldNotifyUpdate = false;
|
|
40
|
-
}
|
|
42
|
+
// Reset the list of segment names
|
|
43
|
+
shouldNotifyUpdate = segments.resetSegments((((_a = segmentsData.ms) === null || _a === void 0 ? void 0 : _a.k) || []).map(function (segment) { return segment.n; }), (_b = segmentsData.ms) === null || _b === void 0 ? void 0 : _b.cn);
|
|
44
|
+
shouldNotifyUpdate = largeSegments.resetSegments((((_c = segmentsData.ls) === null || _c === void 0 ? void 0 : _c.k) || []).map(function (segment) { return segment.n; }), (_d = segmentsData.ls) === null || _d === void 0 ? void 0 : _d.cn) || shouldNotifyUpdate;
|
|
41
45
|
}
|
|
42
46
|
// Notify update if required
|
|
43
|
-
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
47
|
+
if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
44
48
|
readyOnAlreadyExistentState = false;
|
|
45
|
-
|
|
49
|
+
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
52
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -59,7 +63,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
59
63
|
return updaterPromise.catch(function (error) {
|
|
60
64
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
61
65
|
retry += 1;
|
|
62
|
-
log.warn(
|
|
66
|
+
log.warn(constants_2.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
|
|
63
67
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
64
68
|
}
|
|
65
69
|
else {
|
|
@@ -78,14 +82,8 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
78
82
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
79
83
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
80
84
|
*/
|
|
81
|
-
return function mySegmentsUpdater(segmentsData, noCache
|
|
82
|
-
return
|
|
83
|
-
new Promise(function (res) {
|
|
84
|
-
setTimeout(function () {
|
|
85
|
-
_mySegmentsUpdater(0, segmentsData, noCache).then(res);
|
|
86
|
-
}, delay);
|
|
87
|
-
}) :
|
|
88
|
-
_mySegmentsUpdater(0, segmentsData, noCache);
|
|
85
|
+
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
86
|
+
return _mySegmentsUpdater(0, segmentsData, noCache);
|
|
89
87
|
};
|
|
90
88
|
}
|
|
91
89
|
exports.mySegmentsUpdaterFactory = mySegmentsUpdaterFactory;
|
|
@@ -68,20 +68,19 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
68
68
|
}
|
|
69
69
|
var parsedData = messageWithParsedData.parsedData, data = messageWithParsedData.data, channel = messageWithParsedData.channel, timestamp = messageWithParsedData.timestamp;
|
|
70
70
|
log.debug(constants_2.STREAMING_NEW_MESSAGE, [data]);
|
|
71
|
-
// we only handle update events if streaming is up
|
|
72
|
-
|
|
71
|
+
// we only handle update events if streaming is up
|
|
72
|
+
// @ts-expect-error
|
|
73
|
+
var type = parsedData.type || parsedData.t;
|
|
74
|
+
if (!notificationKeeper.isStreamingUp() && [constants_1.OCCUPANCY, constants_1.CONTROL].indexOf(type) === -1)
|
|
73
75
|
return;
|
|
74
|
-
switch (
|
|
76
|
+
switch (type) {
|
|
75
77
|
/* update events */
|
|
76
78
|
case constants_1.SPLIT_UPDATE:
|
|
77
79
|
case constants_1.SEGMENT_UPDATE:
|
|
78
|
-
case constants_1.
|
|
80
|
+
case constants_1.MY_SEGMENTS_UPDATE_V3:
|
|
79
81
|
case constants_1.MY_LARGE_SEGMENTS_UPDATE:
|
|
80
82
|
case constants_1.SPLIT_KILL:
|
|
81
|
-
pushEmitter.emit(
|
|
82
|
-
break;
|
|
83
|
-
case constants_1.MY_SEGMENTS_UPDATE:
|
|
84
|
-
pushEmitter.emit(parsedData.type, parsedData, channel);
|
|
83
|
+
pushEmitter.emit(type, parsedData);
|
|
85
84
|
break;
|
|
86
85
|
/* occupancy & control events, handled by NotificationManagerKeeper */
|
|
87
86
|
case constants_1.OCCUPANCY:
|
|
@@ -12,6 +12,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
12
12
|
var isHandlingEvent;
|
|
13
13
|
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
14
14
|
var _delay;
|
|
15
|
+
var _delayTimeoutID;
|
|
15
16
|
var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
|
|
16
17
|
function __handleMySegmentsUpdateCall() {
|
|
17
18
|
isHandlingEvent = true;
|
|
@@ -19,7 +20,15 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
19
20
|
handleNewEvent = false;
|
|
20
21
|
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
21
22
|
// fetch mySegments revalidating data if cached
|
|
22
|
-
|
|
23
|
+
var syncTask = _delay ?
|
|
24
|
+
new Promise(function (res) {
|
|
25
|
+
_delayTimeoutID = setTimeout(function () {
|
|
26
|
+
_delay = undefined;
|
|
27
|
+
mySegmentsSyncTask.execute(_segmentsData, true).then(res);
|
|
28
|
+
}, _delay);
|
|
29
|
+
}) :
|
|
30
|
+
mySegmentsSyncTask.execute(_segmentsData, true);
|
|
31
|
+
syncTask.then(function (result) {
|
|
23
32
|
if (!isHandlingEvent)
|
|
24
33
|
return; // halt if `stop` has been called
|
|
25
34
|
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
@@ -41,13 +50,15 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
41
50
|
}
|
|
42
51
|
return {
|
|
43
52
|
/**
|
|
44
|
-
* Invoked by NotificationProcessor on
|
|
53
|
+
* Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
|
|
45
54
|
*
|
|
46
|
-
* @param
|
|
47
|
-
* @param
|
|
55
|
+
* @param changeNumber change number of the notification
|
|
56
|
+
* @param segmentsData data for KeyList or SegmentRemoval instant updates
|
|
57
|
+
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
48
58
|
*/
|
|
49
59
|
put: function (changeNumber, segmentsData, delay) {
|
|
50
|
-
if
|
|
60
|
+
// Ignore event if it is outdated or if there is a pending fetch request (_delay is set)
|
|
61
|
+
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber || _delay)
|
|
51
62
|
return;
|
|
52
63
|
maxChangeNumber = changeNumber;
|
|
53
64
|
handleNewEvent = true;
|
|
@@ -58,6 +69,8 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
58
69
|
backoff.reset();
|
|
59
70
|
},
|
|
60
71
|
stop: function () {
|
|
72
|
+
clearTimeout(_delayTimeoutID);
|
|
73
|
+
_delay = undefined;
|
|
61
74
|
isHandlingEvent = false;
|
|
62
75
|
backoff.reset();
|
|
63
76
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.MY_LARGE_SEGMENTS_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.MY_LARGE_SEGMENTS_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MY_SEGMENTS_UPDATE_V3 = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
|
|
4
4
|
// time for refresh token
|
|
5
5
|
exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
6
6
|
// Internal SDK events, subscribed by SyncManager and PushManager
|
|
@@ -25,8 +25,7 @@ exports.PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
|
|
|
25
25
|
*/
|
|
26
26
|
exports.PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
|
|
27
27
|
// Update-type push notifications, handled by NotificationProcessor
|
|
28
|
-
exports.
|
|
29
|
-
exports.MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
|
|
28
|
+
exports.MY_SEGMENTS_UPDATE_V3 = 'MY_SEGMENTS_UPDATE_V3';
|
|
30
29
|
exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
31
30
|
exports.SPLIT_KILL = 'SPLIT_KILL';
|
|
32
31
|
exports.SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
|
|
3
|
+
exports.getDelay = exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
|
|
4
4
|
var decompress_1 = require("../../utils/decompress");
|
|
5
5
|
var base64_1 = require("../../utils/base64");
|
|
6
|
+
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
6
7
|
var GZIP = 1;
|
|
7
8
|
var ZLIB = 2;
|
|
8
9
|
function Uint8ArrayToString(myUint8Arr) {
|
|
@@ -80,15 +81,19 @@ function isInBitmap(bitmap, hash64hex) {
|
|
|
80
81
|
exports.isInBitmap = isInBitmap;
|
|
81
82
|
/**
|
|
82
83
|
* Parse feature flags notifications for instant feature flag updates
|
|
83
|
-
*
|
|
84
|
-
* @param {ISplitUpdateData} data
|
|
85
|
-
* @returns {KeyList}
|
|
86
84
|
*/
|
|
87
85
|
function parseFFUpdatePayload(compression, data) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
else
|
|
92
|
-
return JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
86
|
+
return compression > 0 ?
|
|
87
|
+
parseKeyList(data, compression, false) :
|
|
88
|
+
JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
93
89
|
}
|
|
94
90
|
exports.parseFFUpdatePayload = parseFFUpdatePayload;
|
|
91
|
+
var DEFAULT_MAX_INTERVAL = 60000;
|
|
92
|
+
function getDelay(parsedData, matchingKey) {
|
|
93
|
+
if (parsedData.h === 0)
|
|
94
|
+
return 0;
|
|
95
|
+
var interval = parsedData.i || DEFAULT_MAX_INTERVAL;
|
|
96
|
+
var seed = parsedData.s || 0;
|
|
97
|
+
return (0, murmur3_1.hash)(matchingKey, seed) % interval;
|
|
98
|
+
}
|
|
99
|
+
exports.getDelay = getDelay;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pushManagerFactory =
|
|
3
|
+
exports.pushManagerFactory = void 0;
|
|
4
4
|
var objectAssign_1 = require("../../utils/lang/objectAssign");
|
|
5
5
|
var Backoff_1 = require("../../utils/Backoff");
|
|
6
6
|
var SSEHandler_1 = require("./SSEHandler");
|
|
@@ -16,16 +16,8 @@ var constants_2 = require("../../logger/constants");
|
|
|
16
16
|
var types_1 = require("./SSEHandler/types");
|
|
17
17
|
var parseUtils_1 = require("./parseUtils");
|
|
18
18
|
var sets_1 = require("../../utils/lang/sets");
|
|
19
|
-
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
20
19
|
var murmur3_64_1 = require("../../utils/murmur3/murmur3_64");
|
|
21
20
|
var constants_3 = require("../../utils/constants");
|
|
22
|
-
function getDelay(parsedData, matchingKey) {
|
|
23
|
-
var interval = parsedData.i || 60000;
|
|
24
|
-
// const hashType = parsedData.h || 0;
|
|
25
|
-
var seed = parsedData.s || 0;
|
|
26
|
-
return (0, murmur3_1.hash)(matchingKey, seed) % interval;
|
|
27
|
-
}
|
|
28
|
-
exports.getDelay = getDelay;
|
|
29
21
|
/**
|
|
30
22
|
* PushManager factory:
|
|
31
23
|
* - for server-side if key is not provided in settings.
|
|
@@ -59,7 +51,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
59
51
|
// [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
|
|
60
52
|
var userKeyHashes = {};
|
|
61
53
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
62
|
-
// Hash64 is used to process
|
|
54
|
+
// Hash64 is used to process MY_SEGMENTS_UPDATE events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
63
55
|
var clients = {};
|
|
64
56
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
65
57
|
var connectForNewClient = false;
|
|
@@ -153,7 +145,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
153
145
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
154
146
|
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
155
147
|
worker.stop();
|
|
156
|
-
workerLarge
|
|
148
|
+
workerLarge.stop();
|
|
157
149
|
});
|
|
158
150
|
else
|
|
159
151
|
segmentsUpdateWorker.stop();
|
|
@@ -208,7 +200,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
208
200
|
splitsUpdateWorker.put(parsedData);
|
|
209
201
|
});
|
|
210
202
|
function handleMySegmentsUpdate(parsedData) {
|
|
211
|
-
var isLS = parsedData.
|
|
203
|
+
var isLS = parsedData.t === constants_1.MY_LARGE_SEGMENTS_UPDATE;
|
|
212
204
|
switch (parsedData.u) {
|
|
213
205
|
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
214
206
|
var bitmap_1;
|
|
@@ -216,15 +208,13 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
216
208
|
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
217
209
|
}
|
|
218
210
|
catch (e) {
|
|
219
|
-
log.warn(constants_2.
|
|
211
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE, ['BoundedFetchRequest', e]);
|
|
220
212
|
break;
|
|
221
213
|
}
|
|
222
214
|
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
223
215
|
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
224
216
|
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
225
|
-
isLS ?
|
|
226
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
227
|
-
worker.put(parsedData.changeNumber);
|
|
217
|
+
(isLS ? workerLarge : worker).put(parsedData.cn, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
228
218
|
}
|
|
229
219
|
});
|
|
230
220
|
return;
|
|
@@ -237,64 +227,50 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
237
227
|
removed_1 = new sets_1._Set(keyList.r);
|
|
238
228
|
}
|
|
239
229
|
catch (e) {
|
|
240
|
-
log.warn(constants_2.
|
|
230
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE, ['KeyList', e]);
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
if (!parsedData.n || !parsedData.n.length) {
|
|
234
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE, ['KeyList', 'No segment name was provided']);
|
|
241
235
|
break;
|
|
242
236
|
}
|
|
243
237
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
244
238
|
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
245
239
|
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
246
240
|
if (add !== undefined) {
|
|
247
|
-
isLS ?
|
|
248
|
-
|
|
249
|
-
name: parsedData.
|
|
250
|
-
add: add
|
|
251
|
-
})
|
|
252
|
-
worker.put(parsedData.changeNumber, {
|
|
253
|
-
name: parsedData.segmentName,
|
|
254
|
-
add: add
|
|
255
|
-
});
|
|
241
|
+
(isLS ? workerLarge : worker).put(parsedData.cn, [{
|
|
242
|
+
isLS: isLS,
|
|
243
|
+
name: parsedData.n[0],
|
|
244
|
+
add: add,
|
|
245
|
+
}]);
|
|
256
246
|
}
|
|
257
247
|
});
|
|
258
248
|
return;
|
|
259
249
|
}
|
|
260
250
|
case types_1.UpdateStrategy.SegmentRemoval:
|
|
261
|
-
if (
|
|
262
|
-
log.warn(constants_2.
|
|
251
|
+
if (!parsedData.n || !parsedData.n.length) {
|
|
252
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
|
|
263
253
|
break;
|
|
264
254
|
}
|
|
265
255
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
266
256
|
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
267
|
-
isLS ?
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}) :
|
|
274
|
-
worker.put(parsedData.changeNumber, {
|
|
275
|
-
name: parsedData.segmentName,
|
|
276
|
-
add: false
|
|
277
|
-
});
|
|
257
|
+
(isLS ? workerLarge : worker).put(parsedData.cn, parsedData.n.map(function (largeSegment) { return ({
|
|
258
|
+
isLS: isLS,
|
|
259
|
+
name: largeSegment,
|
|
260
|
+
add: false,
|
|
261
|
+
cn: parsedData.cn
|
|
262
|
+
}); }));
|
|
278
263
|
});
|
|
279
264
|
return;
|
|
280
265
|
}
|
|
281
266
|
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
282
267
|
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
283
268
|
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
284
|
-
isLS ?
|
|
285
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
286
|
-
worker.put(parsedData.changeNumber);
|
|
269
|
+
(isLS ? workerLarge : worker).put(parsedData.cn, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
287
270
|
});
|
|
288
271
|
}
|
|
289
272
|
if (userKey) {
|
|
290
|
-
pushEmitter.on(constants_1.
|
|
291
|
-
var userKeyHash = channel.split('_')[2];
|
|
292
|
-
var userKey = userKeyHashes[userKeyHash];
|
|
293
|
-
if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
|
|
294
|
-
clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
|
|
295
|
-
}
|
|
296
|
-
});
|
|
297
|
-
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, handleMySegmentsUpdate);
|
|
273
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V3, handleMySegmentsUpdate);
|
|
298
274
|
pushEmitter.on(constants_1.MY_LARGE_SEGMENTS_UPDATE, handleMySegmentsUpdate);
|
|
299
275
|
}
|
|
300
276
|
else {
|
|
@@ -318,7 +294,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
318
294
|
return;
|
|
319
295
|
disconnected = false;
|
|
320
296
|
if (userKey)
|
|
321
|
-
this.add(userKey, pollingManager.segmentsSyncTask
|
|
297
|
+
this.add(userKey, pollingManager.segmentsSyncTask); // client-side
|
|
322
298
|
else
|
|
323
299
|
setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
|
|
324
300
|
},
|
|
@@ -327,14 +303,14 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
327
303
|
return disconnected === false;
|
|
328
304
|
},
|
|
329
305
|
// [Only for client-side]
|
|
330
|
-
add: function (userKey, mySegmentsSyncTask
|
|
306
|
+
add: function (userKey, mySegmentsSyncTask) {
|
|
331
307
|
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
332
308
|
if (!userKeyHashes[hash]) {
|
|
333
309
|
userKeyHashes[hash] = userKey;
|
|
334
310
|
clients[userKey] = {
|
|
335
311
|
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
336
312
|
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker, constants_3.MY_SEGMENT),
|
|
337
|
-
workerLarge:
|
|
313
|
+
workerLarge: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker, constants_3.MY_LARGE_SEGMENT)
|
|
338
314
|
};
|
|
339
315
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
340
316
|
// Reconnects in case of a new client.
|
|
@@ -65,12 +65,10 @@ function telemetryCacheConfigAdapter(telemetry, settings) {
|
|
|
65
65
|
var _a = getTelemetryFlagSetsStats(settings.sync.__splitFiltersValidation), flagSetsTotal = _a.flagSetsTotal, flagSetsIgnored = _a.flagSetsIgnored;
|
|
66
66
|
return (0, objectAssign_1.objectAssign)(getTelemetryConfigStats(settings.mode, settings.storage.type), {
|
|
67
67
|
sE: settings.streamingEnabled,
|
|
68
|
-
lE: isClientSide ? settings.sync.largeSegmentsEnabled : undefined,
|
|
69
68
|
rR: {
|
|
70
69
|
sp: scheduler.featuresRefreshRate / 1000,
|
|
71
70
|
se: isClientSide ? undefined : scheduler.segmentsRefreshRate / 1000,
|
|
72
71
|
ms: isClientSide ? scheduler.segmentsRefreshRate / 1000 : undefined,
|
|
73
|
-
mls: isClientSide && settings.sync.largeSegmentsEnabled ? scheduler.largeSegmentsRefreshRate / 1000 : undefined,
|
|
74
72
|
im: scheduler.impressionsRefreshRate / 1000,
|
|
75
73
|
ev: scheduler.eventsPushRate / 1000,
|
|
76
74
|
te: scheduler.telemetryRefreshRate / 1000,
|
|
@@ -117,53 +117,43 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
117
117
|
shared: function (matchingKey, readinessManager, storage) {
|
|
118
118
|
if (!pollingManager)
|
|
119
119
|
return;
|
|
120
|
-
var
|
|
120
|
+
var mySegmentsSyncTask = pollingManager.add(matchingKey, readinessManager, storage);
|
|
121
121
|
return {
|
|
122
|
-
isRunning:
|
|
122
|
+
isRunning: mySegmentsSyncTask.isRunning,
|
|
123
123
|
start: function () {
|
|
124
124
|
if (syncEnabled) {
|
|
125
125
|
if (pushManager) {
|
|
126
126
|
if (pollingManager.isRunning()) {
|
|
127
127
|
// if doing polling, we must start the periodic fetch of data
|
|
128
|
-
if (storage.splits.
|
|
129
|
-
|
|
130
|
-
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
131
|
-
mlsSyncTask.start();
|
|
128
|
+
if (storage.splits.usesSegments())
|
|
129
|
+
mySegmentsSyncTask.start();
|
|
132
130
|
}
|
|
133
131
|
else {
|
|
134
132
|
// if not polling, we must execute the sync task for the initial fetch
|
|
135
133
|
// of segments since `syncAll` was already executed when starting the main client
|
|
136
|
-
|
|
137
|
-
mlsSyncTask && mlsSyncTask.execute();
|
|
134
|
+
mySegmentsSyncTask.execute();
|
|
138
135
|
}
|
|
139
|
-
pushManager.add(matchingKey,
|
|
136
|
+
pushManager.add(matchingKey, mySegmentsSyncTask);
|
|
140
137
|
}
|
|
141
138
|
else {
|
|
142
|
-
if (storage.splits.
|
|
143
|
-
|
|
144
|
-
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
145
|
-
mlsSyncTask.start();
|
|
139
|
+
if (storage.splits.usesSegments())
|
|
140
|
+
mySegmentsSyncTask.start();
|
|
146
141
|
}
|
|
147
142
|
}
|
|
148
143
|
else {
|
|
149
|
-
if (!readinessManager.isReady())
|
|
150
|
-
|
|
151
|
-
mlsSyncTask && mlsSyncTask.execute();
|
|
152
|
-
}
|
|
144
|
+
if (!readinessManager.isReady())
|
|
145
|
+
mySegmentsSyncTask.execute();
|
|
153
146
|
}
|
|
154
147
|
},
|
|
155
148
|
stop: function () {
|
|
156
149
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
157
|
-
var
|
|
158
|
-
if (
|
|
159
|
-
var msSyncTask_1 = syncTasks.msSyncTask, mlsSyncTask_1 = syncTasks.mlsSyncTask;
|
|
150
|
+
var mySegmentsSyncTask = pollingManager.get(matchingKey);
|
|
151
|
+
if (mySegmentsSyncTask) {
|
|
160
152
|
// stop syncing
|
|
161
153
|
if (pushManager)
|
|
162
154
|
pushManager.remove(matchingKey);
|
|
163
|
-
if (
|
|
164
|
-
|
|
165
|
-
if (mlsSyncTask_1 && mlsSyncTask_1.isRunning())
|
|
166
|
-
mlsSyncTask_1.stop();
|
|
155
|
+
if (mySegmentsSyncTask.isRunning())
|
|
156
|
+
mySegmentsSyncTask.stop();
|
|
167
157
|
pollingManager.remove(matchingKey);
|
|
168
158
|
}
|
|
169
159
|
},
|
|
@@ -91,7 +91,7 @@ exports.NON_REQUESTED = 1;
|
|
|
91
91
|
exports.DISABLED = 0;
|
|
92
92
|
exports.ENABLED = 1;
|
|
93
93
|
exports.PAUSED = 2;
|
|
94
|
-
exports.FLAG_SPEC_VERSION = '1.
|
|
94
|
+
exports.FLAG_SPEC_VERSION = '1.2';
|
|
95
95
|
// Matcher types
|
|
96
96
|
exports.IN_SEGMENT = 'IN_SEGMENT';
|
|
97
97
|
exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -30,8 +30,6 @@ exports.base = {
|
|
|
30
30
|
featuresRefreshRate: 60,
|
|
31
31
|
// fetch segments updates each 60 sec
|
|
32
32
|
segmentsRefreshRate: 60,
|
|
33
|
-
// fetch large segments updates each 60 sec
|
|
34
|
-
largeSegmentsRefreshRate: 60,
|
|
35
33
|
// publish telemetry stats each 3600 secs (1 hour)
|
|
36
34
|
telemetryRefreshRate: 3600,
|
|
37
35
|
// publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
|
|
@@ -77,8 +75,7 @@ exports.base = {
|
|
|
77
75
|
impressionsMode: constants_1.OPTIMIZED,
|
|
78
76
|
localhostMode: undefined,
|
|
79
77
|
enabled: true,
|
|
80
|
-
flagSpecVersion: constants_1.FLAG_SPEC_VERSION
|
|
81
|
-
largeSegmentsEnabled: false
|
|
78
|
+
flagSpecVersion: constants_1.FLAG_SPEC_VERSION
|
|
82
79
|
},
|
|
83
80
|
// Logger
|
|
84
81
|
log: undefined
|
|
@@ -117,7 +114,6 @@ function settingsValidation(config, validationParams) {
|
|
|
117
114
|
var scheduler = withDefaults.scheduler, startup = withDefaults.startup;
|
|
118
115
|
scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
|
|
119
116
|
scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
|
|
120
|
-
scheduler.largeSegmentsRefreshRate = fromSecondsToMillis(scheduler.largeSegmentsRefreshRate);
|
|
121
117
|
scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
|
|
122
118
|
scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
|
|
123
119
|
scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
|
package/esm/logger/constants.js
CHANGED
|
@@ -35,6 +35,7 @@ export var IMPRESSION = 102;
|
|
|
35
35
|
export var IMPRESSION_QUEUEING = 103;
|
|
36
36
|
export var NEW_SHARED_CLIENT = 104;
|
|
37
37
|
export var NEW_FACTORY = 105;
|
|
38
|
+
export var POLLING_SMART_PAUSING = 106;
|
|
38
39
|
export var POLLING_START = 107;
|
|
39
40
|
export var POLLING_STOP = 108;
|
|
40
41
|
export var SYNC_SPLITS_FETCH_RETRY = 109;
|
|
@@ -76,7 +77,7 @@ export var WARN_SPLITS_FILTER_IGNORED = 219;
|
|
|
76
77
|
export var WARN_SPLITS_FILTER_INVALID = 220;
|
|
77
78
|
export var WARN_SPLITS_FILTER_EMPTY = 221;
|
|
78
79
|
export var WARN_SDK_KEY = 222;
|
|
79
|
-
export var
|
|
80
|
+
export var STREAMING_PARSING_MY_SEGMENTS_UPDATE = 223;
|
|
80
81
|
export var STREAMING_PARSING_SPLIT_UPDATE = 224;
|
|
81
82
|
export var WARN_INVALID_FLAGSET = 225;
|
|
82
83
|
export var WARN_LOWERCASE_FLAGSET = 226;
|
|
@@ -16,10 +16,11 @@ export var codesInfo = codesWarn.concat([
|
|
|
16
16
|
[c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
|
|
17
17
|
[c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
|
|
18
18
|
// synchronizer
|
|
19
|
+
[c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
|
|
19
20
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
20
21
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
21
22
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
|
|
22
|
-
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and
|
|
23
|
+
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and resetting timer.'],
|
|
23
24
|
[c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
|
|
24
25
|
[c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
|
|
25
26
|
[c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
|
|
@@ -30,7 +30,7 @@ export var codesWarn = codesError.concat([
|
|
|
30
30
|
[c.WARN_SPLITS_FILTER_INVALID, c.LOG_PREFIX_SETTINGS + ': feature flag filter at position %s is invalid. It must be an object with a valid filter type ("bySet", "byName" or "byPrefix") and a list of "values".'],
|
|
31
31
|
[c.WARN_SPLITS_FILTER_EMPTY, c.LOG_PREFIX_SETTINGS + ': feature flag filter configuration must be a non-empty array of filter objects.'],
|
|
32
32
|
[c.WARN_SDK_KEY, c.LOG_PREFIX_SETTINGS + ': You already have %s. We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing it throughout your application'],
|
|
33
|
-
[c.
|
|
33
|
+
[c.STREAMING_PARSING_MY_SEGMENTS_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
|
|
34
34
|
[c.STREAMING_PARSING_SPLIT_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching SplitChanges due to an error processing SPLIT_UPDATE notification: %s'],
|
|
35
35
|
[c.WARN_INVALID_FLAGSET, '%s: you passed %s, flag set must adhere to the regular expressions %s. This means a flag set must start with a letter or number, be in lowercase, alphanumeric and have a max length of 50 characters. %s was discarded.'],
|
|
36
36
|
[c.WARN_LOWERCASE_FLAGSET, '%s: flag set %s should be all lowercase - converting string to lowercase.'],
|