@kameleoon/javascript-sdk-core 5.2.1 → 5.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Change Log
2
2
 
3
+ ## 5.2.3 (2024-12-25)
4
+
5
+ ### Patch Changes
6
+
7
+ - Enhanced the performance of the [`setLegalConsent()`][setLegalConsent] method.
8
+ - Resolved an issue that could lead to uncontrolled memory growth in specific scenarios.
9
+
10
+ [setLegalConsent]: https://developers.kameleoon.com/feature-management-and-experimentation/web-sdks/js-sdk#setlegalconsent
11
+
12
+ ## 5.2.2 (2024-12-19)
13
+
14
+ ### Patch Changes
15
+
16
+ - Resolved an issue where the SDK could crash in certain scenarios when an error occurred during a request.
17
+ - Improved the consistency of logs for requests by updating similar messages and ensuring accurate display of both responses and errors.
18
+ - Implemented logging for EventSource status updates (connection, disconnection, and errors).
19
+ - Addressed a browser-related issue where, if consent was required or no consent was provided (no targeting delivery rules), newly generated visitor codes were stored in cookies after page reloads.
20
+
3
21
  ## 5.2.1 (2024-12-10)
4
22
 
5
23
  ### Patch Changes
@@ -51,5 +51,6 @@ export declare class ClientConfiguration implements IClientConfiguration {
51
51
  */
52
52
  private updateClientConfiguration;
53
53
  private updateStorageData;
54
+ private updateConsentRequired;
54
55
  }
55
56
  export {};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ClientConfiguration=void 0;var _tsRes=require("ts-res"),_types=require("./types"),_eventManager=require("../eventManager"),_constants=require("./constants"),_logging=require("../logging");function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class ClientConfiguration{constructor(a){let{updateInterval:b,urlProvider:c,storage:d,requester:e,dataManager:f,eventSource:g,externalVisitorCodeManager:h,eventManager:i}=a;_defineProperty(this,"updateConfigurationIntervalId",null),_defineProperty(this,"updateType",_types.UpdateType.Polling),_defineProperty(this,"configurationData",_constants.DEFAULT_CLIENT_CONFIGURATION),_defineProperty(this,"featureFlagsData",new Map),_defineProperty(this,"isTargetedDeliveryRule",null),_defineProperty(this,"segmentsData",null),_defineProperty(this,"updateInterval",void 0),_defineProperty(this,"lastUpdate",void 0),_defineProperty(this,"storage",void 0),_defineProperty(this,"requester",void 0),_defineProperty(this,"eventSource",void 0),_defineProperty(this,"mappedRules",null),_defineProperty(this,"mappedExperiments",null),_defineProperty(this,"dataManager",void 0),_defineProperty(this,"visitorCodeManager",void 0),_defineProperty(this,"eventManager",void 0),_defineProperty(this,"urlProvider",void 0),this.urlProvider=c,this.requester=e,this.updateInterval=b,this.lastUpdate=new Date,this.storage=d,this.dataManager=f,this.eventManager=i,this.visitorCodeManager=h,this.eventSource=g}async initialize(){_logging.KameleoonLogger.debug("CALL: ClientConfiguration.initialize()"),this.readStorageData();const a=this.checkShouldUpdate();if(a){const a=await this.updateClientConfiguration();if(!a.ok)return _logging.KameleoonLogger.error("Error occurred during client configuration update"),a;const b=a.data;if(b)return _logging.KameleoonLogger.debug("RETURN: ClientConfiguration.initialize()"),(0,_tsRes.Ok)()}return this.updateType!==_types.UpdateType.RealTime||this.eventSource.isOpen?(this.updateType===_types.UpdateType.Polling&&this.handlePollingUpdates(),_logging.KameleoonLogger.debug("RETURN: ClientConfiguration.initialize()"),(0,_tsRes.Ok)()):(_logging.KameleoonLogger.info("Configuration update type was toggled to Polling"),this.handleRealTimeUpdates(),_logging.KameleoonLogger.debug("RETURN: ClientConfiguration.initialize()"),(0,_tsRes.Ok)())}cleanupHandlers(){this.eventSource.isOpen&&this.eventSource.close(),this.updateConfigurationIntervalId&&clearInterval(this.updateConfigurationIntervalId)}handleRealTimeUpdates(){this.cleanupHandlers();const a=a=>{this.updateClientConfiguration(a).then(b=>{b.ok&&this.eventManager.fireEvent(_eventManager.EventType.ConfigurationUpdate,{timestamp:a})})};this.eventSource.open(a),this.eventSource.onError(a=>{_logging.KameleoonLogger.error`Error occurred during real-time update: ${a}. Switching to polling updates while the connection is not restored.`,this.updateType=_types.UpdateType.Polling,this.handlePollingUpdates()})}handlePollingUpdates(){this.cleanupHandlers();try{this.updateConfigurationIntervalId=setInterval(this.updateClientConfiguration.bind(this),this.updateInterval)}catch(a){throw this.updateConfigurationIntervalId&&clearInterval(this.updateConfigurationIntervalId),a}}get featureFlags(){return this.featureFlagsData}get configuration(){return this.configurationData.configuration}get segments(){if(this.segmentsData)return this.segmentsData;const a=new Map;return this.featureFlagsData.forEach(b=>{b.rules.forEach(b=>{b.segment&&!a.has(b.segment.id)&&a.set(b.segment.id,b.segment)})}),this.segmentsData=a,a}get ruleMap(){var a;if(null!==(a=this.mappedRules)&&void 0!==a&&a.size)return this.mappedRules;const b=new Map;for(const a of this.featureFlags.values())for(const c of a.rules){const{id:d,experimentId:e,variationByExposition:f}=c,g=new Map;f.forEach(a=>{let{variationKey:b,variationId:c}=a;"number"==typeof c&&g.set(b,c)}),b.set(d,{featureId:a.id,experimentId:e,variations:g})}return this.mappedRules=b,b}get experimentMap(){var a;if(null!==(a=this.mappedExperiments)&&void 0!==a&&a.size)return this.mappedExperiments;const b=new Map;for(const a of this.featureFlags.values())for(const c of a.rules){const{experimentId:a,variationByExposition:d}=c,e=new Map;d.forEach(a=>{let{variationKey:b,variationId:c}=a;"number"==typeof c&&e.set(b,c)}),b.set(a,{type:c.type,variations:e})}return this.mappedExperiments=b,b}get isConsentRequired(){return this.configuration.consentType===_types.ConsentType.Required}get hasAnyTargetedDeliveryRule(){if(null!==this.isTargetedDeliveryRule)return this.isTargetedDeliveryRule;for(const a of this.featureFlags.values())if(a.environmentEnabled&&a.rules.some(a=>a.type===_types.RuleType.TARGETED_DELIVERY))return!0;return!1}checkShouldUpdate(){const{configuration:a}=this.configurationData;if(this.updateType=a.realTimeUpdate?_types.UpdateType.RealTime:_types.UpdateType.Polling,!this.featureFlags.size)return!0;const b=this.lastUpdate.getTime(),c=Date.now()-this.updateInterval;return b<c}readStorageData(){_logging.KameleoonLogger.debug("CALL: ClientConfiguration.readStorageData()");const a=this.storage.read();if(a.ok){const{data:b,lastUpdate:c}=a.data;this.urlProvider.dataApiDomain=b.configuration.dataApiDomain;const{featureFlags:d,customData:e}=b;null!==e&&void 0!==e&&e.length&&(this.dataManager.customDataIndexes=e);for(const a of d)this.featureFlagsData.set(a.featureKey,a);this.configurationData=b,this.lastUpdate=new Date(Date.parse(c))}_logging.KameleoonLogger.debug`RETURN: ClientConfiguration.readStorageData() -> (result: ${a.ok})`}async updateClientConfiguration(a){var b,c;const d=await this.requester.getClientConfiguration(a);if(!d.ok)return this.featureFlags.size?(_logging.KameleoonLogger.error("Error occurred while updating configuration. Existing configuration will be used as a fallback."),(0,_tsRes.Ok)(!0)):d;const{configuration:e,customData:f,featureFlags:g}=d.data;this.configurationData={configuration:e,customData:f};for(const b of g)this.featureFlagsData.set(b.featureKey,b);null!==f&&void 0!==f&&f.length&&(this.dataManager.customDataIndexes=f),this.dataManager.clearTrees(),null===(b=this.mappedRules)||void 0===b?void 0:b.clear(),null===(c=this.experimentMap)||void 0===c?void 0:c.clear(),this.isTargetedDeliveryRule=null,this.segmentsData=null;const h=this.updateStorageData();if(!h.ok)return h;const i=e.realTimeUpdate?_types.UpdateType.RealTime:_types.UpdateType.Polling,j=i!==this.updateType;j&&(this.updateType=i,_logging.KameleoonLogger.debug`Configuration update type was toggled to ${i}`,await this.initialize());const k=this.isConsentRequired&&!this.hasAnyTargetedDeliveryRule;return this.visitorCodeManager.consentRequired=k,(0,_tsRes.Ok)(j)}updateStorageData(){this.lastUpdate=new Date;const a=_objectSpread(_objectSpread({},this.configurationData),{},{featureFlags:Array.from(this.featureFlags.values())}),b={data:a,lastUpdate:this.lastUpdate.toString()};return this.urlProvider.dataApiDomain=this.configurationData.configuration.dataApiDomain,this.storage.write(b)}}exports.ClientConfiguration=ClientConfiguration;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ClientConfiguration=void 0;var _tsRes=require("ts-res"),_types=require("./types"),_eventManager=require("../eventManager"),_constants=require("./constants"),_logging=require("../logging");function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class ClientConfiguration{constructor(a){let{updateInterval:b,urlProvider:c,storage:d,requester:e,dataManager:f,eventSource:g,externalVisitorCodeManager:h,eventManager:i}=a;_defineProperty(this,"updateConfigurationIntervalId",null),_defineProperty(this,"updateType",_types.UpdateType.Polling),_defineProperty(this,"configurationData",_constants.DEFAULT_CLIENT_CONFIGURATION),_defineProperty(this,"featureFlagsData",new Map),_defineProperty(this,"isTargetedDeliveryRule",null),_defineProperty(this,"segmentsData",null),_defineProperty(this,"updateInterval",void 0),_defineProperty(this,"lastUpdate",void 0),_defineProperty(this,"storage",void 0),_defineProperty(this,"requester",void 0),_defineProperty(this,"eventSource",void 0),_defineProperty(this,"mappedRules",null),_defineProperty(this,"mappedExperiments",null),_defineProperty(this,"dataManager",void 0),_defineProperty(this,"visitorCodeManager",void 0),_defineProperty(this,"eventManager",void 0),_defineProperty(this,"urlProvider",void 0),this.urlProvider=c,this.requester=e,this.updateInterval=b,this.lastUpdate=new Date,this.storage=d,this.dataManager=f,this.eventManager=i,this.visitorCodeManager=h,this.eventSource=g}async initialize(){_logging.KameleoonLogger.debug("CALL: ClientConfiguration.initialize()"),this.readStorageData();const a=this.checkShouldUpdate();if(a){const a=await this.updateClientConfiguration();if(!a.ok)return _logging.KameleoonLogger.error("Error occurred during client configuration update"),a;const b=a.data;if(b)return _logging.KameleoonLogger.debug("RETURN: ClientConfiguration.initialize()"),(0,_tsRes.Ok)()}return this.updateType!==_types.UpdateType.RealTime||this.eventSource.isOpen?(this.updateType===_types.UpdateType.Polling&&this.handlePollingUpdates(),_logging.KameleoonLogger.debug("RETURN: ClientConfiguration.initialize()"),(0,_tsRes.Ok)()):(this.handleRealTimeUpdates(),_logging.KameleoonLogger.debug("RETURN: ClientConfiguration.initialize()"),(0,_tsRes.Ok)())}cleanupHandlers(){this.eventSource.isOpen&&this.eventSource.close(),this.updateConfigurationIntervalId&&clearInterval(this.updateConfigurationIntervalId)}handleRealTimeUpdates(){this.cleanupHandlers();const a=a=>{this.updateClientConfiguration(a).then(b=>{b.ok&&this.eventManager.fireEvent(_eventManager.EventType.ConfigurationUpdate,{timestamp:a})})};this.eventSource.open(a),this.eventSource.onError(a=>{_logging.KameleoonLogger.error`Error occurred during real-time update: ${a}. Switching to polling updates while the connection is not restored.`,this.updateType=_types.UpdateType.Polling,this.handlePollingUpdates()})}handlePollingUpdates(){this.cleanupHandlers();try{this.updateConfigurationIntervalId=setInterval(this.updateClientConfiguration.bind(this),this.updateInterval)}catch(a){throw this.updateConfigurationIntervalId&&clearInterval(this.updateConfigurationIntervalId),a}}get featureFlags(){return this.featureFlagsData}get configuration(){return this.configurationData.configuration}get segments(){if(this.segmentsData)return this.segmentsData;const a=new Map;return this.featureFlagsData.forEach(b=>{b.rules.forEach(b=>{b.segment&&!a.has(b.segment.id)&&a.set(b.segment.id,b.segment)})}),this.segmentsData=a,a}get ruleMap(){var a;if(null!==(a=this.mappedRules)&&void 0!==a&&a.size)return this.mappedRules;const b=new Map;for(const a of this.featureFlags.values())for(const c of a.rules){const{id:d,experimentId:e,variationByExposition:f}=c,g=new Map;f.forEach(a=>{let{variationKey:b,variationId:c}=a;"number"==typeof c&&g.set(b,c)}),b.set(d,{featureId:a.id,experimentId:e,variations:g})}return this.mappedRules=b,b}get experimentMap(){var a;if(null!==(a=this.mappedExperiments)&&void 0!==a&&a.size)return this.mappedExperiments;const b=new Map;for(const a of this.featureFlags.values())for(const c of a.rules){const{experimentId:a,variationByExposition:d}=c,e=new Map;d.forEach(a=>{let{variationKey:b,variationId:c}=a;"number"==typeof c&&e.set(b,c)}),b.set(a,{type:c.type,variations:e})}return this.mappedExperiments=b,b}get isConsentRequired(){return this.configuration.consentType===_types.ConsentType.Required}get hasAnyTargetedDeliveryRule(){if(null!==this.isTargetedDeliveryRule)return this.isTargetedDeliveryRule;for(const a of this.featureFlags.values())if(a.environmentEnabled&&a.rules.some(a=>a.type===_types.RuleType.TARGETED_DELIVERY))return!0;return!1}checkShouldUpdate(){const{configuration:a}=this.configurationData;if(this.updateType=a.realTimeUpdate?_types.UpdateType.RealTime:_types.UpdateType.Polling,!this.featureFlags.size)return!0;const b=this.lastUpdate.getTime(),c=Date.now()-this.updateInterval;return b<c}readStorageData(){_logging.KameleoonLogger.debug("CALL: ClientConfiguration.readStorageData()");const a=this.storage.read();if(a.ok){const{data:b,lastUpdate:c}=a.data;this.urlProvider.dataApiDomain=b.configuration.dataApiDomain;const{featureFlags:d,customData:e}=b;null!==e&&void 0!==e&&e.length&&(this.dataManager.customDataIndexes=e);for(const a of d)this.featureFlagsData.set(a.featureKey,a);this.configurationData=b,this.updateConsentRequired(),this.lastUpdate=new Date(Date.parse(c))}_logging.KameleoonLogger.debug`RETURN: ClientConfiguration.readStorageData() -> (result: ${a.ok})`}async updateClientConfiguration(a){var b,c;const d=await this.requester.getClientConfiguration(a);if(!d.ok)return this.featureFlags.size?(_logging.KameleoonLogger.error("Error occurred while updating configuration. Existing configuration will be used as a fallback."),(0,_tsRes.Ok)(!0)):d;const{configuration:e,customData:f,featureFlags:g}=d.data;this.configurationData={configuration:e,customData:f};for(const b of g)this.featureFlagsData.set(b.featureKey,b);null!==f&&void 0!==f&&f.length&&(this.dataManager.customDataIndexes=f),this.dataManager.clearTrees(),null===(b=this.mappedRules)||void 0===b?void 0:b.clear(),null===(c=this.experimentMap)||void 0===c?void 0:c.clear(),this.isTargetedDeliveryRule=null,this.segmentsData=null;const h=this.updateStorageData();if(!h.ok)return h;const i=e.realTimeUpdate?_types.UpdateType.RealTime:_types.UpdateType.Polling,j=i!==this.updateType;return j&&(this.updateType=i,_logging.KameleoonLogger.info`Configuration update type was toggled to ${i}`,await this.initialize()),this.updateConsentRequired(),(0,_tsRes.Ok)(j)}updateStorageData(){this.lastUpdate=new Date;const a=_objectSpread(_objectSpread({},this.configurationData),{},{featureFlags:Array.from(this.featureFlags.values())}),b={data:a,lastUpdate:this.lastUpdate.toString()};return this.urlProvider.dataApiDomain=this.configurationData.configuration.dataApiDomain,this.storage.write(b)}updateConsentRequired(){this.visitorCodeManager.consentRequired=this.isConsentRequired&&!this.hasAnyTargetedDeliveryRule}}exports.ClientConfiguration=ClientConfiguration;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonEventSource=void 0;var _=require(".."),_constants=require("./constants");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class KameleoonEventSource{constructor(a){let{siteCode:b,externalEventSource:c,urlProvider:d}=a;_defineProperty(this,"eventSource",void 0),_defineProperty(this,"siteCode",void 0),_defineProperty(this,"url",void 0),_defineProperty(this,"isConnectionOpen",void 0),this.url=d.getEventSourceUrl(),this.siteCode=b,this.eventSource=c,this.isConnectionOpen=!1}get isOpen(){return this.isConnectionOpen}open(a){this.eventSource.open({onEvent:this.handleMessage(a),url:this.url,eventType:_constants.REAL_TIME_EVENT}),this.isConnectionOpen=!0}close(){this.eventSource.close(),this.isConnectionOpen=!1}onError(a){return this.eventSource.onError?void this.eventSource.onError(a):void _.KameleoonLogger.warning("EventSource does not have `onError` method provided. Real-time errors won't be handled.")}handleMessage(a){const b=b=>{const c=JSON.parse(b.data),{siteCode:d,ts:e}=c;this.siteCode===d&&a(e)};return b}}exports.KameleoonEventSource=KameleoonEventSource;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonEventSource=void 0;var _=require(".."),_constants=require("./constants");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class KameleoonEventSource{constructor(a){let{siteCode:b,externalEventSource:c,urlProvider:d}=a;_defineProperty(this,"eventSource",void 0),_defineProperty(this,"siteCode",void 0),_defineProperty(this,"url",void 0),_defineProperty(this,"isConnectionOpen",void 0),this.url=d.getEventSourceUrl(),this.siteCode=b,this.eventSource=c,this.isConnectionOpen=!1}get isOpen(){return this.isConnectionOpen}open(a){this.eventSource.open({onEvent:this.handleMessage(a),url:this.url,eventType:_constants.REAL_TIME_EVENT}),this.isConnectionOpen=!0,_.KameleoonLogger.info`Established a new SSE connection with: ${this.url}`}close(){this.eventSource.close(),this.isConnectionOpen=!1,_.KameleoonLogger.info`SSE connection: '${this.url}' was successfully closed`}onError(a){return this.eventSource.onError?void this.eventSource.onError(a):void _.KameleoonLogger.warning("EventSource does not have `onError` method provided. Real-time errors won't be handled.")}handleMessage(a){const b=b=>{_.KameleoonLogger.debug`Received new message from: ${this.url}`;const c=JSON.parse(b.data),{siteCode:d,ts:e}=c;this.siteCode===d&&a(e)};return b}}exports.KameleoonEventSource=KameleoonEventSource;
