@splitsoftware/splitio-commons 1.17.1-rc.4 → 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 (261) hide show
  1. package/CHANGES.txt +28 -29
  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 +8 -18
  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 +15 -9
  18. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +15 -9
  19. package/cjs/sdkFactory/index.js +10 -32
  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 +33 -0
  24. package/cjs/storages/AbstractSplitsCacheSync.js +1 -2
  25. package/cjs/storages/KeyBuilderCS.js +5 -23
  26. package/cjs/storages/dataLoader.js +1 -1
  27. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
  28. package/cjs/storages/inLocalStorage/index.js +2 -6
  29. package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -6
  30. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
  31. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +28 -14
  32. package/cjs/storages/inMemory/SplitsCacheInMemory.js +9 -8
  33. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  34. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +21 -15
  35. package/cjs/storages/inRedis/index.js +11 -5
  36. package/cjs/storages/pluggable/SegmentsCachePluggable.js +34 -13
  37. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  38. package/cjs/sync/offline/syncManagerOffline.js +11 -18
  39. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  40. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  41. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  42. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  43. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  44. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +28 -12
  45. package/cjs/sync/polling/updaters/splitChangesUpdater.js +1 -1
  46. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  47. package/cjs/sync/streaming/SSEHandler/index.js +5 -3
  48. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
  49. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  50. package/cjs/sync/streaming/constants.js +3 -3
  51. package/cjs/sync/streaming/parseUtils.js +9 -14
  52. package/cjs/sync/streaming/pushManager.js +67 -69
  53. package/cjs/sync/syncManagerOnline.js +21 -20
  54. package/cjs/sync/syncTask.js +2 -2
  55. package/cjs/trackers/eventTracker.js +10 -12
  56. package/cjs/trackers/impressionsTracker.js +14 -16
  57. package/cjs/trackers/uniqueKeysTracker.js +3 -5
  58. package/cjs/utils/constants/index.js +4 -5
  59. package/cjs/utils/settingsValidation/index.js +1 -2
  60. package/esm/consent/sdkUserConsent.js +4 -2
  61. package/esm/evaluator/matchers/index.js +1 -3
  62. package/esm/evaluator/matchers/matcherTypes.js +0 -1
  63. package/esm/evaluator/matchers/segment.js +0 -6
  64. package/esm/evaluator/matchersTransform/index.js +1 -4
  65. package/esm/evaluator/matchersTransform/segment.js +1 -3
  66. package/esm/logger/constants.js +1 -1
  67. package/esm/logger/messages/info.js +1 -1
  68. package/esm/logger/messages/warn.js +1 -1
  69. package/esm/readiness/readinessManager.js +8 -18
  70. package/esm/readiness/sdkReadinessManager.js +6 -5
  71. package/esm/sdkClient/sdkClient.js +5 -5
  72. package/esm/sdkClient/sdkClientMethod.js +1 -3
  73. package/esm/sdkClient/sdkClientMethodCS.js +13 -7
  74. package/esm/sdkClient/sdkClientMethodCSWithTT.js +13 -7
  75. package/esm/sdkFactory/index.js +10 -32
  76. package/esm/services/decorateHeaders.js +4 -0
  77. package/esm/services/splitApi.js +6 -6
  78. package/esm/services/splitHttpClient.js +6 -3
  79. package/esm/storages/AbstractSegmentsCacheSync.js +30 -0
  80. package/esm/storages/AbstractSplitsCacheSync.js +2 -3
  81. package/esm/storages/KeyBuilderCS.js +4 -21
  82. package/esm/storages/dataLoader.js +1 -1
  83. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
  84. package/esm/storages/inLocalStorage/index.js +3 -7
  85. package/esm/storages/inMemory/InMemoryStorageCS.js +1 -6
  86. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
  87. package/esm/storages/inMemory/SegmentsCacheInMemory.js +28 -14
  88. package/esm/storages/inMemory/SplitsCacheInMemory.js +9 -8
  89. package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  90. package/esm/storages/inRedis/SegmentsCacheInRedis.js +21 -15
  91. package/esm/storages/inRedis/index.js +11 -5
  92. package/esm/storages/pluggable/SegmentsCachePluggable.js +34 -13
  93. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  94. package/esm/sync/offline/syncManagerOffline.js +11 -18
  95. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  96. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  97. package/esm/sync/polling/pollingManagerCS.js +1 -1
  98. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  99. package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  100. package/esm/sync/polling/updaters/segmentChangesUpdater.js +28 -12
  101. package/esm/sync/polling/updaters/splitChangesUpdater.js +1 -1
  102. package/esm/sync/streaming/AuthClient/index.js +1 -1
  103. package/esm/sync/streaming/SSEHandler/index.js +6 -4
  104. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
  105. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  106. package/esm/sync/streaming/constants.js +2 -2
  107. package/esm/sync/streaming/parseUtils.js +8 -12
  108. package/esm/sync/streaming/pushManager.js +70 -72
  109. package/esm/sync/syncManagerOnline.js +21 -20
  110. package/esm/sync/syncTask.js +2 -2
  111. package/esm/trackers/eventTracker.js +10 -12
  112. package/esm/trackers/impressionsTracker.js +14 -16
  113. package/esm/trackers/uniqueKeysTracker.js +3 -5
  114. package/esm/utils/constants/index.js +2 -3
  115. package/esm/utils/settingsValidation/index.js +1 -2
  116. package/package.json +1 -1
  117. package/src/consent/sdkUserConsent.ts +3 -2
  118. package/src/dtos/types.ts +7 -21
  119. package/src/evaluator/matchers/index.ts +0 -2
  120. package/src/evaluator/matchers/matcherTypes.ts +0 -1
  121. package/src/evaluator/matchers/segment.ts +0 -7
  122. package/src/evaluator/matchersTransform/index.ts +1 -4
  123. package/src/evaluator/matchersTransform/segment.ts +3 -5
  124. package/src/logger/constants.ts +1 -1
  125. package/src/logger/messages/info.ts +1 -1
  126. package/src/logger/messages/warn.ts +1 -1
  127. package/src/readiness/readinessManager.ts +8 -19
  128. package/src/readiness/sdkReadinessManager.ts +7 -7
  129. package/src/readiness/types.ts +2 -5
  130. package/src/sdkClient/sdkClient.ts +5 -5
  131. package/src/sdkClient/sdkClientMethod.ts +1 -4
  132. package/src/sdkClient/sdkClientMethodCS.ts +15 -7
  133. package/src/sdkClient/sdkClientMethodCSWithTT.ts +15 -7
  134. package/src/sdkFactory/index.ts +12 -35
  135. package/src/sdkFactory/types.ts +1 -4
  136. package/src/services/decorateHeaders.ts +5 -0
  137. package/src/services/splitApi.ts +7 -7
  138. package/src/services/splitHttpClient.ts +7 -4
  139. package/src/services/types.ts +2 -2
  140. package/src/storages/AbstractSegmentsCacheSync.ts +68 -0
  141. package/src/storages/AbstractSplitsCacheSync.ts +3 -4
  142. package/src/storages/KeyBuilderCS.ts +5 -34
  143. package/src/storages/dataLoader.ts +1 -1
  144. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +63 -33
  145. package/src/storages/inLocalStorage/index.ts +4 -8
  146. package/src/storages/inMemory/InMemoryStorageCS.ts +1 -6
  147. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +47 -13
  148. package/src/storages/inMemory/SegmentsCacheInMemory.ts +27 -13
  149. package/src/storages/inMemory/SplitsCacheInMemory.ts +9 -7
  150. package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
  151. package/src/storages/inRedis/SegmentsCacheInRedis.ts +24 -15
  152. package/src/storages/inRedis/index.ts +12 -6
  153. package/src/storages/pluggable/SegmentsCachePluggable.ts +37 -13
  154. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  155. package/src/storages/types.ts +17 -15
  156. package/src/sync/offline/syncManagerOffline.ts +13 -21
  157. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
  158. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  159. package/src/sync/polling/fetchers/types.ts +2 -3
  160. package/src/sync/polling/pollingManagerCS.ts +4 -4
  161. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
  162. package/src/sync/polling/types.ts +6 -7
  163. package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
  164. package/src/sync/polling/updaters/segmentChangesUpdater.ts +29 -13
  165. package/src/sync/polling/updaters/splitChangesUpdater.ts +1 -1
  166. package/src/sync/streaming/AuthClient/index.ts +1 -1
  167. package/src/sync/streaming/SSEClient/index.ts +6 -4
  168. package/src/sync/streaming/SSEHandler/index.ts +8 -5
  169. package/src/sync/streaming/SSEHandler/types.ts +15 -15
  170. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
  171. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
  172. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  173. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  174. package/src/sync/streaming/constants.ts +2 -2
  175. package/src/sync/streaming/parseUtils.ts +11 -19
  176. package/src/sync/streaming/pushManager.ts +72 -73
  177. package/src/sync/streaming/types.ts +10 -10
  178. package/src/sync/submitters/types.ts +5 -8
  179. package/src/sync/syncManagerOnline.ts +17 -17
  180. package/src/sync/syncTask.ts +2 -2
  181. package/src/sync/types.ts +1 -1
  182. package/src/trackers/eventTracker.ts +8 -11
  183. package/src/trackers/impressionsTracker.ts +10 -13
  184. package/src/trackers/types.ts +0 -1
  185. package/src/trackers/uniqueKeysTracker.ts +4 -6
  186. package/src/types.ts +1 -7
  187. package/src/utils/constants/index.ts +2 -3
  188. package/src/utils/settingsValidation/index.ts +2 -3
  189. package/src/utils/settingsValidation/types.ts +1 -1
  190. package/types/dtos/types.d.ts +7 -18
  191. package/types/evaluator/matchersTransform/segment.d.ts +2 -2
  192. package/types/logger/constants.d.ts +1 -1
  193. package/types/readiness/readinessManager.d.ts +2 -2
  194. package/types/readiness/sdkReadinessManager.d.ts +3 -2
  195. package/types/readiness/types.d.ts +2 -5
  196. package/types/sdkClient/sdkClientMethod.d.ts +1 -1
  197. package/types/sdkFactory/types.d.ts +1 -3
  198. package/types/services/decorateHeaders.d.ts +1 -0
  199. package/types/services/splitApi.d.ts +1 -1
  200. package/types/services/splitHttpClient.d.ts +1 -1
  201. package/types/services/types.d.ts +2 -2
  202. package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
  203. package/types/storages/AbstractSplitsCacheSync.d.ts +1 -1
  204. package/types/storages/KeyBuilderCS.d.ts +2 -9
  205. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +18 -8
  206. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +13 -7
  207. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +8 -6
  208. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -1
  209. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
  210. package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +4 -7
  211. package/types/storages/inRedis/index.d.ts +1 -1
  212. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +17 -5
  213. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  214. package/types/storages/types.d.ts +15 -11
  215. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  216. package/types/sync/polling/fetchers/types.d.ts +2 -2
  217. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
  218. package/types/sync/polling/types.d.ts +4 -7
  219. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
  220. package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
  221. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
  222. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
  223. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
  224. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  225. package/types/sync/streaming/constants.d.ts +2 -2
  226. package/types/sync/streaming/parseUtils.d.ts +5 -4
  227. package/types/sync/streaming/types.d.ts +8 -8
  228. package/types/sync/submitters/types.d.ts +4 -7
  229. package/types/sync/types.d.ts +1 -1
  230. package/types/trackers/eventTracker.d.ts +1 -1
  231. package/types/trackers/impressionsTracker.d.ts +1 -1
  232. package/types/trackers/types.d.ts +0 -1
  233. package/types/types.d.ts +1 -7
  234. package/types/utils/constants/index.d.ts +2 -3
  235. package/types/utils/settingsValidation/types.d.ts +1 -1
  236. package/cjs/evaluator/matchers/large_segment.js +0 -16
  237. package/cjs/sdkClient/identity.js +0 -7
  238. package/cjs/storages/AbstractMySegmentsCacheSync.js +0 -60
  239. package/esm/evaluator/matchers/large_segment.js +0 -12
  240. package/esm/sdkClient/identity.js +0 -3
  241. package/esm/storages/AbstractMySegmentsCacheSync.js +0 -57
  242. package/src/evaluator/matchers/large_segment.ts +0 -18
  243. package/src/sdkClient/identity.ts +0 -5
  244. package/src/storages/AbstractMySegmentsCacheSync.ts +0 -94
  245. package/types/evaluator/matchers/large_segment.d.ts +0 -5
  246. package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
  247. package/types/evaluator/matchersTransform/set.d.ts +0 -5
  248. package/types/evaluator/matchersTransform/string.d.ts +0 -7
  249. package/types/sdkClient/identity.d.ts +0 -2
  250. package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
  251. package/types/storages/AbstractSplitsCache.d.ts +0 -46
  252. package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
  253. package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
  254. package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
  255. package/types/trackers/impressionObserver/utils.d.ts +0 -5
  256. package/types/utils/inputValidation/sdkKey.d.ts +0 -7
  257. package/types/utils/inputValidation/splitExistance.d.ts +0 -7
  258. package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
  259. package/types/utils/redis/RedisMock.d.ts +0 -4
  260. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
  261. /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
