@sprig-technologies/sprig-browser 2.32.0 → 2.32.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-D-LZZjJw.cjs +12 -0
- package/dist/core-DJ-C8ZCy.js +983 -0
- package/dist/core.cjs +1 -1
- package/dist/core.js +9 -1
- package/dist/electron.cjs +1 -1
- package/dist/electron.js +19 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +10 -1
- package/dist/metricsReporter-CiE5uf1B.cjs +1 -0
- package/dist/metricsReporter-D0VZ2ZgI.js +348 -0
- package/dist/replay.cjs +1 -1
- package/dist/replay.js +651 -1
- package/dist/view-CDdG2lXT.js +2830 -0
- package/dist/view-CW-37QDp.cjs +669 -0
- package/package.json +1 -1
- package/dist/core-B6K_G_tP.js +0 -12
- package/dist/core-JazVRZuc.cjs +0 -12
- package/dist/metricsReporter-ikJ_RTTQ.cjs +0 -1
- package/dist/metricsReporter-pb5Px0rg.js +0 -1
- package/dist/view-C7NBKswM.cjs +0 -685
- package/dist/view-DtwxhY6m.js +0 -685
package/dist/core.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./metricsReporter-CiE5uf1B.cjs"),e=require("./core-D-LZZjJw.cjs");exports.DismissReason=i.DismissReason,exports.SprigEvent=i.SprigEvent,exports.SprigAPI=e.SprigAPI,exports.default=e.core,exports.sprig=e.sprig;
|
package/dist/core.js
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
|
-
import{D as
|
|
1
|
+
import { D as r, S as e } from "./metricsReporter-D0VZ2ZgI.js";
|
|
2
|
+
import { S as o, c as p, s as t } from "./core-DJ-C8ZCy.js";
|
|
3
|
+
export {
|
|
4
|
+
r as DismissReason,
|
|
5
|
+
o as SprigAPI,
|
|
6
|
+
e as SprigEvent,
|
|
7
|
+
p as default,
|
|
8
|
+
t as sprig
|
|
9
|
+
};
|
package/dist/electron.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=()=>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;exports.registerElectronIPC=function(){if(!n())throw new Error("Only can register IPC within Electron apps.");const{shell:e,ipcMain:r}=require("electron");r.on("sprig-sdk-url-open",(o,{url:t})=>{e.openExternal(t)})},exports.registerElectronPreload=function(){if(!n())throw new Error("Only can preload contextBridge within Electron apps.");const{contextBridge:e,ipcRenderer:r}=require("electron");e.exposeInMainWorld("sprigAPI",{openUrl:o=>r.send("sprig-sdk-url-open",{url:o})})};
|
package/dist/electron.js
CHANGED
|
@@ -1 +1,19 @@
|
|
|
1
|
-
const
|
|
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
|
+
function s() {
|
|
3
|
+
if (!o())
|
|
4
|
+
throw new Error("Only can preload contextBridge within Electron apps.");
|
|
5
|
+
const { contextBridge: e, ipcRenderer: r } = require("electron");
|
|
6
|
+
e.exposeInMainWorld("sprigAPI", { openUrl: (n) => r.send("sprig-sdk-url-open", { url: n }) });
|
|
7
|
+
}
|
|
8
|
+
function i() {
|
|
9
|
+
if (!o())
|
|
10
|
+
throw new Error("Only can register IPC within Electron apps.");
|
|
11
|
+
const { shell: e, ipcMain: r } = require("electron");
|
|
12
|
+
r.on("sprig-sdk-url-open", (n, { url: t }) => {
|
|
13
|
+
e.openExternal(t);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
i as registerElectronIPC,
|
|
18
|
+
s as registerElectronPreload
|
|
19
|
+
};
|
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-D-LZZjJw.cjs");require("./replay.cjs");const r=require("./metricsReporter-CiE5uf1B.cjs");exports.SprigAPI=e.SprigAPI,exports.default=e.core,exports.sprig=e.sprig,exports.DismissReason=r.DismissReason,exports.SprigEvent=r.SprigEvent;
|
package/dist/index.js
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
|
-
import{S as
|
|
1
|
+
import { S as i, c as o, s as p } from "./core-DJ-C8ZCy.js";
|
|
2
|
+
import "./replay.js";
|
|
3
|
+
import { D as t, S as m } from "./metricsReporter-D0VZ2ZgI.js";
|
|
4
|
+
export {
|
|
5
|
+
t as DismissReason,
|
|
6
|
+
i as SprigAPI,
|
|
7
|
+
m as SprigEvent,
|
|
8
|
+
o as default,
|
|
9
|
+
p as sprig
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var Y=Object.defineProperty;var H=(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)=>(H(e,typeof t!="symbol"?t+"":t,r),r);var A=(e=>(e.Closed="close.click",e.Complete="survey.completed",e.FeedbackClosed="feedback.closed",e.PageChange="page.change",e.API="api",e.Override="override",e))(A||{}),U=(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))(U||{});let m;const j=new Uint8Array(16);function B(){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(j)}const a=[];for(let e=0;e<256;++e)a.push((e+256).toString(16).slice(1));const b={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)},w=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 q=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 q(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");this.storage=window[t],this.isStorageAvailable=this.checkIfStorageAvailable()}checkIfStorageAvailable(){try{const t="__storage_test__";return this.storage.setItem(t,t),this.storage.removeItem(t),!0}catch{return!1}}setItem(t,r){this.isStorageAvailable?this.storage.setItem(t,r):this.tempStorage[t]=r}getItem(t){return this.isStorageAvailable?this.storage.getItem(t):this.tempStorage[t]}removeItem(t){this.isStorageAvailable?this.storage.removeItem(t):delete this.tempStorage[t]}clear(){this.isStorageAvailable?this.storage.clear():this.tempStorage={}}}const $=new x("sessionStorage"),J=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:n=!1,...i}=t,d={url:e,options:i,retries:r,shouldDropOnRateLimit:s};if(g&&!n)return R(d);const u={ok:!1,reportError:!1};if(T)return console.info(`UserLeap - ${M}`),u;try{const c=await fetch(e,i);if(c.status===429){if(!g&&!s||n){g=!0;const o=c.headers.has("ratelimit-reset")?Number(c.headers.get("ratelimit-reset")):z;return await S(1e3*o),v(e,{...i,shouldDropOnRateLimit:s,shouldRetryRequest:!0})}return R(d)}if(g=!1,y.length&&(y.map(o=>{const h=o.payload;v(h.url,{...h.options,retries:h.retries,shouldDropOnRateLimit:h.shouldDropOnRateLimit}).then(W=>{o.resolveRequest(W)})}),y=[]),c.ok){if(c.status===249)return N(),u;const o=await c.text();try{return o&&o!=="OK"&&(c.json=JSON.parse(o)),c}catch{return{ok:!1,reportError:!1,error:new Error(`failed parsing response json for ${e} - ${o}`)}}}return c}catch(c){const o=r+1;return o>5||P?{ok:!1,reportError:!1,error:c}:(await S(1e3*Math.pow(2,r)),v(e,{...i,retries:o}))}},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,n=r?I[r]:I.legacy;let i=!1;try{i=n(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 i}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=A,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=U,exports.breadcrumbsLogger=w,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.32.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(n=>({name:n.name,values:n.collect()}));if(s.some(n=>n.values.length))try{await r(JSON.stringify(s))}catch(n){n instanceof Error&&w.error("MetricsErr",{error:{message:n.message,name:n.name}})}})(t)},1e3*e):V=!1},exports.killNetworkRequests=N,exports.localStorageHelper=J,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=$,exports.shouldDirectEmbed=({"userleap-platform":e})=>e!=="web",exports.sprigFetch=v,exports.v4=function(e,t,r){if(b.randomUUID&&!t&&!e)return b.randomUUID();const s=(e=e||{}).random||(e.rng||B)();return s[6]=15&s[6]|64,s[8]=63&s[8]|128,function(n,i=0){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]]}(s)};
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
var T = Object.defineProperty;
|
|
2
|
+
var P = (e, t, s) => t in e ? T(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
|
|
3
|
+
var l = (e, t, s) => (P(e, typeof t != "symbol" ? t + "" : t, s), s);
|
|
4
|
+
var M = ((e) => (e.Closed = "close.click", e.Complete = "survey.completed", e.FeedbackClosed = "feedback.closed", e.PageChange = "page.change", e.API = "api", e.Override = "override", e))(M || {}), N = ((e) => (e.ReplayCapture = "replay.capture", e.FeedbackButtonLoaded = "feedback.button.loaded", e.SDKReady = "sdk.ready", e.SurveyAppeared = "survey.appeared", e.SurveyClosed = "survey.closed", e.SurveyDimensions = "survey.dimensions", e.SurveyFadingOut = "survey.fadingOut", e.SurveyHeight = "survey.height", e.SurveyPresented = "survey.presented", e.SurveyLifeCycle = "survey.lifeCycle", e.SurveyWidth = "survey.width", e.SurveyWillClose = "survey.willClose", e.SurveyWillPresent = "survey.will.present", e.CloseSurveyOnOverlayClick = "close.survey.overlayClick", e.VisitorIDUpdated = "visitor.id.updated", e.QuestionAnswered = "question.answered", e))(N || {});
|
|
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
|
+
let m;
|
|
7
|
+
const V = new Uint8Array(16);
|
|
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");
|
|
11
|
+
return m(V);
|
|
12
|
+
}
|
|
13
|
+
const a = [];
|
|
14
|
+
for (let e = 0; e < 256; ++e)
|
|
15
|
+
a.push((e + 256).toString(16).slice(1));
|
|
16
|
+
const f = { randomUUID: typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto) };
|
|
17
|
+
function Z(e, t, s) {
|
|
18
|
+
if (f.randomUUID && !t && !e)
|
|
19
|
+
return f.randomUUID();
|
|
20
|
+
const r = (e = e || {}).random || (e.rng || W)();
|
|
21
|
+
return r[6] = 15 & r[6] | 64, r[8] = 63 & r[8] | 128, function(n, i = 0) {
|
|
22
|
+
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]];
|
|
23
|
+
}(r);
|
|
24
|
+
}
|
|
25
|
+
const Y = new class {
|
|
26
|
+
constructor() {
|
|
27
|
+
l(this, "breadcrumbs", []);
|
|
28
|
+
}
|
|
29
|
+
getTimeStamp() {
|
|
30
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
31
|
+
}
|
|
32
|
+
addBreadcrumb(e) {
|
|
33
|
+
this.breadcrumbs.push(e), this.breadcrumbs.length > 300 && this.breadcrumbs.shift();
|
|
34
|
+
}
|
|
35
|
+
debug(e, t = "debug") {
|
|
36
|
+
this.addBreadcrumb({ category: t, level: "info", message: e, timestamp: this.getTimeStamp(), type: "debug" });
|
|
37
|
+
}
|
|
38
|
+
error(e, t = {}) {
|
|
39
|
+
this.addBreadcrumb({ category: "error", data: t, level: "error", message: e, timestamp: this.getTimeStamp(), type: "error" });
|
|
40
|
+
}
|
|
41
|
+
http(e, t) {
|
|
42
|
+
this.addBreadcrumb({ category: "xhr", data: t, message: e, timestamp: this.getTimeStamp(), type: "http" });
|
|
43
|
+
}
|
|
44
|
+
info(e, t = {}) {
|
|
45
|
+
this.addBreadcrumb({ category: "info", data: t, level: "info", message: e, timestamp: this.getTimeStamp(), type: "info" });
|
|
46
|
+
}
|
|
47
|
+
navigation(e, t) {
|
|
48
|
+
this.addBreadcrumb({ category: "navigation", data: t, message: e, timestamp: this.getTimeStamp(), type: "navigation" });
|
|
49
|
+
}
|
|
50
|
+
}();
|
|
51
|
+
var j = class extends Error {
|
|
52
|
+
constructor(e, t, s) {
|
|
53
|
+
super(`Possible EventEmitter memory leak detected. ${s} ${t.toString()} listeners added. Use emitter.setMaxListeners() to increase limit`), this.emitter = e, this.type = t, this.count = s, this.name = "MaxListenersExceededWarning";
|
|
54
|
+
}
|
|
55
|
+
}, I = class {
|
|
56
|
+
static listenerCount(e, t) {
|
|
57
|
+
return e.listenerCount(t);
|
|
58
|
+
}
|
|
59
|
+
constructor() {
|
|
60
|
+
this.events = /* @__PURE__ */ new Map(), this.maxListeners = I.defaultMaxListeners, this.hasWarnedAboutPotentialMemoryLeak = !1;
|
|
61
|
+
}
|
|
62
|
+
_emitInternalEvent(e, t, s) {
|
|
63
|
+
this.emit(e, t, s);
|
|
64
|
+
}
|
|
65
|
+
_getListeners(e) {
|
|
66
|
+
return Array.prototype.concat.apply([], this.events.get(e)) || [];
|
|
67
|
+
}
|
|
68
|
+
_removeListener(e, t) {
|
|
69
|
+
const s = e.indexOf(t);
|
|
70
|
+
return s > -1 && e.splice(s, 1), [];
|
|
71
|
+
}
|
|
72
|
+
_wrapOnceListener(e, t) {
|
|
73
|
+
const s = (...r) => (this.removeListener(e, s), t.apply(this, r));
|
|
74
|
+
return Object.defineProperty(s, "name", { value: t.name }), s;
|
|
75
|
+
}
|
|
76
|
+
setMaxListeners(e) {
|
|
77
|
+
return this.maxListeners = e, this;
|
|
78
|
+
}
|
|
79
|
+
getMaxListeners() {
|
|
80
|
+
return this.maxListeners;
|
|
81
|
+
}
|
|
82
|
+
eventNames() {
|
|
83
|
+
return Array.from(this.events.keys());
|
|
84
|
+
}
|
|
85
|
+
emit(e, ...t) {
|
|
86
|
+
const s = this._getListeners(e);
|
|
87
|
+
return s.forEach((r) => {
|
|
88
|
+
r.apply(this, t);
|
|
89
|
+
}), s.length > 0;
|
|
90
|
+
}
|
|
91
|
+
addListener(e, t) {
|
|
92
|
+
this._emitInternalEvent("newListener", e, t);
|
|
93
|
+
const s = this._getListeners(e).concat(t);
|
|
94
|
+
if (this.events.set(e, s), this.maxListeners > 0 && this.listenerCount(e) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) {
|
|
95
|
+
this.hasWarnedAboutPotentialMemoryLeak = !0;
|
|
96
|
+
const r = new j(this, e, this.listenerCount(e));
|
|
97
|
+
console.warn(r);
|
|
98
|
+
}
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
on(e, t) {
|
|
102
|
+
return this.addListener(e, t);
|
|
103
|
+
}
|
|
104
|
+
once(e, t) {
|
|
105
|
+
return this.addListener(e, this._wrapOnceListener(e, t));
|
|
106
|
+
}
|
|
107
|
+
prependListener(e, t) {
|
|
108
|
+
const s = this._getListeners(e);
|
|
109
|
+
if (s.length > 0) {
|
|
110
|
+
const r = [t].concat(s);
|
|
111
|
+
this.events.set(e, r);
|
|
112
|
+
} else
|
|
113
|
+
this.events.set(e, s.concat(t));
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
prependOnceListener(e, t) {
|
|
117
|
+
return this.prependListener(e, this._wrapOnceListener(e, t));
|
|
118
|
+
}
|
|
119
|
+
removeListener(e, t) {
|
|
120
|
+
const s = this._getListeners(e);
|
|
121
|
+
return s.length > 0 && (this._removeListener(s, t), this.events.set(e, s), this._emitInternalEvent("removeListener", e, t)), this;
|
|
122
|
+
}
|
|
123
|
+
off(e, t) {
|
|
124
|
+
return this.removeListener(e, t);
|
|
125
|
+
}
|
|
126
|
+
removeAllListeners(e) {
|
|
127
|
+
return e ? this.events.delete(e) : this.events.clear(), this;
|
|
128
|
+
}
|
|
129
|
+
listeners(e) {
|
|
130
|
+
return Array.from(this._getListeners(e));
|
|
131
|
+
}
|
|
132
|
+
listenerCount(e) {
|
|
133
|
+
return this._getListeners(e).length;
|
|
134
|
+
}
|
|
135
|
+
rawListeners(e) {
|
|
136
|
+
return this.listeners(e);
|
|
137
|
+
}
|
|
138
|
+
}, R = I;
|
|
139
|
+
R.defaultMaxListeners = 10;
|
|
140
|
+
const ee = new R(), L = async (e) => {
|
|
141
|
+
await new Promise((t) => {
|
|
142
|
+
setTimeout(t, e);
|
|
143
|
+
});
|
|
144
|
+
}, te = ({ "userleap-platform": e }) => e !== "web";
|
|
145
|
+
class k {
|
|
146
|
+
constructor(t) {
|
|
147
|
+
l(this, "storage");
|
|
148
|
+
l(this, "tempStorage", {});
|
|
149
|
+
l(this, "isStorageAvailable");
|
|
150
|
+
this.storage = window[t], this.isStorageAvailable = this.checkIfStorageAvailable();
|
|
151
|
+
}
|
|
152
|
+
checkIfStorageAvailable() {
|
|
153
|
+
try {
|
|
154
|
+
const t = "__storage_test__";
|
|
155
|
+
return this.storage.setItem(t, t), this.storage.removeItem(t), !0;
|
|
156
|
+
} catch {
|
|
157
|
+
return !1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
setItem(t, s) {
|
|
161
|
+
this.isStorageAvailable ? this.storage.setItem(t, s) : this.tempStorage[t] = s;
|
|
162
|
+
}
|
|
163
|
+
getItem(t) {
|
|
164
|
+
return this.isStorageAvailable ? this.storage.getItem(t) : this.tempStorage[t];
|
|
165
|
+
}
|
|
166
|
+
removeItem(t) {
|
|
167
|
+
this.isStorageAvailable ? this.storage.removeItem(t) : delete this.tempStorage[t];
|
|
168
|
+
}
|
|
169
|
+
clear() {
|
|
170
|
+
this.isStorageAvailable ? this.storage.clear() : this.tempStorage = {};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const se = new k("sessionStorage"), re = new k("localStorage");
|
|
174
|
+
class B {
|
|
175
|
+
constructor(t) {
|
|
176
|
+
l(this, "payload");
|
|
177
|
+
l(this, "promise");
|
|
178
|
+
l(this, "reject", () => {
|
|
179
|
+
});
|
|
180
|
+
l(this, "resolve", () => {
|
|
181
|
+
});
|
|
182
|
+
this.payload = t, this.promise = new Promise((s, r) => {
|
|
183
|
+
this.reject = r, this.resolve = s;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
resolveRequest(t) {
|
|
187
|
+
this.resolve(t);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const O = { replay: null }, ne = (e) => {
|
|
191
|
+
O.replay = e;
|
|
192
|
+
}, q = () => {
|
|
193
|
+
const e = [];
|
|
194
|
+
return O.replay && e.push("replay"), e.join(",");
|
|
195
|
+
}, F = 10;
|
|
196
|
+
let A = !1, U = "", y = !1, D = !1, v = [];
|
|
197
|
+
const H = (e) => e._config && e._config.installationMethod ? e._config.installationMethod : e._gtm ? "web-gtm" : e._segment ? "web-segment" : "web-snippet", ie = (e) => {
|
|
198
|
+
var t;
|
|
199
|
+
(t = e == null ? void 0 : e.blockedURI) != null && t.includes(window.UserLeap._API_URL) && (D = !0, console.warn(`[Sprig] ${e.blockedURI} is blocked by Content-Security-Policy`));
|
|
200
|
+
}, $ = (e = "") => {
|
|
201
|
+
A = !0, U = e;
|
|
202
|
+
};
|
|
203
|
+
function ae(e = {}) {
|
|
204
|
+
const t = { "Content-Type": "application/json", "userleap-platform": "web", "x-ul-sdk-version": "2.32.2", "x-ul-installation-method": H(e), "sprig-modules": q() };
|
|
205
|
+
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) {
|
|
206
|
+
const s = JSON.parse(e.mobileHeadersJSON);
|
|
207
|
+
Object.assign(t, s);
|
|
208
|
+
}
|
|
209
|
+
return e.locale && (t["accept-language"] = e.locale), window.previewMode && (t["x-ul-preview-mode"] = "1"), t;
|
|
210
|
+
}
|
|
211
|
+
const w = async ({ shouldDropOnRateLimit: e, ...t }) => {
|
|
212
|
+
if (e)
|
|
213
|
+
return { status: 429 };
|
|
214
|
+
{
|
|
215
|
+
const s = new B(t);
|
|
216
|
+
return v.push(s), s.promise;
|
|
217
|
+
}
|
|
218
|
+
}, g = async (e, t) => {
|
|
219
|
+
const { retries: s = 0, shouldDropOnRateLimit: r = !1, shouldRetryRequest: n = !1, ...i } = t, d = { url: e, options: i, retries: s, shouldDropOnRateLimit: r };
|
|
220
|
+
if (y && !n)
|
|
221
|
+
return w(d);
|
|
222
|
+
const u = { ok: !1, reportError: !1 };
|
|
223
|
+
if (A)
|
|
224
|
+
return console.info(`UserLeap - ${U}`), u;
|
|
225
|
+
try {
|
|
226
|
+
const c = await fetch(e, i);
|
|
227
|
+
if (c.status === 429) {
|
|
228
|
+
if (!y && !r || n) {
|
|
229
|
+
y = !0;
|
|
230
|
+
const o = c.headers.has("ratelimit-reset") ? Number(c.headers.get("ratelimit-reset")) : F;
|
|
231
|
+
return await L(1e3 * o), g(e, { ...i, shouldDropOnRateLimit: r, shouldRetryRequest: !0 });
|
|
232
|
+
}
|
|
233
|
+
return w(d);
|
|
234
|
+
}
|
|
235
|
+
if (y = !1, v.length && (v.map((o) => {
|
|
236
|
+
const h = o.payload;
|
|
237
|
+
g(h.url, { ...h.options, retries: h.retries, shouldDropOnRateLimit: h.shouldDropOnRateLimit }).then((x) => {
|
|
238
|
+
o.resolveRequest(x);
|
|
239
|
+
});
|
|
240
|
+
}), v = []), c.ok) {
|
|
241
|
+
if (c.status === 249)
|
|
242
|
+
return $(), u;
|
|
243
|
+
const o = await c.text();
|
|
244
|
+
try {
|
|
245
|
+
return o && o !== "OK" && (c.json = JSON.parse(o)), c;
|
|
246
|
+
} catch {
|
|
247
|
+
return { ok: !1, reportError: !1, error: new Error(`failed parsing response json for ${e} - ${o}`) };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return c;
|
|
251
|
+
} catch (c) {
|
|
252
|
+
const o = s + 1;
|
|
253
|
+
return o > 5 || D ? { ok: !1, reportError: !1, error: c } : (await L(1e3 * Math.pow(2, s)), g(e, { ...i, retries: o }));
|
|
254
|
+
}
|
|
255
|
+
}, b = 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) });
|
|
256
|
+
function J(e, t) {
|
|
257
|
+
const { matchType: s, pattern: r } = e, n = s ? b[s] : b.legacy;
|
|
258
|
+
let i = !1;
|
|
259
|
+
try {
|
|
260
|
+
i = n(r, t);
|
|
261
|
+
} catch (d) {
|
|
262
|
+
const u = `[Sprig] (ERR-445) Failed to check url match with pattern ${r}`;
|
|
263
|
+
d instanceof Error && (console.warn(u, d), d.stack = JSON.stringify(e), window.UserLeap.reportError(u, d));
|
|
264
|
+
}
|
|
265
|
+
return i;
|
|
266
|
+
}
|
|
267
|
+
const oe = (e) => {
|
|
268
|
+
const { pageUrlEvents: t } = window.UserLeap._config, s = t == null ? void 0 : t.find((r) => r.id === e);
|
|
269
|
+
return !!s && J(s, window.location.href);
|
|
270
|
+
};
|
|
271
|
+
let C = !0, S = !1;
|
|
272
|
+
const ce = () => S = !0, K = ["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"];
|
|
273
|
+
let _, p = {};
|
|
274
|
+
class G {
|
|
275
|
+
constructor(t) {
|
|
276
|
+
l(this, "_values", []);
|
|
277
|
+
l(this, "_isWebMetric");
|
|
278
|
+
this.name = t, this._isWebMetric = K.includes(this.name);
|
|
279
|
+
}
|
|
280
|
+
report(t) {
|
|
281
|
+
if (C && this._values.push({ time: Date.now(), value: t }), S || !this._isWebMetric)
|
|
282
|
+
return;
|
|
283
|
+
const s = this.findExceededThreshold(t);
|
|
284
|
+
s && _ && _(t, s);
|
|
285
|
+
}
|
|
286
|
+
collect() {
|
|
287
|
+
const t = this._values;
|
|
288
|
+
return this._values = [], t;
|
|
289
|
+
}
|
|
290
|
+
findExceededThreshold(t) {
|
|
291
|
+
const s = p[this.name];
|
|
292
|
+
if (s)
|
|
293
|
+
return s.find((r) => this.valueExceedsThreshold(t, r));
|
|
294
|
+
}
|
|
295
|
+
valueExceedsThreshold(t, s) {
|
|
296
|
+
return s.type === "max" ? t > s.value : s.type === "min" && t < s.value;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const le = (e, t) => {
|
|
300
|
+
p = {}, S = !1, e == null || e.forEach((s) => {
|
|
301
|
+
var r;
|
|
302
|
+
s.metric in p || (p[s.metric] = []), (r = p[s.metric]) == null || r.push(s);
|
|
303
|
+
}), _ = t;
|
|
304
|
+
}, E = {}, z = (e) => {
|
|
305
|
+
const t = new G(e);
|
|
306
|
+
return E[e] = t, t;
|
|
307
|
+
}, de = (e, t) => {
|
|
308
|
+
let s = E[e];
|
|
309
|
+
return s || (s = z(e)), s.report(t);
|
|
310
|
+
}, ue = ({ reportingIntervalSeconds: e, postMetrics: t }) => {
|
|
311
|
+
e ? setInterval(() => {
|
|
312
|
+
(async (s) => {
|
|
313
|
+
const r = Object.values(E).map((n) => ({ name: n.name, values: n.collect() }));
|
|
314
|
+
if (r.some((n) => n.values.length))
|
|
315
|
+
try {
|
|
316
|
+
await s(JSON.stringify(r));
|
|
317
|
+
} catch (n) {
|
|
318
|
+
n instanceof Error && Y.error("MetricsErr", { error: { message: n.message, name: n.name } });
|
|
319
|
+
}
|
|
320
|
+
})(t);
|
|
321
|
+
}, 1e3 * e) : C = !1;
|
|
322
|
+
};
|
|
323
|
+
export {
|
|
324
|
+
M as D,
|
|
325
|
+
X as E,
|
|
326
|
+
E as P,
|
|
327
|
+
N as S,
|
|
328
|
+
se as a,
|
|
329
|
+
Y as b,
|
|
330
|
+
oe as c,
|
|
331
|
+
de as d,
|
|
332
|
+
ee as e,
|
|
333
|
+
ne as f,
|
|
334
|
+
ae as g,
|
|
335
|
+
te as h,
|
|
336
|
+
le as i,
|
|
337
|
+
ue as j,
|
|
338
|
+
ce as k,
|
|
339
|
+
re as l,
|
|
340
|
+
O as m,
|
|
341
|
+
ie as n,
|
|
342
|
+
$ as o,
|
|
343
|
+
J as p,
|
|
344
|
+
L as q,
|
|
345
|
+
z as r,
|
|
346
|
+
g as s,
|
|
347
|
+
Z as v
|
|
348
|
+
};
|
package/dist/replay.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Se=Object.defineProperty;var Ee=(e,t,n)=>t in e?Se(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var T=(e,t,n)=>(Ee(e,typeof t!="symbol"?t+"":t,n),n);const i=require("./metricsReporter-ikJ_RTTQ.cjs");var v=(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))(v||{});class ve{constructor(t){T(this,"awaitingResolvers",[]);T(this,"activeCount",0);this.capacity=t}async acquire(){if(this.activeCount<this.capacity){this.activeCount++;return}return new Promise(t=>{this.awaitingResolvers.push(t)})}release(){const t=this.awaitingResolvers.shift();t&&this.activeCount<=this.capacity?t():this.activeCount--}async execute(t){try{return await this.acquire(),await t()}finally{this.release()}}setLimit(t){this.capacity=t}}const te=new ve(2),Re=e=>te.setLimit(e),ke=async e=>te.execute(async()=>{var r;i.breadcrumbsLogger.info("UploadChunkStart",{chunkIndex:e.chunkIndex,surveyId:e.surveyId});const t=await i.sprigFetch(e.uploadUrl,{body:e.data,method:"PUT"});i.breadcrumbsLogger.http("UploadChunkEnd",{url:e.uploadUrl,method:"PUT",status_code:t.status,reason:t.statusText??"OK",chunkIndex:e.chunkIndex,surveyId:e.surveyId});const n=(r=t.headers)==null?void 0:r.get("ETag");if(!n)throw new Error(`Upload response did not include etag for upload ${e.uploadId}, part ${e.chunkIndex}`);return n}),ne=async({apiUrl:e,surveyId:t,uploadId:n,etags:r,headers:s,responseGroupUuid:a,replayDuration:o,eventDigest:c},d=!1)=>{var m;if(!d&&!n&&!r){i.breadcrumbsLogger.error("UploadErr",{isMobile:d,uploadId:n,etags:r});return}i.breadcrumbsLogger.info("MarkUploadComplete",{surveyId:t});const u=await i.sprigFetch(`${e}/sdk/1/completeSessionReplay`,{method:"POST",body:JSON.stringify({etags:r,uploadId:n,responseGroupUuid:a,surveyId:t,replayDuration:o,eventDigest:c,userAgent:(m=window==null?void 0:window.navigator)==null?void 0:m.userAgent}),headers:s,shouldRetryRequest:!0});return i.breadcrumbsLogger.info("MarkUploadDone",{surveyId:t}),u},L=(e,t)=>t.some(n=>e instanceof n);let G,z;function Pe(){return G||(G=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Be(){return z||(z=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const _=new WeakMap,A=new WeakMap,B=new WeakMap;function xe(e){const t=new Promise((n,r)=>{const s=()=>{n(D(e.result))},a=()=>{r(e.error)};e.onsuccess=s,e.onerror=a});return B.set(t,e),t}function Te(e){if(_.has(e))return;const t=new Promise((n,r)=>{const s=()=>{n()},a=()=>{r(e.error||new DOMException("AbortError","AbortError"))};e.oncomplete=s,e.onerror=a,e.onabort=a});_.set(e,t)}let N={get(e,t,n){if(e instanceof IDBTransaction){if(t==="done")return _.get(e);if(t==="store")return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return D(e[t])},set(e,t,n){return e[t]=n,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function re(e){N=e(N)}function Ae(e){return Be().includes(e)?function(...t){return e.apply(M(this),t),D(this.request)}:function(...t){return D(e.apply(M(this),t))}}function Ue(e){return typeof e=="function"?Ae(e):(e instanceof IDBTransaction&&Te(e),L(e,Pe())?new Proxy(e,N):e)}function D(e){if(e instanceof IDBRequest)return xe(e);if(A.has(e))return A.get(e);const t=Ue(e);return t!==e&&(A.set(e,t),B.set(t,e)),t}const M=e=>B.get(e);function Le(e,t,{blocked:n,upgrade:r,blocking:s,terminated:a}={}){const o=indexedDB.open(e,t),c=D(o);return r&&(o.onupgradeneeded=d=>{r(D(o.result),d.oldVersion,d.newVersion,D(o.transaction),d)}),n&&(o.onblocked=d=>n(d.oldVersion,d.newVersion,d)),c.then(d=>{a&&(d.onclose=()=>a()),s&&(d.onversionchange=u=>s(u.oldVersion,u.newVersion,u))}).catch(()=>{}),c}function j(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&(n.onblocked=r=>t(r.oldVersion,r)),D(n).then(()=>{})}const _e=["get","getKey","getAll","getAllKeys","count"],Ne=["put","add","delete","clear"],U=new Map;function q(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(U.get(t))return U.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,s=Ne.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!(s||_e.includes(n)))return;const a=async function(o,...c){const d=this.transaction(o,s?"readwrite":"readonly");let u=d.store;return r&&(u=u.index(c.shift())),(await Promise.all([u[n](...c),s&&d.done]))[0]};return U.set(t,a),a}re(e=>({...e,get:(t,n,r)=>q(t,n)||e.get(t,n,r),has:(t,n)=>!!q(t,n)||e.has(t,n)}));const Me=["continue","continuePrimaryKey","advance"],J={},O=new WeakMap,se=new WeakMap,Oe={get(e,t){if(!Me.includes(t))return e[t];let n=J[t];return n||(n=J[t]=function(...r){O.set(this,se.get(this)[t](...r))}),n}};async function*He(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;const n=new Proxy(t,Oe);for(se.set(n,t),B.set(n,M(t));t;)yield n,t=await(O.get(n)||t.continue()),O.delete(n)}function X(e,t){return t===Symbol.asyncIterator&&L(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&L(e,[IDBIndex,IDBObjectStore])}re(e=>({...e,get(t,n,r){return X(t,n)?He:e.get(t,n,r)},has(t,n){return X(t,n)||e.has(t,n)}}));const Fe=e=>{if(e instanceof Attr)return null;let t=1;for(let n=e.previousSibling;n;n=n.previousSibling)n.nodeName===e.nodeName&&++t;return t},ae=e=>{if(e===null)return"";const t=[];if(e instanceof Document)return"/";for(let n=e;n&&!(n instanceof Document)&&n!==null;n=n instanceof Attr?n.ownerElement:n.parentElement){const r=t[t.length]={name:void 0,position:null};switch(n.nodeType){case Node.TEXT_NODE:r.name="text()";break;case Node.ATTRIBUTE_NODE:r.name="@"+n.nodeName;break;case Node.PROCESSING_INSTRUCTION_NODE:r.name="processing-instruction()";break;case Node.COMMENT_NODE:r.name="comment()";break;case Node.ELEMENT_NODE:r.name=n.nodeName;break}r.position=Fe(n)}return"/"+t.reverse().map(n=>n.position!==null?`/${n.name}[${n.position}]`:`/${n.name}`).join("")},I={capture:!0,passive:!0},Ve=["a","button","input","option","li","link"],Ke=["Escape","Enter","Backspace","F5","Tab"];let k=!1;const je=["label","type","role","title","placeholder","errormessage","valuetext","href"],Y="aria-",We=e=>{if(!e.tagName)return"No tagName";const t=e.getAttribute("type");return t?`${t} ${e.tagName.toLowerCase()}`:e.tagName.toLowerCase()},Q=e=>{var r;if(((r=e.tagName)==null?void 0:r.toLowerCase())==="html")return{element:"html"};const t=e.textContent,n=t?{text:t}:{};n.element=We(e);for(const s of e.attributes){let a=s.name;const o=s.value;a.startsWith(Y)&&(a=a.substring(Y.length)),je.includes(a)&&(n[a]=o)}return n},$e=e=>{var s;if(!e)return{};const n={...Q(e)},r=e.parentElement;if(r&&Ve.includes((s=r.tagName)==null?void 0:s.toLowerCase())){const a=Q(r);Object.assign(n,a)}return n},oe=(e,t)=>{var n;ot({x:t.x,y:t.y,type:e,elementAttributes:$e(t.target),windowHeight:window.innerHeight,windowWidth:window.innerWidth,...t.target instanceof HTMLElement?{rect:(n=t.target)==null?void 0:n.getBoundingClientRect(),xPath:ae(t.target)}:{}})},Ge=e=>t=>oe(e,t),ie=e=>{Ke.includes(e.key)&&pt({key:e.key})},ze=()=>{window.performance.getEntriesByType("navigation").map(t=>t.type).includes("reload")&&ut({url:window.location.href,currentPageTitle:document.title})},qe=()=>{window.performance.getEntriesByType("navigation").map(t=>t.type).includes("back_forward")&<({curUrl:window.location.href,fromUrl:document.referrer,currentPageTitle:document.title})},Je=(e,t)=>{let n;return r=>{clearTimeout(n),n=window.setTimeout(()=>e(r),t)}},Xe=e=>{if(!(e.target instanceof HTMLElement||e.target instanceof Document))return;let t=e.target;"scrollTop"in t||(t=t.documentElement),gt({xPath:ae(t),x:t.scrollLeft,y:t.scrollTop,elementAttributes:{targetScrollWidth:t.scrollWidth,targetClientWidth:t.clientWidth,targetScrollHeight:t.scrollHeight,targetClientHeight:t.clientHeight}})},ce=Je(Xe,750),de=Ge("left_click"),ue=e=>{e.button===2&&oe("right_click",e)},Ye=()=>{k||(window.addEventListener("click",de,I),window.addEventListener("mousedown",ue,I),window.addEventListener("keydown",ie,I),window.addEventListener("scroll",ce,I),k=!0,ze(),qe())},Qe=()=>{k&&(window.removeEventListener("click",de,I),window.removeEventListener("mousedown",ue,I),window.removeEventListener("keydown",ie,I),window.removeEventListener("scroll",ce,I),k=!1)},Ze=3e4,p={isRecording:!1,scrollEventUuids:{},stopRecording:()=>{}},et=.5,tt=async()=>{var e;if(!window.indexedDB||!window.IDBKeyRange||!window.CompressionStream)return!0;if((e=window.navigator.storage)!=null&&e.estimate)try{const{quota:t=0,usage:n=0}=await window.navigator.storage.estimate(),r=(t-n)/1024**3;return i.breadcrumbsLogger.info("Storage",{availableGb:r}),r<et}catch{return!0}return!1},nt=()=>{const e=i.sessionStorageHelper.getItem("sprig.sessionId");if(e)return i.breadcrumbsLogger.info("SessionIDFound",{savedSessionId:e}),i.sessionStorageHelper.removeItem("sprig.sessionId"),e;const t=i.v4();return i.breadcrumbsLogger.info("GeneratedSessionID",{uuid:t}),t},f=nt(),R=()=>{i.sessionStorageHelper.setItem("sprig.disableReplayRecording","disabled")},y=()=>!!i.sessionStorageHelper.getItem("sprig.disableReplayRecording");window.addEventListener("beforeunload",()=>{i.breadcrumbsLogger.info("BeforeUnload",{sessionId:f}),i.sessionStorageHelper.setItem("sprig.sessionId",f)});const rt=()=>y()?i.breadcrumbsLogger.debug("ReplayDisabled-PendingHeatmaps"):w(async()=>{const e=(await l.getPendingCaptures({isHeatmap:!0})).map(n=>({eventId:n.captureParams.eventId,uuid:n.uuid})),t=[];e.forEach(({eventId:n,uuid:r})=>{i.checkUrlStillMatching(n)||t.push(r)}),t.length&&await l.markPendingHeatmapsReady(t)},"Error marking pending heatmaps ready"),st=e=>{Date.now()-e>=Ze&&w(()=>l.markPendingHeatmapsReady(),"Error in heatmap inactivity")},W=e=>e&&e.trim().substring(0,500).replace(/\s\s+/g," ").replace(/\r?\n|\r/g," ").substring(0,250),h=(e,t)=>{var n,r;if(!(y()||!p.isRecording))try{(r=(n=window.rrwebRecord)==null?void 0:n.addCustomEvent)==null||r.call(n,e,t)}catch(s){x("Error recording custom event",s)}},at=e=>{e.description&&(e.description=W(e.description)),h("Sprig_PageView",e)},ot=e=>{var t;(t=e==null?void 0:e.elementAttributes)!=null&&t.text&&(e.elementAttributes.text=W(e.elementAttributes.text)),h("Sprig_Click",e)},it=e=>{h("Sprig_TrackEvent",e)},ct=e=>{h("Sprig_ShowSurvey",e)},dt=e=>{h("Sprig_SubmitSurvey",e)},ut=e=>{h("Sprig_Refresh",e)},lt=e=>{e.currentPageTitle&&(e.currentPageTitle=W(e.currentPageTitle)),h("Sprig_BackForward",e)},pt=e=>{h("Sprig_Keystroke",e)},gt=async e=>{const{x:t,xPath:n,y:r}=e,s=p.scrollEventUuids[n];if(s)return w(async()=>{var c,d,u,m;const a=await l.openDB(),o=await a.get("events",s);if(o!=null&&o.event){const g=JSON.parse(o.event),S=t>((d=(c=g.data)==null?void 0:c.payload)==null?void 0:d.x),b=r>((m=(u=g.data)==null?void 0:u.payload)==null?void 0:m.y);if(!(S||b))return null;S&&(g.data.payload.x=t),b&&(g.data.payload.y=r),g.data.payload.elementAttributes=e.elementAttributes,o.event=JSON.stringify(g),await a.put("events",o)}else h("Sprig_Scroll",e)},"Error updating scroll event");h("Sprig_Scroll",e)},mt=()=>p.isRecording,le=()=>{p.stopRecording&&(p.stopRecording(),p.stopRecording=void 0),p.isRecording=!1,["cleanupInterval","inactivityInterval","pendingCheckInterval"].forEach(e=>{p[e]&&(clearInterval(p[e]),p[e]=void 0)}),Qe()},ft=["did not allow mutations","called in an invalid security context"],wt=e=>{if(!e)return!0;for(const t of ft)if(e.toLowerCase().includes(t))return!1;return!0},yt=(e,t,{reportError:n=!0,extraInfo:r={}})=>{if(!y()&&t instanceof Error){if(R(),t.name==="VersionError")return i.breadcrumbsLogger.error("VersionErr",{message:e}),l.deleteDB();wt(t==null?void 0:t.message)&&(n&&window.UserLeap.reportError(e,t,r),l.clearAll())}},x=(e,t,{reportError:n}={reportError:!0})=>{le(),i.breadcrumbsLogger.error("ReplayErr",{code:t.code,name:t.name}),yt(e,t,{reportError:n})},w=async(e,t)=>{try{await e()}catch(n){x(t,n)}},ht=()=>{p.isRecording&&w(()=>{var e,t;return(t=(e=window.rrwebRecord)==null?void 0:e.takeFullSnapshot)==null?void 0:t.call(e,!0)},"Error recording full snapshot")},bt=async({surveyId:e,responseGroupUuid:t,eventDigest:n,headers:r})=>{if(!e||!t)return!1;const s=window.UserLeap._API_URL,a=await ne({surveyId:e,responseGroupUuid:t,eventDigest:n,apiUrl:s,headers:r},!0);return!(a!=null&&a.error)},Z=30,It=1;j("replayStorage").catch(console.error);j("sprig.replay").catch(console.error);class Dt{openDB(){return Le("sprigReplay",It,{upgrade:(t,n,r)=>{if(r===0&&i.sessionStorageHelper.setItem("sprig.pendingCount","0"),!t.objectStoreNames.contains("events")){const s=t.createObjectStore("events",{keyPath:"uuid"});s.createIndex("sessionId","sessionId"),s.createIndex("timestamp","timestamp"),s.createIndex("[sessionId+timestamp]",["sessionId","timestamp"])}if(!t.objectStoreNames.contains("chunkUploads")){const s=t.createObjectStore("chunkUploads",{keyPath:"uuid"});s.createIndex("sessionId","sessionId"),s.createIndex("timestamp","timestamp"),s.createIndex("[sessionId+status]",["sessionId","status"]),s.createIndex("[uploadId+status]",["uploadId","status"]),s.createIndex("[sessionId+status+uploadId]",["sessionId","status","uploadId"])}if(!t.objectStoreNames.contains("pendingCaptures")){const s=t.createObjectStore("pendingCaptures",{keyPath:"uuid"});s.createIndex("sessionId","sessionId"),s.createIndex("timestamp","timestamp"),s.createIndex("[sessionId+targetTimestamp]",["sessionId","targetTimestamp"])}}})}deleteDB(){return j("sprigReplay").catch(console.error)}async bulkAdd(t,n){const r=(await this.openDB()).transaction(t,"readwrite");return Promise.all([...n.map(s=>r.store.add(s)),r.done])}async clearAll(){const t=(await this.openDB()).transaction(["events","chunkUploads","pendingCaptures"],"readwrite");return Promise.all([t.objectStore("events").clear(),t.objectStore("chunkUploads").clear(),t.objectStore("pendingCaptures").clear()])}async deleteBySessionId(t,n){const r=IDBKeyRange.only(n),s=(await this.openDB()).transaction(t,"readwrite"),a=s.store.index("sessionId");for await(const o of a.iterate(r))await o.delete();await s.done}async updatePartial(t,n,r){const a=(await this.openDB()).transaction(t,"readwrite"),o=await a.store.get(n);o&&await a.store.put({...o,...r}),await a.done}async deleteRowsBefore(t,n,r=()=>!0){const s=IDBKeyRange.upperBound(n,!0),a=(await this.openDB()).transaction(t,"readwrite"),o=a.store.index("timestamp");for await(const c of o.iterate(s))r(c.value)&&await c.delete();await a.done}async getEventsBetween(t,n=Date.now()){if(t>=n)return Promise.resolve([]);const r=IDBKeyRange.bound([f,t],[f,n],!1,!0);return(await this.openDB()).getAllFromIndex("events","[sessionId+timestamp]",r)}async updateEventsExpiredAt(t,n,r=Z){const s=new Date,a=s.setMinutes(s.getMinutes()+(r??Z)),o=(await this.openDB()).transaction("events","readwrite"),c=o.store.index("[sessionId+timestamp]"),d=IDBKeyRange.bound([f,t],[f,n],!1,!0);for await(const u of c.iterate(d))await u.update({...u.value,expiredAt:a});await o.done}async deleteChunkUploads(t,n){const r=IDBKeyRange.only([n,t]),s=(await this.openDB()).transaction("chunkUploads","readwrite");let o=await s.store.index("[uploadId+status]").openCursor(r);for(;o;)o.delete(),o=await o.continue();await s.done}async getChunkUploadsByStatus({sessionId:t,status:n,uploadId:r}){const a=(await this.openDB()).transaction("chunkUploads","readonly"),o=r?a.store.index("[uploadId+status]"):a.store.index("[sessionId+status]"),c=r?IDBKeyRange.only([r,n]):IDBKeyRange.only([t,n]);return o.getAll(c)}async getPendingCaptures(t={}){return(await(await this.openDB()).getAllFromIndex("pendingCaptures","sessionId",f)).filter(s=>!t.beforePresent||s.targetTimestamp<Date.now()).filter(s=>!t.isHeatmap||(s.captureParams.isHeatmap??!1))}async markPendingCaptureToCanUpload(t){const n=(await this.openDB()).transaction("pendingCaptures","readwrite"),r=n.store.index("sessionId");for await(const s of r.iterate(f)){const a=s.value;a.captureParams.responseGroupId===t&&await s.update({...a,canUpload:!0})}await n.done}async markPendingHeatmapsReady(t){if(parseInt(i.sessionStorageHelper.getItem("sprig.pendingCount")??"0")===0)return null;const r=Date.now(),s=(await this.openDB()).transaction("pendingCaptures","readwrite"),a=s.store.index("sessionId");for await(const o of a.iterate(f)){const c=o.value;c.captureParams.isHeatmap&&(!t||t.includes(c.uuid))&&await o.update({...c,targetTimestamp:r,captureParams:{...c.captureParams,triggerTimestamp:r,replayParams:{...c.captureParams.replayParams,replayDurationSeconds:Math.floor((r-c.timestamp)/1e3)}}})}await s.done}}const l=new Dt,pe=async(e,t)=>{const n=performance.now();let r;try{r=await e()}finally{const s=performance.now()-n;let a=i.PerformanceMetrics[t];a||(a=i.registerMetric(t)),a.report(s/1e3)}return r},ge=(e,t)=>{const n=performance.now();try{e()}finally{const r=performance.now()-n;let s=i.PerformanceMetrics[t];s||(s=i.registerMetric(t)),s.report(r/1e3)}};var Ct={VITE_NPM_BUNDLE:"",BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1};let me=5e3,H=6e4,F=0;const St=5,fe=30,P=fe+St;let C,V=!1,K=[];const Et=async({maxReplayDurationSeconds:e,maxInflightRequests:t=2,replaySettings:n,teardownAfter:r=!1})=>{if(C=i.sessionStorageHelper.getItem("sprig.pendingCount"),!p.isRecording){if(r&&i.sessionStorageHelper.setItem("sprig.teardownAfterCapture","true"),y())return i.breadcrumbsLogger.debug("ReplayDisabled");if(await tt())return i.breadcrumbsLogger.debug("IDBNotSupported"),R();try{const s=await l.openDB();i.breadcrumbsLogger.info("DBVersion",{version:s.version})}catch(s){return i.breadcrumbsLogger.error("ReplayOpenErr",{name:s.name}),s.name==="VersionError"&&l.deleteDB(),R()}if(!e)return i.breadcrumbsLogger.debug("MissingDuration");i.breadcrumbsLogger.debug("ReplayInit"),await w(async()=>{if(n!=null&&n.minDuration&&(me=n.minDuration),n!=null&&n.batchDuration&&(H=n.batchDuration),Re(t),At(),Pt(e+P,30*60,e+P),Bt(),!window.rrwebRecord)try{const{record:c}=await import(window.UserLeap.replayLibraryURL??`${Ct.VITE_CDN}/dependencies/record-2.0.0-alpha.17.min.js`);window.rrwebRecord=c}catch{return R(),i.breadcrumbsLogger.error("LoadRecordFailed")}const s=window.rrwebRecord;if(!s)return i.breadcrumbsLogger.error("RecordScriptFailed");let a=!0,o=0;p.stopRecording=s({checkoutEveryNms:fe*1e3,sampling:{input:"last",scroll:250,media:800},emit:(c,d)=>{if(c.type===v.Custom&&(F=Date.now()),y())return;if(d&&c.type===v.Meta)o=performance.now();else if(d&&o&&c.type===v.FullSnapshot){const m=performance.now()-o;i.reportAndRegister("sdk_replay_snapshot_seconds",m/1e3)}const u=a||!!d&&c.type===v.Meta;a=!1,vt({uuid:i.v4(),event:JSON.stringify(c),isValidStart:u,timestamp:Date.now()})},...n}),p.isRecording=!!p.stopRecording,p.isRecording&&(i.eventEmitter.on("survey.complete",c=>{dt({id:c,userAgent:window.navigator.userAgent})}),Ye())},"Error initializing replay")}},vt=e=>{var t,n,r,s;if((t=e.event)!=null&&t.includes("Sprig_Scroll")){const a=(s=(r=(n=JSON.parse(e.event))==null?void 0:n.data)==null?void 0:r.payload)==null?void 0:s.xPath;if(!a)return;p.scrollEventUuids[a]=e.uuid}K.push(e),V||kt()},Rt=async e=>{const t=e.map(n=>({...n,sessionId:n.sessionId??f}));if(t.length!==0)return w(()=>l.bulkAdd("events",t),"Error storing replay events")},kt=()=>{V=!0,setTimeout(async()=>{if(y())return;const e=K;K=[],V=!1,ge(async()=>{await Rt(e)},"sdk_replay_add_event_batch_seconds")},500)},Pt=(e,t,n)=>{p.cleanupInterval=window.setInterval(()=>{const r=Date.now();pe(()=>w(async()=>{y()||await Promise.all([l.deleteRowsBefore("events",r-e*1e3,s=>s.expiredAt===void 0||s.expiredAt<r-e*1e3),l.deleteRowsBefore("chunkUploads",r-t*1e3),l.deleteRowsBefore("pendingCaptures",r-n*1e3,s=>!s.canUpload)])},"Error deleting table rows"),"sdk_replay_cleanup_seconds"),i.breadcrumbsLogger.debug("CleanupComplete")},3e4)},Bt=()=>{p.pendingCheckInterval=window.setInterval(async()=>{w(async()=>{const e=parseInt(C??"0");if(e===0)return;const t=await l.getPendingCaptures({beforePresent:!0}),n=await l.openDB();await Promise.all(t.map(async r=>(await n.delete("pendingCaptures",r.uuid),he(r.captureParams,r.canUpload)))),C=(e-t.length).toString(),i.sessionStorageHelper.setItem("sprig.pendingCount",C)},"Error initiating pending captures")},5e3)},xt=async(e,t,n,r,s)=>{const a=Math.min(e+s,n),o=await pe(()=>l.getEventsBetween(e,a),"sdk_replay_get_events_between_seconds");if(!(o!=null&&o.length))return i.breadcrumbsLogger.debug("NoEventsFound"),{validStartFound:r,events:[]};if(!r){i.breadcrumbsLogger.debug("ValidStartSearch");let c=-1;return o==null||o.forEach((d,u)=>{if(!d.isValidStart)return;const m=d.timestamp<=t;(c<0||m)&&(c=u)}),c<0?(i.breadcrumbsLogger.debug("ValidStartNotFound"),{validStartFound:r,events:[]}):{validStartFound:!0,events:o==null?void 0:o.slice(c)}}return{validStartFound:r,events:o}},Tt=(e,t,n)=>{const r=e.length,s=t*1024*1024,a=Math.ceil(r/n),o=Math.max(s,a),c=[];let d=0;for(;d<r;)c.push(e.slice(d,d+o)),d+=o;return c},we=e=>Promise.all(e.map(async t=>{const n=await ke(t);return await l.updatePartial("chunkUploads",t.uuid,{data:null,etag:n,status:"UploadComplete"}),t.uploadId})),ye=async e=>{const t=await l.getChunkUploadsByStatus({status:"UploadComplete",uploadId:e});if(!(t!=null&&t.length)){i.breadcrumbsLogger.info("NoChunksForUpload",{uploadId:e});return}const n=t.reduce((a,o)=>(a.find(c=>c.chunkIndex===o.chunkIndex)||a.push(o),a),[]);n.sort((a,o)=>a.chunkIndex-o.chunkIndex);const r=n.map(a=>({ETag:a.etag,PartNumber:a.chunkIndex})).filter(a=>a.ETag!==null),s=n[0];await ne({apiUrl:s.apiUrl,surveyId:s.surveyId,uploadId:e,responseGroupUuid:s.responseGroupId,etags:r,headers:s.completeUploadHeaders,replayDuration:s.replayDuration}),await l.deleteChunkUploads("UploadComplete",e)},At=()=>{w(async()=>{const e=await l.getChunkUploadsByStatus({sessionId:f,status:"ReadyForUpload"});if(!(e!=null&&e.length))return;const t=await we(e);t!=null&&t.length&&await Promise.all(t.map(n=>{if(n)return ye(n)}))},"Error uploading unfinished chunks")},Ut=async(e,t)=>{await we(t),await Promise.all(e.map(n=>ye(n)))},Lt=async(e,t)=>{const n=new TextEncoder;let r=null;const s=new CompressionStream("gzip"),a=s.writable.getWriter();let o=!1,c=!1,[d,u]=[0,0];const m=e-P*1e3;let g=[];for(let b=m;b<t;b+=H){if({validStartFound:c,events:g}=await xt(b,e,t,c,H),!(g!=null&&g.length)){i.breadcrumbsLogger.debug("NoEventsFound");continue}d===0&&(d=g[0].timestamp),u=g[g.length-1].timestamp;const E=g.map(Ce=>Ce.event);E.push(`{"timestamp":${t}}`);const $=`${o?",":"["}${E}`,De=n.encode($);ge(()=>{a.write(De)},"sdk_replay_compression_seconds"),o=!0}if(u-d<me)return i.breadcrumbsLogger.debug("ReplayTooShort"),null;const S=n.encode("]");return a.write(S),a.close(),r=new Uint8Array(await new Response(s.readable).arrayBuffer()),r},_t=async(e,t)=>{const n=t??Date.now(),r=n-e;return Lt(r,n)},ee=async e=>{const{surveyId:t,responseGroupId:n,visitorId:r,apiUrl:s,completeUploadHeaders:a,replayParams:o,triggerTimestamp:c}=e,d=await _t(o.replayDurationSeconds*1e3,c);if(!(d!=null&&d.length)){i.breadcrumbsLogger.info("FileDataEmpty",{surveyId:t});return}const u=Tt(d,o.minimumChunkSizeMb,o.signedUrls.length),m=await Promise.all(u.map(async(g,S)=>{const b=i.v4(),E={apiUrl:s,chunkIndex:S+1,completeUploadHeaders:a,etag:null,responseGroupId:n,status:"ReadyForUpload",surveyId:t,timestamp:c,totalChunks:u.length,data:g,uploadId:o.uploadId,uploadUrl:o.signedUrls[S].url,uuid:b,visitorId:r};return await(await l.openDB()).add("chunkUploads",{...E,sessionId:E.sessionId??f}),E}));await Ut([o.uploadId],m)},he=async(e,t)=>{if(y())return i.breadcrumbsLogger.debug("ReplayDisabled-ScheduleOrCapture");const{isHeatmap:n,isStandalone:r,replayParams:s,triggerTimestamp:a,responseGroupId:o}=e,c=async()=>{setTimeout(()=>i.eventEmitter.removeListener(i.SprigEvent.QuestionAnswered,c),0),w(async()=>{s.replayDurationType==="before"?await ee(e):await l.markPendingCaptureToCanUpload(o)},"Error in schedule/capture callback")};w(async()=>{if(s.replayDurationType==="after"||s.replayDurationType==="beforeAndAfter"){!r&&!n&&i.eventEmitter.on(i.SprigEvent.QuestionAnswered,c),await Ie(e);return}if(r||n||t)await ee(e),n&&Nt();else{const u=P+s.replayDurationSeconds,m=a-u*1e3,g=a;await l.updateEventsExpiredAt(m,g,s.expirationTimeLimitMinutes),i.eventEmitter.on(i.SprigEvent.QuestionAnswered,c)}},"Error in scheduling/capturing replay")},Nt=async()=>{parseInt(C??"0")||i.sessionStorageHelper.removeItem("sprig.isCapturingHeatmap"),i.sessionStorageHelper.getItem("sprig.teardownAfterCapture")&&(le(),be(),i.sessionStorageHelper.removeItem("sprig.teardownAfterCapture"))},be=async()=>y()?i.breadcrumbsLogger.debug("ReplayDisabled-ClearData"):Promise.all([l.deleteBySessionId("events",f),l.deleteBySessionId("pendingCaptures",f)]).catch(e=>{x("Error clearing user replay data",e)}),Ie=async e=>{if(y())return;const{isHeatmap:t,surveyId:n}=e,r=await l.getPendingCaptures(),s=r==null?void 0:r.filter(d=>d.captureParams.surveyId===n);if(s!=null&&s.length){i.breadcrumbsLogger.info("PendingCaptureExists",{surveyId:n});return}t&&(ht(),i.sessionStorageHelper.setItem("sprig.isCapturingHeatmap","true"),F=Date.now(),p.inactivityInterval||(p.inactivityInterval=window.setInterval(()=>{st(F)},1e3)));const a={...e,replayParams:{...e.replayParams}};e.replayParams.replayDurationType==="beforeAndAfter"&&(a.replayParams.replayDurationSeconds*=2),a.replayParams.replayDurationType="before";const o=e.triggerTimestamp+e.replayParams.replayDurationSeconds*1e3;a.triggerTimestamp=o,C=(parseInt(C??"0")+1).toString(),i.sessionStorageHelper.setItem("sprig.pendingCount",C),await(await l.openDB()).add("pendingCaptures",{canUpload:!1,captureParams:a,sessionId:f,targetTimestamp:o,timestamp:Date.now(),uuid:i.v4()})},Mt=Object.freeze(Object.defineProperty({__proto__:null,RecordEvent:it,RecordPageView:at,RecordSurveyShown:ct,_completeSessionReplay:bt,checkPendingHeatmapsUrl:rt,clearUserReplayData:be,disableRecording:x,initializeReplay:Et,isReplayRecording:mt,scheduleCapture:Ie,scheduleOrCaptureReplay:he,tryReplayAction:w},Symbol.toStringTag,{value:"Module"}));i.registerReplay(Mt);
|
|
1
|
+
"use strict";var Se=Object.defineProperty;var De=(e,t,r)=>t in e?Se(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var _=(e,t,r)=>(De(e,typeof t!="symbol"?t+"":t,r),r);const o=require("./metricsReporter-CiE5uf1B.cjs");var R=(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))(R||{});const ne=new class{constructor(e){_(this,"awaitingResolvers",[]);_(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),ae=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},H=(e,t)=>t.some(r=>e instanceof r);let J,Q;const M=new WeakMap,A=new WeakMap,U=new WeakMap;let O={get(e,t,r){if(e instanceof IDBTransaction){if(t==="done")return M.get(e);if(t==="store")return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return D(e[t])},set:(e,t,r)=>(e[t]=r,!0),has:(e,t)=>e instanceof IDBTransaction&&(t==="done"||t==="store")||t in e};function se(e){O=e(O)}function Ee(e){return(Q||(Q=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(F(this),t),D(this.request)}:function(...t){return D(e.apply(F(this),t))}}function ke(e){return typeof e=="function"?Ee(e):(e instanceof IDBTransaction&&function(t){if(M.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});M.set(t,r)}(e),H(e,J||(J=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,O):e)}function D(e){if(e instanceof IDBRequest)return function(r){const n=new Promise((a,s)=>{r.onsuccess=()=>{a(D(r.result))},r.onerror=()=>{s(r.error)}});return U.set(n,r),n}(e);if(A.has(e))return A.get(e);const t=ke(e);return t!==e&&(A.set(e,t),U.set(t,e)),t}const F=e=>U.get(e);function j(e,{blocked:t}={}){const r=indexedDB.deleteDatabase(e);return t&&(r.onblocked=n=>t(n.oldVersion,n)),D(r).then(()=>{})}const Ce=["get","getKey","getAll","getAllKeys","count"],Re=["put","add","delete","clear"],N=new Map;function X(e,t){if(!(e instanceof IDBDatabase)||t in e||typeof t!="string")return;if(N.get(t))return N.get(t);const r=t.replace(/FromIndex$/,""),n=t!==r,a=Re.includes(r);if(!(r in(n?IDBIndex:IDBObjectStore).prototype)||!a&&!Ce.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 N.set(t,s),s}se(e=>({...e,get:(t,r,n)=>X(t,r)||e.get(t,r,n),has:(t,r)=>!!X(t,r)||e.has(t,r)}));const Pe=["continue","continuePrimaryKey","advance"],Y={},V=new WeakMap,oe=new WeakMap,xe={get(e,t){if(!Pe.includes(t))return e[t];let r=Y[t];return r||(r=Y[t]=function(...n){V.set(this,oe.get(this)[t](...n))}),r}};async function*Be(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const r=new Proxy(t,xe);for(oe.set(r,t),U.set(r,F(t));t;)yield r,t=await(V.get(r)||t.continue()),V.delete(r)}function Z(e,t){return t===Symbol.asyncIterator&&H(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&H(e,[IDBIndex,IDBObjectStore])}se(e=>({...e,get:(t,r,n)=>Z(t,r)?Be:e.get(t,r,n),has:(t,r)=>Z(t,r)||e.has(t,r)}));const Ue=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},ie=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=Ue(r)}return"/"+t.reverse().map(r=>r.position!==null?`/${r.name}[${r.position}]`:`/${r.name}`).join("")},S={capture:!0,passive:!0},Le=["a","button","input","option","li","link"],Te=["Escape","Enter","Backspace","F5","Tab"];let L=!1;const _e=["label","type","role","title","placeholder","errormessage","valuetext","href"],Ae="aria-",ee=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(Ae)&&(s=s.substring(5)),_e.includes(s)&&(r[s]=i)}return r},Ne=e=>{var n;if(!e)return{};const t={...ee(e)},r=e.parentElement;if(r&&Le.includes((n=r.tagName)==null?void 0:n.toLowerCase())){const a=ee(r);Object.assign(t,a)}return t},de=(e,t)=>{var r;Me({x:t.x,y:t.y,type:e,elementAttributes:Ne(t.target),windowHeight:window.innerHeight,windowWidth:window.innerWidth,...t.target instanceof HTMLElement?{rect:(r=t.target)==null?void 0:r.getBoundingClientRect(),xPath:ie(t.target)}:{}})},ce=e=>{Te.includes(e.key)&&je({key:e.key})},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),Ve({xPath:ie(t),x:t.scrollLeft,y:t.scrollTop,elementAttributes:{targetScrollWidth:t.scrollWidth,targetClientWidth:t.clientWidth,targetScrollHeight:t.scrollHeight,targetClientHeight:t.clientHeight}})},750),le=(te="left_click",e=>de(te,e));var te;const pe=e=>{e.button===2&&de("right_click",e)},He=()=>{L||(window.addEventListener("click",le,S),window.addEventListener("mousedown",pe,S),window.addEventListener("keydown",ce,S),window.addEventListener("scroll",ue,S),L=!0,window.performance.getEntriesByType("navigation").map(e=>e.type).includes("reload")&&Oe({url:window.location.href,currentPageTitle:document.title}),window.performance.getEntriesByType("navigation").map(e=>e.type).includes("back_forward")&&Fe({curUrl:window.location.href,fromUrl:document.referrer,currentPageTitle:document.title}))},p={isRecording:!1,scrollEventUuids:{},stopRecording:()=>{}},y=(()=>{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})(),K=()=>{o.sessionStorageHelper.setItem("sprig.disableReplayRecording","disabled")},b=()=>!!o.sessionStorageHelper.getItem("sprig.disableReplayRecording");window.addEventListener("beforeunload",()=>{o.breadcrumbsLogger.info("BeforeUnload",{sessionId:y}),o.sessionStorageHelper.setItem("sprig.sessionId",y)});const z=e=>e&&e.trim().substring(0,500).replace(/\s\s+/g," ").replace(/\r?\n|\r/g," ").substring(0,250),I=(e,t)=>{var r,n;if(!b()&&p.isRecording)try{(n=(r=window.rrwebRecord)==null?void 0:r.addCustomEvent)==null||n.call(r,e,t)}catch(a){T("Error recording custom event",a)}},Me=e=>{var t;(t=e==null?void 0:e.elementAttributes)!=null&&t.text&&(e.elementAttributes.text=z(e.elementAttributes.text)),I("Sprig_Click",e)},Oe=e=>{I("Sprig_Refresh",e)},Fe=e=>{e.currentPageTitle&&(e.currentPageTitle=z(e.currentPageTitle)),I("Sprig_BackForward",e)},je=e=>{I("Sprig_Keystroke",e)},Ve=async e=>{const{x:t,xPath:r,y:n}=e,a=p.scrollEventUuids[r];if(a)return h(async()=>{var c,d,u,w;const s=await l.openDB(),i=await s.get("events",a);if(i!=null&&i.event){const g=JSON.parse(i.event),f=t>((d=(c=g.data)==null?void 0:c.payload)==null?void 0:d.x),m=n>((w=(u=g.data)==null?void 0:u.payload)==null?void 0:w.y);if(!f&&!m)return null;f&&(g.data.payload.x=t),m&&(g.data.payload.y=n),g.data.payload.elementAttributes=e.elementAttributes,i.event=JSON.stringify(g),await s.put("events",i)}else I("Sprig_Scroll",e)},"Error updating scroll event");I("Sprig_Scroll",e)},ge=()=>{p.stopRecording&&(p.stopRecording(),p.stopRecording=void 0),p.isRecording=!1,["cleanupInterval","inactivityInterval","pendingCheckInterval"].forEach(e=>{p[e]&&(clearInterval(p[e]),p[e]=void 0)}),L&&(window.removeEventListener("click",le,S),window.removeEventListener("mousedown",pe,S),window.removeEventListener("keydown",ce,S),window.removeEventListener("scroll",ue,S),L=!1)},Ke=["did not allow mutations","called in an invalid security context"],Ge=(e,t,{reportError:r=!0,extraInfo:n={}})=>{if(!b()&&t instanceof Error){if(K(),t.name==="VersionError")return o.breadcrumbsLogger.error("VersionErr",{message:e}),l.deleteDB();(a=>{if(!a)return!0;for(const s of Ke)if(a.toLowerCase().includes(s))return!1;return!0})(t==null?void 0:t.message)&&(r&&window.UserLeap.reportError(e,t,n),l.clearAll())}},T=(e,t,{reportError:r}={reportError:!0})=>{ge(),o.breadcrumbsLogger.error("ReplayErr",{code:t.code,name:t.name}),Ge(e,t,{reportError:r})},h=async(e,t)=>{try{await e()}catch(r){T(t,r)}};j("replayStorage").catch(console.error),j("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=D(i);return n&&(i.onupgradeneeded=d=>{n(D(i.result),d.oldVersion,d.newVersion,D(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 j("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([y,e],[y,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([y,e],[y,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",y)).filter(r=>!e.beforePresent||r.targetTimestamp<Date.now()).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(y)){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(y)){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}},me=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},we=(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 ye=5e3,G=6e4,W=0,E,$=!1,q=[];const We=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;p.scrollEventUuids[s]=e.uuid}q.push(e),$||$e()},$e=()=>{$=!0,setTimeout(async()=>{if(b())return;const e=q;q=[],$=!1,we(async()=>{await(async t=>{const r=t.map(n=>({...n,sessionId:n.sessionId??y}));if(r.length!==0)return h(()=>l.bulkAdd("events",r),"Error storing replay events")})(e)},"sdk_replay_add_event_batch_seconds")},500)},qe=(e,t,r)=>{p.cleanupInterval=window.setInterval(()=>{const n=Date.now();me(()=>h(async()=>{b()||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)},ze=()=>{p.pendingCheckInterval=window.setInterval(async()=>{h(async()=>{const e=parseInt(E??"0");if(e===0)return;const t=await l.getPendingCaptures({beforePresent:!0}),r=await l.openDB();await Promise.all(t.map(async n=>(await r.delete("pendingCaptures",n.uuid),Ie(n.captureParams,n.canUpload)))),E=(e-t.length).toString(),o.sessionStorageHelper.setItem("sprig.pendingCount",E)},"Error initiating pending captures")},5e3)},Je=async(e,t,r,n,a)=>{const s=Math.min(e+a,r),i=await me(()=>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}},fe=e=>Promise.all(e.map(async t=>{const r=await(async n=>ne.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})),he=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 ae({apiUrl:a.apiUrl,surveyId:a.surveyId,uploadId:e,responseGroupUuid:a.responseGroupId,etags:n,headers:a.completeUploadHeaders,replayDuration:a.replayDuration}),await l.deleteChunkUploads("UploadComplete",e)},Qe=()=>{h(async()=>{const e=await l.getChunkUploadsByStatus({sessionId:y,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 he(r)}))},"Error uploading unfinished chunks")},Xe=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,[g,f]=[0,0],m=[];for(let k=n-35e3;k<a;k+=G){if({validStartFound:w,events:m}=await Je(k,n,a,w,G),!(m!=null&&m.length)){o.breadcrumbsLogger.debug("NoEventsFound");continue}g===0&&(g=m[0].timestamp),f=m[m.length-1].timestamp;const P=m.map(C=>C.event);P.push(`{"timestamp":${a}}`);const x=`${u?",":"["}${P}`,B=s.encode(x);we(()=>{d.write(B)},"sdk_replay_compression_seconds"),u=!0}if(f-g<ye)return o.breadcrumbsLogger.debug("ReplayTooShort"),null;const v=s.encode("]");return d.write(v),d.close(),i=new Uint8Array(await new Response(c.readable).arrayBuffer()),i})(r-e,r)},re=async e=>{const{surveyId:t,responseGroupId:r,visitorId:n,apiUrl:a,completeUploadHeaders:s,replayParams:i,triggerTimestamp:c}=e,d=await Xe(1e3*i.replayDurationSeconds,c);if(!(d!=null&&d.length))return void o.breadcrumbsLogger.info("FileDataEmpty",{surveyId:t});const u=((g,f,m)=>{const v=g.length,k=1024*f*1024,P=Math.ceil(v/m),x=Math.max(k,P),B=[];let C=0;for(;C<v;)B.push(g.slice(C,C+x)),C+=x;return B})(d,i.minimumChunkSizeMb,i.signedUrls.length),w=await Promise.all(u.map(async(g,f)=>{const m=o.v4(),v={apiUrl:a,chunkIndex:f+1,completeUploadHeaders:s,etag:null,responseGroupId:r,status:"ReadyForUpload",surveyId:t,timestamp:c,totalChunks:u.length,data:g,uploadId:i.uploadId,uploadUrl:i.signedUrls[f].url,uuid:m,visitorId:n};return await(await l.openDB()).add("chunkUploads",{...v,sessionId:v.sessionId??y}),v}));await(async(g,f)=>{await fe(f),await Promise.all(g.map(m=>he(m)))})([i.uploadId],w)},Ie=async(e,t)=>{if(b())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 re(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 ve(e);if(n||r||t)await re(e),r&&Ye();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")},Ye=async()=>{parseInt(E??"0")||o.sessionStorageHelper.removeItem("sprig.isCapturingHeatmap"),o.sessionStorageHelper.getItem("sprig.teardownAfterCapture")&&(ge(),be(),o.sessionStorageHelper.removeItem("sprig.teardownAfterCapture"))},be=async()=>b()?o.breadcrumbsLogger.debug("ReplayDisabled-ClearData"):Promise.all([l.deleteBySessionId("events",y),l.deleteBySessionId("pendingCaptures",y)]).catch(e=>{T("Error clearing user replay data",e)}),ve=async e=>{if(b())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&&(p.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"),W=Date.now(),p.inactivityInterval||(p.inactivityInterval=window.setInterval(()=>{var d;d=W,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,E=(parseInt(E??"0")+1).toString(),o.sessionStorageHelper.setItem("sprig.pendingCount",E),await(await l.openDB()).add("pendingCaptures",{canUpload:!1,captureParams:s,sessionId:y,targetTimestamp:i,timestamp:Date.now(),uuid:o.v4()})},Ze=Object.freeze(Object.defineProperty({__proto__:null,RecordEvent:e=>{I("Sprig_TrackEvent",e)},RecordPageView:e=>{e.description&&(e.description=z(e.description)),I("Sprig_PageView",e)},RecordSurveyShown:e=>{I("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 ae({surveyId:e,responseGroupUuid:t,eventDigest:r,apiUrl:a,headers:n},!0);return!(s!=null&&s.error)},checkPendingHeatmapsUrl:()=>b()?o.breadcrumbsLogger.debug("ReplayDisabled-PendingHeatmaps"):h(async()=>{const e=(await l.getPendingCaptures({isHeatmap:!0})).map(r=>({eventId:r.captureParams.eventId,uuid:r.uuid})),t=[];e.forEach(({eventId:r,uuid:n})=>{o.checkUrlStillMatching(r)||t.push(n)}),t.length&&await l.markPendingHeatmapsReady(t)},"Error marking pending heatmaps ready"),clearUserReplayData:be,disableRecording:T,initializeReplay:async({maxReplayDurationSeconds:e,maxInflightRequests:t=2,replaySettings:r,teardownAfter:n=!1})=>{if(E=o.sessionStorageHelper.getItem("sprig.pendingCount"),!p.isRecording){if(n&&o.sessionStorageHelper.setItem("sprig.teardownAfterCapture","true"),b())return o.breadcrumbsLogger.debug("ReplayDisabled");if(await(async()=>{var a;if(!window.indexedDB||!window.IDBKeyRange||!window.CompressionStream)return!0;if((a=window.navigator.storage)!=null&&a.estimate)try{const{quota:s=0,usage:i=0}=await window.navigator.storage.estimate(),c=(s-i)/1024**3;return o.breadcrumbsLogger.info("Storage",{availableGb:c}),c<.5}catch{return!0}return!1})())return o.breadcrumbsLogger.debug("IDBNotSupported"),K();try{const a=await l.openDB();o.breadcrumbsLogger.info("DBVersion",{version:a.version})}catch(a){return o.breadcrumbsLogger.error("ReplayOpenErr",{name:a.name}),a.name==="VersionError"&&l.deleteDB(),K()}if(!e)return o.breadcrumbsLogger.debug("MissingDuration");o.breadcrumbsLogger.debug("ReplayInit"),await h(async()=>{var a;if(r!=null&&r.minDuration&&(ye=r.minDuration),r!=null&&r.batchDuration&&(G=r.batchDuration),a=t,ne.setLimit(a),Qe(),qe(e+35,1800,e+35),ze(),!window.rrwebRecord){const{record:d}=await import(window.UserLeap.replayLibraryURL??"https://cdn.sprig.com/dependencies/record-2.0.0-alpha.17.min.js");window.rrwebRecord=d}const s=window.rrwebRecord;if(!s)return o.breadcrumbsLogger.error("RecordScriptFailed");let i=!0,c=0;p.stopRecording=s({checkoutEveryNms:3e4,sampling:{input:"last",scroll:250,media:800},emit:(d,u)=>{if(d.type===R.Custom&&(W=Date.now()),b())return;if(u&&d.type===R.Meta)c=performance.now();else if(u&&c&&d.type===R.FullSnapshot){const g=performance.now()-c;o.reportAndRegister("sdk_replay_snapshot_seconds",g/1e3)}const w=i||!!u&&d.type===R.Meta;i=!1,We({uuid:o.v4(),event:JSON.stringify(d),isValidStart:w,timestamp:Date.now()})},...r}),p.isRecording=!!p.stopRecording,p.isRecording&&(o.eventEmitter.on("survey.complete",d=>{var u;u={id:d,userAgent:window.navigator.userAgent},I("Sprig_SubmitSurvey",u)}),He())},"Error initializing replay")}},isReplayRecording:()=>p.isRecording,scheduleCapture:ve,scheduleOrCaptureReplay:Ie,tryReplayAction:h},Symbol.toStringTag,{value:"Module"}));o.registerReplay(Ze);
|