@splitsoftware/splitio-commons 1.17.1-rc.4 → 1.17.1
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 -29
- 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 +8 -18
- 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 +15 -9
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +15 -9
- package/cjs/sdkFactory/index.js +10 -32
- 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 +33 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +1 -2
- package/cjs/storages/KeyBuilderCS.js +5 -23
- package/cjs/storages/dataLoader.js +1 -1
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
- package/cjs/storages/inLocalStorage/index.js +2 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -6
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +28 -14
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +9 -8
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/cjs/storages/inRedis/SegmentsCacheInRedis.js +21 -15
- package/cjs/storages/inRedis/index.js +11 -5
- package/cjs/storages/pluggable/SegmentsCachePluggable.js +34 -13
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/offline/syncManagerOffline.js +11 -18
- 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/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +28 -12
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +1 -1
- 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/syncManagerOnline.js +21 -20
- package/cjs/sync/syncTask.js +2 -2
- package/cjs/trackers/eventTracker.js +10 -12
- package/cjs/trackers/impressionsTracker.js +14 -16
- package/cjs/trackers/uniqueKeysTracker.js +3 -5
- package/cjs/utils/constants/index.js +4 -5
- package/cjs/utils/settingsValidation/index.js +1 -2
- 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 +8 -18
- 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 +13 -7
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +13 -7
- package/esm/sdkFactory/index.js +10 -32
- 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 +30 -0
- package/esm/storages/AbstractSplitsCacheSync.js +2 -3
- package/esm/storages/KeyBuilderCS.js +4 -21
- package/esm/storages/dataLoader.js +1 -1
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
- package/esm/storages/inLocalStorage/index.js +3 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +1 -6
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +28 -14
- package/esm/storages/inMemory/SplitsCacheInMemory.js +9 -8
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/esm/storages/inRedis/SegmentsCacheInRedis.js +21 -15
- package/esm/storages/inRedis/index.js +11 -5
- package/esm/storages/pluggable/SegmentsCachePluggable.js +34 -13
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/offline/syncManagerOffline.js +11 -18
- 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/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +28 -12
- package/esm/sync/polling/updaters/splitChangesUpdater.js +1 -1
- 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/syncManagerOnline.js +21 -20
- package/esm/sync/syncTask.js +2 -2
- package/esm/trackers/eventTracker.js +10 -12
- package/esm/trackers/impressionsTracker.js +14 -16
- package/esm/trackers/uniqueKeysTracker.js +3 -5
- package/esm/utils/constants/index.js +2 -3
- package/esm/utils/settingsValidation/index.js +1 -2
- package/package.json +2 -2
- 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 +8 -19
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -5
- package/src/sdkClient/sdkClient.ts +5 -5
- package/src/sdkClient/sdkClientMethod.ts +1 -4
- package/src/sdkClient/sdkClientMethodCS.ts +15 -7
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +15 -7
- package/src/sdkFactory/index.ts +12 -35
- package/src/sdkFactory/types.ts +1 -4
- 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 +68 -0
- package/src/storages/AbstractSplitsCacheSync.ts +3 -4
- package/src/storages/KeyBuilderCS.ts +5 -34
- package/src/storages/dataLoader.ts +1 -1
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +63 -33
- package/src/storages/inLocalStorage/index.ts +4 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +1 -6
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +47 -13
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +27 -13
- package/src/storages/inMemory/SplitsCacheInMemory.ts +9 -7
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
- package/src/storages/inRedis/SegmentsCacheInRedis.ts +24 -15
- package/src/storages/inRedis/index.ts +12 -6
- package/src/storages/pluggable/SegmentsCachePluggable.ts +37 -13
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +17 -15
- package/src/sync/offline/syncManagerOffline.ts +13 -21
- 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/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 +29 -13
- package/src/sync/polling/updaters/splitChangesUpdater.ts +1 -1
- 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/syncManagerOnline.ts +17 -17
- package/src/sync/syncTask.ts +2 -2
- package/src/sync/types.ts +1 -1
- package/src/trackers/eventTracker.ts +8 -11
- package/src/trackers/impressionsTracker.ts +10 -13
- package/src/trackers/types.ts +0 -1
- package/src/trackers/uniqueKeysTracker.ts +4 -6
- package/src/types.ts +1 -7
- package/src/utils/constants/index.ts +2 -3
- package/src/utils/settingsValidation/index.ts +2 -3
- 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 -5
- package/types/sdkClient/sdkClientMethod.d.ts +1 -1
- package/types/sdkFactory/types.d.ts +1 -3
- 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/AbstractSplitsCacheSync.d.ts +1 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -9
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +18 -8
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +13 -7
- package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +8 -6
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -1
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
- package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +4 -7
- package/types/storages/inRedis/index.d.ts +1 -1
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +17 -5
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +15 -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/sync/types.d.ts +1 -1
- 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 +1 -7
- package/types/utils/constants/index.d.ts +2 -3
- 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/cjs/storages/AbstractMySegmentsCacheSync.js +0 -60
- package/esm/evaluator/matchers/large_segment.js +0 -12
- package/esm/sdkClient/identity.js +0 -3
- package/esm/storages/AbstractMySegmentsCacheSync.js +0 -57
- package/src/evaluator/matchers/large_segment.ts +0 -18
- package/src/sdkClient/identity.ts +0 -5
- package/src/storages/AbstractMySegmentsCacheSync.ts +0 -94
- 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
|
@@ -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;
|
|
@@ -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.'],
|
|
@@ -4,11 +4,9 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
4
4
|
var splitsEventEmitter = objectAssign(new EventEmitter(), {
|
|
5
5
|
splitsArrived: false,
|
|
6
6
|
splitsCacheLoaded: false,
|
|
7
|
-
initialized: false,
|
|
8
|
-
initCallbacks: []
|
|
9
7
|
});
|
|
10
8
|
// `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
|
|
11
|
-
// - `/
|
|
9
|
+
// - `/mySegments` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
|
|
12
10
|
// - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
|
|
13
11
|
splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
|
|
14
12
|
splitsEventEmitter.splitsArrived = true; });
|
|
@@ -25,9 +23,9 @@ function segmentsEventEmitterFactory(EventEmitter) {
|
|
|
25
23
|
/**
|
|
26
24
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
27
25
|
*/
|
|
28
|
-
export function readinessManagerFactory(EventEmitter,
|
|
26
|
+
export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
27
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
29
28
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
30
|
-
var readyTimeout = settings.startup.readyTimeout;
|
|
31
29
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
32
30
|
var gate = new EventEmitter();
|
|
33
31
|
var lastUpdate = 0;
|
|
@@ -45,7 +43,7 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
45
43
|
// emit SDK_READY_TIMED_OUT
|
|
46
44
|
var hasTimedout = false;
|
|
47
45
|
function timeout() {
|
|
48
|
-
if (hasTimedout
|
|
46
|
+
if (hasTimedout)
|
|
49
47
|
return;
|
|
50
48
|
hasTimedout = true;
|
|
51
49
|
syncLastUpdate();
|
|
@@ -53,10 +51,7 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
53
51
|
}
|
|
54
52
|
var readyTimeoutId;
|
|
55
53
|
if (readyTimeout > 0) {
|
|
56
|
-
|
|
57
|
-
readyTimeoutId = setTimeout(timeout, readyTimeout);
|
|
58
|
-
else
|
|
59
|
-
splits.initCallbacks.push(function () { readyTimeoutId = setTimeout(timeout, readyTimeout); });
|
|
54
|
+
readyTimeoutId = setTimeout(timeout, readyTimeout);
|
|
60
55
|
}
|
|
61
56
|
// emit SDK_READY and SDK_UPDATE
|
|
62
57
|
var isReady = false;
|
|
@@ -108,9 +103,10 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
108
103
|
splits: splits,
|
|
109
104
|
segments: segments,
|
|
110
105
|
gate: gate,
|
|
111
|
-
shared: function () {
|
|
106
|
+
shared: function (readyTimeout) {
|
|
107
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
112
108
|
refCount++;
|
|
113
|
-
return readinessManagerFactory(EventEmitter,
|
|
109
|
+
return readinessManagerFactory(EventEmitter, readyTimeout, splits);
|
|
114
110
|
},
|
|
115
111
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
116
112
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -118,12 +114,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
118
114
|
// Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
|
|
119
115
|
// tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
|
|
120
116
|
setDestroyed: function () { isDestroyed = true; },
|
|
121
|
-
init: function () {
|
|
122
|
-
if (splits.initialized)
|
|
123
|
-
return;
|
|
124
|
-
splits.initialized = true;
|
|
125
|
-
splits.initCallbacks.forEach(function (cb) { return cb(); });
|
|
126
|
-
},
|
|
127
117
|
destroy: function () {
|
|
128
118
|
isDestroyed = true;
|
|
129
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();
|
|
@@ -47,16 +51,18 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
47
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
57
|
syncManager: sharedSyncManager,
|
|
58
|
+
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
54
59
|
}), true), validKey);
|
|
60
|
+
sharedSyncManager && sharedSyncManager.start();
|
|
55
61
|
log.info(NEW_SHARED_CLIENT);
|
|
56
62
|
}
|
|
57
63
|
else {
|
|
58
64
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
59
65
|
}
|
|
60
|
-
return
|
|
66
|
+
return clientInstances[instanceId];
|
|
61
67
|
};
|
|
62
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();
|
|
@@ -56,16 +60,18 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
56
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
66
|
syncManager: sharedSyncManager,
|
|
67
|
+
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
63
68
|
}), true), validKey, validTrafficType);
|
|
69
|
+
sharedSyncManager && sharedSyncManager.start();
|
|
64
70
|
log.info(NEW_SHARED_CLIENT);
|
|
65
71
|
}
|
|
66
72
|
else {
|
|
67
73
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
68
74
|
}
|
|
69
|
-
return
|
|
75
|
+
return clientInstances[instanceId];
|
|
70
76
|
};
|
|
71
77
|
}
|
package/esm/sdkFactory/index.js
CHANGED
|
@@ -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 (hasInit)
|
|
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,
|
|
@@ -44,7 +37,6 @@ export function sdkFactory(params) {
|
|
|
44
37
|
},
|
|
45
38
|
});
|
|
46
39
|
// @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
|
|
47
|
-
var clients = {};
|
|
48
40
|
var telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
|
|
49
41
|
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
50
42
|
var observer = impressionsObserverFactory();
|
|
@@ -60,11 +52,11 @@ export function sdkFactory(params) {
|
|
|
60
52
|
default:
|
|
61
53
|
strategy = strategyDebugFactory(observer);
|
|
62
54
|
}
|
|
63
|
-
var impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy,
|
|
64
|
-
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);
|
|
65
57
|
// splitApi is used by SyncManager and Browser signal listener
|
|
66
58
|
var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
|
|
67
|
-
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 };
|
|
68
60
|
var syncManager = syncManagerFactory && syncManagerFactory(ctx);
|
|
69
61
|
ctx.syncManager = syncManager;
|
|
70
62
|
var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
|
|
@@ -72,19 +64,8 @@ export function sdkFactory(params) {
|
|
|
72
64
|
// SDK client and manager
|
|
73
65
|
var clientMethod = sdkClientMethodFactory(ctx);
|
|
74
66
|
var managerInstance = sdkManagerFactory(settings, storage.splits, sdkReadinessManager);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return;
|
|
78
|
-
hasInit = true;
|
|
79
|
-
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
|
|
80
|
-
validateAndTrackApiKey(log, settings.core.authorizationKey);
|
|
81
|
-
readiness.init();
|
|
82
|
-
uniqueKeysTracker && uniqueKeysTracker.start();
|
|
83
|
-
syncManager && syncManager.start();
|
|
84
|
-
signalListener && signalListener.start();
|
|
85
|
-
initCallbacks.forEach(function (cb) { return cb(); });
|
|
86
|
-
initCallbacks.length = 0;
|
|
87
|
-
}
|
|
67
|
+
syncManager && syncManager.start();
|
|
68
|
+
signalListener && signalListener.start();
|
|
88
69
|
log.info(NEW_FACTORY);
|
|
89
70
|
// @ts-ignore
|
|
90
71
|
return objectAssign({
|
|
@@ -98,8 +79,5 @@ export function sdkFactory(params) {
|
|
|
98
79
|
// Logger wrapper API
|
|
99
80
|
Logger: createLoggerAPI(log),
|
|
100
81
|
settings: settings,
|
|
101
|
-
|
|
102
|
-
return Promise.all(Object.keys(clients).map(function (key) { return clients[key].destroy(); })).then(function () { });
|
|
103
|
-
}
|
|
104
|
-
}, extraProps && extraProps(ctx), lazyInit ? { init: init } : init());
|
|
82
|
+
}, extraProps && extraProps(ctx));
|
|
105
83
|
}
|
package/esm/services/splitApi.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { splitHttpClientFactory } from './splitHttpClient';
|
|
2
2
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
3
|
-
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT,
|
|
3
|
+
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT } from '../utils/constants';
|
|
4
4
|
import { ERROR_TOO_MANY_SETS } from '../logger/constants';
|
|
5
5
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
6
6
|
function userKeyToQueryParam(userKey) {
|
|
@@ -51,15 +51,15 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
51
51
|
var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : '');
|
|
52
52
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SEGMENT));
|
|
53
53
|
},
|
|
54
|
-
|
|
54
|
+
fetchMySegments: function (userMatchingKey, noCache) {
|
|
55
55
|
/**
|
|
56
56
|
* URI encoding of user keys in order to:
|
|
57
|
-
* - avoid 400 responses (due to URI malformed). E.g.: '/api/
|
|
58
|
-
* - avoid 404 responses. E.g.: '/api/
|
|
57
|
+
* - avoid 400 responses (due to URI malformed). E.g.: '/api/mySegments/%'
|
|
58
|
+
* - avoid 404 responses. E.g.: '/api/mySegments/foo/bar'
|
|
59
59
|
* - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
|
|
60
60
|
*/
|
|
61
|
-
var url = urls.sdk + "/
|
|
62
|
-
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(
|
|
61
|
+
var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
|
|
62
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_SEGMENT));
|
|
63
63
|
},
|
|
64
64
|
/**
|
|
65
65
|
* Post events.
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
2
|
import { ERROR_HTTP, ERROR_CLIENT_CANNOT_GET_READY } from '../logger/constants';
|
|
3
|
-
import { decorateHeaders } from './decorateHeaders';
|
|
3
|
+
import { decorateHeaders, removeNonISO88591 } from './decorateHeaders';
|
|
4
|
+
import { timeout } from '../utils/promise/timeout';
|
|
5
|
+
var PENDING_FETCH_ERROR_TIMEOUT = 100;
|
|
4
6
|
var messageNoFetch = 'Global fetch API is not available.';
|
|
5
7
|
/**
|
|
6
8
|
* Factory of Split HTTP clients, which are HTTP clients with predefined headers for Split endpoints.
|
|
@@ -25,7 +27,7 @@ export function splitHttpClientFactory(settings, _a) {
|
|
|
25
27
|
if (ip)
|
|
26
28
|
commonHeaders['SplitSDKMachineIP'] = ip;
|
|
27
29
|
if (hostname)
|
|
28
|
-
commonHeaders['SplitSDKMachineName'] = hostname;
|
|
30
|
+
commonHeaders['SplitSDKMachineName'] = removeNonISO88591(hostname);
|
|
29
31
|
return function httpClient(url, reqOpts, latencyTracker, logErrorsAsInfo) {
|
|
30
32
|
if (reqOpts === void 0) { reqOpts = {}; }
|
|
31
33
|
if (latencyTracker === void 0) { latencyTracker = function () { }; }
|
|
@@ -40,7 +42,8 @@ export function splitHttpClientFactory(settings, _a) {
|
|
|
40
42
|
// https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Checking_that_the_fetch_was_successful
|
|
41
43
|
.then(function (response) {
|
|
42
44
|
if (!response.ok) {
|
|
43
|
-
|
|
45
|
+
// `text()` promise might not settle in some fetch implementations and cases (e.g. no content)
|
|
46
|
+
return timeout(PENDING_FETCH_ERROR_TIMEOUT, response.text()).then(function (message) { return Promise.reject({ response: response, message: message }); }, function () { return Promise.reject({ response: response }); });
|
|
44
47
|
}
|
|
45
48
|
latencyTracker();
|
|
46
49
|
return response;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This class provides a skeletal implementation of the ISegmentsCacheSync interface
|
|
3
|
+
* to minimize the effort required to implement this interface.
|
|
4
|
+
*/
|
|
5
|
+
var AbstractSegmentsCacheSync = /** @class */ (function () {
|
|
6
|
+
function AbstractSegmentsCacheSync() {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* For server-side synchronizer: add the given list of segments to the cache, with an empty list of keys. The segments that already exist are not modified.
|
|
10
|
+
* For client-side synchronizer: the method is not used.
|
|
11
|
+
*/
|
|
12
|
+
AbstractSegmentsCacheSync.prototype.registerSegments = function (names) { return false; };
|
|
13
|
+
/**
|
|
14
|
+
* For server-side synchronizer: set the change number of `name` segment.
|
|
15
|
+
* For client-side synchronizer: the method is not used.
|
|
16
|
+
*/
|
|
17
|
+
AbstractSegmentsCacheSync.prototype.setChangeNumber = function (name, changeNumber) { return true; };
|
|
18
|
+
/**
|
|
19
|
+
* For server-side synchronizer: get the change number of `name` segment.
|
|
20
|
+
* For client-side synchronizer: the method is not used.
|
|
21
|
+
*/
|
|
22
|
+
AbstractSegmentsCacheSync.prototype.getChangeNumber = function (name) { return -1; };
|
|
23
|
+
/**
|
|
24
|
+
* For server-side synchronizer: the method is not used.
|
|
25
|
+
* For client-side synchronizer: reset the cache with the given list of segments.
|
|
26
|
+
*/
|
|
27
|
+
AbstractSegmentsCacheSync.prototype.resetSegments = function (names) { return true; };
|
|
28
|
+
return AbstractSegmentsCacheSync;
|
|
29
|
+
}());
|
|
30
|
+
export { AbstractSegmentsCacheSync };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
|
-
import { IN_SEGMENT
|
|
2
|
+
import { IN_SEGMENT } from '../utils/constants';
|
|
3
3
|
/**
|
|
4
4
|
* This class provides a skeletal implementation of the ISplitsCacheSync interface
|
|
5
5
|
* to minimize the effort required to implement this interface.
|
|
@@ -67,8 +67,7 @@ export function usesSegments(split) {
|
|
|
67
67
|
for (var i = 0; i < conditions.length; i++) {
|
|
68
68
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
69
69
|
for (var j = 0; j < matchers.length; j++) {
|
|
70
|
-
|
|
71
|
-
if (matcher === IN_SEGMENT || matcher === IN_LARGE_SEGMENT)
|
|
70
|
+
if (matchers[j].matcherType === IN_SEGMENT)
|
|
72
71
|
return true;
|
|
73
72
|
}
|
|
74
73
|
}
|
|
@@ -21,6 +21,10 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
21
21
|
return builtSegmentKeyName.substr(prefix.length);
|
|
22
22
|
};
|
|
23
23
|
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
24
|
+
KeyBuilderCS.prototype.buildOldSegmentNameKey = function (segmentName) {
|
|
25
|
+
return this.matchingKey + "." + this.prefix + ".segment." + segmentName;
|
|
26
|
+
};
|
|
27
|
+
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
24
28
|
KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
|
|
25
29
|
var prefix = this.matchingKey + "." + this.prefix + ".segment.";
|
|
26
30
|
if (startsWith(builtSegmentKeyName, prefix))
|
|
@@ -32,27 +36,6 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
32
36
|
KeyBuilderCS.prototype.isSplitsCacheKey = function (key) {
|
|
33
37
|
return this.regexSplitsCacheKey.test(key);
|
|
34
38
|
};
|
|
35
|
-
KeyBuilderCS.prototype.buildTillKey = function () {
|
|
36
|
-
return this.prefix + "." + this.matchingKey + ".segments.till";
|
|
37
|
-
};
|
|
38
39
|
return KeyBuilderCS;
|
|
39
40
|
}(KeyBuilder));
|
|
40
41
|
export { KeyBuilderCS };
|
|
41
|
-
export function myLargeSegmentsKeyBuilder(prefix, matchingKey) {
|
|
42
|
-
return {
|
|
43
|
-
buildSegmentNameKey: function (segmentName) {
|
|
44
|
-
return prefix + "." + matchingKey + ".largeSegment." + segmentName;
|
|
45
|
-
},
|
|
46
|
-
extractSegmentName: function (builtSegmentKeyName) {
|
|
47
|
-
var p = prefix + "." + matchingKey + ".largeSegment.";
|
|
48
|
-
if (startsWith(builtSegmentKeyName, p))
|
|
49
|
-
return builtSegmentKeyName.substr(p.length);
|
|
50
|
-
},
|
|
51
|
-
extractOldSegmentKey: function () {
|
|
52
|
-
return undefined;
|
|
53
|
-
},
|
|
54
|
-
buildTillKey: function () {
|
|
55
|
-
return prefix + "." + matchingKey + ".largeSegments.till";
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}
|