@splitsoftware/splitio-commons 3.1.1-rc.10 → 3.1.1-rc.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.txt +2 -0
- package/cjs/evaluator/condition/index.js +2 -2
- package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
- package/cjs/evaluator/index.js +81 -71
- package/cjs/listeners/browser.js +2 -1
- package/cjs/listeners/node.js +4 -4
- package/cjs/logger/constants.js +15 -20
- package/cjs/logger/messages/debug.js +5 -6
- package/cjs/logger/messages/error.js +3 -3
- package/cjs/logger/messages/info.js +3 -4
- package/cjs/logger/messages/warn.js +6 -7
- package/cjs/platform/browser.js +15 -0
- package/cjs/platform/getEventSource/browser.js +8 -0
- package/cjs/platform/getEventSource/eventsource.js +480 -0
- package/cjs/platform/getEventSource/node.js +26 -0
- package/cjs/platform/getFetch/browser.js +9 -0
- package/cjs/platform/getFetch/node.js +27 -0
- package/cjs/platform/getOptions/node.js +25 -0
- package/cjs/platform/node.js +17 -0
- package/cjs/presets/serverSide.js +2 -2
- package/cjs/readiness/constants.js +5 -4
- package/cjs/readiness/readinessManager.js +23 -23
- package/cjs/readiness/sdkReadinessManager.js +1 -17
- package/cjs/sdkClient/client.js +24 -50
- package/cjs/sdkClient/clientInputValidation.js +6 -17
- package/cjs/sdkClient/sdkClient.js +3 -60
- package/cjs/sdkClient/sdkLifecycle.js +74 -0
- package/cjs/sdkClient/trackMethod.js +56 -0
- package/cjs/sdkFactory/index.js +11 -15
- package/cjs/sdkManager/index.js +5 -5
- package/cjs/services/authProvider.js +80 -0
- package/cjs/services/decorateHeaders.js +2 -1
- package/cjs/services/secureSplitHttpClient.js +36 -0
- package/cjs/services/serviceApi.js +147 -0
- package/cjs/services/splitApi.js +24 -10
- package/cjs/services/splitHttpClient.js +3 -5
- package/cjs/storages/AbstractDefinitionsCacheAsync.js +51 -0
- package/cjs/storages/AbstractDefinitionsCacheSync.js +76 -0
- package/cjs/storages/KeyBuilder.js +6 -6
- package/cjs/storages/KeyBuilderCS.js +5 -5
- package/cjs/storages/KeyBuilderSS.js +2 -2
- package/cjs/storages/getRolloutPlan.js +3 -3
- package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +194 -0
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
- package/cjs/storages/inLocalStorage/index.js +6 -6
- package/cjs/storages/inLocalStorage/validateCache.js +3 -3
- package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +121 -0
- package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +77 -77
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/index.js +2 -2
- package/cjs/storages/pluggable/DefinitionsCachePluggable.js +212 -0
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/index.js +2 -2
- package/cjs/storages/setRolloutPlan.js +4 -4
- package/cjs/storages/utils.js +1 -0
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +24 -15
- package/cjs/sync/polling/pollingManagerCS.js +86 -81
- package/cjs/sync/polling/pollingManagerSS.js +44 -36
- package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +13 -0
- package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
- package/cjs/sync/polling/updaters/{splitChangesUpdater.js → definitionChangesUpdater.js} +66 -69
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
- package/cjs/sync/streaming/AuthClient/index.js +13 -14
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +2 -1
- package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +16 -19
- package/cjs/sync/streaming/constants.js +4 -3
- package/cjs/sync/streaming/parseUtils.js +11 -11
- package/cjs/sync/streaming/pushManager.js +20 -25
- package/cjs/sync/submitters/eventsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionsSubmitter.js +5 -4
- package/cjs/sync/submitters/telemetrySubmitter.js +3 -4
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/cjs/sync/syncManagerOnline.js +5 -5
- package/cjs/utils/Backoff.js +35 -3
- package/cjs/utils/EventEmitter.js +391 -0
- package/cjs/utils/filter/bloomFilter.js +37 -0
- package/cjs/utils/inputValidation/{split.js → definition.js} +10 -10
- package/cjs/utils/inputValidation/{splitExistence.js → definitionExistence.js} +6 -6
- package/cjs/utils/inputValidation/definitions.js +25 -0
- package/cjs/utils/inputValidation/index.js +7 -7
- package/cjs/utils/inputValidation/isOperational.js +4 -4
- package/cjs/utils/inputValidation/target.js +22 -0
- package/cjs/utils/labels/index.js +3 -3
- package/cjs/utils/settingsValidation/index.js +2 -0
- package/cjs/utils/settingsValidation/splitFilters.js +3 -3
- package/cjs/utils/settingsValidation/url.js +6 -2
- package/esm/evaluator/condition/index.js +2 -2
- package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
- package/esm/evaluator/index.js +80 -71
- package/esm/listeners/browser.js +2 -1
- package/esm/listeners/node.js +4 -4
- package/esm/logger/constants.js +12 -17
- package/esm/logger/messages/debug.js +5 -6
- package/esm/logger/messages/error.js +3 -3
- package/esm/logger/messages/info.js +3 -4
- package/esm/logger/messages/warn.js +6 -7
- package/esm/platform/browser.js +12 -0
- package/esm/platform/getEventSource/browser.js +4 -0
- package/esm/platform/getEventSource/eventsource.js +480 -0
- package/esm/platform/getEventSource/node.js +20 -0
- package/esm/platform/getFetch/browser.js +5 -0
- package/esm/platform/getFetch/node.js +22 -0
- package/esm/platform/getOptions/node.js +20 -0
- package/esm/platform/node.js +14 -0
- package/esm/presets/serverSide.js +2 -2
- package/esm/readiness/constants.js +4 -3
- package/esm/readiness/readinessManager.js +24 -24
- package/esm/readiness/sdkReadinessManager.js +2 -18
- package/esm/sdkClient/client.js +23 -50
- package/esm/sdkClient/clientInputValidation.js +8 -19
- package/esm/sdkClient/sdkClient.js +3 -60
- package/esm/sdkClient/sdkLifecycle.js +70 -0
- package/esm/sdkClient/trackMethod.js +52 -0
- package/esm/sdkFactory/index.js +12 -16
- package/esm/sdkManager/index.js +6 -6
- package/esm/services/authProvider.js +76 -0
- package/esm/services/decorateHeaders.js +2 -1
- package/esm/services/secureSplitHttpClient.js +32 -0
- package/esm/services/serviceApi.js +143 -0
- package/esm/services/splitApi.js +24 -10
- package/esm/services/splitHttpClient.js +3 -5
- package/esm/storages/AbstractDefinitionsCacheAsync.js +48 -0
- package/esm/storages/AbstractDefinitionsCacheSync.js +71 -0
- package/esm/storages/KeyBuilder.js +6 -6
- package/esm/storages/KeyBuilderCS.js +5 -5
- package/esm/storages/KeyBuilderSS.js +2 -2
- package/esm/storages/getRolloutPlan.js +3 -3
- package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +191 -0
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
- package/esm/storages/inLocalStorage/index.js +6 -6
- package/esm/storages/inLocalStorage/validateCache.js +3 -3
- package/esm/storages/inMemory/DefinitionsCacheInMemory.js +118 -0
- package/esm/storages/inMemory/InMemoryStorage.js +4 -4
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/esm/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +76 -76
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/esm/storages/inRedis/index.js +2 -2
- package/esm/storages/pluggable/DefinitionsCachePluggable.js +209 -0
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/esm/storages/pluggable/index.js +2 -2
- package/esm/storages/setRolloutPlan.js +4 -4
- package/esm/storages/utils.js +1 -0
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +25 -16
- package/esm/sync/polling/pollingManagerCS.js +87 -82
- package/esm/sync/polling/pollingManagerSS.js +44 -36
- package/esm/sync/polling/syncTasks/definitionsSyncTask.js +9 -0
- package/esm/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
- package/esm/sync/polling/updaters/definitionChangesUpdater.js +191 -0
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
- package/esm/sync/streaming/AuthClient/index.js +11 -11
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
- package/esm/sync/streaming/SSEHandler/index.js +3 -2
- package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +15 -18
- package/esm/sync/streaming/constants.js +3 -2
- package/esm/sync/streaming/parseUtils.js +9 -9
- package/esm/sync/streaming/pushManager.js +22 -27
- package/esm/sync/submitters/eventsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionsSubmitter.js +5 -4
- package/esm/sync/submitters/telemetrySubmitter.js +3 -4
- package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/esm/sync/syncManagerOnline.js +4 -4
- package/esm/utils/Backoff.js +35 -3
- package/esm/utils/EventEmitter.js +387 -0
- package/esm/utils/filter/bloomFilter.js +33 -0
- package/esm/utils/inputValidation/{split.js → definition.js} +8 -8
- package/esm/utils/inputValidation/definitionExistence.js +15 -0
- package/esm/utils/inputValidation/definitions.js +21 -0
- package/esm/utils/inputValidation/index.js +3 -3
- package/esm/utils/inputValidation/isOperational.js +4 -4
- package/esm/utils/inputValidation/target.js +18 -0
- package/esm/utils/labels/index.js +2 -2
- package/esm/utils/settingsValidation/index.js +2 -0
- package/esm/utils/settingsValidation/splitFilters.js +3 -3
- package/esm/utils/settingsValidation/url.js +6 -2
- package/package.json +1 -1
- package/cjs/storages/AbstractSplitsCacheAsync.js +0 -51
- package/cjs/storages/AbstractSplitsCacheSync.js +0 -76
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +0 -194
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -121
- package/cjs/storages/pluggable/SplitsCachePluggable.js +0 -212
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +0 -13
- package/cjs/utils/inputValidation/splits.js +0 -25
- package/esm/storages/AbstractSplitsCacheAsync.js +0 -48
- package/esm/storages/AbstractSplitsCacheSync.js +0 -71
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +0 -191
- package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -118
- package/esm/storages/pluggable/SplitsCachePluggable.js +0 -209
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +0 -9
- package/esm/sync/polling/updaters/splitChangesUpdater.js +0 -194
- package/esm/utils/inputValidation/splitExistence.js +0 -15
- package/esm/utils/inputValidation/splits.js +0 -21
|
@@ -5,7 +5,7 @@ var timeout_1 = require("../../../utils/promise/timeout");
|
|
|
5
5
|
var constants_1 = require("../../../readiness/constants");
|
|
6
6
|
var constants_2 = require("../../../logger/constants");
|
|
7
7
|
var constants_3 = require("../../streaming/constants");
|
|
8
|
-
var
|
|
8
|
+
var AbstractDefinitionsCacheSync_1 = require("../../../storages/AbstractDefinitionsCacheSync");
|
|
9
9
|
/**
|
|
10
10
|
* factory of MySegments updater, a task that:
|
|
11
11
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
@@ -37,7 +37,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
37
37
|
if (storage.save)
|
|
38
38
|
storage.save();
|
|
39
39
|
// Notify update if required
|
|
40
|
-
if ((0,
|
|
40
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage) && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
41
41
|
readyOnAlreadyExistentState = false;
|
|
42
42
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED, { type: constants_1.SEGMENTS_UPDATE, names: [] });
|
|
43
43
|
}
|
|
@@ -56,7 +56,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
56
56
|
return updaterPromise.catch(function (error) {
|
|
57
57
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
58
58
|
retry += 1;
|
|
59
|
-
log.warn(constants_2.
|
|
59
|
+
log.warn(constants_2.SYNC_FETCH_RETRY, ['memberships', retry, error]);
|
|
60
60
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
@@ -23,7 +23,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
23
23
|
return promise;
|
|
24
24
|
}
|
|
25
25
|
function updateSegment(segmentName, noCache, till, fetchOnlyNew, retries) {
|
|
26
|
-
log.debug("".concat(constants_2.
|
|
26
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC, "Processing segment ").concat(segmentName));
|
|
27
27
|
var sincePromise = Promise.resolve(segments.getChangeNumber(segmentName));
|
|
28
28
|
return sincePromise.then(function (since) {
|
|
29
29
|
// if fetchOnlyNew flag, avoid processing already fetched segments
|
|
@@ -31,14 +31,14 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
31
31
|
false :
|
|
32
32
|
segmentChangesFetcher(since || -1, segmentName, noCache, till, _promiseDecorator).then(function (changes) {
|
|
33
33
|
return Promise.all(changes.map(function (x) {
|
|
34
|
-
log.debug("".concat(constants_2.
|
|
34
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC, "Processing ").concat(segmentName, " with since = ").concat(x.since, " and till = ").concat(x.till, ". Added: ").concat(x.added.length, ". Removed: ").concat(x.removed.length));
|
|
35
35
|
return segments.update(segmentName, x.added, x.removed, x.till);
|
|
36
36
|
})).then(function (updates) {
|
|
37
37
|
return updates.some(function (update) { return update; });
|
|
38
38
|
});
|
|
39
39
|
}).catch(function (error) {
|
|
40
40
|
if (retries) {
|
|
41
|
-
log.warn("".concat(constants_2.
|
|
41
|
+
log.warn("".concat(constants_2.LOG_PREFIX_SYNC, "Retrying fetch of segment ").concat(segmentName, " (attempt #").concat(retries, "). Reason: ").concat(error));
|
|
42
42
|
return updateSegment(segmentName, noCache, till, fetchOnlyNew, retries - 1);
|
|
43
43
|
}
|
|
44
44
|
throw error;
|
|
@@ -57,7 +57,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
57
57
|
* @param till - till target for the provided segmentName, for CDN bypass.
|
|
58
58
|
*/
|
|
59
59
|
return function segmentChangesUpdater(fetchOnlyNew, segmentName, noCache, till) {
|
|
60
|
-
log.debug("".concat(constants_2.
|
|
60
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC, "Started segments update"));
|
|
61
61
|
// If not a segment name provided, read list of available segments names to be updated.
|
|
62
62
|
var segmentsPromise = Promise.resolve(segmentName ? [segmentName] : segments.getRegisteredSegments());
|
|
63
63
|
return segmentsPromise.then(function (segmentNames) {
|
|
@@ -66,7 +66,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
66
66
|
// if at least one segment fetch succeeded, mark segments ready
|
|
67
67
|
if (shouldUpdateFlags.some(function (update) { return update; }) || readyOnAlreadyExistentState) {
|
|
68
68
|
readyOnAlreadyExistentState = false;
|
|
69
|
-
if (readiness) {
|
|
69
|
+
if (readiness && !fetchOnlyNew) {
|
|
70
70
|
var metadata = {
|
|
71
71
|
type: constants_1.SEGMENTS_UPDATE,
|
|
72
72
|
names: []
|
|
@@ -87,7 +87,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
87
87
|
log.error("".concat(constants_2.LOG_PREFIX_INSTANTIATION, ": you passed a client-side type authorizationKey, please grab an SDK Key from Harness FME UI that is of type server-side."));
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
|
-
log.warn("".concat(constants_2.
|
|
90
|
+
log.warn("".concat(constants_2.LOG_PREFIX_SYNC, "Error while doing fetch of segments. ").concat(error));
|
|
91
91
|
}
|
|
92
92
|
return false;
|
|
93
93
|
});
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.fetchAuthFactory = void 0;
|
|
4
4
|
var objectAssign_1 = require("../../../utils/lang/objectAssign");
|
|
5
|
-
var base64_1 = require("../../../utils/base64");
|
|
6
5
|
var jwt_1 = require("../../../utils/jwt");
|
|
7
|
-
var murmur3_1 = require("../../../utils/murmur3/murmur3");
|
|
8
6
|
/**
|
|
9
7
|
* Factory of authentication function.
|
|
10
8
|
*
|
|
11
|
-
* @param fetchAuth -
|
|
9
|
+
* @param fetchAuth - /auth endpoint
|
|
12
10
|
*/
|
|
13
|
-
function
|
|
11
|
+
function fetchAuthFactory(fetchAuth) {
|
|
14
12
|
/**
|
|
15
13
|
* Run authentication requests to Auth Server, and returns a promise that resolves with the decoded JTW token.
|
|
16
14
|
* @param userKeys - set of user Keys to track membership updates. It is undefined for server-side API.
|
|
@@ -24,20 +22,21 @@ function authenticateFactory(fetchAuth) {
|
|
|
24
22
|
if (typeof decodedToken.iat !== 'number' || typeof decodedToken.exp !== 'number')
|
|
25
23
|
throw new Error('token properties "issuedAt" (iat) or "expiration" (exp) are missing or invalid');
|
|
26
24
|
var channels = JSON.parse(decodedToken['x-ably-capability']);
|
|
27
|
-
|
|
25
|
+
var credential = (0, objectAssign_1.objectAssign)({
|
|
28
26
|
decodedToken: decodedToken,
|
|
29
27
|
channels: channels
|
|
30
28
|
}, json);
|
|
29
|
+
// The `/api/v3/auth` endpoint nests the streaming settings under `config.streaming`. Normalize
|
|
30
|
+
// them into the flat `pushEnabled`/`connDelay` properties used by the PushManager.
|
|
31
|
+
var streaming = credential.config && credential.config.streaming;
|
|
32
|
+
if (streaming) {
|
|
33
|
+
credential.pushEnabled = streaming.enabled;
|
|
34
|
+
credential.connDelay = streaming.delay;
|
|
35
|
+
}
|
|
36
|
+
return credential;
|
|
31
37
|
}
|
|
32
38
|
return json;
|
|
33
39
|
});
|
|
34
40
|
};
|
|
35
41
|
}
|
|
36
|
-
exports.
|
|
37
|
-
/**
|
|
38
|
-
* Returns the hash of a given user key
|
|
39
|
-
*/
|
|
40
|
-
function hashUserKey(userKey) {
|
|
41
|
-
return (0, base64_1.encodeToBase64)((0, murmur3_1.hash)(userKey, 0).toString());
|
|
42
|
-
}
|
|
43
|
-
exports.hashUserKey = hashUserKey;
|
|
42
|
+
exports.fetchAuthFactory = fetchAuthFactory;
|
|
@@ -73,7 +73,7 @@ function notificationKeeperFactory(pushEmitter, telemetryTracker) {
|
|
|
73
73
|
c.cTime = timestamp;
|
|
74
74
|
if (controlType === constants_2.ControlType.STREAMING_DISABLED) {
|
|
75
75
|
telemetryTracker.streamingEvent(constants_1.STREAMING_STATUS, constants_1.DISABLED);
|
|
76
|
-
pushEmitter.emit(constants_2.
|
|
76
|
+
pushEmitter.emit(constants_2.PUSH_NON_RETRYABLE_ERROR);
|
|
77
77
|
}
|
|
78
78
|
else if (hasPublishers) {
|
|
79
79
|
if (controlType === constants_2.ControlType.STREAMING_PAUSED && hasResumed) {
|
|
@@ -51,7 +51,7 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
51
51
|
pushEmitter.emit(constants_1.PUSH_RETRYABLE_ERROR);
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
|
-
pushEmitter.emit(constants_1.
|
|
54
|
+
pushEmitter.emit(constants_1.PUSH_NON_RETRYABLE_ERROR);
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
57
|
/* NotificationProcessor */
|
|
@@ -74,6 +74,7 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
74
74
|
switch (parsedData.type) {
|
|
75
75
|
/* update events */
|
|
76
76
|
case constants_1.SPLIT_UPDATE:
|
|
77
|
+
case constants_1.CONFIG_UPDATE:
|
|
77
78
|
case constants_1.SEGMENT_UPDATE:
|
|
78
79
|
case constants_1.MEMBERSHIPS_MS_UPDATE:
|
|
79
80
|
case constants_1.MEMBERSHIPS_LS_UPDATE:
|
package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.DefinitionsUpdateWorker = void 0;
|
|
4
4
|
var constants_1 = require("../../../logger/constants");
|
|
5
5
|
var constants_2 = require("../../../readiness/constants");
|
|
6
6
|
var Backoff_1 = require("../../../utils/Backoff");
|
|
@@ -9,35 +9,32 @@ var constants_4 = require("../constants");
|
|
|
9
9
|
var parseUtils_1 = require("../parseUtils");
|
|
10
10
|
var constants_5 = require("./constants");
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* DefinitionsUpdateWorker factory
|
|
13
13
|
*/
|
|
14
|
-
function
|
|
15
|
-
var ff =
|
|
16
|
-
var rbs =
|
|
17
|
-
function
|
|
14
|
+
function DefinitionsUpdateWorker(log, storage, definitionsSyncTask, definitionsEventEmitter, telemetryTracker) {
|
|
15
|
+
var ff = DefinitionsUpdateWorker(storage.definitions);
|
|
16
|
+
var rbs = DefinitionsUpdateWorker(storage.rbSegments);
|
|
17
|
+
function DefinitionsUpdateWorker(cache) {
|
|
18
18
|
var maxChangeNumber = -1;
|
|
19
19
|
var handleNewEvent = false;
|
|
20
20
|
var isHandlingEvent;
|
|
21
21
|
var cdnBypass;
|
|
22
22
|
var instantUpdate;
|
|
23
|
-
var backoff = new Backoff_1.Backoff(
|
|
24
|
-
function
|
|
23
|
+
var backoff = new Backoff_1.Backoff(__handleDefinitionUpdateCall, constants_5.FETCH_BACKOFF_BASE, constants_5.FETCH_BACKOFF_MAX_WAIT);
|
|
24
|
+
function __handleDefinitionUpdateCall() {
|
|
25
25
|
isHandlingEvent = true;
|
|
26
26
|
if (maxChangeNumber > cache.getChangeNumber()) {
|
|
27
27
|
handleNewEvent = false;
|
|
28
28
|
// fetch splits revalidating data if cached
|
|
29
|
-
|
|
29
|
+
definitionsSyncTask.execute(true, cdnBypass ? maxChangeNumber : undefined, instantUpdate).then(function () {
|
|
30
30
|
if (!isHandlingEvent)
|
|
31
31
|
return; // halt if `stop` has been called
|
|
32
32
|
if (handleNewEvent) {
|
|
33
|
-
|
|
33
|
+
__handleDefinitionUpdateCall();
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
if (instantUpdate)
|
|
37
37
|
telemetryTracker.trackUpdatesFromSSE(constants_3.SPLITS);
|
|
38
|
-
// fetch new registered segments for server-side API. Not retrying on error
|
|
39
|
-
if (segmentsSyncTask)
|
|
40
|
-
segmentsSyncTask.execute(true);
|
|
41
38
|
var attempts = backoff.attempts + 1;
|
|
42
39
|
if (ff.isSync() && rbs.isSync()) {
|
|
43
40
|
log.debug("Refresh completed".concat(cdnBypass ? ' bypassing the CDN' : '', " in ").concat(attempts, " attempts."));
|
|
@@ -55,7 +52,7 @@ function SplitsUpdateWorker(log, storage, splitsSyncTask, splitsEventEmitter, te
|
|
|
55
52
|
else {
|
|
56
53
|
backoff.reset();
|
|
57
54
|
cdnBypass = true;
|
|
58
|
-
|
|
55
|
+
__handleDefinitionUpdateCall();
|
|
59
56
|
}
|
|
60
57
|
}
|
|
61
58
|
});
|
|
@@ -83,7 +80,7 @@ function SplitsUpdateWorker(log, storage, splitsSyncTask, splitsEventEmitter, te
|
|
|
83
80
|
instantUpdate = { payload: payload, changeNumber: changeNumber, type: type };
|
|
84
81
|
}
|
|
85
82
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
86
|
-
|
|
83
|
+
__handleDefinitionUpdateCall();
|
|
87
84
|
backoff.reset();
|
|
88
85
|
},
|
|
89
86
|
stop: function () {
|
|
@@ -118,11 +115,11 @@ function SplitsUpdateWorker(log, storage, splitsSyncTask, splitsEventEmitter, te
|
|
|
118
115
|
* @param splitName - name of split to kill
|
|
119
116
|
* @param defaultTreatment - default treatment value
|
|
120
117
|
*/
|
|
121
|
-
|
|
118
|
+
killDefinition: function (_a) {
|
|
122
119
|
var changeNumber = _a.changeNumber, splitName = _a.splitName, defaultTreatment = _a.defaultTreatment;
|
|
123
|
-
if (storage.
|
|
120
|
+
if (storage.definitions.killLocally(splitName, defaultTreatment, changeNumber)) {
|
|
124
121
|
// trigger an SDK_UPDATE if Split was killed locally
|
|
125
|
-
|
|
122
|
+
definitionsEventEmitter.emit(constants_2.SDK_DEFINITIONS_ARRIVED, true);
|
|
126
123
|
}
|
|
127
124
|
// queues the SplitChanges fetch (only if changeNumber is newer)
|
|
128
125
|
ff.put({ changeNumber: changeNumber });
|
|
@@ -133,4 +130,4 @@ function SplitsUpdateWorker(log, storage, splitsSyncTask, splitsEventEmitter, te
|
|
|
133
130
|
}
|
|
134
131
|
};
|
|
135
132
|
}
|
|
136
|
-
exports.
|
|
133
|
+
exports.DefinitionsUpdateWorker = DefinitionsUpdateWorker;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.RB_SEGMENT_UPDATE = 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.
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.RB_SEGMENT_UPDATE = exports.CONFIG_UPDATE = 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_NON_RETRYABLE_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
|
|
@@ -8,7 +8,7 @@ exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
|
8
8
|
* emitted on SSE and Authenticate non-recoverable errors, STREAMING_DISABLED control notification and authentication with pushEnabled false
|
|
9
9
|
* triggers `handleNonRetryableError` call
|
|
10
10
|
*/
|
|
11
|
-
exports.
|
|
11
|
+
exports.PUSH_NON_RETRYABLE_ERROR = 'PUSH_NON_RETRYABLE_ERROR';
|
|
12
12
|
/**
|
|
13
13
|
* emitted on SSE and Authenticate recoverable errors
|
|
14
14
|
* triggers `handleRetryableError` call
|
|
@@ -20,7 +20,7 @@ exports.PUSH_RETRYABLE_ERROR = 'PUSH_RETRYABLE_ERROR';
|
|
|
20
20
|
*/
|
|
21
21
|
exports.PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
|
|
22
22
|
/**
|
|
23
|
-
* emitted on STREAMING_PAUSED control notification, OCCUPANCY equal to 0,
|
|
23
|
+
* emitted on STREAMING_PAUSED control notification, OCCUPANCY equal to 0, PUSH_NON_RETRYABLE_ERROR and PUSH_RETRYABLE_ERROR events.
|
|
24
24
|
* triggers `startPolling` and `stopWorkers` calls
|
|
25
25
|
*/
|
|
26
26
|
exports.PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
|
|
@@ -30,6 +30,7 @@ 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';
|
|
33
|
+
exports.CONFIG_UPDATE = 'CONFIG_UPDATE';
|
|
33
34
|
exports.RB_SEGMENT_UPDATE = 'RB_SEGMENT_UPDATE';
|
|
34
35
|
// Control-type push notifications, handled by NotificationKeeper
|
|
35
36
|
exports.CONTROL = 'CONTROL';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getDelay = exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.
|
|
3
|
+
exports.getDelay = exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseCompressedData = void 0;
|
|
4
4
|
var decompress_1 = require("../../utils/decompress");
|
|
5
5
|
var base64_1 = require("../../utils/base64");
|
|
6
6
|
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
@@ -33,24 +33,24 @@ function decompress(data, compression) {
|
|
|
33
33
|
throw new Error("Invalid compression algorithm #".concat(compression));
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
* Decode, decompress and parse the provided 'data' into
|
|
36
|
+
* Decode, decompress and parse the provided 'data' into an object of type T
|
|
37
37
|
*
|
|
38
38
|
* @param data - base64 encoded string
|
|
39
39
|
* @param compression - 1 GZIP, 2 ZLIB
|
|
40
40
|
* @param avoidPrecisionLoss - true as default, set it as false if dont need to avoid precission loss
|
|
41
|
-
* @returns
|
|
41
|
+
* @returns parsed object
|
|
42
42
|
* @throws if data string cannot be decoded, decompressed or parsed
|
|
43
43
|
*/
|
|
44
|
-
function
|
|
44
|
+
function parseCompressedData(data, compression, avoidPrecisionLoss) {
|
|
45
45
|
if (avoidPrecisionLoss === void 0) { avoidPrecisionLoss = true; }
|
|
46
|
-
var
|
|
47
|
-
var
|
|
48
|
-
// replace numbers to strings, to avoid losing precision
|
|
46
|
+
var binData = decompress(data, compression);
|
|
47
|
+
var str = Uint8ArrayToString(binData);
|
|
48
|
+
// replace numbers to strings, to avoid losing precision (e.g., 64-bit IDs in KeyList)
|
|
49
49
|
if (avoidPrecisionLoss)
|
|
50
|
-
|
|
51
|
-
return JSON.parse(
|
|
50
|
+
str = str.replace(/\d+/g, '"$&"');
|
|
51
|
+
return JSON.parse(str);
|
|
52
52
|
}
|
|
53
|
-
exports.
|
|
53
|
+
exports.parseCompressedData = parseCompressedData;
|
|
54
54
|
/**
|
|
55
55
|
* Decode, decompress and parse the provided 'data' into a Bitmap object
|
|
56
56
|
*
|
|
@@ -83,7 +83,7 @@ exports.isInBitmap = isInBitmap;
|
|
|
83
83
|
*/
|
|
84
84
|
function parseFFUpdatePayload(compression, data) {
|
|
85
85
|
return compression > 0 ?
|
|
86
|
-
|
|
86
|
+
parseCompressedData(data, compression, false) :
|
|
87
87
|
JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
88
88
|
}
|
|
89
89
|
exports.parseFFUpdatePayload = parseFFUpdatePayload;
|
|
@@ -6,8 +6,7 @@ var Backoff_1 = require("../../utils/Backoff");
|
|
|
6
6
|
var SSEHandler_1 = require("./SSEHandler");
|
|
7
7
|
var MySegmentsUpdateWorker_1 = require("./UpdateWorkers/MySegmentsUpdateWorker");
|
|
8
8
|
var SegmentsUpdateWorker_1 = require("./UpdateWorkers/SegmentsUpdateWorker");
|
|
9
|
-
var
|
|
10
|
-
var AuthClient_1 = require("./AuthClient");
|
|
9
|
+
var DefinitionsUpdateWorker_1 = require("./UpdateWorkers/DefinitionsUpdateWorker");
|
|
11
10
|
var lang_1 = require("../../utils/lang");
|
|
12
11
|
var SSEClient_1 = require("./SSEClient");
|
|
13
12
|
var key_1 = require("../../utils/key");
|
|
@@ -23,7 +22,7 @@ var constants_3 = require("../../utils/constants");
|
|
|
23
22
|
* - for client-side, with support for multiple clients, if key is provided in settings
|
|
24
23
|
*/
|
|
25
24
|
function pushManagerFactory(params, pollingManager) {
|
|
26
|
-
var settings = params.settings, storage = params.storage,
|
|
25
|
+
var settings = params.settings, storage = params.storage, serviceApi = params.serviceApi, readiness = params.readiness, platform = params.platform, telemetryTracker = params.telemetryTracker;
|
|
27
26
|
// `userKey` is the matching key of main client in client-side SDK.
|
|
28
27
|
// It can be used to check if running on client-side or server-side SDK.
|
|
29
28
|
var userKey = (0, key_1.checkIfServerSide)(settings) ? undefined : (0, key_1.getMatching)(settings.core.key);
|
|
@@ -37,7 +36,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
37
36
|
log.warn(constants_2.STREAMING_FALLBACK, [e]);
|
|
38
37
|
return;
|
|
39
38
|
}
|
|
40
|
-
var authenticate = (0, AuthClient_1.authenticateFactory)(splitApi.fetchAuth);
|
|
41
39
|
// init feedback loop
|
|
42
40
|
var pushEmitter = new platform.EventEmitter();
|
|
43
41
|
var sseHandler = (0, SSEHandler_1.SSEHandlerFactory)(log, pushEmitter, telemetryTracker);
|
|
@@ -45,19 +43,17 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
45
43
|
// init workers
|
|
46
44
|
// MySegmentsUpdateWorker (client-side) are initiated in `add` method
|
|
47
45
|
var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
|
|
48
|
-
// For server-side we pass the segmentsSyncTask, used by
|
|
49
|
-
var
|
|
50
|
-
// [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
|
|
51
|
-
var userKeyHashes = {};
|
|
46
|
+
// For server-side we pass the segmentsSyncTask, used by DefinitionsUpdateWorker to fetch new segments
|
|
47
|
+
var definitionsUpdateWorker = (0, DefinitionsUpdateWorker_1.DefinitionsUpdateWorker)(log, storage, pollingManager.definitionsSyncTask, readiness.definitions, telemetryTracker);
|
|
52
48
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
53
49
|
// Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
54
50
|
var clients = {};
|
|
55
51
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
56
52
|
var connectForNewClient = false;
|
|
57
|
-
// flag that indicates if `stop/disconnectPush` was called, either by the SyncManager, when the client is destroyed, or due to a
|
|
53
|
+
// flag that indicates if `stop/disconnectPush` was called, either by the SyncManager, when the client is destroyed, or due to a PUSH_NON_RETRYABLE_ERROR error.
|
|
58
54
|
// It is used to halt the `connectPush` process if it was in progress.
|
|
59
55
|
var disconnected;
|
|
60
|
-
// flag that indicates a
|
|
56
|
+
// flag that indicates a PUSH_NON_RETRYABLE_ERROR, condition with which starting pushManager again is ignored.
|
|
61
57
|
// true if STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE or Auth errors.
|
|
62
58
|
var disabled; // `disabled` implies `disconnected === true`
|
|
63
59
|
/** PushManager functions related to initialization */
|
|
@@ -93,14 +89,14 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
93
89
|
log.info(constants_2.STREAMING_CONNECTING);
|
|
94
90
|
disconnected = false;
|
|
95
91
|
var userKeys = userKey ? Object.keys(clients) : undefined;
|
|
96
|
-
|
|
92
|
+
serviceApi.fetchAuth(userKeys).then(function (authData) {
|
|
97
93
|
if (disconnected)
|
|
98
94
|
return;
|
|
99
|
-
// 'pushEnabled: false' is handled as a
|
|
95
|
+
// 'pushEnabled: false' is handled as a PUSH_NON_RETRYABLE_ERROR instead of PUSH_SUBSYSTEM_DOWN, in order to
|
|
100
96
|
// close the sseClient in case the org has been bloqued while the instance was connected to streaming
|
|
101
97
|
if (!authData.pushEnabled) {
|
|
102
98
|
log.info(constants_2.STREAMING_DISABLED);
|
|
103
|
-
pushEmitter.emit(constants_1.
|
|
99
|
+
pushEmitter.emit(constants_1.PUSH_NON_RETRYABLE_ERROR);
|
|
104
100
|
return;
|
|
105
101
|
}
|
|
106
102
|
// [Only for client-side] don't open SSE connection if a new shared client was added, since it means that a new authentication is taking place
|
|
@@ -115,7 +111,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
115
111
|
// Handle 4XX HTTP errors: 401 (invalid SDK Key) or 400 (using incorrect SDK Key, i.e., client-side SDK Key on server-side)
|
|
116
112
|
if (error.statusCode >= 400 && error.statusCode < 500) {
|
|
117
113
|
telemetryTracker.streamingEvent(constants_3.AUTH_REJECTION);
|
|
118
|
-
pushEmitter.emit(constants_1.
|
|
114
|
+
pushEmitter.emit(constants_1.PUSH_NON_RETRYABLE_ERROR);
|
|
119
115
|
return;
|
|
120
116
|
}
|
|
121
117
|
// Handle other HTTP and network errors as recoverable errors
|
|
@@ -139,7 +135,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
139
135
|
}
|
|
140
136
|
// cancel scheduled fetch retries of Splits, Segments, and MySegments Update Workers
|
|
141
137
|
function stopWorkers() {
|
|
142
|
-
|
|
138
|
+
definitionsUpdateWorker.stop();
|
|
143
139
|
if (userKey)
|
|
144
140
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
145
141
|
var worker = _a.worker;
|
|
@@ -155,7 +151,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
155
151
|
connectPushRetryBackoff.reset();
|
|
156
152
|
});
|
|
157
153
|
/** Fallback to polling without retry due to: STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE and Authentication errors */
|
|
158
|
-
pushEmitter.on(constants_1.
|
|
154
|
+
pushEmitter.on(constants_1.PUSH_NON_RETRYABLE_ERROR, function handleNonRetryableError() {
|
|
159
155
|
disabled = true;
|
|
160
156
|
// Note: `stopWorkers` is been called twice, but it is not harmful
|
|
161
157
|
disconnectPush();
|
|
@@ -181,9 +177,12 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
181
177
|
connectPush();
|
|
182
178
|
});
|
|
183
179
|
/** Functions related to synchronization (Queues and Workers in the spec) */
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
pushEmitter.on(constants_1.
|
|
180
|
+
// Some notification types are specific to the Feature flags or Configs SDKs. Their handlers are
|
|
181
|
+
// registered unconditionally, since the SDK only subscribes to the channels of its own entities.
|
|
182
|
+
pushEmitter.on(constants_1.SPLIT_KILL, definitionsUpdateWorker.killDefinition);
|
|
183
|
+
pushEmitter.on(constants_1.SPLIT_UPDATE, definitionsUpdateWorker.put);
|
|
184
|
+
pushEmitter.on(constants_1.CONFIG_UPDATE, definitionsUpdateWorker.put);
|
|
185
|
+
pushEmitter.on(constants_1.RB_SEGMENT_UPDATE, definitionsUpdateWorker.put);
|
|
187
186
|
function handleMySegmentsUpdate(parsedData) {
|
|
188
187
|
switch (parsedData.u) {
|
|
189
188
|
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
@@ -206,7 +205,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
206
205
|
case types_1.UpdateStrategy.KeyList: {
|
|
207
206
|
var keyList = void 0, added_1, removed_1;
|
|
208
207
|
try {
|
|
209
|
-
keyList = (0, parseUtils_1.
|
|
208
|
+
keyList = (0, parseUtils_1.parseCompressedData)(parsedData.d, parsedData.c);
|
|
210
209
|
added_1 = new Set(keyList.a);
|
|
211
210
|
removed_1 = new Set(keyList.r);
|
|
212
211
|
}
|
|
@@ -285,9 +284,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
285
284
|
},
|
|
286
285
|
// [Only for client-side]
|
|
287
286
|
add: function (userKey, mySegmentsSyncTask) {
|
|
288
|
-
|
|
289
|
-
if (!userKeyHashes[hash]) {
|
|
290
|
-
userKeyHashes[hash] = userKey;
|
|
287
|
+
if (!clients[userKey]) {
|
|
291
288
|
clients[userKey] = {
|
|
292
289
|
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
293
290
|
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
|
|
@@ -308,8 +305,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
308
305
|
},
|
|
309
306
|
// [Only for client-side]
|
|
310
307
|
remove: function (userKey) {
|
|
311
|
-
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
312
|
-
delete userKeyHashes[hash];
|
|
313
308
|
delete clients[userKey];
|
|
314
309
|
}
|
|
315
310
|
});
|
|
@@ -7,7 +7,7 @@ var constants_1 = require("../../logger/constants");
|
|
|
7
7
|
* Submitter that periodically posts tracked events
|
|
8
8
|
*/
|
|
9
9
|
function eventsSubmitterFactory(params) {
|
|
10
|
-
var _a = params.settings, log = _a.log, eventsPushRate = _a.scheduler.eventsPushRate, eventsFirstPushWindow = _a.startup.eventsFirstPushWindow, postEventsBulk = params.
|
|
10
|
+
var _a = params.settings, log = _a.log, eventsPushRate = _a.scheduler.eventsPushRate, eventsFirstPushWindow = _a.startup.eventsFirstPushWindow, postEventsBulk = params.serviceApi.postEventsBulk, events = params.storage.events;
|
|
11
11
|
// don't retry events.
|
|
12
12
|
var submitter = (0, submitter_1.submitterFactory)(log, postEventsBulk, events, eventsPushRate);
|
|
13
13
|
// Set a timer for the first push window of events.
|
|
@@ -29,7 +29,7 @@ var IMPRESSIONS_COUNT_RATE = 1800000; // 30 minutes
|
|
|
29
29
|
* Submitter that periodically posts impression counts
|
|
30
30
|
*/
|
|
31
31
|
function impressionCountsSubmitterFactory(params) {
|
|
32
|
-
var log = params.settings.log, postTestImpressionsCount = params.
|
|
32
|
+
var log = params.settings.log, postTestImpressionsCount = params.serviceApi.postTestImpressionsCount, impressionCounts = params.storage.impressionCounts;
|
|
33
33
|
// retry impressions counts only once.
|
|
34
34
|
return (0, submitter_1.submitterFactory)(log, postTestImpressionsCount, impressionCounts, IMPRESSIONS_COUNT_RATE, fromImpressionCountsCollector, 1);
|
|
35
35
|
}
|
|
@@ -14,7 +14,7 @@ function fromImpressionsCollector(sendLabels, data) {
|
|
|
14
14
|
dto.push({
|
|
15
15
|
f: name,
|
|
16
16
|
i: value.map(function (entry) {
|
|
17
|
-
|
|
17
|
+
return {
|
|
18
18
|
k: entry.keyName,
|
|
19
19
|
t: entry.treatment,
|
|
20
20
|
m: entry.time,
|
|
@@ -22,9 +22,10 @@ function fromImpressionsCollector(sendLabels, data) {
|
|
|
22
22
|
r: sendLabels ? entry.label : undefined,
|
|
23
23
|
b: entry.bucketingKey,
|
|
24
24
|
pt: entry.pt,
|
|
25
|
-
properties: entry.properties
|
|
25
|
+
properties: entry.properties,
|
|
26
|
+
// @TODO: add entityType to public SplitIO.ImpressionDTO type
|
|
27
|
+
et: entry.entityType, // Definition type
|
|
26
28
|
};
|
|
27
|
-
return keyImpression;
|
|
28
29
|
})
|
|
29
30
|
});
|
|
30
31
|
});
|
|
@@ -35,7 +36,7 @@ exports.fromImpressionsCollector = fromImpressionsCollector;
|
|
|
35
36
|
* Submitter that periodically posts impressions data
|
|
36
37
|
*/
|
|
37
38
|
function impressionsSubmitterFactory(params) {
|
|
38
|
-
var _a = params.settings, log = _a.log, impressionsRefreshRate = _a.scheduler.impressionsRefreshRate, labelsEnabled = _a.core.labelsEnabled, postTestImpressionsBulk = params.
|
|
39
|
+
var _a = params.settings, log = _a.log, impressionsRefreshRate = _a.scheduler.impressionsRefreshRate, labelsEnabled = _a.core.labelsEnabled, postTestImpressionsBulk = params.serviceApi.postTestImpressionsBulk, impressions = params.storage.impressions;
|
|
39
40
|
// retry impressions only once.
|
|
40
41
|
var syncTask = (0, submitter_1.submitterFactory)(log, postTestImpressionsBulk, impressions, impressionsRefreshRate, fromImpressionsCollector.bind(undefined, labelsEnabled), 1);
|
|
41
42
|
// register impressions submitter to be executed when impressions cache is full
|
|
@@ -107,18 +107,17 @@ function telemetrySubmitterFactory(params) {
|
|
|
107
107
|
var telemetry = params.storage.telemetry, now = params.platform.now;
|
|
108
108
|
if (!telemetry || !now)
|
|
109
109
|
return; // No submitter created if telemetry cache is not defined
|
|
110
|
-
var settings = params.settings, _a = params.settings, log = _a.log, telemetryRefreshRate = _a.scheduler.telemetryRefreshRate,
|
|
110
|
+
var settings = params.settings, _a = params.settings, log = _a.log, telemetryRefreshRate = _a.scheduler.telemetryRefreshRate, serviceApi = params.serviceApi, readiness = params.readiness;
|
|
111
111
|
var stopTimer = (0, timer_1.timer)(now);
|
|
112
|
-
var submitter = (0, submitter_1.firstPushWindowDecorator)((0, submitter_1.submitterFactory)(log,
|
|
112
|
+
var submitter = (0, submitter_1.firstPushWindowDecorator)((0, submitter_1.submitterFactory)(log, serviceApi.postMetricsUsage, telemetry, telemetryRefreshRate, undefined, 0, true), telemetryRefreshRate);
|
|
113
113
|
readiness.gate.once(constants_2.SDK_READY_FROM_CACHE, function () {
|
|
114
114
|
telemetry.recordTimeUntilReadyFromCache(stopTimer());
|
|
115
115
|
});
|
|
116
|
-
sdkReadinessManager.incInternalReadyCbCount();
|
|
117
116
|
readiness.gate.once(constants_2.SDK_READY, function () {
|
|
118
117
|
telemetry.recordTimeUntilReady(stopTimer());
|
|
119
118
|
// Post config data when the SDK is ready and if the telemetry submitter was started
|
|
120
119
|
if (submitter.isRunning()) {
|
|
121
|
-
var postMetricsConfigTask = (0, submitter_1.submitterFactory)(log,
|
|
120
|
+
var postMetricsConfigTask = (0, submitter_1.submitterFactory)(log, serviceApi.postMetricsConfig, telemetryCacheConfigAdapter(telemetry, settings), 0, undefined, 0, true);
|
|
122
121
|
postMetricsConfigTask.execute();
|
|
123
122
|
}
|
|
124
123
|
});
|
|
@@ -8,7 +8,7 @@ var UNIQUE_KEYS_RATE = 900000; // 15 minutes
|
|
|
8
8
|
* Submitter that periodically posts impression counts
|
|
9
9
|
*/
|
|
10
10
|
function uniqueKeysSubmitterFactory(params) {
|
|
11
|
-
var _a = params.settings, log = _a.log, key = _a.core.key, _b = params.
|
|
11
|
+
var _a = params.settings, log = _a.log, key = _a.core.key, _b = params.serviceApi, postUniqueKeysBulkCs = _b.postUniqueKeysBulkCs, postUniqueKeysBulkSs = _b.postUniqueKeysBulkSs, uniqueKeys = params.storage.uniqueKeys;
|
|
12
12
|
var isClientSide = key !== undefined;
|
|
13
13
|
var postUniqueKeysBulk = isClientSide ? postUniqueKeysBulkCs : postUniqueKeysBulkSs;
|
|
14
14
|
var syncTask = (0, submitter_1.submitterFactory)(log, postUniqueKeysBulk, uniqueKeys, UNIQUE_KEYS_RATE);
|
|
@@ -7,7 +7,7 @@ var constants_2 = require("../logger/constants");
|
|
|
7
7
|
var consent_1 = require("../consent");
|
|
8
8
|
var constants_3 = require("../utils/constants");
|
|
9
9
|
var constants_4 = require("../readiness/constants");
|
|
10
|
-
var
|
|
10
|
+
var AbstractDefinitionsCacheSync_1 = require("../storages/AbstractDefinitionsCacheSync");
|
|
11
11
|
/**
|
|
12
12
|
* Online SyncManager factory.
|
|
13
13
|
* Can be used for server-side API, and client-side API with or without multiple clients.
|
|
@@ -29,7 +29,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
29
29
|
pushManagerFactory(params, pollingManager) :
|
|
30
30
|
undefined;
|
|
31
31
|
/** Submitter Manager */
|
|
32
|
-
// It is not
|
|
32
|
+
// It is not injected as push and polling managers, because at the moment it is required
|
|
33
33
|
var submitterManager = (0, submitterManager_1.submitterManagerFactory)(params);
|
|
34
34
|
/** Sync Manager logic */
|
|
35
35
|
function startPolling() {
|
|
@@ -77,7 +77,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
77
77
|
if (startFirstTime) {
|
|
78
78
|
// Emits SDK_READY_FROM_CACHE
|
|
79
79
|
if (!cacheMetadata.initialCacheLoad) {
|
|
80
|
-
readiness.
|
|
80
|
+
readiness.definitions.emit(constants_4.SDK_DEFINITIONS_CACHE_LOADED, cacheMetadata);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
// start syncing splits and segments
|
|
@@ -136,7 +136,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
136
136
|
if (pushManager) {
|
|
137
137
|
if (pollingManager.isRunning()) {
|
|
138
138
|
// if doing polling, we must start the periodic fetch of data
|
|
139
|
-
if ((0,
|
|
139
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
140
140
|
mySegmentsSyncTask.start();
|
|
141
141
|
}
|
|
142
142
|
else {
|
|
@@ -146,7 +146,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
else {
|
|
149
|
-
if ((0,
|
|
149
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
150
150
|
mySegmentsSyncTask.start();
|
|
151
151
|
}
|
|
152
152
|
}
|