Skip to content

Commit 5eb0027

Browse files
Merge pull request #386 from splitio/development
Release v2.0.3
2 parents 5014820 + 7ea84aa commit 5eb0027

File tree

20 files changed

+35
-42
lines changed

20 files changed

+35
-42
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2.0.3 (January 9, 2025)
2+
- Bugfixing - Properly handle rejected promises when using targeting rules with segment matchers in consumer modes (e.g., Redis and Pluggable storages).
3+
14
2.0.2 (December 3, 2024)
25
- Updated the factory `init` and `destroy` methods to support re-initialization after destruction. This update ensures compatibility of the React SDK with React Strict Mode, where the factory's `init` and `destroy` effects are executed an extra time to validate proper resource cleanup.
36
- Bugfixing - Sanitize the `SplitSDKMachineName` header value to avoid exceptions on HTTP/S requests when it contains non ISO-8859-1 characters (Related to issue https://github.com/splitio/javascript-client/issues/847).

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright © 2024 Split Software, Inc.
1+
Copyright © 2025 Split Software, Inc.
22

33
Licensed under the Apache License, Version 2.0 (the "License");
44
you may not use this file except in compliance with the License.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ This library is compatible with JavaScript ES5 and above.
1414
Please see [Contributors Guide](CONTRIBUTORS-GUIDE.md) to find all you need to submit a Pull Request (PR).
1515

1616
## License
17-
Licensed under the Apache License, Version 2.0. See: [Apache License](http://www.apache.org/licenses/).
17+
Licensed under the Apache License, Version 2.0. See: [Apache License](https://www.apache.org/licenses/).
1818

1919
## About Split
2020

@@ -46,4 +46,4 @@ For a comprehensive list of open source projects visit our [Github page](https:/
4646

4747
**Learn more about Split:**
4848

49-
Visit [split.io/product](https://www.split.io/product) for an overview of Split, or visit our documentation at [help.split.io](http://help.split.io) for more detailed information.
49+
Visit [split.io/product](https://www.split.io/product) for an overview of Split, or visit our documentation at [help.split.io](https://help.split.io) for more detailed information.

package-lock.json

Lines changed: 2 additions & 2 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": "2.0.2",
3+
"version": "2.0.3",
44
"description": "Split JavaScript SDK common components",
55
"main": "cjs/index.js",
66
"module": "esm/index.js",
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
import { MaybeThenable } from '../../dtos/types';
22
import { ISegmentsCacheBase } from '../../storages/types';
3-
import { thenable } from '../../utils/promise/thenable';
43

54
export function largeSegmentMatcherContext(largeSegmentName: string, storage: { largeSegments?: ISegmentsCacheBase }) {
65

76
return function largeSegmentMatcher(key: string): MaybeThenable<boolean> {
87
const isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;
98

10-
if (thenable(isInLargeSegment)) {
11-
isInLargeSegment.then(result => {
12-
return result;
13-
});
14-
}
15-
169
return isInLargeSegment;
1710
};
1811
}

src/evaluator/matchers/segment.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
import { MaybeThenable } from '../../dtos/types';
22
import { ISegmentsCacheBase } from '../../storages/types';
3-
import { thenable } from '../../utils/promise/thenable';
43

54
export function segmentMatcherContext(segmentName: string, storage: { segments: ISegmentsCacheBase }) {
65

76
return function segmentMatcher(key: string): MaybeThenable<boolean> {
87
const isInSegment = storage.segments.isInSegment(segmentName, key);
98

10-
if (thenable(isInSegment)) {
11-
isInSegment.then(result => {
12-
return result;
13-
});
14-
}
15-
169
return isInSegment;
1710
};
1811
}

src/listeners/node.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class NodeSignalListener implements ISignalListener {
5656
// Cleaned up, remove handlers.
5757
this.stop();
5858

59-
// This handler prevented the default behaviour, start again.
59+
// This handler prevented the default behavior, start again.
6060
// eslint-disable-next-line no-undef
6161
process.kill(process.pid, SIGTERM);
6262
};
@@ -72,7 +72,7 @@ export class NodeSignalListener implements ISignalListener {
7272
}
7373

7474
if (thenable(handlerResult)) {
75-
// Always exit, even with errors. The promise is returned for UT purposses.
75+
// Always exit, even with errors. The promise is returned for UT purposes.
7676
return handlerResult.then(wrapUp).catch(wrapUp);
7777
} else {
7878
wrapUp();

src/logger/__tests__/index.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,22 +97,22 @@ function testLogLevels(levelToTest: SplitIO.LogLevel) {
9797

9898
}
9999

100-
test('SPLIT LOGGER / Logger class public methods behaviour - instance.debug', () => {
100+
test('SPLIT LOGGER / Logger class public methods behavior - instance.debug', () => {
101101
testLogLevels(LogLevels.DEBUG);
102102

103103
});
104104

105-
test('SPLIT LOGGER / Logger class public methods behaviour - instance.info', () => {
105+
test('SPLIT LOGGER / Logger class public methods behavior - instance.info', () => {
106106
testLogLevels(LogLevels.INFO);
107107

108108
});
109109

110-
test('SPLIT LOGGER / Logger class public methods behaviour - instance.warn', () => {
110+
test('SPLIT LOGGER / Logger class public methods behavior - instance.warn', () => {
111111
testLogLevels(LogLevels.WARN);
112112

113113
});
114114

115-
test('SPLIT LOGGER / Logger class public methods behaviour - instance.error', () => {
115+
test('SPLIT LOGGER / Logger class public methods behavior - instance.error', () => {
116116
testLogLevels(LogLevels.ERROR);
117117

118118
});

src/readiness/__tests__/readinessManager.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ test('READINESS MANAGER / Cancel timeout if ready fired', (done) => {
214214

215215
const readinessManager = readinessManagerFactory(EventEmitter, settingsWithTimeout);
216216
readinessManager.init(); // Start the timeout
217+
readinessManager.destroy(); // Should cancel the timeout
218+
readinessManager.init(); // Start the timeout again
217219

218220
readinessManager.gate.on(SDK_READY_TIMED_OUT, () => { sdkReadyTimedoutCalled = true; });
219221
readinessManager.gate.once(SDK_READY, () => { sdkReadyCalled = true; });

src/readiness/__tests__/sdkReadinessManager.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ describe('SDK Readiness Manager - Event emitter', () => {
201201

202202
describe('SDK Readiness Manager - Ready promise', () => {
203203

204-
test('.ready() promise behaviour for clients', async () => {
204+
test('.ready() promise behavior for clients', async () => {
205205
const sdkReadinessManager = sdkReadinessManagerFactory(EventEmitterMock, fullSettings);
206206

207207
const ready = sdkReadinessManager.sdkStatus.ready();

src/storages/inRedis/SplitsCacheInRedis.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,10 @@ export class SplitsCacheInRedis extends AbstractSplitsCacheAsync {
266266
return Promise.reject(this.redisError);
267267
}
268268

269-
const splits: Record<string, ISplit | null> = {};
270269
const keys = names.map(name => this.keys.buildSplitKey(name));
271270
return this.redis.mget(...keys)
272271
.then(splitDefinitions => {
272+
const splits: Record<string, ISplit | null> = {};
273273
names.forEach((name, idx) => {
274274
const split = splitDefinitions[idx];
275275
splits[name] = split && JSON.parse(split);

src/storages/inRedis/__tests__/RedisAdapter.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ describe('STORAGE Redis Adapter', () => {
181181

182182
expect(ioredisMock.once).toBeCalledTimes(2); // If the method was called, it should have called the `once` function twice. If that it the case we can assume that the method was called on creation.
183183

184-
// Reset stubs again, we'll check the behaviour calling the method directly.
184+
// Reset stubs again, we'll check the behavior calling the method directly.
185185
clearAllMocks();
186186
expect(ioredisMock.once).not.toBeCalled(); // Control assertion
187187
expect(ioredisMock[METHODS_TO_PROMISE_WRAP[METHODS_TO_PROMISE_WRAP.length - 1]]).not.toBeCalled(); // Control assertion

src/sync/streaming/pushManager.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -349,12 +349,14 @@ export function pushManagerFactory(
349349
// Reconnects in case of a new client.
350350
// Run in next event-loop cycle to save authentication calls
351351
// in case multiple clients are created in the current cycle.
352-
setTimeout(function checkForReconnect() {
353-
if (connectForNewClient) {
354-
connectForNewClient = false;
355-
connectPush();
356-
}
357-
}, 0);
352+
if (this.isRunning()) {
353+
setTimeout(function checkForReconnect() {
354+
if (connectForNewClient) {
355+
connectForNewClient = false;
356+
connectPush();
357+
}
358+
}, 0);
359+
}
358360
}
359361
},
360362
// [Only for client-side]

src/sync/syncManagerOnline.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,19 @@ export function syncManagerOnlineFactory(
142142
if (!pollingManager) return;
143143

144144
const mySegmentsSyncTask = (pollingManager as IPollingManagerCS).add(matchingKey, readinessManager, storage);
145+
if (syncEnabled && pushManager) pushManager.add(matchingKey, mySegmentsSyncTask);
145146

146147
if (running) {
147148
if (syncEnabled) {
148149
if (pushManager) {
149-
if (pollingManager!.isRunning()) {
150+
if (pollingManager.isRunning()) {
150151
// if doing polling, we must start the periodic fetch of data
151152
if (storage.splits.usesSegments()) mySegmentsSyncTask.start();
152153
} else {
153154
// if not polling, we must execute the sync task for the initial fetch
154155
// of segments since `syncAll` was already executed when starting the main client
155156
mySegmentsSyncTask.execute();
156157
}
157-
pushManager.add(matchingKey, mySegmentsSyncTask);
158158
} else {
159159
if (storage.splits.usesSegments()) mySegmentsSyncTask.start();
160160
}

src/trackers/eventTracker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function eventTrackerFactory(
3636
whenInit(() => {
3737
// Wrap in a timeout because we don't want it to be blocking.
3838
setTimeout(() => {
39-
// copy of event, to avoid unexpected behaviour if modified by integrations
39+
// copy of event, to avoid unexpected behavior if modified by integrations
4040
const eventDataCopy = objectAssign({}, eventData);
4141
if (properties) eventDataCopy.properties = objectAssign({}, properties);
4242
// integrationsManager does not throw errors (they are internally handled by each integration module)

src/trackers/impressionsTracker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export function impressionsTrackerFactory(
6060
if (impressionListener || integrationsManager) {
6161
for (let i = 0; i < impressionsToListenerCount; i++) {
6262
const impressionData: SplitIO.ImpressionData = {
63-
// copy of impression, to avoid unexpected behaviour if modified by integrations or impressionListener
63+
// copy of impression, to avoid unexpected behavior if modified by integrations or impressionListener
6464
impression: objectAssign({}, impressionsToListener[i]),
6565
attributes,
6666
ip,

src/utils/settingsValidation/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV
159159
if (withDefaults.mode === LOCALHOST_MODE && maybeKey === undefined) {
160160
withDefaults.core.key = 'localhost_key';
161161
} else {
162-
// Keeping same behaviour than JS SDK: if settings key or TT are invalid,
162+
// Keeping same behavior than JS SDK: if settings key or TT are invalid,
163163
// `false` value is used as bound key/TT of the default client, which leads to some issues.
164164
// @ts-ignore, @TODO handle invalid keys as a non-recoverable error?
165165
withDefaults.core.key = validateKey(log, maybeKey, LOG_PREFIX_CLIENT_INSTANTIATION);

types/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Declaration file for JavaScript Browser Split Software SDK
2-
// Project: http://www.split.io/
2+
// Project: https://www.split.io/
33
// Definitions by: Nico Zelaya <https://github.com/NicoZelaya/>
44

55
/// <reference path="./splitio.d.ts" />

types/splitio.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Type definitions for Split Software SDKs
2-
// Project: http://www.split.io/
2+
// Project: https://www.split.io/
33

44
import { RedisOptions } from 'ioredis';
55
import { RequestOptions } from 'http';

0 commit comments

Comments
 (0)