@splitsoftware/splitio-commons 1.10.1-rc.3 → 1.10.1-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGES.txt +1 -0
  2. package/cjs/readiness/readinessManager.js +5 -0
  3. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +1 -1
  4. package/esm/readiness/readinessManager.js +5 -0
  5. package/esm/sync/polling/updaters/segmentChangesUpdater.js +1 -1
  6. package/package.json +1 -1
  7. package/src/readiness/readinessManager.ts +5 -0
  8. package/src/readiness/types.ts +1 -0
  9. package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
  10. package/types/readiness/types.d.ts +1 -0
  11. package/types/sdkClient/identity.d.ts +6 -0
  12. package/types/utils/inputValidation/sdkKey.d.ts +7 -0
  13. package/types/myLogger.d.ts +0 -5
  14. package/types/sdkClient/types.d.ts +0 -18
  15. package/types/storages/inMemory/CountsCacheInMemory.d.ts +0 -20
  16. package/types/storages/inMemory/LatenciesCacheInMemory.d.ts +0 -20
  17. package/types/storages/inRedis/CountsCacheInRedis.d.ts +0 -9
  18. package/types/storages/inRedis/LatenciesCacheInRedis.d.ts +0 -9
  19. package/types/storages/metadataBuilder.d.ts +0 -3
  20. package/types/sync/offline/LocalhostFromFile.d.ts +0 -2
  21. package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +0 -2
  22. package/types/sync/offline/updaters/splitChangesUpdater.d.ts +0 -0
  23. package/types/sync/submitters/eventsSyncTask.d.ts +0 -8
  24. package/types/sync/submitters/impressionCountsSubmitterInRedis.d.ts +0 -5
  25. package/types/sync/submitters/impressionCountsSyncTask.d.ts +0 -13
  26. package/types/sync/submitters/impressionsSyncTask.d.ts +0 -14
  27. package/types/sync/submitters/metricsSyncTask.d.ts +0 -12
  28. package/types/sync/submitters/submitterSyncTask.d.ts +0 -10
  29. package/types/sync/submitters/uniqueKeysSubmitterInRedis.d.ts +0 -5
  30. package/types/sync/syncTaskComposite.d.ts +0 -5
  31. package/types/trackers/filter/bloomFilter.d.ts +0 -10
  32. package/types/trackers/filter/dictionaryFilter.d.ts +0 -8
  33. package/types/trackers/filter/types.d.ts +0 -5
  34. package/types/utils/timeTracker/index.d.ts +0 -70
  35. /package/types/storages/inMemory/{uniqueKeysCacheInMemory.d.ts → UniqueKeysCacheInMemory.d.ts} +0 -0
  36. /package/types/storages/inMemory/{uniqueKeysCacheInMemoryCS.d.ts → UniqueKeysCacheInMemoryCS.d.ts} +0 -0
  37. /package/types/storages/inRedis/{uniqueKeysCacheInRedis.d.ts → UniqueKeysCacheInRedis.d.ts} +0 -0
package/CHANGES.txt CHANGED
@@ -6,6 +6,7 @@
6
6
  - Added a new optional Split Filter configuration option. This allows the SDK and Split services to only synchronize the flags in the specified flag sets, avoiding unused or unwanted flags from being synced on the SDK instance, bringing all the benefits from a reduced payload.
7
7
  - Note: Only applicable when the SDK is in charge of the rollout data synchronization. When not applicable, the SDK will log a warning on init.
8
8
  - Added `sets` property to the `SplitView` object returned by the `split` and `splits` methods of the SDK manager to expose flag sets on flag views.
