@splitsoftware/splitio-commons 1.15.1-rc.3 → 1.16.1-rc.0
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/CHANGES.txt +5 -3
- package/cjs/evaluator/matchers/index.js +3 -1
- package/cjs/evaluator/matchers/large_segment.js +16 -0
- package/cjs/evaluator/matchers/matcherTypes.js +1 -0
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/info.js +0 -1
- package/cjs/readiness/readinessManager.js +11 -6
- package/cjs/readiness/sdkReadinessManager.js +5 -6
- package/cjs/sdkClient/sdkClientMethodCS.js +3 -4
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +4 -5
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/splitApi.js +4 -0
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +5 -5
- package/cjs/storages/KeyBuilder.js +3 -0
- package/cjs/storages/KeyBuilderCS.js +17 -5
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +16 -4
- package/cjs/storages/inLocalStorage/index.js +6 -2
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +20 -11
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/cjs/sync/polling/pollingManagerCS.js +54 -30
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +13 -8
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -0
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +6 -5
- package/cjs/sync/streaming/constants.js +2 -1
- package/cjs/sync/streaming/pushManager.js +96 -64
- package/cjs/sync/submitters/telemetrySubmitter.js +2 -0
- package/cjs/sync/syncManagerOnline.js +24 -14
- package/cjs/utils/constants/index.js +5 -1
- package/cjs/utils/settingsValidation/index.js +9 -4
- package/esm/evaluator/matchers/index.js +3 -1
- package/esm/evaluator/matchers/large_segment.js +12 -0
- package/esm/evaluator/matchers/matcherTypes.js +1 -0
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +0 -1
- package/esm/readiness/readinessManager.js +11 -6
- package/esm/readiness/sdkReadinessManager.js +5 -6
- package/esm/sdkClient/sdkClientMethodCS.js +4 -5
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +5 -6
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/splitApi.js +5 -1
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +3 -3
- package/esm/storages/KeyBuilder.js +3 -0
- package/esm/storages/KeyBuilderCS.js +15 -4
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +17 -5
- package/esm/storages/inLocalStorage/index.js +7 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/esm/storages/inMemory/SplitsCacheInMemory.js +21 -12
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/esm/sync/polling/pollingManagerCS.js +55 -31
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +11 -6
- package/esm/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/esm/sync/streaming/SSEHandler/index.js +2 -1
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +6 -5
- package/esm/sync/streaming/constants.js +1 -0
- package/esm/sync/streaming/pushManager.js +96 -65
- package/esm/sync/submitters/telemetrySubmitter.js +2 -0
- package/esm/sync/syncManagerOnline.js +25 -15
- package/esm/utils/constants/index.js +4 -0
- package/esm/utils/settingsValidation/index.js +10 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +7 -1
- package/src/evaluator/matchers/index.ts +2 -0
- package/src/evaluator/matchers/large_segment.ts +18 -0
- package/src/evaluator/matchers/matcherTypes.ts +1 -0
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +0 -1
- package/src/readiness/readinessManager.ts +11 -5
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +3 -2
- package/src/sdkClient/sdkClientMethodCS.ts +4 -6
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +5 -7
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/splitApi.ts +6 -1
- package/src/services/types.ts +1 -0
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +4 -4
- package/src/storages/KeyBuilder.ts +3 -0
- package/src/storages/KeyBuilderCS.ts +25 -5
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +20 -5
- package/src/storages/inLocalStorage/index.ts +8 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
- package/src/storages/inMemory/SplitsCacheInMemory.ts +15 -10
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
- package/src/storages/types.ts +6 -4
- package/src/sync/polling/pollingManagerCS.ts +62 -27
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +8 -9
- package/src/sync/polling/types.ts +4 -3
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +13 -10
- package/src/sync/polling/updaters/splitChangesUpdater.ts +4 -3
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +14 -2
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +7 -5
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +101 -63
- package/src/sync/streaming/types.ts +5 -3
- package/src/sync/submitters/telemetrySubmitter.ts +2 -0
- package/src/sync/submitters/types.ts +10 -4
- package/src/sync/syncManagerOnline.ts +19 -11
- package/src/types.ts +26 -1
- package/src/utils/constants/index.ts +5 -0
- package/src/utils/settingsValidation/index.ts +11 -6
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +5 -1
- package/types/evaluator/matchers/large_segment.d.ts +5 -0
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +2 -3
- package/types/readiness/types.d.ts +3 -2
- package/types/services/types.d.ts +1 -0
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +1 -0
- package/types/storages/KeyBuilderCS.d.ts +7 -2
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +3 -2
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
- package/types/storages/types.d.ts +4 -3
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -3
- package/types/sync/polling/types.d.ts +10 -3
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEHandler/types.d.ts +13 -2
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/constants.d.ts +1 -0
- package/types/sync/streaming/pushManager.d.ts +2 -0
- package/types/sync/streaming/types.d.ts +5 -4
- package/types/sync/submitters/types.d.ts +9 -3
- package/types/types.d.ts +25 -0
- package/types/utils/constants/index.d.ts +3 -0
- package/types/utils/settingsValidation/index.d.ts +2 -0
- package/types/utils/settingsValidation/types.d.ts +1 -1
|
@@ -23,9 +23,10 @@ function shouldRecordTelemetry(_a) {
|
|
|
23
23
|
}
|
|
24
24
|
exports.shouldRecordTelemetry = shouldRecordTelemetry;
|
|
25
25
|
var TelemetryCacheInMemory = /** @class */ (function () {
|
|
26
|
-
function TelemetryCacheInMemory(splits, segments) {
|
|
26
|
+
function TelemetryCacheInMemory(splits, segments, largeSegments) {
|
|
27
27
|
this.splits = splits;
|
|
28
28
|
this.segments = segments;
|
|
29
|
+
this.largeSegments = largeSegments;
|
|
29
30
|
// isEmpty flag
|
|
30
31
|
this.e = true;
|
|
31
32
|
this.notReadyUsage = 0;
|
|
@@ -41,10 +42,7 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
41
42
|
this.tags = [];
|
|
42
43
|
this.exceptions = {};
|
|
43
44
|
this.latencies = {};
|
|
44
|
-
this.updatesFromSSE = {
|
|
45
|
-
sp: 0,
|
|
46
|
-
ms: 0
|
|
47
|
-
};
|
|
45
|
+
this.updatesFromSSE = {};
|
|
48
46
|
}
|
|
49
47
|
TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
|
|
50
48
|
TelemetryCacheInMemory.prototype.clear = function () { };
|
|
@@ -64,6 +62,8 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
64
62
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
65
63
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
66
64
|
skC: this.segments && this.segments.getKeysCount(),
|
|
65
|
+
lseC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
|
|
66
|
+
lskC: this.largeSegments && this.largeSegments.getKeysCount(),
|
|
67
67
|
sL: this.getSessionLength(),
|
|
68
68
|
eQ: this.getEventStats(constants_1.QUEUED),
|
|
69
69
|
eD: this.getEventStats(constants_1.DROPPED),
|
|
@@ -195,14 +195,11 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
195
195
|
};
|
|
196
196
|
TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
|
|
197
197
|
var result = this.updatesFromSSE;
|
|
198
|
-
this.updatesFromSSE = {
|
|
199
|
-
sp: 0,
|
|
200
|
-
ms: 0,
|
|
201
|
-
};
|
|
198
|
+
this.updatesFromSSE = {};
|
|
202
199
|
return result;
|
|
203
200
|
};
|
|
204
201
|
TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
|
|
205
|
-
this.updatesFromSSE[type]
|
|
202
|
+
this.updatesFromSSE[type] = (this.updatesFromSSE[type] || 0) + 1;
|
|
206
203
|
this.e = false;
|
|
207
204
|
};
|
|
208
205
|
return TelemetryCacheInMemory;
|
|
@@ -7,6 +7,7 @@ var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
|
7
7
|
var key_1 = require("../../utils/key");
|
|
8
8
|
var constants_1 = require("../../readiness/constants");
|
|
9
9
|
var constants_2 = require("../../logger/constants");
|
|
10
|
+
var constants_3 = require("../../utils/constants");
|
|
10
11
|
/**
|
|
11
12
|
* Expose start / stop mechanism for polling data from services.
|
|
12
13
|
* For client-side API with multiple clients.
|
|
@@ -15,59 +16,80 @@ function pollingManagerCSFactory(params) {
|
|
|
15
16
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
16
17
|
var log = settings.log;
|
|
17
18
|
var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
18
|
-
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
19
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask for segments and large segments.
|
|
19
20
|
var mySegmentsSyncTasks = {};
|
|
20
21
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
21
|
-
var
|
|
22
|
+
var _a = add(matchingKey, readiness, storage), msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
22
23
|
function startMySegmentsSyncTasks() {
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
var splitsHaveSegments = storage.splits.usesMatcher(constants_3.IN_SEGMENT);
|
|
25
|
+
var splitsHaveLargeSegments = storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT);
|
|
26
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
|
|
27
|
+
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
28
|
+
if (splitsHaveSegments)
|
|
29
|
+
msSyncTask.start();
|
|
30
|
+
else
|
|
31
|
+
msSyncTask.stop();
|
|
32
|
+
if (mlsSyncTask) {
|
|
33
|
+
if (splitsHaveLargeSegments)
|
|
34
|
+
mlsSyncTask.start();
|
|
35
|
+
else
|
|
36
|
+
mlsSyncTask.stop();
|
|
37
|
+
}
|
|
25
38
|
});
|
|
26
39
|
}
|
|
27
40
|
function stopMySegmentsSyncTasks() {
|
|
28
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (
|
|
29
|
-
|
|
30
|
-
|
|
41
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
|
|
42
|
+
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
43
|
+
msSyncTask.stop();
|
|
44
|
+
mlsSyncTask && mlsSyncTask.stop();
|
|
31
45
|
});
|
|
32
46
|
}
|
|
33
47
|
// smart pausing
|
|
34
48
|
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (splitsHaveSegments !== mySegmentsSyncTask.isRunning()) {
|
|
39
|
-
log.info(constants_2.POLLING_SMART_PAUSING, [splitsHaveSegments ? 'ON' : 'OFF']);
|
|
40
|
-
if (splitsHaveSegments) {
|
|
41
|
-
startMySegmentsSyncTasks();
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
stopMySegmentsSyncTasks();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
49
|
+
// smart pausing of mySegments polling
|
|
50
|
+
if (splitsSyncTask.isRunning())
|
|
51
|
+
startMySegmentsSyncTasks();
|
|
47
52
|
});
|
|
48
53
|
function add(matchingKey, readiness, storage) {
|
|
49
|
-
var
|
|
54
|
+
var msSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMySegments, storage.segments, function () {
|
|
55
|
+
if (storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
56
|
+
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
57
|
+
}, settings, matchingKey, settings.scheduler.segmentsRefreshRate);
|
|
58
|
+
var mlsSyncTask;
|
|
59
|
+
if (settings.sync.largeSegmentsEnabled) {
|
|
60
|
+
mlsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMyLargeSegments, storage.largeSegments, function () {
|
|
61
|
+
if (readiness.largeSegments && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
62
|
+
readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
63
|
+
}, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate);
|
|
64
|
+
}
|
|
50
65
|
// smart ready
|
|
51
66
|
function smartReady() {
|
|
52
|
-
if (!readiness.isReady()
|
|
53
|
-
|
|
67
|
+
if (!readiness.isReady()) {
|
|
68
|
+
if (!storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
69
|
+
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
70
|
+
if (readiness.largeSegments && !storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
71
|
+
readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
72
|
+
}
|
|
54
73
|
}
|
|
55
|
-
if (!storage.splits.
|
|
74
|
+
if (!storage.splits.usesMatcher(constants_3.IN_SEGMENT) && !storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
56
75
|
setTimeout(smartReady, 0);
|
|
57
76
|
else
|
|
58
77
|
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
59
|
-
mySegmentsSyncTasks[matchingKey] =
|
|
60
|
-
return
|
|
78
|
+
mySegmentsSyncTasks[matchingKey] = { msSyncTask: msSyncTask, mlsSyncTask: mlsSyncTask };
|
|
79
|
+
return {
|
|
80
|
+
msSyncTask: msSyncTask,
|
|
81
|
+
mlsSyncTask: mlsSyncTask
|
|
82
|
+
};
|
|
61
83
|
}
|
|
62
84
|
return {
|
|
63
85
|
splitsSyncTask: splitsSyncTask,
|
|
64
|
-
segmentsSyncTask:
|
|
86
|
+
segmentsSyncTask: msSyncTask,
|
|
87
|
+
largeSegmentsSyncTask: mlsSyncTask,
|
|
65
88
|
// Start periodic fetching (polling)
|
|
66
89
|
start: function () {
|
|
67
90
|
log.info(constants_2.POLLING_START);
|
|
68
91
|
splitsSyncTask.start();
|
|
69
|
-
|
|
70
|
-
startMySegmentsSyncTasks();
|
|
92
|
+
startMySegmentsSyncTasks();
|
|
71
93
|
},
|
|
72
94
|
// Stop periodic fetching (polling)
|
|
73
95
|
stop: function () {
|
|
@@ -81,8 +103,10 @@ function pollingManagerCSFactory(params) {
|
|
|
81
103
|
// fetch splits and segments
|
|
82
104
|
syncAll: function () {
|
|
83
105
|
var promises = [splitsSyncTask.execute()];
|
|
84
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (
|
|
85
|
-
|
|
106
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
|
|
107
|
+
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
108
|
+
promises.push(msSyncTask.execute());
|
|
109
|
+
mlsSyncTask && promises.push(mlsSyncTask.execute());
|
|
86
110
|
});
|
|
87
111
|
return Promise.all(promises);
|
|
88
112
|
},
|
|
@@ -7,7 +7,7 @@ var mySegmentsUpdater_1 = require("../updaters/mySegmentsUpdater");
|
|
|
7
7
|
/**
|
|
8
8
|
* Creates a sync task that periodically executes a `mySegmentsUpdater` task
|
|
9
9
|
*/
|
|
10
|
-
function mySegmentsSyncTaskFactory(fetchMySegments,
|
|
11
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMySegments),
|
|
10
|
+
function mySegmentsSyncTaskFactory(fetchMySegments, mySegmentsCache, notifyUpdate, settings, matchingKey, segmentsRefreshRate) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMySegments), mySegmentsCache, notifyUpdate, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), segmentsRefreshRate, 'mySegmentsUpdater');
|
|
12
12
|
}
|
|
13
13
|
exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mySegmentsUpdaterFactory = void 0;
|
|
4
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
5
|
-
var constants_1 = require("../../../
|
|
6
|
-
var constants_2 = require("../../../logger/constants");
|
|
5
|
+
var constants_1 = require("../../../logger/constants");
|
|
7
6
|
/**
|
|
8
7
|
* factory of MySegments updater, a task that:
|
|
9
8
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
10
9
|
* - updates `mySegmentsCache`
|
|
11
10
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
12
11
|
*/
|
|
13
|
-
function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
12
|
+
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notifyUpdate, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
14
13
|
var readyOnAlreadyExistentState = true;
|
|
15
14
|
var startingUp = true;
|
|
16
15
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -41,9 +40,9 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegment
|
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
// Notify update if required
|
|
44
|
-
if (
|
|
43
|
+
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
45
44
|
readyOnAlreadyExistentState = false;
|
|
46
|
-
|
|
45
|
+
notifyUpdate();
|
|
47
46
|
}
|
|
48
47
|
}
|
|
49
48
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -60,7 +59,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegment
|
|
|
60
59
|
return updaterPromise.catch(function (error) {
|
|
61
60
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
62
61
|
retry += 1;
|
|
63
|
-
log.warn(
|
|
62
|
+
log.warn(constants_1.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
|
|
64
63
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
65
64
|
}
|
|
66
65
|
else {
|
|
@@ -79,8 +78,14 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegment
|
|
|
79
78
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
80
79
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
81
80
|
*/
|
|
82
|
-
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
83
|
-
return
|
|
81
|
+
return function mySegmentsUpdater(segmentsData, noCache, delay) {
|
|
82
|
+
return delay ?
|
|
83
|
+
new Promise(function (res) {
|
|
84
|
+
setTimeout(function () {
|
|
85
|
+
_mySegmentsUpdater(0, segmentsData, noCache).then(res);
|
|
86
|
+
}, delay);
|
|
87
|
+
}) :
|
|
88
|
+
_mySegmentsUpdater(0, segmentsData, noCache);
|
|
84
89
|
};
|
|
85
90
|
}
|
|
86
91
|
exports.mySegmentsUpdaterFactory = mySegmentsUpdaterFactory;
|
|
@@ -6,6 +6,7 @@ var timeout_1 = require("../../../utils/promise/timeout");
|
|
|
6
6
|
var constants_1 = require("../../../readiness/constants");
|
|
7
7
|
var constants_2 = require("../../../logger/constants");
|
|
8
8
|
var lang_1 = require("../../../utils/lang");
|
|
9
|
+
var constants_3 = require("../../../utils/constants");
|
|
9
10
|
// Checks that all registered segments have been fetched (changeNumber !== -1 for every segment).
|
|
10
11
|
// Returns a promise that could be rejected.
|
|
11
12
|
// @TODO review together with Segments and MySegments storage APIs
|
|
@@ -26,7 +27,7 @@ function parseSegments(_a) {
|
|
|
26
27
|
for (var i = 0; i < conditions.length; i++) {
|
|
27
28
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
28
29
|
matchers.forEach(function (matcher) {
|
|
29
|
-
if (matcher.matcherType ===
|
|
30
|
+
if (matcher.matcherType === constants_3.IN_SEGMENT)
|
|
30
31
|
segments.add(matcher.userDefinedSegmentMatcherData.segmentName);
|
|
31
32
|
});
|
|
32
33
|
}
|
|
@@ -76,6 +76,7 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
76
76
|
case constants_1.SPLIT_UPDATE:
|
|
77
77
|
case constants_1.SEGMENT_UPDATE:
|
|
78
78
|
case constants_1.MY_SEGMENTS_UPDATE_V2:
|
|
79
|
+
case constants_1.MY_LARGE_SEGMENTS_UPDATE:
|
|
79
80
|
case constants_1.SPLIT_KILL:
|
|
80
81
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
81
82
|
break;
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MySegmentsUpdateWorker = void 0;
|
|
4
4
|
var Backoff_1 = require("../../../utils/Backoff");
|
|
5
|
-
var constants_1 = require("../../../utils/constants");
|
|
6
5
|
/**
|
|
7
6
|
* MySegmentsUpdateWorker factory
|
|
8
7
|
*/
|
|
9
|
-
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
8
|
+
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType) {
|
|
10
9
|
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
11
10
|
var currentChangeNumber = -1;
|
|
12
11
|
var handleNewEvent = false;
|
|
13
12
|
var isHandlingEvent;
|
|
14
13
|
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
14
|
+
var _delay;
|
|
15
15
|
var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
|
|
16
16
|
function __handleMySegmentsUpdateCall() {
|
|
17
17
|
isHandlingEvent = true;
|
|
@@ -19,12 +19,12 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
|
19
19
|
handleNewEvent = false;
|
|
20
20
|
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
21
21
|
// fetch mySegments revalidating data if cached
|
|
22
|
-
mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
|
|
22
|
+
mySegmentsSyncTask.execute(_segmentsData, true, _delay).then(function (result) {
|
|
23
23
|
if (!isHandlingEvent)
|
|
24
24
|
return; // halt if `stop` has been called
|
|
25
25
|
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
26
26
|
if (_segmentsData)
|
|
27
|
-
telemetryTracker.trackUpdatesFromSSE(
|
|
27
|
+
telemetryTracker.trackUpdatesFromSSE(updateType);
|
|
28
28
|
currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
29
29
|
}
|
|
30
30
|
if (handleNewEvent) {
|
|
@@ -46,12 +46,13 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
|
46
46
|
* @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
|
|
47
47
|
* @param {SegmentsData | undefined} segmentsData might be undefined
|
|
48
48
|
*/
|
|
49
|
-
put: function (changeNumber, segmentsData) {
|
|
49
|
+
put: function (changeNumber, segmentsData, delay) {
|
|
50
50
|
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
51
51
|
return;
|
|
52
52
|
maxChangeNumber = changeNumber;
|
|
53
53
|
handleNewEvent = true;
|
|
54
54
|
_segmentsData = segmentsData;
|
|
55
|
+
_delay = delay;
|
|
55
56
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
56
57
|
__handleMySegmentsUpdateCall();
|
|
57
58
|
backoff.reset();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MY_SEGMENTS_UPDATE_V2 = exports.MY_SEGMENTS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.MY_LARGE_SEGMENTS_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MY_SEGMENTS_UPDATE_V2 = exports.MY_SEGMENTS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
|
|
4
4
|
// time for refresh token
|
|
5
5
|
exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
6
6
|
// Internal SDK events, subscribed by SyncManager and PushManager
|
|
@@ -30,6 +30,7 @@ exports.MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
|
|
|
30
30
|
exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
31
31
|
exports.SPLIT_KILL = 'SPLIT_KILL';
|
|
32
32
|
exports.SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
33
|
+
exports.MY_LARGE_SEGMENTS_UPDATE = 'MY_LARGE_SEGMENTS_UPDATE';
|
|
33
34
|
// Control-type push notifications, handled by NotificationKeeper
|
|
34
35
|
exports.CONTROL = 'CONTROL';
|
|
35
36
|
exports.OCCUPANCY = 'OCCUPANCY';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pushManagerFactory = void 0;
|
|
3
|
+
exports.pushManagerFactory = exports.getDelay = void 0;
|
|
4
4
|
var objectAssign_1 = require("../../utils/lang/objectAssign");
|
|
5
5
|
var Backoff_1 = require("../../utils/Backoff");
|
|
6
6
|
var SSEHandler_1 = require("./SSEHandler");
|
|
@@ -16,8 +16,16 @@ var constants_2 = require("../../logger/constants");
|
|
|
16
16
|
var types_1 = require("./SSEHandler/types");
|
|
17
17
|
var parseUtils_1 = require("./parseUtils");
|
|
18
18
|
var sets_1 = require("../../utils/lang/sets");
|
|
19
|
+
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
19
20
|
var murmur3_64_1 = require("../../utils/murmur3/murmur3_64");
|
|
20
21
|
var constants_3 = require("../../utils/constants");
|
|
22
|
+
function getDelay(parsedData, matchingKey) {
|
|
23
|
+
var interval = parsedData.i || 60000;
|
|
24
|
+
// const hashType = parsedData.h || 0;
|
|
25
|
+
var seed = parsedData.s || 0;
|
|
26
|
+
return (0, murmur3_1.hash)(matchingKey, seed) % interval;
|
|
27
|
+
}
|
|
28
|
+
exports.getDelay = getDelay;
|
|
21
29
|
/**
|
|
22
30
|
* PushManager factory:
|
|
23
31
|
* - for server-side if key is not provided in settings.
|
|
@@ -143,8 +151,9 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
143
151
|
splitsUpdateWorker.stop();
|
|
144
152
|
if (userKey)
|
|
145
153
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
146
|
-
var worker = _a.worker;
|
|
147
|
-
|
|
154
|
+
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
155
|
+
worker.stop();
|
|
156
|
+
workerLarge && workerLarge.stop();
|
|
148
157
|
});
|
|
149
158
|
else
|
|
150
159
|
segmentsUpdateWorker.stop();
|
|
@@ -198,77 +207,96 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
198
207
|
}
|
|
199
208
|
splitsUpdateWorker.put(parsedData);
|
|
200
209
|
});
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
});
|
|
209
|
-
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
|
|
210
|
-
switch (parsedData.u) {
|
|
211
|
-
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
212
|
-
var bitmap_1;
|
|
213
|
-
try {
|
|
214
|
-
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
215
|
-
}
|
|
216
|
-
catch (e) {
|
|
217
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
218
|
-
break;
|
|
219
|
-
}
|
|
220
|
-
(0, lang_1.forOwn)(clients, function (_a) {
|
|
221
|
-
var hash64 = _a.hash64, worker = _a.worker;
|
|
222
|
-
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
223
|
-
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
return;
|
|
210
|
+
function handleMySegmentsUpdate(parsedData) {
|
|
211
|
+
var isLS = parsedData.type === constants_1.MY_LARGE_SEGMENTS_UPDATE;
|
|
212
|
+
switch (parsedData.u) {
|
|
213
|
+
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
214
|
+
var bitmap_1;
|
|
215
|
+
try {
|
|
216
|
+
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
227
217
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
218
|
+
catch (e) {
|
|
219
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
223
|
+
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
224
|
+
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
225
|
+
isLS ?
|
|
226
|
+
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
227
|
+
worker.put(parsedData.changeNumber);
|
|
238
228
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
case types_1.UpdateStrategy.KeyList: {
|
|
233
|
+
var keyList = void 0, added_1, removed_1;
|
|
234
|
+
try {
|
|
235
|
+
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
236
|
+
added_1 = new sets_1._Set(keyList.a);
|
|
237
|
+
removed_1 = new sets_1._Set(keyList.r);
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
244
|
+
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
245
|
+
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
246
|
+
if (add !== undefined) {
|
|
247
|
+
isLS ?
|
|
248
|
+
workerLarge && workerLarge.put(parsedData.changeNumber, {
|
|
249
|
+
name: parsedData.largeSegments[0],
|
|
250
|
+
add: add
|
|
251
|
+
}) :
|
|
243
252
|
worker.put(parsedData.changeNumber, {
|
|
244
253
|
name: parsedData.segmentName,
|
|
245
254
|
add: add
|
|
246
255
|
});
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
case types_1.UpdateStrategy.SegmentRemoval:
|
|
252
|
-
if (!parsedData.segmentName) {
|
|
253
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
254
|
-
break;
|
|
255
256
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
case types_1.UpdateStrategy.SegmentRemoval:
|
|
261
|
+
if ((isLS && parsedData.largeSegments.length === 0) || (!isLS && !parsedData.segmentName)) {
|
|
262
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
266
|
+
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
267
|
+
isLS ?
|
|
268
|
+
workerLarge && parsedData.largeSegments.forEach(function (largeSegment) {
|
|
269
|
+
workerLarge.put(parsedData.changeNumber, {
|
|
270
|
+
name: largeSegment,
|
|
271
|
+
add: false
|
|
272
|
+
});
|
|
273
|
+
}) :
|
|
274
|
+
worker.put(parsedData.changeNumber, {
|
|
259
275
|
name: parsedData.segmentName,
|
|
260
276
|
add: false
|
|
261
277
|
});
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
278
|
+
});
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
282
|
+
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
283
|
+
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
284
|
+
isLS ?
|
|
285
|
+
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
268
286
|
worker.put(parsedData.changeNumber);
|
|
269
|
-
});
|
|
270
287
|
});
|
|
271
288
|
}
|
|
289
|
+
if (userKey) {
|
|
290
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
|
|
291
|
+
var userKeyHash = channel.split('_')[2];
|
|
292
|
+
var userKey = userKeyHashes[userKeyHash];
|
|
293
|
+
if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
|
|
294
|
+
clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, handleMySegmentsUpdate);
|
|
298
|
+
pushEmitter.on(constants_1.MY_LARGE_SEGMENTS_UPDATE, handleMySegmentsUpdate);
|
|
299
|
+
}
|
|
272
300
|
else {
|
|
273
301
|
pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
274
302
|
}
|
|
@@ -290,7 +318,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
290
318
|
return;
|
|
291
319
|
disconnected = false;
|
|
292
320
|
if (userKey)
|
|
293
|
-
this.add(userKey, pollingManager.segmentsSyncTask); // client-side
|
|
321
|
+
this.add(userKey, pollingManager.segmentsSyncTask, pollingManager.largeSegmentsSyncTask); // client-side
|
|
294
322
|
else
|
|
295
323
|
setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
|
|
296
324
|
},
|
|
@@ -299,11 +327,15 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
299
327
|
return disconnected === false;
|
|
300
328
|
},
|
|
301
329
|
// [Only for client-side]
|
|
302
|
-
add: function (userKey, mySegmentsSyncTask) {
|
|
330
|
+
add: function (userKey, mySegmentsSyncTask, myLargeSegmentsSyncTask) {
|
|
303
331
|
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
304
332
|
if (!userKeyHashes[hash]) {
|
|
305
333
|
userKeyHashes[hash] = userKey;
|
|
306
|
-
clients[userKey] = {
|
|
334
|
+
clients[userKey] = {
|
|
335
|
+
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
336
|
+
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker, constants_3.MY_SEGMENT),
|
|
337
|
+
workerLarge: myLargeSegmentsSyncTask ? (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(myLargeSegmentsSyncTask, telemetryTracker, constants_3.MY_LARGE_SEGMENT) : undefined
|
|
338
|
+
};
|
|
307
339
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
308
340
|
// Reconnects in case of a new client.
|
|
309
341
|
// Run in next event-loop cycle to save authentication calls
|
|
@@ -65,10 +65,12 @@ function telemetryCacheConfigAdapter(telemetry, settings) {
|
|
|
65
65
|
var _a = getTelemetryFlagSetsStats(settings.sync.__splitFiltersValidation), flagSetsTotal = _a.flagSetsTotal, flagSetsIgnored = _a.flagSetsIgnored;
|
|
66
66
|
return (0, objectAssign_1.objectAssign)(getTelemetryConfigStats(settings.mode, settings.storage.type), {
|
|
67
67
|
sE: settings.streamingEnabled,
|
|
68
|
+
lE: isClientSide ? settings.sync.largeSegmentsEnabled : undefined,
|
|
68
69
|
rR: {
|
|
69
70
|
sp: scheduler.featuresRefreshRate / 1000,
|
|
70
71
|
se: isClientSide ? undefined : scheduler.segmentsRefreshRate / 1000,
|
|
71
72
|
ms: isClientSide ? scheduler.segmentsRefreshRate / 1000 : undefined,
|
|
73
|
+
mls: isClientSide && settings.sync.largeSegmentsEnabled ? scheduler.largeSegmentsRefreshRate / 1000 : undefined,
|
|
72
74
|
im: scheduler.impressionsRefreshRate / 1000,
|
|
73
75
|
ev: scheduler.eventsPushRate / 1000,
|
|
74
76
|
te: scheduler.telemetryRefreshRate / 1000,
|
|
@@ -117,43 +117,53 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
117
117
|
shared: function (matchingKey, readinessManager, storage) {
|
|
118
118
|
if (!pollingManager)
|
|
119
119
|
return;
|
|
120
|
-
var
|
|
120
|
+
var _a = pollingManager.add(matchingKey, readinessManager, storage), msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
121
121
|
return {
|
|
122
|
-
isRunning:
|
|
122
|
+
isRunning: msSyncTask.isRunning,
|
|
123
123
|
start: function () {
|
|
124
124
|
if (syncEnabled) {
|
|
125
125
|
if (pushManager) {
|
|
126
126
|
if (pollingManager.isRunning()) {
|
|
127
127
|
// if doing polling, we must start the periodic fetch of data
|
|
128
|
-
if (storage.splits.
|
|
129
|
-
|
|
128
|
+
if (storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
129
|
+
msSyncTask.start();
|
|
130
|
+
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
131
|
+
mlsSyncTask.start();
|
|
130
132
|
}
|
|
131
133
|
else {
|
|
132
134
|
// if not polling, we must execute the sync task for the initial fetch
|
|
133
135
|
// of segments since `syncAll` was already executed when starting the main client
|
|
134
|
-
|
|
136
|
+
msSyncTask.execute();
|
|
137
|
+
mlsSyncTask && mlsSyncTask.execute();
|
|
135
138
|
}
|
|
136
|
-
pushManager.add(matchingKey,
|
|
139
|
+
pushManager.add(matchingKey, msSyncTask, mlsSyncTask);
|
|
137
140
|
}
|
|
138
141
|
else {
|
|
139
|
-
if (storage.splits.
|
|
140
|
-
|
|
142
|
+
if (storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
143
|
+
msSyncTask.start();
|
|
144
|
+
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
145
|
+
mlsSyncTask.start();
|
|
141
146
|
}
|
|
142
147
|
}
|
|
143
148
|
else {
|
|
144
|
-
if (!readinessManager.isReady())
|
|
145
|
-
|
|
149
|
+
if (!readinessManager.isReady()) {
|
|
150
|
+
msSyncTask.execute();
|
|
151
|
+
mlsSyncTask && mlsSyncTask.execute();
|
|
152
|
+
}
|
|
146
153
|
}
|
|
147
154
|
},
|
|
148
155
|
stop: function () {
|
|
149
156
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
150
|
-
var
|
|
151
|
-
if (
|
|
157
|
+
var syncTasks = pollingManager.get(matchingKey);
|
|
158
|
+
if (syncTasks) {
|
|
159
|
+
var msSyncTask_1 = syncTasks.msSyncTask, mlsSyncTask_1 = syncTasks.mlsSyncTask;
|
|
152
160
|
// stop syncing
|
|
153
161
|
if (pushManager)
|
|
154
162
|
pushManager.remove(matchingKey);
|
|
155
|
-
if (
|
|
156
|
-
|
|
163
|
+
if (msSyncTask_1.isRunning())
|
|
164
|
+
msSyncTask_1.stop();
|
|
165
|
+
if (mlsSyncTask_1 && mlsSyncTask_1.isRunning())
|
|
166
|
+
mlsSyncTask_1.stop();
|
|
157
167
|
pollingManager.remove(matchingKey);
|
|
158
168
|
}
|
|
159
169
|
},
|