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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/CHANGES.txt +28 -28
  2. package/LICENSE +1 -1
  3. package/README.md +4 -3
  4. package/cjs/consent/sdkUserConsent.js +4 -2
  5. package/cjs/evaluator/matchers/index.js +1 -3
  6. package/cjs/evaluator/matchers/matcherTypes.js +0 -1
  7. package/cjs/evaluator/matchers/segment.js +0 -6
  8. package/cjs/evaluator/matchersTransform/index.js +1 -4
  9. package/cjs/evaluator/matchersTransform/segment.js +1 -3
  10. package/cjs/logger/constants.js +2 -2
  11. package/cjs/logger/messages/info.js +1 -1
  12. package/cjs/logger/messages/warn.js +1 -1
  13. package/cjs/readiness/readinessManager.js +11 -12
  14. package/cjs/readiness/sdkReadinessManager.js +6 -5
  15. package/cjs/sdkClient/sdkClient.js +5 -5
  16. package/cjs/sdkClient/sdkClientMethod.js +1 -3
  17. package/cjs/sdkClient/sdkClientMethodCS.js +17 -15
  18. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +17 -15
  19. package/cjs/sdkFactory/index.js +11 -38
  20. package/cjs/services/decorateHeaders.js +6 -1
  21. package/cjs/services/splitApi.js +5 -5
  22. package/cjs/services/splitHttpClient.js +5 -2
  23. package/cjs/storages/AbstractSegmentsCacheSync.js +12 -41
  24. package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
  25. package/cjs/storages/AbstractSplitsCacheSync.js +8 -2
  26. package/cjs/storages/KeyBuilderCS.js +5 -23
  27. package/cjs/storages/dataLoader.js +33 -65
  28. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
  29. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
  30. package/cjs/storages/inLocalStorage/index.js +3 -12
  31. package/cjs/storages/inMemory/InMemoryStorageCS.js +3 -20
  32. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
  33. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  34. package/cjs/storages/inMemory/SplitsCacheInMemory.js +8 -8
  35. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  36. package/cjs/storages/inRedis/RedisAdapter.js +1 -1
  37. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +2 -2
  38. package/cjs/storages/inRedis/index.js +11 -5
  39. package/cjs/storages/pluggable/SegmentsCachePluggable.js +2 -2
  40. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  41. package/cjs/storages/pluggable/index.js +32 -37
  42. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
  43. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  44. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  45. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  46. package/cjs/sync/polling/pollingManagerSS.js +3 -3
  47. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  48. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  49. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  50. package/cjs/sync/polling/updaters/splitChangesUpdater.js +11 -2
  51. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  52. package/cjs/sync/streaming/SSEHandler/index.js +5 -3
  53. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
  54. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  55. package/cjs/sync/streaming/constants.js +3 -3
  56. package/cjs/sync/streaming/parseUtils.js +9 -14
  57. package/cjs/sync/streaming/pushManager.js +67 -69
  58. package/cjs/sync/syncTask.js +2 -2
  59. package/cjs/trackers/eventTracker.js +9 -11
  60. package/cjs/trackers/impressionsTracker.js +13 -15
  61. package/cjs/trackers/uniqueKeysTracker.js +3 -5
  62. package/cjs/utils/constants/index.js +4 -5
  63. package/cjs/utils/settingsValidation/index.js +1 -2
  64. package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
  65. package/esm/consent/sdkUserConsent.js +4 -2
  66. package/esm/evaluator/matchers/index.js +1 -3
  67. package/esm/evaluator/matchers/matcherTypes.js +0 -1
  68. package/esm/evaluator/matchers/segment.js +0 -6
  69. package/esm/evaluator/matchersTransform/index.js +1 -4
  70. package/esm/evaluator/matchersTransform/segment.js +1 -3
  71. package/esm/logger/constants.js +1 -1
  72. package/esm/logger/messages/info.js +1 -1
  73. package/esm/logger/messages/warn.js +1 -1
  74. package/esm/readiness/readinessManager.js +11 -12
  75. package/esm/readiness/sdkReadinessManager.js +6 -5
  76. package/esm/sdkClient/sdkClient.js +5 -5
  77. package/esm/sdkClient/sdkClientMethod.js +1 -3
  78. package/esm/sdkClient/sdkClientMethodCS.js +15 -13
  79. package/esm/sdkClient/sdkClientMethodCSWithTT.js +15 -13
  80. package/esm/sdkFactory/index.js +12 -39
  81. package/esm/services/decorateHeaders.js +4 -0
  82. package/esm/services/splitApi.js +6 -6
  83. package/esm/services/splitHttpClient.js +6 -3
  84. package/esm/storages/AbstractSegmentsCacheSync.js +12 -41
  85. package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
  86. package/esm/storages/AbstractSplitsCacheSync.js +9 -3
  87. package/esm/storages/KeyBuilderCS.js +4 -21
  88. package/esm/storages/dataLoader.js +31 -62
  89. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
  90. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
  91. package/esm/storages/inLocalStorage/index.js +5 -14
  92. package/esm/storages/inMemory/InMemoryStorageCS.js +3 -20
  93. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
  94. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  95. package/esm/storages/inMemory/SplitsCacheInMemory.js +8 -8
  96. package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  97. package/esm/storages/inRedis/RedisAdapter.js +1 -1
  98. package/esm/storages/inRedis/SegmentsCacheInRedis.js +2 -2
  99. package/esm/storages/inRedis/index.js +11 -5
  100. package/esm/storages/pluggable/SegmentsCachePluggable.js +2 -2
  101. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  102. package/esm/storages/pluggable/index.js +32 -37
  103. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
  104. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  105. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  106. package/esm/sync/polling/pollingManagerCS.js +1 -1
  107. package/esm/sync/polling/pollingManagerSS.js +3 -3
  108. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  109. package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  110. package/esm/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  111. package/esm/sync/polling/updaters/splitChangesUpdater.js +12 -3
  112. package/esm/sync/streaming/AuthClient/index.js +1 -1
  113. package/esm/sync/streaming/SSEHandler/index.js +6 -4
  114. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
  115. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  116. package/esm/sync/streaming/constants.js +2 -2
  117. package/esm/sync/streaming/parseUtils.js +8 -12
  118. package/esm/sync/streaming/pushManager.js +70 -72
  119. package/esm/sync/syncTask.js +2 -2
  120. package/esm/trackers/eventTracker.js +9 -11
  121. package/esm/trackers/impressionsTracker.js +13 -15
  122. package/esm/trackers/uniqueKeysTracker.js +3 -5
  123. package/esm/utils/constants/index.js +2 -3
  124. package/esm/utils/settingsValidation/index.js +1 -2
  125. package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
  126. package/package.json +1 -1
  127. package/src/consent/sdkUserConsent.ts +3 -2
  128. package/src/dtos/types.ts +7 -21
  129. package/src/evaluator/matchers/index.ts +0 -2
  130. package/src/evaluator/matchers/matcherTypes.ts +0 -1
  131. package/src/evaluator/matchers/segment.ts +0 -7
  132. package/src/evaluator/matchersTransform/index.ts +1 -4
  133. package/src/evaluator/matchersTransform/segment.ts +3 -5
  134. package/src/logger/constants.ts +1 -1
  135. package/src/logger/messages/info.ts +1 -1
  136. package/src/logger/messages/warn.ts +1 -1
  137. package/src/readiness/readinessManager.ts +12 -16
  138. package/src/readiness/sdkReadinessManager.ts +7 -7
  139. package/src/readiness/types.ts +2 -3
  140. package/src/sdkClient/sdkClient.ts +5 -5
  141. package/src/sdkClient/sdkClientMethod.ts +1 -4
  142. package/src/sdkClient/sdkClientMethodCS.ts +14 -11
  143. package/src/sdkClient/sdkClientMethodCSWithTT.ts +14 -11
  144. package/src/sdkFactory/index.ts +13 -42
  145. package/src/sdkFactory/types.ts +1 -5
  146. package/src/services/decorateHeaders.ts +5 -0
  147. package/src/services/splitApi.ts +7 -7
  148. package/src/services/splitHttpClient.ts +7 -4
  149. package/src/services/types.ts +2 -2
  150. package/src/storages/AbstractSegmentsCacheSync.ts +12 -53
  151. package/src/storages/AbstractSplitsCacheAsync.ts +8 -0
  152. package/src/storages/AbstractSplitsCacheSync.ts +11 -4
  153. package/src/storages/KeyBuilderCS.ts +5 -34
  154. package/src/storages/dataLoader.ts +33 -63
  155. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +59 -29
  156. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +10 -1
  157. package/src/storages/inLocalStorage/index.ts +6 -16
  158. package/src/storages/inMemory/InMemoryStorageCS.ts +3 -23
  159. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +44 -10
  160. package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
  161. package/src/storages/inMemory/SplitsCacheInMemory.ts +8 -7
  162. package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
  163. package/src/storages/inRedis/RedisAdapter.ts +1 -1
  164. package/src/storages/inRedis/SegmentsCacheInRedis.ts +2 -2
  165. package/src/storages/inRedis/index.ts +12 -6
  166. package/src/storages/pluggable/SegmentsCachePluggable.ts +2 -2
  167. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  168. package/src/storages/pluggable/index.ts +33 -38
  169. package/src/storages/types.ts +15 -15
  170. package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
  171. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
  172. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  173. package/src/sync/polling/fetchers/types.ts +2 -3
  174. package/src/sync/polling/pollingManagerCS.ts +4 -4
  175. package/src/sync/polling/pollingManagerSS.ts +2 -3
  176. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
  177. package/src/sync/polling/types.ts +6 -7
  178. package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
  179. package/src/sync/polling/updaters/segmentChangesUpdater.ts +2 -2
  180. package/src/sync/polling/updaters/splitChangesUpdater.ts +12 -4
  181. package/src/sync/streaming/AuthClient/index.ts +1 -1
  182. package/src/sync/streaming/SSEClient/index.ts +6 -4
  183. package/src/sync/streaming/SSEHandler/index.ts +8 -5
  184. package/src/sync/streaming/SSEHandler/types.ts +15 -15
  185. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
  186. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
  187. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  188. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  189. package/src/sync/streaming/constants.ts +2 -2
  190. package/src/sync/streaming/parseUtils.ts +11 -19
  191. package/src/sync/streaming/pushManager.ts +72 -73
  192. package/src/sync/streaming/types.ts +10 -10
  193. package/src/sync/submitters/types.ts +5 -8
  194. package/src/sync/syncTask.ts +2 -2
  195. package/src/trackers/eventTracker.ts +7 -10
  196. package/src/trackers/impressionsTracker.ts +9 -12
  197. package/src/trackers/types.ts +0 -1
  198. package/src/trackers/uniqueKeysTracker.ts +4 -6
  199. package/src/types.ts +9 -16
  200. package/src/utils/constants/index.ts +2 -3
  201. package/src/utils/settingsValidation/index.ts +2 -3
  202. package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
  203. package/src/utils/settingsValidation/types.ts +1 -1
  204. package/types/dtos/types.d.ts +7 -18
  205. package/types/evaluator/matchersTransform/segment.d.ts +2 -2
  206. package/types/logger/constants.d.ts +1 -1
  207. package/types/readiness/readinessManager.d.ts +2 -2
  208. package/types/readiness/sdkReadinessManager.d.ts +3 -2
  209. package/types/readiness/types.d.ts +2 -3
  210. package/types/sdkClient/sdkClientMethod.d.ts +1 -1
  211. package/types/sdkFactory/types.d.ts +1 -4
  212. package/types/services/decorateHeaders.d.ts +1 -0
  213. package/types/services/splitApi.d.ts +1 -1
  214. package/types/services/splitHttpClient.d.ts +1 -1
  215. package/types/services/types.d.ts +2 -2
  216. package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
  217. package/types/storages/AbstractSplitsCacheAsync.d.ts +5 -0
  218. package/types/storages/AbstractSplitsCacheSync.d.ts +6 -1
  219. package/types/storages/KeyBuilderCS.d.ts +2 -9
  220. package/types/storages/dataLoader.d.ts +6 -17
  221. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +14 -4
  222. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +6 -0
  223. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +9 -3
  224. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +1 -1
  225. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -1
  226. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
  227. package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +1 -1
  228. package/types/storages/inRedis/index.d.ts +1 -1
  229. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +1 -1
  230. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  231. package/types/storages/types.d.ts +11 -11
  232. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  233. package/types/sync/polling/fetchers/types.d.ts +2 -2
  234. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
  235. package/types/sync/polling/types.d.ts +4 -7
  236. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
  237. package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
  238. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
  239. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
  240. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
  241. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  242. package/types/sync/streaming/constants.d.ts +2 -2
  243. package/types/sync/streaming/parseUtils.d.ts +5 -4
  244. package/types/sync/streaming/types.d.ts +8 -8
  245. package/types/sync/submitters/types.d.ts +4 -7
  246. package/types/trackers/eventTracker.d.ts +1 -1
  247. package/types/trackers/impressionsTracker.d.ts +1 -1
  248. package/types/trackers/types.d.ts +0 -1
  249. package/types/types.d.ts +9 -15
  250. package/types/utils/constants/index.d.ts +2 -3
  251. package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
  252. package/types/utils/settingsValidation/types.d.ts +1 -1
  253. package/cjs/evaluator/matchers/large_segment.js +0 -16
  254. package/cjs/sdkClient/identity.js +0 -7
  255. package/esm/evaluator/matchers/large_segment.js +0 -12
  256. package/esm/sdkClient/identity.js +0 -3
  257. package/src/evaluator/matchers/large_segment.ts +0 -18
  258. package/src/sdkClient/identity.ts +0 -5
  259. package/types/evaluator/matchers/large_segment.d.ts +0 -5
  260. package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
  261. package/types/evaluator/matchersTransform/set.d.ts +0 -5
  262. package/types/evaluator/matchersTransform/string.d.ts +0 -7
  263. package/types/sdkClient/identity.d.ts +0 -2
  264. package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
  265. package/types/storages/AbstractSplitsCache.d.ts +0 -46
  266. package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
  267. package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
  268. package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
  269. package/types/trackers/impressionObserver/utils.d.ts +0 -5
  270. package/types/utils/inputValidation/sdkKey.d.ts +0 -7
  271. package/types/utils/inputValidation/splitExistance.d.ts +0 -7
  272. package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
  273. package/types/utils/redis/RedisMock.d.ts +0 -4
  274. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
  275. /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
