@splitsoftware/splitio-commons 1.17.1-rc.0 → 1.17.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.txt +2 -0
- package/cjs/sdkClient/identity.js +7 -0
- package/cjs/sdkClient/sdkClient.js +5 -5
- package/cjs/sdkClient/sdkClientMethod.js +3 -1
- package/cjs/sdkClient/sdkClientMethodCS.js +8 -13
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +8 -13
- package/cjs/sdkFactory/index.js +5 -1
- package/esm/sdkClient/identity.js +3 -0
- package/esm/sdkClient/sdkClient.js +5 -5
- package/esm/sdkClient/sdkClientMethod.js +3 -1
- package/esm/sdkClient/sdkClientMethodCS.js +6 -11
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +6 -11
- package/esm/sdkFactory/index.js +5 -1
- package/package.json +1 -1
- package/src/sdkClient/identity.ts +5 -0
- package/src/sdkClient/sdkClient.ts +5 -5
- package/src/sdkClient/sdkClientMethod.ts +4 -1
- package/src/sdkClient/sdkClientMethodCS.ts +6 -12
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +6 -12
- package/src/sdkFactory/index.ts +7 -3
- package/src/sdkFactory/types.ts +2 -1
- package/src/types.ts +7 -1
- package/types/sdkClient/identity.d.ts +0 -4
- package/types/sdkClient/sdkClientMethod.d.ts +1 -1
- package/types/sdkFactory/types.d.ts +2 -1
- package/types/storages/AbstractMySegmentsCacheSync.d.ts +39 -0
- package/types/types.d.ts +7 -1
package/CHANGES.txt
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
2.0.0 (September XX, 2024)
|
|
2
|
+
- Added `factory.destroy()` method, which invokes the `destroy` method on all SDK clients created by the factory.
|
|
2
3
|
- Added support for targeting rules based on large segments.
|
|
3
4
|
- BREAKING CHANGES:
|
|
5
|
+
- Updated default flag spec version to 1.2.
|
|
4
6
|
- Removed `/mySegments` endpoint from SplitAPI module, as it is replaced by `/memberships` endpoint.
|
|
5
7
|
- Removed support for MY_SEGMENTS_UPDATE and MY_SEGMENTS_UPDATE_V2 notification types, as they are replaced by MEMBERSHIPS_MS_UPDATE and MEMBERSHIPS_LS_UPDATE notification types.
|
|
6
8
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildInstanceId = void 0;
|
|
4
|
+
function buildInstanceId(key, trafficType) {
|
|
5
|
+
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType ? trafficType : '');
|
|
6
|
+
}
|
|
7
|
+
exports.buildInstanceId = buildInstanceId;
|
|
@@ -53,11 +53,11 @@ function sdkClientFactory(params, isSharedClient) {
|
|
|
53
53
|
// Stop background jobs
|
|
54
54
|
syncManager && syncManager.stop();
|
|
55
55
|
return __flush().then(function () {
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
// For main client, cleanup event listeners and scheduled jobs
|
|
57
|
+
if (!isSharedClient) {
|
|
58
|
+
signalListener && signalListener.stop();
|
|
59
|
+
uniqueKeysTracker && uniqueKeysTracker.stop();
|
|
60
|
+
}
|
|
61
61
|
// Cleanup storage
|
|
62
62
|
return storage.destroy();
|
|
63
63
|
});
|
|
@@ -4,11 +4,13 @@ exports.sdkClientMethodFactory = void 0;
|
|
|
4
4
|
var sdkClient_1 = require("./sdkClient");
|
|
5
5
|
var constants_1 = require("../logger/constants");
|
|
6
6
|
/**
|
|
7
|
-
* Factory of client method for server-side SDKs
|
|
7
|
+
* Factory of client method for server-side SDKs
|
|
8
8
|
*/
|
|
9
9
|
function sdkClientMethodFactory(params) {
|
|
10
10
|
var log = params.settings.log;
|
|
11
11
|
var clientInstance = (0, sdkClient_1.sdkClientFactory)(params);
|
|
12
|
+
// Only one client in server-side without bound key
|
|
13
|
+
params.clients[''] = clientInstance;
|
|
12
14
|
return function client() {
|
|
13
15
|
if (arguments.length > 0) {
|
|
14
16
|
throw new Error('Shared Client not supported by the storage mechanism. Create isolated instances instead.');
|
|
@@ -8,22 +8,18 @@ var sdkClient_1 = require("./sdkClient");
|
|
|
8
8
|
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
9
9
|
var constants_1 = require("../logger/constants");
|
|
10
10
|
var constants_2 = require("../readiness/constants");
|
|
11
|
-
|
|
12
|
-
// @ts-ignore
|
|
13
|
-
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
|
|
14
|
-
}
|
|
11
|
+
var identity_1 = require("./identity");
|
|
15
12
|
/**
|
|
16
13
|
* Factory of client method for the client-side API variant where TT is ignored.
|
|
17
14
|
* Therefore, clients don't have a bound TT for the track method.
|
|
18
15
|
*/
|
|
19
16
|
function sdkClientMethodCSFactory(params) {
|
|
20
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
17
|
+
var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
21
18
|
var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key);
|
|
22
19
|
var parsedDefaultKey = (0, key_2.keyParser)(key);
|
|
23
|
-
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
20
|
+
var defaultInstanceId = (0, identity_1.buildInstanceId)(parsedDefaultKey);
|
|
24
21
|
// Cache instances created per factory.
|
|
25
|
-
|
|
26
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
22
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
27
23
|
return function client(key) {
|
|
28
24
|
if (key === undefined) {
|
|
29
25
|
log.debug(constants_1.RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -34,8 +30,8 @@ function sdkClientMethodCSFactory(params) {
|
|
|
34
30
|
if (validKey === false) {
|
|
35
31
|
throw new Error('Shared Client needs a valid key.');
|
|
36
32
|
}
|
|
37
|
-
var instanceId = buildInstanceId(validKey);
|
|
38
|
-
if (!
|
|
33
|
+
var instanceId = (0, identity_1.buildInstanceId)(validKey);
|
|
34
|
+
if (!clients[instanceId]) {
|
|
39
35
|
var matchingKey = (0, key_2.getMatching)(validKey);
|
|
40
36
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
41
37
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
@@ -54,11 +50,10 @@ function sdkClientMethodCSFactory(params) {
|
|
|
54
50
|
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
55
51
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
56
52
|
// will use offline or online mode. We should stick with the original decision.
|
|
57
|
-
|
|
53
|
+
clients[instanceId] = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)((0, objectAssign_1.objectAssign)({}, params, {
|
|
58
54
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
59
55
|
storage: sharedStorage || storage,
|
|
60
56
|
syncManager: sharedSyncManager,
|
|
61
|
-
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
62
57
|
}), true), validKey);
|
|
63
58
|
sharedSyncManager && sharedSyncManager.start();
|
|
64
59
|
log.info(constants_1.NEW_SHARED_CLIENT);
|
|
@@ -66,7 +61,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
66
61
|
else {
|
|
67
62
|
log.debug(constants_1.RETRIEVE_CLIENT_EXISTING);
|
|
68
63
|
}
|
|
69
|
-
return
|
|
64
|
+
return clients[instanceId];
|
|
70
65
|
};
|
|
71
66
|
}
|
|
72
67
|
exports.sdkClientMethodCSFactory = sdkClientMethodCSFactory;
|
|
@@ -9,23 +9,19 @@ var sdkClient_1 = require("./sdkClient");
|
|
|
9
9
|
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
10
10
|
var constants_1 = require("../logger/constants");
|
|
11
11
|
var constants_2 = require("../readiness/constants");
|
|
12
|
-
|
|
13
|
-
// @ts-ignore
|
|
14
|
-
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
|
|
15
|
-
}
|
|
12
|
+
var identity_1 = require("./identity");
|
|
16
13
|
/**
|
|
17
14
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
18
15
|
* where clients can have a bound TT for the track method, which is provided via the settings
|
|
19
16
|
* (default client) or the client method (shared clients).
|
|
20
17
|
*/
|
|
21
18
|
function sdkClientMethodCSFactory(params) {
|
|
22
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
|
|
19
|
+
var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
|
|
23
20
|
var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key, trafficType);
|
|
24
21
|
var parsedDefaultKey = (0, key_2.keyParser)(key);
|
|
25
|
-
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
22
|
+
var defaultInstanceId = (0, identity_1.buildInstanceId)(parsedDefaultKey, trafficType);
|
|
26
23
|
// Cache instances created per factory.
|
|
27
|
-
|
|
28
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
24
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
29
25
|
return function client(key, trafficType) {
|
|
30
26
|
if (key === undefined) {
|
|
31
27
|
log.debug(constants_1.RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -43,8 +39,8 @@ function sdkClientMethodCSFactory(params) {
|
|
|
43
39
|
throw new Error('Shared Client needs a valid traffic type or no traffic type at all.');
|
|
44
40
|
}
|
|
45
41
|
}
|
|
46
|
-
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
47
|
-
if (!
|
|
42
|
+
var instanceId = (0, identity_1.buildInstanceId)(validKey, validTrafficType);
|
|
43
|
+
if (!clients[instanceId]) {
|
|
48
44
|
var matchingKey = (0, key_2.getMatching)(validKey);
|
|
49
45
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
50
46
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
@@ -63,11 +59,10 @@ function sdkClientMethodCSFactory(params) {
|
|
|
63
59
|
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
64
60
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
65
61
|
// will use offline or online mode. We should stick with the original decision.
|
|
66
|
-
|
|
62
|
+
clients[instanceId] = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)((0, objectAssign_1.objectAssign)({}, params, {
|
|
67
63
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
68
64
|
storage: sharedStorage || storage,
|
|
69
65
|
syncManager: sharedSyncManager,
|
|
70
|
-
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
71
66
|
}), true), validKey, validTrafficType);
|
|
72
67
|
sharedSyncManager && sharedSyncManager.start();
|
|
73
68
|
log.info(constants_1.NEW_SHARED_CLIENT);
|
|
@@ -75,7 +70,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
75
70
|
else {
|
|
76
71
|
log.debug(constants_1.RETRIEVE_CLIENT_EXISTING);
|
|
77
72
|
}
|
|
78
|
-
return
|
|
73
|
+
return clients[instanceId];
|
|
79
74
|
};
|
|
80
75
|
}
|
|
81
76
|
exports.sdkClientMethodCSFactory = sdkClientMethodCSFactory;
|
package/cjs/sdkFactory/index.js
CHANGED
|
@@ -40,6 +40,7 @@ function sdkFactory(params) {
|
|
|
40
40
|
},
|
|
41
41
|
});
|
|
42
42
|
// @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
|
|
43
|
+
var clients = {};
|
|
43
44
|
var telemetryTracker = (0, telemetryTracker_1.telemetryTrackerFactory)(storage.telemetry, platform.now);
|
|
44
45
|
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
45
46
|
var observer = impressionsObserverFactory();
|
|
@@ -59,7 +60,7 @@ function sdkFactory(params) {
|
|
|
59
60
|
var eventTracker = (0, eventTracker_1.eventTrackerFactory)(settings, storage.events, integrationsManager, storage.telemetry);
|
|
60
61
|
// splitApi is used by SyncManager and Browser signal listener
|
|
61
62
|
var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
|
|
62
|
-
var ctx = { splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
|
|
63
|
+
var ctx = { clients: clients, splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
|
|
63
64
|
var syncManager = syncManagerFactory && syncManagerFactory(ctx);
|
|
64
65
|
ctx.syncManager = syncManager;
|
|
65
66
|
var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
|
|
@@ -82,6 +83,9 @@ function sdkFactory(params) {
|
|
|
82
83
|
// Logger wrapper API
|
|
83
84
|
Logger: (0, sdkLogger_1.createLoggerAPI)(log),
|
|
84
85
|
settings: settings,
|
|
86
|
+
destroy: function () {
|
|
87
|
+
return Promise.all(Object.keys(clients).map(function (key) { return clients[key].destroy(); })).then(function () { });
|
|
88
|
+
}
|
|
85
89
|
}, extraProps && extraProps(ctx));
|
|
86
90
|
}
|
|
87
91
|
exports.sdkFactory = sdkFactory;
|
|
@@ -50,11 +50,11 @@ export function sdkClientFactory(params, isSharedClient) {
|
|
|
50
50
|
// Stop background jobs
|
|
51
51
|
syncManager && syncManager.stop();
|
|
52
52
|
return __flush().then(function () {
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// For main client, cleanup event listeners and scheduled jobs
|
|
54
|
+
if (!isSharedClient) {
|
|
55
|
+
signalListener && signalListener.stop();
|
|
56
|
+
uniqueKeysTracker && uniqueKeysTracker.stop();
|
|
57
|
+
}
|
|
58
58
|
// Cleanup storage
|
|
59
59
|
return storage.destroy();
|
|
60
60
|
});
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { sdkClientFactory } from './sdkClient';
|
|
2
2
|
import { RETRIEVE_CLIENT_DEFAULT } from '../logger/constants';
|
|
3
3
|
/**
|
|
4
|
-
* Factory of client method for server-side SDKs
|
|
4
|
+
* Factory of client method for server-side SDKs
|
|
5
5
|
*/
|
|
6
6
|
export function sdkClientMethodFactory(params) {
|
|
7
7
|
var log = params.settings.log;
|
|
8
8
|
var clientInstance = sdkClientFactory(params);
|
|
9
|
+
// Only one client in server-side without bound key
|
|
10
|
+
params.clients[''] = clientInstance;
|
|
9
11
|
return function client() {
|
|
10
12
|
if (arguments.length > 0) {
|
|
11
13
|
throw new Error('Shared Client not supported by the storage mechanism. Create isolated instances instead.');
|
|
@@ -5,22 +5,18 @@ import { sdkClientFactory } from './sdkClient';
|
|
|
5
5
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
6
6
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
|
|
7
7
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
8
|
-
|
|
9
|
-
// @ts-ignore
|
|
10
|
-
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
|
|
11
|
-
}
|
|
8
|
+
import { buildInstanceId } from './identity';
|
|
12
9
|
/**
|
|
13
10
|
* Factory of client method for the client-side API variant where TT is ignored.
|
|
14
11
|
* Therefore, clients don't have a bound TT for the track method.
|
|
15
12
|
*/
|
|
16
13
|
export function sdkClientMethodCSFactory(params) {
|
|
17
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
14
|
+
var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
18
15
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
19
16
|
var parsedDefaultKey = keyParser(key);
|
|
20
17
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
21
18
|
// Cache instances created per factory.
|
|
22
|
-
|
|
23
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
19
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
24
20
|
return function client(key) {
|
|
25
21
|
if (key === undefined) {
|
|
26
22
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -32,7 +28,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
32
28
|
throw new Error('Shared Client needs a valid key.');
|
|
33
29
|
}
|
|
34
30
|
var instanceId = buildInstanceId(validKey);
|
|
35
|
-
if (!
|
|
31
|
+
if (!clients[instanceId]) {
|
|
36
32
|
var matchingKey = getMatching(validKey);
|
|
37
33
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
38
34
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
@@ -51,11 +47,10 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
51
47
|
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
52
48
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
53
49
|
// will use offline or online mode. We should stick with the original decision.
|
|
54
|
-
|
|
50
|
+
clients[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
|
|
55
51
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
56
52
|
storage: sharedStorage || storage,
|
|
57
53
|
syncManager: sharedSyncManager,
|
|
58
|
-
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
59
54
|
}), true), validKey);
|
|
60
55
|
sharedSyncManager && sharedSyncManager.start();
|
|
61
56
|
log.info(NEW_SHARED_CLIENT);
|
|
@@ -63,6 +58,6 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
63
58
|
else {
|
|
64
59
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
65
60
|
}
|
|
66
|
-
return
|
|
61
|
+
return clients[instanceId];
|
|
67
62
|
};
|
|
68
63
|
}
|
|
@@ -6,23 +6,19 @@ import { sdkClientFactory } from './sdkClient';
|
|
|
6
6
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
7
7
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
|
|
8
8
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
9
|
-
|
|
10
|
-
// @ts-ignore
|
|
11
|
-
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
|
|
12
|
-
}
|
|
9
|
+
import { buildInstanceId } from './identity';
|
|
13
10
|
/**
|
|
14
11
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
15
12
|
* where clients can have a bound TT for the track method, which is provided via the settings
|
|
16
13
|
* (default client) or the client method (shared clients).
|
|
17
14
|
*/
|
|
18
15
|
export function sdkClientMethodCSFactory(params) {
|
|
19
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
|
|
16
|
+
var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
|
|
20
17
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key, trafficType);
|
|
21
18
|
var parsedDefaultKey = keyParser(key);
|
|
22
19
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
23
20
|
// Cache instances created per factory.
|
|
24
|
-
|
|
25
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
21
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
26
22
|
return function client(key, trafficType) {
|
|
27
23
|
if (key === undefined) {
|
|
28
24
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -41,7 +37,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
41
37
|
}
|
|
42
38
|
}
|
|
43
39
|
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
44
|
-
if (!
|
|
40
|
+
if (!clients[instanceId]) {
|
|
45
41
|
var matchingKey = getMatching(validKey);
|
|
46
42
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
47
43
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
@@ -60,11 +56,10 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
60
56
|
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
61
57
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
62
58
|
// will use offline or online mode. We should stick with the original decision.
|
|
63
|
-
|
|
59
|
+
clients[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
|
|
64
60
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
65
61
|
storage: sharedStorage || storage,
|
|
66
62
|
syncManager: sharedSyncManager,
|
|
67
|
-
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
68
63
|
}), true), validKey, validTrafficType);
|
|
69
64
|
sharedSyncManager && sharedSyncManager.start();
|
|
70
65
|
log.info(NEW_SHARED_CLIENT);
|
|
@@ -72,6 +67,6 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
72
67
|
else {
|
|
73
68
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
74
69
|
}
|
|
75
|
-
return
|
|
70
|
+
return clients[instanceId];
|
|
76
71
|
};
|
|
77
72
|
}
|
package/esm/sdkFactory/index.js
CHANGED
|
@@ -37,6 +37,7 @@ export function sdkFactory(params) {
|
|
|
37
37
|
},
|
|
38
38
|
});
|
|
39
39
|
// @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
|
|
40
|
+
var clients = {};
|
|
40
41
|
var telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
|
|
41
42
|
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
42
43
|
var observer = impressionsObserverFactory();
|
|
@@ -56,7 +57,7 @@ export function sdkFactory(params) {
|
|
|
56
57
|
var eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
|
|
57
58
|
// splitApi is used by SyncManager and Browser signal listener
|
|
58
59
|
var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
|
|
59
|
-
var ctx = { splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
|
|
60
|
+
var ctx = { clients: clients, splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, uniqueKeysTracker: uniqueKeysTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
|
|
60
61
|
var syncManager = syncManagerFactory && syncManagerFactory(ctx);
|
|
61
62
|
ctx.syncManager = syncManager;
|
|
62
63
|
var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
|
|
@@ -79,5 +80,8 @@ export function sdkFactory(params) {
|
|
|
79
80
|
// Logger wrapper API
|
|
80
81
|
Logger: createLoggerAPI(log),
|
|
81
82
|
settings: settings,
|
|
83
|
+
destroy: function () {
|
|
84
|
+
return Promise.all(Object.keys(clients).map(function (key) { return clients[key].destroy(); })).then(function () { });
|
|
85
|
+
}
|
|
82
86
|
}, extraProps && extraProps(ctx));
|
|
83
87
|
}
|
package/package.json
CHANGED
|
@@ -66,11 +66,11 @@ export function sdkClientFactory(params: ISdkFactoryContext, isSharedClient?: bo
|
|
|
66
66
|
syncManager && syncManager.stop();
|
|
67
67
|
|
|
68
68
|
return __flush().then(() => {
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
// For main client, cleanup event listeners and scheduled jobs
|
|
70
|
+
if (!isSharedClient) {
|
|
71
|
+
signalListener && signalListener.stop();
|
|
72
|
+
uniqueKeysTracker && uniqueKeysTracker.stop();
|
|
73
|
+
}
|
|
74
74
|
|
|
75
75
|
// Cleanup storage
|
|
76
76
|
return storage.destroy();
|
|
@@ -4,12 +4,15 @@ import { RETRIEVE_CLIENT_DEFAULT } from '../logger/constants';
|
|
|
4
4
|
import { ISdkFactoryContext } from '../sdkFactory/types';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Factory of client method for server-side SDKs
|
|
7
|
+
* Factory of client method for server-side SDKs
|
|
8
8
|
*/
|
|
9
9
|
export function sdkClientMethodFactory(params: ISdkFactoryContext): () => SplitIO.IClient | SplitIO.IAsyncClient {
|
|
10
10
|
const log = params.settings.log;
|
|
11
11
|
const clientInstance = sdkClientFactory(params);
|
|
12
12
|
|
|
13
|
+
// Only one client in server-side without bound key
|
|
14
|
+
params.clients[''] = clientInstance;
|
|
15
|
+
|
|
13
16
|
return function client() {
|
|
14
17
|
if (arguments.length > 0) {
|
|
15
18
|
throw new Error('Shared Client not supported by the storage mechanism. Create isolated instances instead.');
|
|
@@ -8,18 +8,14 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
8
8
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
|
|
9
9
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
10
10
|
import { ISdkFactoryContext } from '../sdkFactory/types';
|
|
11
|
-
|
|
12
|
-
function buildInstanceId(key: SplitIO.SplitKey) {
|
|
13
|
-
// @ts-ignore
|
|
14
|
-
return `${key.matchingKey ? key.matchingKey : key}-${key.bucketingKey ? key.bucketingKey : key}-`;
|
|
15
|
-
}
|
|
11
|
+
import { buildInstanceId } from './identity';
|
|
16
12
|
|
|
17
13
|
/**
|
|
18
14
|
* Factory of client method for the client-side API variant where TT is ignored.
|
|
19
15
|
* Therefore, clients don't have a bound TT for the track method.
|
|
20
16
|
*/
|
|
21
17
|
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: SplitIO.SplitKey) => SplitIO.ICsClient {
|
|
22
|
-
const { storage, syncManager, sdkReadinessManager, settings: { core: { key }, log } } = params;
|
|
18
|
+
const { clients, storage, syncManager, sdkReadinessManager, settings: { core: { key }, log } } = params;
|
|
23
19
|
|
|
24
20
|
const mainClientInstance = clientCSDecorator(
|
|
25
21
|
log,
|
|
@@ -31,8 +27,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
31
27
|
const defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
32
28
|
|
|
33
29
|
// Cache instances created per factory.
|
|
34
|
-
|
|
35
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
30
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
36
31
|
|
|
37
32
|
return function client(key?: SplitIO.SplitKey) {
|
|
38
33
|
if (key === undefined) {
|
|
@@ -48,7 +43,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
48
43
|
|
|
49
44
|
const instanceId = buildInstanceId(validKey);
|
|
50
45
|
|
|
51
|
-
if (!
|
|
46
|
+
if (!clients[instanceId]) {
|
|
52
47
|
const matchingKey = getMatching(validKey);
|
|
53
48
|
|
|
54
49
|
const sharedSdkReadiness = sdkReadinessManager.shared();
|
|
@@ -70,13 +65,12 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
70
65
|
|
|
71
66
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
72
67
|
// will use offline or online mode. We should stick with the original decision.
|
|
73
|
-
|
|
68
|
+
clients[instanceId] = clientCSDecorator(
|
|
74
69
|
log,
|
|
75
70
|
sdkClientFactory(objectAssign({}, params, {
|
|
76
71
|
sdkReadinessManager: sharedSdkReadiness,
|
|
77
72
|
storage: sharedStorage || storage,
|
|
78
73
|
syncManager: sharedSyncManager,
|
|
79
|
-
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
80
74
|
}), true) as SplitIO.IClient,
|
|
81
75
|
validKey
|
|
82
76
|
);
|
|
@@ -88,6 +82,6 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
88
82
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
89
83
|
}
|
|
90
84
|
|
|
91
|
-
return
|
|
85
|
+
return clients[instanceId] as SplitIO.ICsClient;
|
|
92
86
|
};
|
|
93
87
|
}
|
|
@@ -9,11 +9,7 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
9
9
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING, LOG_PREFIX_CLIENT_INSTANTIATION } from '../logger/constants';
|
|
10
10
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
11
11
|
import { ISdkFactoryContext } from '../sdkFactory/types';
|
|
12
|
-
|
|
13
|
-
function buildInstanceId(key: SplitIO.SplitKey, trafficType?: string) {
|
|
14
|
-
// @ts-ignore
|
|
15
|
-
return `${key.matchingKey ? key.matchingKey : key}-${key.bucketingKey ? key.bucketingKey : key}-${trafficType !== undefined ? trafficType : ''}`;
|
|
16
|
-
}
|
|
12
|
+
import { buildInstanceId } from './identity';
|
|
17
13
|
|
|
18
14
|
/**
|
|
19
15
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
@@ -21,7 +17,7 @@ function buildInstanceId(key: SplitIO.SplitKey, trafficType?: string) {
|
|
|
21
17
|
* (default client) or the client method (shared clients).
|
|
22
18
|
*/
|
|
23
19
|
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: SplitIO.SplitKey, trafficType?: string) => SplitIO.ICsClient {
|
|
24
|
-
const { storage, syncManager, sdkReadinessManager, settings: { core: { key, trafficType }, log } } = params;
|
|
20
|
+
const { clients, storage, syncManager, sdkReadinessManager, settings: { core: { key, trafficType }, log } } = params;
|
|
25
21
|
|
|
26
22
|
const mainClientInstance = clientCSDecorator(
|
|
27
23
|
log,
|
|
@@ -34,8 +30,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
34
30
|
const defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
35
31
|
|
|
36
32
|
// Cache instances created per factory.
|
|
37
|
-
|
|
38
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
33
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
39
34
|
|
|
40
35
|
return function client(key?: SplitIO.SplitKey, trafficType?: string) {
|
|
41
36
|
if (key === undefined) {
|
|
@@ -58,7 +53,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
58
53
|
}
|
|
59
54
|
const instanceId = buildInstanceId(validKey, validTrafficType);
|
|
60
55
|
|
|
61
|
-
if (!
|
|
56
|
+
if (!clients[instanceId]) {
|
|
62
57
|
const matchingKey = getMatching(validKey);
|
|
63
58
|
|
|
64
59
|
const sharedSdkReadiness = sdkReadinessManager.shared();
|
|
@@ -80,13 +75,12 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
80
75
|
|
|
81
76
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
82
77
|
// will use offline or online mode. We should stick with the original decision.
|
|
83
|
-
|
|
78
|
+
clients[instanceId] = clientCSDecorator(
|
|
84
79
|
log,
|
|
85
80
|
sdkClientFactory(objectAssign({}, params, {
|
|
86
81
|
sdkReadinessManager: sharedSdkReadiness,
|
|
87
82
|
storage: sharedStorage || storage,
|
|
88
83
|
syncManager: sharedSyncManager,
|
|
89
|
-
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
90
84
|
}), true) as SplitIO.IClient,
|
|
91
85
|
validKey,
|
|
92
86
|
validTrafficType
|
|
@@ -99,6 +93,6 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
99
93
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
100
94
|
}
|
|
101
95
|
|
|
102
|
-
return
|
|
96
|
+
return clients[instanceId] as SplitIO.ICsClient;
|
|
103
97
|
};
|
|
104
98
|
}
|
package/src/sdkFactory/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { sdkReadinessManagerFactory } from '../readiness/sdkReadinessManager';
|
|
|
3
3
|
import { impressionsTrackerFactory } from '../trackers/impressionsTracker';
|
|
4
4
|
import { eventTrackerFactory } from '../trackers/eventTracker';
|
|
5
5
|
import { telemetryTrackerFactory } from '../trackers/telemetryTracker';
|
|
6
|
-
import { SplitIO } from '../types';
|
|
6
|
+
import { IBasicClient, SplitIO } from '../types';
|
|
7
7
|
import { validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
|
|
8
8
|
import { createLoggerAPI } from '../logger/sdkLogger';
|
|
9
9
|
import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
|
|
@@ -48,7 +48,7 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ICsSDK | SplitIO.
|
|
|
48
48
|
},
|
|
49
49
|
});
|
|
50
50
|
// @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
|
|
51
|
-
|
|
51
|
+
const clients: Record<string, IBasicClient> = {};
|
|
52
52
|
const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
|
|
53
53
|
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage, telemetryTracker });
|
|
54
54
|
|
|
@@ -73,7 +73,7 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ICsSDK | SplitIO.
|
|
|
73
73
|
// splitApi is used by SyncManager and Browser signal listener
|
|
74
74
|
const splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
|
|
75
75
|
|
|
76
|
-
const ctx: ISdkFactoryContext = { splitApi, eventTracker, impressionsTracker, telemetryTracker, uniqueKeysTracker, sdkReadinessManager, readiness, settings, storage, platform };
|
|
76
|
+
const ctx: ISdkFactoryContext = { clients, splitApi, eventTracker, impressionsTracker, telemetryTracker, uniqueKeysTracker, sdkReadinessManager, readiness, settings, storage, platform };
|
|
77
77
|
|
|
78
78
|
const syncManager = syncManagerFactory && syncManagerFactory(ctx as ISdkFactoryContextSync);
|
|
79
79
|
ctx.syncManager = syncManager;
|
|
@@ -105,5 +105,9 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ICsSDK | SplitIO.
|
|
|
105
105
|
Logger: createLoggerAPI(log),
|
|
106
106
|
|
|
107
107
|
settings,
|
|
108
|
+
|
|
109
|
+
destroy() {
|
|
110
|
+
return Promise.all(Object.keys(clients).map(key => clients[key].destroy())).then(() => {});
|
|
111
|
+
}
|
|
108
112
|
}, extraProps && extraProps(ctx));
|
|
109
113
|
}
|
package/src/sdkFactory/types.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { IStorageAsync, IStorageSync, IStorageFactoryParams } from '../storages/
|
|
|
8
8
|
import { ISyncManager } from '../sync/types';
|
|
9
9
|
import { IImpressionObserver } from '../trackers/impressionObserver/types';
|
|
10
10
|
import { IImpressionsTracker, IEventTracker, ITelemetryTracker, IFilterAdapter, IUniqueKeysTracker } from '../trackers/types';
|
|
11
|
-
import { SplitIO, ISettings, IEventEmitter } from '../types';
|
|
11
|
+
import { SplitIO, ISettings, IEventEmitter, IBasicClient } from '../types';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Environment related dependencies.
|
|
@@ -49,6 +49,7 @@ export interface ISdkFactoryContext {
|
|
|
49
49
|
signalListener?: ISignalListener
|
|
50
50
|
splitApi?: ISplitApi
|
|
51
51
|
syncManager?: ISyncManager,
|
|
52
|
+
clients: Record<string, IBasicClient>,
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
export interface ISdkFactoryContextSync extends ISdkFactoryContext {
|
package/src/types.ts
CHANGED
|
@@ -426,7 +426,7 @@ export interface IStatusInterface extends IEventEmitter {
|
|
|
426
426
|
* @interface IBasicClient
|
|
427
427
|
* @extends IStatusInterface
|
|
428
428
|
*/
|
|
429
|
-
interface IBasicClient extends IStatusInterface {
|
|
429
|
+
export interface IBasicClient extends IStatusInterface {
|
|
430
430
|
/**
|
|
431
431
|
* Flush data
|
|
432
432
|
* @function flush
|
|
@@ -459,6 +459,12 @@ interface IBasicSDK {
|
|
|
459
459
|
* @property Logger
|
|
460
460
|
*/
|
|
461
461
|
Logger: ILoggerAPI
|
|
462
|
+
/**
|
|
463
|
+
* Destroy all the clients created by this factory.
|
|
464
|
+
* @function destroy
|
|
465
|
+
* @returns {Promise<void>}
|
|
466
|
+
*/
|
|
467
|
+
destroy(): Promise<void>
|
|
462
468
|
}
|
|
463
469
|
/****** Exposed namespace ******/
|
|
464
470
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SplitIO } from '../types';
|
|
2
2
|
import { ISdkFactoryContext } from '../sdkFactory/types';
|
|
3
3
|
/**
|
|
4
|
-
* Factory of client method for server-side SDKs
|
|
4
|
+
* Factory of client method for server-side SDKs
|
|
5
5
|
*/
|
|
6
6
|
export declare function sdkClientMethodFactory(params: ISdkFactoryContext): () => SplitIO.IClient | SplitIO.IAsyncClient;
|
|
@@ -8,7 +8,7 @@ import { IStorageAsync, IStorageSync, IStorageFactoryParams } from '../storages/
|
|
|
8
8
|
import { ISyncManager } from '../sync/types';
|
|
9
9
|
import { IImpressionObserver } from '../trackers/impressionObserver/types';
|
|
10
10
|
import { IImpressionsTracker, IEventTracker, ITelemetryTracker, IFilterAdapter, IUniqueKeysTracker } from '../trackers/types';
|
|
11
|
-
import { SplitIO, ISettings, IEventEmitter } from '../types';
|
|
11
|
+
import { SplitIO, ISettings, IEventEmitter, IBasicClient } from '../types';
|
|
12
12
|
/**
|
|
13
13
|
* Environment related dependencies.
|
|
14
14
|
*/
|
|
@@ -47,6 +47,7 @@ export interface ISdkFactoryContext {
|
|
|
47
47
|
signalListener?: ISignalListener;
|
|
48
48
|
splitApi?: ISplitApi;
|
|
49
49
|
syncManager?: ISyncManager;
|
|
50
|
+
clients: Record<string, IBasicClient>;
|
|
50
51
|
}
|
|
51
52
|
export interface ISdkFactoryContextSync extends ISdkFactoryContext {
|
|
52
53
|
storage: IStorageSync;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { IMySegmentsResponse } from '../dtos/types';
|
|
2
|
+
import { MySegmentsData } from '../sync/polling/types';
|
|
3
|
+
import { ISegmentsCacheSync } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* This class provides a skeletal implementation of the ISegmentsCacheSync interface
|
|
6
|
+
* to minimize the effort required to implement this interface.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync {
|
|
9
|
+
protected abstract addSegment(name: string): boolean;
|
|
10
|
+
protected abstract removeSegment(name: string): boolean;
|
|
11
|
+
protected abstract setChangeNumber(changeNumber?: number): boolean | void;
|
|
12
|
+
/**
|
|
13
|
+
* For server-side synchronizer: check if `key` is in `name` segment.
|
|
14
|
+
* For client-side synchronizer: check if `name` segment is in the cache. `key` is undefined.
|
|
15
|
+
*/
|
|
16
|
+
abstract isInSegment(name: string, key?: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* clear the cache.
|
|
19
|
+
*/
|
|
20
|
+
clear(): void;
|
|
21
|
+
registerSegments(): boolean;
|
|
22
|
+
update(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* For server-side synchronizer: get the list of segments to fetch changes.
|
|
25
|
+
* Also used for the `seC` (segment count) telemetry stat.
|
|
26
|
+
*/
|
|
27
|
+
abstract getRegisteredSegments(): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Only used for the `skC`(segment keys count) telemetry stat: 1 for client-side, and total count of keys in server-side.
|
|
30
|
+
* @TODO for client-side it should be the number of clients, but it requires a refactor of MySegments caches to simplify the code.
|
|
31
|
+
*/
|
|
32
|
+
abstract getKeysCount(): number;
|
|
33
|
+
abstract getChangeNumber(name: string): number;
|
|
34
|
+
/**
|
|
35
|
+
* For server-side synchronizer: the method is not used.
|
|
36
|
+
* For client-side synchronizer: it resets or updates the cache.
|
|
37
|
+
*/
|
|
38
|
+
resetSegments(segmentsData: MySegmentsData | IMySegmentsResponse): boolean;
|
|
39
|
+
}
|
package/types/types.d.ts
CHANGED
|
@@ -422,7 +422,7 @@ export interface IStatusInterface extends IEventEmitter {
|
|
|
422
422
|
* @interface IBasicClient
|
|
423
423
|
* @extends IStatusInterface
|
|
424
424
|
*/
|
|
425
|
-
interface IBasicClient extends IStatusInterface {
|
|
425
|
+
export interface IBasicClient extends IStatusInterface {
|
|
426
426
|
/**
|
|
427
427
|
* Flush data
|
|
428
428
|
* @function flush
|
|
@@ -452,6 +452,12 @@ interface IBasicSDK {
|
|
|
452
452
|
* @property Logger
|
|
453
453
|
*/
|
|
454
454
|
Logger: ILoggerAPI;
|
|
455
|
+
/**
|
|
456
|
+
* Destroy all the clients created by this factory.
|
|
457
|
+
* @function destroy
|
|
458
|
+
* @returns {Promise<void>}
|
|
459
|
+
*/
|
|
460
|
+
destroy(): Promise<void>;
|
|
455
461
|
}
|
|
456
462
|
/****** Exposed namespace ******/
|
|
457
463
|
/**
|