@optimizely/optimizely-sdk
Version:
JavaScript SDK for Optimizely Feature Experimentation, Optimizely Full Stack (legacy), and Optimizely Rollouts
1 lines • 125 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).optimizelySdk={})}(this,function(e){"use strict";for(var t,r=[],i=0;i<256;++i)r.push((i+256).toString(16).slice(1));var n=new Uint8Array(16);function s(){if(!t&&!(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(n)}var o={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function a(e,t,i){if(o.randomUUID&&!e)return o.randomUUID();var n=(e=e||{}).random||(e.rng||s)();return n[6]=15&n[6]|64,n[8]=63&n[8]|128,function(e,t=0){return(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase()}(n)}const l=Math.pow(2,53);function u(e){return"number"==typeof e&&Math.abs(e)<=l}function c(e,t){if(!e)return{};const r={};return d(e,t,r),r}function d(e,t,r){e&&e.forEach(e=>{r[e[t]]=e})}function h(e){return Object.keys(e).map(t=>e[t])}function g(e){return Object.keys(e).map(t=>[t,e[t]])}function p(e,t){let r;for(const i of e)if(t(i)){r=i;break}return r}function f(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 v(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}var m={checkArrayEquality:v,currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:u,keyBy:c,uuid:function(){return a()},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)}),h(r)},objectValues:h,objectEntries:g,find:p,sprintf:f};class y extends Error{constructor(e,...t){super(),this.resolved=!1,this.name="OptimizelyError",this.baseMessage=e,this.params=t,Object.setPrototypeOf(this,y.prototype)}setMessage(e){this.resolved||(this.message=f(e.resolve(this.baseMessage),...this.params),this.resolved=!0)}}const b="12",E="27",I="35",S="53",x="57",O="59",k="61",w=["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.","Event store is full. Not saving event with id %d.","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 manager stopped before it could start","ODP Manager is missing. %s failed.","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."],M={dispatchEvent:function(e){const{params:t,url:r}=e,i=new Blob([JSON.stringify(t)],{type:"application/json"});return navigator.sendBeacon(r,i)?Promise.resolve({}):Promise.reject(new y("50"))}};var C;e.LogLevel=void 0,(C=e.LogLevel||(e.LogLevel={}))[C.Debug=0]="Debug",C[C.Info=1]="Info",C[C.Warn=2]="Warn",C[C.Error=3]="Error";const R={[e.LogLevel.Debug]:"DEBUG",[e.LogLevel.Info]:"INFO",[e.LogLevel.Warn]:"WARN",[e.LogLevel.Error]:"ERROR"},A={[e.LogLevel.Debug]:"debug",[e.LogLevel.Info]:"info",[e.LogLevel.Warn]:"warn",[e.LogLevel.Error]:"error"};class P{constructor(e){this.prefix=e||"[OPTIMIZELY]"}log(e,t){const r=`${this.prefix} - ${R[e]} ${this.getTime()} ${t}`;this.consoleLog(e,r)}getTime(){return(new Date).toISOString()}consoleLog(e,t){(console[A[e]]||console.log).call(console,t)}}class D{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 D({logHandler:this.logHandler,infoMsgResolver:this.infoResolver,errorMsgResolver:this.errorResolver,level:this.level,name:e})}setName(e){this.name=e,this.prefix=`${e}: `}info(t,...r){this.log(e.LogLevel.Info,t,r)}debug(t,...r){this.log(e.LogLevel.Debug,t,r)}warn(t,...r){this.log(e.LogLevel.Warn,t,r)}error(t,...r){this.log(e.LogLevel.Error,t,r)}handleLog(e,t,r){const i=r.length>0?`${this.prefix}${f(t,...r)}`:`${this.prefix}${t}`;this.logHandler.log(e,i)}log(t,r,i){if(t<this.level)return;if(r instanceof Error)return r instanceof y&&r.setMessage(this.errorResolver),void this.handleLog(t,r.message,[]);let n=this.errorResolver;if(t<e.LogLevel.Warn){if(!this.infoResolver)return;n=this.infoResolver}const s=n.resolve(r);this.handleLog(t,s,i)}}const T="30",F=["Adding Authorization header with Bearer Token",'Audience "%s" evaluated to %s.',"CMAB cache attributes mismatch for user %s and rule %s, fetching new decision.","Cache hit for user %s and rule %s.","Cache miss for user %s and rule %s.",'Starting to evaluate audience "%s" with conditions: %s.','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".',"Ignoring CMAB cache for user %s and rule %s.","Invalidating CMAB cache for user %s and rule %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.',"Resetting CMAB cache for user %s and rule %s.","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."],j={resolve(e){const t=parseInt(e);return F[t]||e}},_={resolve(e){const t=parseInt(e);return w[t]||e}},N={level:e.LogLevel.Debug,infoResolver:j,errorResolver:_},U={level:e.LogLevel.Info,infoResolver:j,errorResolver:_},L={level:e.LogLevel.Warn,errorResolver:_},V={level:e.LogLevel.Error,errorResolver:_},K=Symbol(),q={[K]:N},z={[K]:U},B={[K]:L},H={[K]:V},$=Symbol();class J{constructor(e,t,r){this.errorHandler=e,this.messageResolver=t,this.name=r||""}notify(e){e instanceof y&&e.setMessage(this.messageResolver),this.errorHandler.handleError(e)}child(e){return new J(this.errorHandler,this.messageResolver,e)}}const G=Symbol(),W=["and","or","not"];function Q(e,t){if(Array.isArray(e)){let r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===W.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=Q(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=Q(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=Q(e[i],t);if(!0===n)return!0;null===n&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}class X{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=X.getAudiences(e),this.events=e.events,this.revision=e.revision;const s=(e.featureFlags||[]).reduce((e,t)=>(e[t.id]=t.variables,e),{}),o=X.getVariableIdMap(e),{experimentsMapById:a,experimentsMapByKey:l}=X.getExperimentsMap(e,s,o,r);this.experimentsMap=l,this.featuresMap=X.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=X.getSerializedAudiences(e,t),n=`(${n})`;else if(W.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?X.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=X.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:X.getExperimentAudiences(i,e),variationsMap:X.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=X.getVariationsMap(a.variations,t,r,u.toString()),d={id:a.id,key:a.key,audiences:X.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=X.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 Y="$opt_bot_filtering",Z="$opt_bucketing_id",ee="$opt_experiment_bucket_map",te="javascript-sdk",re="6.3.1",ie={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment",HOLDOUT:"holdout"},ne="rule",se="experiment",oe="boolean",ae="double",le="integer",ue="string",ce="json",de="Optimizely SDK not configured properly yet.",he='No flag was found for key "%s".',ge=["2","3","4"];var pe=function(e){if(!e)throw new y("32");if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new y("18")}if("object"!=typeof e||Array.isArray(e)||null===e)throw new y("18");if(-1===ge.indexOf(e.version))throw new y("19",e.version);return e};class fe{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&&v(this.segmentsToCheck,e.segmentsToCheck)}}const ve="Running",me="$opt_";const ye=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={},d(r.audiences,"id",r.audiencesById),d(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=c(r.events,"key"),r.groupIdMap=c(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=c(r.rollouts||[],"id"),h(r.rolloutIdMap||{}).forEach(e=>{(e.experiments||[]).forEach(e=>{e.isRollout=!0,r.experiments.push(e),e.variationKeyMap=c(e.variations,"key")})});const n=new Set;Object.keys(r.audiencesById).map(e=>Ee(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=c(r.integrations,"key"),r.integrations.forEach(e=>{if(!("key"in e))throw new y("29");"odp"===e.key&&(o=!0,l=l||e.publicKey||"",a=a||e.host||"",u=u||e.pixelUrl||"")})),r.odpIntegrationConfig=o?{integrated:!0,odpConfig:new fe(l,a,u,s)}:{integrated:!1},r.experimentKeyMap=c(r.experiments,"key"),r.experimentIdMap=c(r.experiments,"id"),r.variationIdMap={},r.variationVariableUsageMap={},(r.experiments||[]).forEach(e=>{e.variationKeyMap=c(e.variations,"key"),d(e.variations,"id",r.variationIdMap),h(e.variationKeyMap||{}).forEach(e=>{e.variables&&(r.variationVariableUsageMap[e.id]=c(e.variables,"id"))})}),r.experimentFeatureMap={},r.featureKeyMap=c(r.featureFlags||[],"key"),h(r.featureKeyMap||{}).forEach(e=>{e.variables.forEach(e=>{e.type===ue&&e.subType===ce&&(e.type=ce,delete e.subType)}),e.variableKeyMap=c(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={},g(r.flagRulesMap||{}).forEach(([e,t])=>{const i=[];t.forEach(e=>{e.variations.forEach(e=>{p(i,t=>t.id===e.id)||i.push(e)})}),r.flagVariationsMap[e]=i}),be(r),r},be=e=>{e.holdouts=e.holdouts||[],e.holdoutIdMap=c(e.holdouts,"id"),e.globalHoldouts=[],e.includedHoldouts={},e.excludedHoldouts={},e.flagHoldoutsMap={};const t=c(e.featureFlags,"id");e.holdouts.forEach(r=>{r.includedFlags||(r.includedFlags=[]),r.excludedFlags||(r.excludedFlags=[]),r.variationKeyMap=c(r.variations,"key"),d(r.variations,"id",e.variationIdMap),0===r.includedFlags.length?(e.globalHoldouts.push(r),r.excludedFlags.forEach(i=>{const n=t[i];if(n){const t=n.key;e.excludedHoldouts[t]||(e.excludedHoldouts[t]=[]),e.excludedHoldouts[t].push(r)}})):r.includedFlags.forEach(i=>{const n=t[i];if(n){const t=n.key;e.includedHoldouts[t]||(e.includedHoldouts[t]=[]),e.includedHoldouts[t].push(r)}})})},Ee=function(e){return e.conditions?Ie(e.conditions):[]},Ie=e=>{const t=[];return function(e){return["and","or","not"].includes(e)}(e)?[]:(Array.isArray(e)?e.forEach(e=>t.push(...Ie(e))):"qualified"===e.match&&t.push(e.value),t)};const Se=function(e,t){const r=e.experimentKeyMap[t];if(!r)throw new y("22",t);return r.status},xe=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){const r=e.experimentKeyMap[t];if(r)return r}throw new y("9",t)},Oe=function(e,t,r){if(!e)return null;const i=p(e.flagVariationsMap[t],e=>e.key===r);return i||null},ke=function(e,t,r){if(e.featureKeyMap.hasOwnProperty(t)){const r=e.featureKeyMap[t];if(r)return r}return null==r||r.error(b,t),null},we=function(e){return!!e.sendFlagDecisions},Me=()=>{};function Ce(){let e=Me,t=Me;const r=new Promise((r,i)=>{e=r,t=i});return{promise:r,resolve:e,reject:t,then:r.then.bind(r)}}const Re="%s failed to start, reason: %s",Ae="%s stopped before running";var Pe;!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"}(Pe||(Pe={}));class De{constructor(e=[]){this.disposable=!1,this.state=Pe.New,this.startPromise=Ce(),this.stopPromise=Ce(),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=A[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===Pe.Starting}isRunning(){return this.state===Pe.Running}isNew(){return this.state===Pe.New}isDone(){return[Pe.Stopping,Pe.Terminated,Pe.Failed].includes(this.state)}start(){this.printStartupLogs()}}class Te{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 Fe extends De{constructor(e){super(),this.eventEmitter=new Te,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=Pe.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=Pe.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(Re,"DatafileManager",e.message),this.isStarting()&&this.handleInitError(new Error(f(Re,"DatafileManager",e.message)))}handleNewDatafile(e,t=!1){var r,i;if(!this.isDone())try{const t=function(e){var t,r;const i=pe(e.datafile);e.jsonSchemaValidator?(e.jsonSchemaValidator(i),null===(t=e.logger)||void 0===t||t.info("38")):null===(r=e.logger)||void 0===r||r.info("28");const n=[i];return"string"==typeof e.datafile&&n.push(e.datafile),ye(...n)}({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:this.logger});this.isStarting()&&(this.state=Pe.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 X(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(f(Ae,"ProjectConfigManager"))),this.state=Pe.Stopping,this.eventEmitter.removeAllListeners(),!this.datafileManager)return this.state=Pe.Terminated,void this.stopPromise.resolve();this.datafileManager.stop(),this.datafileManager.onTerminated().then(()=>{this.state=Pe.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=Pe.Failed,this.stopPromise.reject(e)})}}}function je(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 _e=e=>e>=200&&e<400;class Ne extends De{constructor(e){super(e.startupLogs);const{autoUpdate:t=!1,sdkKey:r,datafileAccessToken:i,customHeaders:n,urlTemplate:s,cache:o,initRetry:a,repeater:l,requestHandler:u,logger:c}=e;this.cache=o,this.cacheKey="opt-datafile-"+r,this.sdkKey=r,this.datafileAccessToken=i,this.customHeaders=n,this.requestHandler=u,this.emitter=new Te,this.autoUpdate=t,this.initRetryRemaining=a,this.repeater=l,c&&this.setLogger(c);const d=s||(i?"https://config.optimizely.com/datafiles/auth/%s.json":"https://cdn.optimizely.com/datafiles/%s.json");this.datafileUrl=f(d,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=Pe.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(f(Ae,"PollingDatafileManager"))),this.state=Pe.Terminated,this.repeater.stop(),null===(e=this.currentRequest)||void 0===e||e.abort(),this.emitter.removeAllListeners(),this.stopPromise.resolve())}handleInitFailure(){this.state=Pe.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 je(this,void 0,void 0,function*(){return this.handleError(e),Promise.reject(e)})}onRequestResolved(e){return je(this,void 0,void 0,function*(){if(this.isDone())return;if(this.saveLastModified(e.headers),!_e(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=Object.assign({},this.customHeaders);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("17",this.datafileUrl,()=>JSON.stringify(r)),this.requestHandler.makeRequest(this.datafileUrl,r,"GET")}syncDatafile(){return je(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=Pe.Running),this.emitter.emit("update",e))}getDatafileFromResponse(e){var t;if(null===(t=this.logger)||void 0===t||t.debug("23",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("24",this.lastResponseLastModified))}setDatafileFromCacheIfAvailable(){return je(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 Ue{constructor(e,t,r){this.base=e,this.max=t,this.maxJitter=r,this.maxJitter>this.base/2&&(this.maxJitter=this.base/2),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 Le{constructor(e){this.value=e}backoff(){return this.value}reset(){}}class Ve{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 Ke=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(", "))},qe="Invalid config manager",ze=Symbol(),Be=t=>{var r;t.cache&&Ke(t.cache);const i=null!==(r=t.updateInterval)&&void 0!==r?r:3e5,n=new Ue(1e3,i,500),s=new Ve(i,n),o=[];i<3e4&&o.push({level:e.LogLevel.Warn,message:"Polling intervals below 30 seconds are not recommended.",params:[]});const a={sdkKey:t.sdkKey,autoUpdate:t.autoUpdate,urlTemplate:t.urlTemplate,datafileAccessToken:t.datafileAccessToken,customHeaders:t.customHeaders,requestHandler:t.requestHandler,cache:t.cache,repeater:s,startupLogs:o},l=new Ne(a);return new Fe({datafile:t.datafile,datafileManager:l,jsonSchemaValidator:t.jsonSchemaValidator})};class He{constructor(){this.operation="sync"}}class $e{constructor(){this.operation="async"}}const Je=(e,t)=>e instanceof He?e.getBatched(t):t.map(t=>e.get(t)),Ge=(e,t)=>e instanceof $e?e.getBatched(t):Promise.all(t.map(t=>e.get(t)));class We extends He{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 Qe{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 je(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 je(this,void 0,void 0,function*(){return this.cache.getKeys().then(e=>e.filter(e=>e.startsWith(this.prefix)))})}getKeys(){return je(this,void 0,void 0,function*(){return this.getInternalKeys().then(e=>e.map(e=>this.removePrefix(e)))})}getBatched(e){return je(this,void 0,void 0,function*(){return(yield Ge(this.cache,e.map(e=>this.addPrefix(e)))).map(e=>e?this.transformGet(e):void 0)})}}const Xe="campaign_activated",Ye="custom",Ze={US:"https://logx.optimizely.com/v1/events",EU:"https://eu.logx.optimizely.com/v1/events"};function et(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:Y,key:Y,type:Ye,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:Xe,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 tt(e){var t;const r=(null===(t=e[0])||void 0===t?void 0:t.context.region)||"US";return{url:Ze[r]||Ze.US,httpVerb:"POST",params:et(e)}}const rt=(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 y("49"));const a=null!==(o=null==i?void 0:i.backoff())&&void 0!==o?o:0;setTimeout(()=>{rt(e,t,r,i,n=void 0===n?void 0:n-1)},a)})},it=(e,t,r)=>{const i=Ce(),n={cancelled:!1};return rt(e,i,n,t,r),{cancelRetry:()=>{n.cancelled=!0},result:i.promise}};class nt{constructor(){this.idSuffixOffset=0}getId(){const e=1e4+this.idSuffixOffset;this.idSuffixOffset=(this.idSuffixOffset+1)%1e4;return`${Date.now()}${e}`}}function st(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function ot(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function at(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==r&&r}const lt={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables",FLAG:"flag"},ut={ACTIVATE:"ACTIVATE",DECISION:"DECISION",LOG_EVENT:"LOG_EVENT",OPTIMIZELY_CONFIG_UPDATE:"OPTIMIZELY_CONFIG_UPDATE",TRACK:"TRACK"};var ct,dt;!function(e){e.BOOLEAN="boolean",e.DOUBLE="double",e.INTEGER="integer",e.STRING="string",e.JSON="json"}(ct||(ct={})),e.OptimizelyDecideOption=void 0,(dt=e.OptimizelyDecideOption||(e.OptimizelyDecideOption={})).DISABLE_DECISION_EVENT="DISABLE_DECISION_EVENT",dt.ENABLED_FLAGS_ONLY="ENABLED_FLAGS_ONLY",dt.IGNORE_USER_PROFILE_SERVICE="IGNORE_USER_PROFILE_SERVICE",dt.INCLUDE_REASONS="INCLUDE_REASONS",dt.EXCLUDE_VARIABLES="EXCLUDE_VARIABLES",dt.IGNORE_CMAB_CACHE="IGNORE_CMAB_CACHE",dt.RESET_CMAB_CACHE="RESET_CMAB_CACHE",dt.INVALIDATE_USER_CMAB_CACHE="INVALIDATE_USER_CMAB_CACHE";const ht=(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},gt=({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:n,type:s})=>({type:s,timestamp:m.currentTimestamp(),uuid:m.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:vt(e,r)}}),pt=function({configObj:e,decisionObj:t,userId:r,flagKey:i,enabled:n,userAttributes:s,clientEngine:o,clientVersion:a}){const l=t.decisionSource,u=st(t),c=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),d=ot(t),h=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),g=t.cmabUuid,p=null!==c?l===ie.HOLDOUT?"":function(e,t){const r=e.experimentIdMap[t];if(!r)throw new y("21",t);return r.layerId}(e,c):null;return Object.assign(Object.assign({},gt({configObj:e,userId:r,userAttributes:s,clientEngine:o,clientVersion:a,type:"impression"})),{layer:{id:p},experiment:{id:c,key:u},variation:{id:h,key:d},ruleKey:u,flagKey:i,ruleType:l,enabled:n,cmabUuid:g})},ft=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("21",i),i):(null==t||t.info("6",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("20",i),i):(null==t||t.info("7",r),null)}(o,a):null;return Object.assign(Object.assign({},gt({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:n,type:"conversion"})),{event:{id:l,key:s},revenue:u,value:c,tags:o})},vt=(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||m.isNumber(t)&&m.isSafeInteger(t))}(n,s)){const t=function(e,t,r){const i=e.attributeKeyMap[t],n=0===t.indexOf(me);return i?(n&&(null==r||r.warn("58",t,me)),i.id):n?t:(null==r||r.warn("62",t),null)}(e,n,r);t&&i.push({entityId:t,key:n,value:s})}}),i};class mt extends De{constructor(e){var t;super(e.startupLogs),this.eventQueue=[],this.idGenerator=new nt,this.runningTask=new Map,this.dispatchingEvents=new Map,this.eventEmitter=new Te,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.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 je(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):Ge(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&&!ht(n[0].event,e.event))&&(i.push({request:tt(n.map(e=>e.event)),events:n}),n=[]),n.push(e)}),n.length>0&&i.push({request:tt(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:tt(e),events:t}}executeDispatch(e,t=!1){return je(this,void 0,void 0,function*(){return(t&&this.closingEventDispatcher?this.closingEventDispatcher:this.eventDispatcher).dispatchEvent(e).then(e=>e.statusCode&&!_e(e.statusCode)?Promise.reject(new y("10",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?it(()=>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)}),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 je(this,void 0,void 0,function*(){const t=this.createNewBatch();t&&(this.dispatchRepeater.reset(),this.dispatchBatch(t,e))})}process(e){var t;return je(this,void 0,void 0,function*(){if(!this.isRunning())return Promise.reject(new y("51","BatchEventProcessor"));const r={id:this.idGenerator.getId(),event:e};yield Promise.resolve(null===(t=this.eventStore)||void 0===t?void 0:t.set(r.id,r)).catch(e=>{var t;null===(t=this.logger)||void 0===t||t.error(e)}),this.eventQueue.length>0&&!ht(this.eventQueue[0].event,e)&&this.flush(),this.eventQueue.push(r),this.eventQueue.length==this.batchSize?this.flush():this.dispatchRepeater.isRunning()||this.dispatchRepeater.start()})}start(){var e;this.isNew()&&(super.start(),this.state=Pe.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 Ue(200,1e3,500))}}flushImmediately(){return this.isRunning()?this.flush(!0):Promise.resolve()}stop(){var e;this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(f(Ae,"BatchEventProcessor"))),this.state=Pe.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=Pe.Terminated,this.stopPromise.resolve()}))}}class yt{constructor(){this.waitPromise=Promise.resolve()}run(e){const t=this.waitPromise.then(e);return this.waitPromise=t.catch(()=>{}),t}}const bt=e=>e,Et="optly_event:";class It extends $e{constructor(e){super(),this.operation="async",this.serializer=new yt;const{maxSize:t,ttl:r,store:i,logger:n}=e;"sync"===i.operation?this.store=new We(i,Et,bt,bt):this.store=new Qe(i,Et,bt,bt),n&&(n.setName("EventStore"),this.logger=n),this.maxSize=t||500,this.ttl=r||864e6}readKeys(){return je(this,void 0,void 0,function*(){return this.serializer.run(()=>je(this,void 0,void 0,function*(){var e;if(void 0===this.keys)try{this.keys=new Set(yield this.getKeys())}catch(t){null===(e=this.logger)||void 0===e||e.error(t)}}))})}set(e,t){var r;return je(this,void 0,void 0,function*(){return yield this.readKeys(),void 0!==this.keys&&this.keys.size>=this.maxSize?Promise.reject(new y("8",t.event.uuid)):(null===(r=this.keys)||void 0===r||r.add(e),this.store.set(e,Object.assign(Object.assign({},t),{_time:{storedAt:Date.now(),ttl:this.ttl}})))})}processStoredEvent(e,t){if(t){if(void 0===t._time)return t._time={storedAt:Date.now(),ttl:this.ttl},this.set(e,t).catch(()=>{}),t;if(!(t._time.storedAt+this.ttl<=Date.now()))return t;this.remove(e).catch(()=>{})}}get(e){return je(this,void 0,void 0,function*(){const t=yield this.store.get(e);return this.processStoredEvent(e,t)})}remove(e){var t;return je(this,void 0,void 0,function*(){yield this.store.remove(e),null===(t=this.keys)||void 0===t||t.delete(e)})}getKeys(){return je(this,void 0,void 0,function*(){const e=yield this.store.getKeys();return this.keys=new Set(e),e})}getBatched(e){return je(this,void 0,void 0,function*(){return(yield this.store.getBatched(e)).map((t,r)=>this.processStoredEvent(e[r],t))})}}class St extends De{constructor(e){super(),this.dispatcher=e,this.eventEmitter=new Te}process(e){const t=tt([e]),r=this.dispatcher.dispatchEvent(t);return this.eventEmitter.emit("dispatch",t),r}start(){this.isNew()&&(this.state=Pe.Running,this.startPromise.resolve())}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(f(Ae,"ForwardingEventProcessor"))),this.state=Pe.Terminated,this.stopPromise.resolve())}onDispatch(e){return this.eventEmitter.on("dispatch",e)}flushImmediately(){return Promise.resolve()}}const xt=Symbol(),Ot=e=>{if(!e||"object"!=typeof e||"function"!=typeof e.dispatchEvent)throw new Error("Invalid event dispatcher")},kt=e=>({[xt]:e}),wt=(t,r=mt)=>kt(((t,r=mt)=>{const{eventDispatcher:i,closingEventDispatcher:n,retryOptions:s,eventStore:o}=t;Ot(i),n&&Ot(n),o&&Ke(o);const a=s?{maxRetries:s.maxRetries,backoffProvider:()=>{var e,t;const r=null!==(e=null==s?void 0:s.minBackoff)&&void 0!==e?e:200,i=null!==(t=null==s?void 0:s.maxBackoff)&&void 0!==t?t:1e3;return new Ue(r,i,50)}}:void 0,l=[],{defaultFlushInterval:u,defaultBatchSize:c}=t;let d=u;void 0===t.flushInterval||t.flushInterval<=0?l.push({level:e.LogLevel.Warn,message:"Invalid flushInterval %s, defaulting to %s",params:[t.flushInterval,u]}):d=t.flushInterval;let h=c;return void 0===t.batchSize||t.batchSize<=0?l.push({level:e.LogLevel.Warn,message:"Invalid batchSize %s, defaulting to %s",params:[t.batchSize,c]}):h=t.batchSize,new r({eventDispatcher:i,closingEventDispatcher:n,dispatchRepeater:new Ve(d),failedEventRepeater:t.failedEventRetryInterval?new Ve(t.failedEventRetryInterval):void 0,retryConfig:a,batchSize:h,eventStore:o,startupLogs:l})})(t,r));class Mt{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())}}class Ct{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 je(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 Rt=(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 At,Pt;!function(e){e.VUID="vuid",e.FS_USER_ID="fs_user_id",e.FS_USER_ID_ALIAS="fs-user-id"}(At||(At={})),function(e){e.IDENTIFIED="identified",e.INITIALIZED="client_initialized"}(Pt||(Pt={}));const Dt="fullstack";class Tt extends De{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 je(this,void 0,void 0,function*(){const r=yield this.apiManager.sendEvents(e,t);return r.statusCode&&!_e(r.statusCode)?Promise.reject(new y("10",r.statusCode)):yield Promise.resolve(r)})}flush(){return je(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(),it(()=>this.executeDispatch(e,t),this.retryConfig.backoffProvider(),this.retryConfig.maxRetries).result.catch(e=>{var t;null===(t=this.logger)||void 0===t||t.error("11",e)})})}start(){this.isNew()&&(super.start(),this.odpIntegrationConfig?this.goToRunningState():this.state=Pe.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=Pe.Running,this.startPromise.resolve()}flushImmediately(){return this.isRunning()?this.flush():Promise.resolve()}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(f(Ae,"OdpEventManager"))),this.flush(),this.state=Pe.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=Dt),Array.from(e.identifiers.entries()).forEach(([t,r])=>{At.FS_USER_ID_ALIAS!==t.toLowerCase()&&At.FS_USER_ID!==t.toLowerCase()||(e.identifiers.delete(t),e.identifiers.set(At.FS_USER_ID,r))}),this.processEvent