@sprig-technologies/sprig-browser 2.33.0 → 2.33.2

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.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./metricsReporter-BS7FQHoM.cjs"),e=require("./core-XsNCvQMt.cjs");exports.DismissReason=i.DismissReason,exports.SprigEvent=i.SprigEvent,exports.SprigAPI=e.SprigAPI,exports.default=e.core,exports.sprig=e.sprig;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./metricsReporter-BLXrIaei.cjs"),e=require("./core-B164snRL.cjs");exports.DismissReason=i.DismissReason,exports.SprigEvent=i.SprigEvent,exports.SprigAPI=e.SprigAPI,exports.default=e.core,exports.sprig=e.sprig;
package/dist/core.d.ts CHANGED
@@ -1346,6 +1346,7 @@ declare enum SprigEvent {
1346
1346
  FeedbackButtonLoaded = "feedback.button.loaded",
1347
1347
  SDKReady = "sdk.ready",
1348
1348
  SurveyAppeared = "survey.appeared",
1349
+ SurveyCloseRequested = "survey.closeRequested",//This event signals to mobile the survey overlay can close
1349
1350
  SurveyClosed = "survey.closed",
1350
1351
  SurveyDimensions = "survey.dimensions",
1351
1352
  SurveyFadingOut = "survey.fadingOut",
@@ -1485,6 +1486,14 @@ type SprigEventMap = {
1485
1486
  "survey.id": number;
1486
1487
  }
1487
1488
  ];
