Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v20.13.1
v24.12
5 changes: 5 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2.9.0 (Dec 16, 2025)
- Updated base image to node:24.12.0-alpine3.22
- Updated @splitsoftware/splitio library, using @splitsoftware/splitio-commons:2.10.0 instead that includes
- Added property `impressionsDisabled` in getTreatment(s) `evaluationOptions` parameter, to disable impressions per evaluations.

2.8.1 (Oct 13, 2025)
- Updated base image to node:24.10.0-alpine3.22

Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Builder stage
FROM node:24.10.0-alpine3.22 AS builder
FROM node:24.12.0-alpine3.22 AS builder

WORKDIR /usr/src/split-evaluator

Expand All @@ -8,7 +8,7 @@ COPY package.json package-lock.json ./
RUN npm install --only=production

# Runner stage
FROM node:24.10.0-alpine3.22 AS runner
FROM node:24.12.0-alpine3.22 AS runner

WORKDIR /usr/src/split-evaluator

Expand Down
22 changes: 14 additions & 8 deletions client/client.router.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,12 @@ const fwdPropertiesFromPost = function parsePropertiesMiddleware(req, res, next)
next();
};

const fwdImpressionsDisabledFromPost = function parseImpressionsDisabledMiddleware(req, res, next) {
const impressionsDisabled = req.body.impressionsDisabled;
if (impressionsDisabled !== undefined) req.query['impressions-disabled'] = req.body.impressionsDisabled.toString();
next();
};

