@splitsoftware/splitio-commons 1.0.1-rc.1 → 1.0.1-rc.5
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/cjs/evaluator/index.js +3 -4
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/error.js +2 -1
- package/cjs/logger/messages/warn.js +0 -1
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/storages/inRedis/index.js +1 -2
- package/cjs/storages/pluggable/SplitsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/constants.js +1 -1
- package/cjs/storages/pluggable/inMemoryWrapper.js +3 -3
- package/cjs/storages/pluggable/index.js +6 -6
- package/cjs/storages/pluggable/wrapperAdapter.js +3 -3
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +1 -1
- package/cjs/sync/streaming/SSEClient/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +0 -1
- package/cjs/utils/MinEventEmitter.js +5 -5
- package/cjs/utils/MinEvents.js +13 -15
- package/cjs/utils/constants/index.js +2 -2
- package/cjs/utils/env/isNode.js +4 -1
- package/cjs/utils/settingsValidation/storage/storageCS.js +11 -8
- package/esm/evaluator/index.js +3 -4
- package/esm/logger/constants.js +3 -3
- package/esm/logger/messages/error.js +2 -1
- package/esm/logger/messages/warn.js +0 -1
- package/esm/sdkFactory/index.js +1 -1
- package/esm/storages/inRedis/index.js +1 -2
- package/esm/storages/pluggable/SplitsCachePluggable.js +1 -1
- package/esm/storages/pluggable/constants.js +1 -1
- package/esm/storages/pluggable/inMemoryWrapper.js +3 -3
- package/esm/storages/pluggable/index.js +7 -7
- package/esm/storages/pluggable/wrapperAdapter.js +3 -3
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +1 -1
- package/esm/sync/streaming/SSEClient/index.js +0 -1
- package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +0 -1
- package/esm/utils/MinEventEmitter.js +5 -5
- package/esm/utils/MinEvents.js +2 -5
- package/esm/utils/constants/index.js +1 -1
- package/esm/utils/env/isNode.js +4 -1
- package/esm/utils/settingsValidation/storage/storageCS.js +13 -10
- package/package.json +3 -4
- package/src/evaluator/index.ts +3 -4
- package/src/logger/constants.ts +3 -3
- package/src/logger/messages/error.ts +2 -1
- package/src/logger/messages/warn.ts +0 -1
- package/src/sdkFactory/index.ts +1 -1
- package/src/sdkFactory/types.ts +2 -2
- package/src/services/splitApi.ts +4 -1
- package/src/services/types.ts +16 -2
- package/src/storages/inRedis/index.ts +1 -1
- package/src/storages/pluggable/EventsCachePluggable.ts +3 -3
- package/src/storages/pluggable/ImpressionsCachePluggable.ts +3 -3
- package/src/storages/pluggable/SegmentsCachePluggable.ts +3 -3
- package/src/storages/pluggable/SplitsCachePluggable.ts +4 -4
- package/src/storages/pluggable/constants.ts +1 -1
- package/src/storages/pluggable/inMemoryWrapper.ts +5 -5
- package/src/storages/pluggable/index.ts +10 -10
- package/src/storages/pluggable/wrapperAdapter.ts +5 -5
- package/src/storages/types.ts +7 -7
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +1 -1
- package/src/sync/streaming/SSEClient/index.ts +5 -5
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +0 -1
- package/src/trackers/impressionObserver/ImpressionObserver.ts +1 -1
- package/src/types.ts +10 -9
- package/src/utils/MinEventEmitter.ts +10 -10
- package/src/utils/MinEvents.ts +2 -7
- package/src/utils/constants/index.ts +1 -1
- package/src/utils/env/isNode.ts +4 -1
- package/src/utils/settingsValidation/storage/storageCS.ts +12 -8
- package/types/logger/constants.d.ts +3 -3
- package/types/sdkFactory/types.d.ts +2 -2
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/types.d.ts +11 -0
- package/types/storages/pluggable/EventsCachePluggable.d.ts +2 -2
- package/types/storages/pluggable/ImpressionsCachePluggable.d.ts +2 -2
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +2 -2
- package/types/storages/pluggable/SplitsCachePluggable.d.ts +3 -3
- package/types/storages/pluggable/constants.d.ts +1 -1
- package/types/storages/pluggable/inMemoryWrapper.d.ts +3 -3
- package/types/storages/pluggable/index.d.ts +2 -2
- package/types/storages/pluggable/wrapperAdapter.d.ts +4 -4
- package/types/storages/types.d.ts +6 -6
- package/types/sync/streaming/SSEClient/index.d.ts +4 -3
- package/types/trackers/impressionObserver/ImpressionObserver.d.ts +1 -1
- package/types/types.d.ts +10 -10
- package/types/utils/MinEventEmitter.d.ts +6 -6
- package/types/utils/MinEvents.d.ts +3 -2
- package/types/utils/constants/index.d.ts +1 -1
- package/types/utils/env/isNode.d.ts +4 -0
- package/types/utils/settingsValidation/storage/storageCS.d.ts +3 -1
|
@@ -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';
|
|
@@ -31,9 +32,9 @@ function buildSSEHeaders(settings: ISettings) {
|
|
|
31
32
|
*/
|
|
32
33
|
export default class SSEClient implements ISSEClient {
|
|
33
34
|
// Instance properties:
|
|
34
|
-
eventSource
|
|
35
|
+
eventSource?: IEventSourceConstructor;
|
|
35
36
|
streamingUrl: string;
|
|
36
|
-
connection?: InstanceType<
|
|
37
|
+
connection?: InstanceType<IEventSourceConstructor>;
|
|
37
38
|
handler?: ISseEventHandler;
|
|
38
39
|
useHeaders?: boolean;
|
|
39
40
|
headers: Record<string, string>;
|
|
@@ -46,8 +47,7 @@ export default class SSEClient implements ISSEClient {
|
|
|
46
47
|
* @param getEventSource Function to get the EventSource constructor.
|
|
47
48
|
* @throws 'EventSource API is not available. ' if EventSource is not available.
|
|
48
49
|
*/
|
|
49
|
-
constructor(settings: ISettings, useHeaders?: boolean, getEventSource?: () => (
|
|
50
|
-
// @ts-expect-error
|
|
50
|
+
constructor(settings: ISettings, useHeaders?: boolean, getEventSource?: () => (IEventSourceConstructor | undefined)) {
|
|
51
51
|
this.eventSource = getEventSource && getEventSource();
|
|
52
52
|
// if eventSource is not available, throw an exception
|
|
53
53
|
if (!this.eventSource) throw new Error('EventSource API is not available. ');
|
|
@@ -79,7 +79,7 @@ export default class SSEClient implements ISSEClient {
|
|
|
79
79
|
).join(',');
|
|
80
80
|
const url = `${this.streamingUrl}?channels=${channelsQueryParam}&accessToken=${authToken.token}&v=${VERSION}&heartbeats=true`; // same results using `&heartbeats=false`
|
|
81
81
|
|
|
82
|
-
this.connection = new this.eventSource(
|
|
82
|
+
this.connection = new this.eventSource!(
|
|
83
83
|
// For client-side SDKs, SplitSDKClientKey and SplitSDKClientKey metadata is passed as query params,
|
|
84
84
|
// because native EventSource implementations for browser doesn't support headers.
|
|
85
85
|
this.useHeaders ? url : url + `&SplitSDKVersion=${this.headers.SplitSDKVersion}&SplitSDKClientKey=${this.headers.SplitSDKClientKey}`,
|
|
@@ -83,7 +83,6 @@ export default class SplitsUpdateWorker implements IUpdateWorker {
|
|
|
83
83
|
* @param {string} defaultTreatment default treatment value
|
|
84
84
|
*/
|
|
85
85
|
killSplit({ changeNumber, splitName, defaultTreatment }: ISplitKillData) {
|
|
86
|
-
// @TODO handle retry due to errors in storage, once we allow the definition of custom async storages
|
|
87
86
|
if (this.splitsCache.killLocally(splitName, defaultTreatment, changeNumber)) {
|
|
88
87
|
// trigger an SDK_UPDATE if Split was killed locally
|
|
89
88
|
this.splitsEventEmitter.emit(SDK_SPLITS_ARRIVED, true);
|
|
@@ -2,7 +2,7 @@ import { ImpressionDTO } from '../../types';
|
|
|
2
2
|
import LRUCache from '../../utils/LRUCache';
|
|
3
3
|
import { IImpressionObserver } from './types';
|
|
4
4
|
|
|
5
|
-
export default class ImpressionObserver<K extends string | number> implements IImpressionObserver {
|
|
5
|
+
export default class ImpressionObserver<K extends string | number = string> implements IImpressionObserver {
|
|
6
6
|
private cache: LRUCache<K, number>;
|
|
7
7
|
private hasher: (impression: ImpressionDTO) => K;
|
|
8
8
|
|
package/src/types.ts
CHANGED
|
@@ -7,15 +7,16 @@ import { IStorageFactoryParams, IStorageSync, IStorageAsync, IStorageSyncFactory
|
|
|
7
7
|
import { ISyncManagerFactoryParams, ISyncManagerCS } from './sync/types';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* EventEmitter interface with the minimal methods used by the SDK
|
|
10
|
+
* Reduced version of NodeJS.EventEmitter interface with the minimal methods used by the SDK
|
|
11
|
+
* @see {@link https://nodejs.org/api/events.html}
|
|
11
12
|
*/
|
|
12
|
-
export interface IEventEmitter
|
|
13
|
-
addListener(event: string, listener: (...args: any[]) => void):
|
|
14
|
-
on(event: string, listener: (...args: any[]) => void):
|
|
15
|
-
once(event: string, listener: (...args: any[]) => void):
|
|
16
|
-
removeListener(event: string, listener: (...args: any[]) => void):
|
|
17
|
-
off(event: string, listener: (...args: any[]) => void):
|
|
18
|
-
removeAllListeners(event?: string):
|
|
13
|
+
export interface IEventEmitter {
|
|
14
|
+
addListener(event: string, listener: (...args: any[]) => void): this;
|
|
15
|
+
on(event: string, listener: (...args: any[]) => void): this
|
|
16
|
+
once(event: string, listener: (...args: any[]) => void): this
|
|
17
|
+
removeListener(event: string, listener: (...args: any[]) => void): this;
|
|
18
|
+
off(event: string, listener: (...args: any[]) => void): this;
|
|
19
|
+
removeAllListeners(event?: string): this
|
|
19
20
|
emit(event: string, ...args: any[]): boolean
|
|
20
21
|
}
|
|
21
22
|
|
|
@@ -93,7 +94,7 @@ export interface ISettings {
|
|
|
93
94
|
auth: string,
|
|
94
95
|
streaming: string
|
|
95
96
|
},
|
|
96
|
-
readonly debug: boolean | LogLevel,
|
|
97
|
+
readonly debug: boolean | LogLevel | ILogger,
|
|
97
98
|
readonly version: string,
|
|
98
99
|
features: SplitIO.MockedFeaturesFilePath | SplitIO.MockedFeaturesMap,
|
|
99
100
|
readonly streamingEnabled: boolean,
|
|
@@ -18,7 +18,7 @@ export default class EventEmitter implements IEventEmitter {
|
|
|
18
18
|
boolean // whether it is a one-time listener or not
|
|
19
19
|
]>> = {};
|
|
20
20
|
|
|
21
|
-
private registerListener(type: string, listener: (...args: any[]) => void, oneTime: boolean)
|
|
21
|
+
private registerListener(type: string, listener: (...args: any[]) => void, oneTime: boolean) {
|
|
22
22
|
checkListener(listener);
|
|
23
23
|
|
|
24
24
|
// To avoid recursion in the case that type === "newListener" before
|
|
@@ -33,27 +33,27 @@ export default class EventEmitter implements IEventEmitter {
|
|
|
33
33
|
return this;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
addListener(type: string, listener: (...args: any[]) => void)
|
|
36
|
+
addListener(type: string, listener: (...args: any[]) => void) {
|
|
37
37
|
return this.registerListener(type, listener, false);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// alias of addListener
|
|
41
|
-
on(type: string, listener: (...args: any[]) => void)
|
|
41
|
+
on(type: string, listener: (...args: any[]) => void) {
|
|
42
42
|
return this.addListener(type, listener);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
once(type: string, listener: (...args: any[]) => void)
|
|
45
|
+
once(type: string, listener: (...args: any[]) => void) {
|
|
46
46
|
return this.registerListener(type, listener, true);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
//
|
|
50
|
-
removeListener(type: string, listener: (...args: any[]) => void)
|
|
49
|
+
// @ts-ignore
|
|
50
|
+
removeListener(/* type: string, listener: (...args: any[]) => void */) {
|
|
51
51
|
throw new Error('Method not implemented.');
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
// alias of removeListener
|
|
55
|
-
off(type: string, listener: (...args: any[]) => void)
|
|
56
|
-
return this.removeListener(type, listener);
|
|
54
|
+
// @ts-ignore alias of removeListener
|
|
55
|
+
off(/* type: string, listener: (...args: any[]) => void */) {
|
|
56
|
+
return this.removeListener(/* type, listener */);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
emit(type: string, ...args: any[]): boolean {
|
|
@@ -68,7 +68,7 @@ export default class EventEmitter implements IEventEmitter {
|
|
|
68
68
|
return true;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
removeAllListeners(type?: string)
|
|
71
|
+
removeAllListeners(type?: string) {
|
|
72
72
|
if (!this.listeners[REMOVE_LISTENER_EVENT]) {
|
|
73
73
|
// if not listening for `removeListener`, no need to emit
|
|
74
74
|
if (type) {
|
package/src/utils/MinEvents.ts
CHANGED
|
@@ -39,14 +39,9 @@ var ReflectApply = R && typeof R.apply === 'function'
|
|
|
39
39
|
return Function.prototype.apply.call(target, receiver, args);
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
-
function EventEmitter() {
|
|
42
|
+
export const EventEmitter: { new(): IEventEmitter } = function EventEmitter() {
|
|
43
43
|
EventEmitter.init.call(this);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export default EventEmitter as new () => IEventEmitter;
|
|
47
|
-
|
|
48
|
-
// Backwards-compat with node 0.10.x
|
|
49
|
-
EventEmitter.EventEmitter = EventEmitter;
|
|
44
|
+
};
|
|
50
45
|
|
|
51
46
|
EventEmitter.prototype._events = undefined;
|
|
52
47
|
EventEmitter.prototype._eventsCount = 0;
|
|
@@ -31,4 +31,4 @@ export const CONSUMER_PARTIAL_MODE: SDKMode = 'consumer_partial';
|
|
|
31
31
|
export const STORAGE_MEMORY: StorageType = 'MEMORY';
|
|
32
32
|
export const STORAGE_LOCALSTORAGE: StorageType = 'LOCALSTORAGE';
|
|
33
33
|
export const STORAGE_REDIS: StorageType = 'REDIS';
|
|
34
|
-
export const
|
|
34
|
+
export const STORAGE_PLUGGABLE: StorageType = 'PLUGGABLE';
|
package/src/utils/env/isNode.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
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,8 +1,8 @@
|
|
|
1
1
|
import { InMemoryStorageCSFactory } from '../../../storages/inMemory/InMemoryStorageCS';
|
|
2
2
|
import { ISettings, SDKMode } from '../../../types';
|
|
3
3
|
import { ILogger } from '../../../logger/types';
|
|
4
|
-
import {
|
|
5
|
-
import { LOCALHOST_MODE, STANDALONE_MODE,
|
|
4
|
+
import { ERROR_STORAGE_INVALID } from '../../../logger/constants';
|
|
5
|
+
import { LOCALHOST_MODE, STANDALONE_MODE, STORAGE_PLUGGABLE, STORAGE_LOCALSTORAGE, STORAGE_MEMORY } from '../../../utils/constants';
|
|
6
6
|
import { IStorageFactoryParams, IStorageSync } from '../../../storages/types';
|
|
7
7
|
|
|
8
8
|
export function __InLocalStorageMockFactory(params: IStorageFactoryParams): IStorageSync {
|
|
@@ -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.
|
|
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
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_MEMORY, STORAGE_LOCALSTORAGE,
|
|
28
|
+
if (typeof storage !== 'function' || [STORAGE_MEMORY, STORAGE_LOCALSTORAGE, STORAGE_PLUGGABLE].indexOf(storage.type) === -1) {
|
|
27
29
|
storage = InMemoryStorageCSFactory;
|
|
28
|
-
log.
|
|
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,13 +35,15 @@ export function validateStorageCS(settings: { log: ILogger, storage?: any, mode:
|
|
|
33
35
|
return __InLocalStorageMockFactory;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
// @TODO check behaviour
|
|
37
38
|
if ([LOCALHOST_MODE, STANDALONE_MODE].indexOf(mode) === -1) {
|
|
38
39
|
// Consumer modes require an async storage
|
|
39
|
-
if (storage.type !==
|
|
40
|
+
if (storage.type !== STORAGE_PLUGGABLE) throw new Error('A PluggableStorage instance is required on consumer mode');
|
|
40
41
|
} else {
|
|
41
42
|
// Standalone and localhost modes require a sync storage
|
|
42
|
-
if (storage.type ===
|
|
43
|
+
if (storage.type === STORAGE_PLUGGABLE) {
|
|
44
|
+
storage = InMemoryStorageCSFactory;
|
|
45
|
+
log.error(ERROR_STORAGE_INVALID, [' It requires consumer mode.']);
|
|
46
|
+
}
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
// return default InMemory storage if provided one is not valid
|
|
@@ -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
|
|
93
|
-
export declare const
|
|
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?: () => (
|
|
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,14 @@ 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?: any) => IEventSource;
|
|
47
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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:
|
|
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 {
|
|
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:
|
|
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 {
|
|
2
|
+
import { IPluggableStorageWrapper, ISegmentsCacheAsync } from '../types';
|
|
3
3
|
import { ILogger } from '../../logger/types';
|
|
4
4
|
/**
|
|
5
5
|
* ISegmentsCacheAsync implementation for pluggable storages.
|
|
@@ -8,7 +8,7 @@ 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:
|
|
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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import KeyBuilder from '../KeyBuilder';
|
|
2
|
-
import {
|
|
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
|
|
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:
|
|
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,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IPluggableStorageWrapper } from '../types';
|
|
2
2
|
import { ISet } from '../../utils/lang/sets';
|
|
3
3
|
/**
|
|
4
|
-
* Creates a
|
|
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
7
|
*
|
|
8
8
|
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves inmediatelly.
|
|
9
9
|
*/
|
|
10
|
-
export declare function inMemoryWrapperFactory(connDelay?: number):
|
|
10
|
+
export declare function inMemoryWrapperFactory(connDelay?: number): IPluggableStorageWrapper & {
|
|
11
11
|
_cache: Record<string, string | string[] | ISet<string>>;
|
|
12
12
|
_setConnDelay(connDelay: number): void;
|
|
13
13
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IPluggableStorageWrapper, IStorageAsyncFactory } from '../types';
|
|
2
2
|
export interface PluggableStorageOptions {
|
|
3
3
|
prefix?: string;
|
|
4
|
-
wrapper:
|
|
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 {
|
|
2
|
+
import { IPluggableStorageWrapper } from '../types';
|
|
3
3
|
export declare const METHODS_TO_PROMISE_WRAP: string[];
|
|
4
4
|
/**
|
|
5
|
-
* Adapter of the
|
|
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
|
|
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:
|
|
12
|
+
export declare function wrapperAdapter(log: ILogger, wrapper: IPluggableStorageWrapper): IPluggableStorageWrapper;
|
|
@@ -3,9 +3,9 @@ import { ILogger } from '../logger/types';
|
|
|
3
3
|
import { StoredEventWithMetadata, StoredImpressionWithMetadata } from '../sync/submitters/types';
|
|
4
4
|
import { SplitIO, ImpressionDTO, SDKMode } from '../types';
|
|
5
5
|
/**
|
|
6
|
-
* Interface of a
|
|
6
|
+
* Interface of a pluggable storage wrapper.
|
|
7
7
|
*/
|
|
8
|
-
export interface
|
|
8
|
+
export interface IPluggableStorageWrapper {
|
|
9
9
|
/** Key-Value operations */
|
|
10
10
|
/**
|
|
11
11
|
* Get the value of given `key`.
|
|
@@ -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
171
|
* Note: will be called once on SplitFactory main client destroy.
|
|
172
172
|
*
|
|
173
|
-
* @function
|
|
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
|
-
|
|
177
|
+
disconnect: () => Promise<void>;
|
|
178
178
|
}
|
|
179
179
|
/** Splits cache */
|
|
180
180
|
export interface ISplitsCacheBase {
|
|
@@ -343,7 +343,7 @@ export interface IStorageFactoryParams {
|
|
|
343
343
|
onReadyCb: (error?: any) => void;
|
|
344
344
|
metadata: IMetadata;
|
|
345
345
|
}
|
|
346
|
-
export declare type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | '
|
|
346
|
+
export declare type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'PLUGGABLE';
|
|
347
347
|
export declare type IStorageSyncFactory = {
|
|
348
348
|
type: StorageType;
|
|
349
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
|
|
9
|
+
eventSource?: IEventSourceConstructor;
|
|
9
10
|
streamingUrl: string;
|
|
10
|
-
connection?: InstanceType<
|
|
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?: () => (
|
|
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
|
|
@@ -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
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
|
|
11
|
-
addListener(event: string, listener: (...args: any[]) => void):
|
|
12
|
-
on(event: string, listener: (...args: any[]) => void):
|
|
13
|
-
once(event: string, listener: (...args: any[]) => void):
|
|
14
|
-
removeListener(event: string, listener: (...args: any[]) => void):
|
|
15
|
-
off(event: string, listener: (...args: any[]) => void):
|
|
16
|
-
removeAllListeners(event?: string):
|
|
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
|
/**
|
|
@@ -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;
|
|
@@ -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):
|
|
6
|
-
on(type: string, listener: (...args: any[]) => void):
|
|
7
|
-
once(type: string, listener: (...args: any[]) => void):
|
|
8
|
-
removeListener(
|
|
9
|
-
off(
|
|
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):
|
|
11
|
+
removeAllListeners(type?: string): this;
|
|
12
12
|
}
|
|
@@ -19,4 +19,4 @@ export declare const CONSUMER_PARTIAL_MODE: SDKMode;
|
|
|
19
19
|
export declare const STORAGE_MEMORY: StorageType;
|
|
20
20
|
export declare const STORAGE_LOCALSTORAGE: StorageType;
|
|
21
21
|
export declare const STORAGE_REDIS: StorageType;
|
|
22
|
-
export declare const
|
|
22
|
+
export declare const STORAGE_PLUGGABLE: StorageType;
|
|
@@ -10,7 +10,9 @@ export declare namespace __InLocalStorageMockFactory {
|
|
|
10
10
|
*
|
|
11
11
|
* @param {any} settings config object provided by the user to initialize the sdk
|
|
12
12
|
*
|
|
13
|
-
* @returns {Object} valid storage factory.
|
|
13
|
+
* @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
|
|
14
|
+
*
|
|
15
|
+
* @throws error if mode is consumer and the provided storage is not compatible
|
|
14
16
|
*/
|
|
15
17
|
export declare function validateStorageCS(settings: {
|
|
16
18
|
log: ILogger;
|