@splitsoftware/splitio-commons 3.0.0-rc.3 → 3.0.0-rc.5
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 +1 -1
- package/cjs/listeners/browser.js +2 -2
- package/cjs/logger/messages/debug.js +1 -1
- package/cjs/presets/serverSide.js +2 -2
- package/cjs/sdkClient/sdkLifecycle.js +2 -2
- package/cjs/sdkFactory/index.js +4 -4
- package/cjs/services/authProvider.js +2 -2
- package/cjs/services/decorateHeaders.js +2 -1
- package/cjs/services/secureSplitHttpClient.js +1 -1
- package/cjs/services/serviceApi.js +145 -0
- package/cjs/services/splitApi.js +13 -14
- package/cjs/services/splitHttpClient.js +3 -5
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +2 -2
- package/cjs/sync/polling/updaters/definitionChangesUpdater.js +8 -8
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/pushManager.js +2 -2
- package/cjs/sync/submitters/eventsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionsSubmitter.js +1 -1
- package/cjs/sync/submitters/telemetrySubmitter.js +3 -3
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/cjs/sync/syncManagerOnline.js +1 -1
- package/cjs/utils/settingsValidation/index.js +1 -1
- package/esm/listeners/browser.js +2 -2
- package/esm/logger/messages/debug.js +1 -1
- package/esm/presets/serverSide.js +2 -2
- package/esm/sdkClient/sdkLifecycle.js +2 -2
- package/esm/sdkFactory/index.js +4 -4
- package/esm/services/authProvider.js +2 -2
- package/esm/services/decorateHeaders.js +2 -1
- package/esm/services/secureSplitHttpClient.js +1 -1
- package/esm/services/serviceApi.js +141 -0
- package/esm/services/splitApi.js +13 -14
- package/esm/services/splitHttpClient.js +3 -5
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +2 -2
- package/esm/sync/polling/updaters/definitionChangesUpdater.js +8 -8
- package/esm/sync/streaming/AuthClient/index.js +1 -1
- package/esm/sync/streaming/pushManager.js +2 -2
- package/esm/sync/submitters/eventsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionsSubmitter.js +1 -1
- package/esm/sync/submitters/telemetrySubmitter.js +3 -3
- package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/esm/sync/syncManagerOnline.js +1 -1
- package/esm/utils/settingsValidation/index.js +1 -1
- package/package.json +1 -1
- package/src/listeners/browser.ts +4 -4
- package/src/logger/messages/debug.ts +1 -1
- package/src/presets/serverSide.ts +2 -2
- package/src/sdkClient/sdkLifecycle.ts +2 -2
- package/src/sdkFactory/index.ts +4 -4
- package/src/sdkFactory/types.ts +7 -7
- package/src/services/authProvider.ts +2 -2
- package/src/services/decorateHeaders.ts +2 -1
- package/src/services/secureSplitHttpClient.ts +1 -1
- package/src/services/serviceApi.ts +166 -0
- package/src/services/splitApi.ts +19 -18
- package/src/services/splitHttpClient.ts +7 -4
- package/src/services/types.ts +2 -2
- package/src/storages/types.ts +3 -3
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +1 -1
- package/src/sync/polling/pollingManagerCS.ts +2 -2
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +9 -9
- package/src/sync/streaming/AuthClient/index.ts +1 -1
- package/src/sync/streaming/pushManager.ts +2 -2
- package/src/sync/submitters/eventsSubmitter.ts +1 -1
- package/src/sync/submitters/impressionCountsSubmitter.ts +1 -1
- package/src/sync/submitters/impressionsSubmitter.ts +1 -1
- package/src/sync/submitters/telemetrySubmitter.ts +3 -3
- package/src/sync/submitters/uniqueKeysSubmitter.ts +1 -1
- package/src/sync/syncManagerOnline.ts +1 -1
- package/src/utils/settingsValidation/index.ts +1 -1
- package/types/splitio.d.ts +8 -8
package/CHANGES.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
3.0.0 (
|
|
1
|
+
3.0.0 (June XX, 2026)
|
|
2
2
|
- Extracted SDK lifecycle methods (`init`, `flush`, and `destroy`) into a reusable `sdkLifecycle` module.
|
|
3
3
|
- Extracted the `track` method into a standalone `trackMethod` factory for reuse across SDKs.
|
|
4
4
|
- Added a bloom filter utility and platform-specific modules (`src/platform/`) for reuse across SDKs.
|
package/cjs/listeners/browser.js
CHANGED
|
@@ -14,11 +14,11 @@ var EVENT_NAME = 'for visibilitychange and pagehide events.';
|
|
|
14
14
|
*/
|
|
15
15
|
var BrowserSignalListener = /** @class */ (function () {
|
|
16
16
|
function BrowserSignalListener(_a) {
|
|
17
|
-
var syncManager = _a.syncManager, settings = _a.settings, storage = _a.storage,
|
|
17
|
+
var syncManager = _a.syncManager, settings = _a.settings, storage = _a.storage, serviceApi = _a.serviceApi, entityType = _a.entityType;
|
|
18
18
|
this.syncManager = syncManager;
|
|
19
19
|
this.settings = settings;
|
|
20
20
|
this.storage = storage;
|
|
21
|
-
this.serviceApi =
|
|
21
|
+
this.serviceApi = serviceApi;
|
|
22
22
|
this.flushData = this.flushData.bind(this);
|
|
23
23
|
this.flushDataIfHidden = this.flushDataIfHidden.bind(this);
|
|
24
24
|
this.fromImpressionsCollector = impressionsSubmitter_1.fromImpressionsCollector.bind(undefined, settings.core.labelsEnabled, entityType);
|
|
@@ -25,7 +25,7 @@ exports.codesDebug = info_1.codesInfo.concat([
|
|
|
25
25
|
// synchronizer
|
|
26
26
|
[c.SYNC_OFFLINE_DATA, c.LOG_PREFIX_SYNC_OFFLINE + 'Feature flags data: \n%s'],
|
|
27
27
|
[c.SYNC_FETCH, c.LOG_PREFIX_SYNC + 'Spin up %s updates using since = %s and rbSince = %s.'],
|
|
28
|
-
[c.SYNC_UPDATE, c.LOG_PREFIX_SYNC + '
|
|
28
|
+
[c.SYNC_UPDATE, c.LOG_PREFIX_SYNC + 'Updated %s: %s. Removed: %s.'],
|
|
29
29
|
[c.STREAMING_NEW_MESSAGE, c.LOG_PREFIX_SYNC_STREAMING + 'New SSE message received, with data: %s.'],
|
|
30
30
|
[c.SYNC_TASK_START, c.LOG_PREFIX_SYNC + 'Starting %s. Running each %s millis'],
|
|
31
31
|
[c.SYNC_TASK_EXECUTE, c.LOG_PREFIX_SYNC + 'Running %s'],
|
|
@@ -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 serviceApi_1 = require("../services/serviceApi");
|
|
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)(pollingManagerSS_1.pollingManagerSSFactory, pushManager_1.pushManagerFactory);
|
|
13
13
|
exports.serverSideModules = {
|
|
14
14
|
storageFactory: InMemoryStorage_1.InMemoryStorageFactory,
|
|
15
|
-
|
|
15
|
+
serviceApiFactory: serviceApi_1.serviceApiFactory,
|
|
16
16
|
syncManagerFactory: syncManagerOnlineSSFactory,
|
|
17
17
|
sdkManagerFactory: sdkManager_1.sdkManagerFactory,
|
|
18
18
|
sdkClientMethodFactory: sdkClientMethod_1.sdkClientMethodFactory,
|
|
@@ -7,7 +7,7 @@ var COOLDOWN_TIME_IN_MILLIS = 1000;
|
|
|
7
7
|
* Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
|
|
8
8
|
*/
|
|
9
9
|
function sdkLifecycleFactory(params, isSharedClient) {
|
|
10
|
-
var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, settings = params.settings, telemetryTracker = params.telemetryTracker, impressionsTracker = params.impressionsTracker, platform = params.platform,
|
|
10
|
+
var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, settings = params.settings, telemetryTracker = params.telemetryTracker, impressionsTracker = params.impressionsTracker, platform = params.platform, serviceApi = params.serviceApi;
|
|
11
11
|
var hasInit = false;
|
|
12
12
|
var lastActionTime = 0;
|
|
13
13
|
var signalListener = platform.SignalListener && new platform.SignalListener(params);
|
|
@@ -60,7 +60,7 @@ function sdkLifecycleFactory(params, isSharedClient) {
|
|
|
60
60
|
}
|
|
61
61
|
// Stop background jobs
|
|
62
62
|
syncManager && syncManager.stop();
|
|
63
|
-
|
|
63
|
+
serviceApi && serviceApi.stop();
|
|
64
64
|
return __flush().then(function () {
|
|
65
65
|
// Cleanup storage
|
|
66
66
|
return storage.destroy();
|
package/cjs/sdkFactory/index.js
CHANGED
|
@@ -16,7 +16,7 @@ var fallbackTreatmentsCalculator_1 = require("../evaluator/fallbackTreatmentsCal
|
|
|
16
16
|
* Modular SDK factory
|
|
17
17
|
*/
|
|
18
18
|
function sdkFactory(params) {
|
|
19
|
-
var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory,
|
|
19
|
+
var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory, serviceApiFactory = params.serviceApiFactory, extraProps = params.extraProps, syncManagerFactory = params.syncManagerFactory, integrationsManagerFactory = params.integrationsManagerFactory, sdkManagerFactory = params.sdkManagerFactory, sdkClientMethodFactory = params.sdkClientMethodFactory, lazyInit = params.lazyInit;
|
|
20
20
|
var log = settings.log, initialRolloutPlan = settings.initialRolloutPlan, key = settings.core.key;
|
|
21
21
|
// @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid SDK Key, etc.
|
|
22
22
|
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
|
|
@@ -48,9 +48,9 @@ function sdkFactory(params) {
|
|
|
48
48
|
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
49
49
|
var impressionsTracker = (0, impressionsTracker_1.impressionsTrackerFactory)(params, storage, integrationsManager);
|
|
50
50
|
var eventTracker = (0, eventTracker_1.eventTrackerFactory)(settings, storage.events, integrationsManager, storage.telemetry);
|
|
51
|
-
//
|
|
52
|
-
var
|
|
53
|
-
var ctx = { clients: clients,
|
|
51
|
+
// serviceApi is used by SyncManager and Browser signal listener
|
|
52
|
+
var serviceApi = serviceApiFactory && serviceApiFactory(settings, platform, telemetryTracker);
|
|
53
|
+
var ctx = { clients: clients, serviceApi: serviceApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform, fallbackCalculator: fallbackCalculator };
|
|
54
54
|
ctx.syncManager = syncManagerFactory && syncManagerFactory(ctx);
|
|
55
55
|
// SDK client and manager
|
|
56
56
|
var clientMethod = sdkClientMethodFactory(ctx);
|
|
@@ -16,8 +16,8 @@ function isExpired(credential) {
|
|
|
16
16
|
function authProviderFactory(settings, splitHttpClient, telemetryTracker) {
|
|
17
17
|
var urls = settings.urls, log = settings.log;
|
|
18
18
|
function fetchAuth() {
|
|
19
|
-
var url = "".concat(urls.auth, "/v3/auth?capabilities=config");
|
|
20
|
-
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_2.TOKEN));
|
|
19
|
+
var url = "".concat(urls.auth, "/api/v3/auth?capabilities=config");
|
|
20
|
+
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_2.TOKEN), false, true);
|
|
21
21
|
}
|
|
22
22
|
var authenticate = (0, AuthClient_1.authenticateFactory)(fetchAuth);
|
|
23
23
|
var backoff = new Backoff_1.Backoff(fetchCredential);
|
|
@@ -16,7 +16,7 @@ function secureSplitHttpClientFactory(settings, platform, telemetryTracker) {
|
|
|
16
16
|
var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform);
|
|
17
17
|
var authProvider = (0, authProvider_1.authProviderFactory)(settings, splitHttpClient, telemetryTracker);
|
|
18
18
|
function makeRequest(url, options, latencyTracker, logErrorsAsInfo, token) {
|
|
19
|
-
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);
|
|
19
|
+
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
20
|
}
|
|
21
21
|
var httpClient = function (url, options, latencyTracker, logErrorsAsInfo) {
|
|
22
22
|
return authProvider.credential().then(function (credential) {
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serviceApiFactory = void 0;
|
|
4
|
+
var splitHttpClient_1 = require("./splitHttpClient");
|
|
5
|
+
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
6
|
+
var constants_1 = require("../utils/constants");
|
|
7
|
+
var constants_2 = require("../logger/constants");
|
|
8
|
+
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
|
+
/**
|
|
13
|
+
* Factory of ServiceApi objects, which group the collection of HTTP endpoints used by the SDKs
|
|
14
|
+
*
|
|
15
|
+
* @param settings - validated settings object
|
|
16
|
+
* @param platform - object containing environment-specific dependencies
|
|
17
|
+
* @param telemetryTracker - telemetry tracker
|
|
18
|
+
* @param secureSplitHttpClientFactory - factory of SecureSplitHttpClient objects
|
|
19
|
+
*/
|
|
20
|
+
function serviceApiFactory(settings, platform, telemetryTracker, secureSplitHttpClientFactory) {
|
|
21
|
+
var urls = settings.urls;
|
|
22
|
+
var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
|
|
23
|
+
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
24
|
+
var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform);
|
|
25
|
+
var secureSplitHttpClient = secureSplitHttpClientFactory(settings, platform, telemetryTracker);
|
|
26
|
+
return {
|
|
27
|
+
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
28
|
+
getSdkAPIHealthCheck: function () {
|
|
29
|
+
var url = "".concat(urls.sdk, "/api/version");
|
|
30
|
+
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
31
|
+
},
|
|
32
|
+
getEventsAPIHealthCheck: function () {
|
|
33
|
+
var url = "".concat(urls.events, "/api/version");
|
|
34
|
+
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
35
|
+
},
|
|
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
|
+
fetchSplitChanges: function (since, noCache, till, rbSince) {
|
|
46
|
+
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
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
|
|
48
|
+
.catch(function (err) {
|
|
49
|
+
if (err.statusCode === 414)
|
|
50
|
+
settings.log.error(constants_2.ERROR_TOO_MANY_SETS);
|
|
51
|
+
throw err;
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
fetchSegmentChanges: function (since, segmentName, noCache, till) {
|
|
55
|
+
var url = "".concat(urls.sdk, "/api/segmentChanges/").concat(segmentName, "?since=").concat(since).concat(till ? '&till=' + till : '');
|
|
56
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SEGMENT));
|
|
57
|
+
},
|
|
58
|
+
// @TODO support filterQueryString and handle ERROR_TOO_MANY_SETS error
|
|
59
|
+
fetchConfigs: function (since, noCache, till) {
|
|
60
|
+
var url = "".concat(urls.configs, "/api/v1/configs?since=").concat(since).concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
61
|
+
return secureSplitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
|
|
62
|
+
},
|
|
63
|
+
fetchConfigsSegmentChanges: function (since, segmentName, noCache, till) {
|
|
64
|
+
var url = "".concat(urls.configs, "/api/v1/segmentChanges/").concat(segmentName, "?since=").concat(since).concat(till ? '&till=' + till : '');
|
|
65
|
+
return secureSplitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
|
|
66
|
+
},
|
|
67
|
+
fetchMemberships: function (userMatchingKey, noCache, till) {
|
|
68
|
+
/**
|
|
69
|
+
* URI encoding of user keys in order to:
|
|
70
|
+
* - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%'
|
|
71
|
+
* - avoid 404 responses. E.g.: '/api/memberships/foo/bar'
|
|
72
|
+
* - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
|
|
73
|
+
*/
|
|
74
|
+
var url = "".concat(urls.sdk, "/api/memberships/").concat(encodeURIComponent(userMatchingKey)).concat(till ? '?till=' + till : '');
|
|
75
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MEMBERSHIPS));
|
|
76
|
+
},
|
|
77
|
+
/**
|
|
78
|
+
* Post events.
|
|
79
|
+
*
|
|
80
|
+
* @param body - Events bulk payload
|
|
81
|
+
* @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
82
|
+
*/
|
|
83
|
+
postEventsBulk: function (body, headers) {
|
|
84
|
+
var url = "".concat(urls.events, "/api/events/bulk");
|
|
85
|
+
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.EVENTS));
|
|
86
|
+
},
|
|
87
|
+
/**
|
|
88
|
+
* Post impressions.
|
|
89
|
+
*
|
|
90
|
+
* @param body - Impressions bulk payload
|
|
91
|
+
* @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
92
|
+
*/
|
|
93
|
+
postTestImpressionsBulk: function (body, headers) {
|
|
94
|
+
var url = "".concat(urls.events, "/api/testImpressions/bulk");
|
|
95
|
+
return splitHttpClient(url, {
|
|
96
|
+
// Adding extra headers to send impressions in OPTIMIZED or DEBUG modes.
|
|
97
|
+
method: 'POST',
|
|
98
|
+
body: body,
|
|
99
|
+
headers: (0, objectAssign_1.objectAssign)({ SplitSDKImpressionsMode: SplitSDKImpressionsMode }, headers)
|
|
100
|
+
}, telemetryTracker.trackHttp(constants_1.IMPRESSIONS));
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* Post impressions counts.
|
|
104
|
+
*
|
|
105
|
+
* @param body - Impressions counts payload
|
|
106
|
+
* @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
107
|
+
*/
|
|
108
|
+
postTestImpressionsCount: function (body, headers) {
|
|
109
|
+
var url = "".concat(urls.events, "/api/testImpressions/count");
|
|
110
|
+
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.IMPRESSIONS_COUNT));
|
|
111
|
+
},
|
|
112
|
+
/**
|
|
113
|
+
* Post unique keys for client side.
|
|
114
|
+
*
|
|
115
|
+
* @param body - unique keys payload
|
|
116
|
+
* @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
117
|
+
*/
|
|
118
|
+
postUniqueKeysBulkCs: function (body, headers) {
|
|
119
|
+
var url = "".concat(urls.telemetry, "/api/v1/keys/cs");
|
|
120
|
+
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY));
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* Post unique keys for server side.
|
|
124
|
+
*
|
|
125
|
+
* @param body - unique keys payload
|
|
126
|
+
* @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
127
|
+
*/
|
|
128
|
+
postUniqueKeysBulkSs: function (body, headers) {
|
|
129
|
+
var url = "".concat(urls.telemetry, "/api/v1/keys/ss");
|
|
130
|
+
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY));
|
|
131
|
+
},
|
|
132
|
+
postMetricsConfig: function (body, headers) {
|
|
133
|
+
var url = "".concat(urls.telemetry, "/api/v1/metrics/config");
|
|
134
|
+
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true);
|
|
135
|
+
},
|
|
136
|
+
postMetricsUsage: function (body, headers) {
|
|
137
|
+
var url = "".concat(urls.telemetry, "/api/v1/metrics/usage");
|
|
138
|
+
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true);
|
|
139
|
+
},
|
|
140
|
+
stop: function () {
|
|
141
|
+
secureSplitHttpClient.stop();
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
exports.serviceApiFactory = serviceApiFactory;
|
package/cjs/services/splitApi.js
CHANGED
|
@@ -9,19 +9,19 @@ var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
|
9
9
|
function userKeyToQueryParam(userKey) {
|
|
10
10
|
return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported.
|
|
11
11
|
}
|
|
12
|
+
// @TODO remove when migrating to the new `urls` defaults.
|
|
12
13
|
/**
|
|
13
|
-
* Factory of
|
|
14
|
+
* Factory of ServiceApi objects, which group the collection of Split HTTP endpoints used by the SDK
|
|
14
15
|
*
|
|
15
16
|
* @param settings - validated settings object
|
|
16
17
|
* @param platform - object containing environment-specific dependencies
|
|
17
18
|
* @param telemetryTracker - telemetry tracker
|
|
18
19
|
*/
|
|
19
|
-
function splitApiFactory(settings, platform, telemetryTracker
|
|
20
|
+
function splitApiFactory(settings, platform, telemetryTracker) {
|
|
20
21
|
var urls = settings.urls;
|
|
21
22
|
var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
|
|
22
23
|
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
23
24
|
var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform);
|
|
24
|
-
var secureSplitHttpClient = secureSplitHttpClientFactory ? secureSplitHttpClientFactory(settings, platform, telemetryTracker) : undefined;
|
|
25
25
|
return {
|
|
26
26
|
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
27
27
|
getSdkAPIHealthCheck: function () {
|
|
@@ -54,15 +54,6 @@ function splitApiFactory(settings, platform, telemetryTracker, secureSplitHttpCl
|
|
|
54
54
|
var url = "".concat(urls.sdk, "/segmentChanges/").concat(segmentName, "?since=").concat(since).concat(till ? '&till=' + till : '');
|
|
55
55
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SEGMENT));
|
|
56
56
|
},
|
|
57
|
-
// @TODO support filterQueryString and handle ERROR_TOO_MANY_SETS error
|
|
58
|
-
fetchConfigs: function (since, noCache, till) {
|
|
59
|
-
var url = "".concat(urls.configs, "/v1/configs?since=").concat(since).concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
60
|
-
return (secureSplitHttpClient || splitHttpClient)(url, noCache ? noCacheHeaderOptions : undefined);
|
|
61
|
-
},
|
|
62
|
-
fetchConfigsSegmentChanges: function (since, segmentName, noCache, till) {
|
|
63
|
-
var url = "".concat(urls.configs, "/v1/segmentChanges/").concat(segmentName, "?since=").concat(since).concat(till ? '&till=' + till : '');
|
|
64
|
-
return (secureSplitHttpClient || splitHttpClient)(url, noCache ? noCacheHeaderOptions : undefined);
|
|
65
|
-
},
|
|
66
57
|
fetchMemberships: function (userMatchingKey, noCache, till) {
|
|
67
58
|
/**
|
|
68
59
|
* URI encoding of user keys in order to:
|
|
@@ -136,9 +127,17 @@ function splitApiFactory(settings, platform, telemetryTracker, secureSplitHttpCl
|
|
|
136
127
|
var url = "".concat(urls.telemetry, "/v1/metrics/usage");
|
|
137
128
|
return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true);
|
|
138
129
|
},
|
|
130
|
+
// Not used. Just here to satisfy the IServiceApi interface.
|
|
131
|
+
fetchConfigs: function (since, noCache, till) {
|
|
132
|
+
var url = "".concat(urls.configs, "/v1/configs?since=").concat(since).concat(filterQueryString || '').concat(till ? '&till=' + till : '');
|
|
133
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
|
|
134
|
+
},
|
|
135
|
+
fetchConfigsSegmentChanges: function (since, segmentName, noCache, till) {
|
|
136
|
+
var url = "".concat(urls.configs, "/v1/segmentChanges/").concat(segmentName, "?since=").concat(since).concat(till ? '&till=' + till : '');
|
|
137
|
+
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
|
|
138
|
+
},
|
|
139
139
|
stop: function () {
|
|
140
|
-
|
|
141
|
-
secureSplitHttpClient.stop();
|
|
140
|
+
// no-op
|
|
142
141
|
}
|
|
143
142
|
};
|
|
144
143
|
}
|
|
@@ -24,19 +24,17 @@ function splitHttpClientFactory(settings, _a) {
|
|
|
24
24
|
var commonHeaders = {
|
|
25
25
|
'Accept': 'application/json',
|
|
26
26
|
'Content-Type': 'application/json',
|
|
27
|
-
'Authorization': "Bearer ".concat(authorizationKey)
|
|
28
|
-
'SplitSDKVersion': version
|
|
27
|
+
'Authorization': "Bearer ".concat(authorizationKey)
|
|
29
28
|
};
|
|
30
29
|
if (ip)
|
|
31
30
|
commonHeaders['SplitSDKMachineIP'] = ip;
|
|
32
31
|
if (hostname)
|
|
33
32
|
commonHeaders['SplitSDKMachineName'] = (0, decorateHeaders_1.removeNonISO88591)(hostname);
|
|
34
|
-
return function httpClient(url, reqOpts, latencyTracker, logErrorsAsInfo) {
|
|
33
|
+
return function httpClient(url, reqOpts, latencyTracker, logErrorsAsInfo, newVersionHeader) {
|
|
35
34
|
if (reqOpts === void 0) { reqOpts = {}; }
|
|
36
35
|
if (latencyTracker === void 0) { latencyTracker = function () { }; }
|
|
37
|
-
if (logErrorsAsInfo === void 0) { logErrorsAsInfo = false; }
|
|
38
36
|
var request = (0, objectAssign_1.objectAssign)({
|
|
39
|
-
headers: (0, decorateHeaders_1.decorateHeaders)(settings, (0, objectAssign_1.objectAssign)({}, commonHeaders, reqOpts.headers || {})),
|
|
37
|
+
headers: (0, decorateHeaders_1.decorateHeaders)(settings, (0, objectAssign_1.objectAssign)(newVersionHeader ? { 'X-Harness-FME-SDK-Version': version } : { 'SplitSDKVersion': version }, commonHeaders, reqOpts.headers || {})),
|
|
40
38
|
method: reqOpts.method || 'GET',
|
|
41
39
|
body: reqOpts.body
|
|
42
40
|
}, options);
|
|
@@ -24,7 +24,7 @@ function partitionByStatus(items, till, since) {
|
|
|
24
24
|
*/
|
|
25
25
|
// @TODO breaking: drop support for Split Proxy below v5.10.0 and simplify the implementation
|
|
26
26
|
function splitChangesFetcherFactory(params) {
|
|
27
|
-
var fetchSplitChanges = params.
|
|
27
|
+
var fetchSplitChanges = params.serviceApi.fetchSplitChanges, settings = params.settings, storage = params.storage;
|
|
28
28
|
var log = settings.log;
|
|
29
29
|
var PROXY_CHECK_INTERVAL_MILLIS = (0, key_1.checkIfServerSide)(settings) ? PROXY_CHECK_INTERVAL_MILLIS_SS : PROXY_CHECK_INTERVAL_MILLIS_CS;
|
|
30
30
|
var lastProxyCheckTimestamp;
|
|
@@ -13,7 +13,7 @@ var AbstractDefinitionsCacheSync_1 = require("../../storages/AbstractDefinitions
|
|
|
13
13
|
* For client-side API with multiple clients.
|
|
14
14
|
*/
|
|
15
15
|
function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
16
|
-
var
|
|
16
|
+
var serviceApi = params.serviceApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
17
17
|
var log = settings.log;
|
|
18
18
|
var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings, true);
|
|
19
19
|
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
@@ -47,7 +47,7 @@ function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
function add(matchingKey, readiness, storage) {
|
|
50
|
-
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(
|
|
50
|
+
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(serviceApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
51
51
|
// smart ready
|
|
52
52
|
function smartReady(metadata) {
|
|
53
53
|
if (!readiness.isReady() && !(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
@@ -73,7 +73,7 @@ function matchFilters(definition, filters) {
|
|
|
73
73
|
function computeMutation(update, segments, filters) {
|
|
74
74
|
return update.updated.reduce(function (accum, ruleEntity) {
|
|
75
75
|
if (!filters || matchFilters(ruleEntity, filters)) {
|
|
76
|
-
accum.
|
|
76
|
+
accum.updated.push(ruleEntity);
|
|
77
77
|
parseSegments(ruleEntity).forEach(function (segmentName) {
|
|
78
78
|
segments.add(segmentName);
|
|
79
79
|
});
|
|
@@ -83,7 +83,7 @@ function computeMutation(update, segments, filters) {
|
|
|
83
83
|
}
|
|
84
84
|
accum.names.push(ruleEntity.name);
|
|
85
85
|
return accum;
|
|
86
|
-
}, {
|
|
86
|
+
}, { updated: [], removed: update.removed, names: update.removed.slice() });
|
|
87
87
|
}
|
|
88
88
|
exports.computeMutation = computeMutation;
|
|
89
89
|
function convertInstantUpdateToDefinitionChanges(instantUpdate) {
|
|
@@ -148,16 +148,16 @@ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage,
|
|
|
148
148
|
var updatedDefinitions = [];
|
|
149
149
|
var ffUpdate = false;
|
|
150
150
|
if (definitionChanges.d) {
|
|
151
|
-
var _a = computeMutation(definitionChanges.d, usedSegments, splitFiltersValidation),
|
|
151
|
+
var _a = computeMutation(definitionChanges.d, usedSegments, splitFiltersValidation), updated = _a.updated, removed = _a.removed, names = _a.names;
|
|
152
152
|
updatedDefinitions = names;
|
|
153
|
-
log.debug(constants_2.SYNC_UPDATE, [definitionChangesFetcher.type,
|
|
154
|
-
ffUpdate = definitions.update(
|
|
153
|
+
log.debug(constants_2.SYNC_UPDATE, [definitionChangesFetcher.type, updated.length, removed.length]);
|
|
154
|
+
ffUpdate = definitions.update(updated, removed, definitionChanges.d.till);
|
|
155
155
|
}
|
|
156
156
|
var rbsUpdate = false;
|
|
157
157
|
if (definitionChanges.rbs) {
|
|
158
|
-
var _b = computeMutation(definitionChanges.rbs, usedSegments),
|
|
159
|
-
log.debug(constants_2.SYNC_UPDATE, ['rule-based segments',
|
|
160
|
-
rbsUpdate = rbSegments.update(
|
|
158
|
+
var _b = computeMutation(definitionChanges.rbs, usedSegments), updated = _b.updated, removed = _b.removed;
|
|
159
|
+
log.debug(constants_2.SYNC_UPDATE, ['rule-based segments', updated.length, removed.length]);
|
|
160
|
+
rbsUpdate = rbSegments.update(updated, removed, definitionChanges.rbs.till);
|
|
161
161
|
}
|
|
162
162
|
return Promise.all([ffUpdate, rbsUpdate,
|
|
163
163
|
// @TODO if at least 1 segment fetch fails due to 404 and other segments are updated in the storage, SDK_UPDATE is not emitted
|
|
@@ -8,7 +8,7 @@ var murmur3_1 = require("../../../utils/murmur3/murmur3");
|
|
|
8
8
|
/**
|
|
9
9
|
* Factory of authentication function.
|
|
10
10
|
*
|
|
11
|
-
* @param fetchAuth - `
|
|
11
|
+
* @param fetchAuth - `ServiceApi.fetchAuth` endpoint
|
|
12
12
|
*/
|
|
13
13
|
function authenticateFactory(fetchAuth) {
|
|
14
14
|
/**
|
|
@@ -23,7 +23,7 @@ var constants_3 = require("../../utils/constants");
|
|
|
23
23
|
* - for client-side, with support for multiple clients, if key is provided in settings
|
|
24
24
|
*/
|
|
25
25
|
function pushManagerFactory(params, pollingManager) {
|
|
26
|
-
var settings = params.settings, storage = params.storage,
|
|
26
|
+
var settings = params.settings, storage = params.storage, serviceApi = params.serviceApi, readiness = params.readiness, platform = params.platform, telemetryTracker = params.telemetryTracker;
|
|
27
27
|
// `userKey` is the matching key of main client in client-side SDK.
|
|
28
28
|
// It can be used to check if running on client-side or server-side SDK.
|
|
29
29
|
var userKey = (0, key_1.checkIfServerSide)(settings) ? undefined : (0, key_1.getMatching)(settings.core.key);
|
|
@@ -37,7 +37,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
37
37
|
log.warn(constants_2.STREAMING_FALLBACK, [e]);
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
|
-
var authenticate = (0, AuthClient_1.authenticateFactory)(
|
|
40
|
+
var authenticate = (0, AuthClient_1.authenticateFactory)(serviceApi.fetchAuth);
|
|
41
41
|
// init feedback loop
|
|
42
42
|
var pushEmitter = new platform.EventEmitter();
|
|
43
43
|
var sseHandler = (0, SSEHandler_1.SSEHandlerFactory)(log, pushEmitter, telemetryTracker);
|
|
@@ -7,7 +7,7 @@ var constants_1 = require("../../logger/constants");
|
|
|
7
7
|
* Submitter that periodically posts tracked events
|
|
8
8
|
*/
|
|
9
9
|
function eventsSubmitterFactory(params) {
|
|
10
|
-
var _a = params.settings, log = _a.log, eventsPushRate = _a.scheduler.eventsPushRate, eventsFirstPushWindow = _a.startup.eventsFirstPushWindow, postEventsBulk = params.
|
|
10
|
+
var _a = params.settings, log = _a.log, eventsPushRate = _a.scheduler.eventsPushRate, eventsFirstPushWindow = _a.startup.eventsFirstPushWindow, postEventsBulk = params.serviceApi.postEventsBulk, events = params.storage.events;
|
|
11
11
|
// don't retry events.
|
|
12
12
|
var submitter = (0, submitter_1.submitterFactory)(log, postEventsBulk, events, eventsPushRate);
|
|
13
13
|
// Set a timer for the first push window of events.
|
|
@@ -29,7 +29,7 @@ var IMPRESSIONS_COUNT_RATE = 1800000; // 30 minutes
|
|
|
29
29
|
* Submitter that periodically posts impression counts
|
|
30
30
|
*/
|
|
31
31
|
function impressionCountsSubmitterFactory(params) {
|
|
32
|
-
var log = params.settings.log, postTestImpressionsCount = params.
|
|
32
|
+
var log = params.settings.log, postTestImpressionsCount = params.serviceApi.postTestImpressionsCount, impressionCounts = params.storage.impressionCounts;
|
|
33
33
|
// retry impressions counts only once.
|
|
34
34
|
return (0, submitter_1.submitterFactory)(log, postTestImpressionsCount, impressionCounts, IMPRESSIONS_COUNT_RATE, fromImpressionCountsCollector, 1);
|
|
35
35
|
}
|
|
@@ -35,7 +35,7 @@ exports.fromImpressionsCollector = fromImpressionsCollector;
|
|
|
35
35
|
* Submitter that periodically posts impressions data
|
|
36
36
|
*/
|
|
37
37
|
function impressionsSubmitterFactory(params) {
|
|
38
|
-
var _a = params.settings, log = _a.log, impressionsRefreshRate = _a.scheduler.impressionsRefreshRate, labelsEnabled = _a.core.labelsEnabled, postTestImpressionsBulk = params.
|
|
38
|
+
var _a = params.settings, log = _a.log, impressionsRefreshRate = _a.scheduler.impressionsRefreshRate, labelsEnabled = _a.core.labelsEnabled, postTestImpressionsBulk = params.serviceApi.postTestImpressionsBulk, impressions = params.storage.impressions, entityType = params.entityType;
|
|
39
39
|
// retry impressions only once.
|
|
40
40
|
var syncTask = (0, submitter_1.submitterFactory)(log, postTestImpressionsBulk, impressions, impressionsRefreshRate, fromImpressionsCollector.bind(undefined, labelsEnabled, entityType), 1);
|
|
41
41
|
// register impressions submitter to be executed when impressions cache is full
|
|
@@ -107,9 +107,9 @@ function telemetrySubmitterFactory(params) {
|
|
|
107
107
|
var telemetry = params.storage.telemetry, now = params.platform.now;
|
|
108
108
|
if (!telemetry || !now)
|
|
109
109
|
return; // No submitter created if telemetry cache is not defined
|
|
110
|
-
var settings = params.settings, _a = params.settings, log = _a.log, telemetryRefreshRate = _a.scheduler.telemetryRefreshRate,
|
|
110
|
+
var settings = params.settings, _a = params.settings, log = _a.log, telemetryRefreshRate = _a.scheduler.telemetryRefreshRate, serviceApi = params.serviceApi, readiness = params.readiness;
|
|
111
111
|
var stopTimer = (0, timer_1.timer)(now);
|
|
112
|
-
var submitter = (0, submitter_1.firstPushWindowDecorator)((0, submitter_1.submitterFactory)(log,
|
|
112
|
+
var submitter = (0, submitter_1.firstPushWindowDecorator)((0, submitter_1.submitterFactory)(log, serviceApi.postMetricsUsage, telemetry, telemetryRefreshRate, undefined, 0, true), telemetryRefreshRate);
|
|
113
113
|
readiness.gate.once(constants_2.SDK_READY_FROM_CACHE, function () {
|
|
114
114
|
telemetry.recordTimeUntilReadyFromCache(stopTimer());
|
|
115
115
|
});
|
|
@@ -117,7 +117,7 @@ function telemetrySubmitterFactory(params) {
|
|
|
117
117
|
telemetry.recordTimeUntilReady(stopTimer());
|
|
118
118
|
// Post config data when the SDK is ready and if the telemetry submitter was started
|
|
119
119
|
if (submitter.isRunning()) {
|
|
120
|
-
var postMetricsConfigTask = (0, submitter_1.submitterFactory)(log,
|
|
120
|
+
var postMetricsConfigTask = (0, submitter_1.submitterFactory)(log, serviceApi.postMetricsConfig, telemetryCacheConfigAdapter(telemetry, settings), 0, undefined, 0, true);
|
|
121
121
|
postMetricsConfigTask.execute();
|
|
122
122
|
}
|
|
123
123
|
});
|
|
@@ -8,7 +8,7 @@ var UNIQUE_KEYS_RATE = 900000; // 15 minutes
|
|
|
8
8
|
* Submitter that periodically posts impression counts
|
|
9
9
|
*/
|
|
10
10
|
function uniqueKeysSubmitterFactory(params) {
|
|
11
|
-
var _a = params.settings, log = _a.log, key = _a.core.key, _b = params.
|
|
11
|
+
var _a = params.settings, log = _a.log, key = _a.core.key, _b = params.serviceApi, postUniqueKeysBulkCs = _b.postUniqueKeysBulkCs, postUniqueKeysBulkSs = _b.postUniqueKeysBulkSs, uniqueKeys = params.storage.uniqueKeys;
|
|
12
12
|
var isClientSide = key !== undefined;
|
|
13
13
|
var postUniqueKeysBulk = isClientSide ? postUniqueKeysBulkCs : postUniqueKeysBulkSs;
|
|
14
14
|
var syncTask = (0, submitter_1.submitterFactory)(log, postUniqueKeysBulk, uniqueKeys, UNIQUE_KEYS_RATE);
|
|
@@ -21,7 +21,7 @@ var segmentChangesFetcher_1 = require("./polling/fetchers/segmentChangesFetcher"
|
|
|
21
21
|
*/
|
|
22
22
|
function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, definitionFetcherFactory, segmentFetcherFactory) {
|
|
23
23
|
if (definitionFetcherFactory === void 0) { definitionFetcherFactory = splitChangesFetcher_1.splitChangesFetcherFactory; }
|
|
24
|
-
if (segmentFetcherFactory === void 0) { segmentFetcherFactory = function (params) { return (0, segmentChangesFetcher_1.segmentChangesFetcherFactory)(params.
|
|
24
|
+
if (segmentFetcherFactory === void 0) { segmentFetcherFactory = function (params) { return (0, segmentChangesFetcher_1.segmentChangesFetcherFactory)(params.serviceApi.fetchSegmentChanges); }; }
|
|
25
25
|
/**
|
|
26
26
|
* SyncManager factory for modular SDK
|
|
27
27
|
*/
|
|
@@ -56,7 +56,7 @@ exports.base = {
|
|
|
56
56
|
// Telemetry Server
|
|
57
57
|
telemetry: 'https://telemetry.split.io/api',
|
|
58
58
|
// Configs Server
|
|
59
|
-
configs: 'https://configs.split.io
|
|
59
|
+
configs: 'https://configs.split.io',
|
|
60
60
|
},
|
|
61
61
|
// Defines which kind of storage we should instantiate.
|
|
62
62
|
storage: undefined,
|
package/esm/listeners/browser.js
CHANGED
|
@@ -11,11 +11,11 @@ var EVENT_NAME = 'for visibilitychange and pagehide events.';
|
|
|
11
11
|
*/
|
|
12
12
|
var BrowserSignalListener = /** @class */ (function () {
|
|
13
13
|
function BrowserSignalListener(_a) {
|
|
14
|
-
var syncManager = _a.syncManager, settings = _a.settings, storage = _a.storage,
|
|
14
|
+
var syncManager = _a.syncManager, settings = _a.settings, storage = _a.storage, serviceApi = _a.serviceApi, entityType = _a.entityType;
|
|
15
15
|
this.syncManager = syncManager;
|
|
16
16
|
this.settings = settings;
|
|
17
17
|
this.storage = storage;
|
|
18
|
-
this.serviceApi =
|
|
18
|
+
this.serviceApi = serviceApi;
|
|
19
19
|
this.flushData = this.flushData.bind(this);
|
|
20
20
|
this.flushDataIfHidden = this.flushDataIfHidden.bind(this);
|
|
21
21
|
this.fromImpressionsCollector = fromImpressionsCollector.bind(undefined, settings.core.labelsEnabled, entityType);
|
|
@@ -21,7 +21,7 @@ export var codesDebug = codesInfo.concat([
|
|
|
21
21
|
// synchronizer
|
|
22
22
|
[c.SYNC_OFFLINE_DATA, c.LOG_PREFIX_SYNC_OFFLINE + 'Feature flags data: \n%s'],
|
|
23
23
|
[c.SYNC_FETCH, c.LOG_PREFIX_SYNC + 'Spin up %s updates using since = %s and rbSince = %s.'],
|
|
24
|
-
[c.SYNC_UPDATE, c.LOG_PREFIX_SYNC + '
|
|
24
|
+
[c.SYNC_UPDATE, c.LOG_PREFIX_SYNC + 'Updated %s: %s. Removed: %s.'],
|
|
25
25
|
[c.STREAMING_NEW_MESSAGE, c.LOG_PREFIX_SYNC_STREAMING + 'New SSE message received, with data: %s.'],
|
|
26
26
|
[c.SYNC_TASK_START, c.LOG_PREFIX_SYNC + 'Starting %s. Running each %s millis'],
|
|
27
27
|
[c.SYNC_TASK_EXECUTE, c.LOG_PREFIX_SYNC + 'Running %s'],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { serviceApiFactory } from '../services/serviceApi';
|
|
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
|
-
|
|
12
|
+
serviceApiFactory: serviceApiFactory,
|
|
13
13
|
syncManagerFactory: syncManagerOnlineSSFactory,
|
|
14
14
|
sdkManagerFactory: sdkManagerFactory,
|
|
15
15
|
sdkClientMethodFactory: sdkClientMethodFactory,
|
|
@@ -4,7 +4,7 @@ var COOLDOWN_TIME_IN_MILLIS = 1000;
|
|
|
4
4
|
* Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
|
|
5
5
|
*/
|
|
6
6
|
export function sdkLifecycleFactory(params, isSharedClient) {
|
|
7
|
-
var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, settings = params.settings, telemetryTracker = params.telemetryTracker, impressionsTracker = params.impressionsTracker, platform = params.platform,
|
|
7
|
+
var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, settings = params.settings, telemetryTracker = params.telemetryTracker, impressionsTracker = params.impressionsTracker, platform = params.platform, serviceApi = params.serviceApi;
|
|
8
8
|
var hasInit = false;
|
|
9
9
|
var lastActionTime = 0;
|
|
10
10
|
var signalListener = platform.SignalListener && new platform.SignalListener(params);
|
|
@@ -57,7 +57,7 @@ export function sdkLifecycleFactory(params, isSharedClient) {
|
|
|
57
57
|
}
|
|
58
58
|
// Stop background jobs
|
|
59
59
|
syncManager && syncManager.stop();
|
|
60
|
-
|
|
60
|
+
serviceApi && serviceApi.stop();
|
|
61
61
|
return __flush().then(function () {
|
|
62
62
|
// Cleanup storage
|
|
63
63
|
return storage.destroy();
|