@splitsoftware/splitio-commons 1.16.0 → 1.16.1-rc.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 +3 -0
- package/cjs/evaluator/matchers/index.js +3 -1
- package/cjs/evaluator/matchers/large_segment.js +16 -0
- package/cjs/evaluator/matchers/matcherTypes.js +1 -0
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/info.js +0 -1
- package/cjs/readiness/readinessManager.js +14 -10
- package/cjs/readiness/sdkReadinessManager.js +5 -6
- package/cjs/sdkClient/sdkClientMethodCS.js +3 -4
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +4 -5
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/splitApi.js +4 -0
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +5 -5
- package/cjs/storages/KeyBuilder.js +3 -0
- package/cjs/storages/KeyBuilderCS.js +17 -5
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +16 -4
- package/cjs/storages/inLocalStorage/index.js +6 -2
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +20 -11
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
- package/cjs/sync/polling/pollingManagerCS.js +51 -33
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +5 -6
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -0
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
- package/cjs/sync/streaming/constants.js +2 -1
- package/cjs/sync/streaming/pushManager.js +95 -64
- package/cjs/sync/submitters/telemetrySubmitter.js +2 -0
- package/cjs/sync/syncManagerOnline.js +24 -14
- package/cjs/utils/constants/index.js +5 -1
- package/cjs/utils/settingsValidation/index.js +9 -4
- package/esm/evaluator/matchers/index.js +3 -1
- package/esm/evaluator/matchers/large_segment.js +12 -0
- package/esm/evaluator/matchers/matcherTypes.js +1 -0
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +0 -1
- package/esm/readiness/readinessManager.js +14 -10
- package/esm/readiness/sdkReadinessManager.js +5 -6
- package/esm/sdkClient/sdkClientMethodCS.js +4 -5
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +5 -6
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/splitApi.js +5 -1
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +3 -3
- package/esm/storages/KeyBuilder.js +3 -0
- package/esm/storages/KeyBuilderCS.js +15 -4
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +17 -5
- package/esm/storages/inLocalStorage/index.js +7 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/esm/storages/inMemory/SplitsCacheInMemory.js +21 -12
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
- package/esm/sync/polling/pollingManagerCS.js +52 -34
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -4
- package/esm/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/esm/sync/streaming/SSEHandler/index.js +2 -1
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
- package/esm/sync/streaming/constants.js +1 -0
- package/esm/sync/streaming/pushManager.js +95 -65
- package/esm/sync/submitters/telemetrySubmitter.js +2 -0
- package/esm/sync/syncManagerOnline.js +25 -15
- package/esm/utils/constants/index.js +4 -0
- package/esm/utils/settingsValidation/index.js +10 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +17 -7
- package/src/evaluator/matchers/index.ts +2 -0
- package/src/evaluator/matchers/large_segment.ts +18 -0
- package/src/evaluator/matchers/matcherTypes.ts +1 -0
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +0 -1
- package/src/readiness/readinessManager.ts +13 -9
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +3 -2
- package/src/sdkClient/sdkClientMethodCS.ts +4 -6
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +5 -7
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/splitApi.ts +6 -1
- package/src/services/types.ts +1 -0
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +4 -4
- package/src/storages/KeyBuilder.ts +3 -0
- package/src/storages/KeyBuilderCS.ts +25 -5
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +20 -5
- package/src/storages/inLocalStorage/index.ts +8 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
- package/src/storages/inMemory/SplitsCacheInMemory.ts +15 -10
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +7 -5
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +6 -2
- package/src/sync/polling/pollingManagerCS.ts +61 -29
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
- package/src/sync/polling/types.ts +3 -2
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +5 -8
- package/src/sync/polling/updaters/splitChangesUpdater.ts +4 -3
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +14 -2
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +17 -5
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +100 -63
- package/src/sync/streaming/types.ts +5 -3
- package/src/sync/submitters/telemetrySubmitter.ts +2 -0
- package/src/sync/submitters/types.ts +10 -4
- package/src/sync/syncManagerOnline.ts +19 -11
- package/src/types.ts +26 -1
- package/src/utils/constants/index.ts +5 -0
- package/src/utils/settingsValidation/index.ts +11 -6
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +14 -6
- package/types/evaluator/matchers/large_segment.d.ts +5 -0
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +2 -3
- package/types/readiness/types.d.ts +3 -2
- package/types/services/types.d.ts +1 -0
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +1 -0
- package/types/storages/KeyBuilderCS.d.ts +7 -2
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +3 -2
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +4 -3
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -3
- package/types/sync/polling/types.d.ts +9 -2
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEHandler/types.d.ts +13 -2
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/constants.d.ts +1 -0
- package/types/sync/streaming/pushManager.d.ts +2 -0
- package/types/sync/streaming/types.d.ts +5 -4
- package/types/sync/submitters/types.d.ts +9 -3
- package/types/types.d.ts +25 -0
- package/types/utils/constants/index.d.ts +3 -0
- package/types/utils/settingsValidation/index.d.ts +2 -0
- package/types/utils/settingsValidation/types.d.ts +1 -1
|
@@ -117,43 +117,53 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
117
117
|
shared: function (matchingKey, readinessManager, storage) {
|
|
118
118
|
if (!pollingManager)
|
|
119
119
|
return;
|
|
120
|
-
var
|
|
120
|
+
var _a = pollingManager.add(matchingKey, readinessManager, storage), msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
121
121
|
return {
|
|
122
|
-
isRunning:
|
|
122
|
+
isRunning: msSyncTask.isRunning,
|
|
123
123
|
start: function () {
|
|
124
124
|
if (syncEnabled) {
|
|
125
125
|
if (pushManager) {
|
|
126
126
|
if (pollingManager.isRunning()) {
|
|
127
127
|
// if doing polling, we must start the periodic fetch of data
|
|
128
|
-
if (storage.splits.
|
|
129
|
-
|
|
128
|
+
if (storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
129
|
+
msSyncTask.start();
|
|
130
|
+
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
131
|
+
mlsSyncTask.start();
|
|
130
132
|
}
|
|
131
133
|
else {
|
|
132
134
|
// if not polling, we must execute the sync task for the initial fetch
|
|
133
135
|
// of segments since `syncAll` was already executed when starting the main client
|
|
134
|
-
|
|
136
|
+
msSyncTask.execute();
|
|
137
|
+
mlsSyncTask && mlsSyncTask.execute();
|
|
135
138
|
}
|
|
136
|
-
pushManager.add(matchingKey,
|
|
139
|
+
pushManager.add(matchingKey, msSyncTask, mlsSyncTask);
|
|
137
140
|
}
|
|
138
141
|
else {
|
|
139
|
-
if (storage.splits.
|
|
140
|
-
|
|
142
|
+
if (storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
143
|
+
msSyncTask.start();
|
|
144
|
+
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
145
|
+
mlsSyncTask.start();
|
|
141
146
|
}
|
|
142
147
|
}
|
|
143
148
|
else {
|
|
144
|
-
if (!readinessManager.isReady())
|
|
145
|
-
|
|
149
|
+
if (!readinessManager.isReady()) {
|
|
150
|
+
msSyncTask.execute();
|
|
151
|
+
mlsSyncTask && mlsSyncTask.execute();
|
|
152
|
+
}
|
|
146
153
|
}
|
|
147
154
|
},
|
|
148
155
|
stop: function () {
|
|
149
156
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
150
|
-
var
|
|
151
|
-
if (
|
|
157
|
+
var syncTasks = pollingManager.get(matchingKey);
|
|
158
|
+
if (syncTasks) {
|
|
159
|
+
var msSyncTask_1 = syncTasks.msSyncTask, mlsSyncTask_1 = syncTasks.mlsSyncTask;
|
|
152
160
|
// stop syncing
|
|
153
161
|
if (pushManager)
|
|
154
162
|
pushManager.remove(matchingKey);
|
|
155
|
-
if (
|
|
156
|
-
|
|
163
|
+
if (msSyncTask_1.isRunning())
|
|
164
|
+
msSyncTask_1.stop();
|
|
165
|
+
if (mlsSyncTask_1 && mlsSyncTask_1.isRunning())
|
|
166
|
+
mlsSyncTask_1.stop();
|
|
157
167
|
pollingManager.remove(matchingKey);
|
|
158
168
|
}
|
|
159
169
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
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.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;
|
|
4
|
+
exports.IN_LARGE_SEGMENT = 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 = exports.MY_LARGE_SEGMENT = void 0;
|
|
5
5
|
// Special treatments
|
|
6
6
|
exports.CONTROL = 'control';
|
|
7
7
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -65,6 +65,7 @@ exports.TELEMETRY = 'te';
|
|
|
65
65
|
exports.TOKEN = 'to';
|
|
66
66
|
exports.SEGMENT = 'se';
|
|
67
67
|
exports.MY_SEGMENT = 'ms';
|
|
68
|
+
exports.MY_LARGE_SEGMENT = 'mls';
|
|
68
69
|
exports.TREATMENT = 't';
|
|
69
70
|
exports.TREATMENTS = 'ts';
|
|
70
71
|
exports.TREATMENT_WITH_CONFIG = 'tc';
|
|
@@ -91,3 +92,6 @@ exports.DISABLED = 0;
|
|
|
91
92
|
exports.ENABLED = 1;
|
|
92
93
|
exports.PAUSED = 2;
|
|
93
94
|
exports.FLAG_SPEC_VERSION = '1.1';
|
|
95
|
+
// Matcher types
|
|
96
|
+
exports.IN_SEGMENT = 'IN_SEGMENT';
|
|
97
|
+
exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -30,6 +30,8 @@ exports.base = {
|
|
|
30
30
|
featuresRefreshRate: 60,
|
|
31
31
|
// fetch segments updates each 60 sec
|
|
32
32
|
segmentsRefreshRate: 60,
|
|
33
|
+
// fetch large segments updates each 60 sec
|
|
34
|
+
largeSegmentsRefreshRate: 60,
|
|
33
35
|
// publish telemetry stats each 3600 secs (1 hour)
|
|
34
36
|
telemetryRefreshRate: 3600,
|
|
35
37
|
// publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
|
|
@@ -75,7 +77,8 @@ exports.base = {
|
|
|
75
77
|
impressionsMode: constants_1.OPTIMIZED,
|
|
76
78
|
localhostMode: undefined,
|
|
77
79
|
enabled: true,
|
|
78
|
-
flagSpecVersion: constants_1.FLAG_SPEC_VERSION
|
|
80
|
+
flagSpecVersion: constants_1.FLAG_SPEC_VERSION,
|
|
81
|
+
largeSegmentsEnabled: false
|
|
79
82
|
},
|
|
80
83
|
// Logger
|
|
81
84
|
log: undefined
|
|
@@ -114,6 +117,7 @@ function settingsValidation(config, validationParams) {
|
|
|
114
117
|
var scheduler = withDefaults.scheduler, startup = withDefaults.startup;
|
|
115
118
|
scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
|
|
116
119
|
scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
|
|
120
|
+
scheduler.largeSegmentsRefreshRate = fromSecondsToMillis(scheduler.largeSegmentsRefreshRate);
|
|
117
121
|
scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
|
|
118
122
|
scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
|
|
119
123
|
scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
|
|
@@ -146,12 +150,12 @@ function settingsValidation(config, validationParams) {
|
|
|
146
150
|
// Keeping same behaviour than JS SDK: if settings key or TT are invalid,
|
|
147
151
|
// `false` value is used as bound key/TT of the default client, which leads to some issues.
|
|
148
152
|
// @ts-ignore, @TODO handle invalid keys as a non-recoverable error?
|
|
149
|
-
withDefaults.core.key = (0, key_1.validateKey)(log, maybeKey,
|
|
153
|
+
withDefaults.core.key = (0, key_1.validateKey)(log, maybeKey, constants_2.LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
150
154
|
}
|
|
151
155
|
if (validationParams.acceptTT) {
|
|
152
156
|
var maybeTT = withDefaults.core.trafficType;
|
|
153
157
|
if (maybeTT !== undefined) { // @ts-ignore
|
|
154
|
-
withDefaults.core.trafficType = (0, trafficType_1.validateTrafficType)(log, maybeTT,
|
|
158
|
+
withDefaults.core.trafficType = (0, trafficType_1.validateTrafficType)(log, maybeTT, constants_2.LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
155
159
|
}
|
|
156
160
|
}
|
|
157
161
|
}
|
|
@@ -186,10 +190,11 @@ function settingsValidation(config, validationParams) {
|
|
|
186
190
|
var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, sync.splitFilters, withDefaults.mode);
|
|
187
191
|
sync.splitFilters = splitFiltersValidation.validFilters;
|
|
188
192
|
sync.__splitFiltersValidation = splitFiltersValidation;
|
|
193
|
+
// ensure a valid flag spec version
|
|
189
194
|
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : constants_1.FLAG_SPEC_VERSION;
|
|
190
195
|
// ensure a valid user consent value
|
|
191
196
|
// @ts-ignore, modify readonly prop
|
|
192
|
-
withDefaults.userConsent = consent(withDefaults);
|
|
197
|
+
withDefaults.userConsent = consent ? consent(withDefaults) : undefined;
|
|
193
198
|
return withDefaults;
|
|
194
199
|
}
|
|
195
200
|
exports.settingsValidation = settingsValidation;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { allMatcherContext } from './all';
|
|
2
2
|
import { segmentMatcherContext } from './segment';
|
|
3
|
+
import { largeSegmentMatcherContext } from './large_segment';
|
|
3
4
|
import { whitelistMatcherContext } from './whitelist';
|
|
4
5
|
import { equalToMatcherContext } from './eq';
|
|
5
6
|
import { greaterThanEqualMatcherContext } from './gte';
|
|
@@ -43,7 +44,8 @@ var matchers = [
|
|
|
43
44
|
greaterThanEqualToSemverMatcherContext,
|
|
44
45
|
lessThanEqualToSemverMatcherContext,
|
|
45
46
|
betweenSemverMatcherContext,
|
|
46
|
-
inListSemverMatcherContext,
|
|
47
|
+
inListSemverMatcherContext,
|
|
48
|
+
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
47
49
|
];
|
|
48
50
|
/**
|
|
49
51
|
* Matcher factory.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { thenable } from '../../utils/promise/thenable';
|
|
2
|
+
export function largeSegmentMatcherContext(largeSegmentName, storage) {
|
|
3
|
+
return function largeSegmentMatcher(key) {
|
|
4
|
+
var isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;
|
|
5
|
+
if (thenable(isInLargeSegment)) {
|
|
6
|
+
isInLargeSegment.then(function (result) {
|
|
7
|
+
return result;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
return isInLargeSegment;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -15,7 +15,7 @@ export function matchersTransform(matchers) {
|
|
|
15
15
|
// As default input data type we use string (even for ALL_KEYS)
|
|
16
16
|
var dataType = matcherDataTypes.STRING;
|
|
17
17
|
var value = undefined;
|
|
18
|
-
if (type === matcherTypes.IN_SEGMENT) {
|
|
18
|
+
if (type === matcherTypes.IN_SEGMENT || type === matcherTypes.IN_LARGE_SEGMENT) {
|
|
19
19
|
value = segmentTransform(userDefinedSegmentMatcherData);
|
|
20
20
|
}
|
|
21
21
|
else if (type === matcherTypes.EQUAL_TO) {
|
package/esm/logger/constants.js
CHANGED
|
@@ -35,7 +35,6 @@ export var IMPRESSION = 102;
|
|
|
35
35
|
export var IMPRESSION_QUEUEING = 103;
|
|
36
36
|
export var NEW_SHARED_CLIENT = 104;
|
|
37
37
|
export var NEW_FACTORY = 105;
|
|
38
|
-
export var POLLING_SMART_PAUSING = 106;
|
|
39
38
|
export var POLLING_START = 107;
|
|
40
39
|
export var POLLING_STOP = 108;
|
|
41
40
|
export var SYNC_SPLITS_FETCH_RETRY = 109;
|
|
@@ -116,6 +115,7 @@ export var ENGINE_MATCHER_ERROR = 329;
|
|
|
116
115
|
// Log prefixes (a.k.a. tags or categories)
|
|
117
116
|
export var LOG_PREFIX_SETTINGS = 'settings';
|
|
118
117
|
export var LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
|
|
118
|
+
export var LOG_PREFIX_CLIENT_INSTANTIATION = 'Client instantiation';
|
|
119
119
|
export var LOG_PREFIX_ENGINE = 'engine';
|
|
120
120
|
export var LOG_PREFIX_ENGINE_COMBINER = LOG_PREFIX_ENGINE + ':combiner: ';
|
|
121
121
|
export var LOG_PREFIX_ENGINE_MATCHER = LOG_PREFIX_ENGINE + ':matcher: ';
|
|
@@ -16,7 +16,6 @@ export var codesInfo = codesWarn.concat([
|
|
|
16
16
|
[c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
|
|
17
17
|
[c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
|
|
18
18
|
// synchronizer
|
|
19
|
-
[c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
|
|
20
19
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
21
20
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
22
21
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
|
|
@@ -13,20 +13,20 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
13
13
|
splitsEventEmitter.once(SDK_SPLITS_CACHE_LOADED, function () { splitsEventEmitter.splitsCacheLoaded = true; });
|
|
14
14
|
return splitsEventEmitter;
|
|
15
15
|
}
|
|
16
|
-
function segmentsEventEmitterFactory(EventEmitter) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
16
|
+
function segmentsEventEmitterFactory(EventEmitter, segmentsArrived) {
|
|
17
|
+
if (segmentsArrived === void 0) { segmentsArrived = false; }
|
|
18
|
+
var segmentsEventEmitter = objectAssign(new EventEmitter(), { segmentsArrived: segmentsArrived });
|
|
20
19
|
segmentsEventEmitter.once(SDK_SEGMENTS_ARRIVED, function () { segmentsEventEmitter.segmentsArrived = true; });
|
|
21
20
|
return segmentsEventEmitter;
|
|
22
21
|
}
|
|
23
22
|
/**
|
|
24
23
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
25
24
|
*/
|
|
26
|
-
export function readinessManagerFactory(EventEmitter,
|
|
27
|
-
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
25
|
+
export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
28
26
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
27
|
+
var _a = settings.startup, readyTimeout = _a.readyTimeout, waitForLargeSegments = _a.waitForLargeSegments, largeSegmentsEnabled = settings.sync.largeSegmentsEnabled;
|
|
29
28
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
29
|
+
var largeSegments = largeSegmentsEnabled ? segmentsEventEmitterFactory(EventEmitter, !waitForLargeSegments) : undefined;
|
|
30
30
|
var gate = new EventEmitter();
|
|
31
31
|
// emit SDK_READY_FROM_CACHE
|
|
32
32
|
var isReadyFromCache = false;
|
|
@@ -50,6 +50,8 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
50
50
|
var isReady = false;
|
|
51
51
|
splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
52
52
|
segments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
53
|
+
if (largeSegments)
|
|
54
|
+
largeSegments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
53
55
|
var isDestroyed = false;
|
|
54
56
|
function checkIsReadyFromCache() {
|
|
55
57
|
isReadyFromCache = true;
|
|
@@ -75,7 +77,7 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
75
77
|
}
|
|
76
78
|
}
|
|
77
79
|
else {
|
|
78
|
-
if (splits.splitsArrived && segments.segmentsArrived) {
|
|
80
|
+
if (splits.splitsArrived && segments.segmentsArrived && (!largeSegments || largeSegments.segmentsArrived)) {
|
|
79
81
|
clearTimeout(readyTimeoutId);
|
|
80
82
|
isReady = true;
|
|
81
83
|
try {
|
|
@@ -92,11 +94,11 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
92
94
|
return {
|
|
93
95
|
splits: splits,
|
|
94
96
|
segments: segments,
|
|
97
|
+
largeSegments: largeSegments,
|
|
95
98
|
gate: gate,
|
|
96
|
-
shared: function (
|
|
97
|
-
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
99
|
+
shared: function () {
|
|
98
100
|
refCount++;
|
|
99
|
-
return readinessManagerFactory(EventEmitter,
|
|
101
|
+
return readinessManagerFactory(EventEmitter, settings, splits);
|
|
100
102
|
},
|
|
101
103
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
102
104
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -107,6 +109,8 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
107
109
|
destroy: function () {
|
|
108
110
|
isDestroyed = true;
|
|
109
111
|
segments.removeAllListeners();
|
|
112
|
+
if (largeSegments)
|
|
113
|
+
largeSegments.removeAllListeners();
|
|
110
114
|
gate.removeAllListeners();
|
|
111
115
|
clearTimeout(readyTimeoutId);
|
|
112
116
|
if (refCount > 0)
|
|
@@ -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(
|
|
16
|
-
if (
|
|
17
|
-
|
|
15
|
+
export function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
|
|
16
|
+
if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, settings); }
|
|
17
|
+
var log = settings.log;
|
|
18
18
|
/** Ready callback warning */
|
|
19
19
|
var internalReadyCbCount = 0;
|
|
20
20
|
var readyCbCount = 0;
|
|
@@ -57,9 +57,8 @@ export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, read
|
|
|
57
57
|
}
|
|
58
58
|
return {
|
|
59
59
|
readinessManager: readinessManager,
|
|
60
|
-
shared: function (
|
|
61
|
-
|
|
62
|
-
return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
|
|
60
|
+
shared: function () {
|
|
61
|
+
return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
|
|
63
62
|
},
|
|
64
63
|
incInternalReadyCbCount: function () {
|
|
65
64
|
internalReadyCbCount++;
|
|
@@ -3,19 +3,18 @@ import { validateKey } from '../utils/inputValidation/key';
|
|
|
3
3
|
import { getMatching, keyParser } from '../utils/key';
|
|
4
4
|
import { sdkClientFactory } from './sdkClient';
|
|
5
5
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
6
|
-
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING } from '../logger/constants';
|
|
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
9
|
// @ts-ignore
|
|
10
10
|
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
|
|
11
11
|
}
|
|
12
|
-
var method = 'Client instantiation';
|
|
13
12
|
/**
|
|
14
13
|
* Factory of client method for the client-side API variant where TT is ignored.
|
|
15
14
|
* Therefore, clients don't have a bound TT for the track method.
|
|
16
15
|
*/
|
|
17
16
|
export function sdkClientMethodCSFactory(params) {
|
|
18
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key,
|
|
17
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
19
18
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
20
19
|
var parsedDefaultKey = keyParser(key);
|
|
21
20
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
@@ -28,14 +27,14 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
28
27
|
return mainClientInstance;
|
|
29
28
|
}
|
|
30
29
|
// Validate the key value. The trafficType (2nd argument) is ignored
|
|
31
|
-
var validKey = validateKey(log, key,
|
|
30
|
+
var validKey = validateKey(log, key, LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
32
31
|
if (validKey === false) {
|
|
33
32
|
throw new Error('Shared Client needs a valid key.');
|
|
34
33
|
}
|
|
35
34
|
var instanceId = buildInstanceId(validKey);
|
|
36
35
|
if (!clientInstances[instanceId]) {
|
|
37
36
|
var matchingKey = getMatching(validKey);
|
|
38
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared(
|
|
37
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
39
38
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
40
39
|
if (err) {
|
|
41
40
|
sharedSdkReadiness_1.readinessManager.timeout();
|
|
@@ -4,20 +4,19 @@ import { validateTrafficType } from '../utils/inputValidation/trafficType';
|
|
|
4
4
|
import { getMatching, keyParser } from '../utils/key';
|
|
5
5
|
import { sdkClientFactory } from './sdkClient';
|
|
6
6
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
7
|
-
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING } from '../logger/constants';
|
|
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
10
|
// @ts-ignore
|
|
11
11
|
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
|
|
12
12
|
}
|
|
13
|
-
var method = 'Client instantiation';
|
|
14
13
|
/**
|
|
15
14
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
16
15
|
* where clients can have a bound TT for the track method, which is provided via the settings
|
|
17
16
|
* (default client) or the client method (shared clients).
|
|
18
17
|
*/
|
|
19
18
|
export function sdkClientMethodCSFactory(params) {
|
|
20
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType,
|
|
19
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
|
|
21
20
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key, trafficType);
|
|
22
21
|
var parsedDefaultKey = keyParser(key);
|
|
23
22
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
@@ -30,13 +29,13 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
30
29
|
return mainClientInstance;
|
|
31
30
|
}
|
|
32
31
|
// Validate the key value
|
|
33
|
-
var validKey = validateKey(log, key,
|
|
32
|
+
var validKey = validateKey(log, key, LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
34
33
|
if (validKey === false) {
|
|
35
34
|
throw new Error('Shared Client needs a valid key.');
|
|
36
35
|
}
|
|
37
36
|
var validTrafficType;
|
|
38
37
|
if (trafficType !== undefined) {
|
|
39
|
-
validTrafficType = validateTrafficType(log, trafficType,
|
|
38
|
+
validTrafficType = validateTrafficType(log, trafficType, LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
40
39
|
if (validTrafficType === false) {
|
|
41
40
|
throw new Error('Shared Client needs a valid traffic type or no traffic type at all.');
|
|
42
41
|
}
|
|
@@ -44,7 +43,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
44
43
|
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
45
44
|
if (!clientInstances[instanceId]) {
|
|
46
45
|
var matchingKey = getMatching(validKey);
|
|
47
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared(
|
|
46
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
48
47
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
49
48
|
if (err) {
|
|
50
49
|
sharedSdkReadiness_1.readinessManager.timeout();
|
package/esm/sdkFactory/index.js
CHANGED
|
@@ -22,7 +22,7 @@ export function sdkFactory(params) {
|
|
|
22
22
|
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
|
|
23
23
|
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
|
|
24
24
|
validateAndTrackApiKey(log, settings.core.authorizationKey);
|
|
25
|
-
var sdkReadinessManager = sdkReadinessManagerFactory(
|
|
25
|
+
var sdkReadinessManager = sdkReadinessManagerFactory(platform.EventEmitter, settings);
|
|
26
26
|
var readiness = sdkReadinessManager.readinessManager;
|
|
27
27
|
var storage = storageFactory({
|
|
28
28
|
settings: settings,
|
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, MY_SEGMENT } from '../utils/constants';
|
|
3
|
+
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT, MY_LARGE_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) {
|
|
@@ -61,6 +61,10 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
61
61
|
var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
|
|
62
62
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_SEGMENT));
|
|
63
63
|
},
|
|
64
|
+
fetchMyLargeSegments: function (userMatchingKey, noCache) {
|
|
65
|
+
var url = urls.sdk + "/myLargeSegments/" + encodeURIComponent(userMatchingKey);
|
|
66
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_LARGE_SEGMENT));
|
|
67
|
+
},
|
|
64
68
|
/**
|
|
65
69
|
* Post events.
|
|
66
70
|
*
|
|
@@ -6,9 +6,9 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
6
6
|
var AbstractSplitsCacheAsync = /** @class */ (function () {
|
|
7
7
|
function AbstractSplitsCacheAsync() {
|
|
8
8
|
}
|
|
9
|
-
// @TODO revisit segment-related methods ('
|
|
9
|
+
// @TODO revisit segment-related methods ('usesMatcher', 'getRegisteredSegments', 'registerSegments')
|
|
10
10
|
// noop, just keeping the interface. This is used by standalone client-side API only, and so only implemented by InMemory and InLocalStorage.
|
|
11
|
-
AbstractSplitsCacheAsync.prototype.
|
|
11
|
+
AbstractSplitsCacheAsync.prototype.usesMatcher = function () {
|
|
12
12
|
return Promise.resolve(true);
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
@@ -59,14 +59,14 @@ var AbstractSplitsCacheSync = /** @class */ (function () {
|
|
|
59
59
|
export { AbstractSplitsCacheSync };
|
|
60
60
|
/**
|
|
61
61
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
62
|
-
* This util is intended to simplify the implementation of `splitsCache::
|
|
62
|
+
* This util is intended to simplify the implementation of `splitsCache::usesMatcher` method
|
|
63
63
|
*/
|
|
64
|
-
export function
|
|
64
|
+
export function usesMatcher(split, matcherType) {
|
|
65
65
|
var conditions = split.conditions || [];
|
|
66
66
|
for (var i = 0; i < conditions.length; i++) {
|
|
67
67
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
68
68
|
for (var j = 0; j < matchers.length; j++) {
|
|
69
|
-
if (matchers[j].matcherType ===
|
|
69
|
+
if (matchers[j].matcherType === matcherType)
|
|
70
70
|
return true;
|
|
71
71
|
}
|
|
72
72
|
}
|
|
@@ -36,6 +36,9 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
36
36
|
KeyBuilder.prototype.buildSplitsWithSegmentCountKey = function () {
|
|
37
37
|
return this.prefix + ".splits.usingSegments";
|
|
38
38
|
};
|
|
39
|
+
KeyBuilder.prototype.buildSplitsWithLargeSegmentCountKey = function () {
|
|
40
|
+
return this.prefix + ".splits.usingLargeSegments";
|
|
41
|
+
};
|
|
39
42
|
KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
|
|
40
43
|
return this.prefix + ".segment." + segmentName;
|
|
41
44
|
};
|
|
@@ -21,10 +21,6 @@ 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
|
|
28
24
|
KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
|
|
29
25
|
var prefix = this.matchingKey + "." + this.prefix + ".segment.";
|
|
30
26
|
if (startsWith(builtSegmentKeyName, prefix))
|
|
@@ -39,3 +35,18 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
39
35
|
return KeyBuilderCS;
|
|
40
36
|
}(KeyBuilder));
|
|
41
37
|
export { KeyBuilderCS };
|
|
38
|
+
export function myLargeSegmentsKeyBuilder(prefix, matchingKey) {
|
|
39
|
+
return {
|
|
40
|
+
buildSegmentNameKey: function (segmentName) {
|
|
41
|
+
return prefix + "." + matchingKey + ".largeSegment." + segmentName;
|
|
42
|
+
},
|
|
43
|
+
extractSegmentName: function (builtSegmentKeyName) {
|
|
44
|
+
var p = prefix + "." + matchingKey + ".largeSegment.";
|
|
45
|
+
if (startsWith(builtSegmentKeyName, p))
|
|
46
|
+
return builtSegmentKeyName.substr(p.length);
|
|
47
|
+
},
|
|
48
|
+
extractOldSegmentKey: function () {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { AbstractSplitsCacheSync,
|
|
2
|
+
import { AbstractSplitsCacheSync, usesMatcher } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber, toNumber, isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { LOG_PREFIX } from './constants';
|
|
5
5
|
import { _Set, setToArray } from '../../utils/lang/sets';
|
|
6
6
|
import { getStorageHash } from '../KeyBuilder';
|
|
7
|
+
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
7
8
|
/**
|
|
8
9
|
* ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
|
|
9
10
|
*/
|
|
@@ -37,10 +38,14 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
37
38
|
if (split) {
|
|
38
39
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
39
40
|
this._decrementCount(ttKey);
|
|
40
|
-
if (
|
|
41
|
+
if (usesMatcher(split, IN_SEGMENT)) {
|
|
41
42
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
42
43
|
this._decrementCount(segmentsCountKey);
|
|
43
44
|
}
|
|
45
|
+
if (usesMatcher(split, IN_LARGE_SEGMENT)) {
|
|
46
|
+
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
47
|
+
this._decrementCount(segmentsCountKey);
|
|
48
|
+
}
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
51
|
catch (e) {
|
|
@@ -53,11 +58,16 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
53
58
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
54
59
|
// @ts-expect-error
|
|
55
60
|
localStorage.setItem(ttKey, toNumber(localStorage.getItem(ttKey)) + 1);
|
|
56
|
-
if (
|
|
61
|
+
if (usesMatcher(split, IN_SEGMENT)) {
|
|
57
62
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
58
63
|
// @ts-expect-error
|
|
59
64
|
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
60
65
|
}
|
|
66
|
+
if (usesMatcher(split, IN_LARGE_SEGMENT)) {
|
|
67
|
+
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
68
|
+
// @ts-expect-error
|
|
69
|
+
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
70
|
+
}
|
|
61
71
|
}
|
|
62
72
|
}
|
|
63
73
|
catch (e) {
|
|
@@ -170,11 +180,13 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
170
180
|
var ttCount = toNumber(localStorage.getItem(this.keys.buildTrafficTypeKey(trafficType)));
|
|
171
181
|
return isFiniteNumber(ttCount) && ttCount > 0;
|
|
172
182
|
};
|
|
173
|
-
SplitsCacheInLocal.prototype.
|
|
183
|
+
SplitsCacheInLocal.prototype.usesMatcher = function (matcherType) {
|
|
174
184
|
// If cache hasn't been synchronized with the cloud, assume we need them.
|
|
175
185
|
if (!this.hasSync)
|
|
176
186
|
return true;
|
|
177
|
-
var storedCount = localStorage.getItem(
|
|
187
|
+
var storedCount = localStorage.getItem(matcherType === IN_SEGMENT ?
|
|
188
|
+
this.keys.buildSplitsWithSegmentCountKey() :
|
|
189
|
+
this.keys.buildSplitsWithLargeSegmentCountKey());
|
|
178
190
|
var splitsWithSegmentsCount = storedCount === null ? 0 : toNumber(storedCount);
|
|
179
191
|
if (isFiniteNumber(splitsWithSegmentsCount)) {
|
|
180
192
|
return splitsWithSegmentsCount > 0;
|
|
@@ -2,7 +2,7 @@ import { ImpressionsCacheInMemory } from '../inMemory/ImpressionsCacheInMemory';
|
|
|
2
2
|
import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
|
|
3
3
|
import { EventsCacheInMemory } from '../inMemory/EventsCacheInMemory';
|
|
4
4
|
import { validatePrefix } from '../KeyBuilder';
|
|
5
|
-
import { KeyBuilderCS } from '../KeyBuilderCS';
|
|
5
|
+
import { KeyBuilderCS, myLargeSegmentsKeyBuilder } from '../KeyBuilderCS';
|
|
6
6
|
import { isLocalStorageAvailable } from '../../utils/env/isLocalStorageAvailable';
|
|
7
7
|
import { SplitsCacheInLocal } from './SplitsCacheInLocal';
|
|
8
8
|
import { MySegmentsCacheInLocal } from './MySegmentsCacheInLocal';
|
|
@@ -33,9 +33,11 @@ export function InLocalStorage(options) {
|
|
|
33
33
|
var expirationTimestamp = Date.now() - DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
|
|
34
34
|
var splits = new SplitsCacheInLocal(settings, keys, expirationTimestamp);
|
|
35
35
|
var segments = new MySegmentsCacheInLocal(log, keys);
|
|
36
|
+
var largeSegments = new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey));
|
|
36
37
|
return {
|
|
37
38
|
splits: splits,
|
|
38
39
|
segments: segments,
|
|
40
|
+
largeSegments: largeSegments,
|
|
39
41
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
40
42
|
impressionCounts: impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
|
|
41
43
|
events: new EventsCacheInMemory(eventsQueueSize),
|
|
@@ -45,6 +47,7 @@ export function InLocalStorage(options) {
|
|
|
45
47
|
var _a;
|
|
46
48
|
this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
47
49
|
this.segments = new MySegmentsCacheInMemory();
|
|
50
|
+
this.largeSegments = new MySegmentsCacheInMemory();
|
|
48
51
|
this.impressions.clear();
|
|
49
52
|
this.impressionCounts && this.impressionCounts.clear();
|
|
50
53
|
this.events.clear();
|
|
@@ -52,10 +55,10 @@ export function InLocalStorage(options) {
|
|
|
52
55
|
},
|
|
53
56
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
|
|
54
57
|
shared: function (matchingKey) {
|
|
55
|
-
var childKeysBuilder = new KeyBuilderCS(prefix, matchingKey);
|
|
56
58
|
return {
|
|
57
59
|
splits: this.splits,
|
|
58
|
-
segments: new MySegmentsCacheInLocal(log,
|
|
60
|
+
segments: new MySegmentsCacheInLocal(log, new KeyBuilderCS(prefix, matchingKey)),
|
|
61
|
+
largeSegments: new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey)),
|
|
59
62
|
impressions: this.impressions,
|
|
60
63
|
impressionCounts: this.impressionCounts,
|
|
61
64
|
events: this.events,
|
|
@@ -63,6 +66,7 @@ export function InLocalStorage(options) {
|
|
|
63
66
|
destroy: function () {
|
|
64
67
|
this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
65
68
|
this.segments = new MySegmentsCacheInMemory();
|
|
69
|
+
this.largeSegments = new MySegmentsCacheInMemory();
|
|
66
70
|
}
|
|
67
71
|
};
|
|
68
72
|
},
|