@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.
- package/cjs/evaluator/matchers/ew.js +3 -3
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
- package/cjs/sync/polling/pollingManagerCS.js +2 -1
- package/cjs/sync/polling/pollingManagerSS.js +2 -1
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
- package/cjs/sync/streaming/pushManager.js +4 -3
- package/cjs/sync/submitters/submitterManager.js +2 -1
- package/cjs/sync/syncManagerOnline.js +8 -13
- package/cjs/utils/inputValidation/eventProperties.js +3 -1
- package/cjs/utils/lang/index.js +1 -13
- package/esm/evaluator/matchers/ew.js +4 -4
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
- package/esm/sync/polling/pollingManagerCS.js +2 -1
- package/esm/sync/polling/pollingManagerSS.js +2 -1
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
- package/esm/sync/streaming/pushManager.js +4 -3
- package/esm/sync/submitters/submitterManager.js +2 -1
- package/esm/sync/syncManagerOnline.js +8 -13
- package/esm/utils/inputValidation/eventProperties.js +4 -2
- package/esm/utils/lang/index.js +0 -11
- package/package.json +3 -3
- package/src/evaluator/matchers/ew.ts +4 -4
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
- package/src/sync/polling/fetchers/types.ts +1 -0
- package/src/sync/polling/pollingManagerCS.ts +3 -6
- package/src/sync/polling/pollingManagerSS.ts +3 -8
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +2 -1
- package/src/sync/polling/types.ts +0 -12
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -1
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/pushManager.ts +8 -14
- package/src/sync/streaming/types.ts +5 -25
- package/src/sync/submitters/submitterManager.ts +4 -8
- package/src/sync/syncManagerOnline.ts +14 -24
- package/src/utils/inputValidation/eventProperties.ts +4 -2
- package/src/utils/lang/index.ts +0 -14
- package/types/storages/inMemory/index.d.ts +10 -0
- package/types/storages/parseSegments.d.ts +6 -0
- package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +1 -1
- package/types/sync/polling/fetchers/types.d.ts +1 -1
- package/types/sync/polling/pollingManagerCS.d.ts +2 -5
- package/types/sync/polling/pollingManagerSS.d.ts +2 -5
- package/types/sync/polling/types.d.ts +0 -11
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -1
- package/types/sync/streaming/pushManager.d.ts +3 -7
- package/types/sync/streaming/pushManagerCS.d.ts +1 -12
- package/types/sync/streaming/pushManagerSS.d.ts +1 -11
- package/types/sync/streaming/types.d.ts +3 -23
- package/types/sync/submitters/submitterManager.d.ts +2 -4
- package/types/sync/syncManagerOnline.d.ts +3 -3
- 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
|
|
9
|
-
log.debug(constants_1.ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr,
|
|
10
|
-
return
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 (
|
|
20
|
-
var
|
|
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(
|
|
22
|
+
var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
|
|
24
23
|
/** Push Manager */
|
|
25
|
-
var pushManager =
|
|
26
|
-
pushManagerFactory(
|
|
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(
|
|
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
|
-
|
|
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,
|
package/cjs/utils/lang/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
2
|
+
import { endsWith } from '../../utils/lang';
|
|
3
3
|
export function endsWithMatcherContext(log, ruleAttr) {
|
|
4
4
|
return function endsWithMatcher(runtimeAttr) {
|
|
5
|
-
var
|
|
6
|
-
log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr,
|
|
7
|
-
return
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 (
|
|
17
|
-
var
|
|
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(
|
|
19
|
+
var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
|
|
21
20
|
/** Push Manager */
|
|
22
|
-
var pushManager =
|
|
23
|
-
pushManagerFactory(
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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,
|
package/esm/utils/lang/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
28
|
-
"publish:stable": "npm run check && npm run
|
|
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
|
|
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
|
|
7
|
+
let strEndsWith = ruleAttr.some(e => endsWith(runtimeAttr, e));
|
|
8
8
|
|
|
9
|
-
log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr,
|
|
9
|
+
log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, strEndsWith]);
|
|
10
10
|
|
|
11
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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,
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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(
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
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 {
|
|
6
|
-
import { IStorageSync } from '../../storages/types';
|
|
7
|
-
import { ISettings } from '../../types';
|
|
5
|
+
import { ISyncManagerFactoryParams } from '../types';
|
|
8
6
|
|
|
9
|
-
export function submitterManagerFactory(
|
|
10
|
-
|
|
11
|
-
storage
|
|
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 {
|
|
6
|
-
import { IPollingManager, IPollingManagerCS
|
|
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?: (
|
|
20
|
-
pushManagerFactory?: (
|
|
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
|
|
28
|
+
const { log, streamingEnabled } = params.settings;
|
|
35
29
|
|
|
36
30
|
/** Polling Manager */
|
|
37
|
-
const pollingManager = pollingManagerFactory && pollingManagerFactory(
|
|
31
|
+
const pollingManager = pollingManagerFactory && pollingManagerFactory(params);
|
|
38
32
|
|
|
39
33
|
/** Push Manager */
|
|
40
|
-
const pushManager =
|
|
41
|
-
pushManagerFactory(
|
|
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(
|
|
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
|
-
|
|
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)
|
|
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,
|
|
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
|
-
|
|
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,
|
package/src/utils/lang/index.ts
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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
|
|
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 {
|
|
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(
|
|
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(
|
|
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(
|
|
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 {
|
|
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 {
|
|
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(
|
|
9
|
+
export declare function pushManagerFactory(params: ISyncManagerFactoryParams, pollingManager: IPollingManager): IPushManager | undefined;
|
|
@@ -1,12 +1 @@
|
|
|
1
|
-
import
|
|
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
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
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 {
|
|
2
|
-
|
|
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 {
|
|
3
|
-
import { IPollingManager
|
|
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?: (
|
|
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
|
*/
|