@@ -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;
@@ -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.'],
@@ -4,11 +4,9 @@ function splitsEventEmitterFactory(EventEmitter) {
4
4
  var splitsEventEmitter = objectAssign(new EventEmitter(), {
5
5
  splitsArrived: false,
6
6
  splitsCacheLoaded: false,
7
- initialized: false,
8
- initCallbacks: []
9
7
  });
10
8
  // `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
11
- // - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
9
+ // - `/mySegments` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
12
10
  // - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
13
11
  splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
14
12
  splitsEventEmitter.splitsArrived = true; });
@@ -25,9 +23,9 @@ function segmentsEventEmitterFactory(EventEmitter) {
25
23
  /**
26
24
  * Factory of readiness manager, which handles the ready / update event propagation.
27
25
  */
28
- export function readinessManagerFactory(EventEmitter, settings, splits) {
26
+ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
27
+ if (readyTimeout === void 0) { readyTimeout = 0; }
29
28
  if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
30
- var readyTimeout = settings.startup.readyTimeout;
31
29
  var segments = segmentsEventEmitterFactory(EventEmitter);
32
30
  var gate = new EventEmitter();
33
31
  var lastUpdate = 0;
@@ -45,7 +43,7 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
45
43
  // emit SDK_READY_TIMED_OUT
46
44
  var hasTimedout = false;
47
45
  function timeout() {
48
- if (hasTimedout || isReady)
46
+ if (hasTimedout)
49
47
  return;
50
48
  hasTimedout = true;
51
49
  syncLastUpdate();
@@ -53,10 +51,7 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
53
51
  }
54
52
  var readyTimeoutId;
55
53
  if (readyTimeout > 0) {
56
- if (splits.initialized)
57
- readyTimeoutId = setTimeout(timeout, readyTimeout);
58
- else
59
- splits.initCallbacks.push(function () { readyTimeoutId = setTimeout(timeout, readyTimeout); });
54
+ readyTimeoutId = setTimeout(timeout, readyTimeout);
60
55
  }
61
56
  // emit SDK_READY and SDK_UPDATE
62
57
  var isReady = false;
@@ -108,9 +103,10 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
108
103
  splits: splits,
109
104
  segments: segments,
110
105
  gate: gate,
111
- shared: function () {
106
+ shared: function (readyTimeout) {
107
+ if (readyTimeout === void 0) { readyTimeout = 0; }
112
108
  refCount++;
113
- return readinessManagerFactory(EventEmitter, settings, splits);
109
+ return readinessManagerFactory(EventEmitter, readyTimeout, splits);
114
110
  },
115
111
  // @TODO review/remove next methods when non-recoverable errors are reworked
116
112
  // Called on consumer mode, when storage fails to connect
@@ -118,12 +114,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
118
114
  // Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
119
115
  // tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
120
116
  setDestroyed: function () { isDestroyed = true; },
121
- init: function () {
122
- if (splits.initialized)
123
- return;
124
- splits.initialized = true;
125
- splits.initCallbacks.forEach(function (cb) { return cb(); });
126
- },
127
117
  destroy: function () {
128
118
  isDestroyed = true;
129
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;
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();
@@ -47,16 +51,18 @@ export function sdkClientMethodCSFactory(params) {
47
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
57
  syncManager: sharedSyncManager,
58
+ signalListener: undefined, // only the main client "destroy" method stops the signal listener
54
59
  }), true), validKey);
60
+ sharedSyncManager && sharedSyncManager.start();
55
61
  log.info(NEW_SHARED_CLIENT);
56
62
  }
