@kameleoon/javascript-sdk-core 4.4.4 → 4.4.5
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
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 4.4.5 (2024-08-08)
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed an issue that caused duplicate entries in feature flag results for both anonymous and authorized/identified visitors during data reconciliation. This problem occurred when custom data of type mapping ID was not consistently sent for all sessions.
|
|
8
|
+
|
|
3
9
|
## 4.4.4 (2024-07-19)
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataManager=void 0;var _tsRes=require("ts-res"),_targeting=require("../targeting"),_dataProcessor=require("./dataProcessor"),_utilities=require("../utilities"),_clientConfiguration=require("../clientConfiguration"),_types=require("./types");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 DataManager{constructor(a){let{storage:b,cleanupInterval:c}=a;if(_defineProperty(this,"targetingTrees",new Map),_defineProperty(this,"localCustomDataIndexes",new Set),_defineProperty(this,"persistentCustomDataIndexes",new Set),_defineProperty(this,"mappingIdentifierCustomDataIndex",null),_defineProperty(this,"cleanupIntervalId",null),_defineProperty(this,"dataProcessor",void 0),_defineProperty(this,"unsentData",void 0),_defineProperty(this,"sentPageViewTimestamps",new Map),this.dataProcessor=new _dataProcessor.DataProcessor(b),this.unsentData={},c){const a=()=>{this.dataProcessor.cleanupTargetingData(c),this.sentPageViewTimestamps.clear()};try{this.cleanupIntervalId=setInterval(a,c)}catch(a){throw this.cleanupIntervalId&&clearInterval(this.cleanupIntervalId),a}}}addData(a){this.unsentData[a]||(this.unsentData[a]=new Map);for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];for(const b of c)switch(this.dataProcessor.updateData(a,b),b.data.type){case _types.KameleoonData.CustomData:{const c=b,d=c.data;this.mappingIdentifierCustomDataIndex===d.index&&(c._isMappingIdentifier=!0,a!==d.value[0]&&this.dataProcessor.createReference(a,d.value[0])),this.localCustomDataIndexes.has(d.index)||b.isSent||this.unsentData[a].set(d.index,c);break}case _types.KameleoonData.PageView:{const c=b.data,d=this.dataProcessor.getTargetingData(a).or({});if(d){const e=d[_types.KameleoonData.PageView],f=e[c.urlAddress];if(!b.isSent)for(const c of f.timestamps)this.sentPageViewTimestamps.has(c)||(this.unsentData[a].set(c,b),this.sentPageViewTimestamps.set(c,!0));else for(const a of f.timestamps)this.sentPageViewTimestamps.has(a)||this.sentPageViewTimestamps.set(a,!0)}break}case _types.KameleoonData.Conversion:{const c=this.unsentData[a];if(!b.isSent)if(c.has(_types.KameleoonData.Conversion)){const a=c.get(_types.KameleoonData.Conversion);a.push(b),c.set(_types.KameleoonData.Conversion,a)}else c.set(_types.KameleoonData.Conversion,[b]);break}default:{const{data:c}=b;b.isSent||this.unsentData[a].set(c.type,b)}}return(0,_tsRes.Ok)()}getTree(a){if(this.targetingTrees.has(a.id))return this.targetingTrees.get(a.id);const b=new _targeting.Tree(a);return this.targetingTrees.set(a.id,b),b}clearTrees(){this.targetingTrees.clear()}getUnsentData(a){return this.unsentData[a]}clearUnsentData(a){var b;const c=null===(b=this.unsentData[a])||void 0===b?void 0:b.values();if(c&&this.persistentCustomDataIndexes.size){const b=new Map;for(const a of c)!Array.isArray(a)&&this.isPersistentCustomData(a)&&b.set(a.data.index,a);if(b.size)return void(this.unsentData[a]=b)}delete this.unsentData[a]}clearUnsentDataByKey(a,b){const c=this.unsentData[a];if(c){if(b===_types.KameleoonData.CustomData&&this.persistentCustomDataIndexes.size)for(const[a,d]of c.entries())this.isPersistentCustomData(d)||a===b&&c.delete(a);else if(b===_types.KameleoonData.PageView)for(const a of c.keys())"number"==typeof a&&c.delete(a);else c.delete(b);c.size||delete this.unsentData[a]}}isPersistentCustomData(a){return!!this.persistentCustomDataIndexes.size&&!!_utilities.Utilities.isCustomData(a)&&this.persistentCustomDataIndexes.has(a.data.index)}getLinkedVisitor(a){return this.dataProcessor.getLinkedVisitor(a,this.mappingIdentifierCustomDataIndex)}getVisitorIdentifier(a){const b=this.getTargetingData(a);if(!b)return a;const c=b[_types.KameleoonData.CustomData];if(!c||null===this.mappingIdentifierCustomDataIndex)return a;const d=c[this.mappingIdentifierCustomDataIndex];return d?d.value[0]:a}getTargetingData(a){const b=this.dataProcessor.getTargetingData(a).or(null);return b?b:void 0}get trees(){return this.targetingTrees}get unsentDataVisitors(){return Object.keys(this.unsentData)}get identifierCustomDataIndex(){return this.mappingIdentifierCustomDataIndex}get storedDataTypes(){return this.dataProcessor.storedDataTypeList}get storedCustomDataIndexes(){return this.dataProcessor.storedCustomDataIndexList}set customDataIndexes(a){const[b,c]=[[],[]];a.forEach(a=>{a.localOnly&&b.push(a.index),a.scope===_clientConfiguration.CustomDataScope.Visitor&&c.push(a.index),a.isMappingIdentifier&&(this.mappingIdentifierCustomDataIndex=a.index)}),b.length&&(this.localCustomDataIndexes=new Set(b)),c.length&&(this.persistentCustomDataIndexes=new Set(c))}}exports.DataManager=DataManager;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataManager=void 0;var _tsRes=require("ts-res"),_targeting=require("../targeting"),_dataProcessor=require("./dataProcessor"),_utilities=require("../utilities"),_clientConfiguration=require("../clientConfiguration"),_customData=require("./customData"),_types=require("./types");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 DataManager{constructor(a){let{storage:b,cleanupInterval:c}=a;if(_defineProperty(this,"targetingTrees",new Map),_defineProperty(this,"localCustomDataIndexes",new Set),_defineProperty(this,"persistentCustomDataIndexes",new Set),_defineProperty(this,"mappingIdentifierCustomDataIndex",null),_defineProperty(this,"cleanupIntervalId",null),_defineProperty(this,"dataProcessor",void 0),_defineProperty(this,"unsentData",void 0),_defineProperty(this,"sentPageViewTimestamps",new Map),this.dataProcessor=new _dataProcessor.DataProcessor(b),this.unsentData={},c){const a=()=>{this.dataProcessor.cleanupTargetingData(c),this.sentPageViewTimestamps.clear()};try{this.cleanupIntervalId=setInterval(a,c)}catch(a){throw this.cleanupIntervalId&&clearInterval(this.cleanupIntervalId),a}}}addData(a){this.unsentData[a]||(this.unsentData[a]=new Map);for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];for(const b of c)switch(this.dataProcessor.updateData(a,b),b.data.type){case _types.KameleoonData.CustomData:{const c=b,d=c.data;this.mappingIdentifierCustomDataIndex===d.index&&(c._isMappingIdentifier=!0,a!==d.value[0]&&this.dataProcessor.createReference(a,d.value[0])),this.localCustomDataIndexes.has(d.index)||b.isSent||this.unsentData[a].set(d.index,c);break}case _types.KameleoonData.PageView:{const c=b.data,d=this.dataProcessor.getTargetingData(a).or({});if(d){const e=d[_types.KameleoonData.PageView],f=e[c.urlAddress];if(!b.isSent)for(const c of f.timestamps)this.sentPageViewTimestamps.has(c)||(this.unsentData[a].set(c,b),this.sentPageViewTimestamps.set(c,!0));else for(const a of f.timestamps)this.sentPageViewTimestamps.has(a)||this.sentPageViewTimestamps.set(a,!0)}break}case _types.KameleoonData.Conversion:{const c=this.unsentData[a];if(!b.isSent)if(c.has(_types.KameleoonData.Conversion)){const a=c.get(_types.KameleoonData.Conversion);a.push(b),c.set(_types.KameleoonData.Conversion,a)}else c.set(_types.KameleoonData.Conversion,[b]);break}default:{const{data:c}=b;b.isSent||this.unsentData[a].set(c.type,b)}}return(0,_tsRes.Ok)()}getTree(a){if(this.targetingTrees.has(a.id))return this.targetingTrees.get(a.id);const b=new _targeting.Tree(a);return this.targetingTrees.set(a.id,b),b}clearTrees(){this.targetingTrees.clear()}getUnsentData(a){if(null!==this.mappingIdentifierCustomDataIndex){const b=this.getTargetingData(a);if(b){const c=b[_types.KameleoonData.CustomData];if(c){const b=c[this.mappingIdentifierCustomDataIndex];if(b){const{index:c,value:d}=b,e=new _customData.CustomData(c,...d);e._isMappingIdentifier=!0,this.unsentData[a]||(this.unsentData[a]=new Map),this.unsentData[a].set(c,e)}}}}return this.unsentData[a]}clearUnsentData(a){var b;const c=null===(b=this.unsentData[a])||void 0===b?void 0:b.values();if(c&&this.persistentCustomDataIndexes.size){const b=new Map;for(const a of c)!Array.isArray(a)&&this.isPersistentCustomData(a)&&b.set(a.data.index,a);if(b.size)return void(this.unsentData[a]=b)}delete this.unsentData[a]}clearUnsentDataByKey(a,b){const c=this.unsentData[a];if(c){if(b===_types.KameleoonData.CustomData&&this.persistentCustomDataIndexes.size)for(const[a,d]of c.entries())this.isPersistentCustomData(d)||a===b&&c.delete(a);else if(b===_types.KameleoonData.PageView)for(const a of c.keys())"number"==typeof a&&c.delete(a);else c.delete(b);c.size||delete this.unsentData[a]}}isPersistentCustomData(a){return!!this.persistentCustomDataIndexes.size&&!!_utilities.Utilities.isCustomData(a)&&this.persistentCustomDataIndexes.has(a.data.index)}getLinkedVisitor(a){return this.dataProcessor.getLinkedVisitor(a,this.mappingIdentifierCustomDataIndex)}getVisitorIdentifier(a){const b=this.getTargetingData(a);if(!b)return a;const c=b[_types.KameleoonData.CustomData];if(!c||null===this.mappingIdentifierCustomDataIndex)return a;const d=c[this.mappingIdentifierCustomDataIndex];return d?d.value[0]:a}getTargetingData(a){const b=this.dataProcessor.getTargetingData(a).or(null);return b?b:void 0}get trees(){return this.targetingTrees}get unsentDataVisitors(){return Object.keys(this.unsentData)}get identifierCustomDataIndex(){return this.mappingIdentifierCustomDataIndex}get storedDataTypes(){return this.dataProcessor.storedDataTypeList}get storedCustomDataIndexes(){return this.dataProcessor.storedCustomDataIndexList}set customDataIndexes(a){const[b,c]=[[],[]];a.forEach(a=>{a.localOnly&&b.push(a.index),a.scope===_clientConfiguration.CustomDataScope.Visitor&&c.push(a.index),a.isMappingIdentifier&&(this.mappingIdentifierCustomDataIndex=a.index)}),b.length&&(this.localCustomDataIndexes=new Set(b)),c.length&&(this.persistentCustomDataIndexes=new Set(c))}}exports.DataManager=DataManager;
|
|
2
2
|
//# sourceMappingURL=dataManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataManager.js","names":["DataManager","constructor","a","storage","cleanupInterval","_defineProperty","Map","Set","dataProcessor","DataProcessor","unsentData","cleanupCallback","cleanupTargetingData","sentPageViewTimestamps","clear","cleanupIntervalId","setInterval","err","clearInterval","addData","visitorCode","b","arguments","length","kameleoonData","Array","d","dataItem","updateData","data","type","KameleoonData","CustomData","customData","mappingIdentifierCustomDataIndex","index","_isMappingIdentifier","value","createReference","localCustomDataIndexes","has","isSent","set","PageView","storedData","getTargetingData","or","storedVisitorData","pageView","urlAddress","timestamp","timestamps","Conversion","existingConversions","get","push","Ok","getTree","segment","targetingTrees","id","targetingTree","Tree","clearTrees","getUnsentData","clearUnsentData","dataItems","values","persistentCustomDataIndexes","size","persistentCustomData","isArray","isPersistentCustomData","clearUnsentDataByKey","key","visitorData","dataKey","entries","delete","keys","Utilities","isCustomData","getLinkedVisitor","getVisitorIdentifier","targetingData","customDataValue","trees","unsentDataVisitors","Object","identifierCustomDataIndex","storedDataTypes","storedDataTypeList","storedCustomDataIndexes","storedCustomDataIndexList","customDataIndexes","customDataLocalOnlyIndexes","forEach","localOnly","scope","CustomDataScope","Visitor","isMappingIdentifier","exports"],"sources":["../../src/kameleoonData/dataManager.ts"],"sourcesContent":["import { Ok, Result } from 'ts-res';\nimport { KameleoonError } from 'src/kameleoonError';\nimport { SegmentType, Tree } from 'src/targeting';\nimport { DataProcessor } from './dataProcessor';\nimport { Utilities } from 'src/utilities';\nimport {\n CustomDataConfigurationType,\n CustomDataScope,\n} from 'src/clientConfiguration';\nimport { CustomData } from './customData';\nimport {\n DataManagerParametersType,\n ExistingPageViewDataType,\n KameleoonData,\n KameleoonDataType,\n KameleoonVisitorDataType,\n PageViewDataType,\n UnsentTargetingDataType,\n UnsentVisitorTargetingDataType,\n} from './types';\n\ninterface IDataManager {\n addData(visitorCode: string, ...kameleoonData: KameleoonDataType[]): void;\n getUnsentData: (\n visitorCode: string,\n ) => UnsentTargetingDataType[string] | undefined;\n getTree(segment: SegmentType): Tree;\n clearTrees(): void;\n clearUnsentData: (visitorCode: string) => void;\n isPersistentCustomData: (dataItem: KameleoonDataType) => boolean;\n getLinkedVisitor: (visitorCode: string) => string | null;\n getTargetingData: (\n visitorCode: string,\n ) => KameleoonVisitorDataType | undefined;\n readonly trees: Map<string, Tree>;\n readonly unsentDataVisitors: string[];\n readonly identifierCustomDataIndex: number | null;\n}\n\nexport class DataManager implements IDataManager {\n private targetingTrees: Map<string, Tree> = new Map();\n private localCustomDataIndexes: Set<number> = new Set();\n private persistentCustomDataIndexes: Set<number> = new Set();\n private mappingIdentifierCustomDataIndex: number | null = null;\n private cleanupIntervalId: NodeJS.Timeout | null = null;\n private dataProcessor: DataProcessor;\n private unsentData: UnsentTargetingDataType;\n private sentPageViewTimestamps: Map<number, boolean> = new Map();\n\n constructor({ storage, cleanupInterval }: DataManagerParametersType) {\n this.dataProcessor = new DataProcessor(storage);\n this.unsentData = {};\n\n if (cleanupInterval) {\n const cleanupCallback = () => {\n this.dataProcessor.cleanupTargetingData(cleanupInterval);\n this.sentPageViewTimestamps.clear();\n };\n\n // --- Note ---\n // We can not make delayed code execution recoverable, as it might lead\n // to targeting data storage size overflow\n try {\n this.cleanupIntervalId = setInterval(cleanupCallback, cleanupInterval);\n } catch (err) {\n if (this.cleanupIntervalId) {\n clearInterval(this.cleanupIntervalId);\n }\n\n throw err;\n }\n }\n }\n\n public addData(\n visitorCode: string,\n ...kameleoonData: KameleoonDataType[]\n ): Result<void, KameleoonError> {\n // --- Note ---\n // We assume `this.unsentTargetingData[visitorCode]` is always presents further\n if (!this.unsentData[visitorCode]) {\n this.unsentData[visitorCode] = new Map();\n }\n\n for (const dataItem of kameleoonData) {\n // TODO: this can be optimized to be updated altogether\n // instead of updating each data item separately\n this.dataProcessor.updateData(visitorCode, dataItem);\n\n switch (dataItem.data.type) {\n case KameleoonData.CustomData: {\n const customData = dataItem as CustomData;\n const data = customData.data;\n\n // --- Bug ---\n // - There's a known issue here: `mappingIdentifier` won't be updated\n // in the storage because the data is written before `unsentData` update\n // and we get `mappingIdentifier` only by checking CC here\n // - It doesn't affect the functionality, as stored data is\n // only used for condition evaluation and `Visitor` scoped CD is never removed from `unsentData`\n // still it should be fixed with some `.updateData` refactor\n if (this.mappingIdentifierCustomDataIndex === data.index) {\n customData._isMappingIdentifier = true;\n\n if (visitorCode !== data.value[0]) {\n // --- Note ---\n // Associate linked visitor codes\n this.dataProcessor.createReference(visitorCode, data.value[0]);\n }\n }\n\n if (\n !this.localCustomDataIndexes.has(data.index) &&\n !dataItem.isSent\n ) {\n this.unsentData[visitorCode]!.set(data.index, customData);\n }\n\n break;\n }\n case KameleoonData.PageView: {\n const data = dataItem.data as PageViewDataType;\n\n // --- Note ---\n // `PageViews` can only be processed during storage update as they\n // can't create and merge referrers/titles/timestamps on their own\n // So we have to extract them from storage to update `unsentData` correctly\n const storedData = this.dataProcessor\n .getTargetingData(visitorCode)\n .or({});\n\n if (storedData) {\n const storedVisitorData = storedData[KameleoonData.PageView];\n const pageView = (storedVisitorData as ExistingPageViewDataType)[\n data.urlAddress\n ];\n\n // --- Note ---\n // A case for newly created page view\n if (!dataItem.isSent) {\n for (const timestamp of pageView.timestamps) {\n // --- Note ---\n // As we don't keep `sent` status for each timestamp, we have to\n // check if it was already sent to avoid duplicates\n if (!this.sentPageViewTimestamps.has(timestamp)) {\n this.unsentData[visitorCode]!.set(timestamp, dataItem);\n this.sentPageViewTimestamps.set(timestamp, true);\n }\n }\n // --- Note ---\n // A case for `getRemoteVisitorData` pre-loaded pages that shouldn't be sent again\n } else {\n for (const timestamp of pageView.timestamps) {\n if (!this.sentPageViewTimestamps.has(timestamp)) {\n this.sentPageViewTimestamps.set(timestamp, true);\n }\n }\n }\n }\n\n break;\n }\n case KameleoonData.Conversion: {\n const unsentData = this.unsentData[visitorCode]!;\n\n if (!dataItem.isSent) {\n if (unsentData.has(KameleoonData.Conversion)) {\n const existingConversions = unsentData.get(\n KameleoonData.Conversion,\n ) as KameleoonDataType[];\n\n existingConversions.push(dataItem);\n\n unsentData.set(KameleoonData.Conversion, existingConversions);\n } else {\n unsentData.set(KameleoonData.Conversion, [dataItem]);\n }\n }\n\n break;\n }\n default: {\n const { data } = dataItem;\n\n if (!dataItem.isSent) {\n this.unsentData[visitorCode]!.set(data.type, dataItem);\n }\n }\n }\n }\n\n return Ok();\n }\n\n public getTree(segment: SegmentType): Tree {\n if (this.targetingTrees.has(segment.id)) {\n return this.targetingTrees.get(segment.id)!;\n }\n\n const targetingTree = new Tree(segment);\n this.targetingTrees.set(segment.id, targetingTree);\n\n return targetingTree;\n }\n\n public clearTrees(): void {\n this.targetingTrees.clear();\n }\n\n public getUnsentData(\n visitorCode: string,\n ): UnsentTargetingDataType[string] | undefined {\n return this.unsentData[visitorCode];\n }\n\n public clearUnsentData(visitorCode: string): void {\n const dataItems = this.unsentData[visitorCode]?.values();\n\n if (dataItems && this.persistentCustomDataIndexes.size) {\n const persistentCustomData: UnsentVisitorTargetingDataType = new Map();\n\n for (const dataItem of dataItems) {\n if (!Array.isArray(dataItem) && this.isPersistentCustomData(dataItem)) {\n persistentCustomData.set(dataItem.data.index, dataItem);\n }\n }\n\n if (persistentCustomData.size) {\n this.unsentData[visitorCode] = persistentCustomData;\n return;\n }\n }\n\n delete this.unsentData[visitorCode];\n }\n\n public clearUnsentDataByKey(visitorCode: string, key: KameleoonData): void {\n const visitorData = this.unsentData[visitorCode];\n\n if (!visitorData) {\n return;\n }\n\n if (\n key === KameleoonData.CustomData &&\n this.persistentCustomDataIndexes.size\n ) {\n for (const [dataKey, dataItem] of visitorData.entries()) {\n if (this.isPersistentCustomData(dataItem as KameleoonDataType)) {\n continue;\n }\n\n if (dataKey === key) {\n visitorData.delete(dataKey);\n }\n }\n } else if (key === KameleoonData.PageView) {\n for (const dataKey of visitorData.keys()) {\n if (typeof dataKey === 'number') {\n visitorData.delete(dataKey);\n }\n }\n } else {\n visitorData.delete(key);\n }\n\n if (!visitorData.size) {\n delete this.unsentData[visitorCode];\n }\n }\n\n public isPersistentCustomData(\n dataItem: KameleoonDataType,\n ): dataItem is CustomData {\n if (!this.persistentCustomDataIndexes.size) {\n return false;\n }\n\n if (Utilities.isCustomData(dataItem)) {\n return this.persistentCustomDataIndexes.has(dataItem.data.index);\n }\n\n return false;\n }\n\n public getLinkedVisitor(visitorCode: string): string | null {\n return this.dataProcessor.getLinkedVisitor(\n visitorCode,\n this.mappingIdentifierCustomDataIndex,\n );\n }\n\n public getVisitorIdentifier(visitorCode: string): string {\n const targetingData = this.getTargetingData(visitorCode);\n\n if (!targetingData) {\n return visitorCode;\n }\n\n const customData = targetingData[KameleoonData.CustomData];\n\n if (!customData || this.mappingIdentifierCustomDataIndex === null) {\n return visitorCode;\n }\n\n const customDataValue = customData[this.mappingIdentifierCustomDataIndex];\n\n if (customDataValue) {\n return customDataValue.value[0];\n }\n\n return visitorCode;\n }\n\n public getTargetingData(\n visitorCode: string,\n ): KameleoonVisitorDataType | undefined {\n const targetingData = this.dataProcessor\n .getTargetingData(visitorCode)\n .or(null);\n\n if (!targetingData) {\n return undefined;\n }\n\n return targetingData;\n }\n\n get trees(): Map<string, Tree> {\n return this.targetingTrees;\n }\n\n get unsentDataVisitors(): string[] {\n return Object.keys(this.unsentData);\n }\n\n get identifierCustomDataIndex(): number | null {\n return this.mappingIdentifierCustomDataIndex;\n }\n\n get storedDataTypes(): Set<KameleoonData> {\n return this.dataProcessor.storedDataTypeList;\n }\n\n get storedCustomDataIndexes(): Set<number> {\n return this.dataProcessor.storedCustomDataIndexList;\n }\n\n set customDataIndexes(customData: CustomDataConfigurationType[]) {\n const [customDataLocalOnlyIndexes, persistentCustomDataIndexes]: Array<\n number[]\n > = [[], []];\n\n customData.forEach((customData) => {\n if (customData.localOnly) {\n customDataLocalOnlyIndexes.push(customData.index);\n }\n\n if (customData.scope === CustomDataScope.Visitor) {\n persistentCustomDataIndexes.push(customData.index);\n }\n\n if (customData.isMappingIdentifier) {\n this.mappingIdentifierCustomDataIndex = customData.index;\n }\n });\n\n if (customDataLocalOnlyIndexes.length) {\n this.localCustomDataIndexes = new Set(customDataLocalOnlyIndexes);\n }\n\n if (persistentCustomDataIndexes.length) {\n this.persistentCustomDataIndexes = new Set(persistentCustomDataIndexes);\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataManager.js","names":["DataManager","constructor","a","storage","cleanupInterval","_defineProperty","Map","Set","dataProcessor","DataProcessor","unsentData","cleanupCallback","cleanupTargetingData","sentPageViewTimestamps","clear","cleanupIntervalId","setInterval","err","clearInterval","addData","visitorCode","b","arguments","length","kameleoonData","Array","d","dataItem","updateData","data","type","KameleoonData","CustomData","customData","mappingIdentifierCustomDataIndex","index","_isMappingIdentifier","value","createReference","localCustomDataIndexes","has","isSent","set","PageView","storedData","getTargetingData","or","storedVisitorData","pageView","urlAddress","timestamp","timestamps","Conversion","existingConversions","get","push","Ok","getTree","segment","targetingTrees","id","targetingTree","Tree","clearTrees","getUnsentData","targetingData","customDataValue","mappingCD","clearUnsentData","dataItems","values","persistentCustomDataIndexes","size","persistentCustomData","isArray","isPersistentCustomData","clearUnsentDataByKey","key","visitorData","dataKey","entries","delete","keys","Utilities","isCustomData","getLinkedVisitor","getVisitorIdentifier","trees","unsentDataVisitors","Object","identifierCustomDataIndex","storedDataTypes","storedDataTypeList","storedCustomDataIndexes","storedCustomDataIndexList","customDataIndexes","customDataLocalOnlyIndexes","forEach","localOnly","scope","CustomDataScope","Visitor","isMappingIdentifier","exports"],"sources":["../../src/kameleoonData/dataManager.ts"],"sourcesContent":["import { Ok, Result } from 'ts-res';\nimport { KameleoonError } from 'src/kameleoonError';\nimport { SegmentType, Tree } from 'src/targeting';\nimport { DataProcessor } from './dataProcessor';\nimport { Utilities } from 'src/utilities';\nimport {\n CustomDataConfigurationType,\n CustomDataScope,\n} from 'src/clientConfiguration';\nimport { CustomData } from './customData';\nimport {\n DataManagerParametersType,\n ExistingPageViewDataType,\n KameleoonData,\n KameleoonDataType,\n KameleoonVisitorDataType,\n PageViewDataType,\n UnsentTargetingDataType,\n UnsentVisitorTargetingDataType,\n} from './types';\n\ninterface IDataManager {\n addData(visitorCode: string, ...kameleoonData: KameleoonDataType[]): void;\n getUnsentData: (\n visitorCode: string,\n ) => UnsentTargetingDataType[string] | undefined;\n getTree(segment: SegmentType): Tree;\n clearTrees(): void;\n clearUnsentData: (visitorCode: string) => void;\n isPersistentCustomData: (dataItem: KameleoonDataType) => boolean;\n getLinkedVisitor: (visitorCode: string) => string | null;\n getTargetingData: (\n visitorCode: string,\n ) => KameleoonVisitorDataType | undefined;\n readonly trees: Map<string, Tree>;\n readonly unsentDataVisitors: string[];\n readonly identifierCustomDataIndex: number | null;\n}\n\nexport class DataManager implements IDataManager {\n private targetingTrees: Map<string, Tree> = new Map();\n private localCustomDataIndexes: Set<number> = new Set();\n private persistentCustomDataIndexes: Set<number> = new Set();\n private mappingIdentifierCustomDataIndex: number | null = null;\n private cleanupIntervalId: NodeJS.Timeout | null = null;\n private dataProcessor: DataProcessor;\n private unsentData: UnsentTargetingDataType;\n private sentPageViewTimestamps: Map<number, boolean> = new Map();\n\n constructor({ storage, cleanupInterval }: DataManagerParametersType) {\n this.dataProcessor = new DataProcessor(storage);\n this.unsentData = {};\n\n if (cleanupInterval) {\n const cleanupCallback = () => {\n this.dataProcessor.cleanupTargetingData(cleanupInterval);\n this.sentPageViewTimestamps.clear();\n };\n\n // --- Note ---\n // We can not make delayed code execution recoverable, as it might lead\n // to targeting data storage size overflow\n try {\n this.cleanupIntervalId = setInterval(cleanupCallback, cleanupInterval);\n } catch (err) {\n if (this.cleanupIntervalId) {\n clearInterval(this.cleanupIntervalId);\n }\n\n throw err;\n }\n }\n }\n\n public addData(\n visitorCode: string,\n ...kameleoonData: KameleoonDataType[]\n ): Result<void, KameleoonError> {\n // --- Note ---\n // We assume `this.unsentTargetingData[visitorCode]` is always presents further\n if (!this.unsentData[visitorCode]) {\n this.unsentData[visitorCode] = new Map();\n }\n\n for (const dataItem of kameleoonData) {\n // TODO: this can be optimized to be updated altogether\n // instead of updating each data item separately\n this.dataProcessor.updateData(visitorCode, dataItem);\n\n switch (dataItem.data.type) {\n case KameleoonData.CustomData: {\n const customData = dataItem as CustomData;\n const data = customData.data;\n\n // --- Bug ---\n // - There's a known issue here: `mappingIdentifier` won't be updated\n // in the storage because the data is written before `unsentData` update\n // and we get `mappingIdentifier` only by checking CC here\n // - It doesn't affect the functionality, as stored data is\n // only used for condition evaluation and `Visitor` scoped CD is never removed from `unsentData`\n // still it should be fixed with some `.updateData` refactor\n if (this.mappingIdentifierCustomDataIndex === data.index) {\n customData._isMappingIdentifier = true;\n\n if (visitorCode !== data.value[0]) {\n // --- Note ---\n // Associate linked visitor codes\n this.dataProcessor.createReference(visitorCode, data.value[0]);\n }\n }\n\n if (\n !this.localCustomDataIndexes.has(data.index) &&\n !dataItem.isSent\n ) {\n this.unsentData[visitorCode]!.set(data.index, customData);\n }\n\n break;\n }\n case KameleoonData.PageView: {\n const data = dataItem.data as PageViewDataType;\n\n // --- Note ---\n // `PageViews` can only be processed during storage update as they\n // can't create and merge referrers/titles/timestamps on their own\n // So we have to extract them from storage to update `unsentData` correctly\n const storedData = this.dataProcessor\n .getTargetingData(visitorCode)\n .or({});\n\n if (storedData) {\n const storedVisitorData = storedData[KameleoonData.PageView];\n const pageView = (storedVisitorData as ExistingPageViewDataType)[\n data.urlAddress\n ];\n\n // --- Note ---\n // A case for newly created page view\n if (!dataItem.isSent) {\n for (const timestamp of pageView.timestamps) {\n // --- Note ---\n // As we don't keep `sent` status for each timestamp, we have to\n // check if it was already sent to avoid duplicates\n if (!this.sentPageViewTimestamps.has(timestamp)) {\n this.unsentData[visitorCode]!.set(timestamp, dataItem);\n this.sentPageViewTimestamps.set(timestamp, true);\n }\n }\n // --- Note ---\n // A case for `getRemoteVisitorData` pre-loaded pages that shouldn't be sent again\n } else {\n for (const timestamp of pageView.timestamps) {\n if (!this.sentPageViewTimestamps.has(timestamp)) {\n this.sentPageViewTimestamps.set(timestamp, true);\n }\n }\n }\n }\n\n break;\n }\n case KameleoonData.Conversion: {\n const unsentData = this.unsentData[visitorCode]!;\n\n if (!dataItem.isSent) {\n if (unsentData.has(KameleoonData.Conversion)) {\n const existingConversions = unsentData.get(\n KameleoonData.Conversion,\n ) as KameleoonDataType[];\n\n existingConversions.push(dataItem);\n\n unsentData.set(KameleoonData.Conversion, existingConversions);\n } else {\n unsentData.set(KameleoonData.Conversion, [dataItem]);\n }\n }\n\n break;\n }\n default: {\n const { data } = dataItem;\n\n if (!dataItem.isSent) {\n this.unsentData[visitorCode]!.set(data.type, dataItem);\n }\n }\n }\n }\n\n return Ok();\n }\n\n public getTree(segment: SegmentType): Tree {\n if (this.targetingTrees.has(segment.id)) {\n return this.targetingTrees.get(segment.id)!;\n }\n\n const targetingTree = new Tree(segment);\n this.targetingTrees.set(segment.id, targetingTree);\n\n return targetingTree;\n }\n\n public clearTrees(): void {\n this.targetingTrees.clear();\n }\n\n public getUnsentData(\n visitorCode: string,\n ): UnsentTargetingDataType[string] | undefined {\n if (this.mappingIdentifierCustomDataIndex !== null) {\n const targetingData = this.getTargetingData(visitorCode);\n\n if (targetingData) {\n const customData = targetingData[KameleoonData.CustomData];\n\n if (customData) {\n const customDataValue =\n customData[this.mappingIdentifierCustomDataIndex];\n\n if (customDataValue) {\n const { index, value } = customDataValue;\n const mappingCD = new CustomData(index, ...value);\n mappingCD._isMappingIdentifier = true;\n\n if (!this.unsentData[visitorCode]) {\n this.unsentData[visitorCode] = new Map();\n }\n\n this.unsentData[visitorCode]!.set(index, mappingCD);\n }\n }\n }\n }\n\n return this.unsentData[visitorCode];\n }\n\n public clearUnsentData(visitorCode: string): void {\n const dataItems = this.unsentData[visitorCode]?.values();\n\n if (dataItems && this.persistentCustomDataIndexes.size) {\n const persistentCustomData: UnsentVisitorTargetingDataType = new Map();\n\n for (const dataItem of dataItems) {\n if (!Array.isArray(dataItem) && this.isPersistentCustomData(dataItem)) {\n persistentCustomData.set(dataItem.data.index, dataItem);\n }\n }\n\n if (persistentCustomData.size) {\n this.unsentData[visitorCode] = persistentCustomData;\n return;\n }\n }\n\n delete this.unsentData[visitorCode];\n }\n\n public clearUnsentDataByKey(visitorCode: string, key: KameleoonData): void {\n const visitorData = this.unsentData[visitorCode];\n\n if (!visitorData) {\n return;\n }\n\n if (\n key === KameleoonData.CustomData &&\n this.persistentCustomDataIndexes.size\n ) {\n for (const [dataKey, dataItem] of visitorData.entries()) {\n if (this.isPersistentCustomData(dataItem as KameleoonDataType)) {\n continue;\n }\n\n if (dataKey === key) {\n visitorData.delete(dataKey);\n }\n }\n } else if (key === KameleoonData.PageView) {\n for (const dataKey of visitorData.keys()) {\n if (typeof dataKey === 'number') {\n visitorData.delete(dataKey);\n }\n }\n } else {\n visitorData.delete(key);\n }\n\n if (!visitorData.size) {\n delete this.unsentData[visitorCode];\n }\n }\n\n public isPersistentCustomData(\n dataItem: KameleoonDataType,\n ): dataItem is CustomData {\n if (!this.persistentCustomDataIndexes.size) {\n return false;\n }\n\n if (Utilities.isCustomData(dataItem)) {\n return this.persistentCustomDataIndexes.has(dataItem.data.index);\n }\n\n return false;\n }\n\n public getLinkedVisitor(visitorCode: string): string | null {\n return this.dataProcessor.getLinkedVisitor(\n visitorCode,\n this.mappingIdentifierCustomDataIndex,\n );\n }\n\n public getVisitorIdentifier(visitorCode: string): string {\n const targetingData = this.getTargetingData(visitorCode);\n\n if (!targetingData) {\n return visitorCode;\n }\n\n const customData = targetingData[KameleoonData.CustomData];\n\n if (!customData || this.mappingIdentifierCustomDataIndex === null) {\n return visitorCode;\n }\n\n const customDataValue = customData[this.mappingIdentifierCustomDataIndex];\n\n if (customDataValue) {\n return customDataValue.value[0];\n }\n\n return visitorCode;\n }\n\n public getTargetingData(\n visitorCode: string,\n ): KameleoonVisitorDataType | undefined {\n const targetingData = this.dataProcessor\n .getTargetingData(visitorCode)\n .or(null);\n\n if (!targetingData) {\n return undefined;\n }\n\n return targetingData;\n }\n\n get trees(): Map<string, Tree> {\n return this.targetingTrees;\n }\n\n get unsentDataVisitors(): string[] {\n return Object.keys(this.unsentData);\n }\n\n get identifierCustomDataIndex(): number | null {\n return this.mappingIdentifierCustomDataIndex;\n }\n\n get storedDataTypes(): Set<KameleoonData> {\n return this.dataProcessor.storedDataTypeList;\n }\n\n get storedCustomDataIndexes(): Set<number> {\n return this.dataProcessor.storedCustomDataIndexList;\n }\n\n set customDataIndexes(customData: CustomDataConfigurationType[]) {\n const [customDataLocalOnlyIndexes, persistentCustomDataIndexes]: Array<\n number[]\n > = [[], []];\n\n customData.forEach((customData) => {\n if (customData.localOnly) {\n customDataLocalOnlyIndexes.push(customData.index);\n }\n\n if (customData.scope === CustomDataScope.Visitor) {\n persistentCustomDataIndexes.push(customData.index);\n }\n\n if (customData.isMappingIdentifier) {\n this.mappingIdentifierCustomDataIndex = customData.index;\n }\n });\n\n if (customDataLocalOnlyIndexes.length) {\n this.localCustomDataIndexes = new Set(customDataLocalOnlyIndexes);\n }\n\n if (persistentCustomDataIndexes.length) {\n this.persistentCustomDataIndexes = new Set(persistentCustomDataIndexes);\n }\n }\n}\n"],"mappings":"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"}
|