@splitsoftware/splitio-commons 3.1.1-rc.1 → 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.
Files changed (239) hide show
  1. package/CHANGES.txt +10 -1
  2. package/cjs/evaluator/condition/index.js +2 -2
  3. package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +8 -5
  4. package/cjs/evaluator/index.js +71 -76
  5. package/cjs/listeners/browser.js +1 -2
  6. package/cjs/listeners/node.js +4 -4
  7. package/cjs/logger/constants.js +20 -15
  8. package/cjs/logger/messages/debug.js +6 -5
  9. package/cjs/logger/messages/error.js +3 -3
  10. package/cjs/logger/messages/info.js +4 -3
  11. package/cjs/logger/messages/warn.js +7 -6
  12. package/cjs/presets/serverSide.js +2 -2
  13. package/cjs/readiness/constants.js +4 -5
  14. package/cjs/readiness/readinessManager.js +23 -23
  15. package/cjs/readiness/sdkReadinessManager.js +17 -1
  16. package/cjs/sdkClient/client.js +51 -27
  17. package/cjs/sdkClient/clientInputValidation.js +17 -6
  18. package/cjs/sdkClient/sdkClient.js +60 -3
  19. package/cjs/sdkFactory/index.js +15 -11
  20. package/cjs/sdkManager/index.js +5 -5
  21. package/cjs/services/decorateHeaders.js +1 -2
  22. package/cjs/services/splitApi.js +1 -14
  23. package/cjs/services/splitHttpClient.js +5 -3
  24. package/cjs/storages/AbstractSplitsCacheAsync.js +51 -0
  25. package/cjs/storages/AbstractSplitsCacheSync.js +76 -0
  26. package/cjs/storages/KeyBuilder.js +6 -6
  27. package/cjs/storages/KeyBuilderCS.js +5 -5
  28. package/cjs/storages/KeyBuilderSS.js +2 -2
  29. package/cjs/storages/getRolloutPlan.js +3 -3
  30. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +2 -1
  31. package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
  32. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +194 -0
  33. package/cjs/storages/inLocalStorage/index.js +6 -6
  34. package/cjs/storages/inLocalStorage/validateCache.js +3 -3
  35. package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
  36. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
  37. package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
  38. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  39. package/cjs/storages/inMemory/SplitsCacheInMemory.js +121 -0
  40. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  41. package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
  42. package/cjs/storages/inRedis/RedisAdapter.js +8 -5
  43. package/cjs/storages/inRedis/{DefinitionsCacheInRedis.js → SplitsCacheInRedis.js} +77 -77
  44. package/cjs/storages/inRedis/index.js +2 -2
  45. package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
  46. package/cjs/storages/pluggable/SplitsCachePluggable.js +212 -0
  47. package/cjs/storages/pluggable/index.js +2 -2
  48. package/cjs/storages/setRolloutPlan.js +4 -4
  49. package/cjs/storages/utils.js +0 -1
  50. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
  51. package/cjs/sync/polling/fetchers/splitChangesFetcher.js +15 -24
  52. package/cjs/sync/polling/pollingManagerCS.js +20 -20
  53. package/cjs/sync/polling/pollingManagerSS.js +15 -15
  54. package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +3 -2
  55. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +13 -0
  56. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  57. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
  58. package/cjs/sync/polling/updaters/{definitionChangesUpdater.js → splitChangesUpdater.js} +68 -65
  59. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  60. package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
  61. package/cjs/sync/streaming/SSEHandler/index.js +1 -1
  62. package/cjs/sync/streaming/UpdateWorkers/{DefinitionsUpdateWorker.js → SplitsUpdateWorker.js} +19 -16
  63. package/cjs/sync/streaming/constants.js +3 -3
  64. package/cjs/sync/streaming/parseUtils.js +11 -11
  65. package/cjs/sync/streaming/pushManager.js +16 -16
  66. package/cjs/sync/submitters/eventsSubmitter.js +1 -1
  67. package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
  68. package/cjs/sync/submitters/impressionsSubmitter.js +4 -5
  69. package/cjs/sync/submitters/telemetrySubmitter.js +4 -3
  70. package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
  71. package/cjs/sync/syncManagerOnline.js +7 -12
  72. package/cjs/utils/Backoff.js +0 -20
  73. package/cjs/utils/inputValidation/index.js +7 -7
  74. package/cjs/utils/inputValidation/isOperational.js +4 -4
  75. package/cjs/utils/inputValidation/{definition.js → split.js} +10 -10
  76. package/cjs/utils/inputValidation/{definitionExistence.js → splitExistence.js} +6 -6
  77. package/cjs/utils/inputValidation/splits.js +25 -0
  78. package/cjs/utils/labels/index.js +3 -3
  79. package/cjs/utils/settingsValidation/index.js +0 -2
  80. package/cjs/utils/settingsValidation/splitFilters.js +3 -3
  81. package/cjs/utils/settingsValidation/url.js +2 -6
  82. package/esm/evaluator/condition/index.js +2 -2
  83. package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +8 -5
  84. package/esm/evaluator/index.js +71 -75
  85. package/esm/listeners/browser.js +1 -2
  86. package/esm/listeners/node.js +4 -4
  87. package/esm/logger/constants.js +17 -12
  88. package/esm/logger/messages/debug.js +6 -5
  89. package/esm/logger/messages/error.js +3 -3
  90. package/esm/logger/messages/info.js +4 -3
  91. package/esm/logger/messages/warn.js +7 -6
  92. package/esm/presets/serverSide.js +2 -2
  93. package/esm/readiness/constants.js +3 -4
  94. package/esm/readiness/readinessManager.js +24 -24
  95. package/esm/readiness/sdkReadinessManager.js +18 -2
  96. package/esm/sdkClient/client.js +51 -26
  97. package/esm/sdkClient/clientInputValidation.js +19 -8
  98. package/esm/sdkClient/sdkClient.js +60 -3
  99. package/esm/sdkFactory/index.js +16 -12
  100. package/esm/sdkManager/index.js +6 -6
  101. package/esm/services/decorateHeaders.js +1 -2
  102. package/esm/services/splitApi.js +1 -14
  103. package/esm/services/splitHttpClient.js +5 -3
  104. package/esm/storages/AbstractSplitsCacheAsync.js +48 -0
  105. package/esm/storages/AbstractSplitsCacheSync.js +71 -0
  106. package/esm/storages/KeyBuilder.js +6 -6
  107. package/esm/storages/KeyBuilderCS.js +5 -5
  108. package/esm/storages/KeyBuilderSS.js +2 -2
  109. package/esm/storages/getRolloutPlan.js +3 -3
  110. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +2 -1
  111. package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
  112. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +191 -0
  113. package/esm/storages/inLocalStorage/index.js +6 -6
  114. package/esm/storages/inLocalStorage/validateCache.js +3 -3
  115. package/esm/storages/inMemory/InMemoryStorage.js +4 -4
  116. package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
  117. package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
  118. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  119. package/esm/storages/inMemory/SplitsCacheInMemory.js +118 -0
  120. package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  121. package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
  122. package/esm/storages/inRedis/RedisAdapter.js +8 -5
  123. package/esm/storages/inRedis/{DefinitionsCacheInRedis.js → SplitsCacheInRedis.js} +76 -76
  124. package/esm/storages/inRedis/index.js +2 -2
  125. package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
  126. package/esm/storages/pluggable/SplitsCachePluggable.js +209 -0
  127. package/esm/storages/pluggable/index.js +2 -2
  128. package/esm/storages/setRolloutPlan.js +4 -4
  129. package/esm/storages/utils.js +0 -1
  130. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
  131. package/esm/sync/polling/fetchers/splitChangesFetcher.js +16 -25
  132. package/esm/sync/polling/pollingManagerCS.js +17 -17
  133. package/esm/sync/polling/pollingManagerSS.js +15 -15
  134. package/esm/sync/polling/syncTasks/segmentsSyncTask.js +3 -2
  135. package/esm/sync/polling/syncTasks/splitsSyncTask.js +9 -0
  136. package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  137. package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
  138. package/esm/sync/polling/updaters/{definitionChangesUpdater.js → splitChangesUpdater.js} +68 -65
  139. package/esm/sync/streaming/AuthClient/index.js +1 -1
  140. package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
  141. package/esm/sync/streaming/SSEHandler/index.js +2 -2
  142. package/esm/sync/streaming/UpdateWorkers/{DefinitionsUpdateWorker.js → SplitsUpdateWorker.js} +18 -15
  143. package/esm/sync/streaming/constants.js +2 -2
  144. package/esm/sync/streaming/parseUtils.js +9 -9
  145. package/esm/sync/streaming/pushManager.js +18 -18
  146. package/esm/sync/submitters/eventsSubmitter.js +1 -1
  147. package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
  148. package/esm/sync/submitters/impressionsSubmitter.js +4 -5
  149. package/esm/sync/submitters/telemetrySubmitter.js +4 -3
  150. package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
  151. package/esm/sync/syncManagerOnline.js +6 -11
  152. package/esm/utils/Backoff.js +0 -20
  153. package/esm/utils/inputValidation/index.js +3 -3
  154. package/esm/utils/inputValidation/isOperational.js +4 -4
  155. package/esm/utils/inputValidation/{definition.js → split.js} +8 -8
  156. package/esm/utils/inputValidation/splitExistence.js +15 -0
  157. package/esm/utils/inputValidation/splits.js +21 -0
  158. package/esm/utils/labels/index.js +2 -2
  159. package/esm/utils/settingsValidation/index.js +0 -2
  160. package/esm/utils/settingsValidation/splitFilters.js +3 -3
  161. package/esm/utils/settingsValidation/url.js +2 -6
  162. package/package.json +6 -7
  163. package/src/dtos/types.ts +1 -1
  164. package/src/evaluator/index.ts +11 -5
  165. package/src/evaluator/types.ts +1 -0
  166. package/src/presets/serverSide.ts +3 -3
  167. package/src/sdkClient/client.ts +3 -4
  168. package/src/sdkClient/sdkLifecycle.ts +3 -0
  169. package/src/services/authProvider.ts +41 -19
  170. package/src/services/secureSplitHttpClient.ts +10 -18
  171. package/src/services/serviceApi.ts +27 -24
  172. package/src/services/splitApi.ts +10 -9
  173. package/src/services/types.ts +5 -4
  174. package/src/storages/inRedis/RedisAdapter.ts +8 -5
  175. package/src/sync/polling/pollingManagerCS.ts +80 -78
  176. package/src/sync/polling/pollingManagerSS.ts +49 -45
  177. package/src/sync/polling/updaters/definitionChangesUpdater.ts +3 -3
  178. package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
  179. package/src/sync/streaming/AuthClient/index.ts +14 -15
  180. package/src/sync/streaming/AuthClient/types.ts +9 -13
  181. package/src/sync/streaming/SSEClient/index.ts +2 -2
  182. package/src/sync/streaming/SSEClient/types.ts +2 -2
  183. package/src/sync/streaming/SSEHandler/index.ts +2 -1
  184. package/src/sync/streaming/SSEHandler/types.ts +2 -2
  185. package/src/sync/streaming/constants.ts +1 -0
  186. package/src/sync/streaming/pushManager.ts +32 -42
  187. package/src/sync/streaming/types.ts +3 -2
  188. package/src/sync/submitters/impressionsSubmitter.ts +3 -3
  189. package/src/sync/submitters/types.ts +2 -2
  190. package/src/sync/syncManagerOnline.ts +2 -8
  191. package/src/utils/Backoff.ts +16 -4
  192. package/types/splitio.d.ts +5 -4
  193. package/cjs/platform/browser.js +0 -15
  194. package/cjs/platform/getEventSource/browser.js +0 -8
  195. package/cjs/platform/getEventSource/eventsource.js +0 -480
  196. package/cjs/platform/getEventSource/node.js +0 -26
  197. package/cjs/platform/getFetch/browser.js +0 -9
  198. package/cjs/platform/getFetch/node.js +0 -27
  199. package/cjs/platform/getOptions/node.js +0 -25
  200. package/cjs/platform/node.js +0 -17
  201. package/cjs/sdkClient/sdkLifecycle.js +0 -72
  202. package/cjs/sdkClient/trackMethod.js +0 -56
  203. package/cjs/services/authProvider.js +0 -67
  204. package/cjs/services/secureSplitHttpClient.js +0 -39
  205. package/cjs/services/serviceApi.js +0 -145
  206. package/cjs/storages/AbstractDefinitionsCacheAsync.js +0 -51
  207. package/cjs/storages/AbstractDefinitionsCacheSync.js +0 -76
  208. package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +0 -194
  209. package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +0 -121
  210. package/cjs/storages/pluggable/DefinitionsCachePluggable.js +0 -212
  211. package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +0 -13
  212. package/cjs/utils/EventEmitter.js +0 -391
  213. package/cjs/utils/filter/bloomFilter.js +0 -37
  214. package/cjs/utils/inputValidation/definitions.js +0 -25
  215. package/cjs/utils/inputValidation/target.js +0 -22
  216. package/esm/platform/browser.js +0 -12
  217. package/esm/platform/getEventSource/browser.js +0 -4
  218. package/esm/platform/getEventSource/eventsource.js +0 -480
  219. package/esm/platform/getEventSource/node.js +0 -20
  220. package/esm/platform/getFetch/browser.js +0 -5
  221. package/esm/platform/getFetch/node.js +0 -22
  222. package/esm/platform/getOptions/node.js +0 -20
  223. package/esm/platform/node.js +0 -14
  224. package/esm/sdkClient/sdkLifecycle.js +0 -68
  225. package/esm/sdkClient/trackMethod.js +0 -52
  226. package/esm/services/authProvider.js +0 -63
  227. package/esm/services/secureSplitHttpClient.js +0 -35
  228. package/esm/services/serviceApi.js +0 -141
  229. package/esm/storages/AbstractDefinitionsCacheAsync.js +0 -48
  230. package/esm/storages/AbstractDefinitionsCacheSync.js +0 -71
  231. package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +0 -191
  232. package/esm/storages/inMemory/DefinitionsCacheInMemory.js +0 -118
  233. package/esm/storages/pluggable/DefinitionsCachePluggable.js +0 -209
  234. package/esm/sync/polling/syncTasks/definitionsSyncTask.js +0 -9
  235. package/esm/utils/EventEmitter.js +0 -387
  236. package/esm/utils/filter/bloomFilter.js +0 -33
  237. package/esm/utils/inputValidation/definitionExistence.js +0 -15
  238. package/esm/utils/inputValidation/definitions.js +0 -21
  239. package/esm/utils/inputValidation/target.js +0 -18