57
63
  else {
58
64
  log.debug(RETRIEVE_CLIENT_EXISTING);
59
65
  }
60
- return clients[instanceId];
66
+ return clientInstances[instanceId];
61
67
  };
62
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;
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();
@@ -56,16 +60,18 @@ export function sdkClientMethodCSFactory(params) {
56
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
66
  syncManager: sharedSyncManager,
67
+ signalListener: undefined, // only the main client "destroy" method stops the signal listener
63
68
  }), true), validKey, validTrafficType);
69
+ sharedSyncManager && sharedSyncManager.start();
64
70
  log.info(NEW_SHARED_CLIENT);
65
71
  }
66
72
  else {
67
73
  log.debug(RETRIEVE_CLIENT_EXISTING);
68
74
  }
69
- return clients[instanceId];
75
+ return clientInstances[instanceId];
70
76
  };
71
77
  }
@@ -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, lazyInit = params.lazyInit;
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 hasInit = false;
25
- var initCallbacks = [];
26
- function whenInit(cb) {
27
- if (hasInit)
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,
@@ -44,7 +37,6 @@ export function sdkFactory(params) {
44
37
  },
45
38
  });
46
39
  // @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
47
- var clients = {};
48
40
  var telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
49
41
  var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
50
42
  var observer = impressionsObserverFactory();
