Skip to content

Commit 485d432

Browse files
Add CONFIGS_UPDATE constant and update splitChangesUpdater for configs support
1 parent aa9ff60 commit 485d432

6 files changed

Lines changed: 22 additions & 15 deletions

File tree

src/readiness/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ export const SDK_UPDATE = 'state::update';
1414
// SdkUpdateMetadata types:
1515
export const FLAGS_UPDATE = 'FLAGS_UPDATE';
1616
export const SEGMENTS_UPDATE = 'SEGMENTS_UPDATE';
17+
export const CONFIGS_UPDATE = 'CONFIGS_UPDATE';

src/sdkConfigs/index.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,9 @@ export function sdkConfigsFactory(params: ISdkFactoryParams): SplitIO.ConfigsCli
6767
Object.create(sdkReadinessManager.sdkStatus) as SplitIO.IStatusInterface,
6868
sdkLifecycleFactory(ctx),
6969
{
70-
getConfig(name: string, target?: SplitIO.Target): SplitIO.Config {
71-
return {
72-
value: name + target,
73-
} as SplitIO.Config;
70+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
71+
getConfig(_name: string, _target?: SplitIO.Target): SplitIO.Config {
72+
throw new Error('getConfig not implemented');
7473
},
7574

7675
track() {

src/sync/polling/syncTasks/splitsSyncTask.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function splitsSyncTaskFactory(
2020
return syncTaskFactory(
2121
settings.log,
2222
splitChangesUpdaterFactory(
23-
settings.log,
23+
settings,
2424
splitChangesFetcherFactory(fetchSplitChanges, settings, storage),
2525
storage,
2626
settings.sync.__splitFiltersValidation,

src/sync/polling/updaters/__tests__/splitChangesUpdater.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ describe('splitChangesUpdater', () => {
205205

206206
let splitFiltersValidation = { queryString: null, groupedFilters: { bySet: [], byName: [], byPrefix: [] }, validFilters: [] };
207207

208-
let splitChangesUpdater = splitChangesUpdaterFactory(loggerMock, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1);
208+
let splitChangesUpdater = splitChangesUpdaterFactory({ log: loggerMock }, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1);
209209

210210
afterEach(() => {
211211
jest.clearAllMocks();
@@ -279,7 +279,7 @@ describe('splitChangesUpdater', () => {
279279
{ sets: ['set_a'], shouldEmit: true }, /* should emit if flag is back in configured sets */
280280
];
281281

282-
splitChangesUpdater = splitChangesUpdaterFactory(loggerMock, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1, true);
282+
splitChangesUpdater = splitChangesUpdaterFactory({ log: loggerMock }, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1, true);
283283

284284
let index = 0;
285285
let calls = 0;
@@ -294,7 +294,7 @@ describe('splitChangesUpdater', () => {
294294
// @ts-ignore
295295
splitFiltersValidation = { queryString: null, groupedFilters: { bySet: ['set_a'], byName: [], byPrefix: [] }, validFilters: [] };
296296
storage.splits.clear();
297-
splitChangesUpdater = splitChangesUpdaterFactory(loggerMock, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1, true);
297+
splitChangesUpdater = splitChangesUpdaterFactory({ log: loggerMock }, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1, true);
298298
splitsEmitSpy.mockReset();
299299
index = 0;
300300
for (const setMock of setMocks) {
@@ -414,7 +414,7 @@ describe('splitChangesUpdater', () => {
414414
readinessManager.segments.segmentsArrived = false; // Segments not ready - client-side should still emit
415415

416416
// Create client-side updater (isClientSide = true)
417-
const clientSideUpdater = splitChangesUpdaterFactory(loggerMock, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1, true);
417+
const clientSideUpdater = splitChangesUpdaterFactory({ log: loggerMock }, splitChangesFetcher, storage, splitFiltersValidation, readinessManager.splits, 1000, 1, true);
418418

419419
const flag1 = { name: 'client-flag', status: 'ACTIVE', changeNumber: 300, conditions: [] } as unknown as ISplit;
420420
fetchMock.once('*', { status: 200, body: { ff: { d: [flag1], t: 300 } } });

src/sync/polling/updaters/splitChangesUpdater.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { ISplitChangesFetcher } from '../fetchers/types';
33
import { IRBSegment, ISplit, ISplitChangesResponse, ISplitFiltersValidation, MaybeThenable } from '../../../dtos/types';
44
import { ISplitsEventEmitter } from '../../../readiness/types';
55
import { timeout } from '../../../utils/promise/timeout';
6-
import { SDK_SPLITS_ARRIVED, FLAGS_UPDATE, SEGMENTS_UPDATE } from '../../../readiness/constants';
7-
import { ILogger } from '../../../logger/types';
6+
import { SDK_SPLITS_ARRIVED, FLAGS_UPDATE, SEGMENTS_UPDATE, CONFIGS_UPDATE } from '../../../readiness/constants';
87
import { SYNC_SPLITS_FETCH, SYNC_SPLITS_UPDATE, SYNC_RBS_UPDATE, SYNC_SPLITS_FETCH_FAILS, SYNC_SPLITS_FETCH_RETRY } from '../../../logger/constants';
98
import { startsWith } from '../../../utils/lang';
109
import { IN_RULE_BASED_SEGMENT, IN_SEGMENT, RULE_BASED_SEGMENT, STANDARD_SEGMENT } from '../../../utils/constants';
1110
import { setToArray } from '../../../utils/lang/sets';
1211
import { SPLIT_UPDATE } from '../../streaming/constants';
1312
import { SdkUpdateMetadata } from '../../../../types/splitio';
13+
import { ISettings } from '../../../types';
1414

1515
export type InstantUpdate = { payload: ISplit | IRBSegment, changeNumber: number, type: string };
1616
type SplitChangesUpdater = (noCache?: boolean, till?: number, instantUpdate?: InstantUpdate) => Promise<boolean>
@@ -120,7 +120,7 @@ export function computeMutation<T extends ISplit | IRBSegment>(rules: Array<T>,
120120
* @param retriesOnFailureBeforeReady - How many retries on `/splitChanges` we the updater do in case of failure or timeout. Default 0, i.e., no retries.
121121
*/
122122
export function splitChangesUpdaterFactory(
123-
log: ILogger,
123+
settings: Pick<ISettings, 'log' | 'definitionsType'>,
124124
splitChangesFetcher: ISplitChangesFetcher,
125125
storage: Pick<IStorageBase, 'splits' | 'rbSegments' | 'segments' | 'save'>,
126126
splitFiltersValidation: ISplitFiltersValidation,
@@ -129,6 +129,7 @@ export function splitChangesUpdaterFactory(
129129
retriesOnFailureBeforeReady = 0,
130130
isClientSide?: boolean
131131
): SplitChangesUpdater {
132+
const { log, definitionsType } = settings;
132133
const { splits, rbSegments, segments } = storage;
133134

134135
let startingUp = true;
@@ -202,7 +203,9 @@ export function splitChangesUpdaterFactory(
202203
// emit SDK events
203204
if (emitSplitsArrivedEvent) {
204205
const metadata: SdkUpdateMetadata = {
205-
type: updatedFlags.length > 0 ? FLAGS_UPDATE : SEGMENTS_UPDATE,
206+
type: updatedFlags.length > 0 ?
207+
definitionsType === 'configs' ? CONFIGS_UPDATE : FLAGS_UPDATE :
208+
SEGMENTS_UPDATE,
206209
names: updatedFlags.length > 0 ? updatedFlags : []
207210
};
208211
splitsEventEmitter.emit(SDK_SPLITS_ARRIVED, metadata);

types/splitio.d.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ declare namespace SplitIO {
509509
/**
510510
* Metadata type for SDK update events.
511511
*/
512-
type SdkUpdateMetadataType = 'FLAGS_UPDATE' | 'SEGMENTS_UPDATE';
512+
type SdkUpdateMetadataType = 'CONFIGS_UPDATE' | 'FLAGS_UPDATE' | 'SEGMENTS_UPDATE';
513513

514514
/**
515515
* Metadata for the ready events emitted when the SDK is ready to evaluate feature flags.
@@ -2339,7 +2339,11 @@ declare namespace SplitIO {
23392339
/**
23402340
* Custom endpoints to replace the default ones used by the SDK.
23412341
*/
2342-
urls?: UrlSettings;
2342+
urls?: UrlSettings | string;
2343+
/**
2344+
* Fallback configuration objects to use when the SDK is unable to fetch the configurations from the server.
2345+
*/
2346+
fallbacks?: FallbackTreatmentConfiguration;
23432347
// /**
23442348
// * Defines what impressions are sent to Split servers.
23452349
// * - DEBUG: all impressions are sent.

0 commit comments

Comments
 (0)