@@ -7,7 +7,7 @@ import { syncTaskFactory } from '../../syncTask';
7
7
  import { ISyncTask } from '../../types';
8
8
  import { ISettings } from '../../../types';
9
9
  import { CONTROL } from '../../../utils/constants';
10
- import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
10
+ import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
11
11
  import { SYNC_OFFLINE_DATA, ERROR_SYNC_OFFLINE_LOADING } from '../../../logger/constants';
12
12
 
13
13
  /**
@@ -60,8 +60,12 @@ export function fromObjectUpdaterFactory(
60
60
 
61
61
  if (startingUp) {
62
62
  startingUp = false;
63
- // Emits SDK_READY
64
- readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
63
+ Promise.resolve(splitsCache.checkCache()).then(cacheReady => {
64
+ // Emits SDK_READY_FROM_CACHE
65
+ if (cacheReady) readiness.splits.emit(SDK_SPLITS_CACHE_LOADED);
66
+ // Emits SDK_READY
67
+ readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
68
+ });
65
69
  }
66
70
  return true;
67
71
  });
@@ -1,25 +1,27 @@
1
- import { IFetchMemberships, IResponse } from '../../../services/types';
2
- import { IMembershipsResponse } from '../../../dtos/types';
1
+ import { IFetchMySegments, IResponse } from '../../../services/types';
2
+ import { IMySegmentsResponseItem } from '../../../dtos/types';
3
3
  import { IMySegmentsFetcher } from './types';
4
4
 
5
5
  /**
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(fetchMemberships: IFetchMemberships): IMySegmentsFetcher {
9
+ export function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments): IMySegmentsFetcher {
10
10
 
11
11
  return function mySegmentsFetcher(
12
12
  userMatchingKey: string,
13
13
  noCache?: boolean,
14
- till?: number,
15
- // Optional decorator for `fetchMemberships` promise, such as timeout or time tracker
14
+ // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
16
15
  decorator?: (promise: Promise<IResponse>) => Promise<IResponse>
17
- ): Promise<IMembershipsResponse> {
16
+ ): Promise<string[]> {
18
17
 
19
- let mySegmentsPromise = fetchMemberships(userMatchingKey, noCache, till);
18
+ let mySegmentsPromise = fetchMySegments(userMatchingKey, noCache);
20
19
  if (decorator) mySegmentsPromise = decorator(mySegmentsPromise);
21
20
 
22
- return mySegmentsPromise.then(resp => resp.json());
21
+ // Extract segment names
22
+ return mySegmentsPromise
23
+ .then(resp => resp.json())
24
+ .then(json => json.mySegments.map((segment: IMySegmentsResponseItem) => segment.name));
23
25
  };
24
26
 
25
27
  }
@@ -28,7 +28,7 @@ export function segmentChangesFetcherFactory(fetchSegmentChanges: IFetchSegmentC
28
28
  segmentName: string,
29
29
  noCache?: boolean,
30
30
  till?: number,
31
- // Optional decorator for `fetchSegmentChanges` promise, such as timeout or time tracker
31
+ // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
32
32
  decorator?: (promise: Promise<ISegmentChangesResponse[]>) => Promise<ISegmentChangesResponse[]>
33
33
  ): Promise<ISegmentChangesResponse[]> {
34
34
 
@@ -1,4 +1,4 @@
1
- import { ISplitChangesResponse, ISegmentChangesResponse, IMembershipsResponse } from '../../../dtos/types';
1
+ import { ISplitChangesResponse, ISegmentChangesResponse } from '../../../dtos/types';
2
2
  import { IResponse } from '../../../services/types';
3
3
 
4
4
  export type ISplitChangesFetcher = (
@@ -19,6 +19,5 @@ export type ISegmentChangesFetcher = (
19
19
  export type IMySegmentsFetcher = (
20
20
  userMatchingKey: string,
21
21
  noCache?: boolean,
22
- till?: number,
23
22
  decorator?: (promise: Promise<IResponse>) => Promise<IResponse>
24
- ) => Promise<IMembershipsResponse>
23
+ ) => Promise<string[]>
@@ -29,13 +29,13 @@ export function pollingManagerCSFactory(
29
29
  const mySegmentsSyncTask = add(matchingKey, readiness, storage);
30
30
 
31
31
  function startMySegmentsSyncTasks() {
32
- forOwn(mySegmentsSyncTasks, (mySegmentsSyncTask) => {
32
+ forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
33
33
  mySegmentsSyncTask.start();
34
34
  });
35
35
  }
36
36
 
37
37
  function stopMySegmentsSyncTasks() {
38
- forOwn(mySegmentsSyncTasks, (mySegmentsSyncTask) => {
38
+ forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
39
39
  if (mySegmentsSyncTask.isRunning()) mySegmentsSyncTask.stop();
40
40
  });
41
41
  }
@@ -55,7 +55,7 @@ export function pollingManagerCSFactory(
55
55
  });
56
56
 
57
57
  function add(matchingKey: string, readiness: IReadinessManager, storage: IStorageSync) {
58
- const mySegmentsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
58
+ const mySegmentsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMySegments, storage, readiness, settings, matchingKey);
59
59
 
60
60
  // smart ready
61
61
  function smartReady() {
@@ -94,7 +94,7 @@ export function pollingManagerCSFactory(
94
94
  // fetch splits and segments
95
95
  syncAll() {
96
96
  const promises = [splitsSyncTask.execute()];
97
- forOwn(mySegmentsSyncTasks, (mySegmentsSyncTask) => {
97
+ forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
98
98
  promises.push(mySegmentsSyncTask.execute());
99
99
  });
100
100
  return Promise.all(promises);
@@ -1,7 +1,6 @@
1
1
  import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
2
2
  import { segmentsSyncTaskFactory } from './syncTasks/segmentsSyncTask';
3
3
  import { IPollingManager, ISegmentsSyncTask, ISplitsSyncTask } from './types';
4
- import { thenable } from '../../utils/promise/thenable';
5
4
  import { POLLING_START, POLLING_STOP, LOG_PREFIX_SYNC_POLLING } from '../../logger/constants';
6
5
  import { ISdkFactoryContextSync } from '../../sdkFactory/types';
7
6
 
@@ -29,9 +28,9 @@ export function pollingManagerSSFactory(
29
28
  log.debug(LOG_PREFIX_SYNC_POLLING + `Segments will be refreshed each ${settings.scheduler.segmentsRefreshRate} millis`);
30
29
 
31
30
  const startingUp = splitsSyncTask.start();
32
- if (thenable(startingUp)) {
31
+ if (startingUp) {
33
32
  startingUp.then(() => {
34
- segmentsSyncTask.start();
33
+ if (splitsSyncTask.isRunning()) segmentsSyncTask.start();
35
34
  });
36
35
  }
37
36
  },
@@ -2,7 +2,7 @@ import { IStorageSync } from '../../../storages/types';
2
2
  import { IReadinessManager } from '../../../readiness/types';
3
3
  import { syncTaskFactory } from '../../syncTask';
4
4
  import { IMySegmentsSyncTask } from '../types';
5
- import { IFetchMemberships } from '../../../services/types';
5
+ import { IFetchMySegments } from '../../../services/types';
6
6
  import { mySegmentsFetcherFactory } from '../fetchers/mySegmentsFetcher';
7
7
  import { ISettings } from '../../../types';
8
8
  import { mySegmentsUpdaterFactory } from '../updaters/mySegmentsUpdater';
@@ -11,7 +11,7 @@ import { mySegmentsUpdaterFactory } from '../updaters/mySegmentsUpdater';
11
11
  * Creates a sync task that periodically executes a `mySegmentsUpdater` task
12
12
  */
