@traffical/js-client 0.11.0 → 0.11.1

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.
package/README.md CHANGED
@@ -304,6 +304,53 @@ The redirect plugin automatically adds these context fields:
304
304
 
305
305
  Use `url.pathname` in policy conditions to target specific pages.
306
306
 
307
+ ## Type-Safe Event Tracking
308
+
309
+ Use `@traffical/cli generate-types` to generate TypeScript interfaces for your event schemas. This lets you create a strictly typed `track` function that catches invalid event names and properties at compile time.
310
+
311
+ ### 1. Generate types from your config
312
+
313
+ ```bash
314
+ bunx @traffical/cli generate-types
315
+ # → creates .traffical/traffical.generated.ts
316
+ ```
317
+
318
+ ### 2. Create a typed track wrapper
319
+
320
+ ```typescript
321
+ import type { TrafficalEventProperties } from './traffical.generated';
322
+ import { createTrafficalClient } from '@traffical/js-client';
323
+
324
+ type TypedTrack = <E extends Extract<keyof TrafficalEventProperties, string>>(
325
+ event: E,
326
+ properties?: TrafficalEventProperties[E],
327
+ options?: { decisionId?: string; unitKey?: string }
328
+ ) => void;
329
+
330
+ const client = await createTrafficalClient({ /* ... */ });
331
+
332
+ // Cast client.track to the strict type
333
+ export const track = client.track.bind(client) as unknown as TypedTrack;
334
+ ```
335
+
336
+ ### 3. Use it — invalid properties are caught at compile time
337
+
338
+ ```typescript
339
+ track('purchase', {
340
+ order_total: 99.99,
341
+ payment_method: 'visa',
342
+ }); // ✅
343
+
344
+ track('purchase', {
345
+ order_total: 99.99,
346
+ random_field: true, // ❌ Type error
347
+ });
348
+
349
+ track('nonexistent_event'); // ❌ Type error
350
+ ```
351
+
352
+ ---
353
+
307
354
  ## Development
308
355
 
309
356
  ### Build
