@splitsoftware/splitio-commons 1.16.1-rc.8 → 1.17.0-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 +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 +42 -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 +0 -4
- 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 +68 -99
- 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 +38 -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 +1 -5
- 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 +69 -99
- 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 +40 -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 +7 -10
- 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 +67 -103
- 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 +0 -1
- 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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
2
|
import { ERROR_HTTP, ERROR_CLIENT_CANNOT_GET_READY } from '../logger/constants';
|
|
3
|
+
import { decorateHeaders } from './decorateHeaders';
|
|
3
4
|
var messageNoFetch = 'Global fetch API is not available.';
|
|
4
5
|
/**
|
|
5
6
|
* Factory of Split HTTP clients, which are HTTP clients with predefined headers for Split endpoints.
|
|
@@ -15,22 +16,22 @@ export function splitHttpClientFactory(settings, _a) {
|
|
|
15
16
|
// if fetch is not available, log Error
|
|
16
17
|
if (!fetch)
|
|
17
18
|
log.error(ERROR_CLIENT_CANNOT_GET_READY, [messageNoFetch]);
|
|
18
|
-
var
|
|
19
|
+
var commonHeaders = {
|
|
19
20
|
'Accept': 'application/json',
|
|
20
21
|
'Content-Type': 'application/json',
|
|
21
22
|
'Authorization': "Bearer " + authorizationKey,
|
|
22
23
|
'SplitSDKVersion': version
|
|
23
24
|
};
|
|
24
25
|
if (ip)
|
|
25
|
-
|
|
26
|
+
commonHeaders['SplitSDKMachineIP'] = ip;
|
|
26
27
|
if (hostname)
|
|
27
|
-
|
|
28
|
+
commonHeaders['SplitSDKMachineName'] = hostname;
|
|
28
29
|
return function httpClient(url, reqOpts, latencyTracker, logErrorsAsInfo) {
|
|
29
30
|
if (reqOpts === void 0) { reqOpts = {}; }
|
|
30
31
|
if (latencyTracker === void 0) { latencyTracker = function () { }; }
|
|
31
32
|
if (logErrorsAsInfo === void 0) { logErrorsAsInfo = false; }
|
|
32
33
|
var request = objectAssign({
|
|
33
|
-
headers:
|
|
34
|
+
headers: decorateHeaders(settings, objectAssign({}, commonHeaders, reqOpts.headers || {})),
|
|
34
35
|
method: reqOpts.method || 'GET',
|
|
35
36
|
body: reqOpts.body
|
|
36
37
|
}, options);
|
|
@@ -6,9 +6,9 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
6
6
|
var AbstractSplitsCacheAsync = /** @class */ (function () {
|
|
7
7
|
function AbstractSplitsCacheAsync() {
|
|
8
8
|
}
|
|
9
|
-
// @TODO revisit segment-related methods ('
|
|
9
|
+
// @TODO revisit segment-related methods ('usesSegments', 'getRegisteredSegments', 'registerSegments')
|
|
10
10
|
// noop, just keeping the interface. This is used by standalone client-side API only, and so only implemented by InMemory and InLocalStorage.
|
|
11
|
-
AbstractSplitsCacheAsync.prototype.
|
|
11
|
+
AbstractSplitsCacheAsync.prototype.usesSegments = function () {
|
|
12
12
|
return Promise.resolve(true);
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
|
+
import { IN_SEGMENT } from '../utils/constants';
|
|
2
3
|
/**
|
|
3
4
|
* This class provides a skeletal implementation of the ISplitsCacheSync interface
|
|
4
5
|
* to minimize the effort required to implement this interface.
|
|
@@ -59,14 +60,14 @@ var AbstractSplitsCacheSync = /** @class */ (function () {
|
|
|
59
60
|
export { AbstractSplitsCacheSync };
|
|
60
61
|
/**
|
|
61
62
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
62
|
-
* This util is intended to simplify the implementation of `splitsCache::
|
|
63
|
+
* This util is intended to simplify the implementation of `splitsCache::usesSegments` method
|
|
63
64
|
*/
|
|
64
|
-
export function
|
|
65
|
+
export function usesSegments(split) {
|
|
65
66
|
var conditions = split.conditions || [];
|
|
66
67
|
for (var i = 0; i < conditions.length; i++) {
|
|
67
68
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
68
69
|
for (var j = 0; j < matchers.length; j++) {
|
|
69
|
-
if (matchers[j].matcherType ===
|
|
70
|
+
if (matchers[j].matcherType === IN_SEGMENT)
|
|
70
71
|
return true;
|
|
71
72
|
}
|
|
72
73
|
}
|
|
@@ -36,9 +36,6 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
36
36
|
KeyBuilder.prototype.buildSplitsWithSegmentCountKey = function () {
|
|
37
37
|
return this.prefix + ".splits.usingSegments";
|
|
38
38
|
};
|
|
39
|
-
KeyBuilder.prototype.buildSplitsWithLargeSegmentCountKey = function () {
|
|
40
|
-
return this.prefix + ".splits.usingLargeSegments";
|
|
41
|
-
};
|
|
42
39
|
KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
|
|
43
40
|
return this.prefix + ".segment." + segmentName;
|
|
44
41
|
};
|
|
@@ -21,6 +21,10 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
21
21
|
return builtSegmentKeyName.substr(prefix.length);
|
|
22
22
|
};
|
|
23
23
|
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
24
|
+
KeyBuilderCS.prototype.buildOldSegmentNameKey = function (segmentName) {
|
|
25
|
+
return this.matchingKey + "." + this.prefix + ".segment." + segmentName;
|
|
26
|
+
};
|
|
27
|
+
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
24
28
|
KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
|
|
25
29
|
var prefix = this.matchingKey + "." + this.prefix + ".segment.";
|
|
26
30
|
if (startsWith(builtSegmentKeyName, prefix))
|
|
@@ -35,18 +39,3 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
35
39
|
return KeyBuilderCS;
|
|
36
40
|
}(KeyBuilder));
|
|
37
41
|
export { KeyBuilderCS };
|
|
38
|
-
export function myLargeSegmentsKeyBuilder(prefix, matchingKey) {
|
|
39
|
-
return {
|
|
40
|
-
buildSegmentNameKey: function (segmentName) {
|
|
41
|
-
return prefix + "." + matchingKey + ".largeSegment." + segmentName;
|
|
42
|
-
},
|
|
43
|
-
extractSegmentName: function (builtSegmentKeyName) {
|
|
44
|
-
var p = prefix + "." + matchingKey + ".largeSegment.";
|
|
45
|
-
if (startsWith(builtSegmentKeyName, p))
|
|
46
|
-
return builtSegmentKeyName.substr(p.length);
|
|
47
|
-
},
|
|
48
|
-
extractOldSegmentKey: function () {
|
|
49
|
-
return undefined;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { AbstractSplitsCacheSync,
|
|
2
|
+
import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber, toNumber, isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { LOG_PREFIX } from './constants';
|
|
5
5
|
import { _Set, setToArray } from '../../utils/lang/sets';
|
|
6
6
|
import { getStorageHash } from '../KeyBuilder';
|
|
7
|
-
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
8
7
|
/**
|
|
9
8
|
* ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
|
|
10
9
|
*/
|
|
@@ -38,14 +37,10 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
38
37
|
if (split) {
|
|
39
38
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
40
39
|
this._decrementCount(ttKey);
|
|
41
|
-
if (
|
|
40
|
+
if (usesSegments(split)) {
|
|
42
41
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
43
42
|
this._decrementCount(segmentsCountKey);
|
|
44
43
|
}
|
|
45
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT)) {
|
|
46
|
-
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
47
|
-
this._decrementCount(segmentsCountKey);
|
|
48
|
-
}
|
|
49
44
|
}
|
|
50
45
|
}
|
|
51
46
|
catch (e) {
|
|
@@ -58,16 +53,11 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
58
53
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
59
54
|
// @ts-expect-error
|
|
60
55
|
localStorage.setItem(ttKey, toNumber(localStorage.getItem(ttKey)) + 1);
|
|
61
|
-
if (
|
|
56
|
+
if (usesSegments(split)) {
|
|
62
57
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
63
58
|
// @ts-expect-error
|
|
64
59
|
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
65
60
|
}
|
|
66
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT)) {
|
|
67
|
-
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
68
|
-
// @ts-expect-error
|
|
69
|
-
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
70
|
-
}
|
|
71
61
|
}
|
|
72
62
|
}
|
|
73
63
|
catch (e) {
|
|
@@ -180,13 +170,11 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
180
170
|
var ttCount = toNumber(localStorage.getItem(this.keys.buildTrafficTypeKey(trafficType)));
|
|
181
171
|
return isFiniteNumber(ttCount) && ttCount > 0;
|
|
182
172
|
};
|
|
183
|
-
SplitsCacheInLocal.prototype.
|
|
173
|
+
SplitsCacheInLocal.prototype.usesSegments = function () {
|
|
184
174
|
// If cache hasn't been synchronized with the cloud, assume we need them.
|
|
185
175
|
if (!this.hasSync)
|
|
186
176
|
return true;
|
|
187
|
-
var storedCount = localStorage.getItem(
|
|
188
|
-
this.keys.buildSplitsWithSegmentCountKey() :
|
|
189
|
-
this.keys.buildSplitsWithLargeSegmentCountKey());
|
|
177
|
+
var storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
|
|
190
178
|
var splitsWithSegmentsCount = storedCount === null ? 0 : toNumber(storedCount);
|
|
191
179
|
if (isFiniteNumber(splitsWithSegmentsCount)) {
|
|
192
180
|
return splitsWithSegmentsCount > 0;
|
|
@@ -2,7 +2,7 @@ import { ImpressionsCacheInMemory } from '../inMemory/ImpressionsCacheInMemory';
|
|
|
2
2
|
import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
|
|
3
3
|
import { EventsCacheInMemory } from '../inMemory/EventsCacheInMemory';
|
|
4
4
|
import { validatePrefix } from '../KeyBuilder';
|
|
5
|
-
import { KeyBuilderCS
|
|
5
|
+
import { KeyBuilderCS } from '../KeyBuilderCS';
|
|
6
6
|
import { isLocalStorageAvailable } from '../../utils/env/isLocalStorageAvailable';
|
|
7
7
|
import { SplitsCacheInLocal } from './SplitsCacheInLocal';
|
|
8
8
|
import { MySegmentsCacheInLocal } from './MySegmentsCacheInLocal';
|
|
@@ -33,11 +33,9 @@ export function InLocalStorage(options) {
|
|
|
33
33
|
var expirationTimestamp = Date.now() - DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
|
|
34
34
|
var splits = new SplitsCacheInLocal(settings, keys, expirationTimestamp);
|
|
35
35
|
var segments = new MySegmentsCacheInLocal(log, keys);
|
|
36
|
-
var largeSegments = new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey));
|
|
37
36
|
return {
|
|
38
37
|
splits: splits,
|
|
39
38
|
segments: segments,
|
|
40
|
-
largeSegments: largeSegments,
|
|
41
39
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
42
40
|
impressionCounts: impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
|
|
43
41
|
events: new EventsCacheInMemory(eventsQueueSize),
|
|
@@ -47,7 +45,6 @@ export function InLocalStorage(options) {
|
|
|
47
45
|
var _a;
|
|
48
46
|
this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
49
47
|
this.segments = new MySegmentsCacheInMemory();
|
|
50
|
-
this.largeSegments = new MySegmentsCacheInMemory();
|
|
51
48
|
this.impressions.clear();
|
|
52
49
|
this.impressionCounts && this.impressionCounts.clear();
|
|
53
50
|
this.events.clear();
|
|
@@ -55,10 +52,10 @@ export function InLocalStorage(options) {
|
|
|
55
52
|
},
|
|
56
53
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
|
|
57
54
|
shared: function (matchingKey) {
|
|
55
|
+
var childKeysBuilder = new KeyBuilderCS(prefix, matchingKey);
|
|
58
56
|
return {
|
|
59
57
|
splits: this.splits,
|
|
60
|
-
segments: new MySegmentsCacheInLocal(log,
|
|
61
|
-
largeSegments: new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey)),
|
|
58
|
+
segments: new MySegmentsCacheInLocal(log, childKeysBuilder),
|
|
62
59
|
impressions: this.impressions,
|
|
63
60
|
impressionCounts: this.impressionCounts,
|
|
64
61
|
events: this.events,
|
|
@@ -66,7 +63,6 @@ export function InLocalStorage(options) {
|
|
|
66
63
|
destroy: function () {
|
|
67
64
|
this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
68
65
|
this.segments = new MySegmentsCacheInMemory();
|
|
69
|
-
this.largeSegments = new MySegmentsCacheInMemory();
|
|
70
66
|
}
|
|
71
67
|
};
|
|
72
68
|
},
|
|
@@ -15,11 +15,9 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
15
15
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
|
|
16
16
|
var splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
17
17
|
var segments = new MySegmentsCacheInMemory();
|
|
18
|
-
var largeSegments = new MySegmentsCacheInMemory();
|
|
19
18
|
var storage = {
|
|
20
19
|
splits: splits,
|
|
21
20
|
segments: segments,
|
|
22
|
-
largeSegments: largeSegments,
|
|
23
21
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
24
22
|
impressionCounts: impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
|
|
25
23
|
events: new EventsCacheInMemory(eventsQueueSize),
|
|
@@ -29,7 +27,6 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
29
27
|
destroy: function () {
|
|
30
28
|
this.splits.clear();
|
|
31
29
|
this.segments.clear();
|
|
32
|
-
this.largeSegments.clear();
|
|
33
30
|
this.impressions.clear();
|
|
34
31
|
this.impressionCounts && this.impressionCounts.clear();
|
|
35
32
|
this.events.clear();
|
|
@@ -40,7 +37,6 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
40
37
|
return {
|
|
41
38
|
splits: this.splits,
|
|
42
39
|
segments: new MySegmentsCacheInMemory(),
|
|
43
|
-
largeSegments: new MySegmentsCacheInMemory(),
|
|
44
40
|
impressions: this.impressions,
|
|
45
41
|
impressionCounts: this.impressionCounts,
|
|
46
42
|
events: this.events,
|
|
@@ -49,7 +45,6 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
49
45
|
destroy: function () {
|
|
50
46
|
this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
51
47
|
this.segments.clear();
|
|
52
|
-
this.largeSegments.clear();
|
|
53
48
|
}
|
|
54
49
|
};
|
|
55
50
|
},
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { AbstractSplitsCacheSync,
|
|
2
|
+
import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber } from '../../utils/lang';
|
|
4
4
|
import { _Set } from '../../utils/lang/sets';
|
|
5
|
-
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
6
5
|
/**
|
|
7
6
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
8
7
|
* Supported by all JS runtimes.
|
|
@@ -14,8 +13,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
14
13
|
_this.splitsCache = {};
|
|
15
14
|
_this.ttCache = {};
|
|
16
15
|
_this.changeNumber = -1;
|
|
17
|
-
_this.
|
|
18
|
-
_this.largeSegmentsCount = 0;
|
|
16
|
+
_this.splitsWithSegmentsCount = 0;
|
|
19
17
|
_this.flagSetsCache = {};
|
|
20
18
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
21
19
|
return _this;
|
|
@@ -24,8 +22,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
24
22
|
this.splitsCache = {};
|
|
25
23
|
this.ttCache = {};
|
|
26
24
|
this.changeNumber = -1;
|
|
27
|
-
this.
|
|
28
|
-
this.largeSegmentsCount = 0;
|
|
25
|
+
this.splitsWithSegmentsCount = 0;
|
|
29
26
|
};
|
|
30
27
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
31
28
|
var previousSplit = this.getSplit(name);
|
|
@@ -35,11 +32,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
35
32
|
if (!this.ttCache[previousTtName])
|
|
36
33
|
delete this.ttCache[previousTtName];
|
|
37
34
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
38
|
-
// Substract from segments count for the previous version of this Split.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (usesMatcher(previousSplit, IN_LARGE_SEGMENT))
|
|
42
|
-
this.largeSegmentsCount--;
|
|
35
|
+
if (usesSegments(previousSplit)) { // Substract from segments count for the previous version of this Split.
|
|
36
|
+
this.splitsWithSegmentsCount--;
|
|
37
|
+
}
|
|
43
38
|
}
|
|
44
39
|
if (split) {
|
|
45
40
|
// Store the Split.
|
|
@@ -49,10 +44,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
49
44
|
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
50
45
|
this.addToFlagSets(split);
|
|
51
46
|
// Add to segments count for the new version of the Split
|
|
52
|
-
if (
|
|
53
|
-
this.
|
|
54
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT))
|
|
55
|
-
this.largeSegmentsCount++;
|
|
47
|
+
if (usesSegments(split))
|
|
48
|
+
this.splitsWithSegmentsCount++;
|
|
56
49
|
return true;
|
|
57
50
|
}
|
|
58
51
|
else {
|
|
@@ -70,10 +63,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
70
63
|
delete this.ttCache[ttName];
|
|
71
64
|
this.removeFromFlagSets(split.name, split.sets);
|
|
72
65
|
// Update the segments count.
|
|
73
|
-
if (
|
|
74
|
-
this.
|
|
75
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT))
|
|
76
|
-
this.largeSegmentsCount--;
|
|
66
|
+
if (usesSegments(split))
|
|
67
|
+
this.splitsWithSegmentsCount--;
|
|
77
68
|
return true;
|
|
78
69
|
}
|
|
79
70
|
else {
|
|
@@ -96,8 +87,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
96
87
|
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
97
88
|
return isFiniteNumber(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
98
89
|
};
|
|
99
|
-
SplitsCacheInMemory.prototype.
|
|
100
|
-
return this.getChangeNumber() === -1 ||
|
|
90
|
+
SplitsCacheInMemory.prototype.usesSegments = function () {
|
|
91
|
+
return this.getChangeNumber() === -1 || this.splitsWithSegmentsCount > 0;
|
|
101
92
|
};
|
|
102
93
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
103
94
|
var _this = this;
|
|
@@ -18,10 +18,9 @@ export function shouldRecordTelemetry(_a) {
|
|
|
18
18
|
return settings.mode !== LOCALHOST_MODE && (settings.core.key === undefined || Math.random() <= ACCEPTANCE_RANGE);
|
|
19
19
|
}
|
|
20
20
|
var TelemetryCacheInMemory = /** @class */ (function () {
|
|
21
|
-
function TelemetryCacheInMemory(splits, segments
|
|
21
|
+
function TelemetryCacheInMemory(splits, segments) {
|
|
22
22
|
this.splits = splits;
|
|
23
23
|
this.segments = segments;
|
|
24
|
-
this.largeSegments = largeSegments;
|
|
25
24
|
// isEmpty flag
|
|
26
25
|
this.e = true;
|
|
27
26
|
this.notReadyUsage = 0;
|
|
@@ -37,7 +36,10 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
37
36
|
this.tags = [];
|
|
38
37
|
this.exceptions = {};
|
|
39
38
|
this.latencies = {};
|
|
40
|
-
this.updatesFromSSE = {
|
|
39
|
+
this.updatesFromSSE = {
|
|
40
|
+
sp: 0,
|
|
41
|
+
ms: 0
|
|
42
|
+
};
|
|
41
43
|
}
|
|
42
44
|
TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
|
|
43
45
|
TelemetryCacheInMemory.prototype.clear = function () { };
|
|
@@ -57,8 +59,6 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
57
59
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
58
60
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
59
61
|
skC: this.segments && this.segments.getKeysCount(),
|
|
60
|
-
lseC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
|
|
61
|
-
lskC: this.largeSegments && this.largeSegments.getKeysCount(),
|
|
62
62
|
sL: this.getSessionLength(),
|
|
63
63
|
eQ: this.getEventStats(QUEUED),
|
|
64
64
|
eD: this.getEventStats(DROPPED),
|
|
@@ -190,11 +190,14 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
190
190
|
};
|
|
191
191
|
TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
|
|
192
192
|
var result = this.updatesFromSSE;
|
|
193
|
-
this.updatesFromSSE = {
|
|
193
|
+
this.updatesFromSSE = {
|
|
194
|
+
sp: 0,
|
|
195
|
+
ms: 0,
|
|
196
|
+
};
|
|
194
197
|
return result;
|
|
195
198
|
};
|
|
196
199
|
TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
|
|
197
|
-
this.updatesFromSSE[type]
|
|
200
|
+
this.updatesFromSSE[type]++;
|
|
198
201
|
this.e = false;
|
|
199
202
|
};
|
|
200
203
|
return TelemetryCacheInMemory;
|
|
@@ -5,7 +5,7 @@ import { setToArray, _Set } from '../../utils/lang/sets';
|
|
|
5
5
|
* The `_cache` property is the object were items are stored.
|
|
6
6
|
* Intended for testing purposes.
|
|
7
7
|
*
|
|
8
|
-
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves
|
|
8
|
+
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves inmediatelly.
|
|
9
9
|
*/
|
|
10
10
|
export function inMemoryWrapperFactory(connDelay) {
|
|
11
11
|
var _cache = {};
|
|
@@ -12,10 +12,6 @@ export function mySegmentsFetcherFactory(fetchMySegments) {
|
|
|
12
12
|
// Extract segment names
|
|
13
13
|
return mySegmentsPromise
|
|
14
14
|
.then(function (resp) { return resp.json(); })
|
|
15
|
-
.then(function (json) {
|
|
16
|
-
return json.mySegments ?
|
|
17
|
-
json.mySegments.map(function (segment) { return segment.name; }) :
|
|
18
|
-
json.myLargeSegments;
|
|
19
|
-
});
|
|
15
|
+
.then(function (json) { return json.mySegments.map(function (segment) { return segment.name; }); });
|
|
20
16
|
};
|
|
21
17
|
}
|
|
@@ -3,8 +3,7 @@ import { mySegmentsSyncTaskFactory } from './syncTasks/mySegmentsSyncTask';
|
|
|
3
3
|
import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
|
|
4
4
|
import { getMatching } from '../../utils/key';
|
|
5
5
|
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../readiness/constants';
|
|
6
|
-
import { POLLING_START, POLLING_STOP } from '../../logger/constants';
|
|
7
|
-
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
6
|
+
import { POLLING_SMART_PAUSING, POLLING_START, POLLING_STOP } from '../../logger/constants';
|
|
8
7
|
/**
|
|
9
8
|
* Expose start / stop mechanism for polling data from services.
|
|
10
9
|
* For client-side API with multiple clients.
|
|
@@ -13,74 +12,59 @@ export function pollingManagerCSFactory(params) {
|
|
|
13
12
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
14
13
|
var log = settings.log;
|
|
15
14
|
var splitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
16
|
-
// Map of matching keys to their corresponding MySegmentsSyncTask
|
|
15
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
17
16
|
var mySegmentsSyncTasks = {};
|
|
18
17
|
var matchingKey = getMatching(settings.core.key);
|
|
19
|
-
var
|
|
18
|
+
var mySegmentsSyncTask = add(matchingKey, readiness, storage);
|
|
20
19
|
function startMySegmentsSyncTasks() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
forOwn(mySegmentsSyncTasks, function (_a) {
|
|
24
|
-
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
25
|
-
if (splitsHaveSegments)
|
|
26
|
-
msSyncTask.start();
|
|
27
|
-
else
|
|
28
|
-
msSyncTask.stop(); // smart pausing
|
|
29
|
-
if (mlsSyncTask) {
|
|
30
|
-
if (splitsHaveLargeSegments)
|
|
31
|
-
mlsSyncTask.start();
|
|
32
|
-
else
|
|
33
|
-
mlsSyncTask.stop(); // smart pausing
|
|
34
|
-
}
|
|
20
|
+
forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
21
|
+
mySegmentsSyncTask.start();
|
|
35
22
|
});
|
|
36
23
|
}
|
|
37
24
|
function stopMySegmentsSyncTasks() {
|
|
38
|
-
forOwn(mySegmentsSyncTasks, function (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
mlsSyncTask && mlsSyncTask.stop();
|
|
25
|
+
forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
26
|
+
if (mySegmentsSyncTask.isRunning())
|
|
27
|
+
mySegmentsSyncTask.stop();
|
|
42
28
|
});
|
|
43
29
|
}
|
|
30
|
+
// smart pausing
|
|
44
31
|
readiness.splits.on(SDK_SPLITS_ARRIVED, function () {
|
|
45
|
-
if (splitsSyncTask.isRunning())
|
|
46
|
-
|
|
32
|
+
if (!splitsSyncTask.isRunning())
|
|
33
|
+
return; // noop if not doing polling
|
|
34
|
+
var splitsHaveSegments = storage.splits.usesSegments();
|
|
35
|
+
if (splitsHaveSegments !== mySegmentsSyncTask.isRunning()) {
|
|
36
|
+
log.info(POLLING_SMART_PAUSING, [splitsHaveSegments ? 'ON' : 'OFF']);
|
|
37
|
+
if (splitsHaveSegments) {
|
|
38
|
+
startMySegmentsSyncTasks();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
stopMySegmentsSyncTasks();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
47
44
|
});
|
|
48
45
|
function add(matchingKey, readiness, storage) {
|
|
49
|
-
var
|
|
50
|
-
readiness.segments.emit(SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
51
|
-
var mlsSyncTask;
|
|
52
|
-
if (settings.sync.largeSegmentsEnabled) {
|
|
53
|
-
mlsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMyLargeSegments, storage.largeSegments, function () { if (readiness.largeSegments && storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
54
|
-
readiness.largeSegments.emit(SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate, 'myLargeSegmentsUpdater');
|
|
55
|
-
}
|
|
46
|
+
var mySegmentsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMySegments, storage, readiness, settings, matchingKey);
|
|
56
47
|
// smart ready
|
|
57
48
|
function smartReady() {
|
|
58
|
-
if (!readiness.isReady())
|
|
59
|
-
|
|
60
|
-
readiness.largeSegments.emit(SDK_SEGMENTS_ARRIVED);
|
|
61
|
-
if (!storage.splits.usesMatcher(IN_SEGMENT))
|
|
62
|
-
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
63
|
-
}
|
|
49
|
+
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
50
|
+
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
64
51
|
}
|
|
65
|
-
if (storage.splits.
|
|
66
|
-
readiness.splits.once(SDK_SPLITS_ARRIVED, smartReady);
|
|
67
|
-
else
|
|
52
|
+
if (!storage.splits.usesSegments())
|
|
68
53
|
setTimeout(smartReady, 0);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
};
|
|
54
|
+
else
|
|
55
|
+
readiness.splits.once(SDK_SPLITS_ARRIVED, smartReady);
|
|
56
|
+
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
57
|
+
return mySegmentsSyncTask;
|
|
74
58
|
}
|
|
75
59
|
return {
|
|
76
60
|
splitsSyncTask: splitsSyncTask,
|
|
77
|
-
segmentsSyncTask:
|
|
78
|
-
largeSegmentsSyncTask: mlsSyncTask,
|
|
61
|
+
segmentsSyncTask: mySegmentsSyncTask,
|
|
79
62
|
// Start periodic fetching (polling)
|
|
80
63
|
start: function () {
|
|
81
64
|
log.info(POLLING_START);
|
|
82
65
|
splitsSyncTask.start();
|
|
83
|
-
|
|
66
|
+
if (storage.splits.usesSegments())
|
|
67
|
+
startMySegmentsSyncTasks();
|
|
84
68
|
},
|
|
85
69
|
// Stop periodic fetching (polling)
|
|
86
70
|
stop: function () {
|
|
@@ -94,10 +78,8 @@ export function pollingManagerCSFactory(params) {
|
|
|
94
78
|
// fetch splits and segments
|
|
95
79
|
syncAll: function () {
|
|
96
80
|
var promises = [splitsSyncTask.execute()];
|
|
97
|
-
forOwn(mySegmentsSyncTasks, function (
|
|
98
|
-
|
|
99
|
-
promises.push(msSyncTask.execute());
|
|
100
|
-
mlsSyncTask && promises.push(mlsSyncTask.execute());
|
|
81
|
+
forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
82
|
+
promises.push(mySegmentsSyncTask.execute());
|
|
101
83
|
});
|
|
102
84
|
return Promise.all(promises);
|
|
103
85
|
},
|
|
@@ -4,6 +4,6 @@ import { mySegmentsUpdaterFactory } from '../updaters/mySegmentsUpdater';
|
|
|
4
4
|
/**
|
|
5
5
|
* Creates a sync task that periodically executes a `mySegmentsUpdater` task
|
|
6
6
|
*/
|
|
7
|
-
export function mySegmentsSyncTaskFactory(fetchMySegments,
|
|
8
|
-
return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(fetchMySegments),
|
|
7
|
+
export function mySegmentsSyncTaskFactory(fetchMySegments, storage, readiness, settings, matchingKey) {
|
|
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
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { timeout } from '../../../utils/promise/timeout';
|
|
2
|
+
import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
2
3
|
import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
3
|
-
import { isObject } from '../../../utils/lang';
|
|
4
4
|
/**
|
|
5
5
|
* factory of MySegments updater, a task that:
|
|
6
6
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
7
7
|
* - updates `mySegmentsCache`
|
|
8
8
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
9
9
|
*/
|
|
10
|
-
export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache,
|
|
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 */
|
|
@@ -19,27 +19,28 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache
|
|
|
19
19
|
// @TODO if allowing pluggable storages, handle async execution
|
|
20
20
|
function updateSegments(segmentsData) {
|
|
21
21
|
var shouldNotifyUpdate;
|
|
22
|
-
if (
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
var name = _a.name, add = _a.add;
|
|
26
|
-
if (mySegmentsCache.isInSegment(name) !== add) {
|
|
27
|
-
shouldNotifyUpdate = true;
|
|
28
|
-
if (add)
|
|
29
|
-
mySegmentsCache.addToSegment(name);
|
|
30
|
-
else
|
|
31
|
-
mySegmentsCache.removeFromSegment(name);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
22
|
+
if (Array.isArray(segmentsData)) {
|
|
23
|
+
// Update the list of segment names available
|
|
24
|
+
shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
|
|
34
25
|
}
|
|
35
26
|
else {
|
|
36
|
-
//
|
|
37
|
-
|
|
27
|
+
// Add/Delete the segment
|
|
28
|
+
var name_1 = segmentsData.name, add = segmentsData.add;
|
|
29
|
+
if (mySegmentsCache.isInSegment(name_1) !== add) {
|
|
30
|
+
shouldNotifyUpdate = true;
|
|
31
|
+
if (add)
|
|
32
|
+
mySegmentsCache.addToSegment(name_1);
|
|
33
|
+
else
|
|
34
|
+
mySegmentsCache.removeFromSegment(name_1);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
shouldNotifyUpdate = false;
|
|
38
|
+
}
|
|
38
39
|
}
|
|
39
40
|
// Notify update if required
|
|
40
|
-
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
41
|
+
if (splitsCache.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
41
42
|
readyOnAlreadyExistentState = false;
|
|
42
|
-
|
|
43
|
+
segmentsEventEmitter.emit(SDK_SEGMENTS_ARRIVED);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isString } from '../../../utils/lang';
|
|
2
2
|
import { objectAssign } from '../../../utils/lang/objectAssign';
|
|
3
3
|
var ABLY_API_VERSION = '1.1';
|
|
4
4
|
var CONTROL_CHANNEL_REGEX = /^control_/;
|
|
@@ -44,7 +44,6 @@ var SSEClient = /** @class */ (function () {
|
|
|
44
44
|
this.useHeaders = useHeaders;
|
|
45
45
|
this.headers = buildSSEHeaders(settings);
|
|
46
46
|
this.options = getOptions && getOptions(settings);
|
|
47
|
-
this.lse = settings.sync.largeSegmentsEnabled;
|
|
48
47
|
}
|
|
49
48
|
SSEClient.prototype.setEventHandler = function (handler) {
|
|
50
49
|
this.handler = handler;
|
|
@@ -56,13 +55,10 @@ var SSEClient = /** @class */ (function () {
|
|
|
56
55
|
* @throws {TypeError} Will throw an error if `authToken` is undefined
|
|
57
56
|
*/
|
|
58
57
|
SSEClient.prototype.open = function (authToken) {
|
|
59
|
-
var _this = this;
|
|
60
58
|
this.close(); // it closes connection if previously opened
|
|
61
59
|
var channelsQueryParam = Object.keys(authToken.channels).map(function (channel) {
|
|
62
60
|
var params = CONTROL_CHANNEL_REGEX.test(channel) ? '[?occupancy=metrics.publishers]' : '';
|
|
63
61
|
return encodeURIComponent(params + channel);
|
|
64
|
-
}).filter(function (channel) {
|
|
65
|
-
return _this.lse || !endsWith(channel, 'myLargeSegments');
|
|
66
62
|
}).join(',');
|
|
67
63
|
var url = this.streamingUrl + "?channels=" + channelsQueryParam + "&accessToken=" + authToken.token + "&v=" + ABLY_API_VERSION + "&heartbeats=true"; // same results using `&heartbeats=false`
|
|
68
64
|
this.connection = new this.eventSource(
|