@splitsoftware/splitio-commons 1.2.0 → 1.2.1-rc.3

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 (281) hide show
  1. package/cjs/evaluator/Engine.js +6 -6
  2. package/cjs/evaluator/combiners/and.js +1 -1
  3. package/cjs/evaluator/combiners/ifelseif.js +2 -2
  4. package/cjs/evaluator/condition/engineUtils.js +2 -2
  5. package/cjs/evaluator/condition/index.js +4 -4
  6. package/cjs/evaluator/index.js +5 -5
  7. package/cjs/evaluator/matchers/cont_all.js +1 -1
  8. package/cjs/evaluator/matchers/cont_any.js +1 -1
  9. package/cjs/evaluator/matchers/cont_str.js +1 -1
  10. package/cjs/evaluator/matchers/dependency.js +1 -1
  11. package/cjs/evaluator/matchers/eq_set.js +1 -1
  12. package/cjs/evaluator/matchers/ew.js +3 -3
  13. package/cjs/evaluator/matchers/part_of.js +1 -1
  14. package/cjs/evaluator/matchers/segment.js +1 -1
  15. package/cjs/evaluator/matchers/sw.js +1 -1
  16. package/cjs/evaluator/matchers/whitelist.js +1 -1
  17. package/cjs/evaluator/matchersTransform/index.js +12 -12
  18. package/cjs/evaluator/parser/index.js +6 -6
  19. package/cjs/evaluator/treatments/index.js +1 -1
  20. package/cjs/evaluator/value/index.js +1 -1
  21. package/cjs/evaluator/value/sanitize.js +4 -4
  22. package/cjs/integrations/browser.js +3 -3
  23. package/cjs/integrations/ga/GaToSplit.js +14 -14
  24. package/cjs/integrations/ga/GoogleAnalyticsToSplit.js +5 -3
  25. package/cjs/integrations/ga/SplitToGa.js +1 -1
  26. package/cjs/integrations/ga/SplitToGoogleAnalytics.js +4 -2
  27. package/cjs/listeners/browser.js +1 -1
  28. package/cjs/listeners/node.js +1 -1
  29. package/cjs/logger/constants.js +3 -1
  30. package/cjs/logger/index.js +2 -2
  31. package/cjs/logger/messages/debug.js +1 -1
  32. package/cjs/logger/messages/error.js +2 -2
  33. package/cjs/logger/messages/info.js +5 -5
  34. package/cjs/logger/messages/warn.js +1 -1
  35. package/cjs/logger/sdkLogger.js +1 -1
  36. package/cjs/readiness/readinessManager.js +2 -2
  37. package/cjs/readiness/sdkReadinessManager.js +4 -4
  38. package/cjs/sdkClient/client.js +11 -10
  39. package/cjs/sdkClient/clientAttributesDecoration.js +4 -4
  40. package/cjs/sdkClient/clientCS.js +4 -3
  41. package/cjs/sdkClient/clientInputValidation.js +14 -14
  42. package/cjs/sdkClient/sdkClient.js +3 -3
  43. package/cjs/sdkClient/sdkClientMethod.js +1 -1
  44. package/cjs/sdkClient/sdkClientMethodCS.js +6 -6
  45. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +8 -8
  46. package/cjs/sdkFactory/index.js +8 -8
  47. package/cjs/sdkManager/index.js +11 -11
  48. package/cjs/services/splitApi.js +3 -2
  49. package/cjs/services/splitHttpClient.js +3 -3
  50. package/cjs/storages/KeyBuilder.js +2 -2
  51. package/cjs/storages/KeyBuilderCS.js +2 -2
  52. package/cjs/storages/KeyBuilderSS.js +1 -1
  53. package/cjs/storages/findLatencyIndex.js +1 -1
  54. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -1
  55. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +12 -12
  56. package/cjs/storages/inLocalStorage/index.js +3 -3
  57. package/cjs/storages/inMemory/AttributesCacheInMemory.js +1 -1
  58. package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
  59. package/cjs/storages/inMemory/LatenciesCacheInMemory.js +1 -1
  60. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +1 -1
  61. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +2 -2
  62. package/cjs/storages/inMemory/SplitsCacheInMemory.js +5 -5
  63. package/cjs/storages/inRedis/LatenciesCacheInRedis.js +1 -1
  64. package/cjs/storages/inRedis/RedisAdapter.js +16 -10
  65. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +1 -1
  66. package/cjs/storages/inRedis/SplitsCacheInRedis.js +3 -3
  67. package/cjs/storages/inRedis/index.js +1 -1
  68. package/cjs/storages/pluggable/SegmentsCachePluggable.js +1 -1
  69. package/cjs/storages/pluggable/SplitsCachePluggable.js +3 -3
  70. package/cjs/storages/pluggable/inMemoryWrapper.js +4 -4
  71. package/cjs/storages/pluggable/index.js +4 -4
  72. package/cjs/sync/offline/LocalhostFromFile.js +1 -1
  73. package/cjs/sync/offline/LocalhostFromObject.js +1 -1
  74. package/cjs/sync/offline/splitsParser/parseCondition.js +1 -1
  75. package/cjs/sync/offline/splitsParser/splitsParserFromFile.js +13 -13
  76. package/cjs/sync/offline/splitsParser/splitsParserFromSettings.js +3 -3
  77. package/cjs/sync/offline/syncManagerOffline.js +1 -1
  78. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +2 -2
  79. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  80. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  81. package/cjs/sync/polling/pollingManagerCS.js +8 -7
  82. package/cjs/sync/polling/pollingManagerSS.js +5 -4
  83. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
  84. package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +1 -1
  85. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +1 -1
  86. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  87. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  88. package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -2
  89. package/cjs/sync/streaming/AuthClient/index.js +4 -5
  90. package/cjs/sync/streaming/SSEHandler/NotificationParser.js +1 -1
  91. package/cjs/sync/streaming/SSEHandler/index.js +3 -3
  92. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
  93. package/cjs/sync/streaming/mySegmentsV2utils.js +1 -1
  94. package/cjs/sync/streaming/pushManager.js +46 -35
  95. package/cjs/sync/submitters/eventsSyncTask.js +1 -1
  96. package/cjs/sync/submitters/impressionCountsSyncTask.js +1 -1
  97. package/cjs/sync/submitters/impressionsSyncTask.js +3 -3
  98. package/cjs/sync/submitters/metricsSyncTask.js +3 -3
  99. package/cjs/sync/submitters/submitterManager.js +6 -5
  100. package/cjs/sync/submitters/submitterSyncTask.js +1 -1
  101. package/cjs/sync/syncManagerOnline.js +12 -12
  102. package/cjs/trackers/eventTracker.js +3 -3
  103. package/cjs/trackers/impressionObserver/impressionObserverCS.js +1 -1
  104. package/cjs/trackers/impressionObserver/impressionObserverSS.js +1 -1
  105. package/cjs/trackers/impressionsTracker.js +3 -3
  106. package/cjs/utils/MinEvents.js +2 -1
  107. package/cjs/utils/inputValidation/apiKey.js +1 -1
  108. package/cjs/utils/inputValidation/attribute.js +4 -4
  109. package/cjs/utils/inputValidation/attributes.js +2 -2
  110. package/cjs/utils/inputValidation/event.js +1 -1
  111. package/cjs/utils/inputValidation/eventProperties.js +7 -5
  112. package/cjs/utils/inputValidation/eventValue.js +1 -1
  113. package/cjs/utils/inputValidation/key.js +6 -5
  114. package/cjs/utils/inputValidation/preloadedData.js +8 -8
  115. package/cjs/utils/inputValidation/split.js +1 -1
  116. package/cjs/utils/inputValidation/splits.js +2 -2
  117. package/cjs/utils/inputValidation/trafficType.js +1 -1
  118. package/cjs/utils/inputValidation/trafficTypeExistance.js +1 -1
  119. package/cjs/utils/jwt/index.js +1 -1
  120. package/cjs/utils/key/index.js +3 -3
  121. package/cjs/utils/lang/index.js +2 -14
  122. package/cjs/utils/murmur3/common.js +1 -1
  123. package/cjs/utils/murmur3/legacy.js +44 -0
  124. package/cjs/utils/murmur3/murmur3.js +10 -10
  125. package/cjs/utils/murmur3/murmur3_128.js +1 -1
  126. package/cjs/utils/murmur3/murmur3_128_x86.js +37 -37
  127. package/cjs/utils/murmur3/murmur3_64.js +1 -1
  128. package/cjs/utils/promise/timeout.js +1 -1
  129. package/cjs/utils/settingsValidation/index.js +5 -10
  130. package/cjs/utils/settingsValidation/integrations/configurable.js +1 -1
  131. package/cjs/utils/settingsValidation/integrations/pluggable.js +1 -1
  132. package/cjs/utils/settingsValidation/localhost/builtin.js +2 -2
  133. package/cjs/utils/settingsValidation/logger/builtinLogger.js +3 -3
  134. package/cjs/utils/settingsValidation/logger/commons.js +1 -1
  135. package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  136. package/cjs/utils/settingsValidation/runtime/browser.js +10 -0
  137. package/cjs/utils/settingsValidation/runtime/node.js +22 -0
  138. package/cjs/utils/settingsValidation/splitFilters.js +1 -1
  139. package/cjs/utils/settingsValidation/storage/storageCS.js +1 -1
  140. package/cjs/utils/timeTracker/index.js +3 -3
  141. package/esm/evaluator/matchers/ew.js +4 -4
  142. package/esm/integrations/ga/GoogleAnalyticsToSplit.js +4 -2
  143. package/esm/integrations/ga/SplitToGoogleAnalytics.js +4 -2
  144. package/esm/logger/messages/error.js +1 -1
  145. package/esm/logger/messages/info.js +4 -4
  146. package/esm/sdkClient/client.js +2 -1
  147. package/esm/sdkClient/clientCS.js +2 -1
  148. package/esm/services/splitApi.js +2 -1
  149. package/esm/services/splitHttpClient.js +1 -1
  150. package/esm/storages/inRedis/RedisAdapter.js +7 -1
  151. package/esm/sync/offline/splitsParser/splitsParserFromFile.js +1 -1
  152. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  153. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +2 -2
  154. package/esm/sync/polling/pollingManagerCS.js +2 -1
  155. package/esm/sync/polling/pollingManagerSS.js +2 -1
  156. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
  157. package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
  158. package/esm/sync/streaming/AuthClient/index.js +1 -2
  159. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
  160. package/esm/sync/streaming/pushManager.js +34 -23
  161. package/esm/sync/submitters/submitterManager.js +2 -1
  162. package/esm/sync/syncManagerOnline.js +12 -12
  163. package/esm/utils/inputValidation/eventProperties.js +4 -2
  164. package/esm/utils/inputValidation/key.js +2 -1
  165. package/esm/utils/lang/index.js +2 -13
  166. package/esm/utils/murmur3/legacy.js +39 -0
  167. package/esm/utils/promise/timeout.js +1 -1
  168. package/esm/utils/settingsValidation/index.js +1 -6
  169. package/esm/utils/settingsValidation/runtime/browser.js +6 -0
  170. package/esm/utils/settingsValidation/runtime/node.js +17 -0
  171. package/package.json +8 -7
  172. package/src/evaluator/matchers/ew.ts +4 -4
  173. package/src/integrations/ga/GoogleAnalyticsToSplit.ts +7 -4
  174. package/src/integrations/ga/SplitToGoogleAnalytics.ts +7 -4
  175. package/src/integrations/types.ts +5 -0
  176. package/src/logger/.DS_Store +0 -0
  177. package/src/logger/messages/error.ts +1 -1
  178. package/src/logger/messages/info.ts +4 -4
  179. package/src/logger/types.ts +4 -0
  180. package/src/sdkClient/client.ts +2 -1
  181. package/src/sdkClient/clientCS.ts +3 -1
  182. package/src/services/splitHttpClient.ts +1 -1
  183. package/src/storages/types.ts +1 -1
  184. package/src/sync/offline/splitsParser/splitsParserFromFile.ts +1 -1
  185. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
  186. package/src/sync/polling/fetchers/types.ts +1 -0
  187. package/src/sync/polling/pollingManagerCS.ts +3 -6
  188. package/src/sync/polling/pollingManagerSS.ts +3 -8
  189. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +2 -1
  190. package/src/sync/polling/types.ts +0 -12
  191. package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -1
  192. package/src/sync/streaming/AuthClient/index.ts +1 -2
  193. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  194. package/src/sync/streaming/pushManager.ts +39 -37
  195. package/src/sync/streaming/types.ts +5 -25
  196. package/src/sync/submitters/submitterManager.ts +4 -8
  197. package/src/sync/syncManagerOnline.ts +16 -22
  198. package/src/types.ts +5 -1
  199. package/src/utils/inputValidation/eventProperties.ts +4 -2
  200. package/src/utils/lang/index.ts +0 -14
  201. package/src/utils/murmur3/legacy.ts +48 -0
  202. package/src/utils/promise/timeout.ts +1 -1
  203. package/src/utils/settingsValidation/index.ts +1 -6
  204. package/src/utils/settingsValidation/runtime/browser.ts +8 -0
  205. package/src/utils/settingsValidation/runtime/node.ts +22 -0
  206. package/src/utils/settingsValidation/types.ts +6 -6
  207. package/types/integrations/ga/GaToSplitPlugin.d.ts +3 -0
  208. package/types/integrations/ga/GoogleAnalyticsToSplit.d.ts +2 -2
  209. package/types/integrations/ga/SplitToGaPlugin.d.ts +4 -0
  210. package/types/integrations/ga/SplitToGoogleAnalytics.d.ts +2 -3
  211. package/types/integrations/types.d.ts +4 -0
  212. package/types/logger/browser/{DebugLogger.d.ts → debugLogger.d.ts} +0 -0
  213. package/types/logger/browser/{ErrorLogger.d.ts → errorLogger.d.ts} +0 -0
  214. package/types/logger/browser/{InfoLogger.d.ts → infoLogger.d.ts} +0 -0
  215. package/types/logger/browser/{WarnLogger.d.ts → warnLogger.d.ts} +0 -0
  216. package/types/logger/codes.d.ts +2 -0
  217. package/types/logger/codesConstants.d.ts +117 -0
  218. package/types/logger/codesConstantsBrowser.d.ts +2 -0
  219. package/types/logger/codesConstantsNode.d.ts +14 -0
  220. package/types/logger/codesDebug.d.ts +1 -0
  221. package/types/logger/codesDebugBrowser.d.ts +1 -0
  222. package/types/logger/codesDebugNode.d.ts +1 -0
  223. package/types/logger/codesError.d.ts +1 -0
  224. package/types/logger/codesErrorNode.d.ts +1 -0
  225. package/types/logger/codesInfo.d.ts +1 -0
  226. package/types/logger/codesWarn.d.ts +1 -0
  227. package/types/logger/codesWarnNode.d.ts +1 -0
  228. package/types/logger/debugLogger.d.ts +2 -0
  229. package/types/logger/errorLogger.d.ts +2 -0
  230. package/types/logger/infoLogger.d.ts +2 -0
  231. package/types/logger/messages/debugBrowser.d.ts +1 -0
  232. package/types/logger/messages/debugNode.d.ts +1 -0
  233. package/types/logger/messages/errorNode.d.ts +1 -0
  234. package/types/logger/messages/warnNode.d.ts +1 -0
  235. package/types/logger/noopLogger.d.ts +2 -0
  236. package/types/logger/types.d.ts +4 -0
  237. package/types/logger/warnLogger.d.ts +2 -0
  238. package/types/sdkClient/clientAttributesDecoration.d.ts +1 -1
  239. package/types/sdkManager/sdkManagerMethod.d.ts +6 -0
  240. package/types/storages/getRegisteredSegments.d.ts +10 -0
  241. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +51 -0
  242. package/types/storages/inMemory/index.d.ts +10 -0
  243. package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +0 -0
  244. package/types/storages/parseSegments.d.ts +6 -0
  245. package/types/storages/pluggable/TelemetryCachePluggable.d.ts +2 -0
  246. package/types/storages/types.d.ts +1 -1
  247. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +1 -1
  248. package/types/sync/polling/fetchers/types.d.ts +1 -1
  249. package/types/sync/polling/pollingManagerCS.d.ts +2 -5
  250. package/types/sync/polling/pollingManagerSS.d.ts +2 -5
  251. package/types/sync/polling/syncTasks/splitsSyncTask.copy.d.ts +35 -0
  252. package/types/sync/polling/syncTasks/splitsSyncTask.morelikeoriginal.d.ts +35 -0
  253. package/types/sync/polling/types.d.ts +0 -11
  254. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
  255. package/types/sync/streaming/AuthClient/indexV1.d.ts +12 -0
  256. package/types/sync/streaming/AuthClient/indexV2.d.ts +8 -0
  257. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -1
  258. package/types/sync/streaming/pushManager.d.ts +3 -7
  259. package/types/sync/streaming/pushManagerCS.d.ts +1 -0
  260. package/types/sync/streaming/pushManagerNoUsers.d.ts +13 -0
  261. package/types/sync/streaming/pushManagerSS.d.ts +1 -0
  262. package/types/sync/streaming/types.d.ts +3 -23
  263. package/types/sync/submitters/submitterManager.d.ts +2 -4
  264. package/types/sync/submitters/telemetrySyncTask.d.ts +17 -0
  265. package/types/sync/syncManagerFromFile.d.ts +2 -0
  266. package/types/sync/syncManagerFromObject.d.ts +2 -0
  267. package/types/sync/syncManagerOffline.d.ts +9 -0
  268. package/types/sync/syncManagerOnline.d.ts +3 -3
  269. package/types/trackers/telemetryRecorder.d.ts +0 -0
  270. package/types/types.d.ts +1 -0
  271. package/types/utils/EventEmitter.d.ts +4 -0
  272. package/types/utils/lang/errors.d.ts +10 -0
  273. package/types/utils/lang/index.d.ts +0 -4
  274. package/types/utils/murmur3/commons.d.ts +12 -0
  275. package/types/utils/murmur3/legacy.d.ts +2 -0
  276. package/types/utils/settingsValidation/buildMetadata.d.ts +3 -0
  277. package/types/utils/settingsValidation/localhost/index.d.ts +9 -0
  278. package/types/utils/settingsValidation/logger.d.ts +11 -0
  279. package/types/utils/settingsValidation/runtime/browser.d.ts +2 -0
  280. package/types/utils/settingsValidation/runtime/node.d.ts +2 -0
  281. package/types/utils/settingsValidation/types.d.ts +6 -6
