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.
3 lines (2 loc) • 5.72 kB
JavaScript
;const L=require("./datadog-DV4lp5AO.cjs"),z=require("@datadog/browser-rum"),_=require("./config-ByuBXTv9.cjs"),c=require("web-vitals");let u=null,v=!1,a;function V(e={}){a={idleAfterMs:e.idleAfterMs??6e4,reportToDatadog:e.reportToDatadog??!0,onChange:e.onChange??(()=>{})};const t=()=>{v&&(v=!1,a.onChange(!1),a.reportToDatadog),u&&clearTimeout(u),u=setTimeout(()=>{v=!0,a.onChange(!0),a.reportToDatadog&&L.safeAddAction("user_idle",{idleAfterMs:a.idleAfterMs})},a.idleAfterMs)},n=["mousemove","keydown","mousedown","touchstart"];return n.forEach(r=>window.addEventListener(r,t,{passive:!0})),document.addEventListener("visibilitychange",()=>{document.hidden||t()}),t(),()=>{u&&(clearTimeout(u),u=null),n.forEach(r=>window.removeEventListener(r,t)),document.removeEventListener("visibilitychange",t)}}function N(){return v}let T=0,f=null,S;function j(e={}){if(typeof window>"u"||typeof PerformanceObserver>"u")return()=>{};S={reportToDatadog:e.reportToDatadog??!0,onChange:e.onChange??(()=>{})};try{f=new PerformanceObserver(t=>{for(const n of t.getEntries())n.hadRecentInput||(T+=n.value,S.onChange(T,n),S.reportToDatadog&&L.safeAddAction("layout_shift",{clsValue:T,value:n.value,sources:n.sources?.map(r=>r.node?.nodeName)}))}),f.observe({type:"layout-shift",buffered:!0})}catch{}return()=>{f&&(f.disconnect(),f=null)}}function F(){return T}let m=null;const q=()=>{if(!(!_.getUxConfig().captureLongTasks||m||!("PerformanceObserver"in window))){m=new PerformanceObserver(t=>{for(const n of t.getEntries())n.duration>=100&&z.datadogRum.addAction("long_task",{name:n.name,duration_ms:Math.round(n.duration),startTime:Math.round(n.startTime)})});try{m.observe({type:"longtask",buffered:!0})}catch{}}},x=()=>{m?.disconnect(),m=null};let p=null,y;function A(){const e=performance;if(e&&e.memory){const{usedJSHeapSize:t,totalJSHeapSize:n,jsHeapSizeLimit:r}=e.memory;return{usedJSHeapSize:t,totalJSHeapSize:n,jsHeapSizeLimit:r}}return null}function W(e={}){if(typeof window>"u")return()=>{};y={intervalMs:e.intervalMs??1e4,reportToDatadog:e.reportToDatadog??!0,onChange:e.onChange??(()=>{})},p!==null&&M();const t=()=>{const n=A();n&&(y.onChange(n),y.reportToDatadog&&L.safeAddAction("memory_usage",{usedJSHeapSize:n.usedJSHeapSize,totalJSHeapSize:n.totalJSHeapSize,jsHeapSizeLimit:n.jsHeapSizeLimit}))};return t(),p=window.setInterval(t,y.intervalMs),M}function M(){p!==null&&(clearInterval(p),p=null)}const H={mode:"onHide",intervalMs:6e4,reportToDatadog:!0,actionName:"memory_peak",onNewPeak:()=>{}};let o=null,w=!1,i=H,h=null,b=0;function K(e={}){return w||(w=!0,i={...H,...e},d(),i.mode==="onHide"?(window.addEventListener("visibilitychange",B,{passive:!0}),window.addEventListener("pagehide",D,{passive:!0}),window.addEventListener("beforeunload",U,{passive:!0})):i.mode==="interval"&&(h=window.setInterval(g,Math.max(15e3,i.intervalMs))),window.addEventListener("resize",k,{passive:!0}),window.addEventListener("focus",k,{passive:!0})),P}function P(){w&&(w=!1,window.removeEventListener("visibilitychange",B),window.removeEventListener("pagehide",D),window.removeEventListener("beforeunload",U),window.removeEventListener("resize",k),window.removeEventListener("focus",k),h!=null&&(clearInterval(h),h=null))}function $(){return o?{...o}:null}function g(){if(!o||!i.reportToDatadog)return;const e=Date.now();if(!(e-b<1e4)){b=e;try{L.safeAddAction(i.actionName,{peakUsedBytes:o.peakUsedBytes,peakTotalBytes:o.peakTotalBytes,peakLimitBytes:o.peakLimitBytes,at:o.at,peakUsedMB:X(o.peakUsedBytes)})}catch{}}}function G(){o=null,b=0}function Q(){const t=performance?.memory;if(!t)return null;const{usedJSHeapSize:n,totalJSHeapSize:r,jsHeapSizeLimit:l}=t;return typeof n!="number"||n<=0?null:{usedJSHeapSize:n,totalJSHeapSize:r,jsHeapSizeLimit:l}}function d(){const e=Q();if(e&&(!o||e.usedJSHeapSize>o.peakUsedBytes)){o={peakUsedBytes:e.usedJSHeapSize,peakTotalBytes:e.totalJSHeapSize,peakLimitBytes:e.jsHeapSizeLimit,at:Date.now()};try{i.onNewPeak(o)}catch{}}}function k(){d()}function B(){document.visibilityState==="hidden"?(d(),g()):d()}function D(){d(),g()}function U(){d(),g()}function X(e){return Math.round(e/(1024*1024)*100)/100}const I=e=>{if(!("performance"in window)||!performance.getEntriesByType)return;const t=_.getUxConfig(),n=e?.sizeKbThreshold??250,r=e?.durationMsThreshold??2e3,l=e?.sampleRate??t.actionSampleRate,O=performance.getEntriesByType("resource");for(const s of O){if(s.name.startsWith("data:")||s.transferSize===0)continue;const C=Math.round(s.transferSize/1024),E=Math.round(s.duration),R=C>=n,J=E>=r;(R||J)&&Z("resource_perf_issue",{url:s.name,initiatorType:s.initiatorType,size_kb:C,duration_ms:E,large_threshold_kb:n,slow_threshold_ms:r},l)}},Y=(e=3e3,t)=>{setTimeout(()=>I(t),e)},Z=(e,t,n)=>{Math.random()*100<n&&z.datadogRum.addAction(e,t)},ee=()=>{if(!_.getUxConfig().captureWebVitals)return;const e=(t,n,r={})=>z.datadogRum.addAction("web_vital",{name:t,value:n,...r});c.onCLS(({value:t})=>e("CLS",t)),c.onLCP(({value:t,entries:n})=>{const r=n?.[0],l=r&&"element"in r&&r.element?r.element.tagName:void 0;e("LCP",t,{element:l})}),c.onFCP(({value:t})=>e("FCP",t)),c.onINP(({value:t})=>e("INP",t)),c.onTTFB(({value:t})=>e("TTFB",t))};exports.getCLSValue=F;exports.getMemoryPeak=$;exports.getMemoryUsage=A;exports.isUserIdle=N;exports.registerWebVitals=ee;exports.reportLargeOrSlowResources=I;exports.reportMemoryPeak=g;exports.reportResourcesOnLoad=Y;exports.resetMemoryPeak=G;exports.startIdleTracker=V;exports.startLayoutShiftTracking=j;exports.startLongTaskObserver=q;exports.startMemoryPeakTracking=K;exports.startMemoryTracking=W;exports.stopLongTaskObserver=x;exports.stopMemoryPeakTracking=P;exports.stopMemoryTracking=M;
//# sourceMappingURL=webVitals-CZZDMzzU.cjs.map