Skip to content

Commit be20611

Browse files
Merge pull request #514 from splitio/development
Release v3.1.0
2 parents 3b40735 + f8df75d commit be20611

20 files changed

Lines changed: 61 additions & 70 deletions

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
3.1.0 (July 23, 2026)
2+
- Added support for rule-based segments in /api/v1/configs endpoint.
3+
- Updated polling flow to fetch new referenced segments immediately.
4+
15
3.0.0 (June 26, 2026)
26
- Extracted SDK lifecycle methods (`init`, `flush`, and `destroy`) into a reusable `sdkLifecycle` module.
37
- Extracted the `track` method into a standalone `trackMethod` factory for reuse across SDKs.

package-lock.json

Lines changed: 18 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@splitsoftware/splitio-commons",
3-
"version": "3.0.0",
3+
"version": "3.1.0",
44
"description": "Split JavaScript SDK common components",
55
"main": "cjs/index.js",
66
"module": "esm/index.js",

src/dtos/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export interface IDefinitionCondition {
192192
matchers: IDefinitionMatcher[]
193193
}
194194
partitions?: IDefinitionPartition[]
195-
label?: string
195+
label?: string | null
196196
conditionType?: 'ROLLOUT' | 'WHITELIST'
197197
}
198198

src/evaluator/condition/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import SplitIO from '../../../types/splitio';
77
import { ILogger } from '../../logger/types';
88

