@kameleoon/javascript-sdk-core 4.0.1 → 4.2.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.
Files changed (127) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/clientConfiguration/clientConfiguration.d.ts +5 -2
  3. package/dist/clientConfiguration/clientConfiguration.js +1 -1
  4. package/dist/clientConfiguration/clientConfiguration.js.map +1 -1
  5. package/dist/clientConfiguration/constants.d.ts +3 -2
  6. package/dist/clientConfiguration/constants.js +1 -1
  7. package/dist/clientConfiguration/constants.js.map +1 -1
  8. package/dist/clientConfiguration/index.d.ts +1 -1
  9. package/dist/clientConfiguration/index.js +1 -1
  10. package/dist/clientConfiguration/index.js.map +1 -1
  11. package/dist/clientConfiguration/types.d.ts +1 -0
  12. package/dist/clientConfiguration/types.js.map +1 -1
  13. package/dist/constants.js +1 -1
  14. package/dist/constants.js.map +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/kameleoonClient.d.ts +7 -3
  19. package/dist/kameleoonClient.js +1 -1
  20. package/dist/kameleoonClient.js.map +1 -1
  21. package/dist/kameleoonClientInterface.d.ts +38 -3
  22. package/dist/kameleoonClientInterface.js.map +1 -1
  23. package/dist/kameleoonData/applicationVersion.d.ts +0 -9
  24. package/dist/kameleoonData/applicationVersion.js.map +1 -1
  25. package/dist/kameleoonData/browser.d.ts +3 -12
  26. package/dist/kameleoonData/browser.js +1 -1
  27. package/dist/kameleoonData/browser.js.map +1 -1
  28. package/dist/kameleoonData/conversion.d.ts +11 -13
  29. package/dist/kameleoonData/conversion.js +1 -1
  30. package/dist/kameleoonData/conversion.js.map +1 -1
  31. package/dist/kameleoonData/cookie.d.ts +0 -9
  32. package/dist/kameleoonData/cookie.js.map +1 -1
  33. package/dist/kameleoonData/customData.d.ts +3 -13
  34. package/dist/kameleoonData/customData.js +1 -1
  35. package/dist/kameleoonData/customData.js.map +1 -1
  36. package/dist/kameleoonData/dataManager.d.ts +11 -5
  37. package/dist/kameleoonData/dataManager.js +1 -1
  38. package/dist/kameleoonData/dataManager.js.map +1 -1
  39. package/dist/kameleoonData/dataProcessor.d.ts +13 -6
  40. package/dist/kameleoonData/dataProcessor.js +1 -1
  41. package/dist/kameleoonData/dataProcessor.js.map +1 -1
  42. package/dist/kameleoonData/device.d.ts +3 -12
  43. package/dist/kameleoonData/device.js +1 -1
  44. package/dist/kameleoonData/device.js.map +1 -1
  45. package/dist/kameleoonData/geolocation.d.ts +3 -12
  46. package/dist/kameleoonData/geolocation.js +1 -1
  47. package/dist/kameleoonData/geolocation.js.map +1 -1
  48. package/dist/kameleoonData/index.d.ts +1 -0
  49. package/dist/kameleoonData/index.js +1 -1
  50. package/dist/kameleoonData/index.js.map +1 -1
  51. package/dist/kameleoonData/kameleoonConversionScore.d.ts +15 -0
  52. package/dist/kameleoonData/kameleoonConversionScore.js +2 -0
  53. package/dist/kameleoonData/kameleoonConversionScore.js.map +1 -0
  54. package/dist/kameleoonData/operatingSystem.d.ts +3 -12
  55. package/dist/kameleoonData/operatingSystem.js +1 -1
  56. package/dist/kameleoonData/operatingSystem.js.map +1 -1
  57. package/dist/kameleoonData/pageView.d.ts +4 -13
  58. package/dist/kameleoonData/pageView.js +1 -1
  59. package/dist/kameleoonData/pageView.js.map +1 -1
  60. package/dist/kameleoonData/types.d.ts +54 -11
  61. package/dist/kameleoonData/types.js +1 -1
  62. package/dist/kameleoonData/types.js.map +1 -1
  63. package/dist/kameleoonData/userAgent.d.ts +0 -9
  64. package/dist/kameleoonData/userAgent.js.map +1 -1
  65. package/dist/kameleoonData/visitProcessor.d.ts +34 -0
  66. package/dist/kameleoonData/visitProcessor.js +2 -0
  67. package/dist/kameleoonData/visitProcessor.js.map +1 -0
  68. package/dist/kameleoonData/visitsData.d.ts +7 -21
  69. package/dist/kameleoonData/visitsData.js +1 -1
  70. package/dist/kameleoonData/visitsData.js.map +1 -1
  71. package/dist/requester/constants.js +1 -1
  72. package/dist/requester/constants.js.map +1 -1
  73. package/dist/requester/requester.d.ts +2 -3
  74. package/dist/requester/requester.js +1 -1
  75. package/dist/requester/requester.js.map +1 -1
  76. package/dist/requester/types.d.ts +15 -3
  77. package/dist/requester/types.js +1 -1
  78. package/dist/requester/types.js.map +1 -1
  79. package/dist/requester/urlProvider.d.ts +2 -3
  80. package/dist/requester/urlProvider.js +1 -1
  81. package/dist/requester/urlProvider.js.map +1 -1
  82. package/dist/storage/storage.js +1 -1
  83. package/dist/storage/types.d.ts +1 -1
  84. package/dist/storage/types.js.map +1 -1
  85. package/dist/targeting/conditions/browser.js +1 -1
  86. package/dist/targeting/conditions/browser.js.map +1 -1
  87. package/dist/targeting/conditions/conditionFactory.js +1 -1
  88. package/dist/targeting/conditions/conditionFactory.js.map +1 -1
  89. package/dist/targeting/conditions/conversionLikelihood.d.ts +12 -0
  90. package/dist/targeting/conditions/conversionLikelihood.js +2 -0
  91. package/dist/targeting/conditions/conversionLikelihood.js.map +1 -0
  92. package/dist/targeting/conditions/firstVisit.js +1 -1
  93. package/dist/targeting/conditions/firstVisit.js.map +1 -1
  94. package/dist/targeting/conditions/geolocation.js +1 -1
  95. package/dist/targeting/conditions/geolocation.js.map +1 -1
  96. package/dist/targeting/conditions/index.d.ts +1 -0
  97. package/dist/targeting/conditions/index.js +1 -1
  98. package/dist/targeting/conditions/index.js.map +1 -1
  99. package/dist/targeting/conditions/lastVisit.js +1 -1
  100. package/dist/targeting/conditions/lastVisit.js.map +1 -1
  101. package/dist/targeting/conditions/newVisitor.js +1 -1
  102. package/dist/targeting/conditions/newVisitor.js.map +1 -1
  103. package/dist/targeting/conditions/pageUrl.js.map +1 -1
  104. package/dist/targeting/conditions/previousPage.js +1 -1
  105. package/dist/targeting/conditions/previousPage.js.map +1 -1
  106. package/dist/targeting/conditions/sameDayVisits.js +1 -1
  107. package/dist/targeting/conditions/sameDayVisits.js.map +1 -1
  108. package/dist/targeting/conditions/targetFeatureFlag.js +1 -1
  109. package/dist/targeting/conditions/types.d.ts +3 -0
  110. package/dist/targeting/conditions/types.js.map +1 -1
  111. package/dist/targeting/conditions/visits.js +1 -1
  112. package/dist/targeting/conditions/visits.js.map +1 -1
  113. package/dist/targeting/index.d.ts +2 -2
  114. package/dist/targeting/index.js +1 -1
  115. package/dist/targeting/index.js.map +1 -1
  116. package/dist/targeting/types.d.ts +4 -0
  117. package/dist/targeting/types.js.map +1 -1
  118. package/dist/types.d.ts +26 -2
  119. package/dist/types.js.map +1 -1
  120. package/dist/utilities/types.d.ts +6 -1
  121. package/dist/utilities/types.js.map +1 -1
  122. package/dist/utilities/utilities.d.ts +1 -1
  123. package/dist/utilities/utilities.js +1 -1
  124. package/dist/utilities/utilities.js.map +1 -1
  125. package/dist/variationConfiguration/types.d.ts +1 -1
  126. package/dist/variationConfiguration/types.js.map +1 -1
  127. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cookie.js","names":["Cookie","constructor","cookie","_defineProperty","sent","fromString","cookieString","KameleoonError","KameleoonException","CookieParse","pairs","split","map","item","key","value","trim","url","data","type","KameleoonData","isSent","exports"],"sources":["../../src/kameleoonData/cookie.ts"],"sourcesContent":["import { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport {\n CookieDataType,\n CookieType,\n IKameleoonData,\n KameleoonData,\n} from './types';\n\n/**\n * @class\n * Cookie - a class for creating an instance for defining user's cookie\n * */\nexport class Cookie implements IKameleoonData {\n private cookie: CookieType[];\n private sent: boolean;\n\n /**\n * @param {CookieType[]} cookie - a list of cookies\n * */\n constructor(cookie: CookieType[]) {\n this.cookie = cookie;\n this.sent = false;\n }\n\n /**\n * @method fromString - a static method for creating an instance of `Cookie` from a string\n * @param {string} cookieString - a string containing a list of cookies\n * @throws {KameleoonError} throws an error if the string is not valid cookie\n * @returns {Cookie} an instance of `Cookie`\n * */\n static fromString(cookieString: string): Cookie {\n if (!cookieString) {\n throw new KameleoonError(\n KameleoonException.CookieParse,\n \"Cookie string can't be empty\",\n );\n }\n\n const pairs = cookieString.split(';');\n\n const cookie = pairs.map((item) => {\n const [key, value] = item.trim().split('=');\n\n if (!key || !value) {\n throw new KameleoonError(\n KameleoonException.CookieParse,\n 'Cookie string is not valid',\n );\n }\n\n return { key, value };\n });\n\n return new Cookie(cookie);\n }\n\n /**\n * @property url - url for the current data type used for events tracking\n * */\n get url(): string {\n return '';\n }\n\n /**\n * @property data - data of the current class instance\n * */\n get data(): CookieDataType {\n return {\n cookie: this.cookie,\n type: KameleoonData.Cookie,\n sent: this.sent,\n };\n }\n\n /**\n * @property isSent - signifying if the data was sent already tracked\n * */\n get isSent(): boolean {\n return this.sent;\n }\n\n set isSent(value: boolean) {\n this.sent = value;\n }\n}\n"],"mappings":"wqBAYO,KAAM,CAAAA,MAAiC,CAO5CC,WAAWA,CAACC,CAAoB,CAAE,CAAAC,eAAA,uBAAAA,eAAA,qBAChC,IAAI,CAACD,MAAM,CAAGA,CAAM,CACpB,IAAI,CAACE,IAAI,GACX,CAQA,MAAO,CAAAC,UAAUA,CAACC,CAAoB,CAAU,CAC9C,GAAI,CAACA,CAAY,CACf,KAAM,IAAI,CAAAC,8BAAc,CACtBC,kCAAkB,CAACC,WAAW,CAC9B,8BACF,CAAC,CACF,KAEK,CAAAC,CAAK,CAAGJ,CAAY,CAACK,KAAK,CAAC,GAAG,CAAC,CAE/BT,CAAM,CAAGQ,CAAK,CAACE,GAAG,CAAEC,CAAI,EAAK,CACjC,KAAM,CAACC,CAAG,CAAEC,CAAK,CAAC,CAAGF,CAAI,CAACG,IAAI,CAAC,CAAC,CAACL,KAAK,CAAC,GAAG,CAAC,CAE3C,GAAI,CAACG,CAAG,EAAI,CAACC,CAAK,CAChB,KAAM,IAAI,CAAAR,8BAAc,CACtBC,kCAAkB,CAACC,WAAW,CAC9B,4BACF,CAAC,CAGH,MAAO,CAAEK,GAAG,CAAHA,CAAG,CAAEC,KAAK,CAALA,CAAM,CACtB,CAAC,CAAC,CAEF,MAAO,IAAI,CAAAf,MAAM,CAACE,CAAM,CAC1B,CAKA,GAAI,CAAAe,GAAGA,CAAA,CAAW,CAChB,MAAO,EACT,CAKA,GAAI,CAAAC,IAAIA,CAAA,CAAmB,CACzB,MAAO,CACLhB,MAAM,CAAE,IAAI,CAACA,MAAM,CACnBiB,IAAI,CAAEC,oBAAa,CAACpB,MAAM,CAC1BI,IAAI,CAAE,IAAI,CAACA,IACb,CACF,CAKA,GAAI,CAAAiB,MAAMA,CAAA,CAAY,CACpB,MAAO,KAAI,CAACjB,IACd,CAEA,GAAI,CAAAiB,MAAMA,CAACN,CAAc,CAAE,CACzB,IAAI,CAACX,IAAI,CAAGW,CACd,CACF,CAACO,OAAA,CAAAtB,MAAA,CAAAA,MAAA"}
1
+ {"version":3,"file":"cookie.js","names":["Cookie","constructor","cookie","_defineProperty","sent","fromString","cookieString","KameleoonError","KameleoonException","CookieParse","pairs","split","map","item","key","value","trim","url","data","type","KameleoonData","isSent","exports"],"sources":["../../src/kameleoonData/cookie.ts"],"sourcesContent":["import { KameleoonError, KameleoonException } from 'src/kameleoonError';\nimport {\n CookieDataType,\n CookieType,\n IKameleoonData,\n KameleoonData,\n} from './types';\n\n/**\n * @class\n * Cookie - a class for creating an instance for defining user's cookie\n * */\nexport class Cookie implements IKameleoonData {\n private cookie: CookieType[];\n private sent: boolean;\n\n /**\n * @param {CookieType[]} cookie - a list of cookies\n * */\n constructor(cookie: CookieType[]) {\n this.cookie = cookie;\n this.sent = false;\n }\n\n /**\n * @method fromString - a static method for creating an instance of `Cookie` from a string\n * @param {string} cookieString - a string containing a list of cookies\n * @throws {KameleoonError} throws an error if the string is not valid cookie\n * @returns {Cookie} an instance of `Cookie`\n * */\n static fromString(cookieString: string): Cookie {\n if (!cookieString) {\n throw new KameleoonError(\n KameleoonException.CookieParse,\n \"Cookie string can't be empty\",\n );\n }\n\n const pairs = cookieString.split(';');\n\n const cookie = pairs.map((item) => {\n const [key, value] = item.trim().split('=');\n\n if (!key || !value) {\n throw new KameleoonError(\n KameleoonException.CookieParse,\n 'Cookie string is not valid',\n );\n }\n\n return { key, value };\n });\n\n return new Cookie(cookie);\n }\n\n get url(): string {\n return '';\n }\n\n get data(): CookieDataType {\n return {\n cookie: this.cookie,\n type: KameleoonData.Cookie,\n sent: this.sent,\n };\n }\n\n get isSent(): boolean {\n return this.sent;\n }\n\n set isSent(value: boolean) {\n this.sent = value;\n }\n}\n"],"mappings":"wqBAYO,KAAM,CAAAA,MAAiC,CAO5CC,WAAWA,CAACC,CAAoB,CAAE,CAAAC,eAAA,uBAAAA,eAAA,qBAChC,IAAI,CAACD,MAAM,CAAGA,CAAM,CACpB,IAAI,CAACE,IAAI,GACX,CAQA,MAAO,CAAAC,UAAUA,CAACC,CAAoB,CAAU,CAC9C,GAAI,CAACA,CAAY,CACf,KAAM,IAAI,CAAAC,8BAAc,CACtBC,kCAAkB,CAACC,WAAW,CAC9B,8BACF,CAAC,CACF,KAEK,CAAAC,CAAK,CAAGJ,CAAY,CAACK,KAAK,CAAC,GAAG,CAAC,CAE/BT,CAAM,CAAGQ,CAAK,CAACE,GAAG,CAAEC,CAAI,EAAK,CACjC,KAAM,CAACC,CAAG,CAAEC,CAAK,CAAC,CAAGF,CAAI,CAACG,IAAI,CAAC,CAAC,CAACL,KAAK,CAAC,GAAG,CAAC,CAE3C,GAAI,CAACG,CAAG,EAAI,CAACC,CAAK,CAChB,KAAM,IAAI,CAAAR,8BAAc,CACtBC,kCAAkB,CAACC,WAAW,CAC9B,4BACF,CAAC,CAGH,MAAO,CAAEK,GAAG,CAAHA,CAAG,CAAEC,KAAK,CAALA,CAAM,CACtB,CAAC,CAAC,CAEF,MAAO,IAAI,CAAAf,MAAM,CAACE,CAAM,CAC1B,CAEA,GAAI,CAAAe,GAAGA,CAAA,CAAW,CAChB,MAAO,EACT,CAEA,GAAI,CAAAC,IAAIA,CAAA,CAAmB,CACzB,MAAO,CACLhB,MAAM,CAAE,IAAI,CAACA,MAAM,CACnBiB,IAAI,CAAEC,oBAAa,CAACpB,MAAM,CAC1BI,IAAI,CAAE,IAAI,CAACA,IACb,CACF,CAEA,GAAI,CAAAiB,MAAMA,CAAA,CAAY,CACpB,MAAO,KAAI,CAACjB,IACd,CAEA,GAAI,CAAAiB,MAAMA,CAACN,CAAc,CAAE,CACzB,IAAI,CAACX,IAAI,CAAGW,CACd,CACF,CAACO,OAAA,CAAAtB,MAAA,CAAAA,MAAA"}
@@ -24,17 +24,8 @@ export declare class CustomData implements IKameleoonData {
24
24
  * ```
25
25
  * */
26
26
  constructor(index: number, ...value: string[]);
27
- /**
28
- * @property url - url for the current data type used for events tracking
29
- * */
30
27
  get url(): string;
31
- /**
32
- * @property data - data of the current class instance
33
- * */
34
28
  get data(): CustomDataType;
35
- /**
36
- * @property isSent - signifying if the data was sent already tracked
37
- * */
38
29
  get isSent(): boolean;
39
30
  set isSent(value: boolean);
40
31
  /**
@@ -44,9 +35,8 @@ export declare class CustomData implements IKameleoonData {
44
35
  set _isMappingIdentifier(value: boolean);
45
36
  /**
46
37
  * @private
47
- * @method _listFromVisits - an internal method for creating a list of custom data from a list of visits
48
- * @param {VisitType[]} visits - a list of visits
49
- * @returns {CustomData[]} a list of custom data
38
+ * @method _updateFromVisit - an internal method for updating a list of custom data from a visit
39
+ * @param {VisitType} visit - a visit
50
40
  * */
51
- static _listFromVisits(visits: VisitType[]): CustomData[];
41
+ static _updateFromVisit(visit: VisitType, dataMap: Map<number, CustomData>): void;
52
42
  }
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CustomData=void 0;var _requester=require("../requester"),_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 CustomData{constructor(a){_defineProperty(this,"index",void 0),_defineProperty(this,"value",void 0),_defineProperty(this,"sent",void 0),_defineProperty(this,"isIdentifier",void 0),this.index=a;for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];this.value=c,this.sent=!1,this.isIdentifier=!1}get url(){if("number"!=typeof this.index)return"";const a=[...new Set(this.value)];let b={};if(a.forEach(a=>{b[a]=1}),!Object.keys(b).length)return"";let c="";return this.isIdentifier&&(c=_requester.UrlParameter.MappingIdentifier+"true"),_requester.UrlEventType.CustomData+_requester.UrlParameter.Index+this.index+_requester.UrlParameter.ValuesCountMap+encodeURIComponent(JSON.stringify(b))+_requester.UrlParameter.Overwrite+"true"+c}get data(){return{index:this.index,value:this.value,type:_types.KameleoonData.CustomData,isIdentifier:this.isIdentifier,sent:this.sent}}get isSent(){return this.sent}set isSent(a){this.sent=a}set _isMappingIdentifier(a){this.isIdentifier=a}static _listFromVisits(a){const b=[],c=new Map;for(let b=a.length-1;0<=b;b--){const d=a[b];if(!d.customDataEvents)continue;const e=d.customDataEvents;for(const a of e){const{index:b,valuesCountMap:d}=a.data;c.set(b,Object.keys(d))}}for(const[d,e]of c)b.push(new CustomData(d,...e));return b}}exports.CustomData=CustomData;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CustomData=void 0;var _requester=require("../requester"),_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 CustomData{constructor(a){_defineProperty(this,"index",void 0),_defineProperty(this,"value",void 0),_defineProperty(this,"sent",void 0),_defineProperty(this,"isIdentifier",void 0),this.index=a;for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];this.value=c,this.sent=!1,this.isIdentifier=!1}get url(){if("number"!=typeof this.index)return"";const a=[...new Set(this.value)];let b={};if(a.forEach(a=>{b[a]=1}),!Object.keys(b).length)return"";let c="";return this.isIdentifier&&(c=_requester.UrlParameter.MappingIdentifier+"true"),_requester.UrlEventType.CustomData+_requester.UrlParameter.Index+this.index+_requester.UrlParameter.ValuesCountMap+encodeURIComponent(JSON.stringify(b))+_requester.UrlParameter.Overwrite+"true"+c}get data(){return{index:this.index,value:this.value,type:_types.KameleoonData.CustomData,isIdentifier:this.isIdentifier,sent:this.sent}}get isSent(){return this.sent}set isSent(a){this.sent=a}set _isMappingIdentifier(a){this.isIdentifier=a}static _updateFromVisit(a,b){var c;if(null!==(c=a.customDataEvents)&&void 0!==c&&c.length)for(let c=a.customDataEvents.length-1;0<=c;c--){const{index:d,valuesCountMap:e}=a.customDataEvents[c].data;b.has(d)||b.set(d,new CustomData(d,...Object.keys(e)))}}}exports.CustomData=CustomData;
2
2
  //# sourceMappingURL=customData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"customData.js","names":["CustomData","constructor","index","_defineProperty","b","arguments","length","value","Array","d","sent","isIdentifier","url","uniqueValues","Set","resultValue","forEach","Object","keys","identifierParameter","UrlParameter","MappingIdentifier","UrlEventType","Index","ValuesCountMap","encodeURIComponent","JSON","stringify","Overwrite","data","type","KameleoonData","isSent","_isMappingIdentifier","_listFromVisits","visits","resultData","customDataMap","Map","i","visit","customDataEvents","customDataEvent","valuesCountMap","set","push","exports"],"sources":["../../src/kameleoonData/customData.ts"],"sourcesContent":["import { UrlEventType, UrlParameter, VisitType } from 'src/requester';\nimport { CustomDataType, IKameleoonData, KameleoonData } from './types';\n\n/**\n * @class\n * CustomData - a class for creating an instance for user's custom data\n * */\nexport class CustomData implements IKameleoonData {\n private index: number;\n private value: string[];\n private sent: boolean;\n private isIdentifier: boolean;\n\n /**\n * @param {number} index - an index of custom data to be stored under in a state, an index of custom data can be specified in `Advanced Tools` section of Kameleoon Application\n * @param {string[]} value - custom value to store under the specified id, value can be anything but has to be stringified to match the `string` type. *Note* value is variadic parameter and can be used as follows\n * @example\n * ```ts\n * // - Single value\n * const customData = new CustomData(0, 'value_1');\n * // - Variadic number of values\n * const customData = new CustomData(0, 'value_1', 'value_2', 'value_3');\n * // - Array of values\n * const values = ['value_1', 'value_2', 'value_3'];\n * const customData = new CustomData(0, ...values);\n * ```\n * */\n constructor(index: number, ...value: string[]) {\n this.index = index;\n this.value = value;\n this.sent = false;\n this.isIdentifier = false;\n }\n\n /**\n * @property url - url for the current data type used for events tracking\n * */\n get url(): string {\n // --- Note ---\n // If SDK is used in vanilla JS codebase, then you're also able to create an instance\n // with no required data, we don't want send anything to tracking in that case\n if (typeof this.index !== 'number') {\n return '';\n }\n\n const uniqueValues = [...new Set(this.value)];\n let resultValue: Record<string, 1> = {};\n\n // --- Note ---\n // Final value should look like this `{ \"value_1\": 1, \"value_2\": 1, \"value_3\": 1}`\n // With no duplicates\n uniqueValues.forEach((value) => {\n resultValue[value] = 1;\n });\n\n if (!Object.keys(resultValue).length) {\n return '';\n }\n\n let identifierParameter = '';\n\n if (this.isIdentifier) {\n identifierParameter = UrlParameter.MappingIdentifier + String(true);\n }\n\n return (\n UrlEventType.CustomData +\n UrlParameter.Index +\n this.index +\n UrlParameter.ValuesCountMap +\n encodeURIComponent(JSON.stringify(resultValue)) +\n UrlParameter.Overwrite +\n String(true) +\n identifierParameter\n );\n }\n\n /**\n * @property data - data of the current class instance\n * */\n get data(): CustomDataType {\n return {\n index: this.index,\n value: this.value,\n type: KameleoonData.CustomData,\n isIdentifier: this.isIdentifier,\n sent: this.sent,\n };\n }\n\n /**\n * @property isSent - signifying if the data was sent already tracked\n * */\n get isSent(): boolean {\n return this.sent;\n }\n\n set isSent(value: boolean) {\n this.sent = value;\n }\n\n /**\n * @property isMappingIdentifier - signifying if the data is a mapping identifier\n * @private\n * */\n set _isMappingIdentifier(value: boolean) {\n this.isIdentifier = value;\n }\n\n /**\n * @private\n * @method _listFromVisits - an internal method for creating a list of custom data from a list of visits\n * @param {VisitType[]} visits - a list of visits\n * @returns {CustomData[]} a list of custom data\n * */\n public static _listFromVisits(visits: VisitType[]): CustomData[] {\n const resultData: CustomData[] = [];\n const customDataMap = new Map<number, string[]>();\n\n // --- Note ---\n // Going backwards to get the latest visit data\n for (let i = visits.length - 1; i >= 0; i--) {\n const visit = visits[i];\n\n if (!visit.customDataEvents) {\n continue;\n }\n\n const customDataEvents = visit.customDataEvents;\n\n for (const customDataEvent of customDataEvents) {\n const { index, valuesCountMap } = customDataEvent.data;\n\n customDataMap.set(index, Object.keys(valuesCountMap));\n }\n }\n\n for (const [index, data] of customDataMap) {\n resultData.push(new CustomData(index, ...data));\n }\n\n return resultData;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"customData.js","names":["CustomData","constructor","index","_defineProperty","b","arguments","length","value","Array","d","sent","isIdentifier","url","uniqueValues","Set","resultValue","forEach","Object","keys","identifierParameter","UrlParameter","MappingIdentifier","UrlEventType","Index","ValuesCountMap","encodeURIComponent","JSON","stringify","Overwrite","data","type","KameleoonData","isSent","_isMappingIdentifier","_updateFromVisit","visit","dataMap","c","customDataEvents","i","valuesCountMap","has","set","exports"],"sources":["../../src/kameleoonData/customData.ts"],"sourcesContent":["import { UrlEventType, UrlParameter, VisitType } from 'src/requester';\nimport { CustomDataType, IKameleoonData, KameleoonData } from './types';\n\n/**\n * @class\n * CustomData - a class for creating an instance for user's custom data\n * */\nexport class CustomData implements IKameleoonData {\n private index: number;\n private value: string[];\n private sent: boolean;\n private isIdentifier: boolean;\n\n /**\n * @param {number} index - an index of custom data to be stored under in a state, an index of custom data can be specified in `Advanced Tools` section of Kameleoon Application\n * @param {string[]} value - custom value to store under the specified id, value can be anything but has to be stringified to match the `string` type. *Note* value is variadic parameter and can be used as follows\n * @example\n * ```ts\n * // - Single value\n * const customData = new CustomData(0, 'value_1');\n * // - Variadic number of values\n * const customData = new CustomData(0, 'value_1', 'value_2', 'value_3');\n * // - Array of values\n * const values = ['value_1', 'value_2', 'value_3'];\n * const customData = new CustomData(0, ...values);\n * ```\n * */\n constructor(index: number, ...value: string[]) {\n this.index = index;\n this.value = value;\n this.sent = false;\n this.isIdentifier = false;\n }\n\n get url(): string {\n // --- Note ---\n // If SDK is used in vanilla JS codebase, then you're also able to create an instance\n // with no required data, we don't want send anything to tracking in that case\n if (typeof this.index !== 'number') {\n return '';\n }\n\n const uniqueValues = [...new Set(this.value)];\n let resultValue: Record<string, 1> = {};\n\n // --- Note ---\n // Final value should look like this `{ \"value_1\": 1, \"value_2\": 1, \"value_3\": 1}`\n // With no duplicates\n uniqueValues.forEach((value) => {\n resultValue[value] = 1;\n });\n\n if (!Object.keys(resultValue).length) {\n return '';\n }\n\n let identifierParameter = '';\n\n if (this.isIdentifier) {\n identifierParameter = UrlParameter.MappingIdentifier + String(true);\n }\n\n return (\n UrlEventType.CustomData +\n UrlParameter.Index +\n this.index +\n UrlParameter.ValuesCountMap +\n encodeURIComponent(JSON.stringify(resultValue)) +\n UrlParameter.Overwrite +\n String(true) +\n identifierParameter\n );\n }\n\n get data(): CustomDataType {\n return {\n index: this.index,\n value: this.value,\n type: KameleoonData.CustomData,\n isIdentifier: this.isIdentifier,\n sent: this.sent,\n };\n }\n\n get isSent(): boolean {\n return this.sent;\n }\n\n set isSent(value: boolean) {\n this.sent = value;\n }\n\n /**\n * @property isMappingIdentifier - signifying if the data is a mapping identifier\n * @private\n * */\n set _isMappingIdentifier(value: boolean) {\n this.isIdentifier = value;\n }\n\n /**\n * @private\n * @method _updateFromVisit - an internal method for updating a list of custom data from a visit\n * @param {VisitType} visit - a visit\n * */\n public static _updateFromVisit(\n visit: VisitType,\n dataMap: Map<number, CustomData>,\n ): void {\n if (visit.customDataEvents?.length) {\n for (let i = visit.customDataEvents.length - 1; i >= 0; i--) {\n const { index, valuesCountMap } = visit.customDataEvents[i].data;\n\n if (!dataMap.has(index)) {\n dataMap.set(\n index,\n new CustomData(index, ...Object.keys(valuesCountMap)),\n );\n }\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { Result } from 'ts-res';
2
2
  import { KameleoonError } from '../kameleoonError';
3
- import { SegmentType, TargetingDataType, Tree } from '../targeting';
3
+ import { SegmentType, Tree } from '../targeting';
4
4
  import { CustomDataConfigurationType } from '../clientConfiguration';
5
5
  import { CustomData } from './customData';
6
- import { DataManagerParametersType, KameleoonData, KameleoonDataType, UnsentTargetingDataType } from './types';
6
+ import { DataManagerParametersType, KameleoonData, KameleoonDataType, KameleoonVisitorDataType, UnsentTargetingDataType } from './types';
7
7
  interface IDataManager {
8
8
  addData(visitorCode: string, ...kameleoonData: KameleoonDataType[]): void;
9
9
  getUnsentData: (visitorCode: string) => UnsentTargetingDataType[string] | undefined;
@@ -11,15 +11,17 @@ interface IDataManager {
11
11
  clearTrees(): void;
12
12
  clearUnsentData: (visitorCode: string) => void;
13
13
  isPersistentCustomData: (dataItem: KameleoonDataType) => boolean;
14
+ getLinkedVisitor: (visitorCode: string) => string | null;
15
+ getTargetingData: (visitorCode: string) => KameleoonVisitorDataType | undefined;
14
16
  readonly trees: Map<string, Tree>;
15
- readonly storedTargetingData: TargetingDataType;
16
17
  readonly unsentDataVisitors: string[];
18
+ readonly identifierCustomDataIndex: number | null;
17
19
  }
18
20
  export declare class DataManager implements IDataManager {
19
21
  private targetingTrees;
20
22
  private localCustomDataIndexes;
21
23
  private persistentCustomDataIndexes;
22
- private mappingIdentifierCustomDataIndexes;
24
+ private mappingIdentifierCustomDataIndex;
23
25
  private targetingDataIntervalId;
24
26
  private dataProcessor;
25
27
  private unsentData;
@@ -32,10 +34,14 @@ export declare class DataManager implements IDataManager {
32
34
  clearUnsentData(visitorCode: string): void;
33
35
  clearUnsentDataByKey(visitorCode: string, key: KameleoonData): void;
34
36
  isPersistentCustomData(dataItem: KameleoonDataType): dataItem is CustomData;
37
+ getLinkedVisitor(visitorCode: string): string | null;
35
38
  getVisitorIdentifier(visitorCode: string): string;
39
+ getTargetingData(visitorCode: string): KameleoonVisitorDataType | undefined;
36
40
  get trees(): Map<string, Tree>;
37
41
  get unsentDataVisitors(): string[];
38
- get storedTargetingData(): TargetingDataType;
42
+ get identifierCustomDataIndex(): number | null;
43
+ get storedDataTypes(): Set<KameleoonData>;
44
+ get storedCustomDataIndexes(): Set<number>;
39
45
  set customDataIndexes(customData: CustomDataConfigurationType[]);
40
46
  }
41
47
  export {};
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataManager=void 0;var _targeting=require("../targeting"),_dataProcessor=require("./dataProcessor"),_utilities=require("../utilities"),_clientConfiguration=require("../clientConfiguration"),_types=require("../types"),_types2=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,targetingCleanupInterval:c}=a;if(_defineProperty(this,"targetingTrees",new Map),_defineProperty(this,"localCustomDataIndexes",new Set),_defineProperty(this,"persistentCustomDataIndexes",new Set),_defineProperty(this,"mappingIdentifierCustomDataIndexes",new Set),_defineProperty(this,"targetingDataIntervalId",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=0>c?1:c,b=()=>{this.dataProcessor.cleanupOutdatedTargetingData(c),this.sentPageViewTimestamps.clear()};try{this.targetingDataIntervalId=setInterval(b,a*_types.Milliseconds.Minute)}catch(a){throw this.targetingDataIntervalId&&clearInterval(this.targetingDataIntervalId),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 _types2.KameleoonData.CustomData:{const c=b,d=c.data;this.mappingIdentifierCustomDataIndexes.has(d.index)&&(c._isMappingIdentifier=!0),this.localCustomDataIndexes.has(d.index)||b.isSent||this.unsentData[a].set(d.index,c);break}case _types2.KameleoonData.PageView:{const c=b.data,d=this.dataProcessor.storedTargetingData.or({}),e=d[a][_types2.KameleoonData.PageView];if(e){const d=e[c.urlAddress];if(!b.isSent)for(const c of d.timestamps)this.sentPageViewTimestamps.has(c)||(this.unsentData[a].set(c,b),this.sentPageViewTimestamps.set(c,!0));else for(const a of d.timestamps)this.sentPageViewTimestamps.has(a)||this.sentPageViewTimestamps.set(a,!0)}break}case _types2.KameleoonData.Conversion:{const c=this.unsentData[a];if(!b.isSent)if(c.has(_types2.KameleoonData.Conversion)){const a=c.get(_types2.KameleoonData.Conversion);a.push(b),c.set(_types2.KameleoonData.Conversion,a)}else c.set(_types2.KameleoonData.Conversion,[b]);break}default:{const{data:c}=b;b.isSent||this.unsentData[a].set(c.type,b)}}return this.dataProcessor.createVisit(a)}getTree(a){if(!this.targetingTrees.has(a.id)){const b=new _targeting.Tree(a);return this.targetingTrees.set(a.id,new _targeting.Tree(a)),b}return this.targetingTrees.get(a.id)}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===_types2.KameleoonData.CustomData&&this.persistentCustomDataIndexes.size)for(const[a,d]of c.entries())this.isPersistentCustomData(d)||a===b&&c.delete(a);else if(b===_types2.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)}getVisitorIdentifier(a){const b=this.storedTargetingData;if(!b[a])return a;const c=b[a][_types2.KameleoonData.CustomData];if(!c)return a;for(const[b,d]of Object.entries(c))if(this.mappingIdentifierCustomDataIndexes.has(parseInt(b))&&d)return d.value[0];return a}get trees(){return this.targetingTrees}get unsentDataVisitors(){return Object.keys(this.unsentData)}get storedTargetingData(){return this.dataProcessor.storedTargetingData.or({})}set customDataIndexes(a){const[b,c,d]=[[],[],[]];a.forEach(a=>{a.localOnly&&b.push(a.index),a.scope===_clientConfiguration.CustomDataScope.Visitor&&c.push(a.index),a.isMappingIdentifier&&d.push(a.index)}),b.length&&(this.localCustomDataIndexes=new Set(b)),c.length&&(this.persistentCustomDataIndexes=new Set(c)),d.length&&(this.mappingIdentifierCustomDataIndexes=new Set(d))}}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"),_types=require("../types"),_types2=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,targetingCleanupInterval:c}=a;if(_defineProperty(this,"targetingTrees",new Map),_defineProperty(this,"localCustomDataIndexes",new Set),_defineProperty(this,"persistentCustomDataIndexes",new Set),_defineProperty(this,"mappingIdentifierCustomDataIndex",null),_defineProperty(this,"targetingDataIntervalId",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=0>c?1:c,b=()=>{this.dataProcessor.cleanupOutdatedTargetingData(c),this.sentPageViewTimestamps.clear()};try{this.targetingDataIntervalId=setInterval(b,a*_types.Milliseconds.Minute)}catch(a){throw this.targetingDataIntervalId&&clearInterval(this.targetingDataIntervalId),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 _types2.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 _types2.KameleoonData.PageView:{const c=b.data,d=this.dataProcessor.getTargetingData(a).or({});if(d){const e=d[_types2.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 _types2.KameleoonData.Conversion:{const c=this.unsentData[a];if(!b.isSent)if(c.has(_types2.KameleoonData.Conversion)){const a=c.get(_types2.KameleoonData.Conversion);a.push(b),c.set(_types2.KameleoonData.Conversion,a)}else c.set(_types2.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===_types2.KameleoonData.CustomData&&this.persistentCustomDataIndexes.size)for(const[a,d]of c.entries())this.isPersistentCustomData(d)||a===b&&c.delete(a);else if(b===_types2.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[_types2.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","targetingCleanupInterval","_defineProperty","Map","Set","dataProcessor","DataProcessor","unsentData","cleanupInterval","cleanupCallback","cleanupOutdatedTargetingData","sentPageViewTimestamps","clear","targetingDataIntervalId","setInterval","Milliseconds","Minute","err","clearInterval","addData","visitorCode","b","arguments","length","kameleoonData","Array","d","dataItem","updateData","data","type","KameleoonData","CustomData","customData","mappingIdentifierCustomDataIndexes","has","index","_isMappingIdentifier","localCustomDataIndexes","isSent","set","PageView","storedData","storedTargetingData","or","storedVisitorData","pageView","urlAddress","timestamp","timestamps","Conversion","existingConversions","get","push","createVisit","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","getVisitorIdentifier","targetingData","Object","parseInt","value","trees","unsentDataVisitors","customDataIndexes","customDataLocalOnlyIndexes","forEach","localOnly","scope","CustomDataScope","Visitor","isMappingIdentifier","exports"],"sources":["../../src/kameleoonData/dataManager.ts"],"sourcesContent":["import { Result } from 'ts-res';\nimport { KameleoonError } from 'src/kameleoonError';\nimport { SegmentType, TargetingDataType, Tree } from 'src/targeting';\nimport { DataProcessor } from './dataProcessor';\nimport { Utilities } from 'src/utilities';\nimport {\n CustomDataConfigurationType,\n CustomDataScope,\n} from 'src/clientConfiguration';\nimport { Milliseconds } from 'src/types';\nimport { CustomData } from './customData';\nimport {\n DataManagerParametersType,\n ExistingPageViewDataType,\n KameleoonData,\n KameleoonDataType,\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 readonly trees: Map<string, Tree>;\n readonly storedTargetingData: TargetingDataType;\n readonly unsentDataVisitors: string[];\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 mappingIdentifierCustomDataIndexes: Set<number> = new Set();\n private targetingDataIntervalId: NodeJS.Timer | null = null;\n private dataProcessor: DataProcessor;\n private unsentData: UnsentTargetingDataType;\n private sentPageViewTimestamps: Map<number, boolean> = new Map();\n\n constructor({\n storage,\n targetingCleanupInterval,\n }: DataManagerParametersType) {\n this.dataProcessor = new DataProcessor(storage);\n this.unsentData = {};\n\n if (targetingCleanupInterval) {\n const cleanupInterval =\n targetingCleanupInterval < 0 ? 1 : targetingCleanupInterval;\n\n const cleanupCallback = () => {\n this.dataProcessor.cleanupOutdatedTargetingData(\n targetingCleanupInterval,\n );\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.targetingDataIntervalId = setInterval(\n cleanupCallback,\n cleanupInterval * Milliseconds.Minute,\n );\n } catch (err) {\n if (this.targetingDataIntervalId) {\n clearInterval(this.targetingDataIntervalId);\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 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.mappingIdentifierCustomDataIndexes.has(data.index)) {\n customData._isMappingIdentifier = true;\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.storedTargetingData.or({});\n const storedVisitorData =\n storedData[visitorCode][KameleoonData.PageView];\n\n if (storedVisitorData) {\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 this.dataProcessor.createVisit(visitorCode);\n }\n\n public getTree(segment: SegmentType): Tree {\n if (!this.targetingTrees.has(segment.id)) {\n const targetingTree = new Tree(segment);\n\n this.targetingTrees.set(segment.id, new Tree(segment));\n\n return targetingTree;\n }\n\n return this.targetingTrees.get(segment.id) as Tree;\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 getVisitorIdentifier(visitorCode: string): string {\n const targetingData = this.storedTargetingData;\n\n if (!targetingData[visitorCode]) {\n return visitorCode;\n }\n\n const customData = targetingData[visitorCode][KameleoonData.CustomData];\n\n if (!customData) {\n return visitorCode;\n }\n\n for (const [index, dataItem] of Object.entries(customData)) {\n if (\n this.mappingIdentifierCustomDataIndexes.has(parseInt(index)) &&\n dataItem\n ) {\n return dataItem.value[0];\n }\n }\n\n return visitorCode;\n }\n\n get trees() {\n return this.targetingTrees;\n }\n\n get unsentDataVisitors(): string[] {\n return Object.keys(this.unsentData);\n }\n\n get storedTargetingData(): TargetingDataType {\n return this.dataProcessor.storedTargetingData.or({});\n }\n\n set customDataIndexes(customData: CustomDataConfigurationType[]) {\n const [\n customDataLocalOnlyIndexes,\n persistentCustomDataIndexes,\n mappingIdentifierCustomDataIndexes,\n ]: Array<number[]> = [[], [], []];\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 mappingIdentifierCustomDataIndexes.push(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 if (mappingIdentifierCustomDataIndexes.length) {\n this.mappingIdentifierCustomDataIndexes = new Set(\n mappingIdentifierCustomDataIndexes,\n );\n }\n }\n}\n"],"mappings":"m0BAmCO,KAAM,CAAAA,WAAoC,CAU/CC,WAAWA,CAAAC,CAAA,CAGmB,IAHlB,CACVC,OAAO,CAAPA,CAAO,CACPC,wBAAwB,CAAxBA,CACyB,CAAC,CAAAF,CAAA,CAI1B,GAAAG,eAAA,uBAhB0C,GAAI,CAAAC,GAAK,EAAAD,eAAA,+BACP,GAAI,CAAAE,GAAK,EAAAF,eAAA,oCACJ,GAAI,CAAAE,GAAK,EAAAF,eAAA,2CACF,GAAI,CAAAE,GAAK,EAAAF,eAAA,gCACZ,IAAI,EAAAA,eAAA,8BAAAA,eAAA,2BAAAA,eAAA,+BAGJ,GAAI,CAAAC,GAAK,EAM9D,IAAI,CAACE,aAAa,CAAG,GAAI,CAAAC,4BAAa,CAACN,CAAO,CAAC,CAC/C,IAAI,CAACO,UAAU,CAAG,CAAC,CAAC,CAEhBN,CAAwB,CAAE,MACtB,CAAAO,CAAe,CACQ,CAAC,CAA5BP,CAA4B,CAAG,CAAC,CAAGA,CAAwB,CAEvDQ,CAAe,CAAGA,CAAA,GAAM,CAC5B,IAAI,CAACJ,aAAa,CAACK,4BAA4B,CAC7CT,CACF,CAAC,CACD,IAAI,CAACU,sBAAsB,CAACC,KAAK,CAAC,CACpC,CAAC,CAKD,GAAI,CACF,IAAI,CAACC,uBAAuB,CAAGC,WAAW,CACxCL,CAAe,CACfD,CAAe,CAAGO,mBAAY,CAACC,MACjC,CACF,CAAE,MAAOC,CAAG,CAAE,CAKZ,KAJI,KAAI,CAACJ,uBAAuB,EAC9BK,aAAa,CAAC,IAAI,CAACL,uBAAuB,CAAC,CAGvCI,CACR,CACF,CACF,CAEOE,OAAOA,CACZC,CAAmB,CAEW,CAGzB,IAAI,CAACb,UAAU,CAACa,CAAW,CAAC,GAC/B,IAAI,CAACb,UAAU,CAACa,CAAW,CAAC,CAAG,GAAI,CAAAjB,GAAK,UAAAkB,CAAA,CAAAC,SAAA,CAAAC,MAAA,CALvCC,CAAa,CAAAC,KAAA,GAAAJ,CAAA,CAAAA,CAAA,MAAAK,CAAA,GAAAA,CAAA,CAAAL,CAAA,CAAAK,CAAA,GAAbF,CAAa,CAAAE,CAAA,IAAAJ,SAAA,CAAAI,CAAA,EAQhB,IAAK,KAAM,CAAAC,CAAQ,GAAI,CAAAH,CAAa,CAGlC,OAFA,IAAI,CAACnB,aAAa,CAACuB,UAAU,CAACR,CAAW,CAAEO,CAAQ,CAAC,CAE5CA,CAAQ,CAACE,IAAI,CAACC,IAAI,EACxB,IAAK,CAAAC,qBAAa,CAACC,UAAU,CAAE,MACvB,CAAAC,CAAU,CAAGN,CAAsB,CACnCE,CAAI,CAAGI,CAAU,CAACJ,IAAI,CASxB,IAAI,CAACK,kCAAkC,CAACC,GAAG,CAACN,CAAI,CAACO,KAAK,CAAC,GACzDH,CAAU,CAACI,oBAAoB,GAAO,EAIrC,IAAI,CAACC,sBAAsB,CAACH,GAAG,CAACN,CAAI,CAACO,KAAK,CAAC,EAC3CT,CAAQ,CAACY,MAAM,EAEhB,IAAI,CAAChC,UAAU,CAACa,CAAW,CAAC,CAAEoB,GAAG,CAACX,CAAI,CAACO,KAAK,CAAEH,CAAU,CAAC,CAG3D,KACF,CACA,IAAK,CAAAF,qBAAa,CAACU,QAAQ,CAAE,MACrB,CAAAZ,CAAI,CAAGF,CAAQ,CAACE,IAAwB,CAMxCa,CAAU,CAAG,IAAI,CAACrC,aAAa,CAACsC,mBAAmB,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC1DC,CAAiB,CACrBH,CAAU,CAACtB,CAAW,CAAC,CAACW,qBAAa,CAACU,QAAQ,CAAC,CAEjD,GAAII,CAAiB,CAAE,CACrB,KAAM,CAAAC,CAAQ,CAAID,CAAiB,CACjChB,CAAI,CAACkB,UAAU,CAChB,CAID,GAAI,CAACpB,CAAQ,CAACY,MAAM,CAClB,IAAK,KAAM,CAAAS,CAAS,GAAI,CAAAF,CAAQ,CAACG,UAAU,CAIpC,IAAI,CAACtC,sBAAsB,CAACwB,GAAG,CAACa,CAAS,CAAC,GAC7C,IAAI,CAACzC,UAAU,CAACa,CAAW,CAAC,CAAEoB,GAAG,CAACQ,CAAS,CAAErB,CAAQ,CAAC,CACtD,IAAI,CAAChB,sBAAsB,CAAC6B,GAAG,CAACQ,CAAS,GAAM,CAAC,EAEnD,IAID,KAAK,KAAM,CAAAA,CAAS,GAAI,CAAAF,CAAQ,CAACG,UAAU,CACpC,IAAI,CAACtC,sBAAsB,CAACwB,GAAG,CAACa,CAAS,CAAC,EAC7C,IAAI,CAACrC,sBAAsB,CAAC6B,GAAG,CAACQ,CAAS,GAAM,CAIvD,CAEA,KACF,CACA,IAAK,CAAAjB,qBAAa,CAACmB,UAAU,CAAE,CAC7B,KAAM,CAAA3C,CAAU,CAAG,IAAI,CAACA,UAAU,CAACa,CAAW,CAAE,CAEhD,GAAI,CAACO,CAAQ,CAACY,MAAM,CAClB,GAAIhC,CAAU,CAAC4B,GAAG,CAACJ,qBAAa,CAACmB,UAAU,CAAC,CAAE,CAC5C,KAAM,CAAAC,CAAmB,CAAG5C,CAAU,CAAC6C,GAAG,CACxCrB,qBAAa,CAACmB,UAChB,CAAwB,CAExBC,CAAmB,CAACE,IAAI,CAAC1B,CAAQ,CAAC,CAElCpB,CAAU,CAACiC,GAAG,CAACT,qBAAa,CAACmB,UAAU,CAAEC,CAAmB,CAC9D,CAAC,IACC,CAAA5C,CAAU,CAACiC,GAAG,CAACT,qBAAa,CAACmB,UAAU,CAAE,CAACvB,CAAQ,CAAC,CAAC,CAIxD,KACF,CACA,QAAS,CACP,KAAM,CAAEE,IAAI,CAAJA,CAAK,CAAC,CAAGF,CAAQ,CAEpBA,CAAQ,CAACY,MAAM,EAClB,IAAI,CAAChC,UAAU,CAACa,CAAW,CAAC,CAAEoB,GAAG,CAACX,CAAI,CAACC,IAAI,CAAEH,CAAQ,CAEzD,CACF,CAGF,MAAO,KAAI,CAACtB,aAAa,CAACiD,WAAW,CAAClC,CAAW,CACnD,CAEOmC,OAAOA,CAACC,CAAoB,CAAQ,CACzC,GAAI,CAAC,IAAI,CAACC,cAAc,CAACtB,GAAG,CAACqB,CAAO,CAACE,EAAE,CAAC,CAAE,CACxC,KAAM,CAAAC,CAAa,CAAG,GAAI,CAAAC,eAAI,CAACJ,CAAO,CAAC,CAIvC,MAFA,KAAI,CAACC,cAAc,CAACjB,GAAG,CAACgB,CAAO,CAACE,EAAE,CAAE,GAAI,CAAAE,eAAI,CAACJ,CAAO,CAAC,CAAC,CAE/CG,CACT,CAEA,MAAO,KAAI,CAACF,cAAc,CAACL,GAAG,CAACI,CAAO,CAACE,EAAE,CAC3C,CAEOG,UAAUA,CAAA,CAAS,CACxB,IAAI,CAACJ,cAAc,CAAC7C,KAAK,CAAC,CAC5B,CAEOkD,aAAaA,CAClB1C,CAAmB,CAC0B,CAC7C,MAAO,KAAI,CAACb,UAAU,CAACa,CAAW,CACpC,CAEO2C,eAAeA,CAAC3C,CAAmB,CAAQ,KAAAC,CAAA,CAChD,KAAM,CAAA2C,CAAS,SAAA3C,CAAA,CAAG,IAAI,CAACd,UAAU,CAACa,CAAW,CAAC,YAAAC,CAAA,QAA5BA,CAAA,CAA8B4C,MAAM,CAAC,CAAC,CAExD,GAAID,CAAS,EAAI,IAAI,CAACE,2BAA2B,CAACC,IAAI,CAAE,CACtD,KAAM,CAAAC,CAAoD,CAAG,GAAI,CAAAjE,GAAK,CAEtE,IAAK,KAAM,CAAAwB,CAAQ,GAAI,CAAAqC,CAAS,CAC1B,CAACvC,KAAK,CAAC4C,OAAO,CAAC1C,CAAQ,CAAC,EAAI,IAAI,CAAC2C,sBAAsB,CAAC3C,CAAQ,CAAC,EACnEyC,CAAoB,CAAC5B,GAAG,CAACb,CAAQ,CAACE,IAAI,CAACO,KAAK,CAAET,CAAQ,CAAC,CAI3D,GAAIyC,CAAoB,CAACD,IAAI,CAE3B,YADA,IAAI,CAAC5D,UAAU,CAACa,CAAW,CAAC,CAAGgD,CAAoB,CAGvD,CAEA,MAAO,KAAI,CAAC7D,UAAU,CAACa,CAAW,CACpC,CAEOmD,oBAAoBA,CAACnD,CAAmB,CAAEoD,CAAkB,CAAQ,CACzE,KAAM,CAAAC,CAAW,CAAG,IAAI,CAAClE,UAAU,CAACa,CAAW,CAAC,CAEhD,GAAKqD,CAAW,EAIhB,GACED,CAAG,GAAKzC,qBAAa,CAACC,UAAU,EAChC,IAAI,CAACkC,2BAA2B,CAACC,IAAI,CAErC,IAAK,KAAM,CAACO,CAAO,CAAE/C,CAAQ,CAAC,EAAI,CAAA8C,CAAW,CAACE,OAAO,CAAC,CAAC,CACjD,IAAI,CAACL,sBAAsB,CAAC3C,CAA6B,CAAC,EAI1D+C,CAAO,GAAKF,CAAG,EACjBC,CAAW,CAACG,MAAM,CAACF,CAAO,CAAC,CAE9B,IACI,IAAIF,CAAG,GAAKzC,qBAAa,CAACU,QAAQ,CACvC,IAAK,KAAM,CAAAiC,CAAO,GAAI,CAAAD,CAAW,CAACI,IAAI,CAAC,CAAC,CACf,QAAQ,EAA3B,MAAO,CAAAH,CAAoB,EAC7BD,CAAW,CAACG,MAAM,CAACF,CAAO,CAAC,CAE9B,IAED,CAAAD,CAAW,CAACG,MAAM,CAACJ,CAAG,CAAC,CAGpBC,CAAW,CAACN,IAAI,EACnB,MAAO,KAAI,CAAC5D,UAAU,CAACa,CAAW,CAAC,CAEvC,CAEOkD,sBAAsBA,CAC3B3C,CAA2B,CACH,SACnB,IAAI,CAACuC,2BAA2B,CAACC,IAAI,IAItCW,oBAAS,CAACC,YAAY,CAACpD,CAAQ,CAAC,EAC3B,IAAI,CAACuC,2BAA2B,CAAC/B,GAAG,CAACR,CAAQ,CAACE,IAAI,CAACO,KAAK,CAInE,CAEO4C,oBAAoBA,CAAC5D,CAAmB,CAAU,CACvD,KAAM,CAAA6D,CAAa,CAAG,IAAI,CAACtC,mBAAmB,CAE9C,GAAI,CAACsC,CAAa,CAAC7D,CAAW,CAAC,CAC7B,MAAO,CAAAA,CAAW,CAGpB,KAAM,CAAAa,CAAU,CAAGgD,CAAa,CAAC7D,CAAW,CAAC,CAACW,qBAAa,CAACC,UAAU,CAAC,CAEvE,GAAI,CAACC,CAAU,CACb,MAAO,CAAAb,CAAW,CAGpB,IAAK,KAAM,CAACgB,CAAK,CAAET,CAAQ,CAAC,EAAI,CAAAuD,MAAM,CAACP,OAAO,CAAC1C,CAAU,CAAC,CACxD,GACE,IAAI,CAACC,kCAAkC,CAACC,GAAG,CAACgD,QAAQ,CAAC/C,CAAK,CAAC,CAAC,EAC5DT,CAAQ,CAER,MAAO,CAAAA,CAAQ,CAACyD,KAAK,CAAC,CAAC,CAAC,CAI5B,MAAO,CAAAhE,CACT,CAEA,GAAI,CAAAiE,KAAKA,CAAA,CAAG,CACV,MAAO,KAAI,CAAC5B,cACd,CAEA,GAAI,CAAA6B,kBAAkBA,CAAA,CAAa,CACjC,MAAO,CAAAJ,MAAM,CAACL,IAAI,CAAC,IAAI,CAACtE,UAAU,CACpC,CAEA,GAAI,CAAAoC,mBAAmBA,CAAA,CAAsB,CAC3C,MAAO,KAAI,CAACtC,aAAa,CAACsC,mBAAmB,CAACC,EAAE,CAAC,CAAC,CAAC,CACrD,CAEA,GAAI,CAAA2C,iBAAiBA,CAACtD,CAAyC,CAAE,CAC/D,KAAM,CACJuD,CAA0B,CAC1BtB,CAA2B,CAC3BhC,CAAkC,CAClB,CAAG,CAAC,EAAE,CAAE,EAAE,CAAE,EAAE,CAAC,CAEjCD,CAAU,CAACwD,OAAO,CAAExD,CAAU,EAAK,CAC7BA,CAAU,CAACyD,SAAS,EACtBF,CAA0B,CAACnC,IAAI,CAACpB,CAAU,CAACG,KAAK,CAAC,CAG/CH,CAAU,CAAC0D,KAAK,GAAKC,oCAAe,CAACC,OAAO,EAC9C3B,CAA2B,CAACb,IAAI,CAACpB,CAAU,CAACG,KAAK,CAAC,CAGhDH,CAAU,CAAC6D,mBAAmB,EAChC5D,CAAkC,CAACmB,IAAI,CAACpB,CAAU,CAACG,KAAK,CAE5D,CAAC,CAAC,CAEEoD,CAA0B,CAACjE,MAAM,GACnC,IAAI,CAACe,sBAAsB,CAAG,GAAI,CAAAlC,GAAG,CAACoF,CAA0B,CAAC,EAG/DtB,CAA2B,CAAC3C,MAAM,GACpC,IAAI,CAAC2C,2BAA2B,CAAG,GAAI,CAAA9D,GAAG,CAAC8D,CAA2B,CAAC,EAGrEhC,CAAkC,CAACX,MAAM,GAC3C,IAAI,CAACW,kCAAkC,CAAG,GAAI,CAAA9B,GAAG,CAC/C8B,CACF,CAAC,CAEL,CACF,CAAC6D,OAAA,CAAAlG,WAAA,CAAAA,WAAA"}
1
+ {"version":3,"file":"dataManager.js","names":["DataManager","constructor","a","storage","targetingCleanupInterval","_defineProperty","Map","Set","dataProcessor","DataProcessor","unsentData","cleanupInterval","cleanupCallback","cleanupOutdatedTargetingData","sentPageViewTimestamps","clear","targetingDataIntervalId","setInterval","Milliseconds","Minute","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 { Milliseconds } from 'src/types';\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 targetingDataIntervalId: NodeJS.Timer | null = null;\n private dataProcessor: DataProcessor;\n private unsentData: UnsentTargetingDataType;\n private sentPageViewTimestamps: Map<number, boolean> = new Map();\n\n constructor({\n storage,\n targetingCleanupInterval,\n }: DataManagerParametersType) {\n this.dataProcessor = new DataProcessor(storage);\n this.unsentData = {};\n\n if (targetingCleanupInterval) {\n const cleanupInterval =\n targetingCleanupInterval < 0 ? 1 : targetingCleanupInterval;\n\n const cleanupCallback = () => {\n this.dataProcessor.cleanupOutdatedTargetingData(\n targetingCleanupInterval,\n );\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.targetingDataIntervalId = setInterval(\n cleanupCallback,\n cleanupInterval * Milliseconds.Minute,\n );\n } catch (err) {\n if (this.targetingDataIntervalId) {\n clearInterval(this.targetingDataIntervalId);\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,21 +1,28 @@
1
1
  import { Result } from 'ts-res';
2
2
  import { IStorage } from '../storage';
3
- import { TargetingDataType } from '../targeting';
3
+ import { TargetingDataType, VisitorReference } from '../targeting';
4
4
  import { KameleoonError } from '../kameleoonError';
5
- import { KameleoonDataType } from './types';
5
+ import { KameleoonData, KameleoonDataType, KameleoonVisitorDataType } from './types';
6
6
  interface IDataProcessor {
7
7
  updateData(visitorCode: string, dataItem: KameleoonDataType): Result<void, KameleoonError>;
8
- createVisit(visitorCode: string): void;
8
+ createReference(visitorCode: string, linkedVisitor: VisitorReference): void;
9
9
  cleanupOutdatedTargetingData(targetingCleanupInterval?: number): void;
10
- readonly storedTargetingData: Result<TargetingDataType, KameleoonError>;
10
+ getTargetingData(visitorCode: string): Result<KameleoonVisitorDataType | null, KameleoonError>;
11
+ getLinkedVisitor(visitorCode: string, index: number): string | null;
11
12
  }
12
13
  export declare class DataProcessor implements IDataProcessor {
13
14
  private storage;
15
+ private storedDataTypes;
16
+ private storedCustomDataIndexes;
14
17
  constructor(storage: IStorage<TargetingDataType>);
15
18
  updateData(visitorCode: string, dataItem: KameleoonDataType): Result<void, KameleoonError>;
16
- createVisit(visitorCode: string): Result<void, KameleoonError>;
19
+ createReference(visitorCode: string, linkedVisitor: VisitorReference): void;
20
+ getLinkedVisitor(visitorCode: string, index: number | null): string | null;
17
21
  cleanupOutdatedTargetingData(targetingCleanupInterval?: number): void;
18
- get storedTargetingData(): Result<TargetingDataType, KameleoonError>;
22
+ getTargetingData(visitorCode: string): Result<KameleoonVisitorDataType | null, KameleoonError>;
23
+ private dereferenceTargetingData;
24
+ get storedDataTypeList(): Set<KameleoonData>;
25
+ get storedCustomDataIndexList(): Set<number>;
19
26
  private updateField;
20
27
  private createField;
21
28
  private updateArrayField;
@@ -1,2 +1,2 @@
1
- "use strict";const _excluded=["customData","pageView","conversion"];Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataProcessor=void 0;var _tsRes=require("ts-res"),_utilities=require("../utilities"),_types=require("../utilities/types"),_visitsData=require("./visitsData"),_types2=require("../types"),_constants=require("./constants"),_types3=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 DataProcessor{constructor(a){_defineProperty(this,"storage",void 0),this.storage=a}updateData(a,b){const c=this.storage.read().or({}),d={visitorCode:a,data:c};switch(b.data.type){case _types3.KameleoonData.CustomData:{const e=b.data,f=c[a]&&_types3.KameleoonData.CustomData in c[a],g=_objectSpread(_objectSpread({},d),{},{key:_types3.KameleoonData.CustomData,nestedKey:e.index.toString(),value:e});f?this.updateNestedField(g):this.createNestedField(g);break}case _types3.KameleoonData.PageView:{var e;const f=b.data;f.timestamps.length||(f.timestamps=[Date.now()]);const g=c[a]&&_types3.KameleoonData.PageView in c[a]&&(null===(e=c[a][f.type])||void 0===e?void 0:e[f.urlAddress]),h=_objectSpread(_objectSpread({},d),{},{key:_types3.KameleoonData.PageView,nestedKey:f.urlAddress,value:f});g?(f.timestamps.forEach(a=>{_utilities.Utilities.insertInOrderedListMutably({list:g.timestamps,element:a,order:_types.Order.Ascending})}),[g.referrers,g.title]=[f.referrers,f.title],this.updateNestedField(_objectSpread(_objectSpread({},h),{},{value:g}))):this.createNestedField(h);break}case _types3.KameleoonData.Conversion:{const e=b.data,f=c[a]&&_types3.KameleoonData.Conversion in c[a],g=_objectSpread(_objectSpread({},d),{},{key:_types3.KameleoonData.Conversion,value:e});f?this.updateArrayField(g):this.createArrayField(g);break}case _types3.KameleoonData.VisitsData:{const e=b.data,f=c[a]&&_types3.KameleoonData.VisitsData in c[a],g=_objectSpread(_objectSpread({},d),{},{key:_types3.KameleoonData.VisitsData,value:e});if(f){const b=c[a][e.type];b.previousVisits.forEach(a=>{_utilities.Utilities.insertInOrderedListMutably({list:e.previousVisits,element:a,order:_types.Order.Ascending})});let d=b.currentVisit;(!d&&e.currentVisit||d&&e.currentVisit&&d<e.currentVisit)&&(d=e.currentVisit),this.updateField(_objectSpread(_objectSpread({},g),{},{value:_objectSpread(_objectSpread({},e),{},{previousVisits:e.previousVisits,currentVisit:d})}))}else this.createField(g);break}default:{const{data:e}=b,f=c[a]&&e.type in c[a],g=_objectSpread(_objectSpread({},d),{},{key:e.type,value:e});f?this.updateField(g):this.createField(g)}}return this.storage.write(c)}createVisit(a){var b;const c=this.storage.read();if(!c.ok)return(0,_tsRes.Err)(c.error);const d=c.data;return null!==(b=d[a])&&void 0!==b&&b[_types3.KameleoonData.VisitsData]||this.updateField({visitorCode:a,key:_types3.KameleoonData.VisitsData,value:new _visitsData.VisitsData(Date.now(),[]).data,data:d}),this.storage.write(d)}cleanupOutdatedTargetingData(a){const b=this.storage.read();if(!b.ok)return;const c=b.data,d=a?a*_types2.Milliseconds.Minute:_constants.DEFAULT_CLEANUP_INTERVAL*_types2.Milliseconds.Minute,e=Date.now();if(Object.keys(c).length){for(const[a,b]of Object.entries(c)){const{customData:f,pageView:g,conversion:h}=b,i=_objectWithoutProperties(b,_excluded);if(f)for(const[a,c]of Object.entries(f))if(c){const f=c.lastActivityTime+d<e,g=b[_types3.KameleoonData.CustomData];f&&g&&delete g[+a],g&&!Object.keys(g).length&&delete b[_types3.KameleoonData.CustomData]}if(g)for(const[a,c]of Object.entries(g)){const f=c.lastActivityTime+d<e,g=b[_types3.KameleoonData.PageView];f&&g&&delete g[a],g&&!Object.keys(g).length&&delete b[_types3.KameleoonData.PageView]}if(h)for(const a of h){const c=a.lastActivityTime+d<e,f=b[_types3.KameleoonData.Conversion];c&&f&&f.splice(f.indexOf(a),1),f&&!f.length&&delete b[_types3.KameleoonData.Conversion]}for(const[a,c]of Object.entries(i)){const f=c.lastActivityTime+d<e;f&&delete b[a]}Object.keys(c[a]).length||delete c[a]}this.storage.write(c)}}get storedTargetingData(){return this.storage.read()}updateField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b][c]=_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()})}createField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b]=_objectSpread(_objectSpread({},e[b]),{},{[c]:_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()})})}updateArrayField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b][c].push(_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()}))}createArrayField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b]=_objectSpread(_objectSpread({},e[b]),{},{[c]:[_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()})]})}updateNestedField(a){let{visitorCode:b,key:c,nestedKey:d,value:e,data:f}=a;f[b][c][d]=_objectSpread(_objectSpread({},e),{},{lastActivityTime:Date.now()})}createNestedField(a){var b;let{visitorCode:c,key:d,nestedKey:e,value:f,data:g}=a;g[c]=null!==(b=g[c])&&void 0!==b&&b[d]?_objectSpread(_objectSpread({},g[c]),{},{[d]:_objectSpread(_objectSpread({},g[c][d]),{},{[e]:_objectSpread(_objectSpread({},f),{},{lastActivityTime:Date.now()})})}):_objectSpread(_objectSpread({},g[c]),{},{[d]:{[e]:_objectSpread(_objectSpread({},f),{},{lastActivityTime:Date.now()})}})}}exports.DataProcessor=DataProcessor;
1
+ "use strict";const _excluded=["customData","pageView","conversion"];Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataProcessor=void 0;var _tsRes=require("ts-res"),_utilities=require("../utilities"),_types=require("../utilities/types"),_types2=require("../types"),_constants=require("./constants"),_types3=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 DataProcessor{constructor(a){_defineProperty(this,"storage",void 0),_defineProperty(this,"storedDataTypes",new Set([])),_defineProperty(this,"storedCustomDataIndexes",new Set([])),this.storage=a}updateData(a,b){const c=this.storage.read().or({}),d=this.dereferenceTargetingData(c,a),e=(null===d||void 0===d?void 0:d.visitorReference)||a;switch(b.data.type){case _types3.KameleoonData.CustomData:{const a=b.data,f=d&&_types3.KameleoonData.CustomData in d.data,g={visitorCode:e,data:c,key:_types3.KameleoonData.CustomData,nestedKey:a.index.toString(),value:a};f?this.updateNestedField(g):this.createNestedField(g),this.storedCustomDataIndexes.add(a.index);break}case _types3.KameleoonData.PageView:{var f;const a=b.data;a.timestamps.length||(a.timestamps=[Date.now()]);const g=d&&_types3.KameleoonData.PageView in d.data&&(null===(f=d.data[a.type])||void 0===f?void 0:f[a.urlAddress]),h={visitorCode:e,data:c,key:_types3.KameleoonData.PageView,nestedKey:a.urlAddress,value:a};g?(a.timestamps.forEach(a=>{_utilities.Utilities.insertInOrderedListMutably({list:g.timestamps,element:a,order:_types.Order.Ascending})}),[g.referrers,g.title]=[a.referrers,a.title],this.updateNestedField(_objectSpread(_objectSpread({},h),{},{value:g}))):this.createNestedField(h);break}case _types3.KameleoonData.Conversion:{const a=b.data,f=d&&_types3.KameleoonData.Conversion in d.data,g={visitorCode:e,data:c,key:_types3.KameleoonData.Conversion,value:a};f?this.updateArrayField(g):this.createArrayField(g);break}case _types3.KameleoonData.VisitsData:{const a=b.data,f=d&&_types3.KameleoonData.VisitsData in d.data,g={visitorCode:e,data:c,key:_types3.KameleoonData.VisitsData,value:a};if(f){const b=d.data[a.type];b.visits.forEach(b=>{_utilities.Utilities.insertInOrderedListMutably({list:a.visits,element:b,order:_types.Order.Ascending})}),this.updateField(_objectSpread(_objectSpread({},g),{},{value:_objectSpread(_objectSpread({},a),{},{visits:a.visits})}))}else this.createField(g);break}default:{const{data:a}=b,f=d&&a.type in d.data,g={visitorCode:e,data:c,key:a.type,value:a};f?this.updateField(g):this.createField(g),this.storedDataTypes.add(a.type)}}return this.storage.write(c)}createReference(a,b){const c=this.storage.read();c.ok&&(c.data[b]=a,this.storage.write(c.data))}getLinkedVisitor(a,b){const c=this.storage.read();if(!c.ok)return null;if("string"==typeof c.data[a])return c.data[a];if(null===b)return null;const d=c.data[a];if(!d)return null;const e=d[_types3.KameleoonData.CustomData];return e&&e[b]?e[b].value[0]:null}cleanupOutdatedTargetingData(a){const b=this.storage.read();if(!b.ok)return;const c=b.data,d=a?a*_types2.Milliseconds.Minute:_constants.DEFAULT_CLEANUP_INTERVAL*_types2.Milliseconds.Minute,e=Date.now();if(Object.keys(c).length){for(const[a,b]of Object.entries(c)){if("string"==typeof b){delete c[a];continue}const f=b,{customData:g,pageView:h,conversion:i}=f,j=_objectWithoutProperties(f,_excluded);if(g)for(const[a,b]of Object.entries(g))if(b){const g=b.lastActivityTime+d<e,h=f[_types3.KameleoonData.CustomData];g&&h&&(this.storedCustomDataIndexes.delete(+a),delete h[+a]),h&&!Object.keys(h).length&&(this.storedCustomDataIndexes.clear(),delete c[_types3.KameleoonData.CustomData])}if(h)for(const[a,b]of Object.entries(h)){const c=b.lastActivityTime+d<e,g=f[_types3.KameleoonData.PageView];c&&g&&delete g[a],g&&!Object.keys(g).length&&delete f[_types3.KameleoonData.PageView]}if(i)for(const a of i){const b=a.lastActivityTime+d<e,c=f[_types3.KameleoonData.Conversion];b&&c&&c.splice(c.indexOf(a),1),c&&!c.length&&delete f[_types3.KameleoonData.Conversion]}for(const[a,b]of Object.entries(j)){const c=b.lastActivityTime+d<e;c&&(delete f[a],this.storedDataTypes.delete(a))}Object.keys(c[a]).length||(this.storedDataTypes.clear(),this.storedCustomDataIndexes.clear(),delete c[a])}this.storage.write(c)}}getTargetingData(a){const b=this.storage.read();if(!b.ok)return(0,_tsRes.Err)(b.error);const c=this.dereferenceTargetingData(b.data,a);return c?(0,_tsRes.Ok)(c.data):(0,_tsRes.Ok)(null)}dereferenceTargetingData(a,b){if(!a[b])return null;if("string"==typeof a[b]){const c=a[b];return{data:a[c],visitorReference:c}}return{data:a[b],visitorReference:b}}get storedDataTypeList(){return this.storedDataTypes}get storedCustomDataIndexList(){return this.storedCustomDataIndexes}updateField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b][c]=_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()})}createField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b]=_objectSpread(_objectSpread({},e[b]),{},{[c]:_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()})})}updateArrayField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b][c].push(_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()}))}createArrayField(a){let{visitorCode:b,key:c,value:d,data:e}=a;e[b]=_objectSpread(_objectSpread({},e[b]),{},{[c]:[_objectSpread(_objectSpread({},d),{},{lastActivityTime:Date.now()})]})}updateNestedField(a){let{visitorCode:b,key:c,nestedKey:d,value:e,data:f}=a;f[b][c][d]=_objectSpread(_objectSpread({},e),{},{lastActivityTime:Date.now()})}createNestedField(a){var b;let{visitorCode:c,key:d,nestedKey:e,value:f,data:g}=a;g[c]=null!==(b=g[c])&&void 0!==b&&b[d]?_objectSpread(_objectSpread({},g[c]),{},{[d]:_objectSpread(_objectSpread({},g[c][d]),{},{[e]:_objectSpread(_objectSpread({},f),{},{lastActivityTime:Date.now()})})}):_objectSpread(_objectSpread({},g[c]),{},{[d]:{[e]:_objectSpread(_objectSpread({},f),{},{lastActivityTime:Date.now()})}})}}exports.DataProcessor=DataProcessor;
2
2
  //# sourceMappingURL=dataProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataProcessor.js","names":["DataProcessor","constructor","storage","_defineProperty","updateData","visitorCode","dataItem","targetingData","read","or","commonParameters","data","type","KameleoonData","CustomData","hasCustomDataKey","parameters","_objectSpread","key","nestedKey","index","toString","value","updateNestedField","createNestedField","PageView","e","timestamps","length","Date","now","existingData","urlAddress","forEach","timestamp","Utilities","insertInOrderedListMutably","list","element","order","Order","Ascending","referrers","title","Conversion","hasConversionDataKey","updateArrayField","createArrayField","VisitsData","hasVisitsKey","existingVisits","previousVisits","visit","currentVisit","updateField","createField","hasDataKey","write","createVisit","b","storageData","ok","Err","error","cleanupOutdatedTargetingData","targetingCleanupInterval","targetingDataLifetime","Milliseconds","Minute","DEFAULT_CLEANUP_INTERVAL","currentTime","Object","keys","kameleoonVisitorData","entries","customData","pageView","conversion","rest","_objectWithoutProperties","_excluded","isDataExpired","lastActivityTime","url","splice","indexOf","storedTargetingData","a","push","exports"],"sources":["../../src/kameleoonData/dataProcessor.ts"],"sourcesContent":["import { Err, Result } from 'ts-res';\nimport { IStorage } from 'src/storage';\nimport { TargetingDataType } from 'src/targeting';\nimport { KameleoonError } from 'src/kameleoonError';\nimport { Utilities } from 'src/utilities';\nimport { Order } from 'src/utilities/types';\nimport { VisitsData } from './visitsData';\nimport { Milliseconds } from 'src/types';\nimport { DEFAULT_CLEANUP_INTERVAL } from './constants';\nimport {\n ArrayFieldParametersType,\n ConversionDataType,\n CustomDataType,\n ExistingArrayDataType,\n ExistingDataType,\n ExistingNestedDataType,\n ExistingPageViewDataType,\n ExistingVisitsDataType,\n FieldParametersType,\n KameleoonData,\n KameleoonDataType,\n NestedFieldParametersType,\n PageViewDataType,\n VisitsDataType,\n} from './types';\n\ninterface IDataProcessor {\n updateData(\n visitorCode: string,\n dataItem: KameleoonDataType,\n ): Result<void, KameleoonError>;\n createVisit(visitorCode: string): void;\n cleanupOutdatedTargetingData(targetingCleanupInterval?: number): void;\n readonly storedTargetingData: Result<TargetingDataType, KameleoonError>;\n}\n\nexport class DataProcessor implements IDataProcessor {\n private storage: IStorage<TargetingDataType>;\n\n constructor(storage: IStorage<TargetingDataType>) {\n this.storage = storage;\n }\n\n // --- Note ---\n // Following code is optimized for performance:\n // - We don't want to copy the whole object every time we add new data\n // - So we are manually checking the keys existence and mutating targeting data directly\n // - Numerous type casts are required because we can't narrow down nested `targetingData` types by using assertion functions\n public updateData(\n visitorCode: string,\n dataItem: KameleoonDataType,\n ): Result<void, KameleoonError> {\n const targetingData = this.storage.read().or({});\n const commonParameters: Pick<FieldParametersType, 'visitorCode' | 'data'> =\n {\n visitorCode,\n data: targetingData,\n };\n\n switch (dataItem.data.type) {\n case KameleoonData.CustomData: {\n const data = dataItem.data as CustomDataType;\n const hasCustomDataKey =\n targetingData[visitorCode] &&\n KameleoonData.CustomData in targetingData[visitorCode];\n const parameters: NestedFieldParametersType = {\n ...commonParameters,\n key: KameleoonData.CustomData,\n nestedKey: data.index.toString(),\n value: data,\n };\n\n if (hasCustomDataKey) {\n this.updateNestedField(parameters);\n } else {\n this.createNestedField(parameters);\n }\n\n break;\n }\n case KameleoonData.PageView: {\n const data = dataItem.data as PageViewDataType;\n\n // --- Note ---\n // We assign `timestamps` to `Date.now()` if it's empty\n // Not upon data item creation because it makes no sense in terms\n // of data flow to have some indication of data activity before it was added\n if (!data.timestamps.length) {\n data.timestamps = [Date.now()];\n }\n\n const existingData =\n targetingData[visitorCode] &&\n KameleoonData.PageView in targetingData[visitorCode] &&\n (targetingData[visitorCode][data.type] as ExistingPageViewDataType)?.[\n data.urlAddress\n ];\n\n const parameters: NestedFieldParametersType = {\n ...commonParameters,\n key: KameleoonData.PageView,\n nestedKey: data.urlAddress,\n value: data,\n };\n\n if (existingData) {\n // --- Note ---\n // Updating existing `PageView` properties by pushing new timestamps\n // and potentially changing referrers and title\n data.timestamps.forEach((timestamp) => {\n Utilities.insertInOrderedListMutably({\n list: existingData.timestamps,\n element: timestamp,\n order: Order.Ascending,\n });\n });\n\n [existingData.referrers, existingData.title] = [\n data.referrers,\n data.title,\n ];\n\n this.updateNestedField({ ...parameters, value: existingData });\n } else {\n this.createNestedField(parameters);\n }\n\n break;\n }\n case KameleoonData.Conversion: {\n const data = dataItem.data as ConversionDataType;\n const hasConversionDataKey =\n targetingData[visitorCode] &&\n KameleoonData.Conversion in targetingData[visitorCode];\n const parameters: ArrayFieldParametersType = {\n ...commonParameters,\n key: KameleoonData.Conversion,\n value: data,\n };\n\n if (hasConversionDataKey) {\n this.updateArrayField(parameters);\n } else {\n this.createArrayField(parameters);\n }\n\n break;\n }\n case KameleoonData.VisitsData: {\n const data = dataItem.data as VisitsDataType;\n const hasVisitsKey =\n targetingData[visitorCode] &&\n KameleoonData.VisitsData in targetingData[visitorCode];\n const parameters: FieldParametersType = {\n ...commonParameters,\n key: KameleoonData.VisitsData,\n value: data,\n };\n\n // -- Change directly if `[key]` exists\n if (hasVisitsKey) {\n const existingVisits = targetingData[visitorCode][\n data.type\n ] as ExistingVisitsDataType;\n\n // --- Note ---\n // We are preserving the order of visits\n existingVisits.previousVisits.forEach((visit) => {\n Utilities.insertInOrderedListMutably({\n list: data.previousVisits,\n element: visit,\n order: Order.Ascending,\n });\n });\n\n let currentVisit = existingVisits.currentVisit;\n\n // --- Note ---\n // We are using new current visit in two cases:\n // 1. If there is no current visit in existing data\n // 2. If existing current visit is older than new current visit\n if (\n (!currentVisit && data.currentVisit) ||\n (currentVisit &&\n data.currentVisit &&\n currentVisit < data.currentVisit)\n ) {\n currentVisit = data.currentVisit;\n }\n\n this.updateField({\n ...parameters,\n value: {\n ...data,\n previousVisits: data.previousVisits,\n currentVisit,\n },\n });\n } else {\n this.createField(parameters);\n }\n\n break;\n }\n default: {\n const { data } = dataItem;\n const hasDataKey =\n targetingData[visitorCode] && data.type in targetingData[visitorCode];\n const parameters: FieldParametersType = {\n ...commonParameters,\n key: data.type,\n // --- Note ---\n // At this point TypeScript can not infer that value is subset of only\n // what is left for `default` case\n value: data as FieldParametersType['value'],\n };\n\n if (hasDataKey) {\n this.updateField(parameters);\n } else {\n this.createField(parameters);\n }\n }\n }\n\n return this.storage.write(targetingData);\n }\n\n public createVisit(visitorCode: string): Result<void, KameleoonError> {\n const storageData = this.storage.read();\n\n if (!storageData.ok) {\n return Err(storageData.error);\n }\n\n const targetingData = storageData.data;\n\n // --- Note ---\n // Create new visit only if it doesn't exist\n if (!targetingData[visitorCode]?.[KameleoonData.VisitsData]) {\n this.updateField({\n visitorCode,\n key: KameleoonData.VisitsData,\n value: new VisitsData(Date.now(), []).data,\n data: targetingData,\n });\n }\n\n return this.storage.write(targetingData);\n }\n\n public cleanupOutdatedTargetingData(targetingCleanupInterval?: number): void {\n const storageData = this.storage.read();\n\n if (!storageData.ok) {\n return;\n }\n\n const targetingData = storageData.data;\n const targetingDataLifetime = targetingCleanupInterval\n ? targetingCleanupInterval * Milliseconds.Minute\n : DEFAULT_CLEANUP_INTERVAL * Milliseconds.Minute;\n\n const currentTime = Date.now();\n\n // --- Note (Weird Thing) ---\n // Generally the check is not needed\n // If the `targetingData` is empty the loop will not be executed\n // But here something weird happens and we'are getting `TypeError` here\n // Even logging `Object.keys().length` or `Object.entries().length` solves the issue somehow\n // You can see the issue by commenting the following `if` statement and waiting for a data cleanup\n // TODO: investigate it later (probably related to object copying?)\n if (!Object.keys(targetingData).length) {\n return;\n }\n\n for (const [visitorCode, kameleoonVisitorData] of Object.entries(\n targetingData,\n )) {\n const { customData, pageView, conversion, ...rest } =\n kameleoonVisitorData;\n\n // TODO: This way of cleaning up data is not optimal\n // And will be changed when sessions are introduced\n if (customData) {\n for (const [index, dataItem] of Object.entries(customData)) {\n if (dataItem) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n const existingData = kameleoonVisitorData[KameleoonData.CustomData];\n\n if (isDataExpired && existingData) {\n delete existingData[Number(index)];\n }\n\n if (existingData && !Object.keys(existingData).length) {\n delete kameleoonVisitorData[KameleoonData.CustomData];\n }\n }\n }\n }\n\n if (pageView) {\n for (const [url, dataItem] of Object.entries(pageView)) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n const existingData = kameleoonVisitorData[KameleoonData.PageView];\n\n if (isDataExpired && existingData) {\n delete existingData[url];\n }\n\n if (existingData && !Object.keys(existingData).length) {\n delete kameleoonVisitorData[KameleoonData.PageView];\n }\n }\n }\n\n if (conversion) {\n for (const dataItem of conversion) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n const existingData = kameleoonVisitorData[KameleoonData.Conversion];\n\n if (isDataExpired && existingData) {\n existingData.splice(existingData.indexOf(dataItem), 1);\n }\n\n if (existingData && !existingData.length) {\n delete kameleoonVisitorData[KameleoonData.Conversion];\n }\n }\n }\n\n for (const [key, dataItem] of Object.entries(rest)) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n\n if (isDataExpired) {\n delete kameleoonVisitorData[key as KameleoonData];\n }\n }\n\n if (!Object.keys(targetingData[visitorCode]).length) {\n delete targetingData[visitorCode];\n }\n }\n\n this.storage.write(targetingData);\n }\n\n get storedTargetingData(): Result<TargetingDataType, KameleoonError> {\n return this.storage.read();\n }\n\n private updateField({\n visitorCode,\n key,\n value,\n data,\n }: FieldParametersType): void {\n (data[visitorCode][key] as ExistingDataType<typeof key>) = {\n ...value,\n lastActivityTime: Date.now(),\n };\n }\n\n private createField({\n visitorCode,\n key,\n value,\n data,\n }: FieldParametersType): void {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: { ...value, lastActivityTime: Date.now() },\n };\n }\n\n private updateArrayField({\n visitorCode,\n key,\n value,\n data,\n }: ArrayFieldParametersType): void {\n (data[visitorCode][key] as ExistingArrayDataType).push({\n ...value,\n lastActivityTime: Date.now(),\n });\n }\n\n private createArrayField({\n visitorCode,\n key,\n value,\n data,\n }: ArrayFieldParametersType): void {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: [{ ...value, lastActivityTime: Date.now() }],\n };\n }\n\n private updateNestedField({\n visitorCode,\n key,\n nestedKey,\n value,\n data,\n }: NestedFieldParametersType): void {\n (data[visitorCode][key] as ExistingNestedDataType)[nestedKey] = {\n ...value,\n lastActivityTime: Date.now(),\n };\n }\n\n private createNestedField({\n visitorCode,\n key,\n nestedKey,\n value,\n data,\n }: NestedFieldParametersType): void {\n if (!data[visitorCode]?.[key]) {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: {\n [nestedKey]: { ...value, lastActivityTime: Date.now() },\n },\n };\n } else {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: {\n ...data[visitorCode][key],\n [nestedKey]: { ...value, lastActivityTime: Date.now() },\n },\n };\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dataProcessor.js","names":["DataProcessor","constructor","storage","_defineProperty","Set","updateData","visitorCode","dataItem","storageData","read","or","dereferencedData","dereferenceTargetingData","visitorReference","data","type","KameleoonData","CustomData","hasCustomDataKey","parameters","key","nestedKey","index","toString","value","updateNestedField","createNestedField","storedCustomDataIndexes","add","PageView","f","timestamps","length","Date","now","existingData","urlAddress","forEach","timestamp","Utilities","insertInOrderedListMutably","list","element","order","Order","Ascending","referrers","title","_objectSpread","Conversion","hasConversionDataKey","updateArrayField","createArrayField","VisitsData","hasVisitsKey","existingVisits","visits","visit","updateField","createField","hasDataKey","storedDataTypes","write","createReference","linkedVisitor","ok","getLinkedVisitor","visitorData","customData","cleanupOutdatedTargetingData","targetingCleanupInterval","targetingData","targetingDataLifetime","Milliseconds","Minute","DEFAULT_CLEANUP_INTERVAL","currentTime","Object","keys","kameleoonVisitorData","entries","pageView","conversion","rest","_objectWithoutProperties","_excluded","isDataExpired","lastActivityTime","delete","clear","url","splice","indexOf","getTargetingData","Err","error","Ok","referredVisitorCode","storedDataTypeList","storedCustomDataIndexList","a","push","b","exports"],"sources":["../../src/kameleoonData/dataProcessor.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport { IStorage } from 'src/storage';\nimport {\n DereferencedTargetingDataType,\n TargetingDataType,\n VisitorReference,\n} from 'src/targeting';\nimport { KameleoonError } from 'src/kameleoonError';\nimport { Utilities } from 'src/utilities';\nimport { Order } from 'src/utilities/types';\nimport { Milliseconds } from 'src/types';\nimport { DEFAULT_CLEANUP_INTERVAL } from './constants';\nimport {\n ArrayFieldParametersType,\n ConversionDataType,\n CustomDataType,\n DereferenceTargetingDataResultType,\n ExistingArrayDataType,\n ExistingDataType,\n ExistingNestedDataType,\n ExistingPageViewDataType,\n ExistingVisitsDataType,\n FieldParametersType,\n KameleoonData,\n KameleoonDataType,\n KameleoonVisitorDataType,\n NestedFieldParametersType,\n PageViewDataType,\n VisitsDataType,\n} from './types';\n\ninterface IDataProcessor {\n updateData(\n visitorCode: string,\n dataItem: KameleoonDataType,\n ): Result<void, KameleoonError>;\n createReference(visitorCode: string, linkedVisitor: VisitorReference): void;\n cleanupOutdatedTargetingData(targetingCleanupInterval?: number): void;\n getTargetingData(\n visitorCode: string,\n ): Result<KameleoonVisitorDataType | null, KameleoonError>;\n getLinkedVisitor(visitorCode: string, index: number): string | null;\n}\n\nexport class DataProcessor implements IDataProcessor {\n private storage: IStorage<TargetingDataType>;\n private storedDataTypes: Set<KameleoonData> = new Set([]);\n private storedCustomDataIndexes: Set<number> = new Set([]);\n\n constructor(storage: IStorage<TargetingDataType>) {\n this.storage = storage;\n }\n\n // --- Note ---\n // Following code is optimized for performance:\n // - We don't want to copy the whole object every time we add new data\n // - So we are manually checking the keys existence and mutating targeting data directly\n // - Numerous type casts are required because we can't narrow down nested `targetingData` types by using assertion functions\n public updateData(\n visitorCode: string,\n dataItem: KameleoonDataType,\n ): Result<void, KameleoonError> {\n const storageData = this.storage.read().or({});\n const dereferencedData = this.dereferenceTargetingData(\n storageData,\n visitorCode,\n );\n const visitorReference = dereferencedData?.visitorReference || visitorCode;\n\n switch (dataItem.data.type) {\n case KameleoonData.CustomData: {\n const data = dataItem.data as CustomDataType;\n const hasCustomDataKey =\n dereferencedData && KameleoonData.CustomData in dereferencedData.data;\n const parameters: NestedFieldParametersType = {\n visitorCode: visitorReference,\n data: storageData as DereferencedTargetingDataType,\n key: KameleoonData.CustomData,\n nestedKey: data.index.toString(),\n value: data,\n };\n\n if (hasCustomDataKey) {\n this.updateNestedField(parameters);\n } else {\n this.createNestedField(parameters);\n }\n\n // --- Note ---\n // Here we add CustomData index to storedCustomDataIndexes to later track if it is added to storage\n this.storedCustomDataIndexes.add(data.index);\n\n break;\n }\n case KameleoonData.PageView: {\n const data = dataItem.data as PageViewDataType;\n\n // --- Note ---\n // We assign `timestamps` to `Date.now()` if it's empty\n // Not upon data item creation because it makes no sense in terms\n // of data flow to have some indication of data activity before it was added\n if (!data.timestamps.length) {\n data.timestamps = [Date.now()];\n }\n\n const existingData =\n dereferencedData &&\n KameleoonData.PageView in dereferencedData.data &&\n (dereferencedData.data[data.type] as ExistingPageViewDataType)?.[\n data.urlAddress\n ];\n\n const parameters: NestedFieldParametersType = {\n visitorCode: visitorReference,\n data: storageData as DereferencedTargetingDataType,\n key: KameleoonData.PageView,\n nestedKey: data.urlAddress,\n value: data,\n };\n\n if (existingData) {\n // --- Note ---\n // Updating existing `PageView` properties by pushing new timestamps\n // and potentially changing referrers and title\n data.timestamps.forEach((timestamp) => {\n Utilities.insertInOrderedListMutably({\n list: existingData.timestamps,\n element: timestamp,\n order: Order.Ascending,\n });\n });\n\n [existingData.referrers, existingData.title] = [\n data.referrers,\n data.title,\n ];\n\n this.updateNestedField({ ...parameters, value: existingData });\n } else {\n this.createNestedField(parameters);\n }\n\n break;\n }\n case KameleoonData.Conversion: {\n const data = dataItem.data as ConversionDataType;\n const hasConversionDataKey =\n dereferencedData && KameleoonData.Conversion in dereferencedData.data;\n const parameters: ArrayFieldParametersType = {\n visitorCode: visitorReference,\n data: storageData as DereferencedTargetingDataType,\n key: KameleoonData.Conversion,\n value: data,\n };\n\n if (hasConversionDataKey) {\n this.updateArrayField(parameters);\n } else {\n this.createArrayField(parameters);\n }\n\n break;\n }\n case KameleoonData.VisitsData: {\n const data = dataItem.data as VisitsDataType;\n const hasVisitsKey =\n dereferencedData && KameleoonData.VisitsData in dereferencedData.data;\n const parameters: FieldParametersType = {\n visitorCode: visitorReference,\n data: storageData as DereferencedTargetingDataType,\n key: KameleoonData.VisitsData,\n value: data,\n };\n\n // -- Change directly if `[key]` exists\n if (hasVisitsKey) {\n const existingVisits = dereferencedData.data[\n data.type\n ] as ExistingVisitsDataType;\n\n // --- Note ---\n // We are preserving the order of visits\n existingVisits.visits.forEach((visit) => {\n Utilities.insertInOrderedListMutably({\n list: data.visits,\n element: visit,\n order: Order.Ascending,\n });\n });\n\n this.updateField({\n ...parameters,\n value: {\n ...data,\n visits: data.visits,\n },\n });\n } else {\n this.createField(parameters);\n }\n\n break;\n }\n default: {\n const { data } = dataItem;\n const hasDataKey =\n dereferencedData && data.type in dereferencedData.data;\n const parameters: FieldParametersType = {\n visitorCode: visitorReference,\n data: storageData as DereferencedTargetingDataType,\n key: data.type,\n // --- Note ---\n // At this point TypeScript can not infer that value is subset of only\n // what is left for `default` case\n value: data as FieldParametersType['value'],\n };\n\n if (hasDataKey) {\n this.updateField(parameters);\n } else {\n this.createField(parameters);\n }\n\n // --- Note ---\n // Here we add Browser, Device, Geolocation, OperatingSystem, KameleoonConversionScore to storedDataTypes\n // Later track if it is added to storage\n this.storedDataTypes.add(data.type);\n }\n }\n\n return this.storage.write(storageData);\n }\n\n public createReference(\n visitorCode: string,\n linkedVisitor: VisitorReference,\n ): void {\n const storageData = this.storage.read();\n\n if (!storageData.ok) {\n return;\n }\n\n // --- Note ---\n // Provided(linked) visitor is now pointing to the visitor code\n storageData.data[linkedVisitor] = visitorCode;\n\n this.storage.write(storageData.data);\n }\n\n public getLinkedVisitor(\n visitorCode: string,\n index: number | null,\n ): string | null {\n const storageData = this.storage.read();\n\n if (!storageData.ok) {\n return null;\n }\n\n if (typeof storageData.data[visitorCode] === 'string') {\n return storageData.data[visitorCode] as string;\n }\n\n if (index === null) {\n return null;\n }\n\n const visitorData = storageData.data[\n visitorCode\n ] as KameleoonVisitorDataType;\n\n if (!visitorData) {\n return null;\n }\n\n const customData = visitorData[KameleoonData.CustomData];\n\n if (customData && customData[index]) {\n return (customData[index] as CustomDataType).value[0];\n }\n\n return null;\n }\n\n public cleanupOutdatedTargetingData(targetingCleanupInterval?: number): void {\n const storageData = this.storage.read();\n\n if (!storageData.ok) {\n return;\n }\n\n const targetingData = storageData.data;\n const targetingDataLifetime = targetingCleanupInterval\n ? targetingCleanupInterval * Milliseconds.Minute\n : DEFAULT_CLEANUP_INTERVAL * Milliseconds.Minute;\n\n const currentTime = Date.now();\n\n // --- Note (Weird Thing) ---\n // Generally the check is not needed\n // If the `targetingData` is empty the loop will not be executed\n // But here something weird happens and we'are getting `TypeError` here\n // Even logging `Object.keys().length` or `Object.entries().length` solves the issue somehow\n // You can see the issue by commenting the following `if` statement and waiting for a data cleanup\n // TODO: investigate it later (probably related to object copying?)\n if (!Object.keys(targetingData).length) {\n return;\n }\n\n for (const [visitorCode, kameleoonVisitorData] of Object.entries(\n targetingData,\n )) {\n if (typeof kameleoonVisitorData === 'string') {\n delete targetingData[visitorCode];\n continue;\n }\n\n const visitorData = kameleoonVisitorData;\n\n const { customData, pageView, conversion, ...rest } = visitorData;\n\n // TODO: This way of cleaning up data is not optimal\n // And will be changed when sessions are introduced\n if (customData) {\n for (const [index, dataItem] of Object.entries(customData)) {\n if (dataItem) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n const existingData = visitorData[KameleoonData.CustomData];\n\n if (isDataExpired && existingData) {\n this.storedCustomDataIndexes.delete(Number(index));\n delete existingData[Number(index)];\n }\n\n if (existingData && !Object.keys(existingData).length) {\n this.storedCustomDataIndexes.clear();\n delete targetingData[KameleoonData.CustomData];\n }\n }\n }\n }\n\n if (pageView) {\n for (const [url, dataItem] of Object.entries(pageView)) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n const existingData = visitorData[KameleoonData.PageView];\n\n if (isDataExpired && existingData) {\n delete existingData[url];\n }\n\n if (existingData && !Object.keys(existingData).length) {\n delete visitorData[KameleoonData.PageView];\n }\n }\n }\n\n if (conversion) {\n for (const dataItem of conversion) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n const existingData = visitorData[KameleoonData.Conversion];\n\n if (isDataExpired && existingData) {\n existingData.splice(existingData.indexOf(dataItem), 1);\n }\n\n if (existingData && !existingData.length) {\n delete visitorData[KameleoonData.Conversion];\n }\n }\n }\n\n for (const [key, dataItem] of Object.entries(rest)) {\n const isDataExpired =\n dataItem.lastActivityTime + targetingDataLifetime < currentTime;\n\n if (isDataExpired) {\n delete visitorData[key as KameleoonData];\n this.storedDataTypes.delete(key as KameleoonData);\n }\n }\n\n if (!Object.keys(targetingData[visitorCode]).length) {\n this.storedDataTypes.clear();\n this.storedCustomDataIndexes.clear();\n delete targetingData[visitorCode];\n }\n }\n\n this.storage.write(targetingData);\n }\n\n public getTargetingData(\n visitorCode: string,\n ): Result<KameleoonVisitorDataType | null, KameleoonError> {\n const storageData = this.storage.read();\n\n if (!storageData.ok) {\n return Err(storageData.error);\n }\n\n const dereferencedData = this.dereferenceTargetingData(\n storageData.data,\n visitorCode,\n );\n\n if (!dereferencedData) {\n return Ok(null);\n }\n\n return Ok(dereferencedData.data);\n }\n\n private dereferenceTargetingData(\n data: TargetingDataType,\n visitorCode: string,\n ): DereferenceTargetingDataResultType | null {\n if (!data[visitorCode]) {\n return null;\n }\n\n // --- Note ---\n // Visitor reference can not refer to another visitor reference\n if (typeof data[visitorCode] === 'string') {\n const referredVisitorCode = data[visitorCode] as VisitorReference;\n\n return {\n data: data[referredVisitorCode] as KameleoonVisitorDataType,\n visitorReference: referredVisitorCode,\n };\n }\n\n return {\n data: data[visitorCode] as KameleoonVisitorDataType,\n visitorReference: visitorCode,\n };\n }\n\n get storedDataTypeList(): Set<KameleoonData> {\n return this.storedDataTypes;\n }\n\n get storedCustomDataIndexList(): Set<number> {\n return this.storedCustomDataIndexes;\n }\n\n private updateField({\n visitorCode,\n key,\n value,\n data,\n }: FieldParametersType): void {\n (data[visitorCode][key] as ExistingDataType<typeof key>) = {\n ...value,\n lastActivityTime: Date.now(),\n };\n }\n\n private createField({\n visitorCode,\n key,\n value,\n data,\n }: FieldParametersType): void {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: { ...value, lastActivityTime: Date.now() },\n };\n }\n\n private updateArrayField({\n visitorCode,\n key,\n value,\n data,\n }: ArrayFieldParametersType): void {\n (data[visitorCode][key] as ExistingArrayDataType).push({\n ...value,\n lastActivityTime: Date.now(),\n });\n }\n\n private createArrayField({\n visitorCode,\n key,\n value,\n data,\n }: ArrayFieldParametersType): void {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: [{ ...value, lastActivityTime: Date.now() }],\n };\n }\n\n private updateNestedField({\n visitorCode,\n key,\n nestedKey,\n value,\n data,\n }: NestedFieldParametersType): void {\n (data[visitorCode][key] as ExistingNestedDataType)[nestedKey] = {\n ...value,\n lastActivityTime: Date.now(),\n };\n }\n\n private createNestedField({\n visitorCode,\n key,\n nestedKey,\n value,\n data,\n }: NestedFieldParametersType): void {\n if (!data[visitorCode]?.[key]) {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: {\n [nestedKey]: { ...value, lastActivityTime: Date.now() },\n },\n };\n } else {\n data[visitorCode] = {\n ...data[visitorCode],\n [key]: {\n ...data[visitorCode][key],\n [nestedKey]: { ...value, lastActivityTime: Date.now() },\n },\n };\n }\n }\n}\n"],"mappings":"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"}
