@splitsoftware/splitio-commons 1.16.1-rc.8 → 1.17.0-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/CHANGES.txt +2 -1
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -3
- package/cjs/logger/messages/info.js +2 -1
- package/cjs/readiness/readinessManager.js +10 -14
- package/cjs/readiness/sdkReadinessManager.js +6 -5
- package/cjs/sdkClient/sdkClientMethodCS.js +2 -2
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +2 -2
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/decorateHeaders.js +43 -0
- package/cjs/services/splitApi.js +0 -4
- package/cjs/services/splitHttpClient.js +5 -4
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +6 -5
- package/cjs/storages/KeyBuilder.js +0 -3
- package/cjs/storages/KeyBuilderCS.js +5 -17
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
- package/cjs/storages/inLocalStorage/index.js +2 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -5
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +11 -20
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
- package/cjs/sync/polling/pollingManagerCS.js +33 -51
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -20
- package/cjs/sync/streaming/SSEClient/index.js +9 -12
- package/cjs/sync/streaming/SSEHandler/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
- package/cjs/sync/streaming/constants.js +1 -2
- package/cjs/sync/streaming/parseUtils.js +8 -3
- package/cjs/sync/streaming/pushManager.js +69 -100
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -4
- package/cjs/sync/syncManagerOnline.js +14 -24
- package/cjs/utils/constants/index.js +2 -4
- package/cjs/utils/settingsValidation/index.js +2 -7
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -0
- package/esm/logger/messages/info.js +2 -1
- package/esm/readiness/readinessManager.js +10 -14
- package/esm/readiness/sdkReadinessManager.js +6 -5
- package/esm/sdkClient/sdkClientMethodCS.js +2 -2
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +2 -2
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/decorateHeaders.js +39 -0
- package/esm/services/splitApi.js +1 -5
- package/esm/services/splitHttpClient.js +5 -4
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +4 -3
- package/esm/storages/KeyBuilder.js +0 -3
- package/esm/storages/KeyBuilderCS.js +4 -15
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
- package/esm/storages/inLocalStorage/index.js +3 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -5
- package/esm/storages/inMemory/SplitsCacheInMemory.js +12 -21
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
- package/esm/sync/polling/pollingManagerCS.js +34 -52
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +19 -18
- package/esm/sync/streaming/SSEClient/index.js +10 -13
- package/esm/sync/streaming/SSEHandler/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
- package/esm/sync/streaming/constants.js +0 -1
- package/esm/sync/streaming/parseUtils.js +8 -3
- package/esm/sync/streaming/pushManager.js +70 -100
- package/esm/sync/submitters/telemetrySubmitter.js +0 -4
- package/esm/sync/syncManagerOnline.js +15 -25
- package/esm/utils/constants/index.js +1 -3
- package/esm/utils/settingsValidation/index.js +2 -7
- package/package.json +1 -1
- package/src/dtos/types.ts +7 -17
- package/src/evaluator/matchers/index.ts +0 -2
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -0
- package/src/logger/messages/info.ts +2 -1
- package/src/readiness/readinessManager.ts +9 -13
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -3
- package/src/sdkClient/sdkClientMethodCS.ts +2 -2
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -2
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/decorateHeaders.ts +41 -0
- package/src/services/splitApi.ts +2 -7
- package/src/services/splitHttpClient.ts +6 -5
- package/src/services/types.ts +0 -1
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +5 -4
- package/src/storages/KeyBuilder.ts +0 -3
- package/src/storages/KeyBuilderCS.ts +5 -25
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
- package/src/storages/inLocalStorage/index.ts +4 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -5
- package/src/storages/inMemory/SplitsCacheInMemory.ts +10 -15
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +5 -7
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -6
- package/src/sync/polling/pollingManagerCS.ts +29 -61
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
- package/src/sync/polling/types.ts +3 -4
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +20 -17
- package/src/sync/streaming/SSEClient/index.ts +14 -20
- package/src/sync/streaming/SSEHandler/index.ts +1 -2
- package/src/sync/streaming/SSEHandler/types.ts +2 -14
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +10 -26
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
- package/src/sync/streaming/constants.ts +0 -1
- package/src/sync/streaming/parseUtils.ts +10 -6
- package/src/sync/streaming/pushManager.ts +68 -104
- package/src/sync/streaming/types.ts +3 -5
- package/src/sync/submitters/telemetrySubmitter.ts +0 -4
- package/src/sync/submitters/types.ts +4 -11
- package/src/sync/syncManagerOnline.ts +11 -19
- package/src/types.ts +9 -28
- package/src/utils/constants/index.ts +1 -3
- package/src/utils/settingsValidation/index.ts +3 -8
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +6 -14
- package/types/logger/constants.d.ts +1 -0
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +3 -2
- package/types/readiness/types.d.ts +2 -3
- package/types/services/decorateHeaders.d.ts +2 -0
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +0 -1
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +0 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -7
- 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 +2 -3
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +3 -4
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +3 -2
- package/types/sync/polling/types.d.ts +3 -10
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEClient/index.d.ts +2 -5
- package/types/sync/streaming/SSEHandler/types.d.ts +2 -13
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
- package/types/sync/streaming/constants.d.ts +0 -1
- package/types/sync/streaming/parseUtils.d.ts +4 -2
- package/types/sync/streaming/pushManager.d.ts +0 -2
- package/types/sync/streaming/types.d.ts +4 -5
- package/types/sync/submitters/types.d.ts +3 -10
- package/types/types.d.ts +11 -26
- package/types/utils/constants/index.d.ts +1 -3
- package/types/utils/settingsValidation/index.d.ts +0 -2
- package/types/utils/settingsValidation/types.d.ts +1 -1
- package/cjs/evaluator/matchers/large_segment.js +0 -16
- package/esm/evaluator/matchers/large_segment.js +0 -12
- package/src/evaluator/matchers/large_segment.ts +0 -18
|
@@ -5,7 +5,6 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
7
|
var sets_1 = require("../../utils/lang/sets");
|
|
8
|
-
var constants_1 = require("../../utils/constants");
|
|
9
8
|
/**
|
|
10
9
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
11
10
|
* Supported by all JS runtimes.
|
|
@@ -17,8 +16,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
17
16
|
_this.splitsCache = {};
|
|
18
17
|
_this.ttCache = {};
|
|
19
18
|
_this.changeNumber = -1;
|
|
20
|
-
_this.
|
|
21
|
-
_this.largeSegmentsCount = 0;
|
|
19
|
+
_this.splitsWithSegmentsCount = 0;
|
|
22
20
|
_this.flagSetsCache = {};
|
|
23
21
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
24
22
|
return _this;
|
|
@@ -27,8 +25,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
27
25
|
this.splitsCache = {};
|
|
28
26
|
this.ttCache = {};
|
|
29
27
|
this.changeNumber = -1;
|
|
30
|
-
this.
|
|
31
|
-
this.largeSegmentsCount = 0;
|
|
28
|
+
this.splitsWithSegmentsCount = 0;
|
|
32
29
|
};
|
|
33
30
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
34
31
|
var previousSplit = this.getSplit(name);
|
|
@@ -38,11 +35,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
38
35
|
if (!this.ttCache[previousTtName])
|
|
39
36
|
delete this.ttCache[previousTtName];
|
|
40
37
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
41
|
-
// Substract from segments count for the previous version of this Split.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_LARGE_SEGMENT))
|
|
45
|
-
this.largeSegmentsCount--;
|
|
38
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit)) { // Substract from segments count for the previous version of this Split.
|
|
39
|
+
this.splitsWithSegmentsCount--;
|
|
40
|
+
}
|
|
46
41
|
}
|
|
47
42
|
if (split) {
|
|
48
43
|
// Store the Split.
|
|
@@ -52,10 +47,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
52
47
|
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
53
48
|
this.addToFlagSets(split);
|
|
54
49
|
// Add to segments count for the new version of the Split
|
|
55
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
56
|
-
this.
|
|
57
|
-
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
|
|
58
|
-
this.largeSegmentsCount++;
|
|
50
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
51
|
+
this.splitsWithSegmentsCount++;
|
|
59
52
|
return true;
|
|
60
53
|
}
|
|
61
54
|
else {
|
|
@@ -73,10 +66,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
73
66
|
delete this.ttCache[ttName];
|
|
74
67
|
this.removeFromFlagSets(split.name, split.sets);
|
|
75
68
|
// Update the segments count.
|
|
76
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
77
|
-
this.
|
|
78
|
-
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
|
|
79
|
-
this.largeSegmentsCount--;
|
|
69
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
70
|
+
this.splitsWithSegmentsCount--;
|
|
80
71
|
return true;
|
|
81
72
|
}
|
|
82
73
|
else {
|
|
@@ -99,8 +90,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
99
90
|
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
100
91
|
return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
101
92
|
};
|
|
102
|
-
SplitsCacheInMemory.prototype.
|
|
103
|
-
return this.getChangeNumber() === -1 ||
|
|
93
|
+
SplitsCacheInMemory.prototype.usesSegments = function () {
|
|
94
|
+
return this.getChangeNumber() === -1 || this.splitsWithSegmentsCount > 0;
|
|
104
95
|
};
|
|
105
96
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
106
97
|
var _this = this;
|
|
@@ -23,10 +23,9 @@ 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) {
|
|
27
27
|
this.splits = splits;
|
|
28
28
|
this.segments = segments;
|
|
29
|
-
this.largeSegments = largeSegments;
|
|
30
29
|
// isEmpty flag
|
|
31
30
|
this.e = true;
|
|
32
31
|
this.notReadyUsage = 0;
|
|
@@ -42,7 +41,10 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
42
41
|
this.tags = [];
|
|
43
42
|
this.exceptions = {};
|
|
44
43
|
this.latencies = {};
|
|
45
|
-
this.updatesFromSSE = {
|
|
44
|
+
this.updatesFromSSE = {
|
|
45
|
+
sp: 0,
|
|
46
|
+
ms: 0
|
|
47
|
+
};
|
|
46
48
|
}
|
|
47
49
|
TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
|
|
48
50
|
TelemetryCacheInMemory.prototype.clear = function () { };
|
|
@@ -62,8 +64,6 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
62
64
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
63
65
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
64
66
|
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,11 +195,14 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
195
195
|
};
|
|
196
196
|
TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
|
|
197
197
|
var result = this.updatesFromSSE;
|
|
198
|
-
this.updatesFromSSE = {
|
|
198
|
+
this.updatesFromSSE = {
|
|
199
|
+
sp: 0,
|
|
200
|
+
ms: 0,
|
|
201
|
+
};
|
|
199
202
|
return result;
|
|
200
203
|
};
|
|
201
204
|
TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
|
|
202
|
-
this.updatesFromSSE[type]
|
|
205
|
+
this.updatesFromSSE[type]++;
|
|
203
206
|
this.e = false;
|
|
204
207
|
};
|
|
205
208
|
return TelemetryCacheInMemory;
|
|
@@ -8,7 +8,7 @@ var sets_1 = require("../../utils/lang/sets");
|
|
|
8
8
|
* The `_cache` property is the object were items are stored.
|
|
9
9
|
* Intended for testing purposes.
|
|
10
10
|
*
|
|
11
|
-
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves
|
|
11
|
+
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves inmediatelly.
|
|
12
12
|
*/
|
|
13
13
|
function inMemoryWrapperFactory(connDelay) {
|
|
14
14
|
var _cache = {};
|
|
@@ -15,11 +15,7 @@ function mySegmentsFetcherFactory(fetchMySegments) {
|
|
|
15
15
|
// Extract segment names
|
|
16
16
|
return mySegmentsPromise
|
|
17
17
|
.then(function (resp) { return resp.json(); })
|
|
18
|
-
.then(function (json) {
|
|
19
|
-
return json.mySegments ?
|
|
20
|
-
json.mySegments.map(function (segment) { return segment.name; }) :
|
|
21
|
-
json.myLargeSegments;
|
|
22
|
-
});
|
|
18
|
+
.then(function (json) { return json.mySegments.map(function (segment) { return segment.name; }); });
|
|
23
19
|
};
|
|
24
20
|
}
|
|
25
21
|
exports.mySegmentsFetcherFactory = mySegmentsFetcherFactory;
|
|
@@ -7,7 +7,6 @@ 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");
|
|
11
10
|
/**
|
|
12
11
|
* Expose start / stop mechanism for polling data from services.
|
|
13
12
|
* For client-side API with multiple clients.
|
|
@@ -16,74 +15,59 @@ function pollingManagerCSFactory(params) {
|
|
|
16
15
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
17
16
|
var log = settings.log;
|
|
18
17
|
var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
19
|
-
// Map of matching keys to their corresponding MySegmentsSyncTask
|
|
18
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
20
19
|
var mySegmentsSyncTasks = {};
|
|
21
20
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
22
|
-
var
|
|
21
|
+
var mySegmentsSyncTask = add(matchingKey, readiness, storage);
|
|
23
22
|
function startMySegmentsSyncTasks() {
|
|
24
|
-
|
|
25
|
-
|
|
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(); // smart pausing
|
|
32
|
-
if (mlsSyncTask) {
|
|
33
|
-
if (splitsHaveLargeSegments)
|
|
34
|
-
mlsSyncTask.start();
|
|
35
|
-
else
|
|
36
|
-
mlsSyncTask.stop(); // smart pausing
|
|
37
|
-
}
|
|
23
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
24
|
+
mySegmentsSyncTask.start();
|
|
38
25
|
});
|
|
39
26
|
}
|
|
40
27
|
function stopMySegmentsSyncTasks() {
|
|
41
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
mlsSyncTask && mlsSyncTask.stop();
|
|
28
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
29
|
+
if (mySegmentsSyncTask.isRunning())
|
|
30
|
+
mySegmentsSyncTask.stop();
|
|
45
31
|
});
|
|
46
32
|
}
|
|
33
|
+
// smart pausing
|
|
47
34
|
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
48
|
-
if (splitsSyncTask.isRunning())
|
|
49
|
-
|
|
35
|
+
if (!splitsSyncTask.isRunning())
|
|
36
|
+
return; // noop if not doing polling
|
|
37
|
+
var splitsHaveSegments = storage.splits.usesSegments();
|
|
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
|
+
}
|
|
50
47
|
});
|
|
51
48
|
function add(matchingKey, readiness, storage) {
|
|
52
|
-
var
|
|
53
|
-
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
54
|
-
var mlsSyncTask;
|
|
55
|
-
if (settings.sync.largeSegmentsEnabled) {
|
|
56
|
-
mlsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMyLargeSegments, storage.largeSegments, function () { if (readiness.largeSegments && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
57
|
-
readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate, 'myLargeSegmentsUpdater');
|
|
58
|
-
}
|
|
49
|
+
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMySegments, storage, readiness, settings, matchingKey);
|
|
59
50
|
// smart ready
|
|
60
51
|
function smartReady() {
|
|
61
|
-
if (!readiness.isReady())
|
|
62
|
-
|
|
63
|
-
readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
64
|
-
if (!storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
65
|
-
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
66
|
-
}
|
|
52
|
+
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
53
|
+
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
67
54
|
}
|
|
68
|
-
if (storage.splits.
|
|
69
|
-
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
70
|
-
else
|
|
55
|
+
if (!storage.splits.usesSegments())
|
|
71
56
|
setTimeout(smartReady, 0);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
57
|
+
else
|
|
58
|
+
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
59
|
+
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
60
|
+
return mySegmentsSyncTask;
|
|
77
61
|
}
|
|
78
62
|
return {
|
|
79
63
|
splitsSyncTask: splitsSyncTask,
|
|
80
|
-
segmentsSyncTask:
|
|
81
|
-
largeSegmentsSyncTask: mlsSyncTask,
|
|
64
|
+
segmentsSyncTask: mySegmentsSyncTask,
|
|
82
65
|
// Start periodic fetching (polling)
|
|
83
66
|
start: function () {
|
|
84
67
|
log.info(constants_2.POLLING_START);
|
|
85
68
|
splitsSyncTask.start();
|
|
86
|
-
|
|
69
|
+
if (storage.splits.usesSegments())
|
|
70
|
+
startMySegmentsSyncTasks();
|
|
87
71
|
},
|
|
88
72
|
// Stop periodic fetching (polling)
|
|
89
73
|
stop: function () {
|
|
@@ -97,10 +81,8 @@ function pollingManagerCSFactory(params) {
|
|
|
97
81
|
// fetch splits and segments
|
|
98
82
|
syncAll: function () {
|
|
99
83
|
var promises = [splitsSyncTask.execute()];
|
|
100
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (
|
|
101
|
-
|
|
102
|
-
promises.push(msSyncTask.execute());
|
|
103
|
-
mlsSyncTask && promises.push(mlsSyncTask.execute());
|
|
84
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
85
|
+
promises.push(mySegmentsSyncTask.execute());
|
|
104
86
|
});
|
|
105
87
|
return Promise.all(promises);
|
|
106
88
|
},
|
|
@@ -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, storage, readiness, settings, matchingKey) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, 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;
|
|
@@ -2,15 +2,15 @@
|
|
|
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
|
|
5
|
+
var constants_1 = require("../../../readiness/constants");
|
|
6
|
+
var constants_2 = require("../../../logger/constants");
|
|
7
7
|
/**
|
|
8
8
|
* factory of MySegments updater, a task that:
|
|
9
9
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
10
10
|
* - updates `mySegmentsCache`
|
|
11
11
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
12
12
|
*/
|
|
13
|
-
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache,
|
|
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 */
|
|
@@ -22,27 +22,28 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
22
22
|
// @TODO if allowing pluggable storages, handle async execution
|
|
23
23
|
function updateSegments(segmentsData) {
|
|
24
24
|
var shouldNotifyUpdate;
|
|
25
|
-
if (
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
var name = _a.name, add = _a.add;
|
|
29
|
-
if (mySegmentsCache.isInSegment(name) !== add) {
|
|
30
|
-
shouldNotifyUpdate = true;
|
|
31
|
-
if (add)
|
|
32
|
-
mySegmentsCache.addToSegment(name);
|
|
33
|
-
else
|
|
34
|
-
mySegmentsCache.removeFromSegment(name);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
25
|
+
if (Array.isArray(segmentsData)) {
|
|
26
|
+
// Update the list of segment names available
|
|
27
|
+
shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
|
|
37
28
|
}
|
|
38
29
|
else {
|
|
39
|
-
//
|
|
40
|
-
|
|
30
|
+
// Add/Delete the segment
|
|
31
|
+
var name_1 = segmentsData.name, add = segmentsData.add;
|
|
32
|
+
if (mySegmentsCache.isInSegment(name_1) !== add) {
|
|
33
|
+
shouldNotifyUpdate = true;
|
|
34
|
+
if (add)
|
|
35
|
+
mySegmentsCache.addToSegment(name_1);
|
|
36
|
+
else
|
|
37
|
+
mySegmentsCache.removeFromSegment(name_1);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
shouldNotifyUpdate = false;
|
|
41
|
+
}
|
|
41
42
|
}
|
|
42
43
|
// Notify update if required
|
|
43
|
-
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
44
|
+
if (splitsCache.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
44
45
|
readyOnAlreadyExistentState = false;
|
|
45
|
-
|
|
46
|
+
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -59,7 +60,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
59
60
|
return updaterPromise.catch(function (error) {
|
|
60
61
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
61
62
|
retry += 1;
|
|
62
|
-
log.warn(
|
|
63
|
+
log.warn(constants_2.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
|
|
63
64
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
64
65
|
}
|
|
65
66
|
else {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SSEClient = void 0;
|
|
4
|
+
var decorateHeaders_1 = require("../../../services/decorateHeaders");
|
|
4
5
|
var lang_1 = require("../../../utils/lang");
|
|
5
6
|
var objectAssign_1 = require("../../../utils/lang/objectAssign");
|
|
6
7
|
var ABLY_API_VERSION = '1.1';
|
|
@@ -32,22 +33,18 @@ var SSEClient = /** @class */ (function () {
|
|
|
32
33
|
* SSEClient constructor.
|
|
33
34
|
*
|
|
34
35
|
* @param settings Validated settings.
|
|
35
|
-
* @param useHeaders True to send metadata as headers or false to send as query params. If `true`, the provided EventSource must support headers.
|
|
36
36
|
* @param platform object containing environment-specific dependencies
|
|
37
37
|
* @throws 'EventSource API is not available.' if EventSource is not available.
|
|
38
38
|
*/
|
|
39
|
-
function SSEClient(settings,
|
|
39
|
+
function SSEClient(settings, _a) {
|
|
40
40
|
var getEventSource = _a.getEventSource, getOptions = _a.getOptions;
|
|
41
|
+
this.settings = settings;
|
|
41
42
|
this.eventSource = getEventSource && getEventSource(settings);
|
|
42
43
|
// if eventSource is not available, throw an exception
|
|
43
44
|
if (!this.eventSource)
|
|
44
45
|
throw new Error('EventSource API is not available.');
|
|
45
|
-
this.streamingUrl = settings.urls.streaming + '/sse';
|
|
46
|
-
// @TODO get `useHeaders` flag from `getEventSource`, to use EventSource headers on client-side SDKs when possible.
|
|
47
|
-
this.useHeaders = useHeaders;
|
|
48
46
|
this.headers = buildSSEHeaders(settings);
|
|
49
47
|
this.options = getOptions && getOptions(settings);
|
|
50
|
-
this.lse = settings.sync.largeSegmentsEnabled;
|
|
51
48
|
}
|
|
52
49
|
SSEClient.prototype.setEventHandler = function (handler) {
|
|
53
50
|
this.handler = handler;
|
|
@@ -59,21 +56,21 @@ var SSEClient = /** @class */ (function () {
|
|
|
59
56
|
* @throws {TypeError} Will throw an error if `authToken` is undefined
|
|
60
57
|
*/
|
|
61
58
|
SSEClient.prototype.open = function (authToken) {
|
|
62
|
-
var
|
|
59
|
+
var _a;
|
|
63
60
|
this.close(); // it closes connection if previously opened
|
|
64
61
|
var channelsQueryParam = Object.keys(authToken.channels).map(function (channel) {
|
|
65
62
|
var params = CONTROL_CHANNEL_REGEX.test(channel) ? '[?occupancy=metrics.publishers]' : '';
|
|
66
63
|
return encodeURIComponent(params + channel);
|
|
67
|
-
}).filter(function (channel) {
|
|
68
|
-
return _this.lse || !(0, lang_1.endsWith)(channel, 'myLargeSegments');
|
|
69
64
|
}).join(',');
|
|
70
|
-
var url = this.
|
|
65
|
+
var url = this.settings.urls.streaming + "/sse?channels=" + channelsQueryParam + "&accessToken=" + authToken.token + "&v=" + ABLY_API_VERSION + "&heartbeats=true"; // same results using `&heartbeats=false`
|
|
66
|
+
// use headers in server-side or if getHeaderOverrides is defined
|
|
67
|
+
var useHeaders = !this.settings.core.key || ((_a = this.settings.sync.requestOptions) === null || _a === void 0 ? void 0 : _a.getHeaderOverrides);
|
|
71
68
|
this.connection = new this.eventSource(
|
|
72
69
|
// For client-side SDKs, SplitSDKClientKey and SplitSDKClientKey metadata is passed as query params,
|
|
73
70
|
// because native EventSource implementations for browser doesn't support headers.
|
|
74
|
-
|
|
71
|
+
useHeaders ? url : url + ("&SplitSDKVersion=" + this.headers.SplitSDKVersion + "&SplitSDKClientKey=" + this.headers.SplitSDKClientKey),
|
|
75
72
|
// For server-side SDKs, metadata is passed via headers. EventSource must support headers, like 'eventsource' package for Node.
|
|
76
|
-
(0, objectAssign_1.objectAssign)(
|
|
73
|
+
(0, objectAssign_1.objectAssign)(useHeaders ? { headers: (0, decorateHeaders_1.decorateHeaders)(this.settings, this.headers) } : {}, this.options));
|
|
77
74
|
if (this.handler) { // no need to check if SSEClient is used only by PushManager
|
|
78
75
|
this.connection.addEventListener('open', this.handler.handleOpen);
|
|
79
76
|
this.connection.addEventListener('message', this.handler.handleMessage);
|
|
@@ -76,7 +76,6 @@ 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:
|
|
80
79
|
case constants_1.SPLIT_KILL:
|
|
81
80
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
82
81
|
break;
|
|
@@ -2,17 +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");
|
|
5
6
|
/**
|
|
6
7
|
* MySegmentsUpdateWorker factory
|
|
7
8
|
*/
|
|
8
|
-
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker
|
|
9
|
+
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
9
10
|
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
10
11
|
var currentChangeNumber = -1;
|
|
11
12
|
var handleNewEvent = false;
|
|
12
13
|
var isHandlingEvent;
|
|
13
14
|
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
14
|
-
var _delay;
|
|
15
|
-
var _delayTimeoutID;
|
|
16
15
|
var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
|
|
17
16
|
function __handleMySegmentsUpdateCall() {
|
|
18
17
|
isHandlingEvent = true;
|
|
@@ -20,20 +19,12 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
20
19
|
handleNewEvent = false;
|
|
21
20
|
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
22
21
|
// fetch mySegments revalidating data if cached
|
|
23
|
-
|
|
24
|
-
new Promise(function (res) {
|
|
25
|
-
_delayTimeoutID = setTimeout(function () {
|
|
26
|
-
_delay = undefined;
|
|
27
|
-
mySegmentsSyncTask.execute(_segmentsData, true).then(res);
|
|
28
|
-
}, _delay);
|
|
29
|
-
}) :
|
|
30
|
-
mySegmentsSyncTask.execute(_segmentsData, true);
|
|
31
|
-
syncTask.then(function (result) {
|
|
22
|
+
mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
|
|
32
23
|
if (!isHandlingEvent)
|
|
33
24
|
return; // halt if `stop` has been called
|
|
34
25
|
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
35
26
|
if (_segmentsData)
|
|
36
|
-
telemetryTracker.trackUpdatesFromSSE(
|
|
27
|
+
telemetryTracker.trackUpdatesFromSSE(constants_1.MY_SEGMENT);
|
|
37
28
|
currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
38
29
|
}
|
|
39
30
|
if (handleNewEvent) {
|
|
@@ -50,27 +41,22 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
50
41
|
}
|
|
51
42
|
return {
|
|
52
43
|
/**
|
|
53
|
-
* Invoked by NotificationProcessor on
|
|
44
|
+
* Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
|
|
54
45
|
*
|
|
55
|
-
* @param changeNumber change number of the notification
|
|
56
|
-
* @param
|
|
57
|
-
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
46
|
+
* @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
|
|
47
|
+
* @param {SegmentsData | undefined} segmentsData might be undefined
|
|
58
48
|
*/
|
|
59
|
-
put: function (changeNumber, segmentsData
|
|
60
|
-
|
|
61
|
-
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber || _delay)
|
|
49
|
+
put: function (changeNumber, segmentsData) {
|
|
50
|
+
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
62
51
|
return;
|
|
63
52
|
maxChangeNumber = changeNumber;
|
|
64
53
|
handleNewEvent = true;
|
|
65
54
|
_segmentsData = segmentsData;
|
|
66
|
-
_delay = delay;
|
|
67
55
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
68
56
|
__handleMySegmentsUpdateCall();
|
|
69
57
|
backoff.reset();
|
|
70
58
|
},
|
|
71
59
|
stop: function () {
|
|
72
|
-
clearTimeout(_delayTimeoutID);
|
|
73
|
-
_delay = undefined;
|
|
74
60
|
isHandlingEvent = false;
|
|
75
61
|
backoff.reset();
|
|
76
62
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.
|
|
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;
|
|
4
4
|
// time for refresh token
|
|
5
5
|
exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
6
6
|
// Internal SDK events, subscribed by SyncManager and PushManager
|
|
@@ -30,7 +30,6 @@ 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';
|
|
34
33
|
// Control-type push notifications, handled by NotificationKeeper
|
|
35
34
|
exports.CONTROL = 'CONTROL';
|
|
36
35
|
exports.OCCUPANCY = 'OCCUPANCY';
|
|
@@ -80,10 +80,15 @@ function isInBitmap(bitmap, hash64hex) {
|
|
|
80
80
|
exports.isInBitmap = isInBitmap;
|
|
81
81
|
/**
|
|
82
82
|
* Parse feature flags notifications for instant feature flag updates
|
|
83
|
+
*
|
|
84
|
+
* @param {ISplitUpdateData} data
|
|
85
|
+
* @returns {KeyList}
|
|
83
86
|
*/
|
|
84
87
|
function parseFFUpdatePayload(compression, data) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
var avoidPrecisionLoss = false;
|
|
89
|
+
if (compression > 0)
|
|
90
|
+
return parseKeyList(data, compression, avoidPrecisionLoss);
|
|
91
|
+
else
|
|
92
|
+
return JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
88
93
|
}
|
|
89
94
|
exports.parseFFUpdatePayload = parseFFUpdatePayload;
|