@splitsoftware/splitio-commons 3.1.1-rc.4 → 3.1.1-rc.6
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/presets/serverSide.js +2 -2
- package/cjs/services/authProvider.js +3 -4
- package/cjs/services/secureSplitHttpClient.js +3 -8
- package/cjs/services/serviceApi.js +17 -15
- package/cjs/services/splitApi.js +10 -9
- package/cjs/sync/polling/updaters/definitionChangesUpdater.js +2 -2
- package/cjs/sync/streaming/AuthClient/index.js +13 -14
- package/cjs/sync/streaming/SSEHandler/index.js +1 -0
- package/cjs/sync/streaming/constants.js +2 -1
- package/cjs/sync/streaming/pushManager.js +5 -10
- package/cjs/sync/submitters/submitterManager.js +53 -30
- package/cjs/sync/syncManagerOnline.js +4 -2
- package/esm/presets/serverSide.js +2 -2
- package/esm/services/authProvider.js +4 -5
- package/esm/services/secureSplitHttpClient.js +3 -8
- package/esm/services/serviceApi.js +18 -16
- package/esm/services/splitApi.js +10 -9
- package/esm/sync/polling/updaters/definitionChangesUpdater.js +3 -3
- package/esm/sync/streaming/AuthClient/index.js +11 -11
- package/esm/sync/streaming/SSEHandler/index.js +2 -1
- package/esm/sync/streaming/constants.js +1 -0
- package/esm/sync/streaming/pushManager.js +6 -11
- package/esm/sync/submitters/submitterManager.js +53 -30
- package/esm/sync/syncManagerOnline.js +4 -2
- package/package.json +1 -1
- package/src/presets/serverSide.ts +2 -2
- package/src/services/authProvider.ts +19 -13
- package/src/services/secureSplitHttpClient.ts +5 -13
- package/src/services/serviceApi.ts +21 -18
- package/src/services/splitApi.ts +10 -9
- package/src/services/types.ts +2 -2
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +3 -3
- package/src/sync/streaming/AuthClient/index.ts +14 -15
- package/src/sync/streaming/AuthClient/types.ts +9 -13
- package/src/sync/streaming/SSEClient/index.ts +2 -2
- package/src/sync/streaming/SSEClient/types.ts +2 -2
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +32 -42
- package/src/sync/streaming/types.ts +3 -2
- package/src/sync/submitters/submitterManager.ts +58 -32
- package/src/sync/syncManagerOnline.ts +3 -1
package/CHANGES.txt
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
3.2.0 (
|
|
1
|
+
3.2.0 (September 18, 2026)
|
|
2
2
|
- Added support for AI configs.
|
|
3
|
+
- Updated submitters to allow starting and executing them when the Configs SDK is ready.
|
|
3
4
|
- Removed Configs SDK-related types and modules and moved them to the Configs SDK repository.
|
|
4
5
|
|
|
5
6
|
3.1.0 (July 23, 2026)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serverSideModules = void 0;
|
|
4
|
-
var
|
|
4
|
+
var splitApi_1 = require("../services/splitApi");
|
|
5
5
|
var syncManagerOnline_1 = require("../sync/syncManagerOnline");
|
|
6
6
|
var pushManager_1 = require("../sync/streaming/pushManager");
|
|
7
7
|
var pollingManagerSS_1 = require("../sync/polling/pollingManagerSS");
|
|
@@ -12,7 +12,7 @@ var impressionObserverSS_1 = require("../trackers/impressionObserver/impressionO
|
|
|
12
12
|
var syncManagerOnlineSSFactory = (0, syncManagerOnline_1.syncManagerOnlineFactory)((0, pollingManagerSS_1.pollingManagerSSFactory)(), pushManager_1.pushManagerFactory);
|
|
13
13
|
exports.serverSideModules = {
|
|
14
14
|
storageFactory: InMemoryStorage_1.InMemoryStorageFactory,
|
|
15
|
-
serviceApiFactory:
|
|
15
|
+
serviceApiFactory: splitApi_1.splitApiFactory,
|
|
16
16
|
syncManagerFactory: syncManagerOnlineSSFactory,
|
|
17
17
|
sdkManagerFactory: sdkManager_1.sdkManagerFactory,
|
|
18
18
|
sdkClientMethodFactory: sdkClientMethod_1.sdkClientMethodFactory,
|
|
@@ -15,17 +15,16 @@ function isExpired(credential) {
|
|
|
15
15
|
*/
|
|
16
16
|
function authProviderFactory(settings, splitHttpClient, telemetryTracker) {
|
|
17
17
|
var urls = settings.urls, log = settings.log;
|
|
18
|
-
|
|
18
|
+
var fetchAuth = (0, AuthClient_1.fetchAuthFactory)(function () {
|
|
19
19
|
var url = "".concat(urls.auth, "/api/v3/auth?capabilities=config,aiconfig");
|
|
20
20
|
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_2.TOKEN), false, true);
|
|
21
|
-
}
|
|
22
|
-
var authenticate = (0, AuthClient_1.authenticateFactory)(fetchAuth);
|
|
21
|
+
});
|
|
23
22
|
var backoff = new Backoff_1.Backoff(fetchCredential);
|
|
24
23
|
var cachedCredential;
|
|
25
24
|
var inFlightPromise;
|
|
26
25
|
var stopped = false;
|
|
27
26
|
function fetchCredential() {
|
|
28
|
-
return
|
|
27
|
+
return fetchAuth().then(function (credential) {
|
|
29
28
|
log.info(constants_1.LOG_PREFIX_SYNC_AUTH + 'credential fetched successfully');
|
|
30
29
|
cachedCredential = credential;
|
|
31
30
|
inFlightPromise = undefined;
|
|
@@ -2,19 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.secureSplitHttpClientFactory = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var splitHttpClient_1 = require("./splitHttpClient");
|
|
6
|
-
var authProvider_1 = require("./authProvider");
|
|
7
5
|
/**
|
|
8
6
|
* Factory of Secure HTTP client, which authenticates requests using a JWT token.
|
|
9
7
|
* On 401 responses, invalidates the cached credential and retries once with a fresh token.
|
|
10
8
|
*
|
|
11
|
-
* @param
|
|
12
|
-
* @param
|
|
13
|
-
* @param fetchAuth - function to fetch auth credentials from the /v2/auth endpoint
|
|
9
|
+
* @param splitHttpClient - `splitHttpClientFactory` to use for making requests
|
|
10
|
+
* @param authProvider - `authProviderFactory` to use for authentication
|
|
14
11
|
*/
|
|
15
|
-
function secureSplitHttpClientFactory(
|
|
16
|
-
var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform);
|
|
17
|
-
var authProvider = (0, authProvider_1.authProviderFactory)(settings, splitHttpClient, telemetryTracker);
|
|
12
|
+
function secureSplitHttpClientFactory(splitHttpClient, authProvider) {
|
|
18
13
|
function makeRequest(url, options, latencyTracker, logErrorsAsInfo, token) {
|
|
19
14
|
return splitHttpClient(url, tslib_1.__assign(tslib_1.__assign({}, options), { headers: tslib_1.__assign(tslib_1.__assign({}, options === null || options === void 0 ? void 0 : options.headers), { Authorization: "Bearer ".concat(token) }) }), latencyTracker, logErrorsAsInfo, true);
|
|
20
15
|
}
|
|
@@ -5,25 +5,36 @@ var splitHttpClient_1 = require("./splitHttpClient");
|
|
|
5
5
|
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
6
6
|
var constants_1 = require("../utils/constants");
|
|
7
7
|
var constants_2 = require("../logger/constants");
|
|
8
|
+
var authProvider_1 = require("./authProvider");
|
|
9
|
+
var secureSplitHttpClient_1 = require("./secureSplitHttpClient");
|
|
8
10
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
9
|
-
function userKeyToQueryParam(userKey) {
|
|
10
|
-
return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported.
|
|
11
|
-
}
|
|
12
11
|
/**
|
|
13
12
|
* Factory of ServiceApi objects, which group the collection of HTTP endpoints used by the SDKs
|
|
14
13
|
*
|
|
15
14
|
* @param settings - validated settings object
|
|
16
15
|
* @param platform - object containing environment-specific dependencies
|
|
17
16
|
* @param telemetryTracker - telemetry tracker
|
|
18
|
-
* @param secureSplitHttpClientFactory - factory of SecureSplitHttpClient objects
|
|
19
17
|
*/
|
|
20
|
-
function serviceApiFactory(settings, platform, telemetryTracker
|
|
18
|
+
function serviceApiFactory(settings, platform, telemetryTracker) {
|
|
21
19
|
var urls = settings.urls;
|
|
22
20
|
var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
|
|
23
21
|
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
24
22
|
var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform);
|
|
25
|
-
|
|
23
|
+
// Shared authProvider so that the SSE authentication (via `fetchAuth`,
|
|
24
|
+
// used by `pushManager`) and every authenticated HTTP request to the Configs
|
|
25
|
+
// API reuse the same cached credential instead of each fetching their own.
|
|
26
|
+
var authProvider = (0, authProvider_1.authProviderFactory)(settings, splitHttpClient, telemetryTracker);
|
|
27
|
+
var secureSplitHttpClient = (0, secureSplitHttpClient_1.secureSplitHttpClientFactory)(splitHttpClient, authProvider);
|
|
28
|
+
var initialAuth = true;
|
|
26
29
|
return {
|
|
30
|
+
fetchAuth: function () {
|
|
31
|
+
// Guard condition to avoid invalidating the cached credential on the first pushManager authentication
|
|
32
|
+
if (initialAuth)
|
|
33
|
+
initialAuth = false;
|
|
34
|
+
else
|
|
35
|
+
authProvider.invalidate();
|
|
36
|
+
return authProvider.credential();
|
|
37
|
+
},
|
|
27
38
|
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
28
39
|
getSdkAPIHealthCheck: function () {
|
|
29
40
|
var url = "".concat(urls.sdk, "/api/version");
|
|
@@ -33,15 +44,6 @@ function serviceApiFactory(settings, platform, telemetryTracker, secureSplitHttp
|
|
|
33
44
|
var url = "".concat(urls.events, "/api/version");
|
|
34
45
|
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
35
46
|
},
|
|
36
|
-
fetchAuth: function (userMatchingKeys) {
|
|
37
|
-
var url = "".concat(urls.auth, "/api/v2/auth?s=").concat(settings.sync.flagSpecVersion);
|
|
38
|
-
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
39
|
-
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
40
|
-
if (queryParams)
|
|
41
|
-
url += '&' + queryParams;
|
|
42
|
-
}
|
|
43
|
-
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
|
|
44
|
-
},
|
|
45
47
|
fetchSplitChanges: function (since, noCache, till, rbSince) {
|
|
46
48
|
var url = "".concat(urls.sdk, "/api/splitChanges?s=").concat(settings.sync.flagSpecVersion, "&since=").concat(since).concat(rbSince ? '&rbSince=' + rbSince : '').concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
47
49
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
|
package/cjs/services/splitApi.js
CHANGED
|
@@ -5,6 +5,7 @@ var splitHttpClient_1 = require("./splitHttpClient");
|
|
|
5
5
|
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
6
6
|
var constants_1 = require("../utils/constants");
|
|
7
7
|
var constants_2 = require("../logger/constants");
|
|
8
|
+
var AuthClient_1 = require("../sync/streaming/AuthClient");
|
|
8
9
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
9
10
|
function userKeyToQueryParam(userKey) {
|
|
10
11
|
return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported.
|
|
@@ -23,6 +24,15 @@ function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
23
24
|
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
24
25
|
var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform);
|
|
25
26
|
return {
|
|
27
|
+
fetchAuth: (0, AuthClient_1.fetchAuthFactory)(function (userMatchingKeys) {
|
|
28
|
+
var url = "".concat(urls.auth, "/v2/auth?s=").concat(settings.sync.flagSpecVersion);
|
|
29
|
+
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
30
|
+
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
31
|
+
if (queryParams)
|
|
32
|
+
url += '&' + queryParams;
|
|
33
|
+
}
|
|
34
|
+
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
|
|
35
|
+
}),
|
|
26
36
|
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
27
37
|
getSdkAPIHealthCheck: function () {
|
|
28
38
|
var url = "".concat(urls.sdk, "/version");
|
|
@@ -32,15 +42,6 @@ function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
32
42
|
var url = "".concat(urls.events, "/version");
|
|
33
43
|
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
34
44
|
},
|
|
35
|
-
fetchAuth: function (userMatchingKeys) {
|
|
36
|
-
var url = "".concat(urls.auth, "/v2/auth?s=").concat(settings.sync.flagSpecVersion);
|
|
37
|
-
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
38
|
-
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
39
|
-
if (queryParams)
|
|
40
|
-
url += '&' + queryParams;
|
|
41
|
-
}
|
|
42
|
-
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
|
|
43
|
-
},
|
|
44
45
|
fetchSplitChanges: function (since, noCache, till, rbSince) {
|
|
45
46
|
var url = "".concat(urls.sdk, "/splitChanges?s=").concat(settings.sync.flagSpecVersion, "&since=").concat(since).concat(rbSince ? '&rbSince=' + rbSince : '').concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
46
47
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
|
|
@@ -125,14 +125,14 @@ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage,
|
|
|
125
125
|
var since = sinces[0], rbSince = sinces[1];
|
|
126
126
|
log.debug(constants_2.SYNC_FETCH, [definitionChangesFetcher.type, since, rbSince]);
|
|
127
127
|
return Promise.resolve(instantUpdate ?
|
|
128
|
-
instantUpdate.type === constants_4.
|
|
128
|
+
instantUpdate.type === constants_4.RB_SEGMENT_UPDATE ?
|
|
129
|
+
{ rbs: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
|
|
129
130
|
// IFFU edge case: a change to definition that adds an IN_RULE_BASED_SEGMENT matcher that is not present yet
|
|
130
131
|
Promise.resolve(rbSegments.contains(parseSegments(instantUpdate.payload, constants_3.IN_RULE_BASED_SEGMENT))).then(function (contains) {
|
|
131
132
|
return contains ?
|
|
132
133
|
{ d: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
|
|
133
134
|
definitionChangesFetcher(since, noCache, till, rbSince, _promiseDecorator);
|
|
134
135
|
}) :
|
|
135
|
-
{ rbs: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
|
|
136
136
|
definitionChangesFetcher(since, noCache, till, rbSince, _promiseDecorator))
|
|
137
137
|
.then(function (definitionChanges) {
|
|
138
138
|
var usedSegments = new Set();
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.fetchAuthFactory = void 0;
|
|
4
4
|
var objectAssign_1 = require("../../../utils/lang/objectAssign");
|
|
5
|
-
var base64_1 = require("../../../utils/base64");
|
|
6
5
|
var jwt_1 = require("../../../utils/jwt");
|
|
7
|
-
var murmur3_1 = require("../../../utils/murmur3/murmur3");
|
|
8
6
|
/**
|
|
9
7
|
* Factory of authentication function.
|
|
10
8
|
*
|
|
11
|
-
* @param fetchAuth -
|
|
9
|
+
* @param fetchAuth - /auth endpoint
|
|
12
10
|
*/
|
|
13
|
-
function
|
|
11
|
+
function fetchAuthFactory(fetchAuth) {
|
|
14
12
|
/**
|
|
15
13
|
* Run authentication requests to Auth Server, and returns a promise that resolves with the decoded JTW token.
|
|
16
14
|
* @param userKeys - set of user Keys to track membership updates. It is undefined for server-side API.
|
|
@@ -24,20 +22,21 @@ function authenticateFactory(fetchAuth) {
|
|
|
24
22
|
if (typeof decodedToken.iat !== 'number' || typeof decodedToken.exp !== 'number')
|
|
25
23
|
throw new Error('token properties "issuedAt" (iat) or "expiration" (exp) are missing or invalid');
|
|
26
24
|
var channels = JSON.parse(decodedToken['x-ably-capability']);
|
|
27
|
-
|
|
25
|
+
var credential = (0, objectAssign_1.objectAssign)({
|
|
28
26
|
decodedToken: decodedToken,
|
|
29
27
|
channels: channels
|
|
30
28
|
}, json);
|
|
29
|
+
// The `/api/v3/auth` endpoint nests the streaming settings under `config.streaming`. Normalize
|
|
30
|
+
// them into the flat `pushEnabled`/`connDelay` properties used by the PushManager.
|
|
31
|
+
var streaming = credential.config && credential.config.streaming;
|
|
32
|
+
if (streaming) {
|
|
33
|
+
credential.pushEnabled = streaming.enabled;
|
|
34
|
+
credential.connDelay = streaming.delay;
|
|
35
|
+
}
|
|
36
|
+
return credential;
|
|
31
37
|
}
|
|
32
38
|
return json;
|
|
33
39
|
});
|
|
34
40
|
};
|
|
35
41
|
}
|
|
36
|
-
exports.
|
|
37
|
-
/**
|
|
38
|
-
* Returns the hash of a given user key
|
|
39
|
-
*/
|
|
40
|
-
function hashUserKey(userKey) {
|
|
41
|
-
return (0, base64_1.encodeToBase64)((0, murmur3_1.hash)(userKey, 0).toString());
|
|
42
|
-
}
|
|
43
|
-
exports.hashUserKey = hashUserKey;
|
|
42
|
+
exports.fetchAuthFactory = fetchAuthFactory;
|
|
@@ -74,6 +74,7 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
74
74
|
switch (parsedData.type) {
|
|
75
75
|
/* update events */
|
|
76
76
|
case constants_1.SPLIT_UPDATE:
|
|
77
|
+
case constants_1.CONFIG_UPDATE:
|
|
77
78
|
case constants_1.SEGMENT_UPDATE:
|
|
78
79
|
case constants_1.MEMBERSHIPS_MS_UPDATE:
|
|
79
80
|
case constants_1.MEMBERSHIPS_LS_UPDATE:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.RB_SEGMENT_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIPS_LS_UPDATE = exports.MEMBERSHIPS_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NON_RETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.RB_SEGMENT_UPDATE = exports.CONFIG_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIPS_LS_UPDATE = exports.MEMBERSHIPS_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NON_RETRYABLE_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.MEMBERSHIPS_LS_UPDATE = 'MEMBERSHIPS_LS_UPDATE';
|
|
|
30
30
|
exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
31
31
|
exports.SPLIT_KILL = 'SPLIT_KILL';
|
|
32
32
|
exports.SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
33
|
+
exports.CONFIG_UPDATE = 'CONFIG_UPDATE';
|
|
33
34
|
exports.RB_SEGMENT_UPDATE = 'RB_SEGMENT_UPDATE';
|
|
34
35
|
// Control-type push notifications, handled by NotificationKeeper
|
|
35
36
|
exports.CONTROL = 'CONTROL';
|
|
@@ -7,7 +7,6 @@ var SSEHandler_1 = require("./SSEHandler");
|
|
|
7
7
|
var MySegmentsUpdateWorker_1 = require("./UpdateWorkers/MySegmentsUpdateWorker");
|
|
8
8
|
var SegmentsUpdateWorker_1 = require("./UpdateWorkers/SegmentsUpdateWorker");
|
|
9
9
|
var DefinitionsUpdateWorker_1 = require("./UpdateWorkers/DefinitionsUpdateWorker");
|
|
10
|
-
var AuthClient_1 = require("./AuthClient");
|
|
11
10
|
var lang_1 = require("../../utils/lang");
|
|
12
11
|
var SSEClient_1 = require("./SSEClient");
|
|
13
12
|
var key_1 = require("../../utils/key");
|
|
@@ -37,7 +36,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
37
36
|
log.warn(constants_2.STREAMING_FALLBACK, [e]);
|
|
38
37
|
return;
|
|
39
38
|
}
|
|
40
|
-
var authenticate = (0, AuthClient_1.authenticateFactory)(serviceApi.fetchAuth);
|
|
41
39
|
// init feedback loop
|
|
42
40
|
var pushEmitter = new platform.EventEmitter();
|
|
43
41
|
var sseHandler = (0, SSEHandler_1.SSEHandlerFactory)(log, pushEmitter, telemetryTracker);
|
|
@@ -47,8 +45,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
47
45
|
var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
|
|
48
46
|
// For server-side we pass the segmentsSyncTask, used by DefinitionsUpdateWorker to fetch new segments
|
|
49
47
|
var definitionsUpdateWorker = (0, DefinitionsUpdateWorker_1.DefinitionsUpdateWorker)(log, storage, pollingManager.definitionsSyncTask, readiness.definitions, telemetryTracker);
|
|
50
|
-
// [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
|
|
51
|
-
var userKeyHashes = {};
|
|
52
48
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
53
49
|
// Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
54
50
|
var clients = {};
|
|
@@ -93,7 +89,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
93
89
|
log.info(constants_2.STREAMING_CONNECTING);
|
|
94
90
|
disconnected = false;
|
|
95
91
|
var userKeys = userKey ? Object.keys(clients) : undefined;
|
|
96
|
-
|
|
92
|
+
serviceApi.fetchAuth(userKeys).then(function (authData) {
|
|
97
93
|
if (disconnected)
|
|
98
94
|
return;
|
|
99
95
|
// 'pushEnabled: false' is handled as a PUSH_NON_RETRYABLE_ERROR instead of PUSH_SUBSYSTEM_DOWN, in order to
|
|
@@ -181,8 +177,11 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
181
177
|
connectPush();
|
|
182
178
|
});
|
|
183
179
|
/** Functions related to synchronization (Queues and Workers in the spec) */
|
|
180
|
+
// Some notification types are specific to the Feature flags or Configs SDKs. Their handlers are
|
|
181
|
+
// registered unconditionally, since the SDK only subscribes to the channels of its own entities.
|
|
184
182
|
pushEmitter.on(constants_1.SPLIT_KILL, definitionsUpdateWorker.killDefinition);
|
|
185
183
|
pushEmitter.on(constants_1.SPLIT_UPDATE, definitionsUpdateWorker.put);
|
|
184
|
+
pushEmitter.on(constants_1.CONFIG_UPDATE, definitionsUpdateWorker.put);
|
|
186
185
|
pushEmitter.on(constants_1.RB_SEGMENT_UPDATE, definitionsUpdateWorker.put);
|
|
187
186
|
function handleMySegmentsUpdate(parsedData) {
|
|
188
187
|
switch (parsedData.u) {
|
|
@@ -285,9 +284,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
285
284
|
},
|
|
286
285
|
// [Only for client-side]
|
|
287
286
|
add: function (userKey, mySegmentsSyncTask) {
|
|
288
|
-
|
|
289
|
-
if (!userKeyHashes[hash]) {
|
|
290
|
-
userKeyHashes[hash] = userKey;
|
|
287
|
+
if (!clients[userKey]) {
|
|
291
288
|
clients[userKey] = {
|
|
292
289
|
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
293
290
|
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
|
|
@@ -308,8 +305,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
308
305
|
},
|
|
309
306
|
// [Only for client-side]
|
|
310
307
|
remove: function (userKey) {
|
|
311
|
-
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
312
|
-
delete userKeyHashes[hash];
|
|
313
308
|
delete clients[userKey];
|
|
314
309
|
}
|
|
315
310
|
});
|
|
@@ -6,41 +6,64 @@ var impressionsSubmitter_1 = require("./impressionsSubmitter");
|
|
|
6
6
|
var impressionCountsSubmitter_1 = require("./impressionCountsSubmitter");
|
|
7
7
|
var telemetrySubmitter_1 = require("./telemetrySubmitter");
|
|
8
8
|
var uniqueKeysSubmitter_1 = require("./uniqueKeysSubmitter");
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return {
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
var constants_1 = require("../../readiness/constants");
|
|
10
|
+
/**
|
|
11
|
+
* Creates a submitter manager.
|
|
12
|
+
*
|
|
13
|
+
* @param startWhenReady - If true, the submitters will only start and execute the underlying submitters when the SDK is ready.
|
|
14
|
+
* `true` for Configs SDK, `false` for Flags SDKs.
|
|
15
|
+
*/
|
|
16
|
+
function submitterManagerFactory(startWhenReady) {
|
|
17
|
+
return function (params) {
|
|
18
|
+
var readiness = params.readiness;
|
|
19
|
+
var submitters = [
|
|
20
|
+
(0, impressionsSubmitter_1.impressionsSubmitterFactory)(params),
|
|
21
|
+
(0, eventsSubmitter_1.eventsSubmitterFactory)(params),
|
|
22
|
+
(0, impressionCountsSubmitter_1.impressionCountsSubmitterFactory)(params),
|
|
23
|
+
(0, uniqueKeysSubmitter_1.uniqueKeysSubmitterFactory)(params)
|
|
24
|
+
];
|
|
25
|
+
var telemetrySubmitter = (0, telemetrySubmitter_1.telemetrySubmitterFactory)(params);
|
|
26
|
+
var isRunning = false;
|
|
27
|
+
function startSubmitters(onlyTelemetry) {
|
|
28
|
+
if (!isRunning)
|
|
29
|
+
return;
|
|
20
30
|
if (!onlyTelemetry)
|
|
21
31
|
submitters.forEach(function (submitter) { return submitter.start(); });
|
|
22
32
|
if (telemetrySubmitter)
|
|
23
33
|
telemetrySubmitter.start();
|
|
24
|
-
},
|
|
25
|
-
// `allExceptTelemetry` true if userConsent is changed to DECLINED
|
|
26
|
-
stop: function (allExceptTelemetry) {
|
|
27
|
-
submitters.forEach(function (submitter) { return submitter.stop(); });
|
|
28
|
-
if (!allExceptTelemetry && telemetrySubmitter)
|
|
29
|
-
telemetrySubmitter.stop();
|
|
30
|
-
},
|
|
31
|
-
isRunning: function () {
|
|
32
|
-
return submitters.some(function (submitter) { return submitter.isRunning(); });
|
|
33
|
-
},
|
|
34
|
-
// Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
|
|
35
|
-
execute: function (onlyTelemetry) {
|
|
36
|
-
var promises = onlyTelemetry ? [] : submitters.map(function (submitter) { return submitter.execute(); });
|
|
37
|
-
if (telemetrySubmitter)
|
|
38
|
-
promises.push(telemetrySubmitter.execute());
|
|
39
|
-
return Promise.all(promises).then(function () { });
|
|
40
|
-
},
|
|
41
|
-
isExecuting: function () {
|
|
42
|
-
return submitters.some(function (submitter) { return submitter.isExecuting(); });
|
|
43
34
|
}
|
|
35
|
+
return {
|
|
36
|
+
// `onlyTelemetry` true if SDK is created with userConsent not GRANTED
|
|
37
|
+
start: function (onlyTelemetry) {
|
|
38
|
+
isRunning = true;
|
|
39
|
+
if (!startWhenReady || readiness.isReady())
|
|
40
|
+
startSubmitters(onlyTelemetry);
|
|
41
|
+
else
|
|
42
|
+
readiness.gate.once(constants_1.SDK_READY, function () { return startSubmitters(onlyTelemetry); });
|
|
43
|
+
},
|
|
44
|
+
// `allExceptTelemetry` true if userConsent is changed to DECLINED
|
|
45
|
+
stop: function (allExceptTelemetry) {
|
|
46
|
+
isRunning = false;
|
|
47
|
+
submitters.forEach(function (submitter) { return submitter.stop(); });
|
|
48
|
+
if (!allExceptTelemetry && telemetrySubmitter)
|
|
49
|
+
telemetrySubmitter.stop();
|
|
50
|
+
},
|
|
51
|
+
isRunning: function () {
|
|
52
|
+
return isRunning;
|
|
53
|
+
},
|
|
54
|
+
// Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
|
|
55
|
+
execute: function (onlyTelemetry) {
|
|
56
|
+
if (startWhenReady && !readiness.isReady())
|
|
57
|
+
return Promise.resolve();
|
|
58
|
+
var promises = onlyTelemetry ? [] : submitters.map(function (submitter) { return submitter.execute(); });
|
|
59
|
+
if (telemetrySubmitter)
|
|
60
|
+
promises.push(telemetrySubmitter.execute());
|
|
61
|
+
return Promise.all(promises).then(function () { });
|
|
62
|
+
},
|
|
63
|
+
isExecuting: function () {
|
|
64
|
+
return submitters.some(function (submitter) { return submitter.isExecuting(); });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
44
67
|
};
|
|
45
68
|
}
|
|
46
69
|
exports.submitterManagerFactory = submitterManagerFactory;
|
|
@@ -15,8 +15,10 @@ var AbstractDefinitionsCacheSync_1 = require("../storages/AbstractDefinitionsCac
|
|
|
15
15
|
* @param pollingManagerFactory - allows to specialize the SyncManager for server-side or client-side API by passing
|
|
16
16
|
* `pollingManagerSSFactory` or `pollingManagerCSFactory` respectively.
|
|
17
17
|
* @param pushManagerFactory - optional to build a SyncManager with or without streaming support
|
|
18
|
+
* @param submitterManagerFactory - specify the submitter manager factory to use
|
|
18
19
|
*/
|
|
19
|
-
function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
20
|
+
function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, _submitterManagerFactory) {
|
|
21
|
+
if (_submitterManagerFactory === void 0) { _submitterManagerFactory = (0, submitterManager_1.submitterManagerFactory)(); }
|
|
20
22
|
/**
|
|
21
23
|
* SyncManager factory for modular SDK
|
|
22
24
|
*/
|
|
@@ -30,7 +32,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
30
32
|
undefined;
|
|
31
33
|
/** Submitter Manager */
|
|
32
34
|
// It is not injected as push and polling managers, because at the moment it is required
|
|
33
|
-
var submitterManager = (
|
|
35
|
+
var submitterManager = _submitterManagerFactory(params);
|
|
34
36
|
/** Sync Manager logic */
|
|
35
37
|
function startPolling() {
|
|
36
38
|
if (pollingManager.isRunning()) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { splitApiFactory } from '../services/splitApi';
|
|
2
2
|
import { syncManagerOnlineFactory } from '../sync/syncManagerOnline';
|
|
3
3
|
import { pushManagerFactory } from '../sync/streaming/pushManager';
|
|
4
4
|
import { pollingManagerSSFactory } from '../sync/polling/pollingManagerSS';
|
|
@@ -9,7 +9,7 @@ import { impressionObserverSSFactory } from '../trackers/impressionObserver/impr
|
|
|
9
9
|
var syncManagerOnlineSSFactory = syncManagerOnlineFactory(pollingManagerSSFactory(), pushManagerFactory);
|
|
10
10
|
export var serverSideModules = {
|
|
11
11
|
storageFactory: InMemoryStorageFactory,
|
|
12
|
-
serviceApiFactory:
|
|
12
|
+
serviceApiFactory: splitApiFactory,
|
|
13
13
|
syncManagerFactory: syncManagerOnlineSSFactory,
|
|
14
14
|
sdkManagerFactory: sdkManagerFactory,
|
|
15
15
|
sdkClientMethodFactory: sdkClientMethodFactory,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { fetchAuthFactory } from '../sync/streaming/AuthClient';
|
|
2
2
|
import { Backoff } from '../utils/Backoff';
|
|
3
3
|
import { LOG_PREFIX_SYNC_AUTH } from '../logger/constants';
|
|
4
4
|
import { TOKEN } from '../utils/constants';
|
|
@@ -12,17 +12,16 @@ function isExpired(credential) {
|
|
|
12
12
|
*/
|
|
13
13
|
export function authProviderFactory(settings, splitHttpClient, telemetryTracker) {
|
|
14
14
|
var urls = settings.urls, log = settings.log;
|
|
15
|
-
|
|
15
|
+
var fetchAuth = fetchAuthFactory(function () {
|
|
16
16
|
var url = "".concat(urls.auth, "/api/v3/auth?capabilities=config,aiconfig");
|
|
17
17
|
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(TOKEN), false, true);
|
|
18
|
-
}
|
|
19
|
-
var authenticate = authenticateFactory(fetchAuth);
|
|
18
|
+
});
|
|
20
19
|
var backoff = new Backoff(fetchCredential);
|
|
21
20
|
var cachedCredential;
|
|
22
21
|
var inFlightPromise;
|
|
23
22
|
var stopped = false;
|
|
24
23
|
function fetchCredential() {
|
|
25
|
-
return
|
|
24
|
+
return fetchAuth().then(function (credential) {
|
|
26
25
|
log.info(LOG_PREFIX_SYNC_AUTH + 'credential fetched successfully');
|
|
27
26
|
cachedCredential = credential;
|
|
28
27
|
inFlightPromise = undefined;
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import { __assign } from "tslib";
|
|
2
|
-
import { splitHttpClientFactory } from './splitHttpClient';
|
|
3
|
-
import { authProviderFactory } from './authProvider';
|
|
4
2
|
/**
|
|
5
3
|
* Factory of Secure HTTP client, which authenticates requests using a JWT token.
|
|
6
4
|
* On 401 responses, invalidates the cached credential and retries once with a fresh token.
|
|
7
5
|
*
|
|
8
|
-
* @param
|
|
9
|
-
* @param
|
|
10
|
-
* @param fetchAuth - function to fetch auth credentials from the /v2/auth endpoint
|
|
6
|
+
* @param splitHttpClient - `splitHttpClientFactory` to use for making requests
|
|
7
|
+
* @param authProvider - `authProviderFactory` to use for authentication
|
|
11
8
|
*/
|
|
12
|
-
export function secureSplitHttpClientFactory(
|
|
13
|
-
var splitHttpClient = splitHttpClientFactory(settings, platform);
|
|
14
|
-
var authProvider = authProviderFactory(settings, splitHttpClient, telemetryTracker);
|
|
9
|
+
export function secureSplitHttpClientFactory(splitHttpClient, authProvider) {
|
|
15
10
|
function makeRequest(url, options, latencyTracker, logErrorsAsInfo, token) {
|
|
16
11
|
return splitHttpClient(url, __assign(__assign({}, options), { headers: __assign(__assign({}, options === null || options === void 0 ? void 0 : options.headers), { Authorization: "Bearer ".concat(token) }) }), latencyTracker, logErrorsAsInfo, true);
|
|
17
12
|
}
|
|
@@ -1,26 +1,37 @@
|
|
|
1
1
|
import { splitHttpClientFactory } from './splitHttpClient';
|
|
2
2
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
3
|
-
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY,
|
|
3
|
+
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, SEGMENT, MEMBERSHIPS } from '../utils/constants';
|
|
4
4
|
import { ERROR_TOO_MANY_SETS } from '../logger/constants';
|
|
5
|
+
import { authProviderFactory } from './authProvider';
|
|
6
|
+
import { secureSplitHttpClientFactory } from './secureSplitHttpClient';
|
|
5
7
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
6
|
-
function userKeyToQueryParam(userKey) {
|
|
7
|
-
return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported.
|
|
8
|
-
}
|
|
9
8
|
/**
|
|
10
9
|
* Factory of ServiceApi objects, which group the collection of HTTP endpoints used by the SDKs
|
|
11
10
|
*
|
|
12
11
|
* @param settings - validated settings object
|
|
13
12
|
* @param platform - object containing environment-specific dependencies
|
|
14
13
|
* @param telemetryTracker - telemetry tracker
|
|
15
|
-
* @param secureSplitHttpClientFactory - factory of SecureSplitHttpClient objects
|
|
16
14
|
*/
|
|
17
|
-
export function serviceApiFactory(settings, platform, telemetryTracker
|
|
15
|
+
export function serviceApiFactory(settings, platform, telemetryTracker) {
|
|
18
16
|
var urls = settings.urls;
|
|
19
17
|
var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
|
|
20
18
|
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
21
19
|
var splitHttpClient = splitHttpClientFactory(settings, platform);
|
|
22
|
-
|
|
20
|
+
// Shared authProvider so that the SSE authentication (via `fetchAuth`,
|
|
21
|
+
// used by `pushManager`) and every authenticated HTTP request to the Configs
|
|
22
|
+
// API reuse the same cached credential instead of each fetching their own.
|
|
23
|
+
var authProvider = authProviderFactory(settings, splitHttpClient, telemetryTracker);
|
|
24
|
+
var secureSplitHttpClient = secureSplitHttpClientFactory(splitHttpClient, authProvider);
|
|
25
|
+
var initialAuth = true;
|
|
23
26
|
return {
|
|
27
|
+
fetchAuth: function () {
|
|
28
|
+
// Guard condition to avoid invalidating the cached credential on the first pushManager authentication
|
|
29
|
+
if (initialAuth)
|
|
30
|
+
initialAuth = false;
|
|
31
|
+
else
|
|
32
|
+
authProvider.invalidate();
|
|
33
|
+
return authProvider.credential();
|
|
34
|
+
},
|
|
24
35
|
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
25
36
|
getSdkAPIHealthCheck: function () {
|
|
26
37
|
var url = "".concat(urls.sdk, "/api/version");
|
|
@@ -30,15 +41,6 @@ export function serviceApiFactory(settings, platform, telemetryTracker, secureSp
|
|
|
30
41
|
var url = "".concat(urls.events, "/api/version");
|
|
31
42
|
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
32
43
|
},
|
|
33
|
-
fetchAuth: function (userMatchingKeys) {
|
|
34
|
-
var url = "".concat(urls.auth, "/api/v2/auth?s=").concat(settings.sync.flagSpecVersion);
|
|
35
|
-
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
36
|
-
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
37
|
-
if (queryParams)
|
|
38
|
-
url += '&' + queryParams;
|
|
39
|
-
}
|
|
40
|
-
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(TOKEN));
|
|
41
|
-
},
|
|
42
44
|
fetchSplitChanges: function (since, noCache, till, rbSince) {
|
|
43
45
|
var url = "".concat(urls.sdk, "/api/splitChanges?s=").concat(settings.sync.flagSpecVersion, "&since=").concat(since).concat(rbSince ? '&rbSince=' + rbSince : '').concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
44
46
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SPLITS))
|
package/esm/services/splitApi.js
CHANGED
|
@@ -2,6 +2,7 @@ import { splitHttpClientFactory } from './splitHttpClient';
|
|
|
2
2
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
3
3
|
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MEMBERSHIPS } from '../utils/constants';
|
|
4
4
|
import { ERROR_TOO_MANY_SETS } from '../logger/constants';
|
|
5
|
+
import { fetchAuthFactory } from '../sync/streaming/AuthClient';
|
|
5
6
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
6
7
|
function userKeyToQueryParam(userKey) {
|
|
7
8
|
return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported.
|
|
@@ -20,6 +21,15 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
20
21
|
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
21
22
|
var splitHttpClient = splitHttpClientFactory(settings, platform);
|
|
22
23
|
return {
|
|
24
|
+
fetchAuth: fetchAuthFactory(function (userMatchingKeys) {
|
|
25
|
+
var url = "".concat(urls.auth, "/v2/auth?s=").concat(settings.sync.flagSpecVersion);
|
|
26
|
+
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
27
|
+
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
28
|
+
if (queryParams)
|
|
29
|
+
url += '&' + queryParams;
|
|
30
|
+
}
|
|
31
|
+
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(TOKEN));
|
|
32
|
+
}),
|
|
23
33
|
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
24
34
|
getSdkAPIHealthCheck: function () {
|
|
25
35
|
var url = "".concat(urls.sdk, "/version");
|
|
@@ -29,15 +39,6 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
29
39
|
var url = "".concat(urls.events, "/version");
|
|
30
40
|
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
31
41
|
},
|
|
32
|
-
fetchAuth: function (userMatchingKeys) {
|
|
33
|
-
var url = "".concat(urls.auth, "/v2/auth?s=").concat(settings.sync.flagSpecVersion);
|
|
34
|
-
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
35
|
-
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
36
|
-
if (queryParams)
|
|
37
|
-
url += '&' + queryParams;
|
|
38
|
-
}
|
|
39
|
-
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(TOKEN));
|
|
40
|
-
},
|
|
41
42
|
fetchSplitChanges: function (since, noCache, till, rbSince) {
|
|
42
43
|
var url = "".concat(urls.sdk, "/splitChanges?s=").concat(settings.sync.flagSpecVersion, "&since=").concat(since).concat(rbSince ? '&rbSince=' + rbSince : '').concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
43
44
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SPLITS))
|