@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-B164snRL.cjs +12 -0
- package/dist/{core-DuIpyIdz.js → core-C0XvmpIu.js} +385 -448
- package/dist/core.cjs +1 -1
- package/dist/core.d.ts +11 -4
- package/dist/core.js +2 -2
- package/dist/electron.js +2 -4
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +11 -4
- package/dist/index.js +2 -2
- package/dist/metricsReporter-BLXrIaei.cjs +1 -0
- package/dist/{metricsReporter-DbO9obdT.js → metricsReporter-uTmb1eaJ.js} +33 -45
- package/dist/replay.cjs +1 -1
- package/dist/replay.js +432 -495
- package/dist/{view-Cf3oYcCU.js → view-DuNLA499.js} +1219 -1346
- package/dist/view-yOVTCqu5.cjs +669 -0
- package/package.json +1 -1
- package/dist/core-XsNCvQMt.cjs +0 -12
- package/dist/metricsReporter-BS7FQHoM.cjs +0 -1
- package/dist/view-DeY0w8JY.cjs +0 -669
package/dist/core.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./metricsReporter-
|
|
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-
|
|
2
|
-
import { S as o, c as p, s as t } from "./core-
|
|
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-
|
|
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-
|
|
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-
|
|
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) =>
|
|
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 && !
|
|
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
|
-
},
|
|
139
|
-
|
|
140
|
-
const ee = new
|
|
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
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
|
192
|
-
class
|
|
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
|
-
},
|
|
205
|
+
}, B = () => {
|
|
211
206
|
const e = [];
|
|
212
207
|
return k.replay && e.push("replay"), e.join(",");
|
|
213
|
-
},
|
|
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.
|
|
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
|
|
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")) :
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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);
|