@@ -19,10 +19,11 @@ import { hash64 } from '../../utils/murmur3/murmur3_64';
19
19
  * - for server-side if key is not provided in settings.
20
20
  * - for client-side, with support for multiple clients, if key is provided in settings
21
21
  */
22
- export function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platform, settings) {
22
+ export function pushManagerFactory(params, pollingManager) {
23
+ var settings = params.settings, storage = params.storage, splitApi = params.splitApi, readiness = params.readiness, platform = params.platform;
23
24
  // `userKey` is the matching key of main client in client-side SDK.
24
25
  // It can be used to check if running on client-side or server-side SDK.
25
- var userKey = settings.core.key ? getMatching(settings.core.key) : undefined; //
26
+ var userKey = settings.core.key ? getMatching(settings.core.key) : undefined;
26
27
  var log = settings.log;
27
28
  var sseClient;
28
29
  try {
@@ -33,13 +34,14 @@ export function pushManagerFactory(pollingManager, storage, readiness, fetchAuth
33
34
  log.warn(STREAMING_FALLBACK, [e]);
34
35
  return;
35
36
  }
36
- var authenticate = authenticateFactory(fetchAuth);
37
+ var authenticate = authenticateFactory(splitApi.fetchAuth);
37
38
  // init feedback loop
38
39
  var pushEmitter = new platform.EventEmitter();
39
40
  var sseHandler = SSEHandlerFactory(log, pushEmitter);
40
41
  sseClient.setEventHandler(sseHandler);
41
42
  // init workers
42
- var segmentsUpdateWorker = userKey ? new MySegmentsUpdateWorker(pollingManager.segmentsSyncTask) : new SegmentsUpdateWorker(storage.segments, pollingManager.segmentsSyncTask);
43
+ // MySegmentsUpdateWorker (client-side) are initiated in `add` method
44
+ var segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(pollingManager.segmentsSyncTask, storage.segments);
43
45
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
44
46
  var splitsUpdateWorker = new SplitsUpdateWorker(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
45
47
  // [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
@@ -47,17 +49,13 @@ export function pushManagerFactory(pollingManager, storage, readiness, fetchAuth
47
49
  // [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
48
50
  // Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
49
51
  var clients = {};
50
- if (userKey) {
51
- var hash = hashUserKey(userKey);
52
- userKeyHashes[hash] = userKey;
53
- clients[userKey] = { hash64: hash64(userKey), worker: segmentsUpdateWorker };
54
- }
55
52
  // [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
56
53
  var connectForNewClient = false;
57
54
  // flag that indicates if `stop/disconnectPush` was called, either by the SyncManager, when the client is destroyed, or due to a PUSH_NONRETRYABLE_ERROR error.
58
55
  // It is used to halt the `connectPush` process if it was in progress.
59
56
  var disconnected;
60
57
  // flag that indicates a PUSH_NONRETRYABLE_ERROR, condition with which starting pushManager again is ignored.
58
+ // true if STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE or Auth errors.
61
59
  var disabled; // `disabled` implies `disconnected === true`
62
60
  /** PushManager functions related to initialization */
63
61
  var connectPushRetryBackoff = new Backoff(connectPush, settings.scheduler.pushRetryBackoffBase);
@@ -258,33 +256,46 @@ export function pushManagerFactory(pollingManager, storage, readiness, fetchAuth
258
256
  return objectAssign(
259
257
  // Expose Event Emitter functionality and Event constants
260
258
  Object.create(pushEmitter), {
261
- // Expose functionality for starting and stoping push mode:
262
- stop: disconnectPush,
259
+ // Stop/pause push mode.
260
+ // It doesn't emit events. Neither PUSH_SUBSYSTEM_DOWN to start polling.
261
+ stop: function () {
262
+ disconnectPush(); // `handleNonRetryableError` cannot be used as `stop`, because it emits PUSH_SUBSYSTEM_DOWN event, which starts polling.
263
+ if (userKey)
264
+ this.remove(userKey); // Necessary to properly resume streaming in client-side (e.g., RN SDK transition to foreground).
265
+ },
266
+ // Start/resume push mode.
267
+ // It eventually emits PUSH_SUBSYSTEM_DOWN, that starts polling, or PUSH_SUBSYSTEM_UP, that executes a syncAll
263
268
  start: function () {
264
269
  // Guard condition to avoid calling `connectPush` again if the `start` method is called multiple times or if push has been disabled.
265
270
  if (disabled || disconnected === false)
266
271
  return;
267
272
  disconnected = false;
268
- // Run in next event-loop cycle for optimization on client-side: if multiple clients are created in the same cycle than the factory, only one authentication is performed.
269
- setTimeout(connectPush);
273
+ if (userKey)
274
+ this.add(userKey, pollingManager.segmentsSyncTask); // client-side
275
+ else
276
+ setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
277
+ },
278
+ // true/false if start or stop was called last respectively
279
+ isRunning: function () {
280
+ return disconnected === false;
270
281
  },
271
282
  // [Only for client-side]
272
283
  add: function (userKey, mySegmentsSyncTask) {
273
- clients[userKey] = { hash64: hash64(userKey), worker: new MySegmentsUpdateWorker(mySegmentsSyncTask) };
274
284
  var hash = hashUserKey(userKey);
275
285
  if (!userKeyHashes[hash]) {
276
286
  userKeyHashes[hash] = userKey;
287
+ clients[userKey] = { hash64: hash64(userKey), worker: new MySegmentsUpdateWorker(mySegmentsSyncTask) };
277
288
  connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
289
+ // Reconnects in case of a new client.
290
+ // Run in next event-loop cycle to save authentication calls
291
+ // in case multiple clients are created in the current cycle.
292
+ setTimeout(function checkForReconnect() {
293
+ if (connectForNewClient) {
294
+ connectForNewClient = false;
295
+ connectPush();
296
+ }
297
+ }, 0);
278
298
  }
279
- // Reconnects in case of a new client.
280
- // Run in next event-loop cycle to save authentication calls
281
- // in case the user is creating several clients in the current cycle.
282
- setTimeout(function checkForReconnect() {
283
- if (connectForNewClient) {
284
- connectForNewClient = false;
285
- connectPush();
286
- }
287
- }, 0);
288
299
  },
289
300
  // [Only for client-side]
290
301
  remove: function (userKey) {
@@ -2,7 +2,8 @@ import { syncTaskComposite } from '../syncTaskComposite';
2
2
  import { eventsSyncTaskFactory } from './eventsSyncTask';
3
3
  import { impressionsSyncTaskFactory } from './impressionsSyncTask';
4
4
  import { impressionCountsSyncTaskFactory } from './impressionCountsSyncTask';
5
- export function submitterManagerFactory(settings, storage, splitApi) {
5
+ export function submitterManagerFactory(params) {
6
+ var settings = params.settings, storage = params.storage, splitApi = params.splitApi;
6
7
  var log = settings.log;
7
8
  var submitters = [
8
9
  impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
@@ -13,26 +13,25 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
13
13
  /**
14
14
  * SyncManager factory for modular SDK
15
15
  */
16
- return function (_a) {
17
- var settings = _a.settings, platform = _a.platform, splitApi = _a.splitApi, storage = _a.storage, readiness = _a.readiness;
18
- var log = settings.log;
16
+ return function (params) {
17
+ var _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled;
19
18
  /** Polling Manager */
20
- var pollingManager = pollingManagerFactory && pollingManagerFactory(splitApi, storage, readiness, settings);
19
+ var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
21
20
  /** Push Manager */
22
- var pushManager = settings.streamingEnabled && pollingManager && pushManagerFactory ?
23
- pushManagerFactory(pollingManager, storage, readiness, splitApi.fetchAuth, platform, settings) :
21
+ var pushManager = streamingEnabled && pollingManager && pushManagerFactory ?
22
+ pushManagerFactory(params, pollingManager) :
24
23
  undefined;
25
24
  /** Submitter Manager */
26
25
  // It is not inyected as push and polling managers, because at the moment it is required
27
- var submitter = submitterManagerFactory(settings, storage, splitApi);
26
+ var submitter = submitterManagerFactory(params);
28
27
  /** Sync Manager logic */
29
28
  function startPolling() {
30
- if (!pollingManager.isRunning()) {
31
- log.info(SYNC_START_POLLING);
32
- pollingManager.start();
29
+ if (pollingManager.isRunning()) {
30
+ log.info(SYNC_CONTINUE_POLLING);
33
31
  }
34
32
  else {
35
- log.info(SYNC_CONTINUE_POLLING);
33
+ log.info(SYNC_START_POLLING);
34
+ pollingManager.start();
36
35
  }
37
36
  }
38
37
  function stopPollingAndSyncAll() {
@@ -70,7 +69,8 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
70
69
  }
71
70
  }
72
71
  // start periodic data recording (events, impressions, telemetry).
73
- submitter && submitter.start();
72
+ if (submitter)
73
+ submitter.start();
74
74
  running = true;
75
75
  },
76
76
  /**
@@ -1,4 +1,5 @@
1
- import { isObject, shallowClone, isString, isFiniteNumber, isBoolean } from '../lang';
1
+ import { isObject, isString, isFiniteNumber, isBoolean } from '../lang';
2
+ import { objectAssign } from '../lang/objectAssign';
2
3
  import { ERROR_NOT_PLAIN_OBJECT, ERROR_SIZE_EXCEEDED, WARN_SETTING_NULL, WARN_TRIMMING_PROPERTIES } from '../../logger/constants';
3
4
  var ECMA_SIZES = {
4
5
  NULL: 0,
@@ -17,7 +18,8 @@ export function validateEventProperties(log, maybeProperties, method) {
17
18
  return { properties: false, size: BASE_EVENT_SIZE };
18
19
  }
19
20
  var keys = Object.keys(maybeProperties);
20
- var clone = shallowClone(maybeProperties);
21
+ // Shallow clone
22
+ var clone = objectAssign({}, maybeProperties);
21
23
  // To avoid calculating the size twice we'll return it from here.
22
24
  var output = {
23
25
  properties: clone,
@@ -35,7 +35,8 @@ export function validateKey(log, maybeKey, method) {
35
35
  var bucketingKey = validateKeyValue(log, maybeKey.bucketingKey, method, 'bucketingKey');
36
36
  if (matchingKey && bucketingKey)
37
37
  return {
38
- matchingKey: matchingKey, bucketingKey: bucketingKey
38
+ matchingKey: matchingKey,
39
+ bucketingKey: bucketingKey
39
40
  };
40
41
  log.error(ERROR_INVALID_KEY_OBJECT, [method]);
41
42
  return false;
@@ -1,4 +1,4 @@
1
- import { __spreadArrays } from "tslib";
1
+ import { __spreadArray } from "tslib";
2
2
  /**
3
3
  * Checks if the target string ends with the sub string.
4
4
  */
@@ -179,21 +179,10 @@ export function merge(target, source) {
179
179
  });
180
180
  if (rest && rest.length) {
181
181
  var nextSource = rest.splice(0, 1)[0];
182
- res = merge.apply(void 0, __spreadArrays([res, nextSource], rest));
182
+ res = merge.apply(void 0, __spreadArray([res, nextSource], rest, false));
183
183
  }
184
184
  return res;
185
185
  }
186
- /**
187
- * Shallow clone an object
188
- */
189
- export function shallowClone(obj) {
190
- var keys = Object.keys(obj);
191
- var output = {};
192
- for (var i = 0; i < keys.length; i++) {
193
- output[keys[i]] = obj[keys[i]];
194
- }
195
- return output;
196
- }
197
186
  /**
198
187
  * Checks if the target string starts with the sub string.
199
188
  */
@@ -0,0 +1,39 @@
1
+ // Deprecated hashing function, used for split bucketing. Replaced by murmur3
2
+ //
3
+ // JAVA reference implementation for the hashing function.
4
+ //
5
+ // int h = 0;
6
+ // for (int i = 0; i < key.length(); i++) {
7
+ // h = 31 * h + key.charAt(i);
8
+ // }
9
+ // return h ^ seed; // XOR the hash and seed
10
+ //
11
+ function ToInteger(x) {
12
+ x = Number(x);
13
+ return x < 0 ? Math.ceil(x) : Math.floor(x);
14
+ }
15
+ function modulo(a, b) {
16
+ return a - Math.floor(a / b) * b;
17
+ }
18
+ function ToUint32(x) {
19
+ return modulo(ToInteger(x), Math.pow(2, 32));
20
+ }
21
+ function ToInt32(x) {
22
+ var uint32 = ToUint32(x);
23
+ if (uint32 >= Math.pow(2, 31)) {
24
+ return uint32 - Math.pow(2, 32);
25
+ }
26
+ else {
27
+ return uint32;
28
+ }
29
+ }
30
+ export function hash(str, seed) {
31
+ var h = 0;
32
+ for (var i = 0; i < str.length; i++) {
33
+ h = ToInt32(ToInt32(31 * h) + str.charCodeAt(i));
34
+ }
35
+ return ToInt32(h ^ seed);
36
+ }
37
+ export function bucket(str, seed) {
38
+ return Math.abs(hash(str, seed) % 100) + 1;
39
+ }
@@ -3,7 +3,7 @@ export function timeout(ms, promise) {
3
3
  return promise;
4
4
  return new Promise(function (resolve, reject) {
5
5
  var tid = setTimeout(function () {
6
- reject(new Error("Operation timed out because it exceeded the configured time limit of " + ms + "ms."));
6
+ reject(new Error("Operation timed out because it exceeded the configured time limit of " + ms + " ms."));
7
7
  }, ms);
8
8
  promise.then(function (res) {
9
9
  clearTimeout(tid);
@@ -64,10 +64,6 @@ var base = {
64
64
  impressionsMode: OPTIMIZED,
65
65
  localhostMode: undefined
66
66
  },
67
- runtime: {
68
- ip: false,
69
- hostname: false
70
- },
71
67
  // Logger
72
68
  log: undefined
73
69
  };
@@ -114,8 +110,7 @@ export function settingsValidation(config, validationParams) {
114
110
  }
115
111
  // Current ip/hostname information
116
112
  // @ts-ignore, modify readonly prop
117
- if (runtime)
118
- withDefaults.runtime = runtime(withDefaults);
113
+ withDefaults.runtime = runtime(withDefaults);
119
114
  // ensure a valid list of integrations.
120
115
  // `integrations` returns an array of valid integration items.
121
116
  // @ts-ignore, modify readonly prop
@@ -0,0 +1,6 @@
1
+ export function validateRuntime() {
2
+ return {
3
+ ip: false,
4
+ hostname: false
5
+ };
6
+ }
@@ -0,0 +1,17 @@
1
+ import osFunction from 'os';
2
+ import ipFunction from 'ip';
3
+ import { UNKNOWN, NA, CONSUMER_MODE } from '../../constants';
4
+ export function validateRuntime(settings) {
5
+ var isIPAddressesEnabled = settings.core.IPAddressesEnabled === true;
6
+ var isConsumerMode = settings.mode === CONSUMER_MODE;
7
+ // If the values are not available, default to false (for standalone) or "unknown" (for consumer mode, to be used on Redis keys)
8
+ var ip = ipFunction.address() || (isConsumerMode ? UNKNOWN : false);
9
+ var hostname = osFunction.hostname() || (isConsumerMode ? UNKNOWN : false);
10
+ if (!isIPAddressesEnabled) { // If IPAddresses setting is not enabled, set as false (for standalone) or "NA" (for consumer mode, to be used on Redis keys)
11
+ ip = hostname = isConsumerMode ? NA : false;
12
+ }
13
+ return {
14
+ ip: ip,
15
+ hostname: hostname
16
+ };
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "1.2.0",
3
+ "version": "1.2.1-rc.3",
4
4
  "description": "Split Javascript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -20,8 +20,8 @@
20
20
  "check:lint": "eslint src --ext .js,.ts",
21
21
  "check:types": "tsc --noEmit",
22
22
  "build": "npm run build:cjs && npm run build:esm",
23
- "build:esm": "rimraf esm && tsc -m es2015 --outDir esm -d true --declarationDir types --importHelpers",
24
- "build:cjs": "rimraf cjs && tsc -m CommonJS --outDir cjs --importHelpers",
23
+ "build:esm": "rimraf esm && tsc -m es2015 --outDir esm -d true --declarationDir types",
24
+ "build:cjs": "rimraf cjs && tsc -m CommonJS --outDir cjs",
25
25
  "test": "jest",
26
26
  "test:coverage": "jest --coverage",
27
27
  "publish:rc": "npm run check && npm run test && npm run build && npm publish --tag rc",
@@ -44,11 +44,12 @@
44
44
  "bugs": "https://github.com/splitio/javascript-commons/issues",
45
45
  "homepage": "https://github.com/splitio/javascript-commons#readme",
46
46
  "dependencies": {
47
- "tslib": "^2.1.0"
47
+ "tslib": "^2.3.1"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/google.analytics": "0.0.40",
51
51
  "@types/ioredis": "^4.28.0",
52
+ "@types/ip": "^1.1.0",
52
53
  "@types/jest": "^27.0.0",
53
54
  "@types/lodash": "^4.14.162",
54
55
  "@typescript-eslint/eslint-plugin": "^4.2.0",
@@ -58,17 +59,17 @@
58
59
  "eslint": "^7.32.0",
59
60
  "eslint-plugin-compat": "3.7.0",
60
61
  "eslint-plugin-import": "^2.25.3",
61
- "fetch-mock": "^9.10.7",
62
+ "fetch-mock": "^9.11.0",
62
63
  "ioredis": "^4.28.0",
63
64
  "jest": "^27.2.3",
64
65
  "jest-localstorage-mock": "^2.4.3",
65
66
  "js-yaml": "^3.14.0",
66
67
  "lodash": "^4.17.21",
67
- "node-fetch": "^2.6.1",
68
+ "node-fetch": "^2.6.7",
68
69
  "redis-server": "1.2.2",
69
70
  "rimraf": "^3.0.2",
70
71
  "ts-jest": "^27.0.5",
71
- "typescript": "^4.0.2"
72
+ "typescript": "4.4.4"
72
73
  },
73
74
  "sideEffects": false
74
75
  }
@@ -1,13 +1,13 @@
1
1
  import { ENGINE_MATCHER_ENDS_WITH } from '../../logger/constants';
2
2
  import { ILogger } from '../../logger/types';
3
- import { endsWith as strEndsWith } from '../../utils/lang';
3
+ import { endsWith } from '../../utils/lang';
4
4
 
5
5
  export function endsWithMatcherContext(log: ILogger, ruleAttr: string[]) /*: Function */ {
6
6
  return function endsWithMatcher(runtimeAttr: string): boolean {
7
- let endsWith = ruleAttr.some(e => strEndsWith(runtimeAttr, e));
7
+ let strEndsWith = ruleAttr.some(e => endsWith(runtimeAttr, e));
8
8
 
9
- log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, endsWith]);
9
+ log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, strEndsWith]);
10
10
 
11
- return endsWith;
11
+ return strEndsWith;
12
12
  };
13
13
  }
@@ -1,11 +1,14 @@
1
- import { IIntegrationFactoryParams } from '../types';
1
+ import { IIntegrationFactoryParams, IntegrationFactory } from '../types';
2
2
  import { GaToSplit } from './GaToSplit';
3
3
  import { GoogleAnalyticsToSplitOptions } from './types';
4
4
 
5
- export function GoogleAnalyticsToSplit(options: GoogleAnalyticsToSplitOptions) {
5
+ export function GoogleAnalyticsToSplit(options: GoogleAnalyticsToSplitOptions): IntegrationFactory {
6
6
 
7
7
  // GaToSplit integration factory
8
- return (params: IIntegrationFactoryParams) => {
8
+ function GoogleAnalyticsToSplitFactory(params: IIntegrationFactoryParams) {
9
9
  return GaToSplit(options, params);
10
- };
10
+ }
11
+
12
+ GoogleAnalyticsToSplitFactory.type = 'GOOGLE_ANALYTICS_TO_SPLIT';
13
+ return GoogleAnalyticsToSplitFactory;
11
14
  }
@@ -1,11 +1,14 @@
1
- import { IIntegrationFactoryParams } from '../types';
1
+ import { IIntegrationFactoryParams, IntegrationFactory } from '../types';
2
2
  import { SplitToGa } from './SplitToGa';
3
3
  import { SplitToGoogleAnalyticsOptions } from './types';
4
4
 
5
- export function SplitToGoogleAnalytics(options: SplitToGoogleAnalyticsOptions = {}) {
5
+ export function SplitToGoogleAnalytics(options: SplitToGoogleAnalyticsOptions = {}): IntegrationFactory {
6
6
 
7
7
  // SplitToGa integration factory
8
- return (params: IIntegrationFactoryParams) => {
8
+ function SplitToGoogleAnalyticsFactory(params: IIntegrationFactoryParams) {
9
9
  return new SplitToGa(params.settings.log, options);
10
- };
10
+ }
11
+
12
+ SplitToGoogleAnalyticsFactory.type = 'SPLIT_TO_GOOGLE_ANALYTICS';
13
+ return SplitToGoogleAnalyticsFactory;
11
14
  }
@@ -12,3 +12,8 @@ export interface IIntegrationFactoryParams {
12
12
  storage: { events: IEventsCacheBase }
13
13
  settings: ISettings
14
14
  }
15
+
16
+ export type IntegrationFactory = {
17
+ readonly type: string
18
+ (params: IIntegrationFactoryParams): IIntegration | void
19
+ }
Binary file
@@ -13,7 +13,7 @@ export const codesError: [number, string][] = [
13
13
  [c.ERROR_SYNC_OFFLINE_LOADING, c.LOG_PREFIX_SYNC_OFFLINE + 'There was an issue loading the mock Splits data, no changes will be applied to the current cache. %s'],
14
14
  [c.ERROR_STREAMING_SSE, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to connect or error on streaming connection, with error message: %s'],
15
15
  [c.ERROR_STREAMING_AUTH, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to authenticate for streaming. Error: %s.'],
16
- [c.ERROR_HTTP, ' Response status is not OK. Status: %s. URL: %s. Message: %s'],
16
+ [c.ERROR_HTTP, 'Response status is not OK. Status: %s. URL: %s. Message: %s'],
17
17
  // client status
18
18
  [c.ERROR_CLIENT_LISTENER, 'A listener was added for %s on the SDK, which has already fired and won\'t be emitted again. The callback won\'t be executed.'],
19
19
  [c.ERROR_CLIENT_DESTROYED, '%s: Client has already been destroyed - no calls possible.'],
@@ -23,11 +23,11 @@ export const codesInfo: [number, string][] = codesWarn.concat([
23
23
  [c.SUBMITTERS_PUSH_FULL_EVENTS_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full events queue and reseting timer.'],
24
24
  [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s %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
- [c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect in %s seconds.'],
27
- [c.STREAMING_CONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Connecting to streaming.'],
26
+ [c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
27
+ [c.STREAMING_CONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Connecting streaming.'],
28
28
  [c.STREAMING_DISABLED, c.LOG_PREFIX_SYNC_STREAMING + 'Streaming is disabled for given Api key. Switching to polling mode.'],
29
- [c.STREAMING_DISCONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Disconnecting from streaming.'],
29
+ [c.STREAMING_DISCONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Disconnecting streaming.'],
30
30
  [c.SYNC_START_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming not available. Starting polling.'],
31
31
  [c.SYNC_CONTINUE_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming couldn\'t connect. Continue polling.'],
32
- [c.SYNC_STOP_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming (re)connected. Syncing and stopping polling.'],
32
+ [c.SYNC_STOP_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming connected. Syncing and stopping polling.'],
33
33
  ]);
@@ -9,11 +9,15 @@ export interface ILoggerOptions {
9
9
  export interface ILogger {
10
10
  setLogLevel(logLevel: LogLevel): void
11
11
 
12
+ debug(msg: any): void
12
13
  debug(msg: string | number, args?: any[]): void
13
14
 
15
+ info(msg: any): void
14
16
  info(msg: string | number, args?: any[]): void
15
17
 
18
+ warn(msg: any): void
16
19
  warn(msg: string | number, args?: any[]): void
17
20
 
21
+ error(msg: any): void
18
22
  error(msg: string | number, args?: any[]): void
19
23
  }
@@ -123,6 +123,7 @@ export function clientFactory(params: IClientFactoryParams): SplitIO.IClient | S
123
123
  getTreatmentWithConfig,
124
124
  getTreatments,
125
125
  getTreatmentsWithConfig,
126
- track
126
+ track,
127
+ isBrowserClient: false
127
128
  } as SplitIO.IClient | SplitIO.IAsyncClient;
128
129
  }
@@ -23,6 +23,8 @@ export function clientCSDecorator(log: ILogger, client: SplitIO.IClient, key: Sp
23
23
  getTreatmentsWithConfig: clientCS.getTreatmentsWithConfig.bind(clientCS, key),
24
24
 
25
25
  // Key is bound to the `track` method. Same thing happens with trafficType but only if provided
26
- track: trafficType ? clientCS.track.bind(clientCS, key, trafficType) : clientCS.track.bind(clientCS, key)
26
+ track: trafficType ? clientCS.track.bind(clientCS, key, trafficType) : clientCS.track.bind(clientCS, key),
27
+
28
+ isBrowserClient: true
27
29
  }) as SplitIO.ICsClient;
28
30
  }
@@ -49,7 +49,7 @@ export function splitHttpClientFactory(settings: Pick<ISettings, 'log' | 'versio
49
49
  return response;
50
50
  })
51
51
  .catch(error => {
52
- const resp = error.response;
52
+ const resp = error && error.response;
53
53
  let msg = '';
54
54
 
55
55
  if (resp) { // An HTTP error
@@ -443,7 +443,7 @@ export interface IStorageFactoryParams {
443
443
  export type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'PLUGGABLE';
444
444
 
445
445
  export type IStorageSyncFactory = {
446
- type: StorageType,
446
+ readonly type: StorageType,
447
447
  (params: IStorageFactoryParams): IStorageSync
448
448
  }
449
449
 
@@ -82,7 +82,7 @@ export function splitsParserFromFileFactory(): ISplitsParser {
82
82
  try {
83
83
  data = fs.readFileSync(filePath, 'utf-8');
84
84
  } catch (e) {
85
- log.error(e.message);
85
+ log.error(e && (e as Error).message);
86
86
 
87
87
  return {};
88
88
  }
@@ -6,9 +6,10 @@ import { IMySegmentsFetcher } from './types';
6
6
  * Factory of MySegments fetcher.
7
7
  * MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
8
8
  */
9
- export function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments, userMatchingKey: string): IMySegmentsFetcher {
9
+ export function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments): IMySegmentsFetcher {
10
10
 
11
11
  return function mySegmentsFetcher(
12
+ userMatchingKey: string,
12
13
  noCache?: boolean,
13
14
  // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
14
15
  decorator?: (promise: Promise<IResponse>) => Promise<IResponse>
@@ -15,6 +15,7 @@ export type ISegmentChangesFetcher = (
15
15
  ) => Promise<ISegmentChangesResponse[]>
16
16
 
17
17
  export type IMySegmentsFetcher = (
18
+ userMatchingKey: string,
18
19
  noCache?: boolean,
19
20
  decorator?: (promise: Promise<IResponse>) => Promise<IResponse>
20
21
  ) => Promise<string[]>
@@ -1,26 +1,23 @@
1
1
  import { ISegmentsSyncTask, ISplitsSyncTask, IPollingManagerCS } from './types';
2
2
  import { forOwn } from '../../utils/lang';
3
3
  import { IReadinessManager } from '../../readiness/types';
4
- import { ISplitApi } from '../../services/types';
5
4
  import { IStorageSync } from '../../storages/types';
6
5
  import { mySegmentsSyncTaskFactory } from './syncTasks/mySegmentsSyncTask';
7
6
  import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
8
- import { ISettings } from '../../types';
9
7
  import { getMatching } from '../../utils/key';
10
8
  import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../readiness/constants';
11
9
  import { POLLING_SMART_PAUSING, POLLING_START, POLLING_STOP } from '../../logger/constants';
10
+ import { ISyncManagerFactoryParams } from '../types';
12
11
 
13
12
  /**
14
13
  * Expose start / stop mechanism for polling data from services.
15
14
  * For client-side API with multiple clients.
16
15
  */
17
16
  export function pollingManagerCSFactory(
18
- splitApi: ISplitApi,
19
- storage: IStorageSync,
20
- readiness: IReadinessManager,
21
- settings: ISettings,
17
+ params: ISyncManagerFactoryParams
22
18
  ): IPollingManagerCS {
23
19
 
20
+ const { splitApi, storage, readiness, settings } = params;
24
21
  const log = settings.log;
25
22
 
26
23
  const splitsSyncTask: ISplitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
@@ -1,23 +1,18 @@
1
1
  import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
2
2
  import { segmentsSyncTaskFactory } from './syncTasks/segmentsSyncTask';
3
- import { IStorageSync } from '../../storages/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
- import { ISplitApi } from '../../services/types';
6
- import { ISettings } from '../../types';
7
3
  import { IPollingManager, ISegmentsSyncTask, ISplitsSyncTask } from './types';
8
4
  import { thenable } from '../../utils/promise/thenable';
9
5
  import { POLLING_START, POLLING_STOP, LOG_PREFIX_SYNC_POLLING } from '../../logger/constants';
6
+ import { ISyncManagerFactoryParams } from '../types';
10
7
 
11
8
  /**
12
9
  * Expose start / stop mechanism for pulling data from services.
13
10
  */
14
11
  export function pollingManagerSSFactory(
15
- splitApi: ISplitApi,
16
- storage: IStorageSync,
17
- readiness: IReadinessManager,
18
- settings: ISettings
12
+ params: ISyncManagerFactoryParams
19
13
  ): IPollingManager {
20
14
 
15
+ const { splitApi, storage, readiness, settings } = params;
21
16
  const log = settings.log;
22
17
 
23
18
  const splitsSyncTask: ISplitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);