@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
|
@@ -14,7 +14,7 @@ var constants_2 = require("../utils/constants");
|
|
|
14
14
|
* @param integrationsManager optional integrations manager
|
|
15
15
|
* @param strategy strategy for impressions tracking.
|
|
16
16
|
*/
|
|
17
|
-
function impressionsTrackerFactory(settings, impressionsCache, strategy,
|
|
17
|
+
function impressionsTrackerFactory(settings, impressionsCache, strategy, integrationsManager, telemetryCache) {
|
|
18
18
|
var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
|
|
19
19
|
return {
|
|
20
20
|
track: function (impressions, attributes) {
|
|
@@ -54,20 +54,18 @@ function impressionsTrackerFactory(settings, impressionsCache, strategy, whenIni
|
|
|
54
54
|
sdkLanguageVersion: version
|
|
55
55
|
};
|
|
56
56
|
// Wrap in a timeout because we don't want it to be blocking.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
});
|
|
70
|
-
});
|
|
57
|
+
setTimeout(function () {
|
|
58
|
+
// integrationsManager.handleImpression does not throw errors
|
|
59
|
+
if (integrationsManager)
|
|
60
|
+
integrationsManager.handleImpression(impressionData);
|
|
61
|
+
try { // @ts-ignore. An exception on the listeners should not break the SDK.
|
|
62
|
+
if (impressionListener)
|
|
63
|
+
impressionListener.logImpression(impressionData);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
log.error(constants_1.ERROR_IMPRESSIONS_LISTENER, [err]);
|
|
67
|
+
}
|
|
68
|
+
}, 0);
|
|
71
69
|
};
|
|
72
70
|
for (var i = 0; i < impressionsToListenerCount; i++) {
|
|
73
71
|
_loop_1(i);
|
|
@@ -19,6 +19,9 @@ var noopFilterAdapter = {
|
|
|
19
19
|
function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
|
|
20
20
|
if (filterAdapter === void 0) { filterAdapter = noopFilterAdapter; }
|
|
21
21
|
var intervalId;
|
|
22
|
+
if (filterAdapter.refreshRate) {
|
|
23
|
+
intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
|
|
24
|
+
}
|
|
22
25
|
return {
|
|
23
26
|
track: function (key, featureName) {
|
|
24
27
|
if (!filterAdapter.add(key, featureName)) {
|
|
@@ -27,11 +30,6 @@ function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
|
|
|
27
30
|
}
|
|
28
31
|
uniqueKeysCache.track(key, featureName);
|
|
29
32
|
},
|
|
30
|
-
start: function () {
|
|
31
|
-
if (filterAdapter.refreshRate) {
|
|
32
|
-
intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
33
|
stop: function () {
|
|
36
34
|
clearInterval(intervalId);
|
|
37
35
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
|
+
exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
5
5
|
// Special treatments
|
|
6
6
|
exports.CONTROL = 'control';
|
|
7
7
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -64,7 +64,7 @@ exports.EVENTS = 'ev';
|
|
|
64
64
|
exports.TELEMETRY = 'te';
|
|
65
65
|
exports.TOKEN = 'to';
|
|
66
66
|
exports.SEGMENT = 'se';
|
|
67
|
-
exports.
|
|
67
|
+
exports.MY_SEGMENT = 'ms';
|
|
68
68
|
exports.TREATMENT = 't';
|
|
69
69
|
exports.TREATMENTS = 'ts';
|
|
70
70
|
exports.TREATMENT_WITH_CONFIG = 'tc';
|
|
@@ -90,7 +90,6 @@ exports.NON_REQUESTED = 1;
|
|
|
90
90
|
exports.DISABLED = 0;
|
|
91
91
|
exports.ENABLED = 1;
|
|
92
92
|
exports.PAUSED = 2;
|
|
93
|
-
exports.FLAG_SPEC_VERSION = '1.
|
|
93
|
+
exports.FLAG_SPEC_VERSION = '1.1';
|
|
94
94
|
// Matcher types
|
|
95
95
|
exports.IN_SEGMENT = 'IN_SEGMENT';
|
|
96
|
-
exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -186,11 +186,10 @@ function settingsValidation(config, validationParams) {
|
|
|
186
186
|
var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, sync.splitFilters, withDefaults.mode);
|
|
187
187
|
sync.splitFilters = splitFiltersValidation.validFilters;
|
|
188
188
|
sync.__splitFiltersValidation = splitFiltersValidation;
|
|
189
|
-
// ensure a valid flag spec version
|
|
190
189
|
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : constants_1.FLAG_SPEC_VERSION;
|
|
191
190
|
// ensure a valid user consent value
|
|
192
191
|
// @ts-ignore, modify readonly prop
|
|
193
|
-
withDefaults.userConsent = consent
|
|
192
|
+
withDefaults.userConsent = consent(withDefaults);
|
|
194
193
|
return withDefaults;
|
|
195
194
|
}
|
|
196
195
|
exports.settingsValidation = settingsValidation;
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateStorageCS = void 0;
|
|
3
|
+
exports.validateStorageCS = exports.__InLocalStorageMockFactory = void 0;
|
|
4
4
|
var InMemoryStorageCS_1 = require("../../../storages/inMemory/InMemoryStorageCS");
|
|
5
5
|
var constants_1 = require("../../../logger/constants");
|
|
6
6
|
var constants_2 = require("../../../utils/constants");
|
|
7
|
+
function __InLocalStorageMockFactory(params) {
|
|
8
|
+
var result = (0, InMemoryStorageCS_1.InMemoryStorageCSFactory)(params);
|
|
9
|
+
result.splits.checkCache = function () { return true; }; // to emit SDK_READY_FROM_CACHE
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
exports.__InLocalStorageMockFactory = __InLocalStorageMockFactory;
|
|
13
|
+
__InLocalStorageMockFactory.type = constants_2.STORAGE_MEMORY;
|
|
7
14
|
/**
|
|
8
15
|
* This function validates `settings.storage` object
|
|
9
16
|
*
|
|
@@ -20,6 +27,10 @@ function validateStorageCS(settings) {
|
|
|
20
27
|
storage = InMemoryStorageCS_1.InMemoryStorageCSFactory;
|
|
21
28
|
log.error(constants_1.ERROR_STORAGE_INVALID);
|
|
22
29
|
}
|
|
30
|
+
// In localhost mode with InLocalStorage, fallback to a mock InLocalStorage to emit SDK_READY_FROM_CACHE
|
|
31
|
+
if (mode === constants_2.LOCALHOST_MODE && storage.type === constants_2.STORAGE_LOCALSTORAGE) {
|
|
32
|
+
return __InLocalStorageMockFactory;
|
|
33
|
+
}
|
|
23
34
|
if ([constants_2.LOCALHOST_MODE, constants_2.STANDALONE_MODE].indexOf(mode) === -1) {
|
|
24
35
|
// Consumer modes require an async storage
|
|
25
36
|
if (storage.type !== constants_2.STORAGE_PLUGGABLE)
|
|
@@ -12,7 +12,7 @@ var ConsentStatus = {
|
|
|
12
12
|
* The public user consent API exposed via SplitFactory, used to control if the SDK tracks and sends impressions and events or not.
|
|
13
13
|
*/
|
|
14
14
|
export function createUserConsentAPI(params) {
|
|
15
|
-
var settings = params.settings, log = params.settings.log, syncManager = params.syncManager, _a = params.storage, events = _a.events, impressions = _a.impressions, impressionCounts = _a.impressionCounts;
|
|
15
|
+
var settings = params.settings, log = params.settings.log, syncManager = params.syncManager, _a = params.storage, events = _a.events, impressions = _a.impressions, impressionCounts = _a.impressionCounts, uniqueKeys = _a.uniqueKeys;
|
|
16
16
|
if (!isConsentGranted(settings))
|
|
17
17
|
log.info(USER_CONSENT_INITIAL, [settings.userConsent]);
|
|
18
18
|
return {
|
|
@@ -38,7 +38,9 @@ export function createUserConsentAPI(params) {
|
|
|
38
38
|
if (impressions.clear)
|
|
39
39
|
impressions.clear(); // @ts-ignore
|
|
40
40
|
if (impressionCounts && impressionCounts.clear)
|
|
41
|
-
impressionCounts.clear();
|
|
41
|
+
impressionCounts.clear(); // @ts-ignore
|
|
42
|
+
if (uniqueKeys && uniqueKeys.clear)
|
|
43
|
+
uniqueKeys.clear();
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
else {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { allMatcherContext } from './all';
|
|
2
2
|
import { segmentMatcherContext } from './segment';
|
|
3
|
-
import { largeSegmentMatcherContext } from './large_segment';
|
|
4
3
|
import { whitelistMatcherContext } from './whitelist';
|
|
5
4
|
import { equalToMatcherContext } from './eq';
|
|
6
5
|
import { greaterThanEqualMatcherContext } from './gte';
|
|
@@ -44,8 +43,7 @@ var matchers = [
|
|
|
44
43
|
greaterThanEqualToSemverMatcherContext,
|
|
45
44
|
lessThanEqualToSemverMatcherContext,
|
|
46
45
|
betweenSemverMatcherContext,
|
|
47
|
-
inListSemverMatcherContext,
|
|
48
|
-
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
46
|
+
inListSemverMatcherContext, // IN_LIST_SEMVER: 22
|
|
49
47
|
];
|
|
50
48
|
/**
|
|
51
49
|
* Matcher factory.
|
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
import { thenable } from '../../utils/promise/thenable';
|
|
2
1
|
export function segmentMatcherContext(segmentName, storage) {
|
|
3
2
|
return function segmentMatcher(key) {
|
|
4
3
|
var isInSegment = storage.segments.isInSegment(segmentName, key);
|
|
5
|
-
if (thenable(isInSegment)) {
|
|
6
|
-
isInSegment.then(function (result) {
|
|
7
|
-
return result;
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
4
|
return isInSegment;
|
|
11
5
|
};
|
|
12
6
|
}
|
|
@@ -9,7 +9,7 @@ import { zeroSinceHH, zeroSinceSS } from '../convertions';
|
|
|
9
9
|
*/
|
|
10
10
|
export function matchersTransform(matchers) {
|
|
11
11
|
var parsedMatchers = matchers.map(function (matcher) {
|
|
12
|
-
var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData,
|
|
12
|
+
var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
|
|
13
13
|
var attribute = keySelector && keySelector.attribute;
|
|
14
14
|
var type = matcherTypesMapper(matcherType);
|
|
15
15
|
// As default input data type we use string (even for ALL_KEYS)
|
|
@@ -18,9 +18,6 @@ export function matchersTransform(matchers) {
|
|
|
18
18
|
if (type === matcherTypes.IN_SEGMENT) {
|
|
19
19
|
value = segmentTransform(userDefinedSegmentMatcherData);
|
|
20
20
|
}
|
|
21
|
-
else if (type === matcherTypes.IN_LARGE_SEGMENT) {
|
|
22
|
-
value = segmentTransform(userDefinedLargeSegmentMatcherData);
|
|
23
|
-
}
|
|
24
21
|
else if (type === matcherTypes.EQUAL_TO) {
|
|
25
22
|
value = numericTransform(unaryNumericMatcherData);
|
|
26
23
|
dataType = matcherDataTypes.NUMBER;
|
package/esm/logger/constants.js
CHANGED
|
@@ -77,7 +77,7 @@ export var WARN_SPLITS_FILTER_IGNORED = 219;
|
|
|
77
77
|
export var WARN_SPLITS_FILTER_INVALID = 220;
|
|
78
78
|
export var WARN_SPLITS_FILTER_EMPTY = 221;
|
|
79
79
|
export var WARN_SDK_KEY = 222;
|
|
80
|
-
export var
|
|
80
|
+
export var STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = 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;
|
|
@@ -20,7 +20,7 @@ export var codesInfo = codesWarn.concat([
|
|
|
20
20
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
21
21
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
22
22
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
|
|
23
|
-
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and
|
|
23
|
+
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
|
|
24
24
|
[c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
|
|
25
25
|
[c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
|
|
26
26
|
[c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
|
|
@@ -30,7 +30,7 @@ export var codesWarn = codesError.concat([
|
|
|
30
30
|
[c.WARN_SPLITS_FILTER_INVALID, c.LOG_PREFIX_SETTINGS + ': feature flag filter at position %s is invalid. It must be an object with a valid filter type ("bySet", "byName" or "byPrefix") and a list of "values".'],
|
|
31
31
|
[c.WARN_SPLITS_FILTER_EMPTY, c.LOG_PREFIX_SETTINGS + ': feature flag filter configuration must be a non-empty array of filter objects.'],
|
|
32
32
|
[c.WARN_SDK_KEY, c.LOG_PREFIX_SETTINGS + ': You already have %s. We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing it throughout your application'],
|
|
33
|
-
[c.
|
|
33
|
+
[c.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching MySegments 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.'],
|
|
@@ -6,7 +6,7 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
6
6
|
splitsCacheLoaded: false,
|
|
7
7
|
});
|
|
8
8
|
// `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
|
|
9
|
-
// - `/
|
|
9
|
+
// - `/mySegments` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
|
|
10
10
|
// - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
|
|
11
11
|
splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
|
|
12
12
|
splitsEventEmitter.splitsArrived = true; });
|
|
@@ -23,9 +23,9 @@ function segmentsEventEmitterFactory(EventEmitter) {
|
|
|
23
23
|
/**
|
|
24
24
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
25
25
|
*/
|
|
26
|
-
export function readinessManagerFactory(EventEmitter,
|
|
26
|
+
export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
27
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
27
28
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
28
|
-
var readyTimeout = settings.startup.readyTimeout;
|
|
29
29
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
30
30
|
var gate = new EventEmitter();
|
|
31
31
|
var lastUpdate = 0;
|
|
@@ -42,14 +42,17 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
42
42
|
splits.once(SDK_SPLITS_CACHE_LOADED, checkIsReadyFromCache);
|
|
43
43
|
// emit SDK_READY_TIMED_OUT
|
|
44
44
|
var hasTimedout = false;
|
|
45
|
-
var readyTimeoutId;
|
|
46
45
|
function timeout() {
|
|
47
|
-
if (hasTimedout
|
|
46
|
+
if (hasTimedout)
|
|
48
47
|
return;
|
|
49
48
|
hasTimedout = true;
|
|
50
49
|
syncLastUpdate();
|
|
51
50
|
gate.emit(SDK_READY_TIMED_OUT, 'Split SDK emitted SDK_READY_TIMED_OUT event.');
|
|
52
51
|
}
|
|
52
|
+
var readyTimeoutId;
|
|
53
|
+
if (readyTimeout > 0) {
|
|
54
|
+
readyTimeoutId = setTimeout(timeout, readyTimeout);
|
|
55
|
+
}
|
|
53
56
|
// emit SDK_READY and SDK_UPDATE
|
|
54
57
|
var isReady = false;
|
|
55
58
|
splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
@@ -100,9 +103,10 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
100
103
|
splits: splits,
|
|
101
104
|
segments: segments,
|
|
102
105
|
gate: gate,
|
|
103
|
-
shared: function () {
|
|
106
|
+
shared: function (readyTimeout) {
|
|
107
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
104
108
|
refCount++;
|
|
105
|
-
return readinessManagerFactory(EventEmitter,
|
|
109
|
+
return readinessManagerFactory(EventEmitter, readyTimeout, splits);
|
|
106
110
|
},
|
|
107
111
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
108
112
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -110,11 +114,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
110
114
|
// Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
|
|
111
115
|
// tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
|
|
112
116
|
setDestroyed: function () { isDestroyed = true; },
|
|
113
|
-
init: function () {
|
|
114
|
-
if (readyTimeout > 0) {
|
|
115
|
-
readyTimeoutId = setTimeout(timeout, readyTimeout);
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
117
|
destroy: function () {
|
|
119
118
|
isDestroyed = true;
|
|
120
119
|
syncLastUpdate();
|
|
@@ -12,9 +12,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
|
|
|
12
12
|
* @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
|
|
13
13
|
* @param readinessManager optional readinessManager to use. only used internally for `shared` method
|
|
14
14
|
*/
|
|
15
|
-
export function sdkReadinessManagerFactory(EventEmitter,
|
|
16
|
-
if (
|
|
17
|
-
|
|
15
|
+
export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager) {
|
|
16
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
17
|
+
if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, readyTimeout); }
|
|
18
18
|
/** Ready callback warning */
|
|
19
19
|
var internalReadyCbCount = 0;
|
|
20
20
|
var readyCbCount = 0;
|
|
@@ -57,8 +57,9 @@ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessMana
|
|
|
57
57
|
}
|
|
58
58
|
return {
|
|
59
59
|
readinessManager: readinessManager,
|
|
60
|
-
shared: function () {
|
|
61
|
-
|
|
60
|
+
shared: function (readyTimeout) {
|
|
61
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
62
|
+
return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
|
|
62
63
|
},
|
|
63
64
|
incInternalReadyCbCount: function () {
|
|
64
65
|
internalReadyCbCount++;
|
|
@@ -50,11 +50,11 @@ export function sdkClientFactory(params, isSharedClient) {
|
|
|
50
50
|
// Stop background jobs
|
|
51
51
|
syncManager && syncManager.stop();
|
|
52
52
|
return __flush().then(function () {
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// Cleanup event listeners
|
|
54
|
+
signalListener && signalListener.stop();
|
|
55
|
+
// @TODO stop only if last client is destroyed
|
|
56
|
+
if (uniqueKeysTracker)
|
|
57
|
+
uniqueKeysTracker.stop();
|
|
58
58
|
// Cleanup storage
|
|
59
59
|
return storage.destroy();
|
|
60
60
|
});
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { sdkClientFactory } from './sdkClient';
|
|
2
2
|
import { RETRIEVE_CLIENT_DEFAULT } from '../logger/constants';
|
|
3
3
|
/**
|
|
4
|
-
* Factory of client method for server-side SDKs
|
|
4
|
+
* Factory of client method for server-side SDKs (ISDK and IAsyncSDK)
|
|
5
5
|
*/
|
|
6
6
|
export function sdkClientMethodFactory(params) {
|
|
7
7
|
var log = params.settings.log;
|
|
8
8
|
var clientInstance = sdkClientFactory(params);
|
|
9
|
-
// Only one client in server-side without bound key
|
|
10
|
-
params.clients[''] = clientInstance;
|
|
11
9
|
return function client() {
|
|
12
10
|
if (arguments.length > 0) {
|
|
13
11
|
throw new Error('Shared Client not supported by the storage mechanism. Create isolated instances instead.');
|
|
@@ -5,18 +5,22 @@ import { sdkClientFactory } from './sdkClient';
|
|
|
5
5
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
6
6
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
|
|
7
7
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
8
|
-
|
|
8
|
+
function buildInstanceId(key) {
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
|
|
11
|
+
}
|
|
9
12
|
/**
|
|
10
13
|
* Factory of client method for the client-side API variant where TT is ignored.
|
|
11
14
|
* Therefore, clients don't have a bound TT for the track method.
|
|
12
15
|
*/
|
|
13
16
|
export function sdkClientMethodCSFactory(params) {
|
|
14
|
-
var
|
|
17
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
15
18
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
16
19
|
var parsedDefaultKey = keyParser(key);
|
|
17
20
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
18
21
|
// Cache instances created per factory.
|
|
19
|
-
|
|
22
|
+
var clientInstances = {};
|
|
23
|
+
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
20
24
|
return function client(key) {
|
|
21
25
|
if (key === undefined) {
|
|
22
26
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -28,9 +32,9 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
28
32
|
throw new Error('Shared Client needs a valid key.');
|
|
29
33
|
}
|
|
30
34
|
var instanceId = buildInstanceId(validKey);
|
|
31
|
-
if (!
|
|
35
|
+
if (!clientInstances[instanceId]) {
|
|
32
36
|
var matchingKey = getMatching(validKey);
|
|
33
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
37
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
|
34
38
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
35
39
|
if (err) {
|
|
36
40
|
sharedSdkReadiness_1.readinessManager.timeout();
|
|
@@ -44,23 +48,21 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
44
48
|
// - Consumer mode: both syncManager and sharedSyncManager are undefined
|
|
45
49
|
// - Consumer partial mode: syncManager is defined (only for submitters) but sharedSyncManager is undefined
|
|
46
50
|
// @ts-ignore
|
|
47
|
-
var
|
|
51
|
+
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
48
52
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
49
53
|
// will use offline or online mode. We should stick with the original decision.
|
|
50
|
-
|
|
54
|
+
clientInstances[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
|
|
51
55
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
52
56
|
storage: sharedStorage || storage,
|
|
53
|
-
syncManager:
|
|
57
|
+
syncManager: sharedSyncManager,
|
|
58
|
+
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
54
59
|
}), true), validKey);
|
|
55
|
-
|
|
56
|
-
sharedSdkReadiness_1.readinessManager.init();
|
|
57
|
-
sharedSyncManager_1 && sharedSyncManager_1.start();
|
|
58
|
-
});
|
|
60
|
+
sharedSyncManager && sharedSyncManager.start();
|
|
59
61
|
log.info(NEW_SHARED_CLIENT);
|
|
60
62
|
}
|
|
61
63
|
else {
|
|
62
64
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
63
65
|
}
|
|
64
|
-
return
|
|
66
|
+
return clientInstances[instanceId];
|
|
65
67
|
};
|
|
66
68
|
}
|
|
@@ -6,19 +6,23 @@ import { sdkClientFactory } from './sdkClient';
|
|
|
6
6
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
7
7
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
|
|
8
8
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
9
|
-
|
|
9
|
+
function buildInstanceId(key, trafficType) {
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
|
|
12
|
+
}
|
|
10
13
|
/**
|
|
11
14
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
12
15
|
* where clients can have a bound TT for the track method, which is provided via the settings
|
|
13
16
|
* (default client) or the client method (shared clients).
|
|
14
17
|
*/
|
|
15
18
|
export function sdkClientMethodCSFactory(params) {
|
|
16
|
-
var
|
|
19
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
17
20
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key, trafficType);
|
|
18
21
|
var parsedDefaultKey = keyParser(key);
|
|
19
22
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
20
23
|
// Cache instances created per factory.
|
|
21
|
-
|
|
24
|
+
var clientInstances = {};
|
|
25
|
+
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
22
26
|
return function client(key, trafficType) {
|
|
23
27
|
if (key === undefined) {
|
|
24
28
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -37,9 +41,9 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
43
|
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
40
|
-
if (!
|
|
44
|
+
if (!clientInstances[instanceId]) {
|
|
41
45
|
var matchingKey = getMatching(validKey);
|
|
42
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
46
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
|
43
47
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
44
48
|
if (err) {
|
|
45
49
|
sharedSdkReadiness_1.readinessManager.timeout();
|
|
@@ -53,23 +57,21 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
53
57
|
// - Consumer mode: both syncManager and sharedSyncManager are undefined
|
|
54
58
|
// - Consumer partial mode: syncManager is defined (only for submitters) but sharedSyncManager is undefined
|
|
55
59
|
// @ts-ignore
|
|
56
|
-
var
|
|
60
|
+
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
57
61
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
58
62
|
// will use offline or online mode. We should stick with the original decision.
|
|
59
|
-
|
|
63
|
+
clientInstances[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
|
|
60
64
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
61
65
|
storage: sharedStorage || storage,
|
|
62
|
-
syncManager:
|
|
66
|
+
syncManager: sharedSyncManager,
|
|
67
|
+
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
63
68
|
}), true), validKey, validTrafficType);
|
|
64
|
-
|
|
65
|
-
sharedSdkReadiness_1.readinessManager.init();
|
|
66
|
-
sharedSyncManager_1 && sharedSyncManager_1.start();
|
|
67
|
-
});
|
|
69
|
+
sharedSyncManager && sharedSyncManager.start();
|
|
68
70
|
log.info(NEW_SHARED_CLIENT);
|
|
69
71
|
}
|
|
70
72
|
else {
|
|
71
73
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
72
74
|
}
|
|
73
|
-
return
|
|
75
|
+
return clientInstances[instanceId];
|
|
74
76
|
};
|
|
75
77
|
}
|
package/esm/sdkFactory/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { telemetryTrackerFactory } from '../trackers/telemetryTracker';
|
|
|
5
5
|
import { validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
|
|
6
6
|
import { createLoggerAPI } from '../logger/sdkLogger';
|
|
7
7
|
import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
|
|
8
|
-
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED
|
|
8
|
+
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
9
9
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
10
10
|
import { strategyDebugFactory } from '../trackers/strategy/strategyDebug';
|
|
11
11
|
import { strategyOptimizedFactory } from '../trackers/strategy/strategyOptimized';
|
|
@@ -16,20 +16,13 @@ import { NONE, OPTIMIZED } from '../utils/constants';
|
|
|
16
16
|
* Modular SDK factory
|
|
17
17
|
*/
|
|
18
18
|
export function sdkFactory(params) {
|
|
19
|
-
var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory, splitApiFactory = params.splitApiFactory, extraProps = params.extraProps, syncManagerFactory = params.syncManagerFactory, SignalListener = params.SignalListener, impressionsObserverFactory = params.impressionsObserverFactory, integrationsManagerFactory = params.integrationsManagerFactory, sdkManagerFactory = params.sdkManagerFactory, sdkClientMethodFactory = params.sdkClientMethodFactory, filterAdapterFactory = params.filterAdapterFactory
|
|
19
|
+
var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory, splitApiFactory = params.splitApiFactory, extraProps = params.extraProps, syncManagerFactory = params.syncManagerFactory, SignalListener = params.SignalListener, impressionsObserverFactory = params.impressionsObserverFactory, integrationsManagerFactory = params.integrationsManagerFactory, sdkManagerFactory = params.sdkManagerFactory, sdkClientMethodFactory = params.sdkClientMethodFactory, filterAdapterFactory = params.filterAdapterFactory;
|
|
20
20
|
var log = settings.log, impressionsMode = settings.sync.impressionsMode;
|
|
21
21
|
// @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid SDK Key, etc.
|
|
22
22
|
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
var
|
|
26
|
-
function whenInit(cb) {
|
|
27
|
-
if (isInit)
|
|
28
|
-
cb();
|
|
29
|
-
else
|
|
30
|
-
initCallbacks.push(cb);
|
|
31
|
-
}
|
|
32
|
-
var sdkReadinessManager = sdkReadinessManagerFactory(platform.EventEmitter, settings);
|
|
23
|
+
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
|
|
24
|
+
validateAndTrackApiKey(log, settings.core.authorizationKey);
|
|
25
|
+
var sdkReadinessManager = sdkReadinessManagerFactory(log, platform.EventEmitter, settings.startup.readyTimeout);
|
|
33
26
|
var readiness = sdkReadinessManager.readinessManager;
|
|
34
27
|
var storage = storageFactory({
|
|
35
28
|
settings: settings,
|
|
@@ -42,11 +35,8 @@ export function sdkFactory(params) {
|
|
|
42
35
|
readiness.splits.emit(SDK_SPLITS_ARRIVED);
|
|
43
36
|
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
44
37
|
},
|
|
45
|
-
onReadyFromCacheCb: function () {
|
|
46
|
-
readiness.splits.emit(SDK_SPLITS_CACHE_LOADED);
|
|
47
|
-
}
|
|
48
38
|
});
|
|
49
|
-
|
|
39
|
+
// @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
|
|
50
40
|
var telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
|
|
51
41
|
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
52
42
|
var observer = impressionsObserverFactory();
|
|
@@ -62,11 +52,11 @@ export function sdkFactory(params) {
|
|
|
62
52
|
default:
|
|
63
53
|
strategy = strategyDebugFactory(observer);
|
|
64
54
|
}
|
|
65
|
-
var impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy,
|
|
66
|
-
var eventTracker = eventTrackerFactory(settings, storage.events,
|
|
55
|
+
var impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy, integrationsManager, storage.telemetry);
|
|
56
|
+
var eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
|
|
67
57
|
// splitApi is used by SyncManager and Browser signal listener
|
|
68
58
|
var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
|
|
69
|
-
var ctx = {
|
|
59
|
+
var ctx = { splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
|
|
70
60
|
var syncManager = syncManagerFactory && syncManagerFactory(ctx);
|
|
71
61
|
ctx.syncManager = syncManager;
|
|
72
62
|
var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
|
|
@@ -74,22 +64,8 @@ export function sdkFactory(params) {
|
|
|
74
64
|
// SDK client and manager
|
|
75
65
|
var clientMethod = sdkClientMethodFactory(ctx);
|
|
76
66
|
var managerInstance = sdkManagerFactory(settings, storage.splits, sdkReadinessManager);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return;
|
|
80
|
-
isInit = true;
|
|
81
|
-
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
|
|
82
|
-
validateAndTrackApiKey(log, settings.core.authorizationKey);
|
|
83
|
-
readiness.init();
|
|
84
|
-
storage.init && storage.init();
|
|
85
|
-
uniqueKeysTracker && uniqueKeysTracker.start();
|
|
86
|
-
syncManager && syncManager.start();
|
|
87
|
-
signalListener && signalListener.start();
|
|
88
|
-
initCallbacks.forEach(function (cb) { return cb(); });
|
|
89
|
-
initCallbacks.length = 0;
|
|
90
|
-
}
|
|
91
|
-
if (!isPure)
|
|
92
|
-
init();
|
|
67
|
+
syncManager && syncManager.start();
|
|
68
|
+
signalListener && signalListener.start();
|
|
93
69
|
log.info(NEW_FACTORY);
|
|
94
70
|
// @ts-ignore
|
|
95
71
|
return objectAssign({
|
|
@@ -103,8 +79,5 @@ export function sdkFactory(params) {
|
|
|
103
79
|
// Logger wrapper API
|
|
104
80
|
Logger: createLoggerAPI(log),
|
|
105
81
|
settings: settings,
|
|
106
|
-
|
|
107
|
-
return Promise.all(Object.keys(clients).map(function (key) { return clients[key].destroy(); })).then(function () { });
|
|
108
|
-
}
|
|
109
|
-
}, extraProps && extraProps(ctx), isPure && { init: init });
|
|
82
|
+
}, extraProps && extraProps(ctx));
|
|
110
83
|
}
|