@kameleoon/javascript-sdk-core 4.4.8 → 5.0.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/CHANGELOG.md +32 -0
- package/dist/cacheManager/cacheManager.js +1 -1
- package/dist/cacheManager/cacheManager.js.map +1 -1
- package/dist/cacheManager/index.js.map +1 -1
- package/dist/cacheManager/types.js.map +1 -1
- package/dist/clientConfiguration/clientConfiguration.d.ts +2 -6
- package/dist/clientConfiguration/clientConfiguration.js +1 -1
- package/dist/clientConfiguration/clientConfiguration.js.map +1 -1
- package/dist/clientConfiguration/constants.js.map +1 -1
- package/dist/clientConfiguration/index.js.map +1 -1
- package/dist/clientConfiguration/types.d.ts +2 -5
- package/dist/clientConfiguration/types.js +1 -1
- package/dist/clientConfiguration/types.js.map +1 -1
- package/dist/clientSettings/clientSettings.d.ts +2 -1
- package/dist/clientSettings/clientSettings.js +1 -1
- package/dist/clientSettings/clientSettings.js.map +1 -1
- package/dist/clientSettings/index.js.map +1 -1
- package/dist/clientSettings/types.d.ts +1 -0
- package/dist/clientSettings/types.js.map +1 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/eventManager/eventManager.js +1 -1
- package/dist/eventManager/eventManager.js.map +1 -1
- package/dist/eventManager/index.js.map +1 -1
- package/dist/eventManager/types.js.map +1 -1
- package/dist/eventSource/constants.js.map +1 -1
- package/dist/eventSource/eventSource.js +1 -1
- package/dist/eventSource/eventSource.js.map +1 -1
- package/dist/eventSource/index.js.map +1 -1
- package/dist/eventSource/types.js.map +1 -1
- package/dist/hasher/hasher.js.map +1 -1
- package/dist/hasher/index.js.map +1 -1
- package/dist/hasher/types.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kameleoonClient.d.ts +6 -13
- package/dist/kameleoonClient.js +1 -1
- package/dist/kameleoonClient.js.map +1 -1
- package/dist/kameleoonClientInterface.d.ts +18 -16
- package/dist/kameleoonClientInterface.js.map +1 -1
- package/dist/kameleoonData/applicationVersion.d.ts +2 -3
- package/dist/kameleoonData/applicationVersion.js +1 -1
- package/dist/kameleoonData/applicationVersion.js.map +1 -1
- package/dist/kameleoonData/browser.d.ts +9 -3
- package/dist/kameleoonData/browser.js +1 -1
- package/dist/kameleoonData/browser.js.map +1 -1
- package/dist/kameleoonData/conversion.d.ts +12 -3
- package/dist/kameleoonData/conversion.js +1 -1
- package/dist/kameleoonData/conversion.js.map +1 -1
- package/dist/kameleoonData/cookie.d.ts +2 -3
- package/dist/kameleoonData/cookie.js +1 -1
- package/dist/kameleoonData/cookie.js.map +1 -1
- package/dist/kameleoonData/customData.d.ts +11 -3
- package/dist/kameleoonData/customData.js +1 -1
- package/dist/kameleoonData/customData.js.map +1 -1
- package/dist/kameleoonData/dataManager.d.ts +34 -23
- package/dist/kameleoonData/dataManager.js +1 -1
- package/dist/kameleoonData/dataManager.js.map +1 -1
- package/dist/kameleoonData/dataProcessor.d.ts +22 -24
- package/dist/kameleoonData/dataProcessor.js +1 -1
- package/dist/kameleoonData/dataProcessor.js.map +1 -1
- package/dist/kameleoonData/device.d.ts +9 -3
- package/dist/kameleoonData/device.js +1 -1
- package/dist/kameleoonData/device.js.map +1 -1
- package/dist/kameleoonData/geolocation.d.ts +9 -3
- package/dist/kameleoonData/geolocation.js +1 -1
- package/dist/kameleoonData/geolocation.js.map +1 -1
- package/dist/kameleoonData/helpers.js.map +1 -1
- package/dist/kameleoonData/index.d.ts +2 -1
- package/dist/kameleoonData/index.js +1 -1
- package/dist/kameleoonData/index.js.map +1 -1
- package/dist/kameleoonData/kameleoonConversionScore.d.ts +2 -1
- package/dist/kameleoonData/kameleoonConversionScore.js +1 -1
- package/dist/kameleoonData/kameleoonConversionScore.js.map +1 -1
- package/dist/kameleoonData/operatingSystem.d.ts +9 -3
- package/dist/kameleoonData/operatingSystem.js +1 -1
- package/dist/kameleoonData/operatingSystem.js.map +1 -1
- package/dist/kameleoonData/pageView.d.ts +12 -8
- package/dist/kameleoonData/pageView.js +1 -1
- package/dist/kameleoonData/pageView.js.map +1 -1
- package/dist/kameleoonData/types.d.ts +97 -31
- package/dist/kameleoonData/types.js +1 -1
- package/dist/kameleoonData/types.js.map +1 -1
- package/dist/kameleoonData/uniqueIdentifier.d.ts +19 -0
- package/dist/kameleoonData/uniqueIdentifier.js +2 -0
- package/dist/kameleoonData/uniqueIdentifier.js.map +1 -0
- package/dist/kameleoonData/userAgent.d.ts +2 -3
- package/dist/kameleoonData/userAgent.js +1 -1
- package/dist/kameleoonData/userAgent.js.map +1 -1
- package/dist/kameleoonData/visitProcessor.d.ts +3 -4
- package/dist/kameleoonData/visitProcessor.js +1 -1
- package/dist/kameleoonData/visitProcessor.js.map +1 -1
- package/dist/kameleoonData/visitsData.d.ts +2 -0
- package/dist/kameleoonData/visitsData.js +1 -1
- package/dist/kameleoonData/visitsData.js.map +1 -1
- package/dist/kameleoonError/constants.js +1 -1
- package/dist/kameleoonError/constants.js.map +1 -1
- package/dist/kameleoonError/helpers.js +1 -1
- package/dist/kameleoonError/helpers.js.map +1 -1
- package/dist/kameleoonError/index.js.map +1 -1
- package/dist/kameleoonError/kameleoonError.js +1 -1
- package/dist/kameleoonError/kameleoonError.js.map +1 -1
- package/dist/kameleoonError/types.js.map +1 -1
- package/dist/kameleoonUtils.d.ts +1 -11
- package/dist/kameleoonUtils.js +1 -1
- package/dist/kameleoonUtils.js.map +1 -1
- package/dist/requester/constants.js +1 -1
- package/dist/requester/constants.js.map +1 -1
- package/dist/requester/index.d.ts +1 -1
- package/dist/requester/index.js +1 -1
- package/dist/requester/index.js.map +1 -1
- package/dist/requester/requester.d.ts +5 -7
- package/dist/requester/requester.js +1 -1
- package/dist/requester/requester.js.map +1 -1
- package/dist/requester/types.d.ts +7 -26
- package/dist/requester/types.js +1 -1
- package/dist/requester/types.js.map +1 -1
- package/dist/requester/urlProvider.d.ts +2 -2
- package/dist/requester/urlProvider.js +1 -1
- package/dist/requester/urlProvider.js.map +1 -1
- package/dist/storage/constants.d.ts +6 -2
- package/dist/storage/constants.js +1 -1
- package/dist/storage/constants.js.map +1 -1
- package/dist/storage/index.d.ts +3 -2
- package/dist/storage/index.js +1 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/integrityChecker.d.ts +20 -0
- package/dist/storage/integrityChecker.js +2 -0
- package/dist/storage/integrityChecker.js.map +1 -0
- package/dist/storage/storage.d.ts +0 -1
- package/dist/storage/storage.js +1 -1
- package/dist/storage/storage.js.map +1 -1
- package/dist/storage/types.d.ts +25 -17
- package/dist/storage/types.js.map +1 -1
- package/dist/targeting/conditions/applicationVersion.js +1 -1
- package/dist/targeting/conditions/applicationVersion.js.map +1 -1
- package/dist/targeting/conditions/browser.js +1 -1
- package/dist/targeting/conditions/browser.js.map +1 -1
- package/dist/targeting/conditions/conditionFactory.js.map +1 -1
- package/dist/targeting/conditions/conversion.js +1 -1
- package/dist/targeting/conditions/conversion.js.map +1 -1
- package/dist/targeting/conditions/conversionLikelihood.js +1 -1
- package/dist/targeting/conditions/conversionLikelihood.js.map +1 -1
- package/dist/targeting/conditions/cookie.js +1 -1
- package/dist/targeting/conditions/cookie.js.map +1 -1
- package/dist/targeting/conditions/customData.js +1 -1
- package/dist/targeting/conditions/customData.js.map +1 -1
- package/dist/targeting/conditions/device.js +1 -1
- package/dist/targeting/conditions/device.js.map +1 -1
- package/dist/targeting/conditions/exclusiveCampaign.js.map +1 -1
- package/dist/targeting/conditions/firstVisit.js +1 -1
- package/dist/targeting/conditions/firstVisit.js.map +1 -1
- package/dist/targeting/conditions/geolocation.js +1 -1
- package/dist/targeting/conditions/geolocation.js.map +1 -1
- package/dist/targeting/conditions/index.js.map +1 -1
- package/dist/targeting/conditions/lastVisit.js +1 -1
- package/dist/targeting/conditions/lastVisit.js.map +1 -1
- package/dist/targeting/conditions/newVisitor.js +1 -1
- package/dist/targeting/conditions/newVisitor.js.map +1 -1
- package/dist/targeting/conditions/operatingSystem.js +1 -1
- package/dist/targeting/conditions/operatingSystem.js.map +1 -1
- package/dist/targeting/conditions/pageTitle.js +1 -1
- package/dist/targeting/conditions/pageTitle.js.map +1 -1
- package/dist/targeting/conditions/pageUrl.js +1 -1
- package/dist/targeting/conditions/pageUrl.js.map +1 -1
- package/dist/targeting/conditions/previousPage.js +1 -1
- package/dist/targeting/conditions/previousPage.js.map +1 -1
- package/dist/targeting/conditions/sameDayVisits.js +1 -1
- package/dist/targeting/conditions/sameDayVisits.js.map +1 -1
- package/dist/targeting/conditions/sdkLanguage.js +1 -1
- package/dist/targeting/conditions/sdkLanguage.js.map +1 -1
- package/dist/targeting/conditions/segment.js +1 -1
- package/dist/targeting/conditions/segment.js.map +1 -1
- package/dist/targeting/conditions/targetFeatureFlag.js +1 -1
- package/dist/targeting/conditions/targetFeatureFlag.js.map +1 -1
- package/dist/targeting/conditions/types.js.map +1 -1
- package/dist/targeting/conditions/visitedPages.js +1 -1
- package/dist/targeting/conditions/visitedPages.js.map +1 -1
- package/dist/targeting/conditions/visitorCode.js +1 -1
- package/dist/targeting/conditions/visitorCode.js.map +1 -1
- package/dist/targeting/conditions/visits.js +1 -1
- package/dist/targeting/conditions/visits.js.map +1 -1
- package/dist/targeting/index.d.ts +1 -1
- package/dist/targeting/index.js.map +1 -1
- package/dist/targeting/node.js +1 -1
- package/dist/targeting/node.js.map +1 -1
- package/dist/targeting/tree.js +1 -1
- package/dist/targeting/tree.js.map +1 -1
- package/dist/targeting/types.js.map +1 -1
- package/dist/tracking/bodyProvider.d.ts +26 -0
- package/dist/tracking/bodyProvider.js +2 -0
- package/dist/tracking/bodyProvider.js.map +1 -0
- package/dist/tracking/constants.d.ts +2 -0
- package/dist/tracking/constants.js +2 -0
- package/dist/tracking/constants.js.map +1 -0
- package/dist/tracking/index.d.ts +1 -0
- package/dist/tracking/index.js +2 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/tracker.d.ts +21 -0
- package/dist/tracking/tracker.js +2 -0
- package/dist/tracking/tracker.js.map +1 -0
- package/dist/tracking/types.d.ts +45 -0
- package/dist/tracking/types.js +2 -0
- package/dist/tracking/types.js.map +1 -0
- package/dist/types.d.ts +44 -15
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/constants.d.ts +0 -1
- package/dist/utilities/constants.js +1 -1
- package/dist/utilities/constants.js.map +1 -1
- package/dist/utilities/index.d.ts +3 -2
- package/dist/utilities/index.js +1 -1
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/parser.d.ts +10 -0
- package/dist/utilities/parser.js +2 -0
- package/dist/utilities/parser.js.map +1 -0
- package/dist/utilities/types.d.ts +3 -40
- package/dist/utilities/types.js.map +1 -1
- package/dist/utilities/utilities.d.ts +5 -21
- package/dist/utilities/utilities.js +1 -1
- package/dist/utilities/utilities.js.map +1 -1
- package/dist/utilities/validator.d.ts +5 -0
- package/dist/utilities/validator.js +2 -0
- package/dist/utilities/validator.js.map +1 -0
- package/dist/variationConfiguration/index.js.map +1 -1
- package/dist/variationConfiguration/types.d.ts +7 -2
- package/dist/variationConfiguration/types.js.map +1 -1
- package/dist/variationConfiguration/variationConfiguration.d.ts +15 -7
- package/dist/variationConfiguration/variationConfiguration.js +1 -1
- package/dist/variationConfiguration/variationConfiguration.js.map +1 -1
- package/dist/visitorCodeManager/constants.d.ts +2 -0
- package/dist/visitorCodeManager/constants.js +1 -1
- package/dist/visitorCodeManager/constants.js.map +1 -1
- package/dist/visitorCodeManager/index.js.map +1 -1
- package/dist/visitorCodeManager/types.d.ts +3 -0
- package/dist/visitorCodeManager/types.js.map +1 -1
- package/dist/visitorCodeManager/visitorCodeManager.d.ts +4 -0
- package/dist/visitorCodeManager/visitorCodeManager.js +1 -1
- package/dist/visitorCodeManager/visitorCodeManager.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":["TimeUnit","exports","Minute","Hour","Day","Week","Month","Order","Ascending","Descending"],"sources":["../../src/utilities/types.ts"],"sourcesContent":["import { CacheManager } from 'src/cacheManager';\nimport { ClientConfiguration } from 'src/clientConfiguration';\nimport { DataManager } from 'src/kameleoonData';\nimport {\n KameleoonDataType,\n KameleoonVisitorDataType,\n} from 'src/kameleoonData/types';\nimport { Requester } from 'src/requester';\nimport {
|
|
1
|
+
{"version":3,"file":"types.js","names":["TimeUnit","exports","Minute","Hour","Day","Week","Month","Order","Ascending","Descending"],"sources":["../../src/utilities/types.ts"],"sourcesContent":["import { CacheManager } from 'src/cacheManager';\nimport { ClientConfiguration } from 'src/clientConfiguration';\nimport { DataManager } from 'src/kameleoonData';\nimport {\n KameleoonDataType,\n KameleoonVisitorDataType,\n} from 'src/kameleoonData/types';\nimport { Requester } from 'src/requester';\nimport { GetVisitorDataResultType } from 'src/requester/types';\nimport { SegmentType } from 'src/targeting';\nimport { ExternalPackageInfoType, TrackingCacheItemType } from 'src/types';\nimport { VariationConfiguration } from 'src/variationConfiguration';\n\nexport type CheckTargetingParametersType = {\n segment: SegmentType | null;\n experimentId: number | null;\n visitorCode: string;\n packageInfo: ExternalPackageInfoType;\n targetingData?: KameleoonVisitorDataType;\n clientConfiguration: ClientConfiguration;\n variationConfiguration?: VariationConfiguration;\n dataManager: DataManager;\n};\n\nexport enum TimeUnit {\n Minute = 'MINUTE',\n Hour = 'HOUR',\n Day = 'DAY',\n Week = 'WEEK',\n Month = 'MONTH',\n}\n\nexport enum Order {\n Ascending = 'asc',\n Descending = 'desc',\n}\n\nexport type InsertInOrderedListParametersType = {\n list: number[];\n element: number;\n order: Order;\n};\n\nexport type ParseVisitorDataParametersType = {\n data: GetVisitorDataResultType;\n filters: VisitorDataFiltersType;\n visitorCode: string;\n dataManager: DataManager;\n variationConfiguration: VariationConfiguration;\n};\n\nexport type ParseVisitorDataResultType = {\n storageVisitorData: KameleoonDataType[];\n visitorData: KameleoonDataType[];\n visitsData?: KameleoonDataType;\n};\n\nexport type ManageCacheParametersType = {\n hasJsCssVariables: boolean;\n cacheManager: CacheManager<TrackingCacheItemType>;\n visitorCode: string;\n experimentId: number;\n variationId: number;\n};\n\nexport type TrackDataParametersType = {\n visitorCode: string;\n dataManager: DataManager;\n requester: Requester;\n isConsentProvided: boolean;\n isOfflineModeOn?: boolean;\n isMappingIdentifier?: boolean;\n};\n\nexport type TrackExperimentParametersType = {\n clientConfiguration: ClientConfiguration;\n visitorCode: string;\n requester: Requester;\n variationId: number;\n experimentId: number;\n isUnallocated: boolean;\n isOfflineModeOn?: boolean;\n};\n\n/**\n * @param {number} previousVisitAmount - Number of previous visits to retrieve data from. Number between `1` and `25`\n * *Default*: `1`.\n * @param {number} currentVisit - If true, current visit data will be retrieved.\n * *Default*: `true`.\n * @param {boolean} customData - If true, custom data will be retrieved.\n * *Default*: `true`.\n * @param {boolean} pageViews - If true, page data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} geolocation - If true, geolocation data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} device - If true, device data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} browser - If true, browser data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} operatingSystem - If true, operating system data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} conversions - If true, conversion data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} experiments - If true, experiment data will be retrieved.\n * *Default*: `false`.\n * @param {boolean} kcs - If true, Kameleoon Conversion Score data will be retrieved.\n * *Default*: `false`.\n * */\nexport type VisitorDataFiltersType = {\n previousVisitAmount?: number;\n currentVisit?: boolean;\n pageViews?: boolean;\n geolocation?: boolean;\n device?: boolean;\n browser?: boolean;\n operatingSystem?: boolean;\n customData?: boolean;\n conversions?: boolean;\n experiments?: boolean;\n kcs?: boolean;\n};\n\n/**\n * @interface `IExternalPRNG` - an interface for external PRNG (Pseudo-Random Number Generator) used to generate secure random numbers depending on the environment and platform\n * */\nexport interface IExternalPRNG {\n /**\n * @method getRandomNumber - a method to generate a secure random number\n * @returns {number} a secure random `number`, which must be a floating-point number between 0 and 1, similarly to `Math.random()`\n * */\n getRandomNumber(): number;\n}\n"],"mappings":"6GAwBY,CAAAA,QAAQ,CAAAC,OAAA,CAAAD,QAAA,UAARA,CAAQ,QAAR,CAAAA,CAAQ,CAAAE,MAAA,UAARF,CAAQ,CAAAG,IAAA,QAARH,CAAQ,CAAAI,GAAA,OAARJ,CAAQ,CAAAK,IAAA,QAARL,CAAQ,CAAAM,KAAA,SAARN,CAAQ,MAQRO,KAAK,CAAAN,OAAA,CAAAM,KAAA,UAALA,CAAK,QAAL,CAAAA,CAAK,CAAAC,SAAA,OAALD,CAAK,CAAAE,UAAA,QAALF,CAAK","ignoreList":[]}
|
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
import { Result } from 'ts-res';
|
|
2
2
|
import { KameleoonError } from '../kameleoonError';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { CustomData, DataManager, KameleoonDataType } from '../kameleoonData';
|
|
3
|
+
import { TrackingCacheItemType } from '../types';
|
|
4
|
+
import { CustomData, KameleoonDataType } from '../kameleoonData';
|
|
6
5
|
import { CacheManager } from '../cacheManager';
|
|
7
6
|
import { VersionMatchType } from '../targeting';
|
|
8
|
-
import { CheckTargetingParametersType, ManageCacheParametersType,
|
|
7
|
+
import { CheckTargetingParametersType, ManageCacheParametersType, InsertInOrderedListParametersType, TimeUnit, IExternalPRNG } from './types';
|
|
9
8
|
export declare class Utilities {
|
|
10
|
-
static prng: IExternalPRNG
|
|
9
|
+
static getNonce(prng: IExternalPRNG): string;
|
|
11
10
|
static checkTargeting({ segment, visitorCode, targetingData, experimentId, variationConfiguration, clientConfiguration, packageInfo, dataManager, }: CheckTargetingParametersType): Result<boolean, KameleoonError>;
|
|
12
|
-
static validateVisitorCode(visitorCode: string): Result<void, KameleoonError>;
|
|
13
|
-
static getDataUrl({ visitorCode, dataManager, isConsentProvided, }: GetDataUrlParametersType): string;
|
|
14
|
-
static getVariationDataUrlAndSentExperimentIds({ visitorCode, isConsentProvided, variationConfiguration, }: GetVariationDataUrlParametersType): [string, string[]];
|
|
15
|
-
static trackFeatureExperiment({ featureFlagVariation, dataManager, visitorCode, requester, isOfflineModeOn, isConsentProvided, offlineTrackingStorage, variationConfiguration, }: TrackRuleParametersType): Promise<void>;
|
|
16
11
|
static convertTimeUnit(time: number, timeUnit: TimeUnit): number;
|
|
17
|
-
static parseFeatureVariable(variable: FeatureVariableType): Result<FeatureVariableResultType, KameleoonError>;
|
|
18
|
-
static parseVisitorData({ data, filters, visitorCode, dataManager, variationConfiguration, }: ParseVisitorDataParametersType): ParseVisitorDataResultType;
|
|
19
|
-
static parseRegExp(value: string): RegExp;
|
|
20
|
-
static getUserAgent(visitorCode: string, dataManager: DataManager): string | undefined;
|
|
21
12
|
static isCustomData(dataItem: KameleoonDataType): dataItem is CustomData;
|
|
22
13
|
/**
|
|
23
14
|
* Insert element in ordered list, if element already exists in list, does nothing
|
|
@@ -26,18 +17,11 @@ export declare class Utilities {
|
|
|
26
17
|
* @param order - order of list
|
|
27
18
|
*/
|
|
28
19
|
static insertInOrderedListMutably({ list, element, order, }: InsertInOrderedListParametersType): void;
|
|
29
|
-
static updateCache({ cacheManager, visitorCode, experimentId, variationId, }: ManageCacheParametersType): void;
|
|
20
|
+
static updateCache({ hasJsCssVariables, cacheManager, visitorCode, experimentId, variationId, }: ManageCacheParametersType): void;
|
|
30
21
|
static getTrackingCode(trackingCache: CacheManager<TrackingCacheItemType>, visitorCode: string): string;
|
|
31
|
-
static trackData({ visitorCode, dataManager, requester, isOfflineModeOn, offlineTrackingStorage, isConsentProvided, isMappingIdentifier, }: TrackDataParametersType): Promise<void>;
|
|
32
|
-
static getNonce(): string;
|
|
33
22
|
static compareSemVer({ version, compareVersion, operator, }: {
|
|
34
23
|
version: string;
|
|
35
24
|
compareVersion: string;
|
|
36
25
|
operator: VersionMatchType;
|
|
37
26
|
}): Result<boolean, KameleoonError>;
|
|
38
|
-
static generateRandomString(length: number): string;
|
|
39
|
-
static sendOfflineTracking({ requester, storage, }: SendOfflineTrackingParametersType): Promise<void>;
|
|
40
|
-
private static addItemToOfflineTracking;
|
|
41
|
-
private static deleteFromOfflineTracking;
|
|
42
|
-
private static validateVersion;
|
|
43
27
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const _excluded=["timestamp","isExperiment"];Object.defineProperty(exports,"__esModule",{value:!0}),exports.Utilities=void 0;var _tsRes=require("ts-res"),_kameleoonError=require("../kameleoonError"),_types=require("../types"),_kameleoonData=require("../kameleoonData"),_constants=require("../constants"),_requester=require("../requester"),_targeting=require("../targeting"),_visitProcessor=require("../kameleoonData/visitProcessor"),_constants2=require("./constants"),_types2=require("./types");function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],0<=b.indexOf(c)||Object.prototype.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c,d,e={},f=Object.keys(a);for(d=0;d<f.length;d++)c=f[d],0<=b.indexOf(c)||(e[c]=a[c]);return e}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return b=_toPropertyKey(b),b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class Utilities{static checkTargeting(a){let{segment:b,visitorCode:c,targetingData:d,experimentId:e,variationConfiguration:f,clientConfiguration:g,packageInfo:h,dataManager:i}=a;if(!b||!b.conditionsData.firstLevel.length)return(0,_tsRes.Ok)(!0);if(!f)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));let j={};const k=f.getStoredVariations(c);k.ok&&(j=k.data);const l=i.getTree(b);let m,n,o;l.hasTargetingType(_targeting.TargetingType.SEGMENT)&&(m=i.trees,n=g.segments),l.hasTargetingType(_targeting.TargetingType.TARGET_FEATURE_FLAG)&&(o=g.ruleMap);const p=l.evaluate({variationData:j,sdkInfo:h,segments:n,ruleMap:o,trees:m,targetingData:d,experimentId:e,visitorCode:c});return p}static validateVisitorCode(a){return 0===a.length?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitorCodeEmpty)):a.length>_constants2.VISITOR_CODE_MAX_LENGTH?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitorCodeMaxLength)):(0,_tsRes.Ok)()}static getDataUrl(a){function b(a){if(!a.url)return;const b=a.data.type===_kameleoonData.KameleoonData.Conversion;if(e||b){const c=b?"":_requester.UrlParameter.Nonce+Utilities.getNonce();g.push(a.url+c+"\n")}}let{visitorCode:c,dataManager:d,isConsentProvided:e}=a;const f=d.getUnsentData(c),g=[];if(!f||!f.size)return"";for(const c of f.values())Array.isArray(c)?c.forEach(a=>b(a)):b(c);return g.join("")}static getVariationDataUrlAndSentExperimentIds(a){let{visitorCode:b,isConsentProvided:c,variationConfiguration:d}=a;const e=[],f=new Set,g=d.getUnsentData(b);g.ok&&g.data.length&&g.data.forEach(a=>{(a.isTargetedRule||c)&&(e.push(_requester.UrlEventType.Experiment+_requester.UrlParameter.Id+a.experimentId+_requester.UrlParameter.VariationId+a.variationId+_requester.UrlParameter.Nonce+Utilities.getNonce()+"\n"),f.add(a.experimentId+""))});const h=e.join(""),i=Array.from(f);return[h,i]}static async trackFeatureExperiment(a){let{featureFlagVariation:b,dataManager:c,visitorCode:d,requester:e,isOfflineModeOn:f,isConsentProvided:g,offlineTrackingStorage:h,variationConfiguration:i}=a;const{variationId:j,rule:k}=b,l=this.getUserAgent(d,c),m=this.getDataUrl({visitorCode:d,dataManager:c,isConsentProvided:g}),n=k?k.experimentId:0,[o,p]=this.getVariationDataUrlAndSentExperimentIds({visitorCode:d,isConsentProvided:g,variationConfiguration:i});if(!g&&!m&&!k)return;const q={visitorCode:d,dataUrl:m,variationDataUrl:o,experimentId:n,variationId:j||0,userAgent:l,isUnallocated:null===j},r=await e.trackExperiment(q);r.ok&&(g?c.clearUnsentData(d):c.clearUnsentDataByKey(d,_kameleoonData.KameleoonData.Conversion),p.forEach(a=>{i.markUnsentDataAsSent(d,a)})),!r.ok&&f&&this.addItemToOfflineTracking({item:q,storage:h,isExperiment:!0})}static convertTimeUnit(a,b){const c={[_types2.TimeUnit.Minute]:_types.Milliseconds.Minute,[_types2.TimeUnit.Hour]:_types.Milliseconds.Hour,[_types2.TimeUnit.Day]:_types.Milliseconds.Day,[_types2.TimeUnit.Week]:_types.Milliseconds.Week,[_types2.TimeUnit.Month]:_types.Milliseconds.Month};return a/c[b]}static parseFeatureVariable(a){const{key:b,type:c,value:d}=a;switch(c){case _types.VariableType.BOOLEAN:return(0,_tsRes.Ok)({key:b,type:c,value:!!d});case _types.VariableType.STRING:return(0,_tsRes.Ok)({key:b,type:c,value:d+""});case _types.VariableType.NUMBER:const e=+d;return Number.isNaN(e)?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.NumberParse,d+"")):(0,_tsRes.Ok)({key:b,type:c,value:e});case _types.VariableType.JSON:try{const d=JSON.parse(a.value+"");return(0,_tsRes.Ok)({key:b,type:c,value:d})}catch(a){return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.JSONParse,a))}default:(0,_kameleoonError.exhaustCheck)(c)}}static parseVisitorData(a){let{data:b,filters:c,visitorCode:d,dataManager:e,variationConfiguration:f}=a;const g=new _visitProcessor.VisitProcessor(c,e),{currentVisit:h,previousVisits:i,kcs:j}=b;let k=[];if(h&&k.push(h),i&&k.push(...i),!k.length)return{visitorData:[],storageVisitorData:[]};k.forEach(a=>{g.processVisit(a)}),g.processKcs(j),g.processMultipleDataTypes();const{visitorData:l,storageVisitorData:m,visitsData:n,experimentData:o}=g.data;return f.updateStoredVariations(d,o),{visitorData:l,storageVisitorData:m,visitsData:n}}static parseRegExp(a){if("/"===a[0]){const[_,b,c]=a.split("/");return new RegExp(b,c)}return new RegExp(a)}static getUserAgent(a,b){const c=b.getTargetingData(a);if(c){const a=c[_kameleoonData.KameleoonData.UserAgent];if(a)return a.value}}static isCustomData(a){return a.data.type===_kameleoonData.KameleoonData.CustomData}static insertInOrderedListMutably(a){let{list:b,element:c,order:d}=a;if(!b.includes(c)){const a=b.findIndex(a=>d===_types2.Order.Ascending?a>=c:a<=c);-1===a?b.push(c):b.splice(a,0,c)}}static updateCache(a){let{cacheManager:b,visitorCode:c,experimentId:d,variationId:e}=a;const f=b.getAliveItem(c),g=f?_objectSpread({},f):{};g[d]={variationId:e,expirationTime:Date.now()+_constants.CACHE_ITEM_LIFETIME*_types.Milliseconds.Second},b.add({key:c,data:g,lifetime:_constants.CACHE_ITEM_LIFETIME})}static getTrackingCode(a,b){let c="window.kameleoonQueue=window.kameleoonQueue||[];";const d=a.getAliveItem(b);if(!d)return c;const e={};return Object.entries(d).forEach(a=>{let[b,{variationId:d,expirationTime:f}]=a;f>Date.now()&&(c+="window.kameleoonQueue.push(['Experiments.assignVariation',".concat(b,",").concat(d,",true]);"),c+="window.kameleoonQueue.push(['Experiments.trigger',".concat(b,",true]);"),e[+b]={variationId:d,expirationTime:f})}),a.add({key:b,data:e,lifetime:_constants.CACHE_ITEM_LIFETIME}),c}static async trackData(a){let{visitorCode:b,dataManager:c,requester:d,isOfflineModeOn:e,offlineTrackingStorage:f,isConsentProvided:g,isMappingIdentifier:h}=a;const i=this.getDataUrl({visitorCode:b,dataManager:c,isConsentProvided:g});if(!g&&!i)return;const j=this.getUserAgent(b,c),k={visitorCode:b,body:i,userAgent:j,isMappingIdentifier:h},l=await d.trackData(k),m=()=>g?c.clearUnsentData(b):c.clearUnsentDataByKey(b,_kameleoonData.KameleoonData.Conversion);l.ok&&m(),!l.ok&&e&&this.addItemToOfflineTracking({item:k,storage:f,isExperiment:!1,onSuccess:m}),await this.sendOfflineTracking({requester:d,storage:f})}static getNonce(){let a="";for(let d=0;d<_constants2.NONCE_LENGTH;d++){var b,c;const d=null!==(b=null===(c=this.prng)||void 0===c?void 0:c.getRandomNumber())&&void 0!==b?b:Math.random(),e=Math.floor(d*_constants2.NONCE_LENGTH);a+=_constants2.HEX_CHARACTERS.charAt(e)}return a}static compareSemVer(a){let{version:b,compareVersion:c,operator:d}=a;const e=this.validateVersion(b),f=this.validateVersion(c);if(!e.ok)return(0,_tsRes.Err)(e.error);if(!f.ok)return(0,_tsRes.Err)(f.error);const[g,h,i]=e.data,[j,k,l]=f.data,[m,n,o]=[g===j,h===k,i===l];switch(d){case _targeting.VersionMatchType.EQUAL:return(0,_tsRes.Ok)(m&&n&&o);case _targeting.VersionMatchType.GREATER:return(0,_tsRes.Ok)(g>j||m&&h>k||m&&n&&i>l);case _targeting.VersionMatchType.LOWER:return(0,_tsRes.Ok)(g<j||m&&h<k||m&&n&&i<l);default:(0,_kameleoonError.exhaustCheck)(d)}}static generateRandomString(a){const b="abcdefghijklmnopqrstuvwxyz0123456789",c=[];if(0>a)return"";for(let d=0;d<a;d++)c.push(b[Math.floor(Math.random()*b.length)]);return c.join("")}static async sendOfflineTracking(a){let{requester:b,storage:c}=a;const d=c.read();if(d.ok&&d.data.requestParameters){const{requestParameters:a}=d.data,e=[];for(const c of a){const{timestamp:a,isExperiment:d}=c,f=_objectWithoutProperties(c,_excluded);let g;g=d?await b.trackExperiment(f):await b.trackData(f),g.ok&&g.data&&e.push(a)}this.deleteFromOfflineTracking({storage:c,timestamps:e})}}static addItemToOfflineTracking(a){let{item:b,isExperiment:c,storage:d,onSuccess:e}=a;const f=d.read(),g=f.ok?f.data:{},{requestParameters:h}=g,i=_objectSpread(_objectSpread({},b),{},{timestamp:new Date().getTime(),isExperiment:c}),j=h?[...h,i]:[i],k=d.write({requestParameters:j});k.ok&&e&&e()}static deleteFromOfflineTracking(a){let{timestamps:b,storage:c}=a;const d=c.read();if(d.ok){const{requestParameters:a}=d.data,e=null===a||void 0===a?void 0:a.filter(a=>!b.includes(a.timestamp));c.write({requestParameters:e})}}static validateVersion(a){const b=a.split(".").map(a=>parseInt(a,10));for(;3>b.length;)b.push(0);return b.some(a=>isNaN(a))?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.SemanticVersionParse,a)):(0,_tsRes.Ok)(b.slice(0,3))}}exports.Utilities=Utilities,_defineProperty(Utilities,"prng",void 0);
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Utilities=void 0;var _tsRes=require("ts-res"),_kameleoonError=require("../kameleoonError"),_types=require("../types"),_kameleoonData=require("../kameleoonData"),_constants=require("../constants"),_targeting=require("../targeting"),_types2=require("./types"),_constants2=require("./constants"),_validator=require("./validator");function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class Utilities{static getNonce(a){let b="";for(let c=0;c<_constants2.NONCE_LENGTH;c++){const c=a.getRandomNumber(),d=Math.floor(c*_constants2.NONCE_LENGTH);b+=_constants2.HEX_CHARACTERS.charAt(d)}return b}static checkTargeting(a){let{segment:b,visitorCode:c,targetingData:d,experimentId:e,variationConfiguration:f,clientConfiguration:g,packageInfo:h,dataManager:i}=a;if(!b||!b.conditionsData.firstLevel.length)return(0,_tsRes.Ok)(!0);if(!f)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));let j={};const k=f.getStoredVariations(c);k.ok&&(j=k.data);const l=i.getTree(b);let m,n,o;l.hasTargetingType(_targeting.TargetingType.SEGMENT)&&(m=i.trees,o=g.segments),l.hasTargetingType(_targeting.TargetingType.TARGET_FEATURE_FLAG)&&(n=g.ruleMap);const p=l.evaluate({variationData:j,sdkInfo:h,segments:o,ruleMap:n,trees:m,targetingData:d,experimentId:e,visitorCode:c});return p}static convertTimeUnit(a,b){const c={[_types2.TimeUnit.Minute]:_types.Milliseconds.Minute,[_types2.TimeUnit.Hour]:_types.Milliseconds.Hour,[_types2.TimeUnit.Day]:_types.Milliseconds.Day,[_types2.TimeUnit.Week]:_types.Milliseconds.Week,[_types2.TimeUnit.Month]:_types.Milliseconds.Month};return a/c[b]}static isCustomData(a){return a.data.type===_kameleoonData.KameleoonData.CustomData}static insertInOrderedListMutably(a){let{list:b,element:c,order:d}=a;if(!b.includes(c)){const a=b.findIndex(a=>d===_types2.Order.Ascending?a>=c:a<=c);-1===a?b.push(c):b.splice(a,0,c)}}static updateCache(a){let{hasJsCssVariables:b,cacheManager:c,visitorCode:d,experimentId:e,variationId:f}=a;const g=c.getAliveItem(d),h=g?_objectSpread({},g):{};h[e]={variationId:f,hasJsCssVariables:b,expirationTime:Date.now()+_constants.CACHE_ITEM_LIFETIME*_types.Milliseconds.Second},c.add({key:d,data:h,lifetime:_constants.CACHE_ITEM_LIFETIME})}static getTrackingCode(a,b){let c="window.kameleoonQueue=window.kameleoonQueue||[];";const d=a.getAliveItem(b);if(!d)return c;const e={};return Object.entries(d).forEach(a=>{let[b,{variationId:d,expirationTime:f,hasJsCssVariables:g}]=a;f>Date.now()&&(c+=`window.kameleoonQueue.push(['Experiments.assignVariation',${b},${d},true]);`,c+=`window.kameleoonQueue.push(['Experiments.trigger',${b},${!g}]);`,e[+b]={variationId:d,expirationTime:f,hasJsCssVariables:g})}),a.add({key:b,data:e,lifetime:_constants.CACHE_ITEM_LIFETIME}),c}static compareSemVer(a){let{version:b,compareVersion:c,operator:d}=a;const e=_validator.Validator.validateVersion(b),f=_validator.Validator.validateVersion(c);if(!e.ok)return(0,_tsRes.Err)(e.error);if(!f.ok)return(0,_tsRes.Err)(f.error);const[g,h,i]=e.data,[j,k,l]=f.data,[m,n,o]=[g===j,h===k,i===l];switch(d){case _targeting.VersionMatchType.EQUAL:return(0,_tsRes.Ok)(m&&n&&o);case _targeting.VersionMatchType.GREATER:return(0,_tsRes.Ok)(g>j||m&&h>k||m&&n&&i>l);case _targeting.VersionMatchType.LOWER:return(0,_tsRes.Ok)(g<j||m&&h<k||m&&n&&i<l);default:(0,_kameleoonError.exhaustCheck)(d)}}}exports.Utilities=Utilities;
|
|
2
2
|
//# sourceMappingURL=utilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","names":["Utilities","checkTargeting","a","segment","visitorCode","targetingData","experimentId","variationConfiguration","clientConfiguration","packageInfo","dataManager","conditionsData","firstLevel","length","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getStoredVariations","ok","data","targetingTree","getTree","trees","segments","ruleMap","hasTargetingType","TargetingType","SEGMENT","TARGET_FEATURE_FLAG","result","evaluate","variationData","sdkInfo","validateVisitorCode","VisitorCodeEmpty","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","updateUrl","url","shouldSendConversionData","type","KameleoonData","Conversion","isConsentProvided","nonce","UrlParameter","Nonce","getNonce","resultUrl","push","unsentData","getUnsentData","size","item","values","Array","isArray","forEach","arrayItem","join","getVariationDataUrlAndSentExperimentIds","variationDataUrlList","sentExperimentIds","Set","isTargetedRule","UrlEventType","Experiment","Id","VariationId","variationId","add","variationDataUrl","experimentIds","from","trackFeatureExperiment","featureFlagVariation","requester","isOfflineModeOn","offlineTrackingStorage","rule","userAgent","getUserAgent","dataUrl","parameters","isUnallocated","trackExperiment","clearUnsentData","clearUnsentDataByKey","markUnsentDataAsSent","addItemToOfflineTracking","storage","isExperiment","convertTimeUnit","time","timeUnit","timeMap","TimeUnit","Minute","Milliseconds","Hour","Day","Week","Month","parseFeatureVariable","variable","key","value","VariableType","BOOLEAN","STRING","NUMBER","numberValue","Number","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","parseVisitorData","filters","visitProcessor","VisitProcessor","currentVisit","previousVisits","kcs","visits","visitorData","storageVisitorData","visit","processVisit","processKcs","processMultipleDataTypes","visitsData","experimentData","updateStoredVariations","parseRegExp","_","expression","flags","split","RegExp","getTargetingData","userAgentData","UserAgent","isCustomData","dataItem","CustomData","insertInOrderedListMutably","list","element","order","includes","index","findIndex","Order","Ascending","splice","updateCache","cacheManager","cacheData","getAliveItem","newCacheData","_objectSpread","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Second","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","Object","entries","concat","trackData","isMappingIdentifier","body","cleanup","onSuccess","sendOfflineTracking","i","NONCE_LENGTH","b","c","randomNumber","prng","getRandomNumber","Math","random","randomIndex","floor","HEX_CHARACTERS","charAt","compareSemVer","version","compareVersion","operator","versionResult","validateVersion","compareVersionResult","error","major","minor","patch","compareMajor","compareMinor","comparePatch","isMajorEqual","isMinorEqual","isPatchEqual","VersionMatchType","EQUAL","GREATER","LOWER","generateRandomString","characters","randomCharacterArray","readResult","read","requestParameters","successfulTimestamps","timestamp","params","_objectWithoutProperties","_excluded","deleteFromOfflineTracking","timestamps","newItem","getTime","newRequestParameters","writeResult","write","newParameters","filter","versionParts","map","x","parseInt","some","SemanticVersionParse","slice","exports","_defineProperty"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from 'src/kameleoonError';\nimport {\n FeatureVariableResultType,\n Milliseconds,\n TrackingCacheItemType,\n VariableType,\n} from 'src/types';\nimport { FeatureVariableType, JSONType } from 'src/clientConfiguration';\nimport {\n CustomData,\n DataManager,\n KameleoonData,\n KameleoonDataType,\n} from 'src/kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from 'src/constants';\nimport { CacheManager } from 'src/cacheManager';\nimport {\n TrackExperimentParamsType,\n TrackDataParamsType,\n VisitType,\n UrlParameter,\n UrlEventType,\n} from 'src/requester';\nimport { VersionMatchType, TargetingType } from 'src/targeting';\nimport { FeatureFlagVariationsType } from 'src/storage/types';\nimport { VisitProcessor } from 'src/kameleoonData/visitProcessor';\nimport {\n VISITOR_CODE_MAX_LENGTH,\n HEX_CHARACTERS,\n NONCE_LENGTH,\n} from './constants';\nimport {\n CheckTargetingParametersType,\n ManageCacheParametersType,\n TrackDataParametersType,\n TrackRuleParametersType,\n AddToOfflineTrackingParametersType,\n SendOfflineTrackingParametersType,\n DeleteFromOfflineTrackingParametersType,\n ParseVisitorDataParametersType,\n InsertInOrderedListParametersType,\n Order,\n TimeUnit,\n GetDataUrlParametersType,\n GetVariationDataUrlParametersType,\n ParseVisitorDataResultType,\n IExternalPRNG,\n} from './types';\n\nexport class Utilities {\n static prng: IExternalPRNG | undefined;\n\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n clientConfiguration,\n packageInfo,\n dataManager,\n }: CheckTargetingParametersType): Result<boolean, KameleoonError> {\n if (!segment || !segment.conditionsData.firstLevel.length) {\n return Ok(true);\n }\n\n if (!variationConfiguration) {\n return Err(new KameleoonError(KameleoonException.Initialization));\n }\n\n let variations: FeatureFlagVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getStoredVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = dataManager.getTree(segment);\n\n let trees = undefined;\n let segments = undefined;\n let ruleMap = undefined;\n\n // --- Note ---\n // Only getting trees and segments targeting type\n if (targetingTree.hasTargetingType(TargetingType.SEGMENT)) {\n trees = dataManager.trees;\n segments = clientConfiguration.segments;\n }\n\n // --- Note ---\n // Only constructing rule map for targeting type\n if (targetingTree.hasTargetingType(TargetingType.TARGET_FEATURE_FLAG)) {\n ruleMap = clientConfiguration.ruleMap;\n }\n\n const result = targetingTree.evaluate({\n variationData: variations,\n sdkInfo: packageInfo,\n segments,\n ruleMap,\n trees,\n targetingData,\n experimentId,\n visitorCode,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\n if (visitorCode.length === 0) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeEmpty));\n }\n\n if (visitorCode.length > VISITOR_CODE_MAX_LENGTH) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeMaxLength));\n }\n\n return Ok();\n }\n\n static getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n }: GetDataUrlParametersType): string {\n const unsentData = dataManager.getUnsentData(visitorCode);\n const resultUrl: string[] = [];\n\n if (!unsentData || !unsentData.size) {\n return '';\n }\n\n function updateUrl(data: KameleoonDataType): void {\n if (!data.url) {\n return;\n }\n\n const shouldSendAllData = isConsentProvided;\n const shouldSendConversionData =\n data.data.type === KameleoonData.Conversion;\n\n if (shouldSendAllData || shouldSendConversionData) {\n const nonce = !shouldSendConversionData\n ? UrlParameter.Nonce + Utilities.getNonce()\n : '';\n resultUrl.push(data.url + nonce + '\\n');\n }\n }\n\n for (const item of unsentData.values()) {\n if (Array.isArray(item)) {\n item.forEach((arrayItem) => updateUrl(arrayItem));\n } else {\n updateUrl(item);\n }\n }\n\n return resultUrl.join('');\n }\n\n static getVariationDataUrlAndSentExperimentIds({\n visitorCode,\n isConsentProvided,\n variationConfiguration,\n }: GetVariationDataUrlParametersType): [string, string[]] {\n const variationDataUrlList: string[] = [];\n const sentExperimentIds = new Set<string>();\n const unsentData = variationConfiguration.getUnsentData(visitorCode);\n\n if (unsentData.ok && unsentData.data.length) {\n unsentData.data.forEach((item) => {\n if (item.isTargetedRule || isConsentProvided) {\n variationDataUrlList.push(\n UrlEventType.Experiment +\n UrlParameter.Id +\n item.experimentId +\n UrlParameter.VariationId +\n item.variationId +\n UrlParameter.Nonce +\n Utilities.getNonce() +\n '\\n',\n );\n\n sentExperimentIds.add(String(item.experimentId));\n }\n });\n }\n\n const variationDataUrl = variationDataUrlList.join('');\n const experimentIds = Array.from(sentExperimentIds);\n\n return [variationDataUrl, experimentIds];\n }\n\n static async trackFeatureExperiment({\n featureFlagVariation,\n dataManager,\n visitorCode,\n requester,\n isOfflineModeOn,\n isConsentProvided,\n offlineTrackingStorage,\n variationConfiguration,\n }: TrackRuleParametersType): Promise<void> {\n const { variationId, rule } = featureFlagVariation;\n\n const userAgent = this.getUserAgent(visitorCode, dataManager);\n\n const dataUrl = this.getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n });\n\n const resultVariationId = variationId || 0;\n\n // --- Note ---\n // Experiment id is not needed for unallocated visitors\n // So we just use 0 as a fallback\n const experimentId = rule ? rule.experimentId : 0;\n\n const [variationDataUrl, sentExperimentIds] =\n this.getVariationDataUrlAndSentExperimentIds({\n visitorCode,\n isConsentProvided,\n variationConfiguration,\n });\n\n if (!isConsentProvided && !dataUrl && !rule) {\n return;\n }\n\n const isUnallocated = variationId === null;\n\n const parameters = {\n visitorCode,\n dataUrl,\n variationDataUrl,\n experimentId,\n variationId: resultVariationId,\n userAgent,\n isUnallocated,\n };\n\n const result = await requester.trackExperiment(parameters);\n\n if (result.ok) {\n if (!isConsentProvided) {\n dataManager.clearUnsentDataByKey(visitorCode, KameleoonData.Conversion);\n } else {\n dataManager.clearUnsentData(visitorCode);\n }\n\n sentExperimentIds.forEach((experimentId) => {\n variationConfiguration.markUnsentDataAsSent(visitorCode, experimentId);\n });\n }\n\n if (!result.ok && isOfflineModeOn) {\n this.addItemToOfflineTracking({\n item: parameters,\n storage: offlineTrackingStorage,\n isExperiment: true,\n });\n }\n }\n\n static convertTimeUnit(time: number, timeUnit: TimeUnit): number {\n const timeMap = {\n [TimeUnit.Minute]: Milliseconds.Minute,\n [TimeUnit.Hour]: Milliseconds.Hour,\n [TimeUnit.Day]: Milliseconds.Day,\n [TimeUnit.Week]: Milliseconds.Week,\n [TimeUnit.Month]: Milliseconds.Month,\n };\n\n return time / timeMap[timeUnit];\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { key, type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n key,\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\n key,\n type,\n value: String(value),\n });\n case VariableType.NUMBER:\n const numberValue = Number(value);\n\n if (Number.isNaN(numberValue)) {\n return Err(\n new KameleoonError(KameleoonException.NumberParse, String(value)),\n );\n }\n\n return Ok({\n key,\n type,\n value: numberValue,\n });\n case VariableType.JSON:\n try {\n const jsonValue: JSONType = JSON.parse(String(variable.value));\n\n return Ok({\n key,\n type,\n value: jsonValue,\n });\n } catch (err) {\n return Err(new KameleoonError(KameleoonException.JSONParse, err));\n }\n default:\n exhaustCheck(type);\n }\n }\n\n static parseVisitorData({\n data,\n filters,\n visitorCode,\n dataManager,\n variationConfiguration,\n }: ParseVisitorDataParametersType): ParseVisitorDataResultType {\n const visitProcessor = new VisitProcessor(filters, dataManager);\n const { currentVisit, previousVisits, kcs } = data;\n\n let visits: VisitType[] = [];\n\n if (currentVisit) {\n visits.push(currentVisit);\n }\n\n if (previousVisits) {\n visits.push(...previousVisits);\n }\n\n if (!visits.length) {\n return { visitorData: [], storageVisitorData: [] };\n }\n\n visits.forEach((visit) => {\n visitProcessor.processVisit(visit);\n });\n\n visitProcessor.processKcs(kcs);\n visitProcessor.processMultipleDataTypes();\n\n const { visitorData, storageVisitorData, visitsData, experimentData } =\n visitProcessor.data;\n\n variationConfiguration.updateStoredVariations(visitorCode, experimentData);\n\n return {\n visitorData,\n storageVisitorData,\n visitsData,\n };\n }\n\n static parseRegExp(value: string): RegExp {\n if (value[0] === '/') {\n const [_, expression, flags] = value.split('/');\n\n return new RegExp(expression, flags);\n }\n\n return new RegExp(value);\n }\n\n static getUserAgent(\n visitorCode: string,\n dataManager: DataManager,\n ): string | undefined {\n const targetingData = dataManager.getTargetingData(visitorCode);\n\n if (targetingData) {\n const userAgentData = targetingData[KameleoonData.UserAgent];\n\n if (userAgentData) {\n return userAgentData.value;\n }\n }\n\n return undefined;\n }\n\n static isCustomData(dataItem: KameleoonDataType): dataItem is CustomData {\n return dataItem.data.type === KameleoonData.CustomData;\n }\n\n /**\n * Insert element in ordered list, if element already exists in list, does nothing\n * @param list - list to insert element\n * @param element - element to insert\n * @param order - order of list\n */\n static insertInOrderedListMutably({\n list,\n element,\n order,\n }: InsertInOrderedListParametersType): void {\n if (list.includes(element)) {\n return;\n }\n\n const index = list.findIndex((item) =>\n order === Order.Ascending ? item >= element : item <= element,\n );\n\n if (index === -1) {\n list.push(element);\n } else {\n list.splice(index, 0, element);\n }\n }\n\n static updateCache({\n cacheManager,\n visitorCode,\n experimentId,\n variationId,\n }: ManageCacheParametersType): void {\n const cacheData = cacheManager.getAliveItem(visitorCode);\n\n const newCacheData = cacheData ? { ...cacheData } : {};\n\n newCacheData[experimentId] = {\n variationId,\n expirationTime: Date.now() + CACHE_ITEM_LIFETIME * Milliseconds.Second,\n };\n\n cacheManager.add({\n key: visitorCode,\n data: newCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n }\n\n static getTrackingCode(\n trackingCache: CacheManager<TrackingCacheItemType>,\n visitorCode: string,\n ): string {\n let resultString = 'window.kameleoonQueue=window.kameleoonQueue||[];';\n\n const cacheData = trackingCache.getAliveItem(visitorCode);\n\n if (!cacheData) {\n return resultString;\n }\n\n const updatedCacheData: TrackingCacheItemType = {};\n\n Object.entries(cacheData).forEach(\n ([experimentId, { variationId, expirationTime }]) => {\n if (expirationTime > Date.now()) {\n resultString += `window.kameleoonQueue.push(['Experiments.assignVariation',${experimentId},${variationId},true]);`;\n resultString += `window.kameleoonQueue.push(['Experiments.trigger',${experimentId},true]);`;\n\n updatedCacheData[Number(experimentId)] = {\n variationId,\n expirationTime,\n };\n }\n },\n );\n\n // --- Note ---\n // Cache is updated with only alive experiments\n trackingCache.add({\n key: visitorCode,\n data: updatedCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n\n return resultString;\n }\n\n static async trackData({\n visitorCode,\n dataManager,\n requester,\n isOfflineModeOn,\n offlineTrackingStorage,\n isConsentProvided,\n isMappingIdentifier,\n }: TrackDataParametersType): Promise<void> {\n const dataUrl = this.getDataUrl({\n visitorCode,\n dataManager,\n isConsentProvided,\n });\n\n if (!isConsentProvided && !dataUrl) {\n return;\n }\n\n const userAgent = this.getUserAgent(visitorCode, dataManager);\n\n const parameters: TrackDataParamsType = {\n visitorCode,\n body: dataUrl,\n userAgent,\n isMappingIdentifier,\n };\n\n const result = await requester.trackData(parameters);\n\n const cleanup = () =>\n isConsentProvided\n ? dataManager.clearUnsentData(visitorCode)\n : dataManager.clearUnsentDataByKey(\n visitorCode,\n KameleoonData.Conversion,\n );\n\n if (result.ok) {\n cleanup();\n }\n\n if (!result.ok && isOfflineModeOn) {\n this.addItemToOfflineTracking({\n item: parameters,\n storage: offlineTrackingStorage,\n isExperiment: false,\n onSuccess: cleanup,\n });\n }\n\n await this.sendOfflineTracking({\n requester,\n storage: offlineTrackingStorage,\n });\n }\n\n static getNonce(): string {\n let nonce: string = '';\n\n for (let i = 0; i < NONCE_LENGTH; i++) {\n const randomNumber = this.prng?.getRandomNumber() ?? Math.random();\n const randomIndex = Math.floor(randomNumber * NONCE_LENGTH);\n nonce += HEX_CHARACTERS.charAt(randomIndex);\n }\n\n return nonce;\n }\n\n static compareSemVer({\n version,\n compareVersion,\n operator,\n }: {\n version: string;\n compareVersion: string;\n operator: VersionMatchType;\n }): Result<boolean, KameleoonError> {\n const versionResult = this.validateVersion(version);\n const compareVersionResult = this.validateVersion(compareVersion);\n\n if (!versionResult.ok) {\n return Err(versionResult.error);\n }\n\n if (!compareVersionResult.ok) {\n return Err(compareVersionResult.error);\n }\n\n const [major, minor, patch] = versionResult.data;\n const [compareMajor, compareMinor, comparePatch] =\n compareVersionResult.data;\n\n const [isMajorEqual, isMinorEqual, isPatchEqual] = [\n major === compareMajor,\n minor === compareMinor,\n patch === comparePatch,\n ];\n\n switch (operator) {\n case VersionMatchType.EQUAL:\n return Ok(isMajorEqual && isMinorEqual && isPatchEqual);\n case VersionMatchType.GREATER:\n return Ok(\n major > compareMajor ||\n (isMajorEqual && minor > compareMinor) ||\n (isMajorEqual && isMinorEqual && patch > comparePatch),\n );\n case VersionMatchType.LOWER:\n return Ok(\n major < compareMajor ||\n (isMajorEqual && minor < compareMinor) ||\n (isMajorEqual && isMinorEqual && patch < comparePatch),\n );\n default:\n exhaustCheck(operator);\n }\n }\n\n static generateRandomString(length: number): string {\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const randomCharacterArray: string[] = [];\n\n if (length < 0) {\n return '';\n }\n\n for (let i = 0; i < length; i++) {\n randomCharacterArray.push(\n characters[Math.floor(Math.random() * characters.length)],\n );\n }\n\n return randomCharacterArray.join('');\n }\n\n static async sendOfflineTracking({\n requester,\n storage,\n }: SendOfflineTrackingParametersType) {\n const readResult = storage.read();\n\n if (readResult.ok && readResult.data.requestParameters) {\n const { requestParameters } = readResult.data;\n const successfulTimestamps: number[] = [];\n\n // --- Note ---\n // `for..of` + `await` is used to make sure that failed requests are sent one by one\n // without risk of getting the same timestamp at the server, which might happen, for example,\n // with `.forEach` or `.map` starting requests in async callbacks at the same time\n for (const parameters of requestParameters) {\n const { timestamp, isExperiment, ...params } = parameters;\n let result: Result<boolean, void>;\n\n if (isExperiment) {\n result = await requester.trackExperiment(\n params as TrackExperimentParamsType,\n );\n } else {\n result = await requester.trackData(params as TrackDataParamsType);\n }\n\n result.ok && result.data && successfulTimestamps.push(timestamp);\n }\n\n this.deleteFromOfflineTracking({\n storage,\n timestamps: successfulTimestamps,\n });\n }\n }\n\n private static addItemToOfflineTracking({\n item,\n isExperiment,\n storage,\n onSuccess,\n }: AddToOfflineTrackingParametersType): void {\n const readResult = storage.read();\n\n const data = readResult.ok ? readResult.data : {};\n\n const { requestParameters } = data;\n\n const newItem = {\n ...item,\n timestamp: new Date().getTime(),\n isExperiment,\n };\n\n const newRequestParameters = requestParameters\n ? [...requestParameters, newItem]\n : [newItem];\n\n const writeResult = storage.write({\n requestParameters: newRequestParameters,\n });\n\n if (writeResult.ok && onSuccess) {\n onSuccess();\n }\n }\n\n private static deleteFromOfflineTracking({\n timestamps,\n storage,\n }: DeleteFromOfflineTrackingParametersType): void {\n const readResult = storage.read();\n\n if (readResult.ok) {\n const { requestParameters } = readResult.data;\n\n const newParameters = requestParameters?.filter(\n (item) => !timestamps.includes(item.timestamp),\n );\n\n storage.write({ requestParameters: newParameters });\n }\n }\n\n private static validateVersion(\n version: string,\n ): Result<[number, number, number], KameleoonError> {\n const versionParts = version.split('.').map((x) => parseInt(x, 10));\n\n while (versionParts.length < 3) {\n versionParts.push(0);\n }\n\n if (versionParts.some((item) => isNaN(item))) {\n return Err(\n new KameleoonError(KameleoonException.SemanticVersionParse, version),\n );\n }\n\n return Ok(versionParts.slice(0, 3) as [number, number, number]);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utilities.js","names":["Utilities","getNonce","prng","nonce","i","NONCE_LENGTH","randomNumber","getRandomNumber","randomIndex","Math","floor","HEX_CHARACTERS","charAt","checkTargeting","a","segment","visitorCode","targetingData","experimentId","variationConfiguration","clientConfiguration","packageInfo","dataManager","conditionsData","firstLevel","length","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getStoredVariations","ok","data","targetingTree","getTree","trees","ruleMap","segments","hasTargetingType","TargetingType","SEGMENT","TARGET_FEATURE_FLAG","result","evaluate","variationData","sdkInfo","convertTimeUnit","time","timeUnit","timeMap","TimeUnit","Minute","Milliseconds","Hour","Day","Week","Month","isCustomData","dataItem","type","KameleoonData","CustomData","insertInOrderedListMutably","list","element","order","includes","index","findIndex","item","Order","Ascending","push","splice","updateCache","hasJsCssVariables","cacheManager","variationId","cacheData","getAliveItem","newCacheData","_objectSpread","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Second","add","key","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","Object","entries","forEach","compareSemVer","version","compareVersion","operator","versionResult","Validator","validateVersion","compareVersionResult","error","major","minor","patch","compareMajor","compareMinor","comparePatch","isMajorEqual","isMinorEqual","isPatchEqual","VersionMatchType","EQUAL","GREATER","LOWER","exhaustCheck","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from 'src/kameleoonError';\nimport { Milliseconds, TrackingCacheItemType } from 'src/types';\nimport {\n CustomData,\n KameleoonData,\n KameleoonDataType,\n} from 'src/kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from 'src/constants';\nimport { CacheManager } from 'src/cacheManager';\nimport { VersionMatchType, TargetingType } from 'src/targeting';\nimport { FeatureFlagVariationsType } from 'src/storage/types';\nimport {\n CheckTargetingParametersType,\n ManageCacheParametersType,\n InsertInOrderedListParametersType,\n Order,\n TimeUnit,\n IExternalPRNG,\n} from './types';\nimport { HEX_CHARACTERS, NONCE_LENGTH } from './constants';\nimport { Validator } from './validator';\n\nexport class Utilities {\n static getNonce(prng: IExternalPRNG): string {\n let nonce: string = '';\n\n for (let i = 0; i < NONCE_LENGTH; i++) {\n const randomNumber = prng.getRandomNumber();\n const randomIndex = Math.floor(randomNumber * NONCE_LENGTH);\n nonce += HEX_CHARACTERS.charAt(randomIndex);\n }\n\n return nonce;\n }\n\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n clientConfiguration,\n packageInfo,\n dataManager,\n }: CheckTargetingParametersType): Result<boolean, KameleoonError> {\n if (!segment || !segment.conditionsData.firstLevel.length) {\n return Ok(true);\n }\n\n if (!variationConfiguration) {\n return Err(new KameleoonError(KameleoonException.Initialization));\n }\n\n let variations: FeatureFlagVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getStoredVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = dataManager.getTree(segment);\n\n let trees = undefined;\n let ruleMap = undefined;\n let segments = undefined;\n\n // --- Note ---\n // Only getting trees and segments targeting type\n if (targetingTree.hasTargetingType(TargetingType.SEGMENT)) {\n trees = dataManager.trees;\n segments = clientConfiguration.segments;\n }\n\n // --- Note ---\n // Only constructing rule map for targeting type\n if (targetingTree.hasTargetingType(TargetingType.TARGET_FEATURE_FLAG)) {\n ruleMap = clientConfiguration.ruleMap;\n }\n\n const result = targetingTree.evaluate({\n variationData: variations,\n sdkInfo: packageInfo,\n segments,\n ruleMap,\n trees,\n targetingData,\n experimentId,\n visitorCode,\n });\n\n return result;\n }\n\n static convertTimeUnit(time: number, timeUnit: TimeUnit): number {\n const timeMap = {\n [TimeUnit.Minute]: Milliseconds.Minute,\n [TimeUnit.Hour]: Milliseconds.Hour,\n [TimeUnit.Day]: Milliseconds.Day,\n [TimeUnit.Week]: Milliseconds.Week,\n [TimeUnit.Month]: Milliseconds.Month,\n };\n\n return time / timeMap[timeUnit];\n }\n\n static isCustomData(dataItem: KameleoonDataType): dataItem is CustomData {\n return dataItem.data.type === KameleoonData.CustomData;\n }\n\n /**\n * Insert element in ordered list, if element already exists in list, does nothing\n * @param list - list to insert element\n * @param element - element to insert\n * @param order - order of list\n */\n static insertInOrderedListMutably({\n list,\n element,\n order,\n }: InsertInOrderedListParametersType): void {\n if (list.includes(element)) {\n return;\n }\n\n const index = list.findIndex((item) =>\n order === Order.Ascending ? item >= element : item <= element,\n );\n\n if (index === -1) {\n list.push(element);\n } else {\n list.splice(index, 0, element);\n }\n }\n\n static updateCache({\n hasJsCssVariables,\n cacheManager,\n visitorCode,\n experimentId,\n variationId,\n }: ManageCacheParametersType): void {\n const cacheData = cacheManager.getAliveItem(visitorCode);\n\n const newCacheData = cacheData ? { ...cacheData } : {};\n\n newCacheData[experimentId] = {\n variationId,\n hasJsCssVariables,\n expirationTime: Date.now() + CACHE_ITEM_LIFETIME * Milliseconds.Second,\n };\n\n cacheManager.add({\n key: visitorCode,\n data: newCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n }\n\n static getTrackingCode(\n trackingCache: CacheManager<TrackingCacheItemType>,\n visitorCode: string,\n ): string {\n let resultString = 'window.kameleoonQueue=window.kameleoonQueue||[];';\n\n const cacheData = trackingCache.getAliveItem(visitorCode);\n\n if (!cacheData) {\n return resultString;\n }\n\n const updatedCacheData: TrackingCacheItemType = {};\n\n Object.entries(cacheData).forEach(\n ([experimentId, { variationId, expirationTime, hasJsCssVariables }]) => {\n const flag = !hasJsCssVariables;\n\n if (expirationTime > Date.now()) {\n resultString += `window.kameleoonQueue.push(['Experiments.assignVariation',${experimentId},${variationId},true]);`;\n resultString += `window.kameleoonQueue.push(['Experiments.trigger',${experimentId},${flag}]);`;\n\n updatedCacheData[Number(experimentId)] = {\n variationId,\n expirationTime,\n hasJsCssVariables,\n };\n }\n },\n );\n\n // --- Note ---\n // Cache is updated with only alive experiments\n trackingCache.add({\n key: visitorCode,\n data: updatedCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n\n return resultString;\n }\n\n static compareSemVer({\n version,\n compareVersion,\n operator,\n }: {\n version: string;\n compareVersion: string;\n operator: VersionMatchType;\n }): Result<boolean, KameleoonError> {\n const versionResult = Validator.validateVersion(version);\n const compareVersionResult = Validator.validateVersion(compareVersion);\n\n if (!versionResult.ok) {\n return Err(versionResult.error);\n }\n\n if (!compareVersionResult.ok) {\n return Err(compareVersionResult.error);\n }\n\n const [major, minor, patch] = versionResult.data;\n const [compareMajor, compareMinor, comparePatch] =\n compareVersionResult.data;\n\n const [isMajorEqual, isMinorEqual, isPatchEqual] = [\n major === compareMajor,\n minor === compareMinor,\n patch === comparePatch,\n ];\n\n switch (operator) {\n case VersionMatchType.EQUAL:\n return Ok(isMajorEqual && isMinorEqual && isPatchEqual);\n case VersionMatchType.GREATER:\n return Ok(\n major > compareMajor ||\n (isMajorEqual && minor > compareMinor) ||\n (isMajorEqual && isMinorEqual && patch > comparePatch),\n );\n case VersionMatchType.LOWER:\n return Ok(\n major < compareMajor ||\n (isMajorEqual && minor < compareMinor) ||\n (isMajorEqual && isMinorEqual && patch < comparePatch),\n );\n default:\n exhaustCheck(operator);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Validator=void 0;var _tsRes=require("ts-res"),_kameleoonError=require("../kameleoonError");class Validator{static validateVersion(a){const b=a.split(".").map(a=>parseInt(a,10));for(;3>b.length;)b.push(0);return b.some(a=>isNaN(a))?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.SemanticVersionParse,a)):(0,_tsRes.Ok)(b.slice(0,3))}}exports.Validator=Validator;
|
|
2
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","names":["Validator","validateVersion","version","versionParts","split","map","x","parseInt","length","push","some","item","isNaN","Err","KameleoonError","KameleoonException","SemanticVersionParse","Ok","slice","exports"],"sources":["../../src/utilities/validator.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { KameleoonError, KameleoonException } from 'src/kameleoonError';\n\nexport class Validator {\n static validateVersion(\n version: string,\n ): Result<[number, number, number], KameleoonError> {\n const versionParts = version.split('.').map((x) => parseInt(x, 10));\n\n while (versionParts.length < 3) {\n versionParts.push(0);\n }\n\n if (versionParts.some((item) => isNaN(item))) {\n return Err(\n new KameleoonError(KameleoonException.SemanticVersionParse, version),\n );\n }\n\n return Ok(versionParts.slice(0, 3) as [number, number, number]);\n }\n}\n"],"mappings":"uKAGO,KAAM,CAAAA,SAAU,CACrB,MAAO,CAAAC,eAAeA,CACpBC,CAAe,CACmC,CAClD,KAAM,CAAAC,CAAY,CAAGD,CAAO,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAEC,CAAC,EAAKC,QAAQ,CAACD,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,KAEvC,CAAC,CAAvBH,CAAY,CAACK,MAAU,EAC5BL,CAAY,CAACM,IAAI,CAAC,CAAC,CAAC,CAAC,MAGnB,CAAAN,CAAY,CAACO,IAAI,CAAEC,CAAI,EAAKC,KAAK,CAACD,CAAI,CAAC,CAAC,CACnC,GAAAE,UAAG,EACR,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACC,oBAAoB,CAAEd,CAAO,CACrE,CAAC,CAGI,GAAAe,SAAE,EAACd,CAAY,CAACe,KAAK,CAAC,CAAC,CAAE,CAAC,CAA6B,CAChE,CACF,CAACC,OAAA,CAAAnB,SAAA,CAAAA,SAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/variationConfiguration/index.ts"],"sourcesContent":["export { VariationConfiguration } from './variationConfiguration';\nexport { FeatureFlagVariationType } from './types';\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/variationConfiguration/index.ts"],"sourcesContent":["export { VariationConfiguration } from './variationConfiguration';\nexport { FeatureFlagVariationType } from './types';\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { ClientConfiguration, FeatureFlagType, RuleItemType } from '../clientConfiguration';
|
|
2
2
|
import { DataManager } from '../kameleoonData';
|
|
3
3
|
import { KameleoonVisitorDataType } from '../kameleoonData/types';
|
|
4
|
-
import { ExternalPackageInfoType } from '../types';
|
|
4
|
+
import { ExternalPackageInfoType, TrackingStatus } from '../types';
|
|
5
|
+
export type UpdateDataStatusParametersType = {
|
|
6
|
+
visitorCode: string;
|
|
7
|
+
experimentIdList: string[];
|
|
8
|
+
status: TrackingStatus;
|
|
9
|
+
};
|
|
5
10
|
export type FeatureFlagVariationType = {
|
|
6
11
|
variationKey: string;
|
|
7
12
|
variationId: number | null;
|
|
@@ -21,7 +26,7 @@ export type GetVariationParametersType = {
|
|
|
21
26
|
clientConfiguration: ClientConfiguration;
|
|
22
27
|
dataManager: DataManager;
|
|
23
28
|
};
|
|
24
|
-
export type
|
|
29
|
+
export type BaseVariationDataType = {
|
|
25
30
|
experimentId: number;
|
|
26
31
|
variationId: number;
|
|
27
32
|
isTargetedRule: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../src/variationConfiguration/types.ts"],"sourcesContent":["import {\n ClientConfiguration,\n FeatureFlagType,\n RuleItemType,\n} from 'src/clientConfiguration';\nimport { DataManager } from 'src/kameleoonData';\nimport { KameleoonVisitorDataType } from 'src/kameleoonData/types';\nimport { ExternalPackageInfoType } from 'src/types';\n\nexport type FeatureFlagVariationType = {\n variationKey: string;\n variationId: number | null;\n experimentId: number | null;\n featureFlagId: number;\n featureKey: string;\n rule: RuleItemType | null;\n isTargetedRule: boolean;\n};\n\nexport type GetVariationParametersType = {\n visitorCode: string;\n visitorIdentifier: string;\n featureFlag: FeatureFlagType;\n targetingData?: KameleoonVisitorDataType;\n withAssignment?: boolean;\n packageInfo: ExternalPackageInfoType;\n clientConfiguration: ClientConfiguration;\n dataManager: DataManager;\n};\n\nexport type
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/variationConfiguration/types.ts"],"sourcesContent":["import {\n ClientConfiguration,\n FeatureFlagType,\n RuleItemType,\n} from 'src/clientConfiguration';\nimport { DataManager } from 'src/kameleoonData';\nimport { KameleoonVisitorDataType } from 'src/kameleoonData/types';\nimport { ExternalPackageInfoType, TrackingStatus } from 'src/types';\n\nexport type UpdateDataStatusParametersType = {\n visitorCode: string;\n experimentIdList: string[];\n status: TrackingStatus;\n};\n\nexport type FeatureFlagVariationType = {\n variationKey: string;\n variationId: number | null;\n experimentId: number | null;\n featureFlagId: number;\n featureKey: string;\n rule: RuleItemType | null;\n isTargetedRule: boolean;\n};\n\nexport type GetVariationParametersType = {\n visitorCode: string;\n visitorIdentifier: string;\n featureFlag: FeatureFlagType;\n targetingData?: KameleoonVisitorDataType;\n withAssignment?: boolean;\n packageInfo: ExternalPackageInfoType;\n clientConfiguration: ClientConfiguration;\n dataManager: DataManager;\n};\n\nexport type BaseVariationDataType = {\n experimentId: number;\n variationId: number;\n isTargetedRule: boolean;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Result } from 'ts-res';
|
|
2
2
|
import { KameleoonError } from '../kameleoonError';
|
|
3
3
|
import { VariationDataType } from '../storage';
|
|
4
|
-
import { FeatureFlagVariationType, GetVariationParametersType,
|
|
4
|
+
import { BaseVariationDataType, FeatureFlagVariationType, GetVariationParametersType, UpdateDataStatusParametersType } from './types';
|
|
5
5
|
import { FeatureFlagVariationsType, IStorage } from '../storage/types';
|
|
6
|
+
import { IVisitorCodeManager } from '../visitorCodeManager';
|
|
6
7
|
interface IVariationConfiguration {
|
|
7
8
|
/**
|
|
8
9
|
* @method getStoredVariations - obtains campaigns with according variations that are *already assigned* and *stored* in the `variationStorage`.
|
|
@@ -19,19 +20,26 @@ interface IVariationConfiguration {
|
|
|
19
20
|
/**
|
|
20
21
|
* @method getUnsentData - obtains the list of unsent variations
|
|
21
22
|
*/
|
|
22
|
-
getUnsentData: (visitorCode: string) =>
|
|
23
|
+
getUnsentData: (visitorCode: string) => BaseVariationDataType[];
|
|
23
24
|
/**
|
|
24
|
-
* @method
|
|
25
|
+
* @method getPendingData - obtains the list of pending variations
|
|
25
26
|
*/
|
|
26
|
-
|
|
27
|
+
getPendingData: (visitorCode: string) => BaseVariationDataType[];
|
|
28
|
+
/**
|
|
29
|
+
* @method updateDataStatus - updates the status of the variations of given experiment ids with the given status
|
|
30
|
+
*/
|
|
31
|
+
updateDataStatus: ({ visitorCode, experimentIdList, status, }: UpdateDataStatusParametersType) => void;
|
|
27
32
|
}
|
|
28
33
|
export declare class VariationConfiguration implements IVariationConfiguration {
|
|
29
34
|
private storage;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
private visitorCodeManager;
|
|
36
|
+
constructor(externalStorage: IStorage<VariationDataType>, visitorCodeManager: IVisitorCodeManager);
|
|
37
|
+
updateDataStatus({ visitorCode, experimentIdList, status, }: UpdateDataStatusParametersType): Result<void, KameleoonError>;
|
|
38
|
+
getUnsentData(visitorCode: string): BaseVariationDataType[];
|
|
39
|
+
getPendingData(visitorCode: string): BaseVariationDataType[];
|
|
33
40
|
getStoredVariations(visitorCode: string): Result<FeatureFlagVariationsType, KameleoonError>;
|
|
34
41
|
getVariation({ visitorCode, visitorIdentifier, featureFlag, targetingData, packageInfo, clientConfiguration, dataManager, withAssignment, }: GetVariationParametersType): Result<FeatureFlagVariationType, KameleoonError>;
|
|
35
42
|
updateStoredVariations(visitorCode: string, variationData: FeatureFlagVariationsType): Result<void, KameleoonError>;
|
|
43
|
+
private getVariationData;
|
|
36
44
|
}
|
|
37
45
|
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const _excluded=["exposition"];Object.defineProperty(exports,"__esModule",{value:!0}),exports.VariationConfiguration=void 0;var _tsRes=require("ts-res"),_hasher=require("../hasher"),_kameleoonError=require("../kameleoonError"),_utilities=require("../utilities"),_types=require("../clientConfiguration/types");function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],
|
|
1
|
+
"use strict";const _excluded=["exposition"];Object.defineProperty(exports,"__esModule",{value:!0}),exports.VariationConfiguration=void 0;var _tsRes=require("ts-res"),_hasher=require("../hasher"),_kameleoonError=require("../kameleoonError"),_utilities=require("../utilities"),_types=require("../clientConfiguration/types"),_types2=require("../types");function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],b.includes(c)||{}.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c={};for(var d in a)if({}.hasOwnProperty.call(a,d)){if(b.includes(d))continue;c[d]=a[d]}return c}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class VariationConfiguration{constructor(a,b){_defineProperty(this,"storage",void 0),_defineProperty(this,"visitorCodeManager",void 0),this.storage=a,this.visitorCodeManager=b}updateDataStatus(a){let{visitorCode:b,experimentIdList:c,status:d}=a;const e=this.storage.read();if(!e.ok)return e;let f=e.data;f[b]||(f[b]={});for(const e of c)f[b][e]=_objectSpread(_objectSpread({},f[b][e]),{},{status:d});return this.storage.write(f)}getUnsentData(a){return this.getVariationData(a,a=>a===_types2.TrackingStatus.Unsent)}getPendingData(a){return this.getVariationData(a,a=>a===_types2.TrackingStatus.Pending)}getStoredVariations(a){const b=this.storage.read();if(!b.ok)return b;const c=b.data[a];return c?(0,_tsRes.Ok)(c):(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.StorageRead,a))}getVariation(a){let{visitorCode:b,visitorIdentifier:c,featureFlag:d,targetingData:e,packageInfo:f,clientConfiguration:g,dataManager:h,withAssignment:i=!1}=a;const j=this.visitorCodeManager.validateVisitorCode(b);if(!j.ok)return(0,_tsRes.Err)(j.error);const{rules:k,featureKey:l,id:m,defaultVariationKey:n}=d;for(const d of k){const{segment:a,experimentId:j,id:k,exposition:o,respoolTime:p,variationByExposition:q}=d,r=_utilities.Utilities.checkTargeting({segment:a,visitorCode:b,experimentId:j,targetingData:e,packageInfo:f,clientConfiguration:g,dataManager:h,variationConfiguration:this});if(!r.ok)return r;if(!r.data)continue;const s=_hasher.Hasher.getHashDouble({visitorIdentifier:c,respoolTime:p,id:k+""});if(s<=o){let a=0;const e=_hasher.Hasher.getHashDouble({visitorIdentifier:c,respoolTime:p,id:j+""});for(const c of q)if(a+=c.exposition,e<=a){i&&this.updateStoredVariations(b,{[j]:{variationId:c.variationId,isTargetedRule:d.type===_types.RuleType.TARGETED_DELIVERY,status:_types2.TrackingStatus.Unsent}});const{exposition:a}=c,e=_objectWithoutProperties(c,_excluded);return(0,_tsRes.Ok)(_objectSpread(_objectSpread({},e),{},{rule:d,featureFlagId:m,featureKey:l,experimentId:j,isTargetedRule:d.type===_types.RuleType.TARGETED_DELIVERY}))}}if(d.type===_types.RuleType.TARGETED_DELIVERY)return(0,_tsRes.Ok)({featureKey:l,featureFlagId:m,experimentId:null,variationKey:n,variationId:null,rule:null,isTargetedRule:!0})}return(0,_tsRes.Ok)({featureKey:l,featureFlagId:m,experimentId:null,variationKey:n,variationId:null,rule:null,isTargetedRule:!1})}updateStoredVariations(a,b){const c=this.storage.read();if(!c.ok)return c;let d=c.data;return d[a]?d[a]=_objectSpread(_objectSpread({},d[a]),b):d=_objectSpread(_objectSpread({},d),{},{[a]:_objectSpread({},b)}),this.storage.write(d)}getVariationData(a,b){const c=this.getStoredVariations(a);if(!c.ok)return[];const d=[];for(const[e,f]of Object.entries(c.data))b(f.status)&&d.push({experimentId:+e,variationId:f.variationId,isTargetedRule:f.isTargetedRule});return d}}exports.VariationConfiguration=VariationConfiguration;
|
|
2
2
|
//# sourceMappingURL=variationConfiguration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variationConfiguration.js","names":["VariationConfiguration","constructor","externalStorage","_defineProperty","storage","markUnsentDataAsSent","visitorCode","experimentId","result","read","ok","error","type","KameleoonException","StorageParse","updatedVariationData","data","_objectSpread","isSent","write","getUnsentData","featureExperiment","unsentData","variationData","Object","entries","push","variationId","isTargetedRule","Ok","getStoredVariations","featureFlagVariations","Err","KameleoonError","StorageRead","getVariation","a","visitorIdentifier","featureFlag","targetingData","packageInfo","clientConfiguration","dataManager","withAssignment","validateResult","Utilities","validateVisitorCode","rules","featureKey","id","featureFlagId","defaultVariationKey","rule","segment","exposition","respoolTime","variationByExposition","targetingResult","checkTargeting","variationConfiguration","ruleHash","Hasher","getHashDouble","totalDeviation","variationHash","variation","updateStoredVariations","RuleType","TARGETED_DELIVERY","restParameters","_objectWithoutProperties","_excluded","variationKey","exports"],"sources":["../../src/variationConfiguration/variationConfiguration.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { Hasher } from 'src/hasher';\nimport { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport { VariationDataType } from 'src/storage';\nimport { Utilities } from 'src/utilities';\nimport { RuleType } from 'src/clientConfiguration/types';\nimport {\n FeatureFlagVariationType,\n GetVariationParametersType,\n UnsentVariationDataType,\n} from './types';\nimport { FeatureFlagVariationsType, IStorage } from 'src/storage/types';\n\ninterface IVariationConfiguration {\n /**\n * @method getStoredVariations - obtains campaigns with according variations that are *already assigned* and *stored* in the `variationStorage`.\n */\n getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError>;\n /**\n * @method updateStoredVariations - updates stored variations for the visitor\n */\n updateStoredVariations: (\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ) => void;\n /**\n * @method getVariation - obtains variation for the rule of the feature flag which is both targeted and has a variation, if no such rule was found, returns empty rule with default `variationKey`, given an option `withAssignment` of `true` will also assign a new variation and save it in the storage\n */\n getVariation: (\n params: GetVariationParametersType,\n ) => Result<FeatureFlagVariationType, KameleoonError>;\n /**\n * @method getUnsentData - obtains the list of unsent variations\n */\n getUnsentData: (\n visitorCode: string,\n ) => Result<UnsentVariationDataType[], KameleoonError>;\n /**\n * @method markUnsentDataAsSent - marks the passed expriment variation as sent\n */\n markUnsentDataAsSent: (\n visitorCode: string,\n experimentId: string,\n ) => Result<void, KameleoonError>;\n}\n\nexport class VariationConfiguration implements IVariationConfiguration {\n private storage: IStorage<VariationDataType>;\n\n constructor(externalStorage: IStorage<VariationDataType>) {\n this.storage = externalStorage;\n }\n\n public markUnsentDataAsSent(\n visitorCode: string,\n experimentId: string,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n let updatedVariationData: VariationDataType = result.ok ? result.data : {};\n\n if (!updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {};\n }\n\n updatedVariationData[visitorCode][experimentId] = {\n ...updatedVariationData[visitorCode][experimentId],\n isSent: true,\n };\n\n return this.storage.write(updatedVariationData);\n }\n\n public getUnsentData(\n visitorCode: string,\n ): Result<UnsentVariationDataType[], KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n const updatedVariationData: VariationDataType = result.ok\n ? result.data\n : {};\n\n const featureExperiment = updatedVariationData[visitorCode];\n\n const unsentData: UnsentVariationDataType[] = [];\n\n if (featureExperiment) {\n for (const [experimentId, variationData] of Object.entries(\n featureExperiment,\n )) {\n if (!variationData.isSent) {\n unsentData.push({\n experimentId: Number(experimentId),\n variationId: variationData.variationId,\n isTargetedRule: variationData.isTargetedRule,\n });\n }\n }\n }\n\n return Ok(unsentData);\n }\n\n public getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n const featureFlagVariations = result.data[visitorCode];\n\n if (!featureFlagVariations) {\n return Err(\n new KameleoonError(KameleoonException.StorageRead, visitorCode),\n );\n }\n\n return Ok(featureFlagVariations);\n }\n\n public getVariation({\n visitorCode,\n visitorIdentifier,\n featureFlag,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n withAssignment = false,\n }: GetVariationParametersType): Result<\n FeatureFlagVariationType,\n KameleoonError\n > {\n const validateResult = Utilities.validateVisitorCode(visitorCode);\n\n if (!validateResult.ok) {\n return Err(validateResult.error);\n }\n\n const {\n rules,\n featureKey,\n id: featureFlagId,\n defaultVariationKey,\n } = featureFlag;\n\n for (const rule of rules) {\n const {\n segment,\n experimentId,\n id,\n exposition,\n respoolTime,\n variationByExposition,\n } = rule;\n\n // --- Check targeting ---\n const targetingResult = Utilities.checkTargeting({\n segment,\n visitorCode,\n experimentId,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n variationConfiguration: this,\n });\n\n if (!targetingResult.ok) {\n return targetingResult;\n }\n\n if (!targetingResult.data) {\n continue;\n }\n\n // --- Note ---\n // Calculate new variation (and assign it if `withAssignment` is `true`)\n // First the the exposed rule is calculated and then the variation inside of it\n const ruleHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(id),\n });\n\n if (ruleHash <= exposition) {\n let totalDeviation = 0;\n\n const variationHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(experimentId),\n });\n\n for (const variation of variationByExposition) {\n totalDeviation += variation.exposition;\n\n if (variationHash <= totalDeviation) {\n if (withAssignment) {\n this.updateStoredVariations(visitorCode, {\n [experimentId]: {\n variationId: variation.variationId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n isSent: false,\n },\n });\n }\n\n const { exposition, ...restParameters } = variation;\n\n return Ok({\n ...restParameters,\n rule,\n featureFlagId,\n featureKey,\n experimentId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n });\n }\n }\n }\n\n if (rule.type === RuleType.TARGETED_DELIVERY) {\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: true,\n });\n }\n }\n\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: false,\n });\n }\n\n public updateStoredVariations(\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n // --- Note ---\n // If there is a parsing error we return error\n // But if there is `LocalStorageRead` error it means that\n // data was read successfully and it's empty, which is not problem\n // cause that might be initial `read`\n if (result.error.type === KameleoonException.StorageParse) {\n return result;\n }\n }\n\n let updatedVariationData: VariationDataType = result.ok ? result.data : {};\n\n if (updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {\n ...updatedVariationData[visitorCode],\n ...variationData,\n };\n } else {\n updatedVariationData = {\n ...updatedVariationData,\n [visitorCode]: {\n ...variationData,\n },\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"variationConfiguration.js","names":["VariationConfiguration","constructor","externalStorage","visitorCodeManager","_defineProperty","storage","updateDataStatus","a","visitorCode","experimentIdList","status","result","read","ok","updatedVariationData","data","experimentId","_objectSpread","write","getUnsentData","getVariationData","TrackingStatus","Unsent","getPendingData","Pending","getStoredVariations","featureFlagVariations","Ok","Err","KameleoonError","KameleoonException","StorageRead","getVariation","visitorIdentifier","featureFlag","targetingData","packageInfo","clientConfiguration","dataManager","withAssignment","validateResult","validateVisitorCode","error","rules","featureKey","id","featureFlagId","defaultVariationKey","rule","segment","exposition","respoolTime","variationByExposition","targetingResult","Utilities","checkTargeting","variationConfiguration","ruleHash","Hasher","getHashDouble","totalDeviation","variationHash","variation","updateStoredVariations","variationId","isTargetedRule","type","RuleType","TARGETED_DELIVERY","restParameters","_objectWithoutProperties","_excluded","variationKey","variationData","filter","resultData","Object","entries","push","exports"],"sources":["../../src/variationConfiguration/variationConfiguration.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { Hasher } from 'src/hasher';\nimport { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport { VariationDataType } from 'src/storage';\nimport { Utilities } from 'src/utilities';\nimport { RuleType } from 'src/clientConfiguration/types';\nimport {\n BaseVariationDataType,\n FeatureFlagVariationType,\n GetVariationParametersType,\n UpdateDataStatusParametersType,\n} from './types';\nimport { FeatureFlagVariationsType, IStorage } from 'src/storage/types';\nimport { IVisitorCodeManager } from 'src/visitorCodeManager';\nimport { TrackingStatus } from 'src/types';\n\ninterface IVariationConfiguration {\n /**\n * @method getStoredVariations - obtains campaigns with according variations that are *already assigned* and *stored* in the `variationStorage`.\n */\n getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError>;\n /**\n * @method updateStoredVariations - updates stored variations for the visitor\n */\n updateStoredVariations: (\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ) => void;\n /**\n * @method getVariation - obtains variation for the rule of the feature flag which is both targeted and has a variation, if no such rule was found, returns empty rule with default `variationKey`, given an option `withAssignment` of `true` will also assign a new variation and save it in the storage\n */\n getVariation: (\n params: GetVariationParametersType,\n ) => Result<FeatureFlagVariationType, KameleoonError>;\n /**\n * @method getUnsentData - obtains the list of unsent variations\n */\n getUnsentData: (visitorCode: string) => BaseVariationDataType[];\n /**\n * @method getPendingData - obtains the list of pending variations\n */\n getPendingData: (visitorCode: string) => BaseVariationDataType[];\n /**\n * @method updateDataStatus - updates the status of the variations of given experiment ids with the given status\n */\n updateDataStatus: ({\n visitorCode,\n experimentIdList,\n status,\n }: UpdateDataStatusParametersType) => void;\n}\n\nexport class VariationConfiguration implements IVariationConfiguration {\n private storage: IStorage<VariationDataType>;\n private visitorCodeManager: IVisitorCodeManager;\n\n constructor(\n externalStorage: IStorage<VariationDataType>,\n visitorCodeManager: IVisitorCodeManager,\n ) {\n this.storage = externalStorage;\n this.visitorCodeManager = visitorCodeManager;\n }\n\n public updateDataStatus({\n visitorCode,\n experimentIdList,\n status,\n }: UpdateDataStatusParametersType): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n let updatedVariationData: VariationDataType = result.data;\n\n if (!updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {};\n }\n\n for (const experimentId of experimentIdList) {\n updatedVariationData[visitorCode][experimentId] = {\n ...updatedVariationData[visitorCode][experimentId],\n status,\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n\n public getUnsentData(visitorCode: string): BaseVariationDataType[] {\n return this.getVariationData(\n visitorCode,\n (status) => status === TrackingStatus.Unsent,\n );\n }\n\n public getPendingData(visitorCode: string): BaseVariationDataType[] {\n return this.getVariationData(\n visitorCode,\n (status) => status === TrackingStatus.Pending,\n );\n }\n\n public getStoredVariations(\n visitorCode: string,\n ): Result<FeatureFlagVariationsType, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n const featureFlagVariations = result.data[visitorCode];\n\n if (!featureFlagVariations) {\n return Err(\n new KameleoonError(KameleoonException.StorageRead, visitorCode),\n );\n }\n\n return Ok(featureFlagVariations);\n }\n\n public getVariation({\n visitorCode,\n visitorIdentifier,\n featureFlag,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n withAssignment = false,\n }: GetVariationParametersType): Result<\n FeatureFlagVariationType,\n KameleoonError\n > {\n const validateResult =\n this.visitorCodeManager.validateVisitorCode(visitorCode);\n\n if (!validateResult.ok) {\n return Err(validateResult.error);\n }\n\n const {\n rules,\n featureKey,\n id: featureFlagId,\n defaultVariationKey,\n } = featureFlag;\n\n for (const rule of rules) {\n const {\n segment,\n experimentId,\n id,\n exposition,\n respoolTime,\n variationByExposition,\n } = rule;\n\n // --- Check targeting ---\n const targetingResult = Utilities.checkTargeting({\n segment,\n visitorCode,\n experimentId,\n targetingData,\n packageInfo,\n clientConfiguration,\n dataManager,\n variationConfiguration: this,\n });\n\n if (!targetingResult.ok) {\n return targetingResult;\n }\n\n if (!targetingResult.data) {\n continue;\n }\n\n // --- Note ---\n // Calculate new variation (and assign it if `withAssignment` is `true`)\n // First the the exposed rule is calculated and then the variation inside of it\n const ruleHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(id),\n });\n\n if (ruleHash <= exposition) {\n let totalDeviation = 0;\n\n const variationHash = Hasher.getHashDouble({\n visitorIdentifier,\n respoolTime,\n id: String(experimentId),\n });\n\n for (const variation of variationByExposition) {\n totalDeviation += variation.exposition;\n\n if (variationHash <= totalDeviation) {\n if (withAssignment) {\n this.updateStoredVariations(visitorCode, {\n [experimentId]: {\n variationId: variation.variationId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n status: TrackingStatus.Unsent,\n },\n });\n }\n\n const { exposition, ...restParameters } = variation;\n\n return Ok({\n ...restParameters,\n rule,\n featureFlagId,\n featureKey,\n experimentId,\n isTargetedRule: rule.type === RuleType.TARGETED_DELIVERY,\n });\n }\n }\n }\n\n if (rule.type === RuleType.TARGETED_DELIVERY) {\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: true,\n });\n }\n }\n\n return Ok({\n featureKey,\n featureFlagId,\n experimentId: null,\n variationKey: defaultVariationKey,\n variationId: null,\n rule: null,\n isTargetedRule: false,\n });\n }\n\n public updateStoredVariations(\n visitorCode: string,\n variationData: FeatureFlagVariationsType,\n ): Result<void, KameleoonError> {\n const result = this.storage.read();\n\n if (!result.ok) {\n return result;\n }\n\n let updatedVariationData: VariationDataType = result.data;\n\n if (updatedVariationData[visitorCode]) {\n updatedVariationData[visitorCode] = {\n ...updatedVariationData[visitorCode],\n ...variationData,\n };\n } else {\n updatedVariationData = {\n ...updatedVariationData,\n [visitorCode]: {\n ...variationData,\n },\n };\n }\n\n return this.storage.write(updatedVariationData);\n }\n\n private getVariationData(\n visitorCode: string,\n filter: (status: TrackingStatus) => boolean,\n ): BaseVariationDataType[] {\n const result = this.getStoredVariations(visitorCode);\n\n if (!result.ok) {\n return [];\n }\n\n const resultData: BaseVariationDataType[] = [];\n\n for (const [experimentId, variationData] of Object.entries(result.data)) {\n if (filter(variationData.status)) {\n resultData.push({\n experimentId: Number(experimentId),\n variationId: variationData.variationId,\n isTargetedRule: variationData.isTargetedRule,\n });\n }\n }\n\n return resultData;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ZERO_MAX_AGE=exports.PATH=exports.DEFAULT_MAX_AGE=void 0;const DEFAULT_MAX_AGE=exports.DEFAULT_MAX_AGE=31536000,ZERO_MAX_AGE=exports.ZERO_MAX_AGE=0,PATH=exports.PATH="/";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ZERO_MAX_AGE=exports.VISITOR_CODE_MAX_LENGTH=exports.VISITOR_CODE_LENGTH=exports.PATH=exports.DEFAULT_MAX_AGE=void 0;const VISITOR_CODE_LENGTH=exports.VISITOR_CODE_LENGTH=16,VISITOR_CODE_MAX_LENGTH=exports.VISITOR_CODE_MAX_LENGTH=255,DEFAULT_MAX_AGE=exports.DEFAULT_MAX_AGE=31536000,ZERO_MAX_AGE=exports.ZERO_MAX_AGE=0,PATH=exports.PATH="/";
|
|
2
2
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["
|
|
1
|
+
{"version":3,"file":"constants.js","names":["VISITOR_CODE_LENGTH","exports","VISITOR_CODE_MAX_LENGTH","DEFAULT_MAX_AGE","ZERO_MAX_AGE","PATH"],"sources":["../../src/visitorCodeManager/constants.ts"],"sourcesContent":["export const VISITOR_CODE_LENGTH = 16;\nexport const VISITOR_CODE_MAX_LENGTH = 255;\nexport const DEFAULT_MAX_AGE = 60 * 60 * 24 * 365;\nexport const ZERO_MAX_AGE = 0;\nexport const PATH = '/';\n"],"mappings":"sMAAa,CAAAA,mBAAmB,CAAAC,OAAA,CAAAD,mBAAA,CAAG,EAAE,CACxBE,uBAAuB,CAAAD,OAAA,CAAAC,uBAAA,CAAG,GAAG,CAC7BC,eAAe,CAAAF,OAAA,CAAAE,eAAA,SAAqB,CACpCC,YAAY,CAAAH,OAAA,CAAAG,YAAA,CAAG,CAAC,CAChBC,IAAI,CAAAJ,OAAA,CAAAI,IAAA,CAAG,GAAG","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_types","require","_constants","_visitorCodeManager","Object","defineProperty","exports","value","enumerable","get","VisitorCodeManager","keys","forEach","a","prototype","hasOwnProperty","call","_exportNames"],"sources":["../../src/visitorCodeManager/index.ts"],"sourcesContent":["export * from './types';\nexport * from './constants';\nexport { VisitorCodeManager } from './visitorCodeManager';\n"],"mappings":"sDAAA,IAAAA,MAAA,CAAAC,OAAA,YACA,IAAAC,UAAA,CAAAD,OAAA,gBACA,IAAAE,mBAAA,CAAAF,OAAA,yBAA0DG,MAAA,CAAAC,cAAA,CAAAC,OAAA,eAAAC,KAAA,MAAAH,MAAA,CAAAC,cAAA,CAAAC,OAAA,uBAAAE,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAN,mBAAA,CAAAO,kBAAA,IAAAN,MAAA,CAAAO,IAAA,CAAAX,MAAA,EAAAY,OAAA,UAAAC,CAAA,cAAAA,CAAA,iBAAAA,CAAA,EAAAT,MAAA,CAAAU,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,CAAA,GAAAA,CAAA,IAAAP,OAAA,EAAAA,OAAA,CAAAO,CAAA,IAAAb,MAAA,CAAAa,CAAA,GAAAT,MAAA,CAAAC,cAAA,CAAAC,OAAA,CAAAO,CAAA,EAAAL,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAT,MAAA,CAAAa,CAAA,OAAAT,MAAA,CAAAO,IAAA,CAAAT,UAAA,EAAAU,OAAA,UAAAC,CAAA,cAAAA,CAAA,iBAAAA,CAAA,EAAAT,MAAA,CAAAU,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,CAAA,GAAAA,CAAA,IAAAP,OAAA,EAAAA,OAAA,CAAAO,CAAA,IAAAX,UAAA,CAAAW,CAAA,GAAAT,MAAA,CAAAC,cAAA,CAAAC,OAAA,CAAAO,CAAA,EAAAL,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAP,UAAA,CAAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_types","require","_constants","_visitorCodeManager","Object","defineProperty","exports","value","enumerable","get","VisitorCodeManager","keys","forEach","a","prototype","hasOwnProperty","call","_exportNames"],"sources":["../../src/visitorCodeManager/index.ts"],"sourcesContent":["export * from './types';\nexport * from './constants';\nexport { VisitorCodeManager } from './visitorCodeManager';\n"],"mappings":"sDAAA,IAAAA,MAAA,CAAAC,OAAA,YACA,IAAAC,UAAA,CAAAD,OAAA,gBACA,IAAAE,mBAAA,CAAAF,OAAA,yBAA0DG,MAAA,CAAAC,cAAA,CAAAC,OAAA,eAAAC,KAAA,MAAAH,MAAA,CAAAC,cAAA,CAAAC,OAAA,uBAAAE,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAN,mBAAA,CAAAO,kBAAA,IAAAN,MAAA,CAAAO,IAAA,CAAAX,MAAA,EAAAY,OAAA,UAAAC,CAAA,cAAAA,CAAA,iBAAAA,CAAA,EAAAT,MAAA,CAAAU,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,CAAA,GAAAA,CAAA,IAAAP,OAAA,EAAAA,OAAA,CAAAO,CAAA,IAAAb,MAAA,CAAAa,CAAA,GAAAT,MAAA,CAAAC,cAAA,CAAAC,OAAA,CAAAO,CAAA,EAAAL,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAT,MAAA,CAAAa,CAAA,OAAAT,MAAA,CAAAO,IAAA,CAAAT,UAAA,EAAAU,OAAA,UAAAC,CAAA,cAAAA,CAAA,iBAAAA,CAAA,EAAAT,MAAA,CAAAU,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,CAAA,GAAAA,CAAA,IAAAP,OAAA,EAAAA,OAAA,CAAAO,CAAA,IAAAX,UAAA,CAAAW,CAAA,GAAAT,MAAA,CAAAC,cAAA,CAAAC,OAAA,CAAAO,CAAA,EAAAL,UAAA,IAAAC,GAAA,SAAAA,CAAA,SAAAP,UAAA,CAAAW,CAAA","ignoreList":[]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { Result } from 'ts-res';
|
|
2
|
+
import { KameleoonError } from '../kameleoonError';
|
|
1
3
|
import { SetDataCallbackParametersType } from '../types';
|
|
2
4
|
export interface IVisitorCodeManager {
|
|
3
5
|
consentRequired: boolean;
|
|
4
6
|
getVisitorCode(defaultVisitorCode?: string): string;
|
|
5
7
|
getData: (key: string) => string | null;
|
|
6
8
|
setData: (params: SetDataCallbackParametersType) => void;
|
|
9
|
+
validateVisitorCode(visitorCode: string): Result<void, KameleoonError>;
|
|
7
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../src/visitorCodeManager/types.ts"],"sourcesContent":["import { SetDataCallbackParametersType } from 'src/types';\n\nexport interface IVisitorCodeManager {\n consentRequired: boolean;\n getVisitorCode(defaultVisitorCode?: string): string;\n getData: (key: string) => string | null;\n setData: (params: SetDataCallbackParametersType) => void;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/visitorCodeManager/types.ts"],"sourcesContent":["import { Result } from 'ts-res';\nimport { KameleoonError } from 'src/kameleoonError';\nimport { SetDataCallbackParametersType } from 'src/types';\n\nexport interface IVisitorCodeManager {\n consentRequired: boolean;\n getVisitorCode(defaultVisitorCode?: string): string;\n getData: (key: string) => string | null;\n setData: (params: SetDataCallbackParametersType) => void;\n validateVisitorCode(visitorCode: string): Result<void, KameleoonError>;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { Result } from 'ts-res';
|
|
1
2
|
import { SetDataCallbackParametersType } from '../types';
|
|
3
|
+
import { KameleoonError } from '../kameleoonError';
|
|
2
4
|
import { IVisitorCodeManager } from './types';
|
|
3
5
|
/**
|
|
4
6
|
* VisitorCodeManager - a class which manages visitor codes using cookies, offering functions to generate, retrieve,
|
|
@@ -13,5 +15,7 @@ export declare class VisitorCodeManager implements IVisitorCodeManager {
|
|
|
13
15
|
set getData(callback: () => string);
|
|
14
16
|
set setData(callback: (params: SetDataCallbackParametersType) => void);
|
|
15
17
|
get setData(): (params: SetDataCallbackParametersType) => void;
|
|
18
|
+
validateVisitorCode(visitorCode: string): Result<void, KameleoonError>;
|
|
16
19
|
getVisitorCode(defaultVisitorCode?: string): string;
|
|
20
|
+
private generateVisitorCode;
|
|
17
21
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VisitorCodeManager=void 0;var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VisitorCodeManager=void 0;var _tsRes=require("ts-res"),_storage=require("../storage"),_kameleoonError=require("../kameleoonError"),_constants=require("./constants");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class VisitorCodeManager{constructor(){_defineProperty(this,"isConsentRequired",!1),_defineProperty(this,"setDataCallback",void 0),_defineProperty(this,"getDataCallback",void 0)}set consentRequired(a){this.isConsentRequired=a}get consentRequired(){return this.isConsentRequired}set getData(a){this.getDataCallback=a}set setData(a){this.setDataCallback=a}get setData(){if(this.setDataCallback)return this.setDataCallback;throw new Error("Missing setDataCallback!")}validateVisitorCode(a){return 0===a.length?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitorCodeEmpty)):a.length>_constants.VISITOR_CODE_MAX_LENGTH?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitorCodeMaxLength)):(0,_tsRes.Ok)()}getVisitorCode(a){if(!this.getDataCallback||!this.setDataCallback)throw new Error("Missing getDataCallback or setDataCallback methods in getVisitorCode!");let b;const c=this.getDataCallback(_storage.KameleoonStorageKey.VisitorCode);return c&&(b=c),b||(a?(this.validateVisitorCode(a).throw(),b=a):b=this.generateVisitorCode()),this.isConsentRequired||this.setDataCallback({visitorCode:b,key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_constants.DEFAULT_MAX_AGE,path:_constants.PATH}),b}generateVisitorCode(){const a="abcdefghijklmnopqrstuvwxyz0123456789",b=[];for(let c=0;c<_constants.VISITOR_CODE_LENGTH;c++)b.push(a[Math.floor(Math.random()*a.length)]);return b.join("")}}exports.VisitorCodeManager=VisitorCodeManager;
|
|
2
2
|
//# sourceMappingURL=visitorCodeManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitorCodeManager.js","names":["VisitorCodeManager","constructor","_defineProperty","consentRequired","isRequired","isConsentRequired","getData","callback","getDataCallback","setData","setDataCallback","Error","
|
|
1
|
+
{"version":3,"file":"visitorCodeManager.js","names":["VisitorCodeManager","constructor","_defineProperty","consentRequired","isRequired","isConsentRequired","getData","callback","getDataCallback","setData","setDataCallback","Error","validateVisitorCode","visitorCode","length","Err","KameleoonError","KameleoonException","VisitorCodeEmpty","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","Ok","getVisitorCode","defaultVisitorCode","existingVisitorCode","KameleoonStorageKey","VisitorCode","throw","generateVisitorCode","key","maxAge","DEFAULT_MAX_AGE","path","PATH","characters","randomCharacterArray","i","VISITOR_CODE_LENGTH","push","Math","floor","random","join","exports"],"sources":["../../src/visitorCodeManager/visitorCodeManager.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { KameleoonStorageKey } from 'src/storage';\nimport { SetDataCallbackParametersType } from 'src/types';\nimport { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport { IVisitorCodeManager } from './types';\nimport {\n DEFAULT_MAX_AGE,\n PATH,\n VISITOR_CODE_LENGTH,\n VISITOR_CODE_MAX_LENGTH,\n} from './constants';\n\n/**\n * VisitorCodeManager - a class which manages visitor codes using cookies, offering functions to generate, retrieve,\n * and handle these codes while considering user consent.\n **/\nexport class VisitorCodeManager implements IVisitorCodeManager {\n private isConsentRequired: boolean = false;\n private setDataCallback?: (params: SetDataCallbackParametersType) => void;\n private getDataCallback?: (key: string) => string | null;\n\n set consentRequired(isRequired: boolean) {\n this.isConsentRequired = isRequired;\n }\n\n get consentRequired(): boolean {\n return this.isConsentRequired;\n }\n\n set getData(callback: () => string) {\n this.getDataCallback = callback;\n }\n\n set setData(callback: (params: SetDataCallbackParametersType) => void) {\n this.setDataCallback = callback;\n }\n\n get setData(): (params: SetDataCallbackParametersType) => void {\n if (this.setDataCallback) {\n return this.setDataCallback;\n }\n\n throw new Error('Missing setDataCallback!');\n }\n\n public validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\n if (visitorCode.length === 0) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeEmpty));\n }\n\n if (visitorCode.length > VISITOR_CODE_MAX_LENGTH) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeMaxLength));\n }\n\n return Ok();\n }\n\n public getVisitorCode(defaultVisitorCode?: string): string {\n if (!this.getDataCallback || !this.setDataCallback) {\n throw new Error(\n 'Missing getDataCallback or setDataCallback methods in getVisitorCode!',\n );\n }\n\n let visitorCode;\n\n const existingVisitorCode = this.getDataCallback(\n KameleoonStorageKey.VisitorCode,\n );\n\n if (existingVisitorCode) {\n visitorCode = existingVisitorCode;\n }\n\n if (!visitorCode) {\n if (defaultVisitorCode) {\n this.validateVisitorCode(defaultVisitorCode).throw();\n visitorCode = defaultVisitorCode;\n } else {\n visitorCode = this.generateVisitorCode();\n }\n }\n\n if (!this.isConsentRequired) {\n this.setDataCallback({\n visitorCode,\n key: KameleoonStorageKey.VisitorCode,\n maxAge: DEFAULT_MAX_AGE,\n path: PATH,\n });\n }\n\n return visitorCode;\n }\n\n private generateVisitorCode(): string {\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const randomCharacterArray: string[] = [];\n\n for (let i = 0; i < VISITOR_CODE_LENGTH; i++) {\n randomCharacterArray.push(\n characters[Math.floor(Math.random() * characters.length)],\n );\n }\n\n return randomCharacterArray.join('');\n }\n}\n"],"mappings":"kvBAgBO,KAAM,CAAAA,kBAAkD,CAAAC,YAAA,EAAAC,eAAA,8BAAAA,eAAA,gCAAAA,eAAA,gCAK7D,GAAI,CAAAC,eAAeA,CAACC,CAAmB,CAAE,CACvC,IAAI,CAACC,iBAAiB,CAAGD,CAC3B,CAEA,GAAI,CAAAD,eAAeA,CAAA,CAAY,CAC7B,MAAO,KAAI,CAACE,iBACd,CAEA,GAAI,CAAAC,OAAOA,CAACC,CAAsB,CAAE,CAClC,IAAI,CAACC,eAAe,CAAGD,CACzB,CAEA,GAAI,CAAAE,OAAOA,CAACF,CAAyD,CAAE,CACrE,IAAI,CAACG,eAAe,CAAGH,CACzB,CAEA,GAAI,CAAAE,OAAOA,CAAA,CAAoD,CAC7D,GAAI,IAAI,CAACC,eAAe,CACtB,MAAO,KAAI,CAACA,eAAe,CAG7B,KAAM,IAAI,CAAAC,KAAK,CAAC,0BAA0B,CAC5C,CAEOC,mBAAmBA,CACxBC,CAAmB,CACW,OACH,EAAC,GAAxBA,CAAW,CAACC,MAAY,CACnB,GAAAC,UAAG,EAAC,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACC,gBAAgB,CAAC,CAAC,CAGjEL,CAAW,CAACC,MAAM,CAAGK,kCAAuB,CACvC,GAAAJ,UAAG,EAAC,GAAI,CAAAC,8BAAc,CAACC,kCAAkB,CAACG,oBAAoB,CAAC,CAAC,CAGlE,GAAAC,SAAE,EAAC,CACZ,CAEOC,cAAcA,CAACC,CAA2B,CAAU,CACzD,GAAI,CAAC,IAAI,CAACf,eAAe,EAAI,CAAC,IAAI,CAACE,eAAe,CAChD,KAAM,IAAI,CAAAC,KAAK,CACb,uEACF,CAAC,CAGH,GAAI,CAAAE,CAAW,CAEf,KAAM,CAAAW,CAAmB,CAAG,IAAI,CAAChB,eAAe,CAC9CiB,4BAAmB,CAACC,WACtB,CAAC,CAwBD,MAtBI,CAAAF,CAAmB,GACrBX,CAAW,CAAGW,CAAmB,EAG9BX,CAAW,GACVU,CAAkB,EACpB,IAAI,CAACX,mBAAmB,CAACW,CAAkB,CAAC,CAACI,KAAK,CAAC,CAAC,CACpDd,CAAW,CAAGU,CAAkB,EAEhCV,CAAW,CAAG,IAAI,CAACe,mBAAmB,CAAC,CAAC,EAIvC,IAAI,CAACvB,iBAAiB,EACzB,IAAI,CAACK,eAAe,CAAC,CACnBG,WAAW,CAAXA,CAAW,CACXgB,GAAG,CAAEJ,4BAAmB,CAACC,WAAW,CACpCI,MAAM,CAAEC,0BAAe,CACvBC,IAAI,CAAEC,eACR,CAAC,CAAC,CAGGpB,CACT,CAEQe,mBAAmBA,CAAA,CAAW,MAC9B,CAAAM,CAAU,CAAG,sCAAsC,CACnDC,CAA8B,CAAG,EAAE,CAEzC,IAAK,GAAI,CAAAC,CAAC,CAAG,CAAC,CAAEA,CAAC,CAAGC,8BAAmB,CAAED,CAAC,EAAE,CAC1CD,CAAoB,CAACG,IAAI,CACvBJ,CAAU,CAACK,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,CAAGP,CAAU,CAACpB,MAAM,CAAC,CAC1D,CAAC,CAGH,MAAO,CAAAqB,CAAoB,CAACO,IAAI,CAAC,EAAE,CACrC,CACF,CAACC,OAAA,CAAA3C,kBAAA,CAAAA,kBAAA","ignoreList":[]}
|