@optimizely/optimizely-sdk
Version:
JavaScript SDK for Optimizely Feature Experimentation, Optimizely Full Stack (legacy), and Optimizely Rollouts
1 lines • 114 kB
JavaScript
import{v4 as e}from"uuid";import{validate as t}from"json-schema";import r from"murmurhash";import i from"https";import n from"url";import s from"decompress-response";const o="$opt_bot_filtering",a="$opt_bucketing_id",l="$opt_experiment_bucket_map",u={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment",HOLDOUT:"holdout"},c="rule",d="experiment",h="boolean",g="double",p="integer",f="string",v="json",m="2",y="3",b="4",E="Optimizely SDK not configured properly yet.",I='No flag was found for key "%s".',S=Math.pow(2,53);function x(e){return"number"==typeof e&&Math.abs(e)<=S}function k(e,t){if(!e)return{};const r={};return M(e,t,r),r}function M(e,t,r){e&&e.forEach(e=>{r[e[t]]=e})}function R(e){return Object.keys(e).map(t=>e[t])}function C(e){return Object.keys(e).map(t=>[t,e[t]])}function O(e,t){let r;for(const i of e)if(t(i)){r=i;break}return r}function w(e,...t){let r=0;return e.replace(/%s/g,(function(){const e=t[r++],i=typeof e;return"function"===i?e():"string"===i?e:String(e)}))}function A(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}var P,D={checkArrayEquality:A,currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:x,keyBy:k,uuid:function(){return e()},isNumber:function(e){return"number"==typeof e},getTimestamp:function(){return(new Date).getTime()},groupBy:function(e,t){const r={};return e.forEach(e=>{const i=t(e);r[i]=r[i]||[],r[i].push(e)}),R(r)},objectValues:R,objectEntries:C,find:O,sprintf:w};class F extends Error{constructor(e,...t){super(),this.resolved=!1,this.name="OptimizelyError",this.baseMessage=e,this.params=t,Object.setPrototypeOf(this,F.prototype)}setMessage(e){this.resolved||(this.message=w(e.resolve(this.baseMessage),...this.params),this.resolved=!0)}}!function(e){e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Warn=2]="Warn",e[e.Error=3]="Error"}(P||(P={}));const T={[P.Debug]:"DEBUG",[P.Info]:"INFO",[P.Warn]:"WARN",[P.Error]:"ERROR"},_={[P.Debug]:"debug",[P.Info]:"info",[P.Warn]:"warn",[P.Error]:"error"};class j{constructor(e){this.prefix=e||"[OPTIMIZELY]"}log(e,t){const r=`${this.prefix} - ${T[e]} ${this.getTime()} ${t}`;this.consoleLog(e,r)}getTime(){return(new Date).toISOString()}consoleLog(e,t){(console[_[e]]||console.log).call(console,t)}}class N{constructor(e){this.prefix="",this.logHandler=e.logHandler,this.infoResolver=e.infoMsgResolver,this.errorResolver=e.errorMsgResolver,this.level=e.level,e.name&&this.setName(e.name)}child(e){return new N({logHandler:this.logHandler,infoMsgResolver:this.infoResolver,errorMsgResolver:this.errorResolver,level:this.level,name:e})}setName(e){this.name=e,this.prefix=e+": "}info(e,...t){this.log(P.Info,e,t)}debug(e,...t){this.log(P.Debug,e,t)}warn(e,...t){this.log(P.Warn,e,t)}error(e,...t){this.log(P.Error,e,t)}handleLog(e,t,r){const i=r.length>0?`${this.prefix}${w(t,...r)}`:`${this.prefix}${t}`;this.logHandler.log(e,i)}log(e,t,r){if(e<this.level)return;if(t instanceof Error)return t instanceof F&&t.setMessage(this.errorResolver),void this.handleLog(e,t.message,[]);let i=this.errorResolver;if(e<P.Warn){if(!this.infoResolver)return;i=this.infoResolver}const n=i.resolve(t);this.handleLog(e,n,r)}}const U=["Adding Authorization header with Bearer Token",'Audience "%s" evaluated to %s.','Starting to evaluate audience "%s" with conditions: %s.',"Event store is full. Not saving event with id %d.",'Failed to parse revenue value "%s" from event tags.','Failed to parse event value "%s" from event tags.',"Feature %s is enabled for user %s.","Feature %s is not enabled for user %s.",'Feature "%s" is not enabled for user %s. Returning the default variable value "%s".',"Invalid client engine passed: %s. Defaulting to node-sdk.","Provided decide options is not an array. Using default decide options.","Provided default decide options is not an array.","Experiment key %s is not in datafile. It is either invalid, paused, or archived.","Making datafile request to url %s with headers: %s",'Audience condition %s evaluated to UNKNOWN because no value was passed for user attribute "%s".',"Not activating user %s for experiment %s.",'Parsed event value "%s" from event tags.','Parsed revenue value "%s" from event tags.',"Response status code: %s","Saved last modified header value from response: %s",'Saved user profile for user "%s".',"User %s was previously bucketed into variation with ID %s for experiment %s, but no matching variation was found.",'Experiment %s is not in "Running" state. Not activating user.',"Skipping JSON schema validation.","Tracking event %s for user %s.",'Audience condition %s evaluated to UNKNOWN because a null value was passed for user attribute "%s".',"Updated Optimizely config to revision %s (project id %s)","User %s is not in the forced variation map.","No experiment %s mapped to user %s in the forced variation map.","Set variation %s for experiment %s and user %s in the forced variation map.",'User "%s" is not in any variation or rollout rule. Returning default value for variable "%s" of feature flag "%s".','Got variable value "%s" for variable "%s" of feature flag "%s"','BucketingId is valid: "%s"',"Datafile is valid.","Valid user profile service provided.",'Variable "%s" is not used in variation "%s". Returning default value.',"Variation mapped to experiment %s has been removed for user %s."],V=["BucketingID attribute is not a string. Defaulted to userId","CMAB decision fetch failed with status: %s","Error evaluating audience condition of type %s: %s","Datafile fetch request failed with status: %s","Error fetching datafile: %s","Event action invalid.","Event data invalid.","Event key %s is not in datafile.","Experiment key %s is not in datafile.","Failed to dispatch events, status: %s","failed to send odp events","Feature key %s is not in datafile.","Provided attributes are in an invalid format.","Unable to generate hash for bucketing ID %s: %s","Invalid CMAB fetch response","Provided Optimizely config is in an invalid format.","Datafile is invalid - property %s: %s","Datafile is invalid because it is malformed.","This version of the JavaScript SDK does not support the given datafile version: %s","Provided event tags are in an invalid format.","Experiment ID %s is not in datafile.","Experiment key %s is not in datafile. It is either invalid, paused, or archived.","Group ID %s is not in datafile.","Provided %s is in an invalid format.","JSON object is not valid.","Provided user ID is in an invalid format.","Provided user profile service instance is in an invalid format: %s.","Provided variation key is in an invalid format.","Integration key missing from datafile. All integrations should include a key.","Notification listener for (%s) threw exception: %s","Not tracking user %s.","No datafile specified. Cannot start optimizely.","No event processor is provided","No JSON object to validate against schema.","No project config available. Failing %s.","No status code in response","No variation key %s defined in datafile for experiment %s.","ODP config is not available.","ODP events should have at least one key-value pair in identifiers.","ODP event send failed.","ODP Event failed to send. (ODP Manager not available).","ODP event manager stopped before it could start","ODP is not integrated","Only POST requests are supported",'Audience condition %s evaluated to UNKNOWN because the number value for user attribute "%s" is not in the range [-2^53, +2^53].',"Promise value is not allowed in sync operation","Request error","Request timeout","Retry cancelled","sendBeacon failed","%s not running",'unable to bind optimizely.close() to page unload event: "%s"',"Unable to cast value %s to type %s, returning null.","Unable to get VUID - VuidManager is not available","Unable to parse & skipped header item","Provided attribute: %s has an undefined value.","Audience condition %s evaluated to UNKNOWN because the condition value is not supported.","Attribute %s unexpectedly has reserved prefix %s; using attribute ID instead of reserved attribute name.",'Audience condition %s evaluated to UNKNOWN because a value of type "%s" was passed for user attribute "%s".',"Audience condition %s has an unknown condition type. You may need to upgrade to a newer release of the Optimizely SDK.","Audience condition %s uses an unknown match type. You may need to upgrade to a newer release of the Optimizely SDK.","Unrecognized attribute %s provided. Pruning before sending event to Optimizely.","Unrecognized decide option %s provided.","Unsupported protocol: %s","User %s is not in the forced variation map. Cannot remove their forced variation.",'Error while looking up user profile for user ID "%s": %s.','Error while saving user profile for user ID "%s": %s.','Variable with key "%s" associated with feature with key "%s" is not in datafile.','Requested variable type "%s", but variable is of type "%s". Use correct API to retrieve value. Returning None.',"Variation ID %s is not in the datafile."],K={resolve(e){const t=parseInt(e);return U[t]||e}},L={resolve(e){const t=parseInt(e);return V[t]||e}},q={level:P.Debug,infoResolver:K,errorResolver:L},B={level:P.Info,infoResolver:K,errorResolver:L},z={level:P.Warn,errorResolver:L},H={level:P.Error,errorResolver:L},$=Symbol(),J={[$]:q},G={[$]:B},W={[$]:z},Q={[$]:H},Y=Symbol(),X=e=>{const{level:t,infoResolver:r,errorResolver:i}=(e=>{if(!e||"object"!=typeof e||!e[$])throw new Error("Invalid level preset");return e[$]})(e.level);e.logHandler&&(e=>{if("object"!=typeof e||"function"!=typeof e.log)throw new Error("Invalid log handler")})(e.logHandler);return{[Y]:new N({name:"Optimizely",level:t,infoMsgResolver:r,errorMsgResolver:i,logHandler:e.logHandler||new j})}};class Z{constructor(e,t,r){this.errorHandler=e,this.messageResolver=t,this.name=r||""}notify(e){e instanceof F&&e.setMessage(this.messageResolver),this.errorHandler.handleError(e)}child(e){return new Z(this.errorHandler,this.messageResolver,e)}}const ee=Symbol(),te=e=>((e=>{if(!e||"object"!=typeof e||"function"!=typeof e.handleError)throw new Error("Invalid error handler")})(e),{[ee]:new Z(e,L)}),re=["and","or","not"];function ie(e,t){if(Array.isArray(e)){let r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===re.indexOf(r)&&(r="or",i=e),r){case"and":return function(e,t){let r=!1;if(Array.isArray(e)){for(let i=0;i<e.length;i++){const n=ie(e[i],t);if(!1===n)return!1;null===n&&(r=!0)}return!r||null}return null}(i,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){const r=ie(e[0],t);return null===r?null:!r}return null}(i,t);default:return function(e,t){let r=!1;if(Array.isArray(e)){for(let i=0;i<e.length;i++){const n=ie(e[i],t);if(!0===n)return!0;null===n&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}class ne{constructor(e,t,r){var i,n;this.sdkKey=null!==(i=e.sdkKey)&&void 0!==i?i:"",this.environmentKey=null!==(n=e.environmentKey)&&void 0!==n?n:"",this.attributes=e.attributes,this.audiences=ne.getAudiences(e),this.events=e.events,this.revision=e.revision;const s=(e.featureFlags||[]).reduce((e,t)=>(e[t.id]=t.variables,e),{}),o=ne.getVariableIdMap(e),{experimentsMapById:a,experimentsMapByKey:l}=ne.getExperimentsMap(e,s,o,r);this.experimentsMap=l,this.featuresMap=ne.getFeaturesMap(e,s,a,o),this.datafile=t}getDatafile(){return this.datafile}static getAudiences(e){const t=[],r=[];return(e.typedAudiences||[]).forEach(e=>{t.push({id:e.id,conditions:JSON.stringify(e.conditions),name:e.name}),r.push(e.id)}),(e.audiences||[]).forEach(e=>{-1===r.indexOf(e.id)&&"$opt_dummy_audience"!=e.id&&t.push({id:e.id,conditions:JSON.stringify(e.conditions),name:e.name})}),t}static getSerializedAudiences(e,t){let r="";if(e){let i="";e.forEach(e=>{let n="";if(e instanceof Array)n=ne.getSerializedAudiences(e,t),n=`(${n})`;else if(re.indexOf(e)>-1)i=e.toUpperCase();else{const n=t[e]?t[e].name:e;r||"NOT"===i?(i=""===i?"OR":i,r=""===r?`${i} "${t[e].name}"`:r.concat(` ${i} "${n}"`)):r=`"${n}"`}""!==n&&(""!==r||"NOT"===i?(i=""===i?"OR":i,r=""===r?`${i} ${n}`:r.concat(` ${i} ${n}`)):r=r.concat(n))})}return r}static getExperimentAudiences(e,t){return e.audienceConditions?ne.getSerializedAudiences(e.audienceConditions,t.audiencesById):""}static mergeFeatureVariables(e,t,r,i,n){const s=(e[r]||[]).reduce((e,t)=>(e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e),{});return(i||[]).forEach(e=>{const r=t[e.id],i={id:e.id,key:r.key,type:r.type,value:n?e.value:r.defaultValue};s[r.key]=i}),s}static getVariationsMap(e,t,r,i){let n={};return n=e.reduce((e,n)=>{const s=ne.mergeFeatureVariables(t,r,i,n.variables,n.featureEnabled);return e[n.key]={id:n.id,key:n.key,featureEnabled:n.featureEnabled,variablesMap:s},e},{}),n}static getVariableIdMap(e){let t={};return t=(e.featureFlags||[]).reduce((e,t)=>(t.variables.forEach(t=>{e[t.id]=t}),e),{}),t}static getDeliveryRules(e,t,r,i,n){return i.map(i=>({id:i.id,key:i.key,audiences:ne.getExperimentAudiences(i,e),variationsMap:ne.getVariationsMap(i.variations,t,n,r)}))}static getRolloutExperimentIds(e){const t=[];return(e||[]).forEach(e=>{e.experiments.forEach(e=>{t.push(e.id)})}),t}static getExperimentsMap(e,t,r,i){const n=this.getRolloutExperimentIds(e.rollouts),s={},o={};return(e.experiments||[]).forEach(a=>{if(-1!==n.indexOf(a.id))return;const l=e.experimentFeatureMap[a.id];let u="";l&&l.length>0&&(u=l[0]);const c=ne.getVariationsMap(a.variations,t,r,u.toString()),d={id:a.id,key:a.key,audiences:ne.getExperimentAudiences(a,e),variationsMap:c};s[a.id]=d,o[a.key]&&i&&i.warn("Duplicate experiment keys found in datafile: "+a.key),o[a.key]=d}),{experimentsMapById:s,experimentsMapByKey:o}}static getExperimentsKeyMap(e){const t={};for(const r in e){const i=e[r];t[i.key]=i}return t}static getFeaturesMap(e,t,r,i){const n={};return e.featureFlags.forEach(s=>{const o={},a=[];s.experimentIds.forEach(e=>{const t=r[e];t&&(o[t.key]=t),a.push(r[e])});const l=(s.variables||[]).reduce((e,t)=>(e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e),{});let u=[];const c=e.rolloutIdMap[s.rolloutId];c&&(u=ne.getDeliveryRules(e,t,s.id,c.experiments,i)),n[s.key]={id:s.id,key:s.key,experimentRules:a,deliveryRules:u,experimentsMap:o,variablesMap:l}}),n}}const se=[m,y,b];var oe=function(e){if(!e)throw new F("31");if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new F("17")}if("object"!=typeof e||Array.isArray(e)||null===e)throw new F("17");if(-1===se.indexOf(e.version))throw new F("18",e.version);return e};class ae{constructor(e,t,r,i){this.apiKey=e,this.apiHost=t,this.pixelUrl=r,this.segmentsToCheck=i}equals(e){return this.apiHost===e.apiHost&&this.apiKey===e.apiKey&&this.pixelUrl===e.pixelUrl&&A(this.segmentsToCheck,e.segmentsToCheck)}}const le=function(e,t=null){const r=function(e){var t,r;const i=Object.assign({},e);return i.audiences=(e.audiences||[]).map(e=>Object.assign({},e)),i.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),i.featureFlags=(e.featureFlags||[]).map(e=>Object.assign({},e)),i.groups=(e.groups||[]).map(e=>{const t=Object.assign({},e);return t.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),t}),i.rollouts=(e.rollouts||[]).map(e=>{const t=Object.assign({},e);return t.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),t}),i.environmentKey=null!==(t=e.environmentKey)&&void 0!==t?t:"",i.sdkKey=null!==(r=e.sdkKey)&&void 0!==r?r:"",i}(e);let i;r.region||(r.region="US"),r.__datafileStr=null===t?JSON.stringify(e):t,(r.audiences||[]).forEach(e=>{e.conditions=JSON.parse(e.conditions)}),r.audiencesById={},M(r.audiences,"id",r.audiencesById),M(r.typedAudiences,"id",r.audiencesById),r.attributes=r.attributes||[],r.attributeKeyMap={},r.attributeIdMap={},r.attributes.forEach(e=>{r.attributeKeyMap[e.key]=e,r.attributeIdMap[e.id]=e}),r.eventKeyMap=k(r.events,"key"),r.groupIdMap=k(r.groups,"id"),Object.keys(r.groupIdMap||{}).forEach(e=>{i=r.groupIdMap[e].experiments,(i||[]).forEach(t=>{t.groupId=e,r.experiments.push(t)})}),r.rolloutIdMap=k(r.rollouts||[],"id"),R(r.rolloutIdMap||{}).forEach(e=>{(e.experiments||[]).forEach(e=>{e.isRollout=!0,r.experiments.push(e),e.variationKeyMap=k(e.variations,"key")})});const n=new Set;Object.keys(r.audiencesById).map(e=>ue(r.audiencesById[e])).forEach(e=>{e.forEach(e=>{n.add(e)})});const s=Array.from(n);let o=!1,a="",l="",u="";return r.integrations&&(r.integrationKeyMap=k(r.integrations,"key"),r.integrations.forEach(e=>{if(!("key"in e))throw new F("28");"odp"===e.key&&(o=!0,l=l||e.publicKey||"",a=a||e.host||"",u=u||e.pixelUrl||"")})),r.odpIntegrationConfig=o?{integrated:!0,odpConfig:new ae(l,a,u,s)}:{integrated:!1},r.experimentKeyMap=k(r.experiments,"key"),r.experimentIdMap=k(r.experiments,"id"),r.variationIdMap={},r.variationVariableUsageMap={},(r.experiments||[]).forEach(e=>{e.variationKeyMap=k(e.variations,"key"),M(e.variations,"id",r.variationIdMap),R(e.variationKeyMap||{}).forEach(e=>{e.variables&&(r.variationVariableUsageMap[e.id]=k(e.variables,"id"))})}),r.experimentFeatureMap={},r.featureKeyMap=k(r.featureFlags||[],"key"),R(r.featureKeyMap||{}).forEach(e=>{e.variables.forEach(e=>{e.type===f&&e.subType===v&&(e.type=v,delete e.subType)}),e.variableKeyMap=k(e.variables,"key"),(e.experimentIds||[]).forEach(t=>{r.experimentFeatureMap[t]?r.experimentFeatureMap[t].push(e.id):r.experimentFeatureMap[t]=[e.id]})}),r.flagRulesMap={},(r.featureFlags||[]).forEach(e=>{const t=[];e.experimentIds.forEach(e=>{const i=r.experimentIdMap[e];i&&t.push(i)});const i=r.rolloutIdMap[e.rolloutId];i&&t.push(...i.experiments),r.flagRulesMap[e.key]=t}),r.flagVariationsMap={},C(r.flagRulesMap||{}).forEach(([e,t])=>{const i=[];t.forEach(e=>{e.variations.forEach(e=>{O(i,t=>t.id===e.id)||i.push(e)})}),r.flagVariationsMap[e]=i}),r},ue=function(e){return e.conditions?ce(e.conditions):[]},ce=e=>{const t=[];return function(e){return["and","or","not"].includes(e)}(e)?[]:(Array.isArray(e)?e.forEach(e=>t.push(...ce(e))):"qualified"===e.match&&t.push(e.value),t)};const de=function(e,t){const r=e.experimentKeyMap[t];if(!r)throw new F("21",t);return r.status},he=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){const r=e.experimentKeyMap[t];if(r)return r}throw new F("8",t)},ge=function(e,t,r){if(!e)return null;const i=O(e.flagVariationsMap[t],e=>e.key===r);return i||null},pe=function(e,t,r){if(e.featureKeyMap.hasOwnProperty(t)){const r=e.featureKeyMap[t];if(r)return r}return null==r||r.error("11",t),null},fe=function(e){return!!e.sendFlagDecisions},ve=()=>{};function me(){let e=ve,t=ve;const r=new Promise((r,i)=>{e=r,t=i});return{promise:r,resolve:e,reject:t,then:r.then.bind(r)}}var ye;!function(e){e[e.New=0]="New",e[e.Starting=1]="Starting",e[e.Running=2]="Running",e[e.Stopping=3]="Stopping",e[e.Terminated=4]="Terminated",e[e.Failed=5]="Failed"}(ye||(ye={}));class be{constructor(e=[]){this.disposable=!1,this.state=ye.New,this.startPromise=me(),this.stopPromise=me(),this.startupLogs=e,this.startPromise.promise.catch(()=>{}),this.stopPromise.promise.catch(()=>{})}makeDisposable(){this.disposable=!0}setLogger(e){this.logger=e}printStartupLogs(){if(this.logger)for(const{level:e,message:t,params:r}of this.startupLogs){const i=_[e];this.logger[i].call(this.logger,t,...r)}}onRunning(){return this.startPromise.promise}onTerminated(){return this.stopPromise.promise}getState(){return this.state}isStarting(){return this.state===ye.Starting}isRunning(){return this.state===ye.Running}isNew(){return this.state===ye.New}isDone(){return[ye.Stopping,ye.Terminated,ye.Failed].includes(this.state)}start(){this.printStartupLogs()}}class Ee{constructor(){this.id=0,this.listeners={}}on(e,t){var r;this.listeners[e]||(this.listeners[e]=new Map);const i=this.id++;return null===(r=this.listeners[e])||void 0===r||r.set(i,t),()=>{var t;null===(t=this.listeners[e])||void 0===t||t.delete(i)}}emit(e,t){const r=this.listeners[e];r&&r.forEach(e=>{e(t)})}removeListeners(e){var t;null===(t=this.listeners[e])||void 0===t||t.clear()}removeAllListeners(){this.listeners={}}}class Ie extends be{constructor(e){super(),this.eventEmitter=new Ee,this.jsonSchemaValidator=e.jsonSchemaValidator,this.datafile=e.datafile,this.datafileManager=e.datafileManager,e.logger&&this.setLogger(e.logger)}setLogger(e){var t;this.logger=e,this.logger.setName("ProjectConfigManager"),null===(t=this.datafileManager)||void 0===t||t.setLogger(e.child())}start(){var e,t,r;this.isNew()&&(this.state=ye.Starting,this.datafile||this.datafileManager?(this.datafile&&this.handleNewDatafile(this.datafile,!0),null===(e=this.datafileManager)||void 0===e||e.start(),null===(t=this.datafileManager)||void 0===t||t.onUpdate(this.handleNewDatafile.bind(this)),null===(r=this.datafileManager)||void 0===r||r.onRunning().catch(e=>{this.handleDatafileManagerError(e)})):this.handleInitError(new Error("sdkKey or datafile must be provided")))}makeDisposable(){var e;super.makeDisposable(),null===(e=this.datafileManager)||void 0===e||e.makeDisposable()}handleInitError(e){var t,r;null===(t=this.logger)||void 0===t||t.error(e),this.state=ye.Failed,null===(r=this.datafileManager)||void 0===r||r.stop(),this.startPromise.reject(e),this.stopPromise.reject(e)}handleDatafileManagerError(e){var t;null===(t=this.logger)||void 0===t||t.error("%s failed to start, reason: %s","DatafileManager",e.message),this.isStarting()&&this.handleInitError(new Error(w("%s failed to start, reason: %s","DatafileManager",e.message)))}handleNewDatafile(e,t=!1){var r,i;if(!this.isDone())try{const t=function(e){var t,r;const i=oe(e.datafile);e.jsonSchemaValidator?(e.jsonSchemaValidator(i),null===(t=e.logger)||void 0===t||t.info("33")):null===(r=e.logger)||void 0===r||r.info("23");const n=[i];"string"==typeof e.datafile&&n.push(e.datafile);return le(...n)}({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:this.logger});this.isStarting()&&(this.state=ye.Running,this.startPromise.resolve()),(null===(r=this.projectConfig)||void 0===r?void 0:r.revision)!==t.revision&&(this.projectConfig=t,this.optimizelyConfig=void 0,this.eventEmitter.emit("update",t))}catch(e){null===(i=this.logger)||void 0===i||i.error(e);(this.isStarting()&&!this.datafileManager||this.isStarting()&&!t)&&this.handleInitError(new Error("got invalid datafile"))}}getConfig(){return this.projectConfig}getOptimizelyConfig(){var e,t,r,i;return!this.optimizelyConfig&&this.projectConfig&&(this.optimizelyConfig=(e=this.projectConfig,i=this.projectConfig,t=i.__datafileStr,r=this.logger,new ne(e,t,r))),this.optimizelyConfig}onUpdate(e){return this.eventEmitter.on("update",e)}stop(){if(!this.isDone()){if((this.isNew()||this.isStarting())&&this.startPromise.reject(new Error(w("%s stopped before running","ProjectConfigManager"))),this.state=ye.Stopping,this.eventEmitter.removeAllListeners(),!this.datafileManager)return this.state=ye.Terminated,void this.stopPromise.resolve();this.datafileManager.stop(),this.datafileManager.onTerminated().then(()=>{this.state=ye.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=ye.Failed,this.stopPromise.reject(e)})}}}function Se(e,t,r,i){return new(r||(r=Promise))((function(n,s){function o(e){try{l(i.next(e))}catch(e){s(e)}}function a(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,a)}l((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const xe=e=>e>=200&&e<400;class ke extends be{constructor(e){super(e.startupLogs);const{autoUpdate:t=!1,sdkKey:r,datafileAccessToken:i,urlTemplate:n,cache:s,initRetry:o,repeater:a,requestHandler:l,logger:u}=e;this.cache=s,this.cacheKey="opt-datafile-"+r,this.sdkKey=r,this.datafileAccessToken=i,this.requestHandler=l,this.emitter=new Ee,this.autoUpdate=t,this.initRetryRemaining=o,this.repeater=a,u&&this.setLogger(u);const c=n||(i?"https://config.optimizely.com/datafiles/auth/%s.json":"https://cdn.optimizely.com/datafiles/%s.json");this.datafileUrl=w(c,this.sdkKey)}setLogger(e){this.logger=e,this.logger.setName("PollingDatafileManager")}onUpdate(e){return this.emitter.on("update",e)}get(){return this.currentDatafile}start(){this.isNew()&&(super.start(),this.state=ye.Starting,this.setDatafileFromCacheIfAvailable(),this.repeater.setTask(this.syncDatafile.bind(this)),this.repeater.start(!0))}makeDisposable(){var e;super.makeDisposable(),this.initRetryRemaining=Math.min(null!==(e=this.initRetryRemaining)&&void 0!==e?e:5,5)}stop(){var e;this.isDone()||((this.isNew()||this.isStarting())&&this.startPromise.reject(new Error(w("%s stopped before running","PollingDatafileManager"))),this.state=ye.Terminated,this.repeater.stop(),null===(e=this.currentRequest)||void 0===e||e.abort(),this.emitter.removeAllListeners(),this.stopPromise.resolve())}handleInitFailure(){this.state=ye.Failed,this.repeater.stop();const e=new Error("Failed to fetch datafile");this.startPromise.reject(e),this.stopPromise.reject(e)}handleError(e){var t,r;this.isDone()||(e instanceof Error?null===(t=this.logger)||void 0===t||t.error("4",e.message,e):null===(r=this.logger)||void 0===r||r.error("3",e),this.isStarting()&&void 0!==this.initRetryRemaining&&(0===this.initRetryRemaining?this.handleInitFailure():this.initRetryRemaining--))}onRequestRejected(e){return Se(this,void 0,void 0,(function*(){return this.handleError(e),Promise.reject(e)}))}onRequestResolved(e){return Se(this,void 0,void 0,(function*(){if(this.isDone())return;if(this.saveLastModified(e.headers),!xe(e.statusCode))return this.handleError(e.statusCode),Promise.reject(new Error);const t=this.getDatafileFromResponse(e);t&&(this.handleDatafile(t),this.autoUpdate&&!this.disposable||this.repeater.stop())}))}makeDatafileRequest(){var e,t;const r={};return this.lastResponseLastModified&&(r["if-modified-since"]=this.lastResponseLastModified),this.datafileAccessToken&&(null===(e=this.logger)||void 0===e||e.debug("0"),r.Authorization="Bearer "+this.datafileAccessToken),null===(t=this.logger)||void 0===t||t.debug("13",this.datafileUrl,()=>JSON.stringify(r)),this.requestHandler.makeRequest(this.datafileUrl,r,"GET")}syncDatafile(){return Se(this,void 0,void 0,(function*(){return this.currentRequest=this.makeDatafileRequest(),this.currentRequest.responsePromise.then(this.onRequestResolved.bind(this),this.onRequestRejected.bind(this)).finally(()=>this.currentRequest=void 0)}))}handleDatafile(e){var t;this.isDone()||(this.currentDatafile=e,null===(t=this.cache)||void 0===t||t.set(this.cacheKey,e),this.isStarting()&&(this.startPromise.resolve(),this.state=ye.Running),this.emitter.emit("update",e))}getDatafileFromResponse(e){var t;if(null===(t=this.logger)||void 0===t||t.debug("18",e.statusCode),304!==e.statusCode)return e.body}saveLastModified(e){var t;const r=e["last-modified"]||e["Last-Modified"];void 0!==r&&(this.lastResponseLastModified=r,null===(t=this.logger)||void 0===t||t.debug("19",this.lastResponseLastModified))}setDatafileFromCacheIfAvailable(){return Se(this,void 0,void 0,(function*(){if(this.cache)try{const e=yield this.cache.get(this.cacheKey);e&&this.isStarting()&&this.handleDatafile(e)}catch(e){}}))}}class Me{constructor(e,t,r){this.base=e,this.max=t,this.maxJitter=r,this.current=e}backoff(){const e=this.current+this.maxJitter*Math.random();return this.current=Math.min(2*this.current,this.max),e}reset(){this.current=this.base}}class Re{constructor(e,t){this.failureCount=0,this.running=!1,this.interval=e,this.backoffController=t}isRunning(){return this.running}handleSuccess(){var e;this.failureCount=0,null===(e=this.backoffController)||void 0===e||e.reset(),this.setTimer(this.interval)}handleFailure(){var e,t;this.failureCount++;const r=null!==(t=null===(e=this.backoffController)||void 0===e?void 0:e.backoff())&&void 0!==t?t:this.interval;this.setTimer(r)}setTimer(e){this.running&&(this.timeoutId=setTimeout(this.executeTask.bind(this),e))}executeTask(){this.task&&this.task(this.failureCount).then(this.handleSuccess.bind(this),this.handleFailure.bind(this))}start(e){var t;this.running=!0,e?(t=this.executeTask.bind(this),"function"==typeof queueMicrotask?queueMicrotask(t):Promise.resolve().then(t)):this.setTimer(this.interval)}stop(){this.running=!1,clearInterval(this.timeoutId)}reset(){var e;this.failureCount=0,null===(e=this.backoffController)||void 0===e||e.reset(),this.stop()}setTask(e){this.task=e}}const Ce=e=>{const t=[];if(!e||"object"!=typeof e)throw new Error("Invalid store");for(const r of["set","get","remove","getKeys"])"function"!=typeof e[r]&&t.push("Invalid store method %s".replace("%s",r));if(t.length>0)throw new Error(t.join(", "))},Oe=Symbol(),we=e=>({[Oe]:new Ie(e)}),Ae=e=>{var t;e.cache&&Ce(e.cache);const r=null!==(t=e.updateInterval)&&void 0!==t?t:3e5,i=new Me(1e3,r,500),n=new Re(r,i),s=[];r<3e4&&s.push({level:P.Warn,message:"Polling intervals below 30 seconds are not recommended.",params:[]});const o={sdkKey:e.sdkKey,autoUpdate:e.autoUpdate,urlTemplate:e.urlTemplate,datafileAccessToken:e.datafileAccessToken,requestHandler:e.requestHandler,cache:e.cache,repeater:n,startupLogs:s},a=new ke(o);return new Ie({datafile:e.datafile,datafileManager:a,jsonSchemaValidator:e.jsonSchemaValidator})},Pe={US:"https://logx.optimizely.com/v1/events",EU:"https://eu.logx.optimizely.com/v1/events"};function De(e){const t=[],r=e[0];return e.forEach(e=>{if("conversion"===e.type||"impression"===e.type){const r=function(e){const t={snapshots:[],visitor_id:e.user.id,attributes:[]};e.user.attributes.forEach(e=>{t.attributes.push({entity_id:e.entityId,key:e.key,type:"custom",value:e.value})}),"boolean"==typeof e.context.botFiltering&&t.attributes.push({entity_id:o,key:o,type:"custom",value:e.context.botFiltering});return t}(e);"impression"===e.type?r.snapshots.push(function(e){var t,r;const{layer:i,experiment:n,variation:s,ruleKey:o,flagKey:a,ruleType:l,enabled:u,cmabUuid:c}=e,d=i?i.id:null,h=null!==(t=null==n?void 0:n.id)&&void 0!==t?t:"",g=null!==(r=null==s?void 0:s.id)&&void 0!==r?r:"",p=s?s.key:"";return{decisions:[{campaign_id:d,experiment_id:h,variation_id:g,metadata:{flag_key:a,rule_key:o,rule_type:l,variation_key:p,enabled:u,cmab_uuid:c}}],events:[{entity_id:d,timestamp:e.timestamp,key:"campaign_activated",uuid:e.uuid}]}}(e)):"conversion"===e.type&&r.snapshots.push(function(e){const t=Object.assign({},e.tags);delete t.revenue,delete t.value;const r={entity_id:e.event.id,key:e.event.key,timestamp:e.timestamp,uuid:e.uuid};e.tags&&(r.tags=e.tags);null!=e.value&&(r.value=e.value);null!=e.revenue&&(r.revenue=e.revenue);return{events:[r]}}(e)),t.push(r)}}),{client_name:r.context.clientName,client_version:r.context.clientVersion,account_id:r.context.accountId,project_id:r.context.projectId,revision:r.context.revision,anonymize_ip:r.context.anonymizeIP,enrich_decisions:!0,visitors:t}}function Fe(e){var t;const r=(null===(t=e[0])||void 0===t?void 0:t.context.region)||"US";return{url:Pe[r],httpVerb:"POST",params:De(e)}}class Te extends be{constructor(e){super(),this.dispatcher=e,this.eventEmitter=new Ee}process(e){const t=Fe([e]),r=this.dispatcher.dispatchEvent(t);return this.eventEmitter.emit("dispatch",t),r}start(){this.isNew()&&(this.state=ye.Running,this.startPromise.resolve())}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(w("%s stopped before running","ForwardingEventProcessor"))),this.state=ye.Terminated,this.stopPromise.resolve())}onDispatch(e){return this.eventEmitter.on("dispatch",e)}}class _e{constructor(){this.operation="sync"}}const je=(e,t)=>e instanceof _e?e.getBatched(t):t.map(t=>e.get(t)),Ne=(e,t)=>e instanceof class{constructor(){this.operation="async"}}?e.getBatched(t):Promise.all(t.map(t=>e.get(t)));class Ue extends _e{constructor(e,t,r,i){super(),this.operation="sync",this.store=e,this.prefix=t,this.transformGet=r,this.transformSet=i}addPrefix(e){return`${this.prefix}${e}`}removePrefix(e){return e.substring(this.prefix.length)}set(e,t){return this.store.set(this.addPrefix(e),this.transformSet(t))}get(e){const t=this.store.get(this.addPrefix(e));return t?this.transformGet(t):void 0}remove(e){return this.store.remove(this.addPrefix(e))}getInternalKeys(){return this.store.getKeys().filter(e=>e.startsWith(this.prefix))}getKeys(){return this.getInternalKeys().map(e=>this.removePrefix(e))}getBatched(e){return je(this.store,e.map(e=>this.addPrefix(e))).map(e=>e?this.transformGet(e):void 0)}}class Ve{constructor(e,t,r,i){this.operation="async",this.cache=e,this.prefix=t,this.transformGet=r,this.transformSet=i}addPrefix(e){return`${this.prefix}${e}`}removePrefix(e){return e.substring(this.prefix.length)}set(e,t){return this.cache.set(this.addPrefix(e),this.transformSet(t))}get(e){return Se(this,void 0,void 0,(function*(){const t=yield this.cache.get(this.addPrefix(e));return t?this.transformGet(t):void 0}))}remove(e){return this.cache.remove(this.addPrefix(e))}getInternalKeys(){return Se(this,void 0,void 0,(function*(){return this.cache.getKeys().then(e=>e.filter(e=>e.startsWith(this.prefix)))}))}getKeys(){return Se(this,void 0,void 0,(function*(){return this.getInternalKeys().then(e=>e.map(e=>this.removePrefix(e)))}))}getBatched(e){return Se(this,void 0,void 0,(function*(){return(yield Ne(this.cache,e.map(e=>this.addPrefix(e)))).map(e=>e?this.transformGet(e):void 0)}))}}const Ke=(e,t,r,i,n)=>{e().then(e=>{t.resolve(e)}).catch(s=>{var o;if(0===n)return void t.reject(s);if(r.cancelled)return void t.reject(new F("48"));const a=null!==(o=null==i?void 0:i.backoff())&&void 0!==o?o:0;setTimeout(()=>{Ke(e,t,r,i,n=void 0===n?void 0:n-1)},a)})},Le=(e,t,r)=>{const i=me(),n={cancelled:!1};return Ke(e,i,n,t,r),{cancelRetry:()=>{n.cancelled=!0},result:i.promise}};class qe{constructor(){this.idSuffixOffset=0}getId(){const e=1e4+this.idSuffixOffset;this.idSuffixOffset=(this.idSuffixOffset+1)%1e4;return`${Date.now()}${e}`}}function Be(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function ze(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function He(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==r&&r}const $e={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables",FLAG:"flag"},Je={ACTIVATE:"ACTIVATE",DECISION:"DECISION",LOG_EVENT:"LOG_EVENT",OPTIMIZELY_CONFIG_UPDATE:"OPTIMIZELY_CONFIG_UPDATE",TRACK:"TRACK"};var Ge;!function(e){e.IGNORE_CACHE="IGNORE_CACHE",e.RESET_CACHE="RESET_CACHE"}(Ge||(Ge={}));class We{constructor(e,t,r){this.requestHandler=e,this.requestGenerator=t,r&&this.setLogger(r)}setLogger(e){this.logger=e,this.logger.setName("OdpEventApiManager")}sendEvents(e,t){return Se(this,void 0,void 0,(function*(){if(0===t.length)return{};const{method:r,endpoint:i,headers:n,data:s}=this.requestGenerator(e,t);return this.requestHandler.makeRequest(i,n,r,s).responsePromise}))}}const Qe=(e,t)=>{const{apiHost:r,apiKey:i}=e;return{method:"POST",endpoint:r+"/v3/events",headers:{"Content-Type":"application/json","x-api-key":i},data:JSON.stringify(t,(e,t)=>t instanceof Map?Object.fromEntries(t):t)}};var Ye,Xe;!function(e){e.BOOLEAN="boolean",e.DOUBLE="double",e.INTEGER="integer",e.STRING="string",e.JSON="json"}(Ye||(Ye={})),function(e){e.DISABLE_DECISION_EVENT="DISABLE_DECISION_EVENT",e.ENABLED_FLAGS_ONLY="ENABLED_FLAGS_ONLY",e.IGNORE_USER_PROFILE_SERVICE="IGNORE_USER_PROFILE_SERVICE",e.INCLUDE_REASONS="INCLUDE_REASONS",e.EXCLUDE_VARIABLES="EXCLUDE_VARIABLES",e.IGNORE_CMAB_CACHE="IGNORE_CMAB_CACHE",e.RESET_CMAB_CACHE="RESET_CMAB_CACHE",e.INVALIDATE_USER_CMAB_CACHE="INVALIDATE_USER_CMAB_CACHE"}(Xe||(Xe={}));const Ze=(e,t)=>{const r=e.context,i=t.context;return(r.region||"US")===(i.region||"US")&&r.accountId===i.accountId&&r.projectId===i.projectId&&r.clientName===i.clientName&&r.clientVersion===i.clientVersion&&r.revision===i.revision&&r.anonymizeIP===i.anonymizeIP&&r.botFiltering===i.botFiltering},et=({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:n,type:s})=>({type:s,timestamp:D.currentTimestamp(),uuid:D.uuid(),context:{region:e.region,accountId:e.accountId,projectId:e.projectId,revision:e.revision,clientName:i,clientVersion:n,anonymizeIP:e.anonymizeIP||!1,botFiltering:e.botFiltering},user:{id:t,attributes:it(e,r)}}),tt=function({configObj:e,decisionObj:t,userId:r,flagKey:i,enabled:n,userAttributes:s,clientEngine:o,clientVersion:a}){const l=t.decisionSource,c=Be(t),d=function(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.id)&&void 0!==r?r:null}(t),h=ze(t),g=function(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.id)&&void 0!==r?r:null}(t),p=t.cmabUuid,f=null!==d?l===u.HOLDOUT?"":function(e,t){const r=e.experimentIdMap[t];if(!r)throw new F("20",t);return r.layerId}(e,d):null;return Object.assign(Object.assign({},et({configObj:e,userId:r,userAttributes:s,clientEngine:o,clientVersion:a,type:"impression"})),{layer:{id:f},experiment:{id:d,key:c},variation:{id:g,key:h},ruleKey:c,flagKey:i,ruleType:l,enabled:n,cmabUuid:p})},rt=function({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:n,eventKey:s,eventTags:o},a){const l=function(e,t){const r=e.eventKeyMap[t];return r?r.id:null}(e,s),u=o?function(e,t){const r=e.revenue;if(null==r)return null;const i="string"==typeof r?parseInt(r):Math.trunc(r);return isFinite(i)?(null==t||t.info("17",i),i):(null==t||t.info("4",r),null)}(o,a):null,c=o?function(e,t){const r=e.value;if(null==r)return null;const i="string"==typeof r?parseFloat(r):r;return isFinite(i)?(null==t||t.info("16",i),i):(null==t||t.info("5",r),null)}(o,a):null;return Object.assign(Object.assign({},et({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:n,type:"conversion"})),{event:{id:l,key:s},revenue:u,value:c,tags:o})},it=(e,t,r)=>{if(!t)return[];const i=[];return Object.keys(t).forEach((function(n){const s=t[n];if("object"!=typeof s&&void 0!==s&&function(e,t){return"string"==typeof e&&("string"==typeof t||"boolean"==typeof t||D.isNumber(t)&&D.isSafeInteger(t))}(n,s)){const t=function(e,t,r){const i=e.attributeKeyMap[t],n=0===t.indexOf("$opt_");return i?(n&&(null==r||r.warn("57",t,"$opt_")),i.id):n?t:(null==r||r.warn("61",t),null)}(e,n,r);t&&i.push({entityId:t,key:n,value:s})}})),i};class nt extends be{constructor(e){var t;super(e.startupLogs),this.eventQueue=[],this.eventCountInStore=void 0,this.eventCountWaitPromise=Promise.resolve(),this.maxEventsInStore=500,this.idGenerator=new qe,this.runningTask=new Map,this.dispatchingEvents=new Map,this.eventEmitter=new Ee,this.eventDispatcher=e.eventDispatcher,this.closingEventDispatcher=e.closingEventDispatcher,this.batchSize=e.batchSize,this.eventStore=e.eventStore,this.retryConfig=e.retryConfig,this.dispatchRepeater=e.dispatchRepeater,this.dispatchRepeater.setTask(()=>this.flush()),this.maxEventsInStore=Math.max(2*e.batchSize,500),this.failedEventRepeater=e.failedEventRepeater,null===(t=this.failedEventRepeater)||void 0===t||t.setTask(()=>this.retryFailedEvents()),e.logger&&this.setLogger(e.logger)}setLogger(e){this.logger=e,this.logger.setName("BatchEventProcessor")}onDispatch(e){return this.eventEmitter.on("dispatch",e)}retryFailedEvents(){return Se(this,void 0,void 0,(function*(){if(!this.eventStore)return;const e=(yield this.eventStore.getKeys()).filter(e=>!this.dispatchingEvents.has(e)&&!this.eventQueue.find(t=>t.id===e)),t=yield"sync"===this.eventStore.operation?je(this.eventStore,e):Ne(this.eventStore,e),r=[];if(t.forEach(e=>{e&&r.push(e)}),0==r.length)return;r.sort((e,t)=>e.id<t.id?-1:1);const i=[];let n=[];r.forEach(e=>{(n.length===this.batchSize||n.length>0&&!Ze(n[0].event,e.event))&&(i.push({request:Fe(n.map(e=>e.event)),events:n}),n=[]),n.push(e)}),n.length>0&&i.push({request:Fe(n.map(e=>e.event)),events:n}),i.forEach(e=>{this.dispatchBatch(e,!1)})}))}createNewBatch(){if(0==this.eventQueue.length)return;const e=[],t=[];return this.eventQueue.forEach(r=>{e.push(r.event),t.push(r)}),this.eventQueue=[],{request:Fe(e),events:t}}executeDispatch(e,t=!1){return Se(this,void 0,void 0,(function*(){return(t&&this.closingEventDispatcher?this.closingEventDispatcher:this.eventDispatcher).dispatchEvent(e).then(e=>e.statusCode&&!xe(e.statusCode)?Promise.reject(new F("9",e.statusCode)):Promise.resolve(e))}))}dispatchBatch(e,t){const{request:r,events:i}=e;i.forEach(e=>{this.dispatchingEvents.set(e.id,e)});const n=this.retryConfig?Le(()=>this.executeDispatch(r,t),this.retryConfig.backoffProvider(),this.retryConfig.maxRetries):{result:this.executeDispatch(r,t),cancelRetry:()=>{}};this.eventEmitter.emit("dispatch",r);const s=this.idGenerator.getId();this.runningTask.set(s,n),n.result.then(e=>(i.forEach(e=>{var t;null===(t=this.eventStore)||void 0===t||t.remove(e.id),!e.notStored&&this.eventCountInStore&&this.eventCountInStore--}),Promise.resolve())).catch(e=>{var t;null===(t=this.logger)||void 0===t||t.error(e)}).finally(()=>{this.runningTask.delete(s),i.forEach(e=>this.dispatchingEvents.delete(e.id))})}flush(e=!1){return Se(this,void 0,void 0,(function*(){const t=this.createNewBatch();t&&(this.dispatchRepeater.reset(),this.dispatchBatch(t,e))}))}process(e){return Se(this,void 0,void 0,(function*(){if(!this.isRunning())return Promise.reject(new F("50","BatchEventProcessor"));const t={id:this.idGenerator.getId(),event:e};yield this.storeEvent(t),this.eventQueue.length>0&&!Ze(this.eventQueue[0].event,e)&&this.flush(),this.eventQueue.push(t),this.eventQueue.length==this.batchSize?this.flush():this.dispatchRepeater.isRunning()||this.dispatchRepeater.start()}))}readEventCountInStore(e){var t;return Se(this,void 0,void 0,(function*(){if(void 0===this.eventCountInStore)try{const t=yield e.getKeys();this.eventCountInStore=t.length}catch(e){null===(t=this.logger)||void 0===t||t.error(e)}}))}findEventCountInStore(){return Se(this,void 0,void 0,(function*(){if(this.eventStore&&void 0===this.eventCountInStore){const e=this.eventStore;return this.eventCountWaitPromise=this.eventCountWaitPromise.then(()=>this.readEventCountInStore(e)),this.eventCountWaitPromise}return Promise.resolve()}))}storeEvent(e){var t,r;return Se(this,void 0,void 0,(function*(){if(yield this.findEventCountInStore(),void 0!==this.eventCountInStore&&this.eventCountInStore>=this.maxEventsInStore)return null===(t=this.logger)||void 0===t||t.info("Event store is full. Not saving event with id %d.",e.event.uuid),void(e.notStored=!0);yield Promise.resolve(null===(r=this.eventStore)||void 0===r?void 0:r.set(e.id,e)).then(()=>{void 0!==this.eventCountInStore&&this.eventCountInStore++}).catch(t=>{var r;e.notStored=!0,null===(r=this.logger)||void 0===r||r.error(t)})}))}start(){var e;this.isNew()&&(super.start(),this.state=ye.Running,this.disposable||null===(e=this.failedEventRepeater)||void 0===e||e.start(),this.retryFailedEvents(),this.startPromise.resolve())}makeDisposable(){var e,t,r;super.makeDisposable(),this.batchSize=1,this.retryConfig={maxRetries:Math.min(null!==(t=null===(e=this.retryConfig)||void 0===e?void 0:e.maxRetries)&&void 0!==t?t:5,5),backoffProvider:(null===(r=this.retryConfig)||void 0===r?void 0:r.backoffProvider)||(()=>new Me(1e3,32e3,500))}}stop(){var e;this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(w("%s stopped before running","BatchEventProcessor"))),this.state=ye.Stopping,this.dispatchRepeater.stop(),null===(e=this.failedEventRepeater)||void 0===e||e.stop(),this.flush(!0),this.runningTask.forEach(e=>e.cancelRetry()),Promise.allSettled(Array.from(this.runningTask.values()).map(e=>e.result)).then(()=>{this.state=ye.Terminated,this.stopPromise.resolve()}))}}const st=Symbol(),ot=e=>{if(!e||"object"!=typeof e||"function"!=typeof e.dispatchEvent)throw new Error("Invalid event dispatcher")},at=e=>({[st]:e}),lt=(e,t=nt)=>at(((e,t=nt)=>{const{eventDispatcher:r,closingEventDispatcher:i,retryOptions:n,eventStore:s}=e;ot(r),i&&ot(i),s&&Ce(s);const o=n?{maxRetries:n.maxRetries,backoffProvider:()=>{var e,t;const r=null!==(e=null==n?void 0:n.minBackoff)&&void 0!==e?e:1e3,i=null!==(t=null==n?void 0:n.maxBackoff)&&void 0!==t?t:32e3;return new Me(r,i,500)}}:void 0,a=[],{defaultFlushInterval:l,defaultBatchSize:u}=e;let c=l;void 0===e.flushInterval||e.flushInterval<=0?a.push({level:P.Warn,message:"Invalid flushInterval %s, defaulting to %s",params:[e.flushInterval,l]}):c=e.flushInterval;let d=u;void 0===e.batchSize||e.batchSize<=0?a.push({level:P.Warn,message:"Invalid batchSize %s, defaulting to %s",params:[e.batchSize,u]}):d=e.batchSize;return new t({eventDispatcher:r,closingEventDispatcher:i,dispatchRepeater:new Re(c),failedEventRepeater:e.failedEventRetryInterval?new Re(e.failedEventRetryInterval):void 0,retryConfig:o,batchSize:d,eventStore:s,startupLogs:a})})(e,t));class ut{constructor(e,t){this.operation="sync",this.data=new Map,this.maxSize=e,this.ttl=t}lookup(e){const t=this.data.get(e);if(t&&(this.data.delete(e),!(t.expiresAt&&t.expiresAt<=Date.now())))return this.data.set(e,t),t.value}save(e,t){if(this.data.delete(e),this.data.size===this.maxSize){const e=this.data.keys().next().value;this.data.delete(e)}this.data.set(e,{value:t,expiresAt:this.ttl?Date.now()+this.ttl:void 0})}remove(e){this.data.delete(e)}reset(){this.data.clear()}getKeys(){return Array.from(this.data.keys())}}var ct,dt;!function(e){e.VUID="vuid",e.FS_USER_ID="fs_user_id",e.FS_USER_ID_ALIAS="fs-user-id"}(ct||(ct={})),function(e){e.IDENTIFIED="identified",e.INITIALIZED="client_initialized"}(dt||(dt={}));class ht extends be{constructor(e){super(e.startUpLogs),this.queue=[],this.apiManager=e.apiManager,this.batchSize=e.batchSize,this.retryConfig=e.retryConfig,this.repeater=e.repeater,this.repeater.setTask(()=>this.flush())}setLogger(e){this.logger=e,this.logger.setName("OdpEventManager"),this.apiManager.setLogger(e.child())}executeDispatch(e,t){return Se(this,void 0,void 0,(function*(){const r=yield this.apiManager.sendEvents(e,t);return r.statusCode&&!xe(r.statusCode)?Promise.reject(new F("9",r.statusCode)):yield Promise.resolve(r)}))}flush(){return Se(this,void 0,void 0,(function*(){if(!this.odpIntegrationConfig||!this.odpIntegrationConfig.integrated)return;const e=this.odpIntegrationConfig.odpConfig,t=this.queue;return this.queue=[],this.repeater.reset(),Le(()=>this.executeDispatch(e,t),this.retryConfig.backoffProvider(),this.retryConfig.maxRetries).result.catch(e=>{var t;null===(t=this.logger)||void 0===t||t.error("10",e)})}))}start(){this.isNew()&&(super.start(),this.odpIntegrationConfig?this.goToRunningState():this.state=ye.Starting)}makeDisposable(){super.makeDisposable(),this.retryConfig.maxRetries=Math.min(this.retryConfig.maxRetries,5),this.batchSize=1}updateConfig(e){if(!this.isDone())if(this.isNew())this.odpIntegrationConfig=e;else{if(this.isStarting())return this.odpIntegrationConfig=e,void this.goToRunningState();this.flush(),this.odpIntegrationConfig=e}}goToRunningState(){this.state=ye.Running,this.startPromise.resolve()}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(w("%s stopped before running","OdpEventManager"))),this.flush(),this.state=ye.Terminated,this.stopPromise.resolve())}sendEvent(e){var t,r,i,n,s,o;this.isRunning()?(null===(r=this.odpIntegrationConfig)||void 0===r?void 0:r.integrated)?0!==e.identifiers.size?this.isDataValid(e.data)?e.action?(""===e.type&&(e.type="fullstack"),Array.from(e.identifiers.entries()).forEach(([t,r])=>{ct.FS_USER_ID_ALIAS!==t.toLowerCase()&&ct.FS_USER_ID!==t.toLowerCase()||(e.identifiers.delete(t),e.identifiers.set(ct.FS_USER_ID,r))}),this.processEvent(e)):null===(o=this.logger)||void 0===o||o.error("5"):null===(s=this.logger)||void 0===s||s.error("6"):null===(n=this.logger)||void 0===n||n.error("38"):null===(i=this.logger)||void 0===i||i.error("42"):null===(t=this.logger)||void 0===t||t.error("50","OdpEventManager")}isDataValid(e){const t=["string","number","boolean"];return Array.from(e.values()).reduce((e,r)=>e&&(null===r||t.includes(typeof r)),!0)}processEvent(e){this.queue.push(e),this.queue.length===this.batchSize?this.flush():this.repeater.isRunning()||this.repeater.start()}}class gt{constructor(e,t,r,i){this.type=e,this.action=t,this.identifiers=null!=r?r:new Map,this.data=null!=i?i:new Map}}const pt=e=>e.startsWith("vuid_")&&e.length>"vuid_".length;class ft extends be{constructor(e){if(super(),this.clientEngine="javascript-sdk",this.clientVersion="6.1.0",this.segmentManager=e.segmentManager,this.eventManager=e.eventManager,this.configPromise=me(),e.userAgentParser){const{os:t,device:r}=e.userAgentParser.parseUserAgentInfo(),i={os:t.name,os_version:t.version,device_type:r.type,model:r.model};this.userAgentData=new Map(Object.entries(i).filter(([e,t])=>null!=t&&null!=t))}e.logger&&this.setLogger(e.logger)}setLogger(e){this.logger=e,this.logger.setName("OdpManager"),this.eventManager.setLogger(e.child()),this.segmentManager.setLogger(e.child())}setClientInfo(e,t){this.clientEngine=e,this.clientVersion=t}start(){if(!this.isNew())return;this.state=ye.Starting,this.eventManager.start();const e=[this.configPromise,this.eventManager.onRunning()];Promise.all(e).then(()=>{this.handleStartSuccess()}).catch(e=>{this.handleStartFailure(e)})}makeDisposable(){super.makeDisposable(),this.eventManager.makeDisposable()}handleStartSuccess(){this.isDone()||(this.state=ye.Running,this.startPromise.resolve())}handleStartFailure(e){this.isDone()||(this.state=ye.Failed,this.startPromise.reject(e),this.stopPromise.reject(e))}stop(){this.isDone()||(this.isRunning()||this.startPromise.reject(new Error(w("%s stopped before running","OdpManager"))),this.state=ye.Stopping,this.eventManager.stop(),this.eventManager.onTerminated().then(()=>{this.state=ye.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=ye.Failed,this.stopPromise.reject(e)}))}updateConfig(e){return!(this.odpIntegrationConfig&&(t=this.odpIntegrationConfig,r=e,!(t.integrated!==r.integrated||t.integrated&&r.integrated&&!t.odpConfig.equals(r.odpConfig))))&&(!this.isDone()&&(this.odpIntegrationConfig=e,this.configPromise.resolve(),this.segmentManager.updateConfig(e),this.eventManager.updateConfig(e),!0));var t,r}fetchQualifiedSegments(e,t=[]){return Se(this,void 0,void 0,(function*(){return pt(e)?this.segmentManager.fetchQualifiedSegments(ct.VUID,e,t):this.segmentManager.fetchQualifiedSegments(c