@splitsoftware/splitio-commons 1.17.1-rc.3 → 1.17.1-rc.5

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 (275) hide show
  1. package/CHANGES.txt +28 -28
  2. package/LICENSE +1 -1
  3. package/README.md +4 -3
  4. package/cjs/consent/sdkUserConsent.js +4 -2
  5. package/cjs/evaluator/matchers/index.js +1 -3
  6. package/cjs/evaluator/matchers/matcherTypes.js +0 -1
  7. package/cjs/evaluator/matchers/segment.js +0 -6
  8. package/cjs/evaluator/matchersTransform/index.js +1 -4
  9. package/cjs/evaluator/matchersTransform/segment.js +1 -3
  10. package/cjs/logger/constants.js +2 -2
  11. package/cjs/logger/messages/info.js +1 -1
  12. package/cjs/logger/messages/warn.js +1 -1
  13. package/cjs/readiness/readinessManager.js +11 -12
  14. package/cjs/readiness/sdkReadinessManager.js +6 -5
  15. package/cjs/sdkClient/sdkClient.js +5 -5
  16. package/cjs/sdkClient/sdkClientMethod.js +1 -3
  17. package/cjs/sdkClient/sdkClientMethodCS.js +17 -15
  18. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +17 -15
  19. package/cjs/sdkFactory/index.js +11 -38
  20. package/cjs/services/decorateHeaders.js +6 -1
  21. package/cjs/services/splitApi.js +5 -5
  22. package/cjs/services/splitHttpClient.js +5 -2
  23. package/cjs/storages/AbstractSegmentsCacheSync.js +12 -41
  24. package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
  25. package/cjs/storages/AbstractSplitsCacheSync.js +8 -2
  26. package/cjs/storages/KeyBuilderCS.js +5 -23
  27. package/cjs/storages/dataLoader.js +33 -65
  28. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
  29. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
  30. package/cjs/storages/inLocalStorage/index.js +3 -12
  31. package/cjs/storages/inMemory/InMemoryStorageCS.js +3 -20
  32. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
  33. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  34. package/cjs/storages/inMemory/SplitsCacheInMemory.js +8 -8
  35. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  36. package/cjs/storages/inRedis/RedisAdapter.js +1 -1
  37. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +2 -2
  38. package/cjs/storages/inRedis/index.js +11 -5
  39. package/cjs/storages/pluggable/SegmentsCachePluggable.js +2 -2
  40. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  41. package/cjs/storages/pluggable/index.js +32 -37
  42. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
  43. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  44. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  45. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  46. package/cjs/sync/polling/pollingManagerSS.js +3 -3
  47. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  48. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  49. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  50. package/cjs/sync/polling/updaters/splitChangesUpdater.js +11 -2
  51. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  52. package/cjs/sync/streaming/SSEHandler/index.js +5 -3
  53. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
  54. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  55. package/cjs/sync/streaming/constants.js +3 -3
  56. package/cjs/sync/streaming/parseUtils.js +9 -14
  57. package/cjs/sync/streaming/pushManager.js +67 -69
  58. package/cjs/sync/syncTask.js +2 -2
  59. package/cjs/trackers/eventTracker.js +9 -11
  60. package/cjs/trackers/impressionsTracker.js +13 -15
  61. package/cjs/trackers/uniqueKeysTracker.js +3 -5
  62. package/cjs/utils/constants/index.js +4 -5
  63. package/cjs/utils/settingsValidation/index.js +1 -2
  64. package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
  65. package/esm/consent/sdkUserConsent.js +4 -2
  66. package/esm/evaluator/matchers/index.js +1 -3
  67. package/esm/evaluator/matchers/matcherTypes.js +0 -1
  68. package/esm/evaluator/matchers/segment.js +0 -6
  69. package/esm/evaluator/matchersTransform/index.js +1 -4
  70. package/esm/evaluator/matchersTransform/segment.js +1 -3
  71. package/esm/logger/constants.js +1 -1
  72. package/esm/logger/messages/info.js +1 -1
  73. package/esm/logger/messages/warn.js +1 -1
  74. package/esm/readiness/readinessManager.js +11 -12
  75. package/esm/readiness/sdkReadinessManager.js +6 -5
  76. package/esm/sdkClient/sdkClient.js +5 -5
  77. package/esm/sdkClient/sdkClientMethod.js +1 -3
  78. package/esm/sdkClient/sdkClientMethodCS.js +15 -13
  79. package/esm/sdkClient/sdkClientMethodCSWithTT.js +15 -13
  80. package/esm/sdkFactory/index.js +12 -39
  81. package/esm/services/decorateHeaders.js +4 -0
  82. package/esm/services/splitApi.js +6 -6
  83. package/esm/services/splitHttpClient.js +6 -3
  84. package/esm/storages/AbstractSegmentsCacheSync.js +12 -41
  85. package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
  86. package/esm/storages/AbstractSplitsCacheSync.js +9 -3
  87. package/esm/storages/KeyBuilderCS.js +4 -21
  88. package/esm/storages/dataLoader.js +31 -62
  89. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
  90. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
  91. package/esm/storages/inLocalStorage/index.js +5 -14
  92. package/esm/storages/inMemory/InMemoryStorageCS.js +3 -20
  93. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
  94. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  95. package/esm/storages/inMemory/SplitsCacheInMemory.js +8 -8
  96. package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  97. package/esm/storages/inRedis/RedisAdapter.js +1 -1
  98. package/esm/storages/inRedis/SegmentsCacheInRedis.js +2 -2
  99. package/esm/storages/inRedis/index.js +11 -5
  100. package/esm/storages/pluggable/SegmentsCachePluggable.js +2 -2
  101. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  102. package/esm/storages/pluggable/index.js +32 -37
  103. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
  104. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  105. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  106. package/esm/sync/polling/pollingManagerCS.js +1 -1
  107. package/esm/sync/polling/pollingManagerSS.js +3 -3
  108. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  109. package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  110. package/esm/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  111. package/esm/sync/polling/updaters/splitChangesUpdater.js +12 -3
  112. package/esm/sync/streaming/AuthClient/index.js +1 -1
  113. package/esm/sync/streaming/SSEHandler/index.js +6 -4
  114. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
  115. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  116. package/esm/sync/streaming/constants.js +2 -2
  117. package/esm/sync/streaming/parseUtils.js +8 -12
  118. package/esm/sync/streaming/pushManager.js +70 -72
  119. package/esm/sync/syncTask.js +2 -2
  120. package/esm/trackers/eventTracker.js +9 -11
  121. package/esm/trackers/impressionsTracker.js +13 -15
  122. package/esm/trackers/uniqueKeysTracker.js +3 -5
  123. package/esm/utils/constants/index.js +2 -3
  124. package/esm/utils/settingsValidation/index.js +1 -2
  125. package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
  126. package/package.json +1 -1
  127. package/src/consent/sdkUserConsent.ts +3 -2
  128. package/src/dtos/types.ts +7 -21
  129. package/src/evaluator/matchers/index.ts +0 -2
  130. package/src/evaluator/matchers/matcherTypes.ts +0 -1
  131. package/src/evaluator/matchers/segment.ts +0 -7
  132. package/src/evaluator/matchersTransform/index.ts +1 -4
  133. package/src/evaluator/matchersTransform/segment.ts +3 -5
  134. package/src/logger/constants.ts +1 -1
  135. package/src/logger/messages/info.ts +1 -1
  136. package/src/logger/messages/warn.ts +1 -1
  137. package/src/readiness/readinessManager.ts +12 -16
  138. package/src/readiness/sdkReadinessManager.ts +7 -7
  139. package/src/readiness/types.ts +2 -3
  140. package/src/sdkClient/sdkClient.ts +5 -5
  141. package/src/sdkClient/sdkClientMethod.ts +1 -4
  142. package/src/sdkClient/sdkClientMethodCS.ts +14 -11
  143. package/src/sdkClient/sdkClientMethodCSWithTT.ts +14 -11
  144. package/src/sdkFactory/index.ts +13 -42
  145. package/src/sdkFactory/types.ts +1 -5
  146. package/src/services/decorateHeaders.ts +5 -0
  147. package/src/services/splitApi.ts +7 -7
  148. package/src/services/splitHttpClient.ts +7 -4
  149. package/src/services/types.ts +2 -2
  150. package/src/storages/AbstractSegmentsCacheSync.ts +12 -53
  151. package/src/storages/AbstractSplitsCacheAsync.ts +8 -0
  152. package/src/storages/AbstractSplitsCacheSync.ts +11 -4
  153. package/src/storages/KeyBuilderCS.ts +5 -34
  154. package/src/storages/dataLoader.ts +33 -63
  155. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +59 -29
  156. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +10 -1
  157. package/src/storages/inLocalStorage/index.ts +6 -16
  158. package/src/storages/inMemory/InMemoryStorageCS.ts +3 -23
  159. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +44 -10
  160. package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
  161. package/src/storages/inMemory/SplitsCacheInMemory.ts +8 -7
  162. package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
  163. package/src/storages/inRedis/RedisAdapter.ts +1 -1
  164. package/src/storages/inRedis/SegmentsCacheInRedis.ts +2 -2
  165. package/src/storages/inRedis/index.ts +12 -6
  166. package/src/storages/pluggable/SegmentsCachePluggable.ts +2 -2
  167. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  168. package/src/storages/pluggable/index.ts +33 -38
  169. package/src/storages/types.ts +15 -15
  170. package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
  171. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
  172. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  173. package/src/sync/polling/fetchers/types.ts +2 -3
  174. package/src/sync/polling/pollingManagerCS.ts +4 -4
  175. package/src/sync/polling/pollingManagerSS.ts +2 -3
  176. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
  177. package/src/sync/polling/types.ts +6 -7
  178. package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
  179. package/src/sync/polling/updaters/segmentChangesUpdater.ts +2 -2
  180. package/src/sync/polling/updaters/splitChangesUpdater.ts +12 -4
  181. package/src/sync/streaming/AuthClient/index.ts +1 -1
  182. package/src/sync/streaming/SSEClient/index.ts +6 -4
  183. package/src/sync/streaming/SSEHandler/index.ts +8 -5
  184. package/src/sync/streaming/SSEHandler/types.ts +15 -15
  185. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
  186. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
  187. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  188. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  189. package/src/sync/streaming/constants.ts +2 -2
  190. package/src/sync/streaming/parseUtils.ts +11 -19
  191. package/src/sync/streaming/pushManager.ts +72 -73
  192. package/src/sync/streaming/types.ts +10 -10
  193. package/src/sync/submitters/types.ts +5 -8
  194. package/src/sync/syncTask.ts +2 -2
  195. package/src/trackers/eventTracker.ts +7 -10
  196. package/src/trackers/impressionsTracker.ts +9 -12
  197. package/src/trackers/types.ts +0 -1
  198. package/src/trackers/uniqueKeysTracker.ts +4 -6
  199. package/src/types.ts +9 -16
  200. package/src/utils/constants/index.ts +2 -3
  201. package/src/utils/settingsValidation/index.ts +2 -3
  202. package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
  203. package/src/utils/settingsValidation/types.ts +1 -1
  204. package/types/dtos/types.d.ts +7 -18
  205. package/types/evaluator/matchersTransform/segment.d.ts +2 -2
  206. package/types/logger/constants.d.ts +1 -1
  207. package/types/readiness/readinessManager.d.ts +2 -2
  208. package/types/readiness/sdkReadinessManager.d.ts +3 -2
  209. package/types/readiness/types.d.ts +2 -3
  210. package/types/sdkClient/sdkClientMethod.d.ts +1 -1
  211. package/types/sdkFactory/types.d.ts +1 -4
  212. package/types/services/decorateHeaders.d.ts +1 -0
  213. package/types/services/splitApi.d.ts +1 -1
  214. package/types/services/splitHttpClient.d.ts +1 -1
  215. package/types/services/types.d.ts +2 -2
  216. package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
  217. package/types/storages/AbstractSplitsCacheAsync.d.ts +5 -0
  218. package/types/storages/AbstractSplitsCacheSync.d.ts +6 -1
  219. package/types/storages/KeyBuilderCS.d.ts +2 -9
  220. package/types/storages/dataLoader.d.ts +6 -17
  221. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +14 -4
  222. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +6 -0
  223. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +9 -3
  224. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +1 -1
  225. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -1
  226. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
  227. package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +1 -1
  228. package/types/storages/inRedis/index.d.ts +1 -1
  229. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +1 -1
  230. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  231. package/types/storages/types.d.ts +11 -11
  232. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  233. package/types/sync/polling/fetchers/types.d.ts +2 -2
  234. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
  235. package/types/sync/polling/types.d.ts +4 -7
  236. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
  237. package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
  238. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
  239. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
  240. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
  241. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  242. package/types/sync/streaming/constants.d.ts +2 -2
  243. package/types/sync/streaming/parseUtils.d.ts +5 -4
  244. package/types/sync/streaming/types.d.ts +8 -8
  245. package/types/sync/submitters/types.d.ts +4 -7
  246. package/types/trackers/eventTracker.d.ts +1 -1
  247. package/types/trackers/impressionsTracker.d.ts +1 -1
  248. package/types/trackers/types.d.ts +0 -1
  249. package/types/types.d.ts +9 -15
  250. package/types/utils/constants/index.d.ts +2 -3
  251. package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
  252. package/types/utils/settingsValidation/types.d.ts +1 -1
  253. package/cjs/evaluator/matchers/large_segment.js +0 -16
  254. package/cjs/sdkClient/identity.js +0 -7
  255. package/esm/evaluator/matchers/large_segment.js +0 -12
  256. package/esm/sdkClient/identity.js +0 -3
  257. package/src/evaluator/matchers/large_segment.ts +0 -18
  258. package/src/sdkClient/identity.ts +0 -5
  259. package/types/evaluator/matchers/large_segment.d.ts +0 -5
  260. package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
  261. package/types/evaluator/matchersTransform/set.d.ts +0 -5
  262. package/types/evaluator/matchersTransform/string.d.ts +0 -7
  263. package/types/sdkClient/identity.d.ts +0 -2
  264. package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
  265. package/types/storages/AbstractSplitsCache.d.ts +0 -46
  266. package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
  267. package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
  268. package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
  269. package/types/trackers/impressionObserver/utils.d.ts +0 -5
  270. package/types/utils/inputValidation/sdkKey.d.ts +0 -7
  271. package/types/utils/inputValidation/splitExistance.d.ts +0 -7
  272. package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
  273. package/types/utils/redis/RedisMock.d.ts +0 -4
  274. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
  275. /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
