@splitsoftware/splitio-commons 1.0.0 → 1.0.1-rc.3

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 (116) hide show
  1. package/README.md +1 -1
  2. package/cjs/listeners/browser.js +3 -1
  3. package/cjs/logger/constants.js +4 -4
  4. package/cjs/logger/messages/error.js +2 -1
  5. package/cjs/logger/messages/warn.js +0 -1
  6. package/cjs/sdkClient/sdkClient.js +4 -4
  7. package/cjs/sdkClient/sdkClientMethodCS.js +16 -5
  8. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +17 -6
  9. package/cjs/sdkFactory/index.js +6 -3
  10. package/cjs/storages/inMemory/InMemoryStorage.js +0 -3
  11. package/cjs/storages/inRedis/index.js +1 -2
  12. package/cjs/storages/pluggable/SplitsCachePluggable.js +1 -1
  13. package/cjs/storages/pluggable/constants.js +1 -1
  14. package/cjs/storages/pluggable/inMemoryWrapper.js +19 -5
  15. package/cjs/storages/pluggable/index.js +38 -15
  16. package/cjs/storages/pluggable/wrapperAdapter.js +3 -3
  17. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +1 -1
  18. package/cjs/sync/streaming/SSEClient/index.js +0 -1
  19. package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +0 -1
  20. package/cjs/sync/submitters/submitterManager.js +19 -0
  21. package/cjs/sync/syncManagerOnline.js +20 -26
  22. package/cjs/trackers/impressionObserver/utils.js +1 -1
  23. package/cjs/utils/MinEventEmitter.js +5 -5
  24. package/cjs/utils/constants/index.js +3 -2
  25. package/cjs/utils/env/isNode.js +4 -1
  26. package/cjs/utils/settingsValidation/mode.js +1 -1
  27. package/cjs/utils/settingsValidation/storage/storageCS.js +17 -3
  28. package/esm/listeners/browser.js +3 -1
  29. package/esm/logger/constants.js +3 -3
  30. package/esm/logger/messages/error.js +2 -1
  31. package/esm/logger/messages/warn.js +0 -1
  32. package/esm/sdkClient/sdkClient.js +5 -5
  33. package/esm/sdkClient/sdkClientMethodCS.js +16 -5
  34. package/esm/sdkClient/sdkClientMethodCSWithTT.js +17 -6
  35. package/esm/sdkFactory/index.js +6 -3
  36. package/esm/storages/inMemory/InMemoryStorage.js +0 -3
  37. package/esm/storages/inRedis/index.js +1 -2
  38. package/esm/storages/pluggable/SplitsCachePluggable.js +1 -1
  39. package/esm/storages/pluggable/constants.js +1 -1
  40. package/esm/storages/pluggable/inMemoryWrapper.js +19 -5
  41. package/esm/storages/pluggable/index.js +40 -16
  42. package/esm/storages/pluggable/wrapperAdapter.js +3 -3
  43. package/esm/sync/polling/updaters/mySegmentsUpdater.js +1 -1
  44. package/esm/sync/streaming/SSEClient/index.js +0 -1
  45. package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +0 -1
  46. package/esm/sync/submitters/submitterManager.js +15 -0
  47. package/esm/sync/syncManagerOnline.js +20 -26
  48. package/esm/trackers/impressionObserver/utils.js +2 -2
  49. package/esm/utils/MinEventEmitter.js +5 -5
  50. package/esm/utils/constants/index.js +2 -1
  51. package/esm/utils/env/isNode.js +4 -1
  52. package/esm/utils/settingsValidation/mode.js +2 -2
  53. package/esm/utils/settingsValidation/storage/storageCS.js +19 -5
  54. package/package.json +3 -4
  55. package/src/listeners/browser.ts +3 -1
  56. package/src/logger/constants.ts +3 -3
  57. package/src/logger/messages/error.ts +2 -1
  58. package/src/logger/messages/warn.ts +0 -1
  59. package/src/sdkClient/sdkClient.ts +6 -6
  60. package/src/sdkClient/sdkClientMethodCS.ts +14 -4
  61. package/src/sdkClient/sdkClientMethodCSWithTT.ts +15 -5
  62. package/src/sdkFactory/index.ts +7 -3
  63. package/src/sdkFactory/types.ts +2 -2
  64. package/src/services/splitApi.ts +4 -1
  65. package/src/services/types.ts +16 -2
  66. package/src/storages/inLocalStorage/index.ts +2 -2
  67. package/src/storages/inMemory/InMemoryStorage.ts +0 -3
  68. package/src/storages/inMemory/InMemoryStorageCS.ts +2 -2
  69. package/src/storages/inRedis/index.ts +1 -1
  70. package/src/storages/pluggable/EventsCachePluggable.ts +3 -3
  71. package/src/storages/pluggable/ImpressionsCachePluggable.ts +3 -3
  72. package/src/storages/pluggable/SegmentsCachePluggable.ts +3 -3
  73. package/src/storages/pluggable/SplitsCachePluggable.ts +4 -4
  74. package/src/storages/pluggable/constants.ts +1 -1
  75. package/src/storages/pluggable/inMemoryWrapper.ts +20 -6
  76. package/src/storages/pluggable/index.ts +46 -16
  77. package/src/storages/pluggable/wrapperAdapter.ts +5 -5
  78. package/src/storages/types.ts +24 -24
  79. package/src/sync/polling/updaters/mySegmentsUpdater.ts +1 -1
  80. package/src/sync/streaming/SSEClient/index.ts +5 -5
  81. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +0 -1
  82. package/src/sync/submitters/submitterManager.ts +22 -0
  83. package/src/sync/syncManagerOnline.ts +26 -32
  84. package/src/sync/types.ts +1 -1
  85. package/src/trackers/impressionObserver/ImpressionObserver.ts +1 -1
  86. package/src/trackers/impressionObserver/utils.ts +2 -2
  87. package/src/types.ts +14 -13
  88. package/src/utils/MinEventEmitter.ts +10 -10
  89. package/src/utils/constants/index.ts +6 -4
  90. package/src/utils/env/isNode.ts +4 -1
  91. package/src/utils/settingsValidation/mode.ts +2 -2
  92. package/src/utils/settingsValidation/storage/storageCS.ts +21 -8
  93. package/types/logger/constants.d.ts +3 -3
  94. package/types/sdkFactory/types.d.ts +2 -2
  95. package/types/services/splitApi.d.ts +1 -1
  96. package/types/services/types.d.ts +13 -0
  97. package/types/storages/inMemory/InMemoryStorageCS.d.ts +2 -2
  98. package/types/storages/pluggable/EventsCachePluggable.d.ts +2 -2
  99. package/types/storages/pluggable/ImpressionsCachePluggable.d.ts +2 -2
  100. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +5 -5
  101. package/types/storages/pluggable/SplitsCachePluggable.d.ts +3 -3
  102. package/types/storages/pluggable/constants.d.ts +1 -1
  103. package/types/storages/pluggable/inMemoryWrapper.d.ts +6 -3
  104. package/types/storages/pluggable/index.d.ts +2 -2
  105. package/types/storages/pluggable/wrapperAdapter.d.ts +4 -4
  106. package/types/storages/types.d.ts +21 -22
  107. package/types/sync/streaming/SSEClient/index.d.ts +4 -3
  108. package/types/sync/submitters/submitterManager.d.ts +4 -0
  109. package/types/sync/syncManagerOnline.d.ts +1 -1
  110. package/types/sync/types.d.ts +1 -1
  111. package/types/trackers/impressionObserver/ImpressionObserver.d.ts +1 -1
  112. package/types/types.d.ts +14 -14
  113. package/types/utils/MinEventEmitter.d.ts +6 -6
  114. package/types/utils/constants/index.d.ts +6 -4
  115. package/types/utils/env/isNode.d.ts +4 -0
  116. package/types/utils/settingsValidation/storage/storageCS.d.ts +6 -4
