UNPKG

@damjack/elm-newrelic-nreum.js

Version:

Typescript library to wrap NewRelic NREUM for elm-newrelic-nreum Elm package

252 lines (245 loc) 8.72 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var browserAgent = require('@newrelic/browser-agent'); /** * Try to initialize NREUM * * @param nreumOptions - The NREUM Options */ /* eslint-disable import/prefer-default-export */ const init = (nreumOptions) => { const defaults = { beacon: 'bam-cell.nr-data.net', errorBeacon: 'bam-cell.nr-data.net', privacy: { cookiesEnabled: true, }, sa: 1, }; /* eslint-disable @typescript-eslint/no-unsafe-assignment */ const optionApplication = { ...defaults, ...nreumOptions }; if (!window.NRAGENT) { window.NRAGENT = {}; } /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ window.NRAGENT = new browserAgent.BrowserAgent(); window.NRAGENT.start(optionApplication).then(() => { console.log('Browser Agent Initialized!'); }); }; /** * Try to track routing path name to RUM * * @param payload - Custom Payload for current tracking * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ const routeName = (payload, console = false) => { if (!console) { if ('NREUM' in window) { /* eslint-disable @typescript-eslint/no-unsafe-call */ window.NREUM.setCurrentRouteName(payload.routeName); // eslint-disable-line no-undef } } else { window.console.log('routeName: ', payload); } }; /** * Try to track Global Context to RUM * * @param payload - Custom Payload for current tracking * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ const addPageAction = (payload, console = false) => { if (!console) { if ('NREUM' in window) { /* eslint-disable @typescript-eslint/no-unsafe-call */ window.NREUM.addPageAction(payload.actionName, payload.additionalData); // eslint-disable-line no-undef } } else { window.console.log('pageAction: ', payload); } }; /** * Try to track Custom Action to RUM * * @param payload - Custom Payload for current tracking * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ const interaction = (payload, console = false) => { if (!console) { if ('NREUM' in window) { /* eslint-disable @typescript-eslint/no-unsafe-call */ const interaction = window.NREUM.interaction(); // eslint-disable-line @typescript-eslint/no-unsafe-assignment if (payload.interactionMessage !== undefined) { interaction.actionText(payload.interactionMessage); } interaction.setName(payload.interactionName); payload.additionalData.forEach((attr) => { interaction.setAttribute(attr.key, attr.value); }); interaction.save().end(); } } else { window.console.log('interaction: ', payload); } }; /** * Try to track error to RUM * * @param payload - Custom Payload for current tracking * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ const noticeError = (payload, console = false) => { if (!console) { if ('NREUM' in window) { /* eslint-disable no-undef */ /* eslint-disable @typescript-eslint/no-unsafe-call */ window.NREUM.noticeError(new Error(`${payload.errorPrefix}: ${payload.errorStackTrace}`), payload.additionalData); } if ('NRAGENT' in window) { /* eslint-disable no-undef */ /* eslint-disable @typescript-eslint/no-unsafe-call */ window.NRAGENT.noticeError(new Error(`${payload.errorPrefix}: ${payload.errorStackTrace}`), payload.additionalData); } } else { window.console.log('noticeError: ', payload); } }; /** * Try to identify User to RUM * * @param payload - Custom Payload for current tracking * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ const addRelease = (payload, console = false) => { if (!console) { if ('NREUM' in window) { /* eslint-disable @typescript-eslint/no-unsafe-call */ window.NREUM.addRelease(payload.releaseName, payload.releaseVersion); // eslint-disable-line no-undef } } else { window.console.log('addRelease: ', payload); } }; /** * Try to track SCP error to RUM & Session Replay * * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ const cspEvent = (console = false) => { if (typeof window !== 'object') { // does not appear to be a browser environment throw new Error('This code is only meant to run in a browser environment'); } if ('SecurityPolicyViolationEvent' in window) { window.document.addEventListener('securitypolicyviolation', (e) => { const obj = { blockedURI: e.blockedURI, effectiveDirective: e.effectiveDirective, message: 'SecurityPolicyViolationEvent @CSP', originalPolicy: e.originalPolicy, url: document.location.pathname, violatedDirective: e.violatedDirective, }; noticeError({ additionalData: obj, errorPrefix: 'csp_violation', errorStackTrace: `${e.blockedURI} blocked by ${e.violatedDirective} directive`, type_: 'notice_error', }, console); }); } }; /** * After initialize NREUM and ELM App, you can push MSG to JS and try to read * * @param elmApp - Current Elm Application * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-call */ const elmPortsToJS = (elmApp, console = false) => { if (typeof window !== 'object') { // does not appear to be a browser environment throw new Error('This code is only meant to run in a browser environment'); } if (elmApp.ports.routeNamePort_ !== undefined) { elmApp.ports.routeNamePort_.subscribe((payload) => { routeName(payload, console); }); } if (elmApp.ports.interactionPort_ !== undefined) { elmApp.ports.interactionPort_.subscribe((payload) => { interaction(payload, console); }); } if (elmApp.ports.noticeErrorPort_ !== undefined) { elmApp.ports.noticeErrorPort_.subscribe((payload) => { noticeError(payload, console); }); } if (elmApp.ports.addPageActionPort_ !== undefined) { elmApp.ports.addPageActionPort_.subscribe((payload) => { addPageAction(payload, console); }); } if (elmApp.ports.addReleasePort_ !== undefined) { elmApp.ports.addReleasePort_.subscribe((payload) => { addRelease(payload, console); }); } }; /** * Alternative method with you can push MSG to JS * * @param elmApp - Current Elm Application * @param console - Enable console log, default false */ /* eslint-disable @typescript-eslint/no-unsafe-call */ const elmUniquePortToJS = (elmApp, console = false) => { if (typeof window !== 'object') { // does not appear to be a browser environment throw new Error('This code is only meant to run in a browser environment'); } if (elmApp.ports.nreumPort_ !== undefined) { elmApp.ports.nreumPort_.subscribe((payload) => { switch (payload.type_) { case 'route_name': routeName(payload, console); break; case 'interaction': interaction(payload, console); break; case 'page_action': addPageAction(payload, console); break; case 'notice_error': noticeError(payload, console); break; case 'release': addRelease(payload, console); break; } }); } }; exports.addPageAction = addPageAction; exports.addRelease = addRelease; exports.cspEvent = cspEvent; exports.elmPortsToJS = elmPortsToJS; exports.elmUniquePortToJS = elmUniquePortToJS; exports.init = init; exports.interaction = interaction; exports.noticeError = noticeError; exports.routeName = routeName;