@@ -60,11 +52,11 @@ export function sdkFactory(params) {
60
52
  default:
61
53
  strategy = strategyDebugFactory(observer);
62
54
  }
63
- var impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy, whenInit, integrationsManager, storage.telemetry);
64
- 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);
65
57
  // splitApi is used by SyncManager and Browser signal listener
66
58
  var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
67
- var ctx = { clients: clients, splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
59
+ var ctx = { splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
68
60
  var syncManager = syncManagerFactory && syncManagerFactory(ctx);
69
61
  ctx.syncManager = syncManager;
70
62
  var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
@@ -72,19 +64,8 @@ export function sdkFactory(params) {
72
64
  // SDK client and manager
73
65
  var clientMethod = sdkClientMethodFactory(ctx);
74
66
  var managerInstance = sdkManagerFactory(settings, storage.splits, sdkReadinessManager);
75
- function init() {
76
- if (hasInit)
77
- return;
78
- hasInit = true;
79
- // We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
80
- validateAndTrackApiKey(log, settings.core.authorizationKey);
81
- readiness.init();
82
- uniqueKeysTracker && uniqueKeysTracker.start();
83
- syncManager && syncManager.start();
84
- signalListener && signalListener.start();
85
- initCallbacks.forEach(function (cb) { return cb(); });
86
- initCallbacks.length = 0;
87
- }
67
+ syncManager && syncManager.start();
68
+ signalListener && signalListener.start();
88
69
  log.info(NEW_FACTORY);
89
70
  // @ts-ignore
90
71
  return objectAssign({
@@ -98,8 +79,5 @@ export function sdkFactory(params) {
98
79
  // Logger wrapper API
99
80
  Logger: createLoggerAPI(log),
100
81
  settings: settings,
101
- destroy: function () {
102
- return Promise.all(Object.keys(clients).map(function (key) { return clients[key].destroy(); })).then(function () { });
103
- }
104
- }, extraProps && extraProps(ctx), lazyInit ? { init: init } : init());
82
+ }, extraProps && extraProps(ctx));
105
83
  }
@@ -30,3 +30,7 @@ export function decorateHeaders(settings, headers) {
30
30
  }
31
31
  return headers;
32
32
  }