@@ -1,4 +1,5 @@
1
1
  import { StorageType } from '../../storages/types';
2
+ import { SDKMode } from '../../types';
2
3
 
3
4
  // Special treatments
4
5
  export const CONTROL = 'control';
@@ -20,13 +21,14 @@ export const DEBUG = 'DEBUG';
20
21
  export const OPTIMIZED = 'OPTIMIZED';
21
22
 
22
23
  // SDK Modes
23
- export const LOCALHOST_MODE = 'localhost';
24
- export const STANDALONE_MODE = 'standalone';
24
+ export const LOCALHOST_MODE: SDKMode = 'localhost';
25
+ export const STANDALONE_MODE: SDKMode = 'standalone';
25
26
  export const PRODUCER_MODE = 'producer';
26
- export const CONSUMER_MODE = 'consumer';
27
+ export const CONSUMER_MODE: SDKMode = 'consumer';
28
+ export const CONSUMER_PARTIAL_MODE: SDKMode = 'consumer_partial';
27
29
 
28
30
  // Storage types
29
31
  export const STORAGE_MEMORY: StorageType = 'MEMORY';
30
32
  export const STORAGE_LOCALSTORAGE: StorageType = 'LOCALSTORAGE';
31
33
  export const STORAGE_REDIS: StorageType = 'REDIS';
32
- export const STORAGE_CUSTOM: StorageType = 'CUSTOM';
34
+ export const STORAGE_PLUGGABLE: StorageType = 'PLUGGABLE';
@@ -1,3 +1,6 @@
1
- // We check for version truthiness since most shims will have that as empty string.
1
+ /**
2
+ * 'true' if running in Node.js, or 'false' otherwise.
3
+ * We check for version truthiness since most shims will have that as empty string.
4
+ */
2
5
  // eslint-disable-next-line no-undef
3
6
  export const isNode: boolean = typeof process !== 'undefined' && typeof process.version !== 'undefined' && !!process.version ? true : false;
@@ -1,10 +1,10 @@
1
- import { LOCALHOST_MODE, STANDALONE_MODE, PRODUCER_MODE, CONSUMER_MODE } from '../constants';
1
+ import { LOCALHOST_MODE, STANDALONE_MODE, PRODUCER_MODE, CONSUMER_MODE, CONSUMER_PARTIAL_MODE } from '../constants';
2
2
 
3
3
  export default function mode(key: string, mode: string) {
4
4
  // Leaving the comparison as is, in case we change the mode name but not the setting.
5
5
  if (key === 'localhost') return LOCALHOST_MODE;
6
6
 
7
- if ([STANDALONE_MODE, PRODUCER_MODE, CONSUMER_MODE].indexOf(mode) === -1) throw Error('Invalid mode provided');
7
+ if ([STANDALONE_MODE, PRODUCER_MODE, CONSUMER_MODE, CONSUMER_PARTIAL_MODE].indexOf(mode) === -1) throw Error('Invalid mode provided');
8
8
 
9
9
  return mode;
10
10
  }
@@ -1,11 +1,11 @@
1
1
  import { InMemoryStorageCSFactory } from '../../../storages/inMemory/InMemoryStorageCS';
2
2
  import { ISettings, SDKMode } from '../../../types';
3
3
  import { ILogger } from '../../../logger/types';
4
- import { WARN_STORAGE_INVALID } from '../../../logger/constants';
5
- import { LOCALHOST_MODE, STORAGE_LOCALSTORAGE, STORAGE_MEMORY } from '../../../utils/constants';
6
- import { IStorageFactoryParams, IStorageSyncCS } from '../../../storages/types';
4
+ import { ERROR_STORAGE_INVALID } from '../../../logger/constants';
5
+ import { LOCALHOST_MODE, STANDALONE_MODE, STORAGE_PLUGGABLE, STORAGE_LOCALSTORAGE, STORAGE_MEMORY } from '../../../utils/constants';
6
+ import { IStorageFactoryParams, IStorageSync } from '../../../storages/types';
7
7
 
