@splitsoftware/splitio-commons 3.1.1-rc.0 → 3.1.1-rc.10
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 +10 -1
- package/cjs/evaluator/condition/index.js +1 -1
- package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +8 -5
- package/cjs/evaluator/index.js +69 -81
- package/cjs/listeners/browser.js +1 -2
- package/cjs/listeners/node.js +4 -4
- package/cjs/logger/constants.js +20 -15
- package/cjs/logger/messages/debug.js +6 -5
- package/cjs/logger/messages/error.js +3 -3
- package/cjs/logger/messages/info.js +4 -3
- package/cjs/logger/messages/warn.js +7 -6
- package/cjs/presets/serverSide.js +2 -2
- package/cjs/readiness/constants.js +4 -5
- package/cjs/readiness/readinessManager.js +23 -23
- package/cjs/readiness/sdkReadinessManager.js +17 -1
- package/cjs/sdkClient/client.js +34 -9
- package/cjs/sdkClient/clientInputValidation.js +17 -6
- package/cjs/sdkClient/sdkClient.js +60 -3
- package/cjs/sdkFactory/index.js +15 -11
- package/cjs/sdkManager/index.js +5 -5
- package/cjs/services/decorateHeaders.js +1 -2
- package/cjs/services/splitApi.js +1 -14
- package/cjs/services/splitHttpClient.js +5 -3
- package/cjs/storages/AbstractSplitsCacheAsync.js +51 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +76 -0
- package/cjs/storages/KeyBuilder.js +6 -6
- package/cjs/storages/KeyBuilderCS.js +5 -5
- package/cjs/storages/KeyBuilderSS.js +2 -2
- package/cjs/storages/getRolloutPlan.js +3 -3
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +2 -1
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +194 -0
- package/cjs/storages/inLocalStorage/index.js +6 -6
- package/cjs/storages/inLocalStorage/validateCache.js +3 -3
- package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +121 -0
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/RedisAdapter.js +8 -5
- package/cjs/storages/inRedis/{DefinitionsCacheInRedis.js → SplitsCacheInRedis.js} +77 -77
- package/cjs/storages/inRedis/index.js +2 -2
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/SplitsCachePluggable.js +212 -0
- package/cjs/storages/pluggable/index.js +2 -2
- package/cjs/storages/setRolloutPlan.js +4 -4
- package/cjs/storages/utils.js +0 -1
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +15 -24
- package/cjs/sync/polling/pollingManagerCS.js +20 -20
- package/cjs/sync/polling/pollingManagerSS.js +15 -15
- package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +3 -2
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +13 -0
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
- package/cjs/sync/polling/updaters/{definitionChangesUpdater.js → splitChangesUpdater.js} +68 -65
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -1
- package/cjs/sync/streaming/UpdateWorkers/{DefinitionsUpdateWorker.js → SplitsUpdateWorker.js} +19 -16
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/parseUtils.js +11 -11
- package/cjs/sync/streaming/pushManager.js +16 -16
- package/cjs/sync/submitters/eventsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionsSubmitter.js +4 -5
- package/cjs/sync/submitters/telemetrySubmitter.js +4 -3
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/cjs/sync/syncManagerOnline.js +7 -12
- package/cjs/utils/Backoff.js +0 -20
- package/cjs/utils/inputValidation/index.js +7 -7
- package/cjs/utils/inputValidation/isOperational.js +4 -4
- package/cjs/utils/inputValidation/{definition.js → split.js} +10 -10
- package/cjs/utils/inputValidation/{definitionExistence.js → splitExistence.js} +6 -6
- package/cjs/utils/inputValidation/splits.js +25 -0
- package/cjs/utils/labels/index.js +3 -3
- package/cjs/utils/settingsValidation/index.js +0 -2
- package/cjs/utils/settingsValidation/splitFilters.js +3 -3
- package/cjs/utils/settingsValidation/url.js +2 -6
- package/esm/evaluator/condition/index.js +1 -1
- package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +8 -5
- package/esm/evaluator/index.js +69 -80
- package/esm/listeners/browser.js +1 -2
- package/esm/listeners/node.js +4 -4
- package/esm/logger/constants.js +17 -12
- package/esm/logger/messages/debug.js +6 -5
- package/esm/logger/messages/error.js +3 -3
- package/esm/logger/messages/info.js +4 -3
- package/esm/logger/messages/warn.js +7 -6
- package/esm/presets/serverSide.js +2 -2
- package/esm/readiness/constants.js +3 -4
- package/esm/readiness/readinessManager.js +24 -24
- package/esm/readiness/sdkReadinessManager.js +18 -2
- package/esm/sdkClient/client.js +35 -9
- package/esm/sdkClient/clientInputValidation.js +19 -8
- package/esm/sdkClient/sdkClient.js +60 -3
- package/esm/sdkFactory/index.js +16 -12
- package/esm/sdkManager/index.js +6 -6
- package/esm/services/decorateHeaders.js +1 -2
- package/esm/services/splitApi.js +1 -14
- package/esm/services/splitHttpClient.js +5 -3
- package/esm/storages/AbstractSplitsCacheAsync.js +48 -0
- package/esm/storages/AbstractSplitsCacheSync.js +71 -0
- package/esm/storages/KeyBuilder.js +6 -6
- package/esm/storages/KeyBuilderCS.js +5 -5
- package/esm/storages/KeyBuilderSS.js +2 -2
- package/esm/storages/getRolloutPlan.js +3 -3
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +2 -1
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +191 -0
- package/esm/storages/inLocalStorage/index.js +6 -6
- package/esm/storages/inLocalStorage/validateCache.js +3 -3
- package/esm/storages/inMemory/InMemoryStorage.js +4 -4
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/SplitsCacheInMemory.js +118 -0
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/esm/storages/inRedis/RedisAdapter.js +8 -5
- package/esm/storages/inRedis/{DefinitionsCacheInRedis.js → SplitsCacheInRedis.js} +76 -76
- package/esm/storages/inRedis/index.js +2 -2
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/esm/storages/pluggable/SplitsCachePluggable.js +209 -0
- package/esm/storages/pluggable/index.js +2 -2
- package/esm/storages/setRolloutPlan.js +4 -4
- package/esm/storages/utils.js +0 -1
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +16 -25
- package/esm/sync/polling/pollingManagerCS.js +17 -17
- package/esm/sync/polling/pollingManagerSS.js +15 -15
- package/esm/sync/polling/syncTasks/segmentsSyncTask.js +3 -2
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +9 -0
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
- package/esm/sync/polling/updaters/{definitionChangesUpdater.js → splitChangesUpdater.js} +68 -65
- package/esm/sync/streaming/AuthClient/index.js +1 -1
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
- package/esm/sync/streaming/SSEHandler/index.js +2 -2
- package/esm/sync/streaming/UpdateWorkers/{DefinitionsUpdateWorker.js → SplitsUpdateWorker.js} +18 -15
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/parseUtils.js +9 -9
- package/esm/sync/streaming/pushManager.js +18 -18
- package/esm/sync/submitters/eventsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionsSubmitter.js +4 -5
- package/esm/sync/submitters/telemetrySubmitter.js +4 -3
- package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/esm/sync/syncManagerOnline.js +6 -11
- package/esm/utils/Backoff.js +0 -20
- package/esm/utils/inputValidation/index.js +3 -3
- package/esm/utils/inputValidation/isOperational.js +4 -4
- package/esm/utils/inputValidation/{definition.js → split.js} +8 -8
- package/esm/utils/inputValidation/splitExistence.js +15 -0
- package/esm/utils/inputValidation/splits.js +21 -0
- package/esm/utils/labels/index.js +2 -2
- package/esm/utils/settingsValidation/index.js +0 -2
- package/esm/utils/settingsValidation/splitFilters.js +3 -3
- package/esm/utils/settingsValidation/url.js +2 -6
- package/package.json +6 -7
- package/src/dtos/types.ts +1 -1
- package/src/evaluator/Engine.ts +3 -3
- package/src/evaluator/condition/index.ts +2 -2
- package/src/evaluator/index.ts +27 -35
- package/src/evaluator/types.ts +2 -6
- package/src/presets/serverSide.ts +3 -3
- package/src/sdkClient/client.ts +22 -24
- package/src/sdkClient/sdkLifecycle.ts +3 -0
- package/src/services/authProvider.ts +41 -19
- package/src/services/secureSplitHttpClient.ts +10 -18
- package/src/services/serviceApi.ts +27 -24
- package/src/services/splitApi.ts +10 -9
- package/src/services/types.ts +5 -4
- package/src/storages/inRedis/RedisAdapter.ts +8 -5
- package/src/sync/polling/pollingManagerCS.ts +80 -78
- package/src/sync/polling/pollingManagerSS.ts +49 -45
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +3 -3
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
- package/src/sync/streaming/AuthClient/index.ts +14 -15
- package/src/sync/streaming/AuthClient/types.ts +9 -13
- package/src/sync/streaming/SSEClient/index.ts +2 -2
- package/src/sync/streaming/SSEClient/types.ts +2 -2
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +32 -42
- package/src/sync/streaming/types.ts +3 -2
- package/src/sync/submitters/impressionsSubmitter.ts +3 -3
- package/src/sync/submitters/types.ts +2 -2
- package/src/sync/syncManagerOnline.ts +2 -8
- package/src/utils/Backoff.ts +16 -4
- package/types/splitio.d.ts +5 -4
- package/cjs/platform/browser.js +0 -15
- package/cjs/platform/getEventSource/browser.js +0 -8
- package/cjs/platform/getEventSource/eventsource.js +0 -480
- package/cjs/platform/getEventSource/node.js +0 -26
- package/cjs/platform/getFetch/browser.js +0 -9
- package/cjs/platform/getFetch/node.js +0 -27
- package/cjs/platform/getOptions/node.js +0 -25
- package/cjs/platform/node.js +0 -17
- package/cjs/sdkClient/sdkLifecycle.js +0 -72
- package/cjs/sdkClient/trackMethod.js +0 -56
- package/cjs/services/authProvider.js +0 -67
- package/cjs/services/secureSplitHttpClient.js +0 -39
- package/cjs/services/serviceApi.js +0 -145
- package/cjs/storages/AbstractDefinitionsCacheAsync.js +0 -51
- package/cjs/storages/AbstractDefinitionsCacheSync.js +0 -76
- package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +0 -194
- package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +0 -121
- package/cjs/storages/pluggable/DefinitionsCachePluggable.js +0 -212
- package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +0 -13
- package/cjs/utils/EventEmitter.js +0 -391
- package/cjs/utils/filter/bloomFilter.js +0 -37
- package/cjs/utils/inputValidation/definitions.js +0 -25
- package/cjs/utils/inputValidation/target.js +0 -22
- package/esm/platform/browser.js +0 -12
- package/esm/platform/getEventSource/browser.js +0 -4
- package/esm/platform/getEventSource/eventsource.js +0 -480
- package/esm/platform/getEventSource/node.js +0 -20
- package/esm/platform/getFetch/browser.js +0 -5
- package/esm/platform/getFetch/node.js +0 -22
- package/esm/platform/getOptions/node.js +0 -20
- package/esm/platform/node.js +0 -14
- package/esm/sdkClient/sdkLifecycle.js +0 -68
- package/esm/sdkClient/trackMethod.js +0 -52
- package/esm/services/authProvider.js +0 -63
- package/esm/services/secureSplitHttpClient.js +0 -35
- package/esm/services/serviceApi.js +0 -141
- package/esm/storages/AbstractDefinitionsCacheAsync.js +0 -48
- package/esm/storages/AbstractDefinitionsCacheSync.js +0 -71
- package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +0 -191
- package/esm/storages/inMemory/DefinitionsCacheInMemory.js +0 -118
- package/esm/storages/pluggable/DefinitionsCachePluggable.js +0 -209
- package/esm/sync/polling/syncTasks/definitionsSyncTask.js +0 -9
- package/esm/utils/EventEmitter.js +0 -387
- package/esm/utils/filter/bloomFilter.js +0 -33
- package/esm/utils/inputValidation/definitionExistence.js +0 -15
- package/esm/utils/inputValidation/definitions.js +0 -21
- package/esm/utils/inputValidation/target.js +0 -18
package/esm/listeners/node.js
CHANGED
|
@@ -10,8 +10,8 @@ var EVENT_NAME = 'for SIGTERM signal.';
|
|
|
10
10
|
* the process is already exiting.
|
|
11
11
|
*/
|
|
12
12
|
var NodeSignalListener = /** @class */ (function () {
|
|
13
|
-
function NodeSignalListener(
|
|
14
|
-
|
|
13
|
+
function NodeSignalListener(syncManager, // private handler: () => MaybeThenable<void>,
|
|
14
|
+
settings) {
|
|
15
15
|
// @TODO review handler logic when implementing Node.js SDK
|
|
16
16
|
this.handler = function () {
|
|
17
17
|
if (syncManager) {
|
|
@@ -44,13 +44,13 @@ var NodeSignalListener = /** @class */ (function () {
|
|
|
44
44
|
// eslint-disable-next-line no-undef
|
|
45
45
|
process.kill(process.pid, SIGTERM);
|
|
46
46
|
};
|
|
47
|
-
this.settings.log.debug("".concat(LOG_PREFIX_CLEANUP, "SDK graceful shutdown after SIGTERM."));
|
|
47
|
+
this.settings.log.debug("".concat(LOG_PREFIX_CLEANUP, "Split SDK graceful shutdown after SIGTERM."));
|
|
48
48
|
var handlerResult = null;
|
|
49
49
|
try {
|
|
50
50
|
handlerResult = this.handler();
|
|
51
51
|
}
|
|
52
52
|
catch (err) {
|
|
53
|
-
this.settings.log.error("".concat(LOG_PREFIX_CLEANUP, "Error with SDK graceful shutdown: ").concat(err));
|
|
53
|
+
this.settings.log.error("".concat(LOG_PREFIX_CLEANUP, "Error with Split SDK graceful shutdown: ").concat(err));
|
|
54
54
|
}
|
|
55
55
|
if (thenable(handlerResult)) {
|
|
56
56
|
// Always exit, even with errors. The promise is returned for UT purposes.
|
package/esm/logger/constants.js
CHANGED
|
@@ -19,8 +19,9 @@ export var RETRIEVE_CLIENT_DEFAULT = 27;
|
|
|
19
19
|
export var RETRIEVE_CLIENT_EXISTING = 28;
|
|
20
20
|
export var RETRIEVE_MANAGER = 29;
|
|
21
21
|
export var SYNC_OFFLINE_DATA = 30;
|
|
22
|
-
export var
|
|
23
|
-
export var
|
|
22
|
+
export var SYNC_SPLITS_FETCH = 31;
|
|
23
|
+
export var SYNC_SPLITS_UPDATE = 32;
|
|
24
|
+
export var SYNC_RBS_UPDATE = 33;
|
|
24
25
|
export var STREAMING_NEW_MESSAGE = 35;
|
|
25
26
|
export var SYNC_TASK_START = 36;
|
|
26
27
|
export var SYNC_TASK_EXECUTE = 37;
|
|
@@ -36,6 +37,7 @@ export var NEW_FACTORY = 105;
|
|
|
36
37
|
export var POLLING_SMART_PAUSING = 106;
|
|
37
38
|
export var POLLING_START = 107;
|
|
38
39
|
export var POLLING_STOP = 108;
|
|
40
|
+
export var SYNC_SPLITS_FETCH_RETRY = 109;
|
|
39
41
|
export var STREAMING_REFRESH_TOKEN = 110;
|
|
40
42
|
export var STREAMING_RECONNECT = 111;
|
|
41
43
|
export var STREAMING_CONNECTING = 112;
|
|
@@ -54,9 +56,10 @@ export var USER_CONSENT_INITIAL = 124;
|
|
|
54
56
|
export var SUBMITTERS_PUSH_PAGE_HIDDEN = 125;
|
|
55
57
|
export var ENGINE_VALUE_INVALID = 200;
|
|
56
58
|
export var ENGINE_VALUE_NO_ATTRIBUTES = 201;
|
|
59
|
+
export var CLIENT_NO_LISTENER = 202;
|
|
57
60
|
export var CLIENT_NOT_READY_FROM_CACHE = 203;
|
|
58
|
-
export var
|
|
59
|
-
export var
|
|
61
|
+
export var SYNC_MYSEGMENTS_FETCH_RETRY = 204;
|
|
62
|
+
export var SYNC_SPLITS_FETCH_FAILS = 205;
|
|
60
63
|
export var STREAMING_PARSING_ERROR_FAILS = 206;
|
|
61
64
|
export var STREAMING_PARSING_MESSAGE_FAILS = 207;
|
|
62
65
|
export var STREAMING_FALLBACK = 208;
|
|
@@ -66,7 +69,7 @@ export var WARN_SETTING_NULL = 211;
|
|
|
66
69
|
export var WARN_TRIMMING_PROPERTIES = 212;
|
|
67
70
|
export var WARN_CONVERTING = 213;
|
|
68
71
|
export var WARN_TRIMMING = 214;
|
|
69
|
-
export var
|
|
72
|
+
export var WARN_NOT_EXISTENT_SPLIT = 215;
|
|
70
73
|
export var WARN_LOWERCASE_TRAFFIC_TYPE = 216;
|
|
71
74
|
export var WARN_NOT_EXISTENT_TT = 217;
|
|
72
75
|
export var WARN_INTEGRATION_INVALID = 218;
|
|
@@ -117,13 +120,15 @@ export var LOG_PREFIX_ENGINE = 'engine';
|
|
|
117
120
|
export var LOG_PREFIX_ENGINE_COMBINER = LOG_PREFIX_ENGINE + ':combiner: ';
|
|
118
121
|
export var LOG_PREFIX_ENGINE_MATCHER = LOG_PREFIX_ENGINE + ':matcher: ';
|
|
119
122
|
export var LOG_PREFIX_ENGINE_VALUE = LOG_PREFIX_ENGINE + ':value: ';
|
|
120
|
-
export var LOG_PREFIX_SYNC = 'sync
|
|
121
|
-
export var
|
|
122
|
-
export var
|
|
123
|
-
export var
|
|
124
|
-
export var
|
|
125
|
-
export var
|
|
126
|
-
export var
|
|
123
|
+
export var LOG_PREFIX_SYNC = 'sync';
|
|
124
|
+
export var LOG_PREFIX_SYNC_MANAGER = LOG_PREFIX_SYNC + ':sync-manager: ';
|
|
125
|
+
export var LOG_PREFIX_SYNC_OFFLINE = LOG_PREFIX_SYNC + ':offline: ';
|
|
126
|
+
export var LOG_PREFIX_SYNC_STREAMING = LOG_PREFIX_SYNC + ':streaming: ';
|
|
127
|
+
export var LOG_PREFIX_SYNC_SPLITS = LOG_PREFIX_SYNC + ':featureflag-changes: ';
|
|
128
|
+
export var LOG_PREFIX_SYNC_SEGMENTS = LOG_PREFIX_SYNC + ':segment-changes: ';
|
|
129
|
+
export var LOG_PREFIX_SYNC_MYSEGMENTS = LOG_PREFIX_SYNC + ':my-segments: ';
|
|
130
|
+
export var LOG_PREFIX_SYNC_POLLING = LOG_PREFIX_SYNC + ':polling-manager: ';
|
|
131
|
+
export var LOG_PREFIX_SYNC_SUBMITTERS = LOG_PREFIX_SYNC + ':submitter: ';
|
|
127
132
|
export var LOG_PREFIX_IMPRESSIONS_TRACKER = 'impressions-tracker: ';
|
|
128
133
|
export var LOG_PREFIX_EVENTS_TRACKER = 'events-tracker: ';
|
|
129
134
|
export var LOG_PREFIX_UNIQUE_KEYS_TRACKER = 'unique-keys-tracker: ';
|
|
@@ -20,12 +20,13 @@ export var codesDebug = codesInfo.concat([
|
|
|
20
20
|
[c.RETRIEVE_MANAGER, 'Retrieving manager instance.'],
|
|
21
21
|
// synchronizer
|
|
22
22
|
[c.SYNC_OFFLINE_DATA, c.LOG_PREFIX_SYNC_OFFLINE + 'Feature flags data: \n%s'],
|
|
23
|
-
[c.
|
|
24
|
-
[c.
|
|
23
|
+
[c.SYNC_SPLITS_FETCH, c.LOG_PREFIX_SYNC_SPLITS + 'Spin up feature flags update using since = %s and rbSince = %s.'],
|
|
24
|
+
[c.SYNC_SPLITS_UPDATE, c.LOG_PREFIX_SYNC_SPLITS + 'New feature flags: %s. Removed feature flags: %s.'],
|
|
25
|
+
[c.SYNC_RBS_UPDATE, c.LOG_PREFIX_SYNC_SPLITS + 'New rule-based segments: %s. Removed rule-based segments: %s.'],
|
|
25
26
|
[c.STREAMING_NEW_MESSAGE, c.LOG_PREFIX_SYNC_STREAMING + 'New SSE message received, with data: %s.'],
|
|
26
|
-
[c.SYNC_TASK_START, c.LOG_PREFIX_SYNC + 'Starting %s. Running each %s millis'],
|
|
27
|
-
[c.SYNC_TASK_EXECUTE, c.LOG_PREFIX_SYNC + 'Running %s'],
|
|
28
|
-
[c.SYNC_TASK_STOP, c.LOG_PREFIX_SYNC + 'Stopping %s'],
|
|
27
|
+
[c.SYNC_TASK_START, c.LOG_PREFIX_SYNC + ': Starting %s. Running each %s millis'],
|
|
28
|
+
[c.SYNC_TASK_EXECUTE, c.LOG_PREFIX_SYNC + ': Running %s'],
|
|
29
|
+
[c.SYNC_TASK_STOP, c.LOG_PREFIX_SYNC + ': Stopping %s'],
|
|
29
30
|
// initialization / settings validation
|
|
30
31
|
[c.SETTINGS_SPLITS_FILTER, c.LOG_PREFIX_SETTINGS + ': feature flags filtering criteria is "%s".']
|
|
31
32
|
]);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as c from '../constants';
|
|
2
2
|
export var codesError = [
|
|
3
3
|
// evaluator
|
|
4
|
-
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid
|
|
4
|
+
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported targeting rule type found'],
|
|
5
5
|
[c.ENGINE_MATCHER_ERROR, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] %s'],
|
|
6
6
|
// SDK
|
|
7
7
|
[c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
|
|
@@ -12,7 +12,7 @@ export var codesError = [
|
|
|
12
12
|
// synchronizer
|
|
13
13
|
[c.ERROR_SYNC_OFFLINE_LOADING, c.LOG_PREFIX_SYNC_OFFLINE + 'There was an issue loading the mock feature flags data. No changes will be applied to the current cache. %s'],
|
|
14
14
|
[c.ERROR_STREAMING_SSE, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to connect or error on streaming connection, with error message: %s'],
|
|
15
|
-
[c.ERROR_STREAMING_AUTH, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to authenticate for streaming. Error: %s'],
|
|
15
|
+
[c.ERROR_STREAMING_AUTH, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to authenticate for streaming. Error: %s.'],
|
|
16
16
|
[c.ERROR_HTTP, 'HTTP request failed with %s. URL: %s. Message: %s'],
|
|
17
17
|
// client status
|
|
18
18
|
[c.ERROR_CLIENT_LISTENER, 'A listener was added for %s on the SDK, which has already fired and won\'t be emitted again. The callback won\'t be executed.'],
|
|
@@ -33,6 +33,6 @@ export var codesError = [
|
|
|
33
33
|
[c.ERROR_INVALID_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': you passed an invalid "%s" config param. It should be one of the following values: %s. Defaulting to "%s".'],
|
|
34
34
|
[c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS + ': the provided storage is invalid.%s Falling back into default MEMORY storage'],
|
|
35
35
|
[c.ERROR_MIN_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': the provided "%s" config param is lower than allowed. Setting to the minimum value %s seconds'],
|
|
36
|
-
[c.ERROR_TOO_MANY_SETS, c.LOG_PREFIX_SETTINGS + ': the
|
|
36
|
+
[c.ERROR_TOO_MANY_SETS, c.LOG_PREFIX_SETTINGS + ': the amount of flag sets provided are big causing uri length error.'],
|
|
37
37
|
[c.ERROR_SETS_FILTER_EXCLUSIVE, c.LOG_PREFIX_SETTINGS + ': the Set filter is exclusive and cannot be used simultaneously with names or prefix filters. Ignoring names and prefixes.'],
|
|
38
38
|
];
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as c from '../constants';
|
|
2
2
|
import { codesWarn } from './warn';
|
|
3
|
-
var READY_MSG = 'SDK client is ready';
|
|
3
|
+
var READY_MSG = 'Split SDK client is ready';
|
|
4
4
|
export var codesInfo = codesWarn.concat([
|
|
5
5
|
// client status
|
|
6
6
|
[c.CLIENT_READY_FROM_CACHE, READY_MSG + ' from cache'],
|
|
7
7
|
[c.CLIENT_READY, READY_MSG],
|
|
8
8
|
// SDK
|
|
9
|
-
[c.IMPRESSION_QUEUEING, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Queueing impression.
|
|
9
|
+
[c.IMPRESSION_QUEUEING, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Queueing impression. Feature flag: %s. Key: %s. Evaluation: %s. Label: %s'],
|
|
10
10
|
[c.NEW_SHARED_CLIENT, 'New shared client instance created.'],
|
|
11
|
-
[c.NEW_FACTORY, 'New SDK instance created. %s'],
|
|
11
|
+
[c.NEW_FACTORY, 'New Split SDK instance created. %s'],
|
|
12
12
|
[c.EVENTS_TRACKER_SUCCESS, c.LOG_PREFIX_EVENTS_TRACKER + 'Successfully queued %s'],
|
|
13
13
|
[c.IMPRESSIONS_TRACKER_SUCCESS, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Successfully stored %s impression(s).'],
|
|
14
14
|
[c.USER_CONSENT_UPDATED, 'UserConsent: consent status changed from %s to %s.'],
|
|
@@ -18,6 +18,7 @@ export var codesInfo = codesWarn.concat([
|
|
|
18
18
|
[c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
|
|
19
19
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
20
20
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
21
|
+
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying fetch of feature flags (attempt #%s). Reason: %s'],
|
|
21
22
|
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and resetting timer.'],
|
|
22
23
|
[c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
|
|
23
24
|
[c.SUBMITTERS_PUSH_PAGE_HIDDEN, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing %s because page became hidden.'],
|
|
@@ -5,21 +5,22 @@ export var codesWarn = codesError.concat([
|
|
|
5
5
|
[c.ENGINE_VALUE_INVALID, c.LOG_PREFIX_ENGINE_VALUE + 'Value %s doesn\'t match with expected type.'],
|
|
6
6
|
[c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute `%s`. No attributes received.'],
|
|
7
7
|
// synchronizer
|
|
8
|
-
[c.
|
|
9
|
-
[c.
|
|
8
|
+
[c.SYNC_MYSEGMENTS_FETCH_RETRY, c.LOG_PREFIX_SYNC_MYSEGMENTS + 'Retrying fetch of memberships (attempt #%s). Reason: %s'],
|
|
9
|
+
[c.SYNC_SPLITS_FETCH_FAILS, c.LOG_PREFIX_SYNC_SPLITS + 'Error while doing fetch of feature flags. %s'],
|
|
10
10
|
[c.STREAMING_PARSING_ERROR_FAILS, c.LOG_PREFIX_SYNC_STREAMING + 'Error parsing SSE error notification: %s'],
|
|
11
11
|
[c.STREAMING_PARSING_MESSAGE_FAILS, c.LOG_PREFIX_SYNC_STREAMING + 'Error parsing SSE message notification: %s'],
|
|
12
12
|
[c.STREAMING_FALLBACK, c.LOG_PREFIX_SYNC_STREAMING + 'Falling back to polling mode. Reason: %s'],
|
|
13
|
-
[c.SUBMITTERS_PUSH_FAILS, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Dropping %s after retry. Reason: %s'],
|
|
14
|
-
[c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %s, keeping data to retry on next iteration. Reason: %s'],
|
|
13
|
+
[c.SUBMITTERS_PUSH_FAILS, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Dropping %s after retry. Reason: %s.'],
|
|
14
|
+
[c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %s, keeping data to retry on next iteration. Reason: %s.'],
|
|
15
15
|
// client status
|
|
16
|
-
[c.CLIENT_NOT_READY_FROM_CACHE, '%s: the SDK is not ready to evaluate. Results may be incorrect. Make sure to wait for SDK readiness before using this method.'],
|
|
16
|
+
[c.CLIENT_NOT_READY_FROM_CACHE, '%s: the SDK is not ready to evaluate. Results may be incorrect%s. Make sure to wait for SDK readiness before using this method.'],
|
|
17
|
+
[c.CLIENT_NO_LISTENER, 'No listeners for SDK_READY event detected. Incorrect control treatments could have been logged if you called getTreatment/s while the SDK was not yet synchronized with the backend.'],
|
|
17
18
|
// input validation
|
|
18
19
|
[c.WARN_SETTING_NULL, '%s: Property "%s" is of invalid type. Setting value to null.'],
|
|
19
20
|
[c.WARN_TRIMMING_PROPERTIES, '%s: more than 300 properties were provided. Some of them will be trimmed when processed.'],
|
|
20
21
|
[c.WARN_CONVERTING, '%s: %s "%s" is not of type string, converting.'],
|
|
21
22
|
[c.WARN_TRIMMING, '%s: %s "%s" has extra whitespace, trimming.'],
|
|
22
|
-
[c.
|
|
23
|
+
[c.WARN_NOT_EXISTENT_SPLIT, '%s: feature flag "%s" does not exist in this environment. Please double check what feature flags exist in Harness FME UI.'],
|
|
23
24
|
[c.WARN_LOWERCASE_TRAFFIC_TYPE, '%s: traffic_type_name should be all lowercase - converting string to lowercase.'],
|
|
24
25
|
[c.WARN_NOT_EXISTENT_TT, '%s: traffic type "%s" does not have any corresponding feature flag in this environment, make sure you\'re tracking your events to a valid traffic type defined in Harness FME UI.'],
|
|
25
26
|
[c.WARN_FLAGSET_NOT_CONFIGURED, '%s: you passed %s which is not part of the configured FlagSetsFilter, ignoring Flag Set.'],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { splitApiFactory } from '../services/splitApi';
|
|
2
2
|
import { syncManagerOnlineFactory } from '../sync/syncManagerOnline';
|
|
3
3
|
import { pushManagerFactory } from '../sync/streaming/pushManager';
|
|
4
4
|
import { pollingManagerSSFactory } from '../sync/polling/pollingManagerSS';
|
|
@@ -9,7 +9,7 @@ import { impressionObserverSSFactory } from '../trackers/impressionObserver/impr
|
|
|
9
9
|
var syncManagerOnlineSSFactory = syncManagerOnlineFactory(pollingManagerSSFactory, pushManagerFactory);
|
|
10
10
|
export var serverSideModules = {
|
|
11
11
|
storageFactory: InMemoryStorageFactory,
|
|
12
|
-
|
|
12
|
+
splitApiFactory: splitApiFactory,
|
|
13
13
|
syncManagerFactory: syncManagerOnlineSSFactory,
|
|
14
14
|
sdkManagerFactory: sdkManagerFactory,
|
|
15
15
|
sdkClientMethodFactory: sdkClientMethodFactory,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
2
|
-
export var
|
|
3
|
-
export var
|
|
1
|
+
// Splits events:
|
|
2
|
+
export var SDK_SPLITS_ARRIVED = 'state::splits-arrived';
|
|
3
|
+
export var SDK_SPLITS_CACHE_LOADED = 'state::splits-cache-loaded';
|
|
4
4
|
// Segments events:
|
|
5
5
|
export var SDK_SEGMENTS_ARRIVED = 'state::segments-arrived';
|
|
6
6
|
// Readiness events:
|
|
@@ -11,4 +11,3 @@ export var SDK_UPDATE = 'state::update';
|
|
|
11
11
|
// SdkUpdateMetadata types:
|
|
12
12
|
export var FLAGS_UPDATE = 'FLAGS_UPDATE';
|
|
13
13
|
export var SEGMENTS_UPDATE = 'SEGMENTS_UPDATE';
|
|
14
|
-
export var CONFIGS_UPDATE = 'CONFIGS_UPDATE';
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
|
-
import {
|
|
3
|
-
function
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { SDK_SPLITS_ARRIVED, SDK_SPLITS_CACHE_LOADED, SDK_SEGMENTS_ARRIVED, SDK_READY_TIMED_OUT, SDK_READY_FROM_CACHE, SDK_UPDATE, SDK_READY } from './constants';
|
|
3
|
+
function splitsEventEmitterFactory(EventEmitter) {
|
|
4
|
+
var splitsEventEmitter = objectAssign(new EventEmitter(), {
|
|
5
|
+
splitsArrived: false,
|
|
6
|
+
splitsCacheLoaded: false,
|
|
7
7
|
hasInit: false,
|
|
8
8
|
initCallbacks: []
|
|
9
9
|
});
|
|
10
10
|
// `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
|
|
11
11
|
// - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
|
|
12
12
|
// - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return
|
|
13
|
+
splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (metadata, isSplitKill) { if (!isSplitKill)
|
|
14
|
+
splitsEventEmitter.splitsArrived = true; });
|
|
15
|
+
splitsEventEmitter.once(SDK_SPLITS_CACHE_LOADED, function () { splitsEventEmitter.splitsCacheLoaded = true; });
|
|
16
|
+
return splitsEventEmitter;
|
|
17
17
|
}
|
|
18
18
|
function segmentsEventEmitterFactory(EventEmitter) {
|
|
19
19
|
var segmentsEventEmitter = objectAssign(new EventEmitter(), {
|
|
@@ -25,8 +25,8 @@ function segmentsEventEmitterFactory(EventEmitter) {
|
|
|
25
25
|
/**
|
|
26
26
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
27
27
|
*/
|
|
28
|
-
export function readinessManagerFactory(EventEmitter, settings,
|
|
29
|
-
if (
|
|
28
|
+
export function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
|
|
29
|
+
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
30
30
|
var readyTimeout = settings.startup.readyTimeout;
|
|
31
31
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
32
32
|
var gate = new EventEmitter();
|
|
@@ -41,10 +41,10 @@ export function readinessManagerFactory(EventEmitter, settings, definitions, isS
|
|
|
41
41
|
};
|
|
42
42
|
// emit SDK_READY_FROM_CACHE
|
|
43
43
|
var isReadyFromCache = false;
|
|
44
|
-
if (
|
|
44
|
+
if (splits.splitsCacheLoaded)
|
|
45
45
|
isReadyFromCache = true; // ready from cache, but doesn't emit SDK_READY_FROM_CACHE
|
|
46
46
|
else
|
|
47
|
-
|
|
47
|
+
splits.once(SDK_SPLITS_CACHE_LOADED, checkIsReadyFromCache);
|
|
48
48
|
// emit SDK_READY_TIMED_OUT
|
|
49
49
|
var hasTimedout = false;
|
|
50
50
|
function timeout() {
|
|
@@ -52,11 +52,11 @@ export function readinessManagerFactory(EventEmitter, settings, definitions, isS
|
|
|
52
52
|
return;
|
|
53
53
|
hasTimedout = true;
|
|
54
54
|
syncLastUpdate();
|
|
55
|
-
gate.emit(SDK_READY_TIMED_OUT, 'SDK
|
|
55
|
+
gate.emit(SDK_READY_TIMED_OUT, 'Split SDK emitted SDK_READY_TIMED_OUT event.');
|
|
56
56
|
}
|
|
57
57
|
// emit SDK_READY and SDK_UPDATE
|
|
58
58
|
var isReady = false;
|
|
59
|
-
|
|
59
|
+
splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
60
60
|
segments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
61
61
|
var isDestroyed = false;
|
|
62
62
|
var readyTimeoutId;
|
|
@@ -65,8 +65,8 @@ export function readinessManagerFactory(EventEmitter, settings, definitions, isS
|
|
|
65
65
|
if (readyTimeout > 0 && !isReady)
|
|
66
66
|
readyTimeoutId = setTimeout(timeout, readyTimeout);
|
|
67
67
|
}
|
|
68
|
-
|
|
69
|
-
if (
|
|
68
|
+
splits.initCallbacks.push(__init);
|
|
69
|
+
if (splits.hasInit)
|
|
70
70
|
__init();
|
|
71
71
|
function checkIsReadyFromCache(cacheMetadata) {
|
|
72
72
|
metadataReady = cacheMetadata;
|
|
@@ -97,7 +97,7 @@ export function readinessManagerFactory(EventEmitter, settings, definitions, isS
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
else {
|
|
100
|
-
if (
|
|
100
|
+
if (splits.splitsArrived && segments.segmentsArrived) {
|
|
101
101
|
clearTimeout(readyTimeoutId);
|
|
102
102
|
isReady = true;
|
|
103
103
|
try {
|
|
@@ -120,11 +120,11 @@ export function readinessManagerFactory(EventEmitter, settings, definitions, isS
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
return {
|
|
123
|
-
|
|
123
|
+
splits: splits,
|
|
124
124
|
segments: segments,
|
|
125
125
|
gate: gate,
|
|
126
126
|
shared: function () {
|
|
127
|
-
return readinessManagerFactory(EventEmitter, settings,
|
|
127
|
+
return readinessManagerFactory(EventEmitter, settings, splits, true);
|
|
128
128
|
},
|
|
129
129
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
130
130
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -133,17 +133,17 @@ export function readinessManagerFactory(EventEmitter, settings, definitions, isS
|
|
|
133
133
|
// tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
|
|
134
134
|
setDestroyed: function () { isDestroyed = true; },
|
|
135
135
|
init: function () {
|
|
136
|
-
if (
|
|
136
|
+
if (splits.hasInit)
|
|
137
137
|
return;
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
splits.hasInit = true;
|
|
139
|
+
splits.initCallbacks.forEach(function (cb) { return cb(); });
|
|
140
140
|
},
|
|
141
141
|
destroy: function () {
|
|
142
142
|
isDestroyed = true;
|
|
143
143
|
syncLastUpdate();
|
|
144
144
|
clearTimeout(readyTimeoutId);
|
|
145
145
|
if (!isShared)
|
|
146
|
-
|
|
146
|
+
splits.hasInit = false;
|
|
147
147
|
},
|
|
148
148
|
isReady: function () { return isReady; },
|
|
149
149
|
isReadyFromCache: function () { return isReadyFromCache; },
|
|
@@ -2,8 +2,9 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
2
2
|
import { promiseWrapper } from '../utils/promise/wrapper';
|
|
3
3
|
import { readinessManagerFactory } from './readinessManager';
|
|
4
4
|
import { SDK_READY, SDK_READY_TIMED_OUT, SDK_READY_FROM_CACHE, SDK_UPDATE } from './constants';
|
|
5
|
-
import { ERROR_CLIENT_LISTENER, CLIENT_READY_FROM_CACHE, CLIENT_READY } from '../logger/constants';
|
|
5
|
+
import { ERROR_CLIENT_LISTENER, CLIENT_READY_FROM_CACHE, CLIENT_READY, CLIENT_NO_LISTENER } from '../logger/constants';
|
|
6
6
|
var NEW_LISTENER_EVENT = 'newListener';
|
|
7
|
+
var REMOVE_LISTENER_EVENT = 'removeListener';
|
|
7
8
|
var TIMEOUT_ERROR = new Error(SDK_READY_TIMED_OUT);
|
|
8
9
|
/**
|
|
9
10
|
* SdkReadinessManager factory, which provides the public status API of SDK clients and manager: ready promise, readiness event emitter and constants (SDK_READY, etc).
|
|
@@ -15,11 +16,21 @@ var TIMEOUT_ERROR = new Error(SDK_READY_TIMED_OUT);
|
|
|
15
16
|
export function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
|
|
16
17
|
if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, settings); }
|
|
17
18
|
var log = settings.log;
|
|
19
|
+
/** Ready callback warning */
|
|
20
|
+
var internalReadyCbCount = 0;
|
|
21
|
+
var readyCbCount = 0;
|
|
22
|
+
readinessManager.gate.on(REMOVE_LISTENER_EVENT, function (event) {
|
|
23
|
+
if (event === SDK_READY)
|
|
24
|
+
readyCbCount--;
|
|
25
|
+
});
|
|
18
26
|
readinessManager.gate.on(NEW_LISTENER_EVENT, function (event) {
|
|
19
27
|
if (event === SDK_READY || event === SDK_READY_TIMED_OUT) {
|
|
20
28
|
if (readinessManager.isReady()) {
|
|
21
29
|
log.error(ERROR_CLIENT_LISTENER, [event === SDK_READY ? 'SDK_READY' : 'SDK_READY_TIMED_OUT']);
|
|
22
30
|
}
|
|
31
|
+
else if (event === SDK_READY) {
|
|
32
|
+
readyCbCount++;
|
|
33
|
+
}
|
|
23
34
|
}
|
|
24
35
|
else if (event === SDK_READY_FROM_CACHE && readinessManager.isReadyFromCache()) {
|
|
25
36
|
log.error(ERROR_CLIENT_LISTENER, ['SDK_READY_FROM_CACHE']);
|
|
@@ -38,6 +49,8 @@ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessMana
|
|
|
38
49
|
var promise = promiseWrapper(new Promise(function (resolve, reject) {
|
|
39
50
|
readinessManager.gate.once(SDK_READY, function () {
|
|
40
51
|
log.info(CLIENT_READY);
|
|
52
|
+
if (readyCbCount === internalReadyCbCount && !promise.hasOnFulfilled())
|
|
53
|
+
log.warn(CLIENT_NO_LISTENER);
|
|
41
54
|
resolve();
|
|
42
55
|
});
|
|
43
56
|
readinessManager.gate.once(SDK_READY_TIMED_OUT, function (message) {
|
|
@@ -62,6 +75,9 @@ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessMana
|
|
|
62
75
|
shared: function () {
|
|
63
76
|
return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
|
|
64
77
|
},
|
|
78
|
+
incInternalReadyCbCount: function () {
|
|
79
|
+
internalReadyCbCount++;
|
|
80
|
+
},
|
|
65
81
|
sdkStatus: objectAssign(
|
|
66
82
|
// Expose Event Emitter functionality
|
|
67
83
|
Object.create(readinessManager.gate), {
|
|
@@ -76,7 +92,7 @@ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessMana
|
|
|
76
92
|
ready: function () {
|
|
77
93
|
if (readinessManager.hasTimedout()) {
|
|
78
94
|
if (!readinessManager.isReady()) {
|
|
79
|
-
return promiseWrapper(Promise.reject(new Error('SDK
|
|
95
|
+
return promiseWrapper(Promise.reject(new Error('Split SDK has emitted SDK_READY_TIMED_OUT event.')), defaultOnRejected);
|
|
80
96
|
}
|
|
81
97
|
else {
|
|
82
98
|
return Promise.resolve();
|
package/esm/sdkClient/client.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { evaluateFeature, evaluateFeatures, evaluateFeaturesByFlagSets } from '../evaluator';
|
|
2
2
|
import { thenable } from '../utils/promise/thenable';
|
|
3
3
|
import { getMatching, getBucketing } from '../utils/key';
|
|
4
|
-
import {
|
|
4
|
+
import { validateSplitExistence } from '../utils/inputValidation/splitExistence';
|
|
5
|
+
import { validateTrafficTypeExistence } from '../utils/inputValidation/trafficTypeExistence';
|
|
5
6
|
import { SDK_NOT_READY } from '../utils/labels';
|
|
6
|
-
import { CONTROL, TREATMENT, TREATMENTS, TREATMENT_WITH_CONFIG, TREATMENTS_WITH_CONFIG, TREATMENTS_WITH_CONFIG_BY_FLAGSETS, TREATMENTS_BY_FLAGSETS, TREATMENTS_BY_FLAGSET, TREATMENTS_WITH_CONFIG_BY_FLAGSET, GET_TREATMENTS_WITH_CONFIG, GET_TREATMENTS_BY_FLAG_SETS, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, GET_TREATMENTS_BY_FLAG_SET, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, GET_TREATMENT_WITH_CONFIG, GET_TREATMENT, GET_TREATMENTS } from '../utils/constants';
|
|
7
|
+
import { CONTROL, TREATMENT, TREATMENTS, TREATMENT_WITH_CONFIG, TREATMENTS_WITH_CONFIG, TRACK, TREATMENTS_WITH_CONFIG_BY_FLAGSETS, TREATMENTS_BY_FLAGSETS, TREATMENTS_BY_FLAGSET, TREATMENTS_WITH_CONFIG_BY_FLAGSET, GET_TREATMENTS_WITH_CONFIG, GET_TREATMENTS_BY_FLAG_SETS, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, GET_TREATMENTS_BY_FLAG_SET, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, GET_TREATMENT_WITH_CONFIG, GET_TREATMENT, GET_TREATMENTS, TRACK_FN_LABEL } from '../utils/constants';
|
|
7
8
|
import { IMPRESSION_QUEUEING } from '../logger/constants';
|
|
8
9
|
import { isConsumerMode } from '../utils/settingsValidation/mode';
|
|
9
|
-
import { trackMethodFactory } from './trackMethod';
|
|
10
10
|
var treatmentNotReady = { treatment: CONTROL, label: SDK_NOT_READY };
|
|
11
11
|
function treatmentsNotReady(featureFlagNames) {
|
|
12
12
|
var evaluations = {};
|
|
@@ -15,7 +15,7 @@ function treatmentsNotReady(featureFlagNames) {
|
|
|
15
15
|
});
|
|
16
16
|
return evaluations;
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
function stringify(options) {
|
|
19
19
|
if (options && options.properties) {
|
|
20
20
|
try {
|
|
21
21
|
return JSON.stringify(options.properties);
|
|
@@ -27,7 +27,7 @@ export function stringify(options) {
|
|
|
27
27
|
* Creator of base client with getTreatments and track methods.
|
|
28
28
|
*/
|
|
29
29
|
export function clientFactory(params) {
|
|
30
|
-
var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, telemetryTracker = params.telemetryTracker,
|
|
30
|
+
var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, eventTracker = params.eventTracker, telemetryTracker = params.telemetryTracker, fallbackTreatmentsCalculator = params.fallbackTreatmentsCalculator;
|
|
31
31
|
var log = settings.log, mode = settings.mode;
|
|
32
32
|
var isAsync = isConsumerMode(mode);
|
|
33
33
|
function getTreatment(key, featureFlagName, attributes, options, withConfig, methodName) {
|
|
@@ -115,13 +115,13 @@ export function clientFactory(params) {
|
|
|
115
115
|
var changeNumber = evaluation.changeNumber, impressionsDisabled = evaluation.impressionsDisabled;
|
|
116
116
|
var treatment = evaluation.treatment, label = evaluation.label, _a = evaluation.config, config = _a === void 0 ? null : _a;
|
|
117
117
|
if (treatment === CONTROL) {
|
|
118
|
-
var fallbackTreatment =
|
|
118
|
+
var fallbackTreatment = fallbackTreatmentsCalculator(featureFlagName, label);
|
|
119
119
|
treatment = fallbackTreatment.treatment;
|
|
120
120
|
label = fallbackTreatment.label;
|
|
121
121
|
config = fallbackTreatment.config;
|
|
122
122
|
}
|
|
123
|
-
if (
|
|
124
|
-
log.info(IMPRESSION_QUEUEING, [
|
|
123
|
+
if (validateSplitExistence(log, readinessManager, featureFlagName, label, invokingMethodName)) {
|
|
124
|
+
log.info(IMPRESSION_QUEUEING, [featureFlagName, matchingKey, treatment, label]);
|
|
125
125
|
queue.push({
|
|
126
126
|
imp: {
|
|
127
127
|
feature: featureFlagName,
|
|
@@ -144,7 +144,33 @@ export function clientFactory(params) {
|
|
|
144
144
|
}
|
|
145
145
|
return treatment;
|
|
146
146
|
}
|
|
147
|
-
|
|
147
|
+
function track(key, trafficTypeName, eventTypeId, value, properties, size) {
|
|
148
|
+
if (size === void 0) { size = 1024; }
|
|
149
|
+
var stopTelemetryTracker = telemetryTracker.trackEval(TRACK);
|
|
150
|
+
var matchingKey = getMatching(key);
|
|
151
|
+
var timestamp = Date.now();
|
|
152
|
+
var eventData = {
|
|
153
|
+
eventTypeId: eventTypeId,
|
|
154
|
+
trafficTypeName: trafficTypeName,
|
|
155
|
+
value: value,
|
|
156
|
+
timestamp: timestamp,
|
|
157
|
+
key: matchingKey,
|
|
158
|
+
properties: properties
|
|
159
|
+
};
|
|
160
|
+
// This may be async but we only warn, we don't actually care if it is valid or not in terms of queueing the event.
|
|
161
|
+
validateTrafficTypeExistence(log, readinessManager, storage.splits, mode, trafficTypeName, TRACK_FN_LABEL);
|
|
162
|
+
var result = eventTracker.track(eventData, size);
|
|
163
|
+
if (thenable(result)) {
|
|
164
|
+
return result.then(function (result) {
|
|
165
|
+
stopTelemetryTracker();
|
|
166
|
+
return result;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
stopTelemetryTracker();
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
148
174
|
return {
|
|
149
175
|
getTreatment: getTreatment,
|
|
150
176
|
getTreatmentWithConfig: getTreatmentWithConfig,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { validateAttributes, validateKey,
|
|
1
|
+
import { validateAttributes, validateEvent, validateEventValue, validateEventProperties, validateKey, validateSplit, validateSplits, validateTrafficType, validateIfNotDestroyed, validateIfReadyFromCache, validateEvaluationOptions } from '../utils/inputValidation';
|
|
2
2
|
import { startsWith } from '../utils/lang';
|
|
3
|
-
import { GET_TREATMENT, GET_TREATMENTS, GET_TREATMENTS_BY_FLAG_SET, GET_TREATMENTS_BY_FLAG_SETS, GET_TREATMENTS_WITH_CONFIG, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, GET_TREATMENT_WITH_CONFIG } from '../utils/constants';
|
|
3
|
+
import { GET_TREATMENT, GET_TREATMENTS, GET_TREATMENTS_BY_FLAG_SET, GET_TREATMENTS_BY_FLAG_SETS, GET_TREATMENTS_WITH_CONFIG, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, GET_TREATMENT_WITH_CONFIG, TRACK_FN_LABEL } from '../utils/constants';
|
|
4
4
|
import { isConsumerMode } from '../utils/settingsValidation/mode';
|
|
5
5
|
import { validateFlagSets } from '../utils/settingsValidation/splitFilters';
|
|
6
6
|
/**
|
|
7
7
|
* Decorator that validates the input before actually executing the client methods.
|
|
8
8
|
* We should "guard" the client here, while not polluting the "real" implementation of those methods.
|
|
9
9
|
*/
|
|
10
|
-
export function clientInputValidationDecorator(settings, client, readinessManager,
|
|
10
|
+
export function clientInputValidationDecorator(settings, client, readinessManager, fallbackTreatmentsCalculator) {
|
|
11
11
|
var log = settings.log, mode = settings.mode;
|
|
12
12
|
var isAsync = isConsumerMode(mode);
|
|
13
13
|
/**
|
|
@@ -18,12 +18,12 @@ export function clientInputValidationDecorator(settings, client, readinessManage
|
|
|
18
18
|
var nameOrNames = methodName.indexOf('ByFlagSet') > -1 ?
|
|
19
19
|
validateFlagSets(log, methodName, maybeNameOrNames, settings.sync.__splitFiltersValidation.groupedFilters.bySet) :
|
|
20
20
|
startsWith(methodName, GET_TREATMENTS) ?
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
validateSplits(log, maybeNameOrNames, methodName) :
|
|
22
|
+
validateSplit(log, maybeNameOrNames, methodName);
|
|
23
23
|
var attributes = validateAttributes(log, maybeAttributes, methodName);
|
|
24
24
|
var isNotDestroyed = validateIfNotDestroyed(log, readinessManager, methodName);
|
|
25
25
|
var options = validateEvaluationOptions(log, maybeOptions, methodName);
|
|
26
|
-
validateIfReadyFromCache(log, readinessManager, methodName);
|
|
26
|
+
validateIfReadyFromCache(log, readinessManager, methodName, nameOrNames);
|
|
27
27
|
var valid = isNotDestroyed && key && nameOrNames && attributes !== false;
|
|
28
28
|
return {
|
|
29
29
|
valid: valid,
|
|
@@ -39,7 +39,7 @@ export function clientInputValidationDecorator(settings, client, readinessManage
|
|
|
39
39
|
featureFlagName.forEach(function (split) { return res_1[split] = evaluateFallBackTreatment(split, withConfig); });
|
|
40
40
|
return res_1;
|
|
41
41
|
}
|
|
42
|
-
var _a =
|
|
42
|
+
var _a = fallbackTreatmentsCalculator(featureFlagName), treatment = _a.treatment, config = _a.config;
|
|
43
43
|
return withConfig ?
|
|
44
44
|
{
|
|
45
45
|
treatment: treatment,
|
|
@@ -97,6 +97,17 @@ export function clientInputValidationDecorator(settings, client, readinessManage
|
|
|
97
97
|
client.getTreatmentsWithConfigByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options) :
|
|
98
98
|
wrapResult({});
|
|
99
99
|
}
|
|
100
|
+
function track(maybeKey, maybeTT, maybeEvent, maybeEventValue, maybeProperties) {
|
|
101
|
+
var key = validateKey(log, maybeKey, TRACK_FN_LABEL);
|
|
102
|
+
var tt = validateTrafficType(log, maybeTT, TRACK_FN_LABEL);
|
|
103
|
+
var event = validateEvent(log, maybeEvent, TRACK_FN_LABEL);
|
|
104
|
+
var eventValue = validateEventValue(log, maybeEventValue, TRACK_FN_LABEL);
|
|
105
|
+
var _a = validateEventProperties(log, maybeProperties, TRACK_FN_LABEL), properties = _a.properties, size = _a.size;
|
|
106
|
+
var isNotDestroyed = validateIfNotDestroyed(log, readinessManager, TRACK_FN_LABEL);
|
|
107
|
+
return isNotDestroyed && key && tt && event && eventValue !== false && properties !== false ? // @ts-expect-error
|
|
108
|
+
client.track(key, tt, event, eventValue, properties, size) :
|
|
109
|
+
wrapResult(false);
|
|
110
|
+
}
|
|
100
111
|
return {
|
|
101
112
|
getTreatment: getTreatment,
|
|
102
113
|
getTreatmentWithConfig: getTreatmentWithConfig,
|
|
@@ -106,6 +117,6 @@ export function clientInputValidationDecorator(settings, client, readinessManage
|
|
|
106
117
|
getTreatmentsWithConfigByFlagSets: getTreatmentsWithConfigByFlagSets,
|
|
107
118
|
getTreatmentsByFlagSet: getTreatmentsByFlagSet,
|
|
108
119
|
getTreatmentsWithConfigByFlagSet: getTreatmentsWithConfigByFlagSet,
|
|
109
|
-
track:
|
|
120
|
+
track: track
|
|
110
121
|
};
|
|
111
122
|
}
|