UNPKG

@optimizely/optimizely-sdk

Version:

JavaScript SDK for Optimizely Feature Experimentation, Optimizely Full Stack (legacy), and Optimizely Rollouts

1 lines 116 kB
"use strict";var e=require("uuid"),t=require("json-schema"),r=require("murmurhash"),i=require("http"),s=require("https"),n=require("url"),o=require("decompress-response");const a="$opt_bot_filtering",l="$opt_bucketing_id",u="$opt_experiment_bucket_map",c="javascript-sdk",d="node-sdk",h="6.3.1",g={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment",HOLDOUT:"holdout"},p="rule",f="experiment",v="boolean",m="double",y="integer",b="string",E="json",I="2",S="3",x="4",O="Optimizely SDK not configured properly yet.",k='No flag was found for key "%s".',M=Math.pow(2,53);function R(e){return"number"==typeof e&&Math.abs(e)<=M}function C(e,t){if(!e)return{};const r={};return w(e,t,r),r}function w(e,t,r){e&&e.forEach(e=>{r[e[t]]=e})}function A(e){return Object.keys(e).map(t=>e[t])}function P(e){return Object.keys(e).map(t=>[t,e[t]])}function D(e,t){let r;for(const i of e)if(t(i)){r=i;break}return r}function F(e,...t){let r=0;return e.replace(/%s/g,function(){const e=t[r++],i=typeof e;return"function"===i?e():"string"===i?e:String(e)})}function T(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}var N,j={checkArrayEquality:T,currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:R,keyBy:C,uuid:function(){return e.v4()},isNumber:function(e){return"number"==typeof e},getTimestamp:function(){return(new Date).getTime()},groupBy:function(e,t){const r={};return e.forEach(e=>{const i=t(e);r[i]=r[i]||[],r[i].push(e)}),A(r)},objectValues:A,objectEntries:P,find:D,sprintf:F};class _ extends Error{constructor(e,...t){super(),this.resolved=!1,this.name="OptimizelyError",this.baseMessage=e,this.params=t,Object.setPrototypeOf(this,_.prototype)}setMessage(e){this.resolved||(this.message=F(e.resolve(this.baseMessage),...this.params),this.resolved=!0)}}exports.LogLevel=void 0,(N=exports.LogLevel||(exports.LogLevel={}))[N.Debug=0]="Debug",N[N.Info=1]="Info",N[N.Warn=2]="Warn",N[N.Error=3]="Error";const U={[exports.LogLevel.Debug]:"DEBUG",[exports.LogLevel.Info]:"INFO",[exports.LogLevel.Warn]:"WARN",[exports.LogLevel.Error]:"ERROR"},L={[exports.LogLevel.Debug]:"debug",[exports.LogLevel.Info]:"info",[exports.LogLevel.Warn]:"warn",[exports.LogLevel.Error]:"error"};class V{constructor(e){this.prefix=e||"[OPTIMIZELY]"}log(e,t){const r=`${this.prefix} - ${U[e]} ${this.getTime()} ${t}`;this.consoleLog(e,r)}getTime(){return(new Date).toISOString()}consoleLog(e,t){(console[L[e]]||console.log).call(console,t)}}class K{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 K({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(exports.LogLevel.Info,e,t)}debug(e,...t){this.log(exports.LogLevel.Debug,e,t)}warn(e,...t){this.log(exports.LogLevel.Warn,e,t)}error(e,...t){this.log(exports.LogLevel.Error,e,t)}handleLog(e,t,r){const i=r.length>0?`${this.prefix}${F(t,...r)}`:`${this.prefix}${t}`;this.logHandler.log(e,i)}log(e,t,r){if(e<this.level)return;if(t instanceof Error)return t instanceof _&&t.setMessage(this.errorResolver),void this.handleLog(e,t.message,[]);let i=this.errorResolver;if(e<exports.LogLevel.Warn){if(!this.infoResolver)return;i=this.infoResolver}const s=i.resolve(t);this.handleLog(e,s,r)}}const q="30",B=["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."],z="12",H="27",$="35",J="53",G="57",W="59",Q="61",Y=["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."],X={resolve(e){const t=parseInt(e);return B[t]||e}},Z={resolve(e){const t=parseInt(e);return Y[t]||e}},ee={level:exports.LogLevel.Debug,infoResolver:X,errorResolver:Z},te={level:exports.LogLevel.Info,infoResolver:X,errorResolver:Z},re={level:exports.LogLevel.Warn,errorResolver:Z},ie={level:exports.LogLevel.Error,errorResolver:Z},se=Symbol(),ne={[se]:ee},oe={[se]:te},ae={[se]:re},le={[se]:ie},ue=Symbol();class ce{constructor(e,t,r){this.errorHandler=e,this.messageResolver=t,this.name=r||""}notify(e){e instanceof _&&e.setMessage(this.messageResolver),this.errorHandler.handleError(e)}child(e){return new ce(this.errorHandler,this.messageResolver,e)}}const de=Symbol(),he=["and","or","not"];function ge(e,t){if(Array.isArray(e)){let r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===he.indexOf(r)&&(r="or",i=e),r){case"and":return function(e,t){let r=!1;if(Array.isArray(e)){for(let i=0;i<e.length;i++){const s=ge(e[i],t);if(!1===s)return!1;null===s&&(r=!0)}return!r||null}return null}(i,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){const r=ge(e[0],t);return null===r?null:!r}return null}(i,t);default:return function(e,t){let r=!1;if(Array.isArray(e)){for(let i=0;i<e.length;i++){const s=ge(e[i],t);if(!0===s)return!0;null===s&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}class pe{constructor(e,t,r){var i,s;this.sdkKey=null!==(i=e.sdkKey)&&void 0!==i?i:"",this.environmentKey=null!==(s=e.environmentKey)&&void 0!==s?s:"",this.attributes=e.attributes,this.audiences=pe.getAudiences(e),this.events=e.events,this.revision=e.revision;const n=(e.featureFlags||[]).reduce((e,t)=>(e[t.id]=t.variables,e),{}),o=pe.getVariableIdMap(e),{experimentsMapById:a,experimentsMapByKey:l}=pe.getExperimentsMap(e,n,o,r);this.experimentsMap=l,this.featuresMap=pe.getFeaturesMap(e,n,a,o),this.datafile=t}getDatafile(){return this.datafile}static getAudiences(e){const t=[],r=[];return(e.typedAudiences||[]).forEach(e=>{t.push({id:e.id,conditions:JSON.stringify(e.conditions),name:e.name}),r.push(e.id)}),(e.audiences||[]).forEach(e=>{-1===r.indexOf(e.id)&&"$opt_dummy_audience"!=e.id&&t.push({id:e.id,conditions:JSON.stringify(e.conditions),name:e.name})}),t}static getSerializedAudiences(e,t){let r="";if(e){let i="";e.forEach(e=>{let s="";if(e instanceof Array)s=pe.getSerializedAudiences(e,t),s=`(${s})`;else if(he.indexOf(e)>-1)i=e.toUpperCase();else{const s=t[e]?t[e].name:e;r||"NOT"===i?(i=""===i?"OR":i,r=""===r?`${i} "${t[e].name}"`:r.concat(` ${i} "${s}"`)):r=`"${s}"`}""!==s&&(""!==r||"NOT"===i?(i=""===i?"OR":i,r=""===r?`${i} ${s}`:r.concat(` ${i} ${s}`)):r=r.concat(s))})}return r}static getExperimentAudiences(e,t){return e.audienceConditions?pe.getSerializedAudiences(e.audienceConditions,t.audiencesById):""}static mergeFeatureVariables(e,t,r,i,s){const n=(e[r]||[]).reduce((e,t)=>(e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e),{});return(i||[]).forEach(e=>{const r=t[e.id],i={id:e.id,key:r.key,type:r.type,value:s?e.value:r.defaultValue};n[r.key]=i}),n}static getVariationsMap(e,t,r,i){let s={};return s=e.reduce((e,s)=>{const n=pe.mergeFeatureVariables(t,r,i,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,r,i,s){return i.map(i=>({id:i.id,key:i.key,audiences:pe.getExperimentAudiences(i,e),variationsMap:pe.getVariationsMap(i.variations,t,s,r)}))}static getRolloutExperimentIds(e){const t=[];return(e||[]).forEach(e=>{e.experiments.forEach(e=>{t.push(e.id)})}),t}static getExperimentsMap(e,t,r,i){const 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=pe.getVariationsMap(a.variations,t,r,u.toString()),d={id:a.id,key:a.key,audiences:pe.getExperimentAudiences(a,e),variationsMap:c};n[a.id]=d,o[a.key]&&i&&i.warn(`Duplicate experiment keys found in datafile: ${a.key}`),o[a.key]=d}),{experimentsMapById:n,experimentsMapByKey:o}}static getExperimentsKeyMap(e){const t={};for(const r in e){const i=e[r];t[i.key]=i}return t}static getFeaturesMap(e,t,r,i){const s={};return e.featureFlags.forEach(n=>{const o={},a=[];n.experimentIds.forEach(e=>{const t=r[e];t&&(o[t.key]=t),a.push(r[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=pe.getDeliveryRules(e,t,n.id,c.experiments,i)),s[n.key]={id:n.id,key:n.key,experimentRules:a,deliveryRules:u,experimentsMap:o,variablesMap:l}}),s}}const fe=[I,S,x];var ve=function(e){if(!e)throw new _("32");if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new _("18")}if("object"!=typeof e||Array.isArray(e)||null===e)throw new _("18");if(-1===fe.indexOf(e.version))throw new _("19",e.version);return e};class me{constructor(e,t,r,i){this.apiKey=e,this.apiHost=t,this.pixelUrl=r,this.segmentsToCheck=i}equals(e){return this.apiHost===e.apiHost&&this.apiKey===e.apiKey&&this.pixelUrl===e.pixelUrl&&T(this.segmentsToCheck,e.segmentsToCheck)}}const ye="Running",be="$opt_";const Ee=function(e,t=null){const r=function(e){var t,r;const i=Object.assign({},e);return i.audiences=(e.audiences||[]).map(e=>Object.assign({},e)),i.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),i.featureFlags=(e.featureFlags||[]).map(e=>Object.assign({},e)),i.groups=(e.groups||[]).map(e=>{const t=Object.assign({},e);return t.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),t}),i.rollouts=(e.rollouts||[]).map(e=>{const t=Object.assign({},e);return t.experiments=(e.experiments||[]).map(e=>Object.assign({},e)),t}),i.environmentKey=null!==(t=e.environmentKey)&&void 0!==t?t:"",i.sdkKey=null!==(r=e.sdkKey)&&void 0!==r?r:"",i}(e);let i;r.region||(r.region="US"),r.__datafileStr=null===t?JSON.stringify(e):t,(r.audiences||[]).forEach(e=>{e.conditions=JSON.parse(e.conditions)}),r.audiencesById={},w(r.audiences,"id",r.audiencesById),w(r.typedAudiences,"id",r.audiencesById),r.attributes=r.attributes||[],r.attributeKeyMap={},r.attributeIdMap={},r.attributes.forEach(e=>{r.attributeKeyMap[e.key]=e,r.attributeIdMap[e.id]=e}),r.eventKeyMap=C(r.events,"key"),r.groupIdMap=C(r.groups,"id"),Object.keys(r.groupIdMap||{}).forEach(e=>{i=r.groupIdMap[e].experiments,(i||[]).forEach(t=>{t.groupId=e,r.experiments.push(t)})}),r.rolloutIdMap=C(r.rollouts||[],"id"),A(r.rolloutIdMap||{}).forEach(e=>{(e.experiments||[]).forEach(e=>{e.isRollout=!0,r.experiments.push(e),e.variationKeyMap=C(e.variations,"key")})});const s=new Set;Object.keys(r.audiencesById).map(e=>Se(r.audiencesById[e])).forEach(e=>{e.forEach(e=>{s.add(e)})});const n=Array.from(s);let o=!1,a="",l="",u="";return r.integrations&&(r.integrationKeyMap=C(r.integrations,"key"),r.integrations.forEach(e=>{if(!("key"in e))throw new _("29");"odp"===e.key&&(o=!0,l=l||e.publicKey||"",a=a||e.host||"",u=u||e.pixelUrl||"")})),r.odpIntegrationConfig=o?{integrated:!0,odpConfig:new me(l,a,u,n)}:{integrated:!1},r.experimentKeyMap=C(r.experiments,"key"),r.experimentIdMap=C(r.experiments,"id"),r.variationIdMap={},r.variationVariableUsageMap={},(r.experiments||[]).forEach(e=>{e.variationKeyMap=C(e.variations,"key"),w(e.variations,"id",r.variationIdMap),A(e.variationKeyMap||{}).forEach(e=>{e.variables&&(r.variationVariableUsageMap[e.id]=C(e.variables,"id"))})}),r.experimentFeatureMap={},r.featureKeyMap=C(r.featureFlags||[],"key"),A(r.featureKeyMap||{}).forEach(e=>{e.variables.forEach(e=>{e.type===b&&e.subType===E&&(e.type=E,delete e.subType)}),e.variableKeyMap=C(e.variables,"key"),(e.experimentIds||[]).forEach(t=>{r.experimentFeatureMap[t]?r.experimentFeatureMap[t].push(e.id):r.experimentFeatureMap[t]=[e.id]})}),r.flagRulesMap={},(r.featureFlags||[]).forEach(e=>{const t=[];e.experimentIds.forEach(e=>{const i=r.experimentIdMap[e];i&&t.push(i)});const i=r.rolloutIdMap[e.rolloutId];i&&t.push(...i.experiments),r.flagRulesMap[e.key]=t}),r.flagVariationsMap={},P(r.flagRulesMap||{}).forEach(([e,t])=>{const i=[];t.forEach(e=>{e.variations.forEach(e=>{D(i,t=>t.id===e.id)||i.push(e)})}),r.flagVariationsMap[e]=i}),Ie(r),r},Ie=e=>{e.holdouts=e.holdouts||[],e.holdoutIdMap=C(e.holdouts,"id"),e.globalHoldouts=[],e.includedHoldouts={},e.excludedHoldouts={},e.flagHoldoutsMap={};const t=C(e.featureFlags,"id");e.holdouts.forEach(r=>{r.includedFlags||(r.includedFlags=[]),r.excludedFlags||(r.excludedFlags=[]),r.variationKeyMap=C(r.variations,"key"),w(r.variations,"id",e.variationIdMap),0===r.includedFlags.length?(e.globalHoldouts.push(r),r.excludedFlags.forEach(i=>{const s=t[i];if(s){const t=s.key;e.excludedHoldouts[t]||(e.excludedHoldouts[t]=[]),e.excludedHoldouts[t].push(r)}})):r.includedFlags.forEach(i=>{const s=t[i];if(s){const t=s.key;e.includedHoldouts[t]||(e.includedHoldouts[t]=[]),e.includedHoldouts[t].push(r)}})})},Se=function(e){return e.conditions?xe(e.conditions):[]},xe=e=>{const t=[];return function(e){return["and","or","not"].includes(e)}(e)?[]:(Array.isArray(e)?e.forEach(e=>t.push(...xe(e))):"qualified"===e.match&&t.push(e.value),t)};const Oe=function(e,t){const r=e.experimentKeyMap[t];if(!r)throw new _("22",t);return r.status},ke=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){const r=e.experimentKeyMap[t];if(r)return r}throw new _("9",t)},Me=function(e,t,r){if(!e)return null;const i=D(e.flagVariationsMap[t],e=>e.key===r);return i||null},Re=function(e,t,r){if(e.featureKeyMap.hasOwnProperty(t)){const r=e.featureKeyMap[t];if(r)return r}return null==r||r.error(z,t),null},Ce=function(e){return!!e.sendFlagDecisions},we=()=>{};function Ae(){let e=we,t=we;const r=new Promise((r,i)=>{e=r,t=i});return{promise:r,resolve:e,reject:t,then:r.then.bind(r)}}const Pe="%s failed to start, reason: %s",De="%s stopped before running";var Fe;!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"}(Fe||(Fe={}));class Te{constructor(e=[]){this.disposable=!1,this.state=Fe.New,this.startPromise=Ae(),this.stopPromise=Ae(),this.startupLogs=e,this.startPromise.promise.catch(()=>{}),this.stopPromise.promise.catch(()=>{})}makeDisposable(){this.disposable=!0}setLogger(e){this.logger=e}printStartupLogs(){if(this.logger)for(const{level:e,message:t,params:r}of this.startupLogs){const i=L[e];this.logger[i].call(this.logger,t,...r)}}onRunning(){return this.startPromise.promise}onTerminated(){return this.stopPromise.promise}getState(){return this.state}isStarting(){return this.state===Fe.Starting}isRunning(){return this.state===Fe.Running}isNew(){return this.state===Fe.New}isDone(){return[Fe.Stopping,Fe.Terminated,Fe.Failed].includes(this.state)}start(){this.printStartupLogs()}}class Ne{constructor(){this.id=0,this.listeners={}}on(e,t){var r;this.listeners[e]||(this.listeners[e]=new Map);const i=this.id++;return null===(r=this.listeners[e])||void 0===r||r.set(i,t),()=>{var t;null===(t=this.listeners[e])||void 0===t||t.delete(i)}}emit(e,t){const r=this.listeners[e];r&&r.forEach(e=>{e(t)})}removeListeners(e){var t;null===(t=this.listeners[e])||void 0===t||t.clear()}removeAllListeners(){this.listeners={}}}class je extends Te{constructor(e){super(),this.eventEmitter=new Ne,this.jsonSchemaValidator=e.jsonSchemaValidator,this.datafile=e.datafile,this.datafileManager=e.datafileManager,e.logger&&this.setLogger(e.logger)}setLogger(e){var t;this.logger=e,this.logger.setName("ProjectConfigManager"),null===(t=this.datafileManager)||void 0===t||t.setLogger(e.child())}start(){var e,t,r;this.isNew()&&(this.state=Fe.Starting,this.datafile||this.datafileManager?(this.datafile&&this.handleNewDatafile(this.datafile,!0),null===(e=this.datafileManager)||void 0===e||e.start(),null===(t=this.datafileManager)||void 0===t||t.onUpdate(this.handleNewDatafile.bind(this)),null===(r=this.datafileManager)||void 0===r||r.onRunning().catch(e=>{this.handleDatafileManagerError(e)})):this.handleInitError(new Error("sdkKey or datafile must be provided")))}makeDisposable(){var e;super.makeDisposable(),null===(e=this.datafileManager)||void 0===e||e.makeDisposable()}handleInitError(e){var t,r;null===(t=this.logger)||void 0===t||t.error(e),this.state=Fe.Failed,null===(r=this.datafileManager)||void 0===r||r.stop(),this.startPromise.reject(e),this.stopPromise.reject(e)}handleDatafileManagerError(e){var t;null===(t=this.logger)||void 0===t||t.error(Pe,"DatafileManager",e.message),this.isStarting()&&this.handleInitError(new Error(F(Pe,"DatafileManager",e.message)))}handleNewDatafile(e,t=!1){var r,i;if(!this.isDone())try{const t=function(e){var t,r;const i=ve(e.datafile);e.jsonSchemaValidator?(e.jsonSchemaValidator(i),null===(t=e.logger)||void 0===t||t.info("38")):null===(r=e.logger)||void 0===r||r.info("28");const s=[i];return"string"==typeof e.datafile&&s.push(e.datafile),Ee(...s)}({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:this.logger});this.isStarting()&&(this.state=Fe.Running,this.startPromise.resolve()),(null===(r=this.projectConfig)||void 0===r?void 0:r.revision)!==t.revision&&(this.projectConfig=t,this.optimizelyConfig=void 0,this.eventEmitter.emit("update",t))}catch(e){null===(i=this.logger)||void 0===i||i.error(e);(this.isStarting()&&!this.datafileManager||this.isStarting()&&!t)&&this.handleInitError(new Error("got invalid datafile"))}}getConfig(){return this.projectConfig}getOptimizelyConfig(){var e,t,r,i;return!this.optimizelyConfig&&this.projectConfig&&(this.optimizelyConfig=(e=this.projectConfig,i=this.projectConfig,t=i.__datafileStr,r=this.logger,new pe(e,t,r))),this.optimizelyConfig}onUpdate(e){return this.eventEmitter.on("update",e)}stop(){if(!this.isDone()){if((this.isNew()||this.isStarting())&&this.startPromise.reject(new Error(F(De,"ProjectConfigManager"))),this.state=Fe.Stopping,this.eventEmitter.removeAllListeners(),!this.datafileManager)return this.state=Fe.Terminated,void this.stopPromise.resolve();this.datafileManager.stop(),this.datafileManager.onTerminated().then(()=>{this.state=Fe.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=Fe.Failed,this.stopPromise.reject(e)})}}}function _e(e,t,r,i){return new(r||(r=Promise))(function(s,n){function o(e){try{l(i.next(e))}catch(e){n(e)}}function a(e){try{l(i.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,a)}l((i=i.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;const Ue=e=>e>=200&&e<400;class Le extends Te{constructor(e){super(e.startupLogs);const{autoUpdate:t=!1,sdkKey:r,datafileAccessToken:i,customHeaders:s,urlTemplate:n,cache:o,initRetry:a,repeater:l,requestHandler:u,logger:c}=e;this.cache=o,this.cacheKey="opt-datafile-"+r,this.sdkKey=r,this.datafileAccessToken=i,this.customHeaders=s,this.requestHandler=u,this.emitter=new Ne,this.autoUpdate=t,this.initRetryRemaining=a,this.repeater=l,c&&this.setLogger(c);const d=n||(i?"https://config.optimizely.com/datafiles/auth/%s.json":"https://cdn.optimizely.com/datafiles/%s.json");this.datafileUrl=F(d,this.sdkKey)}setLogger(e){this.logger=e,this.logger.setName("PollingDatafileManager")}onUpdate(e){return this.emitter.on("update",e)}get(){return this.currentDatafile}start(){this.isNew()&&(super.start(),this.state=Fe.Starting,this.setDatafileFromCacheIfAvailable(),this.repeater.setTask(this.syncDatafile.bind(this)),this.repeater.start(!0))}makeDisposable(){var e;super.makeDisposable(),this.initRetryRemaining=Math.min(null!==(e=this.initRetryRemaining)&&void 0!==e?e:5,5)}stop(){var e;this.isDone()||((this.isNew()||this.isStarting())&&this.startPromise.reject(new Error(F(De,"PollingDatafileManager"))),this.state=Fe.Terminated,this.repeater.stop(),null===(e=this.currentRequest)||void 0===e||e.abort(),this.emitter.removeAllListeners(),this.stopPromise.resolve())}handleInitFailure(){this.state=Fe.Failed,this.repeater.stop();const e=new Error("Failed to fetch datafile");this.startPromise.reject(e),this.stopPromise.reject(e)}handleError(e){var t,r;this.isDone()||(e instanceof Error?null===(t=this.logger)||void 0===t||t.error("4",e.message,e):null===(r=this.logger)||void 0===r||r.error("3",e),this.isStarting()&&void 0!==this.initRetryRemaining&&(0===this.initRetryRemaining?this.handleInitFailure():this.initRetryRemaining--))}onRequestRejected(e){return _e(this,void 0,void 0,function*(){return this.handleError(e),Promise.reject(e)})}onRequestResolved(e){return _e(this,void 0,void 0,function*(){if(this.isDone())return;if(this.saveLastModified(e.headers),!Ue(e.statusCode))return this.handleError(e.statusCode),Promise.reject(new Error);const t=this.getDatafileFromResponse(e);t&&(this.handleDatafile(t),this.autoUpdate&&!this.disposable||this.repeater.stop())})}makeDatafileRequest(){var e,t;const r=Object.assign({},this.customHeaders);return this.lastResponseLastModified&&(r["if-modified-since"]=this.lastResponseLastModified),this.datafileAccessToken&&(null===(e=this.logger)||void 0===e||e.debug("0"),r.Authorization=`Bearer ${this.datafileAccessToken}`),null===(t=this.logger)||void 0===t||t.debug("17",this.datafileUrl,()=>JSON.stringify(r)),this.requestHandler.makeRequest(this.datafileUrl,r,"GET")}syncDatafile(){return _e(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=Fe.Running),this.emitter.emit("update",e))}getDatafileFromResponse(e){var t;if(null===(t=this.logger)||void 0===t||t.debug("23",e.statusCode),304!==e.statusCode)return e.body}saveLastModified(e){var t;const r=e["last-modified"]||e["Last-Modified"];void 0!==r&&(this.lastResponseLastModified=r,null===(t=this.logger)||void 0===t||t.debug("24",this.lastResponseLastModified))}setDatafileFromCacheIfAvailable(){return _e(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 Ve{constructor(e,t,r){this.base=e,this.max=t,this.maxJitter=r,this.maxJitter>this.base/2&&(this.maxJitter=this.base/2),this.maxJitter=r,this.current=e}backoff(){const e=this.current+this.maxJitter*Math.random();return this.current=Math.min(2*this.current,this.max),e}reset(){this.current=this.base}}class Ke{constructor(e){this.value=e}backoff(){return this.value}reset(){}}class qe{constructor(e,t){this.failureCount=0,this.running=!1,this.interval=e,this.backoffController=t}isRunning(){return this.running}handleSuccess(){var e;this.failureCount=0,null===(e=this.backoffController)||void 0===e||e.reset(),this.setTimer(this.interval)}handleFailure(){var e,t;this.failureCount++;const r=null!==(t=null===(e=this.backoffController)||void 0===e?void 0:e.backoff())&&void 0!==t?t:this.interval;this.setTimer(r)}setTimer(e){this.running&&(this.timeoutId=setTimeout(this.executeTask.bind(this),e))}executeTask(){this.task&&this.task(this.failureCount).then(this.handleSuccess.bind(this),this.handleFailure.bind(this))}start(e){var t;this.running=!0,e?(t=this.executeTask.bind(this),"function"==typeof queueMicrotask?queueMicrotask(t):Promise.resolve().then(t)):this.setTimer(this.interval)}stop(){this.running=!1,clearInterval(this.timeoutId)}reset(){var e;this.failureCount=0,null===(e=this.backoffController)||void 0===e||e.reset(),this.stop()}setTask(e){this.task=e}}const Be=e=>{const t=[];if(!e||"object"!=typeof e)throw new Error("Invalid store");for(const r of["set","get","remove","getKeys"])"function"!=typeof e[r]&&t.push("Invalid store method %s".replace("%s",r));if(t.length>0)throw new Error(t.join(", "))},ze="Invalid config manager",He=Symbol(),$e=e=>{var t;e.cache&&Be(e.cache);const r=null!==(t=e.updateInterval)&&void 0!==t?t:3e5,i=new Ve(1e3,r,500),s=new qe(r,i),n=[];r<3e4&&n.push({level:exports.LogLevel.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 Le(o);return new je({datafile:e.datafile,datafileManager:a,jsonSchemaValidator:e.jsonSchemaValidator})};class Je{constructor(){this.operation="sync"}}class Ge{constructor(){this.operation="async"}}const We=(e,t)=>e instanceof Je?e.getBatched(t):t.map(t=>e.get(t)),Qe=(e,t)=>e instanceof Ge?e.getBatched(t):Promise.all(t.map(t=>e.get(t)));class Ye extends Je{constructor(e,t,r,i){super(),this.operation="sync",this.store=e,this.prefix=t,this.transformGet=r,this.transformSet=i}addPrefix(e){return`${this.prefix}${e}`}removePrefix(e){return e.substring(this.prefix.length)}set(e,t){return this.store.set(this.addPrefix(e),this.transformSet(t))}get(e){const t=this.store.get(this.addPrefix(e));return t?this.transformGet(t):void 0}remove(e){return this.store.remove(this.addPrefix(e))}getInternalKeys(){return this.store.getKeys().filter(e=>e.startsWith(this.prefix))}getKeys(){return this.getInternalKeys().map(e=>this.removePrefix(e))}getBatched(e){return We(this.store,e.map(e=>this.addPrefix(e))).map(e=>e?this.transformGet(e):void 0)}}class Xe{constructor(e,t,r,i){this.operation="async",this.cache=e,this.prefix=t,this.transformGet=r,this.transformSet=i}addPrefix(e){return`${this.prefix}${e}`}removePrefix(e){return e.substring(this.prefix.length)}set(e,t){return this.cache.set(this.addPrefix(e),this.transformSet(t))}get(e){return _e(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 _e(this,void 0,void 0,function*(){return this.cache.getKeys().then(e=>e.filter(e=>e.startsWith(this.prefix)))})}getKeys(){return _e(this,void 0,void 0,function*(){return this.getInternalKeys().then(e=>e.map(e=>this.removePrefix(e)))})}getBatched(e){return _e(this,void 0,void 0,function*(){return(yield Qe(this.cache,e.map(e=>this.addPrefix(e)))).map(e=>e?this.transformGet(e):void 0)})}}const Ze="campaign_activated",et="custom",tt={US:"https://logx.optimizely.com/v1/events",EU:"https://eu.logx.optimizely.com/v1/events"};function rt(e){const t=[],r=e[0];return e.forEach(e=>{if("conversion"===e.type||"impression"===e.type){const r=function(e){const t={snapshots:[],visitor_id:e.user.id,attributes:[]};e.user.attributes.forEach(e=>{t.attributes.push({entity_id:e.entityId,key:e.key,type:"custom",value:e.value})}),"boolean"==typeof e.context.botFiltering&&t.attributes.push({entity_id:a,key:a,type:et,value:e.context.botFiltering});return t}(e);"impression"===e.type?r.snapshots.push(function(e){var t,r;const{layer:i,experiment:s,variation:n,ruleKey:o,flagKey:a,ruleType:l,enabled:u,cmabUuid:c}=e,d=i?i.id:null,h=null!==(t=null==s?void 0:s.id)&&void 0!==t?t:"",g=null!==(r=null==n?void 0:n.id)&&void 0!==r?r:"",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:Ze,uuid:e.uuid}]}}(e)):"conversion"===e.type&&r.snapshots.push(function(e){const t=Object.assign({},e.tags);delete t.revenue,delete t.value;const r={entity_id:e.event.id,key:e.event.key,timestamp:e.timestamp,uuid:e.uuid};e.tags&&(r.tags=e.tags);null!=e.value&&(r.value=e.value);null!=e.revenue&&(r.revenue=e.revenue);return{events:[r]}}(e)),t.push(r)}}),{client_name:r.context.clientName,client_version:r.context.clientVersion,account_id:r.context.accountId,project_id:r.context.projectId,revision:r.context.revision,anonymize_ip:r.context.anonymizeIP,enrich_decisions:!0,visitors:t}}function it(e){var t;const r=(null===(t=e[0])||void 0===t?void 0:t.context.region)||"US";return{url:tt[r]||tt.US,httpVerb:"POST",params:rt(e)}}const st=(e,t,r,i,s)=>{e().then(e=>{t.resolve(e)}).catch(n=>{var o;if(0===s)return void t.reject(n);if(r.cancelled)return void t.reject(new _("49"));const a=null!==(o=null==i?void 0:i.backoff())&&void 0!==o?o:0;setTimeout(()=>{st(e,t,r,i,s=void 0===s?void 0:s-1)},a)})},nt=(e,t,r)=>{const i=Ae(),s={cancelled:!1};return st(e,i,s,t,r),{cancelRetry:()=>{s.cancelled=!0},result:i.promise}};class ot{constructor(){this.idSuffixOffset=0}getId(){const e=1e4+this.idSuffixOffset;this.idSuffixOffset=(this.idSuffixOffset+1)%1e4;return`${Date.now()}${e}`}}function at(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function lt(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function ut(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==r&&r}const ct={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables",FLAG:"flag"},dt={ACTIVATE:"ACTIVATE",DECISION:"DECISION",LOG_EVENT:"LOG_EVENT",OPTIMIZELY_CONFIG_UPDATE:"OPTIMIZELY_CONFIG_UPDATE",TRACK:"TRACK"};var ht,gt;!function(e){e.BOOLEAN="boolean",e.DOUBLE="double",e.INTEGER="integer",e.STRING="string",e.JSON="json"}(ht||(ht={})),exports.OptimizelyDecideOption=void 0,(gt=exports.OptimizelyDecideOption||(exports.OptimizelyDecideOption={})).DISABLE_DECISION_EVENT="DISABLE_DECISION_EVENT",gt.ENABLED_FLAGS_ONLY="ENABLED_FLAGS_ONLY",gt.IGNORE_USER_PROFILE_SERVICE="IGNORE_USER_PROFILE_SERVICE",gt.INCLUDE_REASONS="INCLUDE_REASONS",gt.EXCLUDE_VARIABLES="EXCLUDE_VARIABLES",gt.IGNORE_CMAB_CACHE="IGNORE_CMAB_CACHE",gt.RESET_CMAB_CACHE="RESET_CMAB_CACHE",gt.INVALIDATE_USER_CMAB_CACHE="INVALIDATE_USER_CMAB_CACHE";const pt=(e,t)=>{const r=e.context,i=t.context;return(r.region||"US")===(i.region||"US")&&r.accountId===i.accountId&&r.projectId===i.projectId&&r.clientName===i.clientName&&r.clientVersion===i.clientVersion&&r.revision===i.revision&&r.anonymizeIP===i.anonymizeIP&&r.botFiltering===i.botFiltering},ft=({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:s,type:n})=>({type:n,timestamp:j.currentTimestamp(),uuid:j.uuid(),context:{region:e.region,accountId:e.accountId,projectId:e.projectId,revision:e.revision,clientName:i,clientVersion:s,anonymizeIP:e.anonymizeIP||!1,botFiltering:e.botFiltering},user:{id:t,attributes:yt(e,r)}}),vt=function({configObj:e,decisionObj:t,userId:r,flagKey:i,enabled:s,userAttributes:n,clientEngine:o,clientVersion:a}){const l=t.decisionSource,u=at(t),c=function(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.id)&&void 0!==r?r:null}(t),d=lt(t),h=function(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.id)&&void 0!==r?r:null}(t),p=t.cmabUuid,f=null!==c?l===g.HOLDOUT?"":function(e,t){const r=e.experimentIdMap[t];if(!r)throw new _("21",t);return r.layerId}(e,c):null;return Object.assign(Object.assign({},ft({configObj:e,userId:r,userAttributes:n,clientEngine:o,clientVersion:a,type:"impression"})),{layer:{id:f},experiment:{id:c,key:u},variation:{id:h,key:d},ruleKey:u,flagKey:i,ruleType:l,enabled:s,cmabUuid:p})},mt=function({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:s,eventKey:n,eventTags:o},a){const l=function(e,t){const r=e.eventKeyMap[t];return r?r.id:null}(e,n),u=o?function(e,t){const r=e.revenue;if(null==r)return null;const i="string"==typeof r?parseInt(r):Math.trunc(r);return isFinite(i)?(null==t||t.info("21",i),i):(null==t||t.info("6",r),null)}(o,a):null,c=o?function(e,t){const r=e.value;if(null==r)return null;const i="string"==typeof r?parseFloat(r):r;return isFinite(i)?(null==t||t.info("20",i),i):(null==t||t.info("7",r),null)}(o,a):null;return Object.assign(Object.assign({},ft({configObj:e,userId:t,userAttributes:r,clientEngine:i,clientVersion:s,type:"conversion"})),{event:{id:l,key:n},revenue:u,value:c,tags:o})},yt=(e,t,r)=>{if(!t)return[];const i=[];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||j.isNumber(t)&&j.isSafeInteger(t))}(s,n)){const t=function(e,t,r){const i=e.attributeKeyMap[t],s=0===t.indexOf(be);return i?(s&&(null==r||r.warn("58",t,be)),i.id):s?t:(null==r||r.warn("62",t),null)}(e,s,r);t&&i.push({entityId:t,key:s,value:n})}}),i};class bt extends Te{constructor(e){var t;super(e.startupLogs),this.eventQueue=[],this.idGenerator=new ot,this.runningTask=new Map,this.dispatchingEvents=new Map,this.eventEmitter=new Ne,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 _e(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?We(this.eventStore,e):Qe(this.eventStore,e),r=[];if(t.forEach(e=>{e&&r.push(e)}),0==r.length)return;r.sort((e,t)=>e.id<t.id?-1:1);const i=[];let s=[];r.forEach(e=>{(s.length===this.batchSize||s.length>0&&!pt(s[0].event,e.event))&&(i.push({request:it(s.map(e=>e.event)),events:s}),s=[]),s.push(e)}),s.length>0&&i.push({request:it(s.map(e=>e.event)),events:s}),i.forEach(e=>{this.dispatchBatch(e,!1)})})}createNewBatch(){if(0==this.eventQueue.length)return;const e=[],t=[];return this.eventQueue.forEach(r=>{e.push(r.event),t.push(r)}),this.eventQueue=[],{request:it(e),events:t}}executeDispatch(e,t=!1){return _e(this,void 0,void 0,function*(){return(t&&this.closingEventDispatcher?this.closingEventDispatcher:this.eventDispatcher).dispatchEvent(e).then(e=>e.statusCode&&!Ue(e.statusCode)?Promise.reject(new _("10",e.statusCode)):Promise.resolve(e))})}dispatchBatch(e,t){const{request:r,events:i}=e;i.forEach(e=>{this.dispatchingEvents.set(e.id,e)});const s=this.retryConfig?nt(()=>this.executeDispatch(r,t),this.retryConfig.backoffProvider(),this.retryConfig.maxRetries):{result:this.executeDispatch(r,t),cancelRetry:()=>{}};this.eventEmitter.emit("dispatch",r);const n=this.idGenerator.getId();this.runningTask.set(n,s),s.result.then(e=>(i.forEach(e=>{var t;null===(t=this.eventStore)||void 0===t||t.remove(e.id)}),Promise.resolve())).catch(e=>{var t;null===(t=this.logger)||void 0===t||t.error(e)}).finally(()=>{this.runningTask.delete(n),i.forEach(e=>this.dispatchingEvents.delete(e.id))})}flush(e=!1){return _e(this,void 0,void 0,function*(){const t=this.createNewBatch();t&&(this.dispatchRepeater.reset(),this.dispatchBatch(t,e))})}process(e){var t;return _e(this,void 0,void 0,function*(){if(!this.isRunning())return Promise.reject(new _("51","BatchEventProcessor"));const r={id:this.idGenerator.getId(),event:e};yield Promise.resolve(null===(t=this.eventStore)||void 0===t?void 0:t.set(r.id,r)).catch(e=>{var t;null===(t=this.logger)||void 0===t||t.error(e)}),this.eventQueue.length>0&&!pt(this.eventQueue[0].event,e)&&this.flush(),this.eventQueue.push(r),this.eventQueue.length==this.batchSize?this.flush():this.dispatchRepeater.isRunning()||this.dispatchRepeater.start()})}start(){var e;this.isNew()&&(super.start(),this.state=Fe.Running,this.disposable||null===(e=this.failedEventRepeater)||void 0===e||e.start(),this.retryFailedEvents(),this.startPromise.resolve())}makeDisposable(){var e,t,r;super.makeDisposable(),this.batchSize=1,this.retryConfig={maxRetries:Math.min(null!==(t=null===(e=this.retryConfig)||void 0===e?void 0:e.maxRetries)&&void 0!==t?t:5,5),backoffProvider:(null===(r=this.retryConfig)||void 0===r?void 0:r.backoffProvider)||(()=>new Ve(200,1e3,500))}}flushImmediately(){return this.isRunning()?this.flush(!0):Promise.resolve()}stop(){var e;this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(F(De,"BatchEventProcessor"))),this.state=Fe.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=Fe.Terminated,this.stopPromise.resolve()}))}}class Et{constructor(){this.waitPromise=Promise.resolve()}run(e){const t=this.waitPromise.then(e);return this.waitPromise=t.catch(()=>{}),t}}const It="optly_event:";class St extends Te{constructor(e){super(),this.dispatcher=e,this.eventEmitter=new Ne}process(e){const t=it([e]),r=this.dispatcher.dispatchEvent(t);return this.eventEmitter.emit("dispatch",t),r}start(){this.isNew()&&(this.state=Fe.Running,this.startPromise.resolve())}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(F(De,"ForwardingEventProcessor"))),this.state=Fe.Terminated,this.stopPromise.resolve())}onDispatch(e){return this.eventEmitter.on("dispatch",e)}flushImmediately(){return Promise.resolve()}}const xt=Symbol(),Ot=e=>{if(!e||"object"!=typeof e||"function"!=typeof e.dispatchEvent)throw new Error("Invalid event dispatcher")},kt=e=>({[xt]:e}),Mt=(e,t=bt)=>kt(((e,t=bt)=>{const{eventDispatcher:r,closingEventDispatcher:i,retryOptions:s,eventStore:n}=e;Ot(r),i&&Ot(i),n&&Be(n);const o=s?{maxRetries:s.maxRetries,backoffProvider:()=>{var e,t;const r=null!==(e=null==s?void 0:s.minBackoff)&&void 0!==e?e:200,i=null!==(t=null==s?void 0:s.maxBackoff)&&void 0!==t?t:1e3;return new Ve(r,i,50)}}:void 0,a=[],{defaultFlushInterval:l,defaultBatchSize:u}=e;let c=l;void 0===e.flushInterval||e.flushInterval<=0?a.push({level:exports.LogLevel.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:exports.LogLevel.Warn,message:"Invalid batchSize %s, defaulting to %s",params:[e.batchSize,u]}):d=e.batchSize,new t({eventDispatcher:r,closingEventDispatcher:i,dispatchRepeater:new qe(c),failedEventRepeater:e.failedEventRetryInterval?new qe(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 Ct{constructor(e,t,r){this.requestHandler=e,this.requestGenerator=t,r&&this.setLogger(r)}setLogger(e){this.logger=e,this.logger.setName("OdpEventApiManager")}sendEvents(e,t){return _e(this,void 0,void 0,function*(){if(0===t.length)return{};const{method:r,endpoint:i,headers:s,data:n}=this.requestGenerator(e,t);return this.requestHandler.makeRequest(i,s,r,n).responsePromise})}}const wt=(e,t)=>{const{apiHost:r,apiKey:i}=e;return{method:"POST",endpoint:`${r}/v3/events`,headers:{"Content-Type":"application/json","x-api-key":i},data:JSON.stringify(t,(e,t)=>t instanceof Map?Object.fromEntries(t):t)}};var At,Pt;!function(e){e.VUID="vuid",e.FS_USER_ID="fs_user_id",e.FS_USER_ID_ALIAS="fs-user-id"}(At||(At={})),function(e){e.IDENTIFIED="identified",e.INITIALIZED="client_initialized"}(Pt||(Pt={}));const Dt="fullstack";class Ft extends Te{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 _e(this,void 0,void 0,function*(){const r=yield this.apiManager.sendEvents(e,t);return r.statusCode&&!Ue(r.statusCode)?Promise.reject(new _("10",r.statusCode)):yield Promise.resolve(r)})}flush(){return _e(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(),nt(()=>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=Fe.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=Fe.Running,this.startPromise.resolve()}flushImmediately(){return this.isRunning()?this.flush():Promise.resolve()}stop(){this.isDone()||(this.isNew()&&this.startPromise.reject(new Error(F(De,"OdpEventManager"))),this.flush(),this.state=Fe.Terminated,this.stopPromise.resolve())}sendEvent(e){var t,r,i,s,n,o;this.isRunning()?(null===(r=this.odpIntegrationConfig)||void 0===r?void 0:r.integrated)?0!==e.identifiers.size?this.isDataValid(e.data)?e.action?(""===e.type&&(e.type=Dt),Array.from(e.identifiers.entries()).forEach(([t,r])=>{At.FS_USER_ID_ALIAS!==t.toLowerCase()&&At.FS_USER_ID!==t.toLowerCase()||(e.identifiers.delete(t),e.identifiers.set(At.FS_USER_ID,r))}),this.processEvent(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===(i=this.logger)||void 0===i||i.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,r)=>e&&(null===r||t.includes(typeof r)),!0)}processEvent(e){this.queue.push(e),this.queue.length===this.batchSize?this.flush():this.repeater.isRunning()||this.repeater.start()}}class Tt{constructor(e,t,r,i){this.type=e,this.action=t,this.identifiers=null!=r?r:new Map,this.data=null!=i?i:new Map}}const Nt="vuid_",jt=e=>e.startsWith(Nt)&&e.length>5;class _t extends Te{constructor(e){if(super(),this.clientEngine=c,this.clientVersion=h,this.segmentManager=e.segmentManager,this.eventManager=e.eventManager,this.configPromise=Ae(),e.userAgentParser){const{os:t,device:r}=e.userAgentParser.parseUserAgentInfo(),i={os:t.name,os_version:t.version,device_type:r.type,model:r.model};this.userAgentData=new Map(Object.entries(i).filter(([e,t])=>null!=t&&null!=t))}e.logger&&this.setLogger(e.logger)}setLogger(e){this.logger=e,this.logger.setName("OdpManager"),this.eventManager.setLogger(e.child()),this.segmentManager.setLogger(e.child())}setClientInfo(e,t){this.clientEngine=e,this.clientVersion=t}start(){if(!this.isNew())return;this.state=Fe.Starting,this.eventManager.start();const e=[this.configPromise,this.eventManager.onRunning()];Promise.all(e).then(()=>{this.handleStartSuccess()}).catch(e=>{this.handleStartFailure(e)})}makeDisposable(){super.makeDisposable(),this.eventManager.makeDisposable()}handleStartSuccess(){this.isDone()||(this.state=Fe.Running,this.startPromise.resolve())}handleStartFailure(e){this.isDone()||(this.state=Fe.Failed,this.startPromise.reject(e),this.stopPromise.reject(e))}flushImmediately(){return this.isRunning()?this.eventManager.flushImmediately():Promise.resolve()}stop(){this.isDone()||(this.isRunning()||this.startPromise.reject(new Error(F(De,"OdpManager"))),this.state=Fe.Stopping,this.eventManager.stop(),this.eventManager.onTerminated().then(()=>{this.state=Fe.Terminated,this.stopPromise.resolve()}).catch(e=>{this.state=Fe.Failed,this.stopPromise.reject(e)}))}updateConfig(e){return!(this.odpIntegrationConfig&&(t=this.odpIntegrationConfig,r=e,!(t.integrated!==r.integrated||t.integrated&&r.integrated&&!t.odpConfig.equals(r.odpConfig))))&&(!this.isD