@@ -1,3 +1,3 @@
1
- /* @traffical/js-client v0.11.0 */
2
- "use strict";var Traffical=(()=>{var N=Object.defineProperty;var Se=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var De=(r,e,t)=>e in r?N(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var Ae=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Re=(r,e)=>{for(var t in e)N(r,t,{get:e[t],enumerable:!0})},Oe=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of we(e))!Pe.call(r,i)&&i!==t&&N(r,i,{get:()=>e[i],enumerable:!(n=Se(e,i))||n.enumerable});return r};var Me=r=>Oe(N({},"__esModule",{value:!0}),r);var E=(r,e,t)=>(De(r,typeof e!="symbol"?e+"":e,t),t);var pe=Ae(()=>{});var Lt={};Re(Lt,{TrafficalClient:()=>S,createDOMBindingPlugin:()=>ke,createDebugPlugin:()=>de,createRedirectAttributionPlugin:()=>ue,createRedirectPlugin:()=>ce,destroy:()=>Mt,init:()=>At,initSync:()=>Rt,instance:()=>Ot});function k(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function B(r,e,t){let n=`${r}:${e}`;return k(n)%t}function Y(r,e){return r>=e[0]&&r<=e[1]}function K(r,e){for(let t of e)if(Y(r,t.bucketRange))return t;return null}function C(r,e){if(r.length===0||r.length===1)return 0;let n=k(e)%1e4/1e4,i=0;for(let o=0;o<r.length;o++)if(i+=r[o],n<i)return o;return r.length-1}function Z(r,e){let{field:t,op:n,value:i,values:o}=r,s=Be(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 V(r,e){return r.length===0?!0:r.every(t=>Z(t,e))}function Be(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 Q(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 ee(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 te(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 F(r,e,t){let n=r.contextualModel;if(!n||r.allocations.length===0)return null;let i=Ke(n,r.allocations,e),o=ee(i,n.gamma),s=te(o,n.actionProbabilityFloor),a=`ctx:${t}:${r.id}`,c=C(s,a);return r.allocations[c]}function Ke(r,e,t){return e.map(n=>{let i=r.coefficients[n.name];return i?Q(i,t):r.defaultAllocationScore})}var Ve=r=>crypto.getRandomValues(new Uint8Array(r)),Fe=(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)=>Fe(r,e|0,Ve);function $(r){let e=new Error(r);return e.source="ulid",e}var ne="0123456789ABCDEFGHJKMNPQRSTVWXYZ",w=ne.length,he=Math.pow(2,48)-1,$e=10,je=16;function Ue(r){let e=Math.floor(r()*w);return e===w&&(e=w-1),ne.charAt(e)}function We(r,e){if(isNaN(r))throw new Error(r+" must be a number");if(r>he)throw $("cannot encode time greater than "+he);if(r<0)throw $("time must be positive");if(Number.isInteger(Number(r))===!1)throw $("time must be an integer");let t,n="";for(;e>0;e--)t=r%w,n=ne.charAt(t)+n,r=(r-t)/w;return n}function ze(r,e){let t="";for(;r>0;r--)t=Ue(e)+t;return t}function He(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=pe();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 $("secure crypto unusable, insecure Math.random not allowed")}function Ge(r){return r||(r=He()),function(t){return isNaN(t)&&(t=Date.now()),We(t,$e)+ze(je,r)}}var ve=Ge();var qe="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Xe=8,tn=ge(qe,Xe);function j(r){return`${r}_${ve()}`}function P(){return j("dec")}function ie(){return j("exp")}function re(){return j("trk")}function Je(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 Ye(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 me(r){if(r<=0)return[];let e=1/r;return Array(r).fill(e)}function Ze(r,e,t,n){let i=r.entityState?.[e];if(!i)return me(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:me(n)}function Qe(r,e,t,n){let i=e.entityConfig;if(!i)return null;let o=Ye(i.entityKeys,t);if(!o)return null;let s,a;if(i.dynamicAllocations){let h=i.dynamicAllocations.countKey,_=t[h];if(typeof _!="number"||_<=0)return null;a=Math.floor(_),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=Ze(r,e.id,o,a),v=`${o}:${n}:${e.id}`,y=C(c,v);return{allocation:s[y],entityId:o}}function D(r,e){let t=e[r.hashing.unitKey];return t==null?null:String(t)}function ye(r,e,t,n){let i={...t},o=[],s=[];if(!r)return{assignments:i,unitKeyValue:"",layers:o,matchedPolicies:s};let a=D(r,e);if(!a)return{assignments:i,unitKeyValue:"",layers:o,matchedPolicies:s};let c=new Set(Object.keys(t)),v=r.parameters.filter(h=>c.has(h.key));for(let h of v)h.key in i&&(i[h.key]=h.default);let y=new Map;for(let h of v){let _=y.get(h.layerId)||[];_.push(h),y.set(h.layerId,_)}for(let h of r.layers){let _=y.get(h.id),u=_&&_.length>0,p=B(a,h.id,r.hashing.bucketCount),m,f;for(let d of h.policies)if(d.state==="running"){if(d.eligibleBucketRange){let{start:l,end:g}=d.eligibleBucketRange;if(p<l||p>g)continue}if(V(d.conditions,e)){if(d.contextualModel){let l=F(d,e,a);if(l){if(m=d,f=l,s.push(d),u)for(let[g,I]of Object.entries(l.overrides))g in i&&(i[g]=I);break}}if(d.entityConfig&&d.entityConfig.resolutionMode==="bundle"){let l=Qe(r,d,e,a);if(l){if(m=d,f=l.allocation,s.push(d),u&&!d.entityConfig.dynamicAllocations)for(let[g,I]of Object.entries(l.allocation.overrides))g in i&&(i[g]=I);break}}else if(d.entityConfig&&d.entityConfig.resolutionMode==="edge"){let l=n?.edgeResults?.get(d.id);if(l){if(m=d,s.push(d),d.entityConfig.dynamicAllocations)f={id:`${d.id}_dynamic_${l.allocationIndex}`,name:String(l.allocationIndex),bucketRange:[0,0],overrides:{}};else if(d.allocations[l.allocationIndex]&&(f=d.allocations[l.allocationIndex],u&&f))for(let[g,I]of Object.entries(f.overrides))g in i&&(i[g]=I);break}continue}else{let l=K(p,d.allocations);if(l){if(m=d,f=l,s.push(d),u)for(let[g,I]of Object.entries(l.overrides))g in i&&(i[g]=I);break}}}}o.push({layerId:h.id,bucket:p,policyId:m?.id,policyKey:m?.key,allocationId:f?.id,allocationName:f?.name,allocationKey:f?.key,...u?{}:{attributionOnly:!0}})}return{assignments:i,unitKeyValue:a,layers:o,matchedPolicies:s}}function U(r,e,t,n){return ye(r,e,t,n).assignments}function W(r,e,t,n){let{assignments:i,unitKeyValue:o,layers:s,matchedPolicies:a}=ye(r,e,t,n),c=Je(e,a);return{decisionId:P(),assignments:i,metadata:{timestamp:new Date().toISOString(),unitKeyValue:o,layers:s,filteredContext:c}}}var x=class r{constructor(e={}){E(this,"_seen",new Map);E(this,"_ttlMs");E(this,"_maxEntries");E(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 A=class{constructor(e){E(this,"config");E(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 oe(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 z=class{constructor(e={}){this._seen=new Set;this._lastError=null;this._options=e}capture(e,t,n){try{return t()}catch(i){return this._onError(e,i),n}}async captureAsync(e,t,n){try{return await t()}catch(i){return this._onError(e,i),n}}async swallow(e,t){try{await t()}catch(n){this._onError(e,n)}}getLastError(){let e=this._lastError;return this._lastError=null,e}clearSeen(){this._seen.clear()}_onError(e,t){let n=this._resolveError(t);this._lastError=n;let i=`${e}:${n.name}:${n.message}`;this._seen.has(i)||(this._seen.add(i),console.warn(`[Traffical] Error in ${e}:`,n.message),this._options.onError?.(e,n),this._options.reportErrors&&this._options.errorEndpoint&&this._reportError(e,n).catch(()=>{}))}async _reportError(e,t){if(this._options.errorEndpoint)try{await fetch(this._options.errorEndpoint,{method:"POST",headers:{"Content-Type":"application/json",...this._options.sdkKey&&{"X-Traffical-Key":this._options.sdkKey}},body:JSON.stringify({tag:e,error:t.name,message:t.message,stack:t.stack,timestamp:new Date().toISOString(),sdk:"@traffical/js-client",userAgent:typeof navigator<"u"?navigator.userAgent:void 0})})}catch{}}_resolveError(e){return e instanceof Error?e:typeof e=="string"?new Error(e):new Error("An unknown error occurred")}};var H="failed_events";var G=class{constructor(e){this._queue=[];this._flushTimer=null;this._isFlushing=!1;this._endpoint=e.endpoint,this._apiKey=e.apiKey,this._storage=e.storage,this._batchSize=e.batchSize??10,this._flushIntervalMs=e.flushIntervalMs??3e4,this._onError=e.onError,this._onSchemaWarnings=e.onSchemaWarnings,this._lifecycleProvider=e.lifecycleProvider,this._setupListeners(),this._retryFailedEvents(),this._startFlushTimer()}log(e){this._queue.push(e),this._queue.length>=this._batchSize&&this.flush()}async flush(){if(this._isFlushing||this._queue.length===0)return;this._isFlushing=!0;let e=[...this._queue];this._queue=[];try{await this._sendEvents(e)}catch(t){this._persistFailedEvents(e),this._onError?.(t instanceof Error?t:new Error(String(t)))}finally{this._isFlushing=!1}}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=await fetch(this._endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:JSON.stringify({events:e})});if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);if(this._onSchemaWarnings)try{let n=await t.json();n.schemaWarnings&&n.schemaWarnings.length>0&&this._onSchemaWarnings(n.schemaWarnings)}catch{}}_persistFailedEvents(e){let n=[...this._storage.get(H)??[],...e].slice(-100);this._storage.set(H,n)}_retryFailedEvents(){let e=this._storage.get(H);!e||e.length===0||(this._storage.remove(H),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 R="exposure_dedup";var O=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(R)}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(R)}_persist(){let e={seen:Array.from(this._seen),sessionStart:this._sessionStart};this._storage.set(R,e,this._sessionTtlMs)}_restore(){let e=this._storage.get(R);if(!e)return;if(Date.now()-e.sessionStart>this._sessionTtlMs){this._storage.remove(R);return}this._seen=new Set(e.seen),this._sessionStart=e.sessionStart}};var M="stable_id",pt="traffical_sid";var q=class{constructor(e){this._cachedId=null;this._storage=e.storage,this._useCookieFallback=e.useCookieFallback??!0,this._cookieName=e.cookieName??pt}getId(){if(this._cachedId)return this._cachedId;let e=this._storage.get(M);return e?(this._cachedId=e,e):this._useCookieFallback&&(e=this._getCookie(),e)?(this._storage.set(M,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(M),this._useCookieFallback&&this._deleteCookie(),this._cachedId=null}hasId(){return this._storage.get(M)!==null||this._getCookie()!==null}_persist(e){this._storage.set(M,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 L="traffical:",se=class{constructor(){this._available=this._checkAvailability()}get(e){if(!this._available)return null;try{let t=localStorage.getItem(L+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(L+e,JSON.stringify(i))}catch{}}remove(e){if(this._available)try{localStorage.removeItem(L+e)}catch{}}clear(){if(this._available)try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n?.startsWith(L)&&e.push(n)}e.forEach(t=>localStorage.removeItem(t))}catch{}}_checkAvailability(){try{let e=L+"__test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return!1}}},ae=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 _e(){let r=new se;return r.get("__check__")!==null||ht()?r:new ae}function ht(){try{let r="__traffical_storage_test__";return localStorage.setItem(r,"test"),localStorage.removeItem(r),!0}catch{return!1}}var T="0.11.0";var vt="js-client";function le(r,e){let t=new x({ttlMs:r.deduplicationTtlMs});return{name:"decision-tracking",onDecision(n){if(r.disabled)return;let i=n.metadata.unitKeyValue;if(!i)return;let o=x.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,sdkName:vt,sdkVersion:T};e.log(s)},onDestroy(){t.clear()}}}var mt="traffical_rdr";function yt(r,e,t){if(!(typeof document>"u"))try{document.cookie=`${r}=${encodeURIComponent(e)}; max-age=${t}; path=/; SameSite=Lax`}catch{}}function ce(r={}){let e=r.parameterKey??"redirect.url",t=r.compareMode??"pathname",n=r.cookieName??mt;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&&yt(n,JSON.stringify({l:a.layerId,p:a.policyId,a:a.allocationName,ts:Date.now()}),86400),window.location.replace(o)}}}var _t="traffical_rdr";function bt(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 It(r,e){let t=bt(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 ue(r={}){let e=r.cookieName??_t,t=r.expiryMs??864e5;function n(i){let o=It(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 X=[],be={};function Et(){if(typeof window>"u")return{version:1,instances:be,subscribe:()=>()=>{}};if(!window.__TRAFFICAL_DEBUG__){let r={version:1,instances:be,subscribe(e){return X.push(e),()=>{X=X.filter(t=>t!==e)}}};window.__TRAFFICAL_DEBUG__=r}return window.__TRAFFICAL_DEBUG__}function Ie(r){for(let e of X)try{e(r)}catch{}}var Tt=0;function xt(){return`traffical_${Date.now().toString(36)}_${(++Tt).toString(36)}`}function kt(){return`evt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}var Ct="traffical-debug";function de(r={}){let e=r.instanceId??xt(),t=r.maxEvents??500,n=null,i=null,o={},s=[],a=null,c=null,v=[],y=[],h=[];function _(){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 l=_();for(let g of y)try{g(l)}catch{}}function p(l,g){let I={id:kt(),type:l,timestamp:Date.now(),data:g};v.push(I),v.length>t&&v.splice(0,v.length-t);for(let Ce of h)try{Ce(I)}catch{}}function m(){if(n)try{n.decide({context:{},defaults:{}})}catch{}}let f={id:e,meta:{orgId:"",projectId:"",env:"",sdkVersion:T},getState:_,subscribe(l){return y.push(l),()=>{y=y.filter(g=>g!==l)}},getEvents(l){return l!==void 0?v.slice(-l):[...v]},onEvent(l){return h.push(l),()=>{h=h.filter(g=>g!==l)}},getConfigBundle(){return i},setUnitKey(l){n?.identify?n.identify(l):n?.setStableId&&n.setStableId(l),u()},setOverride(l,g){n?.applyOverrides&&n.applyOverrides({[l]:g}),u(),m()},clearOverride(l){if(n?.getOverrides&&n?.applyOverrides){let g=n.getOverrides();delete g[l],n.clearOverrides?.(),n.applyOverrides(g)}u(),m()},clearAllOverrides(){n?.clearOverrides?.(),u(),m()},getOverrides(){return n?.getOverrides?.()??{}},reDecide(){m()},async refresh(){n?.refreshConfig&&await n.refreshConfig()}};return{name:Ct,onInitialize(l){n=l,i&&(f.meta.orgId=i.orgId,f.meta.projectId=i.projectId,f.meta.env=i.env);let g=Et();g.instances[e]=f,Ie({type:"register",instanceId:e}),u()},onConfigUpdate(l){i=l,f.meta.orgId=l.orgId,f.meta.projectId=l.projectId,f.meta.env=l.env,u()},onDecision(l){o={...l.assignments},s=l.metadata?.layers?[...l.metadata.layers]:[],a=l.decisionId,l.metadata?.unitKeyValue&&(c=l.metadata.unitKeyValue),p("decision",l),u()},onResolve(l){o={...l},u()},onExposure(l){return p("exposure",l),!0},onTrack(l){return p("track",l),!0},onDestroy(){let l=typeof window<"u"?window.__TRAFFICAL_DEBUG__:null;l&&(delete l.instances[e],Ie({type:"unregister",instanceId:e})),y=[],h=[],n=null}}}var J=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 Ee(){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 fe="js-client",St="https://sdk.traffical.io",wt=6e4,Pt=3e5,Dt=100,S=class{constructor(e){this._state={bundle:null,etag:null,lastFetchTime:0,lastOfflineWarning:0,refreshTimer:null,isInitialized:!1,serverResponse:null,cachedEdgeResults:null};this._decisionCache=new Map;this._cumulativeAttribution=new Map;this._identityListeners=[];this._overrideListeners=[];this._overrides={};let t=e.evaluationMode??"bundle";this._options={orgId:e.orgId,projectId:e.projectId,env:e.env,apiKey:e.apiKey,baseUrl:e.baseUrl??St,localConfig:e.localConfig,refreshIntervalMs:e.refreshIntervalMs??wt,attributionMode:e.attributionMode??"cumulative",evaluationMode:t};let n={baseUrl:this._options.baseUrl,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,apiKey:this._options.apiKey};if(this._decisionClient=new A(n),this._errorBoundary=new z(e.errorBoundary),this._storage=e.storage??_e(),this._lifecycleProvider=e.lifecycleProvider??Ee(),!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 G({endpoint:`${this._options.baseUrl}/v1/events/batch`,apiKey:e.apiKey,storage:this._storage,lifecycleProvider:this._lifecycleProvider,batchSize:e.eventBatchSize,flushIntervalMs:e.eventFlushIntervalMs,onError:i=>{console.warn("[Traffical] Event logging error:",i.message)},onSchemaWarnings:e.onSchemaWarnings}),this._exposureDedup=new O({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}),this._stableId=new q({storage:this._storage}),this._plugins=new J,this._assignmentLogger=e.assignmentLogger,this._disableCloudEvents=e.disableCloudEvents??!1,this._assignmentLoggerDedup=e.deduplicateAssignmentLogger!==!1&&e.assignmentLogger?new O({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}):null,e.trackDecisions!==!1&&!this._disableCloudEvents&&this._plugins.register({plugin:le({deduplicationTtlMs:e.decisionDeduplicationTtlMs},{orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,log:i=>this._eventLogger.log(i)}),priority:100}),e.plugins)for(let i of e.plugins)this._plugins.register(i);if(this._options.localConfig&&(this._state.bundle=this._options.localConfig,this._plugins.runConfigUpdate(this._options.localConfig)),typeof window<"u"){let i=window;i.__TRAFFICAL_INSTANCES__??(i.__TRAFFICAL_INSTANCES__=[]),i.__TRAFFICAL_INSTANCES__.push(this)}}async initialize(){await this._errorBoundary.captureAsync("initialize",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig(),this._startBackgroundRefresh(),this._state.isInitialized=!0,await this._plugins.runInitialize(this)},void 0)}get isInitialized(){return this._state.isInitialized}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._errorBoundary.swallow("refreshConfig",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig()})}getConfigVersion(){return this._state.serverResponse?.stateVersion??this._state.bundle?.version??null}getParams(e){return this._errorBoundary.capture("getParams",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){let o={...e.defaults};for(let[s,a]of Object.entries(this._state.serverResponse.assignments))s in o&&(o[s]=a);return this._plugins.runResolve(o),this._applyOverridesToResult(o),o}let t=this._getEffectiveBundle(),n=this._enrichContext(e.context),i=U(t,n,e.defaults);return this._plugins.runResolve(i),this._applyOverridesToResult(i),i},e.defaults)}decide(e){return this._errorBoundary.capture("decide",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){let s=this._state.serverResponse,a={...e.defaults};for(let[v,y]of Object.entries(s.assignments))v in a&&(a[v]=y);let c={decisionId:s.decisionId,assignments:a,metadata:s.metadata};return this._cacheDecision(c),this._updateCumulativeAttribution(c),this._plugins.runDecision(c),this._applyOverridesToResult(c.assignments),this._emitAssignmentLogEntries(c),c}let t=this._getEffectiveBundle(),n=this._enrichContext(e.context);n=this._plugins.runBeforeDecision(n);let i=this._state.cachedEdgeResults??void 0,o=W(t,n,e.defaults,i);return this._cacheDecision(o),this._updateCumulativeAttribution(o),this._plugins.runDecision(o),this._applyOverridesToResult(o.assignments),this._emitAssignmentLogEntries(o),o},{decisionId:P(),assignments:e.defaults,metadata:{timestamp:new Date().toISOString(),unitKeyValue:"",layers:[]}})}trackExposure(e){this._errorBoundary.capture("trackExposure",()=>{let t=e.metadata.unitKeyValue;if(t){this._emitAssignmentLogEntries(e);for(let n of e.metadata.layers){if(!n.policyId||!n.allocationName||n.attributionOnly||!this._exposureDedup.checkAndMark(t,n.policyId,n.allocationName))continue;let o={type:"exposure",id:ie(),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:e.metadata.layers,context:e.metadata.filteredContext,sdkName:fe,sdkVersion:T};this._plugins.runExposure(o)&&(this._disableCloudEvents||this._eventLogger.log(o))}}},void 0)}track(e,t,n){this._errorBoundary.capture("track",()=>{let i=n?.unitKey??this._stableId.getId(),o=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,properties:t,decisionId:a,attribution:s,sdkName:fe,sdkVersion:T};this._plugins.runTrack(c)&&(this._disableCloudEvents||this._eventLogger.log(c))},void 0)}async flushEvents(){await this._errorBoundary.swallow("flushEvents",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{}}_emitAssignmentLogEntries(e){if(!this._assignmentLogger)return;let t=e.metadata.unitKeyValue;if(t)for(let n of e.metadata.layers)!n.policyId||!n.allocationName||this._assignmentLoggerDedup&&!this._assignmentLoggerDedup.checkAndMark(t,n.policyId,n.allocationName)||this._assignmentLogger({unitKey:t,policyId:n.policyId,policyKey:n.policyKey,allocationName:n.allocationName,allocationKey:n.allocationKey,timestamp:e.metadata.timestamp,layerId:n.layerId,allocationId:n.allocationId,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,sdkName:fe,sdkVersion:T,properties:e.metadata.filteredContext})}_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/${this._options.projectId}?env=${this._options.env}`,t={"Content-Type":"application/json",Authorization:`Bearer ${this._options.apiKey}`};this._state.etag&&(t["If-None-Match"]=this._state.etag);try{let n=await fetch(e,{method:"GET",headers:t});if(n.status===304){this._state.lastFetchTime=Date.now();return}if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);let i=await n.json(),o=n.headers.get("ETag");if(this._state.bundle=i,this._state.etag=o,this._state.lastFetchTime=Date.now(),this._findEdgePolicies(i).length>0){let s=await this._prefetchEdgeResults(i,this._enrichContext({}));this._state.cachedEdgeResults=s}else this._state.cachedEdgeResults=null;this._plugins.runConfigUpdate(i)}catch(n){this._logOfflineWarning(n)}}_startBackgroundRefresh(){let e=this._options.evaluationMode==="server"?this._state.serverResponse?.suggestedRefreshMs??this._options.refreshIntervalMs:this._options.refreshIntervalMs;e<=0||(this._state.refreshTimer=setInterval(()=>{this._options.evaluationMode==="server"?this._fetchServerResolve().catch(()=>{}):this._fetchConfig().catch(()=>{})},e))}async _fetchServerResolve(){if(this._decisionClient)try{let e=this._enrichContext({}),t=await this._decisionClient.resolve({context:e});t&&(this._state.serverResponse=t,this._state.lastFetchTime=Date.now())}catch(e){this._logOfflineWarning(e)}}_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=D(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 oe(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 v=s[c];v&&a.set(o[c].policyId,{allocationIndex:v.allocationIndex,entityId:o[c].entityId})}return a.size>0?{edgeResults:a}:{}}catch{return{}}}_logOfflineWarning(e){let t=Date.now();t-this._state.lastOfflineWarning>Pt&&(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)}_cacheDecision(e){if(this._decisionCache.size>=Dt){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 Te(r){let e=new S(r);return await e.initialize(),e}function xe(r){return new S(r)}function ke(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,m){if(p==="innerHTML")u.innerHTML=m;else if(p==="textContent")u.textContent=m;else if(p==="src"&&"src"in u)u.src=m;else if(p==="href"&&"href"in u)u.href=m;else if(p.startsWith("style.")){let f=p.slice(6);u.style[f]=m}else u.setAttribute(p,m)}function c(u,p){let m=String(p);try{let f=document.querySelectorAll(u.selector);for(let d of f)a(d,u.property,m)}catch(f){console.warn(`[Traffical DOM Binding] Failed to apply binding for ${u.parameterKey}:`,f)}}function v(u,p=!1){n=u;let m=typeof window<"u"?window.location.pathname:"";for(let f of t){if(!p&&!s(f.urlPattern,m))continue;let d=u[f.parameterKey];d!==void 0&&c(f,d)}}function y(){o&&clearTimeout(o),o=setTimeout(()=>{v(n)},e.debounceMs)}function h(){i||typeof MutationObserver>"u"||typeof document>"u"||(i=new MutationObserver(()=>{y()}),i.observe(document.body,{childList:!0,subtree:!0}))}function _(){i&&(i.disconnect(),i=null),o&&(clearTimeout(o),o=null)}return{name:"dom-binding",onInitialize(){e.observeMutations&&h()},onConfigUpdate(u){t=u.domBindings??[]},onResolve(u){v(u)},onDecision(u){v(u.assignments)},onDestroy(){_(),t=[],n={}},applyBindings(u){v(u||n)},getBindings(){return t}}}var b=null;async function At(r){return b?(console.warn("[Traffical] Client already initialized. Returning existing instance."),b):(b=await Te(r),b)}function Rt(r){return b?(console.warn("[Traffical] Client already initialized. Returning existing instance."),b):(b=xe(r),b.initialize().catch(e=>{console.warn("[Traffical] Initialization error:",e)}),b)}function Ot(){return b}function Mt(){b&&(b.destroy(),b=null)}return Me(Lt);})();
1
+ /* @traffical/js-client v0.11.1 */
2
+ "use strict";var Traffical=(()=>{var K=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var Pe=Object.getOwnPropertyNames;var De=Object.prototype.hasOwnProperty;var Ae=(r,e,t)=>e in r?K(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var Re=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Oe=(r,e)=>{for(var t in e)K(r,t,{get:e[t],enumerable:!0})},Me=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Pe(e))!De.call(r,i)&&i!==t&&K(r,i,{get:()=>e[i],enumerable:!(n=we(e,i))||n.enumerable});return r};var Le=r=>Me(K({},"__esModule",{value:!0}),r);var T=(r,e,t)=>(Ae(r,typeof e!="symbol"?e+"":e,t),t);var ve=Re(()=>{});var Nt={};Oe(Nt,{TrafficalClient:()=>P,createDOMBindingPlugin:()=>Se,createDebugPlugin:()=>ge,createRedirectAttributionPlugin:()=>fe,createRedirectPlugin:()=>de,destroy:()=>Lt,init:()=>Rt,initSync:()=>Ot,instance:()=>Mt});function S(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function V(r,e,t){let n=`${r}:${e}`;return S(n)%t}function Q(r,e){return r>=e[0]&&r<=e[1]}function F(r,e){for(let t of e)if(Q(r,t.bucketRange))return t;return null}function w(r,e){if(r.length===0||r.length===1)return 0;let n=S(e)%1e4/1e4,i=0;for(let o=0;o<r.length;o++)if(i+=r[o],n<i)return o;return r.length-1}function ee(r,e){let{field:t,op:n,value:i,values:o}=r,s=Ke(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 U(r,e){return r.length===0?!0:r.every(t=>ee(t,e))}function Ke(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 te(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 ne(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,u)=>a+u,0);return o.map(a=>a/s)}function ie(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,u)=>a+u,0);return s===0?Array(t).fill(1/t):o.map(a=>a/s)}function $(r,e,t){let n=r.contextualModel;if(!n||r.allocations.length===0)return null;let i=Ve(n,r.allocations,e),o=ne(i,n.gamma),s=ie(o,n.actionProbabilityFloor),a=`ctx:${t}:${r.id}`,u=w(s,a);return r.allocations[u]}function Ve(r,e,t){return e.map(n=>{let i=r.coefficients[n.name];return i?te(i,t):r.defaultAllocationScore})}var Fe=r=>crypto.getRandomValues(new Uint8Array(r)),Ue=(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),u=i|0;for(;u--;)if(s+=r[a[u]&n]||"",s.length>=o)return s}}},he=(r,e=21)=>Ue(r,e|0,Fe);function j(r){let e=new Error(r);return e.source="ulid",e}var re="0123456789ABCDEFGHJKMNPQRSTVWXYZ",D=re.length,me=Math.pow(2,48)-1,$e=10,je=16;function We(r){let e=Math.floor(r()*D);return e===D&&(e=D-1),re.charAt(e)}function ze(r,e){if(isNaN(r))throw new Error(r+" must be a number");if(r>me)throw j("cannot encode time greater than "+me);if(r<0)throw j("time must be positive");if(Number.isInteger(Number(r))===!1)throw j("time must be an integer");let t,n="";for(;e>0;e--)t=r%D,n=re.charAt(t)+n,r=(r-t)/D;return n}function He(r,e){let t="";for(;r>0;r--)t=We(e)+t;return t}function Ge(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=ve();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 j("secure crypto unusable, insecure Math.random not allowed")}function qe(r){return r||(r=Ge()),function(t){return isNaN(t)&&(t=Date.now()),ze(t,$e)+He(je,r)}}var ye=qe();var Xe="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Je=8,nn=he(Xe,Je);function W(r){return`${r}_${ye()}`}function A(){return W("dec")}function oe(){return W("exp")}function se(){return W("trk")}function Ye(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 Ze(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 _e(r){if(r<=0)return[];let e=1/r;return Array(r).fill(e)}function Qe(r,e,t,n){let i=r.entityState?.[e];if(!i)return _e(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:_e(n)}function et(r,e,t,n){let i=e.entityConfig;if(!i)return null;let o=Ze(i.entityKeys,t);if(!o)return null;let s,a;if(i.dynamicAllocations){let g=i.dynamicAllocations.countKey,b=t[g];if(typeof b!="number"||b<=0)return null;a=Math.floor(b),s=Array.from({length:a},(c,f)=>({id:`${e.id}_dynamic_${f}`,name:String(f),bucketRange:[0,0],overrides:{}}))}else s=e.allocations,a=s.length;if(a===0)return null;let u=Qe(r,e.id,o,a),p=`${o}:${n}:${e.id}`,y=w(u,p);return{allocation:s[y],entityId:o}}function R(r,e){let t=e[r.hashing.unitKey];return t==null?null:String(t)}function be(r,e,t,n){let i={...t},o=[],s=[];if(!r)return{assignments:i,unitKeyValue:"",layers:o,matchedPolicies:s};let a=R(r,e)??"",u=new Set(Object.keys(t)),p=r.parameters.filter(g=>u.has(g.key));for(let g of p)g.key in i&&(i[g.key]=g.default);let y=new Map;for(let g of p){let b=y.get(g.layerId)||[];b.push(g),y.set(g.layerId,b)}for(let g of r.layers){let b=y.get(g.id),c=b&&b.length>0,f=g.unitKey,h=f?String(e[f]??""):a;if(!h){o.push({layerId:g.id,bucket:-1,...f?{unitKey:f,unitKeyValue:""}:{},...c?{}:{attributionOnly:!0}});continue}let v=V(h,g.id,r.hashing.bucketCount),E,l;for(let d of g.policies)if(d.state==="running"){if(d.eligibleBucketRange){let{start:m,end:_}=d.eligibleBucketRange;if(v<m||v>_)continue}if(U(d.conditions,e)){if(d.contextualModel){let m=$(d,e,h);if(m){if(E=d,l=m,s.push(d),c)for(let[_,k]of Object.entries(m.overrides))_ in i&&(i[_]=k);break}}if(d.entityConfig&&d.entityConfig.resolutionMode==="bundle"){let m=et(r,d,e,h);if(m){if(E=d,l=m.allocation,s.push(d),c&&!d.entityConfig.dynamicAllocations)for(let[_,k]of Object.entries(m.allocation.overrides))_ in i&&(i[_]=k);break}}else if(d.entityConfig&&d.entityConfig.resolutionMode==="edge"){let m=n?.edgeResults?.get(d.id);if(m){if(E=d,s.push(d),d.entityConfig.dynamicAllocations)l={id:`${d.id}_dynamic_${m.allocationIndex}`,name:String(m.allocationIndex),bucketRange:[0,0],overrides:{}};else if(d.allocations[m.allocationIndex]&&(l=d.allocations[m.allocationIndex],c&&l))for(let[_,k]of Object.entries(l.overrides))_ in i&&(i[_]=k);break}continue}else{let m=F(v,d.allocations);if(m){if(E=d,l=m,s.push(d),c)for(let[_,k]of Object.entries(m.overrides))_ in i&&(i[_]=k);break}}}}o.push({layerId:g.id,bucket:v,policyId:E?.id,policyKey:E?.key,allocationId:l?.id,allocationName:l?.name,allocationKey:l?.key,...f?{unitKey:f,unitKeyValue:h}:{},...c?{}:{attributionOnly:!0}})}return{assignments:i,unitKeyValue:a,layers:o,matchedPolicies:s}}function z(r,e,t,n){return be(r,e,t,n).assignments}function H(r,e,t,n){let{assignments:i,unitKeyValue:o,layers:s,matchedPolicies:a}=be(r,e,t,n),u=Ye(e,a);return{decisionId:A(),assignments:i,metadata:{timestamp:new Date().toISOString(),unitKeyValue:o,layers:s,filteredContext:u}}}var C=class r{constructor(e={}){T(this,"_seen",new Map);T(this,"_ttlMs");T(this,"_maxEntries");T(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 O=class{constructor(e){T(this,"config");T(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 ae(r,e,t,n,i){let o=[];for(let a of e){let u=t[a];if(u==null)return null;o.push(String(u))}let s=o.join("_");return{policyId:r,entityId:s,unitKeyValue:n,allocationCount:i,context:t}}var G=class{constructor(e={}){this._seen=new Set;this._lastError=null;this._options=e}capture(e,t,n){try{return t()}catch(i){return this._onError(e,i),n}}async captureAsync(e,t,n){try{return await t()}catch(i){return this._onError(e,i),n}}async swallow(e,t){try{await t()}catch(n){this._onError(e,n)}}getLastError(){let e=this._lastError;return this._lastError=null,e}clearSeen(){this._seen.clear()}_onError(e,t){let n=this._resolveError(t);this._lastError=n;let i=`${e}:${n.name}:${n.message}`;this._seen.has(i)||(this._seen.add(i),console.warn(`[Traffical] Error in ${e}:`,n.message),this._options.onError?.(e,n),this._options.reportErrors&&this._options.errorEndpoint&&this._reportError(e,n).catch(()=>{}))}async _reportError(e,t){if(this._options.errorEndpoint)try{await fetch(this._options.errorEndpoint,{method:"POST",headers:{"Content-Type":"application/json",...this._options.sdkKey&&{"X-Traffical-Key":this._options.sdkKey}},body:JSON.stringify({tag:e,error:t.name,message:t.message,stack:t.stack,timestamp:new Date().toISOString(),sdk:"@traffical/js-client",userAgent:typeof navigator<"u"?navigator.userAgent:void 0})})}catch{}}_resolveError(e){return e instanceof Error?e:typeof e=="string"?new Error(e):new Error("An unknown error occurred")}};var q="failed_events";var X=class{constructor(e){this._queue=[];this._flushTimer=null;this._isFlushing=!1;this._endpoint=e.endpoint,this._apiKey=e.apiKey,this._storage=e.storage,this._batchSize=e.batchSize??10,this._flushIntervalMs=e.flushIntervalMs??3e4,this._onError=e.onError,this._onSchemaWarnings=e.onSchemaWarnings,this._lifecycleProvider=e.lifecycleProvider,this._setupListeners(),this._retryFailedEvents(),this._startFlushTimer()}log(e){this._queue.push(e),this._queue.length>=this._batchSize&&this.flush()}async flush(){if(this._isFlushing||this._queue.length===0)return;this._isFlushing=!0;let e=[...this._queue];this._queue=[];try{await this._sendEvents(e)}catch(t){this._persistFailedEvents(e),this._onError?.(t instanceof Error?t:new Error(String(t)))}finally{this._isFlushing=!1}}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=await fetch(this._endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:JSON.stringify({events:e})});if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);if(this._onSchemaWarnings)try{let n=await t.json();n.schemaWarnings&&n.schemaWarnings.length>0&&this._onSchemaWarnings(n.schemaWarnings)}catch{}}_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 M="exposure_dedup";var L=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(M)}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(M)}_persist(){let e={seen:Array.from(this._seen),sessionStart:this._sessionStart};this._storage.set(M,e,this._sessionTtlMs)}_restore(){let e=this._storage.get(M);if(!e)return;if(Date.now()-e.sessionStart>this._sessionTtlMs){this._storage.remove(M);return}this._seen=new Set(e.seen),this._sessionStart=e.sessionStart}};var N="stable_id",ht="traffical_sid";var J=class{constructor(e){this._cachedId=null;this._storage=e.storage,this._useCookieFallback=e.useCookieFallback??!0,this._cookieName=e.cookieName??ht}getId(){if(this._cachedId)return this._cachedId;let e=this._storage.get(N);return e?(this._cachedId=e,e):this._useCookieFallback&&(e=this._getCookie(),e)?(this._storage.set(N,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(N),this._useCookieFallback&&this._deleteCookie(),this._cachedId=null}hasId(){return this._storage.get(N)!==null||this._getCookie()!==null}_persist(e){this._storage.set(N,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 B="traffical:",le=class{constructor(){this._available=this._checkAvailability()}get(e){if(!this._available)return null;try{let t=localStorage.getItem(B+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(B+e,JSON.stringify(i))}catch{}}remove(e){if(this._available)try{localStorage.removeItem(B+e)}catch{}}clear(){if(this._available)try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n?.startsWith(B)&&e.push(n)}e.forEach(t=>localStorage.removeItem(t))}catch{}}_checkAvailability(){try{let e=B+"__test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return!1}}},ce=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 Ie(){let r=new le;return r.get("__check__")!==null||vt()?r:new ce}function vt(){try{let r="__traffical_storage_test__";return localStorage.setItem(r,"test"),localStorage.removeItem(r),!0}catch{return!1}}var x="0.11.1";var mt="js-client";function ue(r,e){let t=new C({ttlMs:r.deduplicationTtlMs});return{name:"decision-tracking",onDecision(n){if(r.disabled)return;let i=n.metadata.unitKeyValue;if(!i)return;let o=C.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,sdkName:mt,sdkVersion:x};e.log(s)},onDestroy(){t.clear()}}}var yt="traffical_rdr";function _t(r,e,t){if(!(typeof document>"u"))try{document.cookie=`${r}=${encodeURIComponent(e)}; max-age=${t}; path=/; SameSite=Lax`}catch{}}function de(r={}){let e=r.parameterKey??"redirect.url",t=r.compareMode??"pathname",n=r.cookieName??yt;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(u=>u.policyId&&u.allocationName);a&&_t(n,JSON.stringify({l:a.layerId,p:a.policyId,a:a.allocationName,ts:Date.now()}),86400),window.location.replace(o)}}}var bt="traffical_rdr";function It(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 Et(r,e){let t=It(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 fe(r={}){let e=r.cookieName??bt,t=r.expiryMs??864e5;function n(i){let o=Et(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 Y=[],Ee={};function Tt(){if(typeof window>"u")return{version:1,instances:Ee,subscribe:()=>()=>{}};if(!window.__TRAFFICAL_DEBUG__){let r={version:1,instances:Ee,subscribe(e){return Y.push(e),()=>{Y=Y.filter(t=>t!==e)}}};window.__TRAFFICAL_DEBUG__=r}return window.__TRAFFICAL_DEBUG__}function Te(r){for(let e of Y)try{e(r)}catch{}}var xt=0;function kt(){return`traffical_${Date.now().toString(36)}_${(++xt).toString(36)}`}function Ct(){return`evt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}var St="traffical-debug";function ge(r={}){let e=r.instanceId??kt(),t=r.maxEvents??500,n=null,i=null,o={},s=[],a=null,u=null,p=[],y=[],g=[];function b(){return{ready:n?.isInitialized===!0,stableId:n?.getStableId?.()??null,effectiveUnitKey:u,configVersion:n?.getConfigVersion?.()??null,assignments:{...o},layers:[...s],lastDecisionId:a,overrides:n?.getOverrides?.()??{}}}function c(){let l=b();for(let d of y)try{d(l)}catch{}}function f(l,d){let m={id:Ct(),type:l,timestamp:Date.now(),data:d};p.push(m),p.length>t&&p.splice(0,p.length-t);for(let _ of g)try{_(m)}catch{}}function h(){if(n)try{n.decide({context:{},defaults:{}})}catch{}}let v={id:e,meta:{orgId:"",projectId:"",env:"",sdkVersion:x},getState:b,subscribe(l){return y.push(l),()=>{y=y.filter(d=>d!==l)}},getEvents(l){return l!==void 0?p.slice(-l):[...p]},onEvent(l){return g.push(l),()=>{g=g.filter(d=>d!==l)}},getConfigBundle(){return i},setUnitKey(l){n?.identify?n.identify(l):n?.setStableId&&n.setStableId(l),c()},setOverride(l,d){n?.applyOverrides&&n.applyOverrides({[l]:d}),c(),h()},clearOverride(l){if(n?.getOverrides&&n?.applyOverrides){let d=n.getOverrides();delete d[l],n.clearOverrides?.(),n.applyOverrides(d)}c(),h()},clearAllOverrides(){n?.clearOverrides?.(),c(),h()},getOverrides(){return n?.getOverrides?.()??{}},reDecide(){h()},async refresh(){n?.refreshConfig&&await n.refreshConfig()}};return{name:St,onInitialize(l){n=l,i&&(v.meta.orgId=i.orgId,v.meta.projectId=i.projectId,v.meta.env=i.env);let d=Tt();d.instances[e]=v,Te({type:"register",instanceId:e}),c()},onConfigUpdate(l){i=l,v.meta.orgId=l.orgId,v.meta.projectId=l.projectId,v.meta.env=l.env,c()},onDecision(l){o={...l.assignments},s=l.metadata?.layers?[...l.metadata.layers]:[],a=l.decisionId,l.metadata?.unitKeyValue&&(u=l.metadata.unitKeyValue),f("decision",l),c()},onResolve(l){o={...l},c()},onExposure(l){return f("exposure",l),!0},onTrack(l){return f("track",l),!0},onDestroy(){let l=typeof window<"u"?window.__TRAFFICAL_DEBUG__:null;l&&(delete l.instances[e],Te({type:"unregister",instanceId:e})),y=[],g=[],n=null}}}var Z=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 xe(){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 pe="js-client",wt="https://sdk.traffical.io",Pt=6e4,Dt=3e5,At=100,P=class{constructor(e){this._state={bundle:null,etag:null,lastFetchTime:0,lastOfflineWarning:0,refreshTimer:null,isInitialized:!1,serverResponse:null,cachedEdgeResults:null};this._decisionCache=new Map;this._cumulativeAttribution=new Map;this._identityListeners=[];this._overrideListeners=[];this._overrides={};let t=e.evaluationMode??"bundle";this._options={orgId:e.orgId,projectId:e.projectId,env:e.env,apiKey:e.apiKey,baseUrl:e.baseUrl??wt,localConfig:e.localConfig,refreshIntervalMs:e.refreshIntervalMs??Pt,attributionMode:e.attributionMode??"cumulative",evaluationMode:t};let n={baseUrl:this._options.baseUrl,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,apiKey:this._options.apiKey};if(this._decisionClient=new O(n),this._errorBoundary=new G(e.errorBoundary),this._storage=e.storage??Ie(),this._lifecycleProvider=e.lifecycleProvider??xe(),!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 X({endpoint:`${this._options.baseUrl}/v1/events/batch`,apiKey:e.apiKey,storage:this._storage,lifecycleProvider:this._lifecycleProvider,batchSize:e.eventBatchSize,flushIntervalMs:e.eventFlushIntervalMs,onError:i=>{console.warn("[Traffical] Event logging error:",i.message)},onSchemaWarnings:e.onSchemaWarnings}),this._exposureDedup=new L({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}),this._stableId=new J({storage:this._storage}),this._plugins=new Z,this._assignmentLogger=e.assignmentLogger,this._disableCloudEvents=e.disableCloudEvents??!1,this._assignmentLoggerDedup=e.deduplicateAssignmentLogger!==!1&&e.assignmentLogger?new L({storage:this._storage,sessionTtlMs:e.exposureSessionTtlMs}):null,e.trackDecisions!==!1&&!this._disableCloudEvents&&this._plugins.register({plugin:ue({deduplicationTtlMs:e.decisionDeduplicationTtlMs},{orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,log:i=>this._eventLogger.log(i)}),priority:100}),e.plugins)for(let i of e.plugins)this._plugins.register(i);if(this._options.localConfig&&(this._state.bundle=this._options.localConfig,this._plugins.runConfigUpdate(this._options.localConfig)),typeof window<"u"){let i=window;i.__TRAFFICAL_INSTANCES__??(i.__TRAFFICAL_INSTANCES__=[]),i.__TRAFFICAL_INSTANCES__.push(this)}}async initialize(){await this._errorBoundary.captureAsync("initialize",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig(),this._startBackgroundRefresh(),this._state.isInitialized=!0,await this._plugins.runInitialize(this)},void 0)}get isInitialized(){return this._state.isInitialized}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._errorBoundary.swallow("refreshConfig",async()=>{this._options.evaluationMode==="server"?await this._fetchServerResolve():await this._fetchConfig()})}getConfigVersion(){return this._state.serverResponse?.stateVersion??this._state.bundle?.version??null}getParams(e){return this._errorBoundary.capture("getParams",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){let o={...e.defaults};for(let[s,a]of Object.entries(this._state.serverResponse.assignments))s in o&&(o[s]=a);return this._plugins.runResolve(o),this._applyOverridesToResult(o),o}let t=this._getEffectiveBundle(),n=this._enrichContext(e.context),i=z(t,n,e.defaults);return this._plugins.runResolve(i),this._applyOverridesToResult(i),i},e.defaults)}decide(e){return this._errorBoundary.capture("decide",()=>{if(this._options.evaluationMode==="server"&&this._state.serverResponse){let s=this._state.serverResponse,a={...e.defaults};for(let[p,y]of Object.entries(s.assignments))p in a&&(a[p]=y);let u={decisionId:s.decisionId,assignments:a,metadata:s.metadata};return this._cacheDecision(u),this._updateCumulativeAttribution(u),this._plugins.runDecision(u),this._applyOverridesToResult(u.assignments),this._emitAssignmentLogEntries(u),u}let t=this._getEffectiveBundle(),n=this._enrichContext(e.context);n=this._plugins.runBeforeDecision(n);let i=this._state.cachedEdgeResults??void 0,o=H(t,n,e.defaults,i);return this._cacheDecision(o),this._updateCumulativeAttribution(o),this._plugins.runDecision(o),this._applyOverridesToResult(o.assignments),this._emitAssignmentLogEntries(o),o},{decisionId:A(),assignments:e.defaults,metadata:{timestamp:new Date().toISOString(),unitKeyValue:"",layers:[]}})}trackExposure(e){this._errorBoundary.capture("trackExposure",()=>{let t=e.metadata.unitKeyValue;if(t){this._emitAssignmentLogEntries(e);for(let n of e.metadata.layers){if(!n.policyId||!n.allocationName||n.attributionOnly||!this._exposureDedup.checkAndMark(t,n.policyId,n.allocationName))continue;let o={type:"exposure",id:oe(),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:e.metadata.layers,context:e.metadata.filteredContext,sdkName:pe,sdkVersion:x};this._plugins.runExposure(o)&&(this._disableCloudEvents||this._eventLogger.log(o))}}},void 0)}track(e,t,n){this._errorBoundary.capture("track",()=>{let i=n?.unitKey??this._stableId.getId(),o=typeof t?.value=="number"?t.value:void 0,s=this._buildAttribution(i,n?.decisionId),a=n?.decisionId,u={type:"track",id:se(),orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,unitKey:i,timestamp:new Date().toISOString(),event:e,value:o,properties:t,decisionId:a,attribution:s,sdkName:pe,sdkVersion:x};this._plugins.runTrack(u)&&(this._disableCloudEvents||this._eventLogger.log(u))},void 0)}async flushEvents(){await this._errorBoundary.swallow("flushEvents",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{}}_emitAssignmentLogEntries(e){if(!this._assignmentLogger)return;let t=e.metadata.unitKeyValue;if(t)for(let n of e.metadata.layers)!n.policyId||!n.allocationName||this._assignmentLoggerDedup&&!this._assignmentLoggerDedup.checkAndMark(t,n.policyId,n.allocationName)||this._assignmentLogger({unitKey:t,policyId:n.policyId,policyKey:n.policyKey,allocationName:n.allocationName,allocationKey:n.allocationKey,timestamp:e.metadata.timestamp,layerId:n.layerId,allocationId:n.allocationId,orgId:this._options.orgId,projectId:this._options.projectId,env:this._options.env,sdkName:pe,sdkVersion:x,properties:e.metadata.filteredContext})}_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/${this._options.projectId}?env=${this._options.env}`,t={"Content-Type":"application/json",Authorization:`Bearer ${this._options.apiKey}`};this._state.etag&&(t["If-None-Match"]=this._state.etag);try{let n=await fetch(e,{method:"GET",headers:t});if(n.status===304){this._state.lastFetchTime=Date.now();return}if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);let i=await n.json(),o=n.headers.get("ETag");if(this._state.bundle=i,this._state.etag=o,this._state.lastFetchTime=Date.now(),this._findEdgePolicies(i).length>0){let s=await this._prefetchEdgeResults(i,this._enrichContext({}));this._state.cachedEdgeResults=s}else this._state.cachedEdgeResults=null;this._plugins.runConfigUpdate(i)}catch(n){this._logOfflineWarning(n)}}_startBackgroundRefresh(){let e=this._options.evaluationMode==="server"?this._state.serverResponse?.suggestedRefreshMs??this._options.refreshIntervalMs:this._options.refreshIntervalMs;e<=0||(this._state.refreshTimer=setInterval(()=>{this._options.evaluationMode==="server"?this._fetchServerResolve().catch(()=>{}):this._fetchConfig().catch(()=>{})},e))}async _fetchServerResolve(){if(this._decisionClient)try{let e=this._enrichContext({}),t=await this._decisionClient.resolve({context:e});t&&(this._state.serverResponse=t,this._state.lastFetchTime=Date.now())}catch(e){this._logOfflineWarning(e)}}_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=R(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 ae(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 u=0;u<o.length;u++){let p=s[u];p&&a.set(o[u].policyId,{allocationIndex:p.allocationIndex,entityId:o[u].entityId})}return a.size>0?{edgeResults:a}:{}}catch{return{}}}_logOfflineWarning(e){let t=Date.now();t-this._state.lastOfflineWarning>Dt&&(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)}_cacheDecision(e){if(this._decisionCache.size>=At){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 ke(r){let e=new P(r);return await e.initialize(),e}function Ce(r){return new P(r)}function Se(r={}){let e={observeMutations:r.observeMutations??!0,debounceMs:r.debounceMs??100},t=[],n={},i=null,o=null;function s(c,f){try{return new RegExp(c).test(f)}catch{return f===c}}function a(c,f,h){if(f==="innerHTML")c.innerHTML=h;else if(f==="textContent")c.textContent=h;else if(f==="src"&&"src"in c)c.src=h;else if(f==="href"&&"href"in c)c.href=h;else if(f.startsWith("style.")){let v=f.slice(6);c.style[v]=h}else c.setAttribute(f,h)}function u(c,f){let h=String(f);try{let v=document.querySelectorAll(c.selector);for(let E of v)a(E,c.property,h)}catch(v){console.warn(`[Traffical DOM Binding] Failed to apply binding for ${c.parameterKey}:`,v)}}function p(c,f=!1){n=c;let h=typeof window<"u"?window.location.pathname:"";for(let v of t){if(!f&&!s(v.urlPattern,h))continue;let E=c[v.parameterKey];E!==void 0&&u(v,E)}}function y(){o&&clearTimeout(o),o=setTimeout(()=>{p(n)},e.debounceMs)}function g(){i||typeof MutationObserver>"u"||typeof document>"u"||(i=new MutationObserver(()=>{y()}),i.observe(document.body,{childList:!0,subtree:!0}))}function b(){i&&(i.disconnect(),i=null),o&&(clearTimeout(o),o=null)}return{name:"dom-binding",onInitialize(){e.observeMutations&&g()},onConfigUpdate(c){t=c.domBindings??[]},onResolve(c){p(c)},onDecision(c){p(c.assignments)},onDestroy(){b(),t=[],n={}},applyBindings(c){p(c||n)},getBindings(){return t}}}var I=null;async function Rt(r){return I?(console.warn("[Traffical] Client already initialized. Returning existing instance."),I):(I=await ke(r),I)}function Ot(r){return I?(console.warn("[Traffical] Client already initialized. Returning existing instance."),I):(I=Ce(r),I.initialize().catch(e=>{console.warn("[Traffical] Initialization error:",e)}),I)}function Mt(){return I}function Lt(){I&&(I.destroy(),I=null)}return Le(Nt);})();
3
3
  //# sourceMappingURL=traffical.min.js.map