@splitsoftware/splitio-commons 3.1.1-rc.11 → 3.1.1-rc.13

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 (77) hide show
  1. package/CHANGES.txt +3 -0
  2. package/cjs/services/authProvider.js +2 -2
  3. package/cjs/{sync/streaming/AuthClient/index.js → services/fetchAuth.js} +2 -2
  4. package/cjs/services/splitApi.js +2 -2
  5. package/cjs/storages/AbstractDefinitionsCacheAsync.js +2 -1
  6. package/cjs/storages/AbstractDefinitionsCacheSync.js +2 -2
  7. package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +4 -1
  8. package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +6 -3
  9. package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +4 -1
  10. package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +6 -3
  11. package/cjs/storages/inRedis/DefinitionsCacheInRedis.js +12 -8
  12. package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +21 -11
  13. package/cjs/storages/pluggable/DefinitionsCachePluggable.js +12 -8
  14. package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +21 -11
  15. package/cjs/sync/offline/splitsParser/definitionChangesBuilder.js +37 -0
  16. package/cjs/sync/offline/splitsParser/splitsParserFromSettings.js +5 -32
  17. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +26 -46
  18. package/cjs/sync/polling/fetchers/splitChangesFetcher.js +1 -1
  19. package/cjs/sync/polling/updaters/definitionChangesUpdater.js +22 -15
  20. package/cjs/sync/streaming/UpdateWorkers/DefinitionsUpdateWorker.js +6 -4
  21. package/cjs/sync/streaming/parseUtils.js +4 -4
  22. package/cjs/sync/streaming/pushManager.js +4 -3
  23. package/esm/services/authProvider.js +1 -1
  24. package/esm/{sync/streaming/AuthClient/index.js → services/fetchAuth.js} +2 -2
  25. package/esm/services/splitApi.js +1 -1
  26. package/esm/storages/AbstractDefinitionsCacheAsync.js +2 -1
  27. package/esm/storages/AbstractDefinitionsCacheSync.js +2 -2
  28. package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +4 -1
  29. package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +6 -3
  30. package/esm/storages/inMemory/DefinitionsCacheInMemory.js +4 -1
  31. package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +6 -3
  32. package/esm/storages/inRedis/DefinitionsCacheInRedis.js +12 -8
  33. package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +21 -11
  34. package/esm/storages/pluggable/DefinitionsCachePluggable.js +12 -8
  35. package/esm/storages/pluggable/RBSegmentsCachePluggable.js +21 -11
  36. package/esm/sync/offline/splitsParser/definitionChangesBuilder.js +33 -0
  37. package/esm/sync/offline/splitsParser/splitsParserFromSettings.js +6 -33
  38. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +23 -43
  39. package/esm/sync/polling/fetchers/splitChangesFetcher.js +1 -1
  40. package/esm/sync/polling/updaters/definitionChangesUpdater.js +22 -15
  41. package/esm/sync/streaming/UpdateWorkers/DefinitionsUpdateWorker.js +8 -6
  42. package/esm/sync/streaming/parseUtils.js +2 -2
  43. package/esm/sync/streaming/pushManager.js +4 -3
  44. package/package.json +1 -1
  45. package/src/dtos/types.ts +4 -4
  46. package/src/services/authProvider.ts +2 -2
  47. package/src/{sync/streaming/AuthClient/index.ts → services/fetchAuth.ts} +3 -4
  48. package/src/services/splitApi.ts +1 -1
  49. package/src/services/types.ts +21 -4
  50. package/src/storages/AbstractDefinitionsCacheAsync.ts +5 -4
  51. package/src/storages/AbstractDefinitionsCacheSync.ts +4 -4
  52. package/src/storages/inLocalStorage/DefinitionsCacheInLocal.ts +5 -3
  53. package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +7 -5
  54. package/src/storages/inMemory/DefinitionsCacheInMemory.ts +3 -2
  55. package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +5 -4
  56. package/src/storages/inRedis/DefinitionsCacheInRedis.ts +15 -11
  57. package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +26 -15
  58. package/src/storages/pluggable/DefinitionsCachePluggable.ts +14 -9
  59. package/src/storages/pluggable/RBSegmentsCachePluggable.ts +24 -13
  60. package/src/storages/types.ts +6 -6
  61. package/src/sync/offline/splitsParser/definitionChangesBuilder.ts +49 -0
  62. package/src/sync/offline/splitsParser/splitsParserFromSettings.ts +8 -38
  63. package/src/sync/offline/splitsParser/types.ts +7 -3
  64. package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +25 -45
  65. package/src/sync/polling/fetchers/splitChangesFetcher.ts +5 -5
  66. package/src/sync/polling/types.ts +22 -1
  67. package/src/sync/polling/updaters/definitionChangesUpdater.ts +35 -33
  68. package/src/sync/streaming/SSEClient/index.ts +1 -1
  69. package/src/sync/streaming/SSEClient/types.ts +1 -1
  70. package/src/sync/streaming/UpdateWorkers/DefinitionsUpdateWorker.ts +17 -13
  71. package/src/sync/streaming/UpdateWorkers/types.ts +6 -0
  72. package/src/sync/streaming/parseUtils.ts +3 -4
  73. package/src/sync/streaming/pushManager.ts +4 -3
  74. package/src/sync/syncManagerOnline.ts +0 -1
  75. package/cjs/sync/streaming/AuthClient/types.js +0 -2
  76. package/esm/sync/streaming/AuthClient/types.js +0 -1
  77. package/src/sync/streaming/AuthClient/types.ts +0 -19
