@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/{core-CkasK3Wg.js → core-B6K_G_tP.js} +1 -1
- package/dist/{core-D5rViL33.cjs → core-JazVRZuc.cjs} +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.d.ts +1 -0
- package/dist/core.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/{metricsReporter-Bv4AKHDN.cjs → metricsReporter-ikJ_RTTQ.cjs} +1 -1
- package/dist/{metricsReporter-DKI8BwWD.js → metricsReporter-pb5Px0rg.js} +1 -1
- package/dist/replay.cjs +1 -1
- package/dist/replay.js +1 -1
- package/dist/view-C7NBKswM.cjs +685 -0
- package/dist/view-DtwxhY6m.js +685 -0
- package/package.json +1 -1
- package/dist/view-BXXr8-Xk.cjs +0 -685
- package/dist/view-Cabe-ObF.js +0 -685
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);
|