@splitsoftware/splitio-commons 1.17.1-rc.3 → 1.17.1-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 +4 -3
- package/cjs/readiness/readinessManager.js +13 -4
- package/cjs/sdkClient/sdkClientMethodCS.js +3 -7
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +3 -7
- package/cjs/sdkFactory/index.js +8 -13
- package/cjs/storages/{AbstractSegmentsCacheSync.js → AbstractMySegmentsCacheSync.js} +15 -17
- package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +7 -0
- package/cjs/storages/dataLoader.js +32 -64
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +5 -5
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
- package/cjs/storages/inLocalStorage/index.js +1 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -17
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +5 -5
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +13 -27
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -1
- package/cjs/storages/inRedis/RedisAdapter.js +1 -1
- package/cjs/storages/inRedis/SegmentsCacheInRedis.js +13 -19
- package/cjs/storages/pluggable/SegmentsCachePluggable.js +11 -32
- package/cjs/storages/pluggable/index.js +32 -37
- package/cjs/sync/offline/syncManagerOffline.js +18 -11
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
- package/cjs/sync/polling/pollingManagerSS.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +12 -28
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +10 -1
- package/cjs/sync/syncManagerOnline.js +20 -21
- package/cjs/trackers/eventTracker.js +1 -1
- package/cjs/trackers/impressionsTracker.js +1 -1
- package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
- package/esm/readiness/readinessManager.js +13 -4
- package/esm/sdkClient/sdkClientMethodCS.js +3 -7
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +3 -7
- package/esm/sdkFactory/index.js +9 -14
- package/esm/storages/{AbstractSegmentsCacheSync.js → AbstractMySegmentsCacheSync.js} +14 -16
- package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
- package/esm/storages/AbstractSplitsCacheSync.js +7 -0
- package/esm/storages/dataLoader.js +30 -61
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +5 -5
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
- package/esm/storages/inLocalStorage/index.js +2 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -17
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +5 -5
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +13 -27
- package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -1
- package/esm/storages/inRedis/RedisAdapter.js +1 -1
- package/esm/storages/inRedis/SegmentsCacheInRedis.js +13 -19
- package/esm/storages/pluggable/SegmentsCachePluggable.js +11 -32
- package/esm/storages/pluggable/index.js +32 -37
- package/esm/sync/offline/syncManagerOffline.js +18 -11
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
- package/esm/sync/polling/pollingManagerSS.js +3 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +12 -28
- package/esm/sync/polling/updaters/splitChangesUpdater.js +11 -2
- package/esm/sync/syncManagerOnline.js +20 -21
- package/esm/trackers/eventTracker.js +1 -1
- package/esm/trackers/impressionsTracker.js +1 -1
- package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
- package/package.json +1 -1
- package/src/readiness/readinessManager.ts +11 -4
- package/src/readiness/types.ts +2 -0
- package/src/sdkClient/sdkClientMethodCS.ts +1 -6
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +1 -6
- package/src/sdkFactory/index.ts +9 -15
- package/src/sdkFactory/types.ts +1 -2
- package/src/storages/{AbstractSegmentsCacheSync.ts → AbstractMySegmentsCacheSync.ts} +13 -28
- package/src/storages/AbstractSplitsCacheAsync.ts +8 -0
- package/src/storages/AbstractSplitsCacheSync.ts +8 -0
- package/src/storages/dataLoader.ts +32 -62
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +5 -5
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +10 -1
- package/src/storages/inLocalStorage/index.ts +2 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -20
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +5 -5
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +12 -26
- package/src/storages/inMemory/SplitsCacheInMemory.ts +0 -1
- package/src/storages/inRedis/RedisAdapter.ts +1 -1
- package/src/storages/inRedis/SegmentsCacheInRedis.ts +13 -22
- package/src/storages/pluggable/SegmentsCachePluggable.ts +11 -35
- package/src/storages/pluggable/index.ts +33 -38
- package/src/storages/types.ts +9 -11
- package/src/sync/offline/syncManagerOffline.ts +21 -13
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
- package/src/sync/polling/pollingManagerSS.ts +2 -3
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +13 -29
- package/src/sync/polling/updaters/splitChangesUpdater.ts +11 -3
- package/src/sync/syncManagerOnline.ts +17 -17
- package/src/sync/types.ts +1 -1
- package/src/trackers/eventTracker.ts +1 -1
- package/src/trackers/impressionsTracker.ts +1 -1
- package/src/types.ts +8 -9
- package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
- package/types/readiness/types.d.ts +2 -0
- package/types/sdkFactory/types.d.ts +1 -2
- package/types/storages/AbstractSplitsCacheAsync.d.ts +5 -0
- package/types/storages/AbstractSplitsCacheSync.d.ts +5 -0
- package/types/storages/dataLoader.d.ts +6 -17
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +5 -5
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +6 -0
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +5 -5
- package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +5 -7
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +0 -1
- package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +6 -3
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +4 -16
- package/types/storages/types.d.ts +7 -11
- package/types/sync/types.d.ts +1 -1
- package/types/types.d.ts +8 -8
- package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
|
@@ -1,35 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SegmentsCacheInMemory = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var AbstractSegmentsCacheSync_1 = require("../AbstractSegmentsCacheSync");
|
|
6
4
|
var sets_1 = require("../../utils/lang/sets");
|
|
7
5
|
var lang_1 = require("../../utils/lang");
|
|
8
6
|
/**
|
|
9
|
-
* Default ISplitsCacheSync implementation that stores
|
|
10
|
-
* Supported by all JS runtimes.
|
|
7
|
+
* Default ISplitsCacheSync implementation for server-side that stores segments definitions in memory.
|
|
11
8
|
*/
|
|
12
|
-
var SegmentsCacheInMemory = /** @class */ (function (
|
|
13
|
-
(0, tslib_1.__extends)(SegmentsCacheInMemory, _super);
|
|
9
|
+
var SegmentsCacheInMemory = /** @class */ (function () {
|
|
14
10
|
function SegmentsCacheInMemory() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
_this.segmentChangeNumber = {};
|
|
18
|
-
return _this;
|
|
11
|
+
this.segmentCache = {};
|
|
12
|
+
this.segmentChangeNumber = {};
|
|
19
13
|
}
|
|
20
|
-
SegmentsCacheInMemory.prototype.
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.segmentCache[name] = keySet;
|
|
25
|
-
return true;
|
|
26
|
-
};
|
|
27
|
-
SegmentsCacheInMemory.prototype.removeFromSegment = function (name, segmentKeys) {
|
|
28
|
-
var values = this.segmentCache[name];
|
|
29
|
-
var keySet = values ? values : new sets_1._Set();
|
|
30
|
-
segmentKeys.forEach(function (k) { return keySet.delete(k); });
|
|
14
|
+
SegmentsCacheInMemory.prototype.update = function (name, addedKeys, removedKeys, changeNumber) {
|
|
15
|
+
var keySet = this.segmentCache[name] || new sets_1._Set();
|
|
16
|
+
addedKeys.forEach(function (k) { return keySet.add(k); });
|
|
17
|
+
removedKeys.forEach(function (k) { return keySet.delete(k); });
|
|
31
18
|
this.segmentCache[name] = keySet;
|
|
32
|
-
|
|
19
|
+
this.segmentChangeNumber[name] = changeNumber;
|
|
20
|
+
return addedKeys.length > 0 || removedKeys.length > 0;
|
|
33
21
|
};
|
|
34
22
|
SegmentsCacheInMemory.prototype.isInSegment = function (name, key) {
|
|
35
23
|
var segmentValues = this.segmentCache[name];
|
|
@@ -63,14 +51,12 @@ var SegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
63
51
|
return acum + _this.segmentCache[segmentName].size;
|
|
64
52
|
}, 0);
|
|
65
53
|
};
|
|
66
|
-
SegmentsCacheInMemory.prototype.setChangeNumber = function (name, changeNumber) {
|
|
67
|
-
this.segmentChangeNumber[name] = changeNumber;
|
|
68
|
-
return true;
|
|
69
|
-
};
|
|
70
54
|
SegmentsCacheInMemory.prototype.getChangeNumber = function (name) {
|
|
71
55
|
var value = this.segmentChangeNumber[name];
|
|
72
56
|
return (0, lang_1.isIntegerNumber)(value) ? value : -1;
|
|
73
57
|
};
|
|
58
|
+
// No-op. Not used in server-side
|
|
59
|
+
SegmentsCacheInMemory.prototype.resetSegments = function () { return false; };
|
|
74
60
|
return SegmentsCacheInMemory;
|
|
75
|
-
}(
|
|
61
|
+
}());
|
|
76
62
|
exports.SegmentsCacheInMemory = SegmentsCacheInMemory;
|
|
@@ -7,7 +7,6 @@ var lang_1 = require("../../utils/lang");
|
|
|
7
7
|
var sets_1 = require("../../utils/lang/sets");
|
|
8
8
|
/**
|
|
9
9
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
10
|
-
* Supported by all JS runtimes.
|
|
11
10
|
*/
|
|
12
11
|
var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
13
12
|
(0, tslib_1.__extends)(SplitsCacheInMemory, _super);
|
|
@@ -20,7 +20,7 @@ var DEFAULT_OPTIONS = {
|
|
|
20
20
|
var DEFAULT_LIBRARY_OPTIONS = {
|
|
21
21
|
enableOfflineQueue: false,
|
|
22
22
|
connectTimeout: DEFAULT_OPTIONS.connectionTimeout,
|
|
23
|
-
lazyConnect: false
|
|
23
|
+
lazyConnect: false
|
|
24
24
|
};
|
|
25
25
|
/**
|
|
26
26
|
* Redis adapter on top of the library of choice (written with ioredis) for some extra control.
|
|
@@ -9,30 +9,24 @@ var SegmentsCacheInRedis = /** @class */ (function () {
|
|
|
9
9
|
this.redis = redis;
|
|
10
10
|
this.keys = keys;
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Update the given segment `name` with the lists of `addedKeys`, `removedKeys` and `changeNumber`.
|
|
14
|
+
* The returned promise is resolved if the operation success, with `true` if the segment was updated (i.e., some key was added or removed),
|
|
15
|
+
* or rejected if it fails (e.g., Redis operation fails).
|
|
16
|
+
*/
|
|
17
|
+
SegmentsCacheInRedis.prototype.update = function (name, addedKeys, removedKeys, changeNumber) {
|
|
13
18
|
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
SegmentsCacheInRedis.prototype.removeFromSegment = function (name, segmentKeys) {
|
|
22
|
-
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
23
|
-
if (segmentKeys.length) {
|
|
24
|
-
return this.redis.srem(segmentKey, segmentKeys).then(function () { return true; });
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
return Promise.resolve(true);
|
|
28
|
-
}
|
|
19
|
+
return Promise.all([
|
|
20
|
+
addedKeys.length && this.redis.sadd(segmentKey, addedKeys),
|
|
21
|
+
removedKeys.length && this.redis.srem(segmentKey, removedKeys),
|
|
22
|
+
this.redis.set(this.keys.buildSegmentTillKey(name), changeNumber + '')
|
|
23
|
+
]).then(function () {
|
|
24
|
+
return addedKeys.length > 0 || removedKeys.length > 0;
|
|
25
|
+
});
|
|
29
26
|
};
|
|
30
27
|
SegmentsCacheInRedis.prototype.isInSegment = function (name, key) {
|
|
31
28
|
return this.redis.sismember(this.keys.buildSegmentNameKey(name), key).then(function (matches) { return matches !== 0; });
|
|
32
29
|
};
|
|
33
|
-
SegmentsCacheInRedis.prototype.setChangeNumber = function (name, changeNumber) {
|
|
34
|
-
return this.redis.set(this.keys.buildSegmentTillKey(name), changeNumber + '').then(function (status) { return status === 'OK'; });
|
|
35
|
-
};
|
|
36
30
|
SegmentsCacheInRedis.prototype.getChangeNumber = function (name) {
|
|
37
31
|
var _this = this;
|
|
38
32
|
return this.redis.get(this.keys.buildSegmentTillKey(name)).then(function (value) {
|
|
@@ -15,32 +15,19 @@ var SegmentsCachePluggable = /** @class */ (function () {
|
|
|
15
15
|
this.wrapper = wrapper;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
* The returned promise is resolved
|
|
20
|
-
* or rejected if wrapper operation fails.
|
|
21
|
-
*/
|
|
22
|
-
SegmentsCachePluggable.prototype.addToSegment = function (name, segmentKeys) {
|
|
23
|
-
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
24
|
-
if (segmentKeys.length) {
|
|
25
|
-
return this.wrapper.addItems(segmentKey, segmentKeys);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
return Promise.resolve();
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Remove a list of `segmentKeys` from the given segment `name`.
|
|
33
|
-
* The returned promise is resolved when the operation success
|
|
34
|
-
* or rejected if wrapper operation fails.
|
|
18
|
+
* Update the given segment `name` with the lists of `addedKeys`, `removedKeys` and `changeNumber`.
|
|
19
|
+
* The returned promise is resolved if the operation success, with `true` if the segment was updated (i.e., some key was added or removed),
|
|
20
|
+
* or rejected if it fails (e.g., wrapper operation fails).
|
|
35
21
|
*/
|
|
36
|
-
SegmentsCachePluggable.prototype.
|
|
22
|
+
SegmentsCachePluggable.prototype.update = function (name, addedKeys, removedKeys, changeNumber) {
|
|
37
23
|
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
24
|
+
return Promise.all([
|
|
25
|
+
addedKeys.length && this.wrapper.addItems(segmentKey, addedKeys),
|
|
26
|
+
removedKeys.length && this.wrapper.removeItems(segmentKey, removedKeys),
|
|
27
|
+
this.wrapper.set(this.keys.buildSegmentTillKey(name), changeNumber + '')
|
|
28
|
+
]).then(function () {
|
|
29
|
+
return addedKeys.length > 0 || removedKeys.length > 0;
|
|
30
|
+
});
|
|
44
31
|
};
|
|
45
32
|
/**
|
|
46
33
|
* Returns a promise that resolves with a boolean value indicating if `key` is part of `name` segment.
|
|
@@ -49,14 +36,6 @@ var SegmentsCachePluggable = /** @class */ (function () {
|
|
|
49
36
|
SegmentsCachePluggable.prototype.isInSegment = function (name, key) {
|
|
50
37
|
return this.wrapper.itemContains(this.keys.buildSegmentNameKey(name), key);
|
|
51
38
|
};
|
|
52
|
-
/**
|
|
53
|
-
* Set till number for the given segment `name`.
|
|
54
|
-
* The returned promise is resolved when the operation success,
|
|
55
|
-
* or rejected if it fails (e.g., wrapper operation fails).
|
|
56
|
-
*/
|
|
57
|
-
SegmentsCachePluggable.prototype.setChangeNumber = function (name, changeNumber) {
|
|
58
|
-
return this.wrapper.set(this.keys.buildSegmentTillKey(name), changeNumber + '');
|
|
59
|
-
};
|
|
60
39
|
/**
|
|
61
40
|
* Get till number or -1 if it's not defined.
|
|
62
41
|
* The returned promise is resolved with the changeNumber or -1 if it doesn't exist or a wrapper operation fails.
|
|
@@ -58,7 +58,6 @@ function PluggableStorage(options) {
|
|
|
58
58
|
var metadata = (0, utils_1.metadataBuilder)(settings);
|
|
59
59
|
var keys = new KeyBuilderSS_1.KeyBuilderSS(prefix, metadata);
|
|
60
60
|
var wrapper = (0, wrapperAdapter_1.wrapperAdapter)(log, options.wrapper);
|
|
61
|
-
var connectPromise;
|
|
62
61
|
var isSyncronizer = mode === undefined; // If mode is not defined, the synchronizer is running
|
|
63
62
|
var isPartialConsumer = mode === constants_1.CONSUMER_PARTIAL_MODE;
|
|
64
63
|
var telemetry = (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)(params) || isSyncronizer ?
|
|
@@ -76,6 +75,37 @@ function PluggableStorage(options) {
|
|
|
76
75
|
settings.core.key === undefined ? new UniqueKeysCacheInMemory_1.UniqueKeysCacheInMemory() : new UniqueKeysCacheInMemoryCS_1.UniqueKeysCacheInMemoryCS() :
|
|
77
76
|
new UniqueKeysCachePluggable_1.UniqueKeysCachePluggable(log, keys.buildUniqueKeysKey(), wrapper) :
|
|
78
77
|
undefined;
|
|
78
|
+
// Connects to wrapper and emits SDK_READY event on main client
|
|
79
|
+
var connectPromise = wrapper.connect().then(function () {
|
|
80
|
+
if (isSyncronizer) {
|
|
81
|
+
// In standalone or producer mode, clear storage if SDK key or feature flag filter has changed
|
|
82
|
+
return wrapper.get(keys.buildHashKey()).then(function (hash) {
|
|
83
|
+
var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
84
|
+
if (hash !== currentHash) {
|
|
85
|
+
log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
|
|
86
|
+
return wrapper.getKeysByPrefix(keys.prefix + ".").then(function (storageKeys) {
|
|
87
|
+
return Promise.all(storageKeys.map(function (storageKey) { return wrapper.del(storageKey); }));
|
|
88
|
+
}).then(function () { return wrapper.set(keys.buildHashKey(), currentHash); });
|
|
89
|
+
}
|
|
90
|
+
}).then(function () {
|
|
91
|
+
onReadyCb();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Start periodic flush of async storages if not running synchronizer (producer mode)
|
|
96
|
+
if (impressionCountsCache && impressionCountsCache.start)
|
|
97
|
+
impressionCountsCache.start();
|
|
98
|
+
if (uniqueKeysCache && uniqueKeysCache.start)
|
|
99
|
+
uniqueKeysCache.start();
|
|
100
|
+
if (telemetry && telemetry.recordConfig)
|
|
101
|
+
telemetry.recordConfig();
|
|
102
|
+
onReadyCb();
|
|
103
|
+
}
|
|
104
|
+
}).catch(function (e) {
|
|
105
|
+
e = e || new Error('Error connecting wrapper');
|
|
106
|
+
onReadyCb(e);
|
|
107
|
+
return e; // Propagate error for shared clients
|
|
108
|
+
});
|
|
79
109
|
return {
|
|
80
110
|
splits: new SplitsCachePluggable_1.SplitsCachePluggable(log, keys, wrapper, settings.sync.__splitFiltersValidation),
|
|
81
111
|
segments: new SegmentsCachePluggable_1.SegmentsCachePluggable(log, keys, wrapper),
|
|
@@ -84,41 +114,6 @@ function PluggableStorage(options) {
|
|
|
84
114
|
events: isPartialConsumer ? promisifyEventsTrack(new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize)) : new EventsCachePluggable_1.EventsCachePluggable(log, keys.buildEventsKey(), wrapper, metadata),
|
|
85
115
|
telemetry: telemetry,
|
|
86
116
|
uniqueKeys: uniqueKeysCache,
|
|
87
|
-
init: function () {
|
|
88
|
-
if (connectPromise)
|
|
89
|
-
return connectPromise;
|
|
90
|
-
// Connects to wrapper and emits SDK_READY event on main client
|
|
91
|
-
return connectPromise = wrapper.connect().then(function () {
|
|
92
|
-
if (isSyncronizer) {
|
|
93
|
-
// In standalone or producer mode, clear storage if SDK key or feature flag filter has changed
|
|
94
|
-
return wrapper.get(keys.buildHashKey()).then(function (hash) {
|
|
95
|
-
var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
96
|
-
if (hash !== currentHash) {
|
|
97
|
-
log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
|
|
98
|
-
return wrapper.getKeysByPrefix(keys.prefix + ".").then(function (storageKeys) {
|
|
99
|
-
return Promise.all(storageKeys.map(function (storageKey) { return wrapper.del(storageKey); }));
|
|
100
|
-
}).then(function () { return wrapper.set(keys.buildHashKey(), currentHash); });
|
|
101
|
-
}
|
|
102
|
-
}).then(function () {
|
|
103
|
-
onReadyCb();
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// Start periodic flush of async storages if not running synchronizer (producer mode)
|
|
108
|
-
if (impressionCountsCache && impressionCountsCache.start)
|
|
109
|
-
impressionCountsCache.start();
|
|
110
|
-
if (uniqueKeysCache && uniqueKeysCache.start)
|
|
111
|
-
uniqueKeysCache.start();
|
|
112
|
-
if (telemetry && telemetry.recordConfig)
|
|
113
|
-
telemetry.recordConfig();
|
|
114
|
-
onReadyCb();
|
|
115
|
-
}
|
|
116
|
-
}).catch(function (e) {
|
|
117
|
-
e = e || new Error('Error connecting wrapper');
|
|
118
|
-
onReadyCb(e);
|
|
119
|
-
return e; // Propagate error for shared clients
|
|
120
|
-
});
|
|
121
|
-
},
|
|
122
117
|
// Stop periodic flush and disconnect the underlying storage
|
|
123
118
|
destroy: function () {
|
|
124
119
|
return Promise.all(isSyncronizer ? [] : [
|
|
@@ -128,7 +123,7 @@ function PluggableStorage(options) {
|
|
|
128
123
|
},
|
|
129
124
|
// emits SDK_READY event on shared clients and returns a reference to the storage
|
|
130
125
|
shared: function (_, onReadyCb) {
|
|
131
|
-
|
|
126
|
+
connectPromise.then(onReadyCb);
|
|
132
127
|
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this), {
|
|
133
128
|
// no-op destroy, to disconnect the wrapper only when the main client is destroyed
|
|
134
129
|
destroy: function () { } });
|
|
@@ -19,23 +19,30 @@ function syncManagerOfflineFactory(splitsParserFactory) {
|
|
|
19
19
|
*/
|
|
20
20
|
return function (_a) {
|
|
21
21
|
var settings = _a.settings, readiness = _a.readiness, storage = _a.storage;
|
|
22
|
-
|
|
22
|
+
var mainSyncManager = (0, fromObjectSyncTask_1.fromObjectSyncTaskFactory)(splitsParserFactory(), storage, readiness, settings);
|
|
23
|
+
var mainStart = mainSyncManager.start;
|
|
24
|
+
var sharedStarts = [];
|
|
25
|
+
return (0, objectAssign_1.objectAssign)(mainSyncManager, {
|
|
26
|
+
start: function () {
|
|
27
|
+
mainStart();
|
|
28
|
+
sharedStarts.forEach(function (cb) { return cb(); });
|
|
29
|
+
sharedStarts.length = 0;
|
|
30
|
+
},
|
|
23
31
|
// fake flush, that resolves immediately
|
|
24
32
|
flush: flush,
|
|
25
33
|
// [Only used for client-side]
|
|
26
34
|
shared: function (matchingKey, readinessManager) {
|
|
35
|
+
// In LOCALHOST mode, shared clients are ready in the next event-loop cycle than created
|
|
36
|
+
// SDK_READY cannot be emitted directly because this will not update the readiness status
|
|
37
|
+
function emitSdkReady() {
|
|
38
|
+
readinessManager.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); // SDK_SPLITS_ARRIVED emitted by main SyncManager
|
|
39
|
+
}
|
|
40
|
+
if (mainSyncManager.isRunning())
|
|
41
|
+
setTimeout(emitSdkReady);
|
|
42
|
+
else
|
|
43
|
+
sharedStarts.push(emitSdkReady);
|
|
27
44
|
return {
|
|
28
|
-
start: function () {
|
|
29
|
-
// In LOCALHOST mode, shared clients are ready in the next event-loop cycle than created
|
|
30
|
-
// SDK_READY cannot be emitted directly because this will not update the readiness status
|
|
31
|
-
setTimeout(function () {
|
|
32
|
-
readinessManager.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); // SDK_SPLITS_ARRIVED emitted by main SyncManager
|
|
33
|
-
}, 0);
|
|
34
|
-
},
|
|
35
45
|
stop: function () { },
|
|
36
|
-
isRunning: function () {
|
|
37
|
-
return true;
|
|
38
|
-
},
|
|
39
46
|
flush: flush,
|
|
40
47
|
};
|
|
41
48
|
}
|
|
@@ -46,8 +46,13 @@ function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
|
46
46
|
readiness.splits.emit(constants_2.SDK_SPLITS_ARRIVED);
|
|
47
47
|
if (startingUp) {
|
|
48
48
|
startingUp = false;
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
Promise.resolve(splitsCache.checkCache()).then(function (cacheReady) {
|
|
50
|
+
// Emits SDK_READY_FROM_CACHE
|
|
51
|
+
if (cacheReady)
|
|
52
|
+
readiness.splits.emit(constants_2.SDK_SPLITS_CACHE_LOADED);
|
|
53
|
+
// Emits SDK_READY
|
|
54
|
+
readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED);
|
|
55
|
+
});
|
|
51
56
|
}
|
|
52
57
|
return true;
|
|
53
58
|
});
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.pollingManagerSSFactory = void 0;
|
|
4
4
|
var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
5
5
|
var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
|
|
6
|
-
var thenable_1 = require("../../utils/promise/thenable");
|
|
7
6
|
var constants_1 = require("../../logger/constants");
|
|
8
7
|
/**
|
|
9
8
|
* Expose start / stop mechanism for pulling data from services.
|
|
@@ -22,9 +21,10 @@ function pollingManagerSSFactory(params) {
|
|
|
22
21
|
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("Splits will be refreshed each " + settings.scheduler.featuresRefreshRate + " millis"));
|
|
23
22
|
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("Segments will be refreshed each " + settings.scheduler.segmentsRefreshRate + " millis"));
|
|
24
23
|
var startingUp = splitsSyncTask.start();
|
|
25
|
-
if (
|
|
24
|
+
if (startingUp) {
|
|
26
25
|
startingUp.then(function () {
|
|
27
|
-
|
|
26
|
+
if (splitsSyncTask.isRunning())
|
|
27
|
+
segmentsSyncTask.start();
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
},
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.segmentChangesUpdaterFactory = void 0;
|
|
4
|
-
var lang_1 = require("../../../utils/lang");
|
|
5
4
|
var constants_1 = require("../../../readiness/constants");
|
|
6
5
|
var constants_2 = require("../../../logger/constants");
|
|
7
|
-
var thenable_1 = require("../../../utils/promise/thenable");
|
|
8
6
|
/**
|
|
9
7
|
* Factory of SegmentChanges updater, a task that:
|
|
10
8
|
* - fetches segment changes using `segmentChangesFetcher`
|
|
@@ -23,27 +21,16 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
23
21
|
var sincePromise = Promise.resolve(segments.getChangeNumber(segmentName));
|
|
24
22
|
return sincePromise.then(function (since) {
|
|
25
23
|
// if fetchOnlyNew flag, avoid processing already fetched segments
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
results.push(segments.removeFromSegment(segmentName, x.removed));
|
|
36
|
-
if (x.added.length > 0 || x.removed.length > 0) {
|
|
37
|
-
results.push(segments.setChangeNumber(segmentName, x.till));
|
|
38
|
-
changeNumber = x.till;
|
|
39
|
-
}
|
|
40
|
-
log.debug(constants_2.LOG_PREFIX_SYNC_SEGMENTS + "Processed " + segmentName + " with till = " + x.till + ". Added: " + x.added.length + ". Removed: " + x.removed.length);
|
|
24
|
+
return fetchOnlyNew && since !== -1 ?
|
|
25
|
+
false :
|
|
26
|
+
segmentChangesFetcher(since, segmentName, noCache, till).then(function (changes) {
|
|
27
|
+
return Promise.all(changes.map(function (x) {
|
|
28
|
+
log.debug(constants_2.LOG_PREFIX_SYNC_SEGMENTS + "Processing " + segmentName + " with till = " + x.till + ". Added: " + x.added.length + ". Removed: " + x.removed.length);
|
|
29
|
+
return segments.update(x.name, x.added, x.removed, x.till);
|
|
30
|
+
})).then(function (updates) {
|
|
31
|
+
return updates.some(function (update) { return update; });
|
|
32
|
+
});
|
|
41
33
|
});
|
|
42
|
-
// If at least one storage operation result is a promise, join all in a single promise.
|
|
43
|
-
if (results.some(function (result) { return (0, thenable_1.thenable)(result); }))
|
|
44
|
-
return Promise.all(results).then(function () { return changeNumber; });
|
|
45
|
-
return changeNumber;
|
|
46
|
-
});
|
|
47
34
|
});
|
|
48
35
|
}
|
|
49
36
|
/**
|
|
@@ -62,14 +49,11 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
62
49
|
// If not a segment name provided, read list of available segments names to be updated.
|
|
63
50
|
var segmentsPromise = Promise.resolve(segmentName ? [segmentName] : segments.getRegisteredSegments());
|
|
64
51
|
return segmentsPromise.then(function (segmentNames) {
|
|
65
|
-
// Async fetchers
|
|
66
|
-
var updaters =
|
|
67
|
-
for (var index = 0; index < segmentNames.length; index++) {
|
|
68
|
-
updaters.push(updateSegment(segmentNames[index], noCache, till, fetchOnlyNew));
|
|
69
|
-
}
|
|
52
|
+
// Async fetchers
|
|
53
|
+
var updaters = segmentNames.map(function (segmentName) { return updateSegment(segmentName, noCache, till, fetchOnlyNew); });
|
|
70
54
|
return Promise.all(updaters).then(function (shouldUpdateFlags) {
|
|
71
55
|
// if at least one segment fetch succeeded, mark segments ready
|
|
72
|
-
if (
|
|
56
|
+
if (shouldUpdateFlags.some(function (update) { return update; }) || readyOnAlreadyExistentState) {
|
|
73
57
|
readyOnAlreadyExistentState = false;
|
|
74
58
|
if (readiness)
|
|
75
59
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
@@ -126,7 +126,7 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
126
126
|
function _splitChangesUpdater(since, retry) {
|
|
127
127
|
if (retry === void 0) { retry = 0; }
|
|
128
128
|
log.debug(constants_2.SYNC_SPLITS_FETCH, [since]);
|
|
129
|
-
|
|
129
|
+
var fetcherPromise = Promise.resolve(splitUpdateNotification ?
|
|
130
130
|
{ splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
|
|
131
131
|
splitChangesFetcher(since, noCache, till, _promiseDecorator))
|
|
132
132
|
.then(function (splitChanges) {
|
|
@@ -170,6 +170,15 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
170
170
|
}
|
|
171
171
|
return false;
|
|
172
172
|
});
|
|
173
|
+
// After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
|
|
174
|
+
// Wrapping in a promise since checkCache can be async.
|
|
175
|
+
if (splitsEventEmitter && startingUp) {
|
|
176
|
+
Promise.resolve(splits.checkCache()).then(function (isCacheReady) {
|
|
177
|
+
if (isCacheReady)
|
|
178
|
+
splitsEventEmitter.emit(constants_1.SDK_SPLITS_CACHE_LOADED);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return fetcherPromise;
|
|
173
182
|
}
|
|
174
183
|
var sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error
|
|
175
184
|
return sincePromise.then(_splitChangesUpdater);
|
|
@@ -118,33 +118,32 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
118
118
|
if (!pollingManager)
|
|
119
119
|
return;
|
|
120
120
|
var mySegmentsSyncTask = pollingManager.add(matchingKey, readinessManager, storage);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (pollingManager.isRunning()) {
|
|
127
|
-
// if doing polling, we must start the periodic fetch of data
|
|
128
|
-
if (storage.splits.usesSegments())
|
|
129
|
-
mySegmentsSyncTask.start();
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
// if not polling, we must execute the sync task for the initial fetch
|
|
133
|
-
// of segments since `syncAll` was already executed when starting the main client
|
|
134
|
-
mySegmentsSyncTask.execute();
|
|
135
|
-
}
|
|
136
|
-
pushManager.add(matchingKey, mySegmentsSyncTask);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
121
|
+
if (running) {
|
|
122
|
+
if (syncEnabled) {
|
|
123
|
+
if (pushManager) {
|
|
124
|
+
if (pollingManager.isRunning()) {
|
|
125
|
+
// if doing polling, we must start the periodic fetch of data
|
|
139
126
|
if (storage.splits.usesSegments())
|
|
140
127
|
mySegmentsSyncTask.start();
|
|
141
128
|
}
|
|
129
|
+
else {
|
|
130
|
+
// if not polling, we must execute the sync task for the initial fetch
|
|
131
|
+
// of segments since `syncAll` was already executed when starting the main client
|
|
132
|
+
mySegmentsSyncTask.execute();
|
|
133
|
+
}
|
|
134
|
+
pushManager.add(matchingKey, mySegmentsSyncTask);
|
|
142
135
|
}
|
|
143
136
|
else {
|
|
144
|
-
if (
|
|
145
|
-
mySegmentsSyncTask.
|
|
137
|
+
if (storage.splits.usesSegments())
|
|
138
|
+
mySegmentsSyncTask.start();
|
|
146
139
|
}
|
|
147
|
-
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (!readinessManager.isReady())
|
|
143
|
+
mySegmentsSyncTask.execute();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
148
147
|
stop: function () {
|
|
149
148
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
150
149
|
var mySegmentsSyncTask = pollingManager.get(matchingKey);
|
|
@@ -22,8 +22,8 @@ function eventTrackerFactory(settings, eventsCache, whenInit, integrationsManage
|
|
|
22
22
|
if (tracked) {
|
|
23
23
|
log.info(constants_1.EVENTS_TRACKER_SUCCESS, [msg]);
|
|
24
24
|
if (integrationsManager) {
|
|
25
|
-
// Wrap in a timeout because we don't want it to be blocking.
|
|
26
25
|
whenInit(function () {
|
|
26
|
+
// Wrap in a timeout because we don't want it to be blocking.
|
|
27
27
|
setTimeout(function () {
|
|
28
28
|
// copy of event, to avoid unexpected behaviour if modified by integrations
|
|
29
29
|
var eventDataCopy = (0, objectAssign_1.objectAssign)({}, eventData);
|
|
@@ -53,8 +53,8 @@ function impressionsTrackerFactory(settings, impressionsCache, strategy, whenIni
|
|
|
53
53
|
hostname: hostname,
|
|
54
54
|
sdkLanguageVersion: version
|
|
55
55
|
};
|
|
56
|
-
// Wrap in a timeout because we don't want it to be blocking.
|
|
57
56
|
whenInit(function () {
|
|
57
|
+
// Wrap in a timeout because we don't want it to be blocking.
|
|
58
58
|
setTimeout(function () {
|
|
59
59
|
// integrationsManager.handleImpression does not throw errors
|
|
60
60
|
if (integrationsManager)
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateStorageCS = void 0;
|
|
3
|
+
exports.validateStorageCS = exports.__InLocalStorageMockFactory = void 0;
|
|
4
4
|
var InMemoryStorageCS_1 = require("../../../storages/inMemory/InMemoryStorageCS");
|
|
5
5
|
var constants_1 = require("../../../logger/constants");
|
|
6
6
|
var constants_2 = require("../../../utils/constants");
|
|
7
|
+
function __InLocalStorageMockFactory(params) {
|
|
8
|
+
var result = (0, InMemoryStorageCS_1.InMemoryStorageCSFactory)(params);
|
|
9
|
+
result.splits.checkCache = function () { return true; }; // to emit SDK_READY_FROM_CACHE
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
exports.__InLocalStorageMockFactory = __InLocalStorageMockFactory;
|
|
13
|
+
__InLocalStorageMockFactory.type = constants_2.STORAGE_MEMORY;
|
|
7
14
|
/**
|
|
8
15
|
* This function validates `settings.storage` object
|
|
9
16
|
*
|
|
@@ -20,6 +27,10 @@ function validateStorageCS(settings) {
|
|
|
20
27
|
storage = InMemoryStorageCS_1.InMemoryStorageCSFactory;
|
|
21
28
|
log.error(constants_1.ERROR_STORAGE_INVALID);
|
|
22
29
|
}
|
|
30
|
+
// In localhost mode with InLocalStorage, fallback to a mock InLocalStorage to emit SDK_READY_FROM_CACHE
|
|
31
|
+
if (mode === constants_2.LOCALHOST_MODE && storage.type === constants_2.STORAGE_LOCALSTORAGE) {
|
|
32
|
+
return __InLocalStorageMockFactory;
|
|
33
|
+
}
|
|
23
34
|
if ([constants_2.LOCALHOST_MODE, constants_2.STANDALONE_MODE].indexOf(mode) === -1) {
|
|
24
35
|
// Consumer modes require an async storage
|
|
25
36
|
if (storage.type !== constants_2.STORAGE_PLUGGABLE)
|
|
@@ -4,6 +4,8 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
4
4
|
var splitsEventEmitter = objectAssign(new EventEmitter(), {
|
|
5
5
|
splitsArrived: false,
|
|
6
6
|
splitsCacheLoaded: false,
|
|
7
|
+
initialized: false,
|
|
8
|
+
initCallbacks: []
|
|
7
9
|
});
|
|
8
10
|
// `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
|
|
9
11
|
// - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
|
|
@@ -42,7 +44,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
42
44
|
splits.once(SDK_SPLITS_CACHE_LOADED, checkIsReadyFromCache);
|
|
43
45
|
// emit SDK_READY_TIMED_OUT
|
|
44
46
|
var hasTimedout = false;
|
|
45
|
-
var readyTimeoutId;
|
|
46
47
|
function timeout() {
|
|
47
48
|
if (hasTimedout || isReady)
|
|
48
49
|
return;
|
|
@@ -50,6 +51,13 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
50
51
|
syncLastUpdate();
|
|
51
52
|
gate.emit(SDK_READY_TIMED_OUT, 'Split SDK emitted SDK_READY_TIMED_OUT event.');
|
|
52
53
|
}
|
|
54
|
+
var readyTimeoutId;
|
|
55
|
+
if (readyTimeout > 0) {
|
|
56
|
+
if (splits.initialized)
|
|
57
|
+
readyTimeoutId = setTimeout(timeout, readyTimeout);
|
|
58
|
+
else
|
|
59
|
+
splits.initCallbacks.push(function () { readyTimeoutId = setTimeout(timeout, readyTimeout); });
|
|
60
|
+
}
|
|
53
61
|
// emit SDK_READY and SDK_UPDATE
|
|
54
62
|
var isReady = false;
|
|
55
63
|
splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
@@ -111,9 +119,10 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
111
119
|
// tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
|
|
112
120
|
setDestroyed: function () { isDestroyed = true; },
|
|
113
121
|
init: function () {
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
|
|
122
|
+
if (splits.initialized)
|
|
123
|
+
return;
|
|
124
|
+
splits.initialized = true;
|
|
125
|
+
splits.initCallbacks.forEach(function (cb) { return cb(); });
|
|
117
126
|
},
|
|
118
127
|
destroy: function () {
|
|
119
128
|
isDestroyed = true;
|
|
@@ -11,7 +11,7 @@ import { buildInstanceId } from './identity';
|
|
|
11
11
|
* Therefore, clients don't have a bound TT for the track method.
|
|
12
12
|
*/
|
|
13
13
|
export function sdkClientMethodCSFactory(params) {
|
|
14
|
-
var clients = params.clients, 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;
|
|
15
15
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
16
16
|
var parsedDefaultKey = keyParser(key);
|
|
17
17
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
@@ -44,18 +44,14 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
44
44
|
// - Consumer mode: both syncManager and sharedSyncManager are undefined
|
|
45
45
|
// - Consumer partial mode: syncManager is defined (only for submitters) but sharedSyncManager is undefined
|
|
46
46
|
// @ts-ignore
|
|
47
|
-
var
|
|
47
|
+
var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage);
|
|
48
48
|
// As shared clients reuse all the storage information, we don't need to check here if we
|
|
49
49
|
// will use offline or online mode. We should stick with the original decision.
|
|
50
50
|
clients[instanceId] = clientCSDecorator(log, sdkClientFactory(objectAssign({}, params, {
|
|
51
51
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
52
52
|
storage: sharedStorage || storage,
|
|
53
|
-
syncManager:
|
|
53
|
+
syncManager: sharedSyncManager,
|
|
54
54
|
}), true), validKey);
|
|
55
|
-
whenInit(function () {
|
|
56
|
-
sharedSdkReadiness_1.readinessManager.init();
|
|
57
|
-
sharedSyncManager_1 && sharedSyncManager_1.start();
|
|
58
|
-
});
|
|
59
55
|
log.info(NEW_SHARED_CLIENT);
|
|
60
56
|
}
|
|
61
57
|
else {
|