@financial-times/o-ads
Version:
This package contains the core functionality used by the FT in providing ads across all of its sites. This includes ft.com, howtospendit.com, ftadviser.com and other specialist titles.
150 lines (121 loc) • 4.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.clearPerfMarks = clearPerfMarks;
exports.setupMetrics = setupMetrics;
exports.markPageChange = markPageChange;
var _index = _interopRequireDefault(require("./index.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function getMarksForEvents(events, suffix) {
var markNames = events.map(eventName => 'oAds.' + eventName + suffix);
if (!performance || !performance.getEntriesByName) {
/* istanbul ignore next */
return {};
}
var marks = {};
markNames.forEach(function (mName) {
var pMarks = performance.getEntriesByName(mName);
var markName = mName.replace('oAds.', '').replace(suffix, '');
if (pMarks && pMarks.length) {
// We don't need sub-millisecond precision
marks[markName] = Math.round(pMarks[0].startTime);
return;
} // If no mark has been found, we might be looking for a page-level
// mark name, i.e. one without a suffix
if (suffix) {
var mNameNoSuffix = mName.replace(suffix, '');
var pMarks2 = performance.getEntriesByName(mNameNoSuffix);
if (pMarks2 && pMarks2.length) {
marks[markName] = Math.round(pMarks2[0].startTime);
}
}
});
return marks;
}
function clearPerfMarks(metricsDefinitions, groupsToClear) {
if (!performance || !performance.getEntriesByType) {
return;
}
var relevantGroups = metricsDefinitions.filter(group => groupsToClear.includes(group.spoorAction));
var relevantGroupsMarks = relevantGroups.map(group => group.marks); // Because relevantGroupsMarks is a 2D array ...
var eventsToClear = [].concat(...relevantGroupsMarks);
var perfMarks = performance.getEntriesByType('mark');
perfMarks.forEach((_ref) => {
var {
name
} = _ref;
eventsToClear.forEach(eventName => {
if (name.match("oAds.".concat(eventName))) {
performance.clearMarks(name);
}
});
});
}
/* istanbul ignore next */
function getNavigationPerfMarks(desiredMarks) {
if (!performance || !performance.getEntriesByType || !_index.default.isArray(desiredMarks)) {
/* istanbul ignore next */
return {};
}
var navMarksArray = performance.getEntriesByType('navigation');
var navMarks = _index.default.isArray(navMarksArray) && navMarksArray[0] || {};
var marks = {};
desiredMarks.forEach(function (markName) {
marks[markName] = typeof navMarks[markName] === 'number' ? Math.round(navMarks[markName]) : 0;
});
return marks;
}
function setupMetrics(definitions, callback, disableSampling) {
if (!Array.isArray(definitions)) {
this.log.warn('Metrics definitions should be an array. o-Ads will not record any metrics.');
return;
}
definitions.forEach(function (eDef) {
if (disableSampling || _index.default.inSample(eDef.sampleSize)) {
var triggers = Array.isArray(eDef.triggers) ? eDef.triggers : [];
triggers.forEach(function (trigger) {
sendMetricsOnEvent('oAds.' + trigger, eDef, callback);
});
}
});
}
function sendMetricsOnEvent(eventName, eMarkMap, callback) {
document.addEventListener(eventName, function listenOnInitialised(event) {
sendMetrics(eMarkMap, event.detail, callback);
if (!eMarkMap.multiple) {
document.removeEventListener(eventName, listenOnInitialised);
}
});
}
function sendMetrics(eMarkMap, eventDetails, callback) {
var suffix = _index.default.buildPerfmarkSuffix(eventDetails);
var marks = getMarksForEvents(eMarkMap.marks, suffix);
if (eMarkMap.navigation) {
var navMarks = getNavigationPerfMarks(eMarkMap.navigation);
Object.assign(marks, navMarks);
}
var eventPayload = {
category: 'ads',
action: eMarkMap.spoorAction,
timings: {
marks: marks
}
};
if (eventDetails && 'pos' in eventDetails) {
eventPayload.creative = {
name: eventDetails.name,
pos: eventDetails.pos,
size: eventDetails.size && eventDetails.size.toString(),
creativeId: eventDetails.creativeId || 0
};
if (typeof eventDetails.isEmpty === 'boolean') {
eventPayload.creative.isEmpty = eventDetails.isEmpty;
}
}
callback(eventPayload);
}
function markPageChange(definitions, groupsToClear) {
clearPerfMarks(definitions, groupsToClear);
_index.default.broadcast('pageChange');
}