@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.
Files changed (49) hide show
  1. package/cjs/logger/constants.js +2 -2
  2. package/cjs/logger/messages/warn.js +1 -1
  3. package/cjs/services/splitApi.js +2 -2
  4. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +1 -1
  5. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  6. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +6 -5
  7. package/cjs/sync/streaming/SSEHandler/index.js +2 -2
  8. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +104 -63
  9. package/cjs/sync/streaming/constants.js +3 -3
  10. package/cjs/sync/streaming/pushManager.js +17 -20
  11. package/esm/logger/constants.js +1 -1
  12. package/esm/logger/messages/warn.js +1 -1
  13. package/esm/services/splitApi.js +2 -2
  14. package/esm/storages/inMemory/TelemetryCacheInMemory.js +1 -1
  15. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  16. package/esm/sync/polling/updaters/mySegmentsUpdater.js +7 -6
  17. package/esm/sync/streaming/SSEHandler/index.js +3 -3
  18. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +104 -63
  19. package/esm/sync/streaming/constants.js +2 -2
  20. package/esm/sync/streaming/pushManager.js +19 -22
  21. package/package.json +1 -1
  22. package/src/logger/constants.ts +1 -1
  23. package/src/logger/messages/warn.ts +1 -1
  24. package/src/services/splitApi.ts +2 -2
  25. package/src/services/types.ts +1 -1
  26. package/src/storages/inMemory/TelemetryCacheInMemory.ts +1 -1
  27. package/src/storages/types.ts +1 -1
  28. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
  29. package/src/sync/polling/fetchers/types.ts +1 -0
  30. package/src/sync/polling/types.ts +3 -3
  31. package/src/sync/polling/updaters/mySegmentsUpdater.ts +8 -7
  32. package/src/sync/streaming/SSEHandler/index.ts +3 -3
  33. package/src/sync/streaming/SSEHandler/types.ts +3 -3
  34. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +112 -64
  35. package/src/sync/streaming/constants.ts +2 -2
  36. package/src/sync/streaming/pushManager.ts +19 -25
  37. package/src/sync/streaming/types.ts +5 -5
  38. package/src/sync/submitters/types.ts +1 -1
  39. package/types/logger/constants.d.ts +1 -1
  40. package/types/services/types.d.ts +1 -1
  41. package/types/storages/types.d.ts +1 -1
  42. package/types/sync/polling/fetchers/types.d.ts +1 -1
  43. package/types/sync/polling/types.d.ts +3 -3
  44. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
  45. package/types/sync/streaming/SSEHandler/types.d.ts +3 -3
  46. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +3 -1
  47. package/types/sync/streaming/constants.d.ts +2 -2
  48. package/types/sync/streaming/types.d.ts +4 -4
  49. package/types/sync/submitters/types.d.ts +1 -1
@@ -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.STREAMING_PARSING_MEMBERSHIP_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;
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.STREAMING_PARSING_MEMBERSHIP_UPDATE = 223;
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.STREAMING_PARSING_MEMBERSHIP_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
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.'],
@@ -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
- lseC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
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.MEMBERSHIP_LS_UPDATE ?
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.MEMBERSHIP_MS_UPDATE:
79
- case constants_1.MEMBERSHIP_LS_UPDATE:
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 maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
11
- var currentChangeNumber = -1;
12
- var handleNewEvent = false;
13
- var isHandlingEvent;
14
- var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
15
- var _delay;
16
- var _delayTimeoutID;
17
- var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
18
- function __handleMySegmentsUpdateCall() {
19
- isHandlingEvent = true;
20
- if (maxChangeNumber > currentChangeNumber) {
21
- handleNewEvent = false;
22
- var currentMaxChangeNumber_1 = maxChangeNumber;
23
- // fetch mySegments revalidating data if cached
24
- var syncTask = _delay ?
25
- new Promise(function (res) {
26
- _delayTimeoutID = setTimeout(function () {
27
- _delay = undefined;
28
- mySegmentsSyncTask.execute(_segmentsData, true).then(res);
29
- }, _delay);
30
- }) :
31
- mySegmentsSyncTask.execute(_segmentsData, true);
32
- syncTask.then(function (result) {
33
- if (!isHandlingEvent)
34
- return; // halt if `stop` has been called
35
- if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
36
- if (_segmentsData)
37
- telemetryTracker.trackUpdatesFromSSE(constants_1.MEMBERSHIPS);
38
- currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
39
- }
40
- if (handleNewEvent) {
41
- __handleMySegmentsUpdateCall();
42
- }
43
- else {
44
- backoff.scheduleCall();
45
- }
46
- });
47
- }
48
- else {
49
- isHandlingEvent = false;
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
- var type = mySegmentsData.type, cn = mySegmentsData.cn;
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
- clearTimeout(_delayTimeoutID);
75
- _delay = undefined;
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.MEMBERSHIP_LS_UPDATE = exports.MEMBERSHIP_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
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.MEMBERSHIP_MS_UPDATE = 'MEMBERSHIP_MS_UPDATE';
29
- exports.MEMBERSHIP_LS_UPDATE = 'MEMBERSHIP_LS_UPDATE';
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, workerLarge = _a.workerLarge;
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.STREAMING_PARSING_MEMBERSHIP_UPDATE, ['BoundedFetchRequest', e]);
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, workerLarge = _a.workerLarge;
213
+ var hash64 = _a.hash64, worker = _a.worker;
216
214
  if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
217
- (isLS ? workerLarge : worker).put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
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.STREAMING_PARSING_MEMBERSHIP_UPDATE, ['KeyList', e]);
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.STREAMING_PARSING_MEMBERSHIP_UPDATE, ['KeyList', 'No segment name was provided']);
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, workerLarge = _a.workerLarge;
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
- (isLS ? workerLarge : worker).put(parsedData, {
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.STREAMING_PARSING_MEMBERSHIP_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
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, workerLarge = _a.workerLarge;
256
- (isLS ? workerLarge : worker).put(parsedData, {
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, workerLarge = _a.workerLarge;
266
- (isLS ? workerLarge : worker).put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
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.MEMBERSHIP_MS_UPDATE, handleMySegmentsUpdate);
271
- pushEmitter.on(constants_1.MEMBERSHIP_LS_UPDATE, handleMySegmentsUpdate);
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.
@@ -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 STREAMING_PARSING_MEMBERSHIP_UPDATE = 223;
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.STREAMING_PARSING_MEMBERSHIP_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
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.'],
@@ -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
- lseC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
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 { MEMBERSHIP_LS_UPDATE } from '../../streaming/constants';
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 === MEMBERSHIP_LS_UPDATE ?
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, MEMBERSHIP_MS_UPDATE, MEMBERSHIP_LS_UPDATE } from '../constants';
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 MEMBERSHIP_MS_UPDATE:
76
- case MEMBERSHIP_LS_UPDATE:
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;