99
// Build Evaluation object if and only if matchingResult is true
10-
function match(log: ILogger, matchingResult: boolean, bucketingKey: string | undefined, seed?: number, treatments?: { getTreatmentFor: (x: number) => string }, label?: string): IEvaluation | boolean | undefined {
10+
function match(log: ILogger, matchingResult: boolean, bucketingKey: string | undefined, seed?: number, treatments?: { getTreatmentFor: (x: number) => string }, label?: string | null): IEvaluation | boolean | undefined {
1111
if (matchingResult) {
1212
return treatments ? // Feature flag
1313
{
1414
treatment: getTreatment(log, bucketingKey as string, seed, treatments),
15-
label: label!
15+
label: label ?? ''
1616
} : // Rule-based segment
1717
true;
1818
}
@@ -22,7 +22,7 @@ function match(log: ILogger, matchingResult: boolean, bucketingKey: string | und
2222
}
2323

2424
// Condition factory
25-
export function conditionContext(log: ILogger, matcherEvaluator: (key: SplitIO.SplitKeyObject, attributes?: SplitIO.Attributes, splitEvaluator?: IDefinitionEvaluator) => MaybeThenable<boolean>, treatments?: { getTreatmentFor: (x: number) => string }, label?: string, conditionType?: 'ROLLOUT' | 'WHITELIST'): IEvaluator {
25+
export function conditionContext(log: ILogger, matcherEvaluator: (key: SplitIO.SplitKeyObject, attributes?: SplitIO.Attributes, splitEvaluator?: IDefinitionEvaluator) => MaybeThenable<boolean>, treatments?: { getTreatmentFor: (x: number) => string }, label?: string | null, conditionType?: 'ROLLOUT' | 'WHITELIST'): IEvaluator {
2626

2727
return function conditionEvaluator(key: SplitIO.SplitKeyObject, seed?: number, trafficAllocation?: number, trafficAllocationSeed?: number, attributes?: SplitIO.Attributes, splitEvaluator?: IDefinitionEvaluator) {
2828

src/sdkClient/sdkLifecycle.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { releaseApiKey, validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
22
import { ISdkFactoryContext } from '../sdkFactory/types';
3+
import { LOCALHOST_MODE } from '../utils/constants';
34

45
const COOLDOWN_TIME_IN_MILLIS = 1000;
56

@@ -12,7 +13,7 @@ export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?:
1213
let hasInit = false;
1314
let lastActionTime = 0;
1415

15-
const signalListener = platform.SignalListener && new platform.SignalListener(params);
16+
const signalListener = platform.SignalListener && settings.mode !== LOCALHOST_MODE ? new platform.SignalListener(params) : undefined;
1617

1718
function __cooldown(func: Function, time: number) {
1819
const now = Date.now();

src/sdkFactory/types.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,7 @@ export interface ISdkFactoryParams {
105105

106106
// Sdk client method factory.
107107
// It Allows to distinguish SDK clients with the client-side API (`IBrowserSDK` and `IBrowserAsyncSDK`) or server-side API (`ISDK` and `IAsyncSDK`).
108-
sdkClientMethodFactory: (params: ISdkFactoryContext) => (
109-
{ (): SplitIO.IBrowserClient & { init(): void }; (key: SplitIO.SplitKey): SplitIO.IBrowserClient & { init(): void }; } |
110-
(() => SplitIO.IClient & { init(): void }) |
111-
(() => SplitIO.IAsyncClient & { init(): void })
112-
)
108+
sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ (): SplitIO.IBrowserClient; (key: SplitIO.SplitKey): SplitIO.IBrowserClient; } | (() => SplitIO.IClient) | (() => SplitIO.IAsyncClient))
113109

114110
// Impression observer factory.
115111
impressionsObserverFactory: () => IImpressionObserver

src/services/__tests__/splitApi.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ describe('serviceApi', () => {
4545
assertHeaders(settings, headers);
4646
expect(url).toBe(expectedFlagsUrl(-1, 100, settings.validateFilters || false, settings, -1));
4747

48-
serviceApi.fetchConfigs(-1, false, 100);
48+
serviceApi.fetchConfigs(-1, false, 100, -1);
4949
[url, { headers }] = fetchMock.mock.calls[4];
5050
assertHeaders(settings, headers);
51-
expect(url).toBe(expectedConfigsUrl(-1, 100, settings.validateFilters || false, settings));
51+
expect(url).toBe(expectedConfigsUrl(-1, 100, settings.validateFilters || false, settings, -1));
5252

5353
serviceApi.fetchConfigsSegmentChanges(-1, 'segmentName', false, 100);
5454
[url, { headers }] = fetchMock.mock.calls[5];
@@ -81,9 +81,9 @@ describe('serviceApi', () => {
8181
return `sdk/splitChanges?s=1.1&since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${usesFilter ? filterQueryString : ''}${till ? '&till=' + till : ''}`;
8282
}
8383

84-
function expectedConfigsUrl(since: number, till: number, usesFilter: boolean, settings: ISettings) {
84+
function expectedConfigsUrl(since: number, till: number, usesFilter: boolean, settings: ISettings, rbSince?: number) {
8585
const filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
86-
return `configs/v1/configs?since=${since}${usesFilter ? filterQueryString : ''}${till ? '&till=' + till : ''}`;
86+
return `configs/v1/configs?since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${usesFilter ? filterQueryString : ''}${till ? '&till=' + till : ''}`;
8787
}
8888
});
8989

src/services/serviceApi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ export function serviceApiFactory(
7070
},
7171

7272
// @TODO support filterQueryString and handle ERROR_TOO_MANY_SETS error
73-
fetchConfigs(since: number, noCache?: boolean, till?: number) {
74-
const url = `${urls.configs}/api/v1/configs?since=${since}${filterQueryString || ''}${till ? '&till=' + till : ''}`;
73+
fetchConfigs(since: number, noCache?: boolean, till?: number, rbSince?: number) {
74+
const url = `${urls.configs}/api/v1/configs?since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${filterQueryString || ''}${till ? '&till=' + till : ''}`;
7575
return secureSplitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
7676
},
7777

src/services/splitApi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ export function splitApiFactory(
149149

150150
// Not used. Just here to satisfy the IServiceApi interface.
151151

152-
fetchConfigs(since: number, noCache?: boolean, till?: number) {
153-
const url = `${urls.configs}/v1/configs?since=${since}${filterQueryString || ''}${till ? '&till=' + till : ''}`;
152+
fetchConfigs(since: number, noCache?: boolean, till?: number, rbSince?: number) {
153+
const url = `${urls.configs}/v1/configs?since=${since}${rbSince ? '&rbSince=' + rbSince : ''}${filterQueryString || ''}${till ? '&till=' + till : ''}`;
154154
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
155155
},
156156

0 commit comments

Comments
 (0)