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
JavaScript
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