8
- export function __InLocalStorageMockFactory(params: IStorageFactoryParams): IStorageSyncCS {
8
+ export function __InLocalStorageMockFactory(params: IStorageFactoryParams): IStorageSync {
9
9
  const result = InMemoryStorageCSFactory(params);
10
10
  result.splits.checkCache = () => true; // to emit SDK_READY_FROM_CACHE
11
11
  return result;
@@ -17,15 +17,17 @@ __InLocalStorageMockFactory.type = STORAGE_MEMORY;
17
17
  *
18
18
  * @param {any} settings config object provided by the user to initialize the sdk
19
19
  *
20
- * @returns {Object} valid storage factory. It might be the default `InMemoryStorageCSFactory` if the provided storage is invalid.
20
+ * @returns {Object} valid storage factory. Default to `InMemoryStorageCSFactory` if the provided storage is invalid or not compatible with the sdk mode if mode is standalone or localhost
21
+ *
22
+ * @throws error if mode is consumer and the provided storage is not compatible
21
23
  */
22
- export function validateStorageCS(settings: { log: ILogger, storage?: any, mode?: SDKMode }): ISettings['storage'] {
24
+ export function validateStorageCS(settings: { log: ILogger, storage?: any, mode: SDKMode }): ISettings['storage'] {
23
25
  let { storage = InMemoryStorageCSFactory, log, mode } = settings;
24
26
 
25
27
  // If an invalid storage is provided, fallback into MEMORY
26
- if (typeof storage !== 'function' || storage.type !== STORAGE_MEMORY && storage.type !== STORAGE_LOCALSTORAGE) {
28
+ if (typeof storage !== 'function' || [STORAGE_MEMORY, STORAGE_LOCALSTORAGE, STORAGE_PLUGGABLE].indexOf(storage.type) === -1) {
27
29
  storage = InMemoryStorageCSFactory;
28
- log.warn(WARN_STORAGE_INVALID);
30
+ log.error(ERROR_STORAGE_INVALID);
29
31
  }
30
32
 
31
33
  // In localhost mode with InLocalStorage, fallback to a mock InLocalStorage to emit SDK_READY_FROM_CACHE
@@ -33,6 +35,17 @@ export function validateStorageCS(settings: { log: ILogger, storage?: any, mode?
33
35
  return __InLocalStorageMockFactory;
34
36
  }
35
37
 
38
+ if ([LOCALHOST_MODE, STANDALONE_MODE].indexOf(mode) === -1) {
39
+ // Consumer modes require an async storage
40
+ if (storage.type !== STORAGE_PLUGGABLE) throw new Error('A PluggableStorage instance is required on consumer mode');
41
+ } else {
42
+ // Standalone and localhost modes require a sync storage
43
+ if (storage.type === STORAGE_PLUGGABLE) {
44
+ storage = InMemoryStorageCSFactory;
45
+ log.error(ERROR_STORAGE_INVALID, [' It requires consumer mode.']);
46
+ }
47
+ }
48
+
36
49
  // return default InMemory storage if provided one is not valid
37
50
  return storage;
38
51
  }
@@ -89,9 +89,8 @@ export declare const WARN_INTEGRATION_INVALID = 218;
89
89
  export declare const WARN_SPLITS_FILTER_IGNORED = 219;
90
90
  export declare const WARN_SPLITS_FILTER_INVALID = 220;
91
91
  export declare const WARN_SPLITS_FILTER_EMPTY = 221;
92
- export declare const WARN_STORAGE_INVALID = 222;
93
- export declare const WARN_API_KEY = 223;
94
- export declare const STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = 224;
92
+ export declare const WARN_API_KEY = 222;
93
+ export declare const STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = 223;
95
94
  export declare const ERROR_ENGINE_COMBINER_IFELSEIF = 300;
96
95
  export declare const ERROR_LOGLEVEL_INVALID = 301;
97
96
  export declare const ERROR_CLIENT_LISTENER = 302;
@@ -116,6 +115,7 @@ export declare const ERROR_EMPTY_ARRAY = 320;
116
115
  export declare const ERROR_INVALID_IMPRESSIONS_MODE = 321;
117
116
  export declare const ERROR_HTTP = 322;
118
117
  export declare const ERROR_LOCALHOST_MODULE_REQUIRED = 323;
118
+ export declare const ERROR_STORAGE_INVALID = 324;
119
119
  export declare const LOG_PREFIX_SETTINGS = "settings";
120
120
  export declare const LOG_PREFIX_INSTANTIATION = "Factory instantiation";
121
121
  export declare const LOG_PREFIX_ENGINE = "engine";
@@ -3,7 +3,7 @@ import { ISignalListener } from '../listeners/types';
3
3
  import { ILogger } from '../logger/types';
4
4
  import { ISdkReadinessManager } from '../readiness/types';
5
5
  import { ISdkClientFactoryParams } from '../sdkClient/types';
6
- import { IFetch, ISplitApi } from '../services/types';
6
+ import { IFetch, ISplitApi, IEventSourceConstructor } from '../services/types';
7
7
  import { IStorageAsync, IStorageSync, ISplitsCacheSync, ISplitsCacheAsync, IStorageFactoryParams } from '../storages/types';
8
8
  import { ISyncManager, ISyncManagerFactoryParams } from '../sync/types';
9
9
  import { IImpressionObserver } from '../trackers/impressionObserver/types';
@@ -15,7 +15,7 @@ import { SplitIO, ISettings, IEventEmitter } from '../types';
15
15
  export interface IPlatform {
16
16
  getOptions?: () => object;
17
17
  getFetch?: () => (IFetch | undefined);
18
- getEventSource?: () => (typeof EventSource | undefined);
18
+ getEventSource?: () => (IEventSourceConstructor | undefined);
19
19
  EventEmitter: new () => IEventEmitter;
20
20
  }
21
21
  /**
@@ -7,4 +7,4 @@ import { ISplitApi } from './types';
7
7
  * @param settings validated settings object
8
8
  * @param platform object containing environment-specific `getFetch` and `getOptions` dependencies
9
9
  */
10
- export declare function splitApiFactory(settings: ISettings, platform: Pick<IPlatform, 'getFetch' | 'getOptions'>): ISplitApi;
10
+ export declare function splitApiFactory(settings: Pick<ISettings, 'urls' | 'sync' | 'log' | 'version' | 'runtime' | 'core'>, platform: Pick<IPlatform, 'getFetch' | 'getOptions'>): ISplitApi;
@@ -34,3 +34,16 @@ export interface ISplitApi {
34
34
  postMetricsCounters: IPostMetricsCounters;
35
35
  postMetricsTimes: IPostMetricsTimes;
36
36
  }
37
+ interface EventSourceEventMap {
38
+ 'error': Event;
39
+ 'message': MessageEvent;
40
+ 'open': Event;
41
+ }
42
+ interface IEventSource {
43
+ addEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: IEventSource, ev: EventSourceEventMap[K]) => any): void;
44
+ close(): void;
45
+ }
46
+ export declare type IEventSourceConstructor = new (url: string, eventSourceInitDict?: {
47
+ headers?: object;
48
+ }) => IEventSource;
49
+ export {};
@@ -1,10 +1,10 @@
1
- import { IStorageSyncCS, IStorageFactoryParams } from '../types';
1
+ import { IStorageSync, IStorageFactoryParams } from '../types';
2
2
  /**
3
3
  * InMemory storage factory for standalone client-side SplitFactory
4
4
  *
5
5
  * @param params parameters required by EventsCacheSync
6
6
  */
7
- export declare function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorageSyncCS;
7
+ export declare function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorageSync;
8
8
  export declare namespace InMemoryStorageCSFactory {
9
9
  var type: import("../types").StorageType;
10
10
  }
@@ -1,4 +1,4 @@
1
- import { ICustomStorageWrapper, IEventsCacheAsync } from '../types';
1
+ import { IPluggableStorageWrapper, IEventsCacheAsync } from '../types';
2
2
  import { IMetadata } from '../../dtos/types';
3
3
  import { SplitIO } from '../../types';
4
4
  import { ILogger } from '../../logger/types';
@@ -8,7 +8,7 @@ export declare class EventsCachePluggable implements IEventsCacheAsync {
8
8
  private readonly wrapper;
9
9
  private readonly key;
10
10
  private readonly metadata;
11
- constructor(log: ILogger, key: string, wrapper: ICustomStorageWrapper, metadata: IMetadata);
11
+ constructor(log: ILogger, key: string, wrapper: IPluggableStorageWrapper, metadata: IMetadata);
12
12
  /**
13
13
  * Push given event to the storage.
14
14
  * @param eventData Event item to push.
@@ -1,4 +1,4 @@
1
- import { ICustomStorageWrapper, IImpressionsCacheAsync } from '../types';
1
+ import { IPluggableStorageWrapper, IImpressionsCacheAsync } from '../types';
2
2
  import { IMetadata } from '../../dtos/types';
3
3
  import { ImpressionDTO } from '../../types';
4
4
  import { ILogger } from '../../logger/types';
@@ -8,7 +8,7 @@ export declare class ImpressionsCachePluggable implements IImpressionsCacheAsync
8
8
  private readonly key;
9
9
  private readonly wrapper;
10
10
  private readonly metadata;
11
- constructor(log: ILogger, key: string, wrapper: ICustomStorageWrapper, metadata: IMetadata);
11
+ constructor(log: ILogger, key: string, wrapper: IPluggableStorageWrapper, metadata: IMetadata);
12
12
  /**
13
13
  * Push given impressions to the storage.
14
14
  * @param impressions List of impresions to push.
@@ -1,5 +1,5 @@
1
1
  import KeyBuilderSS from '../KeyBuilderSS';
2
- import { ICustomStorageWrapper, ISegmentsCacheAsync } from '../types';
2
+ import { IPluggableStorageWrapper, ISegmentsCacheAsync } from '../types';
3
3
  import { ILogger } from '../../logger/types';
4
4
  /**
5
5
  * ISegmentsCacheAsync implementation for pluggable storages.
@@ -8,19 +8,19 @@ export declare class SegmentsCachePluggable implements ISegmentsCacheAsync {
8
8
  private readonly log;
9
9
  private readonly keys;
10
10
  private readonly wrapper;
11
- constructor(log: ILogger, keys: KeyBuilderSS, wrapper: ICustomStorageWrapper);
11
+ constructor(log: ILogger, keys: KeyBuilderSS, wrapper: IPluggableStorageWrapper);
12
12
  /**
13
13
  * Add a list of `segmentKeys` to the given segment `name`.
14
14
  * The returned promise is resolved when the operation success
15
15
  * or rejected if wrapper operation fails.
16
16
  */
17
- addToSegment(name: string, segmentKeys: string[]): Promise<void>;
17
+ addToSegment(name: string, segmentKeys: string[]): Promise<boolean | void>;
18
18
  /**
19
19
  * Remove a list of `segmentKeys` from the given segment `name`.
20
20
  * The returned promise is resolved when the operation success
21
21
  * or rejected if wrapper operation fails.
22
22
  */
23
- removeFromSegment(name: string, segmentKeys: string[]): Promise<void>;
23
+ removeFromSegment(name: string, segmentKeys: string[]): Promise<boolean | void>;
24
24
  /**
25
25
  * Returns a promise that resolves with a boolean value indicating if `key` is part of `name` segment.
26
26
  * Promise can be rejected if wrapper operation fails.
@@ -43,7 +43,7 @@ export declare class SegmentsCachePluggable implements ISegmentsCacheAsync {
43
43
  * The returned promise is resolved when the operation success,
44
44
  * or rejected if it fails (e.g., wrapper operation fails).
45
45
  */
46
- registerSegments(segments: string[]): Promise<void>;
46
+ registerSegments(segments: string[]): Promise<boolean | void>;
47
47
  /**
48
48
  * Returns a promise that resolves with the set of registered segments in a list,
49
49
  * or rejected if it fails (e.g., wrapper operation fails).
@@ -1,5 +1,5 @@
1
1
  import KeyBuilder from '../KeyBuilder';
2
- import { ICustomStorageWrapper } from '../types';
2
+ import { IPluggableStorageWrapper } from '../types';
3
3
  import { ILogger } from '../../logger/types';
4
4
  import AbstractSplitsCacheAsync from '../AbstractSplitsCacheAsync';
5
5
  /**
@@ -10,12 +10,12 @@ export declare class SplitsCachePluggable extends AbstractSplitsCacheAsync {
10
10
  private readonly keys;
11
11
  private readonly wrapper;
12
12
  /**
13
- * Create a SplitsCache that uses a custom storage wrapper.
13
+ * Create a SplitsCache that uses a storage wrapper.
14
14
  * @param log Logger instance.
15
15
  * @param keys Key builder.
16
16
  * @param wrapper Adapted wrapper storage.
17
17
  */
18
- constructor(log: ILogger, keys: KeyBuilder, wrapper: ICustomStorageWrapper);
18
+ constructor(log: ILogger, keys: KeyBuilder, wrapper: IPluggableStorageWrapper);
19
19
  private _decrementCounts;
20
20
  private _incrementCounts;
21
21
  /**
@@ -1 +1 @@
1
- export declare const LOG_PREFIX = "storage:pluggable:";
1
+ export declare const LOG_PREFIX = "storage:pluggable: ";
@@ -1,10 +1,13 @@
1
- import { ICustomStorageWrapper } from '../types';
1
+ import { IPluggableStorageWrapper } from '../types';
2
2
  import { ISet } from '../../utils/lang/sets';
3
3
  /**
4
- * Creates a ICustomStorageWrapper implementation that stores items in memory.
4
+ * Creates a IPluggableStorageWrapper implementation that stores items in memory.
5
5
  * The `_cache` property is the object were items are stored.
6
6
  * Intended for testing purposes.
7
+ *
8
+ * @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves inmediatelly.
7
9
  */
8
- export declare function inMemoryWrapperFactory(): ICustomStorageWrapper & {
10
+ export declare function inMemoryWrapperFactory(connDelay?: number): IPluggableStorageWrapper & {
9
11
  _cache: Record<string, string | string[] | ISet<string>>;
12
+ _setConnDelay(connDelay: number): void;
10
13
  };
@@ -1,7 +1,7 @@
1
- import { ICustomStorageWrapper, IStorageAsyncFactory } from '../types';
1
+ import { IPluggableStorageWrapper, IStorageAsyncFactory } from '../types';
2
2
  export interface PluggableStorageOptions {
3
3
  prefix?: string;
4
- wrapper: ICustomStorageWrapper;
4
+ wrapper: IPluggableStorageWrapper;
5
5
  }
6
6
  /**
7
7
  * Pluggable storage factory for consumer server-side & client-side SplitFactory.
@@ -1,12 +1,12 @@
1
1
  import { ILogger } from '../../logger/types';
2
- import { ICustomStorageWrapper } from '../types';
2
+ import { IPluggableStorageWrapper } from '../types';
3
3
  export declare const METHODS_TO_PROMISE_WRAP: string[];
4
4
  /**
5
- * Adapter of the Custom Storage Wrapper.
5
+ * Adapter of the Pluggable Storage Wrapper.
6
6
  * Used to handle exceptions as rejected promises, in order to simplify the error handling on storages.
7
7
  *
8
8
  * @param log logger instance
9
- * @param wrapper custom storage wrapper to adapt
9
+ * @param wrapper storage wrapper to adapt
10
10
  * @returns an adapted version of the given storage wrapper
11
11
  */
12
- export declare function wrapperAdapter(log: ILogger, wrapper: ICustomStorageWrapper): ICustomStorageWrapper;
12
+ export declare function wrapperAdapter(log: ILogger, wrapper: IPluggableStorageWrapper): IPluggableStorageWrapper;
@@ -1,11 +1,11 @@
1
1
  import { MaybeThenable, IMetadata, ISplitFiltersValidation } from '../dtos/types';
2
2
  import { ILogger } from '../logger/types';
3
3
  import { StoredEventWithMetadata, StoredImpressionWithMetadata } from '../sync/submitters/types';
4
- import { SplitIO, ImpressionDTO } from '../types';
4
+ import { SplitIO, ImpressionDTO, SDKMode } from '../types';
5
5
  /**
6
- * Interface of a custom wrapper storage.
6
+ * Interface of a pluggable storage wrapper.
7
7
  */
8
- export interface ICustomStorageWrapper {
8
+ export interface IPluggableStorageWrapper {
9
9
  /** Key-Value operations */
10
10
  /**
11
11
  * Get the value of given `key`.
@@ -25,7 +25,7 @@ export interface ICustomStorageWrapper {
25
25
  * @returns {Promise<void>} A promise that resolves if the operation success, whether the key was added or updated.
26
26
  * The promise rejects if the operation fails.
27
27
  */
28
- set: (key: string, value: string) => Promise<void | boolean>;
28
+ set: (key: string, value: string) => Promise<boolean | void>;
29
29
  /**
30
30
  * Add or update an item with a specified `key` and `value`.
31
31
  *
@@ -44,7 +44,7 @@ export interface ICustomStorageWrapper {
44
44
  * @returns {Promise<void>} A promise that resolves if the operation success, whether the key existed and was removed or it didn't exist.
45
45
  * The promise rejects if the operation fails, for example, if there is a connection error.
46
46
  */
47
- del: (key: string) => Promise<void | boolean>;
47
+ del: (key: string) => Promise<boolean | void>;
48
48
  /**
49
49
  * Returns all keys matching the given prefix.
50
50
  *
@@ -131,20 +131,20 @@ export interface ICustomStorageWrapper {
131
131
  * @function addItems
132
132
  * @param {string} key Set key
133
133
  * @param {string} items Items to add
134
- * @returns {Promise<void>} A promise that resolves if the operation success.
134
+ * @returns {Promise<boolean | void>} A promise that resolves if the operation success.
135
135
  * The promise rejects if the operation fails, for example, if there is a connection error or the key holds a value that is not a set.
136
136
  */
137
- addItems: (key: string, items: string[]) => Promise<void>;
137
+ addItems: (key: string, items: string[]) => Promise<boolean | void>;
138
138
  /**
139
139
  * Remove the specified `items` from the set stored at `key`. Those items that are not part of the set are ignored.
140
140
  *
141
141
  * @function removeItems
142
142
  * @param {string} key Set key
143
143
  * @param {string} items Items to remove
144
- * @returns {Promise<void>} A promise that resolves if the operation success. If key does not exist, the promise also resolves.
144
+ * @returns {Promise<boolean | void>} A promise that resolves if the operation success. If key does not exist, the promise also resolves.
145
145
  * The promise rejects if the operation fails, for example, if there is a connection error or the key holds a value that is not a set.
146
146
  */
147
- removeItems: (key: string, items: string[]) => Promise<void>;
147
+ removeItems: (key: string, items: string[]) => Promise<boolean | void>;
148
148
  /**
149
149
  * Returns all the items of the `key` set.
150
150
  *
@@ -158,7 +158,7 @@ export interface ICustomStorageWrapper {
158
158
  /**
159
159
  * Connects to the underlying storage.
160
160
  * It is meant for storages that requires to be connected to some database or server. Otherwise it can just return a resolved promise.
161
- * Note: will be called once on SplitFactory instantiation.
161
+ * Note: will be called once on SplitFactory instantiation and once per each shared client instantiation.
162
162
  *
163
163
  * @function connect
164
164
  * @returns {Promise<void>} A promise that resolves when the wrapper successfully connect to the underlying storage.
@@ -166,15 +166,15 @@ export interface ICustomStorageWrapper {
166
166
  */
167
167
  connect: () => Promise<void>;
168
168
  /**
169
- * Disconnects the underlying storage.
169
+ * Disconnects from the underlying storage.
170
170
  * It is meant for storages that requires to be closed, in order to release resources. Otherwise it can just return a resolved promise.
171
- * Note: will be called once on SplitFactory client destroy.
171
+ * Note: will be called once on SplitFactory main client destroy.
172
172
  *
173
- * @function close
173
+ * @function disconnect
174
174
  * @returns {Promise<void>} A promise that resolves when the operation ends.
175
175
  * The promise never rejects.
176
176
  */
177
- close: () => Promise<void>;
177
+ disconnect: () => Promise<void>;
178
178
  }
179
179
  /** Splits cache */
180
180
  export interface ISplitsCacheBase {
@@ -247,7 +247,7 @@ export interface ISegmentsCacheSync extends ISegmentsCacheBase {
247
247
  export interface ISegmentsCacheAsync extends ISegmentsCacheBase {
248
248
  addToSegment(name: string, segmentKeys: string[]): Promise<boolean | void>;
249
249
  removeFromSegment(name: string, segmentKeys: string[]): Promise<boolean | void>;
250
- isInSegment(name: string, key?: string): Promise<boolean>;
250
+ isInSegment(name: string, key: string): Promise<boolean>;
251
251
  registerSegments(names: string[]): Promise<boolean | void>;
252
252
  getRegisteredSegments(): Promise<string[]>;
253
253
  setChangeNumber(name: string, changeNumber: number): Promise<boolean | void>;
@@ -326,13 +326,11 @@ export interface IStorageBase<TSplitsCache extends ISplitsCacheBase, TSegmentsCa
326
326
  events: TEventsCache;
327
327
  latencies?: TLatenciesCache;
328
328
  counts?: TCountsCache;
329
- destroy(): void;
329
+ destroy(): void | Promise<void>;
330
+ shared?: (matchingKey: string, onReadyCb: (error?: any) => void) => this;
330
331
  }
331
332
  export declare type IStorageSync = IStorageBase<ISplitsCacheSync, ISegmentsCacheSync, IImpressionsCacheSync, IEventsCacheSync, ILatenciesCacheSync, ICountsCacheSync>;
332
- export interface IStorageSyncCS extends IStorageSync {
333
- shared(matchingKey: string): IStorageSync;
334
- }
335
- export declare type IStorageAsync = IStorageBase<ISplitsCacheAsync, ISegmentsCacheAsync, IImpressionsCacheAsync, IEventsCacheAsync, ILatenciesCacheAsync, ICountsCacheAsync>;
333
+ export declare type IStorageAsync = IStorageBase<ISplitsCacheAsync, ISegmentsCacheAsync, IImpressionsCacheAsync | IImpressionsCacheSync, IEventsCacheAsync | IEventsCacheSync, ILatenciesCacheAsync, ICountsCacheAsync>;
336
334
  /** StorageFactory */
337
335
  export declare type DataLoader = (storage: IStorageSync, matchingKey: string) => void;
338
336
  export interface IStorageFactoryParams {
@@ -341,10 +339,11 @@ export interface IStorageFactoryParams {
341
339
  optimize?: boolean;
342
340
  matchingKey?: string;
343
341
  splitFiltersValidation?: ISplitFiltersValidation;
344
- onReadyCb?: (error?: any) => void;
342
+ mode?: SDKMode;
343
+ onReadyCb: (error?: any) => void;
345
344
  metadata: IMetadata;
346
345
  }
347
- export declare type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'CUSTOM';
346
+ export declare type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'PLUGGABLE';
348
347
  export declare type IStorageSyncFactory = {
349
348
  type: StorageType;
350
349
  (params: IStorageFactoryParams): IStorageSync;
@@ -1,3 +1,4 @@
1
+ import { IEventSourceConstructor } from '../../../services/types';
1
2
  import { ISettings } from '../../../types';
2
3
  import { IAuthTokenPushEnabled } from '../AuthClient/types';
3
4
  import { ISSEClient, ISseEventHandler } from './types';
@@ -5,9 +6,9 @@ import { ISSEClient, ISseEventHandler } from './types';
5
6
  * Handles streaming connections with EventSource API
6
7
  */
7
8
  export default class SSEClient implements ISSEClient {
8
- eventSource: typeof EventSource;
9
+ eventSource?: IEventSourceConstructor;
9
10
  streamingUrl: string;
10
- connection?: InstanceType<typeof EventSource>;
11
+ connection?: InstanceType<IEventSourceConstructor>;
11
12
  handler?: ISseEventHandler;
12
13
  useHeaders?: boolean;
13
14
  headers: Record<string, string>;
@@ -19,7 +20,7 @@ export default class SSEClient implements ISSEClient {
19
20
  * @param getEventSource Function to get the EventSource constructor.
20
21
  * @throws 'EventSource API is not available. ' if EventSource is not available.
21
22
  */
22
- constructor(settings: ISettings, useHeaders?: boolean, getEventSource?: () => (typeof EventSource | undefined));
23
+ constructor(settings: ISettings, useHeaders?: boolean, getEventSource?: () => (IEventSourceConstructor | undefined));
23
24
  setEventHandler(handler: ISseEventHandler): void;
24
25
  /**
25
26
  * Open the connection with a given authToken
@@ -0,0 +1,4 @@
1
+ import { ISplitApi } from '../../services/types';
2
+ import { IStorageSync } from '../../storages/types';
3
+ import { ISettings } from '../../types';
4
+ export declare function submitterManagerFactory(settings: ISettings, storage: IStorageSync, splitApi: ISplitApi): import("../types").ISyncTask<[], any>;
@@ -9,4 +9,4 @@ import { IPollingManager, IPollingManagerFactoryParams } from './polling/types';
9
9
  * `pollingManagerSSFactory` or `pollingManagerCSFactory` respectively.
10
10
  * @param pushManagerFactory optional to build a SyncManager with or without streaming support
11
11
  */
12
- export declare function syncManagerOnlineFactory(pollingManagerFactory: (...args: IPollingManagerFactoryParams) => IPollingManager, pushManagerFactory?: (...args: IPushManagerFactoryParams) => IPushManager | undefined): (params: ISyncManagerFactoryParams) => ISyncManagerCS;
12
+ export declare function syncManagerOnlineFactory(pollingManagerFactory?: (...args: IPollingManagerFactoryParams) => IPollingManager, pushManagerFactory?: (...args: IPushManagerFactoryParams) => IPushManager | undefined): (params: ISyncManagerFactoryParams) => ISyncManagerCS;
@@ -41,7 +41,7 @@ export interface ISyncManager extends ITask {
41
41
  pushManager?: IPushManager;
42
42
  }
43
43
  export interface ISyncManagerCS extends ISyncManager {
44
- shared(matchingKey: string, readinessManager: IReadinessManager, storage: IStorageSync): ISyncManager;
44
+ shared(matchingKey: string, readinessManager: IReadinessManager, storage: IStorageSync): ISyncManager | undefined;
45
45
  }
46
46
  export interface ISyncManagerFactoryParams {
47
47
  settings: ISettings;
@@ -1,6 +1,6 @@
1
1
  import { ImpressionDTO } from '../../types';
2
2
  import { IImpressionObserver } from './types';
3
- export default class ImpressionObserver<K extends string | number> implements IImpressionObserver {
3
+ export default class ImpressionObserver<K extends string | number = string> implements IImpressionObserver {
4
4
  private cache;
5
5
  private hasher;
6
6
  constructor(size: number, hasher: (impression: ImpressionDTO) => K);
package/types/types.d.ts CHANGED
@@ -1,19 +1,19 @@
1
- /// <reference types="node" />
2
1
  import { ISplitFiltersValidation } from './dtos/types';
3
2
  import { IIntegration, IIntegrationFactoryParams } from './integrations/types';
4
3
  import { ILogger } from './logger/types';
5
- import { IStorageFactoryParams, IStorageSyncCS, IStorageSync, IStorageAsync, IStorageSyncFactory } from './storages/types';
4
+ import { IStorageFactoryParams, IStorageSync, IStorageAsync, IStorageSyncFactory, IStorageAsyncFactory } from './storages/types';
6
5
  import { ISyncManagerFactoryParams, ISyncManagerCS } from './sync/types';
7
6
  /**
8
- * EventEmitter interface with the minimal methods used by the SDK
7
+ * Reduced version of NodeJS.EventEmitter interface with the minimal methods used by the SDK
8
+ * @see {@link https://nodejs.org/api/events.html}
9
9
  */
10
- export interface IEventEmitter extends Pick<NodeJS.EventEmitter, 'addListener' | 'on' | 'once' | 'removeListener' | 'off' | 'removeAllListeners' | 'emit'> {
11
- addListener(event: string, listener: (...args: any[]) => void): any;
12
- on(event: string, listener: (...args: any[]) => void): any;
13
- once(event: string, listener: (...args: any[]) => void): any;
14
- removeListener(event: string, listener: (...args: any[]) => void): any;
15
- off(event: string, listener: (...args: any[]) => void): any;
16
- removeAllListeners(event?: string): any;
10
+ export interface IEventEmitter {
11
+ addListener(event: string, listener: (...args: any[]) => void): this;
12
+ on(event: string, listener: (...args: any[]) => void): this;
13
+ once(event: string, listener: (...args: any[]) => void): this;
14
+ removeListener(event: string, listener: (...args: any[]) => void): this;
15
+ off(event: string, listener: (...args: any[]) => void): this;
16
+ removeAllListeners(event?: string): this;
17
17
  emit(event: string, ...args: any[]): boolean;
18
18
  }
19
19
  /**
@@ -47,7 +47,7 @@ declare type EventConsts = {
47
47
  * SDK Modes.
48
48
  * @typedef {string} SDKMode
49
49
  */
50
- export declare type SDKMode = 'standalone' | 'consumer' | 'localhost';
50
+ export declare type SDKMode = 'standalone' | 'consumer' | 'localhost' | 'consumer_partial';
51
51
  /**
52
52
  * Settings interface. This is a representation of the settings the SDK expose, that's why
53
53
  * most of it's props are readonly. Only features should be rewritten when localhost mode is active.
@@ -80,7 +80,7 @@ export interface ISettings {
80
80
  retriesOnFailureBeforeReady: number;
81
81
  eventsFirstPushWindow: number;
82
82
  };
83
- readonly storage: IStorageSyncFactory;
83
+ readonly storage: IStorageSyncFactory | IStorageAsyncFactory;
84
84
  readonly integrations?: Array<(params: IIntegrationFactoryParams) => IIntegration | void>;
85
85
  readonly urls: {
86
86
  events: string;
@@ -88,7 +88,7 @@ export interface ISettings {
88
88
  auth: string;
89
89
  streaming: string;
90
90
  };
91
- readonly debug: boolean | LogLevel;
91
+ readonly debug: boolean | LogLevel | ILogger;
92
92
  readonly version: string;
93
93
  features: SplitIO.MockedFeaturesFilePath | SplitIO.MockedFeaturesMap;
94
94
  readonly streamingEnabled: boolean;
@@ -842,7 +842,7 @@ export declare namespace SplitIO {
842
842
  * Defines which kind of storage we should instanciate.
843
843
  * @property {Object} storage
844
844
  */
845
- storage?: (params: IStorageFactoryParams) => IStorageSyncCS;
845
+ storage?: (params: IStorageFactoryParams) => IStorageSync | IStorageAsync;
846
846
  /**
847
847
  * List of URLs that the SDK will use as base for it's synchronization functionalities, applicable only when running as standalone.
848
848
  * Do not change these settings unless you're working an advanced use case, like connecting to the Split proxy.
@@ -2,11 +2,11 @@ import { IEventEmitter } from '../types';
2
2
  export default class EventEmitter implements IEventEmitter {
3
3
  private listeners;
4
4
  private registerListener;
5
- addListener(type: string, listener: (...args: any[]) => void): EventEmitter;
6
- on(type: string, listener: (...args: any[]) => void): EventEmitter;
7
- once(type: string, listener: (...args: any[]) => void): EventEmitter;
8
- removeListener(type: string, listener: (...args: any[]) => void): EventEmitter;
9
- off(type: string, listener: (...args: any[]) => void): EventEmitter;
5
+ addListener(type: string, listener: (...args: any[]) => void): this;
6
+ on(type: string, listener: (...args: any[]) => void): this;
7
+ once(type: string, listener: (...args: any[]) => void): this;
8
+ removeListener(): void;
9
+ off(): void;
10
10
  emit(type: string, ...args: any[]): boolean;
11
- removeAllListeners(type?: string): EventEmitter;
11
+ removeAllListeners(type?: string): this;
12
12
  }
@@ -1,4 +1,5 @@
1
1
  import { StorageType } from '../../storages/types';
2
+ import { SDKMode } from '../../types';
2
3
  export declare const CONTROL = "control";
3
4
  export declare const CONTROL_WITH_CONFIG: {
4
5
  treatment: string;
@@ -10,11 +11,12 @@ export declare const SPLIT_IMPRESSION = "IMPRESSION";
10
11
  export declare const SPLIT_EVENT = "EVENT";
11
12
  export declare const DEBUG = "DEBUG";
12
13
  export declare const OPTIMIZED = "OPTIMIZED";
13
- export declare const LOCALHOST_MODE = "localhost";
14
- export declare const STANDALONE_MODE = "standalone";
14
+ export declare const LOCALHOST_MODE: SDKMode;
15
+ export declare const STANDALONE_MODE: SDKMode;
15
16
  export declare const PRODUCER_MODE = "producer";
16
- export declare const CONSUMER_MODE = "consumer";
17
+ export declare const CONSUMER_MODE: SDKMode;
18
+ export declare const CONSUMER_PARTIAL_MODE: SDKMode;
17
19
  export declare const STORAGE_MEMORY: StorageType;
18
20
  export declare const STORAGE_LOCALSTORAGE: StorageType;
19
21
  export declare const STORAGE_REDIS: StorageType;
20
- export declare const STORAGE_CUSTOM: StorageType;
22
+ export declare const STORAGE_PLUGGABLE: StorageType;
@@ -1 +1,5 @@
1
+ /**
2
+ * 'true' if running in Node.js, or 'false' otherwise.
3
+ * We check for version truthiness since most shims will have that as empty string.
4
+ */
1
5
  export declare const isNode: boolean;