1489
+ [SprigEvent.SurveyCloseRequested]: [
1490
+ {
1491
+ initiator: DismissReason;
1492
+ name?: string;
1493
+ studyType?: StudyType;
1494
+ "survey.id": number;
1495
+ }
1496
+ ];
1488
1497
  [SprigEvent.SurveyWillClose]: [
1489
1498
  {
1490
1499
  initiator: DismissReason;
@@ -1888,6 +1897,7 @@ declare namespace sprigConfig {
1888
1897
  showSurveyCallback?: (surveyId?: number) => Promise<boolean>,
1889
1898
  calledFromApi?: boolean,
1890
1899
  ) => void;
1900
+ trackHistory?: ({ event: string }) => void;
1891
1901
  unmute: () => void;
1892
1902
  }
1893
1903
 
@@ -2003,10 +2013,7 @@ declare class SprigAPI {
2003
2013
  SURVEY_DIMENSIONS: SprigEvent;
2004
2014
  SURVEY_FADING_OUT: SprigEvent;
2005
2015
  SURVEY_HEIGHT: SprigEvent;
2006
- SURVEY_WIDTH: SprigEvent; /**
2007
- * Track an event to show survey if eligible
2008
- * @param eventName name of event to track
2009
- */
2016
+ SURVEY_WIDTH: SprigEvent;
2010
2017
  SURVEY_PRESENTED: SprigEvent;
2011
2018
  SURVEY_LIFE_CYCLE: SprigEvent;
2012
2019
  SURVEY_WILL_CLOSE: SprigEvent;
package/dist/core.js CHANGED
@@ -1,5 +1,5 @@
1
- import { D as r, S as e } from "./metricsReporter-DbO9obdT.js";
2
- import { S as o, c as p, s as t } from "./core-DuIpyIdz.js";
1
+ import { D as r, S as e } from "./metricsReporter-uTmb1eaJ.js";
2
+ import { S as o, c as p, s as t } from "./core-C0XvmpIu.js";
3
3
  export {
4
4
  r as DismissReason,
5
5
  o as SprigAPI,
package/dist/electron.js CHANGED
@@ -1,13 +1,11 @@
1
1
  const o = () => typeof window < "u" && typeof window.process == "object" && window.process.type === "renderer" || !(typeof process > "u" || typeof process.versions != "object" || !process.versions.electron) || typeof navigator == "object" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Electron") >= 0;
2
2
  function s() {
3
- if (!o())
4
- throw new Error("Only can preload contextBridge within Electron apps.");
3
+ if (!o()) throw new Error("Only can preload contextBridge within Electron apps.");
5
4
  const { contextBridge: e, ipcRenderer: r } = require("electron");
6
5
  e.exposeInMainWorld("sprigAPI", { openUrl: (n) => r.send("sprig-sdk-url-open", { url: n }) });
7
6
  }
8
7
  function i() {
9
- if (!o())
10
- throw new Error("Only can register IPC within Electron apps.");
8
+ if (!o()) throw new Error("Only can register IPC within Electron apps.");
11
9
  const { shell: e, ipcMain: r } = require("electron");
12
10
  r.on("sprig-sdk-url-open", (n, { url: t }) => {
13
11
  e.openExternal(t);
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./core-XsNCvQMt.cjs");require("./replay.cjs");const r=require("./metricsReporter-BS7FQHoM.cjs");exports.SprigAPI=e.SprigAPI,exports.default=e.core,exports.sprig=e.sprig,exports.DismissReason=r.DismissReason,exports.SprigEvent=r.SprigEvent;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./core-B164snRL.cjs");require("./replay.cjs");const r=require("./metricsReporter-BLXrIaei.cjs");exports.SprigAPI=e.SprigAPI,exports.default=e.core,exports.sprig=e.sprig,exports.DismissReason=r.DismissReason,exports.SprigEvent=r.SprigEvent;
package/dist/index.d.ts CHANGED
@@ -1346,6 +1346,7 @@ declare enum SprigEvent {
1346
1346
  FeedbackButtonLoaded = "feedback.button.loaded",
1347
1347
  SDKReady = "sdk.ready",
1348
1348
  SurveyAppeared = "survey.appeared",
1349
+ SurveyCloseRequested = "survey.closeRequested",//This event signals to mobile the survey overlay can close
1349
1350
  SurveyClosed = "survey.closed",
1350
1351
  SurveyDimensions = "survey.dimensions",
1351
1352
  SurveyFadingOut = "survey.fadingOut",
@@ -1485,6 +1486,14 @@ type SprigEventMap = {
1485
1486
  "survey.id": number;
1486
1487
  }
1487
1488
  ];
1489
+ [SprigEvent.SurveyCloseRequested]: [
1490
+ {
1491
+ initiator: DismissReason;
1492
+ name?: string;
1493
+ studyType?: StudyType;
1494
+ "survey.id": number;
1495
+ }
1496
+ ];
1488
1497
  [SprigEvent.SurveyWillClose]: [
1489
1498
  {
1490
1499
  initiator: DismissReason;
@@ -1888,6 +1897,7 @@ declare namespace sprigConfig {
1888
1897
  showSurveyCallback?: (surveyId?: number) => Promise<boolean>,
1889
1898
  calledFromApi?: boolean,
1890
1899
  ) => void;
1900
+ trackHistory?: ({ event: string }) => void;
1891
1901
  unmute: () => void;
1892
1902
  }
1893
1903
 
@@ -2003,10 +2013,7 @@ declare class SprigAPI {
2003
2013
  SURVEY_DIMENSIONS: SprigEvent;
2004
2014
  SURVEY_FADING_OUT: SprigEvent;
2005
2015
  SURVEY_HEIGHT: SprigEvent;
2006
- SURVEY_WIDTH: SprigEvent; /**
2007
- * Track an event to show survey if eligible
2008
- * @param eventName name of event to track
2009
- */
2016
+ SURVEY_WIDTH: SprigEvent;
2010
2017
  SURVEY_PRESENTED: SprigEvent;
2011
2018
  SURVEY_LIFE_CYCLE: SprigEvent;
2012
2019
  SURVEY_WILL_CLOSE: SprigEvent;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { S as i, c as o, s as p } from "./core-DuIpyIdz.js";
1
+ import { S as i, c as o, s as p } from "./core-C0XvmpIu.js";
2
2
  import "./replay.js";
3
- import { D as t, S as m } from "./metricsReporter-DbO9obdT.js";
3
+ import { D as t, S as m } from "./metricsReporter-uTmb1eaJ.js";
4
4
  export {
5
5
  t as DismissReason,
6
6
  i as SprigAPI,
@@ -0,0 +1 @@
1
+ "use strict";var Y=Object.defineProperty;var j=(e,t,r)=>t in e?Y(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var l=(e,t,r)=>j(e,typeof t!="symbol"?t+"":t,r);var U=(e=>(e.Closed="close.click",e.Complete="survey.completed",e.FeedbackClosed="feedback.closed",e.PageChange="page.change",e.API="api",e.Override="override",e))(U||{}),A=(e=>(e.ReplayCapture="replay.capture",e.FeedbackButtonLoaded="feedback.button.loaded",e.SDKReady="sdk.ready",e.SurveyAppeared="survey.appeared",e.SurveyCloseRequested="survey.closeRequested",e.SurveyClosed="survey.closed",e.SurveyDimensions="survey.dimensions",e.SurveyFadingOut="survey.fadingOut",e.SurveyHeight="survey.height",e.SurveyPresented="survey.presented",e.SurveyLifeCycle="survey.lifeCycle",e.SurveyWidth="survey.width",e.SurveyWillClose="survey.willClose",e.SurveyWillPresent="survey.will.present",e.CloseSurveyOnOverlayClick="close.survey.overlayClick",e.VisitorIDUpdated="visitor.id.updated",e.QuestionAnswered="question.answered",e))(A||{});let m;const H=new Uint8Array(16);function q(){if(!m&&(m=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!m))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(H)}const o=[];for(let e=0;e<256;++e)o.push((e+256).toString(16).slice(1));const w={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)},b=new class{constructor(){l(this,"breadcrumbs",[])}getTimeStamp(){return new Date().toISOString()}addBreadcrumb(e){this.breadcrumbs.push(e),this.breadcrumbs.length>300&&this.breadcrumbs.shift()}debug(e,t="debug"){this.addBreadcrumb({category:t,level:"info",message:e,timestamp:this.getTimeStamp(),type:"debug"})}error(e,t={}){this.addBreadcrumb({category:"error",data:t,level:"error",message:e,timestamp:this.getTimeStamp(),type:"error"})}http(e,t){this.addBreadcrumb({category:"xhr",data:t,message:e,timestamp:this.getTimeStamp(),type:"http"})}info(e,t={}){this.addBreadcrumb({category:"info",data:t,level:"info",message:e,timestamp:this.getTimeStamp(),type:"info"})}navigation(e,t){this.addBreadcrumb({category:"navigation",data:t,message:e,timestamp:this.getTimeStamp(),type:"navigation"})}};var B=class extends Error{constructor(e,t,r){super(`Possible EventEmitter memory leak detected. ${r} ${t.toString()} listeners added. Use emitter.setMaxListeners() to increase limit`),this.emitter=e,this.type=t,this.count=r,this.name="MaxListenersExceededWarning"}},D=class{static listenerCount(e,t){return e.listenerCount(t)}constructor(){this.events=new Map,this.maxListeners=D.defaultMaxListeners,this.hasWarnedAboutPotentialMemoryLeak=!1}_emitInternalEvent(e,t,r){this.emit(e,t,r)}_getListeners(e){return Array.prototype.concat.apply([],this.events.get(e))||[]}_removeListener(e,t){const r=e.indexOf(t);return r>-1&&e.splice(r,1),[]}_wrapOnceListener(e,t){const r=(...s)=>(this.removeListener(e,r),t.apply(this,s));return Object.defineProperty(r,"name",{value:t.name}),r}setMaxListeners(e){return this.maxListeners=e,this}getMaxListeners(){return this.maxListeners}eventNames(){return Array.from(this.events.keys())}emit(e,...t){const r=this._getListeners(e);return r.forEach(s=>{s.apply(this,t)}),r.length>0}addListener(e,t){this._emitInternalEvent("newListener",e,t);const r=this._getListeners(e).concat(t);if(this.events.set(e,r),this.maxListeners>0&&this.listenerCount(e)>this.maxListeners&&!this.hasWarnedAboutPotentialMemoryLeak){this.hasWarnedAboutPotentialMemoryLeak=!0;const s=new B(this,e,this.listenerCount(e));console.warn(s)}return this}on(e,t){return this.addListener(e,t)}once(e,t){return this.addListener(e,this._wrapOnceListener(e,t))}prependListener(e,t){const r=this._getListeners(e);if(r.length>0){const s=[t].concat(r);this.events.set(e,s)}else this.events.set(e,r.concat(t));return this}prependOnceListener(e,t){return this.prependListener(e,this._wrapOnceListener(e,t))}removeListener(e,t){const r=this._getListeners(e);return r.length>0&&(this._removeListener(r,t),this.events.set(e,r),this._emitInternalEvent("removeListener",e,t)),this}off(e,t){return this.removeListener(e,t)}removeAllListeners(e){return e?this.events.delete(e):this.events.clear(),this}listeners(e){return Array.from(this._getListeners(e))}listenerCount(e){return this._getListeners(e).length}rawListeners(e){return this.listeners(e)}},C=D;C.defaultMaxListeners=10;const F=new C,S=async e=>{await new Promise(t=>{setTimeout(t,e)})};class x{constructor(t){l(this,"storage");l(this,"tempStorage",{});l(this,"isStorageAvailable");try{this.storage=window[t];const r="__storage_test__";this.storage.setItem(r,r),this.storage.removeItem(r),this.isStorageAvailable=!0}catch{this.isStorageAvailable=!1}}setItem(t,r){this.isStorageAvailable&&this.storage?this.storage.setItem(t,r):this.tempStorage[t]=r}setItemObject(t,r){try{this.setItem(t,JSON.stringify(r))}catch(s){s instanceof Error&&(s.stack=t+": "+r,window.UserLeap.reportError("Failed to save to local storage",s))}}getItem(t){return this.isStorageAvailable&&this.storage?this.storage.getItem(t):this.tempStorage[t]}getItemObject(t){const r=this.getItem(t);if(r)try{return JSON.parse(r)}catch(s){s instanceof Error&&(s.stack=t+": "+r,window.UserLeap.reportError("Failed to parse local storage",s))}return{}}removeItem(t){this.isStorageAvailable&&this.storage?this.storage.removeItem(t):delete this.tempStorage[t]}clear(){this.isStorageAvailable&&this.storage?this.storage.clear():this.tempStorage={}}}const J=new x("sessionStorage"),$=new x("localStorage");class K{constructor(t){l(this,"payload");l(this,"promise");l(this,"reject",()=>{});l(this,"resolve",()=>{});this.payload=t,this.promise=new Promise((r,s)=>{this.reject=s,this.resolve=r})}resolveRequest(t){this.resolve(t)}}const E={replay:null},G=()=>{const e=[];return E.replay&&e.push("replay"),e.join(",")},z=10;let T=!1,M="",g=!1,P=!1,y=[];const Q=e=>e._config&&e._config.installationMethod?e._config.installationMethod:e._gtm?"web-gtm":e._segment?"web-segment":"web-snippet",N=(e="")=>{T=!0,M=e},R=async({shouldDropOnRateLimit:e,...t})=>{if(e)return{status:429};{const r=new K(t);return y.push(r),r.promise}},v=async(e,t)=>{const{retries:r=0,shouldDropOnRateLimit:s=!1,shouldRetryRequest:i=!1,...n}=t,d={url:e,options:n,retries:r,shouldDropOnRateLimit:s};if(g&&!i)return R(d);const u={ok:!1,reportError:!1};if(T)return console.info(`UserLeap - ${M}`),u;try{const c=await fetch(e,n);if(c.status===429){if(!g&&!s||i){g=!0;const a=c.headers.has("ratelimit-reset")?Number(c.headers.get("ratelimit-reset")):z;return await S(1e3*a),v(e,{...n,shouldDropOnRateLimit:s,shouldRetryRequest:!0})}return R(d)}if(g=!1,y.length&&(y.map(a=>{const h=a.payload;v(h.url,{...h.options,retries:h.retries,shouldDropOnRateLimit:h.shouldDropOnRateLimit}).then(W=>{a.resolveRequest(W)})}),y=[]),c.ok){if(c.status===249)return N(),u;const a=await c.text();try{return a&&a!=="OK"&&(c.json=JSON.parse(a)),c}catch{return{ok:!1,reportError:!1,error:new Error(`failed parsing response json for ${e} - ${a}`)}}}return c}catch(c){const a=r+1;return a>5||P?{ok:!1,reportError:!1,error:c}:(await S(1e3*Math.pow(2,r)),v(e,{...n,retries:a}))}},I=Object.freeze({contains:(e,t)=>t.includes(e),notContains:(e,t)=>!t.includes(e),exactly:(e,t)=>t===e,notExactly:(e,t)=>t!==e,startsWith:(e,t)=>t.startsWith(e),endsWith:(e,t)=>t.endsWith(e),regex:(e,t)=>new RegExp(e).test(t),legacy:(e,t)=>new RegExp(e,"i").test(t)});function k(e,t){const{matchType:r,pattern:s}=e,i=r?I[r]:I.legacy;let n=!1;try{n=i(s,t)}catch(d){const u=`[Sprig] (ERR-445) Failed to check url match with pattern ${s}`;d instanceof Error&&(console.warn(u,d),d.stack=JSON.stringify(e),window.UserLeap.reportError(u,d))}return n}let V=!0,f=!1;const X=["sdk_event_queue_latency_seconds","sdk_replay_add_event_batch_seconds","sdk_replay_cleanup_seconds","sdk_replay_compression_seconds","sdk_replay_get_events_between_seconds","sdk_replay_snapshot_seconds","sdk_mutations_nodes_added","sdk_mutations_nodes_removed","sdk_mutations_attributes_changed","sdk_mutations_character_data","sdk_dom_nodes_count","sdk_page_html_characters"];let L,p={};class Z{constructor(t){l(this,"_values",[]);l(this,"_isWebMetric");this.name=t,this._isWebMetric=X.includes(this.name)}report(t){if(V&&this._values.push({time:Date.now(),value:t}),f||!this._isWebMetric)return;const r=this.findExceededThreshold(t);r&&L&&L(t,r)}collect(){const t=this._values;return this._values=[],t}findExceededThreshold(t){const r=p[this.name];if(r)return r.find(s=>this.valueExceedsThreshold(t,s))}valueExceedsThreshold(t,r){return r.type==="max"?t>r.value:r.type==="min"&&t<r.value}}const _={},O=e=>{const t=new Z(e);return _[e]=t,t};exports.DismissReason=U,exports.EVENTS={FEEDBACK_BUTTON_LOADED:"feedback.button.loaded",SDK_READY:"sdk.ready",SURVEY_APPEARED:"survey.appeared",SURVEY_CLOSED:"survey.closed",SURVEY_DIMENSIONS:"survey.dimensions",SURVEY_FADING_OUT:"survey.fadingOut",SURVEY_HEIGHT:"survey.height",SURVEY_WIDTH:"survey.width",SURVEY_PRESENTED:"survey.presented",SURVEY_LIFE_CYCLE:"survey.lifeCycle",SURVEY_WILL_CLOSE:"survey.willClose",SURVEY_WILL_PRESENT:"survey.will.present",QUESTION_ANSWERED:"question.answered",REPLAY_CAPTURE:"replay.capture",CLOSE_SURVEY_ON_OVERLAY_CLICK:"close.survey.overlayClick",VISITOR_ID_UPDATED:"visitor.id.updated",DATA:{DISMISS_REASONS:{API:"api",CLOSED:"close.click",COMPLETE:"survey.completed",PAGE_CHANGE:"page.change",OVERRIDE:"override"},SURVEY_ID:"survey.id"}},exports.PerformanceMetrics=_,exports.SprigEvent=A,exports.breadcrumbsLogger=b,exports.checkUrlMatch=k,exports.checkUrlStillMatching=e=>{const{pageUrlEvents:t}=window.UserLeap._config,r=t==null?void 0:t.find(s=>s.id===e);return!!r&&k(r,window.location.href)},exports.cspViolationHandler=e=>{var t;(t=e==null?void 0:e.blockedURI)!=null&&t.includes(window.UserLeap._API_URL)&&(P=!0,console.warn(`[Sprig] ${e.blockedURI} is blocked by Content-Security-Policy`))},exports.delay=S,exports.disableThresholdChecking=()=>f=!0,exports.eventEmitter=F,exports.getHttpHeaders=function(e={}){const t={"Content-Type":"application/json","userleap-platform":"web","x-ul-sdk-version":"2.33.2","x-ul-installation-method":Q(e),"sprig-modules":G()};if(e.envId&&(t["x-ul-environment-id"]=e.envId),e.token&&(t.Authorization="Bearer "+e.token),e.userId&&(t["x-ul-user-id"]=e.userId),e.visitorId&&(t["x-ul-visitor-id"]=e.visitorId),e.partnerAnonymousId&&(t["x-ul-anonymous-id"]=e.partnerAnonymousId),e.mobileHeadersJSON){const r=JSON.parse(e.mobileHeadersJSON);Object.assign(t,r)}return e.locale&&(t["accept-language"]=e.locale),window.previewMode&&(t["x-ul-preview-mode"]="1"),t},exports.initPerformanceReporting=({reportingIntervalSeconds:e,postMetrics:t})=>{e?setInterval(()=>{(async r=>{const s=Object.values(_).map(i=>({name:i.name,values:i.collect()}));if(s.some(i=>i.values.length))try{await r(JSON.stringify(s))}catch(i){i instanceof Error&&b.error("MetricsErr",{error:{message:i.message,name:i.name}})}})(t)},1e3*e):V=!1},exports.killNetworkRequests=N,exports.localStorageHelper=$,exports.modules=E,exports.registerMetric=O,exports.registerReplay=e=>{E.replay=e},exports.registerThresholds=(e,t)=>{p={},f=!1,e==null||e.forEach(r=>{var s;r.metric in p||(p[r.metric]=[]),(s=p[r.metric])==null||s.push(r)}),L=t},exports.reportAndRegister=(e,t)=>{let r=_[e];return r||(r=O(e)),r.report(t)},exports.sessionStorageHelper=J,exports.shouldDirectEmbed=({"userleap-platform":e})=>{var t;return((t=window.UserLeap)==null?void 0:t.forceDirectEmbed)||e!=="web"},exports.sprigFetch=v,exports.v4=function(e,t,r){if(w.randomUUID&&!e)return w.randomUUID();const s=(e=e||{}).random||(e.rng||q)();return s[6]=15&s[6]|64,s[8]=63&s[8]|128,function(i,n=0){return o[i[n+0]]+o[i[n+1]]+o[i[n+2]]+o[i[n+3]]+"-"+o[i[n+4]]+o[i[n+5]]+"-"+o[i[n+6]]+o[i[n+7]]+"-"+o[i[n+8]]+o[i[n+9]]+"-"+o[i[n+10]]+o[i[n+11]]+o[i[n+12]]+o[i[n+13]]+o[i[n+14]]+o[i[n+15]]}(s)};
@@ -1,22 +1,19 @@
1
1
  var T = Object.defineProperty;
2
2
  var P = (e, t, s) => t in e ? T(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
- var l = (e, t, s) => (P(e, typeof t != "symbol" ? t + "" : t, s), s);
4
- var M = ((e) => (e.Closed = "close.click", e.Complete = "survey.completed", e.FeedbackClosed = "feedback.closed", e.PageChange = "page.change", e.API = "api", e.Override = "override", e))(M || {}), N = ((e) => (e.ReplayCapture = "replay.capture", e.FeedbackButtonLoaded = "feedback.button.loaded", e.SDKReady = "sdk.ready", e.SurveyAppeared = "survey.appeared", e.SurveyClosed = "survey.closed", e.SurveyDimensions = "survey.dimensions", e.SurveyFadingOut = "survey.fadingOut", e.SurveyHeight = "survey.height", e.SurveyPresented = "survey.presented", e.SurveyLifeCycle = "survey.lifeCycle", e.SurveyWidth = "survey.width", e.SurveyWillClose = "survey.willClose", e.SurveyWillPresent = "survey.will.present", e.CloseSurveyOnOverlayClick = "close.survey.overlayClick", e.VisitorIDUpdated = "visitor.id.updated", e.QuestionAnswered = "question.answered", e))(N || {});
3
+ var l = (e, t, s) => P(e, typeof t != "symbol" ? t + "" : t, s);
4
+ var M = ((e) => (e.Closed = "close.click", e.Complete = "survey.completed", e.FeedbackClosed = "feedback.closed", e.PageChange = "page.change", e.API = "api", e.Override = "override", e))(M || {}), N = ((e) => (e.ReplayCapture = "replay.capture", e.FeedbackButtonLoaded = "feedback.button.loaded", e.SDKReady = "sdk.ready", e.SurveyAppeared = "survey.appeared", e.SurveyCloseRequested = "survey.closeRequested", e.SurveyClosed = "survey.closed", e.SurveyDimensions = "survey.dimensions", e.SurveyFadingOut = "survey.fadingOut", e.SurveyHeight = "survey.height", e.SurveyPresented = "survey.presented", e.SurveyLifeCycle = "survey.lifeCycle", e.SurveyWidth = "survey.width", e.SurveyWillClose = "survey.willClose", e.SurveyWillPresent = "survey.will.present", e.CloseSurveyOnOverlayClick = "close.survey.overlayClick", e.VisitorIDUpdated = "visitor.id.updated", e.QuestionAnswered = "question.answered", e))(N || {});
5
5
  const X = { FEEDBACK_BUTTON_LOADED: "feedback.button.loaded", SDK_READY: "sdk.ready", SURVEY_APPEARED: "survey.appeared", SURVEY_CLOSED: "survey.closed", SURVEY_DIMENSIONS: "survey.dimensions", SURVEY_FADING_OUT: "survey.fadingOut", SURVEY_HEIGHT: "survey.height", SURVEY_WIDTH: "survey.width", SURVEY_PRESENTED: "survey.presented", SURVEY_LIFE_CYCLE: "survey.lifeCycle", SURVEY_WILL_CLOSE: "survey.willClose", SURVEY_WILL_PRESENT: "survey.will.present", QUESTION_ANSWERED: "question.answered", REPLAY_CAPTURE: "replay.capture", CLOSE_SURVEY_ON_OVERLAY_CLICK: "close.survey.overlayClick", VISITOR_ID_UPDATED: "visitor.id.updated", DATA: { DISMISS_REASONS: { API: "api", CLOSED: "close.click", COMPLETE: "survey.completed", PAGE_CHANGE: "page.change", OVERRIDE: "override" }, SURVEY_ID: "survey.id" } };
6
6
  let m;
7
7
  const V = new Uint8Array(16);
8
8
  function W() {
9
- if (!m && (m = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !m))
10
- throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
9
+ if (!m && (m = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !m)) throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
11
10
  return m(V);
12
11
  }
13
12
  const a = [];
14
- for (let e = 0; e < 256; ++e)
15
- a.push((e + 256).toString(16).slice(1));
13
+ for (let e = 0; e < 256; ++e) a.push((e + 256).toString(16).slice(1));
16
14
  const f = { randomUUID: typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto) };
17
15
  function Z(e, t, s) {
18
- if (f.randomUUID && !t && !e)
19
- return f.randomUUID();
16
+ if (f.randomUUID && !e) return f.randomUUID();
20
17
  const r = (e = e || {}).random || (e.rng || W)();
21
18
  return r[6] = 15 & r[6] | 64, r[8] = 63 & r[8] | 128, function(n, i = 0) {
22
19
  return a[n[i + 0]] + a[n[i + 1]] + a[n[i + 2]] + a[n[i + 3]] + "-" + a[n[i + 4]] + a[n[i + 5]] + "-" + a[n[i + 6]] + a[n[i + 7]] + "-" + a[n[i + 8]] + a[n[i + 9]] + "-" + a[n[i + 10]] + a[n[i + 11]] + a[n[i + 12]] + a[n[i + 13]] + a[n[i + 14]] + a[n[i + 15]];
@@ -109,8 +106,7 @@ var j = class extends Error {
109
106
  if (s.length > 0) {
110
107
  const r = [t].concat(s);
111
108
  this.events.set(e, r);
112
- } else
113
- this.events.set(e, s.concat(t));
109
+ } else this.events.set(e, s.concat(t));
114
110
  return this;
115
111
  }
116
112
  prependOnceListener(e, t) {
@@ -135,9 +131,9 @@ var j = class extends Error {
135
131
  rawListeners(e) {
136
132
  return this.listeners(e);
137
133
  }
138
- }, O = I;
139
- O.defaultMaxListeners = 10;
140
- const ee = new O(), L = async (e) => {
134
+ }, R = I;
135
+ R.defaultMaxListeners = 10;
136
+ const ee = new R(), L = async (e) => {
141
137
  await new Promise((t) => {
142
138
  setTimeout(t, e);
143
139
  });
@@ -145,7 +141,7 @@ const ee = new O(), L = async (e) => {
145
141
  var t;
146
142
  return ((t = window.UserLeap) == null ? void 0 : t.forceDirectEmbed) || e !== "web";
147
143
  };
148
- class R {
144
+ class O {
149
145
  constructor(t) {
150
146
  l(this, "storage");
151
147
  l(this, "tempStorage", {});
@@ -173,12 +169,11 @@ class R {
173
169
  }
174
170
  getItemObject(t) {
175
171
  const s = this.getItem(t);
176
- if (s)
177
- try {
178
- return JSON.parse(s);
179
- } catch (r) {
180
- r instanceof Error && (r.stack = t + ": " + s, window.UserLeap.reportError("Failed to parse local storage", r));
181
- }
172
+ if (s) try {
173
+ return JSON.parse(s);
174
+ } catch (r) {
175
+ r instanceof Error && (r.stack = t + ": " + s, window.UserLeap.reportError("Failed to parse local storage", r));
176
+ }
182
177
  return {};
183
178
  }
184
179
  removeItem(t) {
@@ -188,8 +183,8 @@ class R {
188
183
  this.isStorageAvailable && this.storage ? this.storage.clear() : this.tempStorage = {};
189
184
  }
190
185
  }
191
- const se = new R("sessionStorage"), re = new R("localStorage");
192
- class B {
186
+ const se = new O("sessionStorage"), re = new O("localStorage");
187
+ class q {
193
188
  constructor(t) {
194
189
  l(this, "payload");
195
190
  l(this, "promise");
@@ -207,10 +202,10 @@ class B {
207
202
  }
208
203
  const k = { replay: null }, ne = (e) => {
209
204
  k.replay = e;
210
- }, F = () => {
205
+ }, B = () => {
211
206
  const e = [];
212
207
  return k.replay && e.push("replay"), e.join(",");
213
- }, q = 10;
208
+ }, F = 10;
214
209
  let U = !1, A = "", y = !1, D = !1, g = [];
215
210
  const J = (e) => e._config && e._config.installationMethod ? e._config.installationMethod : e._gtm ? "web-gtm" : e._segment ? "web-segment" : "web-snippet", ie = (e) => {
216
211
  var t;
@@ -219,7 +214,7 @@ const J = (e) => e._config && e._config.installationMethod ? e._config.installat
219
214
  U = !0, A = e;
220
215
  };
221
216
  function ae(e = {}) {
222
- const t = { "Content-Type": "application/json", "userleap-platform": "web", "x-ul-sdk-version": "2.33.0", "x-ul-installation-method": J(e), "sprig-modules": F() };
217
+ const t = { "Content-Type": "application/json", "userleap-platform": "web", "x-ul-sdk-version": "2.33.2", "x-ul-installation-method": J(e), "sprig-modules": B() };
223
218
  if (e.envId && (t["x-ul-environment-id"] = e.envId), e.token && (t.Authorization = "Bearer " + e.token), e.userId && (t["x-ul-user-id"] = e.userId), e.visitorId && (t["x-ul-visitor-id"] = e.visitorId), e.partnerAnonymousId && (t["x-ul-anonymous-id"] = e.partnerAnonymousId), e.mobileHeadersJSON) {
224
219
  const s = JSON.parse(e.mobileHeadersJSON);
225
220
  Object.assign(t, s);
@@ -227,25 +222,22 @@ function ae(e = {}) {
227
222
  return e.locale && (t["accept-language"] = e.locale), window.previewMode && (t["x-ul-preview-mode"] = "1"), t;
228
223
  }
229
224
  const w = async ({ shouldDropOnRateLimit: e, ...t }) => {
230
- if (e)
231
- return { status: 429 };
225
+ if (e) return { status: 429 };
232
226
  {
233
- const s = new B(t);
227
+ const s = new q(t);
234
228
  return g.push(s), s.promise;
235
229
  }
236
230
  }, v = async (e, t) => {
237
231
  const { retries: s = 0, shouldDropOnRateLimit: r = !1, shouldRetryRequest: n = !1, ...i } = t, d = { url: e, options: i, retries: s, shouldDropOnRateLimit: r };
238
- if (y && !n)
239
- return w(d);
232
+ if (y && !n) return w(d);
240
233
  const u = { ok: !1, reportError: !1 };
241
- if (U)
242
- return console.info(`UserLeap - ${A}`), u;
234
+ if (U) return console.info(`UserLeap - ${A}`), u;
243
235
  try {
244
236
  const c = await fetch(e, i);
245
237
  if (c.status === 429) {
246
238
  if (!y && !r || n) {
247
239
  y = !0;
248
- const o = c.headers.has("ratelimit-reset") ? Number(c.headers.get("ratelimit-reset")) : q;
240
+ const o = c.headers.has("ratelimit-reset") ? Number(c.headers.get("ratelimit-reset")) : F;
249
241
  return await L(1e3 * o), v(e, { ...i, shouldDropOnRateLimit: r, shouldRetryRequest: !0 });
250
242
  }
251
243
  return w(d);
@@ -256,8 +248,7 @@ const w = async ({ shouldDropOnRateLimit: e, ...t }) => {
256
248
  o.resolveRequest(x);
257
249
  });
258
250
  }), g = []), c.ok) {
259
- if (c.status === 249)
260
- return H(), u;
251
+ if (c.status === 249) return H(), u;
261
252
  const o = await c.text();
262
253
  try {
263
254
  return o && o !== "OK" && (c.json = JSON.parse(o)), c;
@@ -296,8 +287,7 @@ class G {
296
287
  this.name = t, this._isWebMetric = K.includes(this.name);
297
288
  }
298
289
  report(t) {
299
- if (C && this._values.push({ time: Date.now(), value: t }), S || !this._isWebMetric)
300
- return;
290
+ if (C && this._values.push({ time: Date.now(), value: t }), S || !this._isWebMetric) return;
301
291
  const s = this.findExceededThreshold(t);
302
292
  s && _ && _(t, s);
303
293
  }
@@ -307,8 +297,7 @@ class G {
307
297
  }
308
298
  findExceededThreshold(t) {
309
299
  const s = p[this.name];
310
- if (s)
311
- return s.find((r) => this.valueExceedsThreshold(t, r));
300
+ if (s) return s.find((r) => this.valueExceedsThreshold(t, r));
312
301
  }
313
302
  valueExceedsThreshold(t, s) {
314
303
  return s.type === "max" ? t > s.value : s.type === "min" && t < s.value;
@@ -329,12 +318,11 @@ const le = (e, t) => {
329
318
  e ? setInterval(() => {
330
319
  (async (s) => {
331
320
  const r = Object.values(E).map((n) => ({ name: n.name, values: n.collect() }));
332
- if (r.some((n) => n.values.length))
333
- try {
334
- await s(JSON.stringify(r));
335
- } catch (n) {
336
- n instanceof Error && Y.error("MetricsErr", { error: { message: n.message, name: n.name } });
337
- }
321
+ if (r.some((n) => n.values.length)) try {
322
+ await s(JSON.stringify(r));
323
+ } catch (n) {
324
+ n instanceof Error && Y.error("MetricsErr", { error: { message: n.message, name: n.name } });
325
+ }
338
326
  })(t);
339
327
  }, 1e3 * e) : C = !1;
340
328
  };
package/dist/replay.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var Ke=Object.defineProperty;var We=(e,t,r)=>t in e?Ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var G=(e,t,r)=>(We(e,typeof t!="symbol"?t+"":t,r),r);const o=require("./metricsReporter-BS7FQHoM.cjs");var k=(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))(k||{});const J=(e,t)=>t.some(r=>e instanceof r);let ie,de;const q=new WeakMap,$=new WeakMap,O=new WeakMap;let z={get(e,t,r){if(e instanceof IDBTransaction){if(t==="done")return q.get(e);if(t==="store")return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return C(e[t])},set:(e,t,r)=>(e[t]=r,!0),has:(e,t)=>e instanceof IDBTransaction&&(t==="done"||t==="store")||t in e};function we(e){z=e(z)}function Je(e){return(de||(de=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(Q(this),t),C(this.request)}:function(...t){return C(e.apply(Q(this),t))}}function qe(e){return typeof e=="function"?Je(e):(e instanceof IDBTransaction&&function(t){if(q.has(t))return;const r=new Promise((n,a)=>{const s=()=>{a(t.error||new DOMException("AbortError","AbortError"))};t.oncomplete=()=>{n()},t.onerror=s,t.onabort=s});q.set(t,r)}(e),J(e,ie||(ie=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,z):e)}function C(e){if(e instanceof IDBRequest)return function(r){const n=new Promise((a,s)=>{r.onsuccess=()=>{a(C(r.result))},r.onerror=()=>{s(r.error)}});return O.set(n,r),n}(e);if($.has(e))return $.get(e);const t=qe(e);return t!==e&&($.set(e,t),O.set(t,e)),t}const Q=e=>O.get(e);function X(e,{blocked:t}={}){const r=indexedDB.deleteDatabase(e);return t&&(r.onblocked=n=>t(n.oldVersion,n)),C(r).then(()=>{})}const ze=["get","getKey","getAll","getAllKeys","count"],Qe=["put","add","delete","clear"],K=new Map;function ce(e,t){if(!(e instanceof IDBDatabase)||t in e||typeof t!="string")return;if(K.get(t))return K.get(t);const r=t.replace(/FromIndex$/,""),n=t!==r,a=Qe.includes(r);if(!(r in(n?IDBIndex:IDBObjectStore).prototype)||!a&&!ze.includes(r))return;const s=async function(i,...c){const d=this.transaction(i,a?"readwrite":"readonly");let u=d.store;return n&&(u=u.index(c.shift())),(await Promise.all([u[r](...c),a&&d.done]))[0]};return K.set(t,s),s}we(e=>({...e,get:(t,r,n)=>ce(t,r)||e.get(t,r,n),has:(t,r)=>!!ce(t,r)||e.has(t,r)}));const Xe=["continue","continuePrimaryKey","advance"],ue={},Y=new WeakMap,ye=new WeakMap,Ye={get(e,t){if(!Xe.includes(t))return e[t];let r=ue[t];return r||(r=ue[t]=function(...n){Y.set(this,ye.get(this)[t](...n))}),r}};async function*Ze(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const r=new Proxy(t,Ye);for(ye.set(r,t),O.set(r,Q(t));t;)yield r,t=await(Y.get(r)||t.continue()),Y.delete(r)}function le(e,t){return t===Symbol.asyncIterator&&J(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&J(e,[IDBIndex,IDBObjectStore])}we(e=>({...e,get:(t,r,n)=>le(t,r)?Ze:e.get(t,r,n),has:(t,r)=>le(t,r)||e.has(t,r)}));const fe=new class{constructor(e){G(this,"awaitingResolvers",[]);G(this,"activeCount",0);this.capacity=e}async acquire(){if(!(this.activeCount<this.capacity))return new Promise(e=>{this.awaitingResolvers.push(e)});this.activeCount++}release(){const e=this.awaitingResolvers.shift();e&&this.activeCount<=this.capacity?e():this.activeCount--}async execute(e){try{return await this.acquire(),await e()}finally{this.release()}}setLimit(e){this.capacity=e}}(2),he=async({apiUrl:e,surveyId:t,uploadId:r,etags:n,headers:a,responseGroupUuid:s,replayDuration:i,eventDigest:c},d=!1)=>{var y;if(!d&&!r&&!n)return void o.breadcrumbsLogger.error("UploadErr",{isMobile:d,uploadId:r,etags:n});o.breadcrumbsLogger.info("MarkUploadComplete",{surveyId:t});const u=await o.sprigFetch(`${e}/sdk/1/completeSessionReplay`,{method:"POST",body:JSON.stringify({etags:n,uploadId:r,responseGroupUuid:s,surveyId:t,replayDuration:i,eventDigest:c,userAgent:(y=window==null?void 0:window.navigator)==null?void 0:y.userAgent}),headers:a,shouldRetryRequest:!0});return o.breadcrumbsLogger.info("MarkUploadDone",{surveyId:t}),u},et=e=>{if(e instanceof Attr)return null;let t=1;for(let r=e.previousSibling;r;r=r.previousSibling)r.nodeName===e.nodeName&&++t;return t},be=e=>{if(e===null)return"";const t=[];if(e instanceof Document)return"/";for(let r=e;r&&!(r instanceof Document)&&r!==null;r=r instanceof Attr?r.ownerElement:r.parentElement){const n=t[t.length]={name:void 0,position:null};switch(r.nodeType){case Node.TEXT_NODE:n.name="text()";break;case Node.ATTRIBUTE_NODE:n.name="@"+r.nodeName;break;case Node.PROCESSING_INSTRUCTION_NODE:n.name="processing-instruction()";break;case Node.COMMENT_NODE:n.name="comment()";break;case Node.ELEMENT_NODE:n.name=r.nodeName}n.position=et(r)}return"/"+t.reverse().map(r=>r.position!==null?`/${r.name}[${r.position}]`:`/${r.name}`).join("")},I={capture:!0,passive:!0},tt=["a","button","input","option","li","link"],rt=["Escape","Enter","Backspace","F5","Tab"];let F=!1;const nt=["label","type","role","title","placeholder","errormessage","valuetext","href"],at="aria-",pe=e=>{var n;if(((n=e.tagName)==null?void 0:n.toLowerCase())==="html")return{element:"html"};const t=e.textContent,r=t?{text:t}:{};r.element=(a=>{if(!a.tagName)return"No tagName";const s=a.getAttribute("type");return s?`${s} ${a.tagName.toLowerCase()}`:a.tagName.toLowerCase()})(e);for(const a of e.attributes){let s=a.name;const i=a.value;s.startsWith(at)&&(s=s.substring(5)),nt.includes(s)&&(r[s]=i)}return r},st=e=>{var n;if(!e)return{};const t={...pe(e)},r=e.parentElement;if(r&&tt.includes((n=r.tagName)==null?void 0:n.toLowerCase())){const a=pe(r);Object.assign(t,a)}return t},Ie=(e,t)=>{var n;let r=t.target;t.target===((n=window.document)==null?void 0:n.body)&&window.Sprig.pointerDownTarget&&(r=window.Sprig.pointerDownTarget),it({x:t.x,y:t.y,type:e,elementAttributes:st(r),windowHeight:window.innerHeight,windowWidth:window.innerWidth,...r instanceof HTMLElement?{rect:r==null?void 0:r.getBoundingClientRect(),xPath:be(r)}:{}})},ve=e=>{rt.includes(e.key)&&ut({key:e.key})},Se=((e,t)=>{let r;return n=>{clearTimeout(r),r=window.setTimeout(()=>e(n),t)}})(e=>{if(!(e.target instanceof HTMLElement||e.target instanceof Document))return;let t=e.target;"scrollTop"in t||(t=t.documentElement),lt({xPath:be(t),x:t.scrollLeft,y:t.scrollTop,elementAttributes:{targetScrollWidth:t.scrollWidth,targetClientWidth:t.clientWidth,targetScrollHeight:t.scrollHeight,targetClientHeight:t.clientHeight}})},750),De=(ge="left_click",e=>Ie(ge,e));var ge;const Ee=e=>{e.button===2&&Ie("right_click",e)},ke=e=>{window.Sprig&&(window.Sprig.pointerDownTarget=e.target)},ot=()=>{F||(window.addEventListener("click",De,I),window.addEventListener("pointerdown",ke,I),window.addEventListener("mousedown",Ee,I),window.addEventListener("keydown",ve,I),window.addEventListener("scroll",Se,I),F=!0,window.performance.getEntriesByType("navigation").map(e=>e.type).includes("reload")&&dt({url:window.location.href,currentPageTitle:document.title}),window.performance.getEntriesByType("navigation").map(e=>e.type).includes("back_forward")&&ct({curUrl:window.location.href,fromUrl:document.referrer,currentPageTitle:document.title}))},w={isRecording:!1,scrollEventUuids:{},stopRecording:()=>{}},Ce=()=>window.indexedDB&&window.IDBKeyRange&&window.CompressionStream,f=(()=>{const e=o.sessionStorageHelper.getItem("sprig.sessionId");if(e)return o.breadcrumbsLogger.info("SessionIDFound",{savedSessionId:e}),o.sessionStorageHelper.removeItem("sprig.sessionId"),e;const t=o.v4();return o.breadcrumbsLogger.info("GeneratedSessionID",{uuid:t}),t})(),Z=()=>{o.sessionStorageHelper.setItem("sprig.disableReplayRecording","disabled")},D=()=>!!o.sessionStorageHelper.getItem("sprig.disableReplayRecording");window.addEventListener("beforeunload",()=>{o.breadcrumbsLogger.info("BeforeUnload",{sessionId:f}),o.sessionStorageHelper.setItem("sprig.sessionId",f)});const se=e=>e&&e.trim().substring(0,500).replace(/\s\s+/g," ").replace(/\r?\n|\r/g," ").substring(0,250),S=(e,t)=>{var r,n;if(!D()&&w.isRecording)try{(n=(r=window.rrwebRecord)==null?void 0:r.addCustomEvent)==null||n.call(r,e,t)}catch(a){V("Error recording custom event",a)}},it=e=>{var t;(t=e==null?void 0:e.elementAttributes)!=null&&t.text&&(e.elementAttributes.text=se(e.elementAttributes.text)),S("Sprig_Click",e)},dt=e=>{S("Sprig_Refresh",e)},ct=e=>{e.currentPageTitle&&(e.currentPageTitle=se(e.currentPageTitle)),S("Sprig_BackForward",e)},ut=e=>{S("Sprig_Keystroke",e)},lt=async e=>{const{x:t,xPath:r,y:n}=e,a=w.scrollEventUuids[r];if(a)return h(async()=>{var c,d,u,y;const s=await l.openDB(),i=await s.get("events",a);if(i!=null&&i.event){const p=JSON.parse(i.event),m=t>((d=(c=p.data)==null?void 0:c.payload)==null?void 0:d.x),g=n>((y=(u=p.data)==null?void 0:u.payload)==null?void 0:y.y);if(!m&&!g)return null;m&&(p.data.payload.x=t),g&&(p.data.payload.y=n),p.data.payload.elementAttributes=e.elementAttributes,i.event=JSON.stringify(p),await s.put("events",i)}else S("Sprig_Scroll",e)},"Error updating scroll event");S("Sprig_Scroll",e)},Ue=()=>{w.stopRecording&&(w.stopRecording(),w.stopRecording=void 0),w.isRecording=!1,["cleanupInterval","inactivityInterval","pendingCheckInterval"].forEach(e=>{w[e]&&(clearInterval(w[e]),w[e]=void 0)}),F&&(window.removeEventListener("click",De,I),window.removeEventListener("pointerdown",ke,I),window.removeEventListener("mousedown",Ee,I),window.removeEventListener("keydown",ve,I),window.removeEventListener("scroll",Se,I),F=!1)},pt=["did not allow mutations","called in an invalid security context"],gt=(e,t,{reportError:r=!0,extraInfo:n={}})=>{if(!D()&&t instanceof Error){if(Z(),t.name==="VersionError")return o.breadcrumbsLogger.error("VersionErr",{message:e}),l.deleteDB();(a=>{if(!a)return!0;for(const s of pt)if(a.toLowerCase().includes(s))return!1;return!0})(t==null?void 0:t.message)&&(r&&window.UserLeap.reportError(e,t,n),l.clearAll())}},V=(e,t,{reportError:r}={reportError:!0})=>{Ue(),o.breadcrumbsLogger.error("ReplayErr",{code:t.code,name:t.name}),gt(e,t,{reportError:r})},h=async(e,t)=>{try{return await e()}catch(r){V(t,r)}};Ce()&&(X("replayStorage").catch(console.error),X("sprig.replay").catch(console.error));const l=new class{openDB(){return function(e,t,{blocked:r,upgrade:n,blocking:a,terminated:s}={}){const i=indexedDB.open(e,t),c=C(i);return n&&(i.onupgradeneeded=d=>{n(C(i.result),d.oldVersion,d.newVersion,C(i.transaction),d)}),r&&(i.onblocked=d=>r(d.oldVersion,d.newVersion,d)),c.then(d=>{s&&(d.onclose=()=>s()),a&&(d.onversionchange=u=>a(u.oldVersion,u.newVersion,u))}).catch(()=>{}),c}("sprigReplay",1,{upgrade:(e,t,r)=>{if(r===0&&o.sessionStorageHelper.setItem("sprig.pendingCount","0"),!e.objectStoreNames.contains("events")){const n=e.createObjectStore("events",{keyPath:"uuid"});n.createIndex("sessionId","sessionId"),n.createIndex("timestamp","timestamp"),n.createIndex("[sessionId+timestamp]",["sessionId","timestamp"])}if(!e.objectStoreNames.contains("chunkUploads")){const n=e.createObjectStore("chunkUploads",{keyPath:"uuid"});n.createIndex("sessionId","sessionId"),n.createIndex("timestamp","timestamp"),n.createIndex("[sessionId+status]",["sessionId","status"]),n.createIndex("[uploadId+status]",["uploadId","status"]),n.createIndex("[sessionId+status+uploadId]",["sessionId","status","uploadId"])}if(!e.objectStoreNames.contains("pendingCaptures")){const n=e.createObjectStore("pendingCaptures",{keyPath:"uuid"});n.createIndex("sessionId","sessionId"),n.createIndex("timestamp","timestamp"),n.createIndex("[sessionId+targetTimestamp]",["sessionId","targetTimestamp"])}}})}deleteDB(){return X("sprigReplay").catch(console.error)}async bulkAdd(e,t){const r=(await this.openDB()).transaction(e,"readwrite");return Promise.all([...t.map(n=>r.store.add(n)),r.done])}async clearAll(){const e=(await this.openDB()).transaction(["events","chunkUploads","pendingCaptures"],"readwrite");return Promise.all([e.objectStore("events").clear(),e.objectStore("chunkUploads").clear(),e.objectStore("pendingCaptures").clear()])}async deleteBySessionId(e,t){const r=IDBKeyRange.only(t),n=(await this.openDB()).transaction(e,"readwrite"),a=n.store.index("sessionId");for await(const s of a.iterate(r))await s.delete();await n.done}async updatePartial(e,t,r){const n=(await this.openDB()).transaction(e,"readwrite"),a=await n.store.get(t);a&&await n.store.put({...a,...r}),await n.done}async deleteRowsBefore(e,t,r=()=>!0){const n=IDBKeyRange.upperBound(t,!0),a=(await this.openDB()).transaction(e,"readwrite"),s=a.store.index("timestamp");for await(const i of s.iterate(n))r(i.value)&&await i.delete();await a.done}async getEventsBetween(e,t=Date.now()){if(e>=t)return Promise.resolve([]);const r=IDBKeyRange.bound([f,e],[f,t],!1,!0);return(await this.openDB()).getAllFromIndex("events","[sessionId+timestamp]",r)}async updateEventsExpiredAt(e,t,r=30){const n=new Date,a=n.setMinutes(n.getMinutes()+(r??30)),s=(await this.openDB()).transaction("events","readwrite"),i=s.store.index("[sessionId+timestamp]"),c=IDBKeyRange.bound([f,e],[f,t],!1,!0);for await(const d of i.iterate(c))await d.update({...d.value,expiredAt:a});await s.done}async deleteChunkUploads(e,t){const r=IDBKeyRange.only([t,e]),n=(await this.openDB()).transaction("chunkUploads","readwrite");let s=await n.store.index("[uploadId+status]").openCursor(r);for(;s;)s.delete(),s=await s.continue();await n.done}async getChunkUploadsByStatus({sessionId:e,status:t,uploadId:r}){const n=(await this.openDB()).transaction("chunkUploads","readonly"),a=r?n.store.index("[uploadId+status]"):n.store.index("[sessionId+status]"),s=r?IDBKeyRange.only([r,t]):IDBKeyRange.only([e,t]);return a.getAll(s)}async getPendingCaptures(e={}){return(await(await this.openDB()).getAllFromIndex("pendingCaptures","sessionId",f)).filter(r=>!e.beforePresent||r.targetTimestamp<Date.now()).filter(r=>!e.isBeforeType||r.captureParams.replayParams.replayDurationType==="before").filter(r=>!e.isHeatmap||(r.captureParams.isHeatmap??!1))}async markPendingCaptureToCanUpload(e){const t=(await this.openDB()).transaction("pendingCaptures","readwrite"),r=t.store.index("sessionId");for await(const n of r.iterate(f)){const a=n.value;a.captureParams.responseGroupId===e&&await n.update({...a,canUpload:!0})}await t.done}async markPendingHeatmapsReady(e){if(parseInt(o.sessionStorageHelper.getItem("sprig.pendingCount")??"0")===0)return null;const t=Date.now(),r=(await this.openDB()).transaction("pendingCaptures","readwrite"),n=r.store.index("sessionId");for await(const a of n.iterate(f)){const s=a.value;!s.captureParams.isHeatmap||e&&!e.includes(s.uuid)||await a.update({...s,targetTimestamp:t,captureParams:{...s.captureParams,triggerTimestamp:t,replayParams:{...s.captureParams.replayParams,replayDurationSeconds:Math.floor((t-s.timestamp)/1e3)}}})}await r.done}},v=[];let T,Pe,j,xe,H,Re,P=[],B=!1,R=0,M=!1,Be=!1,oe=[],W=!1;const L=()=>M&&!B&&Date.now()<=j,mt=({apiUrl:e,config:t,triggerSnapshot:r,forceInit:n=!1})=>{M&&!n||(o.sessionStorageHelper.isStorageAvailable?(P=[],oe.splice(0),v.splice(0),R=0,H=r,Pe=e,T={responseGroupUuid:t.responseGroupUuid,surveyId:t.surveyId,userAgent:t.userAgent,sdkVersion:t.sdkVersion},xe=t.maxDurationSeconds,yt(),M||(Re=window.setInterval(wt,500)),M=!0):B=!0)},wt=async()=>{if(!L())return void window.clearInterval(Re);if(Le(),!v.some(t=>t.type!==k.FullSnapshot&&t.type!==k.Meta))return;const e=v[0].timestamp;Date.now()-e>35e3&&(H==null||H())},Le=async()=>{if(P.length||W)return;W=!0;const e=await ht();if(!e)return void(B=!0);oe.splice(0,e.length).forEach(t=>t(e.shift())),e.forEach(t=>P.push(t)),W=!1},yt=()=>{const e=o.sessionStorageHelper.getItem("sprig.alwayson.info");if(e){o.breadcrumbsLogger.info("Read stored session state",e);const t=JSON.parse(e);B=t.disabled,T=t.metadata,P=t.uploadUrls,R=t.currentIndex,j=t.expirationTimestamp,t.pendingEventTimestamp&&(o.breadcrumbsLogger.info(`Uploading with pending timestamp: ${t.pendingEventTimestamp}`),ft(t.pendingEventTimestamp))}else j=1e3*xe+Date.now()},ft=async e=>{const t=Date.now(),r=await l.getEventsBetween(e,t);if(!r.length)return;const n=r.map(s=>JSON.parse(s.event));Ne(n);const a=await _e();a&&await Ae(a,n)},Te=async(e,t)=>{try{const r=await e();if(!r.ok)throw new Error(`Error ${t}`);return r}catch{B=!0}},Ae=async(e,t)=>{if(!L()||!e)return;const r=await(async n=>{const a=new TextEncoder,s=new CompressionStream("gzip"),i=s.writable.getWriter(),c=a.encode(JSON.stringify(n));return i.write(c),i.close(),new Uint8Array(await new Response(s.readable).arrayBuffer())})(t);o.breadcrumbsLogger.info("Uploading always-on events with presigned url"),await Te(()=>o.sprigFetch(e,{body:r,method:"PUT"}),"uploading always-on with presigned url")},ht=async()=>{if(!L())return;const{surveyId:e,responseGroupUuid:t}=T,r={responseGroupUuid:t,surveyId:e,index:R+1};o.breadcrumbsLogger.info("Fetching always-on upload urls",r);const n=await Te(()=>o.sprigFetch(`${Pe}/sdk/1/replayUrls`,{method:"POST",body:JSON.stringify(r),headers:o.getHttpHeaders(window.UserLeap)}),"fetching always-on signed urls");if(!n)return;const a=n.json.signedUrls;return o.breadcrumbsLogger.info("Fetched more always-on upload urls",{body:r,urls:a}),a},_e=async()=>{if(P.length)return P.shift();const e=new Promise(t=>{oe.push(t)});return Le(),e},Ne=e=>{var a,s,i;const t=e.length?e[e.length-1].timestamp:Date.now(),r=R,n=((s=(a=window.UserLeap)==null?void 0:a.config)==null?void 0:s.customMetadata)??((i=window.__cfg)==null?void 0:i.customMetadata);R++,e.push({timestamp:t,type:k.Custom,data:{tag:"Sprig_Meta",payload:{...T,index:r,visitorId:window.UserLeap.visitorId??"",timestamp:t,customMetadata:n}}})},bt=(e,t)=>{L()&&!Be&&(e||v.length)&&(e&&v.length&&(async()=>{if(!v.length)return;o.breadcrumbsLogger.info("Capturing always-on event array to upload");const r=v.splice(0);Ne(r);const n=await _e();n&&await Ae(n,r)})(),v.push(t))};window.addEventListener("beforeunload",async()=>{Be=!0,L()&&(o.breadcrumbsLogger.info("Always On handle page unload"),(()=>{let e;v.length&&(e=v[0].timestamp);const t={disabled:B,metadata:T,uploadUrls:P,currentIndex:R,pendingEventTimestamp:e,expirationTimestamp:j};o.breadcrumbsLogger.info("Storing session state on unload",t),o.sessionStorageHelper.setItem("sprig.alwayson.info",JSON.stringify(t))})())});const He=async(e,t)=>{const r=performance.now();let n;try{n=await e()}finally{const a=performance.now()-r;let s=o.PerformanceMetrics[t];s||(s=o.registerMetric(t)),s.report(a/1e3)}return n},Me=(e,t)=>{const r=performance.now();try{e()}finally{const n=performance.now()-r;let a=o.PerformanceMetrics[t];a||(a=o.registerMetric(t)),a.report(n/1e3)}};let Oe=5e3,ee=6e4,te=0,U,re=!1,ne=[];const It=e=>{var t,r,n,a;if((t=e.event)!=null&&t.includes("Sprig_Scroll")){const s=(a=(n=(r=JSON.parse(e.event))==null?void 0:r.data)==null?void 0:n.payload)==null?void 0:a.xPath;if(!s)return;w.scrollEventUuids[s]=e.uuid}ne.push(e),re||vt()},vt=()=>{re=!0,setTimeout(async()=>{if(D())return;const e=ne;ne=[],re=!1,Me(async()=>{await(async t=>{const r=t.map(n=>({...n,sessionId:n.sessionId??f}));if(r.length!==0)return h(()=>l.bulkAdd("events",r),"Error storing replay events")})(e)},"sdk_replay_add_event_batch_seconds")},500)},St=(e,t,r)=>{w.cleanupInterval=window.setInterval(()=>{const n=Date.now();He(()=>h(async()=>{D()||await Promise.all([l.deleteRowsBefore("events",n-1e3*e,a=>a.expiredAt===void 0||a.expiredAt<n-1e3*e),l.deleteRowsBefore("chunkUploads",n-1e3*t),l.deleteRowsBefore("pendingCaptures",n-1e3*r,a=>!a.canUpload)])},"Error deleting table rows"),"sdk_replay_cleanup_seconds"),o.breadcrumbsLogger.debug("CleanupComplete")},3e4)},Dt=()=>{w.pendingCheckInterval=window.setInterval(async()=>{h(async()=>{await ae()},"Error initiating pending captures")},5e3)},ae=async(e=!1)=>{const t=parseInt(U??"0");if(t===0)return;const r=await l.getPendingCaptures({beforePresent:!0,isBeforeType:e}),n=await l.openDB();await Promise.all(r.map(async a=>(await n.delete("pendingCaptures",a.uuid),Ve(a.captureParams,a.canUpload)))),U=(t-r.length).toString(),o.sessionStorageHelper.setItem("sprig.pendingCount",U)},Et=async(e,t,r,n,a)=>{const s=Math.min(e+a,r),i=await He(()=>l.getEventsBetween(e,s),"sdk_replay_get_events_between_seconds");if(!(i!=null&&i.length))return o.breadcrumbsLogger.debug("NoEventsFound"),{validStartFound:n,events:[]};if(!n){o.breadcrumbsLogger.debug("ValidStartSearch");let c=-1;return i==null||i.forEach((d,u)=>{if(!d.isValidStart)return;const y=d.timestamp<=t;(c<0||y)&&(c=u)}),c<0?(o.breadcrumbsLogger.debug("ValidStartNotFound"),{validStartFound:n,events:[]}):{validStartFound:!0,events:i==null?void 0:i.slice(c)}}return{validStartFound:n,events:i}},Fe=e=>Promise.all(e.map(async t=>{const r=await(async n=>fe.execute(async()=>{var i;o.breadcrumbsLogger.info("UploadChunkStart",{chunkIndex:n.chunkIndex,surveyId:n.surveyId});const a=await o.sprigFetch(n.uploadUrl,{body:n.data,method:"PUT"});o.breadcrumbsLogger.http("UploadChunkEnd",{url:n.uploadUrl,method:"PUT",status_code:a.status,reason:a.statusText??"OK",chunkIndex:n.chunkIndex,surveyId:n.surveyId});const s=(i=a.headers)==null?void 0:i.get("ETag");if(!s)throw new Error(`Upload response did not include etag for upload ${n.uploadId}, part ${n.chunkIndex}`);return s}))(t);return await l.updatePartial("chunkUploads",t.uuid,{data:null,etag:r,status:"UploadComplete"}),t.uploadId})),je=async e=>{const t=await l.getChunkUploadsByStatus({status:"UploadComplete",uploadId:e});if(!(t!=null&&t.length))return void o.breadcrumbsLogger.info("NoChunksForUpload",{uploadId:e});const r=t.reduce((s,i)=>(s.find(c=>c.chunkIndex===i.chunkIndex)||s.push(i),s),[]);r.sort((s,i)=>s.chunkIndex-i.chunkIndex);const n=r.map(s=>({ETag:s.etag,PartNumber:s.chunkIndex})).filter(s=>s.ETag!==null),a=r[0];await he({apiUrl:a.apiUrl,surveyId:a.surveyId,uploadId:e,responseGroupUuid:a.responseGroupId,etags:n,headers:a.completeUploadHeaders,replayDuration:a.replayDuration}),await l.deleteChunkUploads("UploadComplete",e)},kt=()=>{h(async()=>{const e=await l.getChunkUploadsByStatus({sessionId:f,status:"ReadyForUpload"});if(!(e!=null&&e.length))return;const t=await Fe(e);t!=null&&t.length&&await Promise.all(t.map(r=>{if(r)return je(r)}))},"Error uploading unfinished chunks")},Ct=async(e,t)=>{const r=t??Date.now();return(async(n,a)=>{const s=new TextEncoder;let i=null;const c=new CompressionStream("gzip"),d=c.writable.getWriter();let u=!1,y=!1,[p,m]=[0,0],g=[];for(let E=n-35e3;E<a;E+=ee){if({validStartFound:y,events:g}=await Et(E,n,a,y,ee),!(g!=null&&g.length)){o.breadcrumbsLogger.debug("NoEventsFound");continue}p===0&&(p=g[0].timestamp),m=g[g.length-1].timestamp;const A=g.map(x=>x.event);A.push(`{"timestamp":${a}}`);const _=`${u?",":"["}${A}`,N=s.encode(_);Me(()=>{d.write(N)},"sdk_replay_compression_seconds"),u=!0}if(m-p<Oe)return o.breadcrumbsLogger.debug("ReplayTooShort"),null;const b=s.encode("]");return d.write(b),d.close(),i=new Uint8Array(await new Response(c.readable).arrayBuffer()),i})(r-e,r)},me=async e=>{const{surveyId:t,responseGroupId:r,visitorId:n,apiUrl:a,completeUploadHeaders:s,replayParams:i,triggerTimestamp:c}=e,d=await Ct(1e3*i.replayDurationSeconds,c);if(!(d!=null&&d.length))return void o.breadcrumbsLogger.info("FileDataEmpty",{surveyId:t});const u=((p,m,g)=>{const b=p.length,E=1024*m*1024,A=Math.ceil(b/g),_=Math.max(E,A),N=[];let x=0;for(;x<b;)N.push(p.slice(x,x+_)),x+=_;return N})(d,i.minimumChunkSizeMb,i.signedUrls.length),y=await Promise.all(u.map(async(p,m)=>{const g=o.v4(),b={apiUrl:a,chunkIndex:m+1,completeUploadHeaders:s,etag:null,responseGroupId:r,status:"ReadyForUpload",surveyId:t,timestamp:c,totalChunks:u.length,data:p,uploadId:i.uploadId,uploadUrl:i.signedUrls[m].url,uuid:g,visitorId:n};return await(await l.openDB()).add("chunkUploads",{...b,sessionId:b.sessionId??f}),b}));await(async(p,m)=>{await Fe(m),await Promise.all(p.map(g=>je(g)))})([i.uploadId],y)},Ve=async(e,t)=>{if(D())return o.breadcrumbsLogger.debug("ReplayDisabled-ScheduleOrCapture");const{isHeatmap:r,isStandalone:n,replayParams:a,triggerTimestamp:s,responseGroupId:i}=e,c=async()=>{setTimeout(()=>o.eventEmitter.removeListener(o.SprigEvent.QuestionAnswered,c),0),h(async()=>{a.replayDurationType==="before"?await me(e):await l.markPendingCaptureToCanUpload(i)},"Error in schedule/capture callback")};h(async()=>{if(a.replayDurationType==="after"||a.replayDurationType==="beforeAndAfter")return!n&&!r&&o.eventEmitter.on(o.SprigEvent.QuestionAnswered,c),void await $e(e);if(n||r||t)await me(e),r&&Ut();else{const d=35+a.replayDurationSeconds,u=s-1e3*d,y=s;await l.updateEventsExpiredAt(u,y,a.expirationTimeLimitMinutes),o.eventEmitter.on(o.SprigEvent.QuestionAnswered,c)}},"Error in scheduling/capturing replay")},Ut=async()=>{parseInt(U??"0")||o.sessionStorageHelper.removeItem("sprig.isCapturingHeatmap"),o.sessionStorageHelper.getItem("sprig.teardownAfterCapture")&&(Ue(),Ge(),o.sessionStorageHelper.removeItem("sprig.teardownAfterCapture"))},Ge=async()=>D()?o.breadcrumbsLogger.debug("ReplayDisabled-ClearData"):Promise.all([l.deleteBySessionId("events",f),l.deleteBySessionId("pendingCaptures",f)]).catch(e=>{V("Error clearing user replay data",e)}),$e=async e=>{if(D())return;const{isHeatmap:t,surveyId:r}=e,n=await l.getPendingCaptures(),a=n==null?void 0:n.filter(d=>d.captureParams.surveyId===r);if(a!=null&&a.length)return void o.breadcrumbsLogger.info("PendingCaptureExists",{surveyId:r});t&&(w.isRecording&&h(()=>{var d,u;return(u=(d=window.rrwebRecord)==null?void 0:d.takeFullSnapshot)==null?void 0:u.call(d,!0)},"Error recording full snapshot"),o.sessionStorageHelper.setItem("sprig.isCapturingHeatmap","true"),te=Date.now(),w.inactivityInterval||(w.inactivityInterval=window.setInterval(()=>{var d;d=te,Date.now()-d>=3e4&&h(()=>l.markPendingHeatmapsReady(),"Error in heatmap inactivity")},1e3)));const s={...e,replayParams:{...e.replayParams}};e.replayParams.replayDurationType==="beforeAndAfter"&&(s.replayParams.replayDurationSeconds*=2),s.replayParams.replayDurationType="before";const i=e.triggerTimestamp+1e3*e.replayParams.replayDurationSeconds;s.triggerTimestamp=i,U=(parseInt(U??"0")+1).toString(),o.sessionStorageHelper.setItem("sprig.pendingCount",U),await(await l.openDB()).add("pendingCaptures",{canUpload:!1,captureParams:s,sessionId:f,targetTimestamp:i,timestamp:Date.now(),uuid:o.v4()})},Pt=Object.freeze(Object.defineProperty({__proto__:null,RecordEvent:e=>{S("Sprig_TrackEvent",e)},RecordPageView:e=>{e.description&&(e.description=se(e.description)),S("Sprig_PageView",e)},RecordSurveyShown:e=>{S("Sprig_ShowSurvey",e)},_completeSessionReplay:async({surveyId:e,responseGroupUuid:t,eventDigest:r,headers:n})=>{if(!e||!t)return!1;const a=window.UserLeap._API_URL,s=await he({surveyId:e,responseGroupUuid:t,eventDigest:r,apiUrl:a,headers:n},!0);return!(s!=null&&s.error)},checkPendingHeatmapsUrl:()=>D()?o.breadcrumbsLogger.debug("ReplayDisabled-PendingHeatmaps"):h(async()=>{const e=(await l.getPendingCaptures({isHeatmap:!0})).map(t=>({eventId:t.captureParams.eventId,uuid:t.uuid})).filter(({eventId:t})=>!o.checkUrlStillMatching(t)).map(({uuid:t})=>t);return o.breadcrumbsLogger.info("PendingHeatmapsToComplete",{count:e.length}),e.length&&(await l.markPendingHeatmapsReady(e),o.breadcrumbsLogger.info("MarkedPendingHeatmapsReady")),e.length},"Error marking pending heatmaps ready"),clearUserReplayData:Ge,disableRecording:V,initializeReplay:async({maxReplayDurationSeconds:e,maxInflightRequests:t=2,replaySettings:r,teardownAfter:n=!1,apiUrl:a,alwaysOnConfig:s})=>{if(s&&mt({apiUrl:a,config:s,triggerSnapshot:()=>{var d;return(d=window.rrwebRecord)==null?void 0:d.takeFullSnapshot(!0)}}),U=o.sessionStorageHelper.getItem("sprig.pendingCount"),w.isRecording)return;if(n&&o.sessionStorageHelper.setItem("sprig.teardownAfterCapture","true"),D())return o.breadcrumbsLogger.debug("ReplayDisabled");if(await(async()=>{var d;if(!Ce())return!0;if((d=window.navigator.storage)!=null&&d.estimate)try{const{quota:u=0,usage:y=0}=await window.navigator.storage.estimate(),p=(u-y)/1024**3;return o.breadcrumbsLogger.info("Storage",{availableGb:p}),p<.5}catch{return!0}return!1})())return o.breadcrumbsLogger.debug("IDBNotSupported"),Z();try{const d=await l.openDB();o.breadcrumbsLogger.info("DBVersion",{version:d.version})}catch(d){return o.breadcrumbsLogger.error("ReplayOpenErr",{name:d.name}),d.name==="VersionError"&&l.deleteDB(),Z()}h(async()=>{await ae(!0)},"Error uploading ready pending captures");const i=L()?30:0,c=Math.max(e??0,i);if(!c)return o.breadcrumbsLogger.debug("MissingDuration");o.breadcrumbsLogger.debug("ReplayInit"),await h(async()=>{var d;if(r!=null&&r.minDuration&&(Oe=r.minDuration),r!=null&&r.batchDuration&&(ee=r.batchDuration),d=t,fe.setLimit(d),kt(),St(c+35,1800,c+35),Dt(),!window.rrwebRecord){const{record:m}=await import(window.UserLeap.replayLibraryURL??"https://cdn.sprig.com/dependencies/record-2.0.0-alpha.17.min.js");window.rrwebRecord=m}const u=window.rrwebRecord;if(!u)return o.breadcrumbsLogger.error("RecordScriptFailed");let y=!0,p=0;w.stopRecording=u({checkoutEveryNms:3e4,sampling:{input:"last",scroll:250,media:800},emit:(m,g)=>{if(m.type===k.Custom&&(te=Date.now()),D())return;if(g&&m.type===k.Meta)p=performance.now();else if(g&&p&&m.type===k.FullSnapshot){const E=performance.now()-p;o.reportAndRegister("sdk_replay_snapshot_seconds",E/1e3)}const b=y||!!g&&m.type===k.Meta;y=!1,bt(b,m),It({uuid:o.v4(),event:JSON.stringify(m),isValidStart:b,timestamp:Date.now()})},...r}),w.isRecording=!!w.stopRecording,w.isRecording&&(o.eventEmitter.on("survey.complete",m=>{var g;g={id:m,userAgent:window.navigator.userAgent},S("Sprig_SubmitSurvey",g)}),ot())},"Error initializing replay")},isReplayRecording:()=>w.isRecording,scheduleCapture:$e,scheduleOrCaptureReplay:Ve,tryReplayAction:h,uploadReadyPendingCaptures:ae},Symbol.toStringTag,{value:"Module"}));o.registerReplay(Pt);
1
+ "use strict";var Ye=Object.defineProperty;var Ze=(e,t,r)=>t in e?Ye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var W=(e,t,r)=>Ze(e,typeof t!="symbol"?t+"":t,r);const o=require("./metricsReporter-BLXrIaei.cjs");var x=(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))(x||{}),U=(e=>(e[e.Mutation=0]="Mutation",e[e.MouseMove=1]="MouseMove",e[e.MouseInteraction=2]="MouseInteraction",e[e.Scroll=3]="Scroll",e[e.ViewportResize=4]="ViewportResize",e[e.Input=5]="Input",e[e.TouchMove=6]="TouchMove",e[e.MediaInteraction=7]="MediaInteraction",e[e.StyleSheetRule=8]="StyleSheetRule",e[e.CanvasMutation=9]="CanvasMutation",e[e.Font=10]="Font",e[e.Log=11]="Log",e[e.Drag=12]="Drag",e[e.StyleDeclaration=13]="StyleDeclaration",e[e.Selection=14]="Selection",e[e.AdoptedStyleSheet=15]="AdoptedStyleSheet",e[e.CustomElement=16]="CustomElement",e))(U||{});const X=(e,t)=>t.some(r=>e instanceof r);let ge,me;const Y=new WeakMap,J=new WeakMap,G=new WeakMap;let Z={get(e,t,r){if(e instanceof IDBTransaction){if(t==="done")return Y.get(e);if(t==="store")return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return L(e[t])},set:(e,t,r)=>(e[t]=r,!0),has:(e,t)=>e instanceof IDBTransaction&&(t==="done"||t==="store")||t in e};function be(e){Z=e(Z)}function et(e){return(me||(me=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(ee(this),t),L(this.request)}:function(...t){return L(e.apply(ee(this),t))}}function tt(e){return typeof e=="function"?et(e):(e instanceof IDBTransaction&&function(t){if(Y.has(t))return;const r=new Promise((n,a)=>{const s=()=>{a(t.error||new DOMException("AbortError","AbortError"))};t.oncomplete=()=>{n()},t.onerror=s,t.onabort=s});Y.set(t,r)}(e),X(e,ge||(ge=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,Z):e)}function L(e){if(e instanceof IDBRequest)return function(r){const n=new Promise((a,s)=>{r.onsuccess=()=>{a(L(r.result))},r.onerror=()=>{s(r.error)}});return G.set(n,r),n}(e);if(J.has(e))return J.get(e);const t=tt(e);return t!==e&&(J.set(e,t),G.set(t,e)),t}const ee=e=>G.get(e);function te(e,{blocked:t}={}){const r=indexedDB.deleteDatabase(e);return t&&(r.onblocked=n=>t(n.oldVersion,n)),L(r).then(()=>{})}const rt=["get","getKey","getAll","getAllKeys","count"],nt=["put","add","delete","clear"],q=new Map;function we(e,t){if(!(e instanceof IDBDatabase)||t in e||typeof t!="string")return;if(q.get(t))return q.get(t);const r=t.replace(/FromIndex$/,""),n=t!==r,a=nt.includes(r);if(!(r in(n?IDBIndex:IDBObjectStore).prototype)||!a&&!rt.includes(r))return;const s=async function(i,...c){const d=this.transaction(i,a?"readwrite":"readonly");let u=d.store;return n&&(u=u.index(c.shift())),(await Promise.all([u[r](...c),a&&d.done]))[0]};return q.set(t,s),s}be(e=>({...e,get:(t,r,n)=>we(t,r)||e.get(t,r,n),has:(t,r)=>!!we(t,r)||e.has(t,r)}));const at=["continue","continuePrimaryKey","advance"],ye={},re=new WeakMap,Se=new WeakMap,st={get(e,t){if(!at.includes(t))return e[t];let r=ye[t];return r||(r=ye[t]=function(...n){re.set(this,Se.get(this)[t](...n))}),r}};async function*ot(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const r=new Proxy(t,st);for(Se.set(r,t),G.set(r,ee(t));t;)yield r,t=await(re.get(r)||t.continue()),re.delete(r)}function fe(e,t){return t===Symbol.asyncIterator&&X(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&X(e,[IDBIndex,IDBObjectStore])}be(e=>({...e,get:(t,r,n)=>fe(t,r)?ot:e.get(t,r,n),has:(t,r)=>fe(t,r)||e.has(t,r)}));const it="sprigReplayIframeLoaded",dt="sprigReplayIframeSettings",ct="sprigReplayIframeTakeFullSnapshot",ut="sprigReplayTeardown",ce=[],De=new class{constructor(e){W(this,"awaitingResolvers",[]);W(this,"activeCount",0);this.capacity=e}async acquire(){if(!(this.activeCount<this.capacity))return new Promise(e=>{this.awaitingResolvers.push(e)});this.activeCount++}release(){const e=this.awaitingResolvers.shift();e&&this.activeCount<=this.capacity?e():this.activeCount--}async execute(e){try{return await this.acquire(),await e()}finally{this.release()}}setLimit(e){this.capacity=e}}(2),Ee=async({apiUrl:e,surveyId:t,uploadId:r,etags:n,headers:a,responseGroupUuid:s,replayDuration:i,eventDigest:c},d=!1)=>{var w;if(!d&&!r&&!n)return void o.breadcrumbsLogger.error("UploadErr",{isMobile:d,uploadId:r,etags:n});o.breadcrumbsLogger.info("MarkUploadComplete",{surveyId:t});const u=await o.sprigFetch(`${e}/sdk/1/completeSessionReplay`,{method:"POST",body:JSON.stringify({etags:n,uploadId:r,responseGroupUuid:s,surveyId:t,replayDuration:i,eventDigest:c,userAgent:(w=window==null?void 0:window.navigator)==null?void 0:w.userAgent}),headers:a,shouldRetryRequest:!0});return o.breadcrumbsLogger.info("MarkUploadDone",{surveyId:t}),u},lt=e=>{if(e instanceof Attr)return null;let t=1;for(let r=e.previousSibling;r;r=r.previousSibling)r.nodeName===e.nodeName&&++t;return t},Ce=e=>{if(e===null)return"";const t=[];if(e instanceof Document)return"/";for(let r=e;r&&!(r instanceof Document)&&r!==null;r=r instanceof Attr?r.ownerElement:r.parentElement){const n=t[t.length]={name:void 0,position:null};switch(r.nodeType){case Node.TEXT_NODE:n.name="text()";break;case Node.ATTRIBUTE_NODE:n.name="@"+r.nodeName;break;case Node.PROCESSING_INSTRUCTION_NODE:n.name="processing-instruction()";break;case Node.COMMENT_NODE:n.name="comment()";break;case Node.ELEMENT_NODE:n.name=r.nodeName}n.position=lt(r)}return"/"+t.reverse().map(r=>r.position!==null?`/${r.name}[${r.position}]`:`/${r.name}`).join("")},ue=e=>e&&e.trim().substring(0,500).replace(/\s\s+/g," ").replace(/\r?\n|\r/g," ").substring(0,250),C={capture:!0,passive:!0},pt=["a","button","input","option","li","link"],gt=["Escape","Enter","Backspace","F5","Tab"];let $=!1,S=null,O=null;const he=e=>{var r;if(((r=e.tagName)==null?void 0:r.toLowerCase())==="html")return{element:"html"};const t={};return t.element=(n=>{if(!n.tagName)return"No tagName";const a=n.getAttribute("type");return a?`${a} ${n.tagName.toLowerCase()}`:n.tagName.toLowerCase()})(e),t},mt=e=>{var n;if(!e)return{};const t={...he(e)},r=e.parentElement;if(r&&pt.includes((n=r.tagName)==null?void 0:n.toLowerCase())){const a=he(r);Object.assign(t,a)}return t},ke=(e,t)=>{var a,s;let r=t.target;var n;t.target===((a=window.document)==null?void 0:a.body)&&window.Sprig.pointerDownTarget&&(r=window.Sprig.pointerDownTarget),n={x:t.x,y:t.y,type:e,elementAttributes:mt(r),windowHeight:window.innerHeight,windowWidth:window.innerWidth,...r instanceof HTMLElement?{rect:r==null?void 0:r.getBoundingClientRect(),xPath:Ce(r)}:{}},(s=n==null?void 0:n.elementAttributes)!=null&&s.text&&(n.elementAttributes.text=ue(n.elementAttributes.text)),S==null||S("Sprig_Click",n)},Re=e=>{var t;gt.includes(e.key)&&(t={key:e.key},S==null||S("Sprig_Keystroke",t))},wt=()=>{var e;window.performance.getEntriesByType("navigation").map(t=>t.type).includes("reload")&&(e={url:window.location.href,currentPageTitle:document.title},S==null||S("Sprig_Refresh",e))},yt=()=>{var e;window.performance.getEntriesByType("navigation").map(t=>t.type).includes("back_forward")&&((e={curUrl:window.location.href,fromUrl:document.referrer,currentPageTitle:document.title}).currentPageTitle&&(e.currentPageTitle=ue(e.currentPageTitle)),S==null||S("Sprig_BackForward",e))},Ue=((e,t)=>{let r;return n=>{clearTimeout(r),r=window.setTimeout(()=>e(n),t)}})(e=>{if(!(e.target instanceof HTMLElement||e.target instanceof Document))return;let t=e.target;"scrollTop"in t||(t=t.documentElement),O==null||O({xPath:Ce(t),x:t.scrollLeft,y:t.scrollTop,elementAttributes:{targetScrollWidth:t.scrollWidth,targetClientWidth:t.clientWidth,targetScrollHeight:t.scrollHeight,targetClientHeight:t.clientHeight}})},750),Pe=(Ie="left_click",e=>ke(Ie,e));var Ie;const xe=e=>{e.button===2&&ke("right_click",e)},Le=e=>{window.Sprig&&(window.Sprig.pointerDownTarget=e.target)},g={isRecording:!1,scrollEventUuids:{},stopRecording:()=>{}},Be=()=>window.indexedDB&&window.IDBKeyRange&&window.CompressionStream,h=(()=>{const e=o.sessionStorageHelper.getItem("sprig.sessionId");if(e)return o.breadcrumbsLogger.info("SessionIDFound",{savedSessionId:e}),o.sessionStorageHelper.removeItem("sprig.sessionId"),e;const t=o.v4();return o.breadcrumbsLogger.info("GeneratedSessionID",{uuid:t}),t})(),ne=()=>{o.sessionStorageHelper.setItem("sprig.disableReplayRecording","disabled")},k=()=>!!o.sessionStorageHelper.getItem("sprig.disableReplayRecording");window.addEventListener("beforeunload",()=>{o.breadcrumbsLogger.info("BeforeUnload",{sessionId:h}),o.sessionStorageHelper.setItem("sprig.sessionId",h)});const T=(e,t)=>{var r,n;if(!k()&&g.isRecording)try{(n=(r=window.rrwebRecord)==null?void 0:r.addCustomEvent)==null||n.call(r,e,t)}catch(a){K("Error recording custom event",a)}},ft=async e=>{const{x:t,xPath:r,y:n}=e,a=g.scrollEventUuids[r];if(a)return b(async()=>{var c,d,u,w;const s=await l.openDB(),i=await s.get("events",a);if(i!=null&&i.event){const p=JSON.parse(i.event),f=t>((d=(c=p.data)==null?void 0:c.payload)==null?void 0:d.x),m=n>((w=(u=p.data)==null?void 0:u.payload)==null?void 0:w.y);if(!f&&!m)return null;f&&(p.data.payload.x=t),m&&(p.data.payload.y=n),p.data.payload.elementAttributes=e.elementAttributes,i.event=JSON.stringify(p),await s.put("events",i)}else T("Sprig_Scroll",e)},"Error updating scroll event");T("Sprig_Scroll",e)},Te=()=>{g.stopRecording&&(g.stopRecording(),g.stopRecording=void 0),g.isRecording=!1,["cleanupInterval","inactivityInterval","pendingCheckInterval"].forEach(e=>{g[e]&&(clearInterval(g[e]),g[e]=void 0)}),$&&(window.removeEventListener("click",Pe,C),window.removeEventListener("pointerdown",Le,C),window.removeEventListener("mousedown",xe,C),window.removeEventListener("keydown",Re,C),window.removeEventListener("scroll",Ue,C),$=!1),ce.forEach(e=>{var t;(t=e.source)==null||t.postMessage({type:ut},{targetOrigin:e.origin})})},ht=["did not allow mutations","called in an invalid security context"],It=(e,t,{reportError:r=!0,extraInfo:n={}})=>{if(!k()&&t instanceof Error){if(ne(),t.name==="VersionError")return o.breadcrumbsLogger.error("VersionErr",{message:e}),l.deleteDB();(a=>{if(!a)return!0;for(const s of ht)if(a.toLowerCase().includes(s))return!1;return!0})(t==null?void 0:t.message)&&(r&&window.UserLeap.reportError(e,t,n),l.clearAll())}},K=(e,t,{reportError:r}={reportError:!0})=>{Te(),o.breadcrumbsLogger.error("ReplayErr",{code:t.code,name:t.name}),It(e,t,{reportError:r})},b=async(e,t)=>{try{return await e()}catch(r){K(t,r)}},Me=()=>{g.isRecording&&(b(()=>{var e,t;return(t=(e=window.rrwebRecord)==null?void 0:e.takeFullSnapshot)==null?void 0:t.call(e,!0)},"Error recording full snapshot"),ce.forEach(e=>{var t;(t=e.source)==null||t.postMessage({type:ct},{targetOrigin:e.origin})}))};Be()&&(te("replayStorage").catch(console.error),te("sprig.replay").catch(console.error));const l=new class{openDB(){return function(e,t,{blocked:r,upgrade:n,blocking:a,terminated:s}={}){const i=indexedDB.open(e,t),c=L(i);return n&&(i.onupgradeneeded=d=>{n(L(i.result),d.oldVersion,d.newVersion,L(i.transaction),d)}),r&&(i.onblocked=d=>r(d.oldVersion,d.newVersion,d)),c.then(d=>{s&&(d.onclose=()=>s()),a&&(d.onversionchange=u=>a(u.oldVersion,u.newVersion,u))}).catch(()=>{}),c}("sprigReplay",1,{upgrade:(e,t,r)=>{if(r===0&&o.sessionStorageHelper.setItem("sprig.pendingCount","0"),!e.objectStoreNames.contains("events")){const n=e.createObjectStore("events",{keyPath:"uuid"});n.createIndex("sessionId","sessionId"),n.createIndex("timestamp","timestamp"),n.createIndex("[sessionId+timestamp]",["sessionId","timestamp"])}if(!e.objectStoreNames.contains("chunkUploads")){const n=e.createObjectStore("chunkUploads",{keyPath:"uuid"});n.createIndex("sessionId","sessionId"),n.createIndex("timestamp","timestamp"),n.createIndex("[sessionId+status]",["sessionId","status"]),n.createIndex("[uploadId+status]",["uploadId","status"]),n.createIndex("[sessionId+status+uploadId]",["sessionId","status","uploadId"])}if(!e.objectStoreNames.contains("pendingCaptures")){const n=e.createObjectStore("pendingCaptures",{keyPath:"uuid"});n.createIndex("sessionId","sessionId"),n.createIndex("timestamp","timestamp"),n.createIndex("[sessionId+targetTimestamp]",["sessionId","targetTimestamp"])}}})}deleteDB(){return te("sprigReplay").catch(console.error)}async bulkAdd(e,t){const r=(await this.openDB()).transaction(e,"readwrite");return Promise.all([...t.map(n=>r.store.add(n)),r.done])}async clearAll(){const e=(await this.openDB()).transaction(["events","chunkUploads","pendingCaptures"],"readwrite");return Promise.all([e.objectStore("events").clear(),e.objectStore("chunkUploads").clear(),e.objectStore("pendingCaptures").clear()])}async deleteBySessionId(e,t){const r=IDBKeyRange.only(t),n=(await this.openDB()).transaction(e,"readwrite"),a=n.store.index("sessionId");for await(const s of a.iterate(r))await s.delete();await n.done}async updatePartial(e,t,r){const n=(await this.openDB()).transaction(e,"readwrite"),a=await n.store.get(t);a&&await n.store.put({...a,...r}),await n.done}async deleteRowsBefore(e,t,r=()=>!0){const n=IDBKeyRange.upperBound(t,!0),a=(await this.openDB()).transaction(e,"readwrite"),s=a.store.index("timestamp");for await(const i of s.iterate(n))r(i.value)&&await i.delete();await a.done}async getEventsBetween(e,t=Date.now()){if(e>=t)return Promise.resolve([]);const r=IDBKeyRange.bound([h,e],[h,t],!1,!0);return(await this.openDB()).getAllFromIndex("events","[sessionId+timestamp]",r)}async updateEventsExpiredAt(e,t,r=30){const n=new Date,a=n.setMinutes(n.getMinutes()+(r??30)),s=(await this.openDB()).transaction("events","readwrite"),i=s.store.index("[sessionId+timestamp]"),c=IDBKeyRange.bound([h,e],[h,t],!1,!0);for await(const d of i.iterate(c))await d.update({...d.value,expiredAt:a});await s.done}async deleteChunkUploads(e,t){const r=IDBKeyRange.only([t,e]),n=(await this.openDB()).transaction("chunkUploads","readwrite");let s=await n.store.index("[uploadId+status]").openCursor(r);for(;s;)s.delete(),s=await s.continue();await n.done}async getChunkUploadsByStatus({sessionId:e,status:t,uploadId:r}){const n=(await this.openDB()).transaction("chunkUploads","readonly"),a=r?n.store.index("[uploadId+status]"):n.store.index("[sessionId+status]"),s=r?IDBKeyRange.only([r,t]):IDBKeyRange.only([e,t]);return a.getAll(s)}async getPendingCaptures(e={}){return(await(await this.openDB()).getAllFromIndex("pendingCaptures","sessionId",h)).filter(r=>!e.beforePresent||r.targetTimestamp<Date.now()).filter(r=>!e.isBeforeType||r.captureParams.replayParams.replayDurationType==="before").filter(r=>!e.isHeatmap||(r.captureParams.isHeatmap??!1))}async markPendingCaptureToCanUpload(e){const t=(await this.openDB()).transaction("pendingCaptures","readwrite"),r=t.store.index("sessionId");for await(const n of r.iterate(h)){const a=n.value;a.captureParams.responseGroupId===e&&await n.update({...a,canUpload:!0})}await t.done}async markPendingHeatmapsReady(e){if(parseInt(o.sessionStorageHelper.getItem("sprig.pendingCount")??"0")===0)return null;const t=Date.now(),r=(await this.openDB()).transaction("pendingCaptures","readwrite"),n=r.store.index("sessionId");for await(const a of n.iterate(h)){const s=a.value;!s.captureParams.isHeatmap||e&&!e.includes(s.uuid)||await a.update({...s,targetTimestamp:t,captureParams:{...s.captureParams,triggerTimestamp:t,replayParams:{...s.captureParams.replayParams,replayDurationSeconds:Math.floor((t-s.timestamp)/1e3)}}})}await r.done}},P=[];let H,Ae,j,_e,F,Ne,M=[],_=!1,A=0,V=!1,He=!1,le=[],z=!1;const N=()=>V&&!_&&Date.now()<=j,vt=({apiUrl:e,config:t,triggerSnapshot:r,forceInit:n=!1})=>{V&&!n||(o.sessionStorageHelper.isStorageAvailable?(M=[],le.splice(0),P.splice(0),A=0,F=r,Ae=e,H={responseGroupUuid:t.responseGroupUuid,surveyId:t.surveyId,userAgent:t.userAgent,sdkVersion:t.sdkVersion},_e=t.maxDurationSeconds,Et(),V||(Ne=window.setInterval(Dt,500)),V=!0):_=!0)},bt=[U.Drag,U.Input,U.MediaInteraction,U.MouseInteraction,U.MouseMove,U.Scroll,U.Selection,U.TouchMove],St=e=>e.type===x.Custom||e.type===x.IncrementalSnapshot&&bt.includes(e.data.source),pe=e=>e.some(St),Dt=async()=>{if(!N())return void window.clearInterval(Ne);if(Oe(),!pe(P))return;const e=P[0].timestamp;Date.now()-e>35e3&&(F==null||F())},Oe=async()=>{if(M.length||z)return;z=!0;const e=await kt();if(!e)return void(_=!0);le.splice(0,e.length).forEach(t=>t(e.shift())),e.forEach(t=>M.push(t)),z=!1},Et=()=>{const e=o.sessionStorageHelper.getItem("sprig.alwayson.info");if(e){o.breadcrumbsLogger.info("Read stored session state",e);const t=JSON.parse(e);_=t.disabled,H=t.metadata,M=t.uploadUrls,A=t.currentIndex,j=t.expirationTimestamp,t.pendingEventTimestamp&&(o.breadcrumbsLogger.info(`Uploading with pending timestamp: ${t.pendingEventTimestamp}`),Ct(t.pendingEventTimestamp))}else j=1e3*_e+Date.now()},Ct=async e=>{const t=Date.now(),r=(await l.getEventsBetween(e,t)).map(a=>JSON.parse(a.event));if(!pe(r))return;$e(r);const n=await Ge();n&&await Ve(n,r)},Fe=async(e,t)=>{try{const r=await e();if(!r.ok)throw new Error(`Error ${t}`);return r}catch{_=!0}},Ve=async(e,t)=>{if(!N()||!e)return;const r=await(async n=>{const a=new TextEncoder,s=new CompressionStream("gzip"),i=s.writable.getWriter(),c=a.encode(JSON.stringify(n));return i.write(c),i.close(),new Uint8Array(await new Response(s.readable).arrayBuffer())})(t);o.breadcrumbsLogger.info("Uploading always-on events with presigned url"),await Fe(()=>o.sprigFetch(e,{body:r,method:"PUT"}),"uploading always-on with presigned url")},kt=async()=>{if(!N())return;const{surveyId:e,responseGroupUuid:t}=H,r={responseGroupUuid:t,surveyId:e,index:A+1};o.breadcrumbsLogger.info("Fetching always-on upload urls",r);const n=await Fe(()=>o.sprigFetch(`${Ae}/sdk/1/replayUrls`,{method:"POST",body:JSON.stringify(r),headers:o.getHttpHeaders(window.UserLeap)}),"fetching always-on signed urls");if(!n)return;const a=n.json.signedUrls;return o.breadcrumbsLogger.info("Fetched more always-on upload urls",{body:r,urls:a}),a},Ge=async()=>{if(M.length)return M.shift();const e=new Promise(t=>{le.push(t)});return Oe(),e},$e=e=>{var a,s,i;const t=e.length?e[e.length-1].timestamp:Date.now(),r=A,n=((s=(a=window.UserLeap)==null?void 0:a.config)==null?void 0:s.customMetadata)??((i=window.__cfg)==null?void 0:i.customMetadata);A++,e.push({timestamp:t,type:x.Custom,data:{tag:"Sprig_Meta",payload:{...H,index:r,visitorId:window.UserLeap.visitorId??"",timestamp:t,customMetadata:n}}})},Rt=(e,t)=>{N()&&!He&&(e||P.length)&&(e&&P.length&&(async()=>{const r=P.splice(0);if(!pe(r))return;o.breadcrumbsLogger.info("Capturing always-on event array to upload"),$e(r);const n=await Ge();n&&await Ve(n,r)})(),P.push(t))};window.addEventListener("beforeunload",async()=>{He=!0,N()&&(o.breadcrumbsLogger.info("Always On handle page unload"),(()=>{let e;P.length&&(e=P[0].timestamp);const t={disabled:_,metadata:H,uploadUrls:M,currentIndex:A,pendingEventTimestamp:e,expirationTimestamp:j};o.breadcrumbsLogger.info("Storing session state on unload",t),o.sessionStorageHelper.setItem("sprig.alwayson.info",JSON.stringify(t))})())});const je=async(e,t)=>{const r=performance.now();let n;try{n=await e()}finally{const a=performance.now()-r;let s=o.PerformanceMetrics[t];s||(s=o.registerMetric(t)),s.report(a/1e3)}return n},Ke=(e,t)=>{const r=performance.now();try{e()}finally{const n=performance.now()-r;let a=o.PerformanceMetrics[t];a||(a=o.registerMetric(t)),a.report(n/1e3)}};let We=5e3,ae=6e4,se=0,B,oe=!1,ie=[];const Ut=e=>{var t,r,n,a;if((t=e.event)!=null&&t.includes("Sprig_Scroll")){const s=(a=(n=(r=JSON.parse(e.event))==null?void 0:r.data)==null?void 0:n.payload)==null?void 0:a.xPath;if(!s)return;g.scrollEventUuids[s]=e.uuid}ie.push(e),oe||Pt()},Pt=()=>{oe=!0,setTimeout(async()=>{if(k())return;const e=ie;ie=[],oe=!1,Ke(async()=>{await(async t=>{const r=t.map(n=>({...n,sessionId:n.sessionId??h}));if(r.length!==0)return b(()=>l.bulkAdd("events",r),"Error storing replay events")})(e)},"sdk_replay_add_event_batch_seconds")},500)},xt=(e,t,r)=>{g.cleanupInterval=window.setInterval(()=>{const n=Date.now();je(()=>b(async()=>{k()||await Promise.all([l.deleteRowsBefore("events",n-1e3*e,a=>a.expiredAt===void 0||a.expiredAt<n-1e3*e),l.deleteRowsBefore("chunkUploads",n-1e3*t),l.deleteRowsBefore("pendingCaptures",n-1e3*r,a=>!a.canUpload)])},"Error deleting table rows"),"sdk_replay_cleanup_seconds"),o.breadcrumbsLogger.debug("CleanupComplete")},3e4)},Lt=()=>{g.pendingCheckInterval=window.setInterval(async()=>{b(async()=>{await de()},"Error initiating pending captures")},5e3)};let Q=!1;const de=async(e=!1)=>{if(!Q)try{Q=!0;const t=parseInt(B??"0");if(t===0)return;const r=await l.getPendingCaptures({beforePresent:!0,isBeforeType:e}),n=await l.openDB();await Promise.all(r.map(async a=>(await n.delete("pendingCaptures",a.uuid),ze(a.captureParams,a.canUpload)))),B=(t-r.length).toString(),o.sessionStorageHelper.setItem("sprig.pendingCount",B)}finally{Q=!1}},Bt=async(e,t,r,n,a)=>{const s=Math.min(e+a,r),i=await je(()=>l.getEventsBetween(e,s),"sdk_replay_get_events_between_seconds");if(!(i!=null&&i.length))return o.breadcrumbsLogger.debug("NoEventsFound"),{validStartFound:n,events:[]};if(!n){o.breadcrumbsLogger.debug("ValidStartSearch");let c=-1;return i==null||i.forEach((d,u)=>{if(!d.isValidStart)return;const w=d.timestamp<=t;(c<0||w)&&(c=u)}),c<0?(o.breadcrumbsLogger.debug("ValidStartNotFound"),{validStartFound:n,events:[]}):{validStartFound:!0,events:i==null?void 0:i.slice(c)}}return{validStartFound:n,events:i}},Je=e=>Promise.all(e.map(async t=>{const r=await(async n=>De.execute(async()=>{var i;o.breadcrumbsLogger.info("UploadChunkStart",{chunkIndex:n.chunkIndex,surveyId:n.surveyId});const a=await o.sprigFetch(n.uploadUrl,{body:n.data,method:"PUT"});o.breadcrumbsLogger.http("UploadChunkEnd",{url:n.uploadUrl,method:"PUT",status_code:a.status,reason:a.statusText??"OK",chunkIndex:n.chunkIndex,surveyId:n.surveyId});const s=(i=a.headers)==null?void 0:i.get("ETag");if(!s)throw new Error(`Upload response did not include etag for upload ${n.uploadId}, part ${n.chunkIndex}`);return s}))(t);return await l.updatePartial("chunkUploads",t.uuid,{data:null,etag:r,status:"UploadComplete"}),t.uploadId})),qe=async e=>{const t=await l.getChunkUploadsByStatus({status:"UploadComplete",uploadId:e});if(!(t!=null&&t.length))return void o.breadcrumbsLogger.info("NoChunksForUpload",{uploadId:e});const r=t.reduce((s,i)=>(s.find(c=>c.chunkIndex===i.chunkIndex)||s.push(i),s),[]);r.sort((s,i)=>s.chunkIndex-i.chunkIndex);const n=r.map(s=>({ETag:s.etag,PartNumber:s.chunkIndex})).filter(s=>s.ETag!==null),a=r[0];await Ee({apiUrl:a.apiUrl,surveyId:a.surveyId,uploadId:e,responseGroupUuid:a.responseGroupId,etags:n,headers:a.completeUploadHeaders,replayDuration:a.replayDuration}),await l.deleteChunkUploads("UploadComplete",e)},Tt=()=>{b(async()=>{const e=await l.getChunkUploadsByStatus({sessionId:h,status:"ReadyForUpload"});if(!(e!=null&&e.length))return;const t=await Je(e);t!=null&&t.length&&await Promise.all(t.map(r=>{if(r)return qe(r)}))},"Error uploading unfinished chunks")},Mt=async(e,t)=>{const r=t??Date.now();return(async(n,a)=>{const s=new TextEncoder;let i=null;const c=new CompressionStream("gzip"),d=c.writable.getWriter();let u=!1,w=!1,[p,f]=[0,0],m=[];for(let R=n-35e3;R<a;R+=ae){if({validStartFound:w,events:m}=await Bt(R,n,a,w,ae),!(m!=null&&m.length)){o.breadcrumbsLogger.debug("NoEventsFound");continue}p===0&&(p=m[0].timestamp),f=m[m.length-1].timestamp;const y=m.map(E=>E.event);y.push(`{"timestamp":${a}}`);const I=`${u?",":"["}${y}`,v=s.encode(I);Ke(()=>{d.write(v)},"sdk_replay_compression_seconds"),u=!0}if(f-p<We)return o.breadcrumbsLogger.debug("ReplayTooShort"),null;const D=s.encode("]");return d.write(D),d.close(),i=new Uint8Array(await new Response(c.readable).arrayBuffer()),i})(r-e,r)},ve=async e=>{const{surveyId:t,responseGroupId:r,visitorId:n,apiUrl:a,completeUploadHeaders:s,replayParams:i,triggerTimestamp:c}=e,d=await Mt(1e3*i.replayDurationSeconds,c);if(!(d!=null&&d.length))return void o.breadcrumbsLogger.info("FileDataEmpty",{surveyId:t});const u=((p,f,m)=>{const D=p.length,R=1024*f*1024,y=Math.ceil(D/m),I=Math.max(R,y),v=[];let E=0;for(;E<D;)v.push(p.slice(E,E+I)),E+=I;return v})(d,i.minimumChunkSizeMb,i.signedUrls.length),w=await Promise.all(u.map(async(p,f)=>{const m=o.v4(),D={apiUrl:a,chunkIndex:f+1,completeUploadHeaders:s,etag:null,responseGroupId:r,status:"ReadyForUpload",surveyId:t,timestamp:c,totalChunks:u.length,data:p,uploadId:i.uploadId,uploadUrl:i.signedUrls[f].url,uuid:m,visitorId:n};return await(await l.openDB()).add("chunkUploads",{...D,sessionId:D.sessionId??h}),D}));await(async(p,f)=>{await Je(f),await Promise.all(p.map(m=>qe(m)))})([i.uploadId],w)},ze=async(e,t)=>{if(k())return o.breadcrumbsLogger.debug("ReplayDisabled-ScheduleOrCapture");const{isHeatmap:r,isStandalone:n,replayParams:a,triggerTimestamp:s,responseGroupId:i}=e,c=async()=>{setTimeout(()=>o.eventEmitter.removeListener(o.SprigEvent.QuestionAnswered,c),0),b(async()=>{a.replayDurationType==="before"?await ve(e):await l.markPendingCaptureToCanUpload(i)},"Error in schedule/capture callback")};b(async()=>{if(a.replayDurationType==="after"||a.replayDurationType==="beforeAndAfter")return!n&&!r&&o.eventEmitter.on(o.SprigEvent.QuestionAnswered,c),void await Xe(e);if(n||r||t)await ve(e),r&&At();else{const d=35+a.replayDurationSeconds,u=s-1e3*d,w=s;await l.updateEventsExpiredAt(u,w,a.expirationTimeLimitMinutes),o.eventEmitter.on(o.SprigEvent.QuestionAnswered,c)}},"Error in scheduling/capturing replay")},At=async()=>{parseInt(B??"0")||o.sessionStorageHelper.removeItem("sprig.isCapturingHeatmap"),o.sessionStorageHelper.getItem("sprig.teardownAfterCapture")&&(Te(),Qe(),o.sessionStorageHelper.removeItem("sprig.teardownAfterCapture"))},Qe=async()=>k()?o.breadcrumbsLogger.debug("ReplayDisabled-ClearData"):Promise.all([l.deleteBySessionId("events",h),l.deleteBySessionId("pendingCaptures",h)]).catch(e=>{K("Error clearing user replay data",e)}),Xe=async e=>{if(k())return;const{isHeatmap:t,surveyId:r}=e,n=await l.getPendingCaptures(),a=n==null?void 0:n.filter(d=>d.captureParams.surveyId===r);if(a!=null&&a.length)return void o.breadcrumbsLogger.info("PendingCaptureExists",{surveyId:r});t&&(Me(),o.sessionStorageHelper.setItem("sprig.isCapturingHeatmap","true"),se=Date.now(),g.inactivityInterval||(g.inactivityInterval=window.setInterval(()=>{var d;d=se,Date.now()-d>=3e4&&b(()=>l.markPendingHeatmapsReady(),"Error in heatmap inactivity")},1e3)));const s={...e,replayParams:{...e.replayParams}};e.replayParams.replayDurationType==="beforeAndAfter"&&(s.replayParams.replayDurationSeconds*=2),s.replayParams.replayDurationType="before";const i=e.triggerTimestamp+1e3*e.replayParams.replayDurationSeconds;s.triggerTimestamp=i,B=(parseInt(B??"0")+1).toString(),o.sessionStorageHelper.setItem("sprig.pendingCount",B),await(await l.openDB()).add("pendingCaptures",{canUpload:!1,captureParams:s,sessionId:h,targetTimestamp:i,timestamp:Date.now(),uuid:o.v4()})},_t=Object.freeze(Object.defineProperty({__proto__:null,RecordEvent:e=>{T("Sprig_TrackEvent",e)},RecordPageView:e=>{e.description&&(e.description=ue(e.description)),T("Sprig_PageView",e)},RecordSurveyShown:e=>{T("Sprig_ShowSurvey",e)},_completeSessionReplay:async({surveyId:e,responseGroupUuid:t,eventDigest:r,headers:n})=>{if(!e||!t)return!1;const a=window.UserLeap._API_URL,s=await Ee({surveyId:e,responseGroupUuid:t,eventDigest:r,apiUrl:a,headers:n},!0);return!(s!=null&&s.error)},checkPendingHeatmapsUrl:()=>k()?o.breadcrumbsLogger.debug("ReplayDisabled-PendingHeatmaps"):b(async()=>{const e=(await l.getPendingCaptures({isHeatmap:!0})).map(t=>({eventId:t.captureParams.eventId,uuid:t.uuid})).filter(({eventId:t})=>!o.checkUrlStillMatching(t)).map(({uuid:t})=>t);return o.breadcrumbsLogger.info("PendingHeatmapsToComplete",{count:e.length}),e.length&&(await l.markPendingHeatmapsReady(e),o.breadcrumbsLogger.info("MarkedPendingHeatmapsReady")),e.length},"Error marking pending heatmaps ready"),clearUserReplayData:Qe,disableRecording:K,initializeReplay:async({maxReplayDurationSeconds:e,maxInflightRequests:t=2,replaySettings:r,teardownAfter:n=!1,apiUrl:a,alwaysOnConfig:s})=>{if(s&&vt({apiUrl:a,config:s,triggerSnapshot:()=>{Me()}}),B=o.sessionStorageHelper.getItem("sprig.pendingCount"),g.isRecording)return;if(n&&o.sessionStorageHelper.setItem("sprig.teardownAfterCapture","true"),k())return o.breadcrumbsLogger.debug("ReplayDisabled");if(await(async()=>{var d;if(!Be())return!0;if((d=window.navigator.storage)!=null&&d.estimate)try{const{quota:u=0,usage:w=0}=await window.navigator.storage.estimate(),p=(u-w)/1024**3;return o.breadcrumbsLogger.info("Storage",{availableGb:p}),p<.5}catch{return!0}return!1})())return o.breadcrumbsLogger.debug("IDBNotSupported"),ne();try{const d=await l.openDB();o.breadcrumbsLogger.info("DBVersion",{version:d.version})}catch(d){return o.breadcrumbsLogger.error("ReplayOpenErr",{name:d.name}),d.name==="VersionError"&&l.deleteDB(),ne()}b(async()=>{await de(!0)},"Error uploading ready pending captures");const i=N()?30:0,c=Math.max(e??0,i);if(!c)return o.breadcrumbsLogger.debug("MissingDuration");o.breadcrumbsLogger.debug("ReplayInit"),await b(async()=>{var d;r!=null&&r.minDuration&&(We=r.minDuration),r!=null&&r.batchDuration&&(ae=r.batchDuration),d=t,De.setLimit(d),Tt(),xt(c+35,1800,c+35),Lt();const u=window.UserLeap.replayLibraryURL??"https://cdn.sprig.com/dependencies/record-2.0.0-alpha.17.min.js";if(!window.rrwebRecord){const{record:y}=await import(u);window.rrwebRecord=y}const w=window.rrwebRecord;if(!w)return o.breadcrumbsLogger.error("RecordScriptFailed");let p=!0,f=0;const m={checkoutEveryNms:3e4,sampling:{input:"last",scroll:250,media:800},...r};var D,R;g.stopRecording=w({emit:(y,I)=>{if(y.type===x.Custom&&(se=Date.now()),k())return;if(I&&y.type===x.Meta)f=performance.now();else if(I&&f&&y.type===x.FullSnapshot){const E=performance.now()-f;o.reportAndRegister("sdk_replay_snapshot_seconds",E/1e3)}const v=p||!!I&&y.type===x.Meta;p=!1,Rt(v,y),Ut({uuid:o.v4(),event:JSON.stringify(y),isValidStart:v,timestamp:Date.now()})},...m}),g.isRecording=!!g.stopRecording,g.isRecording&&(((y,I)=>{window.addEventListener("message",v=>{var E;v.data.type===it&&(ce.push({source:v.source,origin:v.origin}),(E=v.source)==null||E.postMessage({type:dt,settings:y,replayLibraryUrl:I},{targetOrigin:v.origin}))})})(m,u),o.eventEmitter.on("survey.complete",y=>{var I;I={id:y,userAgent:window.navigator.userAgent},T("Sprig_SubmitSurvey",I)}),D=T,R=ft,$||(S=D,O=R,window.addEventListener("click",Pe,C),window.addEventListener("pointerdown",Le,C),window.addEventListener("mousedown",xe,C),window.addEventListener("keydown",Re,C),window.addEventListener("scroll",Ue,C),$=!0,wt(),yt()))},"Error initializing replay")},isReplayRecording:()=>g.isRecording,scheduleCapture:Xe,scheduleOrCaptureReplay:ze,tryReplayAction:b,uploadReadyPendingCaptures:de},Symbol.toStringTag,{value:"Module"}));o.registerReplay(_t);