@@ -11,24 +11,15 @@ export declare class Device implements IKameleoonData {
11
11
  * @param {DeviceType} device - one of the available device types from `DeviceType` enum
12
12
  * */
13
13
  constructor(device: DeviceType);
14
- /**
15
- * @property url - url for the current data type used for events tracking
16
- * */
17
14
  get url(): string;
18
- /**
19
- * @property data - data of the current class instance
20
- * */
21
15
  get data(): DeviceDataType;
22
- /**
23
- * @property isSent - signifying if the data was sent already tracked
24
- * */
25
16
  get isSent(): boolean;
26
17
  set isSent(value: boolean);
27
18
  /**
28
19
  * @private
29
- * @method _fromVisits - an internal method for creating an instance of Device class from a list of visits
30
- * @param {VisitType[]} visits - a list of visits
20
+ * @method _fromVisit - an internal method for creating an instance of Device class from a visit
21
+ * @param {VisitType} visit - a visit
31
22
  * @returns {Device | undefined} an instance of Device class or undefined if browser can not be found among visits
32
23
  * */
33
- static _fromVisits(visits: VisitType[]): Device | undefined;
24
+ static _fromVisit(visit: VisitType): Device | undefined;
34
25
  }
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Device=void 0;var _requester=require("../requester"),_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 Device{constructor(a){_defineProperty(this,"device",void 0),_defineProperty(this,"sent",void 0),this.device=a,this.sent=!1}get url(){return this.device?_requester.UrlEventType.StaticData+_requester.UrlParameter.DeviceType+this.device:""}get data(){return{device:this.device,type:_types.KameleoonData.Device,sent:this.sent}}get isSent(){return this.sent}set isSent(a){this.sent=a}static _fromVisits(a){let b;for(let c=a.length-1;0<=c;c--){const d=a[c];if(!d.staticDataEvent)continue;const{deviceType:e}=d.staticDataEvent.data;e&&(b=e)}if(b)return new Device(b)}}exports.Device=Device;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Device=void 0;var _requester=require("../requester"),_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 Device{constructor(a){_defineProperty(this,"device",void 0),_defineProperty(this,"sent",void 0),this.device=a,this.sent=!1}get url(){return this.device?_requester.UrlEventType.StaticData+_requester.UrlParameter.DeviceType+this.device:""}get data(){return{device:this.device,type:_types.KameleoonData.Device,sent:this.sent}}get isSent(){return this.sent}set isSent(a){this.sent=a}static _fromVisit(a){var b;return null!==(b=a.staticDataEvent)&&void 0!==b&&b.data.deviceType?new Device(a.staticDataEvent.data.deviceType):void 0}}exports.Device=Device;
2
2
  //# sourceMappingURL=device.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","names":["Device","constructor","device","_defineProperty","sent","url","UrlEventType","StaticData","UrlParameter","DeviceType","data","type","KameleoonData","isSent","value","_fromVisits","visits","i","length","visit","staticDataEvent","deviceType","exports"],"sources":["../../src/kameleoonData/device.ts"],"sourcesContent":["import { UrlEventType, UrlParameter, VisitType } from 'src/requester';\nimport {\n DeviceDataType,\n DeviceType,\n IKameleoonData,\n KameleoonData,\n} from './types';\n\n/**\n * @class\n * Device - a class for creating an instance for device of a certain type\n * */\nexport class Device implements IKameleoonData {\n private device: DeviceType;\n private sent: boolean;\n\n /**\n * @param {DeviceType} device - one of the available device types from `DeviceType` enum\n * */\n constructor(device: DeviceType) {\n this.device = device;\n this.sent = false;\n }\n\n /**\n * @property url - url for the current data type used for events tracking\n * */\n get url(): string {\n // --- Note ---\n // If SDK is used in vanilla JS codebase, then you're also able to create an instance\n // with no required data, we don't want send anything to tracking in that case\n if (!this.device) {\n return '';\n }\n\n return UrlEventType.StaticData + UrlParameter.DeviceType + this.device;\n }\n\n /**\n * @property data - data of the current class instance\n * */\n get data(): DeviceDataType {\n return {\n device: this.device,\n type: KameleoonData.Device,\n sent: this.sent,\n };\n }\n\n /**\n * @property isSent - signifying if the data was sent already tracked\n * */\n get isSent(): boolean {\n return this.sent;\n }\n\n set isSent(value: boolean) {\n this.sent = value;\n }\n\n /**\n * @private\n * @method _fromVisits - an internal method for creating an instance of Device class from a list of visits\n * @param {VisitType[]} visits - a list of visits\n * @returns {Device | undefined} an instance of Device class or undefined if browser can not be found among visits\n * */\n public static _fromVisits(visits: VisitType[]): Device | undefined {\n let device: DeviceType | undefined = undefined;\n\n // --- Note ---\n // Going backwards to get the latest visit data\n for (let i = visits.length - 1; i >= 0; i--) {\n const visit = visits[i];\n\n if (!visit.staticDataEvent) {\n continue;\n }\n\n const { deviceType } = visit.staticDataEvent.data;\n\n if (deviceType) {\n device = deviceType;\n }\n }\n\n if (device) {\n return new Device(device);\n }\n }\n}\n"],"mappings":"8pBAYO,KAAM,CAAAA,MAAiC,CAO5CC,WAAWA,CAACC,CAAkB,CAAE,CAAAC,eAAA,uBAAAA,eAAA,qBAC9B,IAAI,CAACD,MAAM,CAAGA,CAAM,CACpB,IAAI,CAACE,IAAI,GACX,CAKA,GAAI,CAAAC,GAAGA,CAAA,CAAW,OAIX,KAAI,CAACH,MAAM,CAITI,uBAAY,CAACC,UAAU,CAAGC,uBAAY,CAACC,UAAU,CAAG,IAAI,CAACP,MAAM,CAH7D,EAIX,CAKA,GAAI,CAAAQ,IAAIA,CAAA,CAAmB,CACzB,MAAO,CACLR,MAAM,CAAE,IAAI,CAACA,MAAM,CACnBS,IAAI,CAAEC,oBAAa,CAACZ,MAAM,CAC1BI,IAAI,CAAE,IAAI,CAACA,IACb,CACF,CAKA,GAAI,CAAAS,MAAMA,CAAA,CAAY,CACpB,MAAO,KAAI,CAACT,IACd,CAEA,GAAI,CAAAS,MAAMA,CAACC,CAAc,CAAE,CACzB,IAAI,CAACV,IAAI,CAAGU,CACd,CAQA,MAAc,CAAAC,WAAWA,CAACC,CAAmB,CAAsB,CACjE,GAAI,CAAAd,CAA0C,CAI9C,IAAK,GAAI,CAAAe,CAAC,CAAGD,CAAM,CAACE,MAAM,CAAG,CAAC,CAAO,CAAC,EAAND,CAAM,CAAEA,CAAC,EAAE,CAAE,CAC3C,KAAM,CAAAE,CAAK,CAAGH,CAAM,CAACC,CAAC,CAAC,CAEvB,GAAI,CAACE,CAAK,CAACC,eAAe,CACxB,SAGF,KAAM,CAAEC,UAAU,CAAVA,CAAW,CAAC,CAAGF,CAAK,CAACC,eAAe,CAACV,IAAI,CAE7CW,CAAU,GACZnB,CAAM,CAAGmB,CAAU,CAEvB,CAEA,GAAInB,CAAM,CACR,MAAO,IAAI,CAAAF,MAAM,CAACE,CAAM,CAE5B,CACF,CAACoB,OAAA,CAAAtB,MAAA,CAAAA,MAAA"}
