Skip to content

Commit 79fdb4a

Browse files
Upgrade JS-commons that includes MyLargeSegments support
1 parent 4c7ab0d commit 79fdb4a

File tree

9 files changed

+71
-34
lines changed

9 files changed

+71
-34
lines changed

package-lock.json

Lines changed: 7 additions & 7 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
@@ -40,7 +40,7 @@
4040
"node": ">=6"
4141
},
4242
"dependencies": {
43-
"@splitsoftware/splitio-commons": "1.16.0",
43+
"@splitsoftware/splitio-commons": "1.16.1-rc.0",
4444
"@types/google.analytics": "0.0.40",
4545
"@types/ioredis": "^4.28.0",
4646
"bloom-filters": "^3.0.0",

src/__tests__/browserSuites/telemetry.spec.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default async function telemetryBrowserSuite(fetchMock, t) {
3636
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.1&since=-1', 500);
3737
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.1&since=-1', { status: 200, body: splitChangesMock1 });
3838
fetchMock.getOnce(baseUrls.sdk + '/mySegments/user-key', 500);
39-
fetchMock.getOnce(baseUrls.sdk + '/mySegments/user-key', { status: 200, body: { 'mySegments': [ 'one_segment'] } });
39+
fetchMock.getOnce(baseUrls.sdk + '/mySegments/user-key', { status: 200, body: { 'mySegments': ['one_segment'] } });
4040

4141
// We need to handle all requests properly
4242
fetchMock.postOnce(baseUrls.events + '/testImpressions/bulk', 200);
@@ -76,7 +76,7 @@ export default async function telemetryBrowserSuite(fetchMock, t) {
7676

7777
// @TODO check if iDe value is correct
7878
assert.deepEqual(data, {
79-
mE: {}, hE: { sp: { 500: 1 }, ms: { 500: 1 } }, tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 1, skC: 1, eQ: 1, eD: 0, sE: [], t: [], ufs: { sp: 0, ms: 0 }
79+
mE: {}, hE: { sp: { 500: 1 }, ms: { 500: 1 } }, tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 1, skC: 1, eQ: 1, eD: 0, sE: [], t: [], ufs: {}
8080
}, 'metrics/usage JSON payload should be the expected');
8181

8282
finish.next();
@@ -96,7 +96,7 @@ export default async function telemetryBrowserSuite(fetchMock, t) {
9696
// @TODO check if iDe value is correct
9797
assert.deepEqual(data, {
9898
mL: {}, mE: {}, hE: {}, hL: {}, // errors and latencies were popped
99-
tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 1, skC: 1, eQ: 1, eD: 0, sE: [], t: [], ufs: { sp: 0, ms: 0 }
99+
tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 1, skC: 1, eQ: 1, eD: 0, sE: [], t: [], ufs: {}
100100
}, '2nd metrics/usage JSON payload should be the expected');
101101
return 200;
102102
});
@@ -108,7 +108,7 @@ export default async function telemetryBrowserSuite(fetchMock, t) {
108108
delete data.tR; // delete to validate other properties
109109

110110
assert.deepEqual(data, {
111-
oM: 0, st: 'memory', aF: 1, rF: 0, sE: false,
111+
oM: 0, st: 'memory', aF: 1, rF: 0, sE: false, lE: false,
112112
rR: { sp: 99999, ms: 60, im: 300, ev: 60, te: 1 } /* override featuresRefreshRate */,
113113
uO: { s: true, e: true, a: false, st: false, t: true } /* override sdk, events and telemetry URLs */,
114114
iQ: 30000, eQ: 500, iM: 0, iL: false, hP: false, nR: 1 /* 1 non ready usage */, t: [], i: [], uC: 2 /* Default GRANTED */,
@@ -188,7 +188,7 @@ export default async function telemetryBrowserSuite(fetchMock, t) {
188188
const splitFilters = [{ type: 'bySet', values: ['a', '_b', 'a', 'a', 'c', 'd', '_d'] }];
189189

190190
fetchMock.get(baseUrls.sdk + '/mySegments/nicolas%40split.io', { status: 200, body: { 'mySegments': [] } });
191-
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.1&since=-1&sets=a,c,d', { status: 200, body: { splits: [], since: 1457552620999, till: 1457552620999 } });
191+
fetchMock.getOnce(baseUrls.sdk + '/splitChanges?s=1.1&since=-1&sets=a,c,d', { status: 200, body: { splits: [], since: 1457552620999, till: 1457552620999 } });
192192
fetchMock.postOnce(baseUrls.telemetry + '/v1/metrics/config', (url, opts) => {
193193
const data = JSON.parse(opts.body);
194194

@@ -202,25 +202,25 @@ export default async function telemetryBrowserSuite(fetchMock, t) {
202202
fetchMock.postOnce(baseUrls.telemetry + '/v1/metrics/usage', (url, opts) => {
203203
const data = JSON.parse(opts.body);
204204

205-
assert.deepEqual(data.mL.tf, [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 'Latencies stats');
206-
assert.deepEqual(data.mL.tfs, [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 'Latencies stats');
207-
assert.deepEqual(data.mL.tcf, [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 'Latencies stats');
208-
assert.deepEqual(data.mL.tcfs, [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 'Latencies stats');
205+
assert.deepEqual(data.mL.tf, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Latencies stats');
206+
assert.deepEqual(data.mL.tfs, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Latencies stats');
207+
assert.deepEqual(data.mL.tcf, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Latencies stats');
208+
assert.deepEqual(data.mL.tcfs, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Latencies stats');
209209

210210
factory.client().destroy().then(() => {
211211
assert.end();
212212
});
213213

214214
return 200;
215215
});
216-
fetchMock.postOnce(baseUrls.telemetry + '/v1/metrics/usage', 200);
216+
fetchMock.postOnce(baseUrls.telemetry + '/v1/metrics/usage', 200);
217217

218-
factory = SplitFactoryForTest({...baseConfig, sync: {splitFilters}});
218+
factory = SplitFactoryForTest({ ...baseConfig, sync: { splitFilters } });
219219
const client = factory.client();
220-
assert.deepEqual(client.getTreatmentsByFlagSet('a'),[]);
221-
assert.deepEqual(client.getTreatmentsByFlagSets(['a']),[]);
222-
assert.deepEqual(client.getTreatmentsWithConfigByFlagSet('a'),[]);
223-
assert.deepEqual(client.getTreatmentsWithConfigByFlagSets(['a']),[]);
220+
assert.deepEqual(client.getTreatmentsByFlagSet('a'), []);
221+
assert.deepEqual(client.getTreatmentsByFlagSets(['a']), []);
222+
assert.deepEqual(client.getTreatmentsWithConfigByFlagSet('a'), []);
223+
assert.deepEqual(client.getTreatmentsWithConfigByFlagSets(['a']), []);
224224

225225
}, 'SDK with sets configured has sets information in config POST and evaluation by sets telemetry in stats POST');
226226

src/__tests__/nodeSuites/telemetry.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export default async function telemetryNodejsSuite(key, fetchMock, assert) {
6666

6767
// @TODO check if iDe value is correct
6868
assert.deepEqual(data, {
69-
mE: {}, hE: { sp: { 500: 1 } }, tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 3, skC: 3, eQ: 1, eD: 0, sE: [], t: [], ufs: { sp: 0, ms: 0 }
69+
mE: {}, hE: { sp: { 500: 1 } }, tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 3, skC: 3, eQ: 1, eD: 0, sE: [], t: [], ufs: {}
7070
}, 'metrics/usage JSON payload should be the expected');
7171

7272
finish.next();
@@ -85,7 +85,7 @@ export default async function telemetryNodejsSuite(key, fetchMock, assert) {
8585
// @TODO check if iDe value is correct
8686
assert.deepEqual(data, {
8787
mL: {}, mE: {}, hE: {}, hL: {}, // errors and latencies were popped
88-
tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 3, skC: 3, eQ: 1, eD: 0, sE: [], t: [], ufs: { sp: 0, ms: 0 }
88+
tR: 0, aR: 0, iQ: 4, iDe: 1, iDr: 0, spC: 31, seC: 3, skC: 3, eQ: 1, eD: 0, sE: [], t: [], ufs: {}
8989
}, '2nd metrics/usage JSON payload should be the expected');
9090
return 200;
9191
});

src/settings/defaults/browser.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ export const defaults = {
1010
// Maximum amount of time used before notifies me a timeout.
1111
readyTimeout: 10,
1212
// Amount of time we will wait before the first push of events.
13-
eventsFirstPushWindow: 10
13+
eventsFirstPushWindow: 10,
14+
// Wait for large segments to emit SDK_READY event.
15+
waitForLargeSegments: true,
1416
},
1517

1618
// Consent is considered granted by default

src/settings/defaults/node.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ export const defaults = {
1313
// Maximum amount of time used before notifies me a timeout.
1414
readyTimeout: 15,
1515
// Don't wait a specific time for first flush on Node, no page load here.
16-
eventsFirstPushWindow: 0
16+
eventsFirstPushWindow: 0,
17+
// Don't wait for large segments to emit SDK_READY event.
18+
waitForLargeSegments: false,
1719
},
1820

1921
features: '.split',

src/settings/node.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const params = {
1212
storage: validateStorage,
1313
logger: validateLogger,
1414
localhost: () => LocalhostFromFile(),
15-
consent: () => undefined, // resets settings.userConsent to the default
1615
// In Node.js the SDK ignores `config.integrations`, so a validator for integrations is not required
1716
};
1817

@@ -21,5 +20,10 @@ export function settingsFactory(config) {
2120

2221
// if provided, keeps reference to the `requestOptions` object
2322
if (settings.sync.requestOptions) settings.sync.requestOptions = config.sync.requestOptions;
23+
24+
// Reset config options not supported in Node.js
25+
if (settings.sync.largeSegmentsEnabled) settings.log.warn('Client instantiation: config.sync.largeSegmentsEnabled option is not supported in NodeJS. Ignoring it.');
26+
settings.sync.largeSegmentsEnabled = false;
27+
2428
return settings;
2529
}

ts-tests/index.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ const instantiatedSettingsCore: {
178178
} = SDK.settings.core;
179179
const instantiatedSettingsMode: ('standalone' | 'consumer') = SDK.settings.mode;
180180
const instantiatedSettingsScheduler: { [key: string]: number } = SDK.settings.scheduler;
181-
const instantiatedSettingsStartup: { [key: string]: number } = SDK.settings.startup;
181+
const instantiatedSettingsStartup: { [key: string]: number | boolean } = SDK.settings.startup;
182182
const instantiatedSettingsStorage: {
183183
prefix: string,
184184
options: Object,
@@ -535,6 +535,7 @@ let fullBrowserSettings: SplitIO.IBrowserSettings = {
535535
metricsRefreshRate: 1,
536536
telemetryRefreshRate: 1,
537537
segmentsRefreshRate: 1,
538+
largeSegmentsRefreshRate: 1,
538539
offlineRefreshRate: 1,
539540
eventsPushRate: 1,
540541
eventsQueueSize: 1,
@@ -544,7 +545,8 @@ let fullBrowserSettings: SplitIO.IBrowserSettings = {
544545
readyTimeout: 1,
545546
requestTimeoutBeforeReady: 1,
546547
retriesOnFailureBeforeReady: 1,
547-
eventsFirstPushWindow: 1
548+
eventsFirstPushWindow: 1,
549+
waitForLargeSegments: true,
548550
},
549551
urls: {
550552
sdk: 'https://asd.com/sdk',
@@ -565,7 +567,8 @@ let fullBrowserSettings: SplitIO.IBrowserSettings = {
565567
sync: {
566568
splitFilters: splitFilters,
567569
impressionsMode: 'DEBUG',
568-
enabled: true
570+
enabled: true,
571+
largeSegmentsEnabled: true,
569572
},
570573
userConsent: 'GRANTED'
571574
};

types/splitio.d.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ interface ISettings {
7878
metricsRefreshRate?: number,
7979
telemetryRefreshRate: number,
8080
segmentsRefreshRate: number,
81+
largeSegmentsRefreshRate: number,
8182
offlineRefreshRate: number,
8283
eventsPushRate: number,
8384
eventsQueueSize: number,
@@ -87,7 +88,8 @@ interface ISettings {
8788
readyTimeout: number,
8889
requestTimeoutBeforeReady: number,
8990
retriesOnFailureBeforeReady: number,
90-
eventsFirstPushWindow: number
91+
eventsFirstPushWindow: number,
92+
waitForLargeSegments: boolean
9193
},
9294
readonly storage: {
9395
prefix: string,
@@ -111,7 +113,9 @@ interface ISettings {
111113
readonly sync: {
112114
splitFilters: SplitIO.SplitFilter[],
113115
impressionsMode: SplitIO.ImpressionsMode,
114-
enabled: boolean
116+
enabled: boolean,
117+
largeSegmentsEnabled: boolean,
118+
flagSpecVersion: string
115119
}
116120
/**
117121
* User consent status if using in browser. Undefined if using in NodeJS.
@@ -981,6 +985,13 @@ declare namespace SplitIO {
981985
* @default 10
982986
*/
983987
eventsFirstPushWindow?: number,
988+
/**
989+
* Whether the SDK should wait for large segments to be ready before emitting SDK_READY event.
990+
* It only applies if largeSegmentsEnabled is true.
991+
* @property {boolean} waitForLargeSegments
992+
* @default true
993+
*/
994+
waitForLargeSegments?: boolean
984995
},
985996
/**
986997
* SDK scheduler settings.
@@ -1025,6 +1036,13 @@ declare namespace SplitIO {
10251036
* @default 60
10261037
*/
10271038
segmentsRefreshRate?: number,
1039+
/**
1040+
* The SDK polls Split servers for changes to large segment definitions. This parameter controls this polling period in seconds.
1041+
* It only applies if largeSegmentsEnabled is true.
1042+
* @property {number} largeSegmentsRefreshRate
1043+
* @default 60
1044+
*/
1045+
largeSegmentsRefreshRate?: number,
10281046
/**
10291047
* The SDK posts the queued events data in bulks. This parameter controls the posting rate in seconds.
10301048
* @property {number} eventsPushRate
@@ -1126,7 +1144,15 @@ declare namespace SplitIO {
11261144
* @typedef {string} userConsent
11271145
* @default 'GRANTED'
11281146
*/
1129-
userConsent?: ConsentStatus
1147+
userConsent?: ConsentStatus,
1148+
sync?: ISharedSettings['sync'] & {
1149+
/**
1150+
* Enables synchronization of large segments.
1151+
* @property {boolean} largeSegmentsEnabled
1152+
* @default false
1153+
*/
1154+
largeSegmentsEnabled?: boolean
1155+
}
11301156
}
11311157
/**
11321158
* Settings interface for SDK instances created on NodeJS.

0 commit comments

Comments
 (0)