@optimizely/optimizely-sdk
Version:
JavaScript SDK for Optimizely Feature Experimentation, Optimizely Full Stack (legacy), and Optimizely Rollouts
1 lines • 119 kB
JavaScript
import"fast-text-encoding";import"react-native-get-random-values";import{v4 as e}from"uuid";import{validate as t}from"json-schema";import i from"murmurhash";import{addEventListener as r}from"@react-native-community/netinfo";const s=Math.pow(2,53);function n(e){return"number"==typeof e&&Math.abs(e)<=s}function o(e,t){if(!e)return{};const i={};return a(e,t,i),i}function a(e,t,i){e&&e.forEach(e=>{i[e[t]]=e})}function l(e){return Object.keys(e).map(t=>e[t])}function u(e,t){let i;for(const r of e)if(t(r)){i=r;break}return i}function c(e,...t){let i=0;return e.replace(/%s/g,function(){const e=t[i++],r=typeof e;return"function"===r?e():"string"===r?e:String(e)})}function d(e,t){return e.length===t.length&&e.every((e,i)=>e===t[i])}var h,g={checkArrayEquality:d,currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:n,keyBy:o,uuid:function(){return e()},isNumber:function(e){return"number"==typeof e},getTimestamp:function(){return(new Date).getTime()},groupBy:function(e,t){const i={};return e.forEach(e=>{const r=t(e);i[r]=i[r]||[],i[r].push(e)}),l(i)},objectValues:l,objectEntries:function(e){return Object.keys(e).map(t=>[t,e[t]])},find:u,sprintf:c};class p extends Error{constructor(e,...t){super(),this.resolved=!1,this.name="OptimizelyError",this.baseMessage=e,this.params=t,Object.setPrototypeOf(this,p.prototype)}setMessage(e){this.resolved||(this.message=c(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"}(h||(h={}));const f={[h.Debug]:"DEBUG",[h.Info]:"INFO",[h.Warn]:"WARN",[h.Error]:"ERROR"},v={[h.Debug]:"debug",[h.Info]:"info",[h.Warn]:"warn",[h.Error]:"error"};class m{constructor(e){this.prefix=e||"[OPTIMIZELY]"}log(e,t){const i=`${this.prefix} - ${f[e]} ${this.getTime()} ${t}`;this.consoleLog(e,i)}getTime(){return(new Date).toISOString()}consoleLog(e,t){(console[v[e]]||console.log).call(console,t)}}class y{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 y({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(h.Info,e,t)}debug(e,...t){this.log(h.Debug,e,t)}warn(e,...t){this.log(h.Warn,e,t)}error(e,...t){this.log(h.Error,e,t)}handleLog(e,t,i){const r=i.length>0?`${this.prefix}${c(t,...i)}`:`${this.prefix}${t}`;this.logHandler.log(e,r)}log(e,t,i){if(e<this.level)return;if(t instanceof Error)return t instanceof p&&t.setMessage(this.errorResolver),void this.handleLog(e,t.message,[]);let r=this.errorResolver;if(e<h.Warn){if(!this.infoResolver)return;r=this.infoResolver}const s=r.resolve(t);this.handleLog(e,s,i)}}const b="31",E=["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.","ODP identify event is not dispatched (fewer than 2 valid identifiers).",'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."],I="12",S="28",x="37",k="55",M="59",R="61",w="63",C=["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.","Invalid request URL: %s","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.",'Local holdout "%s" is missing or has empty "includedRules"; skipping.',"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."],O={resolve(e){const t=parseInt(e);return E[t]||e}},A={resolve(e){const t=parseInt(e);return C[t]||e}},P={level:h.Debug,infoResolver:O,errorResolver:A},D={level:h.Info,infoResolver:O,errorResolver:A},T={level:h.Warn,errorResolver:A},F={level:h.Error,errorResolver:A},N=Symbol(),_={[N]:P},j={[N]:D},U={[N]:T},V={[N]:F},K=Symbol(),L=e=>{const{level:t,infoResolver:i,errorResolver:r}=(e=>{if(!e||"object"!=typeof e||!e[N])throw new Error("Invalid level preset");return e[N]})(e.level);e.logHandler&&(e=>{if("object"!=typeof e||"function"!=typeof e.log)throw new Error("Invalid log handler")})(e.logHandler);return{[K]:new y({name:"Optimizely",level:t,infoMsgResolver:i,errorMsgResolver:r,logHandler:e.logHandler||new m})}};class q{constructor(e,t,i){this.errorHandler=e,this.messageResolver=t,this.name=i||""}notify(e){e instanceof p&&e.setMessage(this.messageResolver),this.errorHandler.handleError(e)}child(e){return new q(this.errorHandler,this.messageResolver,e)}}const B=Symbol(),z=e=>((e=>{if(!e||"object"!=typeof e||"function"!=typeof e.handleError)throw new Error("Invalid error handler")})(e),{[B]:new q(e,A)}),H=["and","or","not"];function $(e,t){if(Array.isArray(e)){let i=e[0],r=e.slice(1);switch("string"==typeof i&&-1===H.indexOf(i)&&(i="or",r=e),i){case"and":return function(e,t){let i=!1;if(Array.isArray(e)){for(let r=0;r<e.length;r++){const s=$(e[r],t);if(!1===s)return!1;null===s&&(i=!0)}return!i||null}return null}(r,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){const i=$(e[0],t);return null===i?null:!i}return null}(r,t);default:return function(e,t){let i=!1;if(Array.isArray(e)){for(let r=0;r<e.length;r++){const s=$(e[r],t);if(!0===s)return!0;null===s&&(i=!0)}return!!i&&null}return null}(r,t)}}return t(e)}class J{constructor(e,t,i){var r,s;this.sdkKey=null!==(r=e.sdkKey)&&void 0!==r?r:"",this.environmentKey=null!==(s=e.environmentKey)&&void 0!==s?s:"",this.attributes=e.attributes,this.audiences=J.getAudiences(e),this.events=e.events,this.revision=e.revision;const n=(e.featureFlags||[]).reduce((e,t)=>(e[t.id]=t.variables,e),{}),o=J.getVariableIdMap(e),{experimentsMapById:a,experimentsMapByKey:l}=J.getExperimentsMap(e,n,o,i);this.experimentsMap=l,this.featuresMap=J.getFeaturesMap(e,n,a,o),this.datafile=t}getDatafile(){return this.datafile}static getAudiences(e){const t=[],i=[];return(e.typedAudiences||[]).forEach(e=>{t.push({id:e.id,conditions:JSON.stringify(e.conditions),name:e.name}),i.push(e.id)}),(e.audiences||[]).forEach(e=>{-1===i.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 i="";if(e){let r="";e.forEach(e=>{let s="";if(e instanceof Array)s=J.getSerializedAudiences(e,t),s=`(${s})`;else if(H.indexOf(e)>-1)r=e.toUpperCase();else{const s=t[e]?t[e].name:e;i||"NOT"===r?(r=""===r?"OR":r,i=""===i?`${r} "${t[e].name}"`:i.concat(` ${r} "${s}"`)):i=`"${s}"`}""!==s&&(""!==i||"NOT"===r?(r=""===r?"OR":r,i=""===i?`${r} ${s}`:i.concat(` ${r} ${s}`)):i=i.concat(s))})}return i}static getExperimentAudiences(e,t){return e.audienceConditions?J.getSerializedAudiences(e.audienceConditions,t.audiencesById):""}static mergeFeatureVariables(e,t,i,r,s){const n=(e[i]||[]).reduce((e,t)=>(e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e),{});return(r||[]).forEach(e=>{const i=t[e.id],r={id:e.id,key:i.key,type:i.type,value:s?e.value:i.defaultValue};n[i.key]=r}),n}static getVariationsMap(e,t,i,r){let s={};return s=e.reduce((e,s)=>{const n=J.mergeFeatureVariables(t,i,r,s.variables,s.featureEnabled);return e[s.key]={id:s.id,key:s.key,featureEnabled:s.featureEnabled,variablesMap:n},e},{}),s}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,i,r,s){return r.map(r=>({id:r.id,key:r.key,audiences:J.getExperimentAudiences(r,e),variationsMap:J.getVariationsMap(r.variations,t,s,i)}))}static getRolloutExperimentIds(e){const t=[];return(e||[]).forEach(e=>{e.experiments.forEach(e=>{t.push(e.id)})}),t}static getExperimentsMap(e,t,i,r){const s=this.getRolloutExperimentIds(e.rollouts),n={},o={};return(e.experiments||[]).forEach(a=>{if(-1!==s.indexOf(a.id))return;const l=e.experimentFeatureMap[a.id];let u="";l&&l.length>0&&(u=l[0]);const c=J.getVariationsMap(a.variations,t,i,u.toString()),d={id:a.id,key:a.key,audiences:J.getExperimentAudiences(a,e),variationsMap:c};n[a.id]=d,o[a.key]&&r&&r.warn(`Duplicate experiment keys found in datafile: ${a.key}`),o[a.key]=d}),{experimentsMapById:n,experimentsMapByKey:o}}static getExperimentsKeyMap(e){const t={};for(const i in e){const r=e[i];t[r.key]=r}return t}static getFeaturesMap(e,t,i,r){const s={};return e.featureFlags.forEach(n=>{const o={},a=[];n.experimentIds.forEach(e=>{const t=i[e];t&&(o[t.key]=t),a.push(i[e])});const l=(n.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[n.rolloutId];c&&(u=J.getDeliveryRules(e,t,n.id,c.experiments,r)),s[n.key]={id:n.id,key:n.key,experimentRules:a,deliveryRules:u,experimentsMap:o,variablesMap:l}}),s}}const G="$opt_bot_filtering",W="$opt_bucketing_id",Q="$opt_experiment_bucket_map",X="javascript-sdk",Y="react-native-js-sdk",Z="6.5.0",ee={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment",HOLDOUT:"holdout"},te="fr",ie="rule",re="experiment",se="boolean",ne="double",oe="integer",ae="string",le="json",ue="Optimizely SDK not configured properly yet.",ce='No flag was found for key "%s".';class de{constructor(e,t,i,r){this.apiKey=e,this.apiHost=t,this.pixelUrl=i,this.segmentsToCheck=r}equals(e){return this.apiHost===e.apiHost&&this.apiKey===e.apiKey&&this.pixelUrl===e.pixelUrl&&d(this.segmentsToCheck,e.segmentsToCheck)}}const he="Running",ge="$opt_",pe=Object.values({V2:"2",V3:"3",V4:"4"}),fe=function(e,t){var i,r;let s;try{s=JSON.parse(e)}catch(e){throw new p("18")}const n=s.version;if(-1===pe.indexOf(n))throw new p("19",n);return(null==t?void 0:t.jsonSchemaValidator)?(t.jsonSchemaValidator(s),null===(i=t.logger)||void 0===i||i.info("39")):null===(r=null==t?void 0:t.logger)||void 0===r||r.info("29"),s.region||(s.region="US"),s.__datafileStr=e,(e=>{(e.audiences||[]).forEach(e=>{e.conditions=JSON.parse(e.conditions)}),e.audiencesById={},a(e.audiences,"id",e.audiencesById),a(e.typedAudiences,"id",e.audiencesById)})(s),(e=>{e.attributes=e.attributes||[],e.attributeKeyMap={},e.attributeIdMap={},e.attributes.forEach(t=>{e.attributeKeyMap[t.key]=t,e.attributeIdMap[t.id]=t})})(s),s.eventKeyMap=o(s.events,"key"),(e=>{e.groupIdMap={},(e.groups||[]).forEach(t=>{e.groupIdMap[t.id]=t,(t.experiments||[]).forEach(i=>{i.groupId=t.id,e.experiments.push(i)})})})(s),(e=>{e.rolloutIdMap={},(e.rollouts||[]).forEach(t=>{e.rolloutIdMap[t.id]=t,(t.experiments||[]).forEach(t=>{t.isRollout=!0,e.experiments.push(t)})})})(s),(e=>{const t=new Set;Object.keys(e.audiencesById).forEach(i=>{be(e.audiencesById[i]).forEach(e=>{t.add(e)})});const i=Array.from(t);let r=!1,s="",n="",o="";e.integrationKeyMap={},(e.integrations||[]).forEach(t=>{if(!("key"in t))throw new p("31");e.integrationKeyMap[t.key]=t,"odp"===t.key&&(r=!0,n=n||t.publicKey||"",s=s||t.host||"",o=o||t.pixelUrl||"")}),e.odpIntegrationConfig=r?{integrated:!0,odpConfig:new de(n,s,o,i)}:{integrated:!1}})(s),(e=>{e.experimentKeyMap={},e.experimentIdMap={},e.variationIdMap={},e.variationVariableUsageMap={},(e.experiments||[]).forEach(t=>{e.experimentKeyMap[t.key]=t,e.experimentIdMap[t.id]=t,t.variationKeyMap={},(t.variations||[]).forEach(i=>{t.variationKeyMap[i.key]=i,e.variationIdMap[i.id]=i,i.variables&&(e.variationVariableUsageMap[i.id]=o(i.variables,"id"))})})})(s),(e=>{e.experimentFeatureMap={},e.featureKeyMap={},e.flagRulesMap={},e.flagVariationsMap={},(e.featureFlags||[]).forEach(t=>{e.featureKeyMap[t.key]=t,t.variableKeyMap={},t.variables.forEach(e=>{e.type===ae&&e.subType===le&&(e.type=le,delete e.subType),t.variableKeyMap[e.key]=e});const i=[],r={},s=ve(e,t);(t.experimentIds||[]).forEach(n=>{e.experimentFeatureMap[n]=e.experimentFeatureMap[n]||[],e.experimentFeatureMap[n].push(t.id);const o=e.experimentIdMap[n];i.push(o),o&&o.type===te&&s&&(o.variations.push(s),o.trafficAllocation.push({entityId:s.id,endOfRange:1e4}),o.variationKeyMap[s.key]=s),(o.variations||[]).forEach(e=>{r[e.id]=e})});const n=e.rolloutIdMap[t.rolloutId];n&&(n.experiments||[]).forEach(e=>{i.push(e),(e.variations||[]).forEach(e=>{r[e.id]=e})}),e.flagRulesMap[t.key]=i,e.flagVariationsMap[t.key]=Object.values(r)})})(s),me(s,null==t?void 0:t.logger),s},ve=function(e,t){if(!t.rolloutId)return null;const i=e.rolloutIdMap[t.rolloutId];if(!i||!i.experiments||0===i.experiments.length)return null;const r=i.experiments[i.experiments.length-1];return r.variations&&0!==r.variations.length?r.variations[0]:null},me=(e,t)=>{e.holdouts=e.holdouts||[],e.localHoldouts=e.localHoldouts||[];const i={},r={},s=t=>{t.includedFlags=[],t.excludedFlags=[],t.variationKeyMap=o(t.variations,"key"),a(t.variations,"id",e.variationIdMap)};e.holdouts.forEach(e=>{s(e),delete e.includedRules,e.isGlobal=!0,r[e.id]=e}),e.localHoldouts.forEach(e=>{const n=e.includedRules;if(Array.isArray(n)&&0!==n.length){s(e),e.isGlobal=!1,r[e.id]=e;for(const t of n)i[t]||(i[t]=[]),i[t].push(e)}else null==t||t.error("30",e.key)}),e.holdoutIdMap=r,e.ruleHoldoutsMap=i},ye=(e,t)=>{var i;return null!==(i=e.ruleHoldoutsMap[t])&&void 0!==i?i:[]},be=function(e){return e.conditions?Ee(e.conditions):[]},Ee=e=>{const t=[];return function(e){return["and","or","not"].includes(e)}(e)?[]:(Array.isArray(e)?e.forEach(e=>t.push(...Ee(e))):"qualified"===e.match&&t.push(e.value),t)};const Ie=function(e,t){const i=e.experimentKeyMap[t];if(!i)throw new p("22",t);return i.status},Se=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){const i=e.experimentKeyMap[t];if(i)return i}throw new p("9",t)},xe=function(e,t,i){if(!e)return null;const r=u(e.flagVariationsMap[t],e=>e.key===i);return r||null},ke=function(e,t,i){if(e.featureKeyMap.hasOwnProperty(t)){const i=e.featureKeyMap[t];if(i)return i}return null==i||i.error(I,t),null},Me=function(e){return!!e.sendFlagDecisions},Re=()=>{};function we(){let e=Re,t=Re;const i=new Promise((i,r)=>{e=i,t=r});return{promise:i,resolve:e,reject:t,then:i.then.bind(i)}}const Ce="%s failed to start, reason: %s",Oe="%s stopped before running";var Ae;!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"}(Ae||(Ae={}));class Pe{constructor(e=[]){this.disposable=!1,this.state=Ae.New,this.startPromise=we(),this.stopPromise=we(),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:i}of this.startupLogs){const r=v[e];this.logger[r].call(this.logger,t,...i)}}onRunning(){return this.startPromise.promise}onTerminated(){return this.stopPromise.promise}getState(){return this.state}isStarting(){return this.state===Ae.Starting}isRunning(){return this.state===Ae.Running}isNew(){return this.state===Ae.New}isDone(){return[Ae.Stopping,Ae.Terminated,Ae.Failed].includes(this.state)}start(){this.printStartupLogs()}}class De{constructor(){this.id=0,this.listeners={}}on(e,t){var i;this.listeners[e]||(this.listeners[e]=new Map);const r=this.id++;return null===(i=this.listeners[e])||void 0===i||i.set(r,t),()=>{var t;null===(t=this.listeners[e])||void 0===t||t.delete(r)}}emit(e,t){const i=this.listeners[e];i&&i.forEach(e=>{e(t)})}removeListeners(e){var t;null===(t=this.listeners[e])||void 0===t||t.clear()}removeAllListeners(){this.listeners={}}}class Te extends Pe{constructor(e){super(),this.eventEmitter=new De,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,i;this.isNew()&&(this.state=Ae.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===(i=this.datafileManager)||void 0===i||i.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,i;null===(t=this.logger)||void 0===t||t.error(e),this.state=Ae.Failed,null===(i=this.datafileManager)||void 0===i||i.stop(),this.startPromise.reject(e),this.stopPromise.reject(e)}handleDatafileManagerError(e){var t;null===(t=this.logger)||void 0===t||t.error(Ce,"DatafileManager",e.message),this.isStarting()&&this.handleInitError(new Error(c(Ce,"DatafileManager",e.message)))}handleNewDatafile(e,t=!1){var i,r;if(!this.isDone())try{const t=fe(e,{jsonSchemaValidator:this.jsonSchemaValidator,logger:this.logger});this.isStarting()&&(this.state=Ae.Running,this.startPromise.resolve()),(null===(i=this.projectConfig)||void 0===i?void 0:i.revision)!==t.revision&&(this.projectConfig=t,this.optimizelyConfig=void 0,this.eventEmitter.emit("update",t))}catch(e){null===(r=this.logger)||void 0===r||r.error(e);(this.isStarting()&&!this.datafileManager||this.isStarting()&&!t)&&this.handleInitError(new Error("got invalid datafile"))}}getConfig(){return this.projectConfig}getOptimizelyConfig(){var e,t,i,r;return!this.optimizelyConfig&&this.projectConfig&&(this.optimizelyConfig=(e=this.projectConfig,r=this.projectConfig,t=r.__datafileStr,i=this.logger,new J(e,t,i))),this.optimizelyConfig}onUpdate(e){return this.eventEmitter.on("update",e)}stop(){if(!this.isDone()){if((this.isNew()||this.isStarting())&&this.startPromise.reject(new Error(c(Oe,"ProjectConfigManager"))),this.state=Ae.Stopping,this.eventEmitter.removeAllListeners(),!this.datafileManager)return this.state=Ae.Terminated,void this.stopPromise.resolve();this.datafileManager.stop(),this.datafileManager.onTerminated().then(()=>{this.state=Ae.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=Ae.Failed,this.stopPromise.reject(e)})}}}function Fe(e,t,i,r){return new(i||(i=Promise))(function(s,n){function o(e){try{l(r.next(e))}catch(e){n(e)}}function a(e){try{l(r.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(o,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;const Ne=e=>e>=200&&e<400;class _e extends Pe{constructor(e){super(e.startupLogs);const{autoUpdate:t=!1,sdkKey:i,datafileAccessToken:r,customHeaders:s,urlTemplate:n,cache:o,initRetry:a,repeater:l,requestHandler:u,logger:d}=e;this.cache=o,this.cacheKey="opt-datafile-"+i,this.sdkKey=i,this.datafileAccessToken=r,this.customHeaders=s,this.requestHandler=u,this.emitter=new De,this.autoUpdate=t,this.initRetryRemaining=a,this.repeater=l,d&&this.setLogger(d);const h=n||(r?"https://config.optimizely.com/datafiles/auth/%s.json":"https://cdn.optimizely.com/datafiles/%s.json");this.datafileUrl=c(h,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=Ae.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(c(Oe,"PollingDatafileManager"))),this.state=Ae.Terminated,this.repeater.stop(),null===(e=this.currentRequest)||void 0===e||e.abort(),this.emitter.removeAllListeners(),this.stopPromise.resolve())}handleInitFailure(){this.state=Ae.Failed,this.repeater.stop();const e=new Error("Failed to fetch datafile");this.startPromise.reject(e),this.stopPromise.reject(e)}handleError(e){var t,i;this.isDone()||(e instanceof Error?null===(t=this.logger)||void 0===t||t.error("4",e.message,e):null===(i=this.logger)||void 0===i||i.error("3",e),this.isStarting()&&void 0!==this.initRetryRemaining&&(0===this.initRetryRemaining?this.handleInitFailure():this.initRetryRemaining--))}onRequestRejected(e){return Fe(this,void 0,void 0,function*(){return this.handleError(e),Promise.reject(e)})}onRequestResolved(e){return Fe(this,void 0,void 0,function*(){if(this.isDone())return;if(this.saveLastModified(e.headers),!Ne(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 i=Object.assign({},this.customHeaders);return this.lastResponseLastModified&&(i["if-modified-since"]=this.lastResponseLastModified),this.datafileAccessToken&&(null===(e=this.logger)||void 0===e||e.debug("0"),i.Authorization=`Bearer ${this.datafileAccessToken}`),null===(t=this.logger)||void 0===t||t.debug("17",this.datafileUrl,()=>JSON.stringify(i)),this.requestHandler.makeRequest(this.datafileUrl,i,"GET")}syncDatafile(){return Fe(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=Ae.Running),this.emitter.emit("update",e))}getDatafileFromResponse(e){var t;if(null===(t=this.logger)||void 0===t||t.debug("24",e.statusCode),304!==e.statusCode)return e.body}saveLastModified(e){var t;const i=e["last-modified"]||e["Last-Modified"];void 0!==i&&(this.lastResponseLastModified=i,null===(t=this.logger)||void 0===t||t.debug("25",this.lastResponseLastModified))}setDatafileFromCacheIfAvailable(){return Fe(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 je{constructor(e,t,i){this.base=e,this.max=t,this.maxJitter=i,this.maxJitter>this.base/2&&(this.maxJitter=this.base/2),this.maxJitter=i,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 Ue{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 i=null!==(t=null===(e=this.backoffController)||void 0===e?void 0:e.backoff())&&void 0!==t?t:this.interval;this.setTimer(i)}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 i of["set","get","remove","getKeys"])"function"!=typeof e[i]&&t.push("Invalid store method %s".replace("%s",i));if(t.length>0)throw new Error(t.join(", "))},Le="Invalid config manager",qe=Symbol(),Be=e=>({[qe]:new Te(e)}),ze=e=>{var t;e.cache&&Ke(e.cache);const i=null!==(t=e.updateInterval)&&void 0!==t?t:3e5,r=new je(1e3,i,500),s=new Ve(i,r),n=[];i<3e4&&n.push({level:h.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,customHeaders:e.customHeaders,requestHandler:e.requestHandler,cache:e.cache,repeater:s,startupLogs:n},a=new _e(o);return new Te({datafile:e.datafile,datafileManager:a,jsonSchemaValidator:e.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,i,r){super(),this.operation="sync",this.store=e,this.prefix=t,this.transformGet=i,this.transformSet=r}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,i,r){this.operation="async",this.cache=e,this.prefix=t,this.transformGet=i,this.transformSet=r}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 Fe(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 Fe(this,void 0,void 0,function*(){return this.cache.getKeys().then(e=>e.filter(e=>e.startsWith(this.prefix)))})}getKeys(){return Fe(this,void 0,void 0,function*(){return this.getInternalKeys().then(e=>e.map(e=>this.removePrefix(e)))})}getBatched(e){return Fe(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=[],i=e[0];return e.forEach(e=>{if("conversion"===e.type||"impression"===e.type){const i=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:G,key:G,type:Ye,value:e.context.botFiltering});return t}(e);"impression"===e.type?i.snapshots.push(function(e){var t;const{layer:i,experiment:r,variation:s,ruleKey:n,flagKey:o,ruleType:a,enabled:l,cmabUuid:u}=e,c=null==i?void 0:i.id,d=null!==(t=null==r?void 0:r.id)&&void 0!==t?t:"",h=(f=null==s?void 0:s.id,f&&/^[0-9]+$/.test(f)?f:null),g=s?s.key:"",p=c||d||null;var f;return{decisions:[{campaign_id:p,experiment_id:d,variation_id:h,metadata:{flag_key:o,rule_key:n,rule_type:a,variation_key:g,enabled:l,cmab_uuid:u}}],events:[{entity_id:p,timestamp:e.timestamp,key:Xe,uuid:e.uuid}]}}(e)):"conversion"===e.type&&i.snapshots.push(function(e){const t=Object.assign({},e.tags);delete t.revenue,delete t.value;const i={entity_id:e.event.id,key:e.event.key,timestamp:e.timestamp,uuid:e.uuid};e.tags&&(i.tags=e.tags);null!=e.value&&(i.value=e.value);null!=e.revenue&&(i.revenue=e.revenue);return{events:[i]}}(e)),t.push(i)}}),{client_name:i.context.clientName,client_version:i.context.clientVersion,account_id:i.context.accountId,project_id:i.context.projectId,revision:i.context.revision,anonymize_ip:i.context.anonymizeIP,enrich_decisions:!0,visitors:t}}function tt(e){var t;const i=(null===(t=e[0])||void 0===t?void 0:t.context.region)||"US";return{url:Ze[i]||Ze.US,httpVerb:"POST",params:et(e)}}const it=(e,t,i,r,s)=>{e().then(e=>{t.resolve(e)}).catch(n=>{var o;if(0===s)return void t.reject(n);if(i.cancelled)return void t.reject(new p("51"));const a=null!==(o=null==r?void 0:r.backoff())&&void 0!==o?o:0;setTimeout(()=>{it(e,t,i,r,s=void 0===s?void 0:s-1)},a)})},rt=(e,t,i)=>{const r=we(),s={cancelled:!1};return it(e,r,s,t,i),{cancelRetry:()=>{s.cancelled=!0},result:r.promise}};class st{constructor(){this.idSuffixOffset=0}getId(){const e=1e4+this.idSuffixOffset;this.idSuffixOffset=(this.idSuffixOffset+1)%1e4;return`${Date.now()}${e}`}}function nt(e){var t,i;return null!==(i=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==i?i:""}function ot(e){var t,i;return null!==(i=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==i?i:""}function at(e){var t,i;return null!==(i=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==i&&i}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={})),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"}(dt||(dt={}));const ht=(e,t)=>{const i=e.context,r=t.context;return(i.region||"US")===(r.region||"US")&&i.accountId===r.accountId&&i.projectId===r.projectId&&i.clientName===r.clientName&&i.clientVersion===r.clientVersion&&i.revision===r.revision&&i.anonymizeIP===r.anonymizeIP&&i.botFiltering===r.botFiltering},gt=({configObj:e,userId:t,userAttributes:i,clientEngine:r,clientVersion:s,type:n})=>({type:n,timestamp:g.currentTimestamp(),uuid:g.uuid(),context:{region:e.region,accountId:e.accountId,projectId:e.projectId,revision:e.revision,clientName:r,clientVersion:s,anonymizeIP:e.anonymizeIP||!1,botFiltering:e.botFiltering},user:{id:t,attributes:vt(e,i)}}),pt=function({configObj:e,decisionObj:t,userId:i,flagKey:r,enabled:s,userAttributes:n,clientEngine:o,clientVersion:a}){const l=t.decisionSource,u=nt(t),c=function(e){var t,i;return null!==(i=null===(t=e.experiment)||void 0===t?void 0:t.id)&&void 0!==i?i:null}(t),d=ot(t),h=function(e){var t,i;return null!==(i=null===(t=e.variation)||void 0===t?void 0:t.id)&&void 0!==i?i:null}(t),g=t.cmabUuid,f=null!==c?l===ee.HOLDOUT?"":function(e,t){const i=e.experimentIdMap[t];if(!i)throw new p("21",t);return i.layerId}(e,c):null;return Object.assign(Object.assign({},gt({configObj:e,userId:i,userAttributes:n,clientEngine:o,clientVersion:a,type:"impression"})),{layer:{id:f},experiment:{id:c,key:u},variation:{id:h,key:d},ruleKey:u,flagKey:r,ruleType:l,enabled:s,cmabUuid:g})},ft=function({configObj:e,userId:t,userAttributes:i,clientEngine:r,clientVersion:s,eventKey:n,eventTags:o},a){const l=function(e,t){const i=e.eventKeyMap[t];return i?i.id:null}(e,n),u=o?function(e,t){const i=e.revenue;if(null==i)return null;const r="string"==typeof i?parseInt(i):Math.trunc(i);return isFinite(r)?(null==t||t.info("22",r),r):(null==t||t.info("6",i),null)}(o,a):null,c=o?function(e,t){const i=e.value;if(null==i)return null;const r="string"==typeof i?parseFloat(i):i;return isFinite(r)?(null==t||t.info("21",r),r):(null==t||t.info("7",i),null)}(o,a):null;return Object.assign(Object.assign({},gt({configObj:e,userId:t,userAttributes:i,clientEngine:r,clientVersion:s,type:"conversion"})),{event:{id:l,key:n},revenue:u,value:c,tags:o})},vt=(e,t,i)=>{if(!t)return[];const r=[];return Object.keys(t).forEach(function(s){const n=t[s];if("object"!=typeof n&&void 0!==n&&function(e,t){return"string"==typeof e&&("string"==typeof t||"boolean"==typeof t||g.isNumber(t)&&g.isSafeInteger(t))}(s,n)){const t=function(e,t,i){const r=e.attributeKeyMap[t],s=0===t.indexOf(ge);return r?(s&&(null==i||i.warn("60",t,ge)),r.id):s?t:(null==i||i.warn("64",t),null)}(e,s,i);t&&r.push({entityId:t,key:s,value:n})}}),r};class mt extends Pe{constructor(e){var t;super(e.startupLogs),this.eventQueue=[],this.idGenerator=new st,this.runningTask=new Map,this.dispatchingEvents=new Map,this.eventEmitter=new De,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 Fe(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),i=[];if(t.forEach(e=>{e&&i.push(e)}),0==i.length)return;i.sort((e,t)=>e.id<t.id?-1:1);const r=[];let s=[];i.forEach(e=>{(s.length===this.batchSize||s.length>0&&!ht(s[0].event,e.event))&&(r.push({request:tt(s.map(e=>e.event)),events:s}),s=[]),s.push(e)}),s.length>0&&r.push({request:tt(s.map(e=>e.event)),events:s}),r.forEach(e=>{this.dispatchBatch(e,!1)})})}createNewBatch(){if(0==this.eventQueue.length)return;const e=[],t=[];return this.eventQueue.forEach(i=>{e.push(i.event),t.push(i)}),this.eventQueue=[],{request:tt(e),events:t}}executeDispatch(e,t=!1){return Fe(this,void 0,void 0,function*(){return(t&&this.closingEventDispatcher?this.closingEventDispatcher:this.eventDispatcher).dispatchEvent(e).then(e=>e.statusCode&&!Ne(e.statusCode)?Promise.reject(new p("10",e.statusCode)):Promise.resolve(e))})}dispatchBatch(e,t){const{request:i,events:r}=e;r.forEach(e=>{this.dispatchingEvents.set(e.id,e)});const s=this.retryConfig?rt(()=>this.executeDispatch(i,t),this.retryConfig.backoffProvider(),this.retryConfig.maxRetries):{result:this.executeDispatch(i,t),cancelRetry:()=>{}};this.eventEmitter.emit("dispatch",i);const n=this.idGenerator.getId();this.runningTask.set(n,s),s.result.then(e=>(r.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(n),r.forEach(e=>this.dispatchingEvents.delete(e.id))})}flush(e=!1){return Fe(this,void 0,void 0,function*(){const t=this.createNewBatch();t&&(this.dispatchRepeater.reset(),this.dispatchBatch(t,e))})}process(e){var t;return Fe(this,void 0,void 0,function*(){if(!this.isRunning())return Promise.reject(new p("53","BatchEventProcessor"));const i={id:this.idGenerator.getId(),event:e};yield Promise.resolve(null===(t=this.eventStore)||void 0===t?void 0:t.set(i.id,i)).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(i),this.eventQueue.length==this.batchSize?this.flush():this.dispatchRepeater.isRunning()||this.dispatchRepeater.start()})}start(){var e;this.isNew()&&(super.start(),this.state=Ae.Running,this.disposable||null===(e=this.failedEventRepeater)||void 0===e||e.start(),this.retryFailedEvents(),this.startPromise.resolve())}makeDisposable(){var e,t,i;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===(i=this.retryConfig)||void 0===i?void 0:i.backoffProvider)||(()=>new je(200,1e3,500))}}flushImmediately(){return this.isRunning()?this.flush(!0):Promise.resolve()}stop(){var e;this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(c(Oe,"BatchEventProcessor"))),this.state=Ae.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=Ae.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:i,store:r,logger:s}=e;"sync"===r.operation?this.store=new We(r,Et,bt,bt):this.store=new Qe(r,Et,bt,bt),s&&(s.setName("EventStore"),this.logger=s),this.maxSize=t||500,this.ttl=i||864e6}readKeys(){return Fe(this,void 0,void 0,function*(){return this.serializer.run(()=>Fe(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 i;return Fe(this,void 0,void 0,function*(){return yield this.readKeys(),void 0!==this.keys&&this.keys.size>=this.maxSize?Promise.reject(new p("8",t.event.uuid)):(null===(i=this.keys)||void 0===i||i.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 Fe(this,void 0,void 0,function*(){const t=yield this.store.get(e);return this.processStoredEvent(e,t)})}remove(e){var t;return Fe(this,void 0,void 0,function*(){yield this.store.remove(e),null===(t=this.keys)||void 0===t||t.delete(e)})}getKeys(){return Fe(this,void 0,void 0,function*(){const e=yield this.store.getKeys();return this.keys=new Set(e),e})}getBatched(e){return Fe(this,void 0,void 0,function*(){return(yield this.store.getBatched(e)).map((t,i)=>this.processStoredEvent(e[i],t))})}}class St extends Pe{constructor(e){super(),this.dispatcher=e,this.eventEmitter=new De}process(e){const t=tt([e]),i=this.dispatcher.dispatchEvent(t);return this.eventEmitter.emit("dispatch",t),i}start(){this.isNew()&&(this.state=Ae.Running,this.startPromise.resolve())}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(c(Oe,"ForwardingEventProcessor"))),this.state=Ae.Terminated,this.stopPromise.resolve())}onDispatch(e){return this.eventEmitter.on("dispatch",e)}flushImmediately(){return Promise.resolve()}}const xt=Symbol(),kt=e=>{if(!e||"object"!=typeof e||"function"!=typeof e.dispatchEvent)throw new Error("Invalid event dispatcher")},Mt=e=>({[xt]:e}),Rt=(e,t=mt)=>Mt(((e,t=mt)=>{const{eventDispatcher:i,closingEventDispatcher:r,retryOptions:s,eventStore:n}=e;kt(i),r&&kt(r),n&&Ke(n);const o=s?{maxRetries:s.maxRetries,backoffProvider:()=>{var e,t;const i=null!==(e=null==s?void 0:s.minBackoff)&&void 0!==e?e:200,r=null!==(t=null==s?void 0:s.maxBackoff)&&void 0!==t?t:1e3;return new je(i,r,50)}}:void 0,a=[],{defaultFlushInterval:l,defaultBatchSize:u}=e;let c=l;void 0===e.flushInterval||e.flushInterval<=0?a.push({level:h.Warn,message:"Invalid flushInterval %s, defaulting to %s",params:[e.flushInterval,l]}):c=e.flushInterval;let d=u;return void 0===e.batchSize||e.batchSize<=0?a.push({level:h.Warn,message:"Invalid batchSize %s, defaulting to %s",params:[e.batchSize,u]}):d=e.batchSize,new t({eventDispatcher:i,closingEventDispatcher:r,dispatchRepeater:new Ve(c),failedEventRepeater:e.failedEventRetryInterval?new Ve(e.failedEventRetryInterval):void 0,retryConfig:o,batchSize:d,eventStore:n,startupLogs:a})})(e,t));class wt{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,i){this.requestHandler=e,this.requestGenerator=t,i&&this.setLogger(i)}setLogger(e){this.logger=e,this.logger.setName("OdpEventApiManager")}sendEvents(e,t){return Fe(this,void 0,void 0,function*(){if(0===t.length)return{};const{method:i,endpoint:r,headers:s,data:n}=this.requestGenerator(e,t);return this.requestHandler.makeRequest(r,s,i,n).responsePromise})}}const Ot=(e,t)=>{const{apiHost:i,apiKey:r}=e;return{method:"POST",endpoint:`${i}/v3/events`,headers:{"Content-Type":"application/json","x-api-key":r},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 Pe{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 Fe(this,void 0,void 0,function*(){const i=yield this.apiManager.sendEvents(e,t);return i.statusCode&&!Ne(i.statusCode)?Promise.reject(new p("10",i.statusCode)):yield Promise.resolve(i)})}flush(){return Fe(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(),rt(()=>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=Ae.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=Ae.Running,this.startPromise.resolve()}flushImmediately(){return this.isRunning()?this.flush():Promise.resolve()}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(c(Oe,"OdpEventManager"))),this.flush(),this.state=Ae.Terminated,this.stopPromise.resolve())}sendEvent(e){var t,i,r,s,n,o;this.isRunning()?(null===(i=this.odpIntegrationConfig)||void 0===i?void 0:i.integrated)?0!==e.identifiers.size?this.isDataValid(e.data)?e.action?(""===e.type&&(e.type=Dt),Array.from(e.identifiers.entries()).forEach(([t,i])=>{At.FS_USER_ID_ALIAS!==t.toLowerCase()&&At.FS_USER_ID!==t.toLowerCase()||(e.identifiers.delete(t),e.identifiers.set(At.FS_USER_ID,i))}),this.processEvent(e)):null===(o=this.logger)||void 0===o||o.error("5"):null===(n=this.logger)||void 0===n||n.error("6"):null===(s=this.logger)||void 0===s||s.error("41"):null===(r=this.logger)||void 0===r||r.error("45"):null===(t=this.logger)||void 0===t||t.error("53","OdpEventManager")}isDataValid(e){const t=["string","number","boolean"];return Array.from(e.values()).reduce((e,i)=>e&&(null===i||t.includes(typeof i)),!0)}processEvent(e){this.queue.push(e),this.queue.length===this.batchSize?this.flush():this.repeater.isRunning()||this.repeater.start()}}class Ft{constructor(e,t,i,r){this.type=e,this.action=t,this.identifiers=null!=i?i:new Map,this.data=null!=r?r:new Map}}const Nt="vuid_",_t=e=>e.startsWith(Nt)&&e.length>5;class jt extends Pe{constructor(e){if(super(),this.clientEngine=X,this.clientVersion=Z,this.segmentManager=e.segmentManager,this.eventManager=e.eventManager,this.configPromise=we(),e.userAgentParser){const{os:t,device:i}=e.userAgentParser.parseUserAgentInfo(),r={os:t.name,os_version:t.version,device_type:i.type,model:i.model};this.userAgentData=new Map(Object.entries(r).filter(([e,t])=>null!=t&&null!=t))}e.logger&&this.setLogger(e.logg