@traffical/js-client 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- /* @traffical/js-client v0.17.0 */
2
- "use strict";var Traffical=(()=>{var Z=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var ft=Object.prototype.hasOwnProperty;var gt=(r,e,t)=>e in r?Z(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var ht=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),pt=(r,e)=>{for(var t in e)Z(r,t,{get:e[t],enumerable:!0})},mt=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of dt(e))!ft.call(r,i)&&i!==t&&Z(r,i,{get:()=>e[i],enumerable:!(n=ut(e,i))||n.enumerable});return r};var yt=r=>mt(Z({},"__esModule",{value:!0}),r);var h=(r,e,t)=>(gt(r,typeof e!="symbol"?e+"":e,t),t);var qe=ht(()=>{});var Dn={};pt(Dn,{TrafficalClient:()=>V,createDOMBindingPlugin:()=>lt,createDebugPlugin:()=>Ve,createRedirectAttributionPlugin:()=>Ne,createRedirectPlugin:()=>Be,destroy:()=>kn,init:()=>Cn,initSync:()=>An,instance:()=>Sn});function vt(r){return r instanceof Uint8Array||ArrayBuffer.isView(r)&&r.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in r&&r.BYTES_PER_ELEMENT===1}function ve(r,e,t=""){let n=vt(r),i=r?.length,o=e!==void 0;if(!n||o&&i!==e){let s=t&&`"${t}" `,a=o?` of length ${e}`:"",c=n?`length=${i}`:`type=${typeof r}`,d=s+"expected Uint8Array"+a+", got "+c;throw n?new RangeError(d):new TypeError(d)}return r}function _e(r,e=!0){if(r.destroyed)throw new Error("Hash instance has been destroyed");if(e&&r.finished)throw new Error("Hash#digest() has already been called")}function Fe(r,e){ve(r,void 0,"digestInto() output");let t=e.outputLen;if(r.length<t)throw new RangeError('"digestInto() output" expected to be of length >='+t)}function F(...r){for(let e=0;e<r.length;e++)r[e].fill(0)}function ee(r){return new DataView(r.buffer,r.byteOffset,r.byteLength)}function w(r,e){return r<<32-e|r>>>e}function Ke(r,e={}){let t=(i,o)=>r(o).update(i).digest(),n=r(void 0);return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.canXOF=n.canXOF,t.create=i=>r(i),Object.assign(t,e),Object.freeze(t)}var $e=r=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,r])});function je(r,e,t){return r&e^~r&t}function He(r,e,t){return r&e^r&t^e&t}var te=class{constructor(e,t,n,i){h(this,"blockLen");h(this,"outputLen");h(this,"canXOF",!1);h(this,"padOffset");h(this,"isLE");h(this,"buffer");h(this,"view");h(this,"finished",!1);h(this,"length",0);h(this,"pos",0);h(this,"destroyed",!1);this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=i,this.buffer=new Uint8Array(e),this.view=ee(this.buffer)}update(e){_e(this),ve(e);let{view:t,buffer:n,blockLen:i}=this,o=e.length;for(let s=0;s<o;){let a=Math.min(i-this.pos,o-s);if(a===i){let c=ee(e);for(;i<=o-s;s+=i)this.process(c,s);continue}n.set(e.subarray(s,s+a),this.pos),this.pos+=a,s+=a,this.pos===i&&(this.process(t,0),this.pos=0)}return this.length+=e.length,this.roundClean(),this}digestInto(e){_e(this),Fe(e,this),this.finished=!0;let{buffer:t,view:n,blockLen:i,isLE:o}=this,{pos:s}=this;t[s++]=128,F(this.buffer.subarray(s)),this.padOffset>i-s&&(this.process(n,0),s=0);for(let l=s;l<i;l++)t[l]=0;n.setBigUint64(i-8,BigInt(this.length*8),o),this.process(n,0);let a=ee(e),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let d=c/4,g=this.get();if(d>g.length)throw new Error("_sha2: outputLen bigger than state");for(let l=0;l<d;l++)a.setUint32(4*l,g[l],o)}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());let{blockLen:t,buffer:n,length:i,finished:o,destroyed:s,pos:a}=this;return e.destroyed=s,e.finished=o,e.length=i,e.pos=a,i%t&&e.buffer.set(n),e}clone(){return this._cloneInto()}},k=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var _t=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),P=new Uint32Array(64),be=class extends te{constructor(e){super(64,e,8,!1)}get(){let{A:e,B:t,C:n,D:i,E:o,F:s,G:a,H:c}=this;return[e,t,n,i,o,s,a,c]}set(e,t,n,i,o,s,a,c){this.A=e|0,this.B=t|0,this.C=n|0,this.D=i|0,this.E=o|0,this.F=s|0,this.G=a|0,this.H=c|0}process(e,t){for(let l=0;l<16;l++,t+=4)P[l]=e.getUint32(t,!1);for(let l=16;l<64;l++){let m=P[l-15],u=P[l-2],p=w(m,7)^w(m,18)^m>>>3,_=w(u,17)^w(u,19)^u>>>10;P[l]=_+P[l-7]+p+P[l-16]|0}let{A:n,B:i,C:o,D:s,E:a,F:c,G:d,H:g}=this;for(let l=0;l<64;l++){let m=w(a,6)^w(a,11)^w(a,25),u=g+m+je(a,c,d)+_t[l]+P[l]|0,_=(w(n,2)^w(n,13)^w(n,22))+He(n,i,o)|0;g=d,d=c,c=a,a=s+u|0,s=o,o=i,i=n,n=u+_|0}n=n+this.A|0,i=i+this.B|0,o=o+this.C|0,s=s+this.D|0,a=a+this.E|0,c=c+this.F|0,d=d+this.G|0,g=g+this.H|0,this.set(n,i,o,s,a,c,d,g)}roundClean(){F(P)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),F(this.buffer)}},xe=class extends be{constructor(){super(32);h(this,"A",k[0]|0);h(this,"B",k[1]|0);h(this,"C",k[2]|0);h(this,"D",k[3]|0);h(this,"E",k[4]|0);h(this,"F",k[5]|0);h(this,"G",k[6]|0);h(this,"H",k[7]|0)}};var We=Ke(()=>new xe,$e(1));var ze=new TextEncoder,Ee="v2";function ne(r){return ze.encode(r).length}function ie(r,e){let t=ne(r),n=ne(e);return`traffical:assignment:${Ee}|u:${t}:${r}|l:${n}:${e}`}function K(r){return We(ze.encode(r))}function $(r){let e=0n;for(let t=0;t<8;t++)e=e<<8n|BigInt(r[t]);return e}function re(r){return $(K(r))}function oe(r,e,t){let n=K(ie(r,e)),i=$(n);return Number(i%BigInt(t))}function Ie(r,e){return r>=e[0]&&r<=e[1]}function se(r,e){for(let t of e)if(Ie(r,t.bucketRange))return t;return null}var bt=1n<<53n,xt=9007199254740992;function O(r,e){if(r.length===0||r.length===1)return 0;let t=re(e),n=Number(t%bt)/xt,i=0;for(let o=0;o<r.length;o++)if(i+=r[o],n<i)return o;return r.length-1}function Te(r,e){let{field:t,op:n,value:i,values:o}=r,s=Tt(e,t);switch(n){case"eq":return s===i;case"neq":return s!==i;case"in":return Array.isArray(o)?o.includes(s):!1;case"nin":return Array.isArray(o)?!o.includes(s):!0;case"gt":return typeof s=="number"&&s>i;case"gte":return typeof s=="number"&&s>=i;case"lt":return typeof s=="number"&&s<i;case"lte":return typeof s=="number"&&s<=i;case"contains":return typeof s=="string"&&typeof i=="string"&&s.includes(i);case"startsWith":return typeof s=="string"&&typeof i=="string"&&s.startsWith(i);case"endsWith":return typeof s=="string"&&typeof i=="string"&&s.endsWith(i);case"regex":if(typeof s!="string"||typeof i!="string")return!1;try{return new RegExp(i).test(s)}catch{return!1}case"exists":return s!=null;case"notExists":return s==null;default:return!1}}function ae(r,e){return r.length===0?!0:r.every(t=>Te(t,e))}function Tt(r,e){let t=e.split("."),n=r;for(let i of t){if(n==null)return;if(typeof n=="object")n=n[i];else return}return n}function we(r,e){let t=r.intercept;for(let{key:n,coef:i,missing:o}of r.numeric){let s=e[n];t+=typeof s=="number"?i*s:o}for(let{key:n,values:i,missing:o}of r.categorical){let s=e[n],a=s!=null?String(s):null;t+=a!==null&&a in i?i[a]:o}return t}function Ce(r,e){if(r.length===0)return[];if(r.length===1)return[1];let t=Math.max(e,1e-10),n=r.map(a=>a/t),i=Math.max(...n),o=n.map(a=>Math.exp(a-i)),s=o.reduce((a,c)=>a+c,0);return o.map(a=>a/s)}function Ae(r,e){if(r.length===0)return[];if(e<=0)return r;let t=r.length,n=1/t,i=Math.min(e,n),o=r.map(a=>Math.max(a,i)),s=o.reduce((a,c)=>a+c,0);return s===0?Array(t).fill(1/t):o.map(a=>a/s)}function ce(r,e,t){let n=r.contextualModel;if(!n||r.allocations.length===0)return null;let i=wt(n,r.allocations,e),o=Ce(i,n.gamma),s=Ae(o,n.actionProbabilityFloor),a=`ctx:${t}:${r.id}`,c=O(s,a);return{allocation:r.allocations[c],probability:s[c]}}function wt(r,e,t){return e.map(n=>{let i=r.coefficients[n.key??n.name];return i?we(i,t):r.defaultAllocationScore})}var Ct=r=>crypto.getRandomValues(new Uint8Array(r)),At=(r,e,t)=>{let n=(2<<Math.log2(r.length-1))-1,i=-~(1.6*n*e/r.length);return(o=e)=>{let s="";for(;;){let a=t(i),c=i|0;for(;c--;)if(s+=r[a[c]&n]||"",s.length>=o)return s}}},Ge=(r,e=21)=>At(r,e|0,Ct);function le(r){let e=new Error(r);return e.source="ulid",e}var Se="0123456789ABCDEFGHJKMNPQRSTVWXYZ",j=Se.length,Xe=Math.pow(2,48)-1,St=10,kt=16;function Dt(r){let e=Math.floor(r()*j);return e===j&&(e=j-1),Se.charAt(e)}function Pt(r,e){if(isNaN(r))throw new Error(r+" must be a number");if(r>Xe)throw le("cannot encode time greater than "+Xe);if(r<0)throw le("time must be positive");if(Number.isInteger(Number(r))===!1)throw le("time must be an integer");let t,n="";for(;e>0;e--)t=r%j,n=Se.charAt(t)+n,r=(r-t)/j;return n}function Rt(r,e){let t="";for(;r>0;r--)t=Dt(e)+t;return t}function Lt(r=!1,e){e||(e=typeof window<"u"?window:null);let t=e&&(e.crypto||e.msCrypto);if(t)return()=>{let n=new Uint8Array(1);return t.getRandomValues(n),n[0]/255};try{let n=qe();return()=>n.randomBytes(1).readUInt8()/255}catch{}if(r){try{console.error("secure crypto unusable, falling back to insecure Math.random()!")}catch{}return()=>Math.random()}throw le("secure crypto unusable, insecure Math.random not allowed")}function Mt(r){return r||(r=Lt()),function(t){return isNaN(t)&&(t=Date.now()),Pt(t,St)+Rt(kt,r)}}var Je=Mt();var Ot="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Bt=8,ci=Ge(Ot,Bt);function H(r){return`${r}_${Je()}`}function B(){return H("dec")}function ke(){return H("exp")}function De(){return H("trk")}function Pe(){return H("asn")}function Nt(r,e){let t=new Set;for(let i of e)if(i.contextLogging?.allowedFields)for(let o of i.contextLogging.allowedFields)t.add(o);if(t.size===0)return;let n={};for(let i of t)i in r&&(n[i]=r[i]);return Object.keys(n).length>0?n:void 0}function Vt(r,e){let t=[];for(let n of r){let i=e[n];if(i==null)return null;t.push(String(i))}return t.join("_")}function Qe(r){if(r<=0)return[];let e=1/r;return Array(r).fill(e)}function Ut(r,e,t,n){let i=r.entityState?.[e];if(!i)return Qe(n);let o=i.entities[t];if(o&&o.weights.length===n)return o.weights;let s=i._global;return s&&s.weights.length===n?s.weights:Qe(n)}function Ft(r,e,t,n){let i=e.entityConfig;if(!i)return null;let o=Vt(i.entityKeys,t);if(!o)return null;let s,a;if(i.dynamicAllocations){let l=i.dynamicAllocations.countKey,m=t[l];if(typeof m!="number"||m<=0)return null;a=Math.floor(m),s=Array.from({length:a},(u,p)=>({id:`${e.id}_dynamic_${p}`,name:String(p),bucketRange:[0,0],overrides:{}}))}else s=e.allocations,a=s.length;if(a===0)return null;let c=Ut(r,e.id,o,a),d=`${o}:${n}:${e.id}`,g=O(c,d);return{allocation:s[g],weight:c[g],entityId:o}}function W(r,e){let t=e[r.hashing.unitKey];return t==null?null:String(t)}function ue(r){return r?.hashing?.unitKey??null}function de(r,e){return r?r.parameters.find(n=>n.key===e)?.layerId??null:null}function Ye(r,e,t,n){let i={...t},o=[],s=[];if(!r)return{assignments:i,unitKeyValue:"",layers:o,matchedPolicies:s};let a=W(r,e)??"",c=new Set(Object.keys(t)),d=r.parameters.filter(l=>c.has(l.key));for(let l of d)l.key in i&&(i[l.key]=l.default);let g=new Map;for(let l of d){let m=g.get(l.layerId)||[];m.push(l),g.set(l.layerId,m)}for(let l of r.layers){let m=g.get(l.id),u=m&&m.length>0,p=l.unitKey,_=p!=null;if(_&&String(p).trim()===""){o.push({layerId:l.id,bucket:-1,...u?{}:{attributionOnly:!0}});continue}let x=_?String(e[p]??""):a;if(!x){o.push({layerId:l.id,bucket:-1,..._?{unitKey:p,unitKeyValue:""}:{},...u?{}:{attributionOnly:!0}});continue}let C=oe(x,l.id,r.hashing.bucketCount),f,b,A,U;for(let y of l.policies)if(y.state==="running"){if(y.eligibleBucketRange){let{start:E,end:I}=y.eligibleBucketRange;if(C<E||C>I)continue}if(ae(y.conditions,e)){if(y.contextualModel){let E=ce(y,e,x);if(E){if(f=y,b=E.allocation,A=E.probability,U=y.contextualModel.generatedAt??y.contextualModel.modelVersion,s.push(y),u)for(let[I,S]of Object.entries(E.allocation.overrides))I in i&&(i[I]=S);break}}if(y.entityConfig&&y.entityConfig.resolutionMode==="bundle"){let E=Ft(r,y,e,x);if(E){if(f=y,b=E.allocation,A=E.weight,s.push(y),u&&!y.entityConfig.dynamicAllocations)for(let[I,S]of Object.entries(E.allocation.overrides))I in i&&(i[I]=S);break}}else if(y.entityConfig&&y.entityConfig.resolutionMode==="edge"){let E=n?.edgeResults?.get(y.id);if(E){if(f=y,s.push(y),y.entityConfig.dynamicAllocations)b={id:`${y.id}_dynamic_${E.allocationIndex}`,name:String(E.allocationIndex),bucketRange:[0,0],overrides:{}};else if(y.allocations[E.allocationIndex]&&(b=y.allocations[E.allocationIndex],u&&b))for(let[I,S]of Object.entries(b.overrides))I in i&&(i[I]=S);break}continue}else{let E=se(C,y.allocations);if(E){if(f=y,b=E,y.kind==="adaptive"){let[I,S]=E.bucketRange;A=(S-I+1)/r.hashing.bucketCount}if(s.push(y),u)for(let[I,S]of Object.entries(E.overrides))I in i&&(i[I]=S);break}}}}o.push({layerId:l.id,bucket:C,policyId:f?.id,policyKey:f?.key,allocationId:b?.id,allocationName:b?.name,allocationKey:b?.key,...A!==void 0&&A>0&&A<=1?{probability:A}:{},...U!==void 0?{modelVersion:U}:{},..._?{unitKey:p,unitKeyValue:x}:{},...u?{}:{attributionOnly:!0}})}return{assignments:i,unitKeyValue:a,layers:o,matchedPolicies:s}}function fe(r,e,t,n){return Ye(r,e,t,n).assignments}function ge(r,e,t,n){let{assignments:i,unitKeyValue:o,layers:s,matchedPolicies:a}=Ye(r,e,t,n),c=Nt(e,a);return{decisionId:B(),assignments:i,metadata:{timestamp:new Date().toISOString(),unitKeyValue:o,layers:s,filteredContext:c,...r?.version?{configVersion:r.version}:{}}}}var M=class r{constructor(e={}){h(this,"_seen",new Map);h(this,"_ttlMs");h(this,"_maxEntries");h(this,"_lastCleanup",Date.now());this._ttlMs=e.ttlMs??36e5,this._maxEntries=e.maxEntries??1e4}static hashAssignments(e){let t=Object.keys(e).sort(),n=[];for(let i of t){let o=e[i],s=typeof o=="object"?JSON.stringify(o):String(o);n.push(`${i}=${s}`)}return n.join("|")}static createKey(e,t){return`${e}:${t}`}checkAndMark(e,t){let n=r.createKey(e,t),i=Date.now(),o=this._seen.get(n);return o!==void 0&&i-o<this._ttlMs?!1:(this._seen.set(n,i),this._maybeCleanup(i),!0)}wouldBeNew(e,t){let n=r.createKey(e,t),i=Date.now(),o=this._seen.get(n);return o===void 0?!0:i-o>=this._ttlMs}clear(){this._seen.clear()}get size(){return this._seen.size}_maybeCleanup(e){(e-this._lastCleanup>this._ttlMs*.2||this._seen.size>this._maxEntries)&&(this._lastCleanup=e,this._cleanup(e))}_cleanup(e){let t=[];for(let[n,i]of this._seen.entries())e-i>=this._ttlMs&&t.push(n);for(let n of t)this._seen.delete(n);if(this._seen.size>this._maxEntries){let i=Array.from(this._seen.entries()).sort((o,s)=>o[1]-s[1]).slice(0,this._seen.size-this._maxEntries);for(let[o]of i)this._seen.delete(o)}}};var Ze={resolutionErrors:0,droppedAssignmentLogs:0,droppedEventLogs:0,rejectedBundles:0,sideEffectErrors:0,lastError:null};function nn(r){return r instanceof Error?r:typeof r=="string"?new Error(r):new Error("An unknown error occurred")}var N=class{constructor(e={}){h(this,"_onResolutionError");h(this,"_onError");h(this,"_seen",new Set);h(this,"_counters",{...Ze});this._onResolutionError=e.onResolutionError??"default",this._onError=e.onError}get throwsOnResolutionError(){return this._onResolutionError==="throw"}resolve(e,t,n){try{return t()}catch(i){if(this._counters.resolutionErrors++,this._report(e,i),this._onResolutionError==="throw")throw i;return n()}}async resolveAsync(e,t,n){try{return await t()}catch(i){if(this._counters.resolutionErrors++,this._report(e,i),this._onResolutionError==="throw")throw i;return n()}}sideEffect(e,t,n){try{n()}catch(i){this._countSideEffect(t),this._report(e,i)}}async sideEffectAsync(e,t,n){try{await n()}catch(i){this._countSideEffect(t),this._report(e,i)}}recordRejectedBundle(e,t,n){this._counters.rejectedBundles++,this._report(e,new Error(t?`${t}: ${n}`:n))}getDiagnostics(){return{...this._counters}}reset(){Object.assign(this._counters,Ze,{lastError:null}),this._seen.clear()}_countSideEffect(e){switch(e){case"assignmentLog":this._counters.droppedAssignmentLogs++;break;case"eventLog":this._counters.droppedEventLogs++;break;case"bundleRejected":this._counters.rejectedBundles++;break;default:this._counters.sideEffectErrors++}}_report(e,t){let n=nn(t);this._counters.lastError={tag:e,name:n.name,message:n.message};let i=`${e}:${n.name}:${n.message}`;if(!this._seen.has(i)&&(this._seen.add(i),console.warn(`[Traffical] Contained error in ${e}:`,n.message),!!this._onError))try{this._onError(e,n)}catch{}}};function v(r,e){return{ok:!1,path:r,reason:e}}function R(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function D(r){return typeof r=="string"&&r.length>0}function z(r){if(!R(r))return v("","bundle is not an object");let e=r.hashing;if(!R(e))return v("hashing","missing or not an object");if(!D(e.unitKey))return v("hashing.unitKey","missing or not a non-empty string");if(typeof e.bucketCount!="number"||!Number.isInteger(e.bucketCount)||e.bucketCount<1)return v("hashing.bucketCount","not an integer >= 1");if(!Array.isArray(r.parameters))return v("parameters","not an array");for(let t=0;t<r.parameters.length;t++){let n=r.parameters[t],i=`parameters[${t}]`;if(!R(n))return v(i,"not an object");if(!D(n.key))return v(`${i}.key`,"missing or not a non-empty string");if(!D(n.layerId))return v(`${i}.layerId`,"missing or not a non-empty string");if(!("default"in n))return v(`${i}.default`,"missing")}if(!Array.isArray(r.layers))return v("layers","not an array");for(let t=0;t<r.layers.length;t++){let n=r.layers[t],i=`layers[${t}]`;if(!R(n))return v(i,"not an object");if(!D(n.id))return v(`${i}.id`,"missing or not a non-empty string");if(n.unitKey!==void 0&&typeof n.unitKey!="string")return v(`${i}.unitKey`,"present but not a string");if(!Array.isArray(n.policies))return v(`${i}.policies`,"not an array");for(let o=0;o<n.policies.length;o++){let s=n.policies[o],a=`${i}.policies[${o}]`;if(!R(s))return v(a,"not an object");if(!D(s.id))return v(`${a}.id`,"missing or not a non-empty string");if(!D(s.state))return v(`${a}.state`,"missing or not a non-empty string");if(!Array.isArray(s.allocations))return v(`${a}.allocations`,"not an array");if(!Array.isArray(s.conditions))return v(`${a}.conditions`,"not an array");for(let c=0;c<s.conditions.length;c++){let d=s.conditions[c],g=`${a}.conditions[${c}]`;if(!R(d))return v(g,"not an object");if(!D(d.field))return v(`${g}.field`,"missing or not a non-empty string");if(!D(d.op))return v(`${g}.op`,"missing or not a non-empty string")}for(let c=0;c<s.allocations.length;c++){let d=s.allocations[c],g=`${a}.allocations[${c}]`;if(!R(d))return v(g,"not an object");if(!D(d.name))return v(`${g}.name`,"missing or not a non-empty string");let l=d.bucketRange;if(!Array.isArray(l)||l.length!==2)return v(`${g}.bucketRange`,"not a 2-element array");let[m,u]=l;if(typeof m!="number"||typeof u!="number"||!Number.isInteger(m)||!Number.isInteger(u))return v(`${g}.bucketRange`,"bounds are not integers");if(m<0||u<m)return v(`${g}.bucketRange`,"bounds are negative or inverted");if(d.overrides!==void 0&&!R(d.overrides))return v(`${g}.overrides`,"present but not an object")}}}return{ok:!0}}var G=class{constructor(e){h(this,"config");h(this,"defaultTimeout");this.config=e,this.defaultTimeout=e.defaultTimeoutMs??5e3}async resolve(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),this.defaultTimeout),i=`${this.config.baseUrl}/v1/resolve`,o=await fetch(i,{method:"POST",headers:this._headers(),body:JSON.stringify({context:e.context,env:e.env??this.config.env,parameters:e.parameters}),signal:t.signal});return clearTimeout(n),o.ok?await o.json():(console.warn(`[Traffical] Resolve failed: ${o.status} ${o.statusText}`),null)}catch(t){return t instanceof Error&&t.name==="AbortError"?console.warn(`[Traffical] Resolve timed out after ${this.defaultTimeout}ms`):console.warn("[Traffical] Resolve error:",t),null}}async decideEntity(e,t){let n=t??Math.min(this.defaultTimeout,100);try{let i=new AbortController,o=setTimeout(()=>i.abort(),n),s=`${this.config.baseUrl}/v1/decide/${e.policyId}`,a=await fetch(s,{method:"POST",headers:this._headers(),body:JSON.stringify({entityId:e.entityId,unitKeyValue:e.unitKeyValue,allocationCount:e.allocationCount,context:e.context}),signal:i.signal});return clearTimeout(o),a.ok?await a.json():(console.warn(`[Traffical] Edge decide failed: ${a.status} ${a.statusText}`),null)}catch(i){return i instanceof Error&&i.name==="AbortError"?console.warn(`[Traffical] Edge decide timed out after ${n}ms`):console.warn("[Traffical] Edge decide error:",i),null}}async decideEntityBatch(e,t){if(e.length===0)return[];if(e.length===1)return[await this.decideEntity(e[0],t)];let n=t??Math.min(this.defaultTimeout,200);try{let i=new AbortController,o=setTimeout(()=>i.abort(),n),s=`${this.config.baseUrl}/v1/decide/batch`,a=await fetch(s,{method:"POST",headers:this._headers(),body:JSON.stringify({requests:e}),signal:i.signal});return clearTimeout(o),a.ok?(await a.json()).responses:(console.warn(`[Traffical] Edge batch decide failed: ${a.status} ${a.statusText}`),e.map(()=>null))}catch(i){return i instanceof Error&&i.name==="AbortError"?console.warn(`[Traffical] Edge batch decide timed out after ${n}ms`):console.warn("[Traffical] Edge batch decide error:",i),e.map(()=>null)}}_headers(){return{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,"X-Org-Id":this.config.orgId,"X-Project-Id":this.config.projectId,"X-Env":this.config.env}}};function Re(r,e,t,n,i){let o=[];for(let a of e){let c=t[a];if(c==null)return null;o.push(String(c))}let s=o.join("_");return{policyId:r,entityId:s,unitKeyValue:n,allocationCount:i,context:t}}var q="failed_events";var he=class{constructor(e){this._queue=[];this._flushTimer=null;this._isFlushing=!1;this._isDisabled=!1;this._droppedCount=0;this._endpoint=e.endpoint,this._apiKey=e.apiKey,this._storage=e.storage,this._batchSize=e.batchSize??10,this._flushIntervalMs=e.flushIntervalMs??3e4,this._requestTimeoutMs=e.requestTimeoutMs??1e4,this._maxQueueSize=e.maxQueueSize??1e3,this._onError=e.onError,this._onSchemaWarnings=e.onSchemaWarnings,this._lifecycleProvider=e.lifecycleProvider,this._setupListeners(),this._retryFailedEvents(),this._startFlushTimer()}log(e){this._isDisabled||(this._queue.length>=this._maxQueueSize&&(this._queue.shift(),this._droppedCount++),this._queue.push(e),this._queue.length>=this._batchSize&&this.flush())}async flush(){if(this._isFlushing||this._isDisabled||this._queue.length===0)return;this._isFlushing=!0;let e=[...this._queue];this._queue=[];try{let t=await this._sendEvents(e);if(t>=200&&t<300)return;if(t===401){this._disable();return}if(t===429||t>=500){this._persistFailedEvents(e),this._onError?.(new Error(`HTTP ${t}: event delivery failed, will retry`));return}this._onError?.(new Error(`HTTP ${t}: batch rejected, dropping ${e.length} events`))}catch(t){this._persistFailedEvents(e),this._onError?.(t instanceof Error?t:new Error(String(t)))}finally{this._isFlushing=!1}}_disable(){this._isDisabled||(this._isDisabled=!0,this._queue=[],this._storage.remove(q),console.warn("[Traffical] API key rejected (HTTP 401); event delivery disabled for this client"))}get droppedCount(){return this._droppedCount}get isDisabled(){return this._isDisabled}flushBeacon(){if(this._queue.length===0)return!0;if(typeof fetch>"u")return this.flush(),!1;let e=[...this._queue];return this._queue=[],fetch(this._endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:JSON.stringify({events:e}),keepalive:!0}).catch(()=>{this._persistFailedEvents(e)}),!0}get queueSize(){return this._queue.length}destroy(){this._flushTimer&&(clearInterval(this._flushTimer),this._flushTimer=null),this._removeListeners()}async _sendEvents(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this._requestTimeoutMs),i;try{i=await fetch(this._endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:JSON.stringify({events:e}),signal:t.signal})}finally{clearTimeout(n)}if(!i.ok)return i.status;if(this._onSchemaWarnings)try{let o=await i.json();o.schemaWarnings&&o.schemaWarnings.length>0&&this._onSchemaWarnings(o.schemaWarnings)}catch{}return i.status}_persistFailedEvents(e){let n=[...this._storage.get(q)??[],...e].slice(-100);this._storage.set(q,n)}_retryFailedEvents(){let e=this._storage.get(q);!e||e.length===0||(this._storage.remove(q),this._queue.push(...e))}_startFlushTimer(){this._flushIntervalMs<=0||(this._flushTimer=setInterval(()=>{this.flush().catch(()=>{})},this._flushIntervalMs))}_setupListeners(){this._lifecycleProvider&&(this._visibilityCallback=e=>{e==="background"?this._lifecycleProvider?.isUnloading()?this.flushBeacon():this.flush().catch(()=>{}):this._retryFailedEvents()},this._lifecycleProvider.onVisibilityChange(this._visibilityCallback))}_removeListeners(){this._lifecycleProvider&&this._visibilityCallback&&(this._lifecycleProvider.removeVisibilityListener(this._visibilityCallback),this._visibilityCallback=void 0)}};var X="exposure_dedup";var J=class r{constructor(e){this._storage=e.storage,this._sessionTtlMs=e.sessionTtlMs??18e5,this._seen=new Set,this._sessionStart=Date.now(),this._restore()}static createKey(e,t,n){return`${e}:${t}:${n}`}shouldTrack(e){return this._isSessionExpired()&&this._resetSession(),this._seen.has(e)?!1:(this._seen.add(e),this._persist(),!0)}checkAndMark(e,t,n){let i=r.createKey(e,t,n);return this.shouldTrack(i)}clear(){this._seen.clear(),this._storage.remove(X)}get size(){return this._seen.size}_isSessionExpired(){return Date.now()-this._sessionStart>this._sessionTtlMs}_resetSession(){this._seen.clear(),this._sessionStart=Date.now(),this._storage.remove(X)}_persist(){let e={seen:Array.from(this._seen),sessionStart:this._sessionStart};this._storage.set(X,e,this._sessionTtlMs)}_restore(){let e=this._storage.get(X);if(!e)return;if(Date.now()-e.sessionStart>this._sessionTtlMs){this._storage.remove(X);return}this._seen=new Set(e.seen),this._sessionStart=e.sessionStart}};var Q="stable_id",on="traffical_sid";var pe=class{constructor(e){this._cachedId=null;this._storage=e.storage,this._useCookieFallback=e.useCookieFallback??!0,this._cookieName=e.cookieName??on}getId(){if(this._cachedId)return this._cachedId;let e=this._storage.get(Q);return e?(this._cachedId=e,e):this._useCookieFallback&&(e=this._getCookie(),e)?(this._storage.set(Q,e),this._cachedId=e,e):(e=this._generateId(),this._persist(e),this._cachedId=e,e)}setId(e){this._persist(e),this._cachedId=e}clear(){this._storage.remove(Q),this._useCookieFallback&&this._deleteCookie(),this._cachedId=null}hasId(){return this._storage.get(Q)!==null||this._getCookie()!==null}_persist(e){this._storage.set(Q,e),this._useCookieFallback&&this._setCookie(e)}_generateId(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}_getCookie(){if(typeof document>"u")return null;try{let e=document.cookie.split(";");for(let t of e){let[n,i]=t.trim().split("=");if(n===this._cookieName&&i)return decodeURIComponent(i)}}catch{}return null}_setCookie(e){if(!(typeof document>"u"))try{document.cookie=`${this._cookieName}=${encodeURIComponent(e)}; max-age=31536000; path=/; SameSite=Lax`}catch{}}_deleteCookie(){if(!(typeof document>"u"))try{document.cookie=`${this._cookieName}=; max-age=0; path=/`}catch{}}};var Y="traffical:",Le=class{constructor(){this._available=this._checkAvailability()}get(e){if(!this._available)return null;try{let t=localStorage.getItem(Y+e);if(!t)return null;let n=JSON.parse(t);return n.expiresAt&&Date.now()>n.expiresAt?(this.remove(e),null):n.value}catch{return null}}set(e,t,n){if(this._available)try{let i={value:t,...n&&{expiresAt:Date.now()+n}};localStorage.setItem(Y+e,JSON.stringify(i))}catch{}}remove(e){if(this._available)try{localStorage.removeItem(Y+e)}catch{}}clear(){if(this._available)try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n?.startsWith(Y)&&e.push(n)}e.forEach(t=>localStorage.removeItem(t))}catch{}}_checkAvailability(){try{let e=Y+"__test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return!1}}},Me=class{constructor(){this._store=new Map}get(e){let t=this._store.get(e);return t?t.expiresAt&&Date.now()>t.expiresAt?(this.remove(e),null):t.value:null}set(e,t,n){this._store.set(e,{value:t,...n&&{expiresAt:Date.now()+n}})}remove(e){this._store.delete(e)}clear(){this._store.clear()}};function nt(){let r=new Le;return r.get("__check__")!==null||sn()?r:new Me}function sn(){try{let r="__traffical_storage_test__";return localStorage.setItem(r,"test"),localStorage.removeItem(r),!0}catch{return!1}}var L="0.17.0";var an="js-client";function Oe(r,e){let t=new M({ttlMs:r.deduplicationTtlMs});return{name:"decision-tracking",onDecision(n){if(r.disabled)return;let i=n.metadata.unitKeyValue;if(!i)return;let o=M.hashAssignments(n.assignments);if(!t.checkAndMark(i,o))return;let s={type:"decision",id:n.decisionId,orgId:e.orgId,projectId:e.projectId,env:e.env,unitKey:i,timestamp:n.metadata.timestamp,assignments:n.assignments,layers:n.metadata.layers,context:n.metadata.filteredContext,configVersion:n.metadata.configVersion??e.getConfigVersion?.()??void 0,sdkName:an,sdkVersion:L};e.log(s)},onDestroy(){t.clear()}}}var cn="traffical_rdr";function ln(r,e,t){if(!(typeof document>"u"))try{document.cookie=`${r}=${encodeURIComponent(e)}; max-age=${t}; path=/; SameSite=Lax`}catch{}}function Be(r={}){let e=r.parameterKey??"redirect.url",t=r.compareMode??"pathname",n=r.cookieName??cn;return{name:"redirect",onInitialize(i){typeof window>"u"||i.decide({context:{},defaults:{[e]:""}})},onBeforeDecision(i){return typeof window>"u"?i:{"url.pathname":window.location.pathname,...i}},onDecision(i){let o=i.assignments[e];if(typeof o!="string"||!o)return;let s=t==="href"?window.location.href:window.location.pathname;if(o===s)return;let a=i.metadata.layers.find(c=>c.policyId&&c.allocationName);a&&ln(n,JSON.stringify({l:a.layerId,p:a.policyId,a:a.allocationName,ts:Date.now()}),86400),window.location.replace(o)}}}var un="traffical_rdr";function dn(r){if(typeof document>"u")return null;try{for(let e of document.cookie.split(";")){let[t,n]=e.trim().split("=");if(t===r&&n)return decodeURIComponent(n)}}catch{}return null}function fn(r,e){let t=dn(r);if(!t)return null;try{let n=JSON.parse(t);return Date.now()-n.ts>e?null:{layerId:n.l,policyId:n.p,allocationName:n.a}}catch{return null}}function Ne(r={}){let e=r.cookieName??un,t=r.expiryMs??864e5;function n(i){let o=fn(e,t);if(!o)return;i.attribution=i.attribution??[],i.attribution.some(a=>a.layerId===o.layerId&&a.policyId===o.policyId)||i.attribution.push(o)}return{name:"redirect-attribution",onTrack(i){return n(i),!0},onExposure(i){return n(i),!0}}}var me=[],it={};function gn(){if(typeof window>"u")return{version:1,instances:it,subscribe:()=>()=>{}};if(!window.__TRAFFICAL_DEBUG__){let r={version:1,instances:it,subscribe(e){return me.push(e),()=>{me=me.filter(t=>t!==e)}}};window.__TRAFFICAL_DEBUG__=r}return window.__TRAFFICAL_DEBUG__}function rt(r){for(let e of me)try{e(r)}catch{}}var hn=0;function pn(){return`traffical_${Date.now().toString(36)}_${(++hn).toString(36)}`}function mn(){return`evt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}var yn="traffical-debug";function Ve(r={}){let e=r.instanceId??pn(),t=r.maxEvents??500,n=null,i=null,o={},s=[],a=null,c=null,d=[],g=[],l=[];function m(){return{ready:n?.isInitialized===!0,stableId:n?.getStableId?.()??null,effectiveUnitKey:c,configVersion:n?.getConfigVersion?.()??null,assignments:{...o},layers:[...s],lastDecisionId:a,overrides:n?.getOverrides?.()??{}}}function u(){let f=m();for(let b of g)try{b(f)}catch{}}function p(f,b){let A={id:mn(),type:f,timestamp:Date.now(),data:b};d.push(A),d.length>t&&d.splice(0,d.length-t);for(let U of l)try{U(A)}catch{}}function _(){if(n)try{n.decide({context:{},defaults:{}})}catch{}}let x={id:e,meta:{orgId:"",projectId:"",env:"",sdkVersion:L},getState:m,subscribe(f){return g.push(f),()=>{g=g.filter(b=>b!==f)}},getEvents(f){return f!==void 0?d.slice(-f):[...d]},onEvent(f){return l.push(f),()=>{l=l.filter(b=>b!==f)}},getConfigBundle(){return i},setUnitKey(f){n?.identify?n.identify(f):n?.setStableId&&n.setStableId(f),u()},setOverride(f,b){n?.applyOverrides&&n.applyOverrides({[f]:b}),u(),_()},clearOverride(f){if(n?.getOverrides&&n?.applyOverrides){let b=n.getOverrides();delete b[f],n.clearOverrides?.(),n.applyOverrides(b)}u(),_()},clearAllOverrides(){n?.clearOverrides?.(),u(),_()},getOverrides(){return n?.getOverrides?.()??{}},reDecide(){_()},async refresh(){n?.refreshConfig&&await n.refreshConfig()}};return{name:yn,onInitialize(f){n=f,i&&(x.meta.orgId=i.orgId,x.meta.projectId=i.projectId,x.meta.env=i.env);let b=gn();b.instances[e]=x,rt({type:"register",instanceId:e}),u()},onConfigUpdate(f){i=f,x.meta.orgId=f.orgId,x.meta.projectId=f.projectId,x.meta.env=f.env,u()},onDecision(f){o={...f.assignments},s=f.metadata?.layers?[...f.metadata.layers]:[],a=f.decisionId,f.metadata?.unitKeyValue&&(c=f.metadata.unitKeyValue),p("decision",f),u()},onResolve(f){o={...f},u()},onExposure(f){return p("exposure",f),!0},onTrack(f){return p("track",f),!0},onDestroy(){let f=typeof window<"u"?window.__TRAFFICAL_DEBUG__:null;f&&(delete f.instances[e],rt({type:"unregister",instanceId:e})),g=[],l=[],n=null}}}var ye=class{constructor(){this._plugins=[]}register(e){let t="plugin"in e?e.plugin:e,n="priority"in e?e.priority??0:0;return this._plugins.some(i=>i.plugin.name===t.name)?(console.warn(`[Traffical] Plugin "${t.name}" already registered, skipping.`),!1):(this._plugins.push({plugin:t,priority:n}),this._plugins.sort((i,o)=>o.priority-i.priority),!0)}unregister(e){let t=this._plugins.findIndex(n=>n.plugin.name===e);return t===-1?!1:(this._plugins.splice(t,1),!0)}get(e){return this._plugins.find(t=>t.plugin.name===e)?.plugin}getAll(){return this._plugins.map(e=>e.plugin)}async runInitialize(e){for(let{plugin:t}of this._plugins)if(t.onInitialize)try{await t.onInitialize(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onInitialize error:`,n)}}runConfigUpdate(e){for(let{plugin:t}of this._plugins)if(t.onConfigUpdate)try{t.onConfigUpdate(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onConfigUpdate error:`,n)}}runBeforeDecision(e){let t=e;for(let{plugin:n}of this._plugins)if(n.onBeforeDecision)try{let i=n.onBeforeDecision(t);i&&(t=i)}catch(i){console.warn(`[Traffical] Plugin "${n.name}" onBeforeDecision error:`,i)}return t}runDecision(e){for(let{plugin:t}of this._plugins)if(t.onDecision)try{t.onDecision(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onDecision error:`,n)}}runResolve(e){for(let{plugin:t}of this._plugins)if(t.onResolve)try{t.onResolve(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onResolve error:`,n)}}runExposure(e){for(let{plugin:t}of this._plugins)if(t.onExposure)try{if(t.onExposure(e)===!1)return!1}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onExposure error:`,n)}return!0}runTrack(e){for(let{plugin:t}of this._plugins)if(t.onTrack)try{if(t.onTrack(e)===!1)return!1}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onTrack error:`,n)}return!0}runDestroy(){for(let{plugin:e}of this._plugins)if(e.onDestroy)try{e.onDestroy()}catch(t){console.warn(`[Traffical] Plugin "${e.name}" onDestroy error:`,t)}}clear(){this._plugins=[]}};function ot(){let r=[],e=!1;function t(s){for(let a of r)a(s)}let n=()=>{e=!0,t("background")},i=()=>{typeof document<"u"&&t(document.visibilityState==="hidden"?"background":"foreground")},o=()=>{e=!0,t("background")};return typeof window<"u"&&(window.addEventListener("pagehide",n),window.addEventListener("beforeunload",o)),typeof document<"u"&&document.addEventListener("visibilitychange",i),{onVisibilityChange(s){r.push(s)},removeVisibilityListener(s){let a=r.indexOf(s);a!==-1&&r.splice(a,1)},isUnloading(){return e}}}var Ue="js-client";function st(r,e){if(e!==void 0)return{context:r,defaults:e};let t=r;return{context:t.context,defaults:t.defaults}}var vn="https://sdk.traffical.io",_n=6e4,bn=1e4,xn=3e5,En=3e5,In=100,Tn=.1;function wn(r){let e=r*Tn;return r+(Math.random()*2-1)*e}var V=class{constructor(e){this._state={bundle:null,etag:null,lastFetchTime:0,lastOfflineWarning:0,lastMalformedWarning:0,refreshTimer:null,isInitialized:!1,serverResponse:null,cachedEdgeResults:null};this._decisionCache=new Map;this._cumulativeAttribution=new Map;this._identityListeners=[];this._overrideListeners=[];this._overrides={};this._lastResolveContextKey=null;this._readyPromise=new Promise(e=>{this._readyResolve=e});let t=e.evaluationMode??"bundle";this._options={orgId:e.orgId,projectId:e.projectId,env:e.env,apiKey:e.apiKey,baseUrl:e.baseUrl??vn,localConfig:e.localConfig,refreshIntervalMs:e.refreshIntervalMs??_n,attributionMode:e.attributionMode??"cumulative",evaluationMode:t},this._requestTimeoutMs=e.configTimeoutMs??e.requestTimeoutMs??bn;let n={baseUrl:this._options.baseUrl,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,apiKey:this._options.apiKey,defaultTimeoutMs:e.resolveTimeoutMs??e.requestTimeoutMs};if(this._decisionClient=new G(n),this._errorPolicy=new N({onResolutionError:e.onResolutionError,onError:e.onError??e.errorBoundary?.onError}),this._storage=e.storage??nt(),this._lifecycleProvider=e.lifecycleProvider??ot(),!e.onSchemaWarnings)try{typeof globalThis<"u"&&globalThis.process?.env?.NODE_ENV==="development"&&(e.onSchemaWarnings=o=>{for(let s of o)console.warn(`[Traffical] Schema warning for "${s.event}":`,s.violations.map(a=>`${a.path}: ${a.message}`).join(", "))})}catch{}if(this._eventLogger=new he({endpoint:`${this._options.baseUrl}/v1/events/batch`,apiKey:e.apiKey,storage:this._storage,lifecycleProvider:this._lifecycleProvider,batchSize:e.batchSize??e.eventBatchSize,flushIntervalMs:e.flushIntervalMs??e.eventFlushIntervalMs,maxQueueSize:e.eventMaxQueueSize,requestTimeoutMs:e.eventsTimeoutMs??e.requestTimeoutMs,onError:i=>{console.warn("[Traffical] Event logging error:",i.message)},onSchemaWarnings:e.onSchemaWarnings}),this._exposureDedup=new J({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}),this._stableId=new pe({storage:this._storage}),this._plugins=new ye,this._assignmentLogger=e.assignmentLogger,this._byoEventLogger=e.eventLogger,this._disableCloudEvents=e.disableCloudEvents??!1,this._assignmentLoggerDedup=e.deduplicateAssignmentLogger!==!1&&e.assignmentLogger?new J({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}):null,e.trackDecisions!==!1&&(!this._disableCloudEvents||this._byoEventLogger)&&this._plugins.register({plugin:Oe({deduplicationTtlMs:e.decisionDeduplicationTtlMs},{orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,log:i=>this._dispatchEvent(i),getConfigVersion:()=>this.getConfigVersion()}),priority:100}),e.plugins)for(let i of e.plugins)this._plugins.register(i);if(this._options.localConfig){let i=z(this._options.localConfig);i.ok?(this._state.bundle=this._options.localConfig,this._plugins.runConfigUpdate(this._options.localConfig)):(this._errorPolicy.recordRejectedBundle("localConfig",i.path,i.reason),this._options.localConfig=void 0)}if(typeof window<"u"){let i=window;i.__TRAFFICAL_INSTANCES__??(i.__TRAFFICAL_INSTANCES__=[]),i.__TRAFFICAL_INSTANCES__.push(this)}}async initialize(){await this._errorPolicy.sideEffectAsync("initialize","other",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig(),this._startBackgroundRefresh(),this._state.isInitialized=!0,await this._plugins.runInitialize(this)}),this._readyResolve()}get isInitialized(){return this._state.isInitialized}async waitForReady(){return this._readyPromise}async close(){if(this._state.refreshTimer&&(clearInterval(this._state.refreshTimer),this._state.refreshTimer=null),this._lifecycleProvider.isUnloading()?this._eventLogger.flushBeacon():await this._eventLogger.flush().catch(()=>{}),this._eventLogger.destroy(),this._plugins.runDestroy(),this._identityListeners=[],this._overrideListeners=[],this._overrides={},typeof window<"u"){let t=window.__TRAFFICAL_INSTANCES__;if(t){let n=t.indexOf(this);n!==-1&&t.splice(n,1)}}}destroy(){if(this._state.refreshTimer&&(clearInterval(this._state.refreshTimer),this._state.refreshTimer=null),this._lifecycleProvider.isUnloading()?this._eventLogger.flushBeacon():this._eventLogger.flush().catch(()=>{}),this._eventLogger.destroy(),this._plugins.runDestroy(),this._identityListeners=[],this._overrideListeners=[],this._overrides={},typeof window<"u"){let t=window.__TRAFFICAL_INSTANCES__;if(t){let n=t.indexOf(this);n!==-1&&t.splice(n,1)}}}async refreshConfig(){await this._errorPolicy.sideEffectAsync("refreshConfig","other",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig()})}getConfigVersion(){return this._state.serverResponse?.stateVersion??this._state.bundle?.version??null}getUnitKeyField(){return ue(this._getEffectiveBundle())}getParameterLayerId(e){return de(this._getEffectiveBundle(),e)}getDiagnostics(){return this._errorPolicy.getDiagnostics()}getParams(e,t){let{context:n,defaults:i}=st(e,t);return this._errorPolicy.resolve("getParams",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){this._maybeResolveForContext(n);let c={...i};for(let[d,g]of Object.entries(this._state.serverResponse.assignments))d in c&&(c[d]=g);return this._plugins.runResolve(c),this._applyOverridesToResult(c),c}let o=this._getEffectiveBundle(),s=this._enrichContext(n),a=fe(o,s,i);return this._plugins.runResolve(a),this._applyOverridesToResult(a),a},()=>({...i}))}decide(e,t){let{context:n,defaults:i}=st(e,t),o=this._errorPolicy.resolve("decide",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){this._maybeResolveForContext(n);let g=this._state.serverResponse,l={...i};for(let[u,p]of Object.entries(g.assignments))u in l&&(l[u]=p);let m={decisionId:B(),assignments:l,metadata:{...g.metadata,configVersion:g.stateVersion}};return this._cacheDecision(m),this._updateCumulativeAttribution(m),this._plugins.runDecision(m),this._applyOverridesToResult(m.assignments),m.metadata.reason=g.metadata.layers?.some(u=>u.policyId)?"resolved":"default",m}let s=this._getEffectiveBundle(),a=this._enrichContext(n);a=this._plugins.runBeforeDecision(a);let c=this._state.cachedEdgeResults??void 0,d=ge(s,a,i,c);return this._cacheDecision(d),this._updateCumulativeAttribution(d),this._plugins.runDecision(d),this._applyOverridesToResult(d.assignments),d.metadata.reason=s?d.metadata.layers.some(g=>g.policyId)?"resolved":"default":"no-bundle",d},()=>({decisionId:B(),assignments:{...i},metadata:{timestamp:new Date().toISOString(),unitKeyValue:"",layers:[],reason:"error"}}));return this._emitAssignmentLogEntries(o,"decision"),o}trackExposure(e){this._emitAssignmentLogEntries(e,"exposure"),this._errorPolicy.resolve("trackExposure",()=>{let t=e.metadata.unitKeyValue;if(!t)return;let n=e.metadata.configVersion??this.getConfigVersion()??void 0,i=[];for(let s of e.metadata.layers)!s.policyId||!s.allocationName||s.attributionOnly||!this._exposureDedup.checkAndMark(t,s.policyId,s.allocationName)||i.push(s);if(i.length===0)return;let o={type:"exposure",id:ke(),decisionId:e.decisionId,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,unitKey:t,timestamp:new Date().toISOString(),assignments:e.assignments,layers:i,context:e.metadata.filteredContext,configVersion:n,sdkName:Ue,sdkVersion:L};this._plugins.runExposure(o)&&this._dispatchEvent(o)},()=>{})}track(e,t,n){this._errorPolicy.resolve("track",()=>{let i=n?.unitKey??this._stableId.getId(),o=typeof n?.value=="number"?n.value:typeof t?.value=="number"?t.value:void 0,s=this._buildAttribution(i,n?.decisionId),a=n?.decisionId,c={type:"track",id:De(),orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,unitKey:i,timestamp:new Date().toISOString(),event:e,value:o,values:n?.values,properties:t,decisionId:a,attribution:s,eventTimestamp:n?.eventTimestamp,sdkName:Ue,sdkVersion:L};this._plugins.runTrack(c)&&this._dispatchEvent(c)},()=>{})}async flushEvents(){await this._errorPolicy.sideEffectAsync("flushEvents","other",async()=>{await this._eventLogger.flush()})}use(e){if(!this._plugins.register(e))return this;if(this._state.isInitialized){try{e.onInitialize?.(this)}catch(n){console.warn(`[Traffical] Plugin "${e.name}" late onInitialize error:`,n)}if(this._state.bundle)try{e.onConfigUpdate?.(this._state.bundle)}catch(n){console.warn(`[Traffical] Plugin "${e.name}" late onConfigUpdate error:`,n)}}return this}getPlugin(e){return this._plugins.get(e)}getStableId(){return this._stableId.getId()}setStableId(e){this._stableId.setId(e)}identify(e){this._stableId.setId(e);for(let t of this._identityListeners)try{t(e)}catch{}}onIdentityChange(e){return this._identityListeners.push(e),()=>{this._identityListeners=this._identityListeners.filter(t=>t!==e)}}onOverridesChange(e){return this._overrideListeners.push(e),()=>{this._overrideListeners=this._overrideListeners.filter(t=>t!==e)}}applyOverrides(e){Object.assign(this._overrides,e),this._notifyOverrideListeners()}clearOverrides(){this._overrides={},this._notifyOverrideListeners()}getOverrides(){return{...this._overrides}}_notifyOverrideListeners(){let e={...this._overrides};for(let t of this._overrideListeners)try{t(e)}catch{}}_dispatchEvent(e){if(this._byoEventLogger)try{this._byoEventLogger(e)}catch{}this._disableCloudEvents||this._eventLogger.log(e)}_emitAssignmentLogEntries(e,t){if(!this._assignmentLogger)return;let n=e.metadata.unitKeyValue;if(!n)return;let i=e.metadata.configVersion??this.getConfigVersion()??void 0;for(let o of e.metadata.layers){if(!o.policyId||!o.allocationName||this._assignmentLoggerDedup&&!this._assignmentLoggerDedup.checkAndMark(n,o.policyId,`${o.allocationName}:${t}`))continue;let s=o.policyId,a=o.allocationName;this._errorPolicy.sideEffect("assignmentLogger","assignmentLog",()=>this._assignmentLogger({unitKey:n,policyId:s,policyKey:o.policyKey,allocationName:a,allocationKey:o.allocationKey,timestamp:e.metadata.timestamp,layerId:o.layerId,allocationId:o.allocationId,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,sdkName:Ue,sdkVersion:L,properties:e.metadata.filteredContext,type:t,decisionId:e.decisionId,anonymousId:this._stableId.getId(),id:Pe(),bucket:o.bucket>=0?o.bucket:void 0,probability:o.probability,modelVersion:o.modelVersion,configVersion:i}))}}_applyOverridesToResult(e){let t=Object.keys(this._overrides);if(t.length!==0)for(let n of t)n in e&&(e[n]=this._overrides[n])}_getEffectiveBundle(){return this._state.bundle??this._options.localConfig??null}_enrichContext(e){let n=this._getEffectiveBundle()?.hashing?.unitKey??"userId";return e[n]?e:{...e,[n]:this._stableId.getId()}}async _fetchConfig(){let e=`${this._options.baseUrl}/v1/config/${encodeURIComponent(this._options.projectId)}?env=${encodeURIComponent(this._options.env)}`,t={"Content-Type":"application/json",Authorization:`Bearer ${this._options.apiKey}`};this._state.etag&&(t["If-None-Match"]=this._state.etag);let n=new AbortController,i=setTimeout(()=>n.abort(),this._requestTimeoutMs);try{let o=await fetch(e,{method:"GET",headers:t,signal:n.signal});if(o.status===304){this._state.lastFetchTime=Date.now();return}if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);let s=await o.json(),a=o.headers.get("ETag"),c=z(s);if(!c.ok){this._errorPolicy.recordRejectedBundle("fetchConfig",c.path,c.reason),this._logMalformedBundleWarning();return}if(this._state.bundle=s,this._state.etag=a,this._state.lastFetchTime=Date.now(),this._findEdgePolicies(s).length>0){let d=await this._prefetchEdgeResults(s,this._enrichContext({}));this._state.cachedEdgeResults=d}else this._state.cachedEdgeResults=null;this._plugins.runConfigUpdate(s)}catch(o){this._logOfflineWarning(o)}finally{clearTimeout(i)}}_startBackgroundRefresh(){let e=this._options.evaluationMode==="server"?this._state.serverResponse?.suggestedRefreshMs??this._options.refreshIntervalMs:this._options.refreshIntervalMs;if(e<=0)return;let t=()=>{this._state.refreshTimer=setTimeout(()=>{t(),this._options.evaluationMode==="server"?this._fetchServerResolve().catch(()=>{}):this._fetchConfig().catch(()=>{})},wn(e))};t()}_maybeResolveForContext(e){let t=this._enrichContext(e),n;try{n=JSON.stringify(t)}catch{n=""}n!==this._lastResolveContextKey&&(this._lastResolveContextKey=n,this._fetchServerResolve(t))}async _fetchServerResolve(e){if(this._decisionClient)try{let t=e??this._enrichContext({}),n=await this._decisionClient.resolve({context:t});n&&(this._state.serverResponse=n,this._state.lastFetchTime=Date.now())}catch(t){this._logOfflineWarning(t)}}_findEdgePolicies(e){let t=[];for(let n of e.layers)for(let i of n.policies)i.state==="running"&&i.entityConfig?.resolutionMode==="edge"&&t.push(i);return t}async _prefetchEdgeResults(e,t){if(!this._decisionClient)return{};let n=this._findEdgePolicies(e);if(n.length===0)return{};let i=W(e,t);if(!i)return{};let o=n.map(s=>{if(!s.entityConfig)return null;let a=s.entityConfig.dynamicAllocations?typeof t[s.entityConfig.dynamicAllocations.countKey]=="number"?Math.floor(t[s.entityConfig.dynamicAllocations.countKey]):0:s.allocations.length;return Re(s.id,s.entityConfig.entityKeys,t,i,a||void 0)}).filter(s=>s!==null);if(o.length===0)return{};try{let s=await this._decisionClient.decideEntityBatch(o),a=new Map;for(let c=0;c<o.length;c++){let d=s[c];d&&a.set(o[c].policyId,{allocationIndex:d.allocationIndex,entityId:o[c].entityId})}return a.size>0?{edgeResults:a}:{}}catch{return{}}}_logOfflineWarning(e){let t=Date.now();t-this._state.lastOfflineWarning>xn&&(console.warn(`[Traffical] Failed to fetch config: ${e instanceof Error?e.message:String(e)}. Using ${this._state.bundle?"cached":"local"} config.`),this._state.lastOfflineWarning=t)}_logMalformedBundleWarning(){let e=Date.now();e-this._state.lastMalformedWarning>En&&(console.warn(`[Traffical] Discarded malformed config bundle (invalid hashing/shape). Using ${this._state.bundle?"cached":"local"} config.`),this._state.lastMalformedWarning=e)}_cacheDecision(e){if(this._decisionCache.size>=In){let t=this._decisionCache.keys().next().value;t&&this._decisionCache.delete(t)}this._decisionCache.set(e.decisionId,e)}_updateCumulativeAttribution(e){let t=e.metadata.unitKeyValue;if(!t)return;let n=this._cumulativeAttribution.get(t);n||(n=new Map,this._cumulativeAttribution.set(t,n));for(let i of e.metadata.layers){if(!i.policyId||!i.allocationName)continue;let o=`${i.layerId}:${i.policyId}`;n.set(o,{layerId:i.layerId,policyId:i.policyId,allocationName:i.allocationName})}}_buildAttribution(e,t){if(this._options.attributionMode==="decision"){if(!t)return;let i=this._decisionCache.get(t);return i?i.metadata.layers.filter(o=>o.policyId&&o.allocationName).map(o=>({layerId:o.layerId,policyId:o.policyId,allocationName:o.allocationName})):void 0}let n=this._cumulativeAttribution.get(e);return n&&n.size>0?Array.from(n.values()):void 0}};async function at(r){let e=new V(r);return await e.initialize(),e}function ct(r){return new V(r)}function lt(r={}){let e={observeMutations:r.observeMutations??!0,debounceMs:r.debounceMs??100},t=[],n={},i=null,o=null;function s(u,p){try{return new RegExp(u).test(p)}catch{return p===u}}function a(u,p,_){if(p==="innerHTML")u.innerHTML=_;else if(p==="textContent")u.textContent=_;else if(p==="src"&&"src"in u)u.src=_;else if(p==="href"&&"href"in u)u.href=_;else if(p.startsWith("style.")){let x=p.slice(6);u.style[x]=_}else u.setAttribute(p,_)}function c(u,p){let _=String(p);try{let x=document.querySelectorAll(u.selector);for(let C of x)a(C,u.property,_)}catch(x){console.warn(`[Traffical DOM Binding] Failed to apply binding for ${u.parameterKey}:`,x)}}function d(u,p=!1){n=u;let _=typeof window<"u"?window.location.pathname:"";for(let x of t){if(!p&&!s(x.urlPattern,_))continue;let C=u[x.parameterKey];C!==void 0&&c(x,C)}}function g(){o&&clearTimeout(o),o=setTimeout(()=>{d(n)},e.debounceMs)}function l(){i||typeof MutationObserver>"u"||typeof document>"u"||(i=new MutationObserver(()=>{g()}),i.observe(document.body,{childList:!0,subtree:!0}))}function m(){i&&(i.disconnect(),i=null),o&&(clearTimeout(o),o=null)}return{name:"dom-binding",onInitialize(){e.observeMutations&&l()},onConfigUpdate(u){t=u.domBindings??[]},onResolve(u){d(u)},onDecision(u){d(u.assignments)},onDestroy(){m(),t=[],n={}},applyBindings(u){d(u||n)},getBindings(){return t}}}var T=null;async function Cn(r){return T?(console.warn("[Traffical] Client already initialized. Returning existing instance."),T):(T=await at(r),T)}function An(r){return T?(console.warn("[Traffical] Client already initialized. Returning existing instance."),T):(T=ct(r),T.initialize().catch(e=>{console.warn("[Traffical] Initialization error:",e)}),T)}function Sn(){return T}function kn(){T&&(T.destroy(),T=null)}return yt(Dn);})();
1
+ /* @traffical/js-client v0.18.0 */
2
+ "use strict";var Traffical=(()=>{var Z=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var ft=Object.prototype.hasOwnProperty;var gt=(r,e,t)=>e in r?Z(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var ht=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),pt=(r,e)=>{for(var t in e)Z(r,t,{get:e[t],enumerable:!0})},mt=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of dt(e))!ft.call(r,i)&&i!==t&&Z(r,i,{get:()=>e[i],enumerable:!(n=ut(e,i))||n.enumerable});return r};var yt=r=>mt(Z({},"__esModule",{value:!0}),r);var y=(r,e,t)=>(gt(r,typeof e!="symbol"?e+"":e,t),t);var qe=ht(()=>{});var Pn={};pt(Pn,{TrafficalClient:()=>U,createDOMBindingPlugin:()=>lt,createDebugPlugin:()=>Ve,createRedirectAttributionPlugin:()=>Ne,createRedirectPlugin:()=>Be,destroy:()=>Dn,init:()=>kn,initSync:()=>Sn,instance:()=>Rn});function vt(r){return r instanceof Uint8Array||ArrayBuffer.isView(r)&&r.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in r&&r.BYTES_PER_ELEMENT===1}function ve(r,e,t=""){let n=vt(r),i=r?.length,o=e!==void 0;if(!n||o&&i!==e){let s=t&&`"${t}" `,a=o?` of length ${e}`:"",c=n?`length=${i}`:`type=${typeof r}`,f=s+"expected Uint8Array"+a+", got "+c;throw n?new RangeError(f):new TypeError(f)}return r}function _e(r,e=!0){if(r.destroyed)throw new Error("Hash instance has been destroyed");if(e&&r.finished)throw new Error("Hash#digest() has already been called")}function Fe(r,e){ve(r,void 0,"digestInto() output");let t=e.outputLen;if(r.length<t)throw new RangeError('"digestInto() output" expected to be of length >='+t)}function F(...r){for(let e=0;e<r.length;e++)r[e].fill(0)}function ee(r){return new DataView(r.buffer,r.byteOffset,r.byteLength)}function A(r,e){return r<<32-e|r>>>e}function Ke(r,e={}){let t=(i,o)=>r(o).update(i).digest(),n=r(void 0);return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.canXOF=n.canXOF,t.create=i=>r(i),Object.assign(t,e),Object.freeze(t)}var $e=r=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,r])});function je(r,e,t){return r&e^~r&t}function He(r,e,t){return r&e^r&t^e&t}var te=class{constructor(e,t,n,i){y(this,"blockLen");y(this,"outputLen");y(this,"canXOF",!1);y(this,"padOffset");y(this,"isLE");y(this,"buffer");y(this,"view");y(this,"finished",!1);y(this,"length",0);y(this,"pos",0);y(this,"destroyed",!1);this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=i,this.buffer=new Uint8Array(e),this.view=ee(this.buffer)}update(e){_e(this),ve(e);let{view:t,buffer:n,blockLen:i}=this,o=e.length;for(let s=0;s<o;){let a=Math.min(i-this.pos,o-s);if(a===i){let c=ee(e);for(;i<=o-s;s+=i)this.process(c,s);continue}n.set(e.subarray(s,s+a),this.pos),this.pos+=a,s+=a,this.pos===i&&(this.process(t,0),this.pos=0)}return this.length+=e.length,this.roundClean(),this}digestInto(e){_e(this),Fe(e,this),this.finished=!0;let{buffer:t,view:n,blockLen:i,isLE:o}=this,{pos:s}=this;t[s++]=128,F(this.buffer.subarray(s)),this.padOffset>i-s&&(this.process(n,0),s=0);for(let l=s;l<i;l++)t[l]=0;n.setBigUint64(i-8,BigInt(this.length*8),o),this.process(n,0);let a=ee(e),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let f=c/4,g=this.get();if(f>g.length)throw new Error("_sha2: outputLen bigger than state");for(let l=0;l<f;l++)a.setUint32(4*l,g[l],o)}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());let{blockLen:t,buffer:n,length:i,finished:o,destroyed:s,pos:a}=this;return e.destroyed=s,e.finished=o,e.length=i,e.pos=a,i%t&&e.buffer.set(n),e}clone(){return this._cloneInto()}},S=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var _t=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),P=new Uint32Array(64),xe=class extends te{constructor(e){super(64,e,8,!1)}get(){let{A:e,B:t,C:n,D:i,E:o,F:s,G:a,H:c}=this;return[e,t,n,i,o,s,a,c]}set(e,t,n,i,o,s,a,c){this.A=e|0,this.B=t|0,this.C=n|0,this.D=i|0,this.E=o|0,this.F=s|0,this.G=a|0,this.H=c|0}process(e,t){for(let l=0;l<16;l++,t+=4)P[l]=e.getUint32(t,!1);for(let l=16;l<64;l++){let p=P[l-15],u=P[l-2],m=A(p,7)^A(p,18)^p>>>3,b=A(u,17)^A(u,19)^u>>>10;P[l]=b+P[l-7]+m+P[l-16]|0}let{A:n,B:i,C:o,D:s,E:a,F:c,G:f,H:g}=this;for(let l=0;l<64;l++){let p=A(a,6)^A(a,11)^A(a,25),u=g+p+je(a,c,f)+_t[l]+P[l]|0,b=(A(n,2)^A(n,13)^A(n,22))+He(n,i,o)|0;g=f,f=c,c=a,a=s+u|0,s=o,o=i,i=n,n=u+b|0}n=n+this.A|0,i=i+this.B|0,o=o+this.C|0,s=s+this.D|0,a=a+this.E|0,c=c+this.F|0,f=f+this.G|0,g=g+this.H|0,this.set(n,i,o,s,a,c,f,g)}roundClean(){F(P)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),F(this.buffer)}},be=class extends xe{constructor(){super(32);y(this,"A",S[0]|0);y(this,"B",S[1]|0);y(this,"C",S[2]|0);y(this,"D",S[3]|0);y(this,"E",S[4]|0);y(this,"F",S[5]|0);y(this,"G",S[6]|0);y(this,"H",S[7]|0)}};var We=Ke(()=>new be,$e(1));var ze=new TextEncoder,Ee="v2";function ne(r){return ze.encode(r).length}function ie(r,e){let t=ne(r),n=ne(e);return`traffical:assignment:${Ee}|u:${t}:${r}|l:${n}:${e}`}function K(r){return We(ze.encode(r))}function $(r){let e=0n;for(let t=0;t<8;t++)e=e<<8n|BigInt(r[t]);return e}function re(r){return $(K(r))}function oe(r,e,t){let n=K(ie(r,e)),i=$(n);return Number(i%BigInt(t))}function Ie(r,e){return r>=e[0]&&r<=e[1]}function se(r,e){for(let t of e)if(Ie(r,t.bucketRange))return t;return null}var xt=1n<<53n,bt=9007199254740992;function B(r,e){if(r.length===0||r.length===1)return 0;let t=re(e),n=Number(t%xt)/bt,i=0;for(let o=0;o<r.length;o++)if(i+=r[o],n<i)return o;return r.length-1}function Te(r,e){let{field:t,op:n,value:i,values:o}=r,s=Tt(e,t);switch(n){case"eq":return s===i;case"neq":return s!==i;case"in":return Array.isArray(o)?o.includes(s):!1;case"nin":return Array.isArray(o)?!o.includes(s):!0;case"gt":return typeof s=="number"&&s>i;case"gte":return typeof s=="number"&&s>=i;case"lt":return typeof s=="number"&&s<i;case"lte":return typeof s=="number"&&s<=i;case"contains":return typeof s=="string"&&typeof i=="string"&&s.includes(i);case"startsWith":return typeof s=="string"&&typeof i=="string"&&s.startsWith(i);case"endsWith":return typeof s=="string"&&typeof i=="string"&&s.endsWith(i);case"regex":if(typeof s!="string"||typeof i!="string")return!1;try{return new RegExp(i).test(s)}catch{return!1}case"exists":return s!=null;case"notExists":return s==null;default:return!1}}function ae(r,e){return r.length===0?!0:r.every(t=>Te(t,e))}function Tt(r,e){let t=e.split("."),n=r;for(let i of t){if(n==null)return;if(typeof n=="object")n=n[i];else return}return n}function Ce(r,e){let t=r.intercept;for(let{key:n,coef:i,missing:o}of r.numeric){let s=e[n];t+=typeof s=="number"?i*s:o}for(let{key:n,values:i,missing:o}of r.categorical){let s=e[n],a=s!=null?String(s):null;t+=a!==null&&a in i?i[a]:o}return t}function we(r,e){if(r.length===0)return[];if(r.length===1)return[1];let t=Math.max(e,1e-10),n=r.map(a=>a/t),i=Math.max(...n),o=n.map(a=>Math.exp(a-i)),s=o.reduce((a,c)=>a+c,0);return o.map(a=>a/s)}function Ae(r,e){if(r.length===0)return[];if(e<=0)return r;let t=r.length,n=1/t,i=Math.min(e,n),o=r.map(a=>Math.max(a,i)),s=o.reduce((a,c)=>a+c,0);return s===0?Array(t).fill(1/t):o.map(a=>a/s)}function ce(r,e,t){let n=r.contextualModel;if(!n||r.allocations.length===0)return null;let i=Ct(n,r.allocations,e),o=we(i,n.gamma),s=Ae(o,n.actionProbabilityFloor),a=`ctx:${t}:${r.id}`,c=B(s,a);return{allocation:r.allocations[c],probability:s[c]}}function Ct(r,e,t){return e.map(n=>{let i=r.coefficients[n.key??n.name];return i?Ce(i,t):r.defaultAllocationScore})}var wt=r=>crypto.getRandomValues(new Uint8Array(r)),At=(r,e,t)=>{let n=(2<<Math.log2(r.length-1))-1,i=-~(1.6*n*e/r.length);return(o=e)=>{let s="";for(;;){let a=t(i),c=i|0;for(;c--;)if(s+=r[a[c]&n]||"",s.length>=o)return s}}},Ge=(r,e=21)=>At(r,e|0,wt);function le(r){let e=new Error(r);return e.source="ulid",e}var ke="0123456789ABCDEFGHJKMNPQRSTVWXYZ",j=ke.length,Xe=Math.pow(2,48)-1,kt=10,St=16;function Rt(r){let e=Math.floor(r()*j);return e===j&&(e=j-1),ke.charAt(e)}function Dt(r,e){if(isNaN(r))throw new Error(r+" must be a number");if(r>Xe)throw le("cannot encode time greater than "+Xe);if(r<0)throw le("time must be positive");if(Number.isInteger(Number(r))===!1)throw le("time must be an integer");let t,n="";for(;e>0;e--)t=r%j,n=ke.charAt(t)+n,r=(r-t)/j;return n}function Pt(r,e){let t="";for(;r>0;r--)t=Rt(e)+t;return t}function Lt(r=!1,e){e||(e=typeof window<"u"?window:null);let t=e&&(e.crypto||e.msCrypto);if(t)return()=>{let n=new Uint8Array(1);return t.getRandomValues(n),n[0]/255};try{let n=qe();return()=>n.randomBytes(1).readUInt8()/255}catch{}if(r){try{console.error("secure crypto unusable, falling back to insecure Math.random()!")}catch{}return()=>Math.random()}throw le("secure crypto unusable, insecure Math.random not allowed")}function Ot(r){return r||(r=Lt()),function(t){return isNaN(t)&&(t=Date.now()),Dt(t,kt)+Pt(St,r)}}var Je=Ot();var Mt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Bt=8,ui=Ge(Mt,Bt);function H(r){return`${r}_${Je()}`}function N(){return H("dec")}function Se(){return H("exp")}function Re(){return H("trk")}function De(){return H("asn")}function Nt(r,e){let t=new Set;for(let i of e)if(i.contextLogging?.allowedFields)for(let o of i.contextLogging.allowedFields)t.add(o);if(t.size===0)return;let n={};for(let i of t)i in r&&(n[i]=r[i]);return Object.keys(n).length>0?n:void 0}function Vt(r,e){let t=[];for(let n of r){let i=e[n];if(i==null)return null;t.push(String(i))}return t.join("_")}function Qe(r){if(r<=0)return[];let e=1/r;return Array(r).fill(e)}function Ut(r,e,t,n){let i=r.entityState?.[e];if(!i)return Qe(n);let o=i.entities[t];if(o&&o.weights.length===n)return o.weights;let s=i._global;return s&&s.weights.length===n?s.weights:Qe(n)}function Ft(r,e,t,n){let i=e.entityConfig;if(!i)return null;let o=Vt(i.entityKeys,t);if(!o)return null;let s,a;if(i.dynamicAllocations){let l=i.dynamicAllocations.countKey,p=t[l];if(typeof p!="number"||p<=0)return null;a=Math.floor(p),s=Array.from({length:a},(u,m)=>({id:`${e.id}_dynamic_${m}`,name:String(m),bucketRange:[0,0],overrides:{}}))}else s=e.allocations,a=s.length;if(a===0)return null;let c=Ut(r,e.id,o,a),f=`${o}:${n}:${e.id}`,g=B(c,f);return{allocation:s[g],weight:c[g],entityId:o}}function W(r,e){let t=e[r.hashing.unitKey];return t==null?null:String(t)}function ue(r){return r?.hashing?.unitKey??null}function de(r,e){return r?r.parameters.find(n=>n.key===e)?.layerId??null:null}function Ye(r,e,t,n){let i={...t},o=[],s=[];if(!r)return{assignments:i,unitKeyValue:"",layers:o,matchedPolicies:s};let a=W(r,e)??"",c=new Set(Object.keys(t)),f=r.parameters.filter(l=>c.has(l.key));for(let l of f)l.key in i&&(i[l.key]=l.default);let g=new Map;for(let l of f){let p=g.get(l.layerId)||[];p.push(l),g.set(l.layerId,p)}for(let l of r.layers){let p=g.get(l.id),u=p&&p.length>0,m=l.unitKey,b=m!=null;if(b&&String(m).trim()===""){o.push({layerId:l.id,bucket:-1,...u?{}:{attributionOnly:!0}});continue}let _=b?String(e[m]??""):a;if(!_){o.push({layerId:l.id,bucket:-1,...b?{unitKey:m,unitKeyValue:""}:{},...u?{}:{attributionOnly:!0}});continue}let T=oe(_,l.id,r.hashing.bucketCount),w,E,D,d;for(let h of l.policies)if(h.state==="running"){if(h.eligibleBucketRange){let{start:x,end:I}=h.eligibleBucketRange;if(T<x||T>I)continue}if(ae(h.conditions,e)){if(h.contextualModel){let x=ce(h,e,_);if(x){if(w=h,E=x.allocation,D=x.probability,d=h.contextualModel.generatedAt??h.contextualModel.modelVersion,s.push(h),u)for(let[I,k]of Object.entries(x.allocation.overrides))I in i&&(i[I]=k);break}}if(h.entityConfig&&h.entityConfig.resolutionMode==="bundle"){let x=Ft(r,h,e,_);if(x){if(w=h,E=x.allocation,D=x.weight,s.push(h),u&&!h.entityConfig.dynamicAllocations)for(let[I,k]of Object.entries(x.allocation.overrides))I in i&&(i[I]=k);break}}else if(h.entityConfig&&h.entityConfig.resolutionMode==="edge"){let x=n?.edgeResults?.get(h.id);if(x){if(w=h,s.push(h),h.entityConfig.dynamicAllocations)E={id:`${h.id}_dynamic_${x.allocationIndex}`,name:String(x.allocationIndex),bucketRange:[0,0],overrides:{}};else if(h.allocations[x.allocationIndex]&&(E=h.allocations[x.allocationIndex],u&&E))for(let[I,k]of Object.entries(E.overrides))I in i&&(i[I]=k);break}continue}else{let x=se(T,h.allocations);if(x){if(w=h,E=x,h.kind==="adaptive"){let[I,k]=x.bucketRange;D=(k-I+1)/r.hashing.bucketCount}if(s.push(h),u)for(let[I,k]of Object.entries(x.overrides))I in i&&(i[I]=k);break}}}}o.push({layerId:l.id,bucket:T,policyId:w?.id,policyKey:w?.key,allocationId:E?.id,allocationName:E?.name,allocationKey:E?.key,...D!==void 0&&D>0&&D<=1?{probability:D}:{},...d!==void 0?{modelVersion:d}:{},...b?{unitKey:m,unitKeyValue:_}:{},...u?{}:{attributionOnly:!0}})}return{assignments:i,unitKeyValue:a,layers:o,matchedPolicies:s}}function fe(r,e,t,n){return Ye(r,e,t,n).assignments}function ge(r,e,t,n){let{assignments:i,unitKeyValue:o,layers:s,matchedPolicies:a}=Ye(r,e,t,n),c=Nt(e,a);return{decisionId:N(),assignments:i,metadata:{timestamp:new Date().toISOString(),unitKeyValue:o,layers:s,filteredContext:c,...r?.version?{configVersion:r.version}:{}}}}var M=class r{constructor(e={}){y(this,"_seen",new Map);y(this,"_ttlMs");y(this,"_maxEntries");y(this,"_lastCleanup",Date.now());this._ttlMs=e.ttlMs??36e5,this._maxEntries=e.maxEntries??1e4}static hashAssignments(e){let t=Object.keys(e).sort(),n=[];for(let i of t){let o=e[i],s=typeof o=="object"?JSON.stringify(o):String(o);n.push(`${i}=${s}`)}return n.join("|")}static createKey(e,t){return`${e}:${t}`}checkAndMark(e,t){let n=r.createKey(e,t),i=Date.now(),o=this._seen.get(n);return o!==void 0&&i-o<this._ttlMs?!1:(this._seen.set(n,i),this._maybeCleanup(i),!0)}wouldBeNew(e,t){let n=r.createKey(e,t),i=Date.now(),o=this._seen.get(n);return o===void 0?!0:i-o>=this._ttlMs}clear(){this._seen.clear()}get size(){return this._seen.size}_maybeCleanup(e){(e-this._lastCleanup>this._ttlMs*.2||this._seen.size>this._maxEntries)&&(this._lastCleanup=e,this._cleanup(e))}_cleanup(e){let t=[];for(let[n,i]of this._seen.entries())e-i>=this._ttlMs&&t.push(n);for(let n of t)this._seen.delete(n);if(this._seen.size>this._maxEntries){let i=Array.from(this._seen.entries()).sort((o,s)=>o[1]-s[1]).slice(0,this._seen.size-this._maxEntries);for(let[o]of i)this._seen.delete(o)}}};var Ze={resolutionErrors:0,droppedAssignmentLogs:0,droppedEventLogs:0,rejectedBundles:0,sideEffectErrors:0,lastError:null};function nn(r){return r instanceof Error?r:typeof r=="string"?new Error(r):new Error("An unknown error occurred")}var V=class{constructor(e={}){y(this,"_onResolutionError");y(this,"_onError");y(this,"_seen",new Set);y(this,"_counters",{...Ze});this._onResolutionError=e.onResolutionError??"default",this._onError=e.onError}get throwsOnResolutionError(){return this._onResolutionError==="throw"}resolve(e,t,n){try{return t()}catch(i){if(this._counters.resolutionErrors++,this._report(e,i),this._onResolutionError==="throw")throw i;return n()}}async resolveAsync(e,t,n){try{return await t()}catch(i){if(this._counters.resolutionErrors++,this._report(e,i),this._onResolutionError==="throw")throw i;return n()}}sideEffect(e,t,n){try{n()}catch(i){this._countSideEffect(t),this._report(e,i)}}async sideEffectAsync(e,t,n){try{await n()}catch(i){this._countSideEffect(t),this._report(e,i)}}recordRejectedBundle(e,t,n){this._counters.rejectedBundles++,this._report(e,new Error(t?`${t}: ${n}`:n))}getDiagnostics(){return{...this._counters}}reset(){Object.assign(this._counters,Ze,{lastError:null}),this._seen.clear()}_countSideEffect(e){switch(e){case"assignmentLog":this._counters.droppedAssignmentLogs++;break;case"eventLog":this._counters.droppedEventLogs++;break;case"bundleRejected":this._counters.rejectedBundles++;break;default:this._counters.sideEffectErrors++}}_report(e,t){let n=nn(t);this._counters.lastError={tag:e,name:n.name,message:n.message};let i=`${e}:${n.name}:${n.message}`;if(!this._seen.has(i)&&(this._seen.add(i),console.warn(`[Traffical] Contained error in ${e}:`,n.message),!!this._onError))try{this._onError(e,n)}catch{}}};function v(r,e){return{ok:!1,path:r,reason:e}}function L(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function R(r){return typeof r=="string"&&r.length>0}function z(r){if(!L(r))return v("","bundle is not an object");let e=r.hashing;if(!L(e))return v("hashing","missing or not an object");if(!R(e.unitKey))return v("hashing.unitKey","missing or not a non-empty string");if(typeof e.bucketCount!="number"||!Number.isInteger(e.bucketCount)||e.bucketCount<1)return v("hashing.bucketCount","not an integer >= 1");if(!Array.isArray(r.parameters))return v("parameters","not an array");for(let t=0;t<r.parameters.length;t++){let n=r.parameters[t],i=`parameters[${t}]`;if(!L(n))return v(i,"not an object");if(!R(n.key))return v(`${i}.key`,"missing or not a non-empty string");if(!R(n.layerId))return v(`${i}.layerId`,"missing or not a non-empty string");if(!("default"in n))return v(`${i}.default`,"missing")}if(!Array.isArray(r.layers))return v("layers","not an array");for(let t=0;t<r.layers.length;t++){let n=r.layers[t],i=`layers[${t}]`;if(!L(n))return v(i,"not an object");if(!R(n.id))return v(`${i}.id`,"missing or not a non-empty string");if(n.unitKey!==void 0&&typeof n.unitKey!="string")return v(`${i}.unitKey`,"present but not a string");if(!Array.isArray(n.policies))return v(`${i}.policies`,"not an array");for(let o=0;o<n.policies.length;o++){let s=n.policies[o],a=`${i}.policies[${o}]`;if(!L(s))return v(a,"not an object");if(!R(s.id))return v(`${a}.id`,"missing or not a non-empty string");if(!R(s.state))return v(`${a}.state`,"missing or not a non-empty string");if(!Array.isArray(s.allocations))return v(`${a}.allocations`,"not an array");if(!Array.isArray(s.conditions))return v(`${a}.conditions`,"not an array");for(let c=0;c<s.conditions.length;c++){let f=s.conditions[c],g=`${a}.conditions[${c}]`;if(!L(f))return v(g,"not an object");if(!R(f.field))return v(`${g}.field`,"missing or not a non-empty string");if(!R(f.op))return v(`${g}.op`,"missing or not a non-empty string")}for(let c=0;c<s.allocations.length;c++){let f=s.allocations[c],g=`${a}.allocations[${c}]`;if(!L(f))return v(g,"not an object");if(!R(f.name))return v(`${g}.name`,"missing or not a non-empty string");let l=f.bucketRange;if(!Array.isArray(l)||l.length!==2)return v(`${g}.bucketRange`,"not a 2-element array");let[p,u]=l;if(typeof p!="number"||typeof u!="number"||!Number.isInteger(p)||!Number.isInteger(u))return v(`${g}.bucketRange`,"bounds are not integers");if(p<0||u<p)return v(`${g}.bucketRange`,"bounds are negative or inverted");if(f.overrides!==void 0&&!L(f.overrides))return v(`${g}.overrides`,"present but not an object")}}}return{ok:!0}}var G=class{constructor(e){y(this,"config");y(this,"defaultTimeout");this.config=e,this.defaultTimeout=e.defaultTimeoutMs??5e3}async resolve(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),this.defaultTimeout),i=`${this.config.baseUrl}/v1/resolve`,o=await fetch(i,{method:"POST",headers:this._headers(),body:JSON.stringify({context:e.context,env:e.env??this.config.env,parameters:e.parameters}),signal:t.signal});return clearTimeout(n),o.ok?await o.json():(console.warn(`[Traffical] Resolve failed: ${o.status} ${o.statusText}`),null)}catch(t){return t instanceof Error&&t.name==="AbortError"?console.warn(`[Traffical] Resolve timed out after ${this.defaultTimeout}ms`):console.warn("[Traffical] Resolve error:",t),null}}async decideEntity(e,t){let n=t??Math.min(this.defaultTimeout,100);try{let i=new AbortController,o=setTimeout(()=>i.abort(),n),s=`${this.config.baseUrl}/v1/decide/${e.policyId}`,a=await fetch(s,{method:"POST",headers:this._headers(),body:JSON.stringify({entityId:e.entityId,unitKeyValue:e.unitKeyValue,allocationCount:e.allocationCount,context:e.context}),signal:i.signal});return clearTimeout(o),a.ok?await a.json():(console.warn(`[Traffical] Edge decide failed: ${a.status} ${a.statusText}`),null)}catch(i){return i instanceof Error&&i.name==="AbortError"?console.warn(`[Traffical] Edge decide timed out after ${n}ms`):console.warn("[Traffical] Edge decide error:",i),null}}async decideEntityBatch(e,t){if(e.length===0)return[];if(e.length===1)return[await this.decideEntity(e[0],t)];let n=t??Math.min(this.defaultTimeout,200);try{let i=new AbortController,o=setTimeout(()=>i.abort(),n),s=`${this.config.baseUrl}/v1/decide/batch`,a=await fetch(s,{method:"POST",headers:this._headers(),body:JSON.stringify({requests:e}),signal:i.signal});return clearTimeout(o),a.ok?(await a.json()).responses:(console.warn(`[Traffical] Edge batch decide failed: ${a.status} ${a.statusText}`),e.map(()=>null))}catch(i){return i instanceof Error&&i.name==="AbortError"?console.warn(`[Traffical] Edge batch decide timed out after ${n}ms`):console.warn("[Traffical] Edge batch decide error:",i),e.map(()=>null)}}_headers(){return{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,"X-Org-Id":this.config.orgId,"X-Project-Id":this.config.projectId,"X-Env":this.config.env}}};function Pe(r,e,t,n,i){let o=[];for(let a of e){let c=t[a];if(c==null)return null;o.push(String(c))}let s=o.join("_");return{policyId:r,entityId:s,unitKeyValue:n,allocationCount:i,context:t}}var q="failed_events";var he=class{constructor(e){this._queue=[];this._flushTimer=null;this._isFlushing=!1;this._isDisabled=!1;this._droppedCount=0;this._endpoint=e.endpoint,this._apiKey=e.apiKey,this._storage=e.storage,this._batchSize=e.batchSize??10,this._flushIntervalMs=e.flushIntervalMs??3e4,this._requestTimeoutMs=e.requestTimeoutMs??1e4,this._maxQueueSize=e.maxQueueSize??1e3,this._onError=e.onError,this._onSchemaWarnings=e.onSchemaWarnings,this._lifecycleProvider=e.lifecycleProvider,this._setupListeners(),this._retryFailedEvents(),this._startFlushTimer()}log(e){this._isDisabled||(this._queue.length>=this._maxQueueSize&&(this._queue.shift(),this._droppedCount++),this._queue.push(e),this._queue.length>=this._batchSize&&this.flush())}async flush(){if(this._isFlushing||this._isDisabled||this._queue.length===0)return;this._isFlushing=!0;let e=[...this._queue];this._queue=[];try{let t=await this._sendEvents(e);if(t>=200&&t<300)return;if(t===401){this._disable();return}if(t===429||t>=500){this._persistFailedEvents(e),this._onError?.(new Error(`HTTP ${t}: event delivery failed, will retry`));return}this._onError?.(new Error(`HTTP ${t}: batch rejected, dropping ${e.length} events`))}catch(t){this._persistFailedEvents(e),this._onError?.(t instanceof Error?t:new Error(String(t)))}finally{this._isFlushing=!1}}_disable(){this._isDisabled||(this._isDisabled=!0,this._queue=[],this._storage.remove(q),console.warn("[Traffical] API key rejected (HTTP 401); event delivery disabled for this client"))}get droppedCount(){return this._droppedCount}get isDisabled(){return this._isDisabled}flushBeacon(){if(this._queue.length===0)return!0;if(typeof fetch>"u")return this.flush(),!1;let e=[...this._queue];return this._queue=[],fetch(this._endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:JSON.stringify({events:e}),keepalive:!0}).catch(()=>{this._persistFailedEvents(e)}),!0}get queueSize(){return this._queue.length}destroy(){this._flushTimer&&(clearInterval(this._flushTimer),this._flushTimer=null),this._removeListeners()}async _sendEvents(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this._requestTimeoutMs),i;try{i=await fetch(this._endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:JSON.stringify({events:e}),signal:t.signal})}finally{clearTimeout(n)}if(!i.ok)return i.status;if(this._onSchemaWarnings)try{let o=await i.json();o.schemaWarnings&&o.schemaWarnings.length>0&&this._onSchemaWarnings(o.schemaWarnings)}catch{}return i.status}_persistFailedEvents(e){let n=[...this._storage.get(q)??[],...e].slice(-100);this._storage.set(q,n)}_retryFailedEvents(){let e=this._storage.get(q);!e||e.length===0||(this._storage.remove(q),this._queue.push(...e))}_startFlushTimer(){this._flushIntervalMs<=0||(this._flushTimer=setInterval(()=>{this.flush().catch(()=>{})},this._flushIntervalMs))}_setupListeners(){this._lifecycleProvider&&(this._visibilityCallback=e=>{e==="background"?this._lifecycleProvider?.isUnloading()?this.flushBeacon():this.flush().catch(()=>{}):this._retryFailedEvents()},this._lifecycleProvider.onVisibilityChange(this._visibilityCallback))}_removeListeners(){this._lifecycleProvider&&this._visibilityCallback&&(this._lifecycleProvider.removeVisibilityListener(this._visibilityCallback),this._visibilityCallback=void 0)}};var X="exposure_dedup";var J=class r{constructor(e){this._storage=e.storage,this._sessionTtlMs=e.sessionTtlMs??18e5,this._seen=new Set,this._sessionStart=Date.now(),this._restore()}static createKey(e,t,n){return`${e}:${t}:${n}`}shouldTrack(e){return this._isSessionExpired()&&this._resetSession(),this._seen.has(e)?!1:(this._seen.add(e),this._persist(),!0)}checkAndMark(e,t,n){let i=r.createKey(e,t,n);return this.shouldTrack(i)}clear(){this._seen.clear(),this._storage.remove(X)}get size(){return this._seen.size}_isSessionExpired(){return Date.now()-this._sessionStart>this._sessionTtlMs}_resetSession(){this._seen.clear(),this._sessionStart=Date.now(),this._storage.remove(X)}_persist(){let e={seen:Array.from(this._seen),sessionStart:this._sessionStart};this._storage.set(X,e,this._sessionTtlMs)}_restore(){let e=this._storage.get(X);if(!e)return;if(Date.now()-e.sessionStart>this._sessionTtlMs){this._storage.remove(X);return}this._seen=new Set(e.seen),this._sessionStart=e.sessionStart}};var Q="stable_id",on="traffical_sid";var pe=class{constructor(e){this._cachedId=null;this._storage=e.storage,this._useCookieFallback=e.useCookieFallback??!0,this._cookieName=e.cookieName??on}getId(){if(this._cachedId)return this._cachedId;let e=this._storage.get(Q);return e?(this._cachedId=e,e):this._useCookieFallback&&(e=this._getCookie(),e)?(this._storage.set(Q,e),this._cachedId=e,e):(e=this._generateId(),this._persist(e),this._cachedId=e,e)}setId(e){this._persist(e),this._cachedId=e}clear(){this._storage.remove(Q),this._useCookieFallback&&this._deleteCookie(),this._cachedId=null}hasId(){return this._storage.get(Q)!==null||this._getCookie()!==null}_persist(e){this._storage.set(Q,e),this._useCookieFallback&&this._setCookie(e)}_generateId(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}_getCookie(){if(typeof document>"u")return null;try{let e=document.cookie.split(";");for(let t of e){let[n,i]=t.trim().split("=");if(n===this._cookieName&&i)return decodeURIComponent(i)}}catch{}return null}_setCookie(e){if(!(typeof document>"u"))try{document.cookie=`${this._cookieName}=${encodeURIComponent(e)}; max-age=31536000; path=/; SameSite=Lax`}catch{}}_deleteCookie(){if(!(typeof document>"u"))try{document.cookie=`${this._cookieName}=; max-age=0; path=/`}catch{}}};var Y="traffical:",Le=class{constructor(){this._available=this._checkAvailability()}get(e){if(!this._available)return null;try{let t=localStorage.getItem(Y+e);if(!t)return null;let n=JSON.parse(t);return n.expiresAt&&Date.now()>n.expiresAt?(this.remove(e),null):n.value}catch{return null}}set(e,t,n){if(this._available)try{let i={value:t,...n&&{expiresAt:Date.now()+n}};localStorage.setItem(Y+e,JSON.stringify(i))}catch{}}remove(e){if(this._available)try{localStorage.removeItem(Y+e)}catch{}}clear(){if(this._available)try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n?.startsWith(Y)&&e.push(n)}e.forEach(t=>localStorage.removeItem(t))}catch{}}_checkAvailability(){try{let e=Y+"__test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return!1}}},Oe=class{constructor(){this._store=new Map}get(e){let t=this._store.get(e);return t?t.expiresAt&&Date.now()>t.expiresAt?(this.remove(e),null):t.value:null}set(e,t,n){this._store.set(e,{value:t,...n&&{expiresAt:Date.now()+n}})}remove(e){this._store.delete(e)}clear(){this._store.clear()}};function nt(){let r=new Le;return r.get("__check__")!==null||sn()?r:new Oe}function sn(){try{let r="__traffical_storage_test__";return localStorage.setItem(r,"test"),localStorage.removeItem(r),!0}catch{return!1}}var O="0.18.0";var an="js-client";function Me(r,e){let t=new M({ttlMs:r.deduplicationTtlMs});return{name:"decision-tracking",onDecision(n){if(r.disabled)return;let i=n.metadata.unitKeyValue;if(!i)return;let o=M.hashAssignments(n.assignments);if(!t.checkAndMark(i,o))return;let s={type:"decision",id:n.decisionId,orgId:e.orgId,projectId:e.projectId,env:e.env,unitKey:i,timestamp:n.metadata.timestamp,assignments:n.assignments,layers:n.metadata.layers,context:n.metadata.filteredContext,configVersion:n.metadata.configVersion??e.getConfigVersion?.()??void 0,sdkName:an,sdkVersion:O};e.log(s)},onDestroy(){t.clear()}}}var cn="traffical_rdr";function ln(r,e,t){if(!(typeof document>"u"))try{document.cookie=`${r}=${encodeURIComponent(e)}; max-age=${t}; path=/; SameSite=Lax`}catch{}}function Be(r={}){let e=r.parameterKey??"redirect.url",t=r.compareMode??"pathname",n=r.cookieName??cn;return{name:"redirect",onInitialize(i){typeof window>"u"||i.decide({context:{},defaults:{[e]:""}})},onBeforeDecision(i){return typeof window>"u"?i:{"url.pathname":window.location.pathname,...i}},onDecision(i){let o=i.assignments[e];if(typeof o!="string"||!o)return;let s=t==="href"?window.location.href:window.location.pathname;if(o===s)return;let a=i.metadata.layers.find(c=>c.policyId&&c.allocationName);a&&ln(n,JSON.stringify({l:a.layerId,p:a.policyId,a:a.allocationName,ts:Date.now()}),86400),window.location.replace(o)}}}var un="traffical_rdr";function dn(r){if(typeof document>"u")return null;try{for(let e of document.cookie.split(";")){let[t,n]=e.trim().split("=");if(t===r&&n)return decodeURIComponent(n)}}catch{}return null}function fn(r,e){let t=dn(r);if(!t)return null;try{let n=JSON.parse(t);return Date.now()-n.ts>e?null:{layerId:n.l,policyId:n.p,allocationName:n.a}}catch{return null}}function Ne(r={}){let e=r.cookieName??un,t=r.expiryMs??864e5;function n(i){let o=fn(e,t);if(!o)return;i.attribution=i.attribution??[],i.attribution.some(a=>a.layerId===o.layerId&&a.policyId===o.policyId)||i.attribution.push(o)}return{name:"redirect-attribution",onTrack(i){return n(i),!0},onExposure(i){return n(i),!0}}}var me=[],it={};function gn(){if(typeof window>"u")return{version:1,instances:it,subscribe:()=>()=>{}};if(!window.__TRAFFICAL_DEBUG__){let r={version:1,instances:it,subscribe(e){return me.push(e),()=>{me=me.filter(t=>t!==e)}}};window.__TRAFFICAL_DEBUG__=r}return window.__TRAFFICAL_DEBUG__}function rt(r){for(let e of me)try{e(r)}catch{}}var hn=0,pn=Symbol.for("@openfeature/web-sdk/api");function mn(){let r=globalThis[pn];return r&&typeof r.getContext=="function"&&typeof r.setContext=="function"?r:null}function yn(){return`traffical_${Date.now().toString(36)}_${(++hn).toString(36)}`}function vn(){return`evt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}var _n="traffical-debug";function Ve(r={}){let e=r.instanceId??yn(),t=r.maxEvents??500,n=null,i=null,o={},s=[],a=null,c=null,f={},g=null,l=null,p=[],u=[],m=[];function b(){return{ready:n?.isInitialized===!0,stableId:n?.getStableId?.()??null,effectiveUnitKey:c,configVersion:n?.getConfigVersion?.()??null,assignments:{...o},layers:[...s],lastDecisionId:a,overrides:n?.getOverrides?.()??{},contextOverrides:{...f},lastContext:g?{...g}:null}}function _(){let d=b();for(let h of u)try{h(d)}catch{}}function T(d,h){let x={id:vn(),type:d,timestamp:Date.now(),data:h};p.push(x),p.length>t&&p.splice(0,p.length-t);for(let I of m)try{I(x)}catch{}}function w(){if(!n)return;try{n.decide({context:g?{...g}:{},defaults:l?{...l}:{}})}catch{}let d=mn();if(d)try{d.setContext({...d.getContext()}).catch(()=>{})}catch{}}let E={id:e,meta:{orgId:"",projectId:"",env:"",sdkVersion:O},getState:b,subscribe(d){return u.push(d),()=>{u=u.filter(h=>h!==d)}},getEvents(d){return d!==void 0?p.slice(-d):[...p]},onEvent(d){return m.push(d),()=>{m=m.filter(h=>h!==d)}},getConfigBundle(){return i},setUnitKey(d){n?.identify?n.identify(d):n?.setStableId&&n.setStableId(d),_()},setOverride(d,h){n?.applyOverrides&&n.applyOverrides({[d]:h}),_(),w()},clearOverride(d){if(n?.getOverrides&&n?.applyOverrides){let h=n.getOverrides();delete h[d],n.clearOverrides?.(),n.applyOverrides(h)}_(),w()},clearAllOverrides(){n?.clearOverrides?.(),_(),w()},getOverrides(){return n?.getOverrides?.()??{}},setContextOverrides(d){f={...d},_(),w()},getContextOverrides(){return{...f}},reDecide(){w()},async refresh(){n?.refreshConfig&&await n.refreshConfig()}};return{name:_n,onInitialize(d){n=d,i&&(E.meta.orgId=i.orgId,E.meta.projectId=i.projectId,E.meta.env=i.env);let h=gn();h.instances[e]=E,rt({type:"register",instanceId:e}),_()},onConfigUpdate(d){i=d,E.meta.orgId=d.orgId,E.meta.projectId=d.projectId,E.meta.env=d.env,_()},onBeforeDecision(d){if(g={...d},Object.keys(f).length!==0)return{...d,...f}},onDecision(d){l={...d.assignments},o={...d.assignments},s=d.metadata?.layers?[...d.metadata.layers]:[],a=d.decisionId,d.metadata?.unitKeyValue&&(c=d.metadata.unitKeyValue),T("decision",d),_()},onResolve(d){o={...d},_()},onExposure(d){return T("exposure",d),!0},onTrack(d){return T("track",d),!0},onDestroy(){let d=typeof window<"u"?window.__TRAFFICAL_DEBUG__:null;d&&(delete d.instances[e],rt({type:"unregister",instanceId:e})),u=[],m=[],f={},g=null,l=null,n=null}}}var ye=class{constructor(){this._plugins=[]}register(e){let t="plugin"in e?e.plugin:e,n="priority"in e?e.priority??0:0;return this._plugins.some(i=>i.plugin.name===t.name)?(console.warn(`[Traffical] Plugin "${t.name}" already registered, skipping.`),!1):(this._plugins.push({plugin:t,priority:n}),this._plugins.sort((i,o)=>o.priority-i.priority),!0)}unregister(e){let t=this._plugins.findIndex(n=>n.plugin.name===e);return t===-1?!1:(this._plugins.splice(t,1),!0)}get(e){return this._plugins.find(t=>t.plugin.name===e)?.plugin}getAll(){return this._plugins.map(e=>e.plugin)}async runInitialize(e){for(let{plugin:t}of this._plugins)if(t.onInitialize)try{await t.onInitialize(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onInitialize error:`,n)}}runConfigUpdate(e){for(let{plugin:t}of this._plugins)if(t.onConfigUpdate)try{t.onConfigUpdate(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onConfigUpdate error:`,n)}}runBeforeDecision(e){let t=e;for(let{plugin:n}of this._plugins)if(n.onBeforeDecision)try{let i=n.onBeforeDecision(t);i&&(t=i)}catch(i){console.warn(`[Traffical] Plugin "${n.name}" onBeforeDecision error:`,i)}return t}runDecision(e){for(let{plugin:t}of this._plugins)if(t.onDecision)try{t.onDecision(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onDecision error:`,n)}}runResolve(e){for(let{plugin:t}of this._plugins)if(t.onResolve)try{t.onResolve(e)}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onResolve error:`,n)}}runExposure(e){for(let{plugin:t}of this._plugins)if(t.onExposure)try{if(t.onExposure(e)===!1)return!1}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onExposure error:`,n)}return!0}runTrack(e){for(let{plugin:t}of this._plugins)if(t.onTrack)try{if(t.onTrack(e)===!1)return!1}catch(n){console.warn(`[Traffical] Plugin "${t.name}" onTrack error:`,n)}return!0}runDestroy(){for(let{plugin:e}of this._plugins)if(e.onDestroy)try{e.onDestroy()}catch(t){console.warn(`[Traffical] Plugin "${e.name}" onDestroy error:`,t)}}clear(){this._plugins=[]}};function ot(){let r=[],e=!1;function t(s){for(let a of r)a(s)}let n=()=>{e=!0,t("background")},i=()=>{typeof document<"u"&&t(document.visibilityState==="hidden"?"background":"foreground")},o=()=>{e=!0,t("background")};return typeof window<"u"&&(window.addEventListener("pagehide",n),window.addEventListener("beforeunload",o)),typeof document<"u"&&document.addEventListener("visibilitychange",i),{onVisibilityChange(s){r.push(s)},removeVisibilityListener(s){let a=r.indexOf(s);a!==-1&&r.splice(a,1)},isUnloading(){return e}}}var Ue="js-client";function st(r,e){if(e!==void 0)return{context:r,defaults:e};let t=r;return{context:t.context,defaults:t.defaults}}var xn="https://sdk.traffical.io",bn=6e4,En=1e4,In=3e5,Tn=3e5,Cn=100,wn=.1;function An(r){let e=r*wn;return r+(Math.random()*2-1)*e}var U=class{constructor(e){this._state={bundle:null,etag:null,lastFetchTime:0,lastOfflineWarning:0,lastMalformedWarning:0,refreshTimer:null,isInitialized:!1,serverResponse:null,cachedEdgeResults:null};this._decisionCache=new Map;this._cumulativeAttribution=new Map;this._identityListeners=[];this._overrideListeners=[];this._overrides={};this._lastResolveContextKey=null;this._readyPromise=new Promise(e=>{this._readyResolve=e});let t=e.evaluationMode??"bundle";this._options={orgId:e.orgId,projectId:e.projectId,env:e.env,apiKey:e.apiKey,baseUrl:e.baseUrl??xn,localConfig:e.localConfig,refreshIntervalMs:e.refreshIntervalMs??bn,attributionMode:e.attributionMode??"cumulative",evaluationMode:t},this._requestTimeoutMs=e.configTimeoutMs??e.requestTimeoutMs??En;let n={baseUrl:this._options.baseUrl,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,apiKey:this._options.apiKey,defaultTimeoutMs:e.resolveTimeoutMs??e.requestTimeoutMs};if(this._decisionClient=new G(n),this._errorPolicy=new V({onResolutionError:e.onResolutionError,onError:e.onError??e.errorBoundary?.onError}),this._storage=e.storage??nt(),this._lifecycleProvider=e.lifecycleProvider??ot(),!e.onSchemaWarnings)try{typeof globalThis<"u"&&globalThis.process?.env?.NODE_ENV==="development"&&(e.onSchemaWarnings=o=>{for(let s of o)console.warn(`[Traffical] Schema warning for "${s.event}":`,s.violations.map(a=>`${a.path}: ${a.message}`).join(", "))})}catch{}if(this._eventLogger=new he({endpoint:`${this._options.baseUrl}/v1/events/batch`,apiKey:e.apiKey,storage:this._storage,lifecycleProvider:this._lifecycleProvider,batchSize:e.batchSize??e.eventBatchSize,flushIntervalMs:e.flushIntervalMs??e.eventFlushIntervalMs,maxQueueSize:e.eventMaxQueueSize,requestTimeoutMs:e.eventsTimeoutMs??e.requestTimeoutMs,onError:i=>{console.warn("[Traffical] Event logging error:",i.message)},onSchemaWarnings:e.onSchemaWarnings}),this._exposureDedup=new J({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}),this._stableId=new pe({storage:this._storage}),this._plugins=new ye,this._assignmentLogger=e.assignmentLogger,this._byoEventLogger=e.eventLogger,this._disableCloudEvents=e.disableCloudEvents??!1,this._assignmentLoggerDedup=e.deduplicateAssignmentLogger!==!1&&e.assignmentLogger?new J({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}):null,e.trackDecisions!==!1&&(!this._disableCloudEvents||this._byoEventLogger)&&this._plugins.register({plugin:Me({deduplicationTtlMs:e.decisionDeduplicationTtlMs},{orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,log:i=>this._dispatchEvent(i),getConfigVersion:()=>this.getConfigVersion()}),priority:100}),e.plugins)for(let i of e.plugins)this._plugins.register(i);if(this._options.localConfig){let i=z(this._options.localConfig);i.ok?(this._state.bundle=this._options.localConfig,this._plugins.runConfigUpdate(this._options.localConfig)):(this._errorPolicy.recordRejectedBundle("localConfig",i.path,i.reason),this._options.localConfig=void 0)}if(typeof window<"u"){let i=window;i.__TRAFFICAL_INSTANCES__??(i.__TRAFFICAL_INSTANCES__=[]),i.__TRAFFICAL_INSTANCES__.push(this)}}async initialize(){await this._errorPolicy.sideEffectAsync("initialize","other",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig(),this._startBackgroundRefresh(),this._state.isInitialized=!0,await this._plugins.runInitialize(this)}),this._readyResolve()}get isInitialized(){return this._state.isInitialized}async waitForReady(){return this._readyPromise}async close(){if(this._state.refreshTimer&&(clearInterval(this._state.refreshTimer),this._state.refreshTimer=null),this._lifecycleProvider.isUnloading()?this._eventLogger.flushBeacon():await this._eventLogger.flush().catch(()=>{}),this._eventLogger.destroy(),this._plugins.runDestroy(),this._identityListeners=[],this._overrideListeners=[],this._overrides={},typeof window<"u"){let t=window.__TRAFFICAL_INSTANCES__;if(t){let n=t.indexOf(this);n!==-1&&t.splice(n,1)}}}destroy(){if(this._state.refreshTimer&&(clearInterval(this._state.refreshTimer),this._state.refreshTimer=null),this._lifecycleProvider.isUnloading()?this._eventLogger.flushBeacon():this._eventLogger.flush().catch(()=>{}),this._eventLogger.destroy(),this._plugins.runDestroy(),this._identityListeners=[],this._overrideListeners=[],this._overrides={},typeof window<"u"){let t=window.__TRAFFICAL_INSTANCES__;if(t){let n=t.indexOf(this);n!==-1&&t.splice(n,1)}}}async refreshConfig(){await this._errorPolicy.sideEffectAsync("refreshConfig","other",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig()})}getConfigVersion(){return this._state.serverResponse?.stateVersion??this._state.bundle?.version??null}getUnitKeyField(){return ue(this._getEffectiveBundle())}getParameterLayerId(e){return de(this._getEffectiveBundle(),e)}getDiagnostics(){return this._errorPolicy.getDiagnostics()}getParams(e,t){let{context:n,defaults:i}=st(e,t);return this._errorPolicy.resolve("getParams",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){this._maybeResolveForContext(n);let c={...i};for(let[f,g]of Object.entries(this._state.serverResponse.assignments))f in c&&(c[f]=g);return this._plugins.runResolve(c),this._applyOverridesToResult(c),c}let o=this._getEffectiveBundle(),s=this._enrichContext(n),a=fe(o,s,i);return this._plugins.runResolve(a),this._applyOverridesToResult(a),a},()=>({...i}))}decide(e,t){let{context:n,defaults:i}=st(e,t),o=this._errorPolicy.resolve("decide",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){this._maybeResolveForContext(n);let g=this._state.serverResponse,l={...i};for(let[u,m]of Object.entries(g.assignments))u in l&&(l[u]=m);let p={decisionId:N(),assignments:l,metadata:{...g.metadata,configVersion:g.stateVersion}};return this._cacheDecision(p),this._updateCumulativeAttribution(p),this._plugins.runDecision(p),this._applyOverridesToResult(p.assignments),p.metadata.reason=g.metadata.layers?.some(u=>u.policyId)?"resolved":"default",p}let s=this._getEffectiveBundle(),a=this._enrichContext(n);a=this._plugins.runBeforeDecision(a);let c=this._state.cachedEdgeResults??void 0,f=ge(s,a,i,c);return this._cacheDecision(f),this._updateCumulativeAttribution(f),this._plugins.runDecision(f),this._applyOverridesToResult(f.assignments),f.metadata.reason=s?f.metadata.layers.some(g=>g.policyId)?"resolved":"default":"no-bundle",f},()=>({decisionId:N(),assignments:{...i},metadata:{timestamp:new Date().toISOString(),unitKeyValue:"",layers:[],reason:"error"}}));return this._emitAssignmentLogEntries(o,"decision"),o}trackExposure(e){this._emitAssignmentLogEntries(e,"exposure"),this._errorPolicy.resolve("trackExposure",()=>{let t=e.metadata.unitKeyValue;if(!t)return;let n=e.metadata.configVersion??this.getConfigVersion()??void 0,i=[];for(let s of e.metadata.layers)!s.policyId||!s.allocationName||s.attributionOnly||!this._exposureDedup.checkAndMark(t,s.policyId,s.allocationName)||i.push(s);if(i.length===0)return;let o={type:"exposure",id:Se(),decisionId:e.decisionId,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,unitKey:t,timestamp:new Date().toISOString(),assignments:e.assignments,layers:i,context:e.metadata.filteredContext,configVersion:n,sdkName:Ue,sdkVersion:O};this._plugins.runExposure(o)&&this._dispatchEvent(o)},()=>{})}track(e,t,n){this._errorPolicy.resolve("track",()=>{let i=n?.unitKey??this._stableId.getId(),o=typeof n?.value=="number"?n.value:typeof t?.value=="number"?t.value:void 0,s=this._buildAttribution(i,n?.decisionId),a=n?.decisionId,c={type:"track",id:Re(),orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,unitKey:i,timestamp:new Date().toISOString(),event:e,value:o,values:n?.values,properties:t,decisionId:a,attribution:s,eventTimestamp:n?.eventTimestamp,sdkName:Ue,sdkVersion:O};this._plugins.runTrack(c)&&this._dispatchEvent(c)},()=>{})}async flushEvents(){await this._errorPolicy.sideEffectAsync("flushEvents","other",async()=>{await this._eventLogger.flush()})}use(e){if(!this._plugins.register(e))return this;if(this._state.isInitialized){try{e.onInitialize?.(this)}catch(n){console.warn(`[Traffical] Plugin "${e.name}" late onInitialize error:`,n)}if(this._state.bundle)try{e.onConfigUpdate?.(this._state.bundle)}catch(n){console.warn(`[Traffical] Plugin "${e.name}" late onConfigUpdate error:`,n)}}return this}getPlugin(e){return this._plugins.get(e)}getStableId(){return this._stableId.getId()}setStableId(e){this._stableId.setId(e)}identify(e){this._stableId.setId(e);for(let t of this._identityListeners)try{t(e)}catch{}}onIdentityChange(e){return this._identityListeners.push(e),()=>{this._identityListeners=this._identityListeners.filter(t=>t!==e)}}onOverridesChange(e){return this._overrideListeners.push(e),()=>{this._overrideListeners=this._overrideListeners.filter(t=>t!==e)}}applyOverrides(e){Object.assign(this._overrides,e),this._notifyOverrideListeners()}clearOverrides(){this._overrides={},this._notifyOverrideListeners()}getOverrides(){return{...this._overrides}}_notifyOverrideListeners(){let e={...this._overrides};for(let t of this._overrideListeners)try{t(e)}catch{}}_dispatchEvent(e){if(this._byoEventLogger)try{this._byoEventLogger(e)}catch{}this._disableCloudEvents||this._eventLogger.log(e)}_emitAssignmentLogEntries(e,t){if(!this._assignmentLogger)return;let n=e.metadata.unitKeyValue;if(!n)return;let i=e.metadata.configVersion??this.getConfigVersion()??void 0;for(let o of e.metadata.layers){if(!o.policyId||!o.allocationName||this._assignmentLoggerDedup&&!this._assignmentLoggerDedup.checkAndMark(n,o.policyId,`${o.allocationName}:${t}`))continue;let s=o.policyId,a=o.allocationName;this._errorPolicy.sideEffect("assignmentLogger","assignmentLog",()=>this._assignmentLogger({unitKey:n,policyId:s,policyKey:o.policyKey,allocationName:a,allocationKey:o.allocationKey,timestamp:e.metadata.timestamp,layerId:o.layerId,allocationId:o.allocationId,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,sdkName:Ue,sdkVersion:O,properties:e.metadata.filteredContext,type:t,decisionId:e.decisionId,anonymousId:this._stableId.getId(),id:De(),bucket:o.bucket>=0?o.bucket:void 0,probability:o.probability,modelVersion:o.modelVersion,configVersion:i}))}}_applyOverridesToResult(e){let t=Object.keys(this._overrides);if(t.length!==0)for(let n of t)n in e&&(e[n]=this._overrides[n])}_getEffectiveBundle(){return this._state.bundle??this._options.localConfig??null}_enrichContext(e){let n=this._getEffectiveBundle()?.hashing?.unitKey??"userId";return e[n]?e:{...e,[n]:this._stableId.getId()}}async _fetchConfig(){let e=`${this._options.baseUrl}/v1/config/${encodeURIComponent(this._options.projectId)}?env=${encodeURIComponent(this._options.env)}`,t={"Content-Type":"application/json",Authorization:`Bearer ${this._options.apiKey}`};this._state.etag&&(t["If-None-Match"]=this._state.etag);let n=new AbortController,i=setTimeout(()=>n.abort(),this._requestTimeoutMs);try{let o=await fetch(e,{method:"GET",headers:t,signal:n.signal});if(o.status===304){this._state.lastFetchTime=Date.now();return}if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);let s=await o.json(),a=o.headers.get("ETag"),c=z(s);if(!c.ok){this._errorPolicy.recordRejectedBundle("fetchConfig",c.path,c.reason),this._logMalformedBundleWarning();return}if(this._state.bundle=s,this._state.etag=a,this._state.lastFetchTime=Date.now(),this._findEdgePolicies(s).length>0){let f=await this._prefetchEdgeResults(s,this._enrichContext({}));this._state.cachedEdgeResults=f}else this._state.cachedEdgeResults=null;this._plugins.runConfigUpdate(s)}catch(o){this._logOfflineWarning(o)}finally{clearTimeout(i)}}_startBackgroundRefresh(){let e=this._options.evaluationMode==="server"?this._state.serverResponse?.suggestedRefreshMs??this._options.refreshIntervalMs:this._options.refreshIntervalMs;if(e<=0)return;let t=()=>{this._state.refreshTimer=setTimeout(()=>{t(),this._options.evaluationMode==="server"?this._fetchServerResolve().catch(()=>{}):this._fetchConfig().catch(()=>{})},An(e))};t()}_maybeResolveForContext(e){let t=this._enrichContext(e),n;try{n=JSON.stringify(t)}catch{n=""}n!==this._lastResolveContextKey&&(this._lastResolveContextKey=n,this._fetchServerResolve(t))}async _fetchServerResolve(e){if(this._decisionClient)try{let t=e??this._enrichContext({}),n=await this._decisionClient.resolve({context:t});n&&(this._state.serverResponse=n,this._state.lastFetchTime=Date.now())}catch(t){this._logOfflineWarning(t)}}_findEdgePolicies(e){let t=[];for(let n of e.layers)for(let i of n.policies)i.state==="running"&&i.entityConfig?.resolutionMode==="edge"&&t.push(i);return t}async _prefetchEdgeResults(e,t){if(!this._decisionClient)return{};let n=this._findEdgePolicies(e);if(n.length===0)return{};let i=W(e,t);if(!i)return{};let o=n.map(s=>{if(!s.entityConfig)return null;let a=s.entityConfig.dynamicAllocations?typeof t[s.entityConfig.dynamicAllocations.countKey]=="number"?Math.floor(t[s.entityConfig.dynamicAllocations.countKey]):0:s.allocations.length;return Pe(s.id,s.entityConfig.entityKeys,t,i,a||void 0)}).filter(s=>s!==null);if(o.length===0)return{};try{let s=await this._decisionClient.decideEntityBatch(o),a=new Map;for(let c=0;c<o.length;c++){let f=s[c];f&&a.set(o[c].policyId,{allocationIndex:f.allocationIndex,entityId:o[c].entityId})}return a.size>0?{edgeResults:a}:{}}catch{return{}}}_logOfflineWarning(e){let t=Date.now();t-this._state.lastOfflineWarning>In&&(console.warn(`[Traffical] Failed to fetch config: ${e instanceof Error?e.message:String(e)}. Using ${this._state.bundle?"cached":"local"} config.`),this._state.lastOfflineWarning=t)}_logMalformedBundleWarning(){let e=Date.now();e-this._state.lastMalformedWarning>Tn&&(console.warn(`[Traffical] Discarded malformed config bundle (invalid hashing/shape). Using ${this._state.bundle?"cached":"local"} config.`),this._state.lastMalformedWarning=e)}_cacheDecision(e){if(this._decisionCache.size>=Cn){let t=this._decisionCache.keys().next().value;t&&this._decisionCache.delete(t)}this._decisionCache.set(e.decisionId,e)}_updateCumulativeAttribution(e){let t=e.metadata.unitKeyValue;if(!t)return;let n=this._cumulativeAttribution.get(t);n||(n=new Map,this._cumulativeAttribution.set(t,n));for(let i of e.metadata.layers){if(!i.policyId||!i.allocationName)continue;let o=`${i.layerId}:${i.policyId}`;n.set(o,{layerId:i.layerId,policyId:i.policyId,allocationName:i.allocationName})}}_buildAttribution(e,t){if(this._options.attributionMode==="decision"){if(!t)return;let i=this._decisionCache.get(t);return i?i.metadata.layers.filter(o=>o.policyId&&o.allocationName).map(o=>({layerId:o.layerId,policyId:o.policyId,allocationName:o.allocationName})):void 0}let n=this._cumulativeAttribution.get(e);return n&&n.size>0?Array.from(n.values()):void 0}};async function at(r){let e=new U(r);return await e.initialize(),e}function ct(r){return new U(r)}function lt(r={}){let e={observeMutations:r.observeMutations??!0,debounceMs:r.debounceMs??100},t=[],n={},i=null,o=null;function s(u,m){try{return new RegExp(u).test(m)}catch{return m===u}}function a(u,m,b){if(m==="innerHTML")u.innerHTML=b;else if(m==="textContent")u.textContent=b;else if(m==="src"&&"src"in u)u.src=b;else if(m==="href"&&"href"in u)u.href=b;else if(m.startsWith("style.")){let _=m.slice(6);u.style[_]=b}else u.setAttribute(m,b)}function c(u,m){let b=String(m);try{let _=document.querySelectorAll(u.selector);for(let T of _)a(T,u.property,b)}catch(_){console.warn(`[Traffical DOM Binding] Failed to apply binding for ${u.parameterKey}:`,_)}}function f(u,m=!1){n=u;let b=typeof window<"u"?window.location.pathname:"";for(let _ of t){if(!m&&!s(_.urlPattern,b))continue;let T=u[_.parameterKey];T!==void 0&&c(_,T)}}function g(){o&&clearTimeout(o),o=setTimeout(()=>{f(n)},e.debounceMs)}function l(){i||typeof MutationObserver>"u"||typeof document>"u"||(i=new MutationObserver(()=>{g()}),i.observe(document.body,{childList:!0,subtree:!0}))}function p(){i&&(i.disconnect(),i=null),o&&(clearTimeout(o),o=null)}return{name:"dom-binding",onInitialize(){e.observeMutations&&l()},onConfigUpdate(u){t=u.domBindings??[]},onResolve(u){f(u)},onDecision(u){f(u.assignments)},onDestroy(){p(),t=[],n={}},applyBindings(u){f(u||n)},getBindings(){return t}}}var C=null;async function kn(r){return C?(console.warn("[Traffical] Client already initialized. Returning existing instance."),C):(C=await at(r),C)}function Sn(r){return C?(console.warn("[Traffical] Client already initialized. Returning existing instance."),C):(C=ct(r),C.initialize().catch(e=>{console.warn("[Traffical] Initialization error:",e)}),C)}function Rn(){return C}function Dn(){C&&(C.destroy(),C=null)}return yt(Pn);})();
3
3
  //# sourceMappingURL=traffical.min.js.map