1
+ {"version":3,"file":"device.js","names":["Device","constructor","device","_defineProperty","sent","url","UrlEventType","StaticData","UrlParameter","DeviceType","data","type","KameleoonData","isSent","value","_fromVisit","visit","b","staticDataEvent","deviceType","exports"],"sources":["../../src/kameleoonData/device.ts"],"sourcesContent":["import { UrlEventType, UrlParameter, VisitType } from 'src/requester';\nimport {\n DeviceDataType,\n DeviceType,\n IKameleoonData,\n KameleoonData,\n} from './types';\n\n/**\n * @class\n * Device - a class for creating an instance for device of a certain type\n * */\nexport class Device implements IKameleoonData {\n private device: DeviceType;\n private sent: boolean;\n\n /**\n * @param {DeviceType} device - one of the available device types from `DeviceType` enum\n * */\n constructor(device: DeviceType) {\n this.device = device;\n this.sent = false;\n }\n\n get url(): string {\n // --- Note ---\n // If SDK is used in vanilla JS codebase, then you're also able to create an instance\n // with no required data, we don't want send anything to tracking in that case\n if (!this.device) {\n return '';\n }\n\n return UrlEventType.StaticData + UrlParameter.DeviceType + this.device;\n }\n\n get data(): DeviceDataType {\n return {\n device: this.device,\n type: KameleoonData.Device,\n sent: this.sent,\n };\n }\n\n get isSent(): boolean {\n return this.sent;\n }\n\n set isSent(value: boolean) {\n this.sent = value;\n }\n\n /**\n * @private\n * @method _fromVisit - an internal method for creating an instance of Device class from a visit\n * @param {VisitType} visit - a visit\n * @returns {Device | undefined} an instance of Device class or undefined if browser can not be found among visits\n * */\n public static _fromVisit(visit: VisitType): Device | undefined {\n if (visit.staticDataEvent?.data.deviceType) {\n return new Device(visit.staticDataEvent.data.deviceType);\n }\n\n return undefined;\n }\n}\n"],"mappings":"8pBAYO,KAAM,CAAAA,MAAiC,CAO5CC,WAAWA,CAACC,CAAkB,CAAE,CAAAC,eAAA,uBAAAA,eAAA,qBAC9B,IAAI,CAACD,MAAM,CAAGA,CAAM,CACpB,IAAI,CAACE,IAAI,GACX,CAEA,GAAI,CAAAC,GAAGA,CAAA,CAAW,OAIX,KAAI,CAACH,MAAM,CAITI,uBAAY,CAACC,UAAU,CAAGC,uBAAY,CAACC,UAAU,CAAG,IAAI,CAACP,MAAM,CAH7D,EAIX,CAEA,GAAI,CAAAQ,IAAIA,CAAA,CAAmB,CACzB,MAAO,CACLR,MAAM,CAAE,IAAI,CAACA,MAAM,CACnBS,IAAI,CAAEC,oBAAa,CAACZ,MAAM,CAC1BI,IAAI,CAAE,IAAI,CAACA,IACb,CACF,CAEA,GAAI,CAAAS,MAAMA,CAAA,CAAY,CACpB,MAAO,KAAI,CAACT,IACd,CAEA,GAAI,CAAAS,MAAMA,CAACC,CAAc,CAAE,CACzB,IAAI,CAACV,IAAI,CAAGU,CACd,CAQA,MAAc,CAAAC,UAAUA,CAACC,CAAgB,CAAsB,KAAAC,CAAA,gBAAAA,CAAA,CACzDD,CAAK,CAACE,eAAe,YAAAD,CAAA,EAArBA,CAAA,CAAuBP,IAAI,CAACS,UAAU,CACjC,GAAI,CAAAnB,MAAM,CAACgB,CAAK,CAACE,eAAe,CAACR,IAAI,CAACS,UAAU,CAAC,OAI5D,CACF,CAACC,OAAA,CAAApB,MAAA,CAAAA,MAAA"}
@@ -29,24 +29,15 @@ export declare class GeolocationData implements IKameleoonData {
29
29
  *
30
30
  * */
31
31
  constructor({ country, region, city, postalCode, coordinates, }: GeolocationInfoType);
32
- /**
33
- * @property url - url for the current data type used for events tracking
34
- * */
35
32
  get url(): string;
36
- /**
37
- * @property data - data of the current class instance
38
- * */
39
33
  get data(): GeolocationDataType;
40
- /**
41
- * @property isSent - signifying if the data was sent already tracked
42
- * */
43
34
  get isSent(): boolean;
44
35
  set isSent(value: boolean);
45
36
  /**
46
37
  * @private
47
- * @method _fromVisits - an internal method for creating an instance of GeolocationData class from a list of visits
48
- * @param {VisitType[]} visits - a list of visits
38
+ * @method _fromVisit - an internal method for creating an instance of GeolocationData class from a visit
39
+ * @param {VisitType} visit - a visit
49
40
  * @returns {GeolocationData | undefined} an instance of GeolocationData class or undefined if geolocation can not be found among visits
50
41
  * */
51
- static _fromVisits(visits: VisitType[]): GeolocationData | undefined;
42
+ static _fromVisit(visit: VisitType): GeolocationData | undefined;
52
43
  }