@splitsoftware/splitio-commons 1.16.1-rc.8 → 1.17.0-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 +2 -1
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -3
- package/cjs/logger/messages/info.js +2 -1
- package/cjs/readiness/readinessManager.js +10 -14
- package/cjs/readiness/sdkReadinessManager.js +6 -5
- package/cjs/sdkClient/sdkClientMethodCS.js +2 -2
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +2 -2
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/decorateHeaders.js +43 -0
- package/cjs/services/splitApi.js +0 -4
- package/cjs/services/splitHttpClient.js +5 -4
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +6 -5
- package/cjs/storages/KeyBuilder.js +0 -3
- package/cjs/storages/KeyBuilderCS.js +5 -17
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
- package/cjs/storages/inLocalStorage/index.js +2 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -5
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +11 -20
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
- package/cjs/sync/polling/pollingManagerCS.js +33 -51
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -20
- package/cjs/sync/streaming/SSEClient/index.js +9 -12
- package/cjs/sync/streaming/SSEHandler/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
- package/cjs/sync/streaming/constants.js +1 -2
- package/cjs/sync/streaming/parseUtils.js +8 -3
- package/cjs/sync/streaming/pushManager.js +69 -100
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -4
- package/cjs/sync/syncManagerOnline.js +14 -24
- package/cjs/utils/constants/index.js +2 -4
- package/cjs/utils/settingsValidation/index.js +2 -7
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -0
- package/esm/logger/messages/info.js +2 -1
- package/esm/readiness/readinessManager.js +10 -14
- package/esm/readiness/sdkReadinessManager.js +6 -5
- package/esm/sdkClient/sdkClientMethodCS.js +2 -2
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +2 -2
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/decorateHeaders.js +39 -0
- package/esm/services/splitApi.js +1 -5
- package/esm/services/splitHttpClient.js +5 -4
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +4 -3
- package/esm/storages/KeyBuilder.js +0 -3
- package/esm/storages/KeyBuilderCS.js +4 -15
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
- package/esm/storages/inLocalStorage/index.js +3 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -5
- package/esm/storages/inMemory/SplitsCacheInMemory.js +12 -21
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
- package/esm/sync/polling/pollingManagerCS.js +34 -52
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +19 -18
- package/esm/sync/streaming/SSEClient/index.js +10 -13
- package/esm/sync/streaming/SSEHandler/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
- package/esm/sync/streaming/constants.js +0 -1
- package/esm/sync/streaming/parseUtils.js +8 -3
- package/esm/sync/streaming/pushManager.js +70 -100
- package/esm/sync/submitters/telemetrySubmitter.js +0 -4
- package/esm/sync/syncManagerOnline.js +15 -25
- package/esm/utils/constants/index.js +1 -3
- package/esm/utils/settingsValidation/index.js +2 -7
- package/package.json +1 -1
- package/src/dtos/types.ts +7 -17
- package/src/evaluator/matchers/index.ts +0 -2
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -0
- package/src/logger/messages/info.ts +2 -1
- package/src/readiness/readinessManager.ts +9 -13
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -3
- package/src/sdkClient/sdkClientMethodCS.ts +2 -2
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -2
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/decorateHeaders.ts +41 -0
- package/src/services/splitApi.ts +2 -7
- package/src/services/splitHttpClient.ts +6 -5
- package/src/services/types.ts +0 -1
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +5 -4
- package/src/storages/KeyBuilder.ts +0 -3
- package/src/storages/KeyBuilderCS.ts +5 -25
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
- package/src/storages/inLocalStorage/index.ts +4 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -5
- package/src/storages/inMemory/SplitsCacheInMemory.ts +10 -15
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +5 -7
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -6
- package/src/sync/polling/pollingManagerCS.ts +29 -61
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
- package/src/sync/polling/types.ts +3 -4
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +20 -17
- package/src/sync/streaming/SSEClient/index.ts +14 -20
- package/src/sync/streaming/SSEHandler/index.ts +1 -2
- package/src/sync/streaming/SSEHandler/types.ts +2 -14
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +10 -26
- 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 +0 -1
- package/src/sync/streaming/parseUtils.ts +10 -6
- package/src/sync/streaming/pushManager.ts +68 -104
- package/src/sync/streaming/types.ts +3 -5
- package/src/sync/submitters/telemetrySubmitter.ts +0 -4
- package/src/sync/submitters/types.ts +4 -11
- package/src/sync/syncManagerOnline.ts +11 -19
- package/src/types.ts +9 -28
- package/src/utils/constants/index.ts +1 -3
- package/src/utils/settingsValidation/index.ts +3 -8
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +6 -14
- package/types/logger/constants.d.ts +1 -0
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +3 -2
- package/types/readiness/types.d.ts +2 -3
- 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 +0 -1
- 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 -7
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -3
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +3 -4
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +3 -2
- package/types/sync/polling/types.d.ts +3 -10
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEClient/index.d.ts +2 -5
- package/types/sync/streaming/SSEHandler/types.d.ts +2 -13
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
- package/types/sync/streaming/constants.d.ts +0 -1
- package/types/sync/streaming/parseUtils.d.ts +4 -2
- package/types/sync/streaming/pushManager.d.ts +0 -2
- package/types/sync/streaming/types.d.ts +4 -5
- package/types/sync/submitters/types.d.ts +3 -10
- package/types/types.d.ts +11 -26
- package/types/utils/constants/index.d.ts +1 -3
- package/types/utils/settingsValidation/index.d.ts +0 -2
- package/types/utils/settingsValidation/types.d.ts +1 -1
- package/cjs/evaluator/matchers/large_segment.js +0 -16
- package/esm/evaluator/matchers/large_segment.js +0 -12
- package/src/evaluator/matchers/large_segment.ts +0 -18
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { decorateHeaders } from '../../../services/decorateHeaders';
|
|
2
|
+
import { isString } from '../../../utils/lang';
|
|
2
3
|
import { objectAssign } from '../../../utils/lang/objectAssign';
|
|
3
4
|
var ABLY_API_VERSION = '1.1';
|
|
4
5
|
var CONTROL_CHANNEL_REGEX = /^control_/;
|
|
@@ -29,22 +30,18 @@ var SSEClient = /** @class */ (function () {
|
|
|
29
30
|
* SSEClient constructor.
|
|
30
31
|
*
|
|
31
32
|
* @param settings Validated settings.
|
|
32
|
-
* @param useHeaders True to send metadata as headers or false to send as query params. If `true`, the provided EventSource must support headers.
|
|
33
33
|
* @param platform object containing environment-specific dependencies
|
|
34
34
|
* @throws 'EventSource API is not available.' if EventSource is not available.
|
|
35
35
|
*/
|
|
36
|
-
function SSEClient(settings,
|
|
36
|
+
function SSEClient(settings, _a) {
|
|
37
37
|
var getEventSource = _a.getEventSource, getOptions = _a.getOptions;
|
|
38
|
+
this.settings = settings;
|
|
38
39
|
this.eventSource = getEventSource && getEventSource(settings);
|
|
39
40
|
// if eventSource is not available, throw an exception
|
|
40
41
|
if (!this.eventSource)
|
|
41
42
|
throw new Error('EventSource API is not available.');
|
|
42
|
-
this.streamingUrl = settings.urls.streaming + '/sse';
|
|
43
|
-
// @TODO get `useHeaders` flag from `getEventSource`, to use EventSource headers on client-side SDKs when possible.
|
|
44
|
-
this.useHeaders = useHeaders;
|
|
45
43
|
this.headers = buildSSEHeaders(settings);
|
|
46
44
|
this.options = getOptions && getOptions(settings);
|
|
47
|
-
this.lse = settings.sync.largeSegmentsEnabled;
|
|
48
45
|
}
|
|
49
46
|
SSEClient.prototype.setEventHandler = function (handler) {
|
|
50
47
|
this.handler = handler;
|
|
@@ -56,21 +53,21 @@ var SSEClient = /** @class */ (function () {
|
|
|
56
53
|
* @throws {TypeError} Will throw an error if `authToken` is undefined
|
|
57
54
|
*/
|
|
58
55
|
SSEClient.prototype.open = function (authToken) {
|
|
59
|
-
var
|
|
56
|
+
var _a;
|
|
60
57
|
this.close(); // it closes connection if previously opened
|
|
61
58
|
var channelsQueryParam = Object.keys(authToken.channels).map(function (channel) {
|
|
62
59
|
var params = CONTROL_CHANNEL_REGEX.test(channel) ? '[?occupancy=metrics.publishers]' : '';
|
|
63
60
|
return encodeURIComponent(params + channel);
|
|
64
|
-
}).filter(function (channel) {
|
|
65
|
-
return _this.lse || !endsWith(channel, 'myLargeSegments');
|
|
66
61
|
}).join(',');
|
|
67
|
-
var url = this.
|
|
62
|
+
var url = this.settings.urls.streaming + "/sse?channels=" + channelsQueryParam + "&accessToken=" + authToken.token + "&v=" + ABLY_API_VERSION + "&heartbeats=true"; // same results using `&heartbeats=false`
|
|
63
|
+
// use headers in server-side or if getHeaderOverrides is defined
|
|
64
|
+
var useHeaders = !this.settings.core.key || ((_a = this.settings.sync.requestOptions) === null || _a === void 0 ? void 0 : _a.getHeaderOverrides);
|
|
68
65
|
this.connection = new this.eventSource(
|
|
69
66
|
// For client-side SDKs, SplitSDKClientKey and SplitSDKClientKey metadata is passed as query params,
|
|
70
67
|
// because native EventSource implementations for browser doesn't support headers.
|
|
71
|
-
|
|
68
|
+
useHeaders ? url : url + ("&SplitSDKVersion=" + this.headers.SplitSDKVersion + "&SplitSDKClientKey=" + this.headers.SplitSDKClientKey),
|
|
72
69
|
// For server-side SDKs, metadata is passed via headers. EventSource must support headers, like 'eventsource' package for Node.
|
|
73
|
-
objectAssign(
|
|
70
|
+
objectAssign(useHeaders ? { headers: decorateHeaders(this.settings, this.headers) } : {}, this.options));
|
|
74
71
|
if (this.handler) { // no need to check if SSEClient is used only by PushManager
|
|
75
72
|
this.connection.addEventListener('open', this.handler.handleOpen);
|
|
76
73
|
this.connection.addEventListener('message', this.handler.handleMessage);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { errorParser, messageParser } from './NotificationParser';
|
|
2
2
|
import { notificationKeeperFactory } from './NotificationKeeper';
|
|
3
|
-
import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE
|
|
3
|
+
import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE } from '../constants';
|
|
4
4
|
import { STREAMING_PARSING_ERROR_FAILS, ERROR_STREAMING_SSE, STREAMING_PARSING_MESSAGE_FAILS, STREAMING_NEW_MESSAGE } from '../../../logger/constants';
|
|
5
5
|
import { ABLY_ERROR, NON_REQUESTED, SSE_CONNECTION_ERROR } from '../../../utils/constants';
|
|
6
6
|
/**
|
|
@@ -73,7 +73,6 @@ export function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
73
73
|
case SPLIT_UPDATE:
|
|
74
74
|
case SEGMENT_UPDATE:
|
|
75
75
|
case MY_SEGMENTS_UPDATE_V2:
|
|
76
|
-
case MY_LARGE_SEGMENTS_UPDATE:
|
|
77
76
|
case SPLIT_KILL:
|
|
78
77
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
79
78
|
break;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { Backoff } from '../../../utils/Backoff';
|
|
2
|
+
import { MY_SEGMENT } from '../../../utils/constants';
|
|
2
3
|
/**
|
|
3
4
|
* MySegmentsUpdateWorker factory
|
|
4
5
|
*/
|
|
5
|
-
export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker
|
|
6
|
+
export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
6
7
|
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
7
8
|
var currentChangeNumber = -1;
|
|
8
9
|
var handleNewEvent = false;
|
|
9
10
|
var isHandlingEvent;
|
|
10
11
|
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
11
|
-
var _delay;
|
|
12
|
-
var _delayTimeoutID;
|
|
13
12
|
var backoff = new Backoff(__handleMySegmentsUpdateCall);
|
|
14
13
|
function __handleMySegmentsUpdateCall() {
|
|
15
14
|
isHandlingEvent = true;
|
|
@@ -17,20 +16,12 @@ export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, upd
|
|
|
17
16
|
handleNewEvent = false;
|
|
18
17
|
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
19
18
|
// fetch mySegments revalidating data if cached
|
|
20
|
-
|
|
21
|
-
new Promise(function (res) {
|
|
22
|
-
_delayTimeoutID = setTimeout(function () {
|
|
23
|
-
_delay = undefined;
|
|
24
|
-
mySegmentsSyncTask.execute(_segmentsData, true).then(res);
|
|
25
|
-
}, _delay);
|
|
26
|
-
}) :
|
|
27
|
-
mySegmentsSyncTask.execute(_segmentsData, true);
|
|
28
|
-
syncTask.then(function (result) {
|
|
19
|
+
mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
|
|
29
20
|
if (!isHandlingEvent)
|
|
30
21
|
return; // halt if `stop` has been called
|
|
31
22
|
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
32
23
|
if (_segmentsData)
|
|
33
|
-
telemetryTracker.trackUpdatesFromSSE(
|
|
24
|
+
telemetryTracker.trackUpdatesFromSSE(MY_SEGMENT);
|
|
34
25
|
currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
35
26
|
}
|
|
36
27
|
if (handleNewEvent) {
|
|
@@ -47,27 +38,22 @@ export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, upd
|
|
|
47
38
|
}
|
|
48
39
|
return {
|
|
49
40
|
/**
|
|
50
|
-
* Invoked by NotificationProcessor on
|
|
41
|
+
* Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
|
|
51
42
|
*
|
|
52
|
-
* @param changeNumber change number of the notification
|
|
53
|
-
* @param
|
|
54
|
-
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
43
|
+
* @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
|
|
44
|
+
* @param {SegmentsData | undefined} segmentsData might be undefined
|
|
55
45
|
*/
|
|
56
|
-
put: function (changeNumber, segmentsData
|
|
57
|
-
|
|
58
|
-
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber || _delay)
|
|
46
|
+
put: function (changeNumber, segmentsData) {
|
|
47
|
+
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
59
48
|
return;
|
|
60
49
|
maxChangeNumber = changeNumber;
|
|
61
50
|
handleNewEvent = true;
|
|
62
51
|
_segmentsData = segmentsData;
|
|
63
|
-
_delay = delay;
|
|
64
52
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
65
53
|
__handleMySegmentsUpdateCall();
|
|
66
54
|
backoff.reset();
|
|
67
55
|
},
|
|
68
56
|
stop: function () {
|
|
69
|
-
clearTimeout(_delayTimeoutID);
|
|
70
|
-
_delay = undefined;
|
|
71
57
|
isHandlingEvent = false;
|
|
72
58
|
backoff.reset();
|
|
73
59
|
}
|
|
@@ -27,7 +27,6 @@ export var MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
|
|
|
27
27
|
export var SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
28
28
|
export var SPLIT_KILL = 'SPLIT_KILL';
|
|
29
29
|
export var SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
30
|
-
export var MY_LARGE_SEGMENTS_UPDATE = 'MY_LARGE_SEGMENTS_UPDATE';
|
|
31
30
|
// Control-type push notifications, handled by NotificationKeeper
|
|
32
31
|
export var CONTROL = 'CONTROL';
|
|
33
32
|
export var OCCUPANCY = 'OCCUPANCY';
|
|
@@ -74,9 +74,14 @@ export function isInBitmap(bitmap, hash64hex) {
|
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Parse feature flags notifications for instant feature flag updates
|
|
77
|
+
*
|
|
78
|
+
* @param {ISplitUpdateData} data
|
|
79
|
+
* @returns {KeyList}
|
|
77
80
|
*/
|
|
78
81
|
export function parseFFUpdatePayload(compression, data) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
var avoidPrecisionLoss = false;
|
|
83
|
+
if (compression > 0)
|
|
84
|
+
return parseKeyList(data, compression, avoidPrecisionLoss);
|
|
85
|
+
else
|
|
86
|
+
return JSON.parse(decodeFromBase64(data));
|
|
82
87
|
}
|
|
@@ -8,21 +8,13 @@ import { authenticateFactory, hashUserKey } from './AuthClient';
|
|
|
8
8
|
import { forOwn } from '../../utils/lang';
|
|
9
9
|
import { SSEClient } from './SSEClient';
|
|
10
10
|
import { getMatching } from '../../utils/key';
|
|
11
|
-
import { MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, PUSH_NONRETRYABLE_ERROR, PUSH_SUBSYSTEM_DOWN, SECONDS_BEFORE_EXPIRATION, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, PUSH_RETRYABLE_ERROR, PUSH_SUBSYSTEM_UP, ControlType
|
|
11
|
+
import { MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, PUSH_NONRETRYABLE_ERROR, PUSH_SUBSYSTEM_DOWN, SECONDS_BEFORE_EXPIRATION, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, PUSH_RETRYABLE_ERROR, PUSH_SUBSYSTEM_UP, ControlType } from './constants';
|
|
12
12
|
import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, STREAMING_PARSING_SPLIT_UPDATE } from '../../logger/constants';
|
|
13
13
|
import { UpdateStrategy } from './SSEHandler/types';
|
|
14
14
|
import { isInBitmap, parseBitmap, parseFFUpdatePayload, parseKeyList } from './parseUtils';
|
|
15
15
|
import { _Set } from '../../utils/lang/sets';
|
|
16
|
-
import { hash } from '../../utils/murmur3/murmur3';
|
|
17
16
|
import { hash64 } from '../../utils/murmur3/murmur3_64';
|
|
18
|
-
import { TOKEN_REFRESH, AUTH_REJECTION
|
|
19
|
-
export function getDelay(parsedData, matchingKey) {
|
|
20
|
-
if (parsedData.h === 0)
|
|
21
|
-
return 0;
|
|
22
|
-
var interval = parsedData.i || 60000;
|
|
23
|
-
var seed = parsedData.s || 0;
|
|
24
|
-
return hash(matchingKey, seed) % interval;
|
|
25
|
-
}
|
|
17
|
+
import { TOKEN_REFRESH, AUTH_REJECTION } from '../../utils/constants';
|
|
26
18
|
/**
|
|
27
19
|
* PushManager factory:
|
|
28
20
|
* - for server-side if key is not provided in settings.
|
|
@@ -37,7 +29,7 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
37
29
|
var sseClient;
|
|
38
30
|
try {
|
|
39
31
|
// `useHeaders` false for client-side, even if the platform EventSource supports headers (e.g., React Native).
|
|
40
|
-
sseClient = new SSEClient(settings,
|
|
32
|
+
sseClient = new SSEClient(settings, platform);
|
|
41
33
|
}
|
|
42
34
|
catch (e) {
|
|
43
35
|
log.warn(STREAMING_FALLBACK, [e]);
|
|
@@ -148,9 +140,8 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
148
140
|
splitsUpdateWorker.stop();
|
|
149
141
|
if (userKey)
|
|
150
142
|
forOwn(clients, function (_a) {
|
|
151
|
-
var worker = _a.worker
|
|
152
|
-
worker.stop();
|
|
153
|
-
workerLarge && workerLarge.stop();
|
|
143
|
+
var worker = _a.worker;
|
|
144
|
+
return worker.stop();
|
|
154
145
|
});
|
|
155
146
|
else
|
|
156
147
|
segmentsUpdateWorker.stop();
|
|
@@ -204,83 +195,6 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
204
195
|
}
|
|
205
196
|
splitsUpdateWorker.put(parsedData);
|
|
206
197
|
});
|
|
207
|
-
function handleMySegmentsUpdate(parsedData) {
|
|
208
|
-
var isLS = parsedData.type === MY_LARGE_SEGMENTS_UPDATE;
|
|
209
|
-
switch (parsedData.u) {
|
|
210
|
-
case UpdateStrategy.BoundedFetchRequest: {
|
|
211
|
-
var bitmap_1;
|
|
212
|
-
try {
|
|
213
|
-
bitmap_1 = parseBitmap(parsedData.d, parsedData.c);
|
|
214
|
-
}
|
|
215
|
-
catch (e) {
|
|
216
|
-
log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
forOwn(clients, function (_a, matchingKey) {
|
|
220
|
-
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
221
|
-
if (isInBitmap(bitmap_1, hash64.hex)) {
|
|
222
|
-
isLS ?
|
|
223
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
224
|
-
worker.put(parsedData.changeNumber);
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
case UpdateStrategy.KeyList: {
|
|
230
|
-
var keyList = void 0, added_1, removed_1;
|
|
231
|
-
try {
|
|
232
|
-
keyList = parseKeyList(parsedData.d, parsedData.c);
|
|
233
|
-
added_1 = new _Set(keyList.a);
|
|
234
|
-
removed_1 = new _Set(keyList.r);
|
|
235
|
-
}
|
|
236
|
-
catch (e) {
|
|
237
|
-
log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
forOwn(clients, function (_a) {
|
|
241
|
-
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
242
|
-
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
243
|
-
if (add !== undefined) {
|
|
244
|
-
isLS ?
|
|
245
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, [{
|
|
246
|
-
name: parsedData.largeSegments[0],
|
|
247
|
-
add: add
|
|
248
|
-
}]) :
|
|
249
|
-
worker.put(parsedData.changeNumber, [{
|
|
250
|
-
name: parsedData.segmentName,
|
|
251
|
-
add: add
|
|
252
|
-
}]);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
case UpdateStrategy.SegmentRemoval:
|
|
258
|
-
if ((isLS && parsedData.largeSegments.length === 0) || (!isLS && !parsedData.segmentName)) {
|
|
259
|
-
log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
260
|
-
break;
|
|
261
|
-
}
|
|
262
|
-
forOwn(clients, function (_a) {
|
|
263
|
-
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
264
|
-
isLS ?
|
|
265
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, parsedData.largeSegments.map(function (largeSegment) { return ({
|
|
266
|
-
name: largeSegment,
|
|
267
|
-
add: false
|
|
268
|
-
}); })) :
|
|
269
|
-
worker.put(parsedData.changeNumber, [{
|
|
270
|
-
name: parsedData.segmentName,
|
|
271
|
-
add: false
|
|
272
|
-
}]);
|
|
273
|
-
});
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
277
|
-
forOwn(clients, function (_a, matchingKey) {
|
|
278
|
-
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
279
|
-
isLS ?
|
|
280
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
281
|
-
worker.put(parsedData.changeNumber);
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
198
|
if (userKey) {
|
|
285
199
|
pushEmitter.on(MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
|
|
286
200
|
var userKeyHash = channel.split('_')[2];
|
|
@@ -289,8 +203,68 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
289
203
|
clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
|
|
290
204
|
}
|
|
291
205
|
});
|
|
292
|
-
pushEmitter.on(MY_SEGMENTS_UPDATE_V2, handleMySegmentsUpdate)
|
|
293
|
-
|
|
206
|
+
pushEmitter.on(MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
|
|
207
|
+
switch (parsedData.u) {
|
|
208
|
+
case UpdateStrategy.BoundedFetchRequest: {
|
|
209
|
+
var bitmap_1;
|
|
210
|
+
try {
|
|
211
|
+
bitmap_1 = parseBitmap(parsedData.d, parsedData.c);
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
forOwn(clients, function (_a) {
|
|
218
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
219
|
+
if (isInBitmap(bitmap_1, hash64.hex)) {
|
|
220
|
+
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
case UpdateStrategy.KeyList: {
|
|
226
|
+
var keyList = void 0, added_1, removed_1;
|
|
227
|
+
try {
|
|
228
|
+
keyList = parseKeyList(parsedData.d, parsedData.c);
|
|
229
|
+
added_1 = new _Set(keyList.a);
|
|
230
|
+
removed_1 = new _Set(keyList.r);
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
forOwn(clients, function (_a) {
|
|
237
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
238
|
+
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
239
|
+
if (add !== undefined) {
|
|
240
|
+
worker.put(parsedData.changeNumber, {
|
|
241
|
+
name: parsedData.segmentName,
|
|
242
|
+
add: add
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
case UpdateStrategy.SegmentRemoval:
|
|
249
|
+
if (!parsedData.segmentName) {
|
|
250
|
+
log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
forOwn(clients, function (_a) {
|
|
254
|
+
var worker = _a.worker;
|
|
255
|
+
return worker.put(parsedData.changeNumber, {
|
|
256
|
+
name: parsedData.segmentName,
|
|
257
|
+
add: false
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
263
|
+
forOwn(clients, function (_a) {
|
|
264
|
+
var worker = _a.worker;
|
|
265
|
+
worker.put(parsedData.changeNumber);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
294
268
|
}
|
|
295
269
|
else {
|
|
296
270
|
pushEmitter.on(SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
@@ -313,7 +287,7 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
313
287
|
return;
|
|
314
288
|
disconnected = false;
|
|
315
289
|
if (userKey)
|
|
316
|
-
this.add(userKey, pollingManager.segmentsSyncTask
|
|
290
|
+
this.add(userKey, pollingManager.segmentsSyncTask); // client-side
|
|
317
291
|
else
|
|
318
292
|
setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
|
|
319
293
|
},
|
|
@@ -322,15 +296,11 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
322
296
|
return disconnected === false;
|
|
323
297
|
},
|
|
324
298
|
// [Only for client-side]
|
|
325
|
-
add: function (userKey, mySegmentsSyncTask
|
|
299
|
+
add: function (userKey, mySegmentsSyncTask) {
|
|
326
300
|
var hash = hashUserKey(userKey);
|
|
327
301
|
if (!userKeyHashes[hash]) {
|
|
328
302
|
userKeyHashes[hash] = userKey;
|
|
329
|
-
clients[userKey] = {
|
|
330
|
-
hash64: hash64(userKey),
|
|
331
|
-
worker: MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, MY_SEGMENT),
|
|
332
|
-
workerLarge: myLargeSegmentsSyncTask ? MySegmentsUpdateWorker(myLargeSegmentsSyncTask, telemetryTracker, MY_LARGE_SEGMENT) : undefined
|
|
333
|
-
};
|
|
303
|
+
clients[userKey] = { hash64: hash64(userKey), worker: MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) };
|
|
334
304
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
335
305
|
// Reconnects in case of a new client.
|
|
336
306
|
// Run in next event-loop cycle to save authentication calls
|
|
@@ -58,17 +58,13 @@ export function telemetryCacheConfigAdapter(telemetry, settings) {
|
|
|
58
58
|
pop: function () {
|
|
59
59
|
var urls = settings.urls, scheduler = settings.scheduler;
|
|
60
60
|
var isClientSide = settings.core.key !== undefined;
|
|
61
|
-
var largeSegmentsEnabled = isClientSide && settings.sync.largeSegmentsEnabled;
|
|
62
61
|
var _a = getTelemetryFlagSetsStats(settings.sync.__splitFiltersValidation), flagSetsTotal = _a.flagSetsTotal, flagSetsIgnored = _a.flagSetsIgnored;
|
|
63
62
|
return objectAssign(getTelemetryConfigStats(settings.mode, settings.storage.type), {
|
|
64
63
|
sE: settings.streamingEnabled,
|
|
65
|
-
lsE: largeSegmentsEnabled ? largeSegmentsEnabled : undefined,
|
|
66
|
-
wls: largeSegmentsEnabled ? settings.startup.waitForLargeSegments : undefined,
|
|
67
64
|
rR: {
|
|
68
65
|
sp: scheduler.featuresRefreshRate / 1000,
|
|
69
66
|
se: isClientSide ? undefined : scheduler.segmentsRefreshRate / 1000,
|
|
70
67
|
ms: isClientSide ? scheduler.segmentsRefreshRate / 1000 : undefined,
|
|
71
|
-
mls: largeSegmentsEnabled ? scheduler.largeSegmentsRefreshRate / 1000 : undefined,
|
|
72
68
|
im: scheduler.impressionsRefreshRate / 1000,
|
|
73
69
|
ev: scheduler.eventsPushRate / 1000,
|
|
74
70
|
te: scheduler.telemetryRefreshRate / 1000,
|
|
@@ -2,7 +2,7 @@ import { submitterManagerFactory } from './submitters/submitterManager';
|
|
|
2
2
|
import { PUSH_SUBSYSTEM_UP, PUSH_SUBSYSTEM_DOWN } from './streaming/constants';
|
|
3
3
|
import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '../logger/constants';
|
|
4
4
|
import { isConsentGranted } from '../consent';
|
|
5
|
-
import {
|
|
5
|
+
import { POLLING, STREAMING, SYNC_MODE_UPDATE } from '../utils/constants';
|
|
6
6
|
/**
|
|
7
7
|
* Online SyncManager factory.
|
|
8
8
|
* Can be used for server-side API, and client-side API with or without multiple clients.
|
|
@@ -114,53 +114,43 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
|
|
|
114
114
|
shared: function (matchingKey, readinessManager, storage) {
|
|
115
115
|
if (!pollingManager)
|
|
116
116
|
return;
|
|
117
|
-
var
|
|
117
|
+
var mySegmentsSyncTask = pollingManager.add(matchingKey, readinessManager, storage);
|
|
118
118
|
return {
|
|
119
|
-
isRunning:
|
|
119
|
+
isRunning: mySegmentsSyncTask.isRunning,
|
|
120
120
|
start: function () {
|
|
121
121
|
if (syncEnabled) {
|
|
122
122
|
if (pushManager) {
|
|
123
123
|
if (pollingManager.isRunning()) {
|
|
124
124
|
// if doing polling, we must start the periodic fetch of data
|
|
125
|
-
if (storage.splits.
|
|
126
|
-
|
|
127
|
-
if (mlsSyncTask && storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
128
|
-
mlsSyncTask.start();
|
|
125
|
+
if (storage.splits.usesSegments())
|
|
126
|
+
mySegmentsSyncTask.start();
|
|
129
127
|
}
|
|
130
128
|
else {
|
|
131
129
|
// if not polling, we must execute the sync task for the initial fetch
|
|
132
130
|
// of segments since `syncAll` was already executed when starting the main client
|
|
133
|
-
|
|
134
|
-
mlsSyncTask && mlsSyncTask.execute();
|
|
131
|
+
mySegmentsSyncTask.execute();
|
|
135
132
|
}
|
|
136
|
-
pushManager.add(matchingKey,
|
|
133
|
+
pushManager.add(matchingKey, mySegmentsSyncTask);
|
|
137
134
|
}
|
|
138
135
|
else {
|
|
139
|
-
if (storage.splits.
|
|
140
|
-
|
|
141
|
-
if (mlsSyncTask && storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
142
|
-
mlsSyncTask.start();
|
|
136
|
+
if (storage.splits.usesSegments())
|
|
137
|
+
mySegmentsSyncTask.start();
|
|
143
138
|
}
|
|
144
139
|
}
|
|
145
140
|
else {
|
|
146
|
-
if (!readinessManager.isReady())
|
|
147
|
-
|
|
148
|
-
mlsSyncTask && mlsSyncTask.execute();
|
|
149
|
-
}
|
|
141
|
+
if (!readinessManager.isReady())
|
|
142
|
+
mySegmentsSyncTask.execute();
|
|
150
143
|
}
|
|
151
144
|
},
|
|
152
145
|
stop: function () {
|
|
153
146
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
154
|
-
var
|
|
155
|
-
if (
|
|
156
|
-
var msSyncTask_1 = syncTasks.msSyncTask, mlsSyncTask_1 = syncTasks.mlsSyncTask;
|
|
147
|
+
var mySegmentsSyncTask = pollingManager.get(matchingKey);
|
|
148
|
+
if (mySegmentsSyncTask) {
|
|
157
149
|
// stop syncing
|
|
158
150
|
if (pushManager)
|
|
159
151
|
pushManager.remove(matchingKey);
|
|
160
|
-
if (
|
|
161
|
-
|
|
162
|
-
if (mlsSyncTask_1 && mlsSyncTask_1.isRunning())
|
|
163
|
-
mlsSyncTask_1.stop();
|
|
152
|
+
if (mySegmentsSyncTask.isRunning())
|
|
153
|
+
mySegmentsSyncTask.stop();
|
|
164
154
|
pollingManager.remove(matchingKey);
|
|
165
155
|
}
|
|
166
156
|
},
|
|
@@ -61,7 +61,6 @@ export var TELEMETRY = 'te';
|
|
|
61
61
|
export var TOKEN = 'to';
|
|
62
62
|
export var SEGMENT = 'se';
|
|
63
63
|
export var MY_SEGMENT = 'ms';
|
|
64
|
-
export var MY_LARGE_SEGMENT = 'mls';
|
|
65
64
|
export var TREATMENT = 't';
|
|
66
65
|
export var TREATMENTS = 'ts';
|
|
67
66
|
export var TREATMENT_WITH_CONFIG = 'tc';
|
|
@@ -87,7 +86,6 @@ export var NON_REQUESTED = 1;
|
|
|
87
86
|
export var DISABLED = 0;
|
|
88
87
|
export var ENABLED = 1;
|
|
89
88
|
export var PAUSED = 2;
|
|
90
|
-
export var FLAG_SPEC_VERSION = '1.
|
|
89
|
+
export var FLAG_SPEC_VERSION = '1.1';
|
|
91
90
|
// Matcher types
|
|
92
91
|
export var IN_SEGMENT = 'IN_SEGMENT';
|
|
93
|
-
export var IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -27,8 +27,6 @@ export var base = {
|
|
|
27
27
|
featuresRefreshRate: 60,
|
|
28
28
|
// fetch segments updates each 60 sec
|
|
29
29
|
segmentsRefreshRate: 60,
|
|
30
|
-
// fetch large segments updates each 60 sec
|
|
31
|
-
largeSegmentsRefreshRate: 60,
|
|
32
30
|
// publish telemetry stats each 3600 secs (1 hour)
|
|
33
31
|
telemetryRefreshRate: 3600,
|
|
34
32
|
// publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
|
|
@@ -74,8 +72,7 @@ export var base = {
|
|
|
74
72
|
impressionsMode: OPTIMIZED,
|
|
75
73
|
localhostMode: undefined,
|
|
76
74
|
enabled: true,
|
|
77
|
-
flagSpecVersion: FLAG_SPEC_VERSION
|
|
78
|
-
largeSegmentsEnabled: false
|
|
75
|
+
flagSpecVersion: FLAG_SPEC_VERSION
|
|
79
76
|
},
|
|
80
77
|
// Logger
|
|
81
78
|
log: undefined
|
|
@@ -114,7 +111,6 @@ export function settingsValidation(config, validationParams) {
|
|
|
114
111
|
var scheduler = withDefaults.scheduler, startup = withDefaults.startup;
|
|
115
112
|
scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
|
|
116
113
|
scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
|
|
117
|
-
scheduler.largeSegmentsRefreshRate = fromSecondsToMillis(scheduler.largeSegmentsRefreshRate);
|
|
118
114
|
scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
|
|
119
115
|
scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
|
|
120
116
|
scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
|
|
@@ -187,10 +183,9 @@ export function settingsValidation(config, validationParams) {
|
|
|
187
183
|
var splitFiltersValidation = validateSplitFilters(log, sync.splitFilters, withDefaults.mode);
|
|
188
184
|
sync.splitFilters = splitFiltersValidation.validFilters;
|
|
189
185
|
sync.__splitFiltersValidation = splitFiltersValidation;
|
|
190
|
-
// ensure a valid flag spec version
|
|
191
186
|
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : FLAG_SPEC_VERSION;
|
|
192
187
|
// ensure a valid user consent value
|
|
193
188
|
// @ts-ignore, modify readonly prop
|
|
194
|
-
withDefaults.userConsent = consent
|
|
189
|
+
withDefaults.userConsent = consent(withDefaults);
|
|
195
190
|
return withDefaults;
|
|
196
191
|
}
|
package/package.json
CHANGED
package/src/dtos/types.ts
CHANGED
|
@@ -61,11 +61,6 @@ interface IInSegmentMatcher extends ISplitMatcherBase {
|
|
|
61
61
|
userDefinedSegmentMatcherData: IInSegmentMatcherData
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
interface IInLargeSegmentMatcher extends ISplitMatcherBase {
|
|
65
|
-
matcherType: 'IN_LARGE_SEGMENT',
|
|
66
|
-
userDefinedSegmentMatcherData: IInSegmentMatcherData
|
|
67
|
-
}
|
|
68
|
-
|
|
69
64
|
interface IWhitelistMatcher extends ISplitMatcherBase {
|
|
70
65
|
matcherType: 'WHITELIST',
|
|
71
66
|
whitelistMatcherData: IWhitelistMatcherData
|
|
@@ -170,8 +165,7 @@ interface IInListSemverMatcher extends ISplitMatcherBase {
|
|
|
170
165
|
export type ISplitMatcher = IAllKeysMatcher | IInSegmentMatcher | IWhitelistMatcher | IEqualToMatcher | IGreaterThanOrEqualToMatcher |
|
|
171
166
|
ILessThanOrEqualToMatcher | IBetweenMatcher | IEqualToSetMatcher | IContainsAnyOfSetMatcher | IContainsAllOfSetMatcher | IPartOfSetMatcher |
|
|
172
167
|
IStartsWithMatcher | IEndsWithMatcher | IContainsStringMatcher | IInSplitTreatmentMatcher | IEqualToBooleanMatcher | IMatchesStringMatcher |
|
|
173
|
-
IEqualToSemverMatcher | IGreaterThanOrEqualToSemverMatcher | ILessThanOrEqualToSemverMatcher | IBetweenSemverMatcher | IInListSemverMatcher
|
|
174
|
-
IInLargeSegmentMatcher
|
|
168
|
+
IEqualToSemverMatcher | IGreaterThanOrEqualToSemverMatcher | ILessThanOrEqualToSemverMatcher | IBetweenSemverMatcher | IInListSemverMatcher
|
|
175
169
|
|
|
176
170
|
/** Split object */
|
|
177
171
|
export interface ISplitPartition {
|
|
@@ -224,18 +218,14 @@ export interface ISegmentChangesResponse {
|
|
|
224
218
|
till: number
|
|
225
219
|
}
|
|
226
220
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
id: string,
|
|
231
|
-
name: string
|
|
232
|
-
}[]
|
|
221
|
+
export interface IMySegmentsResponseItem {
|
|
222
|
+
id: string,
|
|
223
|
+
name: string
|
|
233
224
|
}
|
|
234
225
|
|
|
235
|
-
/** Interface of the parsed JSON response of `/
|
|
236
|
-
export interface
|
|
237
|
-
|
|
238
|
-
changeNumber: number
|
|
226
|
+
/** Interface of the parsed JSON response of `/mySegments/{userKey}` */
|
|
227
|
+
export interface IMySegmentsResponse {
|
|
228
|
+
mySegments: IMySegmentsResponseItem[]
|
|
239
229
|
}
|
|
240
230
|
|
|
241
231
|
/** Metadata internal type for storages */
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { allMatcherContext } from './all';
|
|
2
2
|
import { segmentMatcherContext } from './segment';
|
|
3
|
-
import { largeSegmentMatcherContext } from './large_segment';
|
|
4
3
|
import { whitelistMatcherContext } from './whitelist';
|
|
5
4
|
import { equalToMatcherContext } from './eq';
|
|
6
5
|
import { greaterThanEqualMatcherContext } from './gte';
|
|
@@ -49,7 +48,6 @@ const matchers = [
|
|
|
49
48
|
lessThanEqualToSemverMatcherContext, // LESS_THAN_OR_EQUAL_TO_SEMVER: 20
|
|
50
49
|
betweenSemverMatcherContext, // BETWEEN_SEMVER: 21
|
|
51
50
|
inListSemverMatcherContext, // IN_LIST_SEMVER: 22
|
|
52
|
-
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
53
51
|
];
|
|
54
52
|
|
|
55
53
|
/**
|
|
@@ -33,7 +33,7 @@ export function matchersTransform(matchers: ISplitMatcher[]): IMatcherDto[] {
|
|
|
33
33
|
let dataType = matcherDataTypes.STRING;
|
|
34
34
|
let value = undefined;
|
|
35
35
|
|
|
36
|
-
if (type === matcherTypes.IN_SEGMENT
|
|
36
|
+
if (type === matcherTypes.IN_SEGMENT) {
|
|
37
37
|
value = segmentTransform(userDefinedSegmentMatcherData as IInSegmentMatcherData);
|
|
38
38
|
} else if (type === matcherTypes.EQUAL_TO) {
|
|
39
39
|
value = numericTransform(unaryNumericMatcherData as IUnaryNumericMatcherData);
|