@kameleoon/javascript-sdk-core 5.2.1 → 5.2.2
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 +9 -0
- package/dist/clientConfiguration/clientConfiguration.d.ts +1 -0
- package/dist/clientConfiguration/clientConfiguration.js +1 -1
- package/dist/eventSource/eventSource.js +1 -1
- package/dist/logging/kameleoonLogger.d.ts +1 -1
- package/dist/logging/kameleoonLogger.js +1 -1
- package/dist/requester/requester.d.ts +2 -0
- package/dist/requester/requester.js +1 -1
- package/dist/requester/types.d.ts +14 -0
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 5.2.2 (2024-12-19)
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Resolved an issue where the SDK could crash in certain scenarios when an error occurred during a request.
|
|
8
|
+
- Improved the consistency of logs for requests by updating similar messages and ensuring accurate display of both responses and errors.
|
|
9
|
+
- Implemented logging for EventSource status updates (connection, disconnection, and errors).
|
|
10
|
+
- 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.
|
|
11
|
+
|
|
3
12
|
## 5.2.1 (2024-12-10)
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
|
@@ -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)()):(
|
|
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;
|
|
@@ -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
|
-
|
|
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;
|
|
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`
|
|
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)}let f=_logging.LogLevel.ERROR;if(e===_constants.NUMBER_OF_RETRIES){if(d.text){const b=await d.text();a=JSON.parse(b)}f=_logging.LogLevel.WARNING}await this.logRequestError({logLevel:f,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="";if("function"==typeof a.text){const d=await a.text();if(d)try{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 {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kameleoon/javascript-sdk-core",
|
|
3
|
-
"version": "5.2.
|
|
3
|
+
"version": "5.2.2",
|
|
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": {
|