diff --git a/CHANGES.txt b/CHANGES.txt index 2f353229..9dd13056 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +3.1.0 (July XX, 2026) + - Added support for rule-based segments in /api/v1/configs endpoint. + 3.0.0 (June 26, 2026) - Extracted SDK lifecycle methods (`init`, `flush`, and `destroy`) into a reusable `sdkLifecycle` module. - Extracted the `track` method into a standalone `trackMethod` factory for reuse across SDKs. diff --git a/package-lock.json b/package-lock.json index 0c2b5034..42dec283 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@splitsoftware/splitio-commons", - "version": "3.0.0", + "version": "3.0.1-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@splitsoftware/splitio-commons", - "version": "3.0.0", + "version": "3.0.1-rc.2", "license": "Apache-2.0", "dependencies": { "@types/ioredis": "^4.28.0", diff --git a/package.json b/package.json index 9c031dfe..2d5c30ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-commons", - "version": "3.0.0", + "version": "3.0.1-rc.2", "description": "Split JavaScript SDK common components", "main": "cjs/index.js", "module": "esm/index.js", diff --git a/src/sdkClient/sdkLifecycle.ts b/src/sdkClient/sdkLifecycle.ts index fa0cb602..6e4d1b95 100644 --- a/src/sdkClient/sdkLifecycle.ts +++ b/src/sdkClient/sdkLifecycle.ts @@ -1,5 +1,6 @@ import { releaseApiKey, validateAndTrackApiKey } from '../utils/inputValidation/apiKey'; import { ISdkFactoryContext } from '../sdkFactory/types'; +import { LOCALHOST_MODE } from '../utils/constants'; const COOLDOWN_TIME_IN_MILLIS = 1000; @@ -12,7 +13,7 @@ export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?: let hasInit = false; let lastActionTime = 0; - const signalListener = platform.SignalListener && new platform.SignalListener(params); + const signalListener = platform.SignalListener && settings.mode !== LOCALHOST_MODE ? new platform.SignalListener(params) : undefined; function __cooldown(func: Function, time: number) { const now = Date.now(); diff --git a/src/sdkFactory/types.ts b/src/sdkFactory/types.ts index 1dd5c7f7..14bffc56 100644 --- a/src/sdkFactory/types.ts +++ b/src/sdkFactory/types.ts @@ -105,11 +105,7 @@ export interface ISdkFactoryParams { // Sdk client method factory. // It Allows to distinguish SDK clients with the client-side API (`IBrowserSDK` and `IBrowserAsyncSDK`) or server-side API (`ISDK` and `IAsyncSDK`). - sdkClientMethodFactory: (params: ISdkFactoryContext) => ( - { (): SplitIO.IBrowserClient & { init(): void }; (key: SplitIO.SplitKey): SplitIO.IBrowserClient & { init(): void }; } | - (() => SplitIO.IClient & { init(): void }) | - (() => SplitIO.IAsyncClient & { init(): void }) - ) + sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ (): SplitIO.IBrowserClient; (key: SplitIO.SplitKey): SplitIO.IBrowserClient; } | (() => SplitIO.IClient) | (() => SplitIO.IAsyncClient)) // Impression observer factory. impressionsObserverFactory: () => IImpressionObserver diff --git a/src/services/__tests__/splitApi.spec.ts b/src/services/__tests__/splitApi.spec.ts index a5aacd45..a77c1708 100644 --- a/src/services/__tests__/splitApi.spec.ts +++ b/src/services/__tests__/splitApi.spec.ts @@ -45,10 +45,10 @@ describe('serviceApi', () => { assertHeaders(settings, headers); expect(url).toBe(expectedFlagsUrl(-1, 100, settings.validateFilters || false, settings, -1)); - serviceApi.fetchConfigs(-1, false, 100); + serviceApi.fetchConfigs(-1, false, 100, -1); [url, { headers }] = fetchMock.mock.calls[4]; assertHeaders(settings, headers); - expect(url).toBe(expectedConfigsUrl(-1, 100, settings.validateFilters || false, settings)); + expect(url).toBe(expectedConfigsUrl(-1, 100, settings.validateFilters || false, settings, -1)); serviceApi.fetchConfigsSegmentChanges(-1, 'segmentName', false, 100); [url, { headers }] = fetchMock.mock.calls[5]; @@ -81,9 +81,9 @@ describe('serviceApi', () => { return `sdk/splitChanges?s=1.1&since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${usesFilter ? filterQueryString : ''}${till ? '&till=' + till : ''}`; } - function expectedConfigsUrl(since: number, till: number, usesFilter: boolean, settings: ISettings) { + function expectedConfigsUrl(since: number, till: number, usesFilter: boolean, settings: ISettings, rbSince?: number) { const filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString; - return `configs/v1/configs?since=${since}${usesFilter ? filterQueryString : ''}${till ? '&till=' + till : ''}`; + return `configs/v1/configs?since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${usesFilter ? filterQueryString : ''}${till ? '&till=' + till : ''}`; } }); diff --git a/src/services/serviceApi.ts b/src/services/serviceApi.ts index 518fbaab..207b3b08 100644 --- a/src/services/serviceApi.ts +++ b/src/services/serviceApi.ts @@ -70,8 +70,8 @@ export function serviceApiFactory( }, // @TODO support filterQueryString and handle ERROR_TOO_MANY_SETS error - fetchConfigs(since: number, noCache?: boolean, till?: number) { - const url = `${urls.configs}/api/v1/configs?since=${since}${filterQueryString || ''}${till ? '&till=' + till : ''}`; + fetchConfigs(since: number, noCache?: boolean, till?: number, rbSince?: number) { + const url = `${urls.configs}/api/v1/configs?since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${filterQueryString || ''}${till ? '&till=' + till : ''}`; return secureSplitHttpClient(url, noCache ? noCacheHeaderOptions : undefined); }, diff --git a/src/services/splitApi.ts b/src/services/splitApi.ts index 935ed8d8..ba7ff38c 100644 --- a/src/services/splitApi.ts +++ b/src/services/splitApi.ts @@ -149,8 +149,8 @@ export function splitApiFactory( // Not used. Just here to satisfy the IServiceApi interface. - fetchConfigs(since: number, noCache?: boolean, till?: number) { - const url = `${urls.configs}/v1/configs?since=${since}${filterQueryString || ''}${till ? '&till=' + till : ''}`; + fetchConfigs(since: number, noCache?: boolean, till?: number, rbSince?: number) { + const url = `${urls.configs}/v1/configs?since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${filterQueryString || ''}${till ? '&till=' + till : ''}`; return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined); }, diff --git a/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts b/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts index 0a1cc258..94ad2e55 100644 --- a/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +++ b/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts @@ -8,12 +8,10 @@ import { StorageAdapter } from '../types'; export class MySegmentsCacheInLocal extends AbstractMySegmentsCacheSync { private readonly keys: MySegmentsKeyBuilder; - private readonly log: ILogger; private readonly storage: StorageAdapter; - constructor(log: ILogger, keys: MySegmentsKeyBuilder, storage: StorageAdapter) { + constructor(_log: ILogger, keys: MySegmentsKeyBuilder, storage: StorageAdapter) { super(); - this.log = log; this.keys = keys; this.storage = storage; } diff --git a/src/utils/EventEmitter.d.ts b/src/utils/EventEmitter.d.ts new file mode 100644 index 00000000..754737bd --- /dev/null +++ b/src/utils/EventEmitter.d.ts @@ -0,0 +1,3 @@ +import SplitIO from '../../types/splitio'; + +export declare const EventEmitter: new () => SplitIO.IEventEmitter;