@splitsoftware/splitio-commons 1.8.3-rc.3 → 1.8.3-rc.4
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 +3 -3
- package/cjs/sdkClient/identity.js +14 -0
- package/cjs/sdkClient/sdkClientMethodCS.js +8 -12
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +3 -6
- package/cjs/sdkFactory/index.js +3 -2
- package/esm/sdkClient/identity.js +9 -0
- package/esm/sdkClient/sdkClientMethodCS.js +6 -10
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +1 -4
- package/esm/sdkFactory/index.js +3 -2
- package/package.json +1 -1
- package/src/integrations/types.ts +3 -2
- package/src/sdkClient/identity.ts +12 -0
- package/src/sdkClient/sdkClientMethodCS.ts +6 -11
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +1 -5
- package/src/sdkFactory/index.ts +3 -3
- package/src/sdkFactory/types.ts +1 -4
- package/types/integrations/types.d.ts +3 -4
- package/types/sdkClient/identity.d.ts +6 -0
- package/types/sdkFactory/types.d.ts +1 -4
package/CHANGES.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
1.8.3 (June
|
|
1
|
+
1.8.3 (June 29, 2023)
|
|
2
2
|
- Updated some transitive dependencies for vulnerability fixes.
|
|
3
|
-
- Updated SDK_READY_TIMED_OUT event to be emitted immediately when a connection error occurs using pluggable storage (i.e., wrapper `connect` promise is rejected) in consumer and partial consumer modes.
|
|
4
|
-
- Bugfix - The `destroy` method has been updated to immediately flag the SDK client as destroyed, to prevent
|
|
3
|
+
- Updated SDK_READY_TIMED_OUT event to be emitted immediately when a connection error occurs using pluggable storage (i.e., when the wrapper `connect` promise is rejected) in consumer and partial consumer modes.
|
|
4
|
+
- Bugfix - The `destroy` method has been updated to immediately flag the SDK client as destroyed, to prevent unexpected behaviours when `getTreatment` and `track` methods are called synchronously after `destroy` method is called.
|
|
5
5
|
|
|
6
6
|
1.8.2 (May 15, 2023)
|
|
7
7
|
- Updated terminology on the SDKs codebase to be more aligned with current standard without causing a breaking change. The core change is the term split for feature flag on things like logs and IntelliSense comments.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseInstanceId = 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;
|
|
8
|
+
function parseInstanceId(instanceId) {
|
|
9
|
+
var _a = instanceId.split('-'), matchingKey = _a[0], bucketingKey = _a[1], trafficType = _a[2];
|
|
10
|
+
return matchingKey === bucketingKey ?
|
|
11
|
+
{ key: matchingKey, trafficType: trafficType } :
|
|
12
|
+
{ key: { matchingKey: matchingKey, bucketingKey: bucketingKey }, trafficType: trafficType };
|
|
13
|
+
}
|
|
14
|
+
exports.parseInstanceId = parseInstanceId;
|
|
@@ -8,23 +8,19 @@ 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
|
var method = 'Client instantiation';
|
|
16
13
|
/**
|
|
17
14
|
* Factory of client method for the client-side API variant where TT is ignored and thus
|
|
18
15
|
* clients don't have a binded TT for the track method.
|
|
19
16
|
*/
|
|
20
17
|
function sdkClientMethodCSFactory(params) {
|
|
21
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
18
|
+
var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
22
19
|
var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key);
|
|
23
20
|
var parsedDefaultKey = (0, key_2.keyParser)(key);
|
|
24
|
-
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
21
|
+
var defaultInstanceId = (0, identity_1.buildInstanceId)(parsedDefaultKey);
|
|
25
22
|
// Cache instances created per factory.
|
|
26
|
-
|
|
27
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
23
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
28
24
|
return function client(key) {
|
|
29
25
|
if (key === undefined) {
|
|
30
26
|
log.debug(constants_1.RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -35,8 +31,8 @@ function sdkClientMethodCSFactory(params) {
|
|
|
35
31
|
if (validKey === false) {
|
|
36
32
|
throw new Error('Shared Client needs a valid key.');
|
|
37
33
|
}
|
|
38
|
-
var instanceId = buildInstanceId(validKey);
|
|
39
|
-
if (!
|
|
34
|
+
var instanceId = (0, identity_1.buildInstanceId)(validKey);
|
|
35
|
+
if (!clients[instanceId]) {
|
|
40
36
|
var matchingKey = (0, key_2.getMatching)(validKey);
|
|
41
37
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
|
42
38
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
@@ -55,7 +51,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
55
51
|
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
56
52
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
57
53
|
// will use offline or online mode. We should stick with the original decision.
|
|
58
|
-
|
|
54
|
+
clients[instanceId] = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)((0, objectAssign_1.objectAssign)({}, params, {
|
|
59
55
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
60
56
|
storage: sharedStorage || storage,
|
|
61
57
|
syncManager: sharedSyncManager,
|
|
@@ -67,7 +63,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
67
63
|
else {
|
|
68
64
|
log.debug(constants_1.RETRIEVE_CLIENT_EXISTING);
|
|
69
65
|
}
|
|
70
|
-
return
|
|
66
|
+
return clients[instanceId];
|
|
71
67
|
};
|
|
72
68
|
}
|
|
73
69
|
exports.sdkClientMethodCSFactory = sdkClientMethodCSFactory;
|
|
@@ -9,10 +9,7 @@ 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
|
var method = 'Client instantiation';
|
|
17
14
|
/**
|
|
18
15
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
|
@@ -23,7 +20,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
23
20
|
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
24
21
|
var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key, trafficType);
|
|
25
22
|
var parsedDefaultKey = (0, key_2.keyParser)(key);
|
|
26
|
-
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
23
|
+
var defaultInstanceId = (0, identity_1.buildInstanceId)(parsedDefaultKey, trafficType);
|
|
27
24
|
// Cache instances created per factory.
|
|
28
25
|
var clientInstances = {};
|
|
29
26
|
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
@@ -44,7 +41,7 @@ function sdkClientMethodCSFactory(params) {
|
|
|
44
41
|
throw new Error('Shared Client needs a valid traffic type or no traffic type at all.');
|
|
45
42
|
}
|
|
46
43
|
}
|
|
47
|
-
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
44
|
+
var instanceId = (0, identity_1.buildInstanceId)(validKey, validTrafficType);
|
|
48
45
|
if (!clientInstances[instanceId]) {
|
|
49
46
|
var matchingKey = (0, key_2.getMatching)(validKey);
|
|
50
47
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
package/cjs/sdkFactory/index.js
CHANGED
|
@@ -40,8 +40,9 @@ 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
|
-
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
45
|
+
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker, clients: clients });
|
|
45
46
|
var observer = impressionsObserverFactory();
|
|
46
47
|
var uniqueKeysTracker = impressionsMode === constants_3.NONE ? (0, uniqueKeysTracker_1.uniqueKeysTrackerFactory)(log, storage.uniqueKeys, filterAdapterFactory && filterAdapterFactory()) : undefined;
|
|
47
48
|
var strategy;
|
|
@@ -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);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function buildInstanceId(key, trafficType) {
|
|
2
|
+
return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType ? trafficType : '');
|
|
3
|
+
}
|
|
4
|
+
export function parseInstanceId(instanceId) {
|
|
5
|
+
var _a = instanceId.split('-'), matchingKey = _a[0], bucketingKey = _a[1], trafficType = _a[2];
|
|
6
|
+
return matchingKey === bucketingKey ?
|
|
7
|
+
{ key: matchingKey, trafficType: trafficType } :
|
|
8
|
+
{ key: { matchingKey: matchingKey, bucketingKey: bucketingKey }, trafficType: trafficType };
|
|
9
|
+
}
|
|
@@ -5,23 +5,19 @@ import { sdkClientFactory } from './sdkClient';
|
|
|
5
5
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
6
6
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING } 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
|
var method = 'Client instantiation';
|
|
13
10
|
/**
|
|
14
11
|
* Factory of client method for the client-side API variant where TT is ignored and thus
|
|
15
12
|
* clients don't have a binded TT for the track method.
|
|
16
13
|
*/
|
|
17
14
|
export function sdkClientMethodCSFactory(params) {
|
|
18
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
15
|
+
var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
19
16
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
20
17
|
var parsedDefaultKey = keyParser(key);
|
|
21
18
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
22
19
|
// Cache instances created per factory.
|
|
23
|
-
|
|
24
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
20
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
25
21
|
return function client(key) {
|
|
26
22
|
if (key === undefined) {
|
|
27
23
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
@@ -33,7 +29,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
33
29
|
throw new Error('Shared Client needs a valid key.');
|
|
34
30
|
}
|
|
35
31
|
var instanceId = buildInstanceId(validKey);
|
|
36
|
-
if (!
|
|
32
|
+
if (!clients[instanceId]) {
|
|
37
33
|
var matchingKey = getMatching(validKey);
|
|
38
34
|
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
|
39
35
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
@@ -52,7 +48,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
52
48
|
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
53
49
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
54
50
|
// will use offline or online mode. We should stick with the original decision.
|
|
55
|
-
|
|
51
|
+
clients[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
|
|
56
52
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
57
53
|
storage: sharedStorage || storage,
|
|
58
54
|
syncManager: sharedSyncManager,
|
|
@@ -64,6 +60,6 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
64
60
|
else {
|
|
65
61
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
66
62
|
}
|
|
67
|
-
return
|
|
63
|
+
return clients[instanceId];
|
|
68
64
|
};
|
|
69
65
|
}
|
|
@@ -6,10 +6,7 @@ import { sdkClientFactory } from './sdkClient';
|
|
|
6
6
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
7
7
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING } 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
|
var method = 'Client instantiation';
|
|
14
11
|
/**
|
|
15
12
|
* Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
|
package/esm/sdkFactory/index.js
CHANGED
|
@@ -37,8 +37,9 @@ 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
|
-
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker });
|
|
42
|
+
var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage, telemetryTracker: telemetryTracker, clients: clients });
|
|
42
43
|
var observer = impressionsObserverFactory();
|
|
43
44
|
var uniqueKeysTracker = impressionsMode === NONE ? uniqueKeysTrackerFactory(log, storage.uniqueKeys, filterAdapterFactory && filterAdapterFactory()) : undefined;
|
|
44
45
|
var strategy;
|
|
@@ -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);
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IStorageSync, IStorageAsync } from '../storages/types';
|
|
2
2
|
import { IEventsHandler, IImpressionsHandler, ITelemetryTracker } from '../trackers/types';
|
|
3
3
|
import { ISettings, SplitIO } from '../types';
|
|
4
4
|
|
|
@@ -9,9 +9,10 @@ export interface IIntegration {
|
|
|
9
9
|
export type IIntegrationManager = IEventsHandler & IImpressionsHandler;
|
|
10
10
|
|
|
11
11
|
export interface IIntegrationFactoryParams {
|
|
12
|
-
storage:
|
|
12
|
+
storage: IStorageSync | IStorageAsync,
|
|
13
13
|
settings: ISettings
|
|
14
14
|
telemetryTracker: ITelemetryTracker
|
|
15
|
+
clients: Record<string, SplitIO.ICsClient>,
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export type IntegrationFactory = {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SplitIO } from '../types';
|
|
2
|
+
|
|
3
|
+
export function buildInstanceId(key: SplitIO.SplitKey, trafficType?: string) { // @ts-ignore
|
|
4
|
+
return `${key.matchingKey ? key.matchingKey : key}-${key.bucketingKey ? key.bucketingKey : key}-${trafficType ? trafficType : ''}`;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function parseInstanceId(instanceId: string): { key: SplitIO.SplitKey, trafficType?: string } {
|
|
8
|
+
const [matchingKey, bucketingKey, trafficType] = instanceId.split('-');
|
|
9
|
+
return matchingKey === bucketingKey ?
|
|
10
|
+
{ key: matchingKey, trafficType } :
|
|
11
|
+
{ key: { matchingKey, bucketingKey }, trafficType };
|
|
12
|
+
}
|
|
@@ -8,11 +8,7 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
8
8
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING } 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
|
const method = 'Client instantiation';
|
|
18
14
|
|
|
@@ -21,7 +17,7 @@ const method = 'Client instantiation';
|
|
|
21
17
|
* clients don't have a binded TT for the track method.
|
|
22
18
|
*/
|
|
23
19
|
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: SplitIO.SplitKey) => SplitIO.ICsClient {
|
|
24
|
-
const { storage, syncManager, sdkReadinessManager, settings: { core: { key }, startup: { readyTimeout }, log } } = params;
|
|
20
|
+
const { clients, storage, syncManager, sdkReadinessManager, settings: { core: { key }, startup: { readyTimeout }, log } } = params;
|
|
25
21
|
|
|
26
22
|
const mainClientInstance = clientCSDecorator(
|
|
27
23
|
log,
|
|
@@ -33,8 +29,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
33
29
|
const defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
34
30
|
|
|
35
31
|
// Cache instances created per factory.
|
|
36
|
-
|
|
37
|
-
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
32
|
+
clients[defaultInstanceId] = mainClientInstance;
|
|
38
33
|
|
|
39
34
|
return function client(key?: SplitIO.SplitKey) {
|
|
40
35
|
if (key === undefined) {
|
|
@@ -50,7 +45,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
50
45
|
|
|
51
46
|
const instanceId = buildInstanceId(validKey);
|
|
52
47
|
|
|
53
|
-
if (!
|
|
48
|
+
if (!clients[instanceId]) {
|
|
54
49
|
const matchingKey = getMatching(validKey);
|
|
55
50
|
|
|
56
51
|
const sharedSdkReadiness = sdkReadinessManager.shared(readyTimeout);
|
|
@@ -72,7 +67,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
72
67
|
|
|
73
68
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
74
69
|
// will use offline or online mode. We should stick with the original decision.
|
|
75
|
-
|
|
70
|
+
clients[instanceId] = clientCSDecorator(
|
|
76
71
|
log,
|
|
77
72
|
sdkClientFactory(objectAssign({}, params, {
|
|
78
73
|
sdkReadinessManager: sharedSdkReadiness,
|
|
@@ -90,6 +85,6 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
90
85
|
log.debug(RETRIEVE_CLIENT_EXISTING);
|
|
91
86
|
}
|
|
92
87
|
|
|
93
|
-
return
|
|
88
|
+
return clients[instanceId];
|
|
94
89
|
};
|
|
95
90
|
}
|
|
@@ -9,11 +9,7 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
9
9
|
import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING } 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
|
const method = 'Client instantiation';
|
|
19
15
|
|
package/src/sdkFactory/index.ts
CHANGED
|
@@ -48,9 +48,9 @@ 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, SplitIO.ICsClient> = {};
|
|
52
52
|
const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
|
|
53
|
-
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage, telemetryTracker });
|
|
53
|
+
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage, telemetryTracker, clients });
|
|
54
54
|
|
|
55
55
|
const observer = impressionsObserverFactory();
|
|
56
56
|
const uniqueKeysTracker = impressionsMode === NONE ? uniqueKeysTrackerFactory(log, storage.uniqueKeys!, filterAdapterFactory && filterAdapterFactory()) : undefined;
|
|
@@ -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;
|
package/src/sdkFactory/types.ts
CHANGED
|
@@ -35,15 +35,12 @@ export interface IPlatform {
|
|
|
35
35
|
now?: () => number
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
export interface ISdkFactoryContext {
|
|
38
|
+
export interface ISdkFactoryContext extends IIntegrationFactoryParams {
|
|
39
39
|
platform: IPlatform,
|
|
40
40
|
sdkReadinessManager: ISdkReadinessManager,
|
|
41
41
|
readiness: IReadinessManager,
|
|
42
|
-
settings: ISettings
|
|
43
42
|
impressionsTracker: IImpressionsTracker,
|
|
44
43
|
eventTracker: IEventTracker,
|
|
45
|
-
telemetryTracker: ITelemetryTracker,
|
|
46
|
-
storage: IStorageSync | IStorageAsync,
|
|
47
44
|
uniqueKeysTracker?: IUniqueKeysTracker,
|
|
48
45
|
signalListener?: ISignalListener
|
|
49
46
|
splitApi?: ISplitApi
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IStorageSync, IStorageAsync } from '../storages/types';
|
|
2
2
|
import { IEventsHandler, IImpressionsHandler, ITelemetryTracker } from '../trackers/types';
|
|
3
3
|
import { ISettings, SplitIO } from '../types';
|
|
4
4
|
export interface IIntegration {
|
|
@@ -6,11 +6,10 @@ export interface IIntegration {
|
|
|
6
6
|
}
|
|
7
7
|
export declare type IIntegrationManager = IEventsHandler & IImpressionsHandler;
|
|
8
8
|
export interface IIntegrationFactoryParams {
|
|
9
|
-
storage:
|
|
10
|
-
events: IEventsCacheBase;
|
|
11
|
-
};
|
|
9
|
+
storage: IStorageSync | IStorageAsync;
|
|
12
10
|
settings: ISettings;
|
|
13
11
|
telemetryTracker: ITelemetryTracker;
|
|
12
|
+
clients: Record<string, SplitIO.ICsClient>;
|
|
14
13
|
}
|
|
15
14
|
export declare type IntegrationFactory = {
|
|
16
15
|
readonly type: string;
|
|
@@ -33,15 +33,12 @@ export interface IPlatform {
|
|
|
33
33
|
*/
|
|
34
34
|
now?: () => number;
|
|
35
35
|
}
|
|
36
|
-
export interface ISdkFactoryContext {
|
|
36
|
+
export interface ISdkFactoryContext extends IIntegrationFactoryParams {
|
|
37
37
|
platform: IPlatform;
|
|
38
38
|
sdkReadinessManager: ISdkReadinessManager;
|
|
39
39
|
readiness: IReadinessManager;
|
|
40
|
-
settings: ISettings;
|
|
41
40
|
impressionsTracker: IImpressionsTracker;
|
|
42
41
|
eventTracker: IEventTracker;
|
|
43
|
-
telemetryTracker: ITelemetryTracker;
|
|
44
|
-
storage: IStorageSync | IStorageAsync;
|
|
45
42
|
uniqueKeysTracker?: IUniqueKeysTracker;
|
|
46
43
|
signalListener?: ISignalListener;
|
|
47
44
|
splitApi?: ISplitApi;
|