UNPKG

datadog-ux-utils

Version:

Datadog RUM focused UX & performance toolkit: API guards (retry, breaker, rate), React telemetry (error boundary, profiler, Suspense), web vitals & resource observers, offline queues.

168 lines (167 loc) 4.39 kB
import { a as h, c as E } from "./datadog-irY4zUa4.js"; let s = [], y = 200, a = !1; function R(e = 200) { return a || (a = !0, y = e, globalThis.__dd_addAction = h, globalThis.__dd_addError = E, globalThis.addAction = function(n, r, t) { navigator.onLine || g({ type: "action", name: n, attrs: r, sampleRate: t }); }, globalThis.addError = function(n, r, t) { navigator.onLine || g({ type: "error", err: n, context: r, sampleRate: t }); }, window.addEventListener("online", m)), d; } function d() { a && (a = !1, globalThis.addAction = globalThis.__dd_addAction, globalThis.addError = globalThis.__dd_addError, window.removeEventListener("online", m), s = []); } function g(e) { s.length >= y && s.shift(), s.push(e); } function m() { if (!navigator.onLine || !s.length) return; const e = s.slice(); s = []; for (const n of e) n.type === "action" ? h(n.name, n.attrs, n.sampleRate) : E(n.err, n.context, n.sampleRate); } const T = { storageKey: "dd_offline_queue_v1", maxBuffered: 400, byteCap: 15e5, // ~1.5MB, under typical 5MB LS limits flushOnInit: !0, writeDebounceMs: 150 }; let o, i = [], l = !1, c = null; function f() { const e = globalThis; return { sendAction: e.__DD_SEND_ACTION__, sendError: e.__DD_SEND_ERROR__ }; } function C(e = {}) { if (l) return _; l = !0, o = { ...T, ...e }, i = O(o.storageKey); const n = globalThis; return n.__DD_ENQUEUE_ACTION__ = D, n.__DD_ENQUEUE_ERROR__ = S, window.addEventListener("online", u), document.addEventListener("visibilitychange", w), o.flushOnInit && u(), _; } function _() { if (!l) return; l = !1; const e = globalThis; delete e.__DD_ENQUEUE_ACTION__, delete e.__DD_ENQUEUE_ERROR__, window.removeEventListener("online", u), document.removeEventListener("visibilitychange", w); } function w() { document.visibilityState === "visible" && u(); } function D(e, n, r) { if (navigator.onLine) { const { sendAction: t } = f(); if (t) return t(e, n, r); } b({ t: "a", n: e, a: n, s: r, ts: Date.now() }); } function S(e, n, r) { if (navigator.onLine) { const { sendError: t } = f(); if (t) return t(A(e), n, r); } b({ t: "e", e: L(e), c: n, s: r, ts: Date.now() }); } function b(e) { i.push(e), i.length > o.maxBuffered && i.splice(0, i.length - o.maxBuffered), v(), N(); } function N() { c == null && (c = setTimeout(() => { c = null, p(o.storageKey, i); }, o.writeDebounceMs)); } function u() { if (!navigator.onLine || i.length === 0) return; const { sendAction: e, sendError: n } = f(); if (!e || !n) return; const r = i.slice(); for (const t of r) { try { t.t === "a" ? e(t.n, t.a, t.s) : n(U(t.e), t.c, t.s); } catch { break; } i.shift(); } p(o.storageKey, i); } function O(e) { try { const n = localStorage.getItem(e); if (!n) return []; const r = JSON.parse(n); return Array.isArray(r) ? r.filter((t) => t && (t.t === "a" || t.t === "e")) : []; } catch { return []; } } function p(e, n) { try { localStorage.setItem(e, JSON.stringify(n)); } catch { if (n.length > 0) { n.splice(0, Math.ceil(n.length * 0.2)); try { localStorage.setItem(e, JSON.stringify(n)); } catch { } } } } function v() { try { let e = JSON.stringify(i); if (e.length <= o.byteCap) return; for (; i.length && e.length > o.byteCap; ) i.splice(0, Math.max(1, Math.floor(i.length * 0.1))), e = JSON.stringify(i); } catch { i = []; } } function A(e) { if (e instanceof Error) return e; try { return new Error(typeof e == "string" ? e : JSON.stringify(e)); } catch { return new Error("Unknown error"); } } function L(e) { if (e instanceof Error) return JSON.stringify({ n: e.name, m: e.message, s: e.stack }); try { return JSON.stringify(e); } catch { return '"Unknown error"'; } } function U(e) { try { const n = JSON.parse(e); if (n && typeof n == "object" && ("m" in n || "message" in n)) { const r = new Error(n.m ?? n.message ?? "Error"); return n.n && (r.name = n.n), n.s && (r.stack = n.s), r; } return new Error(typeof n == "string" ? n : "Error"); } catch { return new Error("Error"); } } export { C as a, R as i }; //# sourceMappingURL=offlineQueue.persistent-DZcxiWrK.js.map