@prodantix/sdk 0.0.1 → 0.1.0-beta.348

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.
Files changed (44) hide show
  1. package/README.md +11 -4
  2. package/dist/chat.cjs +65 -0
  3. package/dist/chat.d.cts +64 -0
  4. package/dist/chat.d.ts +64 -0
  5. package/dist/chat.js +65 -0
  6. package/dist/chunk-5XGN7UAV.js +2 -0
  7. package/dist/chunk-CSIP3PZ7.js +2 -0
  8. package/dist/chunk-V77KYPOF.js +2 -0
  9. package/dist/chunk-VG77TYVX.js +2 -0
  10. package/dist/client-Ca6xJESF.d.ts +105 -0
  11. package/dist/client-y1xyVF6C.d.cts +105 -0
  12. package/dist/config-B-cTz9n1.d.ts +94 -0
  13. package/dist/config-OP9Csae6.d.cts +94 -0
  14. package/dist/csp.cjs +3 -0
  15. package/dist/csp.d.cts +37 -0
  16. package/dist/csp.d.ts +37 -0
  17. package/dist/csp.js +3 -0
  18. package/dist/http-BCh716Vs.d.cts +14 -0
  19. package/dist/http-BCh716Vs.d.ts +14 -0
  20. package/dist/index.cjs +1 -1
  21. package/dist/index.d.cts +28 -6
  22. package/dist/index.d.ts +28 -6
  23. package/dist/index.js +1 -1
  24. package/dist/messenger.cjs +2 -0
  25. package/dist/messenger.d.cts +2 -0
  26. package/dist/messenger.d.ts +2 -0
  27. package/dist/messenger.iife.js +65 -0
  28. package/dist/messenger.js +2 -0
  29. package/dist/node.cjs +1 -1
  30. package/dist/node.d.cts +2 -1
  31. package/dist/node.d.ts +2 -1
  32. package/dist/node.js +1 -1
  33. package/dist/{transport-By6wsdny.d.ts → transport-Bj4nXmgt.d.cts} +3 -15
  34. package/dist/{transport-B3PxeUxW.d.cts → transport-CTPih3Jj.d.ts} +3 -15
  35. package/dist/types-68Sc11g8.d.cts +105 -0
  36. package/dist/types-68Sc11g8.d.ts +105 -0
  37. package/dist/web.cjs +1 -1
  38. package/dist/web.d.cts +4 -2
  39. package/dist/web.d.ts +4 -2
  40. package/dist/web.js +1 -1
  41. package/package.json +19 -3
  42. package/dist/chunk-FIZWZVZG.js +0 -2
  43. package/dist/client-B1bcIuD8.d.cts +0 -133
  44. package/dist/client-B1bcIuD8.d.ts +0 -133