@@ -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(_a) {
14
- var syncManager = _a.syncManager, settings = _a.settings;
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.
@@ -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 SYNC_FETCH = 31;
23
- export var SYNC_UPDATE = 32;
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 SYNC_FETCH_RETRY = 204;
59
- export var SYNC_FETCH_FAILS = 205;
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 WARN_NOT_EXISTENT_DEFINITION = 215;
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 LOG_PREFIX_SYNC_AUTH = 'sync:auth: ';
122
- export var LOG_PREFIX_SYNC_MANAGER = 'sync:sync-manager: ';
123
- export var LOG_PREFIX_SYNC_OFFLINE = 'sync:offline: ';
124
- export var LOG_PREFIX_SYNC_STREAMING = 'sync:streaming: ';
125
- export var LOG_PREFIX_SYNC_POLLING = 'sync:polling-manager: ';
126
- export var LOG_PREFIX_SYNC_SUBMITTERS = 'sync:submitter: ';
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.SYNC_FETCH, c.LOG_PREFIX_SYNC + 'Spin up %s updates using since = %s and rbSince = %s.'],
24
- [c.SYNC_UPDATE, c.LOG_PREFIX_SYNC + 'Updated %s: %s. Removed: %s.'],
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 definition, no valid rules or unsupported targeting rule type found'],
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 number of sets provided is too high, which causes a URI length error.'],
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. %s: %s. Key: %s. Evaluation: %s. Label: %s'],
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.SYNC_FETCH_RETRY, c.LOG_PREFIX_SYNC + 'Retrying fetch of %s (attempt #%s). Reason: %s'],
9
- [c.SYNC_FETCH_FAILS, c.LOG_PREFIX_SYNC + 'Error while doing fetch of %s. %s'],
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.WARN_NOT_EXISTENT_DEFINITION, '%s: "%s" does not exist in this environment. Please double check that it exists in Harness FME UI.'],
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 { serviceApiFactory } from '../services/serviceApi';
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
- serviceApiFactory: serviceApiFactory,
12
+ splitApiFactory: splitApiFactory,
13
13
  syncManagerFactory: syncManagerOnlineSSFactory,
