@splitsoftware/splitio-commons 1.6.2-rc.8 → 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.
Files changed (164) hide show
  1. package/CHANGES.txt +2 -1
  2. package/cjs/consent/sdkUserConsent.js +2 -2
  3. package/cjs/evaluator/index.js +5 -5
  4. package/cjs/listeners/browser.js +1 -2
  5. package/cjs/logger/constants.js +1 -2
  6. package/cjs/sdkClient/client.js +19 -7
  7. package/cjs/sdkClient/sdkClient.js +1 -3
  8. package/cjs/sdkFactory/index.js +5 -23
  9. package/cjs/services/splitApi.js +4 -24
  10. package/cjs/storages/KeyBuilderSS.js +48 -15
  11. package/cjs/storages/inLocalStorage/index.js +1 -5
  12. package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -12
  13. package/cjs/storages/inMemory/InMemoryStorage.js +2 -6
  14. package/cjs/storages/inMemory/InMemoryStorageCS.js +2 -6
  15. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +9 -6
  16. package/cjs/storages/inRedis/EventsCacheInRedis.js +1 -1
  17. package/cjs/storages/inRedis/TelemetryCacheInRedis.js +100 -0
  18. package/cjs/storages/inRedis/constants.js +1 -4
  19. package/cjs/storages/inRedis/index.js +2 -17
  20. package/cjs/storages/pluggable/TelemetryCachePluggable.js +126 -0
  21. package/cjs/storages/pluggable/index.js +19 -15
  22. package/cjs/sync/submitters/submitterManager.js +0 -3
  23. package/cjs/sync/submitters/telemetrySubmitter.js +7 -5
  24. package/cjs/trackers/impressionsTracker.js +41 -22
  25. package/cjs/utils/constants/index.js +2 -4
  26. package/cjs/utils/lang/maps.js +15 -7
  27. package/cjs/utils/settingsValidation/impressionsMode.js +2 -2
  28. package/cjs/utils/settingsValidation/index.js +0 -3
  29. package/esm/consent/sdkUserConsent.js +2 -2
  30. package/esm/evaluator/index.js +5 -5
  31. package/esm/listeners/browser.js +2 -3
  32. package/esm/logger/constants.js +0 -1
  33. package/esm/sdkClient/client.js +19 -7
  34. package/esm/sdkClient/sdkClient.js +1 -3
  35. package/esm/sdkFactory/index.js +5 -23
  36. package/esm/services/splitApi.js +4 -24
  37. package/esm/storages/KeyBuilderSS.js +44 -14
  38. package/esm/storages/inLocalStorage/index.js +2 -6
  39. package/esm/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -12
  40. package/esm/storages/inMemory/InMemoryStorage.js +4 -8
  41. package/esm/storages/inMemory/InMemoryStorageCS.js +3 -7
  42. package/esm/storages/inMemory/TelemetryCacheInMemory.js +8 -6
  43. package/esm/storages/inRedis/EventsCacheInRedis.js +1 -1
  44. package/esm/storages/inRedis/TelemetryCacheInRedis.js +100 -0
  45. package/esm/storages/inRedis/constants.js +0 -3
  46. package/esm/storages/inRedis/index.js +3 -18
  47. package/esm/storages/pluggable/TelemetryCachePluggable.js +126 -0
  48. package/esm/storages/pluggable/index.js +19 -15
  49. package/esm/sync/submitters/submitterManager.js +0 -3
  50. package/esm/sync/submitters/telemetrySubmitter.js +8 -6
  51. package/esm/trackers/impressionsTracker.js +41 -22
  52. package/esm/utils/constants/index.js +0 -2
  53. package/esm/utils/lang/maps.js +15 -7
  54. package/esm/utils/settingsValidation/impressionsMode.js +3 -3
  55. package/esm/utils/settingsValidation/index.js +0 -3
  56. package/package.json +2 -1
  57. package/src/consent/sdkUserConsent.ts +2 -2
  58. package/src/evaluator/index.ts +6 -6
  59. package/src/listeners/browser.ts +2 -3
  60. package/src/logger/.DS_Store +0 -0
  61. package/src/logger/constants.ts +0 -1
  62. package/src/sdkClient/client.ts +21 -8
  63. package/src/sdkClient/sdkClient.ts +1 -3
  64. package/src/sdkFactory/index.ts +5 -26
  65. package/src/sdkFactory/types.ts +4 -7
  66. package/src/services/splitApi.ts +4 -26
  67. package/src/services/types.ts +2 -8
  68. package/src/storages/KeyBuilderSS.ts +53 -17
  69. package/src/storages/inLocalStorage/index.ts +2 -5
  70. package/src/storages/inMemory/ImpressionCountsCacheInMemory.ts +1 -16
  71. package/src/storages/inMemory/InMemoryStorage.ts +4 -7
  72. package/src/storages/inMemory/InMemoryStorageCS.ts +3 -7
  73. package/src/storages/inMemory/TelemetryCacheInMemory.ts +9 -7
  74. package/src/storages/inRedis/EventsCacheInRedis.ts +1 -1
  75. package/src/storages/inRedis/TelemetryCacheInRedis.ts +122 -2
  76. package/src/storages/inRedis/constants.ts +0 -3
  77. package/src/storages/inRedis/index.ts +5 -15
  78. package/src/storages/pluggable/TelemetryCachePluggable.ts +147 -2
  79. package/src/storages/pluggable/index.ts +20 -16
  80. package/src/storages/types.ts +13 -31
  81. package/src/sync/submitters/submitterManager.ts +0 -2
  82. package/src/sync/submitters/telemetrySubmitter.ts +14 -9
  83. package/src/sync/submitters/types.ts +40 -26
  84. package/src/trackers/impressionsTracker.ts +48 -27
  85. package/src/trackers/types.ts +0 -28
  86. package/src/types.ts +1 -3
  87. package/src/utils/constants/index.ts +0 -2
  88. package/src/utils/lang/maps.ts +20 -8
  89. package/src/utils/settingsValidation/impressionsMode.ts +3 -3
  90. package/src/utils/settingsValidation/index.ts +0 -4
  91. package/types/logger/constants.d.ts +0 -1
  92. package/types/sdkFactory/types.d.ts +2 -4
  93. package/types/services/types.d.ts +2 -6
  94. package/types/storages/KeyBuilderSS.d.ts +7 -4
  95. package/types/storages/inMemory/ImpressionCountsCacheInMemory.d.ts +1 -5
  96. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -3
  97. package/types/storages/inRedis/EventsCacheInRedis.d.ts +1 -1
  98. package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +16 -1
  99. package/types/storages/inRedis/constants.d.ts +0 -3
  100. package/types/storages/pluggable/TelemetryCachePluggable.d.ts +17 -1
  101. package/types/storages/types.d.ts +10 -18
  102. package/types/sync/submitters/telemetrySubmitter.d.ts +1 -1
  103. package/types/sync/submitters/types.d.ts +13 -24
  104. package/types/trackers/impressionsTracker.d.ts +6 -4
  105. package/types/trackers/types.d.ts +0 -23
  106. package/types/types.d.ts +1 -3
  107. package/types/utils/constants/index.d.ts +0 -2
  108. package/types/utils/lang/maps.d.ts +6 -2
  109. package/types/utils/settingsValidation/index.d.ts +0 -1
  110. package/cjs/storages/inMemory/uniqueKeysCacheInMemory.js +0 -73
  111. package/cjs/storages/inMemory/uniqueKeysCacheInMemoryCS.js +0 -78
  112. package/cjs/storages/inRedis/ImpressionCountsCacheInRedis.js +0 -50
  113. package/cjs/storages/inRedis/uniqueKeysCacheInRedis.js +0 -59
  114. package/cjs/sync/submitters/uniqueKeysSubmitter.js +0 -26
  115. package/cjs/trackers/strategy/strategyDebug.js +0 -25
  116. package/cjs/trackers/strategy/strategyNone.js +0 -29
  117. package/cjs/trackers/strategy/strategyOptimized.js +0 -35
  118. package/cjs/trackers/uniqueKeysTracker.js +0 -38
  119. package/esm/storages/inMemory/uniqueKeysCacheInMemory.js +0 -70
  120. package/esm/storages/inMemory/uniqueKeysCacheInMemoryCS.js +0 -75
  121. package/esm/storages/inRedis/ImpressionCountsCacheInRedis.js +0 -47
  122. package/esm/storages/inRedis/uniqueKeysCacheInRedis.js +0 -56
  123. package/esm/sync/submitters/uniqueKeysSubmitter.js +0 -22
  124. package/esm/trackers/strategy/strategyDebug.js +0 -21
  125. package/esm/trackers/strategy/strategyNone.js +0 -25
  126. package/esm/trackers/strategy/strategyOptimized.js +0 -31
  127. package/esm/trackers/uniqueKeysTracker.js +0 -34
  128. package/src/storages/inMemory/uniqueKeysCacheInMemory.ts +0 -82
  129. package/src/storages/inMemory/uniqueKeysCacheInMemoryCS.ts +0 -88
  130. package/src/storages/inRedis/ImpressionCountsCacheInRedis.ts +0 -52
  131. package/src/storages/inRedis/uniqueKeysCacheInRedis.ts +0 -64
  132. package/src/sync/submitters/uniqueKeysSubmitter.ts +0 -35
  133. package/src/trackers/strategy/strategyDebug.ts +0 -28
  134. package/src/trackers/strategy/strategyNone.ts +0 -34
  135. package/src/trackers/strategy/strategyOptimized.ts +0 -42
  136. package/src/trackers/uniqueKeysTracker.ts +0 -48
  137. package/types/sdkClient/types.d.ts +0 -18
  138. package/types/storages/inMemory/CountsCacheInMemory.d.ts +0 -20
  139. package/types/storages/inMemory/LatenciesCacheInMemory.d.ts +0 -20
  140. package/types/storages/inMemory/uniqueKeysCacheInMemory.d.ts +0 -35
  141. package/types/storages/inMemory/uniqueKeysCacheInMemoryCS.d.ts +0 -37
  142. package/types/storages/inRedis/CountsCacheInRedis.d.ts +0 -9
  143. package/types/storages/inRedis/ImpressionCountsCacheInRedis.d.ts +0 -14
  144. package/types/storages/inRedis/LatenciesCacheInRedis.d.ts +0 -9
  145. package/types/storages/inRedis/uniqueKeysCacheInRedis.d.ts +0 -15
  146. package/types/sync/offline/LocalhostFromFile.d.ts +0 -2
  147. package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +0 -2
  148. package/types/sync/submitters/eventsSyncTask.d.ts +0 -8
  149. package/types/sync/submitters/impressionCountsSubmitterInRedis.d.ts +0 -5
  150. package/types/sync/submitters/impressionCountsSyncTask.d.ts +0 -13
  151. package/types/sync/submitters/impressionsSyncTask.d.ts +0 -14
  152. package/types/sync/submitters/metricsSyncTask.d.ts +0 -12
  153. package/types/sync/submitters/submitterSyncTask.d.ts +0 -10
  154. package/types/sync/submitters/uniqueKeysSubmitter.d.ts +0 -5
  155. package/types/sync/submitters/uniqueKeysSubmitterInRedis.d.ts +0 -5
  156. package/types/sync/syncTaskComposite.d.ts +0 -5
  157. package/types/trackers/filter/bloomFilter.d.ts +0 -10
  158. package/types/trackers/filter/dictionaryFilter.d.ts +0 -8
  159. package/types/trackers/filter/types.d.ts +0 -5
  160. package/types/trackers/strategy/strategyDebug.d.ts +0 -9
  161. package/types/trackers/strategy/strategyNone.d.ts +0 -10
  162. package/types/trackers/strategy/strategyOptimized.d.ts +0 -11
  163. package/types/trackers/uniqueKeysTracker.d.ts +0 -13
  164. 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, IStrategy } from './types';
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 strategy strategy for impressions tracking.
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, strategy: IStrategy, integrationsManager?: IImpressionsHandler, telemetryCache?: ITelemetryCacheSync | ITelemetryCacheAsync): IImpressionsTracker;
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,8 +74,6 @@ export interface ISettings {
74
74
  featuresRefreshRate: number;
75
75
  impressionsRefreshRate: number;
76
76
  impressionsQueueSize: number;
77
- uniqueKeysRefreshRate: number;
78
- uniqueKeysCacheSize: number;
79
77
  /**
80
78
  * @deprecated
81
79
  */
@@ -717,7 +715,7 @@ export declare namespace SplitIO {
717
715
  * ImpressionsMode type
718
716
  * @typedef {string} ImpressionsMode
719
717
  */
720
- type ImpressionsMode = 'OPTIMIZED' | 'DEBUG' | 'NONE';
718
+ type ImpressionsMode = 'OPTIMIZED' | 'DEBUG';
721
719
  /**
722
720
  * Defines the format of Split data to preload on the factory storage (cache).
723
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 {
@@ -14,7 +14,6 @@ export declare const base: {
14
14
  segmentsRefreshRate: number;
15
15
  telemetryRefreshRate: number;
16
16
  impressionsRefreshRate: number;
17
- uniqueKeysRefreshRate: number;
18
17
  offlineRefreshRate: number;
19
18
  eventsPushRate: number;
20
19
  eventsQueueSize: number;
@@ -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,50 +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
- var keys = Object.keys(counts);
23
- if (!keys)
24
- return Promise.resolve(false);
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 Promise.resolve(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
- return this.postImpressionCountsInRedis();
47
- };
48
- return ImpressionCountsCacheInRedis;
49
- }(ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory));
50
- exports.ImpressionCountsCacheInRedis = ImpressionCountsCacheInRedis;
@@ -1,59 +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 featureNames = Object.keys(this.uniqueKeysTracker);
25
- if (!featureNames)
26
- return Promise.resolve(false);
27
- var pipeline = this.redis.pipeline();
28
- for (var i = 0; i < featureNames.length; i++) {
29
- var featureName = featureNames[i];
30
- var featureKeys = (0, sets_1.setToArray)(this.uniqueKeysTracker[featureName]);
31
- var uniqueKeysPayload = {
32
- f: featureName,
33
- ks: featureKeys
34
- };
35
- pipeline.rpush(this.key, JSON.stringify(uniqueKeysPayload));
36
- }
37
- this.clear();
38
- return pipeline.exec()
39
- .then(function (data) {
40
- // If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
41
- if (data.length && data.length === featureNames.length) {
42
- return _this.redis.expire(_this.key, constants_1.TTL_REFRESH);
43
- }
44
- })
45
- .catch(function (err) {
46
- _this.log.error(constants_2.LOG_PREFIX + "Error in uniqueKeys pipeline: " + err + ".");
47
- return Promise.resolve(false);
48
- });
49
- };
50
- UniqueKeysCacheInRedis.prototype.start = function () {
51
- this.intervalId = setInterval(this.postUniqueKeysInRedis.bind(this), this.refreshRate);
52
- };
53
- UniqueKeysCacheInRedis.prototype.stop = function () {
54
- clearInterval(this.intervalId);
55
- return this.postUniqueKeysInRedis();
56
- };
57
- return UniqueKeysCacheInRedis;
58
- }(uniqueKeysCacheInMemory_1.UniqueKeysCacheInMemory));
59
- 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 };