const handleBodyParserErr = function handleBodyParserErr(error, req, res, next) {
if (error) {
return res
Expand All @@ -218,14 +224,14 @@ router.get('/get-all-treatments-with-config', allTreatmentValidation, clientCont

// Getting treatments as POST's for big attribute sets
const JSON_PARSE_OPTS = { limit: '300kb' };
router.post('/get-treatment',express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, treatmentValidation, clientController.getTreatment);
router.post('/get-treatment-with-config', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, treatmentValidation, clientController.getTreatmentWithConfig);
router.post('/get-treatments', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, treatmentsValidation, clientController.getTreatments);
router.post('/get-treatments-with-config', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, treatmentsValidation, clientController.getTreatmentsWithConfig);
router.post('/get-treatments-by-sets', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, flagSetsValidation, clientController.getTreatmentsByFlagSets);
router.post('/get-treatments-with-config-by-sets', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, flagSetsValidation, clientController.getTreatmentsWithConfigByFlagSets);
router.post('/get-all-treatments', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, allTreatmentValidation, clientController.getAllTreatments);
router.post('/get-all-treatments-with-config', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, handleBodyParserErr, allTreatmentValidation, clientController.getAllTreatmentsWithConfig);
router.post('/get-treatment',express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, treatmentValidation, clientController.getTreatment);
router.post('/get-treatment-with-config', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, treatmentValidation, clientController.getTreatmentWithConfig);
router.post('/get-treatments', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, treatmentsValidation, clientController.getTreatments);
router.post('/get-treatments-with-config', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, treatmentsValidation, clientController.getTreatmentsWithConfig);
router.post('/get-treatments-by-sets', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, flagSetsValidation, clientController.getTreatmentsByFlagSets);
router.post('/get-treatments-with-config-by-sets', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, flagSetsValidation, clientController.getTreatmentsWithConfigByFlagSets);
router.post('/get-all-treatments', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, allTreatmentValidation, clientController.getAllTreatments);
router.post('/get-all-treatments-with-config', express.json(JSON_PARSE_OPTS), fwdAttributesFromPost, fwdPropertiesFromPost, fwdImpressionsDisabledFromPost, handleBodyParserErr, allTreatmentValidation, clientController.getAllTreatmentsWithConfig);

// Other methods
router.get('/track', trackValidation, clientController.track);
Expand Down
2 changes: 1 addition & 1 deletion listener/manager.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const fetch = require('node-fetch');
const fetch = require('../sdk/platform/getFetch').getFetch();
const config = require('config');
const repeat = require('./repeat');
const ImpressionQueue = require('./queue');
Expand Down
75 changes: 69 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "split-evaluator",
"version": "2.9.1",
"version": "2.9.0",
"description": "Split-Evaluator",
"repository": "splitio/split-evaluator",
"homepage": "https://github.com/splitio/split-evaluator#readme",
Expand All @@ -22,7 +22,8 @@
"jest": {
"testPathIgnorePatterns": [
"config",
"environmentManager/__tests__/constants"
"environmentManager/__tests__/constants",
"sdk/__tests__/utils"
],
"setupFiles": [
"<rootDir>/.jest/setEnvVars.js"
Expand All @@ -40,7 +41,7 @@
"test": "NODE_ENV=test jest"
},
"dependencies": {
"@splitsoftware/splitio-commons": "2.9.1-rc.2",
"@splitsoftware/splitio-commons": "2.10.0",
"bloom-filters": "^3.0.4",
"config": "^3.3.9",
"js-yaml": "^4.1.0",
Expand All @@ -57,6 +58,7 @@
"@babel/preset-env": "^7.15.6",
"babel-jest": "^29.7.0",
"eslint": "^8.9.0",
"fetch-mock": "^11.1.5",
"jest": "^29.7.0",
"nodemon": "^3.1.0",
"superagent": "^8.0.9",
Expand Down
103 changes: 103 additions & 0 deletions sdk/__tests__/integrationOffline.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
const { isConsumerMode } = require('@splitsoftware/splitio-commons/cjs/utils/settingsValidation/mode');
const { getSplitFactory } = require('../../sdk');

describe('SDK Wiring & Glue Code Integration', () => {
const baseConfig = {
core: {
authorizationKey: 'localhost',
},
features: {
'test_feature': 'on',
},
};

test('Should initialize correctly in OPTIMIZED mode - bloomFilter', async () => {
const optimizedConfig = {
...baseConfig,
sync: {
impressionsMode: 'OPTIMIZED',
},
};

const { factory } = getSplitFactory(optimizedConfig);
const client = factory.client();

await client.ready();

const treatment = client.getTreatment('test', 'my-experiment');
expect(treatment).toBe('on');

await expect(client.destroy()).resolves.toBeUndefined();
});

test('SDK_READY event must be emitted and resolved', (done) => {
const { factory } = getSplitFactory(baseConfig);
const client = factory.client();

let readyCalled = false;

client.on(client.Event.SDK_READY, () => {
readyCalled = true;
client.destroy().then(async () => {
expect(readyCalled).toBe(true);
await expect(client.destroy()).resolves.toBeUndefined();

done();
});
});

setTimeout(() => {
if (!readyCalled) {
client.destroy();
done(new Error('SDK_READY event was not emitted within timeout'));
}
}, 2000);
});

test('ExtraProps adds getRolloutPlan to Manager', async () => {
const { factory } = getSplitFactory(baseConfig);

expect(typeof factory.getRolloutPlan).toBe('function');

const plan = factory.getRolloutPlan({ feature: 'my-experiment' });
expect(plan).toBeDefined();
expect(plan.splitChanges).toBeDefined();

await expect(factory.destroy()).resolves.toBeUndefined();

});

test('Destroy must resolve and clean up resources', async () => {
const { factory } = getSplitFactory(baseConfig);
const client = factory.client();

await client.ready();

await expect(client.destroy()).resolves.toBeUndefined();
});

test('Must force STANDALONE mode if it receives CONSUMER mode', async () => {
const consumerConfig = {
...baseConfig,
mode: 'consumer',
storage: {
type: 'REDIS',
prefix: 'test',
},
};

const { factory } = getSplitFactory(consumerConfig);

expect(isConsumerMode(factory.settings)).toBe(false);

const client = factory.client();
expect(client).toBeDefined();

await client.ready();

const treatment = client.getTreatment('test', 'my-experiment');
expect(treatment).toBe('on');

await expect(client.destroy()).resolves.toBeUndefined();
});
});
Loading