14
14
  sdkManagerFactory: sdkManagerFactory,
15
15
  sdkClientMethodFactory: sdkClientMethodFactory,
@@ -1,6 +1,6 @@
1
- // Definitions events:
2
- export var SDK_DEFINITIONS_ARRIVED = 'state::splits-arrived';
3
- export var SDK_DEFINITIONS_CACHE_LOADED = 'state::splits-cache-loaded';
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 { SDK_DEFINITIONS_ARRIVED, SDK_DEFINITIONS_CACHE_LOADED, SDK_SEGMENTS_ARRIVED, SDK_READY_TIMED_OUT, SDK_READY_FROM_CACHE, SDK_UPDATE, SDK_READY } from './constants';
3
- function definitionsEventEmitterFactory(EventEmitter) {
4
- var definitionsEventEmitter = objectAssign(new EventEmitter(), {
5
- definitionsArrived: false,
6
- definitionsCacheLoaded: false,
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
- definitionsEventEmitter.on(SDK_DEFINITIONS_ARRIVED, function (metadata, isSplitKill) { if (!isSplitKill)
14
- definitionsEventEmitter.definitionsArrived = true; });
15
- definitionsEventEmitter.once(SDK_DEFINITIONS_CACHE_LOADED, function () { definitionsEventEmitter.definitionsCacheLoaded = true; });
16
- return definitionsEventEmitter;
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, definitions, isShared) {
29
- if (definitions === void 0) { definitions = definitionsEventEmitterFactory(EventEmitter); }
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 (definitions.definitionsCacheLoaded)
44
+ if (splits.splitsCacheLoaded)
45
45
  isReadyFromCache = true; // ready from cache, but doesn't emit SDK_READY_FROM_CACHE
46
46
  else
47
- definitions.once(SDK_DEFINITIONS_CACHE_LOADED, checkIsReadyFromCache);
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 client emitted SDK_READY_TIMED_OUT event.');
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
- definitions.on(SDK_DEFINITIONS_ARRIVED, checkIsReadyOrUpdate);
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
- definitions.initCallbacks.push(__init);
69
- if (definitions.hasInit)
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 (definitions.definitionsArrived && segments.segmentsArrived) {
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
- definitions: definitions,
123
+ splits: splits,
124
124
  segments: segments,
125
125
  gate: gate,
126
126
  shared: function () {
127
- return readinessManagerFactory(EventEmitter, settings, definitions, true);
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 (definitions.hasInit)
136
+ if (splits.hasInit)
137
137
  return;
138
- definitions.hasInit = true;
139
- definitions.initCallbacks.forEach(function (cb) { return cb(); });
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
- definitions.hasInit = false;
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 client has emitted SDK_READY_TIMED_OUT event.')), defaultOnRejected);
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();
@@ -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 { validateDefinitionExistence } from '../utils/inputValidation/definitionExistence';
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,10 +15,10 @@ function treatmentsNotReady(featureFlagNames) {
15
15
  });
16
16
  return evaluations;
17
17
  }
18
- export function stringify(properties) {
19
- if (properties) {
18
+ function stringify(options) {
19
+ if (options && options.properties) {
20
20
  try {
21
- return JSON.stringify(properties);
21
+ return JSON.stringify(options.properties);
22
22
  }
23
23
  catch ( /* JSON.stringify should never throw with validated options, but handling just in case */_a) { /* JSON.stringify should never throw with validated options, but handling just in case */ }
24
24
  }
@@ -27,7 +27,7 @@ export function stringify(properties) {
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, fallbackCalculator = params.fallbackCalculator;
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) {
@@ -36,13 +36,13 @@ export function clientFactory(params) {
36
36
  var stopTelemetryTracker = telemetryTracker.trackEval(withConfig ? TREATMENT_WITH_CONFIG : TREATMENT);
37
37
  var wrapUp = function (evaluationResult) {
38
38
  var queue = [];
39
- var treatment = processEvaluation(evaluationResult, featureFlagName, key, withConfig, methodName, queue, options);
39
+ var treatment = processEvaluation(evaluationResult, featureFlagName, key, stringify(options), withConfig, methodName, queue);
40
40
  impressionsTracker.track(queue, attributes);
41
41
  stopTelemetryTracker(queue[0] && queue[0].imp.label);
42
42
  return treatment;
43
43
  };
44
44
  var evaluation = readinessManager.isReadyFromCache() ?
45
- evaluateFeature(log, key, featureFlagName, attributes, storage) :
45
+ evaluateFeature(log, key, featureFlagName, attributes, storage, options) :
46
46
  isAsync ? // If the SDK is not ready, treatment may be incorrect due to having splits but not segments data, or storage is not connected
47
47
  Promise.resolve(treatmentNotReady) :
48
48
  treatmentNotReady;
@@ -58,15 +58,16 @@ export function clientFactory(params) {
58
58
  var wrapUp = function (evaluationResults) {
59
59
  var queue = [];
60
60
  var treatments = {};
61
+ var properties = stringify(options);
61
62
  Object.keys(evaluationResults).forEach(function (featureFlagName) {
62
- treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, withConfig, methodName, queue, options);
63
+ treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, properties, withConfig, methodName, queue);
63
64
  });
64
65
  impressionsTracker.track(queue, attributes);
65
66
  stopTelemetryTracker(queue[0] && queue[0].imp.label);
66
67
  return treatments;
67
68
  };
68
69
  var evaluations = readinessManager.isReadyFromCache() ?
69
- evaluateFeatures(log, key, featureFlagNames, attributes, storage) :
70
+ evaluateFeatures(log, key, featureFlagNames, attributes, storage, options) :
70
71
  isAsync ? // If the SDK is not ready, treatment may be incorrect due to having splits but not segments data, or storage is not connected
71
72
  Promise.resolve(treatmentsNotReady(featureFlagNames)) :
72
73
  treatmentsNotReady(featureFlagNames);
@@ -83,15 +84,16 @@ export function clientFactory(params) {
83
84
  var wrapUp = function (evaluationResults) {
84
85
  var queue = [];
85
86
  var treatments = {};
87
+ var properties = stringify(options);
86
88
  Object.keys(evaluationResults).forEach(function (featureFlagName) {
87
- treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, withConfig, methodName, queue, options);
89
+ treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, properties, withConfig, methodName, queue);
88
90
  });
89
91
  impressionsTracker.track(queue, attributes);
90
92
  stopTelemetryTracker(queue[0] && queue[0].imp.label);
91
93
  return treatments;
92
94
  };
93
95
  var evaluations = readinessManager.isReadyFromCache() ?
94
- evaluateFeaturesByFlagSets(log, key, flagSetNames, attributes, storage, methodName) :
96
+ evaluateFeaturesByFlagSets(log, key, flagSetNames, attributes, storage, methodName, options) :
95
97
  isAsync ?
96
98
  Promise.resolve({}) :
97
99
  {};
@@ -107,22 +109,19 @@ export function clientFactory(params) {
107
109
  return getTreatmentsByFlagSets(key, [flagSetName], attributes, options, true, TREATMENTS_WITH_CONFIG_BY_FLAGSET, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET);
108
110
  }
109
111
  // Internal function
110
- function processEvaluation(evaluation, featureFlagName, key, withConfig, invokingMethodName, queue, options) {
111
- var _a;
112
- if (options === void 0) { options = {}; }
112
+ function processEvaluation(evaluation, featureFlagName, key, properties, withConfig, invokingMethodName, queue) {
113
113
  var matchingKey = getMatching(key);
114
114
  var bucketingKey = getBucketing(key);
115
- var definition = evaluation.definition;
116
- var treatment = evaluation.treatment, label = evaluation.label;
117
- var config = ((_a = definition === null || definition === void 0 ? void 0 : definition.configurations) === null || _a === void 0 ? void 0 : _a[treatment]) || null;
115
+ var changeNumber = evaluation.changeNumber, impressionsDisabled = evaluation.impressionsDisabled;
116
+ var treatment = evaluation.treatment, label = evaluation.label, _a = evaluation.config, config = _a === void 0 ? null : _a;
118
117
  if (treatment === CONTROL) {
119
- var fallbackTreatment = fallbackCalculator(featureFlagName, label);
118
+ var fallbackTreatment = fallbackTreatmentsCalculator(featureFlagName, label);
120
119
  treatment = fallbackTreatment.treatment;
121
120
  label = fallbackTreatment.label;
122
121
  config = fallbackTreatment.config;
123
122
  }
124
- if (validateDefinitionExistence(log, readinessManager, featureFlagName, label, invokingMethodName)) {
125
- log.info(IMPRESSION_QUEUEING, ['Feature flag', featureFlagName, matchingKey, treatment, label]);
123
+ if (validateSplitExistence(log, readinessManager, featureFlagName, label, invokingMethodName)) {
124
+ log.info(IMPRESSION_QUEUEING, [featureFlagName, matchingKey, treatment, label]);
126
125
  queue.push({
127
126
  imp: {
128
127
  feature: featureFlagName,
@@ -131,10 +130,10 @@ export function clientFactory(params) {
131
130
  time: Date.now(),
132
131
  bucketingKey: bucketingKey,
133
132
  label: label,
134
- changeNumber: definition.changeNumber,
135
- properties: stringify(options.properties)
133
+ changeNumber: changeNumber,
134
+ properties: properties
136
135
  },
137
- disabled: options.impressionsDisabled || definition.impressionsDisabled
136
+ disabled: impressionsDisabled
138
137
  });
139
138
  }
140
139
  if (withConfig) {
@@ -145,7 +144,33 @@ export function clientFactory(params) {
145
144
  }
146
145
  return treatment;
147
146
  }
148
- var track = trackMethodFactory(params);
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
+ }
149
174
  return {
150
175
  getTreatment: getTreatment,
151
176
  getTreatmentWithConfig: getTreatmentWithConfig,