@splitsoftware/splitio-commons 0.1.1-canary.9 → 0.1.1-rc.18
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/cjs/evaluator/matchers/matcherTypes.js +4 -4
- package/cjs/evaluator/matchersTransform/index.js +11 -11
- package/cjs/evaluator/value/sanitize.js +6 -6
- package/cjs/listeners/browser.js +1 -2
- package/cjs/listeners/node.js +0 -3
- package/cjs/logger/constants.js +3 -1
- package/cjs/logger/messages/error.js +3 -2
- package/cjs/logger/messages/info.js +2 -2
- package/cjs/logger/messages/warn.js +2 -1
- package/cjs/readiness/readinessManager.js +10 -7
- package/cjs/sdkFactory/index.js +1 -4
- package/cjs/services/splitApi.js +1 -1
- package/cjs/services/splitHttpClient.js +5 -4
- package/cjs/storages/AbstractSplitsCacheSync.js +1 -1
- package/cjs/storages/inLocalStorage/index.js +5 -2
- package/cjs/storages/inMemory/InMemoryStorage.js +2 -0
- package/cjs/storages/inMemory/InMemoryStorageCS.js +2 -0
- package/cjs/storages/inRedis/SplitsCacheInRedis.js +6 -2
- package/cjs/storages/inRedis/index.js +5 -2
- package/cjs/storages/pluggable/SplitsCachePluggable.js +6 -2
- package/cjs/storages/pluggable/inMemoryWrapper.js +6 -7
- package/cjs/storages/pluggable/index.js +5 -2
- package/cjs/storages/pluggable/wrapperAdapter.js +0 -1
- package/cjs/sync/offline/splitsParser/splitsParserFromFile.js +92 -89
- package/cjs/sync/offline/splitsParser/splitsParserFromSettings.js +45 -42
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +14 -4
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +30 -10
- package/cjs/sync/streaming/SSEClient/index.js +0 -11
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +7 -0
- package/cjs/sync/streaming/SSEHandler/NotificationParser.js +4 -1
- package/cjs/sync/streaming/SSEHandler/index.js +8 -9
- package/cjs/sync/streaming/SSEHandler/types.js +14 -0
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +5 -5
- package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +2 -1
- package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +5 -3
- package/cjs/sync/streaming/constants.js +3 -1
- package/cjs/sync/streaming/mySegmentsV2utils.js +75 -0
- package/cjs/sync/streaming/pushManager.js +141 -40
- package/cjs/sync/submitters/metricsSyncTask.js +1 -1
- package/cjs/sync/submitters/submitterSyncTask.js +2 -2
- package/cjs/sync/syncManagerFromFile.js +15 -0
- package/cjs/sync/syncManagerFromObject.js +14 -0
- package/cjs/sync/syncManagerOffline.js +3 -3
- package/cjs/sync/syncManagerOnline.js +5 -3
- package/cjs/trackers/impressionObserver/ImpressionObserver.js +0 -2
- package/cjs/trackers/impressionObserver/buildKey.js +3 -9
- package/cjs/trackers/impressionObserver/impressionObserverCS.js +2 -2
- package/cjs/trackers/impressionObserver/impressionObserverSS.js +3 -3
- package/cjs/utils/constants/index.js +4 -1
- package/cjs/utils/decompress/index.js +427 -0
- package/cjs/utils/murmur3/{commons.js → common.js} +2 -6
- package/cjs/utils/murmur3/murmur3.js +11 -12
- package/cjs/utils/murmur3/murmur3_128.js +7 -142
- package/cjs/utils/murmur3/murmur3_128_x86.js +154 -0
- package/cjs/utils/murmur3/murmur3_64.js +36 -0
- package/cjs/utils/murmur3/utfx.js +100 -106
- package/cjs/utils/promise/wrapper.js +14 -11
- package/cjs/utils/settingsValidation/index.js +5 -2
- package/cjs/utils/settingsValidation/localhost/index.js +20 -0
- package/cjs/utils/settingsValidation/splitFilters.js +0 -1
- package/cjs/utils/settingsValidation/storage/storageCS.js +18 -8
- package/cjs/utils/settingsValidation/url.js +1 -1
- package/esm/evaluator/matchers/matcherTypes.js +2 -2
- package/esm/evaluator/matchersTransform/index.js +12 -12
- package/esm/evaluator/value/sanitize.js +7 -7
- package/esm/listeners/browser.js +1 -2
- package/esm/listeners/node.js +0 -3
- package/esm/logger/constants.js +2 -0
- package/esm/logger/messages/error.js +3 -2
- package/esm/logger/messages/info.js +2 -2
- package/esm/logger/messages/warn.js +2 -1
- package/esm/readiness/readinessManager.js +10 -7
- package/esm/sdkFactory/index.js +1 -4
- package/esm/services/splitApi.js +1 -1
- package/esm/services/splitHttpClient.js +5 -4
- package/esm/storages/AbstractSplitsCacheSync.js +1 -1
- package/esm/storages/inLocalStorage/index.js +5 -2
- package/esm/storages/inMemory/InMemoryStorage.js +2 -0
- package/esm/storages/inMemory/InMemoryStorageCS.js +2 -0
- package/esm/storages/inRedis/SplitsCacheInRedis.js +6 -2
- package/esm/storages/inRedis/index.js +5 -2
- package/esm/storages/pluggable/SplitsCachePluggable.js +6 -2
- package/esm/storages/pluggable/inMemoryWrapper.js +6 -7
- package/esm/storages/pluggable/index.js +5 -2
- package/esm/storages/pluggable/wrapperAdapter.js +0 -1
- package/esm/sync/offline/splitsParser/splitsParserFromFile.js +90 -88
- package/esm/sync/offline/splitsParser/splitsParserFromSettings.js +43 -41
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +15 -5
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +30 -10
- package/esm/sync/streaming/SSEClient/index.js +0 -11
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +7 -0
- package/esm/sync/streaming/SSEHandler/NotificationParser.js +4 -1
- package/esm/sync/streaming/SSEHandler/index.js +9 -10
- package/esm/sync/streaming/SSEHandler/types.js +13 -1
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +5 -5
- package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +2 -1
- package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +5 -3
- package/esm/sync/streaming/constants.js +2 -0
- package/esm/sync/streaming/mySegmentsV2utils.js +69 -0
- package/esm/sync/streaming/pushManager.js +143 -42
- package/esm/sync/submitters/metricsSyncTask.js +1 -1
- package/esm/sync/submitters/submitterSyncTask.js +2 -2
- package/esm/sync/syncManagerFromFile.js +11 -0
- package/esm/sync/syncManagerFromObject.js +10 -0
- package/esm/sync/syncManagerOffline.js +3 -3
- package/esm/sync/syncManagerOnline.js +5 -3
- package/esm/trackers/impressionObserver/ImpressionObserver.js +0 -2
- package/esm/trackers/impressionObserver/buildKey.js +2 -9
- package/esm/trackers/impressionObserver/impressionObserverCS.js +2 -2
- package/esm/trackers/impressionObserver/impressionObserverSS.js +3 -3
- package/esm/utils/constants/index.js +3 -0
- package/esm/utils/decompress/index.js +424 -0
- package/esm/utils/murmur3/{commons.js → common.js} +1 -4
- package/esm/utils/murmur3/murmur3.js +1 -2
- package/esm/utils/murmur3/murmur3_128.js +7 -142
- package/esm/utils/murmur3/murmur3_128_x86.js +150 -0
- package/esm/utils/murmur3/murmur3_64.js +32 -0
- package/esm/utils/murmur3/utfx.js +96 -106
- package/esm/utils/promise/wrapper.js +14 -11
- package/esm/utils/settingsValidation/index.js +5 -2
- package/esm/utils/settingsValidation/localhost/index.js +16 -0
- package/esm/utils/settingsValidation/splitFilters.js +0 -1
- package/esm/utils/settingsValidation/storage/storageCS.js +16 -7
- package/esm/utils/settingsValidation/url.js +1 -1
- package/package.json +5 -5
- package/src/evaluator/matchers/matcherTypes.ts +2 -2
- package/src/evaluator/matchersTransform/index.ts +12 -12
- package/src/evaluator/value/sanitize.ts +7 -7
- package/src/listeners/browser.ts +1 -1
- package/src/listeners/node.ts +1 -2
- package/src/logger/constants.ts +2 -0
- package/src/logger/messages/error.ts +3 -2
- package/src/logger/messages/info.ts +2 -2
- package/src/logger/messages/warn.ts +3 -1
- package/src/readiness/readinessManager.ts +9 -7
- package/src/sdkFactory/index.ts +1 -3
- package/src/sdkFactory/types.ts +3 -3
- package/src/services/splitApi.ts +2 -3
- package/src/services/splitHttpClient.ts +6 -5
- package/src/services/types.ts +5 -5
- package/src/storages/AbstractSplitsCacheSync.ts +1 -1
- package/src/storages/inLocalStorage/index.ts +8 -4
- package/src/storages/inMemory/InMemoryStorage.ts +3 -0
- package/src/storages/inMemory/InMemoryStorageCS.ts +3 -0
- package/src/storages/inRedis/SplitsCacheInRedis.ts +3 -1
- package/src/storages/inRedis/index.ts +8 -4
- package/src/storages/pluggable/SplitsCachePluggable.ts +3 -1
- package/src/storages/pluggable/inMemoryWrapper.ts +6 -7
- package/src/storages/pluggable/index.ts +8 -4
- package/src/storages/pluggable/wrapperAdapter.ts +0 -1
- package/src/storages/types.ts +18 -15
- package/src/sync/offline/splitsParser/splitsParserFromFile.ts +110 -105
- package/src/sync/offline/splitsParser/splitsParserFromSettings.ts +45 -41
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +15 -5
- package/src/sync/polling/types.ts +2 -1
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +28 -10
- package/src/sync/streaming/AuthClient/types.ts +3 -0
- package/src/sync/streaming/SSEClient/index.ts +1 -15
- package/src/sync/streaming/SSEClient/types.ts +0 -1
- package/src/sync/streaming/SSEHandler/NotificationKeeper.ts +8 -0
- package/src/sync/streaming/SSEHandler/NotificationParser.ts +4 -2
- package/src/sync/streaming/SSEHandler/index.ts +11 -20
- package/src/sync/streaming/SSEHandler/types.ts +37 -3
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +7 -6
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +2 -1
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +4 -3
- package/src/sync/streaming/UpdateWorkers/types.ts +1 -1
- package/src/sync/streaming/constants.ts +2 -0
- package/src/sync/streaming/mySegmentsV2utils.ts +77 -0
- package/src/sync/streaming/pushManager.ts +139 -42
- package/src/sync/streaming/types.ts +14 -22
- package/src/sync/submitters/metricsSyncTask.ts +1 -1
- package/src/sync/submitters/submitterSyncTask.ts +2 -1
- package/src/sync/syncManagerFromFile.ts +13 -0
- package/src/sync/syncManagerFromObject.ts +12 -0
- package/src/sync/syncManagerOffline.ts +3 -3
- package/src/sync/syncManagerOnline.ts +6 -3
- package/src/trackers/impressionObserver/ImpressionObserver.ts +4 -6
- package/src/trackers/impressionObserver/buildKey.ts +2 -16
- package/src/trackers/impressionObserver/impressionObserverCS.ts +2 -2
- package/src/trackers/impressionObserver/impressionObserverSS.ts +3 -3
- package/src/types.ts +16 -2
- package/src/utils/constants/index.ts +6 -1
- package/src/utils/decompress/index.ts +429 -0
- package/src/utils/murmur3/{commons.ts → common.ts} +1 -5
- package/src/utils/murmur3/murmur3.ts +5 -5
- package/src/utils/murmur3/murmur3_128.ts +7 -180
- package/src/utils/murmur3/murmur3_128_x86.ts +188 -0
- package/src/utils/murmur3/murmur3_64.ts +36 -0
- package/src/utils/murmur3/utfx.ts +92 -110
- package/src/utils/promise/wrapper.ts +12 -9
- package/src/utils/settingsValidation/index.ts +8 -4
- package/src/utils/settingsValidation/localhost/index.ts +19 -0
- package/src/utils/settingsValidation/splitFilters.ts +0 -1
- package/src/utils/settingsValidation/storage/storageCS.ts +21 -8
- package/src/utils/settingsValidation/types.ts +2 -11
- package/src/utils/settingsValidation/url.ts +1 -1
- package/types/evaluator/matchers/matcherTypes.d.ts +2 -2
- package/types/listeners/browser.d.ts +1 -0
- package/types/listeners/node.d.ts +0 -1
- package/types/logger/constants.d.ts +2 -0
- package/types/sdkFactory/types.d.ts +3 -3
- package/types/services/types.d.ts +1 -0
- package/types/storages/inLocalStorage/index.d.ts +2 -2
- package/types/storages/inMemory/InMemoryStorage.d.ts +3 -0
- package/types/storages/inMemory/InMemoryStorageCS.d.ts +3 -0
- package/types/storages/inRedis/index.d.ts +2 -2
- package/types/storages/pluggable/index.d.ts +2 -2
- package/types/storages/types.d.ts +15 -15
- package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +2 -7
- package/types/sync/offline/splitsParser/splitsParserFromSettings.d.ts +1 -5
- package/types/sync/polling/types.d.ts +2 -1
- package/types/sync/streaming/AuthClient/indexV1.d.ts +12 -0
- package/types/sync/streaming/AuthClient/indexV2.d.ts +8 -0
- package/types/sync/streaming/AuthClient/types.d.ts +2 -0
- package/types/sync/streaming/SSEClient/index.d.ts +1 -9
- package/types/sync/streaming/SSEClient/types.d.ts +0 -1
- package/types/sync/streaming/SSEHandler/NotificationParser.d.ts +3 -2
- package/types/sync/streaming/SSEHandler/types.d.ts +30 -2
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +4 -3
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +3 -2
- package/types/sync/streaming/UpdateWorkers/types.d.ts +1 -1
- package/types/sync/streaming/constants.d.ts +3 -1
- package/types/sync/streaming/mySegmentsV2utils.d.ts +27 -0
- package/types/sync/streaming/pushManagerNoUsers.d.ts +13 -0
- package/types/sync/streaming/types.d.ts +9 -5
- package/types/sync/submitters/submitterSyncTask.d.ts +1 -1
- package/types/sync/syncManagerFromFile.d.ts +2 -0
- package/types/sync/syncManagerFromObject.d.ts +2 -0
- package/types/sync/syncManagerOffline.d.ts +1 -1
- package/types/trackers/impressionObserver/ImpressionObserver.d.ts +2 -2
- package/types/trackers/impressionObserver/buildKey.d.ts +1 -1
- package/types/trackers/impressionObserver/impressionObserverCS.d.ts +2 -2
- package/types/trackers/impressionObserver/impressionObserverSS.d.ts +2 -2
- package/types/types.d.ts +16 -2
- package/types/utils/constants/index.d.ts +5 -1
- package/types/utils/decompress/index.d.ts +16 -0
- package/types/utils/murmur3/common.d.ts +12 -0
- package/types/utils/murmur3/murmur3.d.ts +2 -2
- package/types/utils/murmur3/murmur3_128.d.ts +5 -0
- package/types/utils/murmur3/murmur3_128_x86.d.ts +7 -0
- package/types/utils/murmur3/murmur3_64.d.ts +10 -0
- package/types/utils/murmur3/utfx.d.ts +24 -6
- package/types/utils/settingsValidation/index.d.ts +3 -2
- package/types/utils/settingsValidation/localhost/index.d.ts +9 -0
- package/types/utils/settingsValidation/storage/storageCS.d.ts +7 -1
- package/types/utils/settingsValidation/types.d.ts +2 -10
- package/cjs/sync/streaming/pushManagerCS.js +0 -179
- package/cjs/sync/streaming/pushManagerSS.js +0 -128
- package/esm/sync/streaming/pushManagerCS.js +0 -175
- package/esm/sync/streaming/pushManagerSS.js +0 -124
- package/src/sync/streaming/pushManagerCS.ts +0 -238
- package/src/sync/streaming/pushManagerSS.ts +0 -177
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
|
|
4
|
+
var decompress_1 = require("../../utils/decompress");
|
|
5
|
+
var base64_1 = require("../../utils/base64");
|
|
6
|
+
var GZIP = 1;
|
|
7
|
+
var ZLIB = 2;
|
|
8
|
+
function Uint8ArrayToString(myUint8Arr) {
|
|
9
|
+
return String.fromCharCode.apply(null, myUint8Arr);
|
|
10
|
+
}
|
|
11
|
+
function StringToUint8Array(myString) {
|
|
12
|
+
var charCodes = myString.split('').map(function (e) { return e.charCodeAt(0); });
|
|
13
|
+
return new Uint8Array(charCodes);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Decode and decompress 'data' with 'compression' algorithm
|
|
17
|
+
*
|
|
18
|
+
* @param {string} data
|
|
19
|
+
* @param {number} compression 1 GZIP, 2 ZLIB
|
|
20
|
+
* @returns {Uint8Array}
|
|
21
|
+
* @throws if data string cannot be decoded, decompressed or the provided compression value is invalid (not 1 or 2)
|
|
22
|
+
*/
|
|
23
|
+
function decompress(data, compression) {
|
|
24
|
+
var compressData = base64_1.decodeFromBase64(data);
|
|
25
|
+
var binData = StringToUint8Array(compressData);
|
|
26
|
+
if (typeof decompress_1.algorithms === 'string')
|
|
27
|
+
throw new Error(decompress_1.algorithms);
|
|
28
|
+
if (compression === GZIP)
|
|
29
|
+
return decompress_1.algorithms.gunzipSync(binData);
|
|
30
|
+
if (compression === ZLIB)
|
|
31
|
+
return decompress_1.algorithms.unzlibSync(binData);
|
|
32
|
+
throw new Error("Invalid compression algorithm #" + compression);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Decode, decompress and parse the provided 'data' into a KeyList object
|
|
36
|
+
*
|
|
37
|
+
* @param {string} data
|
|
38
|
+
* @param {number} compression
|
|
39
|
+
* @returns {{a?: string[], r?: string[] }}
|
|
40
|
+
* @throws if data string cannot be decoded, decompressed or parsed
|
|
41
|
+
*/
|
|
42
|
+
function parseKeyList(data, compression) {
|
|
43
|
+
var binKeyList = decompress(data, compression);
|
|
44
|
+
var strKeyList = Uint8ArrayToString(binKeyList);
|
|
45
|
+
// replace numbers to strings, to avoid losing precision
|
|
46
|
+
return JSON.parse(strKeyList.replace(/\d+/g, '"$&"'));
|
|
47
|
+
}
|
|
48
|
+
exports.parseKeyList = parseKeyList;
|
|
49
|
+
/**
|
|
50
|
+
* Decode, decompress and parse the provided 'data' into a Bitmap object
|
|
51
|
+
*
|
|
52
|
+
* @param {string} data
|
|
53
|
+
* @param {number} compression
|
|
54
|
+
* @returns {Uint8Array}
|
|
55
|
+
* @throws if data string cannot be decoded or decompressed
|
|
56
|
+
*/
|
|
57
|
+
function parseBitmap(data, compression) {
|
|
58
|
+
return decompress(data, compression);
|
|
59
|
+
}
|
|
60
|
+
exports.parseBitmap = parseBitmap;
|
|
61
|
+
/**
|
|
62
|
+
* Check if the 'bitmap' bit at 'hash64hex' position is 1
|
|
63
|
+
*
|
|
64
|
+
* @param {Uint8Array} bitmap
|
|
65
|
+
* @param {string} hash64hex 16-chars string, representing a number in hexa
|
|
66
|
+
* @returns {boolean}
|
|
67
|
+
*/
|
|
68
|
+
function isInBitmap(bitmap, hash64hex) {
|
|
69
|
+
// using the lowest 32 bits as index, to avoid losing precision when converting to number
|
|
70
|
+
var index = parseInt(hash64hex.slice(8), 16) % (bitmap.length * 8);
|
|
71
|
+
var internal = Math.floor(index / 8);
|
|
72
|
+
var offset = index % 8;
|
|
73
|
+
return (bitmap[internal] & 1 << offset) > 0;
|
|
74
|
+
}
|
|
75
|
+
exports.isInBitmap = isInBitmap;
|
|
@@ -13,6 +13,10 @@ var SSEClient_1 = tslib_1.__importDefault(require("./SSEClient"));
|
|
|
13
13
|
var key_1 = require("../../utils/key");
|
|
14
14
|
var constants_1 = require("./constants");
|
|
15
15
|
var constants_2 = require("../../logger/constants");
|
|
16
|
+
var types_1 = require("./SSEHandler/types");
|
|
17
|
+
var mySegmentsV2utils_1 = require("./mySegmentsV2utils");
|
|
18
|
+
var sets_1 = require("../../utils/lang/sets");
|
|
19
|
+
var murmur3_64_1 = require("../../utils/murmur3/murmur3_64");
|
|
16
20
|
/**
|
|
17
21
|
* PushManager factory:
|
|
18
22
|
* - for server-side if key is not provided in settings.
|
|
@@ -37,43 +41,58 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
37
41
|
var pushEmitter = new platform.EventEmitter();
|
|
38
42
|
var sseHandler = SSEHandler_1.default(log, pushEmitter);
|
|
39
43
|
sseClient.setEventHandler(sseHandler);
|
|
44
|
+
// init workers
|
|
45
|
+
var segmentsUpdateWorker = userKey ? new MySegmentsUpdateWorker_1.default(pollingManager.segmentsSyncTask) : new SegmentsUpdateWorker_1.default(storage.segments, pollingManager.segmentsSyncTask);
|
|
46
|
+
// For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
|
|
47
|
+
var splitsUpdateWorker = new SplitsUpdateWorker_1.default(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
|
|
40
48
|
// [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
|
|
41
49
|
var userKeyHashes = {};
|
|
50
|
+
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
51
|
+
// Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
52
|
+
var clients = {};
|
|
42
53
|
if (userKey) {
|
|
43
54
|
var hash = AuthClient_1.hashUserKey(userKey);
|
|
44
55
|
userKeyHashes[hash] = userKey;
|
|
56
|
+
clients[userKey] = { hash64: murmur3_64_1.hash64(userKey), worker: segmentsUpdateWorker };
|
|
45
57
|
}
|
|
46
|
-
// init workers
|
|
47
|
-
var segmentsUpdateWorker = userKey ? new MySegmentsUpdateWorker_1.default(pollingManager.segmentsSyncTask) : new SegmentsUpdateWorker_1.default(storage.segments, pollingManager.segmentsSyncTask);
|
|
48
|
-
// [Only for server-side] we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
|
|
49
|
-
var splitsUpdateWorker = new SplitsUpdateWorker_1.default(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
|
|
50
|
-
// [Only for client-side] map of user keys to their corresponding MySegmentsUpdateWorkers. It has a two-fold intention:
|
|
51
|
-
// - stop workers all together when push is disconnected
|
|
52
|
-
// - keep the current list of user keys to authenticate
|
|
53
|
-
var workers = {};
|
|
54
|
-
if (userKey)
|
|
55
|
-
workers[userKey] = segmentsUpdateWorker;
|
|
56
58
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
57
59
|
var connectForNewClient = false;
|
|
58
|
-
// flag that indicates if `disconnectPush` was called, either by the SyncManager
|
|
60
|
+
// flag that indicates if `stop/disconnectPush` was called, either by the SyncManager, when the client is destroyed, or due to a PUSH_NONRETRYABLE_ERROR error.
|
|
59
61
|
// It is used to halt the `connectPush` process if it was in progress.
|
|
60
62
|
var disconnected;
|
|
63
|
+
// flag that indicates a PUSH_NONRETRYABLE_ERROR, condition with which starting pushManager again is ignored.
|
|
64
|
+
var disabled; // `disabled` implies `disconnected === true`
|
|
61
65
|
/** PushManager functions related to initialization */
|
|
62
66
|
var connectPushRetryBackoff = new Backoff_1.default(connectPush, settings.scheduler.pushRetryBackoffBase);
|
|
63
|
-
var
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
var timeoutIdTokenRefresh;
|
|
68
|
+
var timeoutIdSseOpen;
|
|
69
|
+
function scheduleTokenRefreshAndSse(authData) {
|
|
70
|
+
// clear scheduled tasks if exist
|
|
71
|
+
if (timeoutIdTokenRefresh)
|
|
72
|
+
clearTimeout(timeoutIdTokenRefresh);
|
|
73
|
+
if (timeoutIdSseOpen)
|
|
74
|
+
clearTimeout(timeoutIdSseOpen);
|
|
75
|
+
// Set token refresh 10 minutes before `expirationTime - issuedAt`
|
|
76
|
+
var decodedToken = authData.decodedToken;
|
|
77
|
+
var refreshTokenDelay = decodedToken.exp - decodedToken.iat - constants_1.SECONDS_BEFORE_EXPIRATION;
|
|
78
|
+
// Default connDelay of 60 secs
|
|
79
|
+
var connDelay = typeof authData.connDelay === 'number' && authData.connDelay >= 0 ? authData.connDelay : 60;
|
|
80
|
+
log.info(constants_2.STREAMING_REFRESH_TOKEN, [refreshTokenDelay, connDelay]);
|
|
81
|
+
timeoutIdTokenRefresh = setTimeout(connectPush, refreshTokenDelay * 1000);
|
|
82
|
+
timeoutIdSseOpen = setTimeout(function () {
|
|
83
|
+
// halt if disconnected
|
|
84
|
+
if (disconnected)
|
|
85
|
+
return;
|
|
86
|
+
sseClient.open(authData);
|
|
87
|
+
}, connDelay * 1000);
|
|
72
88
|
}
|
|
73
89
|
function connectPush() {
|
|
90
|
+
// Guard condition in case `stop/disconnectPush` has been called (e.g., calling SDK destroy, or app signal close/background)
|
|
91
|
+
if (disconnected)
|
|
92
|
+
return;
|
|
93
|
+
log.info(constants_2.STREAMING_CONNECTING, [disconnected === undefined ? '' : 'Re-']);
|
|
74
94
|
disconnected = false;
|
|
75
|
-
|
|
76
|
-
var userKeys = userKey ? Object.keys(workers) : undefined;
|
|
95
|
+
var userKeys = userKey ? Object.keys(clients) : undefined;
|
|
77
96
|
authenticate(userKeys).then(function (authData) {
|
|
78
97
|
if (disconnected)
|
|
79
98
|
return;
|
|
@@ -85,12 +104,10 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
85
104
|
return;
|
|
86
105
|
}
|
|
87
106
|
// [Only for client-side] don't open SSE connection if a new shared client was added, since it means that a new authentication is taking place
|
|
88
|
-
if (userKeys && userKeys.length < Object.keys(
|
|
107
|
+
if (userKeys && userKeys.length < Object.keys(clients).length)
|
|
89
108
|
return;
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
sseClient.open(authData);
|
|
93
|
-
scheduleTokenRefresh(decodedToken.iat, decodedToken.exp);
|
|
109
|
+
// Schedule SSE connection and refresh token
|
|
110
|
+
scheduleTokenRefreshAndSse(authData);
|
|
94
111
|
}).catch(function (error) {
|
|
95
112
|
if (disconnected)
|
|
96
113
|
return;
|
|
@@ -106,11 +123,16 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
106
123
|
}
|
|
107
124
|
// close SSE connection and cancel scheduled tasks
|
|
108
125
|
function disconnectPush() {
|
|
109
|
-
|
|
126
|
+
// Halt disconnecting, just to avoid redundant logs if called multiple times
|
|
127
|
+
if (disconnected)
|
|
128
|
+
return;
|
|
110
129
|
disconnected = true;
|
|
130
|
+
sseClient.close();
|
|
111
131
|
log.info(constants_2.STREAMING_DISCONNECTING);
|
|
112
|
-
if (
|
|
113
|
-
clearTimeout(
|
|
132
|
+
if (timeoutIdTokenRefresh)
|
|
133
|
+
clearTimeout(timeoutIdTokenRefresh);
|
|
134
|
+
if (timeoutIdSseOpen)
|
|
135
|
+
clearTimeout(timeoutIdSseOpen);
|
|
114
136
|
connectPushRetryBackoff.reset();
|
|
115
137
|
stopWorkers();
|
|
116
138
|
}
|
|
@@ -118,15 +140,23 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
118
140
|
function stopWorkers() {
|
|
119
141
|
splitsUpdateWorker.backoff.reset();
|
|
120
142
|
if (userKey)
|
|
121
|
-
lang_1.forOwn(
|
|
143
|
+
lang_1.forOwn(clients, function (_a) {
|
|
144
|
+
var worker = _a.worker;
|
|
145
|
+
return worker.backoff.reset();
|
|
146
|
+
});
|
|
122
147
|
else
|
|
123
148
|
segmentsUpdateWorker.backoff.reset();
|
|
124
149
|
}
|
|
125
150
|
pushEmitter.on(constants_1.PUSH_SUBSYSTEM_DOWN, stopWorkers);
|
|
126
|
-
//
|
|
127
|
-
|
|
151
|
+
// Only required when streaming connects after a PUSH_RETRYABLE_ERROR.
|
|
152
|
+
// Otherwise it is unnecessary (e.g, STREAMING_RESUMED).
|
|
153
|
+
pushEmitter.on(constants_1.PUSH_SUBSYSTEM_UP, function () {
|
|
154
|
+
connectPushRetryBackoff.reset();
|
|
155
|
+
stopWorkers();
|
|
156
|
+
});
|
|
128
157
|
/** Fallbacking without retry due to: STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE and Authentication errors */
|
|
129
158
|
pushEmitter.on(constants_1.PUSH_NONRETRYABLE_ERROR, function handleNonRetryableError() {
|
|
159
|
+
disabled = true;
|
|
130
160
|
// Note: `stopWorkers` is been called twice, but it is not harmful
|
|
131
161
|
disconnectPush();
|
|
132
162
|
pushEmitter.emit(constants_1.PUSH_SUBSYSTEM_DOWN); // no harm if polling already
|
|
@@ -140,6 +170,16 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
140
170
|
log.info(constants_2.STREAMING_RECONNECT, [delayInMillis / 1000]);
|
|
141
171
|
pushEmitter.emit(constants_1.PUSH_SUBSYSTEM_DOWN); // no harm if polling already
|
|
142
172
|
});
|
|
173
|
+
/** STREAMING_RESET notification. Unlike a PUSH_RETRYABLE_ERROR, it doesn't emit PUSH_SUBSYSTEM_DOWN to fallback polling */
|
|
174
|
+
pushEmitter.on(constants_1.ControlType.STREAMING_RESET, function handleStreamingReset() {
|
|
175
|
+
if (disconnected)
|
|
176
|
+
return; // should never happen
|
|
177
|
+
// Minimum required clean-up.
|
|
178
|
+
// `disconnectPush` cannot be called because it sets `disconnected` and thus `connectPush` will not execute
|
|
179
|
+
if (timeoutIdTokenRefresh)
|
|
180
|
+
clearTimeout(timeoutIdTokenRefresh);
|
|
181
|
+
connectPush();
|
|
182
|
+
});
|
|
143
183
|
/** Functions related to synchronization (Queues and Workers in the spec) */
|
|
144
184
|
pushEmitter.on(constants_1.SPLIT_KILL, splitsUpdateWorker.killSplit);
|
|
145
185
|
pushEmitter.on(constants_1.SPLIT_UPDATE, splitsUpdateWorker.put);
|
|
@@ -147,10 +187,71 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
147
187
|
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
|
|
148
188
|
var userKeyHash = channel.split('_')[2];
|
|
149
189
|
var userKey = userKeyHashes[userKeyHash];
|
|
150
|
-
if (userKey &&
|
|
151
|
-
|
|
152
|
-
|
|
190
|
+
if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
|
|
191
|
+
clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
|
|
195
|
+
switch (parsedData.u) {
|
|
196
|
+
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
197
|
+
var bitmap_1;
|
|
198
|
+
try {
|
|
199
|
+
bitmap_1 = mySegmentsV2utils_1.parseBitmap(parsedData.d, parsedData.c);
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
lang_1.forOwn(clients, function (_a) {
|
|
206
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
207
|
+
if (mySegmentsV2utils_1.isInBitmap(bitmap_1, hash64.hex)) {
|
|
208
|
+
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
case types_1.UpdateStrategy.KeyList: {
|
|
214
|
+
var keyList = void 0, added_1, removed_1;
|
|
215
|
+
try {
|
|
216
|
+
keyList = mySegmentsV2utils_1.parseKeyList(parsedData.d, parsedData.c);
|
|
217
|
+
added_1 = new sets_1._Set(keyList.a);
|
|
218
|
+
removed_1 = new sets_1._Set(keyList.r);
|
|
219
|
+
}
|
|
220
|
+
catch (e) {
|
|
221
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
lang_1.forOwn(clients, function (_a) {
|
|
225
|
+
var hash64 = _a.hash64, worker = _a.worker;
|
|
226
|
+
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
227
|
+
if (add !== undefined) {
|
|
228
|
+
worker.put(parsedData.changeNumber, {
|
|
229
|
+
name: parsedData.segmentName,
|
|
230
|
+
add: add
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
case types_1.UpdateStrategy.SegmentRemoval:
|
|
237
|
+
if (!parsedData.segmentName) {
|
|
238
|
+
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
lang_1.forOwn(clients, function (_a) {
|
|
242
|
+
var worker = _a.worker;
|
|
243
|
+
return worker.put(parsedData.changeNumber, {
|
|
244
|
+
name: parsedData.segmentName,
|
|
245
|
+
add: false
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
153
249
|
}
|
|
250
|
+
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
251
|
+
lang_1.forOwn(clients, function (_a) {
|
|
252
|
+
var worker = _a.worker;
|
|
253
|
+
worker.put(parsedData.changeNumber);
|
|
254
|
+
});
|
|
154
255
|
});
|
|
155
256
|
}
|
|
156
257
|
else {
|
|
@@ -162,8 +263,8 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
162
263
|
// Expose functionality for starting and stoping push mode:
|
|
163
264
|
stop: disconnectPush,
|
|
164
265
|
start: function () {
|
|
165
|
-
// Guard condition to avoid calling `connectPush` again if the `start` method is called multiple times.
|
|
166
|
-
if (disconnected === false)
|
|
266
|
+
// Guard condition to avoid calling `connectPush` again if the `start` method is called multiple times or if push has been disabled.
|
|
267
|
+
if (disabled || disconnected === false)
|
|
167
268
|
return;
|
|
168
269
|
disconnected = false;
|
|
169
270
|
// Run in next event-loop cycle for optimization on client-side: if multiple clients are created in the same cycle than the factory, only one authentication is performed.
|
|
@@ -171,8 +272,7 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
171
272
|
},
|
|
172
273
|
// [Only for client-side]
|
|
173
274
|
add: function (userKey, mySegmentsSyncTask) {
|
|
174
|
-
|
|
175
|
-
workers[userKey] = mySegmentsUpdateWorker;
|
|
275
|
+
clients[userKey] = { hash64: murmur3_64_1.hash64(userKey), worker: new MySegmentsUpdateWorker_1.default(mySegmentsSyncTask) };
|
|
176
276
|
var hash = AuthClient_1.hashUserKey(userKey);
|
|
177
277
|
if (!userKeyHashes[hash]) {
|
|
178
278
|
userKeyHashes[hash] = userKey;
|
|
@@ -192,6 +292,7 @@ function pushManagerFactory(pollingManager, storage, readiness, fetchAuth, platf
|
|
|
192
292
|
remove: function (userKey) {
|
|
193
293
|
var hash = AuthClient_1.hashUserKey(userKey);
|
|
194
294
|
delete userKeyHashes[hash];
|
|
295
|
+
delete clients[userKey];
|
|
195
296
|
}
|
|
196
297
|
});
|
|
197
298
|
}
|
|
@@ -26,6 +26,6 @@ exports.countsSyncTaskFactory = countsSyncTaskFactory;
|
|
|
26
26
|
*/
|
|
27
27
|
function latenciesSyncTaskFactory(log, postMetricsLatencies, latenciesCache, metricsRefreshRate, latencyTracker) {
|
|
28
28
|
// don't retry metrics.
|
|
29
|
-
return submitterSyncTask_1.submitterSyncTaskFactory(log, postMetricsLatencies, latenciesCache, metricsRefreshRate, 'latency metrics', latencyTracker, fromCache('latencies'));
|
|
29
|
+
return submitterSyncTask_1.submitterSyncTaskFactory(log, postMetricsLatencies, latenciesCache, metricsRefreshRate, 'latency metrics', latencyTracker, fromCache('latencies'), 0, true);
|
|
30
30
|
}
|
|
31
31
|
exports.latenciesSyncTaskFactory = latenciesSyncTaskFactory;
|
|
@@ -7,7 +7,7 @@ var constants_1 = require("../../logger/constants");
|
|
|
7
7
|
/**
|
|
8
8
|
* Base function to create submitter sync tasks, such as ImpressionsSyncTask and EventsSyncTask
|
|
9
9
|
*/
|
|
10
|
-
function submitterSyncTaskFactory(log, postClient, sourceCache, postRate, dataName, latencyTracker, fromCacheToPayload, maxRetries) {
|
|
10
|
+
function submitterSyncTaskFactory(log, postClient, sourceCache, postRate, dataName, latencyTracker, fromCacheToPayload, maxRetries, debugLogs) {
|
|
11
11
|
if (maxRetries === void 0) { maxRetries = 0; }
|
|
12
12
|
var retries = 0;
|
|
13
13
|
function postData() {
|
|
@@ -15,7 +15,7 @@ function submitterSyncTaskFactory(log, postClient, sourceCache, postRate, dataNa
|
|
|
15
15
|
return Promise.resolve();
|
|
16
16
|
var data = sourceCache.state();
|
|
17
17
|
var dataCount = typeof data.length === 'number' ? data.length : '';
|
|
18
|
-
log
|
|
18
|
+
log[debugLogs ? 'debug' : 'info'](constants_1.SUBMITTERS_PUSH, [dataCount, dataName]);
|
|
19
19
|
var latencyTrackerStop = latencyTracker && latencyTracker.start();
|
|
20
20
|
var jsonPayload = JSON.stringify(fromCacheToPayload ? fromCacheToPayload(data) : data);
|
|
21
21
|
if (!maxRetries)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalhostFromFile = void 0;
|
|
4
|
+
var splitsParserFromFile_1 = require("./offline/splitsParser/splitsParserFromFile");
|
|
5
|
+
var syncManagerOffline_1 = require("./syncManagerOffline");
|
|
6
|
+
var constants_1 = require("../utils/constants");
|
|
7
|
+
// Factory of Localhost SyncManager based on yaml file.
|
|
8
|
+
// Requires Node 'fs' and 'path' APIs.
|
|
9
|
+
function LocalhostFromFile() {
|
|
10
|
+
var localhost = syncManagerOffline_1.syncManagerOfflineFactory(splitsParserFromFile_1.splitsParserFromFileFactory);
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
localhost.type = constants_1.LOCALHOST_MODE;
|
|
13
|
+
return localhost;
|
|
14
|
+
}
|
|
15
|
+
exports.LocalhostFromFile = LocalhostFromFile;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalhostFromObject = void 0;
|
|
4
|
+
var splitsParserFromSettings_1 = require("./offline/splitsParser/splitsParserFromSettings");
|
|
5
|
+
var syncManagerOffline_1 = require("./syncManagerOffline");
|
|
6
|
+
var constants_1 = require("../utils/constants");
|
|
7
|
+
// Factory of Localhost SyncManager based on JS object.
|
|
8
|
+
function LocalhostFromObject() {
|
|
9
|
+
var localhost = syncManagerOffline_1.syncManagerOfflineFactory(splitsParserFromSettings_1.splitsParserFromSettingsFactory);
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
localhost.type = constants_1.LOCALHOST_MODE;
|
|
12
|
+
return localhost;
|
|
13
|
+
}
|
|
14
|
+
exports.LocalhostFromObject = LocalhostFromObject;
|
|
@@ -14,20 +14,20 @@ function flush() {
|
|
|
14
14
|
*
|
|
15
15
|
* @param splitsParser e.g., `splitsParserFromFile`, `splitsParserFromSettings`.
|
|
16
16
|
*/
|
|
17
|
-
function syncManagerOfflineFactory(
|
|
17
|
+
function syncManagerOfflineFactory(splitsParserFactory) {
|
|
18
18
|
/**
|
|
19
19
|
* SyncManager factory for modular SDK
|
|
20
20
|
*/
|
|
21
21
|
return function (_a) {
|
|
22
22
|
var settings = _a.settings, readiness = _a.readiness, storage = _a.storage;
|
|
23
|
-
return object_assign_1.default(fromObjectSyncTask_1.default(
|
|
23
|
+
return object_assign_1.default(fromObjectSyncTask_1.default(splitsParserFactory(), storage, readiness, settings), {
|
|
24
24
|
// fake flush, that resolves immediately
|
|
25
25
|
flush: flush,
|
|
26
26
|
// [Only used for client-side]
|
|
27
27
|
shared: function (matchingKey, readinessManager) {
|
|
28
28
|
return {
|
|
29
29
|
start: function () {
|
|
30
|
-
// In LOCALHOST mode, shared clients are ready in the next event cycle than created
|
|
30
|
+
// In LOCALHOST mode, shared clients are ready in the next event-loop cycle than created
|
|
31
31
|
// SDK_READY cannot be emitted directly because this will not update the readiness status
|
|
32
32
|
setTimeout(function () {
|
|
33
33
|
readinessManager.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); // SDK_SPLITS_ARRIVED emitted by main SyncManager
|
|
@@ -56,6 +56,10 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
56
56
|
// fetch splits and segments. There is no need to catch this promise (it is always resolved)
|
|
57
57
|
pollingManager.syncAll();
|
|
58
58
|
}
|
|
59
|
+
if (pushManager) {
|
|
60
|
+
pushManager.on(constants_1.PUSH_SUBSYSTEM_UP, stopPollingAndSyncAll);
|
|
61
|
+
pushManager.on(constants_1.PUSH_SUBSYSTEM_DOWN, startPolling);
|
|
62
|
+
}
|
|
59
63
|
var running = false; // flag that indicates whether the syncManager has been started (true) or stopped (false)
|
|
60
64
|
var startFirstTime = true; // flag to distinguish calling the `start` method for the first time, to support pausing and resuming the synchronization
|
|
61
65
|
return {
|
|
@@ -66,11 +70,9 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
66
70
|
start: function () {
|
|
67
71
|
// start syncing splits and segments
|
|
68
72
|
if (pushManager) {
|
|
69
|
-
//
|
|
73
|
+
// Doesn't call `syncAll` when the syncManager is resuming
|
|
70
74
|
if (startFirstTime) {
|
|
71
75
|
pollingManager.syncAll();
|
|
72
|
-
pushManager.on(constants_1.PUSH_SUBSYSTEM_UP, stopPollingAndSyncAll);
|
|
73
|
-
pushManager.on(constants_1.PUSH_SUBSYSTEM_DOWN, startPolling);
|
|
74
76
|
startFirstTime = false;
|
|
75
77
|
}
|
|
76
78
|
pushManager.start();
|
|
@@ -8,8 +8,6 @@ var ImpressionObserver = /** @class */ (function () {
|
|
|
8
8
|
this.hasher = hasher;
|
|
9
9
|
}
|
|
10
10
|
ImpressionObserver.prototype.testAndSet = function (impression) {
|
|
11
|
-
if (!impression)
|
|
12
|
-
return;
|
|
13
11
|
var hash = this.hasher(impression);
|
|
14
12
|
var previous = this.cache.get(hash);
|
|
15
13
|
this.cache.set(hash, impression.time);
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
function _unknownIfNull(s) {
|
|
5
|
-
return s ? s : UNKNOWN;
|
|
6
|
-
}
|
|
7
|
-
function _zeroIfNull(l) {
|
|
8
|
-
return l ? l : 0;
|
|
9
|
-
}
|
|
3
|
+
exports.buildKey = void 0;
|
|
10
4
|
function buildKey(impression) {
|
|
11
|
-
return
|
|
5
|
+
return impression.keyName + ":" + impression.feature + ":" + impression.treatment + ":" + impression.label + ":" + impression.changeNumber;
|
|
12
6
|
}
|
|
13
|
-
exports.
|
|
7
|
+
exports.buildKey = buildKey;
|
|
@@ -4,9 +4,9 @@ exports.impressionObserverCSFactory = exports.hashImpression32 = void 0;
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var ImpressionObserver_1 = tslib_1.__importDefault(require("./ImpressionObserver"));
|
|
6
6
|
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
7
|
-
var buildKey_1 =
|
|
7
|
+
var buildKey_1 = require("./buildKey");
|
|
8
8
|
function hashImpression32(impression) {
|
|
9
|
-
return
|
|
9
|
+
return murmur3_1.hash(buildKey_1.buildKey(impression));
|
|
10
10
|
}
|
|
11
11
|
exports.hashImpression32 = hashImpression32;
|
|
12
12
|
var LAST_SEEN_CACHE_SIZE = 500; // cache up to 500 impression hashes
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.impressionObserverSSFactory = exports.hashImpression128 = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var ImpressionObserver_1 = tslib_1.__importDefault(require("./ImpressionObserver"));
|
|
6
|
-
var
|
|
7
|
-
var buildKey_1 =
|
|
6
|
+
var murmur3_128_x86_1 = require("../../utils/murmur3/murmur3_128_x86");
|
|
7
|
+
var buildKey_1 = require("./buildKey");
|
|
8
8
|
function hashImpression128(impression) {
|
|
9
|
-
return
|
|
9
|
+
return murmur3_128_x86_1.hash128(buildKey_1.buildKey(impression));
|
|
10
10
|
}
|
|
11
11
|
exports.hashImpression128 = hashImpression128;
|
|
12
12
|
var LAST_SEEN_CACHE_SIZE = 500000; // cache up to 500k impression hashes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.STORAGE_MEMORY = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
3
|
+
exports.STORAGE_CUSTOM = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
4
|
// Special treatments
|
|
5
5
|
exports.CONTROL = 'control';
|
|
6
6
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -23,3 +23,6 @@ exports.PRODUCER_MODE = 'producer';
|
|
|
23
23
|
exports.CONSUMER_MODE = 'consumer';
|
|
24
24
|
// Storage types
|
|
25
25
|
exports.STORAGE_MEMORY = 'MEMORY';
|
|
26
|
+
exports.STORAGE_LOCALSTORAGE = 'LOCALSTORAGE';
|
|
27
|
+
exports.STORAGE_REDIS = 'REDIS';
|
|
28
|
+
exports.STORAGE_CUSTOM = 'CUSTOM';
|