33
+ export function removeNonISO88591(input) {
34
+ // eslint-disable-next-line no-control-regex
35
+ return input.replace(/[^\x00-\xFF]/g, '');
36
+ }
@@ -1,6 +1,6 @@
1
1
  import { splitHttpClientFactory } from './splitHttpClient';
2
2
  import { objectAssign } from '../utils/lang/objectAssign';
3
- import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MEMBERSHIPS } from '../utils/constants';
3
+ import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT } from '../utils/constants';
4
4
  import { ERROR_TOO_MANY_SETS } from '../logger/constants';
5
5
  var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
6
6
  function userKeyToQueryParam(userKey) {
@@ -51,15 +51,15 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
51
51
  var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : '');
52
52
  return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SEGMENT));
53
53
  },
54
- fetchMemberships: function (userMatchingKey, noCache, till) {
54
+ fetchMySegments: function (userMatchingKey, noCache) {
55
55
  /**
56
56
  * URI encoding of user keys in order to:
57
- * - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%'
58
- * - avoid 404 responses. E.g.: '/api/memberships/foo/bar'
57
+ * - avoid 400 responses (due to URI malformed). E.g.: '/api/mySegments/%'
58
+ * - avoid 404 responses. E.g.: '/api/mySegments/foo/bar'
59
59
  * - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
60
60
  */
61
- var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey) + (till ? '?till=' + till : '');
62
- return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MEMBERSHIPS));
61
+ var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
62
+ return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_SEGMENT));
63
63
  },
