@splitsoftware/splitio-commons 1.16.0 → 1.16.1-rc.1
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/CHANGES.txt +3 -0
- package/cjs/evaluator/matchers/index.js +3 -1
- package/cjs/evaluator/matchers/large_segment.js +16 -0
- package/cjs/evaluator/matchers/matcherTypes.js +1 -0
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/info.js +0 -1
- package/cjs/readiness/readinessManager.js +14 -10
- package/cjs/readiness/sdkReadinessManager.js +5 -6
- package/cjs/sdkClient/sdkClientMethodCS.js +3 -4
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +4 -5
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/splitApi.js +4 -0
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +5 -5
- package/cjs/storages/KeyBuilder.js +3 -0
- package/cjs/storages/KeyBuilderCS.js +17 -5
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +16 -4
- package/cjs/storages/inLocalStorage/index.js +6 -2
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +20 -11
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
- package/cjs/sync/polling/pollingManagerCS.js +51 -33
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +5 -6
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -0
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
- package/cjs/sync/streaming/constants.js +2 -1
- package/cjs/sync/streaming/pushManager.js +95 -64
- package/cjs/sync/submitters/telemetrySubmitter.js +2 -0
- package/cjs/sync/syncManagerOnline.js +24 -14
- package/cjs/utils/constants/index.js +5 -1
- package/cjs/utils/settingsValidation/index.js +9 -4
- package/esm/evaluator/matchers/index.js +3 -1
- package/esm/evaluator/matchers/large_segment.js +12 -0
- package/esm/evaluator/matchers/matcherTypes.js +1 -0
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +0 -1
- package/esm/readiness/readinessManager.js +14 -10
- package/esm/readiness/sdkReadinessManager.js +5 -6
- package/esm/sdkClient/sdkClientMethodCS.js +4 -5
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +5 -6
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/splitApi.js +5 -1
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +3 -3
- package/esm/storages/KeyBuilder.js +3 -0
- package/esm/storages/KeyBuilderCS.js +15 -4
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +17 -5
- package/esm/storages/inLocalStorage/index.js +7 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/esm/storages/inMemory/SplitsCacheInMemory.js +21 -12
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
- package/esm/sync/polling/pollingManagerCS.js +52 -34
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -4
- package/esm/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/esm/sync/streaming/SSEHandler/index.js +2 -1
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
- package/esm/sync/streaming/constants.js +1 -0
- package/esm/sync/streaming/pushManager.js +95 -65
- package/esm/sync/submitters/telemetrySubmitter.js +2 -0
- package/esm/sync/syncManagerOnline.js +25 -15
- package/esm/utils/constants/index.js +4 -0
- package/esm/utils/settingsValidation/index.js +10 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +17 -7
- package/src/evaluator/matchers/index.ts +2 -0
- package/src/evaluator/matchers/large_segment.ts +18 -0
- package/src/evaluator/matchers/matcherTypes.ts +1 -0
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +0 -1
- package/src/readiness/readinessManager.ts +13 -9
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +3 -2
- package/src/sdkClient/sdkClientMethodCS.ts +4 -6
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +5 -7
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/splitApi.ts +6 -1
- package/src/services/types.ts +1 -0
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +4 -4
- package/src/storages/KeyBuilder.ts +3 -0
- package/src/storages/KeyBuilderCS.ts +25 -5
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +20 -5
- package/src/storages/inLocalStorage/index.ts +8 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
- package/src/storages/inMemory/SplitsCacheInMemory.ts +15 -10
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +7 -5
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +6 -2
- package/src/sync/polling/pollingManagerCS.ts +61 -29
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
- package/src/sync/polling/types.ts +3 -2
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +5 -8
- package/src/sync/polling/updaters/splitChangesUpdater.ts +4 -3
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +14 -2
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +17 -5
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +100 -63
- package/src/sync/streaming/types.ts +5 -3
- package/src/sync/submitters/telemetrySubmitter.ts +2 -0
- package/src/sync/submitters/types.ts +10 -4
- package/src/sync/syncManagerOnline.ts +19 -11
- package/src/types.ts +26 -1
- package/src/utils/constants/index.ts +5 -0
- package/src/utils/settingsValidation/index.ts +11 -6
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +14 -6
- package/types/evaluator/matchers/large_segment.d.ts +5 -0
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +2 -3
- package/types/readiness/types.d.ts +3 -2
- package/types/services/types.d.ts +1 -0
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +1 -0
- package/types/storages/KeyBuilderCS.d.ts +7 -2
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +3 -2
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +4 -3
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -3
- package/types/sync/polling/types.d.ts +9 -2
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEHandler/types.d.ts +13 -2
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/constants.d.ts +1 -0
- package/types/sync/streaming/pushManager.d.ts +2 -0
- package/types/sync/streaming/types.d.ts +5 -4
- package/types/sync/submitters/types.d.ts +9 -3
- package/types/types.d.ts +25 -0
- package/types/utils/constants/index.d.ts +3 -0
- package/types/utils/settingsValidation/index.d.ts +2 -0
- package/types/utils/settingsValidation/types.d.ts +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IMySegmentsUpdateData, IMySegmentsUpdateV2Data, ISegmentUpdateData, ISplitUpdateData, ISplitKillData } from './SSEHandler/types';
|
|
1
|
+
import { IMySegmentsUpdateData, IMySegmentsUpdateV2Data, ISegmentUpdateData, ISplitUpdateData, ISplitKillData, IMyLargeSegmentsUpdateData } from './SSEHandler/types';
|
|
2
2
|
import { ITask } from '../types';
|
|
3
3
|
import { IMySegmentsSyncTask } from '../polling/types';
|
|
4
4
|
import { IEventEmitter } from '../../types';
|
|
@@ -16,16 +16,18 @@ export type MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
|
|
|
16
16
|
export type SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
17
17
|
export type SPLIT_KILL = 'SPLIT_KILL';
|
|
18
18
|
export type SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
19
|
+
export type MY_LARGE_SEGMENTS_UPDATE = 'MY_LARGE_SEGMENTS_UPDATE';
|
|
19
20
|
|
|
20
21
|
// Control-type push notifications, handled by NotificationKeeper
|
|
21
22
|
export type CONTROL = 'CONTROL';
|
|
22
23
|
export type OCCUPANCY = 'OCCUPANCY';
|
|
23
24
|
|
|
24
|
-
export type IPushEvent = PUSH_SUBSYSTEM_UP | PUSH_SUBSYSTEM_DOWN | PUSH_NONRETRYABLE_ERROR | PUSH_RETRYABLE_ERROR | MY_SEGMENTS_UPDATE | MY_SEGMENTS_UPDATE_V2 | SEGMENT_UPDATE | SPLIT_UPDATE | SPLIT_KILL | ControlType.STREAMING_RESET
|
|
25
|
+
export type IPushEvent = PUSH_SUBSYSTEM_UP | PUSH_SUBSYSTEM_DOWN | PUSH_NONRETRYABLE_ERROR | PUSH_RETRYABLE_ERROR | MY_SEGMENTS_UPDATE | MY_SEGMENTS_UPDATE_V2 | SEGMENT_UPDATE | SPLIT_UPDATE | SPLIT_KILL | MY_LARGE_SEGMENTS_UPDATE | ControlType.STREAMING_RESET
|
|
25
26
|
|
|
26
27
|
type IParsedData<T extends IPushEvent> =
|
|
27
28
|
T extends MY_SEGMENTS_UPDATE ? IMySegmentsUpdateData :
|
|
28
29
|
T extends MY_SEGMENTS_UPDATE_V2 ? IMySegmentsUpdateV2Data :
|
|
30
|
+
T extends MY_LARGE_SEGMENTS_UPDATE ? IMyLargeSegmentsUpdateData :
|
|
29
31
|
T extends SEGMENT_UPDATE ? ISegmentUpdateData :
|
|
30
32
|
T extends SPLIT_UPDATE ? ISplitUpdateData :
|
|
31
33
|
T extends SPLIT_KILL ? ISplitKillData : undefined;
|
|
@@ -45,6 +47,6 @@ export interface IPushEventEmitter extends IEventEmitter {
|
|
|
45
47
|
*/
|
|
46
48
|
export interface IPushManager extends ITask, IPushEventEmitter {
|
|
47
49
|
// Methods used in client-side, to support multiple clients
|
|
48
|
-
add(userKey: string, mySegmentsSyncTask: IMySegmentsSyncTask): void,
|
|
50
|
+
add(userKey: string, mySegmentsSyncTask: IMySegmentsSyncTask, myLargeSegmentsSyncTask?: IMySegmentsSyncTask): void,
|
|
49
51
|
remove(userKey: string): void
|
|
50
52
|
}
|
|
@@ -76,10 +76,12 @@ export function telemetryCacheConfigAdapter(telemetry: ITelemetryCacheSync, sett
|
|
|
76
76
|
|
|
77
77
|
return objectAssign(getTelemetryConfigStats(settings.mode, settings.storage.type), {
|
|
78
78
|
sE: settings.streamingEnabled,
|
|
79
|
+
lE: isClientSide ? settings.sync.largeSegmentsEnabled : undefined,
|
|
79
80
|
rR: {
|
|
80
81
|
sp: scheduler.featuresRefreshRate / 1000,
|
|
81
82
|
se: isClientSide ? undefined : scheduler.segmentsRefreshRate / 1000,
|
|
82
83
|
ms: isClientSide ? scheduler.segmentsRefreshRate / 1000 : undefined,
|
|
84
|
+
mls: isClientSide && settings.sync.largeSegmentsEnabled ? scheduler.largeSegmentsRefreshRate / 1000 : undefined,
|
|
83
85
|
im: scheduler.impressionsRefreshRate / 1000,
|
|
84
86
|
ev: scheduler.eventsPushRate / 1000,
|
|
85
87
|
te: scheduler.telemetryRefreshRate / 1000,
|
|
@@ -103,7 +103,7 @@ export type DROPPED = 1;
|
|
|
103
103
|
export type DEDUPED = 2;
|
|
104
104
|
export type ImpressionDataType = QUEUED | DROPPED | DEDUPED
|
|
105
105
|
export type EventDataType = QUEUED | DROPPED;
|
|
106
|
-
export type UpdatesFromSSEEnum = SPLITS | MY_SEGMENT;
|
|
106
|
+
export type UpdatesFromSSEEnum = SPLITS | MY_SEGMENT | MY_LARGE_SEGMENT;
|
|
107
107
|
|
|
108
108
|
export type SPLITS = 'sp';
|
|
109
109
|
export type IMPRESSIONS = 'im';
|
|
@@ -113,7 +113,8 @@ export type TELEMETRY = 'te';
|
|
|
113
113
|
export type TOKEN = 'to';
|
|
114
114
|
export type SEGMENT = 'se';
|
|
115
115
|
export type MY_SEGMENT = 'ms';
|
|
116
|
-
export type
|
|
116
|
+
export type MY_LARGE_SEGMENT = 'mls';
|
|
117
|
+
export type OperationType = SPLITS | IMPRESSIONS | IMPRESSIONS_COUNT | EVENTS | TELEMETRY | TOKEN | SEGMENT | MY_SEGMENT | MY_LARGE_SEGMENT;
|
|
117
118
|
|
|
118
119
|
export type LastSync = Partial<Record<OperationType, number | undefined>>
|
|
119
120
|
export type HttpErrors = Partial<Record<OperationType, { [statusCode: string]: number }>>
|
|
@@ -158,8 +159,9 @@ export type TelemetryUsageStats = {
|
|
|
158
159
|
|
|
159
160
|
// amount of instant updates that we are doing by avoiding fetching to Split servers
|
|
160
161
|
export type UpdatesFromSSE = {
|
|
161
|
-
sp
|
|
162
|
+
sp?: number, // splits
|
|
162
163
|
ms?: number, // my segments
|
|
164
|
+
mls?: number // my large segments
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
// 'metrics/usage' JSON request body
|
|
@@ -175,12 +177,14 @@ export type TelemetryUsageStatsPayload = TelemetryUsageStats & {
|
|
|
175
177
|
spC?: number, // splitCount
|
|
176
178
|
seC?: number, // segmentCount
|
|
177
179
|
skC?: number, // segmentKeyCount
|
|
180
|
+
lseC?: number, // largeSegmentCount
|
|
181
|
+
lskC?: number, // largeSegmentKeyCount
|
|
178
182
|
sL?: number, // sessionLengthMs
|
|
179
183
|
eQ: number, // eventsQueued
|
|
180
184
|
eD: number, // eventsDropped
|
|
181
185
|
sE: Array<StreamingEvent>, // streamingEvents
|
|
182
186
|
t?: Array<string>, // tags
|
|
183
|
-
ufs?: UpdatesFromSSE, //
|
|
187
|
+
ufs?: UpdatesFromSSE, // instant updates
|
|
184
188
|
}
|
|
185
189
|
|
|
186
190
|
/**
|
|
@@ -201,6 +205,7 @@ export type RefreshRates = {
|
|
|
201
205
|
sp: number, // splits
|
|
202
206
|
se?: number, // segments
|
|
203
207
|
ms?: number, // mySegments
|
|
208
|
+
mls?: number, // myLargeSegments
|
|
204
209
|
im: number, // impressions
|
|
205
210
|
ev: number, // events
|
|
206
211
|
te: number, // telemetry
|
|
@@ -226,6 +231,7 @@ export type TelemetryConfigStats = {
|
|
|
226
231
|
// 'metrics/config' JSON request body
|
|
227
232
|
export type TelemetryConfigStatsPayload = TelemetryConfigStats & {
|
|
228
233
|
sE: boolean, // streamingEnabled
|
|
234
|
+
lE?: boolean, // largeSegmentsEnabled
|
|
229
235
|
rR: RefreshRates, // refreshRates
|
|
230
236
|
uO: UrlOverrides, // urlOverrides
|
|
231
237
|
iQ: number, // impressionsQueueSize
|
|
@@ -7,7 +7,7 @@ import { IPollingManager, IPollingManagerCS } from './polling/types';
|
|
|
7
7
|
import { PUSH_SUBSYSTEM_UP, PUSH_SUBSYSTEM_DOWN } from './streaming/constants';
|
|
8
8
|
import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '../logger/constants';
|
|
9
9
|
import { isConsentGranted } from '../consent';
|
|
10
|
-
import { POLLING, STREAMING, SYNC_MODE_UPDATE } from '../utils/constants';
|
|
10
|
+
import { IN_LARGE_SEGMENT, IN_SEGMENT, POLLING, STREAMING, SYNC_MODE_UPDATE } from '../utils/constants';
|
|
11
11
|
import { ISdkFactoryContextSync } from '../sdkFactory/types';
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -141,36 +141,44 @@ export function syncManagerOnlineFactory(
|
|
|
141
141
|
shared(matchingKey: string, readinessManager: IReadinessManager, storage: IStorageSync) {
|
|
142
142
|
if (!pollingManager) return;
|
|
143
143
|
|
|
144
|
-
const
|
|
144
|
+
const { msSyncTask, mlsSyncTask } = (pollingManager as IPollingManagerCS).add(matchingKey, readinessManager, storage);
|
|
145
145
|
|
|
146
146
|
return {
|
|
147
|
-
isRunning:
|
|
147
|
+
isRunning: msSyncTask.isRunning,
|
|
148
148
|
start() {
|
|
149
149
|
if (syncEnabled) {
|
|
150
150
|
if (pushManager) {
|
|
151
151
|
if (pollingManager!.isRunning()) {
|
|
152
152
|
// if doing polling, we must start the periodic fetch of data
|
|
153
|
-
if (storage.splits.
|
|
153
|
+
if (storage.splits.usesMatcher(IN_SEGMENT)) msSyncTask.start();
|
|
154
|
+
if (mlsSyncTask && storage.splits.usesMatcher(IN_LARGE_SEGMENT)) mlsSyncTask.start();
|
|
154
155
|
} else {
|
|
155
156
|
// if not polling, we must execute the sync task for the initial fetch
|
|
156
157
|
// of segments since `syncAll` was already executed when starting the main client
|
|
157
|
-
|
|
158
|
+
msSyncTask.execute();
|
|
159
|
+
mlsSyncTask && mlsSyncTask.execute();
|
|
158
160
|
}
|
|
159
|
-
pushManager.add(matchingKey,
|
|
161
|
+
pushManager.add(matchingKey, msSyncTask, mlsSyncTask);
|
|
160
162
|
} else {
|
|
161
|
-
if (storage.splits.
|
|
163
|
+
if (storage.splits.usesMatcher(IN_SEGMENT)) msSyncTask.start();
|
|
164
|
+
if (mlsSyncTask && storage.splits.usesMatcher(IN_LARGE_SEGMENT)) mlsSyncTask.start();
|
|
162
165
|
}
|
|
163
166
|
} else {
|
|
164
|
-
if (!readinessManager.isReady())
|
|
167
|
+
if (!readinessManager.isReady()) {
|
|
168
|
+
msSyncTask.execute();
|
|
169
|
+
mlsSyncTask && mlsSyncTask.execute();
|
|
170
|
+
}
|
|
165
171
|
}
|
|
166
172
|
},
|
|
167
173
|
stop() {
|
|
168
174
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
169
|
-
const
|
|
170
|
-
if (
|
|
175
|
+
const syncTasks = (pollingManager as IPollingManagerCS).get(matchingKey);
|
|
176
|
+
if (syncTasks) {
|
|
177
|
+
const { msSyncTask, mlsSyncTask } = syncTasks;
|
|
171
178
|
// stop syncing
|
|
172
179
|
if (pushManager) pushManager.remove(matchingKey);
|
|
173
|
-
if (
|
|
180
|
+
if (msSyncTask.isRunning()) msSyncTask.stop();
|
|
181
|
+
if (mlsSyncTask && mlsSyncTask.isRunning()) mlsSyncTask.stop();
|
|
174
182
|
|
|
175
183
|
(pollingManager as IPollingManagerCS).remove(matchingKey);
|
|
176
184
|
}
|
package/src/types.ts
CHANGED
|
@@ -86,6 +86,7 @@ export interface ISettings {
|
|
|
86
86
|
metricsRefreshRate?: number,
|
|
87
87
|
telemetryRefreshRate: number,
|
|
88
88
|
segmentsRefreshRate: number,
|
|
89
|
+
largeSegmentsRefreshRate: number,
|
|
89
90
|
offlineRefreshRate: number,
|
|
90
91
|
eventsPushRate: number,
|
|
91
92
|
eventsQueueSize: number,
|
|
@@ -95,7 +96,8 @@ export interface ISettings {
|
|
|
95
96
|
readyTimeout: number,
|
|
96
97
|
requestTimeoutBeforeReady: number,
|
|
97
98
|
retriesOnFailureBeforeReady: number,
|
|
98
|
-
eventsFirstPushWindow: number
|
|
99
|
+
eventsFirstPushWindow: number,
|
|
100
|
+
waitForLargeSegments: boolean
|
|
99
101
|
},
|
|
100
102
|
readonly storage: IStorageSyncFactory | IStorageAsyncFactory,
|
|
101
103
|
readonly integrations: Array<{
|
|
@@ -119,6 +121,7 @@ export interface ISettings {
|
|
|
119
121
|
__splitFiltersValidation: ISplitFiltersValidation,
|
|
120
122
|
localhostMode?: SplitIO.LocalhostFactory,
|
|
121
123
|
enabled: boolean,
|
|
124
|
+
largeSegmentsEnabled: boolean,
|
|
122
125
|
flagSpecVersion: string
|
|
123
126
|
},
|
|
124
127
|
readonly runtime: {
|
|
@@ -813,6 +816,13 @@ export namespace SplitIO {
|
|
|
813
816
|
* @default 10
|
|
814
817
|
*/
|
|
815
818
|
eventsFirstPushWindow?: number,
|
|
819
|
+
/**
|
|
820
|
+
* Whether the SDK should wait for large segments to be ready before emitting SDK_READY event.
|
|
821
|
+
* It only applies if largeSegmentsEnabled is true.
|
|
822
|
+
* @property {number} waitForLargeSegments
|
|
823
|
+
* @default true
|
|
824
|
+
*/
|
|
825
|
+
waitForLargeSegments?: boolean
|
|
816
826
|
},
|
|
817
827
|
/**
|
|
818
828
|
* SDK scheduler settings.
|
|
@@ -857,6 +867,13 @@ export namespace SplitIO {
|
|
|
857
867
|
* @default 60
|
|
858
868
|
*/
|
|
859
869
|
segmentsRefreshRate?: number,
|
|
870
|
+
/**
|
|
871
|
+
* The SDK polls Split servers for changes to large segment definitions. This parameter controls this polling period in seconds.
|
|
872
|
+
* It only applies if largeSegmentsEnabled is true.
|
|
873
|
+
* @property {number} largeSegmentsRefreshRate
|
|
874
|
+
* @default 60
|
|
875
|
+
*/
|
|
876
|
+
largeSegmentsRefreshRate?: number,
|
|
860
877
|
/**
|
|
861
878
|
* The SDK posts the queued events data in bulks. This parameter controls the posting rate in seconds.
|
|
862
879
|
* @property {number} eventsPushRate
|
|
@@ -929,6 +946,14 @@ export namespace SplitIO {
|
|
|
929
946
|
* @property {Object} urls
|
|
930
947
|
*/
|
|
931
948
|
urls?: UrlSettings,
|
|
949
|
+
sync?: ISharedSettings['sync'] & {
|
|
950
|
+
/**
|
|
951
|
+
* Enables synchronization of large segments.
|
|
952
|
+
* @property {boolean} largeSegmentsEnabled
|
|
953
|
+
* @default false
|
|
954
|
+
*/
|
|
955
|
+
largeSegmentsEnabled?: boolean
|
|
956
|
+
}
|
|
932
957
|
}
|
|
933
958
|
/**
|
|
934
959
|
* Settings interface for SDK instances created on NodeJS.
|
|
@@ -76,6 +76,7 @@ export const TELEMETRY = 'te';
|
|
|
76
76
|
export const TOKEN = 'to';
|
|
77
77
|
export const SEGMENT = 'se';
|
|
78
78
|
export const MY_SEGMENT = 'ms';
|
|
79
|
+
export const MY_LARGE_SEGMENT = 'mls';
|
|
79
80
|
|
|
80
81
|
export const TREATMENT = 't';
|
|
81
82
|
export const TREATMENTS = 'ts';
|
|
@@ -106,3 +107,7 @@ export const ENABLED = 1;
|
|
|
106
107
|
export const PAUSED = 2;
|
|
107
108
|
|
|
108
109
|
export const FLAG_SPEC_VERSION = '1.1';
|
|
110
|
+
|
|
111
|
+
// Matcher types
|
|
112
|
+
export const IN_SEGMENT = 'IN_SEGMENT';
|
|
113
|
+
export const IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -7,7 +7,7 @@ import { ISettingsValidationParams } from './types';
|
|
|
7
7
|
import { ISettings } from '../../types';
|
|
8
8
|
import { validateKey } from '../inputValidation/key';
|
|
9
9
|
import { validateTrafficType } from '../inputValidation/trafficType';
|
|
10
|
-
import { ERROR_MIN_CONFIG_PARAM } from '../../logger/constants';
|
|
10
|
+
import { ERROR_MIN_CONFIG_PARAM, LOG_PREFIX_CLIENT_INSTANTIATION } from '../../logger/constants';
|
|
11
11
|
|
|
12
12
|
// Exported for telemetry
|
|
13
13
|
export const base = {
|
|
@@ -32,6 +32,8 @@ export const base = {
|
|
|
32
32
|
featuresRefreshRate: 60,
|
|
33
33
|
// fetch segments updates each 60 sec
|
|
34
34
|
segmentsRefreshRate: 60,
|
|
35
|
+
// fetch large segments updates each 60 sec
|
|
36
|
+
largeSegmentsRefreshRate: 60,
|
|
35
37
|
// publish telemetry stats each 3600 secs (1 hour)
|
|
36
38
|
telemetryRefreshRate: 3600,
|
|
37
39
|
// publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
|
|
@@ -85,7 +87,8 @@ export const base = {
|
|
|
85
87
|
impressionsMode: OPTIMIZED,
|
|
86
88
|
localhostMode: undefined,
|
|
87
89
|
enabled: true,
|
|
88
|
-
flagSpecVersion: FLAG_SPEC_VERSION
|
|
90
|
+
flagSpecVersion: FLAG_SPEC_VERSION,
|
|
91
|
+
largeSegmentsEnabled: false
|
|
89
92
|
},
|
|
90
93
|
|
|
91
94
|
// Logger
|
|
@@ -132,6 +135,7 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV
|
|
|
132
135
|
const { scheduler, startup } = withDefaults;
|
|
133
136
|
scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
|
|
134
137
|
scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
|
|
138
|
+
scheduler.largeSegmentsRefreshRate = fromSecondsToMillis(scheduler.largeSegmentsRefreshRate);
|
|
135
139
|
scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
|
|
136
140
|
scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
|
|
137
141
|
scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
|
|
@@ -166,13 +170,13 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV
|
|
|
166
170
|
// Keeping same behaviour than JS SDK: if settings key or TT are invalid,
|
|
167
171
|
// `false` value is used as bound key/TT of the default client, which leads to some issues.
|
|
168
172
|
// @ts-ignore, @TODO handle invalid keys as a non-recoverable error?
|
|
169
|
-
withDefaults.core.key = validateKey(log, maybeKey,
|
|
173
|
+
withDefaults.core.key = validateKey(log, maybeKey, LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
170
174
|
}
|
|
171
175
|
|
|
172
176
|
if (validationParams.acceptTT) {
|
|
173
177
|
const maybeTT = withDefaults.core.trafficType;
|
|
174
178
|
if (maybeTT !== undefined) { // @ts-ignore
|
|
175
|
-
withDefaults.core.trafficType = validateTrafficType(log, maybeTT,
|
|
179
|
+
withDefaults.core.trafficType = validateTrafficType(log, maybeTT, LOG_PREFIX_CLIENT_INSTANTIATION);
|
|
176
180
|
}
|
|
177
181
|
}
|
|
178
182
|
} else {
|
|
@@ -209,11 +213,12 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV
|
|
|
209
213
|
const splitFiltersValidation = validateSplitFilters(log, sync.splitFilters, withDefaults.mode);
|
|
210
214
|
sync.splitFilters = splitFiltersValidation.validFilters;
|
|
211
215
|
sync.__splitFiltersValidation = splitFiltersValidation;
|
|
212
|
-
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : FLAG_SPEC_VERSION;
|
|
213
216
|
|
|
217
|
+
// ensure a valid flag spec version
|
|
218
|
+
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : FLAG_SPEC_VERSION;
|
|
214
219
|
// ensure a valid user consent value
|
|
215
220
|
// @ts-ignore, modify readonly prop
|
|
216
|
-
withDefaults.userConsent = consent(withDefaults);
|
|
221
|
+
withDefaults.userConsent = consent ? consent(withDefaults) : undefined;
|
|
217
222
|
|
|
218
223
|
return withDefaults;
|
|
219
224
|
}
|
|
@@ -25,7 +25,7 @@ export interface ISettingsValidationParams {
|
|
|
25
25
|
/** Localhost mode validator (`settings.sync.localhostMode`) */
|
|
26
26
|
localhost?: (settings: ISettings) => ISettings['sync']['localhostMode'],
|
|
27
27
|
/** User consent validator (`settings.userConsent`) */
|
|
28
|
-
consent
|
|
28
|
+
consent?: (settings: ISettings) => ISettings['userConsent'],
|
|
29
29
|
/** Flag spec version validation. Configurable by the JS Synchronizer but not by the SDKs */
|
|
30
30
|
flagSpec?: (settings: ISettings) => ISettings['sync']['flagSpecVersion']
|
|
31
31
|
}
|
package/types/dtos/types.d.ts
CHANGED
|
@@ -48,6 +48,10 @@ interface IInSegmentMatcher extends ISplitMatcherBase {
|
|
|
48
48
|
matcherType: 'IN_SEGMENT';
|
|
49
49
|
userDefinedSegmentMatcherData: IInSegmentMatcherData;
|
|
50
50
|
}
|
|
51
|
+
interface IInLargeSegmentMatcher extends ISplitMatcherBase {
|
|
52
|
+
matcherType: 'IN_LARGE_SEGMENT';
|
|
53
|
+
userDefinedSegmentMatcherData: IInSegmentMatcherData;
|
|
54
|
+
}
|
|
51
55
|
interface IWhitelistMatcher extends ISplitMatcherBase {
|
|
52
56
|
matcherType: 'WHITELIST';
|
|
53
57
|
whitelistMatcherData: IWhitelistMatcherData;
|
|
@@ -128,7 +132,7 @@ interface IInListSemverMatcher extends ISplitMatcherBase {
|
|
|
128
132
|
matcherType: 'IN_LIST_SEMVER';
|
|
129
133
|
whitelistMatcherData: IWhitelistMatcherData;
|
|
130
134
|
}
|
|
131
|
-
export declare type ISplitMatcher = IAllKeysMatcher | IInSegmentMatcher | IWhitelistMatcher | IEqualToMatcher | IGreaterThanOrEqualToMatcher | ILessThanOrEqualToMatcher | IBetweenMatcher | IEqualToSetMatcher | IContainsAnyOfSetMatcher | IContainsAllOfSetMatcher | IPartOfSetMatcher | IStartsWithMatcher | IEndsWithMatcher | IContainsStringMatcher | IInSplitTreatmentMatcher | IEqualToBooleanMatcher | IMatchesStringMatcher | IEqualToSemverMatcher | IGreaterThanOrEqualToSemverMatcher | ILessThanOrEqualToSemverMatcher | IBetweenSemverMatcher | IInListSemverMatcher;
|
|
135
|
+
export declare type ISplitMatcher = IAllKeysMatcher | IInSegmentMatcher | IWhitelistMatcher | IEqualToMatcher | IGreaterThanOrEqualToMatcher | ILessThanOrEqualToMatcher | IBetweenMatcher | IEqualToSetMatcher | IContainsAnyOfSetMatcher | IContainsAllOfSetMatcher | IPartOfSetMatcher | IStartsWithMatcher | IEndsWithMatcher | IContainsStringMatcher | IInSplitTreatmentMatcher | IEqualToBooleanMatcher | IMatchesStringMatcher | IEqualToSemverMatcher | IGreaterThanOrEqualToSemverMatcher | ILessThanOrEqualToSemverMatcher | IBetweenSemverMatcher | IInListSemverMatcher | IInLargeSegmentMatcher;
|
|
132
136
|
/** Split object */
|
|
133
137
|
export interface ISplitPartition {
|
|
134
138
|
treatment: string;
|
|
@@ -173,13 +177,17 @@ export interface ISegmentChangesResponse {
|
|
|
173
177
|
since: number;
|
|
174
178
|
till: number;
|
|
175
179
|
}
|
|
176
|
-
export interface IMySegmentsResponseItem {
|
|
177
|
-
id: string;
|
|
178
|
-
name: string;
|
|
179
|
-
}
|
|
180
180
|
/** Interface of the parsed JSON response of `/mySegments/{userKey}` */
|
|
181
181
|
export interface IMySegmentsResponse {
|
|
182
|
-
mySegments:
|
|
182
|
+
mySegments: {
|
|
183
|
+
id: string;
|
|
184
|
+
name: string;
|
|
185
|
+
}[];
|
|
186
|
+
}
|
|
187
|
+
/** Interface of the parsed JSON response of `/myLargeSegments/{userKey}` */
|
|
188
|
+
export interface IMyLargeSegmentsResponse {
|
|
189
|
+
myLargeSegments: string[];
|
|
190
|
+
changeNumber: number;
|
|
183
191
|
}
|
|
184
192
|
/** Metadata internal type for storages */
|
|
185
193
|
export interface IMetadata {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { MaybeThenable } from '../../dtos/types';
|
|
2
|
+
import { ISegmentsCacheBase } from '../../storages/types';
|
|
3
|
+
export declare function largeSegmentMatcherContext(largeSegmentName: string, storage: {
|
|
4
|
+
largeSegments?: ISegmentsCacheBase;
|
|
5
|
+
}): (key: string) => MaybeThenable<boolean>;
|
|
@@ -35,7 +35,6 @@ export declare const IMPRESSION = 102;
|
|
|
35
35
|
export declare const IMPRESSION_QUEUEING = 103;
|
|
36
36
|
export declare const NEW_SHARED_CLIENT = 104;
|
|
37
37
|
export declare const NEW_FACTORY = 105;
|
|
38
|
-
export declare const POLLING_SMART_PAUSING = 106;
|
|
39
38
|
export declare const POLLING_START = 107;
|
|
40
39
|
export declare const POLLING_STOP = 108;
|
|
41
40
|
export declare const SYNC_SPLITS_FETCH_RETRY = 109;
|
|
@@ -115,6 +114,7 @@ export declare const ERROR_SETS_FILTER_EXCLUSIVE = 328;
|
|
|
115
114
|
export declare const ENGINE_MATCHER_ERROR = 329;
|
|
116
115
|
export declare const LOG_PREFIX_SETTINGS = "settings";
|
|
117
116
|
export declare const LOG_PREFIX_INSTANTIATION = "Factory instantiation";
|
|
117
|
+
export declare const LOG_PREFIX_CLIENT_INSTANTIATION = "Client instantiation";
|
|
118
118
|
export declare const LOG_PREFIX_ENGINE = "engine";
|
|
119
119
|
export declare const LOG_PREFIX_ENGINE_COMBINER: string;
|
|
120
120
|
export declare const LOG_PREFIX_ENGINE_MATCHER: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IEventEmitter } from '../types';
|
|
1
|
+
import { IEventEmitter, ISettings } from '../types';
|
|
2
2
|
import { IReadinessManager, ISplitsEventEmitter } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
5
5
|
*/
|
|
6
|
-
export declare function readinessManagerFactory(EventEmitter: new () => IEventEmitter,
|
|
6
|
+
export declare function readinessManagerFactory(EventEmitter: new () => IEventEmitter, settings: ISettings, splits?: ISplitsEventEmitter): IReadinessManager;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ISdkReadinessManager } from './types';
|
|
2
|
-
import { IEventEmitter } from '../types';
|
|
3
|
-
import { ILogger } from '../logger/types';
|
|
2
|
+
import { IEventEmitter, ISettings } from '../types';
|
|
4
3
|
/**
|
|
5
4
|
* SdkReadinessManager factory, which provides the public status API of SDK clients and manager: ready promise, readiness event emitter and constants (SDK_READY, etc).
|
|
6
5
|
* It also updates logs related warnings and errors.
|
|
@@ -8,4 +7,4 @@ import { ILogger } from '../logger/types';
|
|
|
8
7
|
* @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
|
|
9
8
|
* @param readinessManager optional readinessManager to use. only used internally for `shared` method
|
|
10
9
|
*/
|
|
11
|
-
export declare function sdkReadinessManagerFactory(
|
|
10
|
+
export declare function sdkReadinessManagerFactory(EventEmitter: new () => IEventEmitter, settings: ISettings, readinessManager?: import("./types").IReadinessManager): ISdkReadinessManager;
|
|
@@ -34,6 +34,7 @@ export interface IReadinessManager {
|
|
|
34
34
|
/** Event emitters */
|
|
35
35
|
splits: ISplitsEventEmitter;
|
|
36
36
|
segments: ISegmentsEventEmitter;
|
|
37
|
+
largeSegments?: ISegmentsEventEmitter;
|
|
37
38
|
gate: IReadinessEventEmitter;
|
|
38
39
|
/** Readiness status */
|
|
39
40
|
isReady(): boolean;
|
|
@@ -45,7 +46,7 @@ export interface IReadinessManager {
|
|
|
45
46
|
setDestroyed(): void;
|
|
46
47
|
destroy(): void;
|
|
47
48
|
/** for client-side */
|
|
48
|
-
shared(
|
|
49
|
+
shared(): IReadinessManager;
|
|
49
50
|
}
|
|
50
51
|
/** SDK readiness manager */
|
|
51
52
|
export interface ISdkReadinessManager {
|
|
@@ -57,6 +58,6 @@ export interface ISdkReadinessManager {
|
|
|
57
58
|
*/
|
|
58
59
|
incInternalReadyCbCount(): void;
|
|
59
60
|
/** for client-side */
|
|
60
|
-
shared(
|
|
61
|
+
shared(): ISdkReadinessManager;
|
|
61
62
|
}
|
|
62
63
|
export {};
|
|
@@ -33,6 +33,7 @@ export interface ISplitApi {
|
|
|
33
33
|
fetchSplitChanges: IFetchSplitChanges;
|
|
34
34
|
fetchSegmentChanges: IFetchSegmentChanges;
|
|
35
35
|
fetchMySegments: IFetchMySegments;
|
|
36
|
+
fetchMyLargeSegments: IFetchMySegments;
|
|
36
37
|
postEventsBulk: IPostEventsBulk;
|
|
37
38
|
postUniqueKeysBulkCs: IPostUniqueKeysBulkCs;
|
|
38
39
|
postUniqueKeysBulkSs: IPostUniqueKeysBulkSs;
|
|
@@ -18,7 +18,7 @@ export declare abstract class AbstractSplitsCacheAsync implements ISplitsCacheAs
|
|
|
18
18
|
abstract getNamesByFlagSets(flagSets: string[]): Promise<ISet<string>[]>;
|
|
19
19
|
abstract trafficTypeExists(trafficType: string): Promise<boolean>;
|
|
20
20
|
abstract clear(): Promise<boolean | void>;
|
|
21
|
-
|
|
21
|
+
usesMatcher(): Promise<boolean>;
|
|
22
22
|
/**
|
|
23
23
|
* Check if the splits information is already stored in cache.
|
|
24
24
|
* Noop, just keeping the interface. This is used by client-side implementations only.
|
|
@@ -17,7 +17,7 @@ export declare abstract class AbstractSplitsCacheSync implements ISplitsCacheSyn
|
|
|
17
17
|
getAll(): ISplit[];
|
|
18
18
|
abstract getSplitNames(): string[];
|
|
19
19
|
abstract trafficTypeExists(trafficType: string): boolean;
|
|
20
|
-
abstract
|
|
20
|
+
abstract usesMatcher(matcherType: string): boolean;
|
|
21
21
|
abstract clear(): void;
|
|
22
22
|
/**
|
|
23
23
|
* Check if the splits information is already stored in cache. This data can be preloaded.
|
|
@@ -39,6 +39,6 @@ export declare abstract class AbstractSplitsCacheSync implements ISplitsCacheSyn
|
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
41
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
42
|
-
* This util is intended to simplify the implementation of `splitsCache::
|
|
42
|
+
* This util is intended to simplify the implementation of `splitsCache::usesMatcher` method
|
|
43
43
|
*/
|
|
44
|
-
export declare function
|
|
44
|
+
export declare function usesMatcher(split: ISplit, matcherType: string): boolean;
|
|
@@ -10,6 +10,7 @@ export declare class KeyBuilder {
|
|
|
10
10
|
isSplitKey(key: string): boolean;
|
|
11
11
|
buildSplitKeyPrefix(): string;
|
|
12
12
|
buildSplitsWithSegmentCountKey(): string;
|
|
13
|
+
buildSplitsWithLargeSegmentCountKey(): string;
|
|
13
14
|
buildSegmentNameKey(segmentName: string): string;
|
|
14
15
|
buildSegmentTillKey(segmentName: string): string;
|
|
15
16
|
extractKey(builtKey: string): string;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { KeyBuilder } from './KeyBuilder';
|
|
2
|
-
export
|
|
2
|
+
export interface MySegmentsKeyBuilder {
|
|
3
|
+
buildSegmentNameKey(segmentName: string): string;
|
|
4
|
+
extractSegmentName(builtSegmentKeyName: string): string | undefined;
|
|
5
|
+
extractOldSegmentKey(builtSegmentKeyName: string): string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare class KeyBuilderCS extends KeyBuilder implements MySegmentsKeyBuilder {
|
|
3
8
|
protected readonly regexSplitsCacheKey: RegExp;
|
|
4
9
|
protected readonly matchingKey: string;
|
|
5
10
|
constructor(prefix: string, matchingKey: string);
|
|
@@ -8,8 +13,8 @@ export declare class KeyBuilderCS extends KeyBuilder {
|
|
|
8
13
|
*/
|
|
9
14
|
buildSegmentNameKey(segmentName: string): string;
|
|
10
15
|
extractSegmentName(builtSegmentKeyName: string): string | undefined;
|
|
11
|
-
buildOldSegmentNameKey(segmentName: string): string;
|
|
12
16
|
extractOldSegmentKey(builtSegmentKeyName: string): string | undefined;
|
|
13
17
|
buildLastUpdatedKey(): string;
|
|
14
18
|
isSplitsCacheKey(key: string): boolean;
|
|
15
19
|
}
|
|
20
|
+
export declare function myLargeSegmentsKeyBuilder(prefix: string, matchingKey: string): MySegmentsKeyBuilder;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ILogger } from '../../logger/types';
|
|
2
2
|
import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
|
|
3
|
-
import {
|
|
3
|
+
import type { MySegmentsKeyBuilder } from '../KeyBuilderCS';
|
|
4
4
|
export declare class MySegmentsCacheInLocal extends AbstractSegmentsCacheSync {
|
|
5
5
|
private readonly keys;
|
|
6
6
|
private readonly log;
|
|
7
|
-
constructor(log: ILogger, keys:
|
|
7
|
+
constructor(log: ILogger, keys: MySegmentsKeyBuilder);
|
|
8
8
|
/**
|
|
9
9
|
* Removes list of segments from localStorage
|
|
10
10
|
* @NOTE this method is not being used at the moment.
|
|
@@ -34,7 +34,7 @@ export declare class SplitsCacheInLocal extends AbstractSplitsCacheSync {
|
|
|
34
34
|
getChangeNumber(): number;
|
|
35
35
|
getSplitNames(): string[];
|
|
36
36
|
trafficTypeExists(trafficType: string): boolean;
|
|
37
|
-
|
|
37
|
+
usesMatcher(matcherType: string): boolean;
|
|
38
38
|
/**
|
|
39
39
|
* Check if the splits information is already stored in browser LocalStorage.
|
|
40
40
|
* In this function we could add more code to check if the data is valid.
|
|
@@ -10,7 +10,8 @@ export declare class SplitsCacheInMemory extends AbstractSplitsCacheSync {
|
|
|
10
10
|
private splitsCache;
|
|
11
11
|
private ttCache;
|
|
12
12
|
private changeNumber;
|
|
13
|
-
private
|
|
13
|
+
private segmentsCount;
|
|
14
|
+
private largeSegmentsCount;
|
|
14
15
|
private flagSetsCache;
|
|
15
16
|
constructor(splitFiltersValidation?: ISplitFiltersValidation);
|
|
16
17
|
clear(): void;
|
|
@@ -21,7 +22,7 @@ export declare class SplitsCacheInMemory extends AbstractSplitsCacheSync {
|
|
|
21
22
|
getChangeNumber(): number;
|
|
22
23
|
getSplitNames(): string[];
|
|
23
24
|
trafficTypeExists(trafficType: string): boolean;
|
|
24
|
-
|
|
25
|
+
usesMatcher(matcherType: string): boolean;
|
|
25
26
|
getNamesByFlagSets(flagSets: string[]): ISet<string>[];
|
|
26
27
|
private addToFlagSets;
|
|
27
28
|
private removeFromFlagSets;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ImpressionDataType, EventDataType, StreamingEvent, Method, OperationType, TelemetryUsageStatsPayload, UpdatesFromSSEEnum } from '../../sync/submitters/types';
|
|
1
|
+
import { ImpressionDataType, EventDataType, StreamingEvent, Method, OperationType, TelemetryUsageStatsPayload, UpdatesFromSSEEnum, UpdatesFromSSE } from '../../sync/submitters/types';
|
|
2
2
|
import { ISegmentsCacheSync, ISplitsCacheSync, IStorageFactoryParams, ITelemetryCacheSync } from '../types';
|
|
3
3
|
export declare const MAX_LATENCY_BUCKET_COUNT = 23;
|
|
4
4
|
export declare function newBuckets(): number[];
|
|
@@ -10,7 +10,8 @@ export declare function shouldRecordTelemetry({ settings }: IStorageFactoryParam
|
|
|
10
10
|
export declare class TelemetryCacheInMemory implements ITelemetryCacheSync {
|
|
11
11
|
private splits?;
|
|
12
12
|
private segments?;
|
|
13
|
-
|
|
13
|
+
private largeSegments?;
|
|
14
|
+
constructor(splits?: ISplitsCacheSync | undefined, segments?: ISegmentsCacheSync | undefined, largeSegments?: ISegmentsCacheSync | undefined);
|
|
14
15
|
private e;
|
|
15
16
|
isEmpty(): boolean;
|
|
16
17
|
clear(): void;
|
|
@@ -65,9 +66,6 @@ export declare class TelemetryCacheInMemory implements ITelemetryCacheSync {
|
|
|
65
66
|
popLatencies(): Partial<Record<Method, number[]>>;
|
|
66
67
|
recordLatency(method: Method, latencyMs: number): void;
|
|
67
68
|
private updatesFromSSE;
|
|
68
|
-
popUpdatesFromSSE():
|
|
69
|
-
sp: number;
|
|
70
|
-
ms: number;
|
|
71
|
-
};
|
|
69
|
+
popUpdatesFromSSE(): UpdatesFromSSE;
|
|
72
70
|
recordUpdatesFromSSE(type: UpdatesFromSSEEnum): void;
|
|
73
71
|
}
|
|
@@ -5,7 +5,7 @@ import { ISet } from '../../utils/lang/sets';
|
|
|
5
5
|
* The `_cache` property is the object were items are stored.
|
|
6
6
|
* Intended for testing purposes.
|
|
7
7
|
*
|
|
8
|
-
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves
|
|
8
|
+
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves immediately.
|
|
9
9
|
*/
|
|
10
10
|
export declare function inMemoryWrapperFactory(connDelay?: number): IPluggableStorageWrapper & {
|
|
11
11
|
_cache: Record<string, string | string[] | ISet<string>>;
|
|
@@ -189,7 +189,7 @@ export interface ISplitsCacheBase {
|
|
|
189
189
|
getAll(): MaybeThenable<ISplit[]>;
|
|
190
190
|
getSplitNames(): MaybeThenable<string[]>;
|
|
191
191
|
trafficTypeExists(trafficType: string): MaybeThenable<boolean>;
|
|
192
|
-
|
|
192
|
+
usesMatcher(matcherType: string): MaybeThenable<boolean>;
|
|
193
193
|
clear(): MaybeThenable<boolean | void>;
|
|
194
194
|
checkCache(): MaybeThenable<boolean>;
|
|
195
195
|
killLocally(name: string, defaultTreatment: string, changeNumber: number): MaybeThenable<boolean>;
|
|
@@ -205,7 +205,7 @@ export interface ISplitsCacheSync extends ISplitsCacheBase {
|
|
|
205
205
|
getAll(): ISplit[];
|
|
206
206
|
getSplitNames(): string[];
|
|
207
207
|
trafficTypeExists(trafficType: string): boolean;
|
|
208
|
-
|
|
208
|
+
usesMatcher(matcherType: string): boolean;
|
|
209
209
|
clear(): void;
|
|
210
210
|
checkCache(): boolean;
|
|
211
211
|
killLocally(name: string, defaultTreatment: string, changeNumber: number): boolean;
|
|
@@ -221,7 +221,7 @@ export interface ISplitsCacheAsync extends ISplitsCacheBase {
|
|
|
221
221
|
getAll(): Promise<ISplit[]>;
|
|
222
222
|
getSplitNames(): Promise<string[]>;
|
|
223
223
|
trafficTypeExists(trafficType: string): Promise<boolean>;
|
|
224
|
-
|
|
224
|
+
usesMatcher(matcherType: string): Promise<boolean>;
|
|
225
225
|
clear(): Promise<boolean | void>;
|
|
226
226
|
checkCache(): Promise<boolean>;
|
|
227
227
|
killLocally(name: string, defaultTreatment: string, changeNumber: number): Promise<boolean>;
|
|
@@ -388,6 +388,7 @@ export interface IStorageBase<TSplitsCache extends ISplitsCacheBase, TSegmentsCa
|
|
|
388
388
|
shared?: (matchingKey: string, onReadyCb: (error?: any) => void) => this;
|
|
389
389
|
}
|
|
390
390
|
export interface IStorageSync extends IStorageBase<ISplitsCacheSync, ISegmentsCacheSync, IImpressionsCacheSync, IImpressionCountsCacheSync, IEventsCacheSync, ITelemetryCacheSync, IUniqueKeysCacheSync> {
|
|
391
|
+
largeSegments?: ISegmentsCacheSync;
|
|
391
392
|
}
|
|
392
393
|
export interface IStorageAsync extends IStorageBase<ISplitsCacheAsync, ISegmentsCacheAsync, IImpressionsCacheAsync | IImpressionsCacheSync, IImpressionCountsCacheBase, IEventsCacheAsync | IEventsCacheSync, ITelemetryCacheAsync | ITelemetryCacheSync, IUniqueKeysCacheBase> {
|
|
393
394
|
}
|