13
13
  export function mySegmentsSyncTaskFactory(
14
- fetchMemberships: IFetchMemberships,
14
+ fetchMySegments: IFetchMySegments,
15
15
  storage: IStorageSync,
16
16
  readiness: IReadinessManager,
17
17
  settings: ISettings,
@@ -21,8 +21,9 @@ export function mySegmentsSyncTaskFactory(
21
21
  settings.log,
22
22
  mySegmentsUpdaterFactory(
23
23
  settings.log,
24
- mySegmentsFetcherFactory(fetchMemberships),
25
- storage,
24
+ mySegmentsFetcherFactory(fetchMySegments),
25
+ storage.splits,
26
+ storage.segments,
26
27
  readiness.segments,
27
28
  settings.startup.requestTimeoutBeforeReady,
28
29
  settings.startup.retriesOnFailureBeforeReady,
@@ -1,21 +1,20 @@
1
1
  import { ISplit } from '../../dtos/types';
2
2
  import { IReadinessManager } from '../../readiness/types';
3
3
  import { IStorageSync } from '../../storages/types';
4
- import { MEMBERSHIPS_LS_UPDATE, MEMBERSHIPS_MS_UPDATE } from '../streaming/types';
5
4
  import { ITask, ISyncTask } from '../types';
6
5
 
7
6
  export interface ISplitsSyncTask extends ISyncTask<[noCache?: boolean, till?: number, splitUpdateNotification?: { payload: ISplit, changeNumber: number }], boolean> { }
8
7
 
9
8
  export interface ISegmentsSyncTask extends ISyncTask<[fetchOnlyNew?: boolean, segmentName?: string, noCache?: boolean, till?: number], boolean> { }
10
9
 
11
- export type MySegmentsData = {
12
- type: MEMBERSHIPS_MS_UPDATE | MEMBERSHIPS_LS_UPDATE
13
- cn: number
14
- added: string[]
15
- removed: string[]
10
+ export type MySegmentsData = string[] | {
11
+ /* segment name */
12
+ name: string,
13
+ /* action: `true` for add, and `false` for delete */
14
+ add: boolean
16
15
  }
17
16
 
18
- export interface IMySegmentsSyncTask extends ISyncTask<[segmentsData?: MySegmentsData, noCache?: boolean, till?: number], boolean> { }
17
+ export interface IMySegmentsSyncTask extends ISyncTask<[segmentsData?: MySegmentsData, noCache?: boolean], boolean> { }
19
18
 
20
19
  export interface IPollingManager extends ITask {
21
20
  syncAll(): Promise<any>
@@ -1,15 +1,13 @@
1
1
  import { IMySegmentsFetcher } from '../fetchers/types';
2
- import { IStorageSync } from '../../../storages/types';
2
+ import { ISegmentsCacheSync, ISplitsCacheSync } from '../../../storages/types';
3
3
  import { ISegmentsEventEmitter } from '../../../readiness/types';
4
4
  import { timeout } from '../../../utils/promise/timeout';
5
5
  import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
6
6
  import { ILogger } from '../../../logger/types';
7
7
  import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
8
8
  import { MySegmentsData } from '../types';
9
- import { IMembershipsResponse } from '../../../dtos/types';
10
- import { MEMBERSHIPS_LS_UPDATE } from '../../streaming/constants';
11
9
 
12
- type IMySegmentsUpdater = (segmentsData?: MySegmentsData, noCache?: boolean, till?: number) => Promise<boolean>
10
+ type IMySegmentsUpdater = (segmentList?: string[], noCache?: boolean) => Promise<boolean>
13
11
 
14
12
  /**
15
13
  * factory of MySegments updater, a task that:
@@ -20,14 +18,14 @@ type IMySegmentsUpdater = (segmentsData?: MySegmentsData, noCache?: boolean, til
20
18
  export function mySegmentsUpdaterFactory(
21
19
  log: ILogger,
22
20
  mySegmentsFetcher: IMySegmentsFetcher,
23
- storage: IStorageSync,
21
+ splitsCache: ISplitsCacheSync,
22
+ mySegmentsCache: ISegmentsCacheSync,
24
23
  segmentsEventEmitter: ISegmentsEventEmitter,
25
24
  requestTimeoutBeforeReady: number,
26
25
  retriesOnFailureBeforeReady: number,
27
26
  matchingKey: string
28
27
  ): IMySegmentsUpdater {
29
28
 
30
- const { splits, segments, largeSegments } = storage;
31
29
  let readyOnAlreadyExistentState = true;
32
30
  let startingUp = true;
33
31
 
@@ -38,31 +36,37 @@ export function mySegmentsUpdaterFactory(
38
36
  }
39
37
 
40
38
  // @TODO if allowing pluggable storages, handle async execution
41
- function updateSegments(segmentsData: IMembershipsResponse | MySegmentsData) {
39
+ function updateSegments(segmentsData: MySegmentsData) {
42
40
 
43
41
  let shouldNotifyUpdate;
44
- if ((segmentsData as MySegmentsData).type !== undefined) {
45
- shouldNotifyUpdate = (segmentsData as MySegmentsData).type === MEMBERSHIPS_LS_UPDATE ?
46
- largeSegments!.resetSegments(segmentsData as MySegmentsData) :
47
- segments.resetSegments(segmentsData as MySegmentsData);
42
+ if (Array.isArray(segmentsData)) {
43
+ // Update the list of segment names available
44
+ shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
48
45
  } else {
49
- shouldNotifyUpdate = segments.resetSegments((segmentsData as IMembershipsResponse).ms || {});
50
- shouldNotifyUpdate = largeSegments!.resetSegments((segmentsData as IMembershipsResponse).ls || {}) || shouldNotifyUpdate;
46
+ // Add/Delete the segment
47
+ const { name, add } = segmentsData;
48
+ if (mySegmentsCache.isInSegment(name) !== add) {
49
+ shouldNotifyUpdate = true;
50
+ if (add) mySegmentsCache.addToSegment(name);
51
+ else mySegmentsCache.removeFromSegment(name);
52
+ } else {
53
+ shouldNotifyUpdate = false;
54
+ }
51
55
  }
52
56
 
53
57
  // Notify update if required
54
- if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
58
+ if (splitsCache.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
55
59
  readyOnAlreadyExistentState = false;
56
60
  segmentsEventEmitter.emit(SDK_SEGMENTS_ARRIVED);
57
61
  }
58
62
  }
59
63
 
60
- function _mySegmentsUpdater(retry: number, segmentsData?: MySegmentsData, noCache?: boolean, till?: number): Promise<boolean> {
64
+ function _mySegmentsUpdater(retry: number, segmentsData?: MySegmentsData, noCache?: boolean): Promise<boolean> {
61
65
  const updaterPromise: Promise<boolean> = segmentsData ?
62
66
  // If segmentsData is provided, there is no need to fetch mySegments
63
67
  new Promise((res) => { updateSegments(segmentsData); res(true); }) :
64
68
  // If not provided, fetch mySegments
65
- mySegmentsFetcher(matchingKey, noCache, till, _promiseDecorator).then(segments => {
69
+ mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(segments => {
66
70
  // Only when we have downloaded segments completely, we should not keep retrying anymore
67
71
  startingUp = false;
68
72
 
@@ -92,10 +96,9 @@ export function mySegmentsUpdaterFactory(
92
96
  * (2) an object with a segment name and action (true: add, or false: delete) to update the storage,
93
97
  * (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
94
98
  * @param {boolean | undefined} noCache true to revalidate data to fetch
95
- * @param {boolean | undefined} till query param to bypass CDN requests
96
99
  */
97
- return function mySegmentsUpdater(segmentsData?: MySegmentsData, noCache?: boolean, till?: number) {
98
- return _mySegmentsUpdater(0, segmentsData, noCache, till);
100
+ return function mySegmentsUpdater(segmentsData?: MySegmentsData, noCache?: boolean) {
101
+ return _mySegmentsUpdater(0, segmentsData, noCache);
99
102
  };
100
103
 
101
104
  }
@@ -36,9 +36,9 @@ export function segmentChangesUpdaterFactory(
36
36
 
37
37
  return sincePromise.then(since => {
38
38
  // if fetchOnlyNew flag, avoid processing already fetched segments
39
- if (fetchOnlyNew && since !== -1) return -1;
39
+ if (fetchOnlyNew && since !== undefined) return -1;
40
40
 
41
- return segmentChangesFetcher(since, segmentName, noCache, till).then(function (changes) {
41
+ return segmentChangesFetcher(since || -1, segmentName, noCache, till).then(function (changes) {
42
42
  let changeNumber = -1;
43
43
  const results: MaybeThenable<boolean | void>[] = [];
44
44
  changes.forEach(x => {
@@ -4,7 +4,7 @@ import { ISplitChangesFetcher } from '../fetchers/types';
4
4
  import { ISplit, ISplitChangesResponse, ISplitFiltersValidation } from '../../../dtos/types';
5
5
  import { ISplitsEventEmitter } from '../../../readiness/types';
6
6
  import { timeout } from '../../../utils/promise/timeout';
7
- import { SDK_SPLITS_ARRIVED } from '../../../readiness/constants';
7
+ import { SDK_SPLITS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
8
8
  import { ILogger } from '../../../logger/types';
9
9
  import { SYNC_SPLITS_FETCH, SYNC_SPLITS_NEW, SYNC_SPLITS_REMOVED, SYNC_SPLITS_SEGMENTS, SYNC_SPLITS_FETCH_FAILS, SYNC_SPLITS_FETCH_RETRY } from '../../../logger/constants';
10
10
  import { startsWith } from '../../../utils/lang';
@@ -19,7 +19,7 @@ function checkAllSegmentsExist(segments: ISegmentsCacheBase): Promise<boolean> {
19
19
  let registeredSegments = Promise.resolve(segments.getRegisteredSegments());
20
20
  return registeredSegments.then(segmentNames => {
21
21
  return Promise.all(segmentNames.map(segmentName => segments.getChangeNumber(segmentName)))
22
- .then(changeNumbers => changeNumbers.every(changeNumber => changeNumber !== -1));
22
+ .then(changeNumbers => changeNumbers.every(changeNumber => changeNumber !== undefined));
23
23
  });
24
24
  }
25
25
 
@@ -153,8 +153,7 @@ export function splitChangesUpdaterFactory(
153
153
  */
154
154
  function _splitChangesUpdater(since: number, retry = 0): Promise<boolean> {
155
155
  log.debug(SYNC_SPLITS_FETCH, [since]);
156
-
157
- return Promise.resolve(splitUpdateNotification ?
156
+ const fetcherPromise = Promise.resolve(splitUpdateNotification ?
158
157
  { splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
159
158
  splitChangesFetcher(since, noCache, till, _promiseDecorator)
160
159
  )
@@ -201,6 +200,15 @@ export function splitChangesUpdaterFactory(
201
200
  }
202
201
  return false;
203
202
  });
203
+
204
+ // After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
205
+ // Wrapping in a promise since checkCache can be async.
206
+ if (splitsEventEmitter && startingUp) {
207
+ Promise.resolve(splits.checkCache()).then(isCacheReady => {
208
+ if (isCacheReady) splitsEventEmitter.emit(SDK_SPLITS_CACHE_LOADED);
209
+ });
210
+ }
211
+ return fetcherPromise;
204
212
  }
205
213
 
206
214
  let sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error
@@ -14,7 +14,7 @@ export function authenticateFactory(fetchAuth: IFetchAuth): IAuthenticate {
14
14
 
15
15
  /**
16
16
  * Run authentication requests to Auth Server, and returns a promise that resolves with the decoded JTW token.
17
- * @param {string[] | undefined} userKeys set of user Keys to track membership updates. It is undefined for server-side API.
17
+ * @param {string[] | undefined} userKeys set of user Keys to track MY_SEGMENTS_CHANGES. It is undefined for server-side API.
18
18
  */
19
19
  return function authenticate(userKeys?: string[]): Promise<IAuthToken> {
20
20
  return fetchAuth(userKeys)
@@ -71,10 +71,12 @@ export class SSEClient implements ISSEClient {
71
71
  open(authToken: IAuthTokenPushEnabled) {
72
72
  this.close(); // it closes connection if previously opened
73
73
 
74
- const channelsQueryParam = Object.keys(authToken.channels).map((channel) => {
75
- const params = CONTROL_CHANNEL_REGEX.test(channel) ? '[?occupancy=metrics.publishers]' : '';
76
- return encodeURIComponent(params + channel);
77
- }).join(',');
74
+ const channelsQueryParam = Object.keys(authToken.channels).map(
75
+ function (channel) {
76
+ const params = CONTROL_CHANNEL_REGEX.test(channel) ? '[?occupancy=metrics.publishers]' : '';
77
+ return encodeURIComponent(params + channel);
78
+ }
79
+ ).join(',');
78
80
  const url = `${this.settings.urls.streaming}/sse?channels=${channelsQueryParam}&accessToken=${authToken.token}&v=${ABLY_API_VERSION}&heartbeats=true`; // same results using `&heartbeats=false`
79
81
  const isServerSide = !this.settings.core.key;
80
82
 
@@ -1,6 +1,6 @@
1
1
  import { errorParser, messageParser } from './NotificationParser';
2
2
  import { notificationKeeperFactory } from './NotificationKeeper';
3
- import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, MEMBERSHIPS_MS_UPDATE, MEMBERSHIPS_LS_UPDATE } from '../constants';
3
+ import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE } from '../constants';
4
4
  import { IPushEventEmitter } from '../types';
5
5
  import { ISseEventHandler } from '../SSEClient/types';
6
6
  import { INotificationError, INotificationMessage } from './types';
@@ -74,18 +74,21 @@ export function SSEHandlerFactory(log: ILogger, pushEmitter: IPushEventEmitter,
74
74
  const { parsedData, data, channel, timestamp } = messageWithParsedData;
75
75
  log.debug(STREAMING_NEW_MESSAGE, [data]);
76
76
 
77
- // we only handle update events if streaming is up
78
- if (!notificationKeeper.isStreamingUp() && [OCCUPANCY, CONTROL].indexOf(parsedData.type) === -1) return;
77
+ // we only handle update events if streaming is up.
78
+ if (!notificationKeeper.isStreamingUp() && [OCCUPANCY, CONTROL].indexOf(parsedData.type) === -1)
79
+ return;
79
80
 
80
81
  switch (parsedData.type) {
81
82
  /* update events */
82
83
  case SPLIT_UPDATE:
83
84
  case SEGMENT_UPDATE:
84
- case MEMBERSHIPS_MS_UPDATE:
85
- case MEMBERSHIPS_LS_UPDATE:
85
+ case MY_SEGMENTS_UPDATE_V2:
86
86
  case SPLIT_KILL:
87
87
  pushEmitter.emit(parsedData.type, parsedData);
88
88
  break;
89
+ case MY_SEGMENTS_UPDATE:
90
+ pushEmitter.emit(parsedData.type, parsedData, channel);
91
+ break;
89
92
 
90
93
  /* occupancy & control events, handled by NotificationManagerKeeper */
91
94
  case OCCUPANCY:
@@ -1,5 +1,12 @@
1
1
  import { ControlType } from '../constants';
2
- import { SEGMENT_UPDATE, SPLIT_UPDATE, SPLIT_KILL, CONTROL, OCCUPANCY, MEMBERSHIPS_LS_UPDATE, MEMBERSHIPS_MS_UPDATE } from '../types';
2
+ import { MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, SEGMENT_UPDATE, SPLIT_UPDATE, SPLIT_KILL, CONTROL, OCCUPANCY } from '../types';
3
+
4
+ export interface IMySegmentsUpdateData {
5
+ type: MY_SEGMENTS_UPDATE,
6
+ changeNumber: number,
7
+ includesPayload: boolean,
8
+ segmentList?: string[]
9
+ }
3
10
 
4
11
  export enum Compression {
5
12
  None = 0,
@@ -19,22 +26,15 @@ export interface KeyList {
19
26
  r?: string[], // decimal hash64 of user keys
20
27
  }
21
28
 
22
- interface IMembershipUpdateData<T extends string> {
23
- type: T,
24
- cn: number,
25
- n?: string[],
26
- c?: Compression,
27
- d?: string,
29
+ export interface IMySegmentsUpdateV2Data {
30
+ type: MY_SEGMENTS_UPDATE_V2,
31
+ changeNumber: number,
32
+ segmentName: string,
33
+ c: Compression,
34
+ d: string,
28
35
  u: UpdateStrategy,
29
- i?: number, // time interval in millis
30
- h?: number, // hash function
31
- s?: number, // seed for hash function
32
36
  }
33
37
 
34
- export interface IMembershipMSUpdateData extends IMembershipUpdateData<MEMBERSHIPS_MS_UPDATE> { }
35
-
36
- export interface IMembershipLSUpdateData extends IMembershipUpdateData<MEMBERSHIPS_LS_UPDATE> { }
37
-
38
38
  export interface ISegmentUpdateData {
39
39
  type: SEGMENT_UPDATE,
40
40
  changeNumber: number,
@@ -68,6 +68,6 @@ export interface IOccupancyData {
68
68
  }
69
69
  }
70
70
 
71
- export type INotificationData = IMembershipMSUpdateData | IMembershipLSUpdateData | ISegmentUpdateData | ISplitUpdateData | ISplitKillData | IControlData | IOccupancyData
71
+ export type INotificationData = IMySegmentsUpdateData | IMySegmentsUpdateV2Data | ISegmentUpdateData | ISplitUpdateData | ISplitKillData | IControlData | IOccupancyData
72
72
  export type INotificationMessage = { parsedData: INotificationData, channel: string, timestamp: number, data: string }
73
73
  export type INotificationError = Event & { parsedData?: any, message?: string }