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