@splitsoftware/splitio-commons 1.2.0 → 1.2.1-rc.3
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/Engine.js +6 -6
- package/cjs/evaluator/combiners/and.js +1 -1
- package/cjs/evaluator/combiners/ifelseif.js +2 -2
- package/cjs/evaluator/condition/engineUtils.js +2 -2
- package/cjs/evaluator/condition/index.js +4 -4
- package/cjs/evaluator/index.js +5 -5
- package/cjs/evaluator/matchers/cont_all.js +1 -1
- package/cjs/evaluator/matchers/cont_any.js +1 -1
- package/cjs/evaluator/matchers/cont_str.js +1 -1
- package/cjs/evaluator/matchers/dependency.js +1 -1
- package/cjs/evaluator/matchers/eq_set.js +1 -1
- package/cjs/evaluator/matchers/ew.js +3 -3
- package/cjs/evaluator/matchers/part_of.js +1 -1
- package/cjs/evaluator/matchers/segment.js +1 -1
- package/cjs/evaluator/matchers/sw.js +1 -1
- package/cjs/evaluator/matchers/whitelist.js +1 -1
- package/cjs/evaluator/matchersTransform/index.js +12 -12
- package/cjs/evaluator/parser/index.js +6 -6
- package/cjs/evaluator/treatments/index.js +1 -1
- package/cjs/evaluator/value/index.js +1 -1
- package/cjs/evaluator/value/sanitize.js +4 -4
- package/cjs/integrations/browser.js +3 -3
- package/cjs/integrations/ga/GaToSplit.js +14 -14
- package/cjs/integrations/ga/GoogleAnalyticsToSplit.js +5 -3
- package/cjs/integrations/ga/SplitToGa.js +1 -1
- package/cjs/integrations/ga/SplitToGoogleAnalytics.js +4 -2
- package/cjs/listeners/browser.js +1 -1
- package/cjs/listeners/node.js +1 -1
- package/cjs/logger/constants.js +3 -1
- package/cjs/logger/index.js +2 -2
- package/cjs/logger/messages/debug.js +1 -1
- package/cjs/logger/messages/error.js +2 -2
- package/cjs/logger/messages/info.js +5 -5
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/logger/sdkLogger.js +1 -1
- package/cjs/readiness/readinessManager.js +2 -2
- package/cjs/readiness/sdkReadinessManager.js +4 -4
- package/cjs/sdkClient/client.js +11 -10
- package/cjs/sdkClient/clientAttributesDecoration.js +4 -4
- package/cjs/sdkClient/clientCS.js +4 -3
- package/cjs/sdkClient/clientInputValidation.js +14 -14
- package/cjs/sdkClient/sdkClient.js +3 -3
- package/cjs/sdkClient/sdkClientMethod.js +1 -1
- package/cjs/sdkClient/sdkClientMethodCS.js +6 -6
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +8 -8
- package/cjs/sdkFactory/index.js +8 -8
- package/cjs/sdkManager/index.js +11 -11
- package/cjs/services/splitApi.js +3 -2
- package/cjs/services/splitHttpClient.js +3 -3
- package/cjs/storages/KeyBuilder.js +2 -2
- package/cjs/storages/KeyBuilderCS.js +2 -2
- package/cjs/storages/KeyBuilderSS.js +1 -1
- package/cjs/storages/findLatencyIndex.js +1 -1
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -1
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +12 -12
- package/cjs/storages/inLocalStorage/index.js +3 -3
- package/cjs/storages/inMemory/AttributesCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/LatenciesCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +2 -2
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/LatenciesCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/RedisAdapter.js +16 -10
- package/cjs/storages/inRedis/SegmentsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/SplitsCacheInRedis.js +3 -3
- package/cjs/storages/inRedis/index.js +1 -1
- package/cjs/storages/pluggable/SegmentsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/SplitsCachePluggable.js +3 -3
- package/cjs/storages/pluggable/inMemoryWrapper.js +4 -4
- package/cjs/storages/pluggable/index.js +4 -4
- package/cjs/sync/offline/LocalhostFromFile.js +1 -1
- package/cjs/sync/offline/LocalhostFromObject.js +1 -1
- package/cjs/sync/offline/splitsParser/parseCondition.js +1 -1
- package/cjs/sync/offline/splitsParser/splitsParserFromFile.js +13 -13
- package/cjs/sync/offline/splitsParser/splitsParserFromSettings.js +3 -3
- package/cjs/sync/offline/syncManagerOffline.js +1 -1
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +2 -2
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +8 -7
- package/cjs/sync/polling/pollingManagerSS.js +5 -4
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
- package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +1 -1
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +1 -1
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -2
- package/cjs/sync/streaming/AuthClient/index.js +4 -5
- package/cjs/sync/streaming/SSEHandler/NotificationParser.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +3 -3
- package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
- package/cjs/sync/streaming/mySegmentsV2utils.js +1 -1
- package/cjs/sync/streaming/pushManager.js +46 -35
- package/cjs/sync/submitters/eventsSyncTask.js +1 -1
- package/cjs/sync/submitters/impressionCountsSyncTask.js +1 -1
- package/cjs/sync/submitters/impressionsSyncTask.js +3 -3
- package/cjs/sync/submitters/metricsSyncTask.js +3 -3
- package/cjs/sync/submitters/submitterManager.js +6 -5
- package/cjs/sync/submitters/submitterSyncTask.js +1 -1
- package/cjs/sync/syncManagerOnline.js +12 -12
- package/cjs/trackers/eventTracker.js +3 -3
- package/cjs/trackers/impressionObserver/impressionObserverCS.js +1 -1
- package/cjs/trackers/impressionObserver/impressionObserverSS.js +1 -1
- package/cjs/trackers/impressionsTracker.js +3 -3
- package/cjs/utils/MinEvents.js +2 -1
- package/cjs/utils/inputValidation/apiKey.js +1 -1
- package/cjs/utils/inputValidation/attribute.js +4 -4
- package/cjs/utils/inputValidation/attributes.js +2 -2
- package/cjs/utils/inputValidation/event.js +1 -1
- package/cjs/utils/inputValidation/eventProperties.js +7 -5
- package/cjs/utils/inputValidation/eventValue.js +1 -1
- package/cjs/utils/inputValidation/key.js +6 -5
- package/cjs/utils/inputValidation/preloadedData.js +8 -8
- package/cjs/utils/inputValidation/split.js +1 -1
- package/cjs/utils/inputValidation/splits.js +2 -2
- package/cjs/utils/inputValidation/trafficType.js +1 -1
- package/cjs/utils/inputValidation/trafficTypeExistance.js +1 -1
- package/cjs/utils/jwt/index.js +1 -1
- package/cjs/utils/key/index.js +3 -3
- package/cjs/utils/lang/index.js +2 -14
- package/cjs/utils/murmur3/common.js +1 -1
- package/cjs/utils/murmur3/legacy.js +44 -0
- package/cjs/utils/murmur3/murmur3.js +10 -10
- package/cjs/utils/murmur3/murmur3_128.js +1 -1
- package/cjs/utils/murmur3/murmur3_128_x86.js +37 -37
- package/cjs/utils/murmur3/murmur3_64.js +1 -1
- package/cjs/utils/promise/timeout.js +1 -1
- package/cjs/utils/settingsValidation/index.js +5 -10
- package/cjs/utils/settingsValidation/integrations/configurable.js +1 -1
- package/cjs/utils/settingsValidation/integrations/pluggable.js +1 -1
- package/cjs/utils/settingsValidation/localhost/builtin.js +2 -2
- package/cjs/utils/settingsValidation/logger/builtinLogger.js +3 -3
- package/cjs/utils/settingsValidation/logger/commons.js +1 -1
- package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
- package/cjs/utils/settingsValidation/runtime/browser.js +10 -0
- package/cjs/utils/settingsValidation/runtime/node.js +22 -0
- package/cjs/utils/settingsValidation/splitFilters.js +1 -1
- package/cjs/utils/settingsValidation/storage/storageCS.js +1 -1
- package/cjs/utils/timeTracker/index.js +3 -3
- package/esm/evaluator/matchers/ew.js +4 -4
- package/esm/integrations/ga/GoogleAnalyticsToSplit.js +4 -2
- package/esm/integrations/ga/SplitToGoogleAnalytics.js +4 -2
- package/esm/logger/messages/error.js +1 -1
- package/esm/logger/messages/info.js +4 -4
- package/esm/sdkClient/client.js +2 -1
- package/esm/sdkClient/clientCS.js +2 -1
- package/esm/services/splitApi.js +2 -1
- package/esm/services/splitHttpClient.js +1 -1
- package/esm/storages/inRedis/RedisAdapter.js +7 -1
- package/esm/sync/offline/splitsParser/splitsParserFromFile.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +2 -2
- package/esm/sync/polling/pollingManagerCS.js +2 -1
- package/esm/sync/polling/pollingManagerSS.js +2 -1
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/esm/sync/streaming/AuthClient/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
- package/esm/sync/streaming/pushManager.js +34 -23
- package/esm/sync/submitters/submitterManager.js +2 -1
- package/esm/sync/syncManagerOnline.js +12 -12
- package/esm/utils/inputValidation/eventProperties.js +4 -2
- package/esm/utils/inputValidation/key.js +2 -1
- package/esm/utils/lang/index.js +2 -13
- package/esm/utils/murmur3/legacy.js +39 -0
- package/esm/utils/promise/timeout.js +1 -1
- package/esm/utils/settingsValidation/index.js +1 -6
- package/esm/utils/settingsValidation/runtime/browser.js +6 -0
- package/esm/utils/settingsValidation/runtime/node.js +17 -0
- package/package.json +8 -7
- package/src/evaluator/matchers/ew.ts +4 -4
- package/src/integrations/ga/GoogleAnalyticsToSplit.ts +7 -4
- package/src/integrations/ga/SplitToGoogleAnalytics.ts +7 -4
- package/src/integrations/types.ts +5 -0
- package/src/logger/.DS_Store +0 -0
- package/src/logger/messages/error.ts +1 -1
- package/src/logger/messages/info.ts +4 -4
- package/src/logger/types.ts +4 -0
- package/src/sdkClient/client.ts +2 -1
- package/src/sdkClient/clientCS.ts +3 -1
- package/src/services/splitHttpClient.ts +1 -1
- package/src/storages/types.ts +1 -1
- package/src/sync/offline/splitsParser/splitsParserFromFile.ts +1 -1
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
- package/src/sync/polling/fetchers/types.ts +1 -0
- package/src/sync/polling/pollingManagerCS.ts +3 -6
- package/src/sync/polling/pollingManagerSS.ts +3 -8
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +2 -1
- package/src/sync/polling/types.ts +0 -12
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -1
- package/src/sync/streaming/AuthClient/index.ts +1 -2
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/pushManager.ts +39 -37
- package/src/sync/streaming/types.ts +5 -25
- package/src/sync/submitters/submitterManager.ts +4 -8
- package/src/sync/syncManagerOnline.ts +16 -22
- package/src/types.ts +5 -1
- package/src/utils/inputValidation/eventProperties.ts +4 -2
- package/src/utils/lang/index.ts +0 -14
- package/src/utils/murmur3/legacy.ts +48 -0
- package/src/utils/promise/timeout.ts +1 -1
- package/src/utils/settingsValidation/index.ts +1 -6
- package/src/utils/settingsValidation/runtime/browser.ts +8 -0
- package/src/utils/settingsValidation/runtime/node.ts +22 -0
- package/src/utils/settingsValidation/types.ts +6 -6
- package/types/integrations/ga/GaToSplitPlugin.d.ts +3 -0
- package/types/integrations/ga/GoogleAnalyticsToSplit.d.ts +2 -2
- package/types/integrations/ga/SplitToGaPlugin.d.ts +4 -0
- package/types/integrations/ga/SplitToGoogleAnalytics.d.ts +2 -3
- package/types/integrations/types.d.ts +4 -0
- package/types/logger/browser/{DebugLogger.d.ts → debugLogger.d.ts} +0 -0
- package/types/logger/browser/{ErrorLogger.d.ts → errorLogger.d.ts} +0 -0
- package/types/logger/browser/{InfoLogger.d.ts → infoLogger.d.ts} +0 -0
- package/types/logger/browser/{WarnLogger.d.ts → warnLogger.d.ts} +0 -0
- package/types/logger/codes.d.ts +2 -0
- package/types/logger/codesConstants.d.ts +117 -0
- package/types/logger/codesConstantsBrowser.d.ts +2 -0
- package/types/logger/codesConstantsNode.d.ts +14 -0
- package/types/logger/codesDebug.d.ts +1 -0
- package/types/logger/codesDebugBrowser.d.ts +1 -0
- package/types/logger/codesDebugNode.d.ts +1 -0
- package/types/logger/codesError.d.ts +1 -0
- package/types/logger/codesErrorNode.d.ts +1 -0
- package/types/logger/codesInfo.d.ts +1 -0
- package/types/logger/codesWarn.d.ts +1 -0
- package/types/logger/codesWarnNode.d.ts +1 -0
- package/types/logger/debugLogger.d.ts +2 -0
- package/types/logger/errorLogger.d.ts +2 -0
- package/types/logger/infoLogger.d.ts +2 -0
- package/types/logger/messages/debugBrowser.d.ts +1 -0
- package/types/logger/messages/debugNode.d.ts +1 -0
- package/types/logger/messages/errorNode.d.ts +1 -0
- package/types/logger/messages/warnNode.d.ts +1 -0
- package/types/logger/noopLogger.d.ts +2 -0
- package/types/logger/types.d.ts +4 -0
- package/types/logger/warnLogger.d.ts +2 -0
- package/types/sdkClient/clientAttributesDecoration.d.ts +1 -1
- package/types/sdkManager/sdkManagerMethod.d.ts +6 -0
- package/types/storages/getRegisteredSegments.d.ts +10 -0
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +51 -0
- package/types/storages/inMemory/index.d.ts +10 -0
- package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +0 -0
- package/types/storages/parseSegments.d.ts +6 -0
- package/types/storages/pluggable/TelemetryCachePluggable.d.ts +2 -0
- package/types/storages/types.d.ts +1 -1
- package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +1 -1
- package/types/sync/polling/fetchers/types.d.ts +1 -1
- package/types/sync/polling/pollingManagerCS.d.ts +2 -5
- package/types/sync/polling/pollingManagerSS.d.ts +2 -5
- package/types/sync/polling/syncTasks/splitsSyncTask.copy.d.ts +35 -0
- package/types/sync/polling/syncTasks/splitsSyncTask.morelikeoriginal.d.ts +35 -0
- package/types/sync/polling/types.d.ts +0 -11
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -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/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -1
- package/types/sync/streaming/pushManager.d.ts +3 -7
- package/types/sync/streaming/pushManagerCS.d.ts +1 -0
- package/types/sync/streaming/pushManagerNoUsers.d.ts +13 -0
- package/types/sync/streaming/pushManagerSS.d.ts +1 -0
- package/types/sync/streaming/types.d.ts +3 -23
- package/types/sync/submitters/submitterManager.d.ts +2 -4
- package/types/sync/submitters/telemetrySyncTask.d.ts +17 -0
- package/types/sync/syncManagerFromFile.d.ts +2 -0
- package/types/sync/syncManagerFromObject.d.ts +2 -0
- package/types/sync/syncManagerOffline.d.ts +9 -0
- package/types/sync/syncManagerOnline.d.ts +3 -3
- package/types/trackers/telemetryRecorder.d.ts +0 -0
- package/types/types.d.ts +1 -0
- package/types/utils/EventEmitter.d.ts +4 -0
- package/types/utils/lang/errors.d.ts +10 -0
- package/types/utils/lang/index.d.ts +0 -4
- package/types/utils/murmur3/commons.d.ts +12 -0
- package/types/utils/murmur3/legacy.d.ts +2 -0
- package/types/utils/settingsValidation/buildMetadata.d.ts +3 -0
- package/types/utils/settingsValidation/localhost/index.d.ts +9 -0
- package/types/utils/settingsValidation/logger.d.ts +11 -0
- package/types/utils/settingsValidation/runtime/browser.d.ts +2 -0
- package/types/utils/settingsValidation/runtime/node.d.ts +2 -0
- package/types/utils/settingsValidation/types.d.ts +6 -6
|
@@ -21,12 +21,13 @@ export function mySegmentsSyncTaskFactory(
|
|
|
21
21
|
settings.log,
|
|
22
22
|
mySegmentsUpdaterFactory(
|
|
23
23
|
settings.log,
|
|
24
|
-
mySegmentsFetcherFactory(fetchMySegments
|
|
24
|
+
mySegmentsFetcherFactory(fetchMySegments),
|
|
25
25
|
storage.splits,
|
|
26
26
|
storage.segments,
|
|
27
27
|
readiness.segments,
|
|
28
28
|
settings.startup.requestTimeoutBeforeReady,
|
|
29
29
|
settings.startup.retriesOnFailureBeforeReady,
|
|
30
|
+
matchingKey
|
|
30
31
|
),
|
|
31
32
|
settings.scheduler.segmentsRefreshRate,
|
|
32
33
|
'mySegmentsUpdater',
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { IReadinessManager } from '../../readiness/types';
|
|
2
|
-
import { ISplitApi } from '../../services/types';
|
|
3
2
|
import { IStorageSync } from '../../storages/types';
|
|
4
|
-
import { ISettings } from '../../types';
|
|
5
3
|
import { SegmentsData } from '../streaming/SSEHandler/types';
|
|
6
4
|
import { ITask, ISyncTask } from '../types';
|
|
7
5
|
|
|
@@ -23,13 +21,3 @@ export interface IPollingManagerCS extends IPollingManager {
|
|
|
23
21
|
remove(matchingKey: string): void;
|
|
24
22
|
get(matchingKey: string): ISegmentsSyncTask | undefined
|
|
25
23
|
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Signature of polling manager factory/constructor
|
|
29
|
-
*/
|
|
30
|
-
export type IPollingManagerFactoryParams = [
|
|
31
|
-
splitApi: ISplitApi,
|
|
32
|
-
storage: IStorageSync,
|
|
33
|
-
readiness: IReadinessManager,
|
|
34
|
-
settings: ISettings,
|
|
35
|
-
]
|
|
@@ -23,6 +23,7 @@ export function mySegmentsUpdaterFactory(
|
|
|
23
23
|
segmentsEventEmitter: ISegmentsEventEmitter,
|
|
24
24
|
requestTimeoutBeforeReady: number,
|
|
25
25
|
retriesOnFailureBeforeReady: number,
|
|
26
|
+
matchingKey: string
|
|
26
27
|
): IMySegmentsUpdater {
|
|
27
28
|
|
|
28
29
|
let readyOnAlreadyExistentState = true;
|
|
@@ -69,7 +70,7 @@ export function mySegmentsUpdaterFactory(
|
|
|
69
70
|
// If segmentsData is provided, there is no need to fetch mySegments
|
|
70
71
|
new Promise((res) => { updateSegments(segmentsData); res(true); }) :
|
|
71
72
|
// If not provided, fetch mySegments
|
|
72
|
-
mySegmentsFetcher(noCache, _promiseDecorator).then(segments => {
|
|
73
|
+
mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(segments => {
|
|
73
74
|
// Only when we have downloaded segments completely, we should not keep retrying anymore
|
|
74
75
|
startingUp = false;
|
|
75
76
|
|
|
@@ -17,8 +17,7 @@ export function authenticateFactory(fetchAuth: IFetchAuth): IAuthenticate {
|
|
|
17
17
|
* @param {string[] | undefined} userKeys set of user Keys to track MY_SEGMENTS_CHANGES. It is undefined for server-side API.
|
|
18
18
|
*/
|
|
19
19
|
return function authenticate(userKeys?: string[]): Promise<IAuthToken> {
|
|
20
|
-
|
|
21
|
-
return authPromise
|
|
20
|
+
return fetchAuth(userKeys)
|
|
22
21
|
.then(resp => resp.json())
|
|
23
22
|
.then(json => {
|
|
24
23
|
if (json.token) { // empty token when `"pushEnabled": false`
|
|
@@ -19,7 +19,7 @@ export class SegmentsUpdateWorker implements IUpdateWorker {
|
|
|
19
19
|
* @param {Object} segmentsCache segments data cache
|
|
20
20
|
* @param {Object} segmentsSyncTask task for syncing segments data
|
|
21
21
|
*/
|
|
22
|
-
constructor(
|
|
22
|
+
constructor(segmentsSyncTask: ISegmentsSyncTask, segmentsCache: ISegmentsCacheSync) {
|
|
23
23
|
this.segmentsCache = segmentsCache;
|
|
24
24
|
this.segmentsSyncTask = segmentsSyncTask;
|
|
25
25
|
this.maxChangeNumbers = {};
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { IPushEventEmitter,
|
|
1
|
+
import { IPushEventEmitter, IPushManager } from './types';
|
|
2
2
|
import { ISSEClient } from './SSEClient/types';
|
|
3
|
-
import { IStorageSync } from '../../storages/types';
|
|
4
|
-
import { IReadinessManager } from '../../readiness/types';
|
|
5
3
|
import { ISegmentsSyncTask, IPollingManager } from '../polling/types';
|
|
6
4
|
import { objectAssign } from '../../utils/lang/objectAssign';
|
|
7
5
|
import { Backoff } from '../../utils/Backoff';
|
|
@@ -12,17 +10,15 @@ import { SplitsUpdateWorker } from './UpdateWorkers/SplitsUpdateWorker';
|
|
|
12
10
|
import { authenticateFactory, hashUserKey } from './AuthClient';
|
|
13
11
|
import { forOwn } from '../../utils/lang';
|
|
14
12
|
import { SSEClient } from './SSEClient';
|
|
15
|
-
import { IFetchAuth } from '../../services/types';
|
|
16
|
-
import { ISettings } from '../../types';
|
|
17
13
|
import { getMatching } from '../../utils/key';
|
|
18
14
|
import { MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, PUSH_NONRETRYABLE_ERROR, PUSH_SUBSYSTEM_DOWN, SECONDS_BEFORE_EXPIRATION, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, PUSH_RETRYABLE_ERROR, PUSH_SUBSYSTEM_UP, ControlType } from './constants';
|
|
19
|
-
import { IPlatform } from '../../sdkFactory/types';
|
|
20
15
|
import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 } from '../../logger/constants';
|
|
21
16
|
import { KeyList, UpdateStrategy } from './SSEHandler/types';
|
|
22
17
|
import { isInBitmap, parseBitmap, parseKeyList } from './mySegmentsV2utils';
|
|
23
18
|
import { ISet, _Set } from '../../utils/lang/sets';
|
|
24
19
|
import { Hash64, hash64 } from '../../utils/murmur3/murmur3_64';
|
|
25
20
|
import { IAuthTokenPushEnabled } from './AuthClient/types';
|
|
21
|
+
import { ISyncManagerFactoryParams } from '../types';
|
|
26
22
|
|
|
27
23
|
/**
|
|
28
24
|
* PushManager factory:
|
|
@@ -30,17 +26,15 @@ import { IAuthTokenPushEnabled } from './AuthClient/types';
|
|
|
30
26
|
* - for client-side, with support for multiple clients, if key is provided in settings
|
|
31
27
|
*/
|
|
32
28
|
export function pushManagerFactory(
|
|
29
|
+
params: ISyncManagerFactoryParams,
|
|
33
30
|
pollingManager: IPollingManager,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
platform: IPlatform,
|
|
38
|
-
settings: ISettings,
|
|
39
|
-
): IPushManagerCS | undefined {
|
|
31
|
+
): IPushManager | undefined {
|
|
32
|
+
|
|
33
|
+
const { settings, storage, splitApi, readiness, platform } = params;
|
|
40
34
|
|
|
41
35
|
// `userKey` is the matching key of main client in client-side SDK.
|
|
42
36
|
// It can be used to check if running on client-side or server-side SDK.
|
|
43
|
-
const userKey = settings.core.key ? getMatching(settings.core.key) : undefined;
|
|
37
|
+
const userKey = settings.core.key ? getMatching(settings.core.key) : undefined;
|
|
44
38
|
const log = settings.log;
|
|
45
39
|
|
|
46
40
|
let sseClient: ISSEClient;
|
|
@@ -51,7 +45,7 @@ export function pushManagerFactory(
|
|
|
51
45
|
log.warn(STREAMING_FALLBACK, [e]);
|
|
52
46
|
return;
|
|
53
47
|
}
|
|
54
|
-
const authenticate = authenticateFactory(fetchAuth);
|
|
48
|
+
const authenticate = authenticateFactory(splitApi.fetchAuth);
|
|
55
49
|
|
|
56
50
|
// init feedback loop
|
|
57
51
|
const pushEmitter = new platform.EventEmitter() as IPushEventEmitter;
|
|
@@ -59,7 +53,8 @@ export function pushManagerFactory(
|
|
|
59
53
|
sseClient.setEventHandler(sseHandler);
|
|
60
54
|
|
|
61
55
|
// init workers
|
|
62
|
-
|
|
56
|
+
// MySegmentsUpdateWorker (client-side) are initiated in `add` method
|
|
57
|
+
const segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(pollingManager.segmentsSyncTask, storage.segments);
|
|
63
58
|
// For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
|
|
64
59
|
const splitsUpdateWorker = new SplitsUpdateWorker(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
|
|
65
60
|
|
|
@@ -68,11 +63,6 @@ export function pushManagerFactory(
|
|
|
68
63
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
69
64
|
// Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
|
|
70
65
|
const clients: Record<string, { hash64: Hash64, worker: MySegmentsUpdateWorker }> = {};
|
|
71
|
-
if (userKey) {
|
|
72
|
-
const hash = hashUserKey(userKey);
|
|
73
|
-
userKeyHashes[hash] = userKey;
|
|
74
|
-
clients[userKey] = { hash64: hash64(userKey), worker: segmentsUpdateWorker as MySegmentsUpdateWorker };
|
|
75
|
-
}
|
|
76
66
|
|
|
77
67
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
78
68
|
let connectForNewClient = false;
|
|
@@ -81,6 +71,7 @@ export function pushManagerFactory(
|
|
|
81
71
|
// It is used to halt the `connectPush` process if it was in progress.
|
|
82
72
|
let disconnected: boolean | undefined;
|
|
83
73
|
// flag that indicates a PUSH_NONRETRYABLE_ERROR, condition with which starting pushManager again is ignored.
|
|
74
|
+
// true if STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE or Auth errors.
|
|
84
75
|
let disabled: boolean | undefined; // `disabled` implies `disconnected === true`
|
|
85
76
|
|
|
86
77
|
/** PushManager functions related to initialization */
|
|
@@ -176,7 +167,7 @@ export function pushManagerFactory(
|
|
|
176
167
|
function stopWorkers() {
|
|
177
168
|
splitsUpdateWorker.backoff.reset();
|
|
178
169
|
if (userKey) forOwn(clients, ({ worker }) => worker.backoff.reset());
|
|
179
|
-
else segmentsUpdateWorker.backoff.reset();
|
|
170
|
+
else (segmentsUpdateWorker as SegmentsUpdateWorker).backoff.reset();
|
|
180
171
|
}
|
|
181
172
|
|
|
182
173
|
pushEmitter.on(PUSH_SUBSYSTEM_DOWN, stopWorkers);
|
|
@@ -306,37 +297,48 @@ export function pushManagerFactory(
|
|
|
306
297
|
// Expose Event Emitter functionality and Event constants
|
|
307
298
|
Object.create(pushEmitter),
|
|
308
299
|
{
|
|
309
|
-
//
|
|
310
|
-
|
|
300
|
+
// Stop/pause push mode.
|
|
301
|
+
// It doesn't emit events. Neither PUSH_SUBSYSTEM_DOWN to start polling.
|
|
302
|
+
stop() {
|
|
303
|
+
disconnectPush(); // `handleNonRetryableError` cannot be used as `stop`, because it emits PUSH_SUBSYSTEM_DOWN event, which starts polling.
|
|
304
|
+
if (userKey) this.remove(userKey); // Necessary to properly resume streaming in client-side (e.g., RN SDK transition to foreground).
|
|
305
|
+
},
|
|
311
306
|
|
|
307
|
+
// Start/resume push mode.
|
|
308
|
+
// It eventually emits PUSH_SUBSYSTEM_DOWN, that starts polling, or PUSH_SUBSYSTEM_UP, that executes a syncAll
|
|
312
309
|
start() {
|
|
313
310
|
// Guard condition to avoid calling `connectPush` again if the `start` method is called multiple times or if push has been disabled.
|
|
314
311
|
if (disabled || disconnected === false) return;
|
|
315
312
|
disconnected = false;
|
|
316
|
-
|
|
317
|
-
|
|
313
|
+
|
|
314
|
+
if (userKey) this.add(userKey, pollingManager.segmentsSyncTask); // client-side
|
|
315
|
+
else setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
|
|
316
|
+
},
|
|
317
|
+
|
|
318
|
+
// true/false if start or stop was called last respectively
|
|
319
|
+
isRunning(){
|
|
320
|
+
return disconnected === false;
|
|
318
321
|
},
|
|
319
322
|
|
|
320
323
|
// [Only for client-side]
|
|
321
324
|
add(userKey: string, mySegmentsSyncTask: ISegmentsSyncTask) {
|
|
322
|
-
clients[userKey] = { hash64: hash64(userKey), worker: new MySegmentsUpdateWorker(mySegmentsSyncTask) };
|
|
323
|
-
|
|
324
325
|
const hash = hashUserKey(userKey);
|
|
325
326
|
|
|
326
327
|
if (!userKeyHashes[hash]) {
|
|
327
328
|
userKeyHashes[hash] = userKey;
|
|
329
|
+
clients[userKey] = { hash64: hash64(userKey), worker: new MySegmentsUpdateWorker(mySegmentsSyncTask) };
|
|
328
330
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
329
|
-
}
|
|
330
331
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
332
|
+
// Reconnects in case of a new client.
|
|
333
|
+
// Run in next event-loop cycle to save authentication calls
|
|
334
|
+
// in case multiple clients are created in the current cycle.
|
|
335
|
+
setTimeout(function checkForReconnect() {
|
|
336
|
+
if (connectForNewClient) {
|
|
337
|
+
connectForNewClient = false;
|
|
338
|
+
connectPush();
|
|
339
|
+
}
|
|
340
|
+
}, 0);
|
|
341
|
+
}
|
|
340
342
|
},
|
|
341
343
|
// [Only for client-side]
|
|
342
344
|
remove(userKey: string) {
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { IMySegmentsUpdateData, IMySegmentsUpdateV2Data, ISegmentUpdateData, ISplitUpdateData, ISplitKillData } from './SSEHandler/types';
|
|
2
2
|
import { ITask } from '../types';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { IFetchAuth } from '../../services/types';
|
|
6
|
-
import { IStorageSync } from '../../storages/types';
|
|
7
|
-
import { IEventEmitter, ISettings } from '../../types';
|
|
8
|
-
import { IPlatform } from '../../sdkFactory/types';
|
|
3
|
+
import { ISegmentsSyncTask } from '../polling/types';
|
|
4
|
+
import { IEventEmitter } from '../../types';
|
|
9
5
|
import { ControlType } from './constants';
|
|
10
6
|
|
|
11
7
|
// Internal SDK events, subscribed by SyncManager and PushManager
|
|
@@ -45,26 +41,10 @@ export interface IPushEventEmitter extends IEventEmitter {
|
|
|
45
41
|
}
|
|
46
42
|
|
|
47
43
|
/**
|
|
48
|
-
* PushManager
|
|
44
|
+
* PushManager
|
|
49
45
|
*/
|
|
50
|
-
export interface IPushManager extends ITask, IPushEventEmitter {
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* PushManager for client-side with support for multiple clients
|
|
54
|
-
*/
|
|
55
|
-
export interface IPushManagerCS extends IPushManager {
|
|
46
|
+
export interface IPushManager extends ITask, IPushEventEmitter {
|
|
47
|
+
// Methods used in client-side, to support multiple clients
|
|
56
48
|
add(userKey: string, mySegmentsSyncTask: ISegmentsSyncTask): void,
|
|
57
49
|
remove(userKey: string): void
|
|
58
50
|
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Signature of push manager factory/constructor
|
|
62
|
-
*/
|
|
63
|
-
export type IPushManagerFactoryParams = [
|
|
64
|
-
pollingManager: IPollingManager,
|
|
65
|
-
storage: IStorageSync,
|
|
66
|
-
readiness: IReadinessManager,
|
|
67
|
-
fetchAuth: IFetchAuth,
|
|
68
|
-
platform: IPlatform,
|
|
69
|
-
settings: ISettings
|
|
70
|
-
]
|
|
@@ -2,15 +2,11 @@ import { syncTaskComposite } from '../syncTaskComposite';
|
|
|
2
2
|
import { eventsSyncTaskFactory } from './eventsSyncTask';
|
|
3
3
|
import { impressionsSyncTaskFactory } from './impressionsSyncTask';
|
|
4
4
|
import { impressionCountsSyncTaskFactory } from './impressionCountsSyncTask';
|
|
5
|
-
import {
|
|
6
|
-
import { IStorageSync } from '../../storages/types';
|
|
7
|
-
import { ISettings } from '../../types';
|
|
5
|
+
import { ISyncManagerFactoryParams } from '../types';
|
|
8
6
|
|
|
9
|
-
export function submitterManagerFactory(
|
|
10
|
-
|
|
11
|
-
storage
|
|
12
|
-
splitApi: ISplitApi,
|
|
13
|
-
) {
|
|
7
|
+
export function submitterManagerFactory(params: ISyncManagerFactoryParams) {
|
|
8
|
+
|
|
9
|
+
const { settings, storage, splitApi } = params;
|
|
14
10
|
const log = settings.log;
|
|
15
11
|
const submitters = [
|
|
16
12
|
impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
|
|
@@ -2,8 +2,8 @@ import { ISyncManagerCS, ISyncManagerFactoryParams } from './types';
|
|
|
2
2
|
import { submitterManagerFactory } from './submitters/submitterManager';
|
|
3
3
|
import { IReadinessManager } from '../readiness/types';
|
|
4
4
|
import { IStorageSync } from '../storages/types';
|
|
5
|
-
import {
|
|
6
|
-
import { IPollingManager, IPollingManagerCS
|
|
5
|
+
import { IPushManager } from './streaming/types';
|
|
6
|
+
import { IPollingManager, IPollingManagerCS } from './polling/types';
|
|
7
7
|
import { PUSH_SUBSYSTEM_UP, PUSH_SUBSYSTEM_DOWN } from './streaming/constants';
|
|
8
8
|
import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '../logger/constants';
|
|
9
9
|
|
|
@@ -16,44 +16,38 @@ import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '..
|
|
|
16
16
|
* @param pushManagerFactory optional to build a SyncManager with or without streaming support
|
|
17
17
|
*/
|
|
18
18
|
export function syncManagerOnlineFactory(
|
|
19
|
-
pollingManagerFactory?: (
|
|
20
|
-
pushManagerFactory?: (
|
|
19
|
+
pollingManagerFactory?: (params: ISyncManagerFactoryParams) => IPollingManager,
|
|
20
|
+
pushManagerFactory?: (params: ISyncManagerFactoryParams, pollingManager: IPollingManager) => IPushManager | undefined,
|
|
21
21
|
): (params: ISyncManagerFactoryParams) => ISyncManagerCS {
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* SyncManager factory for modular SDK
|
|
25
25
|
*/
|
|
26
|
-
return function ({
|
|
27
|
-
settings,
|
|
28
|
-
platform,
|
|
29
|
-
splitApi,
|
|
30
|
-
storage,
|
|
31
|
-
readiness
|
|
32
|
-
}: ISyncManagerFactoryParams): ISyncManagerCS {
|
|
26
|
+
return function (params: ISyncManagerFactoryParams): ISyncManagerCS {
|
|
33
27
|
|
|
34
|
-
const log = settings
|
|
28
|
+
const { log, streamingEnabled } = params.settings;
|
|
35
29
|
|
|
36
30
|
/** Polling Manager */
|
|
37
|
-
const pollingManager = pollingManagerFactory && pollingManagerFactory(
|
|
31
|
+
const pollingManager = pollingManagerFactory && pollingManagerFactory(params);
|
|
38
32
|
|
|
39
33
|
/** Push Manager */
|
|
40
|
-
const pushManager =
|
|
41
|
-
pushManagerFactory(
|
|
34
|
+
const pushManager = streamingEnabled && pollingManager && pushManagerFactory ?
|
|
35
|
+
pushManagerFactory(params, pollingManager) :
|
|
42
36
|
undefined;
|
|
43
37
|
|
|
44
38
|
/** Submitter Manager */
|
|
45
39
|
// It is not inyected as push and polling managers, because at the moment it is required
|
|
46
|
-
const submitter = submitterManagerFactory(
|
|
40
|
+
const submitter = submitterManagerFactory(params);
|
|
47
41
|
|
|
48
42
|
|
|
49
43
|
/** Sync Manager logic */
|
|
50
44
|
|
|
51
45
|
function startPolling() {
|
|
52
|
-
if (
|
|
46
|
+
if (pollingManager!.isRunning()) {
|
|
47
|
+
log.info(SYNC_CONTINUE_POLLING);
|
|
48
|
+
} else {
|
|
53
49
|
log.info(SYNC_START_POLLING);
|
|
54
50
|
pollingManager!.start();
|
|
55
|
-
} else {
|
|
56
|
-
log.info(SYNC_CONTINUE_POLLING);
|
|
57
51
|
}
|
|
58
52
|
}
|
|
59
53
|
|
|
@@ -96,7 +90,7 @@ export function syncManagerOnlineFactory(
|
|
|
96
90
|
}
|
|
97
91
|
|
|
98
92
|
// start periodic data recording (events, impressions, telemetry).
|
|
99
|
-
submitter
|
|
93
|
+
if (submitter) submitter.start();
|
|
100
94
|
running = true;
|
|
101
95
|
},
|
|
102
96
|
|
|
@@ -141,7 +135,7 @@ export function syncManagerOnlineFactory(
|
|
|
141
135
|
// of segments since `syncAll` was already executed when starting the main client
|
|
142
136
|
mySegmentsSyncTask.execute();
|
|
143
137
|
}
|
|
144
|
-
|
|
138
|
+
pushManager.add(matchingKey, mySegmentsSyncTask);
|
|
145
139
|
} else {
|
|
146
140
|
if (storage.splits.usesSegments()) mySegmentsSyncTask.start();
|
|
147
141
|
}
|
|
@@ -151,7 +145,7 @@ export function syncManagerOnlineFactory(
|
|
|
151
145
|
const mySegmentsSyncTask = (pollingManager as IPollingManagerCS).get(matchingKey);
|
|
152
146
|
if (mySegmentsSyncTask) {
|
|
153
147
|
// stop syncing
|
|
154
|
-
if (pushManager)
|
|
148
|
+
if (pushManager) pushManager.remove(matchingKey);
|
|
155
149
|
if (mySegmentsSyncTask.isRunning()) mySegmentsSyncTask.stop();
|
|
156
150
|
|
|
157
151
|
(pollingManager as IPollingManagerCS).remove(matchingKey);
|
package/src/types.ts
CHANGED
|
@@ -381,6 +381,10 @@ interface IBasicClient extends IStatusInterface {
|
|
|
381
381
|
* @returns {Promise<void>}
|
|
382
382
|
*/
|
|
383
383
|
destroy(): Promise<void>
|
|
384
|
+
|
|
385
|
+
// Whether the client implements the client-side API, i.e, with bound key, (true), or the server-side API (false).
|
|
386
|
+
// Exposed for internal purposes only. Not considered part of the public API, and might be renamed eventually.
|
|
387
|
+
isBrowserClient: boolean
|
|
384
388
|
}
|
|
385
389
|
/**
|
|
386
390
|
* Common definitions between SDK instances for different environments interface.
|
|
@@ -1139,7 +1143,7 @@ export namespace SplitIO {
|
|
|
1139
1143
|
/**
|
|
1140
1144
|
* Removes from client's in memory attributes storage the attribute with the given key
|
|
1141
1145
|
* @function removeAttribute
|
|
1142
|
-
* @param {string} attributeName
|
|
1146
|
+
* @param {string} attributeName
|
|
1143
1147
|
* @returns {boolean} true if attribute was removed and false otherways
|
|
1144
1148
|
*/
|
|
1145
1149
|
removeAttribute(attributeName: string): boolean,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { isObject,
|
|
1
|
+
import { isObject, isString, isFiniteNumber, isBoolean } from '../lang';
|
|
2
|
+
import { objectAssign } from '../lang/objectAssign';
|
|
2
3
|
import { SplitIO } from '../../types';
|
|
3
4
|
import { ILogger } from '../../logger/types';
|
|
4
5
|
import { ERROR_NOT_PLAIN_OBJECT, ERROR_SIZE_EXCEEDED, WARN_SETTING_NULL, WARN_TRIMMING_PROPERTIES } from '../../logger/constants';
|
|
@@ -22,7 +23,8 @@ export function validateEventProperties(log: ILogger, maybeProperties: any, meth
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
const keys = Object.keys(maybeProperties);
|
|
25
|
-
|
|
26
|
+
// Shallow clone
|
|
27
|
+
const clone = objectAssign({}, maybeProperties);
|
|
26
28
|
// To avoid calculating the size twice we'll return it from here.
|
|
27
29
|
const output = {
|
|
28
30
|
properties: clone,
|
package/src/utils/lang/index.ts
CHANGED
|
@@ -194,20 +194,6 @@ export function merge(target: { [key: string]: any }, source: { [key: string]: a
|
|
|
194
194
|
return res;
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
/**
|
|
198
|
-
* Shallow clone an object
|
|
199
|
-
*/
|
|
200
|
-
export function shallowClone(obj: any): any {
|
|
201
|
-
const keys = Object.keys(obj);
|
|
202
|
-
const output: Record<string, any> = {};
|
|
203
|
-
|
|
204
|
-
for (let i = 0; i < keys.length; i++) {
|
|
205
|
-
output[keys[i]] = obj[keys[i]];
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return output;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
197
|
/**
|
|
212
198
|
* Checks if the target string starts with the sub string.
|
|
213
199
|
*/
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Deprecated hashing function, used for split bucketing. Replaced by murmur3
|
|
2
|
+
|
|
3
|
+
//
|
|
4
|
+
// JAVA reference implementation for the hashing function.
|
|
5
|
+
//
|
|
6
|
+
// int h = 0;
|
|
7
|
+
// for (int i = 0; i < key.length(); i++) {
|
|
8
|
+
// h = 31 * h + key.charAt(i);
|
|
9
|
+
// }
|
|
10
|
+
// return h ^ seed; // XOR the hash and seed
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
function ToInteger(x: number) {
|
|
14
|
+
x = Number(x);
|
|
15
|
+
return x < 0 ? Math.ceil(x) : Math.floor(x);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function modulo(a: number, b: number) {
|
|
19
|
+
return a - Math.floor(a / b) * b;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function ToUint32(x: number) {
|
|
23
|
+
return modulo(ToInteger(x), Math.pow(2, 32));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function ToInt32(x: number) {
|
|
27
|
+
let uint32 = ToUint32(x);
|
|
28
|
+
|
|
29
|
+
if (uint32 >= Math.pow(2, 31)) {
|
|
30
|
+
return uint32 - Math.pow(2, 32);
|
|
31
|
+
} else {
|
|
32
|
+
return uint32;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function hash(str: string, seed: number): number {
|
|
37
|
+
let h = 0;
|
|
38
|
+
|
|
39
|
+
for (let i = 0; i < str.length; i++) {
|
|
40
|
+
h = ToInt32(ToInt32(31 * h) + str.charCodeAt(i));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return ToInt32(h ^ seed);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function bucket(str: string, seed: number): number {
|
|
47
|
+
return Math.abs(hash(str, seed) % 100) + 1;
|
|
48
|
+
}
|
|
@@ -3,7 +3,7 @@ export function timeout<T>(ms: number, promise: Promise<T>): Promise<T> {
|
|
|
3
3
|
|
|
4
4
|
return new Promise((resolve, reject) => {
|
|
5
5
|
const tid = setTimeout(() => {
|
|
6
|
-
reject(new Error(`Operation timed out because it exceeded the configured time limit of ${ms}ms.`));
|
|
6
|
+
reject(new Error(`Operation timed out because it exceeded the configured time limit of ${ms} ms.`));
|
|
7
7
|
}, ms);
|
|
8
8
|
|
|
9
9
|
promise.then((res) => {
|
|
@@ -78,11 +78,6 @@ const base = {
|
|
|
78
78
|
localhostMode: undefined
|
|
79
79
|
},
|
|
80
80
|
|
|
81
|
-
runtime: {
|
|
82
|
-
ip: false,
|
|
83
|
-
hostname: false
|
|
84
|
-
},
|
|
85
|
-
|
|
86
81
|
// Logger
|
|
87
82
|
log: undefined
|
|
88
83
|
};
|
|
@@ -139,7 +134,7 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV
|
|
|
139
134
|
|
|
140
135
|
// Current ip/hostname information
|
|
141
136
|
// @ts-ignore, modify readonly prop
|
|
142
|
-
|
|
137
|
+
withDefaults.runtime = runtime(withDefaults);
|
|
143
138
|
|
|
144
139
|
// ensure a valid list of integrations.
|
|
145
140
|
// `integrations` returns an array of valid integration items.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import osFunction from 'os';
|
|
2
|
+
import ipFunction from 'ip';
|
|
3
|
+
|
|
4
|
+
import { UNKNOWN, NA, CONSUMER_MODE } from '../../constants';
|
|
5
|
+
import { ISettings } from '../../../types';
|
|
6
|
+
|
|
7
|
+
export function validateRuntime(settings: ISettings): ISettings['runtime'] {
|
|
8
|
+
const isIPAddressesEnabled = settings.core.IPAddressesEnabled === true;
|
|
9
|
+
const isConsumerMode = settings.mode === CONSUMER_MODE;
|
|
10
|
+
|
|
11
|
+
// If the values are not available, default to false (for standalone) or "unknown" (for consumer mode, to be used on Redis keys)
|
|
12
|
+
let ip = ipFunction.address() || (isConsumerMode ? UNKNOWN : false);
|
|
13
|
+
let hostname = osFunction.hostname() || (isConsumerMode ? UNKNOWN : false);
|
|
14
|
+
|
|
15
|
+
if (!isIPAddressesEnabled) { // If IPAddresses setting is not enabled, set as false (for standalone) or "NA" (for consumer mode, to be used on Redis keys)
|
|
16
|
+
ip = hostname = isConsumerMode ? NA : false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
ip, hostname
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -6,15 +6,15 @@ import { ISettings } from '../../types';
|
|
|
6
6
|
*/
|
|
7
7
|
export interface ISettingsValidationParams {
|
|
8
8
|
/**
|
|
9
|
-
* Object of values to overwrite
|
|
10
|
-
* Version and startup properties are
|
|
9
|
+
* Object of values to overwrite base settings.
|
|
10
|
+
* Version and startup properties are required, because they are not defined in the base settings.
|
|
11
11
|
*/
|
|
12
12
|
defaults: Partial<ISettings> & { version: string } & { startup: ISettings['startup'] },
|
|
13
|
-
/** Function to
|
|
14
|
-
runtime
|
|
15
|
-
/** Storage validator */
|
|
13
|
+
/** Function to define runtime values (`settings.runtime`) */
|
|
14
|
+
runtime: (settings: ISettings) => ISettings['runtime'],
|
|
15
|
+
/** Storage validator (`settings.storage`) */
|
|
16
16
|
storage?: (settings: ISettings) => ISettings['storage'],
|
|
17
|
-
/** Integrations validator */
|
|
17
|
+
/** Integrations validator (`settings.integrations`) */
|
|
18
18
|
integrations?: (settings: ISettings) => ISettings['integrations'],
|
|
19
19
|
/** Logger validator (`settings.debug`) */
|
|
20
20
|
logger: (settings: ISettings) => ISettings['log'],
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IntegrationFactory } from '../types';
|
|
2
2
|
import { GoogleAnalyticsToSplitOptions } from './types';
|
|
3
|
-
export declare function GoogleAnalyticsToSplit(options: GoogleAnalyticsToSplitOptions):
|
|
3
|
+
export declare function GoogleAnalyticsToSplit(options: GoogleAnalyticsToSplitOptions): IntegrationFactory;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { IIntegrationFactoryParams } from '../types';
|
|
2
|
+
import SplitToGa from './SplitToGa';
|
|
3
|
+
import { SplitToGoogleAnalyticsOptions } from './types';
|
|
4
|
+
export declare function SplitToGoogleAnalytics(options?: SplitToGoogleAnalyticsOptions): (params: IIntegrationFactoryParams) => SplitToGa;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SplitToGa } from './SplitToGa';
|
|
1
|
+
import { IntegrationFactory } from '../types';
|
|
3
2
|
import { SplitToGoogleAnalyticsOptions } from './types';
|
|
4
|
-
export declare function SplitToGoogleAnalytics(options?: SplitToGoogleAnalyticsOptions):
|
|
3
|
+
export declare function SplitToGoogleAnalytics(options?: SplitToGoogleAnalyticsOptions): IntegrationFactory;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|