@@ -49,6 +49,7 @@ export declare class KameleoonClient implements IKameleoonClient {
49
49
  setLogLevel(level: LogLevel): void;
50
50
  setForcedVariation({ visitorCode, experimentId, variationKey, forceTargeting, }: SetForcedVariationParametersType): void;
51
51
  protected setUserConsent({ visitorCode, consent, setData, }: SetUserConsentParametersType): void;
52
+ private updateConsentData;
52
53
  private _isConsentProvided;
53
54
  private _getFeatureVariables;
54
55
  private _getActiveFeatureVariations;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonClient=void 0;var _tsRes=require("ts-res"),_cacheManager=require("./cacheManager"),_clientConfiguration=require("./clientConfiguration"),_clientSettings=require("./clientSettings"),_constants=require("./constants"),_kameleoonData=require("./kameleoonData"),_kameleoonError=require("./kameleoonError"),_requester=require("./requester"),_storage=require("./storage"),_types=require("./types"),_utilities=require("./utilities"),_variationConfiguration=require("./variationConfiguration"),_eventSource=require("./eventSource"),_visitorCodeManager=require("./visitorCodeManager"),_eventManager=require("./eventManager"),_tracking=require("./tracking"),_logging=require("./logging");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class KameleoonClient{constructor(a){var b;let{siteCode:c,dependencies:d,configuration:e,internalConfiguration:f}=a;_defineProperty(this,"variationConfiguration",void 0),_defineProperty(this,"clientConfiguration",void 0),_defineProperty(this,"dataManager",void 0),_defineProperty(this,"consentDataStorage",void 0),_defineProperty(this,"trackingCache",void 0),_defineProperty(this,"requester",void 0),_defineProperty(this,"externalPackageInfo",void 0),_defineProperty(this,"initialized",!1),_defineProperty(this,"visitorCodeManager",void 0),_defineProperty(this,"eventManager",void 0),_defineProperty(this,"tracker",void 0),_defineProperty(this,"environment",void 0);const g=null===f||void 0===f?void 0:f.externals.externalLogger;g&&_logging.KameleoonLogger.setLogger(g),_logging.KameleoonLogger.debug`CALL: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`;const{settings:h}=new _clientSettings.ClientSettings(c,e);this.environment=h.environment;const{externalStorage:i,externalEventSource:j,externalPackageInfo:k,externalVisitorCodeManager:l,externalRequester:m,externalPRNG:n}=f.externals,{useAbortController:o}=f.settings,p=new _cacheManager.CacheManager(_constants.CACHE_CLEANUP_TIMEOUT),q=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ClientData),r=new _storage.DataStorage(i,_storage.KameleoonStorageKey.TargetingData),s=new _storage.DataStorage(i,_storage.KameleoonStorageKey.DataInfo),t=new _storage.DataStorage(i,_storage.KameleoonStorageKey.VariationData),u=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ForcedExperimentVariation),v=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ForcedFeatureVariation),w=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ConsentData),x=new _storage.DataStorage(i,_storage.KameleoonStorageKey.TrackingData),y=new _kameleoonData.DataManager({dataStorage:r,infoStorage:s,cleanupInterval:h.cleanupInterval}),z=null!==(b=null===d||void 0===d?void 0:d.urlProvider)&&void 0!==b?b:new _requester.UrlProvider;z.initialize({domain:h.networkDomain,siteCode:h.siteCode,packageInfo:k,environment:h.environment});const A=new _requester.Requester({urlProvider:z,useAbortController:o,packageInfo:k,externalRequester:m,requestTimeout:h.requestTimeout,trackRetryDelay:h.trackRetryDelay}),B=new _eventSource.KameleoonEventSource({siteCode:h.siteCode,externalEventSource:j,urlProvider:z}),C=new _eventManager.EventManager,D=new _clientConfiguration.ClientConfiguration({urlProvider:z,storage:q,updateInterval:h.updateInterval,dataManager:y,eventManager:C,requester:A,eventSource:B,externalVisitorCodeManager:l}),E=new _variationConfiguration.VariationConfiguration(t,u,v,l,D),F=new _tracking.Tracker({dataManager:y,trackingStorage:x,variationConfiguration:E,requester:A,trackingInterval:h.trackingInterval,prng:n});this.tracker=F,this.variationConfiguration=E,this.requester=A,this.trackingCache=p,this.dataManager=y,this.clientConfiguration=D,this.externalPackageInfo=k,this.consentDataStorage=w,this.visitorCodeManager=l,this.eventManager=C,_logging.KameleoonLogger.debug`RETURN: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`}async initialize(){_logging.KameleoonLogger.info("CALL: KameleoonClient.initialize()");const a=await this.clientConfiguration.initialize();return a.throw(),this.initialized=!0,_logging.KameleoonLogger.info`RETURN: KameleoonClient.initialize() -> (result: ${a.ok})`,a.ok}addData(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];if(_logging.KameleoonLogger.info`CALL: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`,this.visitorCodeManager.validateVisitorCode(a).throw(),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.dataManager.storeData(a,...c).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`}async getRemoteVisitorData(a){let{visitorCode:b,shouldAddData:c=!0,filters:d=_constants.DEFAULT_VISITOR_DATA_FILTERS}=a;if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(b).throw();const{previousVisitAmount:e}=d;if("number"==typeof e&&(1>e||25<e))throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitAmount);const f=this.dataManager.isUniqueIdentifier(b),g=await this.requester.getVisitorData({visitorCode:b,filters:d,isMappingIdentifier:f}),h=g.throw(),{visitorData:i,storageVisitorData:j,visitsData:k}=_utilities.Parser.parseVisitorData({data:h,filters:d,visitorCode:b,dataManager:this.dataManager,variationConfiguration:this.variationConfiguration});for(const d of j)(c||this.dataManager.isPersistentCustomData(d))&&this.addData(b,d);return k&&c&&this.addData(b,k),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d}) -> (visitorData: ${i})`,i}trackConversion(a){let{visitorCode:b,goalId:c,revenue:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, revenue: ${d})`,this.addData(b,new _kameleoonData.Conversion({goalId:c,revenue:d})),this.flush(b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, revenue: ${d})`}flush(a){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.flush(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if("string"==typeof a)return this.visitorCodeManager.validateVisitorCode(a).throw(),this.tracker.scheduleVisitor(a,this._isConsentProvided(a)),void _logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`;for(const b of this.dataManager.unsentDataVisitors)this.tracker.scheduleVisitor(b,this._isConsentProvided(b));_logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`}getFeatureFlags(){if(_logging.KameleoonLogger.info("CALL: KameleoonClient.getFeatureFlags()"),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);const a=this.clientConfiguration.featureFlags,b=[];return a.forEach(a=>{let{id:c,featureKey:d}=a;b.push({id:c,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlags() -> (FeatureFlags: ${b})`,b}getVisitorFeatureFlags(a){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=[];return b.forEach(a=>{let{featureFlagId:b,featureKey:d}=a;c.push({id:b,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getVariation(a){let{visitorCode:b,featureKey:c,track:d=!0}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=this._getFeatureVariation({visitorCode:b,featureKey:c,track:d}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${e})`,e}getVariations(a){let{visitorCode:b,onlyActive:c=!1,track:d=!0}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=new Map,f=this.clientConfiguration.featureFlags;for(const g of f.values()){const a=this._getFeatureVariation({visitorCode:b,featureKey:g.featureKey,track:d});a.ok&&(!c||a.data.key!==_constants.OFF_VARIATION_KEY)&&e.set(g.featureKey,a.data)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d}) -> (variations: ${e})`,e}getActiveFeatureFlags(a){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=new Map;return b.forEach(b=>{const{variationKey:d,featureKey:e,variationId:f,experimentId:g}=b;let h=[];null!==f&&null!==g&&(h=this._getFeatureVariables({visitorCode:a,featureKey:e,variationKey:d}));const i=h.map(a=>_utilities.Parser.parseFeatureVariable(a).throw());c.set(b.featureKey,{key:d,id:f,experimentId:g,variables:i})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getFeatureFlagVariationKey(a,b){_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b}) -> (variationKey: ${c})`,c}getFeatureFlagVariable(a){let{visitorCode:b,featureKey:c,variableKey:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const{key:e}=this._getFeatureVariation({visitorCode:b,featureKey:c,track:!0}).throw(),f=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:e}),g=f.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariableNotFound,d,b);const{type:h,value:i}=_utilities.Parser.parseFeatureVariable(g).throw(),j={type:h,value:i};return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d}) -> (FeatureFlagVariable: ${j})`,j}getFeatureFlagVariables(a,b){_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw(),d=this._getFeatureVariables({visitorCode:a,featureKey:b,variationKey:c}),e=[];for(const c of d){const a=_utilities.Parser.parseFeatureVariable(c).throw();e.push(a)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b}) -> (FeatureFlagVariables: ${e})`,e}isFeatureFlagActive(a,b){let[c,d,e]=["","",!0];"string"==typeof a?(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d})`,c=a,d=b):(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track ${e})`,[c,d]=[a.visitorCode,a.featureKey],a.track!==void 0&&(e=a.track)),this.visitorCodeManager.validateVisitorCode(c).throw();try{const{key:a}=this._getFeatureVariation({visitorCode:c,featureKey:d,track:e}).throw(),b=a!==_constants.OFF_VARIATION_KEY;return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: ${b})`,b}catch(a){if(a instanceof _kameleoonError.KameleoonError&&a.type===_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: false)`,!1;throw a}}async getRemoteData(a){_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteData(key: ${a})`;const b=await this.requester.getRemoteData(a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteData(key: ${a}) -> (remoteData: ${b})`,b.throw()}async getVisitorWarehouseAudience(a){let{visitorCode:b,customDataIndex:c,warehouseKey:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=await this.getRemoteData(d||b);if(!e)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,`No data found for ${d||b} key`);if(!e[_constants.WAREHOUSE_AUDIENCE_KEY]||0===Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]).length)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: null)`,null;const f=new _kameleoonData.CustomData(c,...Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]));return this.dataManager.storeData(b,f),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: ${f})`,f}onEvent(a,b){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.onEvent(event: ${a}, callback)`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.eventManager.addEventHandler(a,b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.onEvent(event: ${a}, callback)`}getEngineTrackingCode(a){_logging.KameleoonLogger.info`CALL: KameleoonClient.getEngineTrackingCode(visitorCode: ${a})`,this.visitorCodeManager.validateVisitorCode(a).throw();const b=_utilities.Utilities.getTrackingCode(this.trackingCache,a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getEngineTrackingCode(visitorCode: ${a}) -> (trackingCode: ${b})`,b}isInitialized(){return _logging.KameleoonLogger.debug`CALL/RETURN: KameleoonClient.isInitialized() -> (initialized: ${this.initialized})`,this.initialized}setLogLevel(a){_logging.KameleoonLogger.setLogLevel(a)}setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this._setForcedVariation({visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e}).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`}setUserConsent(a){let{visitorCode:b,consent:c,setData:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this.consentDataStorage.update({[b]:c}),c?d({visitorCode:b,key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.DEFAULT_MAX_AGE,path:_visitorCodeManager.PATH}):this.visitorCodeManager.consentRequired&&d({visitorCode:"",key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.ZERO_MAX_AGE,path:_visitorCodeManager.PATH}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`}_isConsentProvided(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._isConsentProvided(visitorCode: ${a})`;const{isConsentRequired:b}=this.clientConfiguration,c=this.consentDataStorage.read(),d=!b||c.ok&&c.data[a];return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._isConsentProvided(visitorCode: ${a}) -> (isConsentProvided: ${d})`,d}_getFeatureVariables(a){let{visitorCode:b,featureKey:c,variationKey:d}=a;_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d})`;const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c);const g=f.variations.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d}) -> (variables: ${g.variables})`,g.variables}_getActiveFeatureVariations(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a})`;const b=this.clientConfiguration.featureFlags,c=[],d=this.dataManager.getVisitorData(a),e=this.dataManager.getVisitorIdentifier(a);for(const f of b.values()){if(!f.environmentEnabled)continue;const b=this.variationConfiguration.getVariation({visitorCode:a,visitorIdentifier:e,targetingData:d,featureFlag:f,clientConfiguration:this.clientConfiguration,dataManager:this.dataManager,packageInfo:this.externalPackageInfo}).throw();this.eventManager.fireEvent(_eventManager.EventType.Evaluation,{featureKey:f.featureKey,variation:{key:b.variationKey,experimentId:b.experimentId,id:b.variationId}}),b.variationKey!==_constants.OFF_VARIATION_KEY&&c.push(b)}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a}) -> (activeVariations: ${c})`,c}_getFeatureVariation(a){let{visitorCode:b,featureKey:c,track:d}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,!this.initialized)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c));if(!f.environmentEnabled)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled,f.featureKey,this.environment));let g,h=!1,i=!1;const j=this.variationConfiguration.getForcedFeatureVariation(b,c);if(j.ok){const a=j.data;if(a){var k,l;_logging.KameleoonLogger.debug`Forced variation for visitor ${b} and feature ${c} is found: ${a}`,h=!0,i=!0;let d=f.defaultVariationKey;a.varByExp?d=a.varByExp.variationKey:a.rule&&a.rule.type===_clientConfiguration.RuleType.EXPERIMENTATION&&(d=_constants.OFF_VARIATION_KEY),g={variationKey:d,variationId:(null===(k=a.varByExp)||void 0===k?void 0:k.variationId)||null,experimentId:(null===(l=a.rule)||void 0===l?void 0:l.experimentId)||null,rule:a.rule||null}}}if(!g){const a=this.dataManager.getVisitorData(b),c=this.dataManager.getVisitorIdentifier(b);g=this.variationConfiguration.getVariation({visitorCode:b,visitorIdentifier:c,featureFlag:f,track:d,withAssignment:!0,targetingData:a,clientConfiguration:this.clientConfiguration,dataManager:this.dataManager,packageInfo:this.externalPackageInfo}).throw()}h||(i&&null!==g.experimentId&&null!==g.variationId&&this.variationConfiguration.updateStoredVariations(b,{[g.experimentId]:{variationId:g.variationId,isTargetedRule:g.rule.type===_clientConfiguration.RuleType.TARGETED_DELIVERY,status:d?_types.TrackingStatus.Unsent:_types.TrackingStatus.Sent}}),this.eventManager.fireEvent(_eventManager.EventType.Evaluation,{featureKey:c,variation:{key:g.variationKey,experimentId:g.experimentId,id:g.variationId}}));const{experimentId:m,variationId:n,variationKey:o}=g;let p=new Map,q=!1;try{const a=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:o});a.forEach(a=>{q||a.type!==_types.VariableType.JS&&a.type!==_types.VariableType.CSS||(q=!0);const b=_utilities.Parser.parseFeatureVariable(a).throw();p.set(a.key,b)})}catch(_){}m&&"number"==typeof n&&!h&&_utilities.Utilities.updateCache({cacheManager:this.trackingCache,hasJsCssVariables:q,visitorCode:b,experimentId:m,variationId:n}),d&&!h&&this.tracker.scheduleVisitor(b,this._isConsentProvided(b));return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${g})`,(0,_tsRes.Ok)({key:o,id:n,experimentId:m,variables:p})}_setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,null===d){const a=this.variationConfiguration.updateForcedExperimentVariation(b,c,null);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${a})`,a}let f=null,g=null;if(f=this.clientConfiguration.experimentMap.get(c),!f)return _logging.KameleoonLogger.error`Experiment with id ${c} not found for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagExperimentNotFound,c,b));if(g=f.variations.get(d),void 0===g)return _logging.KameleoonLogger.error`Variation with key ${d} not found in experiment ${f} for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b));f={type:f.type,experimentId:c},g={variationKey:d,variationId:g};const h=this.variationConfiguration.updateForcedExperimentVariation(b,c,{rule:f,varByExp:g,forceTargeting:e});return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${h})`,h}}exports.KameleoonClient=KameleoonClient;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonClient=void 0;var _tsRes=require("ts-res"),_cacheManager=require("./cacheManager"),_clientConfiguration=require("./clientConfiguration"),_clientSettings=require("./clientSettings"),_constants=require("./constants"),_kameleoonData=require("./kameleoonData"),_kameleoonError=require("./kameleoonError"),_requester=require("./requester"),_storage=require("./storage"),_types=require("./types"),_utilities=require("./utilities"),_variationConfiguration=require("./variationConfiguration"),_eventSource=require("./eventSource"),_visitorCodeManager=require("./visitorCodeManager"),_eventManager=require("./eventManager"),_tracking=require("./tracking"),_logging=require("./logging");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class KameleoonClient{constructor(a){var b;let{siteCode:c,dependencies:d,configuration:e,internalConfiguration:f}=a;_defineProperty(this,"variationConfiguration",void 0),_defineProperty(this,"clientConfiguration",void 0),_defineProperty(this,"dataManager",void 0),_defineProperty(this,"consentDataStorage",void 0),_defineProperty(this,"trackingCache",void 0),_defineProperty(this,"requester",void 0),_defineProperty(this,"externalPackageInfo",void 0),_defineProperty(this,"initialized",!1),_defineProperty(this,"visitorCodeManager",void 0),_defineProperty(this,"eventManager",void 0),_defineProperty(this,"tracker",void 0),_defineProperty(this,"environment",void 0);const g=null===f||void 0===f?void 0:f.externals.externalLogger;g&&_logging.KameleoonLogger.setLogger(g),_logging.KameleoonLogger.debug`CALL: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`;const{settings:h}=new _clientSettings.ClientSettings(c,e);this.environment=h.environment;const{externalStorage:i,externalEventSource:j,externalPackageInfo:k,externalVisitorCodeManager:l,externalRequester:m,externalPRNG:n}=f.externals,{useAbortController:o}=f.settings,p=new _cacheManager.CacheManager(_constants.CACHE_CLEANUP_TIMEOUT),q=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ClientData),r=new _storage.DataStorage(i,_storage.KameleoonStorageKey.TargetingData),s=new _storage.DataStorage(i,_storage.KameleoonStorageKey.DataInfo),t=new _storage.DataStorage(i,_storage.KameleoonStorageKey.VariationData),u=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ForcedExperimentVariation),v=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ForcedFeatureVariation),w=new _storage.DataStorage(i,_storage.KameleoonStorageKey.ConsentData),x=new _storage.DataStorage(i,_storage.KameleoonStorageKey.TrackingData),y=new _kameleoonData.DataManager({dataStorage:r,infoStorage:s,cleanupInterval:h.cleanupInterval}),z=null!==(b=null===d||void 0===d?void 0:d.urlProvider)&&void 0!==b?b:new _requester.UrlProvider;z.initialize({domain:h.networkDomain,siteCode:h.siteCode,packageInfo:k,environment:h.environment});const A=new _requester.Requester({urlProvider:z,useAbortController:o,packageInfo:k,externalRequester:m,requestTimeout:h.requestTimeout,trackRetryDelay:h.trackRetryDelay}),B=new _eventSource.KameleoonEventSource({siteCode:h.siteCode,externalEventSource:j,urlProvider:z}),C=new _eventManager.EventManager,D=new _clientConfiguration.ClientConfiguration({urlProvider:z,storage:q,updateInterval:h.updateInterval,dataManager:y,eventManager:C,requester:A,eventSource:B,externalVisitorCodeManager:l}),E=new _variationConfiguration.VariationConfiguration(t,u,v,l,D),F=new _tracking.Tracker({dataManager:y,trackingStorage:x,variationConfiguration:E,requester:A,trackingInterval:h.trackingInterval,prng:n});this.tracker=F,this.variationConfiguration=E,this.requester=A,this.trackingCache=p,this.dataManager=y,this.clientConfiguration=D,this.externalPackageInfo=k,this.consentDataStorage=w,this.visitorCodeManager=l,this.eventManager=C,null!==h.cleanupInterval&&new _storage.StorageCleanupManager(i,h.cleanupInterval),_logging.KameleoonLogger.debug`RETURN: new KameleoonClient(siteCode: ${c}, dependencies: ${d}, configuration: ${e})`}async initialize(){_logging.KameleoonLogger.info("CALL: KameleoonClient.initialize()");const a=await this.clientConfiguration.initialize();return a.throw(),this.initialized=!0,_logging.KameleoonLogger.info`RETURN: KameleoonClient.initialize() -> (result: ${a.ok})`,a.ok}addData(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];if(_logging.KameleoonLogger.info`CALL: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`,this.visitorCodeManager.validateVisitorCode(a).throw(),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.dataManager.storeData(a,...c).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.addData(visitorCode: ${a}, data: ${c})`}async getRemoteVisitorData(a){let{visitorCode:b,shouldAddData:c=!0,filters:d=_constants.DEFAULT_VISITOR_DATA_FILTERS}=a;if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(b).throw();const{previousVisitAmount:e}=d;if("number"==typeof e&&(1>e||25<e))throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitAmount);const f=this.dataManager.isUniqueIdentifier(b),g=await this.requester.getVisitorData({visitorCode:b,filters:d,isMappingIdentifier:f}),h=g.throw(),{visitorData:i,storageVisitorData:j,visitsData:k}=_utilities.Parser.parseVisitorData({data:h,filters:d,visitorCode:b,dataManager:this.dataManager,variationConfiguration:this.variationConfiguration});for(const d of j)(c||this.dataManager.isPersistentCustomData(d))&&this.addData(b,d);return k&&c&&this.addData(b,k),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteVisitorData(visitorCode: ${b}, shouldAddData: ${c}, filters: ${d}) -> (visitorData: ${i})`,i}trackConversion(a){let{visitorCode:b,goalId:c,revenue:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, revenue: ${d})`,this.addData(b,new _kameleoonData.Conversion({goalId:c,revenue:d})),this.flush(b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.trackConversion(visitorCode: ${b}, goalId: ${c}, revenue: ${d})`}flush(a){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.flush(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);if("string"==typeof a)return this.visitorCodeManager.validateVisitorCode(a).throw(),this.tracker.scheduleVisitor(a,this._isConsentProvided(a)),void _logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`;for(const b of this.dataManager.unsentDataVisitors)this.tracker.scheduleVisitor(b,this._isConsentProvided(b));_logging.KameleoonLogger.info`RETURN: KameleoonClient.flush(visitorCode: ${a})`}getFeatureFlags(){if(_logging.KameleoonLogger.info("CALL: KameleoonClient.getFeatureFlags()"),!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);const a=this.clientConfiguration.featureFlags,b=[];return a.forEach(a=>{let{id:c,featureKey:d}=a;b.push({id:c,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlags() -> (FeatureFlags: ${b})`,b}getVisitorFeatureFlags(a){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=[];return b.forEach(a=>{let{featureFlagId:b,featureKey:d}=a;c.push({id:b,key:d})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getVariation(a){let{visitorCode:b,featureKey:c,track:d=!0}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=this._getFeatureVariation({visitorCode:b,featureKey:c,track:d}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${e})`,e}getVariations(a){let{visitorCode:b,onlyActive:c=!1,track:d=!0}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=new Map,f=this.clientConfiguration.featureFlags;for(const g of f.values()){const a=this._getFeatureVariation({visitorCode:b,featureKey:g.featureKey,track:d});a.ok&&(!c||a.data.key!==_constants.OFF_VARIATION_KEY)&&e.set(g.featureKey,a.data)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVariations(visitorCode: ${b}, onlyActive: ${c}, track: ${d}) -> (variations: ${e})`,e}getActiveFeatureFlags(a){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a})`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.visitorCodeManager.validateVisitorCode(a).throw();const b=this._getActiveFeatureVariations(a),c=new Map;return b.forEach(b=>{const{variationKey:d,featureKey:e,variationId:f,experimentId:g}=b;let h=[];null!==f&&null!==g&&(h=this._getFeatureVariables({visitorCode:a,featureKey:e,variationKey:d}));const i=h.map(a=>_utilities.Parser.parseFeatureVariable(a).throw());c.set(b.featureKey,{key:d,id:f,experimentId:g,variables:i})}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getActiveFeatureFlags(visitorCode: ${a}) -> (FeatureFlags: ${c})`,c}getFeatureFlagVariationKey(a,b){_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw();return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariationKey(visitorCode: ${a}, featureKey: ${b}) -> (variationKey: ${c})`,c}getFeatureFlagVariable(a){let{visitorCode:b,featureKey:c,variableKey:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const{key:e}=this._getFeatureVariation({visitorCode:b,featureKey:c,track:!0}).throw(),f=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:e}),g=f.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariableNotFound,d,b);const{type:h,value:i}=_utilities.Parser.parseFeatureVariable(g).throw(),j={type:h,value:i};return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariable(visitorCode: ${b}, featureKey: ${c}, variableKey: ${d}) -> (FeatureFlagVariable: ${j})`,j}getFeatureFlagVariables(a,b){_logging.KameleoonLogger.info`CALL: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b})`,this.visitorCodeManager.validateVisitorCode(a).throw();const{key:c}=this._getFeatureVariation({visitorCode:a,featureKey:b,track:!0}).throw(),d=this._getFeatureVariables({visitorCode:a,featureKey:b,variationKey:c}),e=[];for(const c of d){const a=_utilities.Parser.parseFeatureVariable(c).throw();e.push(a)}return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getFeatureFlagVariables(visitorCode: ${a}, featureKey: ${b}) -> (FeatureFlagVariables: ${e})`,e}isFeatureFlagActive(a,b){let[c,d,e]=["","",!0];"string"==typeof a?(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d})`,c=a,d=b):(_logging.KameleoonLogger.info`CALL: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track ${e})`,[c,d]=[a.visitorCode,a.featureKey],a.track!==void 0&&(e=a.track)),this.visitorCodeManager.validateVisitorCode(c).throw();try{const{key:a}=this._getFeatureVariation({visitorCode:c,featureKey:d,track:e}).throw(),b=a!==_constants.OFF_VARIATION_KEY;return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: ${b})`,b}catch(a){if(a instanceof _kameleoonError.KameleoonError&&a.type===_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.isFeatureFlagActive(visitorCode: ${c}, featureKey: ${d}, track: ${e}) -> (isActive: false)`,!1;throw a}}async getRemoteData(a){_logging.KameleoonLogger.info`CALL: KameleoonClient.getRemoteData(key: ${a})`;const b=await this.requester.getRemoteData(a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getRemoteData(key: ${a}) -> (remoteData: ${b})`,b.throw()}async getVisitorWarehouseAudience(a){let{visitorCode:b,customDataIndex:c,warehouseKey:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw();const e=await this.getRemoteData(d||b);if(!e)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,`No data found for ${d||b} key`);if(!e[_constants.WAREHOUSE_AUDIENCE_KEY]||0===Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]).length)return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: null)`,null;const f=new _kameleoonData.CustomData(c,...Object.keys(e[_constants.WAREHOUSE_AUDIENCE_KEY]));return this.dataManager.storeData(b,f),_logging.KameleoonLogger.info`RETURN: KameleoonClient.getVisitorWarehouseAudience(visitorCode: ${b}, customDataIndex: ${c}, warehouseKey: ${d}) -> (customData: ${f})`,f}onEvent(a,b){if(_logging.KameleoonLogger.info`CALL: KameleoonClient.onEvent(event: ${a}, callback)`,!this.initialized)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization);this.eventManager.addEventHandler(a,b),_logging.KameleoonLogger.info`RETURN: KameleoonClient.onEvent(event: ${a}, callback)`}getEngineTrackingCode(a){_logging.KameleoonLogger.info`CALL: KameleoonClient.getEngineTrackingCode(visitorCode: ${a})`,this.visitorCodeManager.validateVisitorCode(a).throw();const b=_utilities.Utilities.getTrackingCode(this.trackingCache,a);return _logging.KameleoonLogger.info`RETURN: KameleoonClient.getEngineTrackingCode(visitorCode: ${a}) -> (trackingCode: ${b})`,b}isInitialized(){return _logging.KameleoonLogger.debug`CALL/RETURN: KameleoonClient.isInitialized() -> (initialized: ${this.initialized})`,this.initialized}setLogLevel(a){_logging.KameleoonLogger.setLogLevel(a)}setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this._setForcedVariation({visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e}).throw(),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`}setUserConsent(a){let{visitorCode:b,consent:c,setData:d}=a;_logging.KameleoonLogger.info`CALL: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`,this.visitorCodeManager.validateVisitorCode(b).throw(),this.updateConsentData(b,c),c?d({visitorCode:b,key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.DEFAULT_MAX_AGE,path:_visitorCodeManager.PATH}):this.visitorCodeManager.consentRequired&&d({visitorCode:"",key:_storage.KameleoonStorageKey.VisitorCode,maxAge:_visitorCodeManager.ZERO_MAX_AGE,path:_visitorCodeManager.PATH}),_logging.KameleoonLogger.info`RETURN: KameleoonClient.setUserConsent(visitorCode: ${b}, consent: ${c}, setData: ${d})`}updateConsentData(a,b){const c=this.consentDataStorage.read();if(!c.ok)return void(c.error.type===_kameleoonError.KameleoonException.StorageEmpty&&this.consentDataStorage.write({[a]:{consent:b}}));const d=c.data;d[a]={consent:b},this.consentDataStorage.write(d)}_isConsentProvided(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._isConsentProvided(visitorCode: ${a})`;const{isConsentRequired:b}=this.clientConfiguration,c=this.consentDataStorage.read();let d=!1;if(!b)d=!0;else if(c.ok){const b=c.data[a];d="boolean"==typeof b?b:b&&b.consent}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._isConsentProvided(visitorCode: ${a}) -> (isConsentProvided: ${d})`,d}_getFeatureVariables(a){let{visitorCode:b,featureKey:c,variationKey:d}=a;_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d})`;const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c);const g=f.variations.find(a=>a.key===d);if(!g)throw new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariables(visitorCode: ${b}, featureKey: ${c}, variationKey: ${d}) -> (variables: ${g.variables})`,g.variables}_getActiveFeatureVariations(a){_logging.KameleoonLogger.debug`CALL: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a})`;const b=this.clientConfiguration.featureFlags,c=[],d=this.dataManager.getVisitorData(a),e=this.dataManager.getVisitorIdentifier(a);for(const f of b.values()){if(!f.environmentEnabled)continue;const b=this.variationConfiguration.getVariation({visitorCode:a,visitorIdentifier:e,targetingData:d,featureFlag:f,clientConfiguration:this.clientConfiguration,dataManager:this.dataManager,packageInfo:this.externalPackageInfo}).throw();this.eventManager.fireEvent(_eventManager.EventType.Evaluation,{featureKey:f.featureKey,variation:{key:b.variationKey,experimentId:b.experimentId,id:b.variationId}}),b.variationKey!==_constants.OFF_VARIATION_KEY&&c.push(b)}return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getActiveFeatureVariations(visitorCode: ${a}) -> (activeVariations: ${c})`,c}_getFeatureVariation(a){let{visitorCode:b,featureKey:c,track:d}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d})`,!this.initialized)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));const e=this.clientConfiguration.featureFlags,f=e.get(c);if(!f)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagConfigurationNotFound,c));if(!f.environmentEnabled)return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagEnvironmentDisabled,f.featureKey,this.environment));let g,h=!1,i=!1;const j=this.variationConfiguration.getForcedFeatureVariation(b,c);if(j.ok){const a=j.data;if(a){var k,l;_logging.KameleoonLogger.debug`Forced variation for visitor ${b} and feature ${c} is found: ${a}`,h=!0,i=!0;let d=f.defaultVariationKey;a.varByExp?d=a.varByExp.variationKey:a.rule&&a.rule.type===_clientConfiguration.RuleType.EXPERIMENTATION&&(d=_constants.OFF_VARIATION_KEY),g={variationKey:d,variationId:(null===(k=a.varByExp)||void 0===k?void 0:k.variationId)||null,experimentId:(null===(l=a.rule)||void 0===l?void 0:l.experimentId)||null,rule:a.rule||null}}}if(!g){const a=this.dataManager.getVisitorData(b),c=this.dataManager.getVisitorIdentifier(b);g=this.variationConfiguration.getVariation({visitorCode:b,visitorIdentifier:c,featureFlag:f,track:d,withAssignment:!0,targetingData:a,clientConfiguration:this.clientConfiguration,dataManager:this.dataManager,packageInfo:this.externalPackageInfo}).throw()}h||(i&&null!==g.experimentId&&null!==g.variationId&&this.variationConfiguration.updateStoredVariations(b,{[g.experimentId]:{variationId:g.variationId,isTargetedRule:g.rule.type===_clientConfiguration.RuleType.TARGETED_DELIVERY,status:d?_types.TrackingStatus.Unsent:_types.TrackingStatus.Sent}}),this.eventManager.fireEvent(_eventManager.EventType.Evaluation,{featureKey:c,variation:{key:g.variationKey,experimentId:g.experimentId,id:g.variationId}}));const{experimentId:m,variationId:n,variationKey:o}=g;let p=new Map,q=!1;try{const a=this._getFeatureVariables({visitorCode:b,featureKey:c,variationKey:o});a.forEach(a=>{q||a.type!==_types.VariableType.JS&&a.type!==_types.VariableType.CSS||(q=!0);const b=_utilities.Parser.parseFeatureVariable(a).throw();p.set(a.key,b)})}catch(_){}m&&"number"==typeof n&&!h&&_utilities.Utilities.updateCache({cacheManager:this.trackingCache,hasJsCssVariables:q,visitorCode:b,experimentId:m,variationId:n}),d&&!h&&this.tracker.scheduleVisitor(b,this._isConsentProvided(b));return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._getFeatureVariation(visitorCode: ${b}, featureKey: ${c}, track: ${d}) -> (variation: ${g})`,(0,_tsRes.Ok)({key:o,id:n,experimentId:m,variables:p})}_setForcedVariation(a){let{visitorCode:b,experimentId:c,variationKey:d,forceTargeting:e=!0}=a;if(_logging.KameleoonLogger.debug`CALL: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e})`,null===d){const a=this.variationConfiguration.updateForcedExperimentVariation(b,c,null);return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${a})`,a}let f=null,g=null;if(f=this.clientConfiguration.experimentMap.get(c),!f)return _logging.KameleoonLogger.error`Experiment with id ${c} not found for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagExperimentNotFound,c,b));if(g=f.variations.get(d),void 0===g)return _logging.KameleoonLogger.error`Variation with key ${d} not found in experiment ${f} for visitor ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.FeatureFlagVariationNotFound,d,b));f={type:f.type,experimentId:c},g={variationKey:d,variationId:g};const h=this.variationConfiguration.updateForcedExperimentVariation(b,c,{rule:f,varByExp:g,forceTargeting:e});return _logging.KameleoonLogger.debug`RETURN: KameleoonClient._setForcedVariation(visitorCode: '${b}', experimentId: ${c}, variationKey: '${d}', forceTargeting: ${e}) -> (writeResult: ${h})`,h}}exports.KameleoonClient=KameleoonClient;
@@ -9,6 +9,6 @@ export declare class KameleoonLogger {
9
9
  static error(strings: LogInputType, ...keys: unknown[]): void;
10
10
  static warning(strings: LogInputType, ...keys: unknown[]): void;
11
11
  static debug(strings: LogInputType, ...keys: unknown[]): void;
12
- private static checkLevel;
12
+ static checkLevel(level: LogLevel): boolean;
13
13
  private static writeMessage;
14
14
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonLogger=void 0;var _types=require("./types"),_defaultLogger=require("./defaultLogger");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}const replacer=(a,b)=>"credentials"===a?{clientId:`****`,clientSecret:`****`}:b instanceof Map?Array.from(b.entries()):b;function template(a,b){let c="";if(b)for(let d,e=0;e<b.length;e++)if(d=b[e],"object"==typeof d)try{c+=a[e]+JSON.stringify(d,replacer)}catch(b){c+=a[e]+"{object}"}else c+="string"==typeof d?a[e]+"'"+d+"'":a[e]+d;return c+=a[a.length-1],c}class KameleoonLogger{static setLogger(a){KameleoonLogger.logger=a}static setLogLevel(a){KameleoonLogger.logLevel=a}static log(a){let{level:b,strings:c,keys:d}=a;if(!KameleoonLogger.checkLevel(b))return;let e;e="string"==typeof c?c:"function"==typeof c?c():template(c,d),KameleoonLogger.writeMessage(b,e)}static info(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.INFO,strings:a,keys:c})}static error(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.ERROR,strings:a,keys:c})}static warning(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.WARNING,strings:a,keys:c})}static debug(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.DEBUG,strings:a,keys:c})}static checkLevel(a){return a<=KameleoonLogger.logLevel&&a!==_types.LogLevel.NONE}static writeMessage(a,b){KameleoonLogger.logger.log(a,`Kameleoon [${_types.LOG_LEVEL_NAMES[a]}]: ${b}`)}}exports.KameleoonLogger=KameleoonLogger,_defineProperty(KameleoonLogger,"logger",new _defaultLogger.DefaultLogger),_defineProperty(KameleoonLogger,"logLevel",_types.LogLevel.WARNING);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.KameleoonLogger=void 0;var _types=require("./types"),_defaultLogger=require("./defaultLogger");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}const replacer=(a,b)=>"credentials"===a?{clientId:`****`,clientSecret:`****`}:b instanceof Map?Array.from(b.entries()):b;function template(a,b){let c="";if(b)for(let d,e=0;e<b.length;e++)if(d=b[e],"object"==typeof d)try{c+=a[e]+JSON.stringify(d,replacer)}catch(b){c+=a[e]+"{object}"}else c+="string"==typeof d?a[e]+"'"+d+"'":a[e]+d;return c+=a[a.length-1],c}class KameleoonLogger{static setLogger(a){KameleoonLogger.logger=a}static setLogLevel(a){KameleoonLogger.logLevel=a}static log(a){let{level:b,strings:c,keys:d}=a;if(!KameleoonLogger.checkLevel(b))return;let e;if("string"==typeof c)e=c;else if("function"==typeof c)try{e=c()}catch(a){e="Failed to log message"}else e=template(c,d);KameleoonLogger.writeMessage(b,e)}static info(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.INFO,strings:a,keys:c})}static error(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.ERROR,strings:a,keys:c})}static warning(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.WARNING,strings:a,keys:c})}static debug(a){for(var b=arguments.length,c=Array(1<b?b-1:0),d=1;d<b;d++)c[d-1]=arguments[d];KameleoonLogger.log({level:_types.LogLevel.DEBUG,strings:a,keys:c})}static checkLevel(a){return a<=KameleoonLogger.logLevel&&a!==_types.LogLevel.NONE}static writeMessage(a,b){KameleoonLogger.logger.log(a,`Kameleoon [${_types.LOG_LEVEL_NAMES[a]}]: ${b}`)}}exports.KameleoonLogger=KameleoonLogger,_defineProperty(KameleoonLogger,"logger",new _defaultLogger.DefaultLogger),_defineProperty(KameleoonLogger,"logLevel",_types.LogLevel.WARNING);
@@ -20,4 +20,6 @@ export declare class Requester implements IRequester {
20
20
  getVisitorData({ visitorCode, filters, isMappingIdentifier, }: GetVisitorDataParamsType): Promise<Result<GetVisitorDataResultType, KameleoonError>>;
21
21
  track(body: string, isBodyUserAgent: boolean): Promise<Result<void, void>>;
22
22
  private sendRequest;
23
+ private logRequestError;
24
+ private parseResponse;
23
25
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Requester=void 0;var _tsRes=require("ts-res"),_kameleoonError=require("../kameleoonError"),_constants=require("./constants"),_types=require("./types"),_logging=require("../logging");function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class Requester{constructor(a){let{urlProvider:b,packageInfo:c,externalRequester:d,requestTimeout:e,trackRetryDelay:f,useAbortController:g}=a;_defineProperty(this,"externalRequester",void 0),_defineProperty(this,"urlProvider",void 0),_defineProperty(this,"packageInfo",void 0),_defineProperty(this,"trackRetryDelay",void 0),_defineProperty(this,"useAbortController",void 0),_defineProperty(this,"timeout",void 0),_logging.KameleoonLogger.debug`CALL: new Requester(urlProvider, packageInfo: ${c}, externalRequester, requestTimeout: ${e}, trackRetryDelay: ${f}, useAbortController: ${g})`,this.urlProvider=b,this.useAbortController=g,this.externalRequester=d,this.trackRetryDelay=f,this.packageInfo=c,this.timeout=e,_logging.KameleoonLogger.debug`RETuRN: new Requester(urlProvider, packageInfo: ${c}, externalRequester, requestTimeout: ${e}, trackRetryDelay: ${f}, useAbortController: ${g})`}async getClientConfiguration(a){const b=this.urlProvider.getClientConfigurationUrl(a),c={[_constants.Header.SdkType]:this.packageInfo.type.toLowerCase(),[_constants.Header.SdkVersion]:this.packageInfo.version},d=_constants.NUMBER_OF_RETRIES+1;try{let a={message:""};_logging.KameleoonLogger.debug`Running configuration request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}, with retry limit ${d}, retry delay ${this.trackRetryDelay} ms`;for(let e=0;e<d;e++){const d=await this.sendRequest({url:b,requestType:_types.RequestType.Configuration,retryCount:e,parameters:{method:_types.HttpMethod.Get,headers:c}});if(d.ok){const a=await d.json();return _logging.KameleoonLogger.debug`Received configuration response: ${d} for request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}`,(0,_tsRes.Ok)(a)}if(e===_constants.NUMBER_OF_RETRIES){if(d.text){const b=await d.text();a=JSON.parse(b)}_logging.KameleoonLogger.warning`Failed to get configuration response: ${d} for request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}`}else _logging.KameleoonLogger.error`Failed to get configuration response: ${d} for request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}`}return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.MaximumRetriesReached,a.message))}catch(a){return _logging.KameleoonLogger.error`Failed to get configuration response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.ClientConfiguration,a))}}async getRemoteData(a){const b=this.urlProvider.getRemoteDataUrl(a);_logging.KameleoonLogger.debug`Running remote data request Method: ${_types.HttpMethod.Get}, Url: ${b}`;try{const a=await this.sendRequest({url:b,requestType:_types.RequestType.RemoteData,retryCount:0,parameters:{method:_types.HttpMethod.Get}});if(!a.ok){if(_logging.KameleoonLogger.error`Failed to get remote data response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${b}`,a.text){var c;const b=await a.text(),d=null===(c=JSON.parse(b))||void 0===c?void 0:c.message;return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,d))}return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,"Unknown Reason - no `text()` was found for a response"))}const d=await a.json();return _logging.KameleoonLogger.debug`Received remote data response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${b}`,(0,_tsRes.Ok)(d)}catch(a){return _logging.KameleoonLogger.error`Failed to get remote data response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${b}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,a))}}async getVisitorData(a){let{visitorCode:b,filters:c,isMappingIdentifier:d}=a;const e=this.urlProvider.getVisitorDataUrl({visitorCode:b,filters:c,isMappingIdentifier:d});_logging.KameleoonLogger.debug`Running visitor data request Method: ${_types.HttpMethod.Get}, Url: ${e}`;try{const a=await this.sendRequest({url:e,requestType:_types.RequestType.RemoteData,retryCount:0,parameters:{method:_types.HttpMethod.Get}});if(!a.ok){if(_logging.KameleoonLogger.error`Failed to get visitor data response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${e}`,"function"==typeof a.text){const b=await a.text();if(b){var f;const a=null===(f=JSON.parse(b))||void 0===f?void 0:f.message;return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,a))}}return a.status?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,`No error message. Error status: ${a.status}`)):(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,"Unknown Reason - no text message or error status was found for a response"))}const b=await a.json();return _logging.KameleoonLogger.debug`Received visitor data response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${e}`,(0,_tsRes.Ok)(b)}catch(a){return _logging.KameleoonLogger.error`Failed to get visitor data response: ${a} for request Method: ${_types.HttpMethod.Get}, Url: ${e}`,(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,a))}}async track(a,b){const c=_constants.NUMBER_OF_RETRIES+1,d=this.urlProvider.getTrackingUrl(b);_logging.KameleoonLogger.debug`Running tracking request Method: ${_types.HttpMethod.Post}, Url: ${d}, Body: ${a}, with retry limit ${c}, retry delay ${this.trackRetryDelay} ms`;for(let e=0;e<c;e++){const b=await this.sendRequest({url:d,retryCount:e,requestType:_types.RequestType.Tracking,parameters:{body:a,method:_types.HttpMethod.Post}});if(b.ok)return _logging.KameleoonLogger.debug`Received tracking response: ${b} for request Method: ${_types.HttpMethod.Post}, Url: ${d}, Body: ${a}`,(0,_tsRes.Ok)();_logging.KameleoonLogger.warning`Failed to get tracking response: ${b} for request Method: ${_types.HttpMethod.Post}, Url: ${d}`,await new Promise(a=>setTimeout(a,this.trackRetryDelay))}return _logging.KameleoonLogger.error`Failed to get tracking response for request Method: ${_types.HttpMethod.Post}, Url: ${d}`,(0,_tsRes.Err)()}async sendRequest(a){let b,{url:c,requestType:d,retryCount:e,parameters:f}=a;if(this.useAbortController){const a=new AbortController,g=setTimeout(()=>a.abort(),this.timeout);b=await this.externalRequester.sendRequest({url:c,retryCount:e,requestType:d,parameters:_objectSpread(_objectSpread({},f),{},{signal:a.signal})}),clearTimeout(g)}else b=await this.externalRequester.sendRequest({url:c,retryCount:e,requestType:d,parameters:f});return b}}exports.Requester=Requester;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Requester=void 0;var _tsRes=require("ts-res"),_kameleoonError=require("../kameleoonError"),_constants=require("./constants"),_types=require("./types"),_logging=require("../logging");function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class Requester{constructor(a){let{urlProvider:b,packageInfo:c,externalRequester:d,requestTimeout:e,trackRetryDelay:f,useAbortController:g}=a;_defineProperty(this,"externalRequester",void 0),_defineProperty(this,"urlProvider",void 0),_defineProperty(this,"packageInfo",void 0),_defineProperty(this,"trackRetryDelay",void 0),_defineProperty(this,"useAbortController",void 0),_defineProperty(this,"timeout",void 0),_logging.KameleoonLogger.debug`CALL: new Requester(urlProvider, packageInfo: ${c}, externalRequester, requestTimeout: ${e}, trackRetryDelay: ${f}, useAbortController: ${g})`,this.urlProvider=b,this.useAbortController=g,this.externalRequester=d,this.trackRetryDelay=f,this.packageInfo=c,this.timeout=e,_logging.KameleoonLogger.debug`RETURN: new Requester(urlProvider, packageInfo: ${c}, externalRequester, requestTimeout: ${e}, trackRetryDelay: ${f}, useAbortController: ${g})`}async getClientConfiguration(a){const b=this.urlProvider.getClientConfigurationUrl(a),c={[_constants.Header.SdkType]:this.packageInfo.type.toLowerCase(),[_constants.Header.SdkVersion]:this.packageInfo.version},d=_constants.NUMBER_OF_RETRIES+1;try{let a={message:""};_logging.KameleoonLogger.debug`Running configuration request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}, with retry limit ${d}, retry delay ${this.trackRetryDelay} ms`;for(let e=0;e<d;e++){const d=await this.sendRequest({url:b,requestType:_types.RequestType.Configuration,retryCount:e,parameters:{method:_types.HttpMethod.Get,headers:c}});if(d.ok){const a=await d.json();return _logging.KameleoonLogger.debug`Received configuration response: ${{status:d.status}} for request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}`,(0,_tsRes.Ok)(a)}if(e===_constants.NUMBER_OF_RETRIES){if(d.text){const b=await d.text();a=JSON.parse(b)}_logging.KameleoonLogger.error`Failed to get configuration response ${{status:d.status,message:a.message}} for request Method: ${_types.HttpMethod.Get}, Url: ${b}, Headers: ${c}`}else await this.logRequestError({logLevel:_logging.LogLevel.WARNING,message:"Failed to get configuration response",response:d,method:_types.HttpMethod.Get,url:b})}return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.MaximumRetriesReached,a.message))}catch(a){return await this.logRequestError({logLevel:_logging.LogLevel.ERROR,message:"Failed to get configuration response",error:a,method:_types.HttpMethod.Get,url:b,headers:c}),(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.ClientConfiguration,a))}}async getRemoteData(a){const b=this.urlProvider.getRemoteDataUrl(a);_logging.KameleoonLogger.debug`Running remote data request Method: ${_types.HttpMethod.Get}, Url: ${b}`;try{const a=await this.sendRequest({url:b,requestType:_types.RequestType.RemoteData,retryCount:0,parameters:{method:_types.HttpMethod.Get}});if(!a.ok){if(await this.logRequestError({logLevel:_logging.LogLevel.ERROR,message:"Failed to get remote data response",response:a,method:_types.HttpMethod.Get,url:b}),a.text){var c;const b=await a.text(),d=null===(c=JSON.parse(b))||void 0===c?void 0:c.message;return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,d))}return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,"Unknown Reason - no `text()` was found for a response"))}const d=await a.json();return _logging.KameleoonLogger.debug`Received remote data response: ${{status:a.status}} for request Method: ${_types.HttpMethod.Get}, Url: ${b}`,(0,_tsRes.Ok)(d)}catch(a){return await this.logRequestError({logLevel:_logging.LogLevel.ERROR,message:"Failed to get remote data response",error:a,method:_types.HttpMethod.Get,url:b}),(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,a))}}async getVisitorData(a){let{visitorCode:b,filters:c,isMappingIdentifier:d}=a;const e=this.urlProvider.getVisitorDataUrl({visitorCode:b,filters:c,isMappingIdentifier:d});_logging.KameleoonLogger.debug`Running visitor data request Method: ${_types.HttpMethod.Get}, Url: ${e}`;try{const a=await this.sendRequest({url:e,requestType:_types.RequestType.RemoteData,retryCount:0,parameters:{method:_types.HttpMethod.Get}});if(!a.ok){if(await this.logRequestError({logLevel:_logging.LogLevel.ERROR,message:"Failed to get visitor data response",response:a,method:_types.HttpMethod.Get,url:e}),"function"==typeof a.text){const b=await a.text();if(b){var f;const a=null===(f=JSON.parse(b))||void 0===f?void 0:f.message;return(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,a))}}return a.status?(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,`No error message. Error status: ${a.status}`)):(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,"Unknown Reason - no text message or error status was found for a response"))}const b=await a.json();return _logging.KameleoonLogger.debug`Received visitor data response: ${{status:a.status}} for request Method: ${_types.HttpMethod.Get}, Url: ${e}`,(0,_tsRes.Ok)(b)}catch(a){return await this.logRequestError({logLevel:_logging.LogLevel.ERROR,message:"Failed to get visitor data response",error:a,method:_types.HttpMethod.Get,url:e}),(0,_tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.RemoteData,a))}}async track(a,b){const c=_constants.NUMBER_OF_RETRIES+1,d=this.urlProvider.getTrackingUrl(b);_logging.KameleoonLogger.debug`Running tracking request Method: ${_types.HttpMethod.Post}, Url: ${d}, Body: ${a}, with retry limit ${c}, retry delay ${this.trackRetryDelay} ms`;for(let e=0;e<c;e++){let b;try{if(b=await this.sendRequest({url:d,retryCount:e,requestType:_types.RequestType.Tracking,parameters:{body:a,method:_types.HttpMethod.Post}}),b.ok)return _logging.KameleoonLogger.debug`Received tracking response: ${{status:b.status}} for request Method: ${_types.HttpMethod.Post}, Url: ${d}, Body: ${a}`,(0,_tsRes.Ok)();await this.logRequestError({logLevel:_logging.LogLevel.WARNING,message:"Failed to get tracking response",response:b,method:_types.HttpMethod.Post,url:d})}catch(a){await this.logRequestError({logLevel:_logging.LogLevel.WARNING,message:"Failed to get tracking response",error:a,method:_types.HttpMethod.Post,url:d})}await new Promise(a=>setTimeout(a,this.trackRetryDelay))}return _logging.KameleoonLogger.error`Failed to get tracking response for request Method: ${_types.HttpMethod.Post}, Url: ${d}`,(0,_tsRes.Err)()}async sendRequest(a){let b,{url:c,requestType:d,retryCount:e,parameters:f}=a;if(this.useAbortController){const a=new AbortController,g=setTimeout(()=>a.abort(),this.timeout);b=await this.externalRequester.sendRequest({url:c,retryCount:e,requestType:d,parameters:_objectSpread(_objectSpread({},f),{},{signal:a.signal})}),clearTimeout(g)}else b=await this.externalRequester.sendRequest({url:c,retryCount:e,requestType:d,parameters:f});return b}async logRequestError(a){let{logLevel:b,message:c,error:d,method:e,url:f,response:g,headers:h}=a;if(d){let a="Unknown error";d instanceof Error&&(a=d.message),_logging.KameleoonLogger.error`${c} with error: ${a} for request Method: ${e}, Url: ${f}`}else if(g&&_logging.KameleoonLogger.checkLevel(b)){const a=await this.parseResponse(g);_logging.KameleoonLogger.log({level:b,strings:()=>`${c} response: Status: '${a.status}' Message: '${a.message}' for request Method: ${e}, Url: '${f}'`+(h?`, Headers: ${h}`:"")})}}async parseResponse(a){let b="";try{if("function"==typeof a.text){const d=await a.text();if(d){var c;b=null===(c=JSON.parse(d))||void 0===c?void 0:c.message}}}catch(a){}return{status:a.status,message:b}}}exports.Requester=Requester;
@@ -5,6 +5,7 @@ import { DeviceType, KCSType, OperatingSystemIndexMap } from '../kameleoonData/t
5
5
  import { Header } from './constants';
6
6
  import { VisitorDataFiltersType } from '../utilities';
7
7
  import { IUrlProvider } from './urlProvider';
8
+ import { LogLevel } from "../logging";
8
9
  export declare enum UrlType {
9
10
  DataApi = "dataApi",
10
11
  Events = "events",
@@ -249,4 +250,17 @@ export interface IExternalRequester {
249
250
  * */
250
251
  sendRequest: <T extends RequestType>({ requestType, url, parameters, }: SendRequestParametersType<T>) => Promise<KameleoonResponseType>;
251
252
  }
253
+ export type logRequestParametersType = {
254
+ logLevel: LogLevel;
255
+ message: string;
256
+ error?: unknown;
257
+ method: HttpMethod;
258
+ url: string;
259
+ response?: KameleoonResponseType;
260
+ headers?: HeadersType;
261
+ };
262
+ export type logResponse = {
263
+ status: number;
264
+ message: string;
265
+ };
252
266
  export {};
@@ -12,8 +12,8 @@ export declare enum KameleoonStorageKey {
12
12
  ConsentData = "kameleoonConsentData",
13
13
  DataInfo = "kameleoonDataInfo",
14
14
  KameleoonSimulationFFData = "kameleoonSimulationFFData",
15
- ForcedFeatureVariation = "forcedFeatureVariation",
16
- ForcedExperimentVariation = "forcedExperimentVariation"
15
+ ForcedFeatureVariation = "kameleoonForcedFeatureVariation",
16
+ ForcedExperimentVariation = "kameleoonForcedExperimentVariation"
17
17
  }
18
18
  export declare const DEFAULT_CLIENT_CONFIGURATION: ClientDataType;
19
19
  export declare const VISIT_DURATION: number;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VISIT_DURATION=exports.KameleoonStorageKey=exports.DEFAULT_CLIENT_CONFIGURATION=void 0;var _clientConfiguration=require("../clientConfiguration"),_types=require("../types");let KameleoonStorageKey=exports.KameleoonStorageKey=function(a){return a.ClientData="kameleoonClientData",a.TargetingData="kameleoonTargetingData",a.TrackingData="kameleoonTrackingData",a.VariationData="kameleoonVariationData",a.VisitorCode="kameleoonVisitorCode",a.ConsentData="kameleoonConsentData",a.DataInfo="kameleoonDataInfo",a.KameleoonSimulationFFData="kameleoonSimulationFFData",a.ForcedFeatureVariation="forcedFeatureVariation",a.ForcedExperimentVariation="forcedExperimentVariation",a}({});const DEFAULT_CLIENT_CONFIGURATION=exports.DEFAULT_CLIENT_CONFIGURATION={data:{customData:[],featureFlags:[],configuration:{realTimeUpdate:!1,consentType:_clientConfiguration.ConsentType.NotRequired,dataApiDomain:"data.kameleoon.io"}},lastUpdate:""},VISIT_DURATION=exports.VISIT_DURATION=29*_types.Milliseconds.Minute;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.VISIT_DURATION=exports.KameleoonStorageKey=exports.DEFAULT_CLIENT_CONFIGURATION=void 0;var _clientConfiguration=require("../clientConfiguration"),_types=require("../types");let KameleoonStorageKey=exports.KameleoonStorageKey=function(a){return a.ClientData="kameleoonClientData",a.TargetingData="kameleoonTargetingData",a.TrackingData="kameleoonTrackingData",a.VariationData="kameleoonVariationData",a.VisitorCode="kameleoonVisitorCode",a.ConsentData="kameleoonConsentData",a.DataInfo="kameleoonDataInfo",a.KameleoonSimulationFFData="kameleoonSimulationFFData",a.ForcedFeatureVariation="kameleoonForcedFeatureVariation",a.ForcedExperimentVariation="kameleoonForcedExperimentVariation",a}({});const DEFAULT_CLIENT_CONFIGURATION=exports.DEFAULT_CLIENT_CONFIGURATION={data:{customData:[],featureFlags:[],configuration:{realTimeUpdate:!1,consentType:_clientConfiguration.ConsentType.NotRequired,dataApiDomain:"data.kameleoon.io"}},lastUpdate:""},VISIT_DURATION=exports.VISIT_DURATION=29*_types.Milliseconds.Minute;
@@ -1,4 +1,5 @@
1
1
  export { KameleoonStorageKey, VISIT_DURATION } from './constants';
2
2
  export { DataStorage } from './storage';
3
3
  export { IntegrityChecker } from './integrityChecker';
4
+ export { StorageCleanupManager } from './storageCleanupManager';
4
5
  export { ClientDataType, TrackingDataType, VariationDataType, ConsentDataType, DataInfoType, StorageDataType, FeatureFlagVariationsType, IStorage, IExternalStorage, } from './types';
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"ClientDataType",{enumerable:!0,get:function(){return _types.ClientDataType}}),Object.defineProperty(exports,"ConsentDataType",{enumerable:!0,get:function(){return _types.ConsentDataType}}),Object.defineProperty(exports,"DataInfoType",{enumerable:!0,get:function(){return _types.DataInfoType}}),Object.defineProperty(exports,"DataStorage",{enumerable:!0,get:function(){return _storage.DataStorage}}),Object.defineProperty(exports,"FeatureFlagVariationsType",{enumerable:!0,get:function(){return _types.FeatureFlagVariationsType}}),Object.defineProperty(exports,"IExternalStorage",{enumerable:!0,get:function(){return _types.IExternalStorage}}),Object.defineProperty(exports,"IStorage",{enumerable:!0,get:function(){return _types.IStorage}}),Object.defineProperty(exports,"IntegrityChecker",{enumerable:!0,get:function(){return _integrityChecker.IntegrityChecker}}),Object.defineProperty(exports,"KameleoonStorageKey",{enumerable:!0,get:function(){return _constants.KameleoonStorageKey}}),Object.defineProperty(exports,"StorageDataType",{enumerable:!0,get:function(){return _types.StorageDataType}}),Object.defineProperty(exports,"TrackingDataType",{enumerable:!0,get:function(){return _types.TrackingDataType}}),Object.defineProperty(exports,"VISIT_DURATION",{enumerable:!0,get:function(){return _constants.VISIT_DURATION}}),Object.defineProperty(exports,"VariationDataType",{enumerable:!0,get:function(){return _types.VariationDataType}});var _constants=require("./constants"),_storage=require("./storage"),_integrityChecker=require("./integrityChecker"),_types=require("./types");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"ClientDataType",{enumerable:!0,get:function(){return _types.ClientDataType}}),Object.defineProperty(exports,"ConsentDataType",{enumerable:!0,get:function(){return _types.ConsentDataType}}),Object.defineProperty(exports,"DataInfoType",{enumerable:!0,get:function(){return _types.DataInfoType}}),Object.defineProperty(exports,"DataStorage",{enumerable:!0,get:function(){return _storage.DataStorage}}),Object.defineProperty(exports,"FeatureFlagVariationsType",{enumerable:!0,get:function(){return _types.FeatureFlagVariationsType}}),Object.defineProperty(exports,"IExternalStorage",{enumerable:!0,get:function(){return _types.IExternalStorage}}),Object.defineProperty(exports,"IStorage",{enumerable:!0,get:function(){return _types.IStorage}}),Object.defineProperty(exports,"IntegrityChecker",{enumerable:!0,get:function(){return _integrityChecker.IntegrityChecker}}),Object.defineProperty(exports,"KameleoonStorageKey",{enumerable:!0,get:function(){return _constants.KameleoonStorageKey}}),Object.defineProperty(exports,"StorageCleanupManager",{enumerable:!0,get:function(){return _storageCleanupManager.StorageCleanupManager}}),Object.defineProperty(exports,"StorageDataType",{enumerable:!0,get:function(){return _types.StorageDataType}}),Object.defineProperty(exports,"TrackingDataType",{enumerable:!0,get:function(){return _types.TrackingDataType}}),Object.defineProperty(exports,"VISIT_DURATION",{enumerable:!0,get:function(){return _constants.VISIT_DURATION}}),Object.defineProperty(exports,"VariationDataType",{enumerable:!0,get:function(){return _types.VariationDataType}});var _constants=require("./constants"),_storage=require("./storage"),_integrityChecker=require("./integrityChecker"),_storageCleanupManager=require("./storageCleanupManager"),_types=require("./types");
@@ -0,0 +1,15 @@
1
+ import { IExternalStorage } from '../storage/types';
2
+ import { StorageDataType } from './types';
3
+ import { KameleoonStorageKey } from '../storage/constants';
4
+ export declare class StorageCleanupManager<T extends StorageDataType> {
5
+ private readonly cleanupInterval;
6
+ private readonly externalStorage;
7
+ constructor(externalStorage: IExternalStorage<T>, cleanupInterval: number);
8
+ private initCleanupInterval;
9
+ cleanupData(storageKey: KameleoonStorageKey): void;
10
+ private cleanupConsentData;
11
+ private cleanupVariationData;
12
+ private cleanupForcedFeatureVariationData;
13
+ private cleanupForcedExperimentVariationData;
14
+ private cleanupObjectValues;
15
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.StorageCleanupManager=void 0;var _logging=require("../logging"),_constants=require("./constants");function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==typeof b?b:b+""}function _toPrimitive(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}class StorageCleanupManager{constructor(a,b){_defineProperty(this,"cleanupInterval",void 0),_defineProperty(this,"externalStorage",void 0),this.externalStorage=a,this.cleanupInterval=b,0<b&&this.initCleanupInterval()}initCleanupInterval(){for(const a of Object.values(_constants.KameleoonStorageKey)){let b=null;try{switch(a){case _constants.KameleoonStorageKey.ForcedFeatureVariation:case _constants.KameleoonStorageKey.ForcedExperimentVariation:case _constants.KameleoonStorageKey.VariationData:case _constants.KameleoonStorageKey.ConsentData:_logging.KameleoonLogger.info`Starting cleanup for ${a} with interval ${this.cleanupInterval}`,b=setInterval(()=>this.cleanupData(a),this.cleanupInterval);break;case _constants.KameleoonStorageKey.ClientData:case _constants.KameleoonStorageKey.TargetingData:case _constants.KameleoonStorageKey.TrackingData:case _constants.KameleoonStorageKey.VisitorCode:case _constants.KameleoonStorageKey.DataInfo:case _constants.KameleoonStorageKey.KameleoonSimulationFFData:break;default:_logging.KameleoonLogger.error`Unknown storage key: ${a} for initCleanupInterval.`}}catch(c){b&&clearInterval(b),_logging.KameleoonLogger.error`Error while starting cleanup for ${a} with interval ${this.cleanupInterval}`}}}cleanupData(a){const b=this.externalStorage.read(a);if(b){const c=Date.now();switch(a){case _constants.KameleoonStorageKey.VariationData:this.cleanupVariationData(b,c);break;case _constants.KameleoonStorageKey.ForcedFeatureVariation:this.cleanupForcedFeatureVariationData(b,c);break;case _constants.KameleoonStorageKey.ForcedExperimentVariation:this.cleanupForcedExperimentVariationData(b,c);break;case _constants.KameleoonStorageKey.ConsentData:this.cleanupConsentData(b,c);break;case _constants.KameleoonStorageKey.ClientData:case _constants.KameleoonStorageKey.TargetingData:case _constants.KameleoonStorageKey.TrackingData:case _constants.KameleoonStorageKey.VisitorCode:case _constants.KameleoonStorageKey.DataInfo:case _constants.KameleoonStorageKey.KameleoonSimulationFFData:break;default:_logging.KameleoonLogger.error`Unknown storage key: ${a} for cleanupData.`}this.externalStorage.write(a,b)}}cleanupConsentData(a,b){for(const[c,d]of Object.entries(a)){if("boolean"==typeof d){a[c]={consent:d,expirationTime:b+this.cleanupInterval};continue}const e=d;"number"==typeof e.expirationTime?e.expirationTime<b&&delete a[c]:e.expirationTime=b+this.cleanupInterval}}cleanupVariationData(a,b){for(const[c,d]of Object.entries(a))this.cleanupObjectValues(d,b),0===Object.keys(a[c]).length&&delete a[c]}cleanupForcedFeatureVariationData(a,b){for(const[c,d]of Object.entries(a))for(const[e,f]of Object.entries(d))this.cleanupObjectValues(f,b),0===Object.keys(a[+c][e]).length&&delete a[+c][e]}cleanupForcedExperimentVariationData(a,b){for(const[c,d]of Object.entries(a))this.cleanupObjectValues(d,b),0===Object.keys(a[c]).length&&delete a[c]}cleanupObjectValues(a,b){for(const[c,d]of Object.entries(a))"number"==typeof d.expirationTime?d.expirationTime<b&&delete a[c]:d.expirationTime=b+this.cleanupInterval}}exports.StorageCleanupManager=StorageCleanupManager;
@@ -68,7 +68,9 @@ export type ForcedVariationDataType = {
68
68
  };
69
69
  };
70
70
  export type ConsentDataType = {
71
- [visitorCode: string]: boolean;
71
+ [visitorCode: string]: boolean | {
72
+ consent: boolean;
73
+ };
72
74
  };
73
75
  export type ScheduledVisitorsType = {
74
76
  [visitorCode: string]: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kameleoon/javascript-sdk-core",
3
- "version": "5.2.1",
3
+ "version": "5.2.3",
4
4
  "description": "Kameleoon JS SDK Core",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,7 +21,8 @@
21
21
  "symlink": "yarn link",
22
22
  "test": "jest",
23
23
  "test:watch": "jest --watch",
24
- "test:coverage": "jest --coverage"
24
+ "test:coverage": "jest --coverage",
25
+ "lint": "eslint -c ../../eslint.config.js 'dist/**/*.js'"
25
26
  },
26
27
  "homepage": "https://developers.kameleoon.com/react-js-sdk.html",
27
28
  "publishConfig": {