@@ -14,7 +14,7 @@ var constants_2 = require("../utils/constants");
14
14
  * @param integrationsManager optional integrations manager
15
15
  * @param strategy strategy for impressions tracking.
16
16
  */
17
- function impressionsTrackerFactory(settings, impressionsCache, strategy, whenInit, integrationsManager, telemetryCache) {
17
+ function impressionsTrackerFactory(settings, impressionsCache, strategy, integrationsManager, telemetryCache) {
18
18
  var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
19
19
  return {
20
20
  track: function (impressions, attributes) {
@@ -54,20 +54,18 @@ function impressionsTrackerFactory(settings, impressionsCache, strategy, whenIni
54
54
  sdkLanguageVersion: version
55
55
  };
56
56
  // Wrap in a timeout because we don't want it to be blocking.
57
- whenInit(function () {
58
- setTimeout(function () {
59
- // integrationsManager.handleImpression does not throw errors
60
- if (integrationsManager)
61
- integrationsManager.handleImpression(impressionData);
62
- try { // @ts-ignore. An exception on the listeners should not break the SDK.
63
- if (impressionListener)
64
- impressionListener.logImpression(impressionData);
65
- }
66
- catch (err) {
67
- log.error(constants_1.ERROR_IMPRESSIONS_LISTENER, [err]);
68
- }
69
- });
70
- });
57
+ setTimeout(function () {
58
+ // integrationsManager.handleImpression does not throw errors
59
+ if (integrationsManager)
60
+ integrationsManager.handleImpression(impressionData);
61
+ try { // @ts-ignore. An exception on the listeners should not break the SDK.
62
+ if (impressionListener)
63
+ impressionListener.logImpression(impressionData);
64
+ }
65
+ catch (err) {
66
+ log.error(constants_1.ERROR_IMPRESSIONS_LISTENER, [err]);
67
+ }
68
+ }, 0);
71
69
  };
72
70
  for (var i = 0; i < impressionsToListenerCount; i++) {
73
71
  _loop_1(i);
@@ -19,6 +19,9 @@ var noopFilterAdapter = {
19
19
  function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
20
20
  if (filterAdapter === void 0) { filterAdapter = noopFilterAdapter; }
21
21
  var intervalId;
22
+ if (filterAdapter.refreshRate) {
23
+ intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
24
+ }
22
25
  return {
23
26
  track: function (key, featureName) {
24
27
  if (!filterAdapter.add(key, featureName)) {
@@ -27,11 +30,6 @@ function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
27
30
  }
28
31
  uniqueKeysCache.track(key, featureName);
29
32
  },
30
- start: function () {
31
- if (filterAdapter.refreshRate) {
32
- intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
33
- }
34
- },
35
33
  stop: function () {
36
34
  clearInterval(intervalId);
37
35
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MEMBERSHIPS = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
4
- exports.IN_LARGE_SEGMENT = exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
3
+ exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
4
+ exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
5
5
  // Special treatments
6
6
  exports.CONTROL = 'control';
7
7
  exports.CONTROL_WITH_CONFIG = {
@@ -64,7 +64,7 @@ exports.EVENTS = 'ev';
64
64
  exports.TELEMETRY = 'te';
65
65
  exports.TOKEN = 'to';
66
66
  exports.SEGMENT = 'se';
67
- exports.MEMBERSHIPS = 'ms';
67
+ exports.MY_SEGMENT = 'ms';
68
68
  exports.TREATMENT = 't';
69
69
  exports.TREATMENTS = 'ts';
70
70
  exports.TREATMENT_WITH_CONFIG = 'tc';
@@ -90,7 +90,6 @@ exports.NON_REQUESTED = 1;
90
90
  exports.DISABLED = 0;
91
91
  exports.ENABLED = 1;
92
92
  exports.PAUSED = 2;
93
- exports.FLAG_SPEC_VERSION = '1.2';
93
+ exports.FLAG_SPEC_VERSION = '1.1';
94
94
  // Matcher types
95
95
  exports.IN_SEGMENT = 'IN_SEGMENT';
96
- exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
@@ -186,11 +186,10 @@ function settingsValidation(config, validationParams) {
186
186
  var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, sync.splitFilters, withDefaults.mode);
187
187
  sync.splitFilters = splitFiltersValidation.validFilters;
188
188
  sync.__splitFiltersValidation = splitFiltersValidation;
189
- // ensure a valid flag spec version
190
189
  sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : constants_1.FLAG_SPEC_VERSION;
191
190
  // ensure a valid user consent value
192
191
  // @ts-ignore, modify readonly prop
193
- withDefaults.userConsent = consent ? consent(withDefaults) : undefined;
192
+ withDefaults.userConsent = consent(withDefaults);
194
193
  return withDefaults;
195
194
  }
196
195
  exports.settingsValidation = settingsValidation;
@@ -1,9 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateStorageCS = void 0;
3
+ exports.validateStorageCS = exports.__InLocalStorageMockFactory = void 0;
4
4
  var InMemoryStorageCS_1 = require("../../../storages/inMemory/InMemoryStorageCS");
5
5
  var constants_1 = require("../../../logger/constants");
6
6
  var constants_2 = require("../../../utils/constants");
7
+ function __InLocalStorageMockFactory(params) {
8
+ var result = (0, InMemoryStorageCS_1.InMemoryStorageCSFactory)(params);
9
+ result.splits.checkCache = function () { return true; }; // to emit SDK_READY_FROM_CACHE
10
+ return result;
11
+ }
12
+ exports.__InLocalStorageMockFactory = __InLocalStorageMockFactory;
13
+ __InLocalStorageMockFactory.type = constants_2.STORAGE_MEMORY;
7
14
  /**
8
15
  * This function validates `settings.storage` object
9
16
  *
@@ -20,6 +27,10 @@ function validateStorageCS(settings) {
20
27
  storage = InMemoryStorageCS_1.InMemoryStorageCSFactory;
21
28
  log.error(constants_1.ERROR_STORAGE_INVALID);
22
29
  }
30
+ // In localhost mode with InLocalStorage, fallback to a mock InLocalStorage to emit SDK_READY_FROM_CACHE
31
+ if (mode === constants_2.LOCALHOST_MODE && storage.type === constants_2.STORAGE_LOCALSTORAGE) {
32
+ return __InLocalStorageMockFactory;
33
+ }
23
34
  if ([constants_2.LOCALHOST_MODE, constants_2.STANDALONE_MODE].indexOf(mode) === -1) {
24
35
  // Consumer modes require an async storage
25
36
  if (storage.type !== constants_2.STORAGE_PLUGGABLE)
@@ -12,7 +12,7 @@ var ConsentStatus = {
12
12
  * The public user consent API exposed via SplitFactory, used to control if the SDK tracks and sends impressions and events or not.
13
13
  */
14
14
  export function createUserConsentAPI(params) {
15
- var settings = params.settings, log = params.settings.log, syncManager = params.syncManager, _a = params.storage, events = _a.events, impressions = _a.impressions, impressionCounts = _a.impressionCounts;
15
+ var settings = params.settings, log = params.settings.log, syncManager = params.syncManager, _a = params.storage, events = _a.events, impressions = _a.impressions, impressionCounts = _a.impressionCounts, uniqueKeys = _a.uniqueKeys;
16
16
  if (!isConsentGranted(settings))
17
17
  log.info(USER_CONSENT_INITIAL, [settings.userConsent]);
18
18
  return {
@@ -38,7 +38,9 @@ export function createUserConsentAPI(params) {
38
38
  if (impressions.clear)
39
39
  impressions.clear(); // @ts-ignore
40
40
  if (impressionCounts && impressionCounts.clear)
41
- impressionCounts.clear();
41
+ impressionCounts.clear(); // @ts-ignore
42
+ if (uniqueKeys && uniqueKeys.clear)
43
+ uniqueKeys.clear();
42
44
  }
43
45
  }
44
46
  else {
@@ -1,6 +1,5 @@
1
1
  import { allMatcherContext } from './all';
2
2
  import { segmentMatcherContext } from './segment';
3
- import { largeSegmentMatcherContext } from './large_segment';
4
3
  import { whitelistMatcherContext } from './whitelist';
5
4
  import { equalToMatcherContext } from './eq';
6
5
  import { greaterThanEqualMatcherContext } from './gte';
@@ -44,8 +43,7 @@ var matchers = [
44
43
  greaterThanEqualToSemverMatcherContext,
45
44
  lessThanEqualToSemverMatcherContext,
46
45
  betweenSemverMatcherContext,
47
- inListSemverMatcherContext,
48
- largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
46
+ inListSemverMatcherContext, // IN_LIST_SEMVER: 22
49
47
  ];
50
48
  /**
51
49
  * Matcher factory.
@@ -22,7 +22,6 @@ export var matcherTypes = {
22
22
  LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
23
23
  BETWEEN_SEMVER: 21,
24
24
  IN_LIST_SEMVER: 22,
25
- IN_LARGE_SEGMENT: 23,
26
25
  };
27
26
  export var matcherDataTypes = {
28
27
  BOOLEAN: 'BOOLEAN',
@@ -1,12 +1,6 @@
1
- import { thenable } from '../../utils/promise/thenable';
2
1
  export function segmentMatcherContext(segmentName, storage) {
3
2
  return function segmentMatcher(key) {
4
3
  var isInSegment = storage.segments.isInSegment(segmentName, key);
5
- if (thenable(isInSegment)) {
6
- isInSegment.then(function (result) {
7
- return result;
8
- });
9
- }
10
4
  return isInSegment;
11
5
  };
12
6
  }
@@ -9,7 +9,7 @@ import { zeroSinceHH, zeroSinceSS } from '../convertions';
9
9
  */
10
10
  export function matchersTransform(matchers) {
11
11
  var parsedMatchers = matchers.map(function (matcher) {
12
- var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, userDefinedLargeSegmentMatcherData = matcher.userDefinedLargeSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
12
+ var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
13
13
  var attribute = keySelector && keySelector.attribute;
14
14
  var type = matcherTypesMapper(matcherType);
15
15
  // As default input data type we use string (even for ALL_KEYS)
@@ -18,9 +18,6 @@ export function matchersTransform(matchers) {
18
18
  if (type === matcherTypes.IN_SEGMENT) {
19
19
  value = segmentTransform(userDefinedSegmentMatcherData);
20
20
  }
21
- else if (type === matcherTypes.IN_LARGE_SEGMENT) {
22
- value = segmentTransform(userDefinedLargeSegmentMatcherData);
23
- }
24
21
  else if (type === matcherTypes.EQUAL_TO) {
25
22
  value = numericTransform(unaryNumericMatcherData);
26
23
  dataType = matcherDataTypes.NUMBER;
@@ -2,7 +2,5 @@
2
2
  * Extract segment name as a plain string.
3
3
  */
4
4
  export function segmentTransform(segment) {
5
- return segment ?
6
- segment.segmentName || segment.largeSegmentName :
7
- undefined;
5
+ return segment ? segment.segmentName : undefined;
8
6
  }
@@ -77,7 +77,7 @@ export var WARN_SPLITS_FILTER_IGNORED = 219;
77
77
  export var WARN_SPLITS_FILTER_INVALID = 220;
78
78
  export var WARN_SPLITS_FILTER_EMPTY = 221;
79
79
  export var WARN_SDK_KEY = 222;
80
- export var STREAMING_PARSING_MEMBERSHIPS_UPDATE = 223;
80
+ export var STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = 223;
81
81
  export var STREAMING_PARSING_SPLIT_UPDATE = 224;
82
82
  export var WARN_INVALID_FLAGSET = 225;
83
83
  export var WARN_LOWERCASE_FLAGSET = 226;
@@ -20,7 +20,7 @@ export var codesInfo = codesWarn.concat([
20
20
  [c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
21
21
  [c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
22
22
  [c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
23
- [c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and resetting timer.'],
23
+ [c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
24
24
  [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
25
25
  [c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
26
26
  [c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
@@ -30,7 +30,7 @@ export var codesWarn = codesError.concat([
30
30
  [c.WARN_SPLITS_FILTER_INVALID, c.LOG_PREFIX_SETTINGS + ': feature flag filter at position %s is invalid. It must be an object with a valid filter type ("bySet", "byName" or "byPrefix") and a list of "values".'],
31
31
  [c.WARN_SPLITS_FILTER_EMPTY, c.LOG_PREFIX_SETTINGS + ': feature flag filter configuration must be a non-empty array of filter objects.'],
32
32
  [c.WARN_SDK_KEY, c.LOG_PREFIX_SETTINGS + ': You already have %s. We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing it throughout your application'],
33
- [c.STREAMING_PARSING_MEMBERSHIPS_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
33
+ [c.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching MySegments due to an error processing %s notification: %s'],
34
34
  [c.STREAMING_PARSING_SPLIT_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching SplitChanges due to an error processing SPLIT_UPDATE notification: %s'],
35
35
  [c.WARN_INVALID_FLAGSET, '%s: you passed %s, flag set must adhere to the regular expressions %s. This means a flag set must start with a letter or number, be in lowercase, alphanumeric and have a max length of 50 characters. %s was discarded.'],
36
36
  [c.WARN_LOWERCASE_FLAGSET, '%s: flag set %s should be all lowercase - converting string to lowercase.'],
@@ -6,7 +6,7 @@ function splitsEventEmitterFactory(EventEmitter) {
6
6
  splitsCacheLoaded: false,
7
7
  });
8
8
  // `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
9
- // - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
9
+ // - `/mySegments` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
10
10
  // - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
11
11
  splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
12
12
  splitsEventEmitter.splitsArrived = true; });
@@ -23,9 +23,9 @@ function segmentsEventEmitterFactory(EventEmitter) {
23
23
  /**
24
24
  * Factory of readiness manager, which handles the ready / update event propagation.
25
25
  */
26
- export function readinessManagerFactory(EventEmitter, settings, splits) {
26
+ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
27
+ if (readyTimeout === void 0) { readyTimeout = 0; }
27
28
  if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
28
- var readyTimeout = settings.startup.readyTimeout;
29
29
  var segments = segmentsEventEmitterFactory(EventEmitter);
30
30
  var gate = new EventEmitter();
31
31
  var lastUpdate = 0;
@@ -42,14 +42,17 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
42
42
  splits.once(SDK_SPLITS_CACHE_LOADED, checkIsReadyFromCache);
43
43
  // emit SDK_READY_TIMED_OUT
44
44
  var hasTimedout = false;
45
- var readyTimeoutId;
46
45
  function timeout() {
47
- if (hasTimedout || isReady)
46
+ if (hasTimedout)
48
47
  return;
49
48
  hasTimedout = true;
50
49
  syncLastUpdate();
51
50
  gate.emit(SDK_READY_TIMED_OUT, 'Split SDK emitted SDK_READY_TIMED_OUT event.');
52
51
  }
52
+ var readyTimeoutId;
53
+ if (readyTimeout > 0) {
54
+ readyTimeoutId = setTimeout(timeout, readyTimeout);
55
+ }
53
56
  // emit SDK_READY and SDK_UPDATE
54
57
  var isReady = false;
55
58
  splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
@@ -100,9 +103,10 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
100
103
  splits: splits,
101
104
  segments: segments,
102
105
  gate: gate,
103
- shared: function () {
106
+ shared: function (readyTimeout) {
107
+ if (readyTimeout === void 0) { readyTimeout = 0; }
104
108
  refCount++;
105
- return readinessManagerFactory(EventEmitter, settings, splits);
109
+ return readinessManagerFactory(EventEmitter, readyTimeout, splits);
106
110
  },
107
111
  // @TODO review/remove next methods when non-recoverable errors are reworked
108
112
  // Called on consumer mode, when storage fails to connect
@@ -110,11 +114,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
110
114
  // Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
111
115
  // tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
112
116
  setDestroyed: function () { isDestroyed = true; },
113
- init: function () {
114
- if (readyTimeout > 0) {
115
- readyTimeoutId = setTimeout(timeout, readyTimeout);
116
- }
117
- },
118
117
  destroy: function () {
119
118
  isDestroyed = true;
120
119
  syncLastUpdate();
@@ -12,9 +12,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
12
12
  * @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
13
13
  * @param readinessManager optional readinessManager to use. only used internally for `shared` method
14
14
  */
15
- export function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
16
- if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, settings); }
17
- var log = settings.log;
15
+ export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager) {
16
+ if (readyTimeout === void 0) { readyTimeout = 0; }
17
+ if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, readyTimeout); }
18
18
  /** Ready callback warning */
19
19
  var internalReadyCbCount = 0;
20
20
  var readyCbCount = 0;
@@ -57,8 +57,9 @@ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessMana
57
57
  }
58
58
  return {
59
59
  readinessManager: readinessManager,
60
- shared: function () {
61
- return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
60
+ shared: function (readyTimeout) {
61
+ if (readyTimeout === void 0) { readyTimeout = 0; }
62
+ return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
62
63
  },
63
64
  incInternalReadyCbCount: function () {
64
65
  internalReadyCbCount++;
@@ -50,11 +50,11 @@ export function sdkClientFactory(params, isSharedClient) {
50
50
  // Stop background jobs
51
51
  syncManager && syncManager.stop();
52
52
  return __flush().then(function () {
53
- // For main client, cleanup event listeners and scheduled jobs
54
- if (!isSharedClient) {
55
- signalListener && signalListener.stop();
56
- uniqueKeysTracker && uniqueKeysTracker.stop();
57
- }
53
+ // Cleanup event listeners
54
+ signalListener && signalListener.stop();
55
+ // @TODO stop only if last client is destroyed
56
+ if (uniqueKeysTracker)
57
+ uniqueKeysTracker.stop();
58
58
  // Cleanup storage
59
59
  return storage.destroy();
60
60
  });
@@ -1,13 +1,11 @@
1
1
  import { sdkClientFactory } from './sdkClient';
2
2
  import { RETRIEVE_CLIENT_DEFAULT } from '../logger/constants';
3
3
  /**
4
- * Factory of client method for server-side SDKs
4
+ * Factory of client method for server-side SDKs (ISDK and IAsyncSDK)
5
5
  */
6
6
  export function sdkClientMethodFactory(params) {
7
7
  var log = params.settings.log;
8
8
  var clientInstance = sdkClientFactory(params);
9
- // Only one client in server-side without bound key
10
- params.clients[''] = clientInstance;
11
9
  return function client() {
12
10
  if (arguments.length > 0) {
13
11
  throw new Error('Shared Client not supported by the storage mechanism. Create isolated instances instead.');
@@ -5,18 +5,22 @@ import { sdkClientFactory } from './sdkClient';
5
5
  import { objectAssign } from '../utils/lang/objectAssign';
6
6
  import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
7
7
  import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
8
- import { buildInstanceId } from './identity';
8
+ function buildInstanceId(key) {
9
+ // @ts-ignore
10
+ return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
11
+ }
9
12
  /**
10
13
  * Factory of client method for the client-side API variant where TT is ignored.
11
14
  * Therefore, clients don't have a bound TT for the track method.
12
15
  */
13
16
  export function sdkClientMethodCSFactory(params) {
14
- var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log, whenInit = params.whenInit;
17
+ var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
15
18
  var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
16
19
  var parsedDefaultKey = keyParser(key);
17
20
  var defaultInstanceId = buildInstanceId(parsedDefaultKey);
18
21
  // Cache instances created per factory.
19
- clients[defaultInstanceId] = mainClientInstance;
22
+ var clientInstances = {};
23
+ clientInstances[defaultInstanceId] = mainClientInstance;
20
24
  return function client(key) {
21
25
  if (key === undefined) {
22
26
  log.debug(RETRIEVE_CLIENT_DEFAULT);
@@ -28,9 +32,9 @@ export function sdkClientMethodCSFactory(params) {
28
32
  throw new Error('Shared Client needs a valid key.');
29
33
  }
30
34
  var instanceId = buildInstanceId(validKey);
31
- if (!clients[instanceId]) {
35
+ if (!clientInstances[instanceId]) {
32
36
  var matchingKey = getMatching(validKey);
33
- var sharedSdkReadiness_1 = sdkReadinessManager.shared();
37
+ var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
34
38
  var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
35
39
  if (err) {
36
40
  sharedSdkReadiness_1.readinessManager.timeout();
@@ -44,23 +48,21 @@ export function sdkClientMethodCSFactory(params) {
44
48
  // - Consumer mode: both syncManager and sharedSyncManager are undefined
45
49
  // - Consumer partial mode: syncManager is defined (only for submitters) but sharedSyncManager is undefined
46
50
  // @ts-ignore
47
- var sharedSyncManager_1 = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
51
+ var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
48
52
  // As shared clients reuse all the storage information, we don't need to check here if we
49
53
  // will use offline or online mode. We should stick with the original decision.
50
- clients[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
54
+ clientInstances[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
51
55
  sdkReadinessManager: sharedSdkReadiness_1,
52
56
  storage: sharedStorage || storage,
53
- syncManager: sharedSyncManager_1,
57
+ syncManager: sharedSyncManager,
58
+ signalListener: undefined, // only the main client "destroy" method stops the signal listener
54
59
  }), true), validKey);
55
- whenInit(function () {
56
- sharedSdkReadiness_1.readinessManager.init();
57
- sharedSyncManager_1 && sharedSyncManager_1.start();
58
- });
60
+ sharedSyncManager && sharedSyncManager.start();
59
61
  log.info(NEW_SHARED_CLIENT);
60
62
  }
61
63
  else {
62
64
  log.debug(RETRIEVE_CLIENT_EXISTING);
63
65
  }
64
- return clients[instanceId];
66
+ return clientInstances[instanceId];
65
67
  };
66
68
  }
@@ -6,19 +6,23 @@ import { sdkClientFactory } from './sdkClient';
6
6
  import { objectAssign } from '../utils/lang/objectAssign';
7
7
  import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
8
8
  import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
9
- import { buildInstanceId } from './identity';
9
+ function buildInstanceId(key, trafficType) {
10
+ // @ts-ignore
11
+ return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
12
+ }
10
13
  /**
11
14
  * Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
12
15
  * where clients can have a bound TT for the track method, which is provided via the settings
13
16
  * (default client) or the client method (shared clients).
14
17
  */
15
18
  export function sdkClientMethodCSFactory(params) {
16
- var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log, whenInit = params.whenInit;
19
+ var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, readyTimeout = _a.startup.readyTimeout, log = _a.log;
17
20
  var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key, trafficType);
18
21
  var parsedDefaultKey = keyParser(key);
19
22
  var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
20
23
  // Cache instances created per factory.
21
- clients[defaultInstanceId] = mainClientInstance;
24
+ var clientInstances = {};
25
+ clientInstances[defaultInstanceId] = mainClientInstance;
22
26
  return function client(key, trafficType) {
23
27
  if (key === undefined) {
24
28
  log.debug(RETRIEVE_CLIENT_DEFAULT);
@@ -37,9 +41,9 @@ export function sdkClientMethodCSFactory(params) {
37
41
  }
38
42
  }
39
43
  var instanceId = buildInstanceId(validKey, validTrafficType);
40
- if (!clients[instanceId]) {
44
+ if (!clientInstances[instanceId]) {
41
45
  var matchingKey = getMatching(validKey);
42
- var sharedSdkReadiness_1 = sdkReadinessManager.shared();
46
+ var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
43
47
  var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
44
48
  if (err) {
45
49
  sharedSdkReadiness_1.readinessManager.timeout();
@@ -53,23 +57,21 @@ export function sdkClientMethodCSFactory(params) {
53
57
  // - Consumer mode: both syncManager and sharedSyncManager are undefined
54
58
  // - Consumer partial mode: syncManager is defined (only for submitters) but sharedSyncManager is undefined
55
59
  // @ts-ignore
56
- var sharedSyncManager_1 = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
60
+ var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
57
61
  // As shared clients reuse all the storage information, we don't need to check here if we
58
62
  // will use offline or online mode. We should stick with the original decision.
59
- clients[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
63
+ clientInstances[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
60
64
  sdkReadinessManager: sharedSdkReadiness_1,
61
65
  storage: sharedStorage || storage,
62
- syncManager: sharedSyncManager_1,
66
+ syncManager: sharedSyncManager,
67
+ signalListener: undefined, // only the main client "destroy" method stops the signal listener
63
68
  }), true), validKey, validTrafficType);
64
- whenInit(function () {
65
- sharedSdkReadiness_1.readinessManager.init();
66
- sharedSyncManager_1 && sharedSyncManager_1.start();
67
- });
69
+ sharedSyncManager && sharedSyncManager.start();
68
70
  log.info(NEW_SHARED_CLIENT);
69
71
  }
70
72
  else {
71
73
  log.debug(RETRIEVE_CLIENT_EXISTING);
72
74
  }
73
- return clients[instanceId];
75
+ return clientInstances[instanceId];
74
76
  };
75
77
  }
@@ -5,7 +5,7 @@ import { telemetryTrackerFactory } from '../trackers/telemetryTracker';
5
5
  import { validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
6
6
  import { createLoggerAPI } from '../logger/sdkLogger';
7
7
  import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
8
- import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../readiness/constants';
8
+ import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
9
9
  import { objectAssign } from '../utils/lang/objectAssign';
10
10
  import { strategyDebugFactory } from '../trackers/strategy/strategyDebug';
11
11
  import { strategyOptimizedFactory } from '../trackers/strategy/strategyOptimized';
@@ -16,20 +16,13 @@ import { NONE, OPTIMIZED } from '../utils/constants';
16
16
  * Modular SDK factory
17
17
  */
18
18
  export function sdkFactory(params) {
19
- var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory, splitApiFactory = params.splitApiFactory, extraProps = params.extraProps, syncManagerFactory = params.syncManagerFactory, SignalListener = params.SignalListener, impressionsObserverFactory = params.impressionsObserverFactory, integrationsManagerFactory = params.integrationsManagerFactory, sdkManagerFactory = params.sdkManagerFactory, sdkClientMethodFactory = params.sdkClientMethodFactory, filterAdapterFactory = params.filterAdapterFactory, isPure = params.isPure;
19
+ var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory, splitApiFactory = params.splitApiFactory, extraProps = params.extraProps, syncManagerFactory = params.syncManagerFactory, SignalListener = params.SignalListener, impressionsObserverFactory = params.impressionsObserverFactory, integrationsManagerFactory = params.integrationsManagerFactory, sdkManagerFactory = params.sdkManagerFactory, sdkClientMethodFactory = params.sdkClientMethodFactory, filterAdapterFactory = params.filterAdapterFactory;
20
20
  var log = settings.log, impressionsMode = settings.sync.impressionsMode;
21
21
  // @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid SDK Key, etc.
22
22
  // On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
23
- // initialization
24
- var isInit = false;
25
- var initCallbacks = [];
26
- function whenInit(cb) {
27
- if (isInit)
28
- cb();
29
- else
30
- initCallbacks.push(cb);
31
- }
32
- var sdkReadinessManager = sdkReadinessManagerFactory(platform.EventEmitter, settings);
23
+ // We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
24
+ validateAndTrackApiKey(log, settings.core.authorizationKey);
25
+ var sdkReadinessManager = sdkReadinessManagerFactory(log, platform.EventEmitter, settings.startup.readyTimeout);
33
26
  var readiness = sdkReadinessManager.readinessManager;
34
27
  var storage = storageFactory({
35
28
  settings: settings,
@@ -42,11 +35,8 @@ export function sdkFactory(params) {
42
35
  readiness.splits.emit(SDK_SPLITS_ARRIVED);
43
36
  readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
44
37
  },
45
- onReadyFromCacheCb: function () {
46
- readiness.splits.emit(SDK_SPLITS_CACHE_LOADED);
47
- }
48
38
  });
49
- var clients = {};
39
+ // @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
50
40
  var telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
51
41
  var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
52
42
  var observer = impressionsObserverFactory();
@@ -62,11 +52,11 @@ export function sdkFactory(params) {
62
52
  default:
63
53
  strategy = strategyDebugFactory(observer);
64
54
  }
65
- var impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy, whenInit, integrationsManager, storage.telemetry);
66
- var eventTracker = eventTrackerFactory(settings, storage.events, whenInit, integrationsManager, storage.telemetry);
55
+ var impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy, integrationsManager, storage.telemetry);
56
+ var eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
67
57
  // splitApi is used by SyncManager and Browser signal listener
68
58
  var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
69
- var ctx = { clients: clients, splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform, whenInit: whenInit };
59
+ var ctx = { splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
70
60
  var syncManager = syncManagerFactory && syncManagerFactory(ctx);
71
61
  ctx.syncManager = syncManager;
72
62
  var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
@@ -74,22 +64,8 @@ export function sdkFactory(params) {
74
64
  // SDK client and manager
75
65
  var clientMethod = sdkClientMethodFactory(ctx);
76
66
  var managerInstance = sdkManagerFactory(settings, storage.splits, sdkReadinessManager);
77
- function init() {
78
- if (isInit)
79
- return;
80
- isInit = true;
81
- // We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
82
- validateAndTrackApiKey(log, settings.core.authorizationKey);
83
- readiness.init();
84
- storage.init && storage.init();
85
- uniqueKeysTracker && uniqueKeysTracker.start();
86
- syncManager && syncManager.start();
87
- signalListener && signalListener.start();
88
- initCallbacks.forEach(function (cb) { return cb(); });
89
- initCallbacks.length = 0;
90
- }
91
- if (!isPure)
92
- init();
67
+ syncManager && syncManager.start();
68
+ signalListener && signalListener.start();
93
69
  log.info(NEW_FACTORY);
94
70
  // @ts-ignore
95
71
  return objectAssign({
@@ -103,8 +79,5 @@ export function sdkFactory(params) {
103
79
  // Logger wrapper API
104
80
  Logger: createLoggerAPI(log),
105
81
  settings: settings,
106
- destroy: function () {
107
- return Promise.all(Object.keys(clients).map(function (key) { return clients[key].destroy(); })).then(function () { });
108
- }
109
- }, extraProps && extraProps(ctx), isPure && { init: init });
82
+ }, extraProps && extraProps(ctx));
110
83
  }