@sprig-technologies/sprig-browser 2.33.1 → 2.33.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/replay.js CHANGED
@@ -1,116 +1,104 @@
1
- var tt = Object.defineProperty;
2
- var nt = (e, t, n) => t in e ? tt(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
- var z = (e, t, n) => (nt(e, typeof t != "symbol" ? t + "" : t, n), n);
4
- import { b as d, s as K, a as f, v as W, c as at, g as rt, P as be, r as Ee, d as ot, e as F, S as q, f as st } from "./metricsReporter-Dsn4xUH7.js";
5
- var U = ((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))(U || {}), E = ((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))(E || {});
6
- const ee = (e, t) => t.some((n) => e instanceof n);
7
- let we, ye;
8
- const te = /* @__PURE__ */ new WeakMap(), Q = /* @__PURE__ */ new WeakMap(), V = /* @__PURE__ */ new WeakMap();
9
- let ne = { get(e, t, n) {
1
+ var st = Object.defineProperty;
2
+ var ot = (e, t, n) => t in e ? st(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
+ var Q = (e, t, n) => ot(e, typeof t != "symbol" ? t + "" : t, n);
4
+ import { b as d, s as J, a as y, v as z, c as it, g as dt, P as ke, r as Re, d as ct, e as H, S as X, f as lt } from "./metricsReporter-qetrFwEv.js";
5
+ var B = ((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))(B || {}), P = ((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))(P || {});
6
+ const ne = (e, t) => t.some((n) => e instanceof n);
7
+ let he, Ie;
8
+ const ae = /* @__PURE__ */ new WeakMap(), Z = /* @__PURE__ */ new WeakMap(), $ = /* @__PURE__ */ new WeakMap();
9
+ let re = { get(e, t, n) {
10
10
  if (e instanceof IDBTransaction) {
11
- if (t === "done")
12
- return te.get(e);
13
- if (t === "store")
14
- return n.objectStoreNames[1] ? void 0 : n.objectStore(n.objectStoreNames[0]);
11
+ if (t === "done") return ae.get(e);
12
+ if (t === "store") return n.objectStoreNames[1] ? void 0 : n.objectStore(n.objectStoreNames[0]);
15
13
  }
16
- return x(e[t]);
14
+ return T(e[t]);
17
15
  }, set: (e, t, n) => (e[t] = n, !0), has: (e, t) => e instanceof IDBTransaction && (t === "done" || t === "store") || t in e };
18
- function Ce(e) {
19
- ne = e(ne);
16
+ function Ue(e) {
17
+ re = e(re);
20
18
  }
21
- function it(e) {
22
- return (ye || (ye = [IDBCursor.prototype.advance, IDBCursor.prototype.continue, IDBCursor.prototype.continuePrimaryKey])).includes(e) ? function(...t) {
23
- return e.apply(ae(this), t), x(this.request);
19
+ function ut(e) {
20
+ return (Ie || (Ie = [IDBCursor.prototype.advance, IDBCursor.prototype.continue, IDBCursor.prototype.continuePrimaryKey])).includes(e) ? function(...t) {
21
+ return e.apply(se(this), t), T(this.request);
24
22
  } : function(...t) {
25
- return x(e.apply(ae(this), t));
23
+ return T(e.apply(se(this), t));
26
24
  };
27
25
  }
28
- function dt(e) {
29
- return typeof e == "function" ? it(e) : (e instanceof IDBTransaction && function(t) {
30
- if (te.has(t))
31
- return;
26
+ function pt(e) {
27
+ return typeof e == "function" ? ut(e) : (e instanceof IDBTransaction && function(t) {
28
+ if (ae.has(t)) return;
32
29
  const n = new Promise((a, r) => {
33
- const o = () => {
30
+ const s = () => {
34
31
  r(t.error || new DOMException("AbortError", "AbortError"));
35
32
  };
36
33
  t.oncomplete = () => {
37
34
  a();
38
- }, t.onerror = o, t.onabort = o;
35
+ }, t.onerror = s, t.onabort = s;
39
36
  });
40
- te.set(t, n);
41
- }(e), ee(e, we || (we = [IDBDatabase, IDBObjectStore, IDBIndex, IDBCursor, IDBTransaction])) ? new Proxy(e, ne) : e);
37
+ ae.set(t, n);
38
+ }(e), ne(e, he || (he = [IDBDatabase, IDBObjectStore, IDBIndex, IDBCursor, IDBTransaction])) ? new Proxy(e, re) : e);
42
39
  }
43
- function x(e) {
44
- if (e instanceof IDBRequest)
45
- return function(n) {
46
- const a = new Promise((r, o) => {
47
- n.onsuccess = () => {
48
- r(x(n.result));
49
- }, n.onerror = () => {
50
- o(n.error);
51
- };
52
- });
53
- return V.set(a, n), a;
54
- }(e);
55
- if (Q.has(e))
56
- return Q.get(e);
57
- const t = dt(e);
58
- return t !== e && (Q.set(e, t), V.set(t, e)), t;
40
+ function T(e) {
41
+ if (e instanceof IDBRequest) return function(n) {
42
+ const a = new Promise((r, s) => {
43
+ n.onsuccess = () => {
44
+ r(T(n.result));
45
+ }, n.onerror = () => {
46
+ s(n.error);
47
+ };
48
+ });
49
+ return $.set(a, n), a;
50
+ }(e);
51
+ if (Z.has(e)) return Z.get(e);
52
+ const t = pt(e);
53
+ return t !== e && (Z.set(e, t), $.set(t, e)), t;
59
54
  }
60
- const ae = (e) => V.get(e);
61
- function re(e, { blocked: t } = {}) {
55
+ const se = (e) => $.get(e);
56
+ function oe(e, { blocked: t } = {}) {
62
57
  const n = indexedDB.deleteDatabase(e);
63
- return t && (n.onblocked = (a) => t(a.oldVersion, a)), x(n).then(() => {
58
+ return t && (n.onblocked = (a) => t(a.oldVersion, a)), T(n).then(() => {
64
59
  });
65
60
  }
66
- const ct = ["get", "getKey", "getAll", "getAllKeys", "count"], lt = ["put", "add", "delete", "clear"], X = /* @__PURE__ */ new Map();
67
- function fe(e, t) {
68
- if (!(e instanceof IDBDatabase) || t in e || typeof t != "string")
69
- return;
70
- if (X.get(t))
71
- return X.get(t);
72
- const n = t.replace(/FromIndex$/, ""), a = t !== n, r = lt.includes(n);
73
- if (!(n in (a ? IDBIndex : IDBObjectStore).prototype) || !r && !ct.includes(n))
74
- return;
75
- const o = async function(s, ...c) {
76
- const i = this.transaction(s, r ? "readwrite" : "readonly");
61
+ const gt = ["get", "getKey", "getAll", "getAllKeys", "count"], mt = ["put", "add", "delete", "clear"], Y = /* @__PURE__ */ new Map();
62
+ function ve(e, t) {
63
+ if (!(e instanceof IDBDatabase) || t in e || typeof t != "string") return;
64
+ if (Y.get(t)) return Y.get(t);
65
+ const n = t.replace(/FromIndex$/, ""), a = t !== n, r = mt.includes(n);
66
+ if (!(n in (a ? IDBIndex : IDBObjectStore).prototype) || !r && !gt.includes(n)) return;
67
+ const s = async function(o, ...c) {
68
+ const i = this.transaction(o, r ? "readwrite" : "readonly");
77
69
  let l = i.store;
78
70
  return a && (l = l.index(c.shift())), (await Promise.all([l[n](...c), r && i.done]))[0];
79
71
  };
80
- return X.set(t, o), o;
72
+ return Y.set(t, s), s;
81
73
  }
82
- Ce((e) => ({ ...e, get: (t, n, a) => fe(t, n) || e.get(t, n, a), has: (t, n) => !!fe(t, n) || e.has(t, n) }));
83
- const ut = ["continue", "continuePrimaryKey", "advance"], he = {}, oe = /* @__PURE__ */ new WeakMap(), ke = /* @__PURE__ */ new WeakMap(), pt = { get(e, t) {
84
- if (!ut.includes(t))
85
- return e[t];
86
- let n = he[t];
87
- return n || (n = he[t] = function(...a) {
88
- oe.set(this, ke.get(this)[t](...a));
74
+ Ue((e) => ({ ...e, get: (t, n, a) => ve(t, n) || e.get(t, n, a), has: (t, n) => !!ve(t, n) || e.has(t, n) }));
75
+ const wt = ["continue", "continuePrimaryKey", "advance"], Se = {}, ie = /* @__PURE__ */ new WeakMap(), Pe = /* @__PURE__ */ new WeakMap(), yt = { get(e, t) {
76
+ if (!wt.includes(t)) return e[t];
77
+ let n = Se[t];
78
+ return n || (n = Se[t] = function(...a) {
79
+ ie.set(this, Pe.get(this)[t](...a));
89
80
  }), n;
90
81
  } };
91
- async function* gt(...e) {
82
+ async function* ft(...e) {
92
83
  let t = this;
93
- if (t instanceof IDBCursor || (t = await t.openCursor(...e)), !t)
94
- return;
95
- const n = new Proxy(t, pt);
96
- for (ke.set(n, t), V.set(n, ae(t)); t; )
97
- yield n, t = await (oe.get(n) || t.continue()), oe.delete(n);
84
+ if (t instanceof IDBCursor || (t = await t.openCursor(...e)), !t) return;
85
+ const n = new Proxy(t, yt);
86
+ for (Pe.set(n, t), $.set(n, se(t)); t; ) yield n, t = await (ie.get(n) || t.continue()), ie.delete(n);
98
87
  }
99
- function Ie(e, t) {
100
- return t === Symbol.asyncIterator && ee(e, [IDBIndex, IDBObjectStore, IDBCursor]) || t === "iterate" && ee(e, [IDBIndex, IDBObjectStore]);
88
+ function De(e, t) {
89
+ return t === Symbol.asyncIterator && ne(e, [IDBIndex, IDBObjectStore, IDBCursor]) || t === "iterate" && ne(e, [IDBIndex, IDBObjectStore]);
101
90
  }
102
- Ce((e) => ({ ...e, get: (t, n, a) => Ie(t, n) ? gt : e.get(t, n, a), has: (t, n) => Ie(t, n) || e.has(t, n) }));
103
- const Ue = new class {
91
+ Ue((e) => ({ ...e, get: (t, n, a) => De(t, n) ? ft : e.get(t, n, a), has: (t, n) => De(t, n) || e.has(t, n) }));
92
+ const ht = "sprigReplayIframeLoaded", It = "sprigReplayIframeSettings", vt = "sprigReplayIframeTakeFullSnapshot", St = "sprigReplayTeardown", me = [], xe = new class {
104
93
  constructor(e) {
105
- z(this, "awaitingResolvers", []);
106
- z(this, "activeCount", 0);
94
+ Q(this, "awaitingResolvers", []);
95
+ Q(this, "activeCount", 0);
107
96
  this.capacity = e;
108
97
  }
109
98
  async acquire() {
110
- if (!(this.activeCount < this.capacity))
111
- return new Promise((e) => {
112
- this.awaitingResolvers.push(e);
113
- });
99
+ if (!(this.activeCount < this.capacity)) return new Promise((e) => {
100
+ this.awaitingResolvers.push(e);
101
+ });
114
102
  this.activeCount++;
115
103
  }
116
104
  release() {
@@ -127,26 +115,21 @@ const Ue = new class {
127
115
  setLimit(e) {
128
116
  this.capacity = e;
129
117
  }
130
- }(2), xe = async ({ apiUrl: e, surveyId: t, uploadId: n, etags: a, headers: r, responseGroupUuid: o, replayDuration: s, eventDigest: c }, i = !1) => {
131
- var y;
132
- if (!i && !n && !a)
133
- return void d.error("UploadErr", { isMobile: i, uploadId: n, etags: a });
118
+ }(2), Be = async ({ apiUrl: e, surveyId: t, uploadId: n, etags: a, headers: r, responseGroupUuid: s, replayDuration: o, eventDigest: c }, i = !1) => {
119
+ var w;
120
+ if (!i && !n && !a) return void d.error("UploadErr", { isMobile: i, uploadId: n, etags: a });
134
121
  d.info("MarkUploadComplete", { surveyId: t });
135
- const l = await K(`${e}/sdk/1/completeSessionReplay`, { method: "POST", body: JSON.stringify({ etags: a, uploadId: n, responseGroupUuid: o, surveyId: t, replayDuration: s, eventDigest: c, userAgent: (y = window == null ? void 0 : window.navigator) == null ? void 0 : y.userAgent }), headers: r, shouldRetryRequest: !0 });
122
+ const l = await J(`${e}/sdk/1/completeSessionReplay`, { method: "POST", body: JSON.stringify({ etags: a, uploadId: n, responseGroupUuid: s, surveyId: t, replayDuration: o, eventDigest: c, userAgent: (w = window == null ? void 0 : window.navigator) == null ? void 0 : w.userAgent }), headers: r, shouldRetryRequest: !0 });
136
123
  return d.info("MarkUploadDone", { surveyId: t }), l;
137
- }, mt = (e) => {
138
- if (e instanceof Attr)
139
- return null;
124
+ }, Dt = (e) => {
125
+ if (e instanceof Attr) return null;
140
126
  let t = 1;
141
- for (let n = e.previousSibling; n; n = n.previousSibling)
142
- n.nodeName === e.nodeName && ++t;
127
+ for (let n = e.previousSibling; n; n = n.previousSibling) n.nodeName === e.nodeName && ++t;
143
128
  return t;
144
- }, Pe = (e) => {
145
- if (e === null)
146
- return "";
129
+ }, Te = (e) => {
130
+ if (e === null) return "";
147
131
  const t = [];
148
- if (e instanceof Document)
149
- return "/";
132
+ if (e instanceof Document) return "/";
150
133
  for (let n = e; n && !(n instanceof Document) && n !== null; n = n instanceof Attr ? n.ownerElement : n.parentElement) {
151
134
  const a = t[t.length] = { name: void 0, position: null };
152
135
  switch (n.nodeType) {
@@ -165,146 +148,135 @@ const Ue = new class {
165
148
  case Node.ELEMENT_NODE:
166
149
  a.name = n.nodeName;
167
150
  }
168
- a.position = mt(n);
151
+ a.position = Dt(n);
169
152
  }
170
153
  return "/" + t.reverse().map((n) => n.position !== null ? `/${n.name}[${n.position}]` : `/${n.name}`).join("");
171
- }, S = { capture: !0, passive: !0 }, wt = ["a", "button", "input", "option", "li", "link"], yt = ["Escape", "Enter", "Backspace", "F5", "Tab"];
172
- let G = !1;
173
- const ft = ["label", "type", "role", "title", "placeholder", "errormessage", "valuetext", "href"], ht = "aria-", ve = (e) => {
154
+ }, we = (e) => e && e.trim().substring(0, 500).replace(/\s\s+/g, " ").replace(/\r?\n|\r/g, " ").substring(0, 250), k = { capture: !0, passive: !0 }, bt = ["a", "button", "input", "option", "li", "link"], Et = ["Escape", "Enter", "Backspace", "F5", "Tab"];
155
+ let K = !1, b = null, j = null;
156
+ const be = (e) => {
157
+ var n;
158
+ if (((n = e.tagName) == null ? void 0 : n.toLowerCase()) === "html") return { element: "html" };
159
+ const t = {};
160
+ return t.element = ((a) => {
161
+ if (!a.tagName) return "No tagName";
162
+ const r = a.getAttribute("type");
163
+ return r ? `${r} ${a.tagName.toLowerCase()}` : a.tagName.toLowerCase();
164
+ })(e), t;
165
+ }, Ct = (e) => {
174
166
  var a;
175
- if (((a = e.tagName) == null ? void 0 : a.toLowerCase()) === "html")
176
- return { element: "html" };
177
- const t = e.textContent, n = t ? { text: t } : {};
178
- n.element = ((r) => {
179
- if (!r.tagName)
180
- return "No tagName";
181
- const o = r.getAttribute("type");
182
- return o ? `${o} ${r.tagName.toLowerCase()}` : r.tagName.toLowerCase();
183
- })(e);
184
- for (const r of e.attributes) {
185
- let o = r.name;
186
- const s = r.value;
187
- o.startsWith(ht) && (o = o.substring(5)), ft.includes(o) && (n[o] = s);
188
- }
189
- return n;
190
- }, It = (e) => {
191
- var a;
192
- if (!e)
193
- return {};
194
- const t = { ...ve(e) }, n = e.parentElement;
195
- if (n && wt.includes((a = n.tagName) == null ? void 0 : a.toLowerCase())) {
196
- const r = ve(n);
167
+ if (!e) return {};
168
+ const t = { ...be(e) }, n = e.parentElement;
169
+ if (n && bt.includes((a = n.tagName) == null ? void 0 : a.toLowerCase())) {
170
+ const r = be(n);
197
171
  Object.assign(t, r);
198
172
  }
199
173
  return t;
200
- }, Re = (e, t) => {
201
- var a;
174
+ }, Me = (e, t) => {
175
+ var r, s;
202
176
  let n = t.target;
203
- t.target === ((a = window.document) == null ? void 0 : a.body) && window.Sprig.pointerDownTarget && (n = window.Sprig.pointerDownTarget), St({ x: t.x, y: t.y, type: e, elementAttributes: It(n), windowHeight: window.innerHeight, windowWidth: window.innerWidth, ...n instanceof HTMLElement ? { rect: n == null ? void 0 : n.getBoundingClientRect(), xPath: Pe(n) } : {} });
204
- }, Be = (e) => {
205
- yt.includes(e.key) && Et({ key: e.key });
206
- }, Te = /* @__PURE__ */ ((e, t) => {
177
+ var a;
178
+ t.target === ((r = window.document) == null ? void 0 : r.body) && window.Sprig.pointerDownTarget && (n = window.Sprig.pointerDownTarget), a = { x: t.x, y: t.y, type: e, elementAttributes: Ct(n), windowHeight: window.innerHeight, windowWidth: window.innerWidth, ...n instanceof HTMLElement ? { rect: n == null ? void 0 : n.getBoundingClientRect(), xPath: Te(n) } : {} }, (s = a == null ? void 0 : a.elementAttributes) != null && s.text && (a.elementAttributes.text = we(a.elementAttributes.text)), b == null || b("Sprig_Click", a);
179
+ }, Ae = (e) => {
180
+ var t;
181
+ Et.includes(e.key) && (t = { key: e.key }, b == null || b("Sprig_Keystroke", t));
182
+ }, kt = () => {
183
+ var e;
184
+ window.performance.getEntriesByType("navigation").map((t) => t.type).includes("reload") && (e = { url: window.location.href, currentPageTitle: document.title }, b == null || b("Sprig_Refresh", e));
185
+ }, Rt = () => {
186
+ var e;
187
+ 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 = we(e.currentPageTitle)), b == null || b("Sprig_BackForward", e));
188
+ }, _e = /* @__PURE__ */ ((e, t) => {
207
189
  let n;
208
190
  return (a) => {
209
191
  clearTimeout(n), n = window.setTimeout(() => e(a), t);
210
192
  };
211
193
  })((e) => {
212
- if (!(e.target instanceof HTMLElement || e.target instanceof Document))
213
- return;
194
+ if (!(e.target instanceof HTMLElement || e.target instanceof Document)) return;
214
195
  let t = e.target;
215
- "scrollTop" in t || (t = t.documentElement), Ct({ xPath: Pe(t), x: t.scrollLeft, y: t.scrollTop, elementAttributes: { targetScrollWidth: t.scrollWidth, targetClientWidth: t.clientWidth, targetScrollHeight: t.scrollHeight, targetClientHeight: t.clientHeight } });
216
- }, 750), Me = (Se = "left_click", (e) => Re(Se, e));
217
- var Se;
218
- const Ae = (e) => {
219
- e.button === 2 && Re("right_click", e);
220
- }, _e = (e) => {
196
+ "scrollTop" in t || (t = t.documentElement), j == null || j({ xPath: Te(t), x: t.scrollLeft, y: t.scrollTop, elementAttributes: { targetScrollWidth: t.scrollWidth, targetClientWidth: t.clientWidth, targetScrollHeight: t.scrollHeight, targetClientHeight: t.clientHeight } });
197
+ }, 750), Ne = (Ee = "left_click", (e) => Me(Ee, e));
198
+ var Ee;
199
+ const Le = (e) => {
200
+ e.button === 2 && Me("right_click", e);
201
+ }, Oe = (e) => {
221
202
  window.Sprig && (window.Sprig.pointerDownTarget = e.target);
222
- }, vt = () => {
223
- G || (window.addEventListener("click", Me, S), window.addEventListener("pointerdown", _e, S), window.addEventListener("mousedown", Ae, S), window.addEventListener("keydown", Be, S), window.addEventListener("scroll", Te, S), G = !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") && bt({ curUrl: window.location.href, fromUrl: document.referrer, currentPageTitle: document.title }));
224
- }, w = { isRecording: !1, scrollEventUuids: {}, stopRecording: () => {
225
- } }, Ne = () => window.indexedDB && window.IDBKeyRange && window.CompressionStream, h = (() => {
226
- const e = f.getItem("sprig.sessionId");
227
- if (e)
228
- return d.info("SessionIDFound", { savedSessionId: e }), f.removeItem("sprig.sessionId"), e;
229
- const t = W();
203
+ }, g = { isRecording: !1, scrollEventUuids: {}, stopRecording: () => {
204
+ } }, Fe = () => window.indexedDB && window.IDBKeyRange && window.CompressionStream, I = (() => {
205
+ const e = y.getItem("sprig.sessionId");
206
+ if (e) return d.info("SessionIDFound", { savedSessionId: e }), y.removeItem("sprig.sessionId"), e;
207
+ const t = z();
230
208
  return d.info("GeneratedSessionID", { uuid: t }), t;
231
- })(), se = () => {
232
- f.setItem("sprig.disableReplayRecording", "disabled");
233
- }, b = () => !!f.getItem("sprig.disableReplayRecording");
209
+ })(), de = () => {
210
+ y.setItem("sprig.disableReplayRecording", "disabled");
211
+ }, R = () => !!y.getItem("sprig.disableReplayRecording");
234
212
  window.addEventListener("beforeunload", () => {
235
- d.info("BeforeUnload", { sessionId: h }), f.setItem("sprig.sessionId", h);
213
+ d.info("BeforeUnload", { sessionId: I }), y.setItem("sprig.sessionId", I);
236
214
  });
237
- const pe = (e) => e && e.trim().substring(0, 500).replace(/\s\s+/g, " ").replace(/\r?\n|\r/g, " ").substring(0, 250), D = (e, t) => {
215
+ const A = (e, t) => {
238
216
  var n, a;
239
- if (!b() && w.isRecording)
240
- try {
241
- (a = (n = window.rrwebRecord) == null ? void 0 : n.addCustomEvent) == null || a.call(n, e, t);
242
- } catch (r) {
243
- J("Error recording custom event", r);
244
- }
245
- }, St = (e) => {
246
- var t;
247
- (t = e == null ? void 0 : e.elementAttributes) != null && t.text && (e.elementAttributes.text = pe(e.elementAttributes.text)), D("Sprig_Click", e);
248
- }, Dt = (e) => {
249
- D("Sprig_Refresh", e);
250
- }, bt = (e) => {
251
- e.currentPageTitle && (e.currentPageTitle = pe(e.currentPageTitle)), D("Sprig_BackForward", e);
252
- }, Et = (e) => {
253
- D("Sprig_Keystroke", e);
254
- }, Ct = async (e) => {
255
- const { x: t, xPath: n, y: a } = e, r = w.scrollEventUuids[n];
256
- if (r)
257
- return I(async () => {
258
- var c, i, l, y;
259
- const o = await u.openDB(), s = await o.get("events", r);
260
- if (s != null && s.event) {
261
- const p = JSON.parse(s.event), m = t > ((i = (c = p.data) == null ? void 0 : c.payload) == null ? void 0 : i.x), g = a > ((y = (l = p.data) == null ? void 0 : l.payload) == null ? void 0 : y.y);
262
- if (!m && !g)
263
- return null;
264
- m && (p.data.payload.x = t), g && (p.data.payload.y = a), p.data.payload.elementAttributes = e.elementAttributes, s.event = JSON.stringify(p), await o.put("events", s);
265
- } else
266
- D("Sprig_Scroll", e);
267
- }, "Error updating scroll event");
268
- D("Sprig_Scroll", e);
269
- }, Le = () => {
270
- w.stopRecording && (w.stopRecording(), w.stopRecording = void 0), w.isRecording = !1, ["cleanupInterval", "inactivityInterval", "pendingCheckInterval"].forEach((e) => {
271
- w[e] && (clearInterval(w[e]), w[e] = void 0);
272
- }), G && (window.removeEventListener("click", Me, S), window.removeEventListener("pointerdown", _e, S), window.removeEventListener("mousedown", Ae, S), window.removeEventListener("keydown", Be, S), window.removeEventListener("scroll", Te, S), G = !1);
273
- }, kt = ["did not allow mutations", "called in an invalid security context"], Ut = (e, t, { reportError: n = !0, extraInfo: a = {} }) => {
274
- if (!b() && t instanceof Error) {
275
- if (se(), t.name === "VersionError")
276
- return d.error("VersionErr", { message: e }), u.deleteDB();
217
+ if (!R() && g.isRecording) try {
218
+ (a = (n = window.rrwebRecord) == null ? void 0 : n.addCustomEvent) == null || a.call(n, e, t);
219
+ } catch (r) {
220
+ q("Error recording custom event", r);
221
+ }
222
+ }, Ut = async (e) => {
223
+ const { x: t, xPath: n, y: a } = e, r = g.scrollEventUuids[n];
224
+ if (r) return D(async () => {
225
+ var c, i, l, w;
226
+ const s = await u.openDB(), o = await s.get("events", r);
227
+ if (o != null && o.event) {
228
+ const p = JSON.parse(o.event), h = t > ((i = (c = p.data) == null ? void 0 : c.payload) == null ? void 0 : i.x), m = a > ((w = (l = p.data) == null ? void 0 : l.payload) == null ? void 0 : w.y);
229
+ if (!h && !m) return null;
230
+ h && (p.data.payload.x = t), m && (p.data.payload.y = a), p.data.payload.elementAttributes = e.elementAttributes, o.event = JSON.stringify(p), await s.put("events", o);
231
+ } else A("Sprig_Scroll", e);
232
+ }, "Error updating scroll event");
233
+ A("Sprig_Scroll", e);
234
+ }, He = () => {
235
+ g.stopRecording && (g.stopRecording(), g.stopRecording = void 0), g.isRecording = !1, ["cleanupInterval", "inactivityInterval", "pendingCheckInterval"].forEach((e) => {
236
+ g[e] && (clearInterval(g[e]), g[e] = void 0);
237
+ }), K && (window.removeEventListener("click", Ne, k), window.removeEventListener("pointerdown", Oe, k), window.removeEventListener("mousedown", Le, k), window.removeEventListener("keydown", Ae, k), window.removeEventListener("scroll", _e, k), K = !1), me.forEach((e) => {
238
+ var t;
239
+ (t = e.source) == null || t.postMessage({ type: St }, { targetOrigin: e.origin });
240
+ });
241
+ }, Pt = ["did not allow mutations", "called in an invalid security context"], xt = (e, t, { reportError: n = !0, extraInfo: a = {} }) => {
242
+ if (!R() && t instanceof Error) {
243
+ if (de(), t.name === "VersionError") return d.error("VersionErr", { message: e }), void u.deleteDB();
277
244
  ((r) => {
278
- if (!r)
279
- return !0;
280
- for (const o of kt)
281
- if (r.toLowerCase().includes(o))
282
- return !1;
245
+ if (!r) return !0;
246
+ for (const s of Pt) if (r.toLowerCase().includes(s)) return !1;
283
247
  return !0;
284
248
  })(t == null ? void 0 : t.message) && (n && window.UserLeap.reportError(e, t, a), u.clearAll());
285
249
  }
286
- }, J = (e, t, { reportError: n } = { reportError: !0 }) => {
287
- Le(), d.error("ReplayErr", { code: t.code, name: t.name }), Ut(e, t, { reportError: n });
288
- }, I = async (e, t) => {
250
+ }, q = (e, t, { reportError: n } = { reportError: !0 }) => {
251
+ He(), d.error("ReplayErr", { code: t.code, name: t.name }), xt(e, t, { reportError: n });
252
+ }, D = async (e, t) => {
289
253
  try {
290
254
  return await e();
291
255
  } catch (n) {
292
- J(t, n);
256
+ q(t, n);
293
257
  }
258
+ }, je = () => {
259
+ g.isRecording && (D(() => {
260
+ var e, t;
261
+ return (t = (e = window.rrwebRecord) == null ? void 0 : e.takeFullSnapshot) == null ? void 0 : t.call(e, !0);
262
+ }, "Error recording full snapshot"), me.forEach((e) => {
263
+ var t;
264
+ (t = e.source) == null || t.postMessage({ type: vt }, { targetOrigin: e.origin });
265
+ }));
294
266
  };
295
- Ne() && (re("replayStorage").catch(console.error), re("sprig.replay").catch(console.error));
267
+ (async () => Fe() && Promise.allSettled([oe("replayStorage"), oe("sprig.replay")]))();
296
268
  const u = new class {
297
269
  openDB() {
298
- return function(e, t, { blocked: n, upgrade: a, blocking: r, terminated: o } = {}) {
299
- const s = indexedDB.open(e, t), c = x(s);
300
- return a && (s.onupgradeneeded = (i) => {
301
- a(x(s.result), i.oldVersion, i.newVersion, x(s.transaction), i);
302
- }), n && (s.onblocked = (i) => n(i.oldVersion, i.newVersion, i)), c.then((i) => {
303
- o && (i.onclose = () => o()), r && (i.onversionchange = (l) => r(l.oldVersion, l.newVersion, l));
270
+ return function(e, t, { blocked: n, upgrade: a, blocking: r, terminated: s } = {}) {
271
+ const o = indexedDB.open(e, t), c = T(o);
272
+ return a && (o.onupgradeneeded = (i) => {
273
+ a(T(o.result), i.oldVersion, i.newVersion, T(o.transaction), i);
274
+ }), n && (o.onblocked = (i) => n(i.oldVersion, i.newVersion, i)), c.then((i) => {
275
+ s && (i.onclose = () => s()), r && (i.onversionchange = (l) => r(l.oldVersion, l.newVersion, l));
304
276
  }).catch(() => {
305
277
  }), c;
306
278
  }("sprigReplay", 1, { upgrade: (e, t, n) => {
307
- if (n === 0 && f.setItem("sprig.pendingCount", "0"), !e.objectStoreNames.contains("events")) {
279
+ if (n === 0 && y.setItem("sprig.pendingCount", "0"), !e.objectStoreNames.contains("events")) {
308
280
  const a = e.createObjectStore("events", { keyPath: "uuid" });
309
281
  a.createIndex("sessionId", "sessionId"), a.createIndex("timestamp", "timestamp"), a.createIndex("[sessionId+timestamp]", ["sessionId", "timestamp"]);
310
282
  }
@@ -318,8 +290,11 @@ const u = new class {
318
290
  }
319
291
  } });
320
292
  }
321
- deleteDB() {
322
- return re("sprigReplay").catch(console.error);
293
+ async deleteDB() {
294
+ try {
295
+ await oe("sprigReplay");
296
+ } catch {
297
+ }
323
298
  }
324
299
  async bulkAdd(e, t) {
325
300
  const n = (await this.openDB()).transaction(e, "readwrite");
@@ -331,8 +306,7 @@ const u = new class {
331
306
  }
332
307
  async deleteBySessionId(e, t) {
333
308
  const n = IDBKeyRange.only(t), a = (await this.openDB()).transaction(e, "readwrite"), r = a.store.index("sessionId");
334
- for await (const o of r.iterate(n))
335
- await o.delete();
309
+ for await (const s of r.iterate(n)) await s.delete();
336
310
  await a.done;
337
311
  }
338
312
  async updatePartial(e, t, n) {
@@ -340,420 +314,380 @@ const u = new class {
340
314
  r && await a.store.put({ ...r, ...n }), await a.done;
341
315
  }
342
316
  async deleteRowsBefore(e, t, n = () => !0) {
343
- const a = IDBKeyRange.upperBound(t, !0), r = (await this.openDB()).transaction(e, "readwrite"), o = r.store.index("timestamp");
344
- for await (const s of o.iterate(a))
345
- n(s.value) && await s.delete();
317
+ const a = IDBKeyRange.upperBound(t, !0), r = (await this.openDB()).transaction(e, "readwrite"), s = r.store.index("timestamp");
318
+ for await (const o of s.iterate(a)) n(o.value) && await o.delete();
346
319
  await r.done;
347
320
  }
348
321
  async getEventsBetween(e, t = Date.now()) {
349
- if (e >= t)
350
- return Promise.resolve([]);
351
- const n = IDBKeyRange.bound([h, e], [h, t], !1, !0);
322
+ if (e >= t) return Promise.resolve([]);
323
+ const n = IDBKeyRange.bound([I, e], [I, t], !1, !0);
352
324
  return (await this.openDB()).getAllFromIndex("events", "[sessionId+timestamp]", n);
353
325
  }
354
326
  async updateEventsExpiredAt(e, t, n = 30) {
355
- const a = /* @__PURE__ */ new Date(), r = a.setMinutes(a.getMinutes() + (n ?? 30)), o = (await this.openDB()).transaction("events", "readwrite"), s = o.store.index("[sessionId+timestamp]"), c = IDBKeyRange.bound([h, e], [h, t], !1, !0);
356
- for await (const i of s.iterate(c))
357
- await i.update({ ...i.value, expiredAt: r });
358
- await o.done;
327
+ const a = /* @__PURE__ */ new Date(), r = a.setMinutes(a.getMinutes() + (n ?? 30)), s = (await this.openDB()).transaction("events", "readwrite"), o = s.store.index("[sessionId+timestamp]"), c = IDBKeyRange.bound([I, e], [I, t], !1, !0);
328
+ for await (const i of o.iterate(c)) await i.update({ ...i.value, expiredAt: r });
329
+ await s.done;
359
330
  }
360
331
  async deleteChunkUploads(e, t) {
361
332
  const n = IDBKeyRange.only([t, e]), a = (await this.openDB()).transaction("chunkUploads", "readwrite");
362
- let o = await a.store.index("[uploadId+status]").openCursor(n);
363
- for (; o; )
364
- o.delete(), o = await o.continue();
333
+ let s = await a.store.index("[uploadId+status]").openCursor(n);
334
+ for (; s; ) s.delete(), s = await s.continue();
365
335
  await a.done;
366
336
  }
367
337
  async getChunkUploadsByStatus({ sessionId: e, status: t, uploadId: n }) {
368
- const a = (await this.openDB()).transaction("chunkUploads", "readonly"), r = n ? a.store.index("[uploadId+status]") : a.store.index("[sessionId+status]"), o = n ? IDBKeyRange.only([n, t]) : IDBKeyRange.only([e, t]);
369
- return r.getAll(o);
338
+ const a = (await this.openDB()).transaction("chunkUploads", "readonly"), r = n ? a.store.index("[uploadId+status]") : a.store.index("[sessionId+status]"), s = n ? IDBKeyRange.only([n, t]) : IDBKeyRange.only([e, t]);
339
+ return r.getAll(s);
370
340
  }
371
341
  async getPendingCaptures(e = {}) {
372
- return (await (await this.openDB()).getAllFromIndex("pendingCaptures", "sessionId", h)).filter((n) => !e.beforePresent || n.targetTimestamp < Date.now()).filter((n) => !e.isBeforeType || n.captureParams.replayParams.replayDurationType === "before").filter((n) => !e.isHeatmap || (n.captureParams.isHeatmap ?? !1));
342
+ return (await (await this.openDB()).getAllFromIndex("pendingCaptures", "sessionId", I)).filter((n) => !e.beforePresent || n.targetTimestamp < Date.now()).filter((n) => !e.isBeforeType || n.captureParams.replayParams.replayDurationType === "before").filter((n) => !e.isHeatmap || (n.captureParams.isHeatmap ?? !1));
373
343
  }
374
344
  async markPendingCaptureToCanUpload(e) {
375
345
  const t = (await this.openDB()).transaction("pendingCaptures", "readwrite"), n = t.store.index("sessionId");
376
- for await (const a of n.iterate(h)) {
346
+ for await (const a of n.iterate(I)) {
377
347
  const r = a.value;
378
348
  r.captureParams.responseGroupId === e && await a.update({ ...r, canUpload: !0 });
379
349
  }
380
350
  await t.done;
381
351
  }
382
352
  async markPendingHeatmapsReady(e) {
383
- if (parseInt(f.getItem("sprig.pendingCount") ?? "0") === 0)
384
- return null;
353
+ if (parseInt(y.getItem("sprig.pendingCount") ?? "0") === 0) return null;
385
354
  const t = Date.now(), n = (await this.openDB()).transaction("pendingCaptures", "readwrite"), a = n.store.index("sessionId");
386
- for await (const r of a.iterate(h)) {
387
- const o = r.value;
388
- !o.captureParams.isHeatmap || e && !e.includes(o.uuid) || await r.update({ ...o, targetTimestamp: t, captureParams: { ...o.captureParams, triggerTimestamp: t, replayParams: { ...o.captureParams.replayParams, replayDurationSeconds: Math.floor((t - o.timestamp) / 1e3) } } });
355
+ for await (const r of a.iterate(I)) {
356
+ const s = r.value;
357
+ !s.captureParams.isHeatmap || e && !e.includes(s.uuid) || await r.update({ ...s, targetTimestamp: t, captureParams: { ...s.captureParams, triggerTimestamp: t, replayParams: { ...s.captureParams.replayParams, replayDurationSeconds: Math.floor((t - s.timestamp) / 1e3) } } });
389
358
  }
390
359
  await n.done;
391
360
  }
392
- }(), C = [];
393
- let _, Oe, $, Fe, H, He, R = [], M = !1, T = 0, j = !1, je = !1, ge = [], Y = !1;
394
- const A = () => j && !M && Date.now() <= $, xt = ({ apiUrl: e, config: t, triggerSnapshot: n, forceInit: a = !1 }) => {
395
- j && !a || (f.isStorageAvailable ? (R = [], ge.splice(0), C.splice(0), T = 0, H = n, Oe = e, _ = { responseGroupUuid: t.responseGroupUuid, surveyId: t.surveyId, userAgent: t.userAgent, sdkVersion: t.sdkVersion }, Fe = t.maxDurationSeconds, Tt(), j || (He = window.setInterval(Bt, 500)), j = !0) : M = !0);
396
- }, Pt = [E.Drag, E.Input, E.MediaInteraction, E.MouseInteraction, E.MouseMove, E.Scroll, E.Selection, E.TouchMove], Rt = (e) => e.type === U.Custom || e.type === U.IncrementalSnapshot && Pt.includes(e.data.source), me = (e) => e.some(Rt), Bt = async () => {
397
- if (!A())
398
- return void window.clearInterval(He);
399
- if (Ve(), !me(C))
400
- return;
401
- const e = C[0].timestamp;
402
- Date.now() - e > 35e3 && (H == null || H());
403
- }, Ve = async () => {
404
- if (R.length || Y)
405
- return;
406
- Y = !0;
407
- const e = await At();
408
- if (!e)
409
- return void (M = !0);
410
- ge.splice(0, e.length).forEach((t) => t(e.shift())), e.forEach((t) => R.push(t)), Y = !1;
411
- }, Tt = () => {
412
- const e = f.getItem("sprig.alwayson.info");
361
+ }(), x = [];
362
+ let F, Ve, W, Ge, V, $e, _ = [], L = !1, N = 0, G = !1, Ke = !1, ye = [], ee = !1;
363
+ const O = () => G && !L && Date.now() <= W, Bt = ({ apiUrl: e, config: t, triggerSnapshot: n, forceInit: a = !1 }) => {
364
+ G && !a || (y.isStorageAvailable ? (_ = [], ye.splice(0), x.splice(0), N = 0, V = n, Ve = e, F = { responseGroupUuid: t.responseGroupUuid, surveyId: t.surveyId, userAgent: t.userAgent, sdkVersion: t.sdkVersion }, Ge = t.maxDurationSeconds, _t(), G || ($e = window.setInterval(At, 500)), G = !0) : L = !0);
365
+ }, Tt = [P.Drag, P.Input, P.MediaInteraction, P.MouseInteraction, P.MouseMove, P.Scroll, P.Selection, P.TouchMove], Mt = (e) => e.type === B.Custom || e.type === B.IncrementalSnapshot && Tt.includes(e.data.source), fe = (e) => e.some(Mt), At = async () => {
366
+ if (!O()) return void window.clearInterval($e);
367
+ if (We(), !fe(x)) return;
368
+ const e = x[0].timestamp;
369
+ Date.now() - e > 35e3 && (V == null || V());
370
+ }, We = async () => {
371
+ if (_.length || ee) return;
372
+ ee = !0;
373
+ const e = await Lt();
374
+ if (!e) return void (L = !0);
375
+ ye.splice(0, e.length).forEach((t) => t(e.shift())), e.forEach((t) => _.push(t)), ee = !1;
376
+ }, _t = () => {
377
+ const e = y.getItem("sprig.alwayson.info");
413
378
  if (e) {
414
379
  d.info("Read stored session state", e);
415
380
  const t = JSON.parse(e);
416
- M = t.disabled, _ = t.metadata, R = t.uploadUrls, T = t.currentIndex, $ = t.expirationTimestamp, t.pendingEventTimestamp && (d.info(`Uploading with pending timestamp: ${t.pendingEventTimestamp}`), Mt(t.pendingEventTimestamp));
417
- } else
418
- $ = 1e3 * Fe + Date.now();
419
- }, Mt = async (e) => {
381
+ L = t.disabled, F = t.metadata, _ = t.uploadUrls, N = t.currentIndex, W = t.expirationTimestamp, t.pendingEventTimestamp && (d.info(`Uploading with pending timestamp: ${t.pendingEventTimestamp}`), Nt(t.pendingEventTimestamp));
382
+ } else W = 1e3 * Ge + Date.now();
383
+ }, Nt = async (e) => {
420
384
  const t = Date.now(), n = (await u.getEventsBetween(e, t)).map((r) => JSON.parse(r.event));
421
- if (!me(n))
422
- return;
423
- We(n);
424
- const a = await Ke();
425
- a && await $e(a, n);
426
- }, Ge = async (e, t) => {
385
+ if (!fe(n)) return;
386
+ Qe(n);
387
+ const a = await qe();
388
+ a && await ze(a, n);
389
+ }, Je = async (e, t) => {
427
390
  try {
428
391
  const n = await e();
429
- if (!n.ok)
430
- throw new Error(`Error ${t}`);
392
+ if (!n.ok) throw new Error(`Error ${t}`);
431
393
  return n;
432
394
  } catch {
433
- M = !0;
395
+ L = !0;
434
396
  }
435
- }, $e = async (e, t) => {
436
- if (!A() || !e)
437
- return;
397
+ }, ze = async (e, t) => {
398
+ if (!O() || !e) return;
438
399
  const n = await (async (a) => {
439
- const r = new TextEncoder(), o = new CompressionStream("gzip"), s = o.writable.getWriter(), c = r.encode(JSON.stringify(a));
440
- return s.write(c), s.close(), new Uint8Array(await new Response(o.readable).arrayBuffer());
400
+ const r = new TextEncoder(), s = new CompressionStream("gzip"), o = s.writable.getWriter(), c = r.encode(JSON.stringify(a));
401
+ return o.write(c), o.close(), new Uint8Array(await new Response(s.readable).arrayBuffer());
441
402
  })(t);
442
- d.info("Uploading always-on events with presigned url"), await Ge(() => K(e, { body: n, method: "PUT" }), "uploading always-on with presigned url");
443
- }, At = async () => {
444
- if (!A())
445
- return;
446
- const { surveyId: e, responseGroupUuid: t } = _, n = { responseGroupUuid: t, surveyId: e, index: T + 1 };
403
+ d.info("Uploading always-on events with presigned url"), await Je(() => J(e, { body: n, method: "PUT" }), "uploading always-on with presigned url");
404
+ }, Lt = async () => {
405
+ if (!O()) return;
406
+ const { surveyId: e, responseGroupUuid: t } = F, n = { responseGroupUuid: t, surveyId: e, index: N + 1 };
447
407
  d.info("Fetching always-on upload urls", n);
448
- const a = await Ge(() => K(`${Oe}/sdk/1/replayUrls`, { method: "POST", body: JSON.stringify(n), headers: rt(window.UserLeap) }), "fetching always-on signed urls");
449
- if (!a)
450
- return;
408
+ const a = await Je(() => J(`${Ve}/sdk/1/replayUrls`, { method: "POST", body: JSON.stringify(n), headers: dt(window.UserLeap) }), "fetching always-on signed urls");
409
+ if (!a) return;
451
410
  const r = a.json.signedUrls;
452
411
  return d.info("Fetched more always-on upload urls", { body: n, urls: r }), r;
453
- }, Ke = async () => {
454
- if (R.length)
455
- return R.shift();
412
+ }, qe = async () => {
413
+ if (_.length) return _.shift();
456
414
  const e = new Promise((t) => {
457
- ge.push(t);
415
+ ye.push(t);
458
416
  });
459
- return Ve(), e;
460
- }, We = (e) => {
461
- var r, o, s;
462
- const t = e.length ? e[e.length - 1].timestamp : Date.now(), n = T, a = ((o = (r = window.UserLeap) == null ? void 0 : r.config) == null ? void 0 : o.customMetadata) ?? ((s = window.__cfg) == null ? void 0 : s.customMetadata);
463
- T++, e.push({ timestamp: t, type: U.Custom, data: { tag: "Sprig_Meta", payload: { ..._, index: n, visitorId: window.UserLeap.visitorId ?? "", timestamp: t, customMetadata: a } } });
464
- }, _t = (e, t) => {
465
- A() && !je && (e || C.length) && (e && C.length && (async () => {
466
- const n = C.splice(0);
467
- if (!me(n))
468
- return;
469
- d.info("Capturing always-on event array to upload"), We(n);
470
- const a = await Ke();
471
- a && await $e(a, n);
472
- })(), C.push(t));
417
+ return We(), e;
418
+ }, Qe = (e) => {
419
+ var r, s, o;
420
+ const t = e.length ? e[e.length - 1].timestamp : Date.now(), n = N, a = ((s = (r = window.UserLeap) == null ? void 0 : r.config) == null ? void 0 : s.customMetadata) ?? ((o = window.__cfg) == null ? void 0 : o.customMetadata);
421
+ N++, e.push({ timestamp: t, type: B.Custom, data: { tag: "Sprig_Meta", payload: { ...F, index: n, visitorId: window.UserLeap.visitorId ?? "", timestamp: t, customMetadata: a } } });
422
+ }, Ot = (e, t) => {
423
+ O() && !Ke && (e || x.length) && (e && x.length && (async () => {
424
+ const n = x.splice(0);
425
+ if (!fe(n)) return;
426
+ d.info("Capturing always-on event array to upload"), Qe(n);
427
+ const a = await qe();
428
+ a && await ze(a, n);
429
+ })(), x.push(t));
473
430
  };
474
431
  window.addEventListener("beforeunload", async () => {
475
- je = !0, A() && (d.info("Always On handle page unload"), (() => {
432
+ Ke = !0, O() && (d.info("Always On handle page unload"), (() => {
476
433
  let e;
477
- C.length && (e = C[0].timestamp);
478
- const t = { disabled: M, metadata: _, uploadUrls: R, currentIndex: T, pendingEventTimestamp: e, expirationTimestamp: $ };
479
- d.info("Storing session state on unload", t), f.setItem("sprig.alwayson.info", JSON.stringify(t));
434
+ x.length && (e = x[0].timestamp);
435
+ const t = { disabled: L, metadata: F, uploadUrls: _, currentIndex: N, pendingEventTimestamp: e, expirationTimestamp: W };
436
+ d.info("Storing session state on unload", t), y.setItem("sprig.alwayson.info", JSON.stringify(t));
480
437
  })());
481
438
  });
482
- const Je = async (e, t) => {
439
+ const Xe = async (e, t) => {
483
440
  const n = performance.now();
484
441
  let a;
485
442
  try {
486
443
  a = await e();
487
444
  } finally {
488
445
  const r = performance.now() - n;
489
- let o = be[t];
490
- o || (o = Ee(t)), o.report(r / 1e3);
446
+ let s = ke[t];
447
+ s || (s = Re(t)), s.report(r / 1e3);
491
448
  }
492
449
  return a;
493
- }, ze = (e, t) => {
450
+ }, Ze = (e, t) => {
494
451
  const n = performance.now();
495
452
  try {
496
453
  e();
497
454
  } finally {
498
455
  const a = performance.now() - n;
499
- let r = be[t];
500
- r || (r = Ee(t)), r.report(a / 1e3);
456
+ let r = ke[t];
457
+ r || (r = Re(t)), r.report(a / 1e3);
501
458
  }
502
459
  };
503
- let qe = 5e3, ie = 6e4, de = 0, P, ce = !1, le = [];
504
- const Nt = (e) => {
460
+ let Ye = 5e3, ce = 6e4, le = 0, M, ue = !1, pe = [];
461
+ const Ft = (e) => {
505
462
  var t, n, a, r;
506
463
  if ((t = e.event) != null && t.includes("Sprig_Scroll")) {
507
- const o = (r = (a = (n = JSON.parse(e.event)) == null ? void 0 : n.data) == null ? void 0 : a.payload) == null ? void 0 : r.xPath;
508
- if (!o)
509
- return;
510
- w.scrollEventUuids[o] = e.uuid;
511
- }
512
- le.push(e), ce || Lt();
513
- }, Lt = () => {
514
- ce = !0, setTimeout(async () => {
515
- if (b())
516
- return;
517
- const e = le;
518
- le = [], ce = !1, ze(async () => {
464
+ const s = (r = (a = (n = JSON.parse(e.event)) == null ? void 0 : n.data) == null ? void 0 : a.payload) == null ? void 0 : r.xPath;
465
+ if (!s) return;
466
+ g.scrollEventUuids[s] = e.uuid;
467
+ }
468
+ pe.push(e), ue || Ht();
469
+ }, Ht = () => {
470
+ ue = !0, setTimeout(async () => {
471
+ if (R()) return;
472
+ const e = pe;
473
+ pe = [], ue = !1, Ze(async () => {
519
474
  await (async (t) => {
520
- const n = t.map((a) => ({ ...a, sessionId: a.sessionId ?? h }));
521
- if (n.length !== 0)
522
- return I(() => u.bulkAdd("events", n), "Error storing replay events");
475
+ const n = t.map((a) => ({ ...a, sessionId: a.sessionId ?? I }));
476
+ if (n.length !== 0) return D(() => u.bulkAdd("events", n), "Error storing replay events");
523
477
  })(e);
524
478
  }, "sdk_replay_add_event_batch_seconds");
525
479
  }, 500);
526
- }, Ot = (e, t, n) => {
527
- w.cleanupInterval = window.setInterval(() => {
480
+ }, jt = (e, t, n) => {
481
+ g.cleanupInterval = window.setInterval(() => {
528
482
  const a = Date.now();
529
- Je(() => I(async () => {
530
- b() || await Promise.all([u.deleteRowsBefore("events", a - 1e3 * e, (r) => r.expiredAt === void 0 || r.expiredAt < a - 1e3 * e), u.deleteRowsBefore("chunkUploads", a - 1e3 * t), u.deleteRowsBefore("pendingCaptures", a - 1e3 * n, (r) => !r.canUpload)]);
483
+ Xe(() => D(async () => {
484
+ R() || await Promise.all([u.deleteRowsBefore("events", a - 1e3 * e, (r) => r.expiredAt === void 0 || r.expiredAt < a - 1e3 * e), u.deleteRowsBefore("chunkUploads", a - 1e3 * t), u.deleteRowsBefore("pendingCaptures", a - 1e3 * n, (r) => !r.canUpload)]);
531
485
  }, "Error deleting table rows"), "sdk_replay_cleanup_seconds"), d.debug("CleanupComplete");
532
486
  }, 3e4);
533
- }, Ft = () => {
534
- w.pendingCheckInterval = window.setInterval(async () => {
535
- I(async () => {
536
- await ue();
487
+ }, Vt = () => {
488
+ g.pendingCheckInterval = window.setInterval(async () => {
489
+ D(async () => {
490
+ await ge();
537
491
  }, "Error initiating pending captures");
538
492
  }, 5e3);
539
493
  };
540
- let Z = !1;
541
- const ue = async (e = !1) => {
542
- if (!Z)
543
- try {
544
- Z = !0;
545
- const t = parseInt(P ?? "0");
546
- if (t === 0)
547
- return;
548
- const n = await u.getPendingCaptures({ beforePresent: !0, isBeforeType: e }), a = await u.openDB();
549
- await Promise.all(n.map(async (r) => (await a.delete("pendingCaptures", r.uuid), Ye(r.captureParams, r.canUpload)))), P = (t - n.length).toString(), f.setItem("sprig.pendingCount", P);
550
- } finally {
551
- Z = !1;
552
- }
553
- }, Ht = async (e, t, n, a, r) => {
554
- const o = Math.min(e + r, n), s = await Je(() => u.getEventsBetween(e, o), "sdk_replay_get_events_between_seconds");
555
- if (!(s != null && s.length))
556
- return d.debug("NoEventsFound"), { validStartFound: a, events: [] };
494
+ let te = !1;
495
+ const ge = async (e = !1) => {
496
+ if (!te) try {
497
+ te = !0;
498
+ const t = parseInt(M ?? "0");
499
+ if (t === 0) return;
500
+ const n = await u.getPendingCaptures({ beforePresent: !0, isBeforeType: e }), a = await u.openDB();
501
+ await Promise.all(n.map(async (r) => (await a.delete("pendingCaptures", r.uuid), nt(r.captureParams, r.canUpload)))), M = (t - n.length).toString(), y.setItem("sprig.pendingCount", M);
502
+ } finally {
503
+ te = !1;
504
+ }
505
+ }, Gt = async (e, t, n, a, r) => {
506
+ const s = Math.min(e + r, n), o = await Xe(() => u.getEventsBetween(e, s), "sdk_replay_get_events_between_seconds");
507
+ if (!(o != null && o.length)) return d.debug("NoEventsFound"), { validStartFound: a, events: [] };
557
508
  if (!a) {
558
509
  d.debug("ValidStartSearch");
559
510
  let c = -1;
560
- return s == null || s.forEach((i, l) => {
561
- if (!i.isValidStart)
562
- return;
563
- const y = i.timestamp <= t;
564
- (c < 0 || y) && (c = l);
565
- }), c < 0 ? (d.debug("ValidStartNotFound"), { validStartFound: a, events: [] }) : { validStartFound: !0, events: s == null ? void 0 : s.slice(c) };
566
- }
567
- return { validStartFound: a, events: s };
568
- }, Qe = (e) => Promise.all(e.map(async (t) => {
569
- const n = await (async (a) => Ue.execute(async () => {
570
- var s;
511
+ return o == null || o.forEach((i, l) => {
512
+ if (!i.isValidStart) return;
513
+ const w = i.timestamp <= t;
514
+ (c < 0 || w) && (c = l);
515
+ }), c < 0 ? (d.debug("ValidStartNotFound"), { validStartFound: a, events: [] }) : { validStartFound: !0, events: o == null ? void 0 : o.slice(c) };
516
+ }
517
+ return { validStartFound: a, events: o };
518
+ }, et = (e) => Promise.all(e.map(async (t) => {
519
+ const n = await (async (a) => xe.execute(async () => {
520
+ var o;
571
521
  d.info("UploadChunkStart", { chunkIndex: a.chunkIndex, surveyId: a.surveyId });
572
- const r = await K(a.uploadUrl, { body: a.data, method: "PUT" });
522
+ const r = await J(a.uploadUrl, { body: a.data, method: "PUT" });
573
523
  d.http("UploadChunkEnd", { url: a.uploadUrl, method: "PUT", status_code: r.status, reason: r.statusText ?? "OK", chunkIndex: a.chunkIndex, surveyId: a.surveyId });
574
- const o = (s = r.headers) == null ? void 0 : s.get("ETag");
575
- if (!o)
576
- throw new Error(`Upload response did not include etag for upload ${a.uploadId}, part ${a.chunkIndex}`);
577
- return o;
524
+ const s = (o = r.headers) == null ? void 0 : o.get("ETag");
525
+ if (!s) throw new Error(`Upload response did not include etag for upload ${a.uploadId}, part ${a.chunkIndex}`);
526
+ return s;
578
527
  }))(t);
579
528
  return await u.updatePartial("chunkUploads", t.uuid, { data: null, etag: n, status: "UploadComplete" }), t.uploadId;
580
- })), Xe = async (e) => {
529
+ })), tt = async (e) => {
581
530
  const t = await u.getChunkUploadsByStatus({ status: "UploadComplete", uploadId: e });
582
- if (!(t != null && t.length))
583
- return void d.info("NoChunksForUpload", { uploadId: e });
584
- const n = t.reduce((o, s) => (o.find((c) => c.chunkIndex === s.chunkIndex) || o.push(s), o), []);
585
- n.sort((o, s) => o.chunkIndex - s.chunkIndex);
586
- const a = n.map((o) => ({ ETag: o.etag, PartNumber: o.chunkIndex })).filter((o) => o.ETag !== null), r = n[0];
587
- await xe({ apiUrl: r.apiUrl, surveyId: r.surveyId, uploadId: e, responseGroupUuid: r.responseGroupId, etags: a, headers: r.completeUploadHeaders, replayDuration: r.replayDuration }), await u.deleteChunkUploads("UploadComplete", e);
588
- }, jt = () => {
589
- I(async () => {
590
- const e = await u.getChunkUploadsByStatus({ sessionId: h, status: "ReadyForUpload" });
591
- if (!(e != null && e.length))
592
- return;
593
- const t = await Qe(e);
531
+ if (!(t != null && t.length)) return void d.info("NoChunksForUpload", { uploadId: e });
532
+ const n = t.reduce((s, o) => (s.find((c) => c.chunkIndex === o.chunkIndex) || s.push(o), s), []);
533
+ n.sort((s, o) => s.chunkIndex - o.chunkIndex);
534
+ const a = n.map((s) => ({ ETag: s.etag, PartNumber: s.chunkIndex })).filter((s) => s.ETag !== null), r = n[0];
535
+ await Be({ apiUrl: r.apiUrl, surveyId: r.surveyId, uploadId: e, responseGroupUuid: r.responseGroupId, etags: a, headers: r.completeUploadHeaders, replayDuration: r.replayDuration }), await u.deleteChunkUploads("UploadComplete", e);
536
+ }, $t = () => {
537
+ D(async () => {
538
+ const e = await u.getChunkUploadsByStatus({ sessionId: I, status: "ReadyForUpload" });
539
+ if (!(e != null && e.length)) return;
540
+ const t = await et(e);
594
541
  t != null && t.length && await Promise.all(t.map((n) => {
595
- if (n)
596
- return Xe(n);
542
+ if (n) return tt(n);
597
543
  }));
598
544
  }, "Error uploading unfinished chunks");
599
- }, Vt = async (e, t) => {
545
+ }, Kt = async (e, t) => {
600
546
  const n = t ?? Date.now();
601
547
  return (async (a, r) => {
602
- const o = new TextEncoder();
603
- let s = null;
548
+ const s = new TextEncoder();
549
+ let o = null;
604
550
  const c = new CompressionStream("gzip"), i = c.writable.getWriter();
605
- let l = !1, y = !1, [p, m] = [0, 0], g = [];
606
- for (let k = a - 35e3; k < r; k += ie) {
607
- if ({ validStartFound: y, events: g } = await Ht(k, a, r, y, ie), !(g != null && g.length)) {
551
+ let l = !1, w = !1, [p, h] = [0, 0], m = [];
552
+ for (let U = a - 35e3; U < r; U += ce) {
553
+ if ({ validStartFound: w, events: m } = await Gt(U, a, r, w, ce), !(m != null && m.length)) {
608
554
  d.debug("NoEventsFound");
609
555
  continue;
610
556
  }
611
- p === 0 && (p = g[0].timestamp), m = g[g.length - 1].timestamp;
612
- const N = g.map((B) => B.event);
613
- N.push(`{"timestamp":${r}}`);
614
- const L = `${l ? "," : "["}${N}`, O = o.encode(L);
615
- ze(() => {
616
- i.write(O);
557
+ p === 0 && (p = m[0].timestamp), h = m[m.length - 1].timestamp;
558
+ const f = m.map((C) => C.event);
559
+ f.push(`{"timestamp":${r}}`);
560
+ const v = `${l ? "," : "["}${f}`, S = s.encode(v);
561
+ Ze(() => {
562
+ i.write(S);
617
563
  }, "sdk_replay_compression_seconds"), l = !0;
618
564
  }
619
- if (m - p < qe)
620
- return d.debug("ReplayTooShort"), null;
621
- const v = o.encode("]");
622
- return i.write(v), i.close(), s = new Uint8Array(await new Response(c.readable).arrayBuffer()), s;
565
+ if (h - p < Ye) return d.debug("ReplayTooShort"), null;
566
+ const E = s.encode("]");
567
+ return i.write(E), i.close(), o = new Uint8Array(await new Response(c.readable).arrayBuffer()), o;
623
568
  })(n - e, n);
624
- }, De = async (e) => {
625
- const { surveyId: t, responseGroupId: n, visitorId: a, apiUrl: r, completeUploadHeaders: o, replayParams: s, triggerTimestamp: c } = e, i = await Vt(1e3 * s.replayDurationSeconds, c);
626
- if (!(i != null && i.length))
627
- return void d.info("FileDataEmpty", { surveyId: t });
628
- const l = ((p, m, g) => {
629
- const v = p.length, k = 1024 * m * 1024, N = Math.ceil(v / g), L = Math.max(k, N), O = [];
630
- let B = 0;
631
- for (; B < v; )
632
- O.push(p.slice(B, B + L)), B += L;
633
- return O;
634
- })(i, s.minimumChunkSizeMb, s.signedUrls.length), y = await Promise.all(l.map(async (p, m) => {
635
- const g = W(), v = { apiUrl: r, chunkIndex: m + 1, completeUploadHeaders: o, etag: null, responseGroupId: n, status: "ReadyForUpload", surveyId: t, timestamp: c, totalChunks: l.length, data: p, uploadId: s.uploadId, uploadUrl: s.signedUrls[m].url, uuid: g, visitorId: a };
636
- return await (await u.openDB()).add("chunkUploads", { ...v, sessionId: v.sessionId ?? h }), v;
569
+ }, Ce = async (e) => {
570
+ const { surveyId: t, responseGroupId: n, visitorId: a, apiUrl: r, completeUploadHeaders: s, replayParams: o, triggerTimestamp: c } = e, i = await Kt(1e3 * o.replayDurationSeconds, c);
571
+ if (!(i != null && i.length)) return void d.info("FileDataEmpty", { surveyId: t });
572
+ const l = ((p, h, m) => {
573
+ const E = p.length, U = 1024 * h * 1024, f = Math.ceil(E / m), v = Math.max(U, f), S = [];
574
+ let C = 0;
575
+ for (; C < E; ) S.push(p.slice(C, C + v)), C += v;
576
+ return S;
577
+ })(i, o.minimumChunkSizeMb, o.signedUrls.length), w = await Promise.all(l.map(async (p, h) => {
578
+ const m = z(), E = { apiUrl: r, chunkIndex: h + 1, completeUploadHeaders: s, etag: null, responseGroupId: n, status: "ReadyForUpload", surveyId: t, timestamp: c, totalChunks: l.length, data: p, uploadId: o.uploadId, uploadUrl: o.signedUrls[h].url, uuid: m, visitorId: a };
579
+ return await (await u.openDB()).add("chunkUploads", { ...E, sessionId: E.sessionId ?? I }), E;
637
580
  }));
638
- await (async (p, m) => {
639
- await Qe(m), await Promise.all(p.map((g) => Xe(g)));
640
- })([s.uploadId], y);
641
- }, Ye = async (e, t) => {
642
- if (b())
643
- return d.debug("ReplayDisabled-ScheduleOrCapture");
644
- const { isHeatmap: n, isStandalone: a, replayParams: r, triggerTimestamp: o, responseGroupId: s } = e, c = async () => {
645
- setTimeout(() => F.removeListener(q.QuestionAnswered, c), 0), I(async () => {
646
- r.replayDurationType === "before" ? await De(e) : await u.markPendingCaptureToCanUpload(s);
581
+ await (async (p, h) => {
582
+ await et(h), await Promise.all(p.map((m) => tt(m)));
583
+ })([o.uploadId], w);
584
+ }, nt = async (e, t) => {
585
+ if (R()) return d.debug("ReplayDisabled-ScheduleOrCapture");
586
+ const { isHeatmap: n, isStandalone: a, replayParams: r, triggerTimestamp: s, responseGroupId: o } = e, c = async () => {
587
+ setTimeout(() => H.removeListener(X.QuestionAnswered, c), 0), D(async () => {
588
+ r.replayDurationType === "before" ? await Ce(e) : await u.markPendingCaptureToCanUpload(o);
647
589
  }, "Error in schedule/capture callback");
648
590
  };
649
- I(async () => {
591
+ D(async () => {
650
592
  if (r.replayDurationType === "after" || r.replayDurationType === "beforeAndAfter")
651
- return !a && !n && F.on(q.QuestionAnswered, c), void await et(e);
652
- if (a || n || t)
653
- await De(e), n && Gt();
593
+ return !a && !n && H.on(X.QuestionAnswered, c), void await rt(e);
594
+ if (a || n || t) await Ce(e), n && Wt();
654
595
  else {
655
- const i = 35 + r.replayDurationSeconds, l = o - 1e3 * i, y = o;
656
- await u.updateEventsExpiredAt(l, y, r.expirationTimeLimitMinutes), F.on(q.QuestionAnswered, c);
596
+ const i = 35 + r.replayDurationSeconds, l = s - 1e3 * i, w = s;
597
+ await u.updateEventsExpiredAt(l, w, r.expirationTimeLimitMinutes), H.on(X.QuestionAnswered, c);
657
598
  }
658
599
  }, "Error in scheduling/capturing replay");
659
- }, Gt = async () => {
660
- parseInt(P ?? "0") || f.removeItem("sprig.isCapturingHeatmap"), f.getItem("sprig.teardownAfterCapture") && (Le(), Ze(), f.removeItem("sprig.teardownAfterCapture"));
661
- }, Ze = async () => b() ? d.debug("ReplayDisabled-ClearData") : Promise.all([u.deleteBySessionId("events", h), u.deleteBySessionId("pendingCaptures", h)]).catch((e) => {
662
- J("Error clearing user replay data", e);
663
- }), et = async (e) => {
664
- if (b())
665
- return;
600
+ }, Wt = async () => {
601
+ parseInt(M ?? "0") || y.removeItem("sprig.isCapturingHeatmap"), y.getItem("sprig.teardownAfterCapture") && (He(), at(), y.removeItem("sprig.teardownAfterCapture"));
602
+ }, at = async () => R() ? d.debug("ReplayDisabled-ClearData") : Promise.all([u.deleteBySessionId("events", I), u.deleteBySessionId("pendingCaptures", I)]).catch((e) => {
603
+ q("Error clearing user replay data", e);
604
+ }), rt = async (e) => {
605
+ if (R()) return;
666
606
  const { isHeatmap: t, surveyId: n } = e, a = await u.getPendingCaptures(), r = a == null ? void 0 : a.filter((i) => i.captureParams.surveyId === n);
667
- if (r != null && r.length)
668
- return void d.info("PendingCaptureExists", { surveyId: n });
669
- t && (w.isRecording && I(() => {
670
- var i, l;
671
- return (l = (i = window.rrwebRecord) == null ? void 0 : i.takeFullSnapshot) == null ? void 0 : l.call(i, !0);
672
- }, "Error recording full snapshot"), f.setItem("sprig.isCapturingHeatmap", "true"), de = Date.now(), w.inactivityInterval || (w.inactivityInterval = window.setInterval(() => {
607
+ if (r != null && r.length) return void d.info("PendingCaptureExists", { surveyId: n });
608
+ t && (je(), y.setItem("sprig.isCapturingHeatmap", "true"), le = Date.now(), g.inactivityInterval || (g.inactivityInterval = window.setInterval(() => {
673
609
  var i;
674
- i = de, Date.now() - i >= 3e4 && I(() => u.markPendingHeatmapsReady(), "Error in heatmap inactivity");
610
+ i = le, Date.now() - i >= 3e4 && D(() => u.markPendingHeatmapsReady(), "Error in heatmap inactivity");
675
611
  }, 1e3)));
676
- const o = { ...e, replayParams: { ...e.replayParams } };
677
- e.replayParams.replayDurationType === "beforeAndAfter" && (o.replayParams.replayDurationSeconds *= 2), o.replayParams.replayDurationType = "before";
678
- const s = e.triggerTimestamp + 1e3 * e.replayParams.replayDurationSeconds;
679
- o.triggerTimestamp = s, P = (parseInt(P ?? "0") + 1).toString(), f.setItem("sprig.pendingCount", P), await (await u.openDB()).add("pendingCaptures", { canUpload: !1, captureParams: o, sessionId: h, targetTimestamp: s, timestamp: Date.now(), uuid: W() });
680
- }, $t = Object.freeze(Object.defineProperty({ __proto__: null, RecordEvent: (e) => {
681
- D("Sprig_TrackEvent", e);
612
+ const s = { ...e, replayParams: { ...e.replayParams } };
613
+ e.replayParams.replayDurationType === "beforeAndAfter" && (s.replayParams.replayDurationSeconds *= 2), s.replayParams.replayDurationType = "before";
614
+ const o = e.triggerTimestamp + 1e3 * e.replayParams.replayDurationSeconds;
615
+ s.triggerTimestamp = o, M = (parseInt(M ?? "0") + 1).toString(), y.setItem("sprig.pendingCount", M), await (await u.openDB()).add("pendingCaptures", { canUpload: !1, captureParams: s, sessionId: I, targetTimestamp: o, timestamp: Date.now(), uuid: z() });
616
+ }, Jt = Object.freeze(Object.defineProperty({ __proto__: null, RecordEvent: (e) => {
617
+ A("Sprig_TrackEvent", e);
682
618
  }, RecordPageView: (e) => {
683
- e.description && (e.description = pe(e.description)), D("Sprig_PageView", e);
619
+ e.description && (e.description = we(e.description)), A("Sprig_PageView", e);
684
620
  }, RecordSurveyShown: (e) => {
685
- D("Sprig_ShowSurvey", e);
621
+ A("Sprig_ShowSurvey", e);
686
622
  }, _completeSessionReplay: async ({ surveyId: e, responseGroupUuid: t, eventDigest: n, headers: a }) => {
687
- if (!e || !t)
688
- return !1;
689
- const r = window.UserLeap._API_URL, o = await xe({ surveyId: e, responseGroupUuid: t, eventDigest: n, apiUrl: r, headers: a }, !0);
690
- return !(o != null && o.error);
691
- }, checkPendingHeatmapsUrl: () => b() ? d.debug("ReplayDisabled-PendingHeatmaps") : I(async () => {
692
- const e = (await u.getPendingCaptures({ isHeatmap: !0 })).map((t) => ({ eventId: t.captureParams.eventId, uuid: t.uuid })).filter(({ eventId: t }) => !at(t)).map(({ uuid: t }) => t);
623
+ if (!e || !t) return !1;
624
+ const r = window.UserLeap._API_URL, s = await Be({ surveyId: e, responseGroupUuid: t, eventDigest: n, apiUrl: r, headers: a }, !0);
625
+ return !(s != null && s.error);
626
+ }, checkPendingHeatmapsUrl: () => R() ? d.debug("ReplayDisabled-PendingHeatmaps") : D(async () => {
627
+ const e = (await u.getPendingCaptures({ isHeatmap: !0 })).map((t) => ({ eventId: t.captureParams.eventId, uuid: t.uuid })).filter(({ eventId: t }) => !it(t)).map(({ uuid: t }) => t);
693
628
  return d.info("PendingHeatmapsToComplete", { count: e.length }), e.length && (await u.markPendingHeatmapsReady(e), d.info("MarkedPendingHeatmapsReady")), e.length;
694
- }, "Error marking pending heatmaps ready"), clearUserReplayData: Ze, disableRecording: J, initializeReplay: async ({ maxReplayDurationSeconds: e, maxInflightRequests: t = 2, replaySettings: n, teardownAfter: a = !1, apiUrl: r, alwaysOnConfig: o }) => {
695
- if (o && xt({ apiUrl: r, config: o, triggerSnapshot: () => {
696
- var i;
697
- return (i = window.rrwebRecord) == null ? void 0 : i.takeFullSnapshot(!0);
698
- } }), P = f.getItem("sprig.pendingCount"), w.isRecording)
699
- return;
700
- if (a && f.setItem("sprig.teardownAfterCapture", "true"), b())
701
- return d.debug("ReplayDisabled");
629
+ }, "Error marking pending heatmaps ready"), clearUserReplayData: at, disableRecording: q, initializeReplay: async ({ maxReplayDurationSeconds: e, maxInflightRequests: t = 2, replaySettings: n, teardownAfter: a = !1, apiUrl: r, alwaysOnConfig: s }) => {
630
+ if (s && Bt({ apiUrl: r, config: s, triggerSnapshot: () => {
631
+ je();
632
+ } }), M = y.getItem("sprig.pendingCount"), g.isRecording) return;
633
+ if (a && y.setItem("sprig.teardownAfterCapture", "true"), R()) return d.debug("ReplayDisabled");
702
634
  if (await (async () => {
703
635
  var i;
704
- if (!Ne())
636
+ if (!Fe()) return !0;
637
+ if ((i = window.navigator.storage) != null && i.estimate) try {
638
+ const { quota: l = 0, usage: w = 0 } = await window.navigator.storage.estimate(), p = (l - w) / 1024 ** 3;
639
+ return d.info("Storage", { availableGb: p }), p < 0.5;
640
+ } catch {
705
641
  return !0;
706
- if ((i = window.navigator.storage) != null && i.estimate)
707
- try {
708
- const { quota: l = 0, usage: y = 0 } = await window.navigator.storage.estimate(), p = (l - y) / 1024 ** 3;
709
- return d.info("Storage", { availableGb: p }), p < 0.5;
710
- } catch {
711
- return !0;
712
- }
642
+ }
713
643
  return !1;
714
- })())
715
- return d.debug("IDBNotSupported"), se();
644
+ })()) return d.debug("IDBNotSupported"), de();
716
645
  try {
717
646
  const i = await u.openDB();
718
647
  d.info("DBVersion", { version: i.version });
719
648
  } catch (i) {
720
- return d.error("ReplayOpenErr", { name: i.name }), i.name === "VersionError" && u.deleteDB(), se();
649
+ return d.error("ReplayOpenErr", { name: i.name }), i.name === "VersionError" && u.deleteDB(), de();
721
650
  }
722
- I(async () => {
723
- await ue(!0);
651
+ D(async () => {
652
+ await ge(!0);
724
653
  }, "Error uploading ready pending captures");
725
- const s = A() ? 30 : 0, c = Math.max(e ?? 0, s);
726
- if (!c)
727
- return d.debug("MissingDuration");
728
- d.debug("ReplayInit"), await I(async () => {
654
+ const o = O() ? 30 : 0, c = Math.max(e ?? 0, o);
655
+ if (!c) return d.debug("MissingDuration");
656
+ d.debug("ReplayInit"), await D(async () => {
729
657
  var i;
730
- if (n != null && n.minDuration && (qe = n.minDuration), n != null && n.batchDuration && (ie = n.batchDuration), i = t, Ue.setLimit(i), jt(), Ot(c + 35, 1800, c + 35), Ft(), !window.rrwebRecord) {
731
- const { record: m } = await import(
658
+ n != null && n.minDuration && (Ye = n.minDuration), n != null && n.batchDuration && (ce = n.batchDuration), i = t, xe.setLimit(i), $t(), jt(c + 35, 1800, c + 35), Vt();
659
+ const l = window.UserLeap.replayLibraryURL ?? "https://cdn.sprig.com/dependencies/record-2.0.0-alpha.17.min.js";
660
+ if (!window.rrwebRecord) {
661
+ const { record: f } = await import(
732
662
  /* webpackIgnore: true */
733
663
  /* @vite-ignore */
734
- window.UserLeap.replayLibraryURL ?? "https://cdn.sprig.com/dependencies/record-2.0.0-alpha.17.min.js"
664
+ l
735
665
  );
736
- window.rrwebRecord = m;
666
+ window.rrwebRecord = f;
737
667
  }
738
- const l = window.rrwebRecord;
739
- if (!l)
740
- return d.error("RecordScriptFailed");
741
- let y = !0, p = 0;
742
- w.stopRecording = l({ checkoutEveryNms: 3e4, sampling: { input: "last", scroll: 250, media: 800 }, emit: (m, g) => {
743
- if (m.type === U.Custom && (de = Date.now()), b())
744
- return;
745
- if (g && m.type === U.Meta)
746
- p = performance.now();
747
- else if (g && p && m.type === U.FullSnapshot) {
748
- const k = performance.now() - p;
749
- ot("sdk_replay_snapshot_seconds", k / 1e3);
668
+ const w = window.rrwebRecord;
669
+ if (!w) return d.error("RecordScriptFailed");
670
+ let p = !0, h = 0;
671
+ const m = { checkoutEveryNms: 3e4, sampling: { input: "last", scroll: 250, media: 800 }, ...n };
672
+ var E, U;
673
+ g.stopRecording = w({ emit: (f, v) => {
674
+ if (f.type === B.Custom && (le = Date.now()), R()) return;
675
+ if (v && f.type === B.Meta) h = performance.now();
676
+ else if (v && h && f.type === B.FullSnapshot) {
677
+ const C = performance.now() - h;
678
+ ct("sdk_replay_snapshot_seconds", C / 1e3);
750
679
  }
751
- const v = y || !!g && m.type === U.Meta;
752
- y = !1, _t(v, m), Nt({ uuid: W(), event: JSON.stringify(m), isValidStart: v, timestamp: Date.now() });
753
- }, ...n }), w.isRecording = !!w.stopRecording, w.isRecording && (F.on("survey.complete", (m) => {
754
- var g;
755
- g = { id: m, userAgent: window.navigator.userAgent }, D("Sprig_SubmitSurvey", g);
756
- }), vt());
680
+ const S = p || !!v && f.type === B.Meta;
681
+ p = !1, Ot(S, f), Ft({ uuid: z(), event: JSON.stringify(f), isValidStart: S, timestamp: Date.now() });
682
+ }, ...m }), g.isRecording = !!g.stopRecording, g.isRecording && (((f, v) => {
683
+ window.addEventListener("message", (S) => {
684
+ var C;
685
+ S.data.type === ht && (me.push({ source: S.source, origin: S.origin }), (C = S.source) == null || C.postMessage({ type: It, settings: f, replayLibraryUrl: v }, { targetOrigin: S.origin }));
686
+ });
687
+ })(m, l), H.on("survey.complete", (f) => {
688
+ var v;
689
+ v = { id: f, userAgent: window.navigator.userAgent }, A("Sprig_SubmitSurvey", v);
690
+ }), E = A, U = Ut, K || (b = E, j = U, window.addEventListener("click", Ne, k), window.addEventListener("pointerdown", Oe, k), window.addEventListener("mousedown", Le, k), window.addEventListener("keydown", Ae, k), window.addEventListener("scroll", _e, k), K = !0, kt(), Rt()));
757
691
  }, "Error initializing replay");
758
- }, isReplayRecording: () => w.isRecording, scheduleCapture: et, scheduleOrCaptureReplay: Ye, tryReplayAction: I, uploadReadyPendingCaptures: ue }, Symbol.toStringTag, { value: "Module" }));
759
- st($t);
692
+ }, isReplayRecording: () => g.isRecording, scheduleCapture: rt, scheduleOrCaptureReplay: nt, tryReplayAction: D, uploadReadyPendingCaptures: ge }, Symbol.toStringTag, { value: "Module" }));
693
+ lt(Jt);