@@ -1,24 +1,28 @@
1
1
  import { IRBSegment, IDefinition } from '../../../dtos/types';
2
2
  import { STREAMING_PARSING_SPLIT_UPDATE } from '../../../logger/constants';
3
- import { ILogger } from '../../../logger/types';
4
- import { SDK_DEFINITIONS_ARRIVED } from '../../../readiness/constants';
5
- import { IDefinitionsEventEmitter } from '../../../readiness/types';
6
- import { IRBSegmentsCacheSync, IDefinitionsCacheSync, IStorageSync } from '../../../storages/types';
7
- import { ITelemetryTracker } from '../../../trackers/types';
3
+ import { SDK_DEFINITIONS_ARRIVED, FLAGS_UPDATE } from '../../../readiness/constants';
4
+ import { ISdkFactoryContextSync } from '../../../sdkFactory/types';
5
+ import { IRBSegmentsCacheSync, IDefinitionsCacheSync } from '../../../storages/types';
8
6
  import { Backoff } from '../../../utils/Backoff';
9
7
  import { SPLITS } from '../../../utils/constants';
10
- import { IDefinitionsSyncTask } from '../../polling/types';
11
- import { InstantUpdate } from '../../polling/updaters/definitionChangesUpdater';
8
+ import { IPollingManager } from '../../polling/types';
9
+ import { InstantUpdate } from '../../polling/types';
12
10
  import { RB_SEGMENT_UPDATE } from '../constants';
13
- import { parseFFUpdatePayload } from '../parseUtils';
11
+ import { parseUpdatePayload } from '../parseUtils';
14
12
  import { ISplitKillData, ISplitUpdateData } from '../SSEHandler/types';
15
13
  import { FETCH_BACKOFF_BASE, FETCH_BACKOFF_MAX_WAIT, FETCH_BACKOFF_MAX_RETRIES } from './constants';
16
- import { IUpdateWorker } from './types';
14
+ import { IDefinitionsUpdateWorker } from './types';
17
15
 
18
16
  /**
19
- * DefinitionsUpdateWorker factory
17
+ * DefinitionsUpdateWorker factory for Flags SDKs, where notifications pcn and changeNumber are environment-scoped
20
18
  */
