@splitsoftware/splitio-commons 1.16.1-rc.11 → 1.16.1-rc.12
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/cjs/logger/constants.js +2 -2
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/services/splitApi.js +2 -2
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +6 -5
- package/cjs/sync/streaming/SSEHandler/index.js +2 -2
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +104 -63
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/pushManager.js +17 -20
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/services/splitApi.js +2 -2
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +7 -6
- package/esm/sync/streaming/SSEHandler/index.js +3 -3
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +104 -63
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/pushManager.js +19 -22
- package/package.json +1 -1
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/services/splitApi.ts +2 -2
- package/src/services/types.ts +1 -1
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +1 -1
- package/src/storages/types.ts +1 -1
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
- package/src/sync/polling/fetchers/types.ts +1 -0
- package/src/sync/polling/types.ts +3 -3
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +8 -7
- package/src/sync/streaming/SSEHandler/index.ts +3 -3
- package/src/sync/streaming/SSEHandler/types.ts +3 -3
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +112 -64
- package/src/sync/streaming/constants.ts +2 -2
- package/src/sync/streaming/pushManager.ts +19 -25
- package/src/sync/streaming/types.ts +5 -5
- package/src/sync/submitters/types.ts +1 -1
- package/types/logger/constants.d.ts +1 -1
- package/types/services/types.d.ts +1 -1
- package/types/storages/types.d.ts +1 -1
- package/types/sync/polling/fetchers/types.d.ts +1 -1
- package/types/sync/polling/types.d.ts +3 -3
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
- package/types/sync/streaming/SSEHandler/types.d.ts +3 -3
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +3 -1
- package/types/sync/streaming/constants.d.ts +2 -2
- package/types/sync/streaming/types.d.ts +4 -4
- package/types/sync/submitters/types.d.ts +1 -1
package/cjs/logger/constants.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.POLLING_SMART_PAUSING = exports.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.ENGINE_MATCHER_RESULT = exports.SETTINGS_SPLITS_FILTER = exports.SYNC_TASK_STOP = exports.SYNC_TASK_EXECUTE = exports.SYNC_TASK_START = exports.STREAMING_NEW_MESSAGE = exports.SYNC_SPLITS_SEGMENTS = exports.SYNC_SPLITS_REMOVED = exports.SYNC_SPLITS_NEW = exports.SYNC_SPLITS_FETCH = exports.SYNC_OFFLINE_DATA = exports.RETRIEVE_MANAGER = exports.RETRIEVE_CLIENT_EXISTING = exports.RETRIEVE_CLIENT_DEFAULT = exports.CLEANUP_DEREGISTERING = exports.CLEANUP_REGISTERING = exports.ENGINE_SANITIZE = exports.ENGINE_VALUE = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
|
|
4
|
-
exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.
|
|
4
|
+
exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.STREAMING_PARSING_MEMBERSHIPS_UPDATE = exports.WARN_SDK_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER = exports.ENGINE_VALUE_NO_ATTRIBUTES = void 0;
|
|
5
5
|
exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_CLIENT_INSTANTIATION = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ENGINE_MATCHER_ERROR = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP = void 0;
|
|
6
6
|
/**
|
|
7
7
|
* Message codes used to trim string log messages from commons and client-side API modules,
|
|
@@ -82,7 +82,7 @@ exports.WARN_SPLITS_FILTER_IGNORED = 219;
|
|
|
82
82
|
exports.WARN_SPLITS_FILTER_INVALID = 220;
|
|
83
83
|
exports.WARN_SPLITS_FILTER_EMPTY = 221;
|
|
84
84
|
exports.WARN_SDK_KEY = 222;
|
|
85
|
-
exports.
|
|
85
|
+
exports.STREAMING_PARSING_MEMBERSHIPS_UPDATE = 223;
|
|
86
86
|
exports.STREAMING_PARSING_SPLIT_UPDATE = 224;
|
|
87
87
|
exports.WARN_INVALID_FLAGSET = 225;
|
|
88
88
|
exports.WARN_LOWERCASE_FLAGSET = 226;
|
|
@@ -34,7 +34,7 @@ exports.codesWarn = error_1.codesError.concat([
|
|
|
34
34
|
[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".'],
|
|
35
35
|
[c.WARN_SPLITS_FILTER_EMPTY, c.LOG_PREFIX_SETTINGS + ': feature flag filter configuration must be a non-empty array of filter objects.'],
|
|
36
36
|
[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'],
|
|
37
|
-
[c.
|
|
37
|
+
[c.STREAMING_PARSING_MEMBERSHIPS_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
|
|
38
38
|
[c.STREAMING_PARSING_SPLIT_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching SplitChanges due to an error processing SPLIT_UPDATE notification: %s'],
|
|
39
39
|
[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.'],
|
|
40
40
|
[c.WARN_LOWERCASE_FLAGSET, '%s: flag set %s should be all lowercase - converting string to lowercase.'],
|
package/cjs/services/splitApi.js
CHANGED
|
@@ -54,14 +54,14 @@ function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
54
54
|
var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : '');
|
|
55
55
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SEGMENT));
|
|
56
56
|
},
|
|
57
|
-
fetchMemberships: function (userMatchingKey, noCache) {
|
|
57
|
+
fetchMemberships: function (userMatchingKey, noCache, till) {
|
|
58
58
|
/**
|
|
59
59
|
* URI encoding of user keys in order to:
|
|
60
60
|
* - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%'
|
|
61
61
|
* - avoid 404 responses. E.g.: '/api/memberships/foo/bar'
|
|
62
62
|
* - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
|
|
63
63
|
*/
|
|
64
|
-
var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey);
|
|
64
|
+
var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey) + (till ? '?till=' + till : '');
|
|
65
65
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MEMBERSHIPS));
|
|
66
66
|
},
|
|
67
67
|
/**
|
|
@@ -62,7 +62,7 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
62
62
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
63
63
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
64
64
|
skC: this.segments && this.segments.getKeysCount(),
|
|
65
|
-
|
|
65
|
+
lsC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
|
|
66
66
|
lskC: this.largeSegments && this.largeSegments.getKeysCount(),
|
|
67
67
|
sL: this.getSessionLength(),
|
|
68
68
|
eQ: this.getEventStats(constants_1.QUEUED),
|
|
@@ -6,10 +6,10 @@ exports.mySegmentsFetcherFactory = void 0;
|
|
|
6
6
|
* MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
|
|
7
7
|
*/
|
|
8
8
|
function mySegmentsFetcherFactory(fetchMemberships) {
|
|
9
|
-
return function mySegmentsFetcher(userMatchingKey, noCache,
|
|
9
|
+
return function mySegmentsFetcher(userMatchingKey, noCache, till,
|
|
10
10
|
// Optional decorator for `fetchMemberships` promise, such as timeout or time tracker
|
|
11
11
|
decorator) {
|
|
12
|
-
var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache);
|
|
12
|
+
var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache, till);
|
|
13
13
|
if (decorator)
|
|
14
14
|
mySegmentsPromise = decorator(mySegmentsPromise);
|
|
15
15
|
return mySegmentsPromise.then(function (resp) { return resp.json(); });
|
|
@@ -25,7 +25,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
25
25
|
function updateSegments(segmentsData) {
|
|
26
26
|
var shouldNotifyUpdate;
|
|
27
27
|
if (segmentsData.type !== undefined) {
|
|
28
|
-
shouldNotifyUpdate = segmentsData.type === constants_3.
|
|
28
|
+
shouldNotifyUpdate = segmentsData.type === constants_3.MEMBERSHIPS_LS_UPDATE ?
|
|
29
29
|
largeSegments.resetSegments(segmentsData) :
|
|
30
30
|
segments.resetSegments(segmentsData);
|
|
31
31
|
}
|
|
@@ -39,12 +39,12 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
39
39
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
42
|
+
function _mySegmentsUpdater(retry, segmentsData, noCache, till) {
|
|
43
43
|
var updaterPromise = segmentsData ?
|
|
44
44
|
// If segmentsData is provided, there is no need to fetch mySegments
|
|
45
45
|
new Promise(function (res) { updateSegments(segmentsData); res(true); }) :
|
|
46
46
|
// If not provided, fetch mySegments
|
|
47
|
-
mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(function (segments) {
|
|
47
|
+
mySegmentsFetcher(matchingKey, noCache, till, _promiseDecorator).then(function (segments) {
|
|
48
48
|
// Only when we have downloaded segments completely, we should not keep retrying anymore
|
|
49
49
|
startingUp = false;
|
|
50
50
|
updateSegments(segments);
|
|
@@ -71,9 +71,10 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
71
71
|
* (2) an object with a segment name and action (true: add, or false: delete) to update the storage,
|
|
72
72
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
73
73
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
74
|
+
* @param {boolean | undefined} till query param to bypass CDN requests
|
|
74
75
|
*/
|
|
75
|
-
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
76
|
-
return _mySegmentsUpdater(0, segmentsData, noCache);
|
|
76
|
+
return function mySegmentsUpdater(segmentsData, noCache, till) {
|
|
77
|
+
return _mySegmentsUpdater(0, segmentsData, noCache, till);
|
|
77
78
|
};
|
|
78
79
|
}
|
|
79
80
|
exports.mySegmentsUpdaterFactory = mySegmentsUpdaterFactory;
|
|
@@ -75,8 +75,8 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
75
75
|
/* update events */
|
|
76
76
|
case constants_1.SPLIT_UPDATE:
|
|
77
77
|
case constants_1.SEGMENT_UPDATE:
|
|
78
|
-
case constants_1.
|
|
79
|
-
case constants_1.
|
|
78
|
+
case constants_1.MEMBERSHIPS_MS_UPDATE:
|
|
79
|
+
case constants_1.MEMBERSHIPS_LS_UPDATE:
|
|
80
80
|
case constants_1.SPLIT_KILL:
|
|
81
81
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
82
82
|
break;
|
|
@@ -3,78 +3,119 @@ 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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
11
|
+
function MySegmentsUpdateWorker(log, storage, mySegmentsSyncTask, telemetryTracker) {
|
|
12
|
+
var _a;
|
|
13
|
+
function createUpdateWorker(mySegmentsCache) {
|
|
14
|
+
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
15
|
+
var currentChangeNumber = -1;
|
|
16
|
+
var handleNewEvent = false;
|
|
17
|
+
var isHandlingEvent;
|
|
18
|
+
var cdnBypass;
|
|
19
|
+
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
20
|
+
var _delay;
|
|
21
|
+
var _delayTimeoutID;
|
|
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
|
+
}
|
|
50
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
|
+
// Ignore event if it is outdated or if there is a pending fetch request (_delay is set)
|
|
89
|
+
if (cn <= Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber()) || cn <= maxChangeNumber || _delay)
|
|
90
|
+
return;
|
|
91
|
+
maxChangeNumber = cn;
|
|
92
|
+
handleNewEvent = true;
|
|
93
|
+
cdnBypass = false;
|
|
94
|
+
_segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
|
|
95
|
+
_delay = delay;
|
|
96
|
+
if (backoff.timeoutID || !isHandlingEvent)
|
|
97
|
+
__handleMySegmentsUpdateCall();
|
|
98
|
+
backoff.reset();
|
|
99
|
+
},
|
|
100
|
+
stop: function () {
|
|
101
|
+
clearTimeout(_delayTimeoutID);
|
|
102
|
+
_delay = undefined;
|
|
103
|
+
isHandlingEvent = false;
|
|
104
|
+
backoff.reset();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
51
107
|
}
|
|
108
|
+
var updateWorkers = (_a = {},
|
|
109
|
+
_a[constants_3.MEMBERSHIPS_MS_UPDATE] = createUpdateWorker(storage.segments),
|
|
110
|
+
_a[constants_3.MEMBERSHIPS_LS_UPDATE] = createUpdateWorker(storage.largeSegments),
|
|
111
|
+
_a);
|
|
52
112
|
return {
|
|
53
|
-
/**
|
|
54
|
-
* Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
|
|
55
|
-
*
|
|
56
|
-
* @param changeNumber change number of the notification
|
|
57
|
-
* @param segmentsData data for KeyList or SegmentRemoval instant updates
|
|
58
|
-
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
59
|
-
*/
|
|
60
113
|
put: function (mySegmentsData, payload, delay) {
|
|
61
|
-
|
|
62
|
-
// Ignore event if it is outdated or if there is a pending fetch request (_delay is set)
|
|
63
|
-
if (cn <= currentChangeNumber || cn <= maxChangeNumber || _delay)
|
|
64
|
-
return;
|
|
65
|
-
maxChangeNumber = cn;
|
|
66
|
-
handleNewEvent = true;
|
|
67
|
-
_segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
|
|
68
|
-
_delay = delay;
|
|
69
|
-
if (backoff.timeoutID || !isHandlingEvent)
|
|
70
|
-
__handleMySegmentsUpdateCall();
|
|
71
|
-
backoff.reset();
|
|
114
|
+
updateWorkers[mySegmentsData.type].put(mySegmentsData, payload, delay);
|
|
72
115
|
},
|
|
73
116
|
stop: function () {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
isHandlingEvent = false;
|
|
77
|
-
backoff.reset();
|
|
117
|
+
updateWorkers[constants_3.MEMBERSHIPS_MS_UPDATE].stop();
|
|
118
|
+
updateWorkers[constants_3.MEMBERSHIPS_LS_UPDATE].stop();
|
|
78
119
|
}
|
|
79
120
|
};
|
|
80
121
|
}
|
|
@@ -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';
|
|
@@ -143,9 +143,8 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
143
143
|
splitsUpdateWorker.stop();
|
|
144
144
|
if (userKey)
|
|
145
145
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
146
|
-
var worker = _a.worker
|
|
147
|
-
worker.stop();
|
|
148
|
-
workerLarge.stop();
|
|
146
|
+
var worker = _a.worker;
|
|
147
|
+
return worker.stop();
|
|
149
148
|
});
|
|
150
149
|
else
|
|
151
150
|
segmentsUpdateWorker.stop();
|
|
@@ -200,7 +199,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
200
199
|
splitsUpdateWorker.put(parsedData);
|
|
201
200
|
});
|
|
202
201
|
function handleMySegmentsUpdate(parsedData) {
|
|
203
|
-
var isLS = parsedData.type === constants_1.MEMBERSHIP_LS_UPDATE;
|
|
204
202
|
switch (parsedData.u) {
|
|
205
203
|
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
206
204
|
var bitmap_1;
|
|
@@ -208,13 +206,13 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
208
206
|
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
209
207
|
}
|
|
210
208
|
catch (e) {
|
|
211
|
-
log.warn(constants_2.
|
|
209
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['BoundedFetchRequest', e]);
|
|
212
210
|
break;
|
|
213
211
|
}
|
|
214
212
|
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
215
|
-
var hash64 = _a.hash64, worker = _a.worker
|
|
213
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
216
214
|
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
217
|
-
|
|
215
|
+
worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
218
216
|
}
|
|
219
217
|
});
|
|
220
218
|
return;
|
|
@@ -227,18 +225,18 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
227
225
|
removed_1 = new sets_1._Set(keyList.r);
|
|
228
226
|
}
|
|
229
227
|
catch (e) {
|
|
230
|
-
log.warn(constants_2.
|
|
228
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
|
|
231
229
|
break;
|
|
232
230
|
}
|
|
233
231
|
if (!parsedData.n || !parsedData.n.length) {
|
|
234
|
-
log.warn(constants_2.
|
|
232
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', 'No segment name was provided']);
|
|
235
233
|
break;
|
|
236
234
|
}
|
|
237
235
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
238
|
-
var hash64 = _a.hash64, worker = _a.worker
|
|
236
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
239
237
|
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
240
238
|
if (add !== undefined) {
|
|
241
|
-
|
|
239
|
+
worker.put(parsedData, {
|
|
242
240
|
added: add ? [parsedData.n[0]] : [],
|
|
243
241
|
removed: add ? [] : [parsedData.n[0]]
|
|
244
242
|
});
|
|
@@ -248,12 +246,12 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
248
246
|
}
|
|
249
247
|
case types_1.UpdateStrategy.SegmentRemoval:
|
|
250
248
|
if (!parsedData.n || !parsedData.n.length) {
|
|
251
|
-
log.warn(constants_2.
|
|
249
|
+
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
|
|
252
250
|
break;
|
|
253
251
|
}
|
|
254
252
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
255
|
-
var worker = _a.worker
|
|
256
|
-
|
|
253
|
+
var worker = _a.worker;
|
|
254
|
+
worker.put(parsedData, {
|
|
257
255
|
added: [],
|
|
258
256
|
removed: parsedData.n
|
|
259
257
|
});
|
|
@@ -262,13 +260,13 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
262
260
|
}
|
|
263
261
|
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
264
262
|
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
265
|
-
var worker = _a.worker
|
|
266
|
-
|
|
263
|
+
var worker = _a.worker;
|
|
264
|
+
worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
267
265
|
});
|
|
268
266
|
}
|
|
269
267
|
if (userKey) {
|
|
270
|
-
pushEmitter.on(constants_1.
|
|
271
|
-
pushEmitter.on(constants_1.
|
|
268
|
+
pushEmitter.on(constants_1.MEMBERSHIPS_MS_UPDATE, handleMySegmentsUpdate);
|
|
269
|
+
pushEmitter.on(constants_1.MEMBERSHIPS_LS_UPDATE, handleMySegmentsUpdate);
|
|
272
270
|
}
|
|
273
271
|
else {
|
|
274
272
|
pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
@@ -306,8 +304,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
306
304
|
userKeyHashes[hash] = userKey;
|
|
307
305
|
clients[userKey] = {
|
|
308
306
|
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
309
|
-
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker)
|
|
310
|
-
workerLarge: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker)
|
|
307
|
+
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
|
|
311
308
|
};
|
|
312
309
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
313
310
|
// Reconnects in case of a new client.
|
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;
|
|
@@ -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.'],
|
package/esm/services/splitApi.js
CHANGED
|
@@ -51,14 +51,14 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
51
51
|
var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : '');
|
|
52
52
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SEGMENT));
|
|
53
53
|
},
|
|
54
|
-
fetchMemberships: function (userMatchingKey, noCache) {
|
|
54
|
+
fetchMemberships: function (userMatchingKey, noCache, till) {
|
|
55
55
|
/**
|
|
56
56
|
* URI encoding of user keys in order to:
|
|
57
57
|
* - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%'
|
|
58
58
|
* - avoid 404 responses. E.g.: '/api/memberships/foo/bar'
|
|
59
59
|
* - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
|
|
60
60
|
*/
|
|
61
|
-
var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey);
|
|
61
|
+
var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey) + (till ? '?till=' + till : '');
|
|
62
62
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MEMBERSHIPS));
|
|
63
63
|
},
|
|
64
64
|
/**
|
|
@@ -57,7 +57,7 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
57
57
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
58
58
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
59
59
|
skC: this.segments && this.segments.getKeysCount(),
|
|
60
|
-
|
|
60
|
+
lsC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
|
|
61
61
|
lskC: this.largeSegments && this.largeSegments.getKeysCount(),
|
|
62
62
|
sL: this.getSessionLength(),
|
|
63
63
|
eQ: this.getEventStats(QUEUED),
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
|
|
4
4
|
*/
|
|
5
5
|
export function mySegmentsFetcherFactory(fetchMemberships) {
|
|
6
|
-
return function mySegmentsFetcher(userMatchingKey, noCache,
|
|
6
|
+
return function mySegmentsFetcher(userMatchingKey, noCache, till,
|
|
7
7
|
// Optional decorator for `fetchMemberships` promise, such as timeout or time tracker
|
|
8
8
|
decorator) {
|
|
9
|
-
var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache);
|
|
9
|
+
var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache, till);
|
|
10
10
|
if (decorator)
|
|
11
11
|
mySegmentsPromise = decorator(mySegmentsPromise);
|
|
12
12
|
return mySegmentsPromise.then(function (resp) { return resp.json(); });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { timeout } from '../../../utils/promise/timeout';
|
|
2
2
|
import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
3
3
|
import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
4
|
-
import {
|
|
4
|
+
import { MEMBERSHIPS_LS_UPDATE } from '../../streaming/constants';
|
|
5
5
|
/**
|
|
6
6
|
* factory of MySegments updater, a task that:
|
|
7
7
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
@@ -22,7 +22,7 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmen
|
|
|
22
22
|
function updateSegments(segmentsData) {
|
|
23
23
|
var shouldNotifyUpdate;
|
|
24
24
|
if (segmentsData.type !== undefined) {
|
|
25
|
-
shouldNotifyUpdate = segmentsData.type ===
|
|
25
|
+
shouldNotifyUpdate = segmentsData.type === MEMBERSHIPS_LS_UPDATE ?
|
|
26
26
|
largeSegments.resetSegments(segmentsData) :
|
|
27
27
|
segments.resetSegments(segmentsData);
|
|
28
28
|
}
|
|
@@ -36,12 +36,12 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmen
|
|
|
36
36
|
segmentsEventEmitter.emit(SDK_SEGMENTS_ARRIVED);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
39
|
+
function _mySegmentsUpdater(retry, segmentsData, noCache, till) {
|
|
40
40
|
var updaterPromise = segmentsData ?
|
|
41
41
|
// If segmentsData is provided, there is no need to fetch mySegments
|
|
42
42
|
new Promise(function (res) { updateSegments(segmentsData); res(true); }) :
|
|
43
43
|
// If not provided, fetch mySegments
|
|
44
|
-
mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(function (segments) {
|
|
44
|
+
mySegmentsFetcher(matchingKey, noCache, till, _promiseDecorator).then(function (segments) {
|
|
45
45
|
// Only when we have downloaded segments completely, we should not keep retrying anymore
|
|
46
46
|
startingUp = false;
|
|
47
47
|
updateSegments(segments);
|
|
@@ -68,8 +68,9 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmen
|
|
|
68
68
|
* (2) an object with a segment name and action (true: add, or false: delete) to update the storage,
|
|
69
69
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
70
70
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
71
|
+
* @param {boolean | undefined} till query param to bypass CDN requests
|
|
71
72
|
*/
|
|
72
|
-
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
73
|
-
return _mySegmentsUpdater(0, segmentsData, noCache);
|
|
73
|
+
return function mySegmentsUpdater(segmentsData, noCache, till) {
|
|
74
|
+
return _mySegmentsUpdater(0, segmentsData, noCache, till);
|
|
74
75
|
};
|
|
75
76
|
}
|
|
@@ -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, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE,
|
|
3
|
+
import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, MEMBERSHIPS_MS_UPDATE, MEMBERSHIPS_LS_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
|
/**
|
|
@@ -72,8 +72,8 @@ export function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
72
72
|
/* update events */
|
|
73
73
|
case SPLIT_UPDATE:
|
|
74
74
|
case SEGMENT_UPDATE:
|
|
75
|
-
case
|
|
76
|
-
case
|
|
75
|
+
case MEMBERSHIPS_MS_UPDATE:
|
|
76
|
+
case MEMBERSHIPS_LS_UPDATE:
|
|
77
77
|
case SPLIT_KILL:
|
|
78
78
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
79
79
|
break;
|