64
64
  /**
65
65
  * Post events.
@@ -1,6 +1,8 @@
1
1
  import { objectAssign } from '../utils/lang/objectAssign';
2
2
  import { ERROR_HTTP, ERROR_CLIENT_CANNOT_GET_READY } from '../logger/constants';
3
- import { decorateHeaders } from './decorateHeaders';
3
+ import { decorateHeaders, removeNonISO88591 } from './decorateHeaders';
4
+ import { timeout } from '../utils/promise/timeout';
5
+ var PENDING_FETCH_ERROR_TIMEOUT = 100;
4
6
  var messageNoFetch = 'Global fetch API is not available.';
5
7
  /**
6
8
  * Factory of Split HTTP clients, which are HTTP clients with predefined headers for Split endpoints.
@@ -25,7 +27,7 @@ export function splitHttpClientFactory(settings, _a) {
25
27
  if (ip)
26
28
  commonHeaders['SplitSDKMachineIP'] = ip;
27
29
  if (hostname)
28
- commonHeaders['SplitSDKMachineName'] = hostname;
30
+ commonHeaders['SplitSDKMachineName'] = removeNonISO88591(hostname);
29
31
  return function httpClient(url, reqOpts, latencyTracker, logErrorsAsInfo) {
30
32
  if (reqOpts === void 0) { reqOpts = {}; }
31
33
  if (latencyTracker === void 0) { latencyTracker = function () { }; }
@@ -40,7 +42,8 @@ export function splitHttpClientFactory(settings, _a) {
40
42
  // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Checking_that_the_fetch_was_successful
41
43
  .then(function (response) {
42
44
  if (!response.ok) {
43
- return response.text().then(function (message) { return Promise.reject({ response: response, message: message }); });
45
+ // `text()` promise might not settle in some fetch implementations and cases (e.g. no content)
46
+ return timeout(PENDING_FETCH_ERROR_TIMEOUT, response.text()).then(function (message) { return Promise.reject({ response: response, message: message }); }, function () { return Promise.reject({ response: response }); });
44
47
  }
45
48
  latencyTracker();
46
49
  return response;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * This class provides a skeletal implementation of the ISegmentsCacheSync interface
3
+ * to minimize the effort required to implement this interface.
4
+ */
5
+ var AbstractSegmentsCacheSync = /** @class */ (function () {
6
+ function AbstractSegmentsCacheSync() {
7
+ }
8
+ /**
9
+ * For server-side synchronizer: add the given list of segments to the cache, with an empty list of keys. The segments that already exist are not modified.
10
+ * For client-side synchronizer: the method is not used.
11
+ */
12
+ AbstractSegmentsCacheSync.prototype.registerSegments = function (names) { return false; };
13
+ /**
14
+ * For server-side synchronizer: set the change number of `name` segment.
15
+ * For client-side synchronizer: the method is not used.
16
+ */
17
+ AbstractSegmentsCacheSync.prototype.setChangeNumber = function (name, changeNumber) { return true; };
18
+ /**
19
+ * For server-side synchronizer: get the change number of `name` segment.
20
+ * For client-side synchronizer: the method is not used.
21
+ */
22
+ AbstractSegmentsCacheSync.prototype.getChangeNumber = function (name) { return -1; };
23
+ /**
24
+ * For server-side synchronizer: the method is not used.
25
+ * For client-side synchronizer: reset the cache with the given list of segments.
26
+ */
27
+ AbstractSegmentsCacheSync.prototype.resetSegments = function (names) { return true; };
28
+ return AbstractSegmentsCacheSync;
29
+ }());
30
+ export { AbstractSegmentsCacheSync };
@@ -1,5 +1,5 @@
1
1
  import { objectAssign } from '../utils/lang/objectAssign';