21
- export function DefinitionsUpdateWorker(log: ILogger, storage: IStorageSync, definitionsSyncTask: IDefinitionsSyncTask, definitionsEventEmitter: IDefinitionsEventEmitter, telemetryTracker: ITelemetryTracker): IUpdateWorker<[updateData: ISplitUpdateData]> & { killDefinition(event: ISplitKillData): void } {
19
+ export function DefinitionsUpdateWorker(
20
+ params: Pick<ISdkFactoryContextSync, 'settings' | 'storage' | 'telemetryTracker' | 'readiness'>,
21
+ pollingManager: Pick<IPollingManager, 'definitionsSyncTask'>,
22
+ ): IDefinitionsUpdateWorker {
23
+
24
+ const { settings: { log }, storage, telemetryTracker, readiness: { definitions: definitionsEventEmitter } } = params;
25
+ const { definitionsSyncTask } = pollingManager;
22
26
 
23
27
  const ff = DefinitionsUpdateWorker(storage.definitions);
24
28
  const rbs = DefinitionsUpdateWorker(storage.rbSegments);
@@ -108,7 +112,7 @@ export function DefinitionsUpdateWorker(log: ILogger, storage: IStorageSync, def
108
112
  put(parsedData) {
109
113
  if (parsedData.d && parsedData.c !== undefined) {
110
114
  try {
111
- const payload = parseFFUpdatePayload(parsedData.c, parsedData.d);
115
+ const payload = parseUpdatePayload<IDefinition | IRBSegment>(parsedData.c, parsedData.d);
112
116
  if (payload) {
113
117
  (parsedData.type === RB_SEGMENT_UPDATE ? rbs : ff).put(parsedData, payload);
114
118
  return;
@@ -129,7 +133,7 @@ export function DefinitionsUpdateWorker(log: ILogger, storage: IStorageSync, def
129
133
  killDefinition({ changeNumber, splitName, defaultTreatment }: ISplitKillData) {
130
134
  if (storage.definitions.killLocally(splitName, defaultTreatment, changeNumber)) {
131
135
  // trigger an SDK_UPDATE if Split was killed locally
132
- definitionsEventEmitter.emit(SDK_DEFINITIONS_ARRIVED, true);
136
+ definitionsEventEmitter.emit(SDK_DEFINITIONS_ARRIVED, { type: FLAGS_UPDATE, names: [splitName] }, true /* isSplitKill */);
133
137
  }
134
138
  // queues the SplitChanges fetch (only if changeNumber is newer)
135
139
  ff.put({ changeNumber } as ISplitUpdateData);
@@ -1,4 +1,10 @@
1
+ import { ISplitKillData, ISplitUpdateData } from '../SSEHandler/types';
2
+
1
3
  export interface IUpdateWorker<T extends any[]> {
2
4
  stop(): void // clear scheduled tasks (backoff)
3
5
  put(...args: T): void // handle new update event
4
6
  }
7
+
8
+ export interface IDefinitionsUpdateWorker extends IUpdateWorker<[updateData: ISplitUpdateData]> {
9
+ killDefinition: (event: ISplitKillData) => void
10
+ }
@@ -2,7 +2,6 @@ import { algorithms } from '../../utils/decompress';
2
2
  import { decodeFromBase64 } from '../../utils/base64';
3
3
  import { hash } from '../../utils/murmur3/murmur3';
4
4
  import { Compression, IMembershipMSUpdateData } from './SSEHandler/types';
5
- import { IRBSegment, IDefinition } from '../../dtos/types';
6
5
 
7
6
  const GZIP = 1;
8
7
  const ZLIB = 2;
@@ -80,11 +79,11 @@ export function isInBitmap(bitmap: Uint8Array, hash64hex: string) {
80
79
  }
81
80
 
82
81
  /**
83
- * Parse feature flags notifications for instant feature flag updates
82
+ * Parse notifications for instant updates
84
83
  */
85
- export function parseFFUpdatePayload(compression: Compression, data: string): IDefinition | IRBSegment | undefined {
84
+ export function parseUpdatePayload<T>(compression: Compression, data: string): T | undefined {
86
85
  return compression > 0 ?
87
- parseCompressedData<IDefinition | IRBSegment>(data, compression, false) :
86
+ parseCompressedData<T>(data, compression, false) :
88
87
  JSON.parse(decodeFromBase64(data));
89
88
  }
90
89
 
@@ -15,7 +15,7 @@ import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STRE
15
15
  import { IMembershipMSUpdateData, IMembershipLSUpdateData, KeyList, UpdateStrategy } from './SSEHandler/types';
16
16
  import { getDelay, isInBitmap, parseBitmap, parseCompressedData } from './parseUtils';
17
17
  import { Hash64, hash64 } from '../../utils/murmur3/murmur3_64';
18
- import { IJwtCredential } from './AuthClient/types';
18
+ import { IJwtCredential } from '../../services/types';
19
19
  import { TOKEN_REFRESH, AUTH_REJECTION } from '../../utils/constants';
20
20
  import { ISdkFactoryContextSync } from '../../sdkFactory/types';
21
21
 
@@ -27,9 +27,10 @@ import { ISdkFactoryContextSync } from '../../sdkFactory/types';
27
27
  export function pushManagerFactory(
28
28
  params: ISdkFactoryContextSync,
29
29
  pollingManager: IPollingManager,
30
+ definitionsUpdateWorkerFactory = DefinitionsUpdateWorker
30
31
  ): IPushManager | undefined {
31
32
 
32
- const { settings, storage, serviceApi, readiness, platform, telemetryTracker } = params;
33
+ const { settings, storage, serviceApi, platform, telemetryTracker } = params;
33
34
 
34
35
  // `userKey` is the matching key of main client in client-side SDK.
35
36
  // It can be used to check if running on client-side or server-side SDK.
@@ -54,7 +55,7 @@ export function pushManagerFactory(
54
55
  // MySegmentsUpdateWorker (client-side) are initiated in `add` method
55
56
  const segmentsUpdateWorker = userKey ? undefined : SegmentsUpdateWorker(log, pollingManager.segmentsSyncTask as ISegmentsSyncTask, storage.segments);
56
57
  // For server-side we pass the segmentsSyncTask, used by DefinitionsUpdateWorker to fetch new segments
57
- const definitionsUpdateWorker = DefinitionsUpdateWorker(log, storage, pollingManager.definitionsSyncTask, readiness.definitions, telemetryTracker);
58
+ const definitionsUpdateWorker = definitionsUpdateWorkerFactory(params, pollingManager);
58
59
 
59
60
  // [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
60
61
  // Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
@@ -100,7 +100,6 @@ export function syncManagerOnlineFactory(
100
100
  if (!cacheMetadata.initialCacheLoad) {
101
101
  readiness.definitions.emit(SDK_DEFINITIONS_CACHE_LOADED, cacheMetadata);
102
102
  }
103
-
104
103
  }
105
104
 
106
105
  // start syncing splits and segments
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +0,0 @@
1
- export {};
@@ -1,19 +0,0 @@
1
- import { IDecodedJWTToken } from '../../../utils/jwt/types';
2
-
3
- export type IJwtCredential = {
4
- token: string; // empty string ("") when `"pushEnabled": false`
5
- decodedToken: IDecodedJWTToken
6
- channels: { [channel: string]: string[] }
7
- // /api/v2/auth fields
8
- pushEnabled?: boolean | null;
9
- connDelay?: number | null;
10
- // /api/v3/auth fields
11
- config?: {
12
- streaming?: {
13
- delay?: number | null;
14
- enabled?: boolean | null;
15
- } | null;
16
- } | null;
17
- }
18
-
19
- export type IFetchAuth = (userKeys?: string[]) => Promise<IJwtCredential>