@sprig-technologies/sprig-browser 2.31.6 → 2.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/replay.js CHANGED
@@ -1 +1 @@
1
- var Be=Object.defineProperty,Ue=(e,t,n)=>t in e?Be(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,z=(e,t,n)=>(Ue(e,typeof t!="symbol"?t+"":t,n),n);import{b as l,s as J,a as w,v as R,c as Te,P as Q,r as X,d as _e,e as P,S as A,f as Ae}from"./metricsReporter-DKI8BwWD.js";var C=(e=>(e[e.DomContentLoaded=0]="DomContentLoaded",e[e.Load=1]="Load",e[e.FullSnapshot=2]="FullSnapshot",e[e.IncrementalSnapshot=3]="IncrementalSnapshot",e[e.Meta=4]="Meta",e[e.Custom=5]="Custom",e[e.Plugin=6]="Plugin",e))(C||{});class Ne{constructor(t){z(this,"awaitingResolvers",[]),z(this,"activeCount",0),this.capacity=t}async acquire(){if(this.activeCount<this.capacity){this.activeCount++;return}return new Promise(t=>{this.awaitingResolvers.push(t)})}release(){const t=this.awaitingResolvers.shift();t&&this.activeCount<=this.capacity?t():this.activeCount--}async execute(t){try{return await this.acquire(),await t()}finally{this.release()}}setLimit(t){this.capacity=t}}const Y=new Ne(2),Le=e=>Y.setLimit(e),Oe=async e=>Y.execute(async()=>{var t;l.info("UploadChunkStart",{chunkIndex:e.chunkIndex,surveyId:e.surveyId});const n=await J(e.uploadUrl,{body:e.data,method:"PUT"});l.http("UploadChunkEnd",{url:e.uploadUrl,method:"PUT",status_code:n.status,reason:n.statusText??"OK",chunkIndex:e.chunkIndex,surveyId:e.surveyId});const a=(t=n.headers)==null?void 0:t.get("ETag");if(!a)throw new Error(`Upload response did not include etag for upload ${e.uploadId}, part ${e.chunkIndex}`);return a}),Z=async({apiUrl:e,surveyId:t,uploadId:n,etags:a,headers:r,responseGroupUuid:o,replayDuration:s,eventDigest:i},d=!1)=>{var u;if(!d&&!n&&!a){l.error("UploadErr",{isMobile:d,uploadId:n,etags:a});return}l.info("MarkUploadComplete",{surveyId:t});const g=await J(`${e}/sdk/1/completeSessionReplay`,{method:"POST",body:JSON.stringify({etags:a,uploadId:n,responseGroupUuid:o,surveyId:t,replayDuration:s,eventDigest:i,userAgent:(u=window?.navigator)==null?void 0:u.userAgent}),headers:r,shouldRetryRequest:!0});return l.info("MarkUploadDone",{surveyId:t}),g},N=(e,t)=>t.some(n=>e instanceof n);let ee,te;function Me(){return ee||(ee=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Fe(){return te||(te=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const L=new WeakMap,O=new WeakMap,x=new WeakMap;function He(e){const t=new Promise((n,a)=>{const r=()=>{n(D(e.result))},o=()=>{a(e.error)};e.onsuccess=r,e.onerror=o});return x.set(t,e),t}function je(e){if(L.has(e))return;const t=new Promise((n,a)=>{const r=()=>{n()},o=()=>{a(e.error||new DOMException("AbortError","AbortError"))};e.oncomplete=r,e.onerror=o,e.onabort=o});L.set(e,t)}let M={get(e,t,n){if(e instanceof IDBTransaction){if(t==="done")return L.get(e);if(t==="store")return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return D(e[t])},set(e,t,n){return e[t]=n,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function ne(e){M=e(M)}function Ve(e){return Fe().includes(e)?function(...t){return e.apply(F(this),t),D(this.request)}:function(...t){return D(e.apply(F(this),t))}}function Ke(e){return typeof e=="function"?Ve(e):(e instanceof IDBTransaction&&je(e),N(e,Me())?new Proxy(e,M):e)}function D(e){if(e instanceof IDBRequest)return He(e);if(O.has(e))return O.get(e);const t=Ke(e);return t!==e&&(O.set(e,t),x.set(t,e)),t}const F=e=>x.get(e);function Ge(e,t,{blocked:n,upgrade:a,blocking:r,terminated:o}={}){const s=indexedDB.open(e,t),i=D(s);return a&&(s.onupgradeneeded=d=>{a(D(s.result),d.oldVersion,d.newVersion,D(s.transaction),d)}),n&&(s.onblocked=d=>n(d.oldVersion,d.newVersion,d)),i.then(d=>{o&&(d.onclose=()=>o()),r&&(d.onversionchange=u=>r(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function H(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&(n.onblocked=a=>t(a.oldVersion,a)),D(n).then(()=>{})}const We=["get","getKey","getAll","getAllKeys","count"],$e=["put","add","delete","clear"],j=new Map;function ae(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(j.get(t))return j.get(t);const n=t.replace(/FromIndex$/,""),a=t!==n,r=$e.includes(n);if(!(n in(a?IDBIndex:IDBObjectStore).prototype)||!(r||We.includes(n)))return;const o=async function(s,...i){const d=this.transaction(s,r?"readwrite":"readonly");let u=d.store;return a&&(u=u.index(i.shift())),(await Promise.all([u[n](...i),r&&d.done]))[0]};return j.set(t,o),o}ne(e=>({...e,get:(t,n,a)=>ae(t,n)||e.get(t,n,a),has:(t,n)=>!!ae(t,n)||e.has(t,n)}));const qe=["continue","continuePrimaryKey","advance"],re={},V=new WeakMap,oe=new WeakMap,ze={get(e,t){if(!qe.includes(t))return e[t];let n=re[t];return n||(n=re[t]=function(...a){V.set(this,oe.get(this)[t](...a))}),n}};async function*Je(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;const n=new Proxy(t,ze);for(oe.set(n,t),x.set(n,F(t));t;)yield n,t=await(V.get(n)||t.continue()),V.delete(n)}function se(e,t){return t===Symbol.asyncIterator&&N(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&N(e,[IDBIndex,IDBObjectStore])}ne(e=>({...e,get(t,n,a){return se(t,n)?Je:e.get(t,n,a)},has(t,n){return se(t,n)||e.has(t,n)}}));const Qe=e=>{if(e instanceof Attr)return null;let t=1;for(let n=e.previousSibling;n;n=n.previousSibling)n.nodeName===e.nodeName&&++t;return t},ie=e=>{if(e===null)return"";const t=[];if(e instanceof Document)return"/";for(let n=e;n&&!(n instanceof Document)&&n!==null;n=n instanceof Attr?n.ownerElement:n.parentElement){const a=t[t.length]={name:void 0,position:null};switch(n.nodeType){case Node.TEXT_NODE:a.name="text()";break;case Node.ATTRIBUTE_NODE:a.name="@"+n.nodeName;break;case Node.PROCESSING_INSTRUCTION_NODE:a.name="processing-instruction()";break;case Node.COMMENT_NODE:a.name="comment()";break;case Node.ELEMENT_NODE:a.name=n.nodeName;break}a.position=Qe(n)}return"/"+t.reverse().map(n=>n.position!==null?`/${n.name}[${n.position}]`:`/${n.name}`).join("")},b={capture:!0,passive:!0},Xe=["a","button","input","option","li","link"],Ye=["Escape","Enter","Backspace","F5","Tab"];let B=!1;const Ze=["label","type","role","title","placeholder","errormessage","valuetext","href"],de="aria-",et=e=>{if(!e.tagName)return"No tagName";const t=e.getAttribute("type");return t?`${t} ${e.tagName.toLowerCase()}`:e.tagName.toLowerCase()},le=e=>{var t;if(((t=e.tagName)==null?void 0:t.toLowerCase())==="html")return{element:"html"};const n=e.textContent,a=n?{text:n}:{};a.element=et(e);for(const r of e.attributes){let o=r.name;const s=r.value;o.startsWith(de)&&(o=o.substring(de.length)),Ze.includes(o)&&(a[o]=s)}return a},tt=e=>{var t;if(!e)return{};const n={...le(e)},a=e.parentElement;if(a&&Xe.includes((t=a.tagName)==null?void 0:t.toLowerCase())){const r=le(a);Object.assign(n,r)}return n},ue=(e,t)=>{var n;yt({x:t.x,y:t.y,type:e,elementAttributes:tt(t.target),windowHeight:window.innerHeight,windowWidth:window.innerWidth,...t.target instanceof HTMLElement?{rect:(n=t.target)==null?void 0:n.getBoundingClientRect(),xPath:ie(t.target)}:{}})},nt=e=>t=>ue(e,t),ce=e=>{Ye.includes(e.key)&&bt({key:e.key})},at=()=>{window.performance.getEntriesByType("navigation").map(e=>e.type).includes("reload")&&ht({url:window.location.href,currentPageTitle:document.title})},rt=()=>{window.performance.getEntriesByType("navigation").map(e=>e.type).includes("back_forward")&&Dt({curUrl:window.location.href,fromUrl:document.referrer,currentPageTitle:document.title})},ot=(e,t)=>{let n;return a=>{clearTimeout(n),n=window.setTimeout(()=>e(a),t)}},st=e=>{if(!(e.target instanceof HTMLElement||e.target instanceof Document))return;let t=e.target;"scrollTop"in t||(t=t.documentElement),St({xPath:ie(t),x:t.scrollLeft,y:t.scrollTop,elementAttributes:{targetScrollWidth:t.scrollWidth,targetClientWidth:t.clientWidth,targetScrollHeight:t.scrollHeight,targetClientHeight:t.clientHeight}})},pe=ot(st,750),ge=nt("left_click"),me=e=>{e.button===2&&ue("right_click",e)},it=()=>{B||(window.addEventListener("click",ge,b),window.addEventListener("mousedown",me,b),window.addEventListener("keydown",ce,b),window.addEventListener("scroll",pe,b),B=!0,at(),rt())},dt=()=>{B&&(window.removeEventListener("click",ge,b),window.removeEventListener("mousedown",me,b),window.removeEventListener("keydown",ce,b),window.removeEventListener("scroll",pe,b),B=!1)},lt=3e4,p={isRecording:!1,scrollEventUuids:{},stopRecording:()=>{}},ut=.5,ct=async()=>{var e;if(!window.indexedDB||!window.IDBKeyRange||!window.CompressionStream)return!0;if((e=window.navigator.storage)!=null&&e.estimate)try{const{quota:t=0,usage:n=0}=await window.navigator.storage.estimate(),a=(t-n)/1024**3;return l.info("Storage",{availableGb:a}),a<ut}catch{return!0}return!1},pt=()=>{const e=w.getItem("sprig.sessionId");if(e)return l.info("SessionIDFound",{savedSessionId:e}),w.removeItem("sprig.sessionId"),e;const t=R();return l.info("GeneratedSessionID",{uuid:t}),t},y=pt(),U=()=>{w.setItem("sprig.disableReplayRecording","disabled")},v=()=>!!w.getItem("sprig.disableReplayRecording");window.addEventListener("beforeunload",()=>{l.info("BeforeUnload",{sessionId:y}),w.setItem("sprig.sessionId",y)});const gt=()=>v()?l.debug("ReplayDisabled-PendingHeatmaps"):f(async()=>{const e=(await c.getPendingCaptures({isHeatmap:!0})).map(n=>({eventId:n.captureParams.eventId,uuid:n.uuid})),t=[];e.forEach(({eventId:n,uuid:a})=>{Te(n)||t.push(a)}),t.length&&await c.markPendingHeatmapsReady(t)},"Error marking pending heatmaps ready"),mt=e=>{Date.now()-e>=lt&&f(()=>c.markPendingHeatmapsReady(),"Error in heatmap inactivity")},K=e=>e&&e.trim().substring(0,500).replace(/\s\s+/g," ").replace(/\r?\n|\r/g," ").substring(0,250),I=(e,t)=>{var n,a;if(!(v()||!p.isRecording))try{(a=(n=window.rrwebRecord)==null?void 0:n.addCustomEvent)==null||a.call(n,e,t)}catch(r){T("Error recording custom event",r)}},wt=e=>{e.description&&(e.description=K(e.description)),I("Sprig_PageView",e)},yt=e=>{var t;(t=e?.elementAttributes)!=null&&t.text&&(e.elementAttributes.text=K(e.elementAttributes.text)),I("Sprig_Click",e)},ft=e=>{I("Sprig_TrackEvent",e)},vt=e=>{I("Sprig_ShowSurvey",e)},It=e=>{I("Sprig_SubmitSurvey",e)},ht=e=>{I("Sprig_Refresh",e)},Dt=e=>{e.currentPageTitle&&(e.currentPageTitle=K(e.currentPageTitle)),I("Sprig_BackForward",e)},bt=e=>{I("Sprig_Keystroke",e)},St=async e=>{const{x:t,xPath:n,y:a}=e,r=p.scrollEventUuids[n];if(r)return f(async()=>{var o,s,i,d;const u=await c.openDB(),g=await u.get("events",r);if(g!=null&&g.event){const m=JSON.parse(g.event),E=t>((s=(o=m.data)==null?void 0:o.payload)==null?void 0:s.x),h=a>((d=(i=m.data)==null?void 0:i.payload)==null?void 0:d.y);if(!(E||h))return null;E&&(m.data.payload.x=t),h&&(m.data.payload.y=a),m.data.payload.elementAttributes=e.elementAttributes,g.event=JSON.stringify(m),await u.put("events",g)}else I("Sprig_Scroll",e)},"Error updating scroll event");I("Sprig_Scroll",e)},Et=()=>p.isRecording,we=()=>{p.stopRecording&&(p.stopRecording(),p.stopRecording=void 0),p.isRecording=!1,["cleanupInterval","inactivityInterval","pendingCheckInterval"].forEach(e=>{p[e]&&(clearInterval(p[e]),p[e]=void 0)}),dt()},kt=["did not allow mutations","called in an invalid security context"],Ct=e=>{if(!e)return!0;for(const t of kt)if(e.toLowerCase().includes(t))return!1;return!0},Rt=(e,t,{reportError:n=!0,extraInfo:a={}})=>{if(!v()&&t instanceof Error){if(U(),t.name==="VersionError")return l.error("VersionErr",{message:e}),c.deleteDB();Ct(t?.message)&&(n&&window.UserLeap.reportError(e,t,a),c.clearAll())}},T=(e,t,{reportError:n}={reportError:!0})=>{we(),l.error("ReplayErr",{code:t.code,name:t.name}),Rt(e,t,{reportError:n})},f=async(e,t)=>{try{await e()}catch(n){T(t,n)}},Pt=()=>{p.isRecording&&f(()=>{var e,t;return(t=(e=window.rrwebRecord)==null?void 0:e.takeFullSnapshot)==null?void 0:t.call(e,!0)},"Error recording full snapshot")},xt=async({surveyId:e,responseGroupUuid:t,eventDigest:n,headers:a})=>{if(!e||!t)return!1;const r=window.UserLeap._API_URL,o=await Z({surveyId:e,responseGroupUuid:t,eventDigest:n,apiUrl:r,headers:a},!0);return!(o!=null&&o.error)},ye=30,Bt=1;H("replayStorage").catch(console.error),H("sprig.replay").catch(console.error);class Ut{openDB(){return Ge("sprigReplay",Bt,{upgrade:(t,n,a)=>{if(a===0&&w.setItem("sprig.pendingCount","0"),!t.objectStoreNames.contains("events")){const r=t.createObjectStore("events",{keyPath:"uuid"});r.createIndex("sessionId","sessionId"),r.createIndex("timestamp","timestamp"),r.createIndex("[sessionId+timestamp]",["sessionId","timestamp"])}if(!t.objectStoreNames.contains("chunkUploads")){const r=t.createObjectStore("chunkUploads",{keyPath:"uuid"});r.createIndex("sessionId","sessionId"),r.createIndex("timestamp","timestamp"),r.createIndex("[sessionId+status]",["sessionId","status"]),r.createIndex("[uploadId+status]",["uploadId","status"]),r.createIndex("[sessionId+status+uploadId]",["sessionId","status","uploadId"])}if(!t.objectStoreNames.contains("pendingCaptures")){const r=t.createObjectStore("pendingCaptures",{keyPath:"uuid"});r.createIndex("sessionId","sessionId"),r.createIndex("timestamp","timestamp"),r.createIndex("[sessionId+targetTimestamp]",["sessionId","targetTimestamp"])}}})}deleteDB(){return H("sprigReplay").catch(console.error)}async bulkAdd(t,n){const a=(await this.openDB()).transaction(t,"readwrite");return Promise.all([...n.map(r=>a.store.add(r)),a.done])}async clearAll(){const t=(await this.openDB()).transaction(["events","chunkUploads","pendingCaptures"],"readwrite");return Promise.all([t.objectStore("events").clear(),t.objectStore("chunkUploads").clear(),t.objectStore("pendingCaptures").clear()])}async deleteBySessionId(t,n){const a=IDBKeyRange.only(n),r=(await this.openDB()).transaction(t,"readwrite"),o=r.store.index("sessionId");for await(const s of o.iterate(a))await s.delete();await r.done}async updatePartial(t,n,a){const r=(await this.openDB()).transaction(t,"readwrite"),o=await r.store.get(n);o&&await r.store.put({...o,...a}),await r.done}async deleteRowsBefore(t,n,a=()=>!0){const r=IDBKeyRange.upperBound(n,!0),o=(await this.openDB()).transaction(t,"readwrite"),s=o.store.index("timestamp");for await(const i of s.iterate(r))a(i.value)&&await i.delete();await o.done}async getEventsBetween(t,n=Date.now()){if(t>=n)return Promise.resolve([]);const a=IDBKeyRange.bound([y,t],[y,n],!1,!0);return(await this.openDB()).getAllFromIndex("events","[sessionId+timestamp]",a)}async updateEventsExpiredAt(t,n,a=ye){const r=new Date,o=r.setMinutes(r.getMinutes()+(a??ye)),s=(await this.openDB()).transaction("events","readwrite"),i=s.store.index("[sessionId+timestamp]"),d=IDBKeyRange.bound([y,t],[y,n],!1,!0);for await(const u of i.iterate(d))await u.update({...u.value,expiredAt:o});await s.done}async deleteChunkUploads(t,n){const a=IDBKeyRange.only([n,t]),r=(await this.openDB()).transaction("chunkUploads","readwrite");let o=await r.store.index("[uploadId+status]").openCursor(a);for(;o;)o.delete(),o=await o.continue();await r.done}async getChunkUploadsByStatus({sessionId:t,status:n,uploadId:a}){const r=(await this.openDB()).transaction("chunkUploads","readonly"),o=a?r.store.index("[uploadId+status]"):r.store.index("[sessionId+status]"),s=a?IDBKeyRange.only([a,n]):IDBKeyRange.only([t,n]);return o.getAll(s)}async getPendingCaptures(t={}){return(await(await this.openDB()).getAllFromIndex("pendingCaptures","sessionId",y)).filter(n=>!t.beforePresent||n.targetTimestamp<Date.now()).filter(n=>!t.isHeatmap||(n.captureParams.isHeatmap??!1))}async markPendingCaptureToCanUpload(t){const n=(await this.openDB()).transaction("pendingCaptures","readwrite"),a=n.store.index("sessionId");for await(const r of a.iterate(y)){const o=r.value;o.captureParams.responseGroupId===t&&await r.update({...o,canUpload:!0})}await n.done}async markPendingHeatmapsReady(t){if(parseInt(w.getItem("sprig.pendingCount")??"0")===0)return null;const n=Date.now(),a=(await this.openDB()).transaction("pendingCaptures","readwrite"),r=a.store.index("sessionId");for await(const o of r.iterate(y)){const s=o.value;s.captureParams.isHeatmap&&(!t||t.includes(s.uuid))&&await o.update({...s,targetTimestamp:n,captureParams:{...s.captureParams,triggerTimestamp:n,replayParams:{...s.captureParams.replayParams,replayDurationSeconds:Math.floor((n-s.timestamp)/1e3)}}})}await a.done}}const c=new Ut,fe=async(e,t)=>{const n=performance.now();let a;try{a=await e()}finally{const r=performance.now()-n;let o=Q[t];o||(o=X(t)),o.report(r/1e3)}return a},ve=(e,t)=>{const n=performance.now();try{e()}finally{const a=performance.now()-n;let r=Q[t];r||(r=X(t)),r.report(a/1e3)}};var Tt={VITE_NPM_BUNDLE:"",BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1};let Ie=5e3,G=6e4,W=0;const _t=5,he=30,_=he+_t;let S,$=!1,q=[];const At=async({maxReplayDurationSeconds:e,maxInflightRequests:t=2,replaySettings:n,teardownAfter:a=!1})=>{if(S=w.getItem("sprig.pendingCount"),!p.isRecording){if(a&&w.setItem("sprig.teardownAfterCapture","true"),v())return l.debug("ReplayDisabled");if(await ct())return l.debug("IDBNotSupported"),U();try{const r=await c.openDB();l.info("DBVersion",{version:r.version})}catch(r){return l.error("ReplayOpenErr",{name:r.name}),r.name==="VersionError"&&c.deleteDB(),U()}if(!e)return l.debug("MissingDuration");l.debug("ReplayInit"),await f(async()=>{if(n!=null&&n.minDuration&&(Ie=n.minDuration),n!=null&&n.batchDuration&&(G=n.batchDuration),Le(t),Vt(),Mt(e+_,30*60,e+_),Ft(),!window.rrwebRecord)try{const{record:i}=await import(window.UserLeap.replayLibraryURL??`${Tt.VITE_CDN}/dependencies/record-2.0.0-alpha.17.min.js`);window.rrwebRecord=i}catch{return U(),l.error("LoadRecordFailed")}const r=window.rrwebRecord;if(!r)return l.error("RecordScriptFailed");let o=!0,s=0;p.stopRecording=r({checkoutEveryNms:he*1e3,sampling:{input:"last",scroll:250,media:800},emit:(i,d)=>{if(i.type===C.Custom&&(W=Date.now()),v())return;if(d&&i.type===C.Meta)s=performance.now();else if(d&&s&&i.type===C.FullSnapshot){const g=performance.now()-s;_e("sdk_replay_snapshot_seconds",g/1e3)}const u=o||!!d&&i.type===C.Meta;o=!1,Nt({uuid:R(),event:JSON.stringify(i),isValidStart:u,timestamp:Date.now()})},...n}),p.isRecording=!!p.stopRecording,p.isRecording&&(P.on("survey.complete",i=>{It({id:i,userAgent:window.navigator.userAgent})}),it())},"Error initializing replay")}},Nt=e=>{var t,n,a,r;if((t=e.event)!=null&&t.includes("Sprig_Scroll")){const o=(r=(a=(n=JSON.parse(e.event))==null?void 0:n.data)==null?void 0:a.payload)==null?void 0:r.xPath;if(!o)return;p.scrollEventUuids[o]=e.uuid}q.push(e),$||Ot()},Lt=async e=>{const t=e.map(n=>({...n,sessionId:n.sessionId??y}));if(t.length!==0)return f(()=>c.bulkAdd("events",t),"Error storing replay events")},Ot=()=>{$=!0,setTimeout(async()=>{if(v())return;const e=q;q=[],$=!1,ve(async()=>{await Lt(e)},"sdk_replay_add_event_batch_seconds")},500)},Mt=(e,t,n)=>{p.cleanupInterval=window.setInterval(()=>{const a=Date.now();fe(()=>f(async()=>{v()||await Promise.all([c.deleteRowsBefore("events",a-e*1e3,r=>r.expiredAt===void 0||r.expiredAt<a-e*1e3),c.deleteRowsBefore("chunkUploads",a-t*1e3),c.deleteRowsBefore("pendingCaptures",a-n*1e3,r=>!r.canUpload)])},"Error deleting table rows"),"sdk_replay_cleanup_seconds"),l.debug("CleanupComplete")},3e4)},Ft=()=>{p.pendingCheckInterval=window.setInterval(async()=>{f(async()=>{const e=parseInt(S??"0");if(e===0)return;const t=await c.getPendingCaptures({beforePresent:!0}),n=await c.openDB();await Promise.all(t.map(async a=>(await n.delete("pendingCaptures",a.uuid),Ee(a.captureParams,a.canUpload)))),S=(e-t.length).toString(),w.setItem("sprig.pendingCount",S)},"Error initiating pending captures")},5e3)},Ht=async(e,t,n,a,r)=>{const o=Math.min(e+r,n),s=await fe(()=>c.getEventsBetween(e,o),"sdk_replay_get_events_between_seconds");if(!(s!=null&&s.length))return l.debug("NoEventsFound"),{validStartFound:a,events:[]};if(!a){l.debug("ValidStartSearch");let i=-1;return s?.forEach((d,u)=>{if(!d.isValidStart)return;const g=d.timestamp<=t;(i<0||g)&&(i=u)}),i<0?(l.debug("ValidStartNotFound"),{validStartFound:a,events:[]}):{validStartFound:!0,events:s?.slice(i)}}return{validStartFound:a,events:s}},jt=(e,t,n)=>{const a=e.length,r=t*1024*1024,o=Math.ceil(a/n),s=Math.max(r,o),i=[];let d=0;for(;d<a;)i.push(e.slice(d,d+s)),d+=s;return i},De=e=>Promise.all(e.map(async t=>{const n=await Oe(t);return await c.updatePartial("chunkUploads",t.uuid,{data:null,etag:n,status:"UploadComplete"}),t.uploadId})),be=async e=>{const t=await c.getChunkUploadsByStatus({status:"UploadComplete",uploadId:e});if(!(t!=null&&t.length)){l.info("NoChunksForUpload",{uploadId:e});return}const n=t.reduce((o,s)=>(o.find(i=>i.chunkIndex===s.chunkIndex)||o.push(s),o),[]);n.sort((o,s)=>o.chunkIndex-s.chunkIndex);const a=n.map(o=>({ETag:o.etag,PartNumber:o.chunkIndex})).filter(o=>o.ETag!==null),r=n[0];await Z({apiUrl:r.apiUrl,surveyId:r.surveyId,uploadId:e,responseGroupUuid:r.responseGroupId,etags:a,headers:r.completeUploadHeaders,replayDuration:r.replayDuration}),await c.deleteChunkUploads("UploadComplete",e)},Vt=()=>{f(async()=>{const e=await c.getChunkUploadsByStatus({sessionId:y,status:"ReadyForUpload"});if(!(e!=null&&e.length))return;const t=await De(e);t!=null&&t.length&&await Promise.all(t.map(n=>{if(n)return be(n)}))},"Error uploading unfinished chunks")},Kt=async(e,t)=>{await De(t),await Promise.all(e.map(n=>be(n)))},Gt=async(e,t)=>{const n=new TextEncoder;let a=null;const r=new CompressionStream("gzip"),o=r.writable.getWriter();let s=!1,i=!1,[d,u]=[0,0];const g=e-_*1e3;let m=[];for(let h=g;h<t;h+=G){if({validStartFound:i,events:m}=await Ht(h,e,t,i,G),!(m!=null&&m.length)){l.debug("NoEventsFound");continue}d===0&&(d=m[0].timestamp),u=m[m.length-1].timestamp;const k=m.map(xe=>xe.event);k.push(`{"timestamp":${t}}`);const Re=`${s?",":"["}${k}`,Pe=n.encode(Re);ve(()=>{o.write(Pe)},"sdk_replay_compression_seconds"),s=!0}if(u-d<Ie)return l.debug("ReplayTooShort"),null;const E=n.encode("]");return o.write(E),o.close(),a=new Uint8Array(await new Response(r.readable).arrayBuffer()),a},Wt=async(e,t)=>{const n=t??Date.now(),a=n-e;return Gt(a,n)},Se=async e=>{const{surveyId:t,responseGroupId:n,visitorId:a,apiUrl:r,completeUploadHeaders:o,replayParams:s,triggerTimestamp:i}=e,d=await Wt(s.replayDurationSeconds*1e3,i);if(!(d!=null&&d.length)){l.info("FileDataEmpty",{surveyId:t});return}const u=jt(d,s.minimumChunkSizeMb,s.signedUrls.length),g=await Promise.all(u.map(async(m,E)=>{const h=R(),k={apiUrl:r,chunkIndex:E+1,completeUploadHeaders:o,etag:null,responseGroupId:n,status:"ReadyForUpload",surveyId:t,timestamp:i,totalChunks:u.length,data:m,uploadId:s.uploadId,uploadUrl:s.signedUrls[E].url,uuid:h,visitorId:a};return await(await c.openDB()).add("chunkUploads",{...k,sessionId:k.sessionId??y}),k}));await Kt([s.uploadId],g)},Ee=async(e,t)=>{if(v())return l.debug("ReplayDisabled-ScheduleOrCapture");const{isHeatmap:n,isStandalone:a,replayParams:r,triggerTimestamp:o,responseGroupId:s}=e,i=async()=>{setTimeout(()=>P.removeListener(A.QuestionAnswered,i),0),f(async()=>{r.replayDurationType==="before"?await Se(e):await c.markPendingCaptureToCanUpload(s)},"Error in schedule/capture callback")};f(async()=>{if(r.replayDurationType==="after"||r.replayDurationType==="beforeAndAfter"){!a&&!n&&P.on(A.QuestionAnswered,i),await Ce(e);return}if(a||n||t)await Se(e),n&&$t();else{const d=_+r.replayDurationSeconds,u=o-d*1e3,g=o;await c.updateEventsExpiredAt(u,g,r.expirationTimeLimitMinutes),P.on(A.QuestionAnswered,i)}},"Error in scheduling/capturing replay")},$t=async()=>{parseInt(S??"0")||w.removeItem("sprig.isCapturingHeatmap"),w.getItem("sprig.teardownAfterCapture")&&(we(),ke(),w.removeItem("sprig.teardownAfterCapture"))},ke=async()=>v()?l.debug("ReplayDisabled-ClearData"):Promise.all([c.deleteBySessionId("events",y),c.deleteBySessionId("pendingCaptures",y)]).catch(e=>{T("Error clearing user replay data",e)}),Ce=async e=>{if(v())return;const{isHeatmap:t,surveyId:n}=e,a=await c.getPendingCaptures(),r=a?.filter(i=>i.captureParams.surveyId===n);if(r!=null&&r.length){l.info("PendingCaptureExists",{surveyId:n});return}t&&(Pt(),w.setItem("sprig.isCapturingHeatmap","true"),W=Date.now(),p.inactivityInterval||(p.inactivityInterval=window.setInterval(()=>{mt(W)},1e3)));const o={...e,replayParams:{...e.replayParams}};e.replayParams.replayDurationType==="beforeAndAfter"&&(o.replayParams.replayDurationSeconds*=2),o.replayParams.replayDurationType="before";const s=e.triggerTimestamp+e.replayParams.replayDurationSeconds*1e3;o.triggerTimestamp=s,S=(parseInt(S??"0")+1).toString(),w.setItem("sprig.pendingCount",S),await(await c.openDB()).add("pendingCaptures",{canUpload:!1,captureParams:o,sessionId:y,targetTimestamp:s,timestamp:Date.now(),uuid:R()})},qt=Object.freeze(Object.defineProperty({__proto__:null,RecordEvent:ft,RecordPageView:wt,RecordSurveyShown:vt,_completeSessionReplay:xt,checkPendingHeatmapsUrl:gt,clearUserReplayData:ke,disableRecording:T,initializeReplay:At,isReplayRecording:Et,scheduleCapture:Ce,scheduleOrCaptureReplay:Ee,tryReplayAction:f},Symbol.toStringTag,{value:"Module"}));Ae(qt);
1
+ var Be=Object.defineProperty,Ue=(e,t,n)=>t in e?Be(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,z=(e,t,n)=>(Ue(e,typeof t!="symbol"?t+"":t,n),n);import{b as l,s as J,a as w,v as R,c as Te,P as Q,r as X,d as _e,e as P,S as A,f as Ae}from"./metricsReporter-pb5Px0rg.js";var C=(e=>(e[e.DomContentLoaded=0]="DomContentLoaded",e[e.Load=1]="Load",e[e.FullSnapshot=2]="FullSnapshot",e[e.IncrementalSnapshot=3]="IncrementalSnapshot",e[e.Meta=4]="Meta",e[e.Custom=5]="Custom",e[e.Plugin=6]="Plugin",e))(C||{});class Ne{constructor(t){z(this,"awaitingResolvers",[]),z(this,"activeCount",0),this.capacity=t}async acquire(){if(this.activeCount<this.capacity){this.activeCount++;return}return new Promise(t=>{this.awaitingResolvers.push(t)})}release(){const t=this.awaitingResolvers.shift();t&&this.activeCount<=this.capacity?t():this.activeCount--}async execute(t){try{return await this.acquire(),await t()}finally{this.release()}}setLimit(t){this.capacity=t}}const Y=new Ne(2),Le=e=>Y.setLimit(e),Oe=async e=>Y.execute(async()=>{var t;l.info("UploadChunkStart",{chunkIndex:e.chunkIndex,surveyId:e.surveyId});const n=await J(e.uploadUrl,{body:e.data,method:"PUT"});l.http("UploadChunkEnd",{url:e.uploadUrl,method:"PUT",status_code:n.status,reason:n.statusText??"OK",chunkIndex:e.chunkIndex,surveyId:e.surveyId});const a=(t=n.headers)==null?void 0:t.get("ETag");if(!a)throw new Error(`Upload response did not include etag for upload ${e.uploadId}, part ${e.chunkIndex}`);return a}),Z=async({apiUrl:e,surveyId:t,uploadId:n,etags:a,headers:r,responseGroupUuid:o,replayDuration:s,eventDigest:i},d=!1)=>{var u;if(!d&&!n&&!a){l.error("UploadErr",{isMobile:d,uploadId:n,etags:a});return}l.info("MarkUploadComplete",{surveyId:t});const g=await J(`${e}/sdk/1/completeSessionReplay`,{method:"POST",body:JSON.stringify({etags:a,uploadId:n,responseGroupUuid:o,surveyId:t,replayDuration:s,eventDigest:i,userAgent:(u=window?.navigator)==null?void 0:u.userAgent}),headers:r,shouldRetryRequest:!0});return l.info("MarkUploadDone",{surveyId:t}),g},N=(e,t)=>t.some(n=>e instanceof n);let ee,te;function Me(){return ee||(ee=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Fe(){return te||(te=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const L=new WeakMap,O=new WeakMap,x=new WeakMap;function He(e){const t=new Promise((n,a)=>{const r=()=>{n(D(e.result))},o=()=>{a(e.error)};e.onsuccess=r,e.onerror=o});return x.set(t,e),t}function je(e){if(L.has(e))return;const t=new Promise((n,a)=>{const r=()=>{n()},o=()=>{a(e.error||new DOMException("AbortError","AbortError"))};e.oncomplete=r,e.onerror=o,e.onabort=o});L.set(e,t)}let M={get(e,t,n){if(e instanceof IDBTransaction){if(t==="done")return L.get(e);if(t==="store")return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return D(e[t])},set(e,t,n){return e[t]=n,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function ne(e){M=e(M)}function Ve(e){return Fe().includes(e)?function(...t){return e.apply(F(this),t),D(this.request)}:function(...t){return D(e.apply(F(this),t))}}function Ke(e){return typeof e=="function"?Ve(e):(e instanceof IDBTransaction&&je(e),N(e,Me())?new Proxy(e,M):e)}function D(e){if(e instanceof IDBRequest)return He(e);if(O.has(e))return O.get(e);const t=Ke(e);return t!==e&&(O.set(e,t),x.set(t,e)),t}const F=e=>x.get(e);function Ge(e,t,{blocked:n,upgrade:a,blocking:r,terminated:o}={}){const s=indexedDB.open(e,t),i=D(s);return a&&(s.onupgradeneeded=d=>{a(D(s.result),d.oldVersion,d.newVersion,D(s.transaction),d)}),n&&(s.onblocked=d=>n(d.oldVersion,d.newVersion,d)),i.then(d=>{o&&(d.onclose=()=>o()),r&&(d.onversionchange=u=>r(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function H(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&(n.onblocked=a=>t(a.oldVersion,a)),D(n).then(()=>{})}const We=["get","getKey","getAll","getAllKeys","count"],$e=["put","add","delete","clear"],j=new Map;function ae(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(j.get(t))return j.get(t);const n=t.replace(/FromIndex$/,""),a=t!==n,r=$e.includes(n);if(!(n in(a?IDBIndex:IDBObjectStore).prototype)||!(r||We.includes(n)))return;const o=async function(s,...i){const d=this.transaction(s,r?"readwrite":"readonly");let u=d.store;return a&&(u=u.index(i.shift())),(await Promise.all([u[n](...i),r&&d.done]))[0]};return j.set(t,o),o}ne(e=>({...e,get:(t,n,a)=>ae(t,n)||e.get(t,n,a),has:(t,n)=>!!ae(t,n)||e.has(t,n)}));const qe=["continue","continuePrimaryKey","advance"],re={},V=new WeakMap,oe=new WeakMap,ze={get(e,t){if(!qe.includes(t))return e[t];let n=re[t];return n||(n=re[t]=function(...a){V.set(this,oe.get(this)[t](...a))}),n}};async function*Je(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;const n=new Proxy(t,ze);for(oe.set(n,t),x.set(n,F(t));t;)yield n,t=await(V.get(n)||t.continue()),V.delete(n)}function se(e,t){return t===Symbol.asyncIterator&&N(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&N(e,[IDBIndex,IDBObjectStore])}ne(e=>({...e,get(t,n,a){return se(t,n)?Je:e.get(t,n,a)},has(t,n){return se(t,n)||e.has(t,n)}}));const Qe=e=>{if(e instanceof Attr)return null;let t=1;for(let n=e.previousSibling;n;n=n.previousSibling)n.nodeName===e.nodeName&&++t;return t},ie=e=>{if(e===null)return"";const t=[];if(e instanceof Document)return"/";for(let n=e;n&&!(n instanceof Document)&&n!==null;n=n instanceof Attr?n.ownerElement:n.parentElement){const a=t[t.length]={name:void 0,position:null};switch(n.nodeType){case Node.TEXT_NODE:a.name="text()";break;case Node.ATTRIBUTE_NODE:a.name="@"+n.nodeName;break;case Node.PROCESSING_INSTRUCTION_NODE:a.name="processing-instruction()";break;case Node.COMMENT_NODE:a.name="comment()";break;case Node.ELEMENT_NODE:a.name=n.nodeName;break}a.position=Qe(n)}return"/"+t.reverse().map(n=>n.position!==null?`/${n.name}[${n.position}]`:`/${n.name}`).join("")},b={capture:!0,passive:!0},Xe=["a","button","input","option","li","link"],Ye=["Escape","Enter","Backspace","F5","Tab"];let B=!1;const Ze=["label","type","role","title","placeholder","errormessage","valuetext","href"],de="aria-",et=e=>{if(!e.tagName)return"No tagName";const t=e.getAttribute("type");return t?`${t} ${e.tagName.toLowerCase()}`:e.tagName.toLowerCase()},le=e=>{var t;if(((t=e.tagName)==null?void 0:t.toLowerCase())==="html")return{element:"html"};const n=e.textContent,a=n?{text:n}:{};a.element=et(e);for(const r of e.attributes){let o=r.name;const s=r.value;o.startsWith(de)&&(o=o.substring(de.length)),Ze.includes(o)&&(a[o]=s)}return a},tt=e=>{var t;if(!e)return{};const n={...le(e)},a=e.parentElement;if(a&&Xe.includes((t=a.tagName)==null?void 0:t.toLowerCase())){const r=le(a);Object.assign(n,r)}return n},ue=(e,t)=>{var n;yt({x:t.x,y:t.y,type:e,elementAttributes:tt(t.target),windowHeight:window.innerHeight,windowWidth:window.innerWidth,...t.target instanceof HTMLElement?{rect:(n=t.target)==null?void 0:n.getBoundingClientRect(),xPath:ie(t.target)}:{}})},nt=e=>t=>ue(e,t),ce=e=>{Ye.includes(e.key)&&bt({key:e.key})},at=()=>{window.performance.getEntriesByType("navigation").map(e=>e.type).includes("reload")&&ht({url:window.location.href,currentPageTitle:document.title})},rt=()=>{window.performance.getEntriesByType("navigation").map(e=>e.type).includes("back_forward")&&Dt({curUrl:window.location.href,fromUrl:document.referrer,currentPageTitle:document.title})},ot=(e,t)=>{let n;return a=>{clearTimeout(n),n=window.setTimeout(()=>e(a),t)}},st=e=>{if(!(e.target instanceof HTMLElement||e.target instanceof Document))return;let t=e.target;"scrollTop"in t||(t=t.documentElement),St({xPath:ie(t),x:t.scrollLeft,y:t.scrollTop,elementAttributes:{targetScrollWidth:t.scrollWidth,targetClientWidth:t.clientWidth,targetScrollHeight:t.scrollHeight,targetClientHeight:t.clientHeight}})},pe=ot(st,750),ge=nt("left_click"),me=e=>{e.button===2&&ue("right_click",e)},it=()=>{B||(window.addEventListener("click",ge,b),window.addEventListener("mousedown",me,b),window.addEventListener("keydown",ce,b),window.addEventListener("scroll",pe,b),B=!0,at(),rt())},dt=()=>{B&&(window.removeEventListener("click",ge,b),window.removeEventListener("mousedown",me,b),window.removeEventListener("keydown",ce,b),window.removeEventListener("scroll",pe,b),B=!1)},lt=3e4,p={isRecording:!1,scrollEventUuids:{},stopRecording:()=>{}},ut=.5,ct=async()=>{var e;if(!window.indexedDB||!window.IDBKeyRange||!window.CompressionStream)return!0;if((e=window.navigator.storage)!=null&&e.estimate)try{const{quota:t=0,usage:n=0}=await window.navigator.storage.estimate(),a=(t-n)/1024**3;return l.info("Storage",{availableGb:a}),a<ut}catch{return!0}return!1},pt=()=>{const e=w.getItem("sprig.sessionId");if(e)return l.info("SessionIDFound",{savedSessionId:e}),w.removeItem("sprig.sessionId"),e;const t=R();return l.info("GeneratedSessionID",{uuid:t}),t},y=pt(),U=()=>{w.setItem("sprig.disableReplayRecording","disabled")},v=()=>!!w.getItem("sprig.disableReplayRecording");window.addEventListener("beforeunload",()=>{l.info("BeforeUnload",{sessionId:y}),w.setItem("sprig.sessionId",y)});const gt=()=>v()?l.debug("ReplayDisabled-PendingHeatmaps"):f(async()=>{const e=(await c.getPendingCaptures({isHeatmap:!0})).map(n=>({eventId:n.captureParams.eventId,uuid:n.uuid})),t=[];e.forEach(({eventId:n,uuid:a})=>{Te(n)||t.push(a)}),t.length&&await c.markPendingHeatmapsReady(t)},"Error marking pending heatmaps ready"),mt=e=>{Date.now()-e>=lt&&f(()=>c.markPendingHeatmapsReady(),"Error in heatmap inactivity")},K=e=>e&&e.trim().substring(0,500).replace(/\s\s+/g," ").replace(/\r?\n|\r/g," ").substring(0,250),I=(e,t)=>{var n,a;if(!(v()||!p.isRecording))try{(a=(n=window.rrwebRecord)==null?void 0:n.addCustomEvent)==null||a.call(n,e,t)}catch(r){T("Error recording custom event",r)}},wt=e=>{e.description&&(e.description=K(e.description)),I("Sprig_PageView",e)},yt=e=>{var t;(t=e?.elementAttributes)!=null&&t.text&&(e.elementAttributes.text=K(e.elementAttributes.text)),I("Sprig_Click",e)},ft=e=>{I("Sprig_TrackEvent",e)},vt=e=>{I("Sprig_ShowSurvey",e)},It=e=>{I("Sprig_SubmitSurvey",e)},ht=e=>{I("Sprig_Refresh",e)},Dt=e=>{e.currentPageTitle&&(e.currentPageTitle=K(e.currentPageTitle)),I("Sprig_BackForward",e)},bt=e=>{I("Sprig_Keystroke",e)},St=async e=>{const{x:t,xPath:n,y:a}=e,r=p.scrollEventUuids[n];if(r)return f(async()=>{var o,s,i,d;const u=await c.openDB(),g=await u.get("events",r);if(g!=null&&g.event){const m=JSON.parse(g.event),E=t>((s=(o=m.data)==null?void 0:o.payload)==null?void 0:s.x),h=a>((d=(i=m.data)==null?void 0:i.payload)==null?void 0:d.y);if(!(E||h))return null;E&&(m.data.payload.x=t),h&&(m.data.payload.y=a),m.data.payload.elementAttributes=e.elementAttributes,g.event=JSON.stringify(m),await u.put("events",g)}else I("Sprig_Scroll",e)},"Error updating scroll event");I("Sprig_Scroll",e)},Et=()=>p.isRecording,we=()=>{p.stopRecording&&(p.stopRecording(),p.stopRecording=void 0),p.isRecording=!1,["cleanupInterval","inactivityInterval","pendingCheckInterval"].forEach(e=>{p[e]&&(clearInterval(p[e]),p[e]=void 0)}),dt()},kt=["did not allow mutations","called in an invalid security context"],Ct=e=>{if(!e)return!0;for(const t of kt)if(e.toLowerCase().includes(t))return!1;return!0},Rt=(e,t,{reportError:n=!0,extraInfo:a={}})=>{if(!v()&&t instanceof Error){if(U(),t.name==="VersionError")return l.error("VersionErr",{message:e}),c.deleteDB();Ct(t?.message)&&(n&&window.UserLeap.reportError(e,t,a),c.clearAll())}},T=(e,t,{reportError:n}={reportError:!0})=>{we(),l.error("ReplayErr",{code:t.code,name:t.name}),Rt(e,t,{reportError:n})},f=async(e,t)=>{try{await e()}catch(n){T(t,n)}},Pt=()=>{p.isRecording&&f(()=>{var e,t;return(t=(e=window.rrwebRecord)==null?void 0:e.takeFullSnapshot)==null?void 0:t.call(e,!0)},"Error recording full snapshot")},xt=async({surveyId:e,responseGroupUuid:t,eventDigest:n,headers:a})=>{if(!e||!t)return!1;const r=window.UserLeap._API_URL,o=await Z({surveyId:e,responseGroupUuid:t,eventDigest:n,apiUrl:r,headers:a},!0);return!(o!=null&&o.error)},ye=30,Bt=1;H("replayStorage").catch(console.error),H("sprig.replay").catch(console.error);class Ut{openDB(){return Ge("sprigReplay",Bt,{upgrade:(t,n,a)=>{if(a===0&&w.setItem("sprig.pendingCount","0"),!t.objectStoreNames.contains("events")){const r=t.createObjectStore("events",{keyPath:"uuid"});r.createIndex("sessionId","sessionId"),r.createIndex("timestamp","timestamp"),r.createIndex("[sessionId+timestamp]",["sessionId","timestamp"])}if(!t.objectStoreNames.contains("chunkUploads")){const r=t.createObjectStore("chunkUploads",{keyPath:"uuid"});r.createIndex("sessionId","sessionId"),r.createIndex("timestamp","timestamp"),r.createIndex("[sessionId+status]",["sessionId","status"]),r.createIndex("[uploadId+status]",["uploadId","status"]),r.createIndex("[sessionId+status+uploadId]",["sessionId","status","uploadId"])}if(!t.objectStoreNames.contains("pendingCaptures")){const r=t.createObjectStore("pendingCaptures",{keyPath:"uuid"});r.createIndex("sessionId","sessionId"),r.createIndex("timestamp","timestamp"),r.createIndex("[sessionId+targetTimestamp]",["sessionId","targetTimestamp"])}}})}deleteDB(){return H("sprigReplay").catch(console.error)}async bulkAdd(t,n){const a=(await this.openDB()).transaction(t,"readwrite");return Promise.all([...n.map(r=>a.store.add(r)),a.done])}async clearAll(){const t=(await this.openDB()).transaction(["events","chunkUploads","pendingCaptures"],"readwrite");return Promise.all([t.objectStore("events").clear(),t.objectStore("chunkUploads").clear(),t.objectStore("pendingCaptures").clear()])}async deleteBySessionId(t,n){const a=IDBKeyRange.only(n),r=(await this.openDB()).transaction(t,"readwrite"),o=r.store.index("sessionId");for await(const s of o.iterate(a))await s.delete();await r.done}async updatePartial(t,n,a){const r=(await this.openDB()).transaction(t,"readwrite"),o=await r.store.get(n);o&&await r.store.put({...o,...a}),await r.done}async deleteRowsBefore(t,n,a=()=>!0){const r=IDBKeyRange.upperBound(n,!0),o=(await this.openDB()).transaction(t,"readwrite"),s=o.store.index("timestamp");for await(const i of s.iterate(r))a(i.value)&&await i.delete();await o.done}async getEventsBetween(t,n=Date.now()){if(t>=n)return Promise.resolve([]);const a=IDBKeyRange.bound([y,t],[y,n],!1,!0);return(await this.openDB()).getAllFromIndex("events","[sessionId+timestamp]",a)}async updateEventsExpiredAt(t,n,a=ye){const r=new Date,o=r.setMinutes(r.getMinutes()+(a??ye)),s=(await this.openDB()).transaction("events","readwrite"),i=s.store.index("[sessionId+timestamp]"),d=IDBKeyRange.bound([y,t],[y,n],!1,!0);for await(const u of i.iterate(d))await u.update({...u.value,expiredAt:o});await s.done}async deleteChunkUploads(t,n){const a=IDBKeyRange.only([n,t]),r=(await this.openDB()).transaction("chunkUploads","readwrite");let o=await r.store.index("[uploadId+status]").openCursor(a);for(;o;)o.delete(),o=await o.continue();await r.done}async getChunkUploadsByStatus({sessionId:t,status:n,uploadId:a}){const r=(await this.openDB()).transaction("chunkUploads","readonly"),o=a?r.store.index("[uploadId+status]"):r.store.index("[sessionId+status]"),s=a?IDBKeyRange.only([a,n]):IDBKeyRange.only([t,n]);return o.getAll(s)}async getPendingCaptures(t={}){return(await(await this.openDB()).getAllFromIndex("pendingCaptures","sessionId",y)).filter(n=>!t.beforePresent||n.targetTimestamp<Date.now()).filter(n=>!t.isHeatmap||(n.captureParams.isHeatmap??!1))}async markPendingCaptureToCanUpload(t){const n=(await this.openDB()).transaction("pendingCaptures","readwrite"),a=n.store.index("sessionId");for await(const r of a.iterate(y)){const o=r.value;o.captureParams.responseGroupId===t&&await r.update({...o,canUpload:!0})}await n.done}async markPendingHeatmapsReady(t){if(parseInt(w.getItem("sprig.pendingCount")??"0")===0)return null;const n=Date.now(),a=(await this.openDB()).transaction("pendingCaptures","readwrite"),r=a.store.index("sessionId");for await(const o of r.iterate(y)){const s=o.value;s.captureParams.isHeatmap&&(!t||t.includes(s.uuid))&&await o.update({...s,targetTimestamp:n,captureParams:{...s.captureParams,triggerTimestamp:n,replayParams:{...s.captureParams.replayParams,replayDurationSeconds:Math.floor((n-s.timestamp)/1e3)}}})}await a.done}}const c=new Ut,fe=async(e,t)=>{const n=performance.now();let a;try{a=await e()}finally{const r=performance.now()-n;let o=Q[t];o||(o=X(t)),o.report(r/1e3)}return a},ve=(e,t)=>{const n=performance.now();try{e()}finally{const a=performance.now()-n;let r=Q[t];r||(r=X(t)),r.report(a/1e3)}};var Tt={VITE_NPM_BUNDLE:"",BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1};let Ie=5e3,G=6e4,W=0;const _t=5,he=30,_=he+_t;let S,$=!1,q=[];const At=async({maxReplayDurationSeconds:e,maxInflightRequests:t=2,replaySettings:n,teardownAfter:a=!1})=>{if(S=w.getItem("sprig.pendingCount"),!p.isRecording){if(a&&w.setItem("sprig.teardownAfterCapture","true"),v())return l.debug("ReplayDisabled");if(await ct())return l.debug("IDBNotSupported"),U();try{const r=await c.openDB();l.info("DBVersion",{version:r.version})}catch(r){return l.error("ReplayOpenErr",{name:r.name}),r.name==="VersionError"&&c.deleteDB(),U()}if(!e)return l.debug("MissingDuration");l.debug("ReplayInit"),await f(async()=>{if(n!=null&&n.minDuration&&(Ie=n.minDuration),n!=null&&n.batchDuration&&(G=n.batchDuration),Le(t),Vt(),Mt(e+_,30*60,e+_),Ft(),!window.rrwebRecord)try{const{record:i}=await import(window.UserLeap.replayLibraryURL??`${Tt.VITE_CDN}/dependencies/record-2.0.0-alpha.17.min.js`);window.rrwebRecord=i}catch{return U(),l.error("LoadRecordFailed")}const r=window.rrwebRecord;if(!r)return l.error("RecordScriptFailed");let o=!0,s=0;p.stopRecording=r({checkoutEveryNms:he*1e3,sampling:{input:"last",scroll:250,media:800},emit:(i,d)=>{if(i.type===C.Custom&&(W=Date.now()),v())return;if(d&&i.type===C.Meta)s=performance.now();else if(d&&s&&i.type===C.FullSnapshot){const g=performance.now()-s;_e("sdk_replay_snapshot_seconds",g/1e3)}const u=o||!!d&&i.type===C.Meta;o=!1,Nt({uuid:R(),event:JSON.stringify(i),isValidStart:u,timestamp:Date.now()})},...n}),p.isRecording=!!p.stopRecording,p.isRecording&&(P.on("survey.complete",i=>{It({id:i,userAgent:window.navigator.userAgent})}),it())},"Error initializing replay")}},Nt=e=>{var t,n,a,r;if((t=e.event)!=null&&t.includes("Sprig_Scroll")){const o=(r=(a=(n=JSON.parse(e.event))==null?void 0:n.data)==null?void 0:a.payload)==null?void 0:r.xPath;if(!o)return;p.scrollEventUuids[o]=e.uuid}q.push(e),$||Ot()},Lt=async e=>{const t=e.map(n=>({...n,sessionId:n.sessionId??y}));if(t.length!==0)return f(()=>c.bulkAdd("events",t),"Error storing replay events")},Ot=()=>{$=!0,setTimeout(async()=>{if(v())return;const e=q;q=[],$=!1,ve(async()=>{await Lt(e)},"sdk_replay_add_event_batch_seconds")},500)},Mt=(e,t,n)=>{p.cleanupInterval=window.setInterval(()=>{const a=Date.now();fe(()=>f(async()=>{v()||await Promise.all([c.deleteRowsBefore("events",a-e*1e3,r=>r.expiredAt===void 0||r.expiredAt<a-e*1e3),c.deleteRowsBefore("chunkUploads",a-t*1e3),c.deleteRowsBefore("pendingCaptures",a-n*1e3,r=>!r.canUpload)])},"Error deleting table rows"),"sdk_replay_cleanup_seconds"),l.debug("CleanupComplete")},3e4)},Ft=()=>{p.pendingCheckInterval=window.setInterval(async()=>{f(async()=>{const e=parseInt(S??"0");if(e===0)return;const t=await c.getPendingCaptures({beforePresent:!0}),n=await c.openDB();await Promise.all(t.map(async a=>(await n.delete("pendingCaptures",a.uuid),Ee(a.captureParams,a.canUpload)))),S=(e-t.length).toString(),w.setItem("sprig.pendingCount",S)},"Error initiating pending captures")},5e3)},Ht=async(e,t,n,a,r)=>{const o=Math.min(e+r,n),s=await fe(()=>c.getEventsBetween(e,o),"sdk_replay_get_events_between_seconds");if(!(s!=null&&s.length))return l.debug("NoEventsFound"),{validStartFound:a,events:[]};if(!a){l.debug("ValidStartSearch");let i=-1;return s?.forEach((d,u)=>{if(!d.isValidStart)return;const g=d.timestamp<=t;(i<0||g)&&(i=u)}),i<0?(l.debug("ValidStartNotFound"),{validStartFound:a,events:[]}):{validStartFound:!0,events:s?.slice(i)}}return{validStartFound:a,events:s}},jt=(e,t,n)=>{const a=e.length,r=t*1024*1024,o=Math.ceil(a/n),s=Math.max(r,o),i=[];let d=0;for(;d<a;)i.push(e.slice(d,d+s)),d+=s;return i},De=e=>Promise.all(e.map(async t=>{const n=await Oe(t);return await c.updatePartial("chunkUploads",t.uuid,{data:null,etag:n,status:"UploadComplete"}),t.uploadId})),be=async e=>{const t=await c.getChunkUploadsByStatus({status:"UploadComplete",uploadId:e});if(!(t!=null&&t.length)){l.info("NoChunksForUpload",{uploadId:e});return}const n=t.reduce((o,s)=>(o.find(i=>i.chunkIndex===s.chunkIndex)||o.push(s),o),[]);n.sort((o,s)=>o.chunkIndex-s.chunkIndex);const a=n.map(o=>({ETag:o.etag,PartNumber:o.chunkIndex})).filter(o=>o.ETag!==null),r=n[0];await Z({apiUrl:r.apiUrl,surveyId:r.surveyId,uploadId:e,responseGroupUuid:r.responseGroupId,etags:a,headers:r.completeUploadHeaders,replayDuration:r.replayDuration}),await c.deleteChunkUploads("UploadComplete",e)},Vt=()=>{f(async()=>{const e=await c.getChunkUploadsByStatus({sessionId:y,status:"ReadyForUpload"});if(!(e!=null&&e.length))return;const t=await De(e);t!=null&&t.length&&await Promise.all(t.map(n=>{if(n)return be(n)}))},"Error uploading unfinished chunks")},Kt=async(e,t)=>{await De(t),await Promise.all(e.map(n=>be(n)))},Gt=async(e,t)=>{const n=new TextEncoder;let a=null;const r=new CompressionStream("gzip"),o=r.writable.getWriter();let s=!1,i=!1,[d,u]=[0,0];const g=e-_*1e3;let m=[];for(let h=g;h<t;h+=G){if({validStartFound:i,events:m}=await Ht(h,e,t,i,G),!(m!=null&&m.length)){l.debug("NoEventsFound");continue}d===0&&(d=m[0].timestamp),u=m[m.length-1].timestamp;const k=m.map(xe=>xe.event);k.push(`{"timestamp":${t}}`);const Re=`${s?",":"["}${k}`,Pe=n.encode(Re);ve(()=>{o.write(Pe)},"sdk_replay_compression_seconds"),s=!0}if(u-d<Ie)return l.debug("ReplayTooShort"),null;const E=n.encode("]");return o.write(E),o.close(),a=new Uint8Array(await new Response(r.readable).arrayBuffer()),a},Wt=async(e,t)=>{const n=t??Date.now(),a=n-e;return Gt(a,n)},Se=async e=>{const{surveyId:t,responseGroupId:n,visitorId:a,apiUrl:r,completeUploadHeaders:o,replayParams:s,triggerTimestamp:i}=e,d=await Wt(s.replayDurationSeconds*1e3,i);if(!(d!=null&&d.length)){l.info("FileDataEmpty",{surveyId:t});return}const u=jt(d,s.minimumChunkSizeMb,s.signedUrls.length),g=await Promise.all(u.map(async(m,E)=>{const h=R(),k={apiUrl:r,chunkIndex:E+1,completeUploadHeaders:o,etag:null,responseGroupId:n,status:"ReadyForUpload",surveyId:t,timestamp:i,totalChunks:u.length,data:m,uploadId:s.uploadId,uploadUrl:s.signedUrls[E].url,uuid:h,visitorId:a};return await(await c.openDB()).add("chunkUploads",{...k,sessionId:k.sessionId??y}),k}));await Kt([s.uploadId],g)},Ee=async(e,t)=>{if(v())return l.debug("ReplayDisabled-ScheduleOrCapture");const{isHeatmap:n,isStandalone:a,replayParams:r,triggerTimestamp:o,responseGroupId:s}=e,i=async()=>{setTimeout(()=>P.removeListener(A.QuestionAnswered,i),0),f(async()=>{r.replayDurationType==="before"?await Se(e):await c.markPendingCaptureToCanUpload(s)},"Error in schedule/capture callback")};f(async()=>{if(r.replayDurationType==="after"||r.replayDurationType==="beforeAndAfter"){!a&&!n&&P.on(A.QuestionAnswered,i),await Ce(e);return}if(a||n||t)await Se(e),n&&$t();else{const d=_+r.replayDurationSeconds,u=o-d*1e3,g=o;await c.updateEventsExpiredAt(u,g,r.expirationTimeLimitMinutes),P.on(A.QuestionAnswered,i)}},"Error in scheduling/capturing replay")},$t=async()=>{parseInt(S??"0")||w.removeItem("sprig.isCapturingHeatmap"),w.getItem("sprig.teardownAfterCapture")&&(we(),ke(),w.removeItem("sprig.teardownAfterCapture"))},ke=async()=>v()?l.debug("ReplayDisabled-ClearData"):Promise.all([c.deleteBySessionId("events",y),c.deleteBySessionId("pendingCaptures",y)]).catch(e=>{T("Error clearing user replay data",e)}),Ce=async e=>{if(v())return;const{isHeatmap:t,surveyId:n}=e,a=await c.getPendingCaptures(),r=a?.filter(i=>i.captureParams.surveyId===n);if(r!=null&&r.length){l.info("PendingCaptureExists",{surveyId:n});return}t&&(Pt(),w.setItem("sprig.isCapturingHeatmap","true"),W=Date.now(),p.inactivityInterval||(p.inactivityInterval=window.setInterval(()=>{mt(W)},1e3)));const o={...e,replayParams:{...e.replayParams}};e.replayParams.replayDurationType==="beforeAndAfter"&&(o.replayParams.replayDurationSeconds*=2),o.replayParams.replayDurationType="before";const s=e.triggerTimestamp+e.replayParams.replayDurationSeconds*1e3;o.triggerTimestamp=s,S=(parseInt(S??"0")+1).toString(),w.setItem("sprig.pendingCount",S),await(await c.openDB()).add("pendingCaptures",{canUpload:!1,captureParams:o,sessionId:y,targetTimestamp:s,timestamp:Date.now(),uuid:R()})},qt=Object.freeze(Object.defineProperty({__proto__:null,RecordEvent:ft,RecordPageView:wt,RecordSurveyShown:vt,_completeSessionReplay:xt,checkPendingHeatmapsUrl:gt,clearUserReplayData:ke,disableRecording:T,initializeReplay:At,isReplayRecording:Et,scheduleCapture:Ce,scheduleOrCaptureReplay:Ee,tryReplayAction:f},Symbol.toStringTag,{value:"Module"}));Ae(qt);