9
+ - Bugfixing - Fixed SDK key validation in NodeJS to ensure the SDK_READY_TIMED_OUT event is emitted when a client-side type SDK key is provided instead of a server-side one (Related to issue https://github.com/splitio/javascript-client/issues/768).
9
10
 
10
11
  1.10.0 (October 20, 2023)
11
12
  - Added `defaultTreatment` property to the `SplitView` object returned by the `split` and `splits` methods of the SDK manager (Related to issue https://github.com/splitio/javascript-commons/issues/225).
@@ -101,7 +101,12 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
101
101
  refCount++;
102
102
  return readinessManagerFactory(EventEmitter, readyTimeout, splits);
103
103
  },
104
+ // @TODO review/remove next methods when non-recoverable errors are reworked
105
+ // Called on consumer mode, when storage fails to connect
104
106
  timeout: timeout,
107
+ // Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
108
+ // tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
109
+ setDestroyed: function () { isDestroyed = true; },
105
110
  destroy: function () {
106
111
  isDestroyed = true;
107
112
  segments.removeAllListeners();
@@ -83,7 +83,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
83
83
  // If the operation is forbidden, it may be due to permissions. Destroy the SDK instance.
84
84
  // @TODO although factory status is destroyed, synchronization is not stopped
85
85
  if (readiness)
86
- readiness.destroy();
86
+ readiness.setDestroyed();
87
87
  log.error(constants_2.LOG_PREFIX_INSTANTIATION + ": you passed a client-side type authorizationKey, please grab an SDK Key from the Split user interface that is of type server-side.");
88
88
  }
89
89
  else {
@@ -98,7 +98,12 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
98
98
  refCount++;
99
99
  return readinessManagerFactory(EventEmitter, readyTimeout, splits);
100
100
  },
101
+ // @TODO review/remove next methods when non-recoverable errors are reworked
102
+ // Called on consumer mode, when storage fails to connect
101
103
  timeout: timeout,
104
+ // Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
105
+ // tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
106
+ setDestroyed: function () { isDestroyed = true; },
102
107
  destroy: function () {
103
108
  isDestroyed = true;
104
109
  segments.removeAllListeners();
@@ -80,7 +80,7 @@ export function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segment
80
80
  // If the operation is forbidden, it may be due to permissions. Destroy the SDK instance.
81
81
  // @TODO although factory status is destroyed, synchronization is not stopped
82
82
  if (readiness)
83
- readiness.destroy();
83
+ readiness.setDestroyed();
84
84
  log.error(LOG_PREFIX_INSTANTIATION + ": you passed a client-side type authorizationKey, please grab an SDK Key from the Split user interface that is of type server-side.");
85
85
  }
86
86
  else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "1.10.1-rc.3",
3
+ "version": "1.10.1-rc.4",
4
4
  "description": "Split Javascript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -112,7 +112,12 @@ export function readinessManagerFactory(
112
112
  return readinessManagerFactory(EventEmitter, readyTimeout, splits);
113
113
  },
114
114
 
115
+ // @TODO review/remove next methods when non-recoverable errors are reworked
116
+ // Called on consumer mode, when storage fails to connect
115
117
  timeout,
118
+ // Called on 403 error (client-side SDK key on server-side), to set the SDK as destroyed for
119
+ // tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
120
+ setDestroyed() { isDestroyed = true; },
116
121
 
