@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){return Object.keys(e).map(t=>[t,e[t]])}function c(e,t){let i;for(const r of e)if(t(r)){i=r;break}return i}function d(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 h(e,t){return e.length===t.length&&e.every((e,i)=>e===t[i])}var g,p={checkArrayEquality:h,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:u,find:c,sprintf:d};class f extends Error{constructor(e,...t){super(),this.resolved=!1,this.name="OptimizelyError",this.baseMessage=e,this.params=t,Object.setPrototypeOf(this,f.prototype)}setMessage(e){this.resolved||(this.message=d(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"}(g||(g={}));const v={[g.Debug]:"DEBUG",[g.Info]:"INFO",[g.Warn]:"WARN",[g.Error]:"ERROR"},m={[g.Debug]:"debug",[g.Info]:"info",[g.Warn]:"warn",[g.Error]:"error"};class y{constructor(e){this.prefix=e||"[OPTIMIZELY]"}log(e,t){const i=`${this.prefix} - ${v[e]} ${this.getTime()} ${t}`;this.consoleLog(e,i)}getTime(){return(new Date).toISOString()}consoleLog(e,t){(console[m[e]]||console.log).call(console,t)}}class b{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 b({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(g.Info,e,t)}debug(e,...t){this.log(g.Debug,e,t)}warn(e,...t){this.log(g.Warn,e,t)}error(e,...t){this.log(g.Error,e,t)}handleLog(e,t,i){const r=i.length>0?`${this.prefix}${d(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 f&&t.setMessage(this.errorResolver),void this.handleLog(e,t.message,[]);let r=this.errorResolver;if(e<g.Warn){if(!this.infoResolver)return;r=this.infoResolver}const s=r.resolve(t);this.handleLog(e,s,i)}}const E="30",I=["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."],S="12",x="27",k="35",M="53",R="57",w="59",C="61",O=["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."],A={resolve(e){const t=parseInt(e);return I[t]||e}},P={resolve(e){const t=parseInt(e);return O[t]||e}},D={level:g.Debug,infoResolver:A,errorResolver:P},F={level:g.Info,infoResolver:A,errorResolver:P},T={level:g.Warn,errorResolver:P},N={level:g.Error,errorResolver:P},j=Symbol(),_={[j]:D},U={[j]:F},V={[j]:T},K={[j]:N},L=Symbol(),q=e=>{const{level:t,infoResolver:i,errorResolver:r}=(e=>{if(!e||"object"!=typeof e||!e[j])throw new Error("Invalid level preset");return e[j]})(e.level);e.logHandler&&(e=>{if("object"!=typeof e||"function"!=typeof e.log)throw new Error("Invalid log handler")})(e.logHandler);return{[L]:new b({name:"Optimizely",level:t,infoMsgResolver:i,errorMsgResolver:r,logHandler:e.logHandler||new y})}};class B{constructor(e,t,i){this.errorHandler=e,this.messageResolver=t,this.name=i||""}notify(e){e instanceof f&&e.setMessage(this.messageResolver),this.errorHandler.handleError(e)}child(e){return new B(this.errorHandler,this.messageResolver,e)}}const z=Symbol(),H=e=>((e=>{if(!e||"object"!=typeof e||"function"!=typeof e.handleError)throw new Error("Invalid error handler")})(e),{[z]:new B(e,P)}),$=["and","or","not"];function J(e,t){if(Array.isArray(e)){let i=e[0],r=e.slice(1);switch("string"==typeof i&&-1===$.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=J(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=J(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=J(e[r],t);if(!0===s)return!0;null===s&&(i=!0)}return!!i&&null}return null}(r,t)}}return t(e)}class G{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=G.getAudiences(e),this.events=e.events,this.revision=e.revision;const n=(e.featureFlags||[]).reduce((e,t)=>(e[t.id]=t.variables,e),{}),o=G.getVariableIdMap(e),{experimentsMapById:a,experimentsMapByKey:l}=G.getExperimentsMap(e,n,o,i);this.experimentsMap=l,this.featuresMap=G.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=G.getSerializedAudiences(e,t),s=`(${s})`;else if($.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?G.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=G.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:G.getExperimentAudiences(r,e),variationsMap:G.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=G.getVariationsMap(a.variations,t,i,u.toString()),d={id:a.id,key:a.key,audiences:G.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=G.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 W="$opt_bot_filtering",Q="$opt_bucketing_id",X="$opt_experiment_bucket_map",Y="javascript-sdk",Z="react-native-js-sdk",ee="6.3.1",te={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment",HOLDOUT:"holdout"},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".',de=["2","3","4"];var he=function(e){if(!e)throw new f("32");if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new f("18")}if("object"!=typeof e||Array.isArray(e)||null===e)throw new f("18");if(-1===de.indexOf(e.version))throw new f("19",e.version);return e};class ge{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&&h(this.segmentsToCheck,e.segmentsToCheck)}}const pe="Running",fe="$opt_";const ve=function(e,t=null){const i=function(e){var t,i;const r=Object.assign({},e);return r.audiences=(e.audiences||[]).map(e=>Object.assign({},e)),r.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),r.featureFlags=(e.featureFlags||[]).map(e=>Object.assign({},e)),r.groups=(e.groups||[]).map(e=>{const t=Object.assign({},e);return t.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),t}),r.rollouts=(e.rollouts||[]).map(e=>{const t=Object.assign({},e);return t.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),t}),r.environmentKey=null!==(t=e.environmentKey)&&void 0!==t?t:"",r.sdkKey=null!==(i=e.sdkKey)&&void 0!==i?i:"",r}(e);let r;i.region||(i.region="US"),i.__datafileStr=null===t?JSON.stringify(e):t,(i.audiences||[]).forEach(e=>{e.conditions=JSON.parse(e.conditions)}),i.audiencesById={},a(i.audiences,"id",i.audiencesById),a(i.typedAudiences,"id",i.audiencesById),i.attributes=i.attributes||[],i.attributeKeyMap={},i.attributeIdMap={},i.attributes.forEach(e=>{i.attributeKeyMap[e.key]=e,i.attributeIdMap[e.id]=e}),i.eventKeyMap=o(i.events,"key"),i.groupIdMap=o(i.groups,"id"),Object.keys(i.groupIdMap||{}).forEach(e=>{r=i.groupIdMap[e].experiments,(r||[]).forEach(t=>{t.groupId=e,i.experiments.push(t)})}),i.rolloutIdMap=o(i.rollouts||[],"id"),l(i.rolloutIdMap||{}).forEach(e=>{(e.experiments||[]).forEach(e=>{e.isRollout=!0,i.experiments.push(e),e.variationKeyMap=o(e.variations,"key")})});const s=new Set;Object.keys(i.audiencesById).map(e=>ye(i.audiencesById[e])).forEach(e=>{e.forEach(e=>{s.add(e)})});const n=Array.from(s);let d=!1,h="",g="",p="";return i.integrations&&(i.integrationKeyMap=o(i.integrations,"key"),i.integrations.forEach(e=>{if(!("key"in e))throw new f("29");"odp"===e.key&&(d=!0,g=g||e.publicKey||"",h=h||e.host||"",p=p||e.pixelUrl||"")})),i.odpIntegrationConfig=d?{integrated:!0,odpConfig:new ge(g,h,p,n)}:{integrated:!1},i.experimentKeyMap=o(i.experiments,"key"),i.experimentIdMap=o(i.experiments,"id"),i.variationIdMap={},i.variationVariableUsageMap={},(i.experiments||[]).forEach(e=>{e.variationKeyMap=o(e.variations,"key"),a(e.variations,"id",i.variationIdMap),l(e.variationKeyMap||{}).forEach(e=>{e.variables&&(i.variationVariableUsageMap[e.id]=o(e.variables,"id"))})}),i.experimentFeatureMap={},i.featureKeyMap=o(i.featureFlags||[],"key"),l(i.featureKeyMap||{}).forEach(e=>{e.variables.forEach(e=>{e.type===ae&&e.subType===le&&(e.type=le,delete e.subType)}),e.variableKeyMap=o(e.variables,"key"),(e.experimentIds||[]).forEach(t=>{i.experimentFeatureMap[t]?i.experimentFeatureMap[t].push(e.id):i.experimentFeatureMap[t]=[e.id]})}),i.flagRulesMap={},(i.featureFlags||[]).forEach(e=>{const t=[];e.experimentIds.forEach(e=>{const r=i.experimentIdMap[e];r&&t.push(r)});const r=i.rolloutIdMap[e.rolloutId];r&&t.push(...r.experiments),i.flagRulesMap[e.key]=t}),i.flagVariationsMap={},u(i.flagRulesMap||{}).forEach(([e,t])=>{const r=[];t.forEach(e=>{e.variations.forEach(e=>{c(r,t=>t.id===e.id)||r.push(e)})}),i.flagVariationsMap[e]=r}),me(i),i},me=e=>{e.holdouts=e.holdouts||[],e.holdoutIdMap=o(e.holdouts,"id"),e.globalHoldouts=[],e.includedHoldouts={},e.excludedHoldouts={},e.flagHoldoutsMap={};const t=o(e.featureFlags,"id");e.holdouts.forEach(i=>{i.includedFlags||(i.includedFlags=[]),i.excludedFlags||(i.excludedFlags=[]),i.variationKeyMap=o(i.variations,"key"),a(i.variations,"id",e.variationIdMap),0===i.includedFlags.length?(e.globalHoldouts.push(i),i.excludedFlags.forEach(r=>{const s=t[r];if(s){const t=s.key;e.excludedHoldouts[t]||(e.excludedHoldouts[t]=[]),e.excludedHoldouts[t].push(i)}})):i.includedFlags.forEach(r=>{const s=t[r];if(s){const t=s.key;e.includedHoldouts[t]||(e.includedHoldouts[t]=[]),e.includedHoldouts[t].push(i)}})})},ye=function(e){return e.conditions?be(e.conditions):[]},be=e=>{const t=[];return function(e){return["and","or","not"].includes(e)}(e)?[]:(Array.isArray(e)?e.forEach(e=>t.push(...be(e))):"qualified"===e.match&&t.push(e.value),t)};const Ee=function(e,t){const i=e.experimentKeyMap[t];if(!i)throw new f("22",t);return i.status},Ie=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){const i=e.experimentKeyMap[t];if(i)return i}throw new f("9",t)},Se=function(e,t,i){if(!e)return null;const r=c(e.flagVariationsMap[t],e=>e.key===i);return r||null},xe=function(e,t,i){if(e.featureKeyMap.hasOwnProperty(t)){const i=e.featureKeyMap[t];if(i)return i}return null==i||i.error(S,t),null},ke=function(e){return!!e.sendFlagDecisions},Me=()=>{};function Re(){let e=Me,t=Me;const i=new Promise((i,r)=>{e=i,t=r});return{promise:i,resolve:e,reject:t,then:i.then.bind(i)}}const we="%s failed to start, reason: %s",Ce="%s stopped before running";var Oe;!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"}(Oe||(Oe={}));class Ae{constructor(e=[]){this.disposable=!1,this.state=Oe.New,this.startPromise=Re(),this.stopPromise=Re(),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=m[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===Oe.Starting}isRunning(){return this.state===Oe.Running}isNew(){return this.state===Oe.New}isDone(){return[Oe.Stopping,Oe.Terminated,Oe.Failed].includes(this.state)}start(){this.printStartupLogs()}}class Pe{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 De extends Ae{constructor(e){super(),this.eventEmitter=new Pe,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=Oe.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=Oe.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(we,"DatafileManager",e.message),this.isStarting()&&this.handleInitError(new Error(d(we,"DatafileManager",e.message)))}handleNewDatafile(e,t=!1){var i,r;if(!this.isDone())try{const t=function(e){var t,i;const r=he(e.datafile);e.jsonSchemaValidator?(e.jsonSchemaValidator(r),null===(t=e.logger)||void 0===t||t.info("38")):null===(i=e.logger)||void 0===i||i.info("28");const s=[r];return"string"==typeof e.datafile&&s.push(e.datafile),ve(...s)}({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:this.logger});this.isStarting()&&(this.state=Oe.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 G(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(d(Ce,"ProjectConfigManager"))),this.state=Oe.Stopping,this.eventEmitter.removeAllListeners(),!this.datafileManager)return this.state=Oe.Terminated,void this.stopPromise.resolve();this.datafileManager.stop(),this.datafileManager.onTerminated().then(()=>{this.state=Oe.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=Oe.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 Te=e=>e>=200&&e<400;class Ne extends Ae{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:c}=e;this.cache=o,this.cacheKey="opt-datafile-"+i,this.sdkKey=i,this.datafileAccessToken=r,this.customHeaders=s,this.requestHandler=u,this.emitter=new Pe,this.autoUpdate=t,this.initRetryRemaining=a,this.repeater=l,c&&this.setLogger(c);const h=n||(r?"https://config.optimizely.com/datafiles/auth/%s.json":"https://cdn.optimizely.com/datafiles/%s.json");this.datafileUrl=d(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=Oe.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(d(Ce,"PollingDatafileManager"))),this.state=Oe.Terminated,this.repeater.stop(),null===(e=this.currentRequest)||void 0===e||e.abort(),this.emitter.removeAllListeners(),this.stopPromise.resolve())}handleInitFailure(){this.state=Oe.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),!Te(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=Oe.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 i=e["last-modified"]||e["Last-Modified"];void 0!==i&&(this.lastResponseLastModified=i,null===(t=this.logger)||void 0===t||t.debug("24",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 _e{constructor(e){this.value=e}backoff(){return this.value}reset(){}}class Ue{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 Ve=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(", "))},Ke="Invalid config manager",Le=Symbol(),qe=e=>({[Le]:new De(e)}),Be=e=>{var t;e.cache&&Ve(e.cache);const i=null!==(t=e.updateInterval)&&void 0!==t?t:3e5,r=new je(1e3,i,500),s=new Ue(i,r),n=[];i<3e4&&n.push({level:g.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 Ne(o);return new De({datafile:e.datafile,datafileManager:a,jsonSchemaValidator:e.jsonSchemaValidator})};class ze{constructor(){this.operation="sync"}}class He{constructor(){this.operation="async"}}const $e=(e,t)=>e instanceof ze?e.getBatched(t):t.map(t=>e.get(t)),Je=(e,t)=>e instanceof He?e.getBatched(t):Promise.all(t.map(t=>e.get(t)));class Ge extends ze{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 $e(this.store,e.map(e=>this.addPrefix(e))).map(e=>e?this.transformGet(e):void 0)}}class We{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 Je(this.cache,e.map(e=>this.addPrefix(e)))).map(e=>e?this.transformGet(e):void 0)})}}const Qe="campaign_activated",Xe="custom",Ye={US:"https://logx.optimizely.com/v1/events",EU:"https://eu.logx.optimizely.com/v1/events"};function Ze(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:W,key:W,type:Xe,value:e.context.botFiltering});return t}(e);"impression"===e.type?i.snapshots.push(function(e){var t,i;const{layer:r,experiment:s,variation:n,ruleKey:o,flagKey:a,ruleType:l,enabled:u,cmabUuid:c}=e,d=r?r.id:null,h=null!==(t=null==s?void 0:s.id)&&void 0!==t?t:"",g=null!==(i=null==n?void 0:n.id)&&void 0!==i?i:"",p=n?n.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:Qe,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 et(e){var t;const i=(null===(t=e[0])||void 0===t?void 0:t.context.region)||"US";return{url:Ye[i]||Ye.US,httpVerb:"POST",params:Ze(e)}}const tt=(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 f("49"));const a=null!==(o=null==r?void 0:r.backoff())&&void 0!==o?o:0;setTimeout(()=>{tt(e,t,i,r,s=void 0===s?void 0:s-1)},a)})},it=(e,t,i)=>{const r=Re(),s={cancelled:!1};return tt(e,r,s,t,i),{cancelRetry:()=>{s.cancelled=!0},result:r.promise}};class rt{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,i;return null!==(i=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==i?i:""}function nt(e){var t,i;return null!==(i=null===(t=e.variation)||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.featureEnabled)&&void 0!==i&&i}const at={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables",FLAG:"flag"},lt={ACTIVATE:"ACTIVATE",DECISION:"DECISION",LOG_EVENT:"LOG_EVENT",OPTIMIZELY_CONFIG_UPDATE:"OPTIMIZELY_CONFIG_UPDATE",TRACK:"TRACK"};var ut,ct;!function(e){e.BOOLEAN="boolean",e.DOUBLE="double",e.INTEGER="integer",e.STRING="string",e.JSON="json"}(ut||(ut={})),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"}(ct||(ct={}));const dt=(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},ht=({configObj:e,userId:t,userAttributes:i,clientEngine:r,clientVersion:s,type:n})=>({type:n,timestamp:p.currentTimestamp(),uuid:p.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:ft(e,i)}}),gt=function({configObj:e,decisionObj:t,userId:i,flagKey:r,enabled:s,userAttributes:n,clientEngine:o,clientVersion:a}){const l=t.decisionSource,u=st(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=nt(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,p=null!==c?l===te.HOLDOUT?"":function(e,t){const i=e.experimentIdMap[t];if(!i)throw new f("21",t);return i.layerId}(e,c):null;return Object.assign(Object.assign({},ht({configObj:e,userId:i,userAttributes:n,clientEngine:o,clientVersion:a,type:"impression"})),{layer:{id:p},experiment:{id:c,key:u},variation:{id:h,key:d},ruleKey:u,flagKey:r,ruleType:l,enabled:s,cmabUuid:g})},pt=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("21",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("20",r),r):(null==t||t.info("7",i),null)}(o,a):null;return Object.assign(Object.assign({},ht({configObj:e,userId:t,userAttributes:i,clientEngine:r,clientVersion:s,type:"conversion"})),{event:{id:l,key:n},revenue:u,value:c,tags:o})},ft=(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||p.isNumber(t)&&p.isSafeInteger(t))}(s,n)){const t=function(e,t,i){const r=e.attributeKeyMap[t],s=0===t.indexOf(fe);return r?(s&&(null==i||i.warn("58",t,fe)),r.id):s?t:(null==i||i.warn("62",t),null)}(e,s,i);t&&r.push({entityId:t,key:s,value:n})}}),r};class vt extends Ae{constructor(e){var t;super(e.startupLogs),this.eventQueue=[],this.idGenerator=new rt,this.runningTask=new Map,this.dispatchingEvents=new Map,this.eventEmitter=new Pe,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?$e(this.eventStore,e):Je(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&&!dt(s[0].event,e.event))&&(r.push({request:et(s.map(e=>e.event)),events:s}),s=[]),s.push(e)}),s.length>0&&r.push({request:et(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:et(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&&!Te(e.statusCode)?Promise.reject(new f("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?it(()=>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 f("51","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&&!dt(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=Oe.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(d(Ce,"BatchEventProcessor"))),this.state=Oe.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=Oe.Terminated,this.stopPromise.resolve()}))}}class mt{constructor(){this.waitPromise=Promise.resolve()}run(e){const t=this.waitPromise.then(e);return this.waitPromise=t.catch(()=>{}),t}}const yt=e=>e,bt="optly_event:";class Et extends He{constructor(e){super(),this.operation="async",this.serializer=new mt;const{maxSize:t,ttl:i,store:r,logger:s}=e;"sync"===r.operation?this.store=new Ge(r,bt,yt,yt):this.store=new We(r,bt,yt,yt),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 f("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 It extends Ae{constructor(e){super(),this.dispatcher=e,this.eventEmitter=new Pe}process(e){const t=et([e]),i=this.dispatcher.dispatchEvent(t);return this.eventEmitter.emit("dispatch",t),i}start(){this.isNew()&&(this.state=Oe.Running,this.startPromise.resolve())}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(d(Ce,"ForwardingEventProcessor"))),this.state=Oe.Terminated,this.stopPromise.resolve())}onDispatch(e){return this.eventEmitter.on("dispatch",e)}flushImmediately(){return Promise.resolve()}}const St=Symbol(),xt=e=>{if(!e||"object"!=typeof e||"function"!=typeof e.dispatchEvent)throw new Error("Invalid event dispatcher")},kt=e=>({[St]:e}),Mt=(e,t=vt)=>kt(((e,t=vt)=>{const{eventDispatcher:i,closingEventDispatcher:r,retryOptions:s,eventStore:n}=e;xt(i),r&&xt(r),n&&Ve(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:g.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:g.Warn,message:"Invalid batchSize %s, defaulting to %s",params:[e.batchSize,u]}):d=e.batchSize,new t({eventDispatcher:i,closingEventDispatcher:r,dispatchRepeater:new Ue(c),failedEventRepeater:e.failedEventRetryInterval?new Ue(e.failedEventRetryInterval):void 0,retryConfig:o,batchSize:d,eventStore:n,startupLogs:a})})(e,t));class Rt{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 wt{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 Ct=(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 Ot,At;!function(e){e.VUID="vuid",e.FS_USER_ID="fs_user_id",e.FS_USER_ID_ALIAS="fs-user-id"}(Ot||(Ot={})),function(e){e.IDENTIFIED="identified",e.INITIALIZED="client_initialized"}(At||(At={}));const Pt="fullstack";class Dt extends Ae{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&&!Te(i.statusCode)?Promise.reject(new f("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(),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=Oe.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=Oe.Running,this.startPromise.resolve()}flushImmediately(){return this.isRunning()?this.flush():Promise.resolve()}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(d(Ce,"OdpEventManager"))),this.flush(),this.state=Oe.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=Pt),Array.from(e.identifiers.entries()).forEach(([t,i])=>{Ot.FS_USER_ID_ALIAS!==t.toLowerCase()&&Ot.FS_USER_ID!==t.toLowerCase()||(e.identifiers.delete(t),e.identifiers.set(Ot.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("39"):null===(r=this.logger)||void 0===r||r.error("43"):null===(t=this.logger)||void 0===t||t.error("51","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 Tt="vuid_",Nt=e=>e.startsWith(Tt)&&e.length>5;class jt ext