@splitsoftware/splitio-commons 1.2.1-rc.0 → 1.2.1-rc.1

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 (56) hide show
  1. package/cjs/evaluator/matchers/ew.js +3 -3
  2. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  3. package/cjs/sync/polling/pollingManagerCS.js +2 -1
  4. package/cjs/sync/polling/pollingManagerSS.js +2 -1
  5. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
  6. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +2 -2
  7. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
  8. package/cjs/sync/streaming/pushManager.js +4 -3
  9. package/cjs/sync/submitters/submitterManager.js +2 -1
  10. package/cjs/sync/syncManagerOnline.js +8 -13
  11. package/cjs/utils/inputValidation/eventProperties.js +3 -1
  12. package/cjs/utils/lang/index.js +1 -13
  13. package/esm/evaluator/matchers/ew.js +4 -4
  14. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  15. package/esm/sync/polling/pollingManagerCS.js +2 -1
  16. package/esm/sync/polling/pollingManagerSS.js +2 -1
  17. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
  18. package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
  19. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
  20. package/esm/sync/streaming/pushManager.js +4 -3
  21. package/esm/sync/submitters/submitterManager.js +2 -1
  22. package/esm/sync/syncManagerOnline.js +8 -13
  23. package/esm/utils/inputValidation/eventProperties.js +4 -2
  24. package/esm/utils/lang/index.js +0 -11
  25. package/package.json +3 -3
  26. package/src/evaluator/matchers/ew.ts +4 -4
  27. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
  28. package/src/sync/polling/fetchers/types.ts +1 -0
  29. package/src/sync/polling/pollingManagerCS.ts +3 -6
  30. package/src/sync/polling/pollingManagerSS.ts +3 -8
  31. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +2 -1
  32. package/src/sync/polling/types.ts +0 -12
  33. package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -1
  34. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  35. package/src/sync/streaming/pushManager.ts +8 -14
  36. package/src/sync/streaming/types.ts +5 -25
  37. package/src/sync/submitters/submitterManager.ts +4 -8
  38. package/src/sync/syncManagerOnline.ts +14 -24
  39. package/src/utils/inputValidation/eventProperties.ts +4 -2
  40. package/src/utils/lang/index.ts +0 -14
  41. package/types/storages/inMemory/index.d.ts +10 -0
  42. package/types/storages/parseSegments.d.ts +6 -0
  43. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +1 -1
  44. package/types/sync/polling/fetchers/types.d.ts +1 -1
  45. package/types/sync/polling/pollingManagerCS.d.ts +2 -5
  46. package/types/sync/polling/pollingManagerSS.d.ts +2 -5
  47. package/types/sync/polling/types.d.ts +0 -11
  48. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
  49. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -1
  50. package/types/sync/streaming/pushManager.d.ts +3 -7
  51. package/types/sync/streaming/pushManagerCS.d.ts +1 -12
  52. package/types/sync/streaming/pushManagerSS.d.ts +1 -11
  53. package/types/sync/streaming/types.d.ts +3 -23
  54. package/types/sync/submitters/submitterManager.d.ts +2 -4
  55. package/types/sync/syncManagerOnline.d.ts +3 -3
  56. package/types/utils/lang/index.d.ts +0 -4
@@ -5,9 +5,9 @@ var constants_1 = require("../../logger/constants");
5
5
  var lang_1 = require("../../utils/lang");
6
6
  function endsWithMatcherContext(log, ruleAttr) {
7
7
  return function endsWithMatcher(runtimeAttr) {
8
- var endsWith = ruleAttr.some(function (e) { return lang_1.endsWith(runtimeAttr, e); });
9
- log.debug(constants_1.ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, endsWith]);
10
- return endsWith;
8
+ var strEndsWith = ruleAttr.some(function (e) { return lang_1.endsWith(runtimeAttr, e); });
9
+ log.debug(constants_1.ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, strEndsWith]);
10
+ return strEndsWith;
11
11
  };
12
12
  }
13
13
  exports.endsWithMatcherContext = endsWithMatcherContext;
@@ -5,8 +5,8 @@ exports.mySegmentsFetcherFactory = void 0;
5
5
  * Factory of MySegments fetcher.
6
6
  * MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
7
7
  */
