@kameleoon/javascript-sdk-core 2.4.0 → 2.4.1
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.
|
@@ -43,8 +43,8 @@ export type VisitType = {
|
|
|
43
43
|
customDataEvents: CustomDataEventType[];
|
|
44
44
|
};
|
|
45
45
|
export type GetVisitorDataResultType = {
|
|
46
|
-
previousVisits?: VisitType;
|
|
47
|
-
currentVisits?: VisitType;
|
|
46
|
+
previousVisits?: [VisitType];
|
|
47
|
+
currentVisits?: [VisitType];
|
|
48
48
|
};
|
|
49
49
|
export type GetClientConfigurationResultType = Omit<ConfigurationDataType, 'featureFlags'> & {
|
|
50
50
|
featureFlagConfigurations: FeatureFlagType[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":["HttpMethod","exports","EVENT_TYPE_KEYS","PARAMETER_KEYS","TRACKING_KEYS","QUERY_KEYS"],"sources":["../../src/requester/types.ts"],"sourcesContent":["import {\n JSONType,\n FeatureFlagType,\n ConfigurationDataType,\n} from '../campaignConfiguration';\nimport { Environment, ExternalPackageInfoType } from '../types';\nimport { Header } from './constants';\n\nexport type RequesterParamsType = {\n siteCode: string;\n environment?: Environment;\n packageInfo: ExternalPackageInfoType;\n requestDispatcher: IExternalRequestDispatcher;\n};\n\nexport type TrackExperimentParamsType = {\n body: string;\n variationId: number;\n visitorCode: string;\n experimentId: number;\n isUnallocated: boolean;\n userAgent?: string;\n callback?: () => void;\n};\n\nexport type TrackDataParamsType = {\n visitorCode: string;\n body: string;\n userAgent?: string;\n};\n\ntype CustomDataEventType = {\n sdk: {\n name: string;\n version: string;\n };\n itp: boolean;\n time: number;\n data: {\n index: number;\n valuesCountMap: {\n [value: string]: number;\n };\n overwrite: boolean;\n mappingIdentifier: boolean;\n };\n};\n\nexport type VisitType = {\n siteCode: string;\n visitorCode: string;\n customDataEvents: CustomDataEventType[];\n};\n\nexport type GetVisitorDataResultType = {\n previousVisits?: VisitType;\n currentVisits?: VisitType;\n};\n\nexport type GetClientConfigurationResultType = Omit<\n ConfigurationDataType,\n 'featureFlags'\n> & { featureFlagConfigurations: FeatureFlagType[] };\n\nexport enum HttpMethod {\n Get = 'GET',\n Post = 'POST',\n}\n\nconst EVENT_TYPE_KEYS = [\n 'customData',\n 'staticData',\n 'page',\n 'conversion',\n 'activity',\n 'experiment',\n] as const;\nconst PARAMETER_KEYS = [\n 'valuesCountMap',\n 'id',\n 'nonce',\n 'sdkName',\n 'sdkVersion',\n 'browserIndex',\n 'siteCode',\n 'environment',\n 'visitorCode',\n 'currentVisit',\n 'maxNumberPreviousVisits',\n 'customData',\n 'negative',\n 'revenue',\n 'title',\n 'referrersIndices',\n 'overwrite',\n 'index',\n 'href',\n 'variationId',\n 'deviceType',\n 'goalId',\n 'ts',\n 'key',\n] as const;\nconst TRACKING_KEYS = ['visit', 'map'] as const;\nconst QUERY_KEYS = ['sse', 'visitor', 'mobile', 'map', 'events'] as const;\n\nexport type TrackingType = Record<\n Capitalize<(typeof TRACKING_KEYS)[number]>,\n string\n>;\nexport type QueryType = Record<Capitalize<(typeof QUERY_KEYS)[number]>, string>;\nexport type ParameterType = Record<\n Capitalize<(typeof PARAMETER_KEYS)[number]>,\n string\n>;\nexport type EventType = Record<\n Capitalize<(typeof EVENT_TYPE_KEYS)[number]>,\n string\n>;\n\nexport type StrictTrackingRecord<T> = {\n [K in keyof T]: K extends string ? `${Uncapitalize<K>}/` : never;\n};\nexport type StrictQueryRecord<T> = {\n [K in keyof T]: K extends string ? `${Uncapitalize<K>}?siteCode=` : never;\n};\nexport type StrictEventTypeRecord<T> = {\n [K in keyof T]: K extends string ? `eventType=${Uncapitalize<K>}` : never;\n};\nexport type StrictParameterRecord<T> = {\n [K in keyof T]: K extends string ? `&${Uncapitalize<K>}=` : never;\n};\n\nexport type TrackParametersType = {\n url: string;\n headers?: Partial<Record<Header, string>>;\n body: string;\n};\n\n/**\n * @interface an interface of External Request Dispatcher which will be used to perform requests.\n * */\nexport interface IExternalRequestDispatcher {\n /**\n * @method track - send a track request\n * @param {TrackParametersType} parameters - track parameters\n * */\n track: (params: TrackParametersType) => Promise<boolean>;\n /**\n * @method getClientConfiguration - get client configuration\n * @param {string} url - url address\n * */\n getClientConfiguration: (url: string) => Promise<JSONType>;\n /**\n * @method getRemoteData - get data from remote server of Kameleoon\n * @param {string} url - url address\n * */\n getRemoteData: (url: string) => Promise<JSONType>;\n}\n"],"mappings":";;;;;;IAgEYA,UAAU,0BAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAA,OAAVA,UAAU;AAAA;AAAAC,OAAA,CAAAD,UAAA,GAAAA,UAAA;AAKtB,MAAME,eAAe,GAAG,CACtB,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,UAAU,EACV,YAAY,CACJ;AACV,MAAMC,cAAc,GAAG,CACrB,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,SAAS,EACT,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,MAAM,EACN,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,KAAK,CACG;AACV,MAAMC,aAAa,GAAG,CAAC,OAAO,EAAE,KAAK,CAAU;AAC/C,MAAMC,UAAU,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU"}
|
|
1
|
+
{"version":3,"file":"types.js","names":["HttpMethod","exports","EVENT_TYPE_KEYS","PARAMETER_KEYS","TRACKING_KEYS","QUERY_KEYS"],"sources":["../../src/requester/types.ts"],"sourcesContent":["import {\n JSONType,\n FeatureFlagType,\n ConfigurationDataType,\n} from '../campaignConfiguration';\nimport { Environment, ExternalPackageInfoType } from '../types';\nimport { Header } from './constants';\n\nexport type RequesterParamsType = {\n siteCode: string;\n environment?: Environment;\n packageInfo: ExternalPackageInfoType;\n requestDispatcher: IExternalRequestDispatcher;\n};\n\nexport type TrackExperimentParamsType = {\n body: string;\n variationId: number;\n visitorCode: string;\n experimentId: number;\n isUnallocated: boolean;\n userAgent?: string;\n callback?: () => void;\n};\n\nexport type TrackDataParamsType = {\n visitorCode: string;\n body: string;\n userAgent?: string;\n};\n\ntype CustomDataEventType = {\n sdk: {\n name: string;\n version: string;\n };\n itp: boolean;\n time: number;\n data: {\n index: number;\n valuesCountMap: {\n [value: string]: number;\n };\n overwrite: boolean;\n mappingIdentifier: boolean;\n };\n};\n\nexport type VisitType = {\n siteCode: string;\n visitorCode: string;\n customDataEvents: CustomDataEventType[];\n};\n\nexport type GetVisitorDataResultType = {\n previousVisits?: [VisitType];\n currentVisits?: [VisitType];\n};\n\nexport type GetClientConfigurationResultType = Omit<\n ConfigurationDataType,\n 'featureFlags'\n> & { featureFlagConfigurations: FeatureFlagType[] };\n\nexport enum HttpMethod {\n Get = 'GET',\n Post = 'POST',\n}\n\nconst EVENT_TYPE_KEYS = [\n 'customData',\n 'staticData',\n 'page',\n 'conversion',\n 'activity',\n 'experiment',\n] as const;\nconst PARAMETER_KEYS = [\n 'valuesCountMap',\n 'id',\n 'nonce',\n 'sdkName',\n 'sdkVersion',\n 'browserIndex',\n 'siteCode',\n 'environment',\n 'visitorCode',\n 'currentVisit',\n 'maxNumberPreviousVisits',\n 'customData',\n 'negative',\n 'revenue',\n 'title',\n 'referrersIndices',\n 'overwrite',\n 'index',\n 'href',\n 'variationId',\n 'deviceType',\n 'goalId',\n 'ts',\n 'key',\n] as const;\nconst TRACKING_KEYS = ['visit', 'map'] as const;\nconst QUERY_KEYS = ['sse', 'visitor', 'mobile', 'map', 'events'] as const;\n\nexport type TrackingType = Record<\n Capitalize<(typeof TRACKING_KEYS)[number]>,\n string\n>;\nexport type QueryType = Record<Capitalize<(typeof QUERY_KEYS)[number]>, string>;\nexport type ParameterType = Record<\n Capitalize<(typeof PARAMETER_KEYS)[number]>,\n string\n>;\nexport type EventType = Record<\n Capitalize<(typeof EVENT_TYPE_KEYS)[number]>,\n string\n>;\n\nexport type StrictTrackingRecord<T> = {\n [K in keyof T]: K extends string ? `${Uncapitalize<K>}/` : never;\n};\nexport type StrictQueryRecord<T> = {\n [K in keyof T]: K extends string ? `${Uncapitalize<K>}?siteCode=` : never;\n};\nexport type StrictEventTypeRecord<T> = {\n [K in keyof T]: K extends string ? `eventType=${Uncapitalize<K>}` : never;\n};\nexport type StrictParameterRecord<T> = {\n [K in keyof T]: K extends string ? `&${Uncapitalize<K>}=` : never;\n};\n\nexport type TrackParametersType = {\n url: string;\n headers?: Partial<Record<Header, string>>;\n body: string;\n};\n\n/**\n * @interface an interface of External Request Dispatcher which will be used to perform requests.\n * */\nexport interface IExternalRequestDispatcher {\n /**\n * @method track - send a track request\n * @param {TrackParametersType} parameters - track parameters\n * */\n track: (params: TrackParametersType) => Promise<boolean>;\n /**\n * @method getClientConfiguration - get client configuration\n * @param {string} url - url address\n * */\n getClientConfiguration: (url: string) => Promise<JSONType>;\n /**\n * @method getRemoteData - get data from remote server of Kameleoon\n * @param {string} url - url address\n * */\n getRemoteData: (url: string) => Promise<JSONType>;\n}\n"],"mappings":";;;;;;IAgEYA,UAAU,0BAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAA,OAAVA,UAAU;AAAA;AAAAC,OAAA,CAAAD,UAAA,GAAAA,UAAA;AAKtB,MAAME,eAAe,GAAG,CACtB,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,UAAU,EACV,YAAY,CACJ;AACV,MAAMC,cAAc,GAAG,CACrB,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,SAAS,EACT,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,MAAM,EACN,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,KAAK,CACG;AACV,MAAMC,aAAa,GAAG,CAAC,OAAO,EAAE,KAAK,CAAU;AAC/C,MAAMC,UAAU,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU"}
|
|
@@ -136,7 +136,7 @@ class Utilities {
|
|
|
136
136
|
}
|
|
137
137
|
const indexMap = new Map();
|
|
138
138
|
const resultData = [];
|
|
139
|
-
const customDataEvents = [...visits.customDataEvents];
|
|
139
|
+
const customDataEvents = [...visits[0].customDataEvents];
|
|
140
140
|
customDataEvents.sort((a, b) => b.time - a.time);
|
|
141
141
|
for (const customDataEvent of customDataEvents) {
|
|
142
142
|
const customDataIndex = customDataEvent.data.index;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","names":["_tsRes","require","_kameleoonError","_types","_targeting","_constants","_kameleoonData","_constants2","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","Utilities","checkTargeting","segment","visitorCode","targetingData","experimentId","variationConfiguration","conditionsData","firstLevel","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getAssignedVariations","ok","data","targetingTree","TargetingTree","result","evaluate","variationData","validateVisitorCode","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","campaignConfiguration","unsentData","getUnsentData","map","item","url","join","trackRule","featureFlagVariation","requester","userAgent","variationId","rule","Error","dataUrl","resultVariationId","isUnallocated","callback","clearUnsentData","trackExperiment","body","parseFeatureVariable","variable","type","VariableType","BOOLEAN","Boolean","STRING","NUMBER","numberValue","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","parseVisitorData","currentVisits","previousVisits","visits","indexMap","Map","resultData","customDataEvents","sort","a","b","time","customDataEvent","customDataIndex","index","has","set","values","valuesCountMap","CustomData","getUserAgent","isUserAgent","KameleoonData","UserAgent","storedTargetingData","filteredData","userAgentData","updateCache","cacheManager","cacheData","getAliveItem","newCacheData","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Milliseconds","Second","add","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","entries","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from '../kameleoonError';\nimport { ExperimentVariationsType } from '../storage';\nimport {\n CheckTargetingParamsType,\n ManageCacheParametersType,\n TrackRuleParamsType,\n} from './types';\nimport {\n FeatureVariableResultType,\n Milliseconds,\n TrackingCacheItemType,\n VariableType,\n} from '../types';\nimport { TargetingTree } from '../targeting';\nimport { VISITOR_CODE_MAX_LENGTH } from './constants';\nimport {\n CampaignConfiguration,\n FeatureVariableType,\n JSONType,\n} from '../campaignConfiguration';\nimport {\n CustomData,\n KameleoonData,\n KameleoonDataItemType,\n KameleoonDataType,\n UserAgentDataType,\n} from '../kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from '../constants';\nimport { CacheManager } from '../cacheManager';\nimport { GetVisitorDataResultType, VisitType } from '../requester';\n\nexport class Utilities {\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n }: CheckTargetingParamsType): 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: ExperimentVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getAssignedVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = new TargetingTree(segment);\n\n const result = targetingTree.evaluate({\n targetingData: targetingData || [],\n variationData: variations,\n experimentId,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\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: string,\n campaignConfiguration: CampaignConfiguration,\n ): string {\n const unsentData = campaignConfiguration.getUnsentData(visitorCode);\n\n return unsentData.map((item) => item.url).join('\\n');\n }\n\n static trackRule({\n featureFlagVariation,\n campaignConfiguration,\n visitorCode,\n requester,\n userAgent,\n }: TrackRuleParamsType): void {\n const { variationId, rule } = featureFlagVariation;\n\n if (!rule) {\n throw new Error(\n 'Internal usage error, make sure to use `trackRule` for existing rule',\n );\n }\n\n const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);\n\n const resultVariationId = variationId || 0;\n const isUnallocated = variationId === null;\n const callback = () => campaignConfiguration.clearUnsentData;\n\n requester.trackExperiment({\n visitorCode,\n isUnallocated,\n body: dataUrl,\n callback,\n experimentId: rule.experimentId,\n variationId: resultVariationId,\n userAgent,\n });\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\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 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 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(data: GetVisitorDataResultType): KameleoonDataType[] {\n const { currentVisits, previousVisits } = data;\n\n let visits: VisitType | undefined;\n\n if (currentVisits) {\n visits = currentVisits;\n } else if (previousVisits) {\n visits = previousVisits;\n }\n\n if (!visits) {\n return [];\n }\n\n const indexMap = new Map();\n const resultData: KameleoonDataType[] = [];\n const customDataEvents = [...visits.customDataEvents];\n customDataEvents.sort((a, b) => b.time - a.time);\n\n for (const customDataEvent of customDataEvents) {\n const customDataIndex = customDataEvent.data.index;\n\n if (!indexMap.has(customDataIndex)) {\n indexMap.set(customDataIndex, true);\n\n const values = Object.keys(customDataEvent.data.valuesCountMap);\n resultData.push(new CustomData(customDataIndex, ...values));\n }\n }\n\n return resultData;\n }\n\n static getUserAgent(\n visitorCode: string,\n campaignConfiguration: CampaignConfiguration,\n ): string | undefined {\n const isUserAgent = (\n data: KameleoonDataItemType,\n ): data is UserAgentDataType => data.type === KameleoonData.UserAgent;\n const targetingData =\n campaignConfiguration.storedTargetingData[visitorCode];\n\n if (targetingData) {\n const filteredData = targetingData\n .map((item) => item.data)\n .filter(isUserAgent);\n\n if (filteredData.length) {\n const [userAgentData] = filteredData;\n\n return userAgentData.value;\n }\n }\n\n return undefined;\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}]);`;\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utilities.js","names":["_tsRes","require","_kameleoonError","_types","_targeting","_constants","_kameleoonData","_constants2","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","Utilities","checkTargeting","segment","visitorCode","targetingData","experimentId","variationConfiguration","conditionsData","firstLevel","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getAssignedVariations","ok","data","targetingTree","TargetingTree","result","evaluate","variationData","validateVisitorCode","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","campaignConfiguration","unsentData","getUnsentData","map","item","url","join","trackRule","featureFlagVariation","requester","userAgent","variationId","rule","Error","dataUrl","resultVariationId","isUnallocated","callback","clearUnsentData","trackExperiment","body","parseFeatureVariable","variable","type","VariableType","BOOLEAN","Boolean","STRING","NUMBER","numberValue","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","parseVisitorData","currentVisits","previousVisits","visits","indexMap","Map","resultData","customDataEvents","sort","a","b","time","customDataEvent","customDataIndex","index","has","set","values","valuesCountMap","CustomData","getUserAgent","isUserAgent","KameleoonData","UserAgent","storedTargetingData","filteredData","userAgentData","updateCache","cacheManager","cacheData","getAliveItem","newCacheData","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Milliseconds","Second","add","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","entries","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from '../kameleoonError';\nimport { ExperimentVariationsType } from '../storage';\nimport {\n CheckTargetingParamsType,\n ManageCacheParametersType,\n TrackRuleParamsType,\n} from './types';\nimport {\n FeatureVariableResultType,\n Milliseconds,\n TrackingCacheItemType,\n VariableType,\n} from '../types';\nimport { TargetingTree } from '../targeting';\nimport { VISITOR_CODE_MAX_LENGTH } from './constants';\nimport {\n CampaignConfiguration,\n FeatureVariableType,\n JSONType,\n} from '../campaignConfiguration';\nimport {\n CustomData,\n KameleoonData,\n KameleoonDataItemType,\n KameleoonDataType,\n UserAgentDataType,\n} from '../kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from '../constants';\nimport { CacheManager } from '../cacheManager';\nimport { GetVisitorDataResultType, VisitType } from '../requester';\n\nexport class Utilities {\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n }: CheckTargetingParamsType): 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: ExperimentVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getAssignedVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = new TargetingTree(segment);\n\n const result = targetingTree.evaluate({\n targetingData: targetingData || [],\n variationData: variations,\n experimentId,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\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: string,\n campaignConfiguration: CampaignConfiguration,\n ): string {\n const unsentData = campaignConfiguration.getUnsentData(visitorCode);\n\n return unsentData.map((item) => item.url).join('\\n');\n }\n\n static trackRule({\n featureFlagVariation,\n campaignConfiguration,\n visitorCode,\n requester,\n userAgent,\n }: TrackRuleParamsType): void {\n const { variationId, rule } = featureFlagVariation;\n\n if (!rule) {\n throw new Error(\n 'Internal usage error, make sure to use `trackRule` for existing rule',\n );\n }\n\n const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);\n\n const resultVariationId = variationId || 0;\n const isUnallocated = variationId === null;\n const callback = () => campaignConfiguration.clearUnsentData;\n\n requester.trackExperiment({\n visitorCode,\n isUnallocated,\n body: dataUrl,\n callback,\n experimentId: rule.experimentId,\n variationId: resultVariationId,\n userAgent,\n });\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\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 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 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(data: GetVisitorDataResultType): KameleoonDataType[] {\n const { currentVisits, previousVisits } = data;\n\n let visits: [VisitType] | undefined;\n\n if (currentVisits) {\n visits = currentVisits;\n } else if (previousVisits) {\n visits = previousVisits;\n }\n\n if (!visits) {\n return [];\n }\n\n const indexMap = new Map();\n const resultData: KameleoonDataType[] = [];\n const customDataEvents = [...visits[0].customDataEvents];\n customDataEvents.sort((a, b) => b.time - a.time);\n\n for (const customDataEvent of customDataEvents) {\n const customDataIndex = customDataEvent.data.index;\n\n if (!indexMap.has(customDataIndex)) {\n indexMap.set(customDataIndex, true);\n\n const values = Object.keys(customDataEvent.data.valuesCountMap);\n resultData.push(new CustomData(customDataIndex, ...values));\n }\n }\n\n return resultData;\n }\n\n static getUserAgent(\n visitorCode: string,\n campaignConfiguration: CampaignConfiguration,\n ): string | undefined {\n const isUserAgent = (\n data: KameleoonDataItemType,\n ): data is UserAgentDataType => data.type === KameleoonData.UserAgent;\n const targetingData =\n campaignConfiguration.storedTargetingData[visitorCode];\n\n if (targetingData) {\n const filteredData = targetingData\n .map((item) => item.data)\n .filter(isUserAgent);\n\n if (filteredData.length) {\n const [userAgentData] = filteredData;\n\n return userAgentData.value;\n }\n }\n\n return undefined;\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}]);`;\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"],"mappings":"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"}
|