/** * @namespace javascripts.pushr.dispatchers.rum * @description Handles the pushr events for Real User Metrics */let allowedRumMetrics = ["ttfb", "networkInfo", "fcp", "fid", "lcp", "cls"]let rumMetricsCollected = []let rumObjects = []/** * If it is a rum event then push the rum data onto a new array for rum data. If the metric type isn't * one that is allow then we exit. If we have already collected it then we exit. * * @function pushrDispatcher * @memberof javascripts.pushr.dispatchers.rum */export const pushrDispatcher = (pushrObject) => { if (pushrObject.event !== "rum") return if (!allowedRumMetrics.some(metric => metric === pushrObject.data.metric)) return if (rumMetricsCollected.some(metric => metric === pushrObject.data.metric)) return rumMetricsCollected.push(pushrObject.data.metric) rumObjects.push(pushrObject.data)}/** * Dispatch any logs in rumObjects when the page is backgrounded or unloaded * * @function leavePageDispatcher * @memberof javascripts.pushr.dispatchers.rum */export const leavePageDispatcher = () => { const path = "/.netlify/functions/rum_logger-background/" const body = JSON.stringify(rumObjects) if (rumObjects.length) batchPostRumData(path, body) rumObjects = []}/** * When the rum data is sent, empty the rumObjects array to ensure the data is not sent again. Use * `navigator.sendBeacon()` if available, falling back to `fetch()`. * * @function batchPostRumData * @memberof javascripts.pushr.dispatchers.rum */const batchPostRumData = (path, body) => { (navigator.sendBeacon && navigator.sendBeacon(path, body)) || fetch(path, { body, method: "POST", keepalive: true })}