web-vitals-reporter
Version:
Report Web Vitals to your API with one POST request per session
2 lines (1 loc) • 1.98 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).webVitalsReporter={})}(this,function(e){function n(){return(n=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e}).apply(this,arguments)}function t(e,n){return void 0===n&&(n=0),+(Math.round(e+"e+"+n)+"e-"+n)}e.createApiReporter=function(e,r){void 0===r&&(r={});var o=!1,i=!1,a=n({id:"v1-"+Date.now()+"-"+(Math.floor(8999999999999*Math.random())+1e12)},r.initial),f=function(){if(!o&&i){var f;if(a.duration=(f="undefined"==typeof performance?null:performance)&&f.now?t(f.now()):null,r.beforeSend){var u=r.beforeSend(a);u&&(a=n({},a,u))}if(o=!0,r.onSend)r.onSend(e,a);else{if("undefined"==typeof navigator)return;if(navigator.sendBeacon)return navigator.sendBeacon(e,JSON.stringify(a));var c=new XMLHttpRequest;c.open("POST",e,!1),c.setRequestHeader("Content-Type","text/plain;charset=UTF-8"),c.send(JSON.stringify(a))}}},u=r.mapMetric||function(e){var n,r=-1!==["FCP","TTFB","LCP","CLS","FID"].indexOf(e.name);return(n={})[e.name]=r?t(e.value,"CLS"===e.name?4:0):e.value,n};return setTimeout(function(){-1!==(PerformanceObserver&&PerformanceObserver.supportedEntryTypes||[]).indexOf("layout-shift")?addEventListener("visibilitychange",function e(){"hidden"===document.visibilityState&&(f(),removeEventListener("visibilitychange",e,!0))},!0):addEventListener("pagehide",f,{capture:!0,once:!0})}),function(e){i||(i=!0),a=n({},a,u(e,a))}},e.getDeviceInfo=function(){var e="undefined"==typeof navigator?null:navigator,n=e&&e.connection?e.connection:null;return{url:location?location.href:null,referrer:document?document.referrer:null,userAgent:e?e.userAgent:null,memory:e?e.deviceMemory:void 0,cpus:e?e.hardwareConcurrency:void 0,connection:n?{effectiveType:n.effectiveType,rtt:n.rtt,downlink:n.downlink}:void 0}}});