package/dist/web.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var he=Object.defineProperty;var fe=(t,e,r)=>e in t?he(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var i=(t,e,r)=>fe(t,typeof e!="symbol"?e+"":e,r);var h=class extends Error{constructor(r,n,s){super(n,s);i(this,"code");this.code=r,this.name="ProdantixError";}},x=class extends h{constructor(e){super("config",e),this.name="ConfigError";}},y=class extends h{constructor(r,n){super("validation",n);i(this,"field");this.field=r,this.name="ValidationError";}},l=class extends h{constructor(r,n,s){super("transport",r,s);i(this,"status");this.status=n,this.name="TransportError";}};function c(t){if(t)return t;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function f(){let t=globalThis.AbortController;return t?new t:void 0}var D=t=>new Promise(e=>{setTimeout(e,t);});function p(t){return t.replace(/\/+$/,"")}var v=class{constructor(){i(this,"store",new Map);}getItem(e){return this.store.get(e)??null}removeItem(e){this.store.delete(e);}setItem(e,r){this.store.set(e,r);}};function K(){try{let t=globalThis.localStorage;if(t){let e="__pdx_probe__";return t.setItem(e,"1"),t.removeItem(e),t}}catch{return new v}return new v}var V={now:()=>new Date};function E(t){return t.toISOString()}function me(){return globalThis.crypto}function ge(t){t[6]=t[6]&15|64,t[8]=t[8]&63|128;let e=[];for(let r=0;r<16;r+=1)e.push(t[r].toString(16).padStart(2,"0"));return `${e[0]}${e[1]}${e[2]}${e[3]}-${e[4]}${e[5]}-${e[6]}${e[7]}-${e[8]}${e[9]}-${e[10]}${e[11]}${e[12]}${e[13]}${e[14]}${e[15]}`}function O(){let t=me();if(t?.randomUUID)return t.randomUUID();let e=new Uint8Array(16);if(t?.getRandomValues)t.getRandomValues(e);else for(let r=0;r<16;r+=1)e[r]=Math.floor(Math.random()*256);return ge(e)}var z={uuid:O};var ye=/^pdx_pub_(?:(?:live|test)_)?[a-z0-9]{32}$/;var ve=/^(?:\$|[a-z])[a-z0-9_.]*$/;function j(t){let e=0;for(let r of t)e+=1;return e}function H(t){return ye.test(t)}function be(t){return ve.test(t)}function B(t){let e=j(t);if(e<1||e>200)throw new y("distinct_id","distinct_id must be between 1 and 200 characters")}function U(t){let e=j(t);if(e<1||e>200)throw new y("event_name","event_name must be between 1 and 200 characters");if(!be(t))throw new y("event_name","event_name must match /^(\\$|[a-z])[a-z0-9_.]*$/")}var J="prodantix-js",Q="0.0.1";var xe=t=>{};function W(t){if(!t.apiKey||!H(t.apiKey))throw new x("apiKey must be a public project key of the form pdx_pub_<32 lowercase alphanumerics>");if(!t.host)throw new x("host is required (the ingest base URL)");let e=p(t.host),r=t.defaultProperties;return {apiKey:t.apiKey,autocapture:t.autocapture??false,clock:t.clock??V,defaultProperties:typeof r=="function"?r:()=>r??{},flagsHost:t.flagsHost?p(t.flagsHost):e,flushAt:t.flushAt??20,flushIntervalMs:t.flushIntervalMs??1e4,host:e,ids:t.ids??z,locale:t.locale,maxQueueSize:t.maxQueueSize??1e3,maxRetries:t.maxRetries??3,namespace:t.apiKey.slice(0,16),onError:t.onError??xe,os:t.os,requestTimeoutMs:t.requestTimeoutMs??1e4,sdkName:t.sdkName??J,sdkVersion:t.sdkVersion??Q,storage:t.storage??new v,transport:t.transport}}function G(t,e,r){U(t.eventName),B(t.distinctId);let n={distinct_id:t.distinctId,event_id:t.eventId??r.uuid(),event_name:t.eventName,properties:t.properties??{},schema_version:1,timestamp:E(t.timestamp??e.now())};return t.context&&(n.context=t.context),t.sessionId&&(n.session_id=t.sessionId),n}var g=Symbol("absent");function ke(t,e){if(t==="distinct_id")return e.distinctId;let r=e.properties??{};if(Object.prototype.hasOwnProperty.call(r,t))return r[t];let n=e.attributes??{};return Object.prototype.hasOwnProperty.call(n,t)?n[t]:g}function m(t){return t===g?"undefined":String(t)}function X(t){return t===g?Number.NaN:Number(t)}function Y(t){return t!==g&&t!==null&&t!==""}function Z(t,e){if(!Array.isArray(e))return false;let r=m(t);return e.map(n=>String(n)).includes(r)}function ee(t,e){let r=ke(t.attribute,e),n=t.value;switch(t.op){case "is_set":return Y(r);case "is_not_set":return !Y(r);case "eq":return m(r)===m(n===void 0?g:n);case "neq":return m(r)!==m(n===void 0?g:n);case "contains":return m(r).includes(m(n===void 0?g:n));case "in":return Z(r,n);case "not_in":return Array.isArray(n)?!Z(r,n):false;case "gt":return I(r,n,(s,o)=>s>o);case "gte":return I(r,n,(s,o)=>s>=o);case "lt":return I(r,n,(s,o)=>s<o);case "lte":return I(r,n,(s,o)=>s<=o);default:return false}}function I(t,e,r){let n=X(t),s=e===void 0?Number.NaN:X(e);return Number.isNaN(n)||Number.isNaN(s)?false:r(n,s)}function Ee(t,e){let r=`${t}:${e}`,n=2166136261;for(let s=0;s<r.length;s++)n^=r.charCodeAt(s),n=Math.imul(n,16777619);return (n>>>0)%100}function Ie(t,e){return t.enabled?t.targeting.length>0&&!t.targeting.every(r=>ee(r,e))?{enabled:false,reason:"targeting"}:t.rolloutPercentage>=100?{enabled:true,reason:"rollout_full"}:Ee(t.key,e.distinctId)<t.rolloutPercentage?{enabled:true,reason:"rollout"}:{enabled:false,reason:"rollout_excluded"}:{enabled:false,reason:"disabled"}}function te(t,e){let r={};for(let n of t)r[n.key]=Ie(n,e).enabled;return r}var T=class{constructor(e){i(this,"fetch");i(this,"host");i(this,"projectKey");i(this,"requestTimeoutMs");this.fetch=c(e.fetch),this.host=p(e.host),this.projectKey=e.projectKey,this.requestTimeoutMs=e.requestTimeoutMs??1e4;}async fetchAll(e){let r=this.fetch;if(!r)throw new l("no fetch implementation available in this runtime");let n=`${this.host}/v1/flags?distinct_id=${encodeURIComponent(e)}`,s=f(),o=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{let a=await r(n,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:s?.signal});if(!a.ok)throw new l(`flags request failed with status ${a.status}`,a.status);return JSON.parse(await a.text()).flags??{}}finally{o!==void 0&&clearTimeout(o);}}async snapshot(){let e=this.fetch;if(!e)throw new l("no fetch implementation available in this runtime");let r=`${this.host}/v1/flags/snapshot`,n=f(),s=n?setTimeout(()=>n.abort(),this.requestTimeoutMs):void 0;try{let o=await e(r,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:n?.signal});if(!o.ok)throw new l(`flag snapshot request failed with status ${o.status}`,o.status);let a=JSON.parse(await o.text());return {flags:a.flags??[],generatedAt:a.generatedAt}}finally{s!==void 0&&clearTimeout(s);}}};var w=class{constructor(e,r,n){this.storage=e;this.ids=r;this.namespace=n;i(this,"anonymousId");i(this,"distinctId");i(this,"identified");let s=e.getItem(this.key("anonymous_id"));s?this.anonymousId=s:(this.anonymousId=r.uuid(),e.setItem(this.key("anonymous_id"),this.anonymousId));let o=e.getItem(this.key("distinct_id"));o?(this.distinctId=o,this.identified=true):(this.distinctId=this.anonymousId,this.identified=false);}getAnonymousId(){return this.anonymousId}getDistinctId(){return this.distinctId}isIdentified(){return this.identified}snapshot(){return {anonymousId:this.anonymousId,distinctId:this.distinctId,identified:this.identified}}identify(e){return this.identified&&this.distinctId===e?{changed:false}:(this.distinctId=e,this.identified=true,this.storage.setItem(this.key("distinct_id"),e),{changed:true})}reset(){this.anonymousId=this.ids.uuid(),this.distinctId=this.anonymousId,this.identified=false,this.storage.setItem(this.key("anonymous_id"),this.anonymousId),this.storage.removeItem(this.key("distinct_id"));}key(e){return `pdx.${this.namespace}.${e}`}};var S=class{constructor(e){i(this,"fetch");i(this,"host");i(this,"projectKey");i(this,"requestTimeoutMs");this.fetch=c(e.fetch),this.host=p(e.host),this.projectKey=e.projectKey,this.requestTimeoutMs=e.requestTimeoutMs??1e4;}async inbox(e){let r=this.requireFetch(),n=`${this.host}/v1/messages?distinct_id=${encodeURIComponent(e)}`,s=await this.request(r,n,{headers:this.authHeaders(),method:"GET"});if(!s.ok)throw new l(`inbox request failed with status ${s.status}`,s.status);return JSON.parse(await s.text()).messages??[]}async markRead(e,r){let n=this.requireFetch(),s=`${this.host}/v1/messages/read`,o=await this.request(n,s,{body:JSON.stringify({distinct_id:r,message_id:e}),headers:{...this.authHeaders(),"content-type":"application/json"},method:"POST"});if(!o.ok)throw new l(`mark-read request failed with status ${o.status}`,o.status)}requireFetch(){if(!this.fetch)throw new l("no fetch implementation available in this runtime");return this.fetch}authHeaders(){return {authorization:`Bearer ${this.projectKey}`}}async request(e,r,n){let s=f(),o=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{return await e(r,{...n,signal:s?.signal})}finally{o!==void 0&&clearTimeout(o);}}};var C=class{constructor(e,r){this.maxSize=e;this.onOverflow=r;i(this,"events",[]);}get size(){return this.events.length}enqueue(e){this.events.push(e),this.enforceCap();}restore(e){this.events.push(...e),this.enforceCap();}requeue(e){this.events.unshift(...e),this.enforceCap();}drain(e){let r=e===void 0?this.events.length:Math.min(e,this.events.length);return this.events.splice(0,r)}snapshot(){return [...this.events]}enforceCap(){if(this.events.length<=this.maxSize)return;let e=this.events.splice(0,this.events.length-this.maxSize);this.onOverflow?.({dropped:e});}};function re(t){return t>=400&&t<500&&t!==429}var b=class{constructor(e={}){i(this,"fetch");i(this,"maxRetries");i(this,"requestTimeoutMs");i(this,"baseDelayMs");i(this,"maxDelayMs");i(this,"sleep");i(this,"random");this.fetch=c(e.fetch),this.maxRetries=e.maxRetries??3,this.requestTimeoutMs=e.requestTimeoutMs??1e4,this.baseDelayMs=e.baseDelayMs??500,this.maxDelayMs=e.maxDelayMs??3e4,this.sleep=e.sleep??D,this.random=e.random??Math.random;}async send(e){let r=this.fetch;if(!r)throw new l("no fetch implementation available in this runtime");let n=JSON.stringify(e.body),s;for(let o=0;o<=this.maxRetries;o+=1){try{let a=await this.attempt(r,e,n);if(a.ok)return;if(re(a.status))throw new l(`ingest rejected batch with status ${a.status}`,a.status);s=new l(`ingest transient status ${a.status}`,a.status);}catch(a){if(a instanceof l&&a.status!==void 0&&re(a.status))throw a;s=a;}o<this.maxRetries&&await this.sleep(this.backoff(o));}throw new l("ingest delivery failed after retries",void 0,{cause:s})}async attempt(e,r,n){let s=f(),o=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{return await e(r.url,{body:n,headers:{authorization:`Bearer ${r.projectKey}`,"content-type":"application/json"},method:"POST",signal:s?.signal})}finally{o!==void 0&&clearTimeout(o);}}backoff(e){return Math.min(this.maxDelayMs,this.baseDelayMs*2**e)+this.random()*this.baseDelayMs}};var Te="queue",we=1e3,Se=3e4,P=class{constructor(e){i(this,"config");i(this,"identity");i(this,"queue");i(this,"transport");i(this,"flagsClient");i(this,"messagesClient");i(this,"context");i(this,"flushTimer");i(this,"flushing",false);i(this,"cachedFlags");i(this,"cachedSnapshot");this.config=W(e),this.identity=new w(this.config.storage,this.config.ids,this.config.namespace),this.queue=new C(this.config.maxQueueSize,({dropped:r})=>{this.config.onError(new h("queue_overflow",`event queue overflow: dropped ${r.length} oldest event(s)`));}),this.transport=this.config.transport??new b({maxRetries:this.config.maxRetries,requestTimeoutMs:this.config.requestTimeoutMs}),this.flagsClient=new T({host:this.config.flagsHost,projectKey:this.config.apiKey,requestTimeoutMs:this.config.requestTimeoutMs}),this.messagesClient=new S({host:this.config.flagsHost,projectKey:this.config.apiKey,requestTimeoutMs:this.config.requestTimeoutMs}),this.context={sdk:this.config.sdkName,sdk_version:this.config.sdkVersion},this.config.os&&(this.context.os=this.config.os),this.config.locale&&(this.context.locale=this.config.locale),this.restoreQueue(),this.startTimer();}get distinctId(){return this.identity.getDistinctId()}get anonymousId(){return this.identity.getAnonymousId()}capture(e,r={}){try{let n={...this.config.defaultProperties(),...r.properties??{}},s=G({context:this.context,distinctId:this.identity.getDistinctId(),eventName:e,properties:n,sessionId:r.sessionId,timestamp:r.timestamp},this.config.clock,this.config.ids);this.enqueue(s);}catch(n){this.config.onError(n);}}identify(e,r={}){let n=this.identity.getAnonymousId(),s=!this.identity.isIdentified(),o=this.identity.identify(e),a={};s&&o.changed&&(a.$anon_distinct_id=n),r.set&&(a.$set=r.set),this.capture("$identify",{properties:a});}alias(e){this.capture("$create_alias",{properties:{alias:e}});}group(e,r,n){let s={$group_key:r,$group_type:e};n&&(s.$set=n),this.capture("$group",{properties:s});}setPersonProperties(e,r){let n={};e&&(n.$set=e),r&&(n.$set_once=r),this.capture("$set",{properties:n});}async getAllFlags(){let e=this.identity.getDistinctId(),r=await this.flagsClient.fetchAll(e);return this.cachedFlags={distinctId:e,flags:r},r}async isFeatureEnabled(e){return (await this.getAllFlags())[e]??false}getCachedFlag(e){if(!(!this.cachedFlags||this.cachedFlags.distinctId!==this.distinctId))return this.cachedFlags.flags[e]}async getLocalFlags(e={}){let r=await this.flagSnapshot();return te(r.flags,{attributes:e.attributes,distinctId:this.identity.getDistinctId(),properties:e.properties})}async isFeatureEnabledLocal(e,r){return (await this.getLocalFlags(r))[e]??false}async flagSnapshot(){let e=this.config.clock.now().getTime();if(this.cachedSnapshot&&e-this.cachedSnapshot.fetchedAt<Se)return this.cachedSnapshot.snapshot;let r=await this.flagsClient.snapshot();return this.cachedSnapshot={fetchedAt:e,snapshot:r},r}async getInbox(){return this.messagesClient.inbox(this.identity.getDistinctId())}async markMessageRead(e){await this.messagesClient.markRead(e,this.identity.getDistinctId());}async flush(){if(this.flushing||this.queue.size===0)return;this.flushing=true;let e=this.queue.drain(we);try{await this.transport.send({body:{events:e,sent_at:E(this.config.clock.now())},projectKey:this.config.apiKey,url:`${this.config.host}/v1/events`}),this.persistQueue();}catch(r){this.queue.requeue(e),this.persistQueue(),this.config.onError(r);}finally{this.flushing=false;}}reset(){this.identity.reset(),this.cachedFlags=void 0,this.cachedSnapshot=void 0;}async shutdown(){this.stopTimer(),await this.flush();}enqueue(e){this.queue.enqueue(e),this.persistQueue(),this.queue.size>=this.config.flushAt&&this.flush();}persistQueue(){try{this.config.storage.setItem(this.persistKey(),JSON.stringify(this.queue.snapshot()));}catch(e){this.config.onError(e);}}restoreQueue(){try{let e=this.config.storage.getItem(this.persistKey());if(!e)return;let r=JSON.parse(e);Array.isArray(r)&&this.queue.restore(r);}catch(e){this.config.onError(e);}}startTimer(){if(this.config.flushIntervalMs<=0)return;let e=setInterval(()=>{this.flush();},this.config.flushIntervalMs),r=e;typeof r.unref=="function"&&r.unref(),this.flushTimer=e;}stopTimer(){this.flushTimer!==void 0&&(clearInterval(this.flushTimer),this.flushTimer=void 0);}persistKey(){return `pdx.${this.config.namespace}.${Te}`}};function ne(){return globalThis.location}function se(){return globalThis.document}function Ce(){return globalThis.window??globalThis}function Pe(t){return typeof t=="object"&&t!==null&&typeof t.tagName=="string"}function ie(){let t=ne(),e=se(),r={};return t&&(r.$current_url=t.href,r.$pathname=t.pathname,r.$host=t.host),e&&(e.title&&(r.$title=e.title),e.referrer&&(r.$referrer=e.referrer)),r}function Re(t){let e={$el_tag:t.tagName.toLowerCase(),$event_type:"click"},r=t.textContent?.trim();r&&(e.$el_text=r.slice(0,255)),t.id&&(e.$el_id=t.id),typeof t.className=="string"&&t.className&&(e.$el_classes=t.className);let n=t.getAttribute("href");return n&&(e.$el_href=n),e}function Ne(t){let e=globalThis.history,r=Ce(),n="",s=()=>{let u=ne(),d=u?`${u.pathname}${u.search}`:"";d!==n&&(n=d,t.capture("$pageview",{properties:ie()}));};if(s(),!e||!r)return ()=>{};let o=e.pushState.bind(e),a=e.replaceState.bind(e);return e.pushState=(...u)=>{o(...u),s();},e.replaceState=(...u)=>{a(...u),s();},r.addEventListener("popstate",s),()=>{e.pushState=o,e.replaceState=a,r.removeEventListener("popstate",s);}}function Fe(t){let e=se();if(!e)return ()=>{};let r=n=>{let s=n.target;Pe(s)&&t.capture("$autocapture",{properties:{...ie(),...Re(s)}});};return e.addEventListener("click",r,true),()=>e.removeEventListener("click",r,true)}function oe(t,e={}){let r=[];return (e.pageviews??true)&&r.push(Ne(t)),(e.clicks??true)&&r.push(Fe(t)),()=>{for(let n of r)n();}}function _e(){return globalThis.document?.visibilityState==="hidden"}function Me(t){let e=globalThis.navigator,r=globalThis.Blob;if(!e?.sendBeacon||!r)return false;let n=JSON.stringify({...t.body,api_key:t.projectKey});try{let s=new r([n],{type:"application/json"});return e.sendBeacon(t.url,s)}catch{return false}}var R=class{constructor(e={}){i(this,"fetchTransport");this.fetchTransport=new b(e);}async send(e){_e()&&Me(e)||await this.fetchTransport.send(e);}};var ae={maskAllInputs:true,maskAllText:false},Ae=new Set(["email","password","tel"]);function le(t){return t.replace(/\S/g,"*")}function N(t,e,r){return Le(e)||r.maskAllInputs?le(t):t}function F(t,e){return e.maskAllText?le(t):t}function Le(t){return Ae.has((t??"").toLowerCase())}var Oe=5e3,_=class{constructor(e){this.options=e;i(this,"buffer",[]);i(this,"seq",0);i(this,"maxEvents");this.maxEvents=Math.min(Math.max(1,e.maxEvents),Oe);}add(e){return this.buffer.push(e),this.buffer.length>=this.maxEvents?this.flush():null}flush(){if(this.buffer.length===0)return null;let e=this.buffer;this.buffer=[];let r={distinct_id:this.options.distinctId(),events:e,masked:this.options.masked,schema_version:1,seq:this.seq,session_id:this.options.sessionId,timestamp:new Date(this.options.now()).toISOString()};return this.seq+=1,r}};var $=1,q=3,$e=9,M=class{constructor(){i(this,"next",1);}allocate(){let e=this.next;return this.next+=1,e}},qe=new Set(["NOSCRIPT","SCRIPT"]);function A(t,e,r,n){if(t.nodeType===q){let s=e.allocate();return n?.(t,s),{id:s,textContent:F(t.textValue??"",r),type:"text"}}if(t.nodeType===$e){let s=e.allocate();return n?.(t,s),{childNodes:ue(t,e,r,n),id:s,type:"document"}}if(t.nodeType===$){let s=t.tagName??"";if(qe.has(s))return null;let o=e.allocate();return n?.(t,o),{attributes:De(t,r),childNodes:ue(t,e,r,n),id:o,tagName:s,type:"element"}}return null}function ue(t,e,r,n){let s=[];for(let o of t.childNodes??[]){let a=A(o,e,r,n);a&&s.push(a);}return s}function De(t,e){let r={};for(let n of t.attributes??[])r[n.name]=n.value;return t.inputValue!==void 0&&(r.value=N(t.inputValue,t.inputType,e)),r}async function pe(t,e){let r=`${p(e.replayHost)}/v1/replay`;return (await e.fetch(r,{body:JSON.stringify(t),headers:{authorization:`Bearer ${e.apiKey}`,"content-type":"application/json"},method:"POST"})).ok}var ce=new Set(["INPUT","SELECT","TEXTAREA"]),L=class{constructor(e){this.options=e;i(this,"allocator",new M);i(this,"mirror",new Map);i(this,"chunker");i(this,"fetchImpl");i(this,"observer");i(this,"timer");i(this,"started",false);this.chunker=new _({distinctId:e.distinctId,masked:e.mask.maskAllInputs,maxEvents:e.maxEvents,now:e.now,sessionId:e.sessionId}),this.fetchImpl=c(e.fetch);}start(){if(this.started)return;let e=Ke(),r=e?.documentElement;!e||!r||!this.fetchImpl||(this.started=true,this.captureFullSnapshot(r),this.observeMutations(r),this.observeInteractions(e),this.timer=setInterval(()=>this.upload(this.chunker.flush()),this.options.flushIntervalMs));}stop(){this.started&&(this.started=false,this.observer?.disconnect(),this.timer&&clearInterval(this.timer),this.upload(this.chunker.flush()));}captureFullSnapshot(e){let r=A(this.adapt(e),this.allocator,this.options.mask,(n,s)=>{let o=n.ref;o&&this.mirror.set(o,s);});r&&this.push(2,{node:r});}observeMutations(e){let r=globalThis.MutationObserver;r&&(this.observer=new r(n=>{for(let s of n)this.handleMutation(s);}),this.observer.observe(e,{attributes:true,characterData:true,childList:true,subtree:true}));}handleMutation(e){if(e.type==="characterData"){let r=this.mirror.get(e.target);r!==void 0&&this.push(3,{texts:[{id:r,value:F(e.target.textContent??"",this.options.mask)}]});return}if(e.type==="attributes"&&e.attributeName){let r=this.mirror.get(e.target),n=e.target;r!==void 0&&this.push(3,{attributes:[{attributes:{[e.attributeName]:n.getAttribute(e.attributeName)??""},id:r}]});return}if(e.type==="childList"){let r=this.mirror.get(e.target);if(r===void 0)return;for(let n of Array.from(e.addedNodes)){let s=A(this.adapt(n),this.allocator,this.options.mask,(o,a)=>{let u=o.ref;u&&this.mirror.set(u,a);});s&&this.push(3,{adds:[{node:s,parentId:r}]});}for(let n of Array.from(e.removedNodes)){let s=this.mirror.get(n);s!==void 0&&(this.push(3,{removes:[{id:s,parentId:r}]}),this.mirror.delete(n));}}}observeInteractions(e){e.addEventListener("input",r=>{let n=r.target;if(!n||!ce.has(n.tagName))return;let s=this.mirror.get(n);s!==void 0&&this.push(3,{input:{id:s,value:N(n.value??"",n.type,this.options.mask)}});},true),e.addEventListener("scroll",r=>{let n=r.target,s=n?this.mirror.get(n):void 0;this.push(3,{scroll:{id:s??0,x:n?.scrollLeft??0,y:n?.scrollTop??0}});},true);}adapt(e){let r={childNodes:[],nodeType:e.nodeType,ref:e};if(e.nodeType===q)return r.textValue=e.textContent??"",r;if(e.nodeType===$){let n=e;if(r.tagName=n.tagName,r.attributes=Array.from(n.attributes).map(s=>({name:s.name,value:s.value})),ce.has(n.tagName)){let s=n;r.inputType=s.type,r.inputValue=s.value??"";}}return r.childNodes=Array.from(e.childNodes).map(n=>this.adapt(n)),r}push(e,r){let n=this.chunker.add({data:r,timestamp:this.options.now(),type:e});n&&this.upload(n);}upload(e){!e||!this.fetchImpl||pe(e,{apiKey:this.options.apiKey,fetch:this.fetchImpl,replayHost:this.options.replayHost}).catch(r=>this.options.onError?.(r));}};function Ke(){return globalThis.document}function de(t){let e=new L({apiKey:t.apiKey,distinctId:t.distinctId,flushIntervalMs:t.flushIntervalMs??5e3,mask:{...ae,...t.mask},maxEvents:t.maxEvents??200,now:t.now??(()=>Date.now()),onError:t.onError,replayHost:t.replayHost,sessionId:t.sessionId??O()});return e.start(),e}function Ve(){return globalThis.navigator}function ze(t){let e=t?.userAgentData?.platform??t?.platform;return e?e.slice(0,50):void 0}function je(t){let e=()=>{t.flush();};globalThis.document?.addEventListener?.("visibilitychange",e),globalThis.addEventListener?.("pagehide",e);}function br(t){let{autocaptureOptions:e,replayHost:r,sessionReplay:n,sessionReplayOptions:s,...o}=t,a=Ve(),u={...o,locale:o.locale??(a?.language?a.language.slice(0,20):void 0),os:o.os??ze(a),storage:o.storage??K(),transport:o.transport??new R({maxRetries:o.maxRetries,requestTimeoutMs:o.requestTimeoutMs})},d=new P(u);return je(d),(t.autocapture??true)&&oe(d,e),n&&r&&de({apiKey:u.apiKey,distinctId:()=>d.distinctId,onError:u.onError,replayHost:r,...s}),d}exports.WebTransport=R;exports.createWebClient=br;exports.installAutocapture=oe;exports.installSessionReplay=de;//# sourceMappingURL=web.cjs.map
1
+ 'use strict';var Ce=Object.defineProperty;var Fe=(t,e,n)=>e in t?Ce(t,e,{enumerable:true,configurable:true,writable:true,value:n}):t[e]=n;var o=(t,e,n)=>Fe(t,typeof e!="symbol"?e+"":e,n);var f=class extends Error{constructor(n,r,s){super(r,s);o(this,"code");this.code=n,this.name="ProdantixError";}},b=class extends f{constructor(e){super("config",e),this.name="ConfigError";}},y=class extends f{constructor(n,r){super("validation",r);o(this,"field");this.field=n,this.name="ValidationError";}},c=class extends f{constructor(n,r,s){super("transport",n,s);o(this,"status");this.status=r,this.name="TransportError";}};function d(t){if(t)return t;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function h(){let t=globalThis.AbortController;return t?new t:void 0}var U=t=>new Promise(e=>{setTimeout(e,t);});function p(t){return t.replace(/\/+$/,"")}var v=class{constructor(){o(this,"store",new Map);}getItem(e){return this.store.get(e)??null}removeItem(e){this.store.delete(e);}setItem(e,n){this.store.set(e,n);}};function G(){try{let t=globalThis.localStorage;if(t){let e="__pdx_probe__";return t.setItem(e,"1"),t.removeItem(e),t}}catch{return new v}return new v}var B={now:()=>new Date};function E(t){return t.toISOString()}function Ne(){return globalThis.crypto}function _e(t){t[6]=t[6]&15|64,t[8]=t[8]&63|128;let e=[];for(let n=0;n<16;n+=1)e.push(t[n].toString(16).padStart(2,"0"));return `${e[0]}${e[1]}${e[2]}${e[3]}-${e[4]}${e[5]}-${e[6]}${e[7]}-${e[8]}${e[9]}-${e[10]}${e[11]}${e[12]}${e[13]}${e[14]}${e[15]}`}function q(){let t=Ne();if(t?.randomUUID)return t.randomUUID();let e=new Uint8Array(16);if(t?.getRandomValues)t.getRandomValues(e);else for(let n=0;n<16;n+=1)e[n]=Math.floor(Math.random()*256);return _e(e)}var J={uuid:q};var Pe=/^pdx_pub_(?:(?:live|test)_)?[a-z0-9]{32}$/;var Re=/^(?:\$|[a-z])[a-z0-9_.]*$/;function W(t){let e=0;for(let n of t)e+=1;return e}function Q(t){return Pe.test(t)}function Oe(t){return Re.test(t)}function X(t){let e=W(t);if(e<1||e>200)throw new y("distinct_id","distinct_id must be between 1 and 200 characters")}function Y(t){let e=W(t);if(e<1||e>200)throw new y("event_name","event_name must be between 1 and 200 characters");if(!Oe(t))throw new y("event_name","event_name must match /^(\\$|[a-z])[a-z0-9_.]*$/")}var Z="prodantix-js",ee="0.0.1";var Ae=t=>{};function te(t){if(!t.apiKey||!Q(t.apiKey))throw new b("apiKey must be a public project key of the form pdx_pub_<32 lowercase alphanumerics>");if(!t.host)throw new b("host is required (the ingest base URL)");let e=p(t.host),n=t.defaultProperties;return {apiKey:t.apiKey,autocapture:t.autocapture??false,clock:t.clock??B,defaultProperties:typeof n=="function"?n:()=>n??{},flagsHost:t.flagsHost?p(t.flagsHost):e,flushAt:t.flushAt??20,flushIntervalMs:t.flushIntervalMs??1e4,host:e,ids:t.ids??J,locale:t.locale,maxQueueSize:t.maxQueueSize??1e3,maxRetries:t.maxRetries??3,namespace:t.apiKey.slice(0,16),onError:t.onError??Ae,os:t.os,requestTimeoutMs:t.requestTimeoutMs??1e4,sdkName:t.sdkName??Z,sdkVersion:t.sdkVersion??ee,socketFactory:t.socketFactory,storage:t.storage??new v,streamFlags:t.streamFlags??false,transport:t.transport}}function ne(t,e,n){Y(t.eventName),X(t.distinctId);let r={distinct_id:t.distinctId,event_id:t.eventId??n.uuid(),event_name:t.eventName,properties:t.properties??{},schema_version:1,timestamp:E(t.timestamp??e.now())};return t.context&&(r.context=t.context),t.sessionId&&(r.session_id=t.sessionId),r}var g=Symbol("absent");function Le(t,e){if(t==="distinct_id")return e.distinctId;let n=e.properties??{};if(Object.prototype.hasOwnProperty.call(n,t))return n[t];let r=e.attributes??{};return Object.prototype.hasOwnProperty.call(r,t)?r[t]:g}function m(t){return t===g?"undefined":String(t)}function re(t){return t===g?Number.NaN:Number(t)}function se(t){return t!==g&&t!==null&&t!==""}function ie(t,e){if(!Array.isArray(e))return false;let n=m(t);return e.map(r=>String(r)).includes(n)}function oe(t,e){let n=Le(t.attribute,e),r=t.value;switch(t.op){case "is_set":return se(n);case "is_not_set":return !se(n);case "eq":return m(n)===m(r===void 0?g:r);case "neq":return m(n)!==m(r===void 0?g:r);case "contains":return m(n).includes(m(r===void 0?g:r));case "in":return ie(n,r);case "not_in":return Array.isArray(r)?!ie(n,r):false;case "gt":return T(n,r,(s,i)=>s>i);case "gte":return T(n,r,(s,i)=>s>=i);case "lt":return T(n,r,(s,i)=>s<i);case "lte":return T(n,r,(s,i)=>s<=i);case "in_cohort":return typeof r=="string"&&r!==""&&(e.cohorts??[]).includes(r);case "not_in_cohort":return typeof r=="string"&&r!==""&&!(e.cohorts??[]).includes(r);default:return false}}function T(t,e,n){let r=re(t),s=e===void 0?Number.NaN:re(e);return Number.isNaN(r)||Number.isNaN(s)?false:n(r,s)}function ae(t,e){let n=`${t}:${e}`,r=2166136261;for(let s=0;s<n.length;s++)r^=n.charCodeAt(s),r=Math.imul(r,16777619);return (r>>>0)%100}function K(t,e){return t.targeting.length===0||t.targeting.every(n=>oe(n,e))}function le(t,e){let n=ae(t.key,e.distinctId),r=t.variations??[];if(r.length===0)return t.rolloutPercentage>=100||n<t.rolloutPercentage?"true":"false";let s=0;for(let i=r.length-1;i>=0;i--)if(s+=r[i].weight,n<s)return r[i].key;return r[0].key}function D(t,e,n,r){for(let s of t.prerequisites??[]){if(r.includes(s.flagKey))return false;let i=e.find(l=>l.key===s.flagKey);if(!i||!i.enabled)return false;r.push(i.key);let a=D(i,e,n,r)&&K(i,n)&&le(i,n)===s.variationKey;if(r.pop(),!a)return false}return true}function S(t,e,n){return t.enabled?D(t,e,n,[t.key])?K(t,n)?t.rolloutPercentage>=100?{enabled:true,reason:"rollout_full"}:ae(t.key,n.distinctId)<t.rolloutPercentage?{enabled:true,reason:"rollout"}:{enabled:false,reason:"rollout_excluded"}:{enabled:false,reason:"targeting"}:{enabled:false,reason:"prerequisite"}:{enabled:false,reason:"disabled"}}function ce(t,e){let n={};for(let r of t)n[r.key]=S(r,t,e).enabled;return n}function V(t,e,n){let r=t.variations??[],s=r[0];if(!s)return null;if(!t.enabled||!D(t,e,n,[t.key])||!K(t,n))return s;let i=le(t,n);return r.find(a=>a.key===i)??s}function ue(t){return t.some(e=>e.targeting.some(n=>n.op==="in_cohort"||n.op==="not_in_cohort"))}function pe(t){return `40${JSON.stringify(t)}`}function de(){return "3"}function he(t){let e=t.charAt(0),n=t.slice(1);if(e==="2")return {kind:"ping"};if(e==="1")return {kind:"disconnect"};if(e==="0"){let a=j(n);return {kind:"open",pingInterval:typeof a?.pingInterval=="number"?a.pingInterval:25e3,pingTimeout:typeof a?.pingTimeout=="number"?a.pingTimeout:2e4}}if(e!=="4")return {kind:"other"};let r=n.charAt(0),s=n.slice(1);if(r==="0")return {kind:"connected"};if(r==="1")return {kind:"disconnect"};if(r==="4"){let a=j(s);return {kind:"connectError",message:typeof a?.message=="string"?a.message:"refused"}}if(r!=="2")return {kind:"other"};let i=j(s);return !Array.isArray(i)||typeof i[0]!="string"?{kind:"other"}:{kind:"event",name:i[0],payload:i[1]}}function j(t){try{return JSON.parse(t)}catch{return null}}var Me="/socket.io/?EIO=4&transport=websocket",$e=250,w=class{constructor(e){this.options=e;o(this,"socket",null);o(this,"heartbeat",null);o(this,"pending",null);o(this,"lastKey","");o(this,"ready",false);o(this,"closed",false);o(this,"heartbeatWindow",45e3);o(this,"factory");o(this,"setTimer");o(this,"clearTimer");this.factory=e.socketFactory??qe,this.setTimer=e.setTimer??((n,r)=>setTimeout(n,r)),this.clearTimer=e.clearTimer??(n=>clearTimeout(n));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${Me}`,n;try{n=this.factory(e);}catch{this.options.onClosed(false);return}this.socket=n,n.onmessage=r=>this.receive(String(r.data)),n.onerror=()=>n.close(),n.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat(),this.pending!==null&&this.clearTimer(this.pending),this.pending=null;let e=this.socket;this.socket=null,e?.close();}receive(e){let n=he(e);if(n.kind==="open"){this.armHeartbeat(n.pingInterval+n.pingTimeout),this.socket?.send(pe({projectKey:this.options.projectKey}));return}if(n.kind==="ping"){this.armHeartbeat(),this.socket?.send(de());return}if(n.kind==="connectError"||n.kind==="disconnect"){this.stopHeartbeat(),this.socket?.close();return}if(n.kind==="event"){if(n.name==="ready"){this.ready=true;return}if(n.name==="flagChange"){let r=n.payload?.key;this.lastKey=typeof r=="string"?r:"",this.pending===null&&(this.pending=this.setTimer(()=>{this.pending=null,this.options.onChange(this.lastKey);},$e));}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>this.socket?.close(),this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function qe(t){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(t)}var I=class{constructor(e){o(this,"fetch");o(this,"host");o(this,"projectKey");o(this,"requestTimeoutMs");this.fetch=d(e.fetch),this.host=p(e.host),this.projectKey=e.projectKey,this.requestTimeoutMs=e.requestTimeoutMs??1e4;}async fetchAll(e){return (await this.fetchDecisions(e)).flags}async fetchDecisions(e){let n=this.fetch;if(!n)throw new c("no fetch implementation available in this runtime");let r=`${this.host}/v1/flags?distinct_id=${encodeURIComponent(e)}`,s=h(),i=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{let a=await n(r,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:s?.signal});if(!a.ok)throw new c(`flags request failed with status ${a.status}`,a.status);let l=JSON.parse(await a.text());return {flags:l.flags??{},variants:l.variants??{}}}finally{i!==void 0&&clearTimeout(i);}}async snapshot(){let e=this.fetch;if(!e)throw new c("no fetch implementation available in this runtime");let n=`${this.host}/v1/flags/snapshot`,r=h(),s=r?setTimeout(()=>r.abort(),this.requestTimeoutMs):void 0;try{let i=await e(n,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:r?.signal});if(!i.ok)throw new c(`flag snapshot request failed with status ${i.status}`,i.status);let a=JSON.parse(await i.text()),l={flags:a.flags??[],generatedAt:a.generatedAt};return typeof a.socketUrl=="string"&&a.socketUrl!==""&&(l.socketUrl=a.socketUrl),l}finally{s!==void 0&&clearTimeout(s);}}async memberships(e){let n=this.fetch;if(!n)throw new c("no fetch implementation available in this runtime");let r=`${this.host}/v1/flags/memberships?distinct_id=${encodeURIComponent(e)}`,s=h(),i=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{let a=await n(r,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:s?.signal});if(!a.ok)throw new c(`memberships request failed with status ${a.status}`,a.status);return JSON.parse(await a.text()).cohorts??[]}finally{i!==void 0&&clearTimeout(i);}}};var C=class{constructor(e,n,r){this.storage=e;this.ids=n;this.namespace=r;o(this,"anonymousId");o(this,"distinctId");o(this,"identified");let s=e.getItem(this.key("anonymous_id"));s?this.anonymousId=s:(this.anonymousId=n.uuid(),e.setItem(this.key("anonymous_id"),this.anonymousId));let i=e.getItem(this.key("distinct_id"));i?(this.distinctId=i,this.identified=true):(this.distinctId=this.anonymousId,this.identified=false);}getAnonymousId(){return this.anonymousId}getDistinctId(){return this.distinctId}isIdentified(){return this.identified}snapshot(){return {anonymousId:this.anonymousId,distinctId:this.distinctId,identified:this.identified}}identify(e){return this.identified&&this.distinctId===e?{changed:false}:(this.distinctId=e,this.identified=true,this.storage.setItem(this.key("distinct_id"),e),{changed:true})}reset(){this.anonymousId=this.ids.uuid(),this.distinctId=this.anonymousId,this.identified=false,this.storage.setItem(this.key("anonymous_id"),this.anonymousId),this.storage.removeItem(this.key("distinct_id"));}key(e){return `pdx.${this.namespace}.${e}`}};var F=class{constructor(e){o(this,"fetch");o(this,"host");o(this,"projectKey");o(this,"requestTimeoutMs");this.fetch=d(e.fetch),this.host=p(e.host),this.projectKey=e.projectKey,this.requestTimeoutMs=e.requestTimeoutMs??1e4;}async inbox(e){let n=this.requireFetch(),r=`${this.host}/v1/messages?distinct_id=${encodeURIComponent(e)}`,s=await this.request(n,r,{headers:this.authHeaders(),method:"GET"});if(!s.ok)throw new c(`inbox request failed with status ${s.status}`,s.status);return JSON.parse(await s.text()).messages??[]}async markRead(e,n){let r=this.requireFetch(),s=`${this.host}/v1/messages/read`,i=await this.request(r,s,{body:JSON.stringify({distinct_id:n,message_id:e}),headers:{...this.authHeaders(),"content-type":"application/json"},method:"POST"});if(!i.ok)throw new c(`mark-read request failed with status ${i.status}`,i.status)}requireFetch(){if(!this.fetch)throw new c("no fetch implementation available in this runtime");return this.fetch}authHeaders(){return {authorization:`Bearer ${this.projectKey}`}}async request(e,n,r){let s=h(),i=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{return await e(n,{...r,signal:s?.signal})}finally{i!==void 0&&clearTimeout(i);}}};var N=class{constructor(e,n){this.maxSize=e;this.onOverflow=n;o(this,"events",[]);}get size(){return this.events.length}enqueue(e){this.events.push(e),this.enforceCap();}restore(e){this.events.push(...e),this.enforceCap();}requeue(e){this.events.unshift(...e),this.enforceCap();}drain(e){let n=e===void 0?this.events.length:Math.min(e,this.events.length);return this.events.splice(0,n)}snapshot(){return [...this.events]}enforceCap(){if(this.events.length<=this.maxSize)return;let e=this.events.splice(0,this.events.length-this.maxSize);this.onOverflow?.({dropped:e});}};function fe(t){return t>=400&&t<500&&t!==429}var k=class{constructor(e={}){o(this,"fetch");o(this,"maxRetries");o(this,"requestTimeoutMs");o(this,"baseDelayMs");o(this,"maxDelayMs");o(this,"sleep");o(this,"random");this.fetch=d(e.fetch),this.maxRetries=e.maxRetries??3,this.requestTimeoutMs=e.requestTimeoutMs??1e4,this.baseDelayMs=e.baseDelayMs??500,this.maxDelayMs=e.maxDelayMs??3e4,this.sleep=e.sleep??U,this.random=e.random??Math.random;}async send(e){let n=this.fetch;if(!n)throw new c("no fetch implementation available in this runtime");let r=JSON.stringify(e.body),s;for(let i=0;i<=this.maxRetries;i+=1){try{let a=await this.attempt(n,e,r);if(a.ok)return;if(fe(a.status))throw new c(`ingest rejected batch with status ${a.status}`,a.status);s=new c(`ingest transient status ${a.status}`,a.status);}catch(a){if(a instanceof c&&a.status!==void 0&&fe(a.status))throw a;s=a;}i<this.maxRetries&&await this.sleep(this.backoff(i));}throw new c("ingest delivery failed after retries",void 0,{cause:s})}async attempt(e,n,r){let s=h(),i=s?setTimeout(()=>s.abort(),this.requestTimeoutMs):void 0;try{return await e(n.url,{body:r,headers:{authorization:`Bearer ${n.projectKey}`,"content-type":"application/json"},method:"POST",signal:s?.signal})}finally{i!==void 0&&clearTimeout(i);}}backoff(e){return Math.min(this.maxDelayMs,this.baseDelayMs*2**e)+this.random()*this.baseDelayMs}};var Ke="queue",De=1e3,me=3e4,ge=t=>{let e={};return t.avatar!==void 0&&(e.$avatar=t.avatar),t.email!==void 0&&(e.$email=t.email),t.name!==void 0&&(e.$name=t.name),t.phone!==void 0&&(e.$phone=t.phone),e},_=class{constructor(e){o(this,"config");o(this,"identity");o(this,"queue");o(this,"transport");o(this,"flagsClient");o(this,"messagesClient");o(this,"context");o(this,"flushTimer");o(this,"flushing",false);o(this,"cachedFlags");o(this,"cachedSnapshot");o(this,"membershipCache");o(this,"stream");o(this,"shutDown",false);o(this,"exposures",new Set);this.config=te(e),this.identity=new C(this.config.storage,this.config.ids,this.config.namespace),this.queue=new N(this.config.maxQueueSize,({dropped:n})=>{this.config.onError(new f("queue_overflow",`event queue overflow: dropped ${n.length} oldest event(s)`));}),this.transport=this.config.transport??new k({maxRetries:this.config.maxRetries,requestTimeoutMs:this.config.requestTimeoutMs}),this.flagsClient=new I({host:this.config.flagsHost,projectKey:this.config.apiKey,requestTimeoutMs:this.config.requestTimeoutMs}),this.messagesClient=new F({host:this.config.flagsHost,projectKey:this.config.apiKey,requestTimeoutMs:this.config.requestTimeoutMs}),this.context={sdk:this.config.sdkName,sdk_version:this.config.sdkVersion},this.config.os&&(this.context.os=this.config.os),this.config.locale&&(this.context.locale=this.config.locale),this.restoreQueue(),this.startTimer();}get distinctId(){return this.identity.getDistinctId()}get anonymousId(){return this.identity.getAnonymousId()}capture(e,n={}){try{let r={...this.config.defaultProperties(),...n.properties??{}},s=ne({context:this.context,distinctId:this.identity.getDistinctId(),eventName:e,properties:r,sessionId:n.sessionId,timestamp:n.timestamp},this.config.clock,this.config.ids);this.enqueue(s);}catch(r){this.config.onError(r);}}identify(e,n={}){let r=this.identity.getAnonymousId(),s=!this.identity.isIdentified(),i=this.identity.identify(e),a={};s&&i.changed&&(a.$anon_distinct_id=r);let l={...ge(n.traits??{}),...n.set??{}};Object.keys(l).length>0&&(a.$set=l),this.capture("$identify",{properties:a});}alias(e){this.capture("$create_alias",{properties:{alias:e}});}group(e,n,r){let s={$group_key:n,$group_type:e};r&&(s.$set=r),this.capture("$group",{properties:s});}setPersonProperties(e,n){let r={};e&&(r.$set=e),n&&(r.$set_once=n),this.capture("$set",{properties:r});}setPersonTraits(e){let n=ge(e);Object.keys(n).length!==0&&this.capture("$set",{properties:{$set:n}});}async getAllFlags(){let e=this.identity.getDistinctId(),n=await this.flagsClient.fetchDecisions(e);return this.cachedFlags={distinctId:e,flags:n.flags,variants:n.variants??{}},n.flags}async isFeatureEnabled(e){let r=(await this.getAllFlags())[e]??false;return this.recordExposure(e,this.cachedFlags?.variants[e]?.key??String(r)),r}async getVariant(e){let n=await this.getAllFlags(),r=this.cachedFlags?.variants[e]??null;return this.recordExposure(e,r?.key??String(n[e]??false)),r}async getVariantLocal(e,n={}){let r=await this.flagSnapshot(),s=r.flags.find(u=>u.key===e),i=await this.localContext(n,r.flags),a=s?V(s,r.flags,i):null,l=s?S(s,r.flags,i).enabled:false;return this.recordExposure(e,a?.key??String(l)),a?{key:a.key,value:a.value}:null}recordExposure(e,n){let r=`${this.identity.getDistinctId()} ${e} ${n}`;this.exposures.has(r)||(this.exposures.add(r),this.capture("$feature_flag_called",{properties:{$feature_flag:e,$feature_flag_response:n}}));}getCachedFlag(e){if(!(!this.cachedFlags||this.cachedFlags.distinctId!==this.distinctId))return this.cachedFlags.flags[e]}async getLocalFlags(e={}){let n=await this.flagSnapshot();return ce(n.flags,await this.localContext(e,n.flags))}async isFeatureEnabledLocal(e,n={}){let r=await this.flagSnapshot(),s=r.flags.find(l=>l.key===e),i=await this.localContext(n,r.flags),a=s?S(s,r.flags,i).enabled:false;return this.recordExposure(e,(s?V(s,r.flags,i)?.key:void 0)??String(a)),a}async localContext(e,n){let r=this.identity.getDistinctId(),s=e.cohorts;if(s===void 0&&ue(n)){let i=this.config.clock.now().getTime();this.membershipCache&&this.membershipCache.distinctId===r&&i-this.membershipCache.fetchedAt<me?s=this.membershipCache.cohorts:(s=await this.flagsClient.memberships(r),this.membershipCache={cohorts:s,distinctId:r,fetchedAt:i});}return {attributes:e.attributes,cohorts:s,distinctId:r,properties:e.properties}}async flagSnapshot(){let e=this.config.clock.now().getTime();if(this.cachedSnapshot&&e-this.cachedSnapshot.fetchedAt<me)return this.cachedSnapshot.snapshot;let n=await this.flagsClient.snapshot();return this.cachedSnapshot={fetchedAt:e,snapshot:n},this.maybeStream(n),n}maybeStream(e){if(!this.config.streamFlags||this.shutDown||this.stream||!e.socketUrl)return;let n=new w({host:e.socketUrl,onChange:()=>{this.cachedSnapshot=void 0,this.flagSnapshot().catch(r=>this.config.onError(r));},onClosed:r=>{this.stream=void 0,r&&this.maybeStream(e);},projectKey:this.config.apiKey,socketFactory:this.config.socketFactory});this.stream=n,n.open();}async getInbox(){return this.messagesClient.inbox(this.identity.getDistinctId())}async markMessageRead(e){await this.messagesClient.markRead(e,this.identity.getDistinctId());}async flush(){if(this.flushing||this.queue.size===0)return;this.flushing=true;let e=this.queue.drain(De);try{await this.transport.send({body:{events:e,sent_at:E(this.config.clock.now())},projectKey:this.config.apiKey,url:`${this.config.host}/v1/events`}),this.persistQueue();}catch(n){this.queue.requeue(e),this.persistQueue(),this.config.onError(n);}finally{this.flushing=false;}}reset(){this.identity.reset(),this.cachedFlags=void 0,this.cachedSnapshot=void 0,this.membershipCache=void 0;}async shutdown(){this.shutDown=true,this.stopTimer(),this.stream?.close(),this.stream=void 0,await this.flush();}enqueue(e){this.queue.enqueue(e),this.persistQueue(),this.queue.size>=this.config.flushAt&&this.flush();}persistQueue(){try{this.config.storage.setItem(this.persistKey(),JSON.stringify(this.queue.snapshot()));}catch(e){this.config.onError(e);}}restoreQueue(){try{let e=this.config.storage.getItem(this.persistKey());if(!e)return;let n=JSON.parse(e);Array.isArray(n)&&this.queue.restore(n);}catch(e){this.config.onError(e);}}startTimer(){if(this.config.flushIntervalMs<=0)return;let e=setInterval(()=>{this.flush();},this.config.flushIntervalMs),n=e;typeof n.unref=="function"&&n.unref(),this.flushTimer=e;}stopTimer(){this.flushTimer!==void 0&&(clearInterval(this.flushTimer),this.flushTimer=void 0);}persistKey(){return `pdx.${this.config.namespace}.${Ke}`}};function ye(){return globalThis.location}function ve(){return globalThis.document}function Ve(){return globalThis.window??globalThis}function je(t){return typeof t=="object"&&t!==null&&typeof t.tagName=="string"}function ke(){let t=ye(),e=ve(),n={};return t&&(n.$current_url=t.href,n.$pathname=t.pathname,n.$host=t.host),e&&(e.title&&(n.$title=e.title),e.referrer&&(n.$referrer=e.referrer)),n}function He(t){let e={$el_tag:t.tagName.toLowerCase(),$event_type:"click"},n=t.textContent?.trim();n&&(e.$el_text=n.slice(0,255)),t.id&&(e.$el_id=t.id),typeof t.className=="string"&&t.className&&(e.$el_classes=t.className);let r=t.getAttribute("href");return r&&(e.$el_href=r),e}function ze(t){let e=globalThis.history,n=Ve(),r="",s=()=>{let l=ye(),u=l?`${l.pathname}${l.search}`:"";u!==r&&(r=u,t.capture("$pageview",{properties:ke()}));};if(s(),!e||!n)return ()=>{};let i=e.pushState.bind(e),a=e.replaceState.bind(e);return e.pushState=(...l)=>{i(...l),s();},e.replaceState=(...l)=>{a(...l),s();},n.addEventListener("popstate",s),()=>{e.pushState=i,e.replaceState=a,n.removeEventListener("popstate",s);}}function Ue(t){let e=ve();if(!e)return ()=>{};let n=r=>{let s=r.target;je(s)&&t.capture("$autocapture",{properties:{...ke(),...He(s)}});};return e.addEventListener("click",n,true),()=>e.removeEventListener("click",n,true)}function be(t,e={}){let n=[];return (e.pageviews??true)&&n.push(ze(t)),(e.clicks??true)&&n.push(Ue(t)),()=>{for(let r of n)r();}}function Ge(){return globalThis.document?.visibilityState==="hidden"}function Be(t){let e=globalThis.navigator,n=globalThis.Blob;if(!e?.sendBeacon||!n)return false;let r=JSON.stringify({...t.body,api_key:t.projectKey});try{let s=new n([r],{type:"application/json"});return e.sendBeacon(t.url,s)}catch{return false}}var P=class{constructor(e={}){o(this,"fetchTransport");this.fetchTransport=new k(e);}async send(e){Ge()&&Be(e)||await this.fetchTransport.send(e);}};var xe={maskAllInputs:true,maskAllText:false},Je=new Set(["email","password","tel"]);function Ee(t){return t.replace(/\S/g,"*")}function R(t,e,n){return We(e)||n.maskAllInputs?Ee(t):t}function O(t,e){return e.maskAllText?Ee(t):t}function We(t){return Je.has((t??"").toLowerCase())}var Qe=5e3,A=class{constructor(e){this.options=e;o(this,"buffer",[]);o(this,"seq",0);o(this,"maxEvents");this.maxEvents=Math.min(Math.max(1,e.maxEvents),Qe);}add(e){return this.buffer.push(e),this.buffer.length>=this.maxEvents?this.flush():null}flush(){if(this.buffer.length===0)return null;let e=this.buffer;this.buffer=[];let n={distinct_id:this.options.distinctId(),events:e,masked:this.options.masked,schema_version:1,seq:this.seq,session_id:this.options.sessionId,timestamp:new Date(this.options.now()).toISOString()};return this.seq+=1,n}};var H=1,z=3,Xe=9,L=class{constructor(){o(this,"next",1);}allocate(){let e=this.next;return this.next+=1,e}},Ye=new Set(["NOSCRIPT","SCRIPT"]);function M(t,e,n,r){if(t.nodeType===z){let s=e.allocate();return r?.(t,s),{id:s,textContent:O(t.textValue??"",n),type:"text"}}if(t.nodeType===Xe){let s=e.allocate();return r?.(t,s),{childNodes:Te(t,e,n,r),id:s,type:"document"}}if(t.nodeType===H){let s=t.tagName??"";if(Ye.has(s))return null;let i=e.allocate();return r?.(t,i),{attributes:Ze(t,n),childNodes:Te(t,e,n,r),id:i,tagName:s,type:"element"}}return null}function Te(t,e,n,r){let s=[];for(let i of t.childNodes??[]){let a=M(i,e,n,r);a&&s.push(a);}return s}function Ze(t,e){let n={};for(let r of t.attributes??[])n[r.name]=r.value;return t.inputValue!==void 0&&(n.value=R(t.inputValue,t.inputType,e)),n}async function Se(t,e){let n=`${p(e.replayHost)}/v1/replay`;return (await e.fetch(n,{body:JSON.stringify(t),headers:{authorization:`Bearer ${e.apiKey}`,"content-type":"application/json"},method:"POST"})).ok}var we=new Set(["INPUT","SELECT","TEXTAREA"]),$=class{constructor(e){this.options=e;o(this,"allocator",new L);o(this,"mirror",new Map);o(this,"chunker");o(this,"fetchImpl");o(this,"observer");o(this,"timer");o(this,"started",false);this.chunker=new A({distinctId:e.distinctId,masked:e.mask.maskAllInputs,maxEvents:e.maxEvents,now:e.now,sessionId:e.sessionId}),this.fetchImpl=d(e.fetch);}start(){if(this.started)return;let e=et(),n=e?.documentElement;!e||!n||!this.fetchImpl||(this.started=true,this.captureFullSnapshot(n),this.observeMutations(n),this.observeInteractions(e),this.timer=setInterval(()=>this.upload(this.chunker.flush()),this.options.flushIntervalMs));}stop(){this.started&&(this.started=false,this.observer?.disconnect(),this.timer&&clearInterval(this.timer),this.upload(this.chunker.flush()));}captureFullSnapshot(e){let n=M(this.adapt(e),this.allocator,this.options.mask,(r,s)=>{let i=r.ref;i&&this.mirror.set(i,s);});n&&this.push(2,{node:n});}observeMutations(e){let n=globalThis.MutationObserver;n&&(this.observer=new n(r=>{for(let s of r)this.handleMutation(s);}),this.observer.observe(e,{attributes:true,characterData:true,childList:true,subtree:true}));}handleMutation(e){if(e.type==="characterData"){let n=this.mirror.get(e.target);n!==void 0&&this.push(3,{texts:[{id:n,value:O(e.target.textContent??"",this.options.mask)}]});return}if(e.type==="attributes"&&e.attributeName){let n=this.mirror.get(e.target),r=e.target;n!==void 0&&this.push(3,{attributes:[{attributes:{[e.attributeName]:r.getAttribute(e.attributeName)??""},id:n}]});return}if(e.type==="childList"){let n=this.mirror.get(e.target);if(n===void 0)return;for(let r of Array.from(e.addedNodes)){let s=M(this.adapt(r),this.allocator,this.options.mask,(i,a)=>{let l=i.ref;l&&this.mirror.set(l,a);});s&&this.push(3,{adds:[{node:s,parentId:n}]});}for(let r of Array.from(e.removedNodes)){let s=this.mirror.get(r);s!==void 0&&(this.push(3,{removes:[{id:s,parentId:n}]}),this.mirror.delete(r));}}}observeInteractions(e){e.addEventListener("input",n=>{let r=n.target;if(!r||!we.has(r.tagName))return;let s=this.mirror.get(r);s!==void 0&&this.push(3,{input:{id:s,value:R(r.value??"",r.type,this.options.mask)}});},true),e.addEventListener("scroll",n=>{let r=n.target,s=r?this.mirror.get(r):void 0;this.push(3,{scroll:{id:s??0,x:r?.scrollLeft??0,y:r?.scrollTop??0}});},true);}adapt(e){let n={childNodes:[],nodeType:e.nodeType,ref:e};if(e.nodeType===z)return n.textValue=e.textContent??"",n;if(e.nodeType===H){let r=e;if(n.tagName=r.tagName,n.attributes=Array.from(r.attributes).map(s=>({name:s.name,value:s.value})),we.has(r.tagName)){let s=r;n.inputType=s.type,n.inputValue=s.value??"";}}return n.childNodes=Array.from(e.childNodes).map(r=>this.adapt(r)),n}push(e,n){let r=this.chunker.add({data:n,timestamp:this.options.now(),type:e});r&&this.upload(r);}upload(e){!e||!this.fetchImpl||Se(e,{apiKey:this.options.apiKey,fetch:this.fetchImpl,replayHost:this.options.replayHost}).catch(n=>this.options.onError?.(n));}};function et(){return globalThis.document}function Ie(t){let e=new $({apiKey:t.apiKey,distinctId:t.distinctId,flushIntervalMs:t.flushIntervalMs??5e3,mask:{...xe,...t.mask},maxEvents:t.maxEvents??200,now:t.now??(()=>Date.now()),onError:t.onError,replayHost:t.replayHost,sessionId:t.sessionId??q()});return e.start(),e}function tt(){return globalThis.navigator}function nt(t){let e=t?.userAgentData?.platform??t?.platform;return e?e.slice(0,50):void 0}function rt(t){let e=()=>{t.flush();};globalThis.document?.addEventListener?.("visibilitychange",e),globalThis.addEventListener?.("pagehide",e);}function Kn(t){let{autocaptureOptions:e,replayHost:n,sessionReplay:r,sessionReplayOptions:s,...i}=t,a=tt(),l={...i,locale:i.locale??(a?.language?a.language.slice(0,20):void 0),os:i.os??nt(a),storage:i.storage??G(),transport:i.transport??new P({maxRetries:i.maxRetries,requestTimeoutMs:i.requestTimeoutMs})},u=new _(l);return rt(u),(t.autocapture??true)&&be(u,e),r&&n&&Ie({apiKey:l.apiKey,distinctId:()=>u.distinctId,onError:l.onError,replayHost:n,...s}),u}exports.WebTransport=P;exports.createWebClient=Kn;exports.installAutocapture=be;exports.installSessionReplay=Ie;//# sourceMappingURL=web.cjs.map
2
2
  //# sourceMappingURL=web.cjs.map
package/dist/web.d.cts CHANGED
@@ -1,5 +1,7 @@
1
- import { P as ProdantixClient, T as Transport, i as TransportRequest, h as ProdantixConfig } from './client-B1bcIuD8.cjs';
2
- import { b as FetchTransportOptions, F as FetchLike } from './transport-B3PxeUxW.cjs';
1
+ import { P as ProdantixClient } from './client-y1xyVF6C.cjs';
2
+ import { T as Transport, h as TransportRequest, P as ProdantixConfig } from './types-68Sc11g8.cjs';
3
+ import { a as FetchTransportOptions } from './transport-Bj4nXmgt.cjs';
4
+ import { F as FetchLike } from './http-BCh716Vs.cjs';
3
5
 
4
6
  interface AutocaptureOptions {
5
7
  clicks?: boolean;
package/dist/web.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { P as ProdantixClient, T as Transport, i as TransportRequest, h as ProdantixConfig } from './client-B1bcIuD8.js';
2
- import { b as FetchTransportOptions, F as FetchLike } from './transport-By6wsdny.js';
1
+ import { P as ProdantixClient } from './client-Ca6xJESF.js';
2
+ import { T as Transport, h as TransportRequest, P as ProdantixConfig } from './types-68Sc11g8.js';
3
+ import { a as FetchTransportOptions } from './transport-CTPih3Jj.js';
4
+ import { F as FetchLike } from './http-BCh716Vs.js';
3
5
 
4
6
  interface AutocaptureOptions {
5
7
  clicks?: boolean;
package/dist/web.js CHANGED
@@ -1,2 +1,2 @@
1
- import {a,s,j as j$1,i,t,f as f$1,g as g$1}from'./chunk-FIZWZVZG.js';function w(){return globalThis.location}function S(){return globalThis.document}function D(){return globalThis.window??globalThis}function V(e){return typeof e=="object"&&e!==null&&typeof e.tagName=="string"}function O(){let e=w(),t=S(),n={};return e&&(n.$current_url=e.href,n.$pathname=e.pathname,n.$host=e.host),t&&(t.title&&(n.$title=t.title),t.referrer&&(n.$referrer=t.referrer)),n}function H(e){let t={$el_tag:e.tagName.toLowerCase(),$event_type:"click"},n=e.textContent?.trim();n&&(t.$el_text=n.slice(0,255)),e.id&&(t.$el_id=e.id),typeof e.className=="string"&&e.className&&(t.$el_classes=e.className);let i=e.getAttribute("href");return i&&(t.$el_href=i),t}function $(e){let t=globalThis.history,n=D(),i="",r=()=>{let a=w(),l=a?`${a.pathname}${a.search}`:"";l!==i&&(i=l,e.capture("$pageview",{properties:O()}));};if(r(),!t||!n)return ()=>{};let s=t.pushState.bind(t),p=t.replaceState.bind(t);return t.pushState=(...a)=>{s(...a),r();},t.replaceState=(...a)=>{p(...a),r();},n.addEventListener("popstate",r),()=>{t.pushState=s,t.replaceState=p,n.removeEventListener("popstate",r);}}function K(e){let t=S();if(!t)return ()=>{};let n=i=>{let r=i.target;V(r)&&e.capture("$autocapture",{properties:{...O(),...H(r)}});};return t.addEventListener("click",n,true),()=>t.removeEventListener("click",n,true)}function I(e,t={}){let n=[];return (t.pageviews??true)&&n.push($(e)),(t.clicks??true)&&n.push(K(e)),()=>{for(let i of n)i();}}function F(){return globalThis.document?.visibilityState==="hidden"}function B(e){let t=globalThis.navigator,n=globalThis.Blob;if(!t?.sendBeacon||!n)return false;let i=JSON.stringify({...e.body,api_key:e.projectKey});try{let r=new n([i],{type:"application/json"});return t.sendBeacon(e.url,r)}catch{return false}}var c=class{constructor(t={}){a(this,"fetchTransport");this.fetchTransport=new s(t);}async send(t){F()&&B(t)||await this.fetchTransport.send(t);}};var R={maskAllInputs:true,maskAllText:false},W=new Set(["email","password","tel"]);function A(e){return e.replace(/\S/g,"*")}function d(e,t,n){return z(t)||n.maskAllInputs?A(e):e}function f(e,t){return t.maskAllText?A(e):e}function z(e){return W.has((e??"").toLowerCase())}var U=5e3,m=class{constructor(t){this.options=t;a(this,"buffer",[]);a(this,"seq",0);a(this,"maxEvents");this.maxEvents=Math.min(Math.max(1,t.maxEvents),U);}add(t){return this.buffer.push(t),this.buffer.length>=this.maxEvents?this.flush():null}flush(){if(this.buffer.length===0)return null;let t=this.buffer;this.buffer=[];let n={distinct_id:this.options.distinctId(),events:t,masked:this.options.masked,schema_version:1,seq:this.seq,session_id:this.options.sessionId,timestamp:new Date(this.options.now()).toISOString()};return this.seq+=1,n}};var v=1,k=3,q=9,h=class{constructor(){a(this,"next",1);}allocate(){let t=this.next;return this.next+=1,t}},j=new Set(["NOSCRIPT","SCRIPT"]);function g(e,t,n,i){if(e.nodeType===k){let r=t.allocate();return i?.(e,r),{id:r,textContent:f(e.textValue??"",n),type:"text"}}if(e.nodeType===q){let r=t.allocate();return i?.(e,r),{childNodes:M(e,t,n,i),id:r,type:"document"}}if(e.nodeType===v){let r=e.tagName??"";if(j.has(r))return null;let s=t.allocate();return i?.(e,s),{attributes:X(e,n),childNodes:M(e,t,n,i),id:s,tagName:r,type:"element"}}return null}function M(e,t,n,i){let r=[];for(let s of e.childNodes??[]){let p=g(s,t,n,i);p&&r.push(p);}return r}function X(e,t){let n={};for(let i of e.attributes??[])n[i.name]=i.value;return e.inputValue!==void 0&&(n.value=d(e.inputValue,e.inputType,t)),n}async function P(e,t){let n=`${g$1(t.replayHost)}/v1/replay`;return (await t.fetch(n,{body:JSON.stringify(e),headers:{authorization:`Bearer ${t.apiKey}`,"content-type":"application/json"},method:"POST"})).ok}var C=new Set(["INPUT","SELECT","TEXTAREA"]),y=class{constructor(t){this.options=t;a(this,"allocator",new h);a(this,"mirror",new Map);a(this,"chunker");a(this,"fetchImpl");a(this,"observer");a(this,"timer");a(this,"started",false);this.chunker=new m({distinctId:t.distinctId,masked:t.mask.maskAllInputs,maxEvents:t.maxEvents,now:t.now,sessionId:t.sessionId}),this.fetchImpl=f$1(t.fetch);}start(){if(this.started)return;let t=Y(),n=t?.documentElement;!t||!n||!this.fetchImpl||(this.started=true,this.captureFullSnapshot(n),this.observeMutations(n),this.observeInteractions(t),this.timer=setInterval(()=>this.upload(this.chunker.flush()),this.options.flushIntervalMs));}stop(){this.started&&(this.started=false,this.observer?.disconnect(),this.timer&&clearInterval(this.timer),this.upload(this.chunker.flush()));}captureFullSnapshot(t){let n=g(this.adapt(t),this.allocator,this.options.mask,(i,r)=>{let s=i.ref;s&&this.mirror.set(s,r);});n&&this.push(2,{node:n});}observeMutations(t){let n=globalThis.MutationObserver;n&&(this.observer=new n(i=>{for(let r of i)this.handleMutation(r);}),this.observer.observe(t,{attributes:true,characterData:true,childList:true,subtree:true}));}handleMutation(t){if(t.type==="characterData"){let n=this.mirror.get(t.target);n!==void 0&&this.push(3,{texts:[{id:n,value:f(t.target.textContent??"",this.options.mask)}]});return}if(t.type==="attributes"&&t.attributeName){let n=this.mirror.get(t.target),i=t.target;n!==void 0&&this.push(3,{attributes:[{attributes:{[t.attributeName]:i.getAttribute(t.attributeName)??""},id:n}]});return}if(t.type==="childList"){let n=this.mirror.get(t.target);if(n===void 0)return;for(let i of Array.from(t.addedNodes)){let r=g(this.adapt(i),this.allocator,this.options.mask,(s,p)=>{let a=s.ref;a&&this.mirror.set(a,p);});r&&this.push(3,{adds:[{node:r,parentId:n}]});}for(let i of Array.from(t.removedNodes)){let r=this.mirror.get(i);r!==void 0&&(this.push(3,{removes:[{id:r,parentId:n}]}),this.mirror.delete(i));}}}observeInteractions(t){t.addEventListener("input",n=>{let i=n.target;if(!i||!C.has(i.tagName))return;let r=this.mirror.get(i);r!==void 0&&this.push(3,{input:{id:r,value:d(i.value??"",i.type,this.options.mask)}});},true),t.addEventListener("scroll",n=>{let i=n.target,r=i?this.mirror.get(i):void 0;this.push(3,{scroll:{id:r??0,x:i?.scrollLeft??0,y:i?.scrollTop??0}});},true);}adapt(t){let n={childNodes:[],nodeType:t.nodeType,ref:t};if(t.nodeType===k)return n.textValue=t.textContent??"",n;if(t.nodeType===v){let i=t;if(n.tagName=i.tagName,n.attributes=Array.from(i.attributes).map(r=>({name:r.name,value:r.value})),C.has(i.tagName)){let r=i;n.inputType=r.type,n.inputValue=r.value??"";}}return n.childNodes=Array.from(t.childNodes).map(i=>this.adapt(i)),n}push(t,n){let i=this.chunker.add({data:n,timestamp:this.options.now(),type:t});i&&this.upload(i);}upload(t){!t||!this.fetchImpl||P(t,{apiKey:this.options.apiKey,fetch:this.fetchImpl,replayHost:this.options.replayHost}).catch(n=>this.options.onError?.(n));}};function Y(){return globalThis.document}function _(e){let t=new y({apiKey:e.apiKey,distinctId:e.distinctId,flushIntervalMs:e.flushIntervalMs??5e3,mask:{...R,...e.mask},maxEvents:e.maxEvents??200,now:e.now??(()=>Date.now()),onError:e.onError,replayHost:e.replayHost,sessionId:e.sessionId??j$1()});return t.start(),t}function G(){return globalThis.navigator}function J(e){let t=e?.userAgentData?.platform??e?.platform;return t?t.slice(0,50):void 0}function Q(e){let t=()=>{e.flush();};globalThis.document?.addEventListener?.("visibilitychange",t),globalThis.addEventListener?.("pagehide",t);}function It(e){let{autocaptureOptions:t$1,replayHost:n,sessionReplay:i$1,sessionReplayOptions:r,...s}=e,p=G(),a={...s,locale:s.locale??(p?.language?p.language.slice(0,20):void 0),os:s.os??J(p),storage:s.storage??i(),transport:s.transport??new c({maxRetries:s.maxRetries,requestTimeoutMs:s.requestTimeoutMs})},l=new t(a);return Q(l),(e.autocapture??true)&&I(l,t$1),i$1&&n&&_({apiKey:a.apiKey,distinctId:()=>l.distinctId,onError:a.onError,replayHost:n,...r}),l}export{c as WebTransport,It as createWebClient,I as installAutocapture,_ as installSessionReplay};//# sourceMappingURL=web.js.map
1
+ import {r,g as g$1,f as f$1,s}from'./chunk-CSIP3PZ7.js';import'./chunk-V77KYPOF.js';import {a as a$1,d as d$1}from'./chunk-VG77TYVX.js';import {a}from'./chunk-5XGN7UAV.js';function w(){return globalThis.location}function S(){return globalThis.document}function D(){return globalThis.window??globalThis}function V(e){return typeof e=="object"&&e!==null&&typeof e.tagName=="string"}function O(){let e=w(),t=S(),n={};return e&&(n.$current_url=e.href,n.$pathname=e.pathname,n.$host=e.host),t&&(t.title&&(n.$title=t.title),t.referrer&&(n.$referrer=t.referrer)),n}function H(e){let t={$el_tag:e.tagName.toLowerCase(),$event_type:"click"},n=e.textContent?.trim();n&&(t.$el_text=n.slice(0,255)),e.id&&(t.$el_id=e.id),typeof e.className=="string"&&e.className&&(t.$el_classes=e.className);let i=e.getAttribute("href");return i&&(t.$el_href=i),t}function $(e){let t=globalThis.history,n=D(),i="",r=()=>{let a=w(),l=a?`${a.pathname}${a.search}`:"";l!==i&&(i=l,e.capture("$pageview",{properties:O()}));};if(r(),!t||!n)return ()=>{};let s=t.pushState.bind(t),p=t.replaceState.bind(t);return t.pushState=(...a)=>{s(...a),r();},t.replaceState=(...a)=>{p(...a),r();},n.addEventListener("popstate",r),()=>{t.pushState=s,t.replaceState=p,n.removeEventListener("popstate",r);}}function K(e){let t=S();if(!t)return ()=>{};let n=i=>{let r=i.target;V(r)&&e.capture("$autocapture",{properties:{...O(),...H(r)}});};return t.addEventListener("click",n,true),()=>t.removeEventListener("click",n,true)}function I(e,t={}){let n=[];return (t.pageviews??true)&&n.push($(e)),(t.clicks??true)&&n.push(K(e)),()=>{for(let i of n)i();}}function F(){return globalThis.document?.visibilityState==="hidden"}function B(e){let t=globalThis.navigator,n=globalThis.Blob;if(!t?.sendBeacon||!n)return false;let i=JSON.stringify({...e.body,api_key:e.projectKey});try{let r=new n([i],{type:"application/json"});return t.sendBeacon(e.url,r)}catch{return false}}var c=class{constructor(t={}){a(this,"fetchTransport");this.fetchTransport=new r(t);}async send(t){F()&&B(t)||await this.fetchTransport.send(t);}};var R={maskAllInputs:true,maskAllText:false},W=new Set(["email","password","tel"]);function A(e){return e.replace(/\S/g,"*")}function d(e,t,n){return z(t)||n.maskAllInputs?A(e):e}function f(e,t){return t.maskAllText?A(e):e}function z(e){return W.has((e??"").toLowerCase())}var U=5e3,m=class{constructor(t){this.options=t;a(this,"buffer",[]);a(this,"seq",0);a(this,"maxEvents");this.maxEvents=Math.min(Math.max(1,t.maxEvents),U);}add(t){return this.buffer.push(t),this.buffer.length>=this.maxEvents?this.flush():null}flush(){if(this.buffer.length===0)return null;let t=this.buffer;this.buffer=[];let n={distinct_id:this.options.distinctId(),events:t,masked:this.options.masked,schema_version:1,seq:this.seq,session_id:this.options.sessionId,timestamp:new Date(this.options.now()).toISOString()};return this.seq+=1,n}};var v=1,k=3,q=9,h=class{constructor(){a(this,"next",1);}allocate(){let t=this.next;return this.next+=1,t}},j=new Set(["NOSCRIPT","SCRIPT"]);function g(e,t,n,i){if(e.nodeType===k){let r=t.allocate();return i?.(e,r),{id:r,textContent:f(e.textValue??"",n),type:"text"}}if(e.nodeType===q){let r=t.allocate();return i?.(e,r),{childNodes:M(e,t,n,i),id:r,type:"document"}}if(e.nodeType===v){let r=e.tagName??"";if(j.has(r))return null;let s=t.allocate();return i?.(e,s),{attributes:X(e,n),childNodes:M(e,t,n,i),id:s,tagName:r,type:"element"}}return null}function M(e,t,n,i){let r=[];for(let s of e.childNodes??[]){let p=g(s,t,n,i);p&&r.push(p);}return r}function X(e,t){let n={};for(let i of e.attributes??[])n[i.name]=i.value;return e.inputValue!==void 0&&(n.value=d(e.inputValue,e.inputType,t)),n}async function P(e,t){let n=`${d$1(t.replayHost)}/v1/replay`;return (await t.fetch(n,{body:JSON.stringify(e),headers:{authorization:`Bearer ${t.apiKey}`,"content-type":"application/json"},method:"POST"})).ok}var C=new Set(["INPUT","SELECT","TEXTAREA"]),y=class{constructor(t){this.options=t;a(this,"allocator",new h);a(this,"mirror",new Map);a(this,"chunker");a(this,"fetchImpl");a(this,"observer");a(this,"timer");a(this,"started",false);this.chunker=new m({distinctId:t.distinctId,masked:t.mask.maskAllInputs,maxEvents:t.maxEvents,now:t.now,sessionId:t.sessionId}),this.fetchImpl=a$1(t.fetch);}start(){if(this.started)return;let t=Y(),n=t?.documentElement;!t||!n||!this.fetchImpl||(this.started=true,this.captureFullSnapshot(n),this.observeMutations(n),this.observeInteractions(t),this.timer=setInterval(()=>this.upload(this.chunker.flush()),this.options.flushIntervalMs));}stop(){this.started&&(this.started=false,this.observer?.disconnect(),this.timer&&clearInterval(this.timer),this.upload(this.chunker.flush()));}captureFullSnapshot(t){let n=g(this.adapt(t),this.allocator,this.options.mask,(i,r)=>{let s=i.ref;s&&this.mirror.set(s,r);});n&&this.push(2,{node:n});}observeMutations(t){let n=globalThis.MutationObserver;n&&(this.observer=new n(i=>{for(let r of i)this.handleMutation(r);}),this.observer.observe(t,{attributes:true,characterData:true,childList:true,subtree:true}));}handleMutation(t){if(t.type==="characterData"){let n=this.mirror.get(t.target);n!==void 0&&this.push(3,{texts:[{id:n,value:f(t.target.textContent??"",this.options.mask)}]});return}if(t.type==="attributes"&&t.attributeName){let n=this.mirror.get(t.target),i=t.target;n!==void 0&&this.push(3,{attributes:[{attributes:{[t.attributeName]:i.getAttribute(t.attributeName)??""},id:n}]});return}if(t.type==="childList"){let n=this.mirror.get(t.target);if(n===void 0)return;for(let i of Array.from(t.addedNodes)){let r=g(this.adapt(i),this.allocator,this.options.mask,(s,p)=>{let a=s.ref;a&&this.mirror.set(a,p);});r&&this.push(3,{adds:[{node:r,parentId:n}]});}for(let i of Array.from(t.removedNodes)){let r=this.mirror.get(i);r!==void 0&&(this.push(3,{removes:[{id:r,parentId:n}]}),this.mirror.delete(i));}}}observeInteractions(t){t.addEventListener("input",n=>{let i=n.target;if(!i||!C.has(i.tagName))return;let r=this.mirror.get(i);r!==void 0&&this.push(3,{input:{id:r,value:d(i.value??"",i.type,this.options.mask)}});},true),t.addEventListener("scroll",n=>{let i=n.target,r=i?this.mirror.get(i):void 0;this.push(3,{scroll:{id:r??0,x:i?.scrollLeft??0,y:i?.scrollTop??0}});},true);}adapt(t){let n={childNodes:[],nodeType:t.nodeType,ref:t};if(t.nodeType===k)return n.textValue=t.textContent??"",n;if(t.nodeType===v){let i=t;if(n.tagName=i.tagName,n.attributes=Array.from(i.attributes).map(r=>({name:r.name,value:r.value})),C.has(i.tagName)){let r=i;n.inputType=r.type,n.inputValue=r.value??"";}}return n.childNodes=Array.from(t.childNodes).map(i=>this.adapt(i)),n}push(t,n){let i=this.chunker.add({data:n,timestamp:this.options.now(),type:t});i&&this.upload(i);}upload(t){!t||!this.fetchImpl||P(t,{apiKey:this.options.apiKey,fetch:this.fetchImpl,replayHost:this.options.replayHost}).catch(n=>this.options.onError?.(n));}};function Y(){return globalThis.document}function _(e){let t=new y({apiKey:e.apiKey,distinctId:e.distinctId,flushIntervalMs:e.flushIntervalMs??5e3,mask:{...R,...e.mask},maxEvents:e.maxEvents??200,now:e.now??(()=>Date.now()),onError:e.onError,replayHost:e.replayHost,sessionId:e.sessionId??g$1()});return t.start(),t}function G(){return globalThis.navigator}function J(e){let t=e?.userAgentData?.platform??e?.platform;return t?t.slice(0,50):void 0}function Q(e){let t=()=>{e.flush();};globalThis.document?.addEventListener?.("visibilitychange",t),globalThis.addEventListener?.("pagehide",t);}function It(e){let{autocaptureOptions:t,replayHost:n,sessionReplay:i,sessionReplayOptions:r,...s$1}=e,p=G(),a={...s$1,locale:s$1.locale??(p?.language?p.language.slice(0,20):void 0),os:s$1.os??J(p),storage:s$1.storage??f$1(),transport:s$1.transport??new c({maxRetries:s$1.maxRetries,requestTimeoutMs:s$1.requestTimeoutMs})},l=new s(a);return Q(l),(e.autocapture??true)&&I(l,t),i&&n&&_({apiKey:a.apiKey,distinctId:()=>l.distinctId,onError:a.onError,replayHost:n,...r}),l}export{c as WebTransport,It as createWebClient,I as installAutocapture,_ as installSessionReplay};//# sourceMappingURL=web.js.map
2
2
  //# sourceMappingURL=web.js.map
package/package.json CHANGED
@@ -2,8 +2,9 @@
2
2
  "description": "Prodantix analytics + feature-flag client SDK (isomorphic, zero-dependency)",
3
3
  "devDependencies": {
4
4
  "@bomdisoft/typescript-config": "0.0.0",
5
- "@types/bun": "^1.3.14",
6
- "@types/node": "^25.9.3",
5
+ "@happy-dom/global-registrator": "^20.11.6",
6
+ "@types/bun": "^1.4.0",
7
+ "@types/node": "^26.2.0",
7
8
  "tsup": "8.5.1",
8
9
  "typescript": "^6.0.3"
9
10
  },
@@ -13,6 +14,21 @@
13
14
  "require": "./dist/index.cjs",
14
15
  "types": "./dist/index.d.ts"
15
16
  },
17
+ "./chat": {
18
+ "import": "./dist/chat.js",
19
+ "require": "./dist/chat.cjs",
20
+ "types": "./dist/chat.d.ts"
21
+ },
22
+ "./csp": {
23
+ "import": "./dist/csp.js",
24
+ "require": "./dist/csp.cjs",
25
+ "types": "./dist/csp.d.ts"
26
+ },
27
+ "./messenger": {
28
+ "import": "./dist/messenger.js",
29
+ "require": "./dist/messenger.cjs",
30
+ "types": "./dist/messenger.d.ts"
31
+ },
16
32
  "./node": {
17
33
  "import": "./dist/node.js",
18
34
  "require": "./dist/node.cjs",
@@ -47,5 +63,5 @@
47
63
  "sideEffects": false,
48
64
  "type": "module",
49
65
  "types": "./dist/index.d.ts",
50
- "version": "0.0.1"
66
+ "version": "0.1.0-beta.348"
51
67
  }
@@ -1,2 +0,0 @@
1
- var z=Object.defineProperty;var J=(t,e,s)=>e in t?z(t,e,{enumerable:true,configurable:true,writable:true,value:s}):t[e]=s;var i=(t,e,s)=>J(t,typeof e!="symbol"?e+"":e,s);var d=class extends Error{constructor(s,r,n){super(r,n);i(this,"code");this.code=s,this.name="ProdantixError";}},y=class extends d{constructor(e){super("config",e),this.name="ConfigError";}},f=class extends d{constructor(s,r){super("validation",r);i(this,"field");this.field=s,this.name="ValidationError";}},l=class extends d{constructor(s,r,n){super("transport",s,n);i(this,"status");this.status=r,this.name="TransportError";}};var m=class{constructor(){i(this,"store",new Map);}getItem(e){return this.store.get(e)??null}removeItem(e){this.store.delete(e);}setItem(e,s){this.store.set(e,s);}};function le(){try{let t=globalThis.localStorage;if(t){let e="__pdx_probe__";return t.setItem(e,"1"),t.removeItem(e),t}}catch{return new m}return new m}var T="prodantix-js",S="0.0.1";var u=Symbol("absent");function Q(t,e){if(t==="distinct_id")return e.distinctId;let s=e.properties??{};if(Object.prototype.hasOwnProperty.call(s,t))return s[t];let r=e.attributes??{};return Object.prototype.hasOwnProperty.call(r,t)?r[t]:u}function c(t){return t===u?"undefined":String(t)}function C(t){return t===u?Number.NaN:Number(t)}function _(t){return t!==u&&t!==null&&t!==""}function P(t,e){if(!Array.isArray(e))return false;let s=c(t);return e.map(r=>String(r)).includes(s)}function R(t,e){let s=Q(t.attribute,e),r=t.value;switch(t.op){case "is_set":return _(s);case "is_not_set":return !_(s);case "eq":return c(s)===c(r===void 0?u:r);case "neq":return c(s)!==c(r===void 0?u:r);case "contains":return c(s).includes(c(r===void 0?u:r));case "in":return P(s,r);case "not_in":return Array.isArray(r)?!P(s,r):false;case "gt":return v(s,r,(n,o)=>n>o);case "gte":return v(s,r,(n,o)=>n>=o);case "lt":return v(s,r,(n,o)=>n<o);case "lte":return v(s,r,(n,o)=>n<=o);default:return false}}function v(t,e,s){let r=C(t),n=e===void 0?Number.NaN:C(e);return Number.isNaN(r)||Number.isNaN(n)?false:s(r,n)}function U(t,e){let s=`${t}:${e}`,r=2166136261;for(let n=0;n<s.length;n++)r^=s.charCodeAt(n),r=Math.imul(r,16777619);return (r>>>0)%100}function B(t,e){return t.enabled?t.targeting.length>0&&!t.targeting.every(s=>R(s,e))?{enabled:false,reason:"targeting"}:t.rolloutPercentage>=100?{enabled:true,reason:"rollout_full"}:U(t.key,e.distinctId)<t.rolloutPercentage?{enabled:true,reason:"rollout"}:{enabled:false,reason:"rollout_excluded"}:{enabled:false,reason:"disabled"}}function M(t,e){let s={};for(let r of t)s[r.key]=B(r,e).enabled;return s}function g(t){if(t)return t;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function p(){let t=globalThis.AbortController;return t?new t:void 0}var A=t=>new Promise(e=>{setTimeout(e,t);});function h(t){return t.replace(/\/+$/,"")}var b=class{constructor(e){i(this,"fetch");i(this,"host");i(this,"projectKey");i(this,"requestTimeoutMs");this.fetch=g(e.fetch),this.host=h(e.host),this.projectKey=e.projectKey,this.requestTimeoutMs=e.requestTimeoutMs??1e4;}async fetchAll(e){let s=this.fetch;if(!s)throw new l("no fetch implementation available in this runtime");let r=`${this.host}/v1/flags?distinct_id=${encodeURIComponent(e)}`,n=p(),o=n?setTimeout(()=>n.abort(),this.requestTimeoutMs):void 0;try{let a=await s(r,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:n?.signal});if(!a.ok)throw new l(`flags request failed with status ${a.status}`,a.status);return JSON.parse(await a.text()).flags??{}}finally{o!==void 0&&clearTimeout(o);}}async snapshot(){let e=this.fetch;if(!e)throw new l("no fetch implementation available in this runtime");let s=`${this.host}/v1/flags/snapshot`,r=p(),n=r?setTimeout(()=>r.abort(),this.requestTimeoutMs):void 0;try{let o=await e(s,{headers:{authorization:`Bearer ${this.projectKey}`},method:"GET",signal:r?.signal});if(!o.ok)throw new l(`flag snapshot request failed with status ${o.status}`,o.status);let a=JSON.parse(await o.text());return {flags:a.flags??[],generatedAt:a.generatedAt}}finally{n!==void 0&&clearTimeout(n);}}};var x=class{constructor(e){i(this,"fetch");i(this,"host");i(this,"projectKey");i(this,"requestTimeoutMs");this.fetch=g(e.fetch),this.host=h(e.host),this.projectKey=e.projectKey,this.requestTimeoutMs=e.requestTimeoutMs??1e4;}async inbox(e){let s=this.requireFetch(),r=`${this.host}/v1/messages?distinct_id=${encodeURIComponent(e)}`,n=await this.request(s,r,{headers:this.authHeaders(),method:"GET"});if(!n.ok)throw new l(`inbox request failed with status ${n.status}`,n.status);return JSON.parse(await n.text()).messages??[]}async markRead(e,s){let r=this.requireFetch(),n=`${this.host}/v1/messages/read`,o=await this.request(r,n,{body:JSON.stringify({distinct_id:s,message_id:e}),headers:{...this.authHeaders(),"content-type":"application/json"},method:"POST"});if(!o.ok)throw new l(`mark-read request failed with status ${o.status}`,o.status)}requireFetch(){if(!this.fetch)throw new l("no fetch implementation available in this runtime");return this.fetch}authHeaders(){return {authorization:`Bearer ${this.projectKey}`}}async request(e,s,r){let n=p(),o=n?setTimeout(()=>n.abort(),this.requestTimeoutMs):void 0;try{return await e(s,{...r,signal:n?.signal})}finally{o!==void 0&&clearTimeout(o);}}};function q(t){return t>=400&&t<500&&t!==429}var I=class{constructor(e={}){i(this,"fetch");i(this,"maxRetries");i(this,"requestTimeoutMs");i(this,"baseDelayMs");i(this,"maxDelayMs");i(this,"sleep");i(this,"random");this.fetch=g(e.fetch),this.maxRetries=e.maxRetries??3,this.requestTimeoutMs=e.requestTimeoutMs??1e4,this.baseDelayMs=e.baseDelayMs??500,this.maxDelayMs=e.maxDelayMs??3e4,this.sleep=e.sleep??A,this.random=e.random??Math.random;}async send(e){let s=this.fetch;if(!s)throw new l("no fetch implementation available in this runtime");let r=JSON.stringify(e.body),n;for(let o=0;o<=this.maxRetries;o+=1){try{let a=await this.attempt(s,e,r);if(a.ok)return;if(q(a.status))throw new l(`ingest rejected batch with status ${a.status}`,a.status);n=new l(`ingest transient status ${a.status}`,a.status);}catch(a){if(a instanceof l&&a.status!==void 0&&q(a.status))throw a;n=a;}o<this.maxRetries&&await this.sleep(this.backoff(o));}throw new l("ingest delivery failed after retries",void 0,{cause:n})}async attempt(e,s,r){let n=p(),o=n?setTimeout(()=>n.abort(),this.requestTimeoutMs):void 0;try{return await e(s.url,{body:r,headers:{authorization:`Bearer ${s.projectKey}`,"content-type":"application/json"},method:"POST",signal:n?.signal})}finally{o!==void 0&&clearTimeout(o);}}backoff(e){return Math.min(this.maxDelayMs,this.baseDelayMs*2**e)+this.random()*this.baseDelayMs}};var $={now:()=>new Date};function E(t){return t.toISOString()}function H(){return globalThis.crypto}function G(t){t[6]=t[6]&15|64,t[8]=t[8]&63|128;let e=[];for(let s=0;s<16;s+=1)e.push(t[s].toString(16).padStart(2,"0"));return `${e[0]}${e[1]}${e[2]}${e[3]}-${e[4]}${e[5]}-${e[6]}${e[7]}-${e[8]}${e[9]}-${e[10]}${e[11]}${e[12]}${e[13]}${e[14]}${e[15]}`}function X(){let t=H();if(t?.randomUUID)return t.randomUUID();let e=new Uint8Array(16);if(t?.getRandomValues)t.getRandomValues(e);else for(let s=0;s<16;s+=1)e[s]=Math.floor(Math.random()*256);return G(e)}var N={uuid:X};var Y=/^pdx_pub_(?:(?:live|test)_)?[a-z0-9]{32}$/;var Z=/^(?:\$|[a-z])[a-z0-9_.]*$/;function O(t){let e=0;for(let s of t)e+=1;return e}function D(t){return Y.test(t)}function W(t){return Z.test(t)}function K(t){let e=O(t);if(e<1||e>200)throw new f("distinct_id","distinct_id must be between 1 and 200 characters")}function L(t){let e=O(t);if(e<1||e>200)throw new f("event_name","event_name must be between 1 and 200 characters");if(!W(t))throw new f("event_name","event_name must match /^(\\$|[a-z])[a-z0-9_.]*$/")}var ee=t=>{};function j(t){if(!t.apiKey||!D(t.apiKey))throw new y("apiKey must be a public project key of the form pdx_pub_<32 lowercase alphanumerics>");if(!t.host)throw new y("host is required (the ingest base URL)");let e=h(t.host),s=t.defaultProperties;return {apiKey:t.apiKey,autocapture:t.autocapture??false,clock:t.clock??$,defaultProperties:typeof s=="function"?s:()=>s??{},flagsHost:t.flagsHost?h(t.flagsHost):e,flushAt:t.flushAt??20,flushIntervalMs:t.flushIntervalMs??1e4,host:e,ids:t.ids??N,locale:t.locale,maxQueueSize:t.maxQueueSize??1e3,maxRetries:t.maxRetries??3,namespace:t.apiKey.slice(0,16),onError:t.onError??ee,os:t.os,requestTimeoutMs:t.requestTimeoutMs??1e4,sdkName:t.sdkName??T,sdkVersion:t.sdkVersion??S,storage:t.storage??new m,transport:t.transport}}function V(t,e,s){L(t.eventName),K(t.distinctId);let r={distinct_id:t.distinctId,event_id:t.eventId??s.uuid(),event_name:t.eventName,properties:t.properties??{},schema_version:1,timestamp:E(t.timestamp??e.now())};return t.context&&(r.context=t.context),t.sessionId&&(r.session_id=t.sessionId),r}var w=class{constructor(e,s,r){this.storage=e;this.ids=s;this.namespace=r;i(this,"anonymousId");i(this,"distinctId");i(this,"identified");let n=e.getItem(this.key("anonymous_id"));n?this.anonymousId=n:(this.anonymousId=s.uuid(),e.setItem(this.key("anonymous_id"),this.anonymousId));let o=e.getItem(this.key("distinct_id"));o?(this.distinctId=o,this.identified=true):(this.distinctId=this.anonymousId,this.identified=false);}getAnonymousId(){return this.anonymousId}getDistinctId(){return this.distinctId}isIdentified(){return this.identified}snapshot(){return {anonymousId:this.anonymousId,distinctId:this.distinctId,identified:this.identified}}identify(e){return this.identified&&this.distinctId===e?{changed:false}:(this.distinctId=e,this.identified=true,this.storage.setItem(this.key("distinct_id"),e),{changed:true})}reset(){this.anonymousId=this.ids.uuid(),this.distinctId=this.anonymousId,this.identified=false,this.storage.setItem(this.key("anonymous_id"),this.anonymousId),this.storage.removeItem(this.key("distinct_id"));}key(e){return `pdx.${this.namespace}.${e}`}};var F=class{constructor(e,s){this.maxSize=e;this.onOverflow=s;i(this,"events",[]);}get size(){return this.events.length}enqueue(e){this.events.push(e),this.enforceCap();}restore(e){this.events.push(...e),this.enforceCap();}requeue(e){this.events.unshift(...e),this.enforceCap();}drain(e){let s=e===void 0?this.events.length:Math.min(e,this.events.length);return this.events.splice(0,s)}snapshot(){return [...this.events]}enforceCap(){if(this.events.length<=this.maxSize)return;let e=this.events.splice(0,this.events.length-this.maxSize);this.onOverflow?.({dropped:e});}};var te="queue",se=1e3,re=3e4,k=class{constructor(e){i(this,"config");i(this,"identity");i(this,"queue");i(this,"transport");i(this,"flagsClient");i(this,"messagesClient");i(this,"context");i(this,"flushTimer");i(this,"flushing",false);i(this,"cachedFlags");i(this,"cachedSnapshot");this.config=j(e),this.identity=new w(this.config.storage,this.config.ids,this.config.namespace),this.queue=new F(this.config.maxQueueSize,({dropped:s})=>{this.config.onError(new d("queue_overflow",`event queue overflow: dropped ${s.length} oldest event(s)`));}),this.transport=this.config.transport??new I({maxRetries:this.config.maxRetries,requestTimeoutMs:this.config.requestTimeoutMs}),this.flagsClient=new b({host:this.config.flagsHost,projectKey:this.config.apiKey,requestTimeoutMs:this.config.requestTimeoutMs}),this.messagesClient=new x({host:this.config.flagsHost,projectKey:this.config.apiKey,requestTimeoutMs:this.config.requestTimeoutMs}),this.context={sdk:this.config.sdkName,sdk_version:this.config.sdkVersion},this.config.os&&(this.context.os=this.config.os),this.config.locale&&(this.context.locale=this.config.locale),this.restoreQueue(),this.startTimer();}get distinctId(){return this.identity.getDistinctId()}get anonymousId(){return this.identity.getAnonymousId()}capture(e,s={}){try{let r={...this.config.defaultProperties(),...s.properties??{}},n=V({context:this.context,distinctId:this.identity.getDistinctId(),eventName:e,properties:r,sessionId:s.sessionId,timestamp:s.timestamp},this.config.clock,this.config.ids);this.enqueue(n);}catch(r){this.config.onError(r);}}identify(e,s={}){let r=this.identity.getAnonymousId(),n=!this.identity.isIdentified(),o=this.identity.identify(e),a={};n&&o.changed&&(a.$anon_distinct_id=r),s.set&&(a.$set=s.set),this.capture("$identify",{properties:a});}alias(e){this.capture("$create_alias",{properties:{alias:e}});}group(e,s,r){let n={$group_key:s,$group_type:e};r&&(n.$set=r),this.capture("$group",{properties:n});}setPersonProperties(e,s){let r={};e&&(r.$set=e),s&&(r.$set_once=s),this.capture("$set",{properties:r});}async getAllFlags(){let e=this.identity.getDistinctId(),s=await this.flagsClient.fetchAll(e);return this.cachedFlags={distinctId:e,flags:s},s}async isFeatureEnabled(e){return (await this.getAllFlags())[e]??false}getCachedFlag(e){if(!(!this.cachedFlags||this.cachedFlags.distinctId!==this.distinctId))return this.cachedFlags.flags[e]}async getLocalFlags(e={}){let s=await this.flagSnapshot();return M(s.flags,{attributes:e.attributes,distinctId:this.identity.getDistinctId(),properties:e.properties})}async isFeatureEnabledLocal(e,s){return (await this.getLocalFlags(s))[e]??false}async flagSnapshot(){let e=this.config.clock.now().getTime();if(this.cachedSnapshot&&e-this.cachedSnapshot.fetchedAt<re)return this.cachedSnapshot.snapshot;let s=await this.flagsClient.snapshot();return this.cachedSnapshot={fetchedAt:e,snapshot:s},s}async getInbox(){return this.messagesClient.inbox(this.identity.getDistinctId())}async markMessageRead(e){await this.messagesClient.markRead(e,this.identity.getDistinctId());}async flush(){if(this.flushing||this.queue.size===0)return;this.flushing=true;let e=this.queue.drain(se);try{await this.transport.send({body:{events:e,sent_at:E(this.config.clock.now())},projectKey:this.config.apiKey,url:`${this.config.host}/v1/events`}),this.persistQueue();}catch(s){this.queue.requeue(e),this.persistQueue(),this.config.onError(s);}finally{this.flushing=false;}}reset(){this.identity.reset(),this.cachedFlags=void 0,this.cachedSnapshot=void 0;}async shutdown(){this.stopTimer(),await this.flush();}enqueue(e){this.queue.enqueue(e),this.persistQueue(),this.queue.size>=this.config.flushAt&&this.flush();}persistQueue(){try{this.config.storage.setItem(this.persistKey(),JSON.stringify(this.queue.snapshot()));}catch(e){this.config.onError(e);}}restoreQueue(){try{let e=this.config.storage.getItem(this.persistKey());if(!e)return;let s=JSON.parse(e);Array.isArray(s)&&this.queue.restore(s);}catch(e){this.config.onError(e);}}startTimer(){if(this.config.flushIntervalMs<=0)return;let e=setInterval(()=>{this.flush();},this.config.flushIntervalMs),s=e;typeof s.unref=="function"&&s.unref(),this.flushTimer=e;}stopTimer(){this.flushTimer!==void 0&&(clearInterval(this.flushTimer),this.flushTimer=void 0);}persistKey(){return `pdx.${this.config.namespace}.${te}`}};function rt(t){return new k(t)}export{i as a,d as b,y as c,f as d,l as e,g as f,h as g,m as h,le as i,X as j,T as k,S as l,R as m,U as n,B as o,M as p,b as q,x as r,I as s,k as t,rt as u};//# sourceMappingURL=chunk-FIZWZVZG.js.map
2
- //# sourceMappingURL=chunk-FIZWZVZG.js.map
@@ -1,133 +0,0 @@
1
- type JsonPrimitive = string | number | boolean | null;
2
- type JsonValue = JsonPrimitive | JsonValue[] | {
3
- [key: string]: JsonValue;
4
- };
5
- type EventProperties = Record<string, JsonValue>;
6
- interface EventContext {
7
- locale?: string;
8
- os?: string;
9
- sdk?: string;
10
- sdk_version?: string;
11
- }
12
- interface EventEnvelope {
13
- context?: EventContext;
14
- distinct_id: string;
15
- event_id: string;
16
- event_name: string;
17
- properties: EventProperties;
18
- schema_version: 1;
19
- session_id?: string;
20
- timestamp: string;
21
- }
22
- interface EventBatch {
23
- api_key?: string;
24
- events: EventEnvelope[];
25
- sent_at: string;
26
- }
27
- interface FlagsResponse {
28
- flags: Record<string, boolean>;
29
- }
30
- interface InboxMessage {
31
- body: string;
32
- createdAt: string;
33
- id: string;
34
- read: boolean;
35
- title: string;
36
- }
37
- interface InboxResponse {
38
- messages: InboxMessage[];
39
- }
40
- interface Clock {
41
- now(): Date;
42
- }
43
- interface IdFactory {
44
- uuid(): string;
45
- }
46
- interface StorageAdapter {
47
- getItem(key: string): string | null;
48
- removeItem(key: string): void;
49
- setItem(key: string, value: string): void;
50
- }
51
- interface TransportRequest {
52
- body: EventBatch;
53
- projectKey: string;
54
- url: string;
55
- }
56
- interface Transport {
57
- send(request: TransportRequest): Promise<void>;
58
- }
59
- interface ProdantixConfig {
60
- apiKey: string;
61
- autocapture?: boolean;
62
- clock?: Clock;
63
- defaultProperties?: EventProperties | (() => EventProperties);
64
- flagsHost?: string;
65
- flushAt?: number;
66
- flushIntervalMs?: number;
67
- host: string;
68
- ids?: IdFactory;
69
- locale?: string;
70
- maxQueueSize?: number;
71
- maxRetries?: number;
72
- onError?: (error: unknown) => void;
73
- os?: string;
74
- requestTimeoutMs?: number;
75
- sdkName?: string;
76
- sdkVersion?: string;
77
- storage?: StorageAdapter;
78
- transport?: Transport;
79
- }
80
-
81
- interface LocalFlagContext {
82
- attributes?: EventProperties;
83
- properties?: EventProperties;
84
- }
85
- interface CaptureOptions {
86
- properties?: EventProperties;
87
- sessionId?: string;
88
- timestamp?: Date;
89
- }
90
- interface IdentifyOptions {
91
- set?: EventProperties;
92
- }
93
- declare class ProdantixClient {
94
- private readonly config;
95
- private readonly identity;
96
- private readonly queue;
97
- private readonly transport;
98
- private readonly flagsClient;
99
- private readonly messagesClient;
100
- private readonly context;
101
- private flushTimer?;
102
- private flushing;
103
- private cachedFlags?;
104
- private cachedSnapshot?;
105
- constructor(config: ProdantixConfig);
106
- get distinctId(): string;
107
- get anonymousId(): string;
108
- capture(eventName: string, options?: CaptureOptions): void;
109
- identify(distinctId: string, options?: IdentifyOptions): void;
110
- alias(alias: string): void;
111
- group(groupType: string, groupKey: string, properties?: EventProperties): void;
112
- setPersonProperties(set?: EventProperties, setOnce?: EventProperties): void;
113
- getAllFlags(): Promise<Record<string, boolean>>;
114
- isFeatureEnabled(key: string): Promise<boolean>;
115
- getCachedFlag(key: string): boolean | undefined;
116
- getLocalFlags(context?: LocalFlagContext): Promise<Record<string, boolean>>;
117
- isFeatureEnabledLocal(key: string, context?: LocalFlagContext): Promise<boolean>;
118
- private flagSnapshot;
119
- getInbox(): Promise<InboxMessage[]>;
120
- markMessageRead(messageId: string): Promise<void>;
121
- flush(): Promise<void>;
122
- reset(): void;
123
- shutdown(): Promise<void>;
124
- private enqueue;
125
- private persistQueue;
126
- private restoreQueue;
127
- private startTimer;
128
- private stopTimer;
129
- private persistKey;
130
- }
131
- declare function createClient(config: ProdantixConfig): ProdantixClient;
132
-
133
- export { type CaptureOptions as C, type EventBatch as E, type FlagsResponse as F, type IdFactory as I, type JsonValue as J, type LocalFlagContext as L, ProdantixClient as P, type StorageAdapter as S, type Transport as T, type Clock as a, type EventContext as b, type EventEnvelope as c, type EventProperties as d, type IdentifyOptions as e, type InboxMessage as f, type InboxResponse as g, type ProdantixConfig as h, type TransportRequest as i, createClient as j };
@@ -1,133 +0,0 @@
1
- type JsonPrimitive = string | number | boolean | null;
2
- type JsonValue = JsonPrimitive | JsonValue[] | {
3
- [key: string]: JsonValue;
4
- };
5
- type EventProperties = Record<string, JsonValue>;
6
- interface EventContext {
7
- locale?: string;
8
- os?: string;
9
- sdk?: string;
10
- sdk_version?: string;
11
- }
12
- interface EventEnvelope {
13
- context?: EventContext;
14
- distinct_id: string;
15
- event_id: string;
16
- event_name: string;
17
- properties: EventProperties;
18
- schema_version: 1;
19
- session_id?: string;
20
- timestamp: string;
21
- }
22
- interface EventBatch {
23
- api_key?: string;
24
- events: EventEnvelope[];
25
- sent_at: string;
26
- }
27
- interface FlagsResponse {
28
- flags: Record<string, boolean>;
29
- }
30
- interface InboxMessage {
31
- body: string;
32
- createdAt: string;
33
- id: string;
34
- read: boolean;
35
- title: string;
36
- }
37
- interface InboxResponse {
38
- messages: InboxMessage[];
39
- }
40
- interface Clock {
41
- now(): Date;
42
- }
43
- interface IdFactory {
44
- uuid(): string;
45
- }
46
- interface StorageAdapter {
47
- getItem(key: string): string | null;
48
- removeItem(key: string): void;
49
- setItem(key: string, value: string): void;
50
- }
51
- interface TransportRequest {
52
- body: EventBatch;
53
- projectKey: string;
54
- url: string;
55
- }
56
- interface Transport {
57
- send(request: TransportRequest): Promise<void>;
58
- }
59
- interface ProdantixConfig {
60
- apiKey: string;
61
- autocapture?: boolean;
62
- clock?: Clock;
63
- defaultProperties?: EventProperties | (() => EventProperties);
64
- flagsHost?: string;
65
- flushAt?: number;
66
- flushIntervalMs?: number;
67
- host: string;
68
- ids?: IdFactory;
69
- locale?: string;
70
- maxQueueSize?: number;
71
- maxRetries?: number;
72
- onError?: (error: unknown) => void;
73
- os?: string;
74
- requestTimeoutMs?: number;
75
- sdkName?: string;
76
- sdkVersion?: string;
77
- storage?: StorageAdapter;
78
- transport?: Transport;
79
- }
80
-
81
- interface LocalFlagContext {
82
- attributes?: EventProperties;
83
- properties?: EventProperties;
84
- }
85
- interface CaptureOptions {
86
- properties?: EventProperties;
87
- sessionId?: string;
88
- timestamp?: Date;
89
- }
90
- interface IdentifyOptions {
91
- set?: EventProperties;
92
- }
93
- declare class ProdantixClient {
94
- private readonly config;
95
- private readonly identity;
96
- private readonly queue;
97
- private readonly transport;
98
- private readonly flagsClient;
99
- private readonly messagesClient;
100
- private readonly context;
101
- private flushTimer?;
102
- private flushing;
103
- private cachedFlags?;
104
- private cachedSnapshot?;
105
- constructor(config: ProdantixConfig);
106
- get distinctId(): string;
107
- get anonymousId(): string;
108
- capture(eventName: string, options?: CaptureOptions): void;
109
- identify(distinctId: string, options?: IdentifyOptions): void;
110
- alias(alias: string): void;
111
- group(groupType: string, groupKey: string, properties?: EventProperties): void;
112
- setPersonProperties(set?: EventProperties, setOnce?: EventProperties): void;
113
- getAllFlags(): Promise<Record<string, boolean>>;
114
- isFeatureEnabled(key: string): Promise<boolean>;
115
- getCachedFlag(key: string): boolean | undefined;
116
- getLocalFlags(context?: LocalFlagContext): Promise<Record<string, boolean>>;
117
- isFeatureEnabledLocal(key: string, context?: LocalFlagContext): Promise<boolean>;
118
- private flagSnapshot;
119
- getInbox(): Promise<InboxMessage[]>;
120
- markMessageRead(messageId: string): Promise<void>;
121
- flush(): Promise<void>;
122
- reset(): void;
123
- shutdown(): Promise<void>;
124
- private enqueue;
125
- private persistQueue;
126
- private restoreQueue;
127
- private startTimer;
128
- private stopTimer;
129
- private persistKey;
130
- }
131
- declare function createClient(config: ProdantixConfig): ProdantixClient;
132
-
133
- export { type CaptureOptions as C, type EventBatch as E, type FlagsResponse as F, type IdFactory as I, type JsonValue as J, type LocalFlagContext as L, ProdantixClient as P, type StorageAdapter as S, type Transport as T, type Clock as a, type EventContext as b, type EventEnvelope as c, type EventProperties as d, type IdentifyOptions as e, type InboxMessage as f, type InboxResponse as g, type ProdantixConfig as h, type TransportRequest as i, createClient as j };