@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
package/CHANGES.txt
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
1.16.1 (July 10, 2024)
|
|
2
|
+
- Updated some transitive dependencies for vulnerability fixes.
|
|
3
|
+
|
|
1
4
|
1.16.0 (June 13, 2024)
|
|
2
5
|
- Added the `getOptions` method to the `IPlatform` interface to allow the SDK to pass request options to the `fetch` function and `EventSource` constructor when fetching data from the Split servers. The method is optional and, if provided, it is called twice: first for the `fetch` options and then for the `EventSource` options. Useful for advanced use cases like configuring a proxy or validating HTTPS certificates in NodeJS.
|
|
3
6
|
- Updated the Redis storage to lazily import the `ioredis` dependency when the storage is created. This prevents errors when the SDK is imported or bundled in a .mjs file, as `ioredis` is a CommonJS module.
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.matcherFactory = void 0;
|
|
4
4
|
var all_1 = require("./all");
|
|
5
5
|
var segment_1 = require("./segment");
|
|
6
|
+
var large_segment_1 = require("./large_segment");
|
|
6
7
|
var whitelist_1 = require("./whitelist");
|
|
7
8
|
var eq_1 = require("./eq");
|
|
8
9
|
var gte_1 = require("./gte");
|
|
@@ -46,7 +47,8 @@ var matchers = [
|
|
|
46
47
|
semver_gte_1.greaterThanEqualToSemverMatcherContext,
|
|
47
48
|
semver_lte_1.lessThanEqualToSemverMatcherContext,
|
|
48
49
|
semver_between_1.betweenSemverMatcherContext,
|
|
49
|
-
semver_inlist_1.inListSemverMatcherContext,
|
|
50
|
+
semver_inlist_1.inListSemverMatcherContext,
|
|
51
|
+
large_segment_1.largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
50
52
|
];
|
|
51
53
|
/**
|
|
52
54
|
* Matcher factory.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.largeSegmentMatcherContext = void 0;
|
|
4
|
+
var thenable_1 = require("../../utils/promise/thenable");
|
|
5
|
+
function largeSegmentMatcherContext(largeSegmentName, storage) {
|
|
6
|
+
return function largeSegmentMatcher(key) {
|
|
7
|
+
var isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;
|
|
8
|
+
if ((0, thenable_1.thenable)(isInLargeSegment)) {
|
|
9
|
+
isInLargeSegment.then(function (result) {
|
|
10
|
+
return result;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
return isInLargeSegment;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
exports.largeSegmentMatcherContext = largeSegmentMatcherContext;
|
|
@@ -18,7 +18,7 @@ function matchersTransform(matchers) {
|
|
|
18
18
|
// As default input data type we use string (even for ALL_KEYS)
|
|
19
19
|
var dataType = matcherTypes_1.matcherDataTypes.STRING;
|
|
20
20
|
var value = undefined;
|
|
21
|
-
if (type === matcherTypes_1.matcherTypes.IN_SEGMENT) {
|
|
21
|
+
if (type === matcherTypes_1.matcherTypes.IN_SEGMENT || type === matcherTypes_1.matcherTypes.IN_LARGE_SEGMENT) {
|
|
22
22
|
value = (0, segment_1.segmentTransform)(userDefinedSegmentMatcherData);
|
|
23
23
|
}
|
|
24
24
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO) {
|
package/cjs/logger/constants.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.
|
|
4
|
-
exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = exports.WARN_SDK_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER =
|
|
5
|
-
exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ENGINE_MATCHER_ERROR = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED =
|
|
3
|
+
exports.ENGINE_VALUE_NO_ATTRIBUTES = exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.ENGINE_MATCHER_RESULT = exports.SETTINGS_SPLITS_FILTER = exports.SYNC_TASK_STOP = exports.SYNC_TASK_EXECUTE = exports.SYNC_TASK_START = exports.STREAMING_NEW_MESSAGE = exports.SYNC_SPLITS_SEGMENTS = exports.SYNC_SPLITS_REMOVED = exports.SYNC_SPLITS_NEW = exports.SYNC_SPLITS_FETCH = exports.SYNC_OFFLINE_DATA = exports.RETRIEVE_MANAGER = exports.RETRIEVE_CLIENT_EXISTING = exports.RETRIEVE_CLIENT_DEFAULT = exports.CLEANUP_DEREGISTERING = exports.CLEANUP_REGISTERING = exports.ENGINE_SANITIZE = exports.ENGINE_VALUE = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
|
|
4
|
+
exports.ERROR_HTTP = exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = exports.WARN_SDK_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER = void 0;
|
|
5
|
+
exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_CLIENT_INSTANTIATION = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ENGINE_MATCHER_ERROR = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = void 0;
|
|
6
6
|
/**
|
|
7
7
|
* Message codes used to trim string log messages from commons and client-side API modules,
|
|
8
8
|
* in order to reduce the minimal SDK size for Browser and eventually other client-side environments.
|
|
@@ -40,7 +40,6 @@ exports.IMPRESSION = 102;
|
|
|
40
40
|
exports.IMPRESSION_QUEUEING = 103;
|
|
41
41
|
exports.NEW_SHARED_CLIENT = 104;
|
|
42
42
|
exports.NEW_FACTORY = 105;
|
|
43
|
-
exports.POLLING_SMART_PAUSING = 106;
|
|
44
43
|
exports.POLLING_START = 107;
|
|
45
44
|
exports.POLLING_STOP = 108;
|
|
46
45
|
exports.SYNC_SPLITS_FETCH_RETRY = 109;
|
|
@@ -121,6 +120,7 @@ exports.ENGINE_MATCHER_ERROR = 329;
|
|
|
121
120
|
// Log prefixes (a.k.a. tags or categories)
|
|
122
121
|
exports.LOG_PREFIX_SETTINGS = 'settings';
|
|
123
122
|
exports.LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
|
|
123
|
+
exports.LOG_PREFIX_CLIENT_INSTANTIATION = 'Client instantiation';
|
|
124
124
|
exports.LOG_PREFIX_ENGINE = 'engine';
|
|
125
125
|
exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE + ':combiner: ';
|
|
126
126
|
exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE + ':matcher: ';
|
|
@@ -20,7 +20,6 @@ exports.codesInfo = warn_1.codesWarn.concat([
|
|
|
20
20
|
[c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
|
|
21
21
|
[c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
|
|
22
22
|
// synchronizer
|
|
23
|
-
[c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
|
|
24
23
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
25
24
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
26
25
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
|
|
@@ -16,20 +16,20 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
16
16
|
splitsEventEmitter.once(constants_1.SDK_SPLITS_CACHE_LOADED, function () { splitsEventEmitter.splitsCacheLoaded = true; });
|
|
17
17
|
return splitsEventEmitter;
|
|
18
18
|
}
|
|
19
|
-
function segmentsEventEmitterFactory(EventEmitter) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
});
|
|
19
|
+
function segmentsEventEmitterFactory(EventEmitter, segmentsArrived) {
|
|
20
|
+
if (segmentsArrived === void 0) { segmentsArrived = false; }
|
|
21
|
+
var segmentsEventEmitter = (0, objectAssign_1.objectAssign)(new EventEmitter(), { segmentsArrived: segmentsArrived });
|
|
23
22
|
segmentsEventEmitter.once(constants_1.SDK_SEGMENTS_ARRIVED, function () { segmentsEventEmitter.segmentsArrived = true; });
|
|
24
23
|
return segmentsEventEmitter;
|
|
25
24
|
}
|
|
26
25
|
/**
|
|
27
26
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
28
27
|
*/
|
|
29
|
-
function readinessManagerFactory(EventEmitter,
|
|
30
|
-
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
28
|
+
function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
31
29
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
30
|
+
var _a = settings.startup, readyTimeout = _a.readyTimeout, waitForLargeSegments = _a.waitForLargeSegments, largeSegmentsEnabled = settings.sync.largeSegmentsEnabled;
|
|
32
31
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
32
|
+
var largeSegments = largeSegmentsEnabled ? segmentsEventEmitterFactory(EventEmitter, !waitForLargeSegments) : undefined;
|
|
33
33
|
var gate = new EventEmitter();
|
|
34
34
|
// emit SDK_READY_FROM_CACHE
|
|
35
35
|
var isReadyFromCache = false;
|
|
@@ -53,6 +53,8 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
53
53
|
var isReady = false;
|
|
54
54
|
splits.on(constants_1.SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
55
55
|
segments.on(constants_1.SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
56
|
+
if (largeSegments)
|
|
57
|
+
largeSegments.on(constants_1.SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
56
58
|
var isDestroyed = false;
|
|
57
59
|
function checkIsReadyFromCache() {
|
|
58
60
|
isReadyFromCache = true;
|
|
@@ -78,7 +80,7 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
else {
|
|
81
|
-
if (splits.splitsArrived && segments.segmentsArrived) {
|
|
83
|
+
if (splits.splitsArrived && segments.segmentsArrived && (!largeSegments || largeSegments.segmentsArrived)) {
|
|
82
84
|
clearTimeout(readyTimeoutId);
|
|
83
85
|
isReady = true;
|
|
84
86
|
try {
|
|
@@ -95,11 +97,11 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
95
97
|
return {
|
|
96
98
|
splits: splits,
|
|
97
99
|
segments: segments,
|
|
100
|
+
largeSegments: largeSegments,
|
|
98
101
|
gate: gate,
|
|
99
|
-
shared: function (
|
|
100
|
-
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
102
|
+
shared: function () {
|
|
101
103
|
refCount++;
|
|
102
|
-
return readinessManagerFactory(EventEmitter,
|
|
104
|
+
return readinessManagerFactory(EventEmitter, settings, splits);
|
|
103
105
|
},
|
|
104
106
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
105
107
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -110,6 +112,8 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
|
110
112
|
destroy: function () {
|
|
111
113
|
isDestroyed = true;
|
|
112
114
|
segments.removeAllListeners();
|
|
115
|
+
if (largeSegments)
|
|
116
|
+
largeSegments.removeAllListeners();
|
|
113
117
|
gate.removeAllListeners();
|
|
114
118
|
clearTimeout(readyTimeoutId);
|
|
115
119
|
if (refCount > 0)
|
|
@@ -15,9 +15,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
|
|
|
15
15
|
* @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
|
|
16
16
|
* @param readinessManager optional readinessManager to use. only used internally for `shared` method
|
|
17
17
|
*/
|
|
18
|
-
function sdkReadinessManagerFactory(
|
|
19
|
-
if (
|
|
20
|
-
|
|
18
|
+
function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
|
|
19
|
+
if (readinessManager === void 0) { readinessManager = (0, readinessManager_1.readinessManagerFactory)(EventEmitter, settings); }
|
|
20
|
+
var log = settings.log;
|
|
21
21
|
/** Ready callback warning */
|
|
22
22
|
var internalReadyCbCount = 0;
|
|
23
23
|
var readyCbCount = 0;
|
|
@@ -60,9 +60,8 @@ function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessMa
|
|
|
60
60
|
}
|
|
61
61
|
return {
|
|
62
62
|
readinessManager: readinessManager,
|
|
63
|
-
shared: function (
|
|
64
|
-
|
|
65
|
-
return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
|
|
63
|
+
shared: function () {
|
|
64
|
+
return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
|
|
66
65
|
},
|
|
67
66
|
incInternalReadyCbCount: function () {
|
|
68
67
|
internalReadyCbCount++;
|
|
@@ -12,13 +12,12 @@ function buildInstanceId(key) {
|
|
|
12
12
|
// @ts-ignore
|
|
13
13
|
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
|
|
14
14
|
}
|
|
15
|
-
var method = 'Client instantiation';
|
|
16
15
|
/**
|
|
17
16
|
* Factory of client method for the client-side API variant where TT is ignored.
|
|
18
17
|
* Therefore, clients don't have a bound TT for the track method.
|
|
19
18
|
*/
|
|
20
19
|
function sdkClientMethodCSFactory(params) {
|
|
21
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key,
|
|
20
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
22
21
|
var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key);
|
|
23
22
|
var parsedDefaultKey = (0, key_2.keyParser)(key);
|
|
24
23
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
@@ -31,14 +30,14 @@ function sdkClientMethodCSFactory(params) {
|
|
|
31
30
|
return mainClientInstance;
|
|
32
31
|
}
|
|
33
32
|
// Validate the key value. The trafficType (2nd argument) is ignored
|
|
34
|
-
var validKey = (0, key_1.validateKey)(log, key,
|
|
33
|
+
var validKey = (0, key_1.validateKey)(log, key, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
35
34
|
if (validKey === false) {
|
|
36
35
|
throw new Error('Shared Client needs a valid key.');
|
|
37
36
|
}
|
|
38
37
|
var instanceId = buildInstanceId(validKey);
|
|
39
38
|
if (!clientInstances[instanceId]) {
|
|
40
39
|
var matchingKey = (0, key_2.getMatching)(validKey);
|
|
41
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared(
|
|
40
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
42
41
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
43
42
|
if (err) {
|
|
44
43
|
sharedSdkReadiness_1.readinessManager.timeout();
|
|
@@ -13,14 +13,13 @@ function buildInstanceId(key, trafficType) {
|
|
|
13
13
|
// @ts-ignore
|
|
14
14
|
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
|
|
15
15
|
}
|
|
16
|
-
var method = 'Client instantiation';
|
|
17
16
|
/**
|
|
18
17
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
19
18
|
* where clients can have a bound TT for the track method, which is provided via the settings
|
|
20
19
|
* (default client) or the client method (shared clients).
|
|
21
20
|
*/
|
|
22
21
|
function sdkClientMethodCSFactory(params) {
|
|
23
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType,
|
|
22
|
+
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;
|
|
24
23
|
var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key, trafficType);
|
|
25
24
|
var parsedDefaultKey = (0, key_2.keyParser)(key);
|
|
26
25
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
@@ -33,13 +32,13 @@ function sdkClientMethodCSFactory(params) {
|
|
|
33
32
|
return mainClientInstance;
|
|
34
33
|
}
|
|
35
34
|
// Validate the key value
|
|
36
|
-
var validKey = (0, key_1.validateKey)(log, key,
|
|
35
|
+
var validKey = (0, key_1.validateKey)(log, key, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
37
36
|
if (validKey === false) {
|
|
38
37
|
throw new Error('Shared Client needs a valid key.');
|
|
39
38
|
}
|
|
40
39
|
var validTrafficType;
|
|
41
40
|
if (trafficType !== undefined) {
|
|
42
|
-
validTrafficType = (0, trafficType_1.validateTrafficType)(log, trafficType,
|
|
41
|
+
validTrafficType = (0, trafficType_1.validateTrafficType)(log, trafficType, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
43
42
|
if (validTrafficType === false) {
|
|
44
43
|
throw new Error('Shared Client needs a valid traffic type or no traffic type at all.');
|
|
45
44
|
}
|
|
@@ -47,7 +46,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
47
46
|
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
48
47
|
if (!clientInstances[instanceId]) {
|
|
49
48
|
var matchingKey = (0, key_2.getMatching)(validKey);
|
|
50
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared(
|
|
49
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
51
50
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
52
51
|
if (err) {
|
|
53
52
|
sharedSdkReadiness_1.readinessManager.timeout();
|
package/cjs/sdkFactory/index.js
CHANGED
|
@@ -25,7 +25,7 @@ function sdkFactory(params) {
|
|
|
25
25
|
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
|
|
26
26
|
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
|
|
27
27
|
(0, apiKey_1.validateAndTrackApiKey)(log, settings.core.authorizationKey);
|
|
28
|
-
var sdkReadinessManager = (0, sdkReadinessManager_1.sdkReadinessManagerFactory)(
|
|
28
|
+
var sdkReadinessManager = (0, sdkReadinessManager_1.sdkReadinessManagerFactory)(platform.EventEmitter, settings);
|
|
29
29
|
var readiness = sdkReadinessManager.readinessManager;
|
|
30
30
|
var storage = storageFactory({
|
|
31
31
|
settings: settings,
|
package/cjs/services/splitApi.js
CHANGED
|
@@ -64,6 +64,10 @@ function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
64
64
|
var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
|
|
65
65
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MY_SEGMENT));
|
|
66
66
|
},
|
|
67
|
+
fetchMyLargeSegments: function (userMatchingKey, noCache) {
|
|
68
|
+
var url = urls.sdk + "/myLargeSegments/" + encodeURIComponent(userMatchingKey);
|
|
69
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MY_LARGE_SEGMENT));
|
|
70
|
+
},
|
|
67
71
|
/**
|
|
68
72
|
* Post events.
|
|
69
73
|
*
|
|
@@ -9,9 +9,9 @@ var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
|
9
9
|
var AbstractSplitsCacheAsync = /** @class */ (function () {
|
|
10
10
|
function AbstractSplitsCacheAsync() {
|
|
11
11
|
}
|
|
12
|
-
// @TODO revisit segment-related methods ('
|
|
12
|
+
// @TODO revisit segment-related methods ('usesMatcher', 'getRegisteredSegments', 'registerSegments')
|
|
13
13
|
// noop, just keeping the interface. This is used by standalone client-side API only, and so only implemented by InMemory and InLocalStorage.
|
|
14
|
-
AbstractSplitsCacheAsync.prototype.
|
|
14
|
+
AbstractSplitsCacheAsync.prototype.usesMatcher = function () {
|
|
15
15
|
return Promise.resolve(true);
|
|
16
16
|
};
|
|
17
17
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.usesMatcher = exports.AbstractSplitsCacheSync = void 0;
|
|
4
4
|
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
5
5
|
/**
|
|
6
6
|
* This class provides a skeletal implementation of the ISplitsCacheSync interface
|
|
@@ -62,17 +62,17 @@ var AbstractSplitsCacheSync = /** @class */ (function () {
|
|
|
62
62
|
exports.AbstractSplitsCacheSync = AbstractSplitsCacheSync;
|
|
63
63
|
/**
|
|
64
64
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
65
|
-
* This util is intended to simplify the implementation of `splitsCache::
|
|
65
|
+
* This util is intended to simplify the implementation of `splitsCache::usesMatcher` method
|
|
66
66
|
*/
|
|
67
|
-
function
|
|
67
|
+
function usesMatcher(split, matcherType) {
|
|
68
68
|
var conditions = split.conditions || [];
|
|
69
69
|
for (var i = 0; i < conditions.length; i++) {
|
|
70
70
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
71
71
|
for (var j = 0; j < matchers.length; j++) {
|
|
72
|
-
if (matchers[j].matcherType ===
|
|
72
|
+
if (matchers[j].matcherType === matcherType)
|
|
73
73
|
return true;
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
return false;
|
|
77
77
|
}
|
|
78
|
-
exports.
|
|
78
|
+
exports.usesMatcher = usesMatcher;
|
|
@@ -40,6 +40,9 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
40
40
|
KeyBuilder.prototype.buildSplitsWithSegmentCountKey = function () {
|
|
41
41
|
return this.prefix + ".splits.usingSegments";
|
|
42
42
|
};
|
|
43
|
+
KeyBuilder.prototype.buildSplitsWithLargeSegmentCountKey = function () {
|
|
44
|
+
return this.prefix + ".splits.usingLargeSegments";
|
|
45
|
+
};
|
|
43
46
|
KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
|
|
44
47
|
return this.prefix + ".segment." + segmentName;
|
|
45
48
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.KeyBuilderCS = void 0;
|
|
3
|
+
exports.myLargeSegmentsKeyBuilder = exports.KeyBuilderCS = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var lang_1 = require("../utils/lang");
|
|
6
6
|
var KeyBuilder_1 = require("./KeyBuilder");
|
|
@@ -24,10 +24,6 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
24
24
|
return builtSegmentKeyName.substr(prefix.length);
|
|
25
25
|
};
|
|
26
26
|
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
27
|
-
KeyBuilderCS.prototype.buildOldSegmentNameKey = function (segmentName) {
|
|
28
|
-
return this.matchingKey + "." + this.prefix + ".segment." + segmentName;
|
|
29
|
-
};
|
|
30
|
-
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
31
27
|
KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
|
|
32
28
|
var prefix = this.matchingKey + "." + this.prefix + ".segment.";
|
|
33
29
|
if ((0, lang_1.startsWith)(builtSegmentKeyName, prefix))
|
|
@@ -42,3 +38,19 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
42
38
|
return KeyBuilderCS;
|
|
43
39
|
}(KeyBuilder_1.KeyBuilder));
|
|
44
40
|
exports.KeyBuilderCS = KeyBuilderCS;
|
|
41
|
+
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 ((0, lang_1.startsWith)(builtSegmentKeyName, p))
|
|
49
|
+
return builtSegmentKeyName.substr(p.length);
|
|
50
|
+
},
|
|
51
|
+
extractOldSegmentKey: function () {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
exports.myLargeSegmentsKeyBuilder = myLargeSegmentsKeyBuilder;
|
|
@@ -7,6 +7,7 @@ var lang_1 = require("../../utils/lang");
|
|
|
7
7
|
var constants_1 = require("./constants");
|
|
8
8
|
var sets_1 = require("../../utils/lang/sets");
|
|
9
9
|
var KeyBuilder_1 = require("../KeyBuilder");
|
|
10
|
+
var constants_2 = require("../../utils/constants");
|
|
10
11
|
/**
|
|
11
12
|
* ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
|
|
12
13
|
*/
|
|
@@ -40,10 +41,14 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
40
41
|
if (split) {
|
|
41
42
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
42
43
|
this._decrementCount(ttKey);
|
|
43
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
44
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_SEGMENT)) {
|
|
44
45
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
45
46
|
this._decrementCount(segmentsCountKey);
|
|
46
47
|
}
|
|
48
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_LARGE_SEGMENT)) {
|
|
49
|
+
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
50
|
+
this._decrementCount(segmentsCountKey);
|
|
51
|
+
}
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
catch (e) {
|
|
@@ -56,11 +61,16 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
56
61
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
57
62
|
// @ts-expect-error
|
|
58
63
|
localStorage.setItem(ttKey, (0, lang_1.toNumber)(localStorage.getItem(ttKey)) + 1);
|
|
59
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
64
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_SEGMENT)) {
|
|
60
65
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
61
66
|
// @ts-expect-error
|
|
62
67
|
localStorage.setItem(segmentsCountKey, (0, lang_1.toNumber)(localStorage.getItem(segmentsCountKey)) + 1);
|
|
63
68
|
}
|
|
69
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_LARGE_SEGMENT)) {
|
|
70
|
+
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
71
|
+
// @ts-expect-error
|
|
72
|
+
localStorage.setItem(segmentsCountKey, (0, lang_1.toNumber)(localStorage.getItem(segmentsCountKey)) + 1);
|
|
73
|
+
}
|
|
64
74
|
}
|
|
65
75
|
}
|
|
66
76
|
catch (e) {
|
|
@@ -173,11 +183,13 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
173
183
|
var ttCount = (0, lang_1.toNumber)(localStorage.getItem(this.keys.buildTrafficTypeKey(trafficType)));
|
|
174
184
|
return (0, lang_1.isFiniteNumber)(ttCount) && ttCount > 0;
|
|
175
185
|
};
|
|
176
|
-
SplitsCacheInLocal.prototype.
|
|
186
|
+
SplitsCacheInLocal.prototype.usesMatcher = function (matcherType) {
|
|
177
187
|
// If cache hasn't been synchronized with the cloud, assume we need them.
|
|
178
188
|
if (!this.hasSync)
|
|
179
189
|
return true;
|
|
180
|
-
var storedCount = localStorage.getItem(
|
|
190
|
+
var storedCount = localStorage.getItem(matcherType === constants_2.IN_SEGMENT ?
|
|
191
|
+
this.keys.buildSplitsWithSegmentCountKey() :
|
|
192
|
+
this.keys.buildSplitsWithLargeSegmentCountKey());
|
|
181
193
|
var splitsWithSegmentsCount = storedCount === null ? 0 : (0, lang_1.toNumber)(storedCount);
|
|
182
194
|
if ((0, lang_1.isFiniteNumber)(splitsWithSegmentsCount)) {
|
|
183
195
|
return splitsWithSegmentsCount > 0;
|
|
@@ -36,9 +36,11 @@ function InLocalStorage(options) {
|
|
|
36
36
|
var expirationTimestamp = Date.now() - browser_1.DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
|
|
37
37
|
var splits = new SplitsCacheInLocal_1.SplitsCacheInLocal(settings, keys, expirationTimestamp);
|
|
38
38
|
var segments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, keys);
|
|
39
|
+
var largeSegments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey));
|
|
39
40
|
return {
|
|
40
41
|
splits: splits,
|
|
41
42
|
segments: segments,
|
|
43
|
+
largeSegments: largeSegments,
|
|
42
44
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
43
45
|
impressionCounts: impressionsMode !== constants_2.DEBUG ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
|
|
44
46
|
events: new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize),
|
|
@@ -48,6 +50,7 @@ function InLocalStorage(options) {
|
|
|
48
50
|
var _a;
|
|
49
51
|
this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
50
52
|
this.segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
53
|
+
this.largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
51
54
|
this.impressions.clear();
|
|
52
55
|
this.impressionCounts && this.impressionCounts.clear();
|
|
53
56
|
this.events.clear();
|
|
@@ -55,10 +58,10 @@ function InLocalStorage(options) {
|
|
|
55
58
|
},
|
|
56
59
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
|
|
57
60
|
shared: function (matchingKey) {
|
|
58
|
-
var childKeysBuilder = new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey);
|
|
59
61
|
return {
|
|
60
62
|
splits: this.splits,
|
|
61
|
-
segments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log,
|
|
63
|
+
segments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey)),
|
|
64
|
+
largeSegments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey)),
|
|
62
65
|
impressions: this.impressions,
|
|
63
66
|
impressionCounts: this.impressionCounts,
|
|
64
67
|
events: this.events,
|
|
@@ -66,6 +69,7 @@ function InLocalStorage(options) {
|
|
|
66
69
|
destroy: function () {
|
|
67
70
|
this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
68
71
|
this.segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
72
|
+
this.largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
69
73
|
}
|
|
70
74
|
};
|
|
71
75
|
},
|
|
@@ -18,9 +18,11 @@ function InMemoryStorageCSFactory(params) {
|
|
|
18
18
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
|
|
19
19
|
var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
20
20
|
var segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
21
|
+
var largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
21
22
|
var storage = {
|
|
22
23
|
splits: splits,
|
|
23
24
|
segments: segments,
|
|
25
|
+
largeSegments: largeSegments,
|
|
24
26
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
25
27
|
impressionCounts: impressionsMode !== constants_1.DEBUG ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
|
|
26
28
|
events: new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize),
|
|
@@ -30,6 +32,7 @@ function InMemoryStorageCSFactory(params) {
|
|
|
30
32
|
destroy: function () {
|
|
31
33
|
this.splits.clear();
|
|
32
34
|
this.segments.clear();
|
|
35
|
+
this.largeSegments.clear();
|
|
33
36
|
this.impressions.clear();
|
|
34
37
|
this.impressionCounts && this.impressionCounts.clear();
|
|
35
38
|
this.events.clear();
|
|
@@ -40,6 +43,7 @@ function InMemoryStorageCSFactory(params) {
|
|
|
40
43
|
return {
|
|
41
44
|
splits: this.splits,
|
|
42
45
|
segments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
46
|
+
largeSegments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
43
47
|
impressions: this.impressions,
|
|
44
48
|
impressionCounts: this.impressionCounts,
|
|
45
49
|
events: this.events,
|
|
@@ -48,6 +52,7 @@ function InMemoryStorageCSFactory(params) {
|
|
|
48
52
|
destroy: function () {
|
|
49
53
|
this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
50
54
|
this.segments.clear();
|
|
55
|
+
this.largeSegments.clear();
|
|
51
56
|
}
|
|
52
57
|
};
|
|
53
58
|
},
|
|
@@ -5,6 +5,7 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
7
|
var sets_1 = require("../../utils/lang/sets");
|
|
8
|
+
var constants_1 = require("../../utils/constants");
|
|
8
9
|
/**
|
|
9
10
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
10
11
|
* Supported by all JS runtimes.
|
|
@@ -16,7 +17,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
16
17
|
_this.splitsCache = {};
|
|
17
18
|
_this.ttCache = {};
|
|
18
19
|
_this.changeNumber = -1;
|
|
19
|
-
_this.
|
|
20
|
+
_this.segmentsCount = 0;
|
|
21
|
+
_this.largeSegmentsCount = 0;
|
|
20
22
|
_this.flagSetsCache = {};
|
|
21
23
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
22
24
|
return _this;
|
|
@@ -25,7 +27,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
25
27
|
this.splitsCache = {};
|
|
26
28
|
this.ttCache = {};
|
|
27
29
|
this.changeNumber = -1;
|
|
28
|
-
this.
|
|
30
|
+
this.segmentsCount = 0;
|
|
31
|
+
this.largeSegmentsCount = 0;
|
|
29
32
|
};
|
|
30
33
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
31
34
|
var previousSplit = this.getSplit(name);
|
|
@@ -35,9 +38,11 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
35
38
|
if (!this.ttCache[previousTtName])
|
|
36
39
|
delete this.ttCache[previousTtName];
|
|
37
40
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
// Substract from segments count for the previous version of this Split.
|
|
42
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_SEGMENT))
|
|
43
|
+
this.segmentsCount--;
|
|
44
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_LARGE_SEGMENT))
|
|
45
|
+
this.largeSegmentsCount--;
|
|
41
46
|
}
|
|
42
47
|
if (split) {
|
|
43
48
|
// Store the Split.
|
|
@@ -47,8 +52,10 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
47
52
|
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
48
53
|
this.addToFlagSets(split);
|
|
49
54
|
// Add to segments count for the new version of the Split
|
|
50
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
51
|
-
this.
|
|
55
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_SEGMENT))
|
|
56
|
+
this.segmentsCount++;
|
|
57
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
|
|
58
|
+
this.largeSegmentsCount++;
|
|
52
59
|
return true;
|
|
53
60
|
}
|
|
54
61
|
else {
|
|
@@ -66,8 +73,10 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
66
73
|
delete this.ttCache[ttName];
|
|
67
74
|
this.removeFromFlagSets(split.name, split.sets);
|
|
68
75
|
// Update the segments count.
|
|
69
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
70
|
-
this.
|
|
76
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_SEGMENT))
|
|
77
|
+
this.segmentsCount--;
|
|
78
|
+
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
|
|
79
|
+
this.largeSegmentsCount--;
|
|
71
80
|
return true;
|
|
72
81
|
}
|
|
73
82
|
else {
|
|
@@ -90,8 +99,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
90
99
|
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
91
100
|
return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
92
101
|
};
|
|
93
|
-
SplitsCacheInMemory.prototype.
|
|
94
|
-
return this.getChangeNumber() === -1 || this.
|
|
102
|
+
SplitsCacheInMemory.prototype.usesMatcher = function (matcherType) {
|
|
103
|
+
return this.getChangeNumber() === -1 || (matcherType === constants_1.IN_SEGMENT ? this.segmentsCount > 0 : this.largeSegmentsCount > 0);
|
|
95
104
|
};
|
|
96
105
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
97
106
|
var _this = this;
|