@splitsoftware/splitio-commons 1.6.2-rc.7 → 1.6.2-rc.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.txt +2 -1
- package/cjs/consent/sdkUserConsent.js +2 -2
- package/cjs/evaluator/index.js +5 -5
- package/cjs/listeners/browser.js +1 -2
- package/cjs/logger/constants.js +1 -2
- package/cjs/sdkClient/client.js +19 -7
- package/cjs/sdkClient/sdkClient.js +1 -3
- package/cjs/sdkFactory/index.js +5 -26
- package/cjs/services/splitApi.js +4 -24
- package/cjs/storages/KeyBuilderSS.js +48 -15
- package/cjs/storages/inLocalStorage/index.js +1 -5
- package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -12
- package/cjs/storages/inMemory/InMemoryStorage.js +2 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +2 -6
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +9 -6
- package/cjs/storages/inRedis/EventsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/TelemetryCacheInRedis.js +100 -0
- package/cjs/storages/inRedis/constants.js +1 -4
- package/cjs/storages/inRedis/index.js +1 -15
- package/cjs/storages/pluggable/TelemetryCachePluggable.js +126 -0
- package/cjs/storages/pluggable/index.js +19 -15
- package/cjs/sync/submitters/submitterManager.js +0 -3
- package/cjs/sync/submitters/telemetrySubmitter.js +7 -5
- package/cjs/trackers/impressionsTracker.js +41 -22
- package/cjs/utils/constants/index.js +2 -4
- package/cjs/utils/lang/maps.js +15 -7
- package/cjs/utils/settingsValidation/impressionsMode.js +2 -2
- package/cjs/utils/settingsValidation/index.js +0 -4
- package/esm/consent/sdkUserConsent.js +2 -2
- package/esm/evaluator/index.js +5 -5
- package/esm/listeners/browser.js +2 -3
- package/esm/logger/constants.js +0 -1
- package/esm/sdkClient/client.js +19 -7
- package/esm/sdkClient/sdkClient.js +1 -3
- package/esm/sdkFactory/index.js +5 -26
- package/esm/services/splitApi.js +4 -24
- package/esm/storages/KeyBuilderSS.js +44 -14
- package/esm/storages/inLocalStorage/index.js +2 -6
- package/esm/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -12
- package/esm/storages/inMemory/InMemoryStorage.js +4 -8
- package/esm/storages/inMemory/InMemoryStorageCS.js +3 -7
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +8 -6
- package/esm/storages/inRedis/EventsCacheInRedis.js +1 -1
- package/esm/storages/inRedis/TelemetryCacheInRedis.js +100 -0
- package/esm/storages/inRedis/constants.js +0 -3
- package/esm/storages/inRedis/index.js +2 -16
- package/esm/storages/pluggable/TelemetryCachePluggable.js +126 -0
- package/esm/storages/pluggable/index.js +19 -15
- package/esm/sync/submitters/submitterManager.js +0 -3
- package/esm/sync/submitters/telemetrySubmitter.js +8 -6
- package/esm/trackers/impressionsTracker.js +41 -22
- package/esm/utils/constants/index.js +0 -2
- package/esm/utils/lang/maps.js +15 -7
- package/esm/utils/settingsValidation/impressionsMode.js +3 -3
- package/esm/utils/settingsValidation/index.js +0 -4
- package/package.json +2 -1
- package/src/consent/sdkUserConsent.ts +2 -2
- package/src/evaluator/index.ts +6 -6
- package/src/listeners/browser.ts +2 -3
- package/src/logger/.DS_Store +0 -0
- package/src/logger/constants.ts +0 -1
- package/src/sdkClient/client.ts +21 -8
- package/src/sdkClient/sdkClient.ts +1 -3
- package/src/sdkFactory/index.ts +5 -29
- package/src/sdkFactory/types.ts +4 -7
- package/src/services/splitApi.ts +4 -26
- package/src/services/types.ts +2 -8
- package/src/storages/KeyBuilderSS.ts +53 -17
- package/src/storages/inLocalStorage/index.ts +2 -5
- package/src/storages/inMemory/ImpressionCountsCacheInMemory.ts +1 -16
- package/src/storages/inMemory/InMemoryStorage.ts +4 -7
- package/src/storages/inMemory/InMemoryStorageCS.ts +3 -7
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +9 -7
- package/src/storages/inRedis/EventsCacheInRedis.ts +1 -1
- package/src/storages/inRedis/TelemetryCacheInRedis.ts +122 -2
- package/src/storages/inRedis/constants.ts +0 -3
- package/src/storages/inRedis/index.ts +3 -12
- package/src/storages/pluggable/TelemetryCachePluggable.ts +147 -2
- package/src/storages/pluggable/index.ts +20 -16
- package/src/storages/types.ts +13 -34
- package/src/sync/submitters/submitterManager.ts +0 -2
- package/src/sync/submitters/telemetrySubmitter.ts +14 -9
- package/src/sync/submitters/types.ts +40 -26
- package/src/trackers/impressionsTracker.ts +48 -27
- package/src/trackers/types.ts +0 -28
- package/src/types.ts +1 -5
- package/src/utils/constants/index.ts +0 -2
- package/src/utils/lang/maps.ts +20 -8
- package/src/utils/settingsValidation/impressionsMode.ts +3 -3
- package/src/utils/settingsValidation/index.ts +0 -5
- package/types/logger/constants.d.ts +0 -1
- package/types/sdkFactory/types.d.ts +2 -4
- package/types/services/types.d.ts +2 -6
- package/types/storages/KeyBuilderSS.d.ts +7 -4
- package/types/storages/inMemory/ImpressionCountsCacheInMemory.d.ts +1 -5
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -3
- package/types/storages/inRedis/EventsCacheInRedis.d.ts +1 -1
- package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +16 -1
- package/types/storages/inRedis/constants.d.ts +0 -3
- package/types/storages/pluggable/TelemetryCachePluggable.d.ts +17 -1
- package/types/storages/types.d.ts +10 -21
- package/types/sync/submitters/telemetrySubmitter.d.ts +1 -1
- package/types/sync/submitters/types.d.ts +13 -24
- package/types/trackers/impressionsTracker.d.ts +6 -4
- package/types/trackers/types.d.ts +0 -23
- package/types/types.d.ts +1 -5
- package/types/utils/constants/index.d.ts +0 -2
- package/types/utils/lang/maps.d.ts +6 -2
- package/types/utils/settingsValidation/index.d.ts +0 -1
- package/cjs/storages/inMemory/uniqueKeysCacheInMemory.js +0 -73
- package/cjs/storages/inMemory/uniqueKeysCacheInMemoryCS.js +0 -78
- package/cjs/storages/inRedis/ImpressionCountsCacheInRedis.js +0 -49
- package/cjs/storages/inRedis/uniqueKeysCacheInRedis.js +0 -56
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +0 -26
- package/cjs/trackers/strategy/strategyDebug.js +0 -25
- package/cjs/trackers/strategy/strategyNone.js +0 -29
- package/cjs/trackers/strategy/strategyOptimized.js +0 -35
- package/cjs/trackers/uniqueKeysTracker.js +0 -38
- package/esm/storages/inMemory/uniqueKeysCacheInMemory.js +0 -70
- package/esm/storages/inMemory/uniqueKeysCacheInMemoryCS.js +0 -75
- package/esm/storages/inRedis/ImpressionCountsCacheInRedis.js +0 -46
- package/esm/storages/inRedis/uniqueKeysCacheInRedis.js +0 -53
- package/esm/sync/submitters/uniqueKeysSubmitter.js +0 -22
- package/esm/trackers/strategy/strategyDebug.js +0 -21
- package/esm/trackers/strategy/strategyNone.js +0 -25
- package/esm/trackers/strategy/strategyOptimized.js +0 -31
- package/esm/trackers/uniqueKeysTracker.js +0 -34
- package/src/storages/inMemory/uniqueKeysCacheInMemory.ts +0 -82
- package/src/storages/inMemory/uniqueKeysCacheInMemoryCS.ts +0 -88
- package/src/storages/inRedis/ImpressionCountsCacheInRedis.ts +0 -51
- package/src/storages/inRedis/uniqueKeysCacheInRedis.ts +0 -63
- package/src/sync/submitters/uniqueKeysSubmitter.ts +0 -35
- package/src/trackers/strategy/strategyDebug.ts +0 -28
- package/src/trackers/strategy/strategyNone.ts +0 -34
- package/src/trackers/strategy/strategyOptimized.ts +0 -42
- package/src/trackers/uniqueKeysTracker.ts +0 -48
- package/types/sdkClient/types.d.ts +0 -18
- package/types/storages/inMemory/CountsCacheInMemory.d.ts +0 -20
- package/types/storages/inMemory/LatenciesCacheInMemory.d.ts +0 -20
- package/types/storages/inMemory/uniqueKeysCacheInMemory.d.ts +0 -35
- package/types/storages/inMemory/uniqueKeysCacheInMemoryCS.d.ts +0 -37
- package/types/storages/inRedis/CountsCacheInRedis.d.ts +0 -9
- package/types/storages/inRedis/ImpressionCountsCacheInRedis.d.ts +0 -14
- package/types/storages/inRedis/LatenciesCacheInRedis.d.ts +0 -9
- package/types/storages/inRedis/uniqueKeysCacheInRedis.d.ts +0 -15
- package/types/sync/offline/LocalhostFromFile.d.ts +0 -2
- package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +0 -2
- package/types/sync/submitters/eventsSyncTask.d.ts +0 -8
- package/types/sync/submitters/impressionCountsSubmitterInRedis.d.ts +0 -5
- package/types/sync/submitters/impressionCountsSyncTask.d.ts +0 -13
- package/types/sync/submitters/impressionsSyncTask.d.ts +0 -14
- package/types/sync/submitters/metricsSyncTask.d.ts +0 -12
- package/types/sync/submitters/submitterSyncTask.d.ts +0 -10
- package/types/sync/submitters/uniqueKeysSubmitter.d.ts +0 -5
- package/types/sync/submitters/uniqueKeysSubmitterInRedis.d.ts +0 -5
- package/types/sync/syncTaskComposite.d.ts +0 -5
- package/types/trackers/filter/bloomFilter.d.ts +0 -10
- package/types/trackers/filter/dictionaryFilter.d.ts +0 -8
- package/types/trackers/filter/types.d.ts +0 -5
- package/types/trackers/strategy/strategyDebug.d.ts +0 -9
- package/types/trackers/strategy/strategyNone.d.ts +0 -10
- package/types/trackers/strategy/strategyOptimized.d.ts +0 -11
- package/types/trackers/uniqueKeysTracker.d.ts +0 -13
- package/types/utils/timeTracker/index.d.ts +0 -70
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { IImpressionsCacheBase, ITelemetryCacheSync, ITelemetryCacheAsync } from '../storages/types';
|
|
2
|
-
import { IImpressionsHandler, IImpressionsTracker
|
|
1
|
+
import { IImpressionCountsCacheSync, IImpressionsCacheBase, ITelemetryCacheSync, ITelemetryCacheAsync } from '../storages/types';
|
|
2
|
+
import { IImpressionsHandler, IImpressionsTracker } from './types';
|
|
3
3
|
import { ISettings } from '../types';
|
|
4
|
+
import { IImpressionObserver } from './impressionObserver/types';
|
|
4
5
|
/**
|
|
5
6
|
* Impressions tracker stores impressions in cache and pass them to the listener and integrations manager if provided.
|
|
6
7
|
*
|
|
@@ -8,6 +9,7 @@ import { ISettings } from '../types';
|
|
|
8
9
|
* @param metadata runtime metadata (ip, hostname and version)
|
|
9
10
|
* @param impressionListener optional impression listener
|
|
10
11
|
* @param integrationsManager optional integrations manager
|
|
11
|
-
* @param
|
|
12
|
+
* @param observer optional impression observer. If provided, previous time (pt property) is included in impression instances
|
|
13
|
+
* @param countsCache optional cache to save impressions count. If provided, impressions will be deduped (OPTIMIZED mode)
|
|
12
14
|
*/
|
|
13
|
-
export declare function impressionsTrackerFactory(settings: ISettings, impressionsCache: IImpressionsCacheBase,
|
|
15
|
+
export declare function impressionsTrackerFactory(settings: ISettings, impressionsCache: IImpressionsCacheBase, integrationsManager?: IImpressionsHandler, observer?: IImpressionObserver, countsCache?: IImpressionCountsCacheSync, telemetryCache?: ITelemetryCacheSync | ITelemetryCacheAsync): IImpressionsTracker;
|
|
@@ -38,26 +38,3 @@ export interface ITelemetryTracker {
|
|
|
38
38
|
*/
|
|
39
39
|
addTag(tag: string): void;
|
|
40
40
|
}
|
|
41
|
-
export interface IFilterAdapter {
|
|
42
|
-
add(key: string, featureName: string): boolean;
|
|
43
|
-
contains(key: string, featureName: string): boolean;
|
|
44
|
-
clear(): void;
|
|
45
|
-
refreshRate?: number;
|
|
46
|
-
}
|
|
47
|
-
export interface IImpressionSenderAdapter {
|
|
48
|
-
recordUniqueKeys(data: Object): void;
|
|
49
|
-
recordImpressionCounts(data: Object): void;
|
|
50
|
-
}
|
|
51
|
-
/** Unique keys tracker */
|
|
52
|
-
export interface IUniqueKeysTracker {
|
|
53
|
-
stop(): void;
|
|
54
|
-
track(key: string, featureName: string): void;
|
|
55
|
-
}
|
|
56
|
-
export interface IStrategyResult {
|
|
57
|
-
impressionsToStore: ImpressionDTO[];
|
|
58
|
-
impressionsToListener: ImpressionDTO[];
|
|
59
|
-
deduped: number;
|
|
60
|
-
}
|
|
61
|
-
export interface IStrategy {
|
|
62
|
-
process(impressions: ImpressionDTO[]): IStrategyResult;
|
|
63
|
-
}
|
package/types/types.d.ts
CHANGED
|
@@ -74,10 +74,6 @@ export interface ISettings {
|
|
|
74
74
|
featuresRefreshRate: number;
|
|
75
75
|
impressionsRefreshRate: number;
|
|
76
76
|
impressionsQueueSize: number;
|
|
77
|
-
impressionCountsRefreshRate: number;
|
|
78
|
-
impressionCountsQueueSize: number;
|
|
79
|
-
uniqueKeysRefreshRate: number;
|
|
80
|
-
uniqueKeysCacheSize: number;
|
|
81
77
|
/**
|
|
82
78
|
* @deprecated
|
|
83
79
|
*/
|
|
@@ -719,7 +715,7 @@ export declare namespace SplitIO {
|
|
|
719
715
|
* ImpressionsMode type
|
|
720
716
|
* @typedef {string} ImpressionsMode
|
|
721
717
|
*/
|
|
722
|
-
type ImpressionsMode = 'OPTIMIZED' | 'DEBUG'
|
|
718
|
+
type ImpressionsMode = 'OPTIMIZED' | 'DEBUG';
|
|
723
719
|
/**
|
|
724
720
|
* Defines the format of Split data to preload on the factory storage (cache).
|
|
725
721
|
*/
|
|
@@ -11,7 +11,6 @@ export declare const SPLIT_IMPRESSION = "IMPRESSION";
|
|
|
11
11
|
export declare const SPLIT_EVENT = "EVENT";
|
|
12
12
|
export declare const DEBUG = "DEBUG";
|
|
13
13
|
export declare const OPTIMIZED = "OPTIMIZED";
|
|
14
|
-
export declare const NONE = "NONE";
|
|
15
14
|
export declare const LOCALHOST_MODE: SDKMode;
|
|
16
15
|
export declare const STANDALONE_MODE: SDKMode;
|
|
17
16
|
export declare const PRODUCER_MODE = "producer";
|
|
@@ -32,7 +31,6 @@ export declare const CONSUMER_ENUM = 1;
|
|
|
32
31
|
export declare const CONSUMER_PARTIAL_ENUM = 2;
|
|
33
32
|
export declare const OPTIMIZED_ENUM = 0;
|
|
34
33
|
export declare const DEBUG_ENUM = 1;
|
|
35
|
-
export declare const NONE_ENUM = 2;
|
|
36
34
|
export declare const SPLITS = "sp";
|
|
37
35
|
export declare const IMPRESSIONS = "im";
|
|
38
36
|
export declare const IMPRESSIONS_COUNT = "ic";
|
|
@@ -23,10 +23,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
23
23
|
THE SOFTWARE.
|
|
24
24
|
**/
|
|
25
25
|
export interface IMap<K, V> {
|
|
26
|
-
set(key: K, value: V): this;
|
|
27
26
|
clear(): void;
|
|
28
27
|
delete(key: K): boolean;
|
|
28
|
+
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
|
|
29
29
|
get(key: K): V | undefined;
|
|
30
|
+
has(key: K): boolean;
|
|
31
|
+
set(key: K, value: V): this;
|
|
30
32
|
readonly size: number;
|
|
31
33
|
}
|
|
32
34
|
export declare class MapPoly<K, V> implements IMap<K, V> {
|
|
@@ -34,9 +36,11 @@ export declare class MapPoly<K, V> implements IMap<K, V> {
|
|
|
34
36
|
private __mapValuesData__;
|
|
35
37
|
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
36
38
|
clear(): void;
|
|
37
|
-
set(key: K, value: V): this;
|
|
38
39
|
delete(key: K): boolean;
|
|
40
|
+
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
|
|
39
41
|
get(key: K): V | undefined;
|
|
42
|
+
has(key: K): boolean;
|
|
43
|
+
set(key: K, value: V): this;
|
|
40
44
|
get size(): number;
|
|
41
45
|
}
|
|
42
46
|
interface IMapConstructor {
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UniqueKeysCacheInMemory = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
|
-
var constants_1 = require("../inRedis/constants");
|
|
6
|
-
var UniqueKeysCacheInMemory = /** @class */ (function () {
|
|
7
|
-
function UniqueKeysCacheInMemory(uniqueKeysQueueSize) {
|
|
8
|
-
if (uniqueKeysQueueSize === void 0) { uniqueKeysQueueSize = constants_1.DEFAULT_CACHE_SIZE; }
|
|
9
|
-
this.uniqueTrackerSize = 0;
|
|
10
|
-
this.maxStorage = uniqueKeysQueueSize;
|
|
11
|
-
this.uniqueKeysTracker = {};
|
|
12
|
-
}
|
|
13
|
-
UniqueKeysCacheInMemory.prototype.setOnFullQueueCb = function (cb) {
|
|
14
|
-
this.onFullQueue = cb;
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Store unique keys in sequential order
|
|
18
|
-
* key: string = feature name.
|
|
19
|
-
* value: Set<string> = set of unique keys.
|
|
20
|
-
*/
|
|
21
|
-
UniqueKeysCacheInMemory.prototype.track = function (key, featureName) {
|
|
22
|
-
if (!this.uniqueKeysTracker[featureName])
|
|
23
|
-
this.uniqueKeysTracker[featureName] = new sets_1._Set();
|
|
24
|
-
var tracker = this.uniqueKeysTracker[featureName];
|
|
25
|
-
if (!tracker.has(key)) {
|
|
26
|
-
tracker.add(key);
|
|
27
|
-
this.uniqueTrackerSize++;
|
|
28
|
-
}
|
|
29
|
-
if (this.uniqueTrackerSize >= this.maxStorage && this.onFullQueue) {
|
|
30
|
-
this.uniqueTrackerSize = 0;
|
|
31
|
-
this.onFullQueue();
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Clear the data stored on the cache.
|
|
36
|
-
*/
|
|
37
|
-
UniqueKeysCacheInMemory.prototype.clear = function () {
|
|
38
|
-
this.uniqueKeysTracker = {};
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Pop the collected data, used as payload for posting.
|
|
42
|
-
*/
|
|
43
|
-
UniqueKeysCacheInMemory.prototype.pop = function () {
|
|
44
|
-
var data = this.uniqueKeysTracker;
|
|
45
|
-
this.uniqueKeysTracker = {};
|
|
46
|
-
return this.fromUniqueKeysCollector(data);
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Check if the cache is empty.
|
|
50
|
-
*/
|
|
51
|
-
UniqueKeysCacheInMemory.prototype.isEmpty = function () {
|
|
52
|
-
return Object.keys(this.uniqueKeysTracker).length === 0;
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* Converts `uniqueKeys` data from cache into request payload for SS.
|
|
56
|
-
*/
|
|
57
|
-
UniqueKeysCacheInMemory.prototype.fromUniqueKeysCollector = function (uniqueKeys) {
|
|
58
|
-
var payload = [];
|
|
59
|
-
var featureNames = Object.keys(uniqueKeys);
|
|
60
|
-
for (var i = 0; i < featureNames.length; i++) {
|
|
61
|
-
var featureName = featureNames[i];
|
|
62
|
-
var featureKeys = (0, sets_1.setToArray)(uniqueKeys[featureName]);
|
|
63
|
-
var uniqueKeysPayload = {
|
|
64
|
-
f: featureName,
|
|
65
|
-
ks: featureKeys
|
|
66
|
-
};
|
|
67
|
-
payload.push(uniqueKeysPayload);
|
|
68
|
-
}
|
|
69
|
-
return { keys: payload };
|
|
70
|
-
};
|
|
71
|
-
return UniqueKeysCacheInMemory;
|
|
72
|
-
}());
|
|
73
|
-
exports.UniqueKeysCacheInMemory = UniqueKeysCacheInMemory;
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UniqueKeysCacheInMemoryCS = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
|
-
var constants_1 = require("../inRedis/constants");
|
|
6
|
-
var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
* @param impressionsQueueSize number of queued impressions to call onFullQueueCb.
|
|
10
|
-
* Default value is 0, that means no maximum value, in case we want to avoid this being triggered.
|
|
11
|
-
*/
|
|
12
|
-
function UniqueKeysCacheInMemoryCS(uniqueKeysQueueSize) {
|
|
13
|
-
if (uniqueKeysQueueSize === void 0) { uniqueKeysQueueSize = constants_1.DEFAULT_CACHE_SIZE; }
|
|
14
|
-
this.uniqueTrackerSize = 0;
|
|
15
|
-
this.maxStorage = uniqueKeysQueueSize;
|
|
16
|
-
this.uniqueKeysTracker = {};
|
|
17
|
-
}
|
|
18
|
-
UniqueKeysCacheInMemoryCS.prototype.setOnFullQueueCb = function (cb) {
|
|
19
|
-
this.onFullQueue = cb;
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Store unique keys in sequential order
|
|
23
|
-
* key: string = key.
|
|
24
|
-
* value: HashSet<string> = set of split names.
|
|
25
|
-
*/
|
|
26
|
-
UniqueKeysCacheInMemoryCS.prototype.track = function (key, featureName) {
|
|
27
|
-
if (!this.uniqueKeysTracker[key])
|
|
28
|
-
this.uniqueKeysTracker[key] = new sets_1._Set();
|
|
29
|
-
var tracker = this.uniqueKeysTracker[key];
|
|
30
|
-
if (!tracker.has(featureName)) {
|
|
31
|
-
tracker.add(featureName);
|
|
32
|
-
this.uniqueTrackerSize++;
|
|
33
|
-
}
|
|
34
|
-
if (this.uniqueTrackerSize >= this.maxStorage && this.onFullQueue) {
|
|
35
|
-
this.uniqueTrackerSize = 0;
|
|
36
|
-
this.onFullQueue();
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Clear the data stored on the cache.
|
|
41
|
-
*/
|
|
42
|
-
UniqueKeysCacheInMemoryCS.prototype.clear = function () {
|
|
43
|
-
this.uniqueKeysTracker = {};
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Pop the collected data, used as payload for posting.
|
|
47
|
-
*/
|
|
48
|
-
UniqueKeysCacheInMemoryCS.prototype.pop = function () {
|
|
49
|
-
var data = this.uniqueKeysTracker;
|
|
50
|
-
this.uniqueKeysTracker = {};
|
|
51
|
-
return this.fromUniqueKeysCollector(data);
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* Check if the cache is empty.
|
|
55
|
-
*/
|
|
56
|
-
UniqueKeysCacheInMemoryCS.prototype.isEmpty = function () {
|
|
57
|
-
return Object.keys(this.uniqueKeysTracker).length === 0;
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* Converts `uniqueKeys` data from cache into request payload.
|
|
61
|
-
*/
|
|
62
|
-
UniqueKeysCacheInMemoryCS.prototype.fromUniqueKeysCollector = function (uniqueKeys) {
|
|
63
|
-
var payload = [];
|
|
64
|
-
var featureKeys = Object.keys(uniqueKeys);
|
|
65
|
-
for (var k = 0; k < featureKeys.length; k++) {
|
|
66
|
-
var featureKey = featureKeys[k];
|
|
67
|
-
var featureNames = (0, sets_1.setToArray)(uniqueKeys[featureKey]);
|
|
68
|
-
var uniqueKeysPayload = {
|
|
69
|
-
k: featureKey,
|
|
70
|
-
fs: featureNames
|
|
71
|
-
};
|
|
72
|
-
payload.push(uniqueKeysPayload);
|
|
73
|
-
}
|
|
74
|
-
return { keys: payload };
|
|
75
|
-
};
|
|
76
|
-
return UniqueKeysCacheInMemoryCS;
|
|
77
|
-
}());
|
|
78
|
-
exports.UniqueKeysCacheInMemoryCS = UniqueKeysCacheInMemoryCS;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ImpressionCountsCacheInRedis = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var ImpressionCountsCacheInMemory_1 = require("../inMemory/ImpressionCountsCacheInMemory");
|
|
6
|
-
var constants_1 = require("./constants");
|
|
7
|
-
var ImpressionCountsCacheInRedis = /** @class */ (function (_super) {
|
|
8
|
-
(0, tslib_1.__extends)(ImpressionCountsCacheInRedis, _super);
|
|
9
|
-
function ImpressionCountsCacheInRedis(log, key, redis, impressionCountsCacheSize, refreshRate) {
|
|
10
|
-
if (refreshRate === void 0) { refreshRate = constants_1.REFRESH_RATE; }
|
|
11
|
-
var _this = _super.call(this, impressionCountsCacheSize) || this;
|
|
12
|
-
_this.log = log;
|
|
13
|
-
_this.key = key;
|
|
14
|
-
_this.redis = redis;
|
|
15
|
-
_this.refreshRate = refreshRate;
|
|
16
|
-
_this.onFullQueue = function () { _this.postImpressionCountsInRedis(); };
|
|
17
|
-
return _this;
|
|
18
|
-
}
|
|
19
|
-
ImpressionCountsCacheInRedis.prototype.postImpressionCountsInRedis = function () {
|
|
20
|
-
var _this = this;
|
|
21
|
-
var counts = this.pop();
|
|
22
|
-
if (!counts)
|
|
23
|
-
return false;
|
|
24
|
-
var keys = Object.keys(counts);
|
|
25
|
-
var pipeline = this.redis.pipeline();
|
|
26
|
-
keys.forEach(function (key) {
|
|
27
|
-
pipeline.hincrby(_this.key, key, counts[key]);
|
|
28
|
-
});
|
|
29
|
-
return pipeline.exec()
|
|
30
|
-
.then(function (data) {
|
|
31
|
-
// If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
|
|
32
|
-
if (data.length && data.length === keys.length) {
|
|
33
|
-
return _this.redis.expire(_this.key, constants_1.TTL_REFRESH);
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
.catch(function (err) {
|
|
37
|
-
_this.log.error(constants_1.LOG_PREFIX + "Error in impression counts pipeline: " + err + ".");
|
|
38
|
-
return false;
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
ImpressionCountsCacheInRedis.prototype.start = function () {
|
|
42
|
-
this.intervalId = setInterval(this.postImpressionCountsInRedis.bind(this), this.refreshRate);
|
|
43
|
-
};
|
|
44
|
-
ImpressionCountsCacheInRedis.prototype.stop = function () {
|
|
45
|
-
clearInterval(this.intervalId);
|
|
46
|
-
};
|
|
47
|
-
return ImpressionCountsCacheInRedis;
|
|
48
|
-
}(ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory));
|
|
49
|
-
exports.ImpressionCountsCacheInRedis = ImpressionCountsCacheInRedis;
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UniqueKeysCacheInRedis = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var uniqueKeysCacheInMemory_1 = require("../inMemory/uniqueKeysCacheInMemory");
|
|
6
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
7
|
-
var constants_1 = require("./constants");
|
|
8
|
-
var constants_2 = require("./constants");
|
|
9
|
-
var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
10
|
-
(0, tslib_1.__extends)(UniqueKeysCacheInRedis, _super);
|
|
11
|
-
function UniqueKeysCacheInRedis(log, key, redis, uniqueKeysQueueSize, refreshRate) {
|
|
12
|
-
if (uniqueKeysQueueSize === void 0) { uniqueKeysQueueSize = constants_1.DEFAULT_CACHE_SIZE; }
|
|
13
|
-
if (refreshRate === void 0) { refreshRate = constants_1.REFRESH_RATE; }
|
|
14
|
-
var _this = _super.call(this, uniqueKeysQueueSize) || this;
|
|
15
|
-
_this.log = log;
|
|
16
|
-
_this.key = key;
|
|
17
|
-
_this.redis = redis;
|
|
18
|
-
_this.refreshRate = refreshRate;
|
|
19
|
-
_this.onFullQueue = function () { _this.postUniqueKeysInRedis(); };
|
|
20
|
-
return _this;
|
|
21
|
-
}
|
|
22
|
-
UniqueKeysCacheInRedis.prototype.postUniqueKeysInRedis = function () {
|
|
23
|
-
var _this = this;
|
|
24
|
-
var pipeline = this.redis.pipeline();
|
|
25
|
-
var featureNames = Object.keys(this.uniqueKeysTracker);
|
|
26
|
-
for (var i = 0; i < featureNames.length; i++) {
|
|
27
|
-
var featureName = featureNames[i];
|
|
28
|
-
var featureKeys = (0, sets_1.setToArray)(this.uniqueKeysTracker[featureName]);
|
|
29
|
-
var uniqueKeysPayload = {
|
|
30
|
-
f: featureName,
|
|
31
|
-
ks: featureKeys
|
|
32
|
-
};
|
|
33
|
-
pipeline.rpush(this.key, JSON.stringify(uniqueKeysPayload));
|
|
34
|
-
}
|
|
35
|
-
this.clear();
|
|
36
|
-
return pipeline.exec()
|
|
37
|
-
.then(function (data) {
|
|
38
|
-
// If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
|
|
39
|
-
if (data.length && data.length === featureNames.length) {
|
|
40
|
-
return _this.redis.expire(_this.key, constants_1.TTL_REFRESH);
|
|
41
|
-
}
|
|
42
|
-
})
|
|
43
|
-
.catch(function (err) {
|
|
44
|
-
_this.log.error(constants_2.LOG_PREFIX + "Error in uniqueKeys pipeline: " + err + ".");
|
|
45
|
-
return false;
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
UniqueKeysCacheInRedis.prototype.start = function () {
|
|
49
|
-
this.intervalId = setInterval(this.postUniqueKeysInRedis.bind(this), this.refreshRate);
|
|
50
|
-
};
|
|
51
|
-
UniqueKeysCacheInRedis.prototype.stop = function () {
|
|
52
|
-
clearInterval(this.intervalId);
|
|
53
|
-
};
|
|
54
|
-
return UniqueKeysCacheInRedis;
|
|
55
|
-
}(uniqueKeysCacheInMemory_1.UniqueKeysCacheInMemory));
|
|
56
|
-
exports.UniqueKeysCacheInRedis = UniqueKeysCacheInRedis;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.uniqueKeysSubmitterFactory = void 0;
|
|
4
|
-
var constants_1 = require("../../logger/constants");
|
|
5
|
-
var submitter_1 = require("./submitter");
|
|
6
|
-
var DATA_NAME = 'uniqueKeys';
|
|
7
|
-
/**
|
|
8
|
-
* Submitter that periodically posts impression counts
|
|
9
|
-
*/
|
|
10
|
-
function uniqueKeysSubmitterFactory(params) {
|
|
11
|
-
var _a = params.settings, log = _a.log, uniqueKeysRefreshRate = _a.scheduler.uniqueKeysRefreshRate, key = _a.core.key, _b = params.splitApi, postUniqueKeysBulkCs = _b.postUniqueKeysBulkCs, postUniqueKeysBulkSs = _b.postUniqueKeysBulkSs, uniqueKeys = params.storage.uniqueKeys;
|
|
12
|
-
var isClientSide = key !== undefined;
|
|
13
|
-
var postUniqueKeysBulk = isClientSide ? postUniqueKeysBulkCs : postUniqueKeysBulkSs;
|
|
14
|
-
var syncTask = (0, submitter_1.submitterFactory)(log, postUniqueKeysBulk, uniqueKeys, uniqueKeysRefreshRate, 'unique keys');
|
|
15
|
-
// register unique keys submitter to be executed when uniqueKeys cache is full
|
|
16
|
-
uniqueKeys.setOnFullQueueCb(function () {
|
|
17
|
-
if (syncTask.isRunning()) {
|
|
18
|
-
log.info(constants_1.SUBMITTERS_PUSH_FULL_QUEUE, [DATA_NAME]);
|
|
19
|
-
syncTask.execute();
|
|
20
|
-
}
|
|
21
|
-
// If submitter is stopped (e.g., user consent declined or unknown, or app state offline), we don't send the data.
|
|
22
|
-
// Data will be sent when submitter is resumed.
|
|
23
|
-
});
|
|
24
|
-
return syncTask;
|
|
25
|
-
}
|
|
26
|
-
exports.uniqueKeysSubmitterFactory = uniqueKeysSubmitterFactory;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.strategyDebugFactory = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Debug strategy for impressions tracker. Wraps impressions to store and adds previousTime if it corresponds
|
|
6
|
-
*
|
|
7
|
-
* @param impressionsObserver impression observer. Previous time (pt property) is included in impression instances
|
|
8
|
-
* @returns IStrategyResult
|
|
9
|
-
*/
|
|
10
|
-
function strategyDebugFactory(impressionsObserver) {
|
|
11
|
-
return {
|
|
12
|
-
process: function (impressions) {
|
|
13
|
-
impressions.forEach(function (impression) {
|
|
14
|
-
// Adds previous time if it is enabled
|
|
15
|
-
impression.pt = impressionsObserver.testAndSet(impression);
|
|
16
|
-
});
|
|
17
|
-
return {
|
|
18
|
-
impressionsToStore: impressions,
|
|
19
|
-
impressionsToListener: impressions,
|
|
20
|
-
deduped: 0
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
exports.strategyDebugFactory = strategyDebugFactory;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.strategyNoneFactory = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* None strategy for impressions tracker.
|
|
6
|
-
*
|
|
7
|
-
* @param impressionsCounter cache to save impressions count. impressions will be deduped (OPTIMIZED mode)
|
|
8
|
-
* @param uniqueKeysTracker unique keys tracker in charge of tracking the unique keys per split.
|
|
9
|
-
* @returns IStrategyResult
|
|
10
|
-
*/
|
|
11
|
-
function strategyNoneFactory(impressionsCounter, uniqueKeysTracker) {
|
|
12
|
-
return {
|
|
13
|
-
process: function (impressions) {
|
|
14
|
-
impressions.forEach(function (impression) {
|
|
15
|
-
var now = Date.now();
|
|
16
|
-
// Increments impression counter per featureName
|
|
17
|
-
impressionsCounter.track(impression.feature, now, 1);
|
|
18
|
-
// Keep track by unique key
|
|
19
|
-
uniqueKeysTracker.track(impression.keyName, impression.feature);
|
|
20
|
-
});
|
|
21
|
-
return {
|
|
22
|
-
impressionsToStore: [],
|
|
23
|
-
impressionsToListener: impressions,
|
|
24
|
-
deduped: 0
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
exports.strategyNoneFactory = strategyNoneFactory;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.strategyOptimizedFactory = void 0;
|
|
4
|
-
var time_1 = require("../../utils/time");
|
|
5
|
-
/**
|
|
6
|
-
* Optimized strategy for impressions tracker. Wraps impressions to store and adds previousTime if it corresponds
|
|
7
|
-
*
|
|
8
|
-
* @param impressionsObserver impression observer. previous time (pt property) is included in impression instances
|
|
9
|
-
* @param impressionsCounter cache to save impressions count. impressions will be deduped (OPTIMIZED mode)
|
|
10
|
-
* @returns IStrategyResult
|
|
11
|
-
*/
|
|
12
|
-
function strategyOptimizedFactory(impressionsObserver, impressionsCounter) {
|
|
13
|
-
return {
|
|
14
|
-
process: function (impressions) {
|
|
15
|
-
var impressionsToStore = [];
|
|
16
|
-
impressions.forEach(function (impression) {
|
|
17
|
-
impression.pt = impressionsObserver.testAndSet(impression);
|
|
18
|
-
var now = Date.now();
|
|
19
|
-
// Increments impression counter per featureName
|
|
20
|
-
if (impression.pt)
|
|
21
|
-
impressionsCounter.track(impression.feature, now, 1);
|
|
22
|
-
// Checks if the impression should be added in queue to be sent
|
|
23
|
-
if (!impression.pt || impression.pt < (0, time_1.truncateTimeFrame)(now)) {
|
|
24
|
-
impressionsToStore.push(impression);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return {
|
|
28
|
-
impressionsToStore: impressionsToStore,
|
|
29
|
-
impressionsToListener: impressions,
|
|
30
|
-
deduped: impressions.length - impressionsToStore.length
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
exports.strategyOptimizedFactory = strategyOptimizedFactory;
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.uniqueKeysTrackerFactory = void 0;
|
|
4
|
-
var constants_1 = require("../logger/constants");
|
|
5
|
-
var noopFilterAdapter = {
|
|
6
|
-
add: function () { return true; },
|
|
7
|
-
contains: function () { return true; },
|
|
8
|
-
clear: function () { }
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Trackes uniques keys
|
|
12
|
-
* Unique Keys Tracker will be in charge of checking if the MTK was already sent to the BE in the last period
|
|
13
|
-
* or schedule to be sent; if not it will be added in an internal cache and sent in the next post.
|
|
14
|
-
*
|
|
15
|
-
* @param log Logger instance
|
|
16
|
-
* @param uniqueKeysCache cache to save unique keys
|
|
17
|
-
* @param filterAdapter filter adapter
|
|
18
|
-
*/
|
|
19
|
-
function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
|
|
20
|
-
if (filterAdapter === void 0) { filterAdapter = noopFilterAdapter; }
|
|
21
|
-
var intervalId;
|
|
22
|
-
if (filterAdapter.refreshRate) {
|
|
23
|
-
intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
|
|
24
|
-
}
|
|
25
|
-
return {
|
|
26
|
-
track: function (key, featureName) {
|
|
27
|
-
if (!filterAdapter.add(key, featureName)) {
|
|
28
|
-
log.debug(constants_1.LOG_PREFIX_UNIQUE_KEYS_TRACKER + "The feature " + featureName + " and key " + key + " exist in the filter");
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
uniqueKeysCache.track(key, featureName);
|
|
32
|
-
},
|
|
33
|
-
stop: function () {
|
|
34
|
-
clearInterval(intervalId);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
exports.uniqueKeysTrackerFactory = uniqueKeysTrackerFactory;
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { setToArray, _Set } from '../../utils/lang/sets';
|
|
2
|
-
import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
|
|
3
|
-
var UniqueKeysCacheInMemory = /** @class */ (function () {
|
|
4
|
-
function UniqueKeysCacheInMemory(uniqueKeysQueueSize) {
|
|
5
|
-
if (uniqueKeysQueueSize === void 0) { uniqueKeysQueueSize = DEFAULT_CACHE_SIZE; }
|
|
6
|
-
this.uniqueTrackerSize = 0;
|
|
7
|
-
this.maxStorage = uniqueKeysQueueSize;
|
|
8
|
-
this.uniqueKeysTracker = {};
|
|
9
|
-
}
|
|
10
|
-
UniqueKeysCacheInMemory.prototype.setOnFullQueueCb = function (cb) {
|
|
11
|
-
this.onFullQueue = cb;
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Store unique keys in sequential order
|
|
15
|
-
* key: string = feature name.
|
|
16
|
-
* value: Set<string> = set of unique keys.
|
|
17
|
-
*/
|
|
18
|
-
UniqueKeysCacheInMemory.prototype.track = function (key, featureName) {
|
|
19
|
-
if (!this.uniqueKeysTracker[featureName])
|
|
20
|
-
this.uniqueKeysTracker[featureName] = new _Set();
|
|
21
|
-
var tracker = this.uniqueKeysTracker[featureName];
|
|
22
|
-
if (!tracker.has(key)) {
|
|
23
|
-
tracker.add(key);
|
|
24
|
-
this.uniqueTrackerSize++;
|
|
25
|
-
}
|
|
26
|
-
if (this.uniqueTrackerSize >= this.maxStorage && this.onFullQueue) {
|
|
27
|
-
this.uniqueTrackerSize = 0;
|
|
28
|
-
this.onFullQueue();
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Clear the data stored on the cache.
|
|
33
|
-
*/
|
|
34
|
-
UniqueKeysCacheInMemory.prototype.clear = function () {
|
|
35
|
-
this.uniqueKeysTracker = {};
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Pop the collected data, used as payload for posting.
|
|
39
|
-
*/
|
|
40
|
-
UniqueKeysCacheInMemory.prototype.pop = function () {
|
|
41
|
-
var data = this.uniqueKeysTracker;
|
|
42
|
-
this.uniqueKeysTracker = {};
|
|
43
|
-
return this.fromUniqueKeysCollector(data);
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Check if the cache is empty.
|
|
47
|
-
*/
|
|
48
|
-
UniqueKeysCacheInMemory.prototype.isEmpty = function () {
|
|
49
|
-
return Object.keys(this.uniqueKeysTracker).length === 0;
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Converts `uniqueKeys` data from cache into request payload for SS.
|
|
53
|
-
*/
|
|
54
|
-
UniqueKeysCacheInMemory.prototype.fromUniqueKeysCollector = function (uniqueKeys) {
|
|
55
|
-
var payload = [];
|
|
56
|
-
var featureNames = Object.keys(uniqueKeys);
|
|
57
|
-
for (var i = 0; i < featureNames.length; i++) {
|
|
58
|
-
var featureName = featureNames[i];
|
|
59
|
-
var featureKeys = setToArray(uniqueKeys[featureName]);
|
|
60
|
-
var uniqueKeysPayload = {
|
|
61
|
-
f: featureName,
|
|
62
|
-
ks: featureKeys
|
|
63
|
-
};
|
|
64
|
-
payload.push(uniqueKeysPayload);
|
|
65
|
-
}
|
|
66
|
-
return { keys: payload };
|
|
67
|
-
};
|
|
68
|
-
return UniqueKeysCacheInMemory;
|
|
69
|
-
}());
|
|
70
|
-
export { UniqueKeysCacheInMemory };
|