117
122
  destroy() {
118
123
  isDestroyed = true;
@@ -55,6 +55,7 @@ export interface IReadinessManager {
55
55
  isOperational(): boolean,
56
56
 
57
57
  timeout(): void,
58
+ setDestroyed(): void,
58
59
  destroy(): void,
59
60
 
60
61
  /** for client-side */
@@ -96,7 +96,7 @@ export function segmentChangesUpdaterFactory(
96
96
  if (error && error.statusCode === 403) {
97
97
  // If the operation is forbidden, it may be due to permissions. Destroy the SDK instance.
98
98
  // @TODO although factory status is destroyed, synchronization is not stopped
99
- if (readiness) readiness.destroy();
99
+ if (readiness) readiness.setDestroyed();
100
100
  log.error(`${LOG_PREFIX_INSTANTIATION}: you passed a client-side type authorizationKey, please grab an SDK Key from the Split user interface that is of type server-side.`);
101
101
  } else {
102
102
  log.warn(`${LOG_PREFIX_SYNC_SEGMENTS}Error while doing fetch of segments. ${error}`);
@@ -42,6 +42,7 @@ export interface IReadinessManager {
42
42
  isDestroyed(): boolean;
43
43
  isOperational(): boolean;
44
44
  timeout(): void;
45
+ setDestroyed(): void;
45
46
  destroy(): void;
46
47
  /** for client-side */
47
48
  shared(readyTimeout?: number): IReadinessManager;
@@ -0,0 +1,6 @@
1
+ import { SplitIO } from '../types';
2
+ export declare function buildInstanceId(key: SplitIO.SplitKey, trafficType?: string): string;
3
+ export declare function parseInstanceId(instanceId: string): {
4
+ key: SplitIO.SplitKey;
5
+ trafficType?: string;
6
+ };
@@ -0,0 +1,7 @@
1
+ import { ILogger } from '../../logger/types';
2
+ /** validates the given SDK key */
3
+ export declare function validateApiKey(log: ILogger, maybeSdkKey: any): string | false;
4
+ export declare const usedKeysMap: Record<string, number>;
5
+ /** validates the given SDK key and also warns if it is in use */
6
+ export declare function validateAndTrackApiKey(log: ILogger, maybeSdkKey: any): string | false;
7
+ export declare function releaseApiKey(sdkKey: string): void;
@@ -1,5 +0,0 @@
1
- export declare const myLogger: {
2
- log: (msg: any) => void;
3
- logCsv: (msg: any) => void;
4
- logToFile: (file: any, msg: any) => void;
5
- };
@@ -1,18 +0,0 @@
1
- import { ISignalListener } from '../listeners/types';
2
- import { ISdkReadinessManager } from '../readiness/types';
3
- import { IStorageAsync, IStorageSync } from '../storages/types';
4
- import { ISyncManager } from '../sync/types';
5
- import { IEventTracker, IImpressionsTracker } from '../trackers/types';
6
- import { ISettings } from '../types';
7
- export interface IClientFactoryParams {
8
- storage: IStorageSync | IStorageAsync;
9
- sdkReadinessManager: ISdkReadinessManager;
10
- settings: ISettings;
11
- impressionsTracker: IImpressionsTracker;
12
- eventTracker: IEventTracker;
13
- }
14
- export interface ISdkClientFactoryParams extends IClientFactoryParams {
15
- signalListener?: ISignalListener;
16
- syncManager?: ISyncManager;
17
- sharedClient?: boolean;
18
- }
@@ -1,20 +0,0 @@
1
- import { ICountsCacheSync } from '../types';
2
- export declare class CountsCacheInMemory implements ICountsCacheSync {
3
- private counters;
4
- /**
5
- * Add counts.
6
- */
7
- track(metricName: string): boolean;
8
- /**
9
- * Clear the collector
10
- */
11
- clear(): void;
12
- /**
13
- * Get the collected data, used as payload for posting.
14
- */
15
- state(): Record<string, number>;
16
- /**
17
- * Check if the cache is empty.
18
- */
19
- isEmpty(): boolean;
20
- }
@@ -1,20 +0,0 @@
1
- import { ILatenciesCacheSync } from '../types';
2
- export declare class LatenciesCacheInMemory implements ILatenciesCacheSync {
3
- private counters;
4
- /**
5
- * Add latencies.
6
- */
7
- track(metricName: string, latency: number): boolean;
8
- /**
9
- * Clear the collector
10
- */
11
- clear(): void;
12
- /**
13
- * Get the collected data, used as payload for posting.
14
- */
15
- state(): Record<string, number[]>;
16
- /**
17
- * Check if the cache is empty.
18
- */
19
- isEmpty(): boolean;
20
- }
@@ -1,9 +0,0 @@
1
- import { ICountsCacheAsync } from '../types';
2
- import { KeyBuilderSS } from '../KeyBuilderSS';
3
- import { Redis } from 'ioredis';
4
- export declare class CountsCacheInRedis implements ICountsCacheAsync {
5
- private readonly redis;
6
- private readonly keys;
7
- constructor(keys: KeyBuilderSS, redis: Redis);
8
- track(metricName: string): Promise<boolean>;
9
- }
@@ -1,9 +0,0 @@
1
- import { ILatenciesCacheAsync } from '../types';
2
- import { KeyBuilderSS } from '../KeyBuilderSS';
3
- import { Redis } from 'ioredis';
4
- export declare class LatenciesCacheInRedis implements ILatenciesCacheAsync {
5
- private readonly redis;
6
- private readonly keys;
7
- constructor(keys: KeyBuilderSS, redis: Redis);
8
- track(metricName: string, latency: number): Promise<boolean>;
9
- }
@@ -1,3 +0,0 @@
1
- import { IMetadata } from '../dtos/types';
2
- import { ISettings } from '../types';
3
- export declare function metadataBuilder(settings: Pick<ISettings, 'version' | 'runtime'>): IMetadata;
@@ -1,2 +0,0 @@
1
- import { SplitIO } from '../../types';
2
- export declare function LocalhostFromFile(): SplitIO.LocalhostFactory;
@@ -1,2 +0,0 @@
1
- import { ISplitsParser } from './types';
2
- export declare function splitsParserFromFileFactory(): ISplitsParser;
@@ -1,8 +0,0 @@
1
- import { IEventsCacheSync } from '../../storages/types';
2
- import { IPostEventsBulk } from '../../services/types';
3
- import { ISyncTask, ITimeTracker } from '../types';
4
- import { ILogger } from '../../logger/types';
5
- /**
6
- * Sync task that periodically posts tracked events
7
- */
8
- export declare function eventsSyncTaskFactory(log: ILogger, postEventsBulk: IPostEventsBulk, eventsCache: IEventsCacheSync, eventsPushRate: number, eventsFirstPushWindow: number, latencyTracker?: ITimeTracker): ISyncTask;
@@ -1,5 +0,0 @@
1
- import { ISdkFactoryContextSync } from '../../sdkFactory/types';
2
- /**
3
- * Submitter that periodically posts impression counts
4
- */
5
- export declare function impressionCountsSubmitterInRedisFactory(params: ISdkFactoryContextSync): import("../types").ISyncTask<[], void>;
@@ -1,13 +0,0 @@
1
- import { ISyncTask, ITimeTracker } from '../types';
2
- import { IPostTestImpressionsCount } from '../../services/types';
3
- import { IImpressionCountsCacheSync } from '../../storages/types';
4
- import { ImpressionCountsPayload } from './types';
5
- import { ILogger } from '../../logger/types';
6
- /**
7
- * Converts `impressionCounts` data from cache into request payload.
8
- */
9
- export declare function fromImpressionCountsCollector(impressionsCount: Record<string, number>): ImpressionCountsPayload;
10
- /**
11
- * Sync task that periodically posts impression counts
12
- */
13
- export declare function impressionCountsSyncTaskFactory(log: ILogger, postTestImpressionsCount: IPostTestImpressionsCount, impressionCountsCache: IImpressionCountsCacheSync, latencyTracker?: ITimeTracker): ISyncTask;
@@ -1,14 +0,0 @@
1
- import { ISyncTask, ITimeTracker } from '../types';
2
- import { IPostTestImpressionsBulk } from '../../services/types';
3
- import { IImpressionsCacheSync } from '../../storages/types';
4
- import { ImpressionDTO } from '../../types';
5
- import { ImpressionsPayload } from './types';
6
- import { ILogger } from '../../logger/types';
7
- /**
8
- * Converts `impressions` data from cache into request payload.
9
- */
10
- export declare function fromImpressionsCollector(sendLabels: boolean, data: ImpressionDTO[]): ImpressionsPayload;
11
- /**
12
- * Sync task that periodically posts impressions data
13
- */
14
- export declare function impressionsSyncTaskFactory(log: ILogger, postTestImpressionsBulk: IPostTestImpressionsBulk, impressionsCache: IImpressionsCacheSync, impressionsRefreshRate: number, sendLabels?: boolean, latencyTracker?: ITimeTracker): ISyncTask;
@@ -1,12 +0,0 @@
1
- import { ICountsCacheSync, ILatenciesCacheSync } from '../../storages/types';
2
- import { IPostMetricsCounters, IPostMetricsTimes } from '../../services/types';
3
- import { ISyncTask, ITimeTracker } from '../types';
4
- import { ILogger } from '../../logger/types';
5
- /**
6
- * Sync task that periodically posts telemetry counts
7
- */
8
- export declare function countsSyncTaskFactory(log: ILogger, postMetricsCounters: IPostMetricsCounters, countsCache: ICountsCacheSync, metricsRefreshRate: number, latencyTracker?: ITimeTracker): ISyncTask;
9
- /**
10
- * Sync task that periodically posts telemetry latencies
11
- */
12
- export declare function latenciesSyncTaskFactory(log: ILogger, postMetricsLatencies: IPostMetricsTimes, latenciesCache: ILatenciesCacheSync, metricsRefreshRate: number, latencyTracker?: ITimeTracker): ISyncTask;
@@ -1,10 +0,0 @@
1
- import { ISyncTask, ITimeTracker } from '../types';
2
- import { IRecorderCacheProducerSync } from '../../storages/types';
3
- import { ILogger } from '../../logger/types';
4
- import { IResponse } from '../../services/types';
5
- /**
6
- * Base function to create submitter sync tasks, such as ImpressionsSyncTask and EventsSyncTask
7
- */
8
- export declare function submitterSyncTaskFactory<TState extends {
9
- length?: number;
10
- }>(log: ILogger, postClient: (body: string) => Promise<IResponse>, sourceCache: IRecorderCacheProducerSync<TState>, postRate: number, dataName: string, latencyTracker?: ITimeTracker, fromCacheToPayload?: (cacheData: TState) => any, maxRetries?: number, debugLogs?: boolean): ISyncTask<[], void>;
@@ -1,5 +0,0 @@
1
- import { ISdkFactoryContextSync } from '../../sdkFactory/types';
2
- /**
3
- * Submitter that periodically posts impression counts
4
- */
5
- export declare function uniqueKeysSubmitterInRedisFactory(params: ISdkFactoryContextSync): import("../types").ISyncTask<[], void>;
@@ -1,5 +0,0 @@
1
- import { ISyncTask } from './types';
2
- /**
3
- * Composite Sync Task: group of sync tasks that are treated as a single one.
4
- */
5
- export declare function syncTaskComposite(syncTasks: ISyncTask[]): ISyncTask;
@@ -1,10 +0,0 @@
1
- import { IFilter } from './types';
2
- export declare class BloomFilterImp implements IFilter {
3
- private spectedInsertions;
4
- private errorRate;
5
- private filter;
6
- constructor(spectedInsertions: number, errorRate: number);
7
- add(data: string): boolean;
8
- contains(data: string): boolean;
9
- clear(): void;
10
- }
@@ -1,8 +0,0 @@
1
- import { IFilter } from './types';
2
- export declare class DictionaryFilter implements IFilter {
3
- private filter;
4
- constructor();
5
- add(data: string): boolean;
6
- contains(data: string): boolean;
7
- clear(): void;
8
- }
@@ -1,5 +0,0 @@
1
- export interface IFilter {
2
- add(data: string): boolean;
3
- contains(data: string): boolean;
4
- clear(): void;
5
- }
@@ -1,70 +0,0 @@
1
- import { ILogger } from '../../logger/types';
2
- import { IResponse } from '../../services/types';
3
- interface MetricsCollector {
4
- countException(): void;
5
- count(status: number): void;
6
- latency(ms: number): void;
7
- ready(ms: number): void;
8
- getTreatment(ms: number): void;
9
- getTreatments(ms: number): void;
10
- getTreatmentWithConfig(ms: number): void;
11
- getTreatmentsWithConfig(ms: number): void;
12
- [method: string]: (ms: number) => void;
13
- }
14
- export declare const TrackerAPI: {
15
- /**
16
- * "Private" method, used to attach count/countException and stop callbacks to a promise.
17
- *
18
- * @param {ILogger} log - Logger.
19
- * @param {Promise} promise - The promise we want to attach the callbacks.
20
- * @param {string} task - The name of the task.
21
- * @param {number | string} modifier - (optional) The modifier for the task, if any.
22
- */
23
- __attachToPromise(log: ILogger, promise: Promise<IResponse>, task: string, collector: false | MetricsCollector, modifier?: string | number | undefined): Promise<IResponse>;
24
- /**
25
- * Starts tracking the time for a given task. All tasks tracked are considered "unique" because
26
- * there may be multiple SDK instances tracking a "generic" task, making any task non-generic.
27
- *
28
- * @param {ILogger} log - Logger.
29
- * @param {string} task - The task we are starting.
30
- * @param {Object} collectors - The collectors map.
31
- * @param {Promise} promise - (optional) The promise we are tracking.
32
- * @return {Function | Promise} The stop function for this specific task or the promise received with the callbacks registered.
33
- */
34
- start(log: ILogger, task: string, collectors?: Record<string, MetricsCollector> | undefined, promise?: Promise<IResponse> | undefined, now?: (() => number) | undefined): Promise<IResponse> | (() => number);
35
- /**
36
- * Setup the collector for a task that reports metrics.
37
- *
38
- * @param {string} task - The task name
39
- * @param {number | string} taskUniqueId - The unique identifier for this task
40
- * @param {Object} collectors - The collectors map.
41
- */
42
- setCollectorForTask(task: string, taskUniqueId: number | string, collectors: Record<string, MetricsCollector>): void;
43
- /**
44
- * Stops the tracking of a given task.
45
- *
46
- * @param {ILogger} log - Logger.
47
- * @param {string} task - The task we are starting.
48
- * @param {number | string} modifier - (optional) The modifier for that specific task.
49
- */
50
- stop(log: ILogger, task: string, modifier?: string | number | undefined): number | undefined;
51
- /**
52
- * The constants shortcut for the task names.
53
- */
54
- TaskNames: {
55
- SDK_READY: string;
56
- SDK_GET_TREATMENT: string;
57
- SDK_GET_TREATMENTS: string;
58
- SDK_GET_TREATMENT_WITH_CONFIG: string;
59
- SDK_GET_TREATMENTS_WITH_CONFIG: string;
60
- SPLITS_READY: string;
61
- SEGMENTS_READY: string;
62
- METRICS_PUSH: string;
63
- IMPRESSIONS_PUSH: string;
64
- EVENTS_PUSH: string;
65
- MY_SEGMENTS_FETCH: string;
66
- SEGMENTS_FETCH: string;
67
- SPLITS_FETCH: string;
68
- };
69
- };
70
- export {};