2
- import { IN_SEGMENT, IN_LARGE_SEGMENT } from '../utils/constants';
2
+ import { IN_SEGMENT } from '../utils/constants';
3
3
  /**
4
4
  * This class provides a skeletal implementation of the ISplitsCacheSync interface
5
5
  * to minimize the effort required to implement this interface.
@@ -67,8 +67,7 @@ export function usesSegments(split) {
67
67
  for (var i = 0; i < conditions.length; i++) {
68
68
  var matchers = conditions[i].matcherGroup.matchers;
69
69
  for (var j = 0; j < matchers.length; j++) {
70
- var matcher = matchers[j].matcherType;
71
- if (matcher === IN_SEGMENT || matcher === IN_LARGE_SEGMENT)
70
+ if (matchers[j].matcherType === IN_SEGMENT)
72
71
  return true;
73
72
  }
74
73
  }
@@ -21,6 +21,10 @@ var KeyBuilderCS = /** @class */ (function (_super) {
21
21
  return builtSegmentKeyName.substr(prefix.length);
22
22
  };
23
23
  // @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
24
+ KeyBuilderCS.prototype.buildOldSegmentNameKey = function (segmentName) {
25
+ return this.matchingKey + "." + this.prefix + ".segment." + segmentName;
26
+ };
27
+ // @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
24
28
  KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
25
29
  var prefix = this.matchingKey + "." + this.prefix + ".segment.";
26
30
  if (startsWith(builtSegmentKeyName, prefix))
@@ -32,27 +36,6 @@ var KeyBuilderCS = /** @class */ (function (_super) {
32
36
  KeyBuilderCS.prototype.isSplitsCacheKey = function (key) {
33
37
  return this.regexSplitsCacheKey.test(key);
34
38
  };
35
- KeyBuilderCS.prototype.buildTillKey = function () {
36
- return this.prefix + "." + this.matchingKey + ".segments.till";
37
- };
38
39
  return KeyBuilderCS;
39
40
  }(KeyBuilder));
40
41
  export { KeyBuilderCS };
41
- export function myLargeSegmentsKeyBuilder(prefix, matchingKey) {
42
- return {
43
- buildSegmentNameKey: function (segmentName) {
44
- return prefix + "." + matchingKey + ".largeSegment." + segmentName;
45
- },
46
- extractSegmentName: function (builtSegmentKeyName) {
47
- var p = prefix + "." + matchingKey + ".largeSegment.";
48
- if (startsWith(builtSegmentKeyName, p))
49
- return builtSegmentKeyName.substr(p.length);
50
- },
51
- extractOldSegmentKey: function () {
52
- return undefined;
53
- },
54
- buildTillKey: function () {
55
- return prefix + "." + matchingKey + ".largeSegments.till";
56
- }
57
- };
58
- }