8
- function mySegmentsFetcherFactory(fetchMySegments, userMatchingKey) {
9
- return function mySegmentsFetcher(noCache,
8
+ function mySegmentsFetcherFactory(fetchMySegments) {
9
+ return function mySegmentsFetcher(userMatchingKey, noCache,
10
10
  // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
11
11
  decorator) {
12
12
  var mySegmentsPromise = fetchMySegments(userMatchingKey, noCache);
@@ -11,7 +11,8 @@ var constants_2 = require("../../logger/constants");
11
11
  * Expose start / stop mechanism for polling data from services.
12
12
  * For client-side API with multiple clients.
13
13
  */
14
- function pollingManagerCSFactory(splitApi, storage, readiness, settings) {
14
+ function pollingManagerCSFactory(params) {
15
+ var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
15
16
  var log = settings.log;
16
17
  var splitsSyncTask = splitsSyncTask_1.splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
17
18
  // Map of matching keys to their corresponding MySegmentsSyncTask.
@@ -8,7 +8,8 @@ var constants_1 = require("../../logger/constants");
8
8
  /**
9
9
  * Expose start / stop mechanism for pulling data from services.
10
10
  */
11
- function pollingManagerSSFactory(splitApi, storage, readiness, settings) {
11
+ function pollingManagerSSFactory(params) {
12
+ var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
12
13
  var log = settings.log;
13
14
  var splitsSyncTask = splitsSyncTask_1.splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
14
15
  var segmentsSyncTask = segmentsSyncTask_1.segmentsSyncTaskFactory(splitApi.fetchSegmentChanges, storage, readiness, settings);
@@ -8,6 +8,6 @@ var mySegmentsUpdater_1 = require("../updaters/mySegmentsUpdater");
8
8
  * Creates a sync task that periodically executes a `mySegmentsUpdater` task
9
9
  */
10
10
  function mySegmentsSyncTaskFactory(fetchMySegments, storage, readiness, settings, matchingKey) {
11
- return syncTask_1.syncTaskFactory(settings.log, mySegmentsUpdater_1.mySegmentsUpdaterFactory(settings.log, mySegmentsFetcher_1.mySegmentsFetcherFactory(fetchMySegments, matchingKey), storage.splits, storage.segments, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
11
+ return syncTask_1.syncTaskFactory(settings.log, mySegmentsUpdater_1.mySegmentsUpdaterFactory(settings.log, mySegmentsFetcher_1.mySegmentsFetcherFactory(fetchMySegments), storage.splits, storage.segments, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
12
12
  }
13
13
  exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
@@ -10,7 +10,7 @@ var constants_2 = require("../../../logger/constants");
10
10
  * - updates `mySegmentsCache`
11
11
  * - uses `segmentsEventEmitter` to emit events related to segments data updates
12
12
  */
13
- function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady) {
13
+ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
14
14
  var readyOnAlreadyExistentState = true;
15
15
  var startingUp = true;
16
16
  /** timeout and telemetry decorator for `splitChangesFetcher` promise */
@@ -54,7 +54,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegment
54
54
  // If segmentsData is provided, there is no need to fetch mySegments
55
55
  new Promise(function (res) { updateSegments(segmentsData); res(true); }) :
56
56
  // If not provided, fetch mySegments
57
- mySegmentsFetcher(noCache, _promiseDecorator).then(function (segments) {
57
+ mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(function (segments) {
58
58
  // Only when we have downloaded segments completely, we should not keep retrying anymore
59
59
  startingUp = false;
60
60
  updateSegments(segments);
@@ -10,7 +10,7 @@ var SegmentsUpdateWorker = /** @class */ (function () {
10
10
  * @param {Object} segmentsCache segments data cache
11
11
  * @param {Object} segmentsSyncTask task for syncing segments data
12
12
  */
13
- function SegmentsUpdateWorker(segmentsCache, segmentsSyncTask) {
13
+ function SegmentsUpdateWorker(segmentsSyncTask, segmentsCache) {
14
14
  this.segmentsCache = segmentsCache;
15
15
  this.segmentsSyncTask = segmentsSyncTask;
16
16
  this.maxChangeNumbers = {};
@@ -22,7 +22,8 @@ var murmur3_64_1 = require("../../utils/murmur3/murmur3_64");
22
22
  * - for server-side if key is not provided in settings.
23
23
  * - for client-side, with support for multiple clients, if key is provided in settings
24
24
  */
25
- function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platform, settings) {
25
+ function pushManagerFactory(params, pollingManager) {
26
+ var settings = params.settings, storage = params.storage, splitApi = params.splitApi, readiness = params.readiness, platform = params.platform;
26
27
  // `userKey` is the matching key of main client in client-side SDK.
27
28
  // It can be used to check if running on client-side or server-side SDK.
28
29
  var userKey = settings.core.key ? key_1.getMatching(settings.core.key) : undefined;
@@ -36,14 +37,14 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
36
37
  log.warn(constants_2.STREAMING_FALLBACK, [e]);
37
38
  return;
38
39
  }
39
- var authenticate = AuthClient_1.authenticateFactory(fetchAuth);
40
+ var authenticate = AuthClient_1.authenticateFactory(splitApi.fetchAuth);
40
41
  // init feedback loop
41
42
  var pushEmitter = new platform.EventEmitter();
42
43
  var sseHandler = SSEHandler_1.SSEHandlerFactory(log, pushEmitter);
43
44
  sseClient.setEventHandler(sseHandler);
44
45
  // init workers
45
46
  // MySegmentsUpdateWorker (client-side) are initiated in `add` method
46
- var segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker_1.SegmentsUpdateWorker(storage.segments, pollingManager.segmentsSyncTask);
47
+ var segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker_1.SegmentsUpdateWorker(pollingManager.segmentsSyncTask, storage.segments);
47
48
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
48
49
  var splitsUpdateWorker = new SplitsUpdateWorker_1.SplitsUpdateWorker(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
49
50
  // [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
@@ -5,7 +5,8 @@ var syncTaskComposite_1 = require("../syncTaskComposite");
5
5
  var eventsSyncTask_1 = require("./eventsSyncTask");
6
6
  var impressionsSyncTask_1 = require("./impressionsSyncTask");
7
7
  var impressionCountsSyncTask_1 = require("./impressionCountsSyncTask");
8
- function submitterManagerFactory(settings, storage, splitApi) {
8
+ function submitterManagerFactory(params) {
9
+ var settings = params.settings, storage = params.storage, splitApi = params.splitApi;
9
10
  var log = settings.log;
10
11
  var submitters = [
11
12
  impressionsSyncTask_1.impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
@@ -16,18 +16,17 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
16
16
  /**
17
17
  * SyncManager factory for modular SDK
18
18
  */
19
- return function (_a) {
20
- var settings = _a.settings, platform = _a.platform, splitApi = _a.splitApi, storage = _a.storage, readiness = _a.readiness;
21
- var log = settings.log;
19
+ return function (params) {
20
+ var _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled;
22
21
  /** Polling Manager */
23
- var pollingManager = pollingManagerFactory && pollingManagerFactory(splitApi, storage, readiness, settings);
22
+ var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
24
23
  /** Push Manager */
25
- var pushManager = settings.streamingEnabled && pollingManager && pushManagerFactory ?
26
- pushManagerFactory(pollingManager, storage, readiness, splitApi.fetchAuth, platform, settings) :
24
+ var pushManager = streamingEnabled && pollingManager && pushManagerFactory ?
25
+ pushManagerFactory(params, pollingManager) :
27
26
  undefined;
28
27
  /** Submitter Manager */
29
28
  // It is not inyected as push and polling managers, because at the moment it is required
30
- var submitter = submitterManager_1.submitterManagerFactory(settings, storage, splitApi);
29
+ var submitter = submitterManager_1.submitterManagerFactory(params);
31
30
  /** Sync Manager logic */
32
31
  function startPolling() {
33
32
  if (pollingManager.isRunning()) {
@@ -58,9 +57,6 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
58
57
  * Method used to start the syncManager for the first time, or resume it after being stopped.
59
58
  */
60
59
  start: function () {
61
- if (running)
62
- return;
63
- running = true;
64
60
  // start syncing splits and segments
65
61
  if (pollingManager) {
66
62
  if (pushManager) {
@@ -78,14 +74,12 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
78
74
  // start periodic data recording (events, impressions, telemetry).
79
75
  if (submitter)
80
76
  submitter.start();
77
+ running = true;
81
78
  },
82
79
  /**
83
80
  * Method used to stop/pause the syncManager.
84
81
  */
85
82
  stop: function () {
86
- if (!running)
87
- return;
88
- running = false;
89
83
  // stop syncing
90
84
  if (pushManager)
91
85
  pushManager.stop();
@@ -94,6 +88,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
94
88
  // stop periodic data recording (events, impressions, telemetry).
95
89
  if (submitter)
96
90
  submitter.stop();
91
+ running = false;
97
92
  },
98
93
  isRunning: function () {
99
94
  return running;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateEventProperties = void 0;
4
4
  var lang_1 = require("../lang");
5
+ var objectAssign_1 = require("../lang/objectAssign");
5
6
  var constants_1 = require("../../logger/constants");
6
7
  var ECMA_SIZES = {
7
8
  NULL: 0,
@@ -20,7 +21,8 @@ function validateEventProperties(log, maybeProperties, method) {
20
21
  return { properties: false, size: BASE_EVENT_SIZE };
21
22
  }
22
23
  var keys = Object.keys(maybeProperties);
23
- var clone = lang_1.shallowClone(maybeProperties);
24
+ // Shallow clone
25
+ var clone = objectAssign_1.objectAssign({}, maybeProperties);
24
26
  // To avoid calculating the size twice we'll return it from here.
25
27
  var output = {
26
28
  properties: clone,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uniqueId = exports.uniqAsStrings = exports.uniq = exports.toString = exports.toNumber = exports.startsWith = exports.shallowClone = exports.merge = exports.isString = exports.isObject = exports.isNaNNumber = exports.isIntegerNumber = exports.isFiniteNumber = exports.isBoolean = exports.groupBy = exports.get = exports.forOwn = exports.findIndex = exports.find = exports.endsWith = void 0;
3
+ exports.uniqueId = exports.uniqAsStrings = exports.uniq = exports.toString = exports.toNumber = exports.startsWith = exports.merge = exports.isString = exports.isObject = exports.isNaNNumber = exports.isIntegerNumber = exports.isFiniteNumber = exports.isBoolean = exports.groupBy = exports.get = exports.forOwn = exports.findIndex = exports.find = exports.endsWith = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  /**
6
6
  * Checks if the target string ends with the sub string.
@@ -199,18 +199,6 @@ function merge(target, source) {
199
199
  return res;
200
200
  }
201
201
  exports.merge = merge;
202
- /**
203
- * Shallow clone an object
204
- */
205
- function shallowClone(obj) {
206
- var keys = Object.keys(obj);
207
- var output = {};
208
- for (var i = 0; i < keys.length; i++) {
209
- output[keys[i]] = obj[keys[i]];
210
- }
211
- return output;
212
- }
213
- exports.shallowClone = shallowClone;
214
202
  /**
215
203
  * Checks if the target string starts with the sub string.
216
204
  */
@@ -1,9 +1,9 @@
1
1
  import { ENGINE_MATCHER_ENDS_WITH } from '../../logger/constants';
2
- import { endsWith as strEndsWith } from '../../utils/lang';
2
+ import { endsWith } from '../../utils/lang';
3
3
  export function endsWithMatcherContext(log, ruleAttr) {
4
4
  return function endsWithMatcher(runtimeAttr) {
5
- var endsWith = ruleAttr.some(function (e) { return strEndsWith(runtimeAttr, e); });
6
- log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, endsWith]);
7
- return endsWith;
5
+ var strEndsWith = ruleAttr.some(function (e) { return endsWith(runtimeAttr, e); });
6
+ log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, strEndsWith]);
7
+ return strEndsWith;
8
8
  };
9
9
  }
@@ -2,8 +2,8 @@
2
2
  * Factory of MySegments fetcher.
3
3
  * MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
4
4
  */
5
- export function mySegmentsFetcherFactory(fetchMySegments, userMatchingKey) {
6
- return function mySegmentsFetcher(noCache,
5
+ export function mySegmentsFetcherFactory(fetchMySegments) {
6
+ return function mySegmentsFetcher(userMatchingKey, noCache,
7
7
  // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
8
8
  decorator) {
9
9
  var mySegmentsPromise = fetchMySegments(userMatchingKey, noCache);
@@ -8,7 +8,8 @@ import { POLLING_SMART_PAUSING, POLLING_START, POLLING_STOP } from '../../logger
8
8
  * Expose start / stop mechanism for polling data from services.
9
9
  * For client-side API with multiple clients.
10
10
  */
11
- export function pollingManagerCSFactory(splitApi, storage, readiness, settings) {
11
+ export function pollingManagerCSFactory(params) {
12
+ var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
12
13
  var log = settings.log;
13
14
  var splitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
14
15
  // Map of matching keys to their corresponding MySegmentsSyncTask.
@@ -5,7 +5,8 @@ import { POLLING_START, POLLING_STOP, LOG_PREFIX_SYNC_POLLING } from '../../logg
5
5
  /**
6
6
  * Expose start / stop mechanism for pulling data from services.
7
7
  */
8
- export function pollingManagerSSFactory(splitApi, storage, readiness, settings) {
8
+ export function pollingManagerSSFactory(params) {
9
+ var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
9
10
  var log = settings.log;
10
11
  var splitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
11
12
  var segmentsSyncTask = segmentsSyncTaskFactory(splitApi.fetchSegmentChanges, storage, readiness, settings);
@@ -5,5 +5,5 @@ import { mySegmentsUpdaterFactory } from '../updaters/mySegmentsUpdater';
5
5
  * Creates a sync task that periodically executes a `mySegmentsUpdater` task
6
6
  */
7
7
  export function mySegmentsSyncTaskFactory(fetchMySegments, storage, readiness, settings, matchingKey) {
8
- return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(fetchMySegments, matchingKey), storage.splits, storage.segments, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
8
+ return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(fetchMySegments), storage.splits, storage.segments, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
9
9
  }
@@ -7,7 +7,7 @@ import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
7
7
  * - updates `mySegmentsCache`
8
8
  * - uses `segmentsEventEmitter` to emit events related to segments data updates
9
9
  */
10
- export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady) {
10
+ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
11
11
  var readyOnAlreadyExistentState = true;
12
12
  var startingUp = true;
13
13
  /** timeout and telemetry decorator for `splitChangesFetcher` promise */
@@ -51,7 +51,7 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, my
51
51
  // If segmentsData is provided, there is no need to fetch mySegments
52
52
  new Promise(function (res) { updateSegments(segmentsData); res(true); }) :
53
53
  // If not provided, fetch mySegments
54
- mySegmentsFetcher(noCache, _promiseDecorator).then(function (segments) {
54
+ mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(function (segments) {
55
55
  // Only when we have downloaded segments completely, we should not keep retrying anymore
56
56
  startingUp = false;
57
57
  updateSegments(segments);
@@ -7,7 +7,7 @@ var SegmentsUpdateWorker = /** @class */ (function () {
7
7
  * @param {Object} segmentsCache segments data cache
8
8
  * @param {Object} segmentsSyncTask task for syncing segments data
9
9
  */
10
- function SegmentsUpdateWorker(segmentsCache, segmentsSyncTask) {
10
+ function SegmentsUpdateWorker(segmentsSyncTask, segmentsCache) {
11
11
  this.segmentsCache = segmentsCache;
12
12
  this.segmentsSyncTask = segmentsSyncTask;
13
13
  this.maxChangeNumbers = {};
@@ -19,7 +19,8 @@ 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
26
  var userKey = settings.core.key ? getMatching(settings.core.key) : undefined;
@@ -33,14 +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
43
  // MySegmentsUpdateWorker (client-side) are initiated in `add` method
43
- var segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(storage.segments, pollingManager.segmentsSyncTask);
44
+ var segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(pollingManager.segmentsSyncTask, storage.segments);
44
45
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
45
46
  var splitsUpdateWorker = new SplitsUpdateWorker(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
46
47
  // [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
@@ -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,18 +13,17 @@ 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
29
  if (pollingManager.isRunning()) {
@@ -55,9 +54,6 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
55
54
  * Method used to start the syncManager for the first time, or resume it after being stopped.
56
55
  */
57
56
  start: function () {
58
- if (running)
59
- return;
60
- running = true;
61
57
  // start syncing splits and segments
62
58
  if (pollingManager) {
63
59
  if (pushManager) {
@@ -75,14 +71,12 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
75
71
  // start periodic data recording (events, impressions, telemetry).
76
72
  if (submitter)
77
73
  submitter.start();
74
+ running = true;
78
75
  },
79
76
  /**
80
77
  * Method used to stop/pause the syncManager.
81
78
  */
82
79
  stop: function () {
83
- if (!running)
84
- return;
85
- running = false;
86
80
  // stop syncing
87
81
  if (pushManager)
88
82
  pushManager.stop();
@@ -91,6 +85,7 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
91
85
  // stop periodic data recording (events, impressions, telemetry).
92
86
  if (submitter)
93
87
  submitter.stop();
88
+ running = false;
94
89
  },
95
90
  isRunning: function () {
96
91
  return running;
@@ -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,
@@ -183,17 +183,6 @@ export function merge(target, source) {
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
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "1.2.1-rc.0",
3
+ "version": "1.2.1-rc.1",
4
4
  "description": "Split Javascript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -24,8 +24,8 @@
24
24
  "build:cjs": "rimraf cjs && tsc -m CommonJS --outDir cjs --importHelpers",
25
25
  "test": "jest",
26
26
  "test:coverage": "jest --coverage",
27
- "publish:rc": "npm run check && npm run test && npm run build && npm publish --tag rc",
28
- "publish:stable": "npm run check && npm run test && npm run build && npm publish"
27
+ "publish:rc": "npm run check && npm run build && npm run test && npm publish --tag rc",
28
+ "publish:stable": "npm run check && npm run build && npm run test && npm publish"
29
29
  },
30
30
  "repository": {
31
31
  "type": "git",
@@ -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
  }
@@ -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);
@@ -21,12 +21,13 @@ export function mySegmentsSyncTaskFactory(
21
21
  settings.log,
22
22
  mySegmentsUpdaterFactory(
23
23
  settings.log,
24
- mySegmentsFetcherFactory(fetchMySegments, matchingKey),
24
+ mySegmentsFetcherFactory(fetchMySegments),
25
25
  storage.splits,
26
26
  storage.segments,
27
27
  readiness.segments,
28
28
  settings.startup.requestTimeoutBeforeReady,
29
29
  settings.startup.retriesOnFailureBeforeReady,
30
+ matchingKey
30
31
  ),
31
32
  settings.scheduler.segmentsRefreshRate,
32
33
  'mySegmentsUpdater',
@@ -1,7 +1,5 @@
1
1
  import { IReadinessManager } from '../../readiness/types';
2
- import { ISplitApi } from '../../services/types';
3
2
  import { IStorageSync } from '../../storages/types';
4
- import { ISettings } from '../../types';
5
3
  import { SegmentsData } from '../streaming/SSEHandler/types';
6
4
  import { ITask, ISyncTask } from '../types';
7
5
 
@@ -23,13 +21,3 @@ export interface IPollingManagerCS extends IPollingManager {
23
21
  remove(matchingKey: string): void;
24
22
  get(matchingKey: string): ISegmentsSyncTask | undefined
25
23
  }
26
-
27
- /**
28
- * Signature of polling manager factory/constructor
29
- */
30
- export type IPollingManagerFactoryParams = [
31
- splitApi: ISplitApi,
32
- storage: IStorageSync,
33
- readiness: IReadinessManager,
34
- settings: ISettings,
35
- ]
@@ -23,6 +23,7 @@ export function mySegmentsUpdaterFactory(
23
23
  segmentsEventEmitter: ISegmentsEventEmitter,
24
24
  requestTimeoutBeforeReady: number,
25
25
  retriesOnFailureBeforeReady: number,
26
+ matchingKey: string
26
27
  ): IMySegmentsUpdater {
27
28
 
28
29
  let readyOnAlreadyExistentState = true;
@@ -69,7 +70,7 @@ export function mySegmentsUpdaterFactory(
69
70
  // If segmentsData is provided, there is no need to fetch mySegments
70
71
  new Promise((res) => { updateSegments(segmentsData); res(true); }) :
71
72
  // If not provided, fetch mySegments
72
- mySegmentsFetcher(noCache, _promiseDecorator).then(segments => {
73
+ mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(segments => {
73
74
  // Only when we have downloaded segments completely, we should not keep retrying anymore
74
75
  startingUp = false;
75
76
 
@@ -19,7 +19,7 @@ export class SegmentsUpdateWorker implements IUpdateWorker {
19
19
  * @param {Object} segmentsCache segments data cache
20
20
  * @param {Object} segmentsSyncTask task for syncing segments data
21
21
  */
22
- constructor(segmentsCache: ISegmentsCacheSync, segmentsSyncTask: ISegmentsSyncTask) {
22
+ constructor(segmentsSyncTask: ISegmentsSyncTask, segmentsCache: ISegmentsCacheSync) {
23
23
  this.segmentsCache = segmentsCache;
24
24
  this.segmentsSyncTask = segmentsSyncTask;
25
25
  this.maxChangeNumbers = {};
@@ -1,7 +1,5 @@
1
- import { IPushEventEmitter, IPushManagerCS } from './types';
1
+ import { IPushEventEmitter, IPushManager } from './types';
2
2
  import { ISSEClient } from './SSEClient/types';
3
- import { IStorageSync } from '../../storages/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
3
  import { ISegmentsSyncTask, IPollingManager } from '../polling/types';
6
4
  import { objectAssign } from '../../utils/lang/objectAssign';
7
5
  import { Backoff } from '../../utils/Backoff';
@@ -12,17 +10,15 @@ import { SplitsUpdateWorker } from './UpdateWorkers/SplitsUpdateWorker';
12
10
  import { authenticateFactory, hashUserKey } from './AuthClient';
13
11
  import { forOwn } from '../../utils/lang';
14
12
  import { SSEClient } from './SSEClient';
15
- import { IFetchAuth } from '../../services/types';
16
- import { ISettings } from '../../types';
17
13
  import { getMatching } from '../../utils/key';
18
14
  import { MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, PUSH_NONRETRYABLE_ERROR, PUSH_SUBSYSTEM_DOWN, SECONDS_BEFORE_EXPIRATION, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, PUSH_RETRYABLE_ERROR, PUSH_SUBSYSTEM_UP, ControlType } from './constants';
19
- import { IPlatform } from '../../sdkFactory/types';
20
15
  import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 } from '../../logger/constants';
21
16
  import { KeyList, UpdateStrategy } from './SSEHandler/types';
22
17
  import { isInBitmap, parseBitmap, parseKeyList } from './mySegmentsV2utils';
23
18
  import { ISet, _Set } from '../../utils/lang/sets';
24
19
  import { Hash64, hash64 } from '../../utils/murmur3/murmur3_64';
25
20
  import { IAuthTokenPushEnabled } from './AuthClient/types';
21
+ import { ISyncManagerFactoryParams } from '../types';
26
22
 
27
23
  /**
28
24
  * PushManager factory:
@@ -30,13 +26,11 @@ import { IAuthTokenPushEnabled } from './AuthClient/types';
30
26
  * - for client-side, with support for multiple clients, if key is provided in settings
31
27
  */
32
28
  export function pushManagerFactory(
29
+ params: ISyncManagerFactoryParams,
33
30
  pollingManager: IPollingManager,
34
- storage: IStorageSync,
35
- readiness: IReadinessManager,
36
- fetchAuth: IFetchAuth,
37
- platform: IPlatform,
38
- settings: ISettings,
39
- ): IPushManagerCS | undefined {
31
+ ): IPushManager | undefined {
32
+
33
+ const { settings, storage, splitApi, readiness, platform } = params;
40
34
 
41
35
  // `userKey` is the matching key of main client in client-side SDK.
42
36
  // It can be used to check if running on client-side or server-side SDK.
@@ -51,7 +45,7 @@ export function pushManagerFactory(
51
45
  log.warn(STREAMING_FALLBACK, [e]);
52
46
  return;
53
47
  }
54
- const authenticate = authenticateFactory(fetchAuth);
48
+ const authenticate = authenticateFactory(splitApi.fetchAuth);
55
49
 
56
50
  // init feedback loop
57
51
  const pushEmitter = new platform.EventEmitter() as IPushEventEmitter;
@@ -60,7 +54,7 @@ export function pushManagerFactory(
60
54
 
61
55
  // init workers
62
56
  // MySegmentsUpdateWorker (client-side) are initiated in `add` method
63
- const segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(storage.segments, pollingManager.segmentsSyncTask);
57
+ const segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(pollingManager.segmentsSyncTask, storage.segments);
64
58
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
65
59
  const splitsUpdateWorker = new SplitsUpdateWorker(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
66
60
 
@@ -1,11 +1,7 @@
1
1
  import { IMySegmentsUpdateData, IMySegmentsUpdateV2Data, ISegmentUpdateData, ISplitUpdateData, ISplitKillData } from './SSEHandler/types';
2
2
  import { ITask } from '../types';
3
- import { IPollingManager, ISegmentsSyncTask } from '../polling/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
- import { IFetchAuth } from '../../services/types';
6
- import { IStorageSync } from '../../storages/types';
7
- import { IEventEmitter, ISettings } from '../../types';
8
- import { IPlatform } from '../../sdkFactory/types';
3
+ import { ISegmentsSyncTask } from '../polling/types';
4
+ import { IEventEmitter } from '../../types';
9
5
  import { ControlType } from './constants';
10
6
 
11
7
  // Internal SDK events, subscribed by SyncManager and PushManager
@@ -45,26 +41,10 @@ export interface IPushEventEmitter extends IEventEmitter {
45
41
  }
46
42
 
47
43
  /**
48
- * PushManager for server-side
44
+ * PushManager
49
45
  */
50
- export interface IPushManager extends ITask, IPushEventEmitter { }
51
-
52
- /**
53
- * PushManager for client-side with support for multiple clients
54
- */
55
- export interface IPushManagerCS extends IPushManager {
46
+ export interface IPushManager extends ITask, IPushEventEmitter {
47
+ // Methods used in client-side, to support multiple clients
56
48
  add(userKey: string, mySegmentsSyncTask: ISegmentsSyncTask): void,
57
49
  remove(userKey: string): void
58
50
  }
59
-
60
- /**
61
- * Signature of push manager factory/constructor
62
- */
63
- export type IPushManagerFactoryParams = [
64
- pollingManager: IPollingManager,
65
- storage: IStorageSync,
66
- readiness: IReadinessManager,
67
- fetchAuth: IFetchAuth,
68
- platform: IPlatform,
69
- settings: ISettings
70
- ]
@@ -2,15 +2,11 @@ import { syncTaskComposite } from '../syncTaskComposite';
2
2
  import { eventsSyncTaskFactory } from './eventsSyncTask';
3
3
  import { impressionsSyncTaskFactory } from './impressionsSyncTask';
4
4
  import { impressionCountsSyncTaskFactory } from './impressionCountsSyncTask';
5
- import { ISplitApi } from '../../services/types';
6
- import { IStorageSync } from '../../storages/types';
7
- import { ISettings } from '../../types';
5
+ import { ISyncManagerFactoryParams } from '../types';
8
6
 
9
- export function submitterManagerFactory(
10
- settings: ISettings,
11
- storage: IStorageSync,
12
- splitApi: ISplitApi,
13
- ) {
7
+ export function submitterManagerFactory(params: ISyncManagerFactoryParams) {
8
+
9
+ const { settings, storage, splitApi } = params;
14
10
  const log = settings.log;
15
11
  const submitters = [
16
12
  impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
@@ -2,8 +2,8 @@ import { ISyncManagerCS, ISyncManagerFactoryParams } from './types';
2
2
  import { submitterManagerFactory } from './submitters/submitterManager';
3
3
  import { IReadinessManager } from '../readiness/types';
4
4
  import { IStorageSync } from '../storages/types';
5
- import { IPushManagerFactoryParams, IPushManager, IPushManagerCS } from './streaming/types';
6
- import { IPollingManager, IPollingManagerCS, IPollingManagerFactoryParams } from './polling/types';
5
+ import { IPushManager } from './streaming/types';
6
+ import { IPollingManager, IPollingManagerCS } from './polling/types';
7
7
  import { PUSH_SUBSYSTEM_UP, PUSH_SUBSYSTEM_DOWN } from './streaming/constants';
8
8
  import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '../logger/constants';
9
9
 
@@ -16,34 +16,28 @@ import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '..
16
16
  * @param pushManagerFactory optional to build a SyncManager with or without streaming support
17
17
  */
18
18
  export function syncManagerOnlineFactory(
19
- pollingManagerFactory?: (...args: IPollingManagerFactoryParams) => IPollingManager,
20
- pushManagerFactory?: (...args: IPushManagerFactoryParams) => IPushManager | undefined
19
+ pollingManagerFactory?: (params: ISyncManagerFactoryParams) => IPollingManager,
20
+ pushManagerFactory?: (params: ISyncManagerFactoryParams, pollingManager: IPollingManager) => IPushManager | undefined,
21
21
  ): (params: ISyncManagerFactoryParams) => ISyncManagerCS {
22
22
 
23
23
  /**
24
24
  * SyncManager factory for modular SDK
25
25
  */
26
- return function ({
27
- settings,
28
- platform,
29
- splitApi,
30
- storage,
31
- readiness
32
- }: ISyncManagerFactoryParams): ISyncManagerCS {
26
+ return function (params: ISyncManagerFactoryParams): ISyncManagerCS {
33
27
 
34
- const log = settings.log;
28
+ const { log, streamingEnabled } = params.settings;
35
29
 
36
30
  /** Polling Manager */
37
- const pollingManager = pollingManagerFactory && pollingManagerFactory(splitApi, storage, readiness, settings);
31
+ const pollingManager = pollingManagerFactory && pollingManagerFactory(params);
38
32
 
39
33
  /** Push Manager */
40
- const pushManager = settings.streamingEnabled && pollingManager && pushManagerFactory ?
41
- pushManagerFactory(pollingManager, storage, readiness, splitApi.fetchAuth, platform, settings) :
34
+ const pushManager = streamingEnabled && pollingManager && pushManagerFactory ?
35
+ pushManagerFactory(params, pollingManager) :
42
36
  undefined;
43
37
 
44
38
  /** Submitter Manager */
45
39
  // It is not inyected as push and polling managers, because at the moment it is required
46
- const submitter = submitterManagerFactory(settings, storage, splitApi);
40
+ const submitter = submitterManagerFactory(params);
47
41
 
48
42
 
49
43
  /** Sync Manager logic */
@@ -81,9 +75,6 @@ export function syncManagerOnlineFactory(
81
75
  * Method used to start the syncManager for the first time, or resume it after being stopped.
82
76
  */
83
77
  start() {
84
- if (running) return;
85
- running = true;
86
-
87
78
  // start syncing splits and segments
88
79
  if (pollingManager) {
89
80
  if (pushManager) {
@@ -100,21 +91,20 @@ export function syncManagerOnlineFactory(
100
91
 
101
92
  // start periodic data recording (events, impressions, telemetry).
102
93
  if (submitter) submitter.start();
94
+ running = true;
103
95
  },
104
96
 
105
97
  /**
106
98
  * Method used to stop/pause the syncManager.
107
99
  */
108
100
  stop() {
109
- if (!running) return;
110
- running = false;
111
-
112
101
  // stop syncing
113
102
  if (pushManager) pushManager.stop();
114
103
  if (pollingManager && pollingManager.isRunning()) pollingManager.stop();
115
104
 
116
105
  // stop periodic data recording (events, impressions, telemetry).
117
106
  if (submitter) submitter.stop();
107
+ running = false;
118
108
  },
119
109
 
120
110
  isRunning() {
@@ -145,7 +135,7 @@ export function syncManagerOnlineFactory(
145
135
  // of segments since `syncAll` was already executed when starting the main client
146
136
  mySegmentsSyncTask.execute();
147
137
  }
148
- (pushManager as IPushManagerCS).add(matchingKey, mySegmentsSyncTask);
138
+ pushManager.add(matchingKey, mySegmentsSyncTask);
149
139
  } else {
150
140
  if (storage.splits.usesSegments()) mySegmentsSyncTask.start();
151
141
  }
@@ -155,7 +145,7 @@ export function syncManagerOnlineFactory(
155
145
  const mySegmentsSyncTask = (pollingManager as IPollingManagerCS).get(matchingKey);
156
146
  if (mySegmentsSyncTask) {
157
147
  // stop syncing
158
- if (pushManager) (pushManager as IPushManagerCS).remove(matchingKey);
148
+ if (pushManager) pushManager.remove(matchingKey);
159
149
  if (mySegmentsSyncTask.isRunning()) mySegmentsSyncTask.stop();
160
150
 
161
151
  (pollingManager as IPollingManagerCS).remove(matchingKey);
@@ -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 { SplitIO } from '../../types';
3
4
  import { ILogger } from '../../logger/types';
4
5
  import { ERROR_NOT_PLAIN_OBJECT, ERROR_SIZE_EXCEEDED, WARN_SETTING_NULL, WARN_TRIMMING_PROPERTIES } from '../../logger/constants';
@@ -22,7 +23,8 @@ export function validateEventProperties(log: ILogger, maybeProperties: any, meth
22
23
  }
23
24
 
24
25
  const keys = Object.keys(maybeProperties);
25
- const clone = shallowClone(maybeProperties);
26
+ // Shallow clone
27
+ const clone = objectAssign({}, maybeProperties);
26
28
  // To avoid calculating the size twice we'll return it from here.
27
29
  const output = {
28
30
  properties: clone,
@@ -194,20 +194,6 @@ export function merge(target: { [key: string]: any }, source: { [key: string]: a
194
194
  return res;
195
195
  }
196
196
 
197
- /**
198
- * Shallow clone an object
199
- */
200
- export function shallowClone(obj: any): any {
201
- const keys = Object.keys(obj);
202
- const output: Record<string, any> = {};
203
-
204
- for (let i = 0; i < keys.length; i++) {
205
- output[keys[i]] = obj[keys[i]];
206
- }
207
-
208
- return output;
209
- }
210
-
211
197
  /**
212
198
  * Checks if the target string starts with the sub string.
213
199
  */
@@ -0,0 +1,10 @@
1
+ import { IStorageFactoryParams, IStorageSync } from '../types';
2
+ /**
3
+ * InMemory storage factory for standalone server-side SplitFactory
4
+ *
5
+ * @param params parameters required by EventsCacheSync
6
+ */
7
+ export declare function InMemoryStorageFactory(params: IStorageFactoryParams): IStorageSync;
8
+ export declare namespace InMemoryStorageFactory {
9
+ var type: import("../types").StorageType;
10
+ }
@@ -0,0 +1,6 @@
1
+ import { ISplit } from '../dtos/types';
2
+ import { ISet } from '../utils/lang/sets';
3
+ /**
4
+ * Collect segments from a list of splits.
5
+ */
6
+ export declare function parseSegments(splits: ISplit[]): ISet<string>;
@@ -4,4 +4,4 @@ import { IMySegmentsFetcher } from './types';
4
4
  * Factory of MySegments fetcher.
5
5
  * MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
6
6
  */
7
- export declare function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments, userMatchingKey: string): IMySegmentsFetcher;
7
+ export declare function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments): IMySegmentsFetcher;
@@ -2,4 +2,4 @@ import { ISplitChangesResponse, ISegmentChangesResponse } from '../../../dtos/ty
2
2
  import { IResponse } from '../../../services/types';
3
3
  export declare type ISplitChangesFetcher = (since: number, noCache?: boolean, decorator?: (promise: Promise<IResponse>) => Promise<IResponse>) => Promise<ISplitChangesResponse>;
4
4
  export declare type ISegmentChangesFetcher = (since: number, segmentName: string, noCache?: boolean, decorator?: (promise: Promise<ISegmentChangesResponse[]>) => Promise<ISegmentChangesResponse[]>) => Promise<ISegmentChangesResponse[]>;
5
- export declare type IMySegmentsFetcher = (noCache?: boolean, decorator?: (promise: Promise<IResponse>) => Promise<IResponse>) => Promise<string[]>;
5
+ export declare type IMySegmentsFetcher = (userMatchingKey: string, noCache?: boolean, decorator?: (promise: Promise<IResponse>) => Promise<IResponse>) => Promise<string[]>;
@@ -1,10 +1,7 @@
1
1
  import { IPollingManagerCS } from './types';
2
- import { IReadinessManager } from '../../readiness/types';
3
- import { ISplitApi } from '../../services/types';
4
- import { IStorageSync } from '../../storages/types';
5
- import { ISettings } from '../../types';
2
+ import { ISyncManagerFactoryParams } from '../types';
6
3
  /**
7
4
  * Expose start / stop mechanism for polling data from services.
8
5
  * For client-side API with multiple clients.
9
6
  */
10
- export declare function pollingManagerCSFactory(splitApi: ISplitApi, storage: IStorageSync, readiness: IReadinessManager, settings: ISettings): IPollingManagerCS;
7
+ export declare function pollingManagerCSFactory(params: ISyncManagerFactoryParams): IPollingManagerCS;
@@ -1,9 +1,6 @@
1
- import { IStorageSync } from '../../storages/types';
2
- import { IReadinessManager } from '../../readiness/types';
3
- import { ISplitApi } from '../../services/types';
4
- import { ISettings } from '../../types';
5
1
  import { IPollingManager } from './types';
2
+ import { ISyncManagerFactoryParams } from '../types';
6
3
  /**
7
4
  * Expose start / stop mechanism for pulling data from services.
8
5
  */
9
- export declare function pollingManagerSSFactory(splitApi: ISplitApi, storage: IStorageSync, readiness: IReadinessManager, settings: ISettings): IPollingManager;
6
+ export declare function pollingManagerSSFactory(params: ISyncManagerFactoryParams): IPollingManager;
@@ -1,7 +1,5 @@
1
1
  import { IReadinessManager } from '../../readiness/types';
2
- import { ISplitApi } from '../../services/types';
3
2
  import { IStorageSync } from '../../storages/types';
4
- import { ISettings } from '../../types';
5
3
  import { SegmentsData } from '../streaming/SSEHandler/types';
6
4
  import { ITask, ISyncTask } from '../types';
7
5
  export interface ISplitsSyncTask extends ISyncTask<[noCache?: boolean], boolean> {
@@ -21,12 +19,3 @@ export interface IPollingManagerCS extends IPollingManager {
21
19
  remove(matchingKey: string): void;
22
20
  get(matchingKey: string): ISegmentsSyncTask | undefined;
23
21
  }
24
- /**
25
- * Signature of polling manager factory/constructor
26
- */
27
- export declare type IPollingManagerFactoryParams = [
28
- splitApi: ISplitApi,
29
- storage: IStorageSync,
30
- readiness: IReadinessManager,
31
- settings: ISettings
32
- ];
@@ -9,5 +9,5 @@ declare type IMySegmentsUpdater = (segmentList?: string[], noCache?: boolean) =>
9
9
  * - updates `mySegmentsCache`
10
10
  * - uses `segmentsEventEmitter` to emit events related to segments data updates
11
11
  */
12
- export declare function mySegmentsUpdaterFactory(log: ILogger, mySegmentsFetcher: IMySegmentsFetcher, splitsCache: ISplitsCacheSync, mySegmentsCache: ISegmentsCacheSync, segmentsEventEmitter: ISegmentsEventEmitter, requestTimeoutBeforeReady: number, retriesOnFailureBeforeReady: number): IMySegmentsUpdater;
12
+ export declare function mySegmentsUpdaterFactory(log: ILogger, mySegmentsFetcher: IMySegmentsFetcher, splitsCache: ISplitsCacheSync, mySegmentsCache: ISegmentsCacheSync, segmentsEventEmitter: ISegmentsEventEmitter, requestTimeoutBeforeReady: number, retriesOnFailureBeforeReady: number, matchingKey: string): IMySegmentsUpdater;
13
13
  export {};
@@ -16,7 +16,7 @@ export declare class SegmentsUpdateWorker implements IUpdateWorker {
16
16
  * @param {Object} segmentsCache segments data cache
17
17
  * @param {Object} segmentsSyncTask task for syncing segments data
18
18
  */
19
- constructor(segmentsCache: ISegmentsCacheSync, segmentsSyncTask: ISegmentsSyncTask);
19
+ constructor(segmentsSyncTask: ISegmentsSyncTask, segmentsCache: ISegmentsCacheSync);
20
20
  __handleSegmentUpdateCall(): void;
21
21
  /**
22
22
  * Invoked by NotificationProcessor on SEGMENT_UPDATE event
@@ -1,13 +1,9 @@
1
- import { IPushManagerCS } from './types';
2
- import { IStorageSync } from '../../storages/types';
3
- import { IReadinessManager } from '../../readiness/types';
1
+ import { IPushManager } from './types';
4
2
  import { IPollingManager } from '../polling/types';
5
- import { IFetchAuth } from '../../services/types';
6
- import { ISettings } from '../../types';
7
- import { IPlatform } from '../../sdkFactory/types';
3
+ import { ISyncManagerFactoryParams } from '../types';
8
4
  /**
9
5
  * PushManager factory:
10
6
  * - for server-side if key is not provided in settings.
11
7
  * - for client-side, with support for multiple clients, if key is provided in settings
12
8
  */
13
- export declare function pushManagerFactory(pollingManager: IPollingManager, storage: IStorageSync, readiness: IReadinessManager, fetchAuth: IFetchAuth, platform: IPlatform, settings: ISettings): IPushManagerCS | undefined;
9
+ export declare function pushManagerFactory(params: ISyncManagerFactoryParams, pollingManager: IPollingManager): IPushManager | undefined;
@@ -1,12 +1 @@
1
- import { IPushManagerCS } from './types';
2
- import { IStorageSync } from '../../storages/types';
3
- import { IReadinessManager } from '../../readiness/types';
4
- import { IPollingManager } from '../polling/types';
5
- import { IFetchAuth } from '../../services/types';
6
- import { ISettings } from '../../types';
7
- import { IPlatform } from '../../sdkFactory/types';
8
- /**
9
- * PushManager factory for client-side, with support for multiple clients.
10
- * It assumes settings contains a key.
11
- */
12
- export default function pushManagerCSFactory(pollingManager: IPollingManager, storage: IStorageSync, readiness: IReadinessManager, fetchAuth: IFetchAuth, platform: IPlatform, settings: ISettings): IPushManagerCS | undefined;
1
+ export declare const pushManagerCSFactory: (params: import("../types").ISyncManagerFactoryParams, pollingManager: import("../polling/types").IPollingManager) => import("./types").IPushManager | undefined;
@@ -1,11 +1 @@
1
- import { IPushManager } from './types';
2
- import { IStorageSync } from '../../storages/types';
3
- import { IPollingManager } from '../polling/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
- import { IFetchAuth } from '../../services/types';
6
- import { ISettings } from '../../types';
7
- import { IPlatform } from '../../sdkFactory/types';
8
- /**
9
- * PushManager factory for server-side
10
- */
11
- export default function pushManagerSSFactory(pollingManager: IPollingManager, storage: IStorageSync, readiness: IReadinessManager, fetchAuth: IFetchAuth, platform: IPlatform, settings: ISettings): IPushManager | undefined;
1
+ export declare const pushManagerSSFactory: (params: import("../types").ISyncManagerFactoryParams, pollingManager: import("../polling/types").IPollingManager) => import("./types").IPushManager | undefined;
@@ -1,11 +1,7 @@
1
1
  import { IMySegmentsUpdateData, IMySegmentsUpdateV2Data, ISegmentUpdateData, ISplitUpdateData, ISplitKillData } from './SSEHandler/types';
2
2
  import { ITask } from '../types';
3
- import { IPollingManager, ISegmentsSyncTask } from '../polling/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
- import { IFetchAuth } from '../../services/types';
6
- import { IStorageSync } from '../../storages/types';
7
- import { IEventEmitter, ISettings } from '../../types';
8
- import { IPlatform } from '../../sdkFactory/types';
3
+ import { ISegmentsSyncTask } from '../polling/types';
4
+ import { IEventEmitter } from '../../types';
9
5
  import { ControlType } from './constants';
10
6
  export declare type PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
11
7
  export declare type PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
@@ -30,26 +26,10 @@ export interface IPushEventEmitter extends IEventEmitter {
30
26
  emit<T extends IPushEvent>(event: T, parsedData?: IParsedData<T>, channel?: T extends MY_SEGMENTS_UPDATE ? string : undefined): boolean;
31
27
  }
32
28
  /**
33
- * PushManager for server-side
29
+ * PushManager
34
30
  */
35
31
  export interface IPushManager extends ITask, IPushEventEmitter {
36
- }
37
- /**
38
- * PushManager for client-side with support for multiple clients
39
- */
40
- export interface IPushManagerCS extends IPushManager {
41
32
  add(userKey: string, mySegmentsSyncTask: ISegmentsSyncTask): void;
42
33
  remove(userKey: string): void;
43
34
  }
44
- /**
45
- * Signature of push manager factory/constructor
46
- */
47
- export declare type IPushManagerFactoryParams = [
48
- pollingManager: IPollingManager,
49
- storage: IStorageSync,
50
- readiness: IReadinessManager,
51
- fetchAuth: IFetchAuth,
52
- platform: IPlatform,
53
- settings: ISettings
54
- ];
55
35
  export {};
@@ -1,4 +1,2 @@
1
- import { ISplitApi } from '../../services/types';
2
- import { IStorageSync } from '../../storages/types';
3
- import { ISettings } from '../../types';
4
- export declare function submitterManagerFactory(settings: ISettings, storage: IStorageSync, splitApi: ISplitApi): import("../types").ISyncTask<[], any>;
1
+ import { ISyncManagerFactoryParams } from '../types';
2
+ export declare function submitterManagerFactory(params: ISyncManagerFactoryParams): import("../types").ISyncTask<[], any>;
@@ -1,6 +1,6 @@
1
1
  import { ISyncManagerCS, ISyncManagerFactoryParams } from './types';
2
- import { IPushManagerFactoryParams, IPushManager } from './streaming/types';
3
- import { IPollingManager, IPollingManagerFactoryParams } from './polling/types';
2
+ import { IPushManager } from './streaming/types';
3
+ import { IPollingManager } from './polling/types';
4
4
  /**
5
5
  * Online SyncManager factory.
6
6
  * Can be used for server-side API, and client-side API with or without multiple clients.
@@ -9,4 +9,4 @@ import { IPollingManager, IPollingManagerFactoryParams } from './polling/types';
9
9
  * `pollingManagerSSFactory` or `pollingManagerCSFactory` respectively.
10
10
  * @param pushManagerFactory optional to build a SyncManager with or without streaming support
11
11
  */
12
- export declare function syncManagerOnlineFactory(pollingManagerFactory?: (...args: IPollingManagerFactoryParams) => IPollingManager, pushManagerFactory?: (...args: IPushManagerFactoryParams) => IPushManager | undefined): (params: ISyncManagerFactoryParams) => ISyncManagerCS;
12
+ export declare function syncManagerOnlineFactory(pollingManagerFactory?: (params: ISyncManagerFactoryParams) => IPollingManager, pushManagerFactory?: (params: ISyncManagerFactoryParams, pollingManager: IPollingManager) => IPushManager | undefined): (params: ISyncManagerFactoryParams) => ISyncManagerCS;
@@ -72,10 +72,6 @@ export declare function merge(target: {
72
72
  }, source: {
73
73
  [key: string]: any;
74
74
  }, ...rest: any[]): object;
75
- /**
76
- * Shallow clone an object
77
- */
78
- export declare function shallowClone(obj: any): any;
79
75
  /**
80
76
  * Checks if the target string starts with the sub string.
81
77
  */