@splitsoftware/splitio-commons 1.17.1-rc.3 → 1.17.1-rc.5
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 +28 -28
- package/LICENSE +1 -1
- package/README.md +4 -3
- package/cjs/consent/sdkUserConsent.js +4 -2
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchers/segment.js +0 -6
- package/cjs/evaluator/matchersTransform/index.js +1 -4
- package/cjs/evaluator/matchersTransform/segment.js +1 -3
- package/cjs/logger/constants.js +2 -2
- package/cjs/logger/messages/info.js +1 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/readiness/readinessManager.js +11 -12
- package/cjs/readiness/sdkReadinessManager.js +6 -5
- package/cjs/sdkClient/sdkClient.js +5 -5
- package/cjs/sdkClient/sdkClientMethod.js +1 -3
- package/cjs/sdkClient/sdkClientMethodCS.js +17 -15
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +17 -15
- package/cjs/sdkFactory/index.js +11 -38
- package/cjs/services/decorateHeaders.js +6 -1
- package/cjs/services/splitApi.js +5 -5
- package/cjs/services/splitHttpClient.js +5 -2
- package/cjs/storages/AbstractSegmentsCacheSync.js +12 -41
- package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +8 -2
- package/cjs/storages/KeyBuilderCS.js +5 -23
- package/cjs/storages/dataLoader.js +33 -65
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
- package/cjs/storages/inLocalStorage/index.js +3 -12
- package/cjs/storages/inMemory/InMemoryStorageCS.js +3 -20
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +8 -8
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/cjs/storages/inRedis/RedisAdapter.js +1 -1
- package/cjs/storages/inRedis/SegmentsCacheInRedis.js +2 -2
- package/cjs/storages/inRedis/index.js +11 -5
- package/cjs/storages/pluggable/SegmentsCachePluggable.js +2 -2
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/storages/pluggable/index.js +32 -37
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +1 -1
- package/cjs/sync/polling/pollingManagerSS.js +3 -3
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +11 -2
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +5 -3
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
- package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/parseUtils.js +9 -14
- package/cjs/sync/streaming/pushManager.js +67 -69
- package/cjs/sync/syncTask.js +2 -2
- package/cjs/trackers/eventTracker.js +9 -11
- package/cjs/trackers/impressionsTracker.js +13 -15
- package/cjs/trackers/uniqueKeysTracker.js +3 -5
- package/cjs/utils/constants/index.js +4 -5
- package/cjs/utils/settingsValidation/index.js +1 -2
- package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
- package/esm/consent/sdkUserConsent.js +4 -2
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchers/segment.js +0 -6
- package/esm/evaluator/matchersTransform/index.js +1 -4
- package/esm/evaluator/matchersTransform/segment.js +1 -3
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +1 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/readiness/readinessManager.js +11 -12
- package/esm/readiness/sdkReadinessManager.js +6 -5
- package/esm/sdkClient/sdkClient.js +5 -5
- package/esm/sdkClient/sdkClientMethod.js +1 -3
- package/esm/sdkClient/sdkClientMethodCS.js +15 -13
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +15 -13
- package/esm/sdkFactory/index.js +12 -39
- package/esm/services/decorateHeaders.js +4 -0
- package/esm/services/splitApi.js +6 -6
- package/esm/services/splitHttpClient.js +6 -3
- package/esm/storages/AbstractSegmentsCacheSync.js +12 -41
- package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
- package/esm/storages/AbstractSplitsCacheSync.js +9 -3
- package/esm/storages/KeyBuilderCS.js +4 -21
- package/esm/storages/dataLoader.js +31 -62
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
- package/esm/storages/inLocalStorage/index.js +5 -14
- package/esm/storages/inMemory/InMemoryStorageCS.js +3 -20
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/SplitsCacheInMemory.js +8 -8
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/esm/storages/inRedis/RedisAdapter.js +1 -1
- package/esm/storages/inRedis/SegmentsCacheInRedis.js +2 -2
- package/esm/storages/inRedis/index.js +11 -5
- package/esm/storages/pluggable/SegmentsCachePluggable.js +2 -2
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/storages/pluggable/index.js +32 -37
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +1 -1
- package/esm/sync/polling/pollingManagerSS.js +3 -3
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +2 -2
- package/esm/sync/polling/updaters/splitChangesUpdater.js +12 -3
- package/esm/sync/streaming/AuthClient/index.js +1 -1
- package/esm/sync/streaming/SSEHandler/index.js +6 -4
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
- package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/parseUtils.js +8 -12
- package/esm/sync/streaming/pushManager.js +70 -72
- package/esm/sync/syncTask.js +2 -2
- package/esm/trackers/eventTracker.js +9 -11
- package/esm/trackers/impressionsTracker.js +13 -15
- package/esm/trackers/uniqueKeysTracker.js +3 -5
- package/esm/utils/constants/index.js +2 -3
- package/esm/utils/settingsValidation/index.js +1 -2
- package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
- package/package.json +1 -1
- package/src/consent/sdkUserConsent.ts +3 -2
- package/src/dtos/types.ts +7 -21
- package/src/evaluator/matchers/index.ts +0 -2
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchers/segment.ts +0 -7
- package/src/evaluator/matchersTransform/index.ts +1 -4
- package/src/evaluator/matchersTransform/segment.ts +3 -5
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +1 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/readiness/readinessManager.ts +12 -16
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -3
- package/src/sdkClient/sdkClient.ts +5 -5
- package/src/sdkClient/sdkClientMethod.ts +1 -4
- package/src/sdkClient/sdkClientMethodCS.ts +14 -11
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +14 -11
- package/src/sdkFactory/index.ts +13 -42
- package/src/sdkFactory/types.ts +1 -5
- package/src/services/decorateHeaders.ts +5 -0
- package/src/services/splitApi.ts +7 -7
- package/src/services/splitHttpClient.ts +7 -4
- package/src/services/types.ts +2 -2
- package/src/storages/AbstractSegmentsCacheSync.ts +12 -53
- package/src/storages/AbstractSplitsCacheAsync.ts +8 -0
- package/src/storages/AbstractSplitsCacheSync.ts +11 -4
- package/src/storages/KeyBuilderCS.ts +5 -34
- package/src/storages/dataLoader.ts +33 -63
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +59 -29
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +10 -1
- package/src/storages/inLocalStorage/index.ts +6 -16
- package/src/storages/inMemory/InMemoryStorageCS.ts +3 -23
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +44 -10
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
- package/src/storages/inMemory/SplitsCacheInMemory.ts +8 -7
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
- package/src/storages/inRedis/RedisAdapter.ts +1 -1
- package/src/storages/inRedis/SegmentsCacheInRedis.ts +2 -2
- package/src/storages/inRedis/index.ts +12 -6
- package/src/storages/pluggable/SegmentsCachePluggable.ts +2 -2
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/pluggable/index.ts +33 -38
- package/src/storages/types.ts +15 -15
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
- package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
- package/src/sync/polling/fetchers/types.ts +2 -3
- package/src/sync/polling/pollingManagerCS.ts +4 -4
- package/src/sync/polling/pollingManagerSS.ts +2 -3
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
- package/src/sync/polling/types.ts +6 -7
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +2 -2
- package/src/sync/polling/updaters/splitChangesUpdater.ts +12 -4
- package/src/sync/streaming/AuthClient/index.ts +1 -1
- package/src/sync/streaming/SSEClient/index.ts +6 -4
- package/src/sync/streaming/SSEHandler/index.ts +8 -5
- package/src/sync/streaming/SSEHandler/types.ts +15 -15
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
- package/src/sync/streaming/constants.ts +2 -2
- package/src/sync/streaming/parseUtils.ts +11 -19
- package/src/sync/streaming/pushManager.ts +72 -73
- package/src/sync/streaming/types.ts +10 -10
- package/src/sync/submitters/types.ts +5 -8
- package/src/sync/syncTask.ts +2 -2
- package/src/trackers/eventTracker.ts +7 -10
- package/src/trackers/impressionsTracker.ts +9 -12
- package/src/trackers/types.ts +0 -1
- package/src/trackers/uniqueKeysTracker.ts +4 -6
- package/src/types.ts +9 -16
- package/src/utils/constants/index.ts +2 -3
- package/src/utils/settingsValidation/index.ts +2 -3
- package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +7 -18
- package/types/evaluator/matchersTransform/segment.d.ts +2 -2
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +3 -2
- package/types/readiness/types.d.ts +2 -3
- package/types/sdkClient/sdkClientMethod.d.ts +1 -1
- package/types/sdkFactory/types.d.ts +1 -4
- package/types/services/decorateHeaders.d.ts +1 -0
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +2 -2
- package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
- package/types/storages/AbstractSplitsCacheAsync.d.ts +5 -0
- package/types/storages/AbstractSplitsCacheSync.d.ts +6 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -9
- package/types/storages/dataLoader.d.ts +6 -17
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +14 -4
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +6 -0
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +9 -3
- package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -1
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
- package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +1 -1
- package/types/storages/inRedis/index.d.ts +1 -1
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +1 -1
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +11 -11
- package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
- package/types/sync/polling/fetchers/types.d.ts +2 -2
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
- package/types/sync/polling/types.d.ts +4 -7
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
- package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
- 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 +2 -2
- package/types/sync/streaming/parseUtils.d.ts +5 -4
- package/types/sync/streaming/types.d.ts +8 -8
- package/types/sync/submitters/types.d.ts +4 -7
- package/types/trackers/eventTracker.d.ts +1 -1
- package/types/trackers/impressionsTracker.d.ts +1 -1
- package/types/trackers/types.d.ts +0 -1
- package/types/types.d.ts +9 -15
- package/types/utils/constants/index.d.ts +2 -3
- package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
- package/types/utils/settingsValidation/types.d.ts +1 -1
- package/cjs/evaluator/matchers/large_segment.js +0 -16
- package/cjs/sdkClient/identity.js +0 -7
- package/esm/evaluator/matchers/large_segment.js +0 -12
- package/esm/sdkClient/identity.js +0 -3
- package/src/evaluator/matchers/large_segment.ts +0 -18
- package/src/sdkClient/identity.ts +0 -5
- package/types/evaluator/matchers/large_segment.d.ts +0 -5
- package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
- package/types/evaluator/matchersTransform/set.d.ts +0 -5
- package/types/evaluator/matchersTransform/string.d.ts +0 -7
- package/types/sdkClient/identity.d.ts +0 -2
- package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
- package/types/storages/AbstractSplitsCache.d.ts +0 -46
- package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
- package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
- package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
- package/types/trackers/impressionObserver/utils.d.ts +0 -5
- package/types/utils/inputValidation/sdkKey.d.ts +0 -7
- package/types/utils/inputValidation/splitExistance.d.ts +0 -7
- package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
- package/types/utils/redis/RedisMock.d.ts +0 -4
- package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
- /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
|
@@ -4,15 +4,13 @@ exports.mySegmentsUpdaterFactory = void 0;
|
|
|
4
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
5
5
|
var constants_1 = require("../../../readiness/constants");
|
|
6
6
|
var constants_2 = require("../../../logger/constants");
|
|
7
|
-
var constants_3 = require("../../streaming/constants");
|
|
8
7
|
/**
|
|
9
8
|
* factory of MySegments updater, a task that:
|
|
10
9
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
11
10
|
* - updates `mySegmentsCache`
|
|
12
11
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
13
12
|
*/
|
|
14
|
-
function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
15
|
-
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
13
|
+
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
16
14
|
var readyOnAlreadyExistentState = true;
|
|
17
15
|
var startingUp = true;
|
|
18
16
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -24,27 +22,36 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
24
22
|
// @TODO if allowing pluggable storages, handle async execution
|
|
25
23
|
function updateSegments(segmentsData) {
|
|
26
24
|
var shouldNotifyUpdate;
|
|
27
|
-
if (segmentsData
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
segments.resetSegments(segmentsData);
|
|
25
|
+
if (Array.isArray(segmentsData)) {
|
|
26
|
+
// Update the list of segment names available
|
|
27
|
+
shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
|
|
31
28
|
}
|
|
32
29
|
else {
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
// Add/Delete the segment
|
|
31
|
+
var name_1 = segmentsData.name, add = segmentsData.add;
|
|
32
|
+
if (mySegmentsCache.isInSegment(name_1) !== add) {
|
|
33
|
+
shouldNotifyUpdate = true;
|
|
34
|
+
if (add)
|
|
35
|
+
mySegmentsCache.addToSegment(name_1);
|
|
36
|
+
else
|
|
37
|
+
mySegmentsCache.removeFromSegment(name_1);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
shouldNotifyUpdate = false;
|
|
41
|
+
}
|
|
35
42
|
}
|
|
36
43
|
// Notify update if required
|
|
37
|
-
if (
|
|
44
|
+
if (splitsCache.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
38
45
|
readyOnAlreadyExistentState = false;
|
|
39
46
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
|
-
function _mySegmentsUpdater(retry, segmentsData, noCache
|
|
49
|
+
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
43
50
|
var updaterPromise = segmentsData ?
|
|
44
51
|
// If segmentsData is provided, there is no need to fetch mySegments
|
|
45
52
|
new Promise(function (res) { updateSegments(segmentsData); res(true); }) :
|
|
46
53
|
// If not provided, fetch mySegments
|
|
47
|
-
mySegmentsFetcher(matchingKey, noCache,
|
|
54
|
+
mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(function (segments) {
|
|
48
55
|
// Only when we have downloaded segments completely, we should not keep retrying anymore
|
|
49
56
|
startingUp = false;
|
|
50
57
|
updateSegments(segments);
|
|
@@ -71,10 +78,9 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
71
78
|
* (2) an object with a segment name and action (true: add, or false: delete) to update the storage,
|
|
72
79
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
73
80
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
74
|
-
* @param {boolean | undefined} till query param to bypass CDN requests
|
|
75
81
|
*/
|
|
76
|
-
return function mySegmentsUpdater(segmentsData, noCache
|
|
77
|
-
return _mySegmentsUpdater(0, segmentsData, noCache
|
|
82
|
+
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
83
|
+
return _mySegmentsUpdater(0, segmentsData, noCache);
|
|
78
84
|
};
|
|
79
85
|
}
|
|
80
86
|
exports.mySegmentsUpdaterFactory = mySegmentsUpdaterFactory;
|
|
@@ -23,9 +23,9 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
23
23
|
var sincePromise = Promise.resolve(segments.getChangeNumber(segmentName));
|
|
24
24
|
return sincePromise.then(function (since) {
|
|
25
25
|
// if fetchOnlyNew flag, avoid processing already fetched segments
|
|
26
|
-
if (fetchOnlyNew && since !==
|
|
26
|
+
if (fetchOnlyNew && since !== undefined)
|
|
27
27
|
return -1;
|
|
28
|
-
return segmentChangesFetcher(since, segmentName, noCache, till).then(function (changes) {
|
|
28
|
+
return segmentChangesFetcher(since || -1, segmentName, noCache, till).then(function (changes) {
|
|
29
29
|
var changeNumber = -1;
|
|
30
30
|
var results = [];
|
|
31
31
|
changes.forEach(function (x) {
|
|
@@ -14,7 +14,7 @@ function checkAllSegmentsExist(segments) {
|
|
|
14
14
|
var registeredSegments = Promise.resolve(segments.getRegisteredSegments());
|
|
15
15
|
return registeredSegments.then(function (segmentNames) {
|
|
16
16
|
return Promise.all(segmentNames.map(function (segmentName) { return segments.getChangeNumber(segmentName); }))
|
|
17
|
-
.then(function (changeNumbers) { return changeNumbers.every(function (changeNumber) { return changeNumber !==
|
|
17
|
+
.then(function (changeNumbers) { return changeNumbers.every(function (changeNumber) { return changeNumber !== undefined; }); });
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
@@ -126,7 +126,7 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
126
126
|
function _splitChangesUpdater(since, retry) {
|
|
127
127
|
if (retry === void 0) { retry = 0; }
|
|
128
128
|
log.debug(constants_2.SYNC_SPLITS_FETCH, [since]);
|
|
129
|
-
|
|
129
|
+
var fetcherPromise = Promise.resolve(splitUpdateNotification ?
|
|
130
130
|
{ splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
|
|
131
131
|
splitChangesFetcher(since, noCache, till, _promiseDecorator))
|
|
132
132
|
.then(function (splitChanges) {
|
|
@@ -170,6 +170,15 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
170
170
|
}
|
|
171
171
|
return false;
|
|
172
172
|
});
|
|
173
|
+
// After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
|
|
174
|
+
// Wrapping in a promise since checkCache can be async.
|
|
175
|
+
if (splitsEventEmitter && startingUp) {
|
|
176
|
+
Promise.resolve(splits.checkCache()).then(function (isCacheReady) {
|
|
177
|
+
if (isCacheReady)
|
|
178
|
+
splitsEventEmitter.emit(constants_1.SDK_SPLITS_CACHE_LOADED);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return fetcherPromise;
|
|
173
182
|
}
|
|
174
183
|
var sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error
|
|
175
184
|
return sincePromise.then(_splitChangesUpdater);
|
|
@@ -13,7 +13,7 @@ var murmur3_1 = require("../../../utils/murmur3/murmur3");
|
|
|
13
13
|
function authenticateFactory(fetchAuth) {
|
|
14
14
|
/**
|
|
15
15
|
* Run authentication requests to Auth Server, and returns a promise that resolves with the decoded JTW token.
|
|
16
|
-
* @param {string[] | undefined} userKeys set of user Keys to track
|
|
16
|
+
* @param {string[] | undefined} userKeys set of user Keys to track MY_SEGMENTS_CHANGES. It is undefined for server-side API.
|
|
17
17
|
*/
|
|
18
18
|
return function authenticate(userKeys) {
|
|
19
19
|
return fetchAuth(userKeys)
|
|
@@ -68,18 +68,20 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
68
68
|
}
|
|
69
69
|
var parsedData = messageWithParsedData.parsedData, data = messageWithParsedData.data, channel = messageWithParsedData.channel, timestamp = messageWithParsedData.timestamp;
|
|
70
70
|
log.debug(constants_2.STREAMING_NEW_MESSAGE, [data]);
|
|
71
|
-
// we only handle update events if streaming is up
|
|
71
|
+
// we only handle update events if streaming is up.
|
|
72
72
|
if (!notificationKeeper.isStreamingUp() && [constants_1.OCCUPANCY, constants_1.CONTROL].indexOf(parsedData.type) === -1)
|
|
73
73
|
return;
|
|
74
74
|
switch (parsedData.type) {
|
|
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.MEMBERSHIPS_LS_UPDATE:
|
|
78
|
+
case constants_1.MY_SEGMENTS_UPDATE_V2:
|
|
80
79
|
case constants_1.SPLIT_KILL:
|
|
81
80
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
82
81
|
break;
|
|
82
|
+
case constants_1.MY_SEGMENTS_UPDATE:
|
|
83
|
+
pushEmitter.emit(parsedData.type, parsedData, channel);
|
|
84
|
+
break;
|
|
83
85
|
/* occupancy & control events, handled by NotificationManagerKeeper */
|
|
84
86
|
case constants_1.OCCUPANCY:
|
|
85
87
|
notificationKeeper.handleOccupancyEvent(parsedData.metrics.publishers, channel, timestamp);
|
|
@@ -3,121 +3,62 @@ 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");
|
|
8
6
|
/**
|
|
9
7
|
* MySegmentsUpdateWorker factory
|
|
10
8
|
*/
|
|
11
|
-
function MySegmentsUpdateWorker(
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
/**
|
|
80
|
-
* Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
|
|
81
|
-
*
|
|
82
|
-
* @param changeNumber change number of the notification
|
|
83
|
-
* @param segmentsData data for KeyList or SegmentRemoval instant updates
|
|
84
|
-
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
85
|
-
*/
|
|
86
|
-
put: function (mySegmentsData, payload, delay) {
|
|
87
|
-
var type = mySegmentsData.type, cn = mySegmentsData.cn;
|
|
88
|
-
// Discard event if it is outdated or there is a pending fetch request (_delay is set), but update target change number
|
|
89
|
-
if (cn <= Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber()) || cn <= maxChangeNumber)
|
|
90
|
-
return;
|
|
91
|
-
maxChangeNumber = cn;
|
|
92
|
-
if (_delay)
|
|
93
|
-
return;
|
|
94
|
-
handleNewEvent = true;
|
|
95
|
-
cdnBypass = false;
|
|
96
|
-
_segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
|
|
97
|
-
_delay = delay;
|
|
98
|
-
if (backoff.timeoutID || !isHandlingEvent)
|
|
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 backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
|
|
16
|
+
function __handleMySegmentsUpdateCall() {
|
|
17
|
+
isHandlingEvent = true;
|
|
18
|
+
if (maxChangeNumber > currentChangeNumber) {
|
|
19
|
+
handleNewEvent = false;
|
|
20
|
+
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
21
|
+
// fetch mySegments revalidating data if cached
|
|
22
|
+
mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
|
|
23
|
+
if (!isHandlingEvent)
|
|
24
|
+
return; // halt if `stop` has been called
|
|
25
|
+
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
26
|
+
if (_segmentsData)
|
|
27
|
+
telemetryTracker.trackUpdatesFromSSE(constants_1.MY_SEGMENT);
|
|
28
|
+
currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
29
|
+
}
|
|
30
|
+
if (handleNewEvent) {
|
|
99
31
|
__handleMySegmentsUpdateCall();
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
backoff.scheduleCall();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
isHandlingEvent = false;
|
|
40
|
+
}
|
|
109
41
|
}
|
|
110
|
-
var updateWorkers = (_a = {},
|
|
111
|
-
_a[constants_3.MEMBERSHIPS_MS_UPDATE] = createUpdateWorker(storage.segments),
|
|
112
|
-
_a[constants_3.MEMBERSHIPS_LS_UPDATE] = createUpdateWorker(storage.largeSegments),
|
|
113
|
-
_a);
|
|
114
42
|
return {
|
|
115
|
-
|
|
116
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
|
|
45
|
+
*
|
|
46
|
+
* @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
|
|
47
|
+
* @param {SegmentsData | undefined} segmentsData might be undefined
|
|
48
|
+
*/
|
|
49
|
+
put: function (changeNumber, segmentsData) {
|
|
50
|
+
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
51
|
+
return;
|
|
52
|
+
maxChangeNumber = changeNumber;
|
|
53
|
+
handleNewEvent = true;
|
|
54
|
+
_segmentsData = segmentsData;
|
|
55
|
+
if (backoff.timeoutID || !isHandlingEvent)
|
|
56
|
+
__handleMySegmentsUpdateCall();
|
|
57
|
+
backoff.reset();
|
|
117
58
|
},
|
|
118
59
|
stop: function () {
|
|
119
|
-
|
|
120
|
-
|
|
60
|
+
isHandlingEvent = false;
|
|
61
|
+
backoff.reset();
|
|
121
62
|
}
|
|
122
63
|
};
|
|
123
64
|
}
|
|
@@ -16,7 +16,7 @@ function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
|
|
|
16
16
|
var backoff = new Backoff_1.Backoff(__handleSegmentUpdateCall, constants_1.FETCH_BACKOFF_BASE, constants_1.FETCH_BACKOFF_MAX_WAIT);
|
|
17
17
|
function __handleSegmentUpdateCall() {
|
|
18
18
|
isHandlingEvent = true;
|
|
19
|
-
if (maxChangeNumber > segmentsCache.getChangeNumber(segment)) {
|
|
19
|
+
if (maxChangeNumber > (segmentsCache.getChangeNumber(segment) || -1)) {
|
|
20
20
|
handleNewEvent = false;
|
|
21
21
|
// fetch segments revalidating data if cached
|
|
22
22
|
segmentsSyncTask.execute(false, segment, true, cdnBypass ? maxChangeNumber : undefined).then(function () {
|
|
@@ -27,7 +27,7 @@ function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
|
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
29
|
var attempts = backoff.attempts + 1;
|
|
30
|
-
if (maxChangeNumber <= segmentsCache.getChangeNumber(segment)) {
|
|
30
|
+
if (maxChangeNumber <= (segmentsCache.getChangeNumber(segment) || -1)) {
|
|
31
31
|
log.debug("Refresh completed" + (cdnBypass ? ' bypassing the CDN' : '') + " in " + attempts + " attempts.");
|
|
32
32
|
isHandlingEvent = false;
|
|
33
33
|
return;
|
|
@@ -54,7 +54,7 @@ function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
|
|
|
54
54
|
}
|
|
55
55
|
return {
|
|
56
56
|
put: function (changeNumber) {
|
|
57
|
-
var currentChangeNumber = segmentsCache.getChangeNumber(segment);
|
|
57
|
+
var currentChangeNumber = segmentsCache.getChangeNumber(segment) || -1;
|
|
58
58
|
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
59
59
|
return;
|
|
60
60
|
maxChangeNumber = changeNumber;
|
|
@@ -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.MY_SEGMENTS_UPDATE_V2 = exports.MY_SEGMENTS_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.MY_SEGMENTS_UPDATE = 'MY_SEGMENTS_UPDATE';
|
|
29
|
+
exports.MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
|
|
30
30
|
exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
31
31
|
exports.SPLIT_KILL = 'SPLIT_KILL';
|
|
32
32
|
exports.SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
|
|
4
4
|
var decompress_1 = require("../../utils/decompress");
|
|
5
5
|
var base64_1 = require("../../utils/base64");
|
|
6
|
-
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
7
6
|
var GZIP = 1;
|
|
8
7
|
var ZLIB = 2;
|
|
9
8
|
function Uint8ArrayToString(myUint8Arr) {
|
|
@@ -81,19 +80,15 @@ function isInBitmap(bitmap, hash64hex) {
|
|
|
81
80
|
exports.isInBitmap = isInBitmap;
|
|
82
81
|
/**
|
|
83
82
|
* Parse feature flags notifications for instant feature flag updates
|
|
83
|
+
*
|
|
84
|
+
* @param {ISplitUpdateData} data
|
|
85
|
+
* @returns {KeyList}
|
|
84
86
|
*/
|
|
85
87
|
function parseFFUpdatePayload(compression, data) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
var avoidPrecisionLoss = false;
|
|
89
|
+
if (compression > 0)
|
|
90
|
+
return parseKeyList(data, compression, avoidPrecisionLoss);
|
|
91
|
+
else
|
|
92
|
+
return JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
89
93
|
}
|
|
90
94
|
exports.parseFFUpdatePayload = parseFFUpdatePayload;
|
|
91
|
-
var DEFAULT_MAX_INTERVAL = 60000;
|
|
92
|
-
function getDelay(parsedData, matchingKey) {
|
|
93
|
-
if (parsedData.h === 0)
|
|
94
|
-
return 0;
|
|
95
|
-
var interval = parsedData.i || DEFAULT_MAX_INTERVAL;
|
|
96
|
-
var seed = parsedData.s || 0;
|
|
97
|
-
return (0, murmur3_1.hash)(matchingKey, seed) % interval;
|
|
98
|
-
}
|
|
99
|
-
exports.getDelay = getDelay;
|
|
@@ -48,10 +48,10 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
48
48
|
var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
|
|
49
49
|
// For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
|
|
50
50
|
var splitsUpdateWorker = (0, SplitsUpdateWorker_1.SplitsUpdateWorker)(log, storage.splits, pollingManager.splitsSyncTask, readiness.splits, telemetryTracker, userKey ? undefined : pollingManager.segmentsSyncTask);
|
|
51
|
-
// [Only for client-side] map of hashes to user keys, to dispatch
|
|
51
|
+
// [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
|
|
52
52
|
var userKeyHashes = {};
|
|
53
53
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
54
|
-
// Hash64 is used to process
|
|
54
|
+
// Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
55
55
|
var clients = {};
|
|
56
56
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
57
57
|
var connectForNewClient = false;
|
|
@@ -198,76 +198,77 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
198
198
|
}
|
|
199
199
|
splitsUpdateWorker.put(parsedData);
|
|
200
200
|
});
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
catch (e) {
|
|
209
|
-
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['BoundedFetchRequest', e]);
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
213
|
-
var hash64 = _a.hash64, worker = _a.worker;
|
|
214
|
-
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
215
|
-
worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
return;
|
|
201
|
+
if (userKey) {
|
|
202
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
|
|
203
|
+
var userKeyHash = channel.split('_')[2];
|
|
204
|
+
var userKey = userKeyHashes[userKeyHash];
|
|
205
|
+
if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
|
|
206
|
+
clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
|
|
219
207
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
208
|
+
});
|
|
209
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
|
|
210
|
+
switch (parsedData.u) {
|
|
211
|
+
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
212
|
+
var bitmap_1;
|
|
213
|
+
try {
|
|
214
|
+
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
215
|
+
}
|
|
216
|
+
catch (e) {
|
|
217
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
221
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
222
|
+
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
223
|
+
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
return;
|
|
234
227
|
}
|
|
235
|
-
|
|
236
|
-
var
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
removed: add ? [] : [parsedData.n[0]]
|
|
242
|
-
});
|
|
228
|
+
case types_1.UpdateStrategy.KeyList: {
|
|
229
|
+
var keyList = void 0, added_1, removed_1;
|
|
230
|
+
try {
|
|
231
|
+
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
232
|
+
added_1 = new sets_1._Set(keyList.a);
|
|
233
|
+
removed_1 = new sets_1._Set(keyList.r);
|
|
243
234
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
235
|
+
catch (e) {
|
|
236
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
240
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
241
|
+
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
242
|
+
if (add !== undefined) {
|
|
243
|
+
worker.put(parsedData.changeNumber, {
|
|
244
|
+
name: parsedData.segmentName,
|
|
245
|
+
add: add
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
return;
|
|
251
250
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
251
|
+
case types_1.UpdateStrategy.SegmentRemoval:
|
|
252
|
+
if (!parsedData.segmentName) {
|
|
253
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
257
|
+
var worker = _a.worker;
|
|
258
|
+
return worker.put(parsedData.changeNumber, {
|
|
259
|
+
name: parsedData.segmentName,
|
|
260
|
+
add: false
|
|
261
|
+
});
|
|
257
262
|
});
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
266
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
267
|
+
var worker = _a.worker;
|
|
268
|
+
worker.put(parsedData.changeNumber);
|
|
269
|
+
});
|
|
265
270
|
});
|
|
266
271
|
}
|
|
267
|
-
if (userKey) {
|
|
268
|
-
pushEmitter.on(constants_1.MEMBERSHIPS_MS_UPDATE, handleMySegmentsUpdate);
|
|
269
|
-
pushEmitter.on(constants_1.MEMBERSHIPS_LS_UPDATE, handleMySegmentsUpdate);
|
|
270
|
-
}
|
|
271
272
|
else {
|
|
272
273
|
pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
273
274
|
}
|
|
@@ -302,10 +303,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
302
303
|
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
303
304
|
if (!userKeyHashes[hash]) {
|
|
304
305
|
userKeyHashes[hash] = userKey;
|
|
305
|
-
clients[userKey] = {
|
|
306
|
-
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
307
|
-
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
|
|
308
|
-
};
|
|
306
|
+
clients[userKey] = { hash64: (0, murmur3_64_1.hash64)(userKey), worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker) };
|
|
309
307
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
310
308
|
// Reconnects in case of a new client.
|
|
311
309
|
// Run in next event-loop cycle to save authentication calls
|
package/cjs/sync/syncTask.js
CHANGED
|
@@ -69,8 +69,8 @@ function syncTaskFactory(log, task, period, taskName) {
|
|
|
69
69
|
}
|
|
70
70
|
},
|
|
71
71
|
stop: function () {
|
|
72
|
-
running
|
|
73
|
-
|
|
72
|
+
if (running) {
|
|
73
|
+
running = false;
|
|
74
74
|
log.debug(constants_1.SYNC_TASK_STOP, [taskName]);
|
|
75
75
|
clearTimeout(timeoutID);
|
|
76
76
|
timeoutID = undefined;
|
|
@@ -12,7 +12,7 @@ var mode_1 = require("../utils/settingsValidation/mode");
|
|
|
12
12
|
* @param eventsCache cache to save events
|
|
13
13
|
* @param integrationsManager optional event handler used for integrations
|
|
14
14
|
*/
|
|
15
|
-
function eventTrackerFactory(settings, eventsCache,
|
|
15
|
+
function eventTrackerFactory(settings, eventsCache, integrationsManager, telemetryCache) {
|
|
16
16
|
var log = settings.log, mode = settings.mode;
|
|
17
17
|
var isAsync = (0, mode_1.isConsumerMode)(mode);
|
|
18
18
|
function queueEventsCallback(eventData, tracked) {
|
|
@@ -23,16 +23,14 @@ function eventTrackerFactory(settings, eventsCache, whenInit, integrationsManage
|
|
|
23
23
|
log.info(constants_1.EVENTS_TRACKER_SUCCESS, [msg]);
|
|
24
24
|
if (integrationsManager) {
|
|
25
25
|
// Wrap in a timeout because we don't want it to be blocking.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
});
|
|
35
|
-
});
|
|
26
|
+
setTimeout(function () {
|
|
27
|
+
// copy of event, to avoid unexpected behaviour if modified by integrations
|
|
28
|
+
var eventDataCopy = (0, objectAssign_1.objectAssign)({}, eventData);
|
|
29
|
+
if (properties)
|
|
30
|
+
eventDataCopy.properties = (0, objectAssign_1.objectAssign)({}, properties);
|
|
31
|
+
// integrationsManager does not throw errors (they are internally handled by each integration module)
|
|
32
|
+
integrationsManager.handleEvent(eventDataCopy);
|
|
33
|
+
}, 0);
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
36
|
else {
|