diff --git a/CHANGES.txt b/CHANGES.txt index 3d681b60..dfd38418 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +1.4.2 (June XX, 2022) + - Added `sync.enabled` property to SDK configuration to allow synchronize splits and segments once + 1.4.1 (June 13, 2022) - Bugfixing - Updated submitters logic, to avoid dropping impressions and events that are being tracked while POST request is pending. diff --git a/package-lock.json b/package-lock.json index c959e174..9f91c91a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-commons", - "version": "1.4.1", + "version": "1.4.2-rc.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4842,7 +4842,7 @@ "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, "lodash.isarguments": { diff --git a/package.json b/package.json index d9951490..c28a1923 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-commons", - "version": "1.4.1", + "version": "1.4.2-rc.0", "description": "Split Javascript SDK common components", "main": "cjs/index.js", "module": "esm/index.js", diff --git a/src/sync/__tests__/syncManagerOnline.spec.ts b/src/sync/__tests__/syncManagerOnline.spec.ts index d60156ab..ac0d81bf 100644 --- a/src/sync/__tests__/syncManagerOnline.spec.ts +++ b/src/sync/__tests__/syncManagerOnline.spec.ts @@ -74,11 +74,11 @@ test('syncManagerOnline should start or not the submitter depending on user cons }); -test('syncManagerOnline should syncAll a single time in singleSync mode', () => { +test('syncManagerOnline should syncAll a single time when sync is disabled', () => { const settings = { ...fullSettings }; - // Enable single sync - settings.sync.singleSync = true; + // disable sync + settings.sync.enabled = false; // @ts-ignore // Test pushManager for main client @@ -151,7 +151,7 @@ test('syncManagerOnline should syncAll a single time in singleSync mode', () => pushingSyncManagerShared.stop(); - settings.sync.singleSync = false; + settings.sync.enabled = true; // @ts-ignore // pushManager instantiation control test const testSyncManager = syncManagerOnlineFactory(() => pollingManagerMock, pushManagerFactoryMock)({ settings }); diff --git a/src/sync/syncManagerOnline.ts b/src/sync/syncManagerOnline.ts index f51bcce3..8ac9fc31 100644 --- a/src/sync/syncManagerOnline.ts +++ b/src/sync/syncManagerOnline.ts @@ -28,13 +28,13 @@ export function syncManagerOnlineFactory( */ return function (params: ISdkFactoryContextSync): ISyncManagerCS { - const { settings, settings: { log, streamingEnabled, sync: { singleSync } }, telemetryTracker } = params; + const { settings, settings: { log, streamingEnabled, sync: { enabled: syncEnabled } }, telemetryTracker } = params; /** Polling Manager */ const pollingManager = pollingManagerFactory && pollingManagerFactory(params); /** Push Manager */ - const pushManager = !singleSync && streamingEnabled && pollingManager && pushManagerFactory ? + const pushManager = syncEnabled && streamingEnabled && pollingManager && pushManagerFactory ? pushManagerFactory(params, pollingManager) : undefined; @@ -90,13 +90,8 @@ export function syncManagerOnlineFactory( // start syncing splits and segments if (pollingManager) { - // If singleSync is enabled pushManager and pollingManager should not start - if (singleSync === true) { - if (startFirstTime) { - pollingManager.syncAll(); - startFirstTime = false; - } - } else { + // If synchronization is disabled pushManager and pollingManager should not start + if (syncEnabled) { if (pushManager) { // Doesn't call `syncAll` when the syncManager is resuming if (startFirstTime) { @@ -107,6 +102,11 @@ export function syncManagerOnlineFactory( } else { pollingManager.start(); } + } else { + if (startFirstTime) { + pollingManager.syncAll(); + startFirstTime = false; + } } } @@ -147,9 +147,7 @@ export function syncManagerOnlineFactory( return { isRunning: mySegmentsSyncTask.isRunning, start() { - if (singleSync === true) { - if (!readinessManager.isReady()) mySegmentsSyncTask.execute(); - } else { + if (syncEnabled) { if (pushManager) { if (pollingManager!.isRunning()) { // if doing polling, we must start the periodic fetch of data @@ -163,6 +161,8 @@ export function syncManagerOnlineFactory( } else { if (storage.splits.usesSegments()) mySegmentsSyncTask.start(); } + } else { + if (!readinessManager.isReady()) mySegmentsSyncTask.execute(); } }, stop() { diff --git a/src/types.ts b/src/types.ts index a8d7b45c..a45c27a7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -118,7 +118,7 @@ export interface ISettings { impressionsMode: SplitIO.ImpressionsMode, __splitFiltersValidation: ISplitFiltersValidation, localhostMode?: SplitIO.LocalhostFactory, - singleSync: boolean + enabled: boolean }, readonly runtime: { ip: string | false @@ -216,10 +216,10 @@ interface ISharedSettings { */ impressionsMode?: SplitIO.ImpressionsMode, /** - * single Sync enables. - * @property {boolean} singleSync + * Enables synchronization. + * @property {boolean} enabled */ - singleSync: boolean + enabled: boolean } } /** diff --git a/src/utils/settingsValidation/__tests__/index.spec.ts b/src/utils/settingsValidation/__tests__/index.spec.ts index 8b53f43f..2b3f4918 100644 --- a/src/utils/settingsValidation/__tests__/index.spec.ts +++ b/src/utils/settingsValidation/__tests__/index.spec.ts @@ -40,7 +40,7 @@ describe('settingsValidation', () => { telemetry: 'https://telemetry.split.io/api', }); expect(settings.sync.impressionsMode).toBe(OPTIMIZED); - expect(settings.sync.singleSync).toBe(false); + expect(settings.sync.enabled).toBe(true); }); test('override with default impressionMode if provided one is invalid', () => { @@ -164,23 +164,24 @@ describe('settingsValidation', () => { expect(settingsWithStreamingEnabled.streamingEnabled).toBe(true); // If streamingEnabled is not provided, it will be true. }); - test('singleSync should be overwritable and false by default', () => { - const settingsWithSingleSyncDisabled = settingsValidation({ + test('sync.enabled should be overwritable and true by default', () => { + const settingsWithSyncEnabled = settingsValidation({ core: { authorizationKey: 'dummy token', } }, minimalSettingsParams); - const settingsWithSingleSyncEnabled = settingsValidation({ + + const settingsWithSyncDisabled = settingsValidation({ core: { authorizationKey: 'dummy token' }, sync: { - singleSync: true + enabled: false } }, minimalSettingsParams); - expect(settingsWithSingleSyncDisabled.sync.singleSync).toBe(false); // If singleSync is not provided, it will be true. - expect(settingsWithSingleSyncEnabled.sync.singleSync).toBe(true); // When creating a setting instance, it will have the provided value for singleSync + expect(settingsWithSyncDisabled.sync.enabled).toBe(false); // If sync.enabled is not provided, it will be true. + expect(settingsWithSyncEnabled.sync.enabled).toBe(true); // When creating a setting instance, it will have the provided value for sync.enabled }); diff --git a/src/utils/settingsValidation/__tests__/settings.mocks.ts b/src/utils/settingsValidation/__tests__/settings.mocks.ts index 5e79e487..8d213b03 100644 --- a/src/utils/settingsValidation/__tests__/settings.mocks.ts +++ b/src/utils/settingsValidation/__tests__/settings.mocks.ts @@ -79,7 +79,7 @@ export const fullSettings: ISettings = { queryString: null, groupedFilters: { byName: [], byPrefix: [] } }, - singleSync: false + enabled: true }, version: 'jest', runtime: { diff --git a/src/utils/settingsValidation/index.ts b/src/utils/settingsValidation/index.ts index 277063e8..84d97954 100644 --- a/src/utils/settingsValidation/index.ts +++ b/src/utils/settingsValidation/index.ts @@ -84,7 +84,7 @@ export const base = { // impressions collection mode impressionsMode: OPTIMIZED, localhostMode: undefined, - singleSync: false + enabled: true }, // Logger @@ -192,9 +192,9 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV scheduler.pushRetryBackoffBase = fromSecondsToMillis(scheduler.pushRetryBackoffBase); } - // validate singleSync - if (withDefaults.sync.singleSync !== true) { // @ts-ignore, modify readonly prop - withDefaults.sync.singleSync = false; + // validate sync enabled + if (withDefaults.sync.enabled !== false) { // @ts-ignore, modify readonly prop + withDefaults.sync.enabled = true; } // validate the `splitFilters` settings and parse splits query