@splitsoftware/splitio-commons 1.16.1-rc.8 → 1.17.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.txt +2 -1
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -3
- package/cjs/logger/messages/info.js +2 -1
- package/cjs/readiness/readinessManager.js +10 -14
- package/cjs/readiness/sdkReadinessManager.js +6 -5
- package/cjs/sdkClient/sdkClientMethodCS.js +2 -2
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +2 -2
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/decorateHeaders.js +42 -0
- package/cjs/services/splitApi.js +0 -4
- package/cjs/services/splitHttpClient.js +5 -4
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +6 -5
- package/cjs/storages/KeyBuilder.js +0 -3
- package/cjs/storages/KeyBuilderCS.js +5 -17
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
- package/cjs/storages/inLocalStorage/index.js +2 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -5
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +11 -20
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
- package/cjs/sync/polling/pollingManagerCS.js +33 -51
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -20
- package/cjs/sync/streaming/SSEClient/index.js +0 -4
- package/cjs/sync/streaming/SSEHandler/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
- package/cjs/sync/streaming/constants.js +1 -2
- package/cjs/sync/streaming/parseUtils.js +8 -3
- package/cjs/sync/streaming/pushManager.js +68 -99
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -4
- package/cjs/sync/syncManagerOnline.js +14 -24
- package/cjs/utils/constants/index.js +2 -4
- package/cjs/utils/settingsValidation/index.js +2 -7
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -0
- package/esm/logger/messages/info.js +2 -1
- package/esm/readiness/readinessManager.js +10 -14
- package/esm/readiness/sdkReadinessManager.js +6 -5
- package/esm/sdkClient/sdkClientMethodCS.js +2 -2
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +2 -2
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/decorateHeaders.js +38 -0
- package/esm/services/splitApi.js +1 -5
- package/esm/services/splitHttpClient.js +5 -4
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +4 -3
- package/esm/storages/KeyBuilder.js +0 -3
- package/esm/storages/KeyBuilderCS.js +4 -15
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
- package/esm/storages/inLocalStorage/index.js +3 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -5
- package/esm/storages/inMemory/SplitsCacheInMemory.js +12 -21
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
- package/esm/sync/polling/pollingManagerCS.js +34 -52
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +19 -18
- package/esm/sync/streaming/SSEClient/index.js +1 -5
- package/esm/sync/streaming/SSEHandler/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
- package/esm/sync/streaming/constants.js +0 -1
- package/esm/sync/streaming/parseUtils.js +8 -3
- package/esm/sync/streaming/pushManager.js +69 -99
- package/esm/sync/submitters/telemetrySubmitter.js +0 -4
- package/esm/sync/syncManagerOnline.js +15 -25
- package/esm/utils/constants/index.js +1 -3
- package/esm/utils/settingsValidation/index.js +2 -7
- package/package.json +1 -1
- package/src/dtos/types.ts +7 -17
- package/src/evaluator/matchers/index.ts +0 -2
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -0
- package/src/logger/messages/info.ts +2 -1
- package/src/readiness/readinessManager.ts +9 -13
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -3
- package/src/sdkClient/sdkClientMethodCS.ts +2 -2
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -2
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/decorateHeaders.ts +40 -0
- package/src/services/splitApi.ts +2 -7
- package/src/services/splitHttpClient.ts +6 -5
- package/src/services/types.ts +0 -1
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +5 -4
- package/src/storages/KeyBuilder.ts +0 -3
- package/src/storages/KeyBuilderCS.ts +5 -25
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
- package/src/storages/inLocalStorage/index.ts +4 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -5
- package/src/storages/inMemory/SplitsCacheInMemory.ts +10 -15
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +5 -7
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -6
- package/src/sync/polling/pollingManagerCS.ts +29 -61
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
- package/src/sync/polling/types.ts +3 -4
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +20 -17
- package/src/sync/streaming/SSEClient/index.ts +7 -10
- package/src/sync/streaming/SSEHandler/index.ts +1 -2
- package/src/sync/streaming/SSEHandler/types.ts +2 -14
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +10 -26
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
- package/src/sync/streaming/constants.ts +0 -1
- package/src/sync/streaming/parseUtils.ts +10 -6
- package/src/sync/streaming/pushManager.ts +67 -103
- package/src/sync/streaming/types.ts +3 -5
- package/src/sync/submitters/telemetrySubmitter.ts +0 -4
- package/src/sync/submitters/types.ts +4 -11
- package/src/sync/syncManagerOnline.ts +11 -19
- package/src/types.ts +9 -28
- package/src/utils/constants/index.ts +1 -3
- package/src/utils/settingsValidation/index.ts +3 -8
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +6 -14
- package/types/logger/constants.d.ts +1 -0
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +3 -2
- package/types/readiness/types.d.ts +2 -3
- package/types/services/decorateHeaders.d.ts +2 -0
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +0 -1
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +0 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -7
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -3
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +3 -4
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +3 -2
- package/types/sync/polling/types.d.ts +3 -10
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEClient/index.d.ts +0 -1
- package/types/sync/streaming/SSEHandler/types.d.ts +2 -13
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
- package/types/sync/streaming/constants.d.ts +0 -1
- package/types/sync/streaming/parseUtils.d.ts +4 -2
- package/types/sync/streaming/pushManager.d.ts +0 -2
- package/types/sync/streaming/types.d.ts +4 -5
- package/types/sync/submitters/types.d.ts +3 -10
- package/types/types.d.ts +11 -26
- package/types/utils/constants/index.d.ts +1 -3
- package/types/utils/settingsValidation/index.d.ts +0 -2
- package/types/utils/settingsValidation/types.d.ts +1 -1
- package/cjs/evaluator/matchers/large_segment.js +0 -16
- package/esm/evaluator/matchers/large_segment.js +0 -12
- package/src/evaluator/matchers/large_segment.ts +0 -18
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pushManagerFactory =
|
|
3
|
+
exports.pushManagerFactory = void 0;
|
|
4
4
|
var objectAssign_1 = require("../../utils/lang/objectAssign");
|
|
5
5
|
var Backoff_1 = require("../../utils/Backoff");
|
|
6
6
|
var SSEHandler_1 = require("./SSEHandler");
|
|
@@ -16,17 +16,8 @@ var constants_2 = require("../../logger/constants");
|
|
|
16
16
|
var types_1 = require("./SSEHandler/types");
|
|
17
17
|
var parseUtils_1 = require("./parseUtils");
|
|
18
18
|
var sets_1 = require("../../utils/lang/sets");
|
|
19
|
-
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
20
19
|
var murmur3_64_1 = require("../../utils/murmur3/murmur3_64");
|
|
21
20
|
var constants_3 = require("../../utils/constants");
|
|
22
|
-
function getDelay(parsedData, matchingKey) {
|
|
23
|
-
if (parsedData.h === 0)
|
|
24
|
-
return 0;
|
|
25
|
-
var interval = parsedData.i || 60000;
|
|
26
|
-
var seed = parsedData.s || 0;
|
|
27
|
-
return (0, murmur3_1.hash)(matchingKey, seed) % interval;
|
|
28
|
-
}
|
|
29
|
-
exports.getDelay = getDelay;
|
|
30
21
|
/**
|
|
31
22
|
* PushManager factory:
|
|
32
23
|
* - for server-side if key is not provided in settings.
|
|
@@ -152,9 +143,8 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
152
143
|
splitsUpdateWorker.stop();
|
|
153
144
|
if (userKey)
|
|
154
145
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
155
|
-
var worker = _a.worker
|
|
156
|
-
worker.stop();
|
|
157
|
-
workerLarge && workerLarge.stop();
|
|
146
|
+
var worker = _a.worker;
|
|
147
|
+
return worker.stop();
|
|
158
148
|
});
|
|
159
149
|
else
|
|
160
150
|
segmentsUpdateWorker.stop();
|
|
@@ -208,83 +198,6 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
208
198
|
}
|
|
209
199
|
splitsUpdateWorker.put(parsedData);
|
|
210
200
|
});
|
|
211
|
-
function handleMySegmentsUpdate(parsedData) {
|
|
212
|
-
var isLS = parsedData.type === constants_1.MY_LARGE_SEGMENTS_UPDATE;
|
|
213
|
-
switch (parsedData.u) {
|
|
214
|
-
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
215
|
-
var bitmap_1;
|
|
216
|
-
try {
|
|
217
|
-
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
218
|
-
}
|
|
219
|
-
catch (e) {
|
|
220
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
224
|
-
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
225
|
-
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
226
|
-
isLS ?
|
|
227
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
228
|
-
worker.put(parsedData.changeNumber);
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
case types_1.UpdateStrategy.KeyList: {
|
|
234
|
-
var keyList = void 0, added_1, removed_1;
|
|
235
|
-
try {
|
|
236
|
-
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
237
|
-
added_1 = new sets_1._Set(keyList.a);
|
|
238
|
-
removed_1 = new sets_1._Set(keyList.r);
|
|
239
|
-
}
|
|
240
|
-
catch (e) {
|
|
241
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
(0, lang_1.forOwn)(clients, function (_a) {
|
|
245
|
-
var hash64 = _a.hash64, worker = _a.worker, workerLarge = _a.workerLarge;
|
|
246
|
-
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
247
|
-
if (add !== undefined) {
|
|
248
|
-
isLS ?
|
|
249
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, [{
|
|
250
|
-
name: parsedData.largeSegments[0],
|
|
251
|
-
add: add
|
|
252
|
-
}]) :
|
|
253
|
-
worker.put(parsedData.changeNumber, [{
|
|
254
|
-
name: parsedData.segmentName,
|
|
255
|
-
add: add
|
|
256
|
-
}]);
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
case types_1.UpdateStrategy.SegmentRemoval:
|
|
262
|
-
if ((isLS && parsedData.largeSegments.length === 0) || (!isLS && !parsedData.segmentName)) {
|
|
263
|
-
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
264
|
-
break;
|
|
265
|
-
}
|
|
266
|
-
(0, lang_1.forOwn)(clients, function (_a) {
|
|
267
|
-
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
268
|
-
isLS ?
|
|
269
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, parsedData.largeSegments.map(function (largeSegment) { return ({
|
|
270
|
-
name: largeSegment,
|
|
271
|
-
add: false
|
|
272
|
-
}); })) :
|
|
273
|
-
worker.put(parsedData.changeNumber, [{
|
|
274
|
-
name: parsedData.segmentName,
|
|
275
|
-
add: false
|
|
276
|
-
}]);
|
|
277
|
-
});
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
281
|
-
(0, lang_1.forOwn)(clients, function (_a, matchingKey) {
|
|
282
|
-
var worker = _a.worker, workerLarge = _a.workerLarge;
|
|
283
|
-
isLS ?
|
|
284
|
-
workerLarge && workerLarge.put(parsedData.changeNumber, undefined, getDelay(parsedData, matchingKey)) :
|
|
285
|
-
worker.put(parsedData.changeNumber);
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
201
|
if (userKey) {
|
|
289
202
|
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
|
|
290
203
|
var userKeyHash = channel.split('_')[2];
|
|
@@ -293,8 +206,68 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
293
206
|
clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
|
|
294
207
|
}
|
|
295
208
|
});
|
|
296
|
-
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, handleMySegmentsUpdate)
|
|
297
|
-
|
|
209
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
|
|
210
|
+
switch (parsedData.u) {
|
|
211
|
+
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
212
|
+
var bitmap_1;
|
|
213
|
+
try {
|
|
214
|
+
bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
215
|
+
}
|
|
216
|
+
catch (e) {
|
|
217
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
221
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
222
|
+
if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
223
|
+
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
case types_1.UpdateStrategy.KeyList: {
|
|
229
|
+
var keyList = void 0, added_1, removed_1;
|
|
230
|
+
try {
|
|
231
|
+
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
232
|
+
added_1 = new sets_1._Set(keyList.a);
|
|
233
|
+
removed_1 = new sets_1._Set(keyList.r);
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
240
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
241
|
+
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
242
|
+
if (add !== undefined) {
|
|
243
|
+
worker.put(parsedData.changeNumber, {
|
|
244
|
+
name: parsedData.segmentName,
|
|
245
|
+
add: add
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
case types_1.UpdateStrategy.SegmentRemoval:
|
|
252
|
+
if (!parsedData.segmentName) {
|
|
253
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
257
|
+
var worker = _a.worker;
|
|
258
|
+
return worker.put(parsedData.changeNumber, {
|
|
259
|
+
name: parsedData.segmentName,
|
|
260
|
+
add: false
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
266
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
267
|
+
var worker = _a.worker;
|
|
268
|
+
worker.put(parsedData.changeNumber);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
298
271
|
}
|
|
299
272
|
else {
|
|
300
273
|
pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
@@ -317,7 +290,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
317
290
|
return;
|
|
318
291
|
disconnected = false;
|
|
319
292
|
if (userKey)
|
|
320
|
-
this.add(userKey, pollingManager.segmentsSyncTask
|
|
293
|
+
this.add(userKey, pollingManager.segmentsSyncTask); // client-side
|
|
321
294
|
else
|
|
322
295
|
setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
|
|
323
296
|
},
|
|
@@ -326,15 +299,11 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
326
299
|
return disconnected === false;
|
|
327
300
|
},
|
|
328
301
|
// [Only for client-side]
|
|
329
|
-
add: function (userKey, mySegmentsSyncTask
|
|
302
|
+
add: function (userKey, mySegmentsSyncTask) {
|
|
330
303
|
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
331
304
|
if (!userKeyHashes[hash]) {
|
|
332
305
|
userKeyHashes[hash] = userKey;
|
|
333
|
-
clients[userKey] = {
|
|
334
|
-
hash64: (0, murmur3_64_1.hash64)(userKey),
|
|
335
|
-
worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker, constants_3.MY_SEGMENT),
|
|
336
|
-
workerLarge: myLargeSegmentsSyncTask ? (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(myLargeSegmentsSyncTask, telemetryTracker, constants_3.MY_LARGE_SEGMENT) : undefined
|
|
337
|
-
};
|
|
306
|
+
clients[userKey] = { hash64: (0, murmur3_64_1.hash64)(userKey), worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker) };
|
|
338
307
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
339
308
|
// Reconnects in case of a new client.
|
|
340
309
|
// Run in next event-loop cycle to save authentication calls
|
|
@@ -62,17 +62,13 @@ function telemetryCacheConfigAdapter(telemetry, settings) {
|
|
|
62
62
|
pop: function () {
|
|
63
63
|
var urls = settings.urls, scheduler = settings.scheduler;
|
|
64
64
|
var isClientSide = settings.core.key !== undefined;
|
|
65
|
-
var largeSegmentsEnabled = isClientSide && settings.sync.largeSegmentsEnabled;
|
|
66
65
|
var _a = getTelemetryFlagSetsStats(settings.sync.__splitFiltersValidation), flagSetsTotal = _a.flagSetsTotal, flagSetsIgnored = _a.flagSetsIgnored;
|
|
67
66
|
return (0, objectAssign_1.objectAssign)(getTelemetryConfigStats(settings.mode, settings.storage.type), {
|
|
68
67
|
sE: settings.streamingEnabled,
|
|
69
|
-
lsE: largeSegmentsEnabled ? largeSegmentsEnabled : undefined,
|
|
70
|
-
wls: largeSegmentsEnabled ? settings.startup.waitForLargeSegments : undefined,
|
|
71
68
|
rR: {
|
|
72
69
|
sp: scheduler.featuresRefreshRate / 1000,
|
|
73
70
|
se: isClientSide ? undefined : scheduler.segmentsRefreshRate / 1000,
|
|
74
71
|
ms: isClientSide ? scheduler.segmentsRefreshRate / 1000 : undefined,
|
|
75
|
-
mls: largeSegmentsEnabled ? scheduler.largeSegmentsRefreshRate / 1000 : undefined,
|
|
76
72
|
im: scheduler.impressionsRefreshRate / 1000,
|
|
77
73
|
ev: scheduler.eventsPushRate / 1000,
|
|
78
74
|
te: scheduler.telemetryRefreshRate / 1000,
|
|
@@ -117,53 +117,43 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
117
117
|
shared: function (matchingKey, readinessManager, storage) {
|
|
118
118
|
if (!pollingManager)
|
|
119
119
|
return;
|
|
120
|
-
var
|
|
120
|
+
var mySegmentsSyncTask = pollingManager.add(matchingKey, readinessManager, storage);
|
|
121
121
|
return {
|
|
122
|
-
isRunning:
|
|
122
|
+
isRunning: mySegmentsSyncTask.isRunning,
|
|
123
123
|
start: function () {
|
|
124
124
|
if (syncEnabled) {
|
|
125
125
|
if (pushManager) {
|
|
126
126
|
if (pollingManager.isRunning()) {
|
|
127
127
|
// if doing polling, we must start the periodic fetch of data
|
|
128
|
-
if (storage.splits.
|
|
129
|
-
|
|
130
|
-
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
131
|
-
mlsSyncTask.start();
|
|
128
|
+
if (storage.splits.usesSegments())
|
|
129
|
+
mySegmentsSyncTask.start();
|
|
132
130
|
}
|
|
133
131
|
else {
|
|
134
132
|
// if not polling, we must execute the sync task for the initial fetch
|
|
135
133
|
// of segments since `syncAll` was already executed when starting the main client
|
|
136
|
-
|
|
137
|
-
mlsSyncTask && mlsSyncTask.execute();
|
|
134
|
+
mySegmentsSyncTask.execute();
|
|
138
135
|
}
|
|
139
|
-
pushManager.add(matchingKey,
|
|
136
|
+
pushManager.add(matchingKey, mySegmentsSyncTask);
|
|
140
137
|
}
|
|
141
138
|
else {
|
|
142
|
-
if (storage.splits.
|
|
143
|
-
|
|
144
|
-
if (mlsSyncTask && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
145
|
-
mlsSyncTask.start();
|
|
139
|
+
if (storage.splits.usesSegments())
|
|
140
|
+
mySegmentsSyncTask.start();
|
|
146
141
|
}
|
|
147
142
|
}
|
|
148
143
|
else {
|
|
149
|
-
if (!readinessManager.isReady())
|
|
150
|
-
|
|
151
|
-
mlsSyncTask && mlsSyncTask.execute();
|
|
152
|
-
}
|
|
144
|
+
if (!readinessManager.isReady())
|
|
145
|
+
mySegmentsSyncTask.execute();
|
|
153
146
|
}
|
|
154
147
|
},
|
|
155
148
|
stop: function () {
|
|
156
149
|
// check in case `client.destroy()` has been invoked more than once for the same client
|
|
157
|
-
var
|
|
158
|
-
if (
|
|
159
|
-
var msSyncTask_1 = syncTasks.msSyncTask, mlsSyncTask_1 = syncTasks.mlsSyncTask;
|
|
150
|
+
var mySegmentsSyncTask = pollingManager.get(matchingKey);
|
|
151
|
+
if (mySegmentsSyncTask) {
|
|
160
152
|
// stop syncing
|
|
161
153
|
if (pushManager)
|
|
162
154
|
pushManager.remove(matchingKey);
|
|
163
|
-
if (
|
|
164
|
-
|
|
165
|
-
if (mlsSyncTask_1 && mlsSyncTask_1.isRunning())
|
|
166
|
-
mlsSyncTask_1.stop();
|
|
155
|
+
if (mySegmentsSyncTask.isRunning())
|
|
156
|
+
mySegmentsSyncTask.stop();
|
|
167
157
|
pollingManager.remove(matchingKey);
|
|
168
158
|
}
|
|
169
159
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
5
5
|
// Special treatments
|
|
6
6
|
exports.CONTROL = 'control';
|
|
7
7
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -65,7 +65,6 @@ exports.TELEMETRY = 'te';
|
|
|
65
65
|
exports.TOKEN = 'to';
|
|
66
66
|
exports.SEGMENT = 'se';
|
|
67
67
|
exports.MY_SEGMENT = 'ms';
|
|
68
|
-
exports.MY_LARGE_SEGMENT = 'mls';
|
|
69
68
|
exports.TREATMENT = 't';
|
|
70
69
|
exports.TREATMENTS = 'ts';
|
|
71
70
|
exports.TREATMENT_WITH_CONFIG = 'tc';
|
|
@@ -91,7 +90,6 @@ exports.NON_REQUESTED = 1;
|
|
|
91
90
|
exports.DISABLED = 0;
|
|
92
91
|
exports.ENABLED = 1;
|
|
93
92
|
exports.PAUSED = 2;
|
|
94
|
-
exports.FLAG_SPEC_VERSION = '1.
|
|
93
|
+
exports.FLAG_SPEC_VERSION = '1.1';
|
|
95
94
|
// Matcher types
|
|
96
95
|
exports.IN_SEGMENT = 'IN_SEGMENT';
|
|
97
|
-
exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
|
|
@@ -30,8 +30,6 @@ exports.base = {
|
|
|
30
30
|
featuresRefreshRate: 60,
|
|
31
31
|
// fetch segments updates each 60 sec
|
|
32
32
|
segmentsRefreshRate: 60,
|
|
33
|
-
// fetch large segments updates each 60 sec
|
|
34
|
-
largeSegmentsRefreshRate: 60,
|
|
35
33
|
// publish telemetry stats each 3600 secs (1 hour)
|
|
36
34
|
telemetryRefreshRate: 3600,
|
|
37
35
|
// publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
|
|
@@ -77,8 +75,7 @@ exports.base = {
|
|
|
77
75
|
impressionsMode: constants_1.OPTIMIZED,
|
|
78
76
|
localhostMode: undefined,
|
|
79
77
|
enabled: true,
|
|
80
|
-
flagSpecVersion: constants_1.FLAG_SPEC_VERSION
|
|
81
|
-
largeSegmentsEnabled: false
|
|
78
|
+
flagSpecVersion: constants_1.FLAG_SPEC_VERSION
|
|
82
79
|
},
|
|
83
80
|
// Logger
|
|
84
81
|
log: undefined
|
|
@@ -117,7 +114,6 @@ function settingsValidation(config, validationParams) {
|
|
|
117
114
|
var scheduler = withDefaults.scheduler, startup = withDefaults.startup;
|
|
118
115
|
scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
|
|
119
116
|
scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
|
|
120
|
-
scheduler.largeSegmentsRefreshRate = fromSecondsToMillis(scheduler.largeSegmentsRefreshRate);
|
|
121
117
|
scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
|
|
122
118
|
scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
|
|
123
119
|
scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
|
|
@@ -190,11 +186,10 @@ function settingsValidation(config, validationParams) {
|
|
|
190
186
|
var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, sync.splitFilters, withDefaults.mode);
|
|
191
187
|
sync.splitFilters = splitFiltersValidation.validFilters;
|
|
192
188
|
sync.__splitFiltersValidation = splitFiltersValidation;
|
|
193
|
-
// ensure a valid flag spec version
|
|
194
189
|
sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : constants_1.FLAG_SPEC_VERSION;
|
|
195
190
|
// ensure a valid user consent value
|
|
196
191
|
// @ts-ignore, modify readonly prop
|
|
197
|
-
withDefaults.userConsent = consent
|
|
192
|
+
withDefaults.userConsent = consent(withDefaults);
|
|
198
193
|
return withDefaults;
|
|
199
194
|
}
|
|
200
195
|
exports.settingsValidation = settingsValidation;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { allMatcherContext } from './all';
|
|
2
2
|
import { segmentMatcherContext } from './segment';
|
|
3
|
-
import { largeSegmentMatcherContext } from './large_segment';
|
|
4
3
|
import { whitelistMatcherContext } from './whitelist';
|
|
5
4
|
import { equalToMatcherContext } from './eq';
|
|
6
5
|
import { greaterThanEqualMatcherContext } from './gte';
|
|
@@ -44,8 +43,7 @@ var matchers = [
|
|
|
44
43
|
greaterThanEqualToSemverMatcherContext,
|
|
45
44
|
lessThanEqualToSemverMatcherContext,
|
|
46
45
|
betweenSemverMatcherContext,
|
|
47
|
-
inListSemverMatcherContext,
|
|
48
|
-
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
46
|
+
inListSemverMatcherContext, // IN_LIST_SEMVER: 22
|
|
49
47
|
];
|
|
50
48
|
/**
|
|
51
49
|
* Matcher factory.
|
|
@@ -15,7 +15,7 @@ export function matchersTransform(matchers) {
|
|
|
15
15
|
// As default input data type we use string (even for ALL_KEYS)
|
|
16
16
|
var dataType = matcherDataTypes.STRING;
|
|
17
17
|
var value = undefined;
|
|
18
|
-
if (type === matcherTypes.IN_SEGMENT
|
|
18
|
+
if (type === matcherTypes.IN_SEGMENT) {
|
|
19
19
|
value = segmentTransform(userDefinedSegmentMatcherData);
|
|
20
20
|
}
|
|
21
21
|
else if (type === matcherTypes.EQUAL_TO) {
|
package/esm/logger/constants.js
CHANGED
|
@@ -35,6 +35,7 @@ export var IMPRESSION = 102;
|
|
|
35
35
|
export var IMPRESSION_QUEUEING = 103;
|
|
36
36
|
export var NEW_SHARED_CLIENT = 104;
|
|
37
37
|
export var NEW_FACTORY = 105;
|
|
38
|
+
export var POLLING_SMART_PAUSING = 106;
|
|
38
39
|
export var POLLING_START = 107;
|
|
39
40
|
export var POLLING_STOP = 108;
|
|
40
41
|
export var SYNC_SPLITS_FETCH_RETRY = 109;
|
|
@@ -16,10 +16,11 @@ export var codesInfo = codesWarn.concat([
|
|
|
16
16
|
[c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
|
|
17
17
|
[c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
|
|
18
18
|
// synchronizer
|
|
19
|
+
[c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
|
|
19
20
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
20
21
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
21
22
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
|
|
22
|
-
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and
|
|
23
|
+
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
|
|
23
24
|
[c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
|
|
24
25
|
[c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
|
|
25
26
|
[c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
|
|
@@ -13,20 +13,20 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
13
13
|
splitsEventEmitter.once(SDK_SPLITS_CACHE_LOADED, function () { splitsEventEmitter.splitsCacheLoaded = true; });
|
|
14
14
|
return splitsEventEmitter;
|
|
15
15
|
}
|
|
16
|
-
function segmentsEventEmitterFactory(EventEmitter
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
function segmentsEventEmitterFactory(EventEmitter) {
|
|
17
|
+
var segmentsEventEmitter = objectAssign(new EventEmitter(), {
|
|
18
|
+
segmentsArrived: false
|
|
19
|
+
});
|
|
19
20
|
segmentsEventEmitter.once(SDK_SEGMENTS_ARRIVED, function () { segmentsEventEmitter.segmentsArrived = true; });
|
|
20
21
|
return segmentsEventEmitter;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Factory of readiness manager, which handles the ready / update event propagation.
|
|
24
25
|
*/
|
|
25
|
-
export function readinessManagerFactory(EventEmitter,
|
|
26
|
+
export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
|
|
27
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
26
28
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
27
|
-
var _a = settings.startup, readyTimeout = _a.readyTimeout, waitForLargeSegments = _a.waitForLargeSegments, largeSegmentsEnabled = settings.sync.largeSegmentsEnabled;
|
|
28
29
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
29
|
-
var largeSegments = largeSegmentsEnabled ? segmentsEventEmitterFactory(EventEmitter, !waitForLargeSegments) : undefined;
|
|
30
30
|
var gate = new EventEmitter();
|
|
31
31
|
// emit SDK_READY_FROM_CACHE
|
|
32
32
|
var isReadyFromCache = false;
|
|
@@ -50,8 +50,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
50
50
|
var isReady = false;
|
|
51
51
|
splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
52
52
|
segments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
53
|
-
if (largeSegments)
|
|
54
|
-
largeSegments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
55
53
|
var isDestroyed = false;
|
|
56
54
|
function checkIsReadyFromCache() {
|
|
57
55
|
isReadyFromCache = true;
|
|
@@ -77,7 +75,7 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
77
75
|
}
|
|
78
76
|
}
|
|
79
77
|
else {
|
|
80
|
-
if (splits.splitsArrived && segments.segmentsArrived
|
|
78
|
+
if (splits.splitsArrived && segments.segmentsArrived) {
|
|
81
79
|
clearTimeout(readyTimeoutId);
|
|
82
80
|
isReady = true;
|
|
83
81
|
try {
|
|
@@ -94,11 +92,11 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
94
92
|
return {
|
|
95
93
|
splits: splits,
|
|
96
94
|
segments: segments,
|
|
97
|
-
largeSegments: largeSegments,
|
|
98
95
|
gate: gate,
|
|
99
|
-
shared: function () {
|
|
96
|
+
shared: function (readyTimeout) {
|
|
97
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
100
98
|
refCount++;
|
|
101
|
-
return readinessManagerFactory(EventEmitter,
|
|
99
|
+
return readinessManagerFactory(EventEmitter, readyTimeout, splits);
|
|
102
100
|
},
|
|
103
101
|
// @TODO review/remove next methods when non-recoverable errors are reworked
|
|
104
102
|
// Called on consumer mode, when storage fails to connect
|
|
@@ -109,8 +107,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
109
107
|
destroy: function () {
|
|
110
108
|
isDestroyed = true;
|
|
111
109
|
segments.removeAllListeners();
|
|
112
|
-
if (largeSegments)
|
|
113
|
-
largeSegments.removeAllListeners();
|
|
114
110
|
gate.removeAllListeners();
|
|
115
111
|
clearTimeout(readyTimeoutId);
|
|
116
112
|
if (refCount > 0)
|
|
@@ -12,9 +12,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
|
|
|
12
12
|
* @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
|
|
13
13
|
* @param readinessManager optional readinessManager to use. only used internally for `shared` method
|
|
14
14
|
*/
|
|
15
|
-
export function sdkReadinessManagerFactory(EventEmitter,
|
|
16
|
-
if (
|
|
17
|
-
|
|
15
|
+
export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager) {
|
|
16
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
17
|
+
if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, readyTimeout); }
|
|
18
18
|
/** Ready callback warning */
|
|
19
19
|
var internalReadyCbCount = 0;
|
|
20
20
|
var readyCbCount = 0;
|
|
@@ -57,8 +57,9 @@ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessMana
|
|
|
57
57
|
}
|
|
58
58
|
return {
|
|
59
59
|
readinessManager: readinessManager,
|
|
60
|
-
shared: function () {
|
|
61
|
-
|
|
60
|
+
shared: function (readyTimeout) {
|
|
61
|
+
if (readyTimeout === void 0) { readyTimeout = 0; }
|
|
62
|
+
return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
|
|
62
63
|
},
|
|
63
64
|
incInternalReadyCbCount: function () {
|
|
64
65
|
internalReadyCbCount++;
|
|
@@ -14,7 +14,7 @@ function buildInstanceId(key) {
|
|
|
14
14
|
* Therefore, clients don't have a bound TT for the track method.
|
|
15
15
|
*/
|
|
16
16
|
export function sdkClientMethodCSFactory(params) {
|
|
17
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
|
|
17
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
18
18
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
19
19
|
var parsedDefaultKey = keyParser(key);
|
|
20
20
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
@@ -34,7 +34,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
34
34
|
var instanceId = buildInstanceId(validKey);
|
|
35
35
|
if (!clientInstances[instanceId]) {
|
|
36
36
|
var matchingKey = getMatching(validKey);
|
|
37
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
37
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
|
38
38
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
39
39
|
if (err) {
|
|
40
40
|
sharedSdkReadiness_1.readinessManager.timeout();
|
|
@@ -16,7 +16,7 @@ function buildInstanceId(key, trafficType) {
|
|
|
16
16
|
* (default client) or the client method (shared clients).
|
|
17
17
|
*/
|
|
18
18
|
export function sdkClientMethodCSFactory(params) {
|
|
19
|
-
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
|
|
19
|
+
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
20
20
|
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key, trafficType);
|
|
21
21
|
var parsedDefaultKey = keyParser(key);
|
|
22
22
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
@@ -43,7 +43,7 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
43
43
|
var instanceId = buildInstanceId(validKey, validTrafficType);
|
|
44
44
|
if (!clientInstances[instanceId]) {
|
|
45
45
|
var matchingKey = getMatching(validKey);
|
|
46
|
-
var sharedSdkReadiness_1 = sdkReadinessManager.shared();
|
|
46
|
+
var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
|
|
47
47
|
var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
|
|
48
48
|
if (err) {
|
|
49
49
|
sharedSdkReadiness_1.readinessManager.timeout();
|
package/esm/sdkFactory/index.js
CHANGED
|
@@ -22,7 +22,7 @@ export function sdkFactory(params) {
|
|
|
22
22
|
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
|
|
23
23
|
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
|
|
24
24
|
validateAndTrackApiKey(log, settings.core.authorizationKey);
|
|
25
|
-
var sdkReadinessManager = sdkReadinessManagerFactory(platform.EventEmitter, settings);
|
|
25
|
+
var sdkReadinessManager = sdkReadinessManagerFactory(log, platform.EventEmitter, settings.startup.readyTimeout);
|
|
26
26
|
var readiness = sdkReadinessManager.readinessManager;
|
|
27
27
|
var storage = storageFactory({
|
|
28
28
|
settings: settings,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
|
+
import { _Set } from '../utils/lang/sets';
|
|
3
|
+
var FORBIDDEN_HEADERS = new _Set([
|
|
4
|
+
'splitsdkversion',
|
|
5
|
+
'splitsdkmachineip',
|
|
6
|
+
'splitsdkmachinename',
|
|
7
|
+
'splitsdkimpressionsmode',
|
|
8
|
+
'host',
|
|
9
|
+
'referrer',
|
|
10
|
+
'content-type',
|
|
11
|
+
'content-length',
|
|
12
|
+
'content-encoding',
|
|
13
|
+
'accept',
|
|
14
|
+
'keep-alive',
|
|
15
|
+
'x-fastly-debug'
|
|
16
|
+
]);
|
|
17
|
+
function convertKeysToLowerCase(obj) {
|
|
18
|
+
return Object.keys(obj).reduce(function (acc, key) {
|
|
19
|
+
acc[key.toLowerCase()] = obj[key];
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
}
|
|
23
|
+
export function decorateHeaders(settings, headers) {
|
|
24
|
+
var _a;
|
|
25
|
+
if ((_a = settings.sync.requestOptions) === null || _a === void 0 ? void 0 : _a.getHeaderOverrides) {
|
|
26
|
+
headers = convertKeysToLowerCase(headers);
|
|
27
|
+
try {
|
|
28
|
+
var headerOverrides_1 = convertKeysToLowerCase(settings.sync.requestOptions.getHeaderOverrides({ headers: objectAssign({}, headers) }));
|
|
29
|
+
Object.keys(headerOverrides_1)
|
|
30
|
+
.filter(function (key) { return !FORBIDDEN_HEADERS.has(key); })
|
|
31
|
+
.forEach(function (key) { return headers[key] = headerOverrides_1[key]; });
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
settings.log.error('Problem adding custom headers to request decorator: ' + e);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return headers;
|
|
38
|
+
}
|
package/esm/services/splitApi.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { splitHttpClientFactory } from './splitHttpClient';
|
|
2
2
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
3
|
-
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT
|
|
3
|
+
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT } from '../utils/constants';
|
|
4
4
|
import { ERROR_TOO_MANY_SETS } from '../logger/constants';
|
|
5
5
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
6
6
|
function userKeyToQueryParam(userKey) {
|
|
@@ -61,10 +61,6 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
61
61
|
var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
|
|
62
62
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_SEGMENT));
|
|
63
63
|
},
|
|
64
|
-
fetchMyLargeSegments: function (userMatchingKey, noCache) {
|
|
65
|
-
var url = urls.sdk + "/myLargeSegments/" + encodeURIComponent(userMatchingKey);
|
|
66
|
-
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_LARGE_SEGMENT));
|
|
67
|
-
},
|
|
68
64
|
/**
|
|
69
65
|
* Post events.
|
|
70
66
|
*
|