@splitsoftware/splitio-commons 1.17.0 → 1.17.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.txt +8 -0
- package/cjs/evaluator/matchers/index.js +3 -1
- package/cjs/evaluator/matchers/large_segment.js +16 -0
- package/cjs/evaluator/matchers/matcherTypes.js +1 -0
- package/cjs/evaluator/matchersTransform/index.js +4 -1
- package/cjs/evaluator/matchersTransform/segment.js +3 -1
- package/cjs/logger/constants.js +2 -2
- package/cjs/logger/messages/info.js +1 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/readiness/readinessManager.js +5 -6
- package/cjs/readiness/sdkReadinessManager.js +5 -6
- package/cjs/sdkClient/identity.js +7 -0
- package/cjs/sdkClient/sdkClient.js +5 -5
- package/cjs/sdkClient/sdkClientMethod.js +3 -1
- package/cjs/sdkClient/sdkClientMethodCS.js +9 -14
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +9 -14
- package/cjs/sdkFactory/index.js +6 -2
- package/cjs/services/splitApi.js +5 -5
- package/cjs/storages/AbstractSegmentsCacheSync.js +41 -12
- package/cjs/storages/AbstractSplitsCacheSync.js +2 -1
- package/cjs/storages/KeyBuilderCS.js +23 -5
- package/cjs/storages/dataLoader.js +1 -1
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
- package/cjs/storages/inLocalStorage/index.js +6 -2
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +8 -8
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +5 -8
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +1 -1
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +15 -21
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +3 -5
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +107 -48
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/parseUtils.js +14 -9
- package/cjs/sync/streaming/pushManager.js +69 -67
- package/cjs/utils/constants/index.js +5 -4
- package/cjs/utils/settingsValidation/index.js +2 -1
- package/esm/evaluator/matchers/index.js +3 -1
- package/esm/evaluator/matchers/large_segment.js +12 -0
- package/esm/evaluator/matchers/matcherTypes.js +1 -0
- package/esm/evaluator/matchersTransform/index.js +4 -1
- package/esm/evaluator/matchersTransform/segment.js +3 -1
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +1 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/readiness/readinessManager.js +5 -6
- package/esm/readiness/sdkReadinessManager.js +5 -6
- package/esm/sdkClient/identity.js +3 -0
- package/esm/sdkClient/sdkClient.js +5 -5
- package/esm/sdkClient/sdkClientMethod.js +3 -1
- package/esm/sdkClient/sdkClientMethodCS.js +7 -12
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +7 -12
- package/esm/sdkFactory/index.js +6 -2
- package/esm/services/splitApi.js +6 -6
- package/esm/storages/AbstractSegmentsCacheSync.js +41 -12
- package/esm/storages/AbstractSplitsCacheSync.js +3 -2
- package/esm/storages/KeyBuilderCS.js +21 -4
- package/esm/storages/dataLoader.js +1 -1
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
- package/esm/storages/inLocalStorage/index.js +7 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
- package/esm/storages/inMemory/SplitsCacheInMemory.js +8 -8
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +5 -8
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +1 -1
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +15 -21
- package/esm/sync/streaming/AuthClient/index.js +1 -1
- package/esm/sync/streaming/SSEHandler/index.js +4 -6
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +108 -49
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/parseUtils.js +12 -8
- package/esm/sync/streaming/pushManager.js +72 -70
- package/esm/utils/constants/index.js +3 -2
- package/esm/utils/settingsValidation/index.js +2 -1
- package/package.json +1 -1
- package/src/dtos/types.ts +21 -7
- package/src/evaluator/matchers/index.ts +2 -0
- package/src/evaluator/matchers/large_segment.ts +18 -0
- package/src/evaluator/matchers/matcherTypes.ts +1 -0
- package/src/evaluator/matchersTransform/index.ts +4 -1
- package/src/evaluator/matchersTransform/segment.ts +5 -3
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +1 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/readiness/readinessManager.ts +7 -5
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -2
- package/src/sdkClient/identity.ts +5 -0
- package/src/sdkClient/sdkClient.ts +5 -5
- package/src/sdkClient/sdkClientMethod.ts +4 -1
- package/src/sdkClient/sdkClientMethodCS.ts +7 -13
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +7 -13
- package/src/sdkFactory/index.ts +8 -4
- package/src/sdkFactory/types.ts +2 -1
- package/src/services/splitApi.ts +7 -7
- package/src/services/splitHttpClient.ts +1 -1
- package/src/services/types.ts +2 -2
- package/src/storages/AbstractSegmentsCacheSync.ts +53 -12
- package/src/storages/AbstractSplitsCacheSync.ts +4 -3
- package/src/storages/KeyBuilderCS.ts +34 -5
- package/src/storages/dataLoader.ts +1 -1
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +29 -59
- package/src/storages/inLocalStorage/index.ts +8 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +10 -44
- package/src/storages/inMemory/SplitsCacheInMemory.ts +7 -8
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +11 -7
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +8 -10
- package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
- package/src/sync/polling/fetchers/types.ts +3 -2
- package/src/sync/polling/pollingManagerCS.ts +4 -4
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +4 -5
- package/src/sync/polling/types.ts +7 -6
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +19 -22
- package/src/sync/streaming/AuthClient/index.ts +1 -1
- package/src/sync/streaming/SSEClient/index.ts +4 -6
- package/src/sync/streaming/SSEHandler/index.ts +5 -8
- package/src/sync/streaming/SSEHandler/types.ts +15 -15
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +116 -49
- 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 +2 -2
- package/src/sync/streaming/parseUtils.ts +19 -11
- package/src/sync/streaming/pushManager.ts +73 -72
- package/src/sync/streaming/types.ts +10 -10
- package/src/sync/submitters/types.ts +8 -5
- package/src/types.ts +7 -1
- package/src/utils/constants/index.ts +3 -2
- package/src/utils/settingsValidation/index.ts +3 -2
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +18 -7
- package/types/evaluator/matchersTransform/segment.d.ts +2 -2
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +2 -3
- package/types/readiness/types.d.ts +2 -2
- package/types/sdkClient/identity.d.ts +0 -4
- package/types/sdkClient/sdkClientMethod.d.ts +1 -1
- package/types/sdkFactory/types.d.ts +2 -1
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +2 -2
- package/types/storages/AbstractMySegmentsCacheSync.d.ts +39 -0
- package/types/storages/AbstractSegmentsCacheSync.d.ts +9 -11
- package/types/storages/AbstractSplitsCacheSync.d.ts +1 -1
- package/types/storages/KeyBuilderCS.d.ts +9 -2
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +4 -14
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +3 -9
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -1
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +7 -5
- 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 +2 -2
- package/types/sync/polling/types.d.ts +7 -4
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -3
- package/types/sync/streaming/SSEHandler/types.d.ts +16 -14
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +4 -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 +2 -2
- package/types/sync/streaming/parseUtils.d.ts +4 -5
- package/types/sync/streaming/types.d.ts +8 -8
- package/types/sync/submitters/types.d.ts +7 -4
- package/types/types.d.ts +7 -1
- package/types/utils/constants/index.d.ts +3 -2
- package/types/utils/settingsValidation/types.d.ts +1 -1
|
@@ -3,62 +3,121 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MySegmentsUpdateWorker = void 0;
|
|
4
4
|
var Backoff_1 = require("../../../utils/Backoff");
|
|
5
5
|
var constants_1 = require("../../../utils/constants");
|
|
6
|
+
var constants_2 = require("./constants");
|
|
7
|
+
var constants_3 = require("../constants");
|
|
6
8
|
/**
|
|
7
9
|
* MySegmentsUpdateWorker factory
|
|
8
10
|
*/
|
|
9
|
-
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
isHandlingEvent
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
11
|
+
function MySegmentsUpdateWorker(log, storage, mySegmentsSyncTask, telemetryTracker) {
|
|
12
|
+
var _a;
|
|
13
|
+
var _delay;
|
|
14
|
+
var _delayTimeoutID;
|
|
15
|
+
function createUpdateWorker(mySegmentsCache) {
|
|
16
|
+
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
17
|
+
var currentChangeNumber = -1;
|
|
18
|
+
var handleNewEvent = false;
|
|
19
|
+
var isHandlingEvent;
|
|
20
|
+
var cdnBypass;
|
|
21
|
+
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
22
|
+
var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
|
|
23
|
+
function __handleMySegmentsUpdateCall() {
|
|
24
|
+
isHandlingEvent = true;
|
|
25
|
+
if (maxChangeNumber > Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber())) {
|
|
26
|
+
handleNewEvent = false;
|
|
27
|
+
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
28
|
+
// fetch mySegments revalidating data if cached
|
|
29
|
+
var syncTask = _delay ?
|
|
30
|
+
new Promise(function (res) {
|
|
31
|
+
_delayTimeoutID = setTimeout(function () {
|
|
32
|
+
_delay = undefined;
|
|
33
|
+
mySegmentsSyncTask.execute(_segmentsData, true, cdnBypass ? maxChangeNumber : undefined).then(res);
|
|
34
|
+
}, _delay);
|
|
35
|
+
}) :
|
|
36
|
+
mySegmentsSyncTask.execute(_segmentsData, true, cdnBypass ? maxChangeNumber : undefined);
|
|
37
|
+
syncTask.then(function (result) {
|
|
38
|
+
if (!isHandlingEvent)
|
|
39
|
+
return; // halt if `stop` has been called
|
|
40
|
+
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, `mySegmentsCache.getChangeNumber` can be -1, since `/memberships` change number is optional
|
|
41
|
+
var storageChangeNumber = mySegmentsCache.getChangeNumber();
|
|
42
|
+
currentChangeNumber = storageChangeNumber > -1 ?
|
|
43
|
+
storageChangeNumber :
|
|
44
|
+
Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
45
|
+
}
|
|
46
|
+
if (handleNewEvent) {
|
|
47
|
+
__handleMySegmentsUpdateCall();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
if (_segmentsData)
|
|
51
|
+
telemetryTracker.trackUpdatesFromSSE(constants_1.MEMBERSHIPS);
|
|
52
|
+
var attempts = backoff.attempts + 1;
|
|
53
|
+
if (maxChangeNumber <= currentChangeNumber) {
|
|
54
|
+
log.debug("Refresh completed" + (cdnBypass ? ' bypassing the CDN' : '') + " in " + attempts + " attempts.");
|
|
55
|
+
isHandlingEvent = false;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (attempts < constants_2.FETCH_BACKOFF_MAX_RETRIES) {
|
|
59
|
+
backoff.scheduleCall();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (cdnBypass) {
|
|
63
|
+
log.debug("No changes fetched after " + attempts + " attempts with CDN bypassed.");
|
|
64
|
+
isHandlingEvent = false;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
backoff.reset();
|
|
68
|
+
cdnBypass = true;
|
|
69
|
+
__handleMySegmentsUpdateCall();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
isHandlingEvent = false;
|
|
76
|
+
}
|
|
40
77
|
}
|
|
78
|
+
return {
|
|
79
|
+
/**
|
|
80
|
+
* Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
|
|
81
|
+
*
|
|
82
|
+
* @param changeNumber change number of the notification
|
|
83
|
+
* @param segmentsData data for KeyList or SegmentRemoval instant updates
|
|
84
|
+
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
85
|
+
*/
|
|
86
|
+
put: function (mySegmentsData, payload, delay) {
|
|
87
|
+
var type = mySegmentsData.type, cn = mySegmentsData.cn;
|
|
88
|
+
// Discard event if it is outdated or there is a pending fetch request (_delay is set), but update target change number
|
|
89
|
+
if (cn <= Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber()) || cn <= maxChangeNumber)
|
|
90
|
+
return;
|
|
91
|
+
maxChangeNumber = cn;
|
|
92
|
+
if (_delay)
|
|
93
|
+
return;
|
|
94
|
+
handleNewEvent = true;
|
|
95
|
+
cdnBypass = false;
|
|
96
|
+
_segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
|
|
97
|
+
_delay = delay;
|
|
98
|
+
if (backoff.timeoutID || !isHandlingEvent)
|
|
99
|
+
__handleMySegmentsUpdateCall();
|
|
100
|
+
backoff.reset();
|
|
101
|
+
},
|
|
102
|
+
stop: function () {
|
|
103
|
+
clearTimeout(_delayTimeoutID);
|
|
104
|
+
_delay = undefined;
|
|
105
|
+
isHandlingEvent = false;
|
|
106
|
+
backoff.reset();
|
|
107
|
+
}
|
|
108
|
+
};
|
|
41
109
|
}
|
|
110
|
+
var updateWorkers = (_a = {},
|
|
111
|
+
_a[constants_3.MEMBERSHIPS_MS_UPDATE] = createUpdateWorker(storage.segments),
|
|
112
|
+
_a[constants_3.MEMBERSHIPS_LS_UPDATE] = createUpdateWorker(storage.largeSegments),
|
|
113
|
+
_a);
|
|
42
114
|
return {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
*
|
|
46
|
-
* @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
|
|
47
|
-
* @param {SegmentsData | undefined} segmentsData might be undefined
|
|
48
|
-
*/
|
|
49
|
-
put: function (changeNumber, segmentsData) {
|
|
50
|
-
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
51
|
-
return;
|
|
52
|
-
maxChangeNumber = changeNumber;
|
|
53
|
-
handleNewEvent = true;
|
|
54
|
-
_segmentsData = segmentsData;
|
|
55
|
-
if (backoff.timeoutID || !isHandlingEvent)
|
|
56
|
-
__handleMySegmentsUpdateCall();
|
|
57
|
-
backoff.reset();
|
|
115
|
+
put: function (mySegmentsData, payload, delay) {
|
|
116
|
+
updateWorkers[mySegmentsData.type].put(mySegmentsData, payload, delay);
|
|
58
117
|
},
|
|
59
118
|
stop: function () {
|
|
60
|
-
|
|
61
|
-
|
|
119
|
+
updateWorkers[constants_3.MEMBERSHIPS_MS_UPDATE].stop();
|
|
120
|
+
updateWorkers[constants_3.MEMBERSHIPS_LS_UPDATE].stop();
|
|
62
121
|
}
|
|
63
122
|
};
|
|
64
123
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIPS_LS_UPDATE = exports.MEMBERSHIPS_MS_UPDATE = 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,8 @@ 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.
|
|
28
|
+
exports.MEMBERSHIPS_MS_UPDATE = 'MEMBERSHIPS_MS_UPDATE';
|
|
29
|
+
exports.MEMBERSHIPS_LS_UPDATE = 'MEMBERSHIPS_LS_UPDATE';
|
|
30
30
|
exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
31
31
|
exports.SPLIT_KILL = 'SPLIT_KILL';
|
|
32
32
|
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;
|
|
@@ -48,10 +48,10 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
48
48
|
var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
|
|
49
49
|
// For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
|
|
50
50
|
var splitsUpdateWorker = (0, SplitsUpdateWorker_1.SplitsUpdateWorker)(log, storage.splits, pollingManager.splitsSyncTask, readiness.splits, telemetryTracker, userKey ? undefined : pollingManager.segmentsSyncTask);
|
|
51
|
-
// [Only for client-side] map of hashes to user keys, to dispatch
|
|
51
|
+
// [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
|
|
52
52
|
var userKeyHashes = {};
|
|
53
53
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
54
|
-
// Hash64 is used to process
|
|
54
|
+
// Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
55
55
|
var clients = {};
|
|
56
56
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
57
57
|
var connectForNewClient = false;
|
|
@@ -198,77 +198,76 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
198
198
|
}
|
|
199
199
|
splitsUpdateWorker.put(parsedData);
|
|
200
200
|
});
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
|
|
210
|
-
switch (parsedData.u) {
|
|
211
|
-
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
212
|
-
var bitmap_1;
|
|
213
|
-
try {
|
|
214
|
-
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
215
|
-
}
|
|
216
|
-
catch (e) {
|
|
217
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
218
|
-
break;
|
|
219
|
-
}
|
|
220
|
-
(0, lang_1.forOwn)(clients, function (_a) {
|
|
221
|
-
var hash64 = _a.hash64, worker = _a.worker;
|
|
222
|
-
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
223
|
-
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
return;
|
|
201
|
+
function handleMySegmentsUpdate(parsedData) {
|
|
202
|
+
switch (parsedData.u) {
|
|
203
|
+
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
204
|
+
var bitmap_1;
|
|
205
|
+
try {
|
|
206
|
+
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
227
207
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
232
|
-
added_1 = new sets_1._Set(keyList.a);
|
|
233
|
-
removed_1 = new sets_1._Set(keyList.r);
|
|
234
|
-
}
|
|
235
|
-
catch (e) {
|
|
236
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
237
|
-
break;
|
|
238
|
-
}
|
|
239
|
-
(0, lang_1.forOwn)(clients, function (_a) {
|
|
240
|
-
var hash64 = _a.hash64, worker = _a.worker;
|
|
241
|
-
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
242
|
-
if (add !== undefined) {
|
|
243
|
-
worker.put(parsedData.changeNumber, {
|
|
244
|
-
name: parsedData.segmentName,
|
|
245
|
-
add: add
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
return;
|
|
208
|
+
catch (e) {
|
|
209
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['BoundedFetchRequest', e]);
|
|
210
|
+
break;
|
|
250
211
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
212
|
+
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
213
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
214
|
+
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
215
|
+
worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
255
216
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
217
|
+
});
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
case types_1.UpdateStrategy.KeyList: {
|
|
221
|
+
var keyList = void 0, added_1, removed_1;
|
|
222
|
+
try {
|
|
223
|
+
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
224
|
+
added_1 = new sets_1._Set(keyList.a);
|
|
225
|
+
removed_1 = new sets_1._Set(keyList.r);
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
if (!parsedData.n || !parsedData.n.length) {
|
|
232
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', 'No segment name was provided']);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
236
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
237
|
+
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
238
|
+
if (add !== undefined) {
|
|
239
|
+
worker.put(parsedData, {
|
|
240
|
+
added: add ? [parsedData.n[0]] : [],
|
|
241
|
+
removed: add ? [] : [parsedData.n[0]]
|
|
261
242
|
});
|
|
262
|
-
}
|
|
263
|
-
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
264
246
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
247
|
+
case types_1.UpdateStrategy.SegmentRemoval:
|
|
248
|
+
if (!parsedData.n || !parsedData.n.length) {
|
|
249
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
253
|
+
var worker = _a.worker;
|
|
254
|
+
worker.put(parsedData, {
|
|
255
|
+
added: [],
|
|
256
|
+
removed: parsedData.n
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
262
|
+
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
263
|
+
var worker = _a.worker;
|
|
264
|
+
worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
270
265
|
});
|
|
271
266
|
}
|
|
267
|
+
if (userKey) {
|
|
268
|
+
pushEmitter.on(constants_1.MEMBERSHIPS_MS_UPDATE, handleMySegmentsUpdate);
|
|
269
|
+
pushEmitter.on(constants_1.MEMBERSHIPS_LS_UPDATE, handleMySegmentsUpdate);
|
|
270
|
+
}
|
|
272
271
|
else {
|
|
273
272
|
pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
274
273
|
}
|
|
@@ -303,7 +302,10 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
303
302
|
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
304
303
|
if (!userKeyHashes[hash]) {
|
|
305
304
|
userKeyHashes[hash] = userKey;
|
|
306
|
-
clients[userKey] = {
|
|
305
|
+
clients[userKey] = {
|
|
306
|
+
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
307
|
+
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
|
|
308
|
+
};
|
|
307
309
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
308
310
|
// Reconnects in case of a new client.
|
|
309
311
|
// Run in next event-loop cycle to save authentication calls
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
3
|
+
exports.MEMBERSHIPS = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
|
+
exports.IN_LARGE_SEGMENT = exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
5
5
|
// Special treatments
|
|
6
6
|
exports.CONTROL = 'control';
|
|
7
7
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -64,7 +64,7 @@ exports.EVENTS = 'ev';
|
|
|
64
64
|
exports.TELEMETRY = 'te';
|
|
65
65
|
exports.TOKEN = 'to';
|
|
66
66
|
exports.SEGMENT = 'se';
|
|
67
|
-
exports.
|
|
67
|
+
exports.MEMBERSHIPS = 'ms';
|
|
68
68
|
exports.TREATMENT = 't';
|
|
69
69
|
exports.TREATMENTS = 'ts';
|
|
70
70
|
exports.TREATMENT_WITH_CONFIG = 'tc';
|
|
@@ -90,6 +90,7 @@ exports.NON_REQUESTED = 1;
|
|
|
90
90
|
exports.DISABLED = 0;
|
|
91
91
|
exports.ENABLED = 1;
|
|
92
92
|
exports.PAUSED = 2;
|
|
93
|
-
exports.FLAG_SPEC_VERSION = '1.
|
|
93
|
+
exports.FLAG_SPEC_VERSION = '1.2';
|
|
94
94
|
// Matcher types
|
|
95
95
|
exports.IN_SEGMENT = 'IN_SEGMENT';
|
|
96
|
+
exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -186,10 +186,11 @@ function settingsValidation(config, validationParams) {
|
|
|
186
186
|
var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, sync.splitFilters, withDefaults.mode);
|
|
187
187
|
sync.splitFilters = splitFiltersValidation.validFilters;
|
|
188
188
|
sync.__splitFiltersValidation = splitFiltersValidation;
|
|
189
|
+
// ensure a valid flag spec version
|
|
189
190
|
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : constants_1.FLAG_SPEC_VERSION;
|
|
190
191
|
// ensure a valid user consent value
|
|
191
192
|
// @ts-ignore, modify readonly prop
|
|
192
|
-
withDefaults.userConsent = consent(withDefaults);
|
|
193
|
+
withDefaults.userConsent = consent ? consent(withDefaults) : undefined;
|
|
193
194
|
return withDefaults;
|
|
194
195
|
}
|
|
195
196
|
exports.settingsValidation = settingsValidation;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { allMatcherContext } from './all';
|
|
2
2
|
import { segmentMatcherContext } from './segment';
|
|
3
|
+
import { largeSegmentMatcherContext } from './large_segment';
|
|
3
4
|
import { whitelistMatcherContext } from './whitelist';
|
|
4
5
|
import { equalToMatcherContext } from './eq';
|
|
5
6
|
import { greaterThanEqualMatcherContext } from './gte';
|
|
@@ -43,7 +44,8 @@ var matchers = [
|
|
|
43
44
|
greaterThanEqualToSemverMatcherContext,
|
|
44
45
|
lessThanEqualToSemverMatcherContext,
|
|
45
46
|
betweenSemverMatcherContext,
|
|
46
|
-
inListSemverMatcherContext,
|
|
47
|
+
inListSemverMatcherContext,
|
|
48
|
+
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
47
49
|
];
|
|
48
50
|
/**
|
|
49
51
|
* Matcher factory.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { thenable } from '../../utils/promise/thenable';
|
|
2
|
+
export function largeSegmentMatcherContext(largeSegmentName, storage) {
|
|
3
|
+
return function largeSegmentMatcher(key) {
|
|
4
|
+
var isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;
|
|
5
|
+
if (thenable(isInLargeSegment)) {
|
|
6
|
+
isInLargeSegment.then(function (result) {
|
|
7
|
+
return result;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
return isInLargeSegment;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -9,7 +9,7 @@ import { zeroSinceHH, zeroSinceSS } from '../convertions';
|
|
|
9
9
|
*/
|
|
10
10
|
export function matchersTransform(matchers) {
|
|
11
11
|
var parsedMatchers = matchers.map(function (matcher) {
|
|
12
|
-
var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
|
|
12
|
+
var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, userDefinedLargeSegmentMatcherData = matcher.userDefinedLargeSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
|
|
13
13
|
var attribute = keySelector && keySelector.attribute;
|
|
14
14
|
var type = matcherTypesMapper(matcherType);
|
|
15
15
|
// As default input data type we use string (even for ALL_KEYS)
|
|
@@ -18,6 +18,9 @@ export function matchersTransform(matchers) {
|
|
|
18
18
|
if (type === matcherTypes.IN_SEGMENT) {
|
|
19
19
|
value = segmentTransform(userDefinedSegmentMatcherData);
|
|
20
20
|
}
|
|
21
|
+
else if (type === matcherTypes.IN_LARGE_SEGMENT) {
|
|
22
|
+
value = segmentTransform(userDefinedLargeSegmentMatcherData);
|
|
23
|
+
}
|
|
21
24
|
else if (type === matcherTypes.EQUAL_TO) {
|
|
22
25
|
value = numericTransform(unaryNumericMatcherData);
|
|
23
26
|
dataType = matcherDataTypes.NUMBER;
|
package/esm/logger/constants.js
CHANGED
|
@@ -77,7 +77,7 @@ export var WARN_SPLITS_FILTER_IGNORED = 219;
|
|
|
77
77
|
export var WARN_SPLITS_FILTER_INVALID = 220;
|
|
78
78
|
export var WARN_SPLITS_FILTER_EMPTY = 221;
|
|
79
79
|
export var WARN_SDK_KEY = 222;
|
|
80
|
-
export var
|
|
80
|
+
export var STREAMING_PARSING_MEMBERSHIPS_UPDATE = 223;
|
|
81
81
|
export var STREAMING_PARSING_SPLIT_UPDATE = 224;
|
|
82
82
|
export var WARN_INVALID_FLAGSET = 225;
|
|
83
83
|
export var WARN_LOWERCASE_FLAGSET = 226;
|
|
@@ -20,7 +20,7 @@ export var codesInfo = codesWarn.concat([
|
|
|
20
20
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
21
21
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
22
22
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
|
|
23
|
-
[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.'],
|
|
24
24
|
[c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
|
|
25
25
|
[c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
|
|
26
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_MEMBERSHIPS_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.'],
|
|
@@ -6,7 +6,7 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
6
6
|
splitsCacheLoaded: false,
|
|
7
7
|
});
|
|
8
8
|
// `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
|
|
9
|
-
// - `/
|
|
9
|
+
// - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
|
|
10
10
|
// - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
|
|
11
11
|
splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
|
|
12
12
|
splitsEventEmitter.splitsArrived = true; });
|
|
@@ -23,9 +23,9 @@ function segmentsEventEmitterFactory(EventEmitter) {
|
|
|
23
23
|
/**
|
|
24
24
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
25
25
|
*/
|
|
26
|
-
export function readinessManagerFactory(EventEmitter,
|
|
27
|
-
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
26
|
+
export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
28
27
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
28
|
+
var readyTimeout = settings.startup.readyTimeout;
|
|
29
29
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
30
30
|
var gate = new EventEmitter();
|
|
31
31
|
var lastUpdate = 0;
|
|
@@ -103,10 +103,9 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
103
103
|
splits: splits,
|
|
104
104
|
segments: segments,
|
|
105
105
|
gate: gate,
|
|
106
|
-
shared: function (
|
|
107
|
-
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
106
|
+
shared: function () {
|
|
108
107
|
refCount++;
|
|
109
|
-
return readinessManagerFactory(EventEmitter,
|
|
108
|
+
return readinessManagerFactory(EventEmitter, settings, splits);
|
|
110
109
|
},
|
|
111
110
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
112
111
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -12,9 +12,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
|
|
|
12
12
|
* @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
|
|
13
13
|
* @param readinessManager optional readinessManager to use. only used internally for `shared` method
|
|
14
14
|
*/
|
|
15
|
-
export function sdkReadinessManagerFactory(
|
|
16
|
-
if (
|
|
17
|
-
|
|
15
|
+
export function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
|
|
16
|
+
if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, settings); }
|
|
17
|
+
var log = settings.log;
|
|
18
18
|
/** Ready callback warning */
|
|
19
19
|
var internalReadyCbCount = 0;
|
|
20
20
|
var readyCbCount = 0;
|
|
@@ -57,9 +57,8 @@ export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, read
|
|
|
57
57
|
}
|
|
58
58
|
return {
|
|
59
59
|
readinessManager: readinessManager,
|
|
60
|
-
shared: function (
|
|
61
|
-
|
|
62
|
-
return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
|
|
60
|
+
shared: function () {
|
|
61
|
+
return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
|
|
63
62
|
},
|
|
64
63
|
incInternalReadyCbCount: function () {
|
|
65
64
|
internalReadyCbCount++;
|
|
@@ -50,11 +50,11 @@ export function sdkClientFactory(params, isSharedClient) {
|
|
|
50
50
|
// Stop background jobs
|
|
51
51
|
syncManager && syncManager.stop();
|
|
52
52
|
return __flush().then(function () {
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// For main client, cleanup event listeners and scheduled jobs
|
|
54
|
+
if (!isSharedClient) {
|
|
55
|
+
signalListener && signalListener.stop();
|
|
56
|
+
uniqueKeysTracker && uniqueKeysTracker.stop();
|
|
57
|
+
}
|
|
58
58
|
// Cleanup storage
|
|
59
59
|
return storage.destroy();
|
|
60
60
|
});
|