mk9-prebid
Version:
Header Bidding Management Library
293 lines (247 loc) • 8.24 kB
JavaScript
/* Sigmoid Analytics Adapter for prebid.js v1.1.0-pre
Updated : 2018-03-28 */
import includes from 'core-js-pure/features/array/includes.js';
import adapter from '../src/AnalyticsAdapter.js';
import CONSTANTS from '../src/constants.json';
import adapterManager from '../src/adapterManager.js';
import { getStorageManager } from '../src/storageManager.js';
const storage = getStorageManager();
const utils = require('../src/utils.js');
const url = 'https://kinesis.us-east-1.amazonaws.com/';
const analyticsType = 'endpoint';
const auctionInitConst = CONSTANTS.EVENTS.AUCTION_INIT;
const auctionEndConst = CONSTANTS.EVENTS.AUCTION_END;
const bidWonConst = CONSTANTS.EVENTS.BID_WON;
const bidRequestConst = CONSTANTS.EVENTS.BID_REQUESTED;
const bidAdjustmentConst = CONSTANTS.EVENTS.BID_ADJUSTMENT;
const bidResponseConst = CONSTANTS.EVENTS.BID_RESPONSE;
let initOptions = { publisherIds: [], utmTagData: [], adUnits: [] };
let bidWon = {options: {}, events: []};
let eventStack = {options: {}, events: []};
let auctionStatus = 'not_started';
let localStoragePrefix = 'sigmoid_analytics_';
let utmTags = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
let utmTimeoutKey = 'utm_timeout';
let utmTimeout = 60 * 60 * 1000;
let sessionTimeout = 60 * 60 * 1000;
let sessionIdStorageKey = 'session_id';
let sessionTimeoutKey = 'session_timeout';
function getParameterByName(param) {
let vars = {};
window.location.href.replace(location.hash, '').replace(
/[?&]+([^=&]+)=?([^&]*)?/gi,
function(m, key, value) {
vars[key] = value !== undefined ? value : '';
}
);
return vars[param] ? vars[param] : '';
}
function buildSessionIdLocalStorageKey() {
return localStoragePrefix.concat(sessionIdStorageKey);
}
function buildSessionIdTimeoutLocalStorageKey() {
return localStoragePrefix.concat(sessionTimeoutKey);
}
function updateSessionId() {
if (isSessionIdTimeoutExpired()) {
let newSessionId = utils.generateUUID();
storage.setDataInLocalStorage(buildSessionIdLocalStorageKey(), newSessionId);
}
initOptions.sessionId = getSessionId();
updateSessionIdTimeout();
}
function updateSessionIdTimeout() {
storage.setDataInLocalStorage(buildSessionIdTimeoutLocalStorageKey(), Date.now());
}
function isSessionIdTimeoutExpired() {
let cpmSessionTimestamp = storage.getDataFromLocalStorage(buildSessionIdTimeoutLocalStorageKey());
return Date.now() - cpmSessionTimestamp > sessionTimeout;
}
function getSessionId() {
return storage.getDataFromLocalStorage(buildSessionIdLocalStorageKey()) ? storage.getDataFromLocalStorage(buildSessionIdLocalStorageKey()) : '';
}
function updateUtmTimeout() {
storage.setDataInLocalStorage(buildUtmLocalStorageTimeoutKey(), Date.now());
}
function isUtmTimeoutExpired() {
let utmTimestamp = storage.getDataFromLocalStorage(buildUtmLocalStorageTimeoutKey());
return (Date.now() - utmTimestamp) > utmTimeout;
}
function buildUtmLocalStorageTimeoutKey() {
return localStoragePrefix.concat(utmTimeoutKey);
}
function buildUtmLocalStorageKey(utmMarkKey) {
return localStoragePrefix.concat(utmMarkKey);
}
function checkOptions() {
if (typeof initOptions.publisherIds === 'undefined') {
return false;
}
return initOptions.publisherIds.length > 0;
}
function checkAdUnitConfig() {
if (typeof initOptions.adUnits === 'undefined') {
return false;
}
return initOptions.adUnits.length > 0;
}
function buildBidWon(eventType, args) {
bidWon.options = initOptions;
if (checkAdUnitConfig()) {
if (includes(initOptions.adUnits, args.adUnitCode)) {
bidWon.events = [{ args: args, eventType: eventType }];
}
} else {
bidWon.events = [{ args: args, eventType: eventType }];
}
}
function buildEventStack() {
eventStack.options = initOptions;
}
function filterBidsByAdUnit(bids) {
var filteredBids = [];
bids.forEach(function (bid) {
if (includes(initOptions.adUnits, bid.placementCode)) {
filteredBids.push(bid);
}
});
return filteredBids;
}
function isValidEvent(eventType, adUnitCode) {
if (checkAdUnitConfig()) {
let validationEvents = [bidAdjustmentConst, bidResponseConst, bidWonConst];
if (!includes(initOptions.adUnits, adUnitCode) && includes(validationEvents, eventType)) {
return false;
}
}
return true;
}
function isValidEventStack() {
if (eventStack.events.length > 0) {
return eventStack.events.some(function(event) {
return bidRequestConst === event.eventType || bidWonConst === event.eventType;
});
}
return false;
}
function isValidBidWon() {
return bidWon.events.length > 0;
}
function flushEventStack() {
eventStack.events = [];
}
let sigmoidAdapter = Object.assign(adapter({url, analyticsType}),
{
track({eventType, args}) {
if (!checkOptions()) {
return;
}
let info = Object.assign({}, args);
if (info && info.ad) {
info.ad = '';
}
if (eventType === auctionInitConst) {
auctionStatus = 'started';
}
if (eventType === bidWonConst && auctionStatus === 'not_started') {
updateSessionId();
buildBidWon(eventType, info);
if (isValidBidWon()) {
send(eventType, bidWon, 'bidWon');
}
return;
}
if (eventType === auctionEndConst) {
updateSessionId();
buildEventStack();
if (isValidEventStack()) {
send(eventType, eventStack, 'eventStack');
}
auctionStatus = 'not_started';
} else {
pushEvent(eventType, info);
}
},
});
sigmoidAdapter.originEnableAnalytics = sigmoidAdapter.enableAnalytics;
sigmoidAdapter.enableAnalytics = function (config) {
initOptions = config.options;
initOptions.utmTagData = this.buildUtmTagData();
utils.logInfo('Sigmoid Analytics enabled with config', initOptions);
sigmoidAdapter.originEnableAnalytics(config);
};
sigmoidAdapter.buildUtmTagData = function () {
let utmTagData = {};
let utmTagsDetected = false;
utmTags.forEach(function(utmTagKey) {
let utmTagValue = getParameterByName(utmTagKey);
if (utmTagValue !== '') {
utmTagsDetected = true;
}
utmTagData[utmTagKey] = utmTagValue;
});
utmTags.forEach(function(utmTagKey) {
if (utmTagsDetected) {
storage.setDataInLocalStorage(buildUtmLocalStorageKey(utmTagKey), utmTagData[utmTagKey]);
updateUtmTimeout();
} else {
if (!isUtmTimeoutExpired()) {
utmTagData[utmTagKey] = storage.getDataFromLocalStorage(buildUtmLocalStorageKey(utmTagKey)) ? storage.getDataFromLocalStorage(buildUtmLocalStorageKey(utmTagKey)) : '';
updateUtmTimeout();
}
}
});
return utmTagData;
};
function send(eventType, data, sendDataType) {
// eslint-disable-next-line no-undef
AWS.config.credentials = new AWS.Credentials({
accessKeyId: 'accesskey', secretAccessKey: 'secretkey'
});
// eslint-disable-next-line no-undef
AWS.config.region = 'us-east-1';
// eslint-disable-next-line no-undef
AWS.config.credentials.get(function(err) {
// attach event listener
if (err) {
utils.logError(err);
return;
}
// create kinesis service object
// eslint-disable-next-line no-undef
var kinesis = new AWS.Kinesis({
apiVersion: '2013-12-02'
});
var dataList = [];
var jsonData = {};
jsonData['Data'] = JSON.stringify(data) + '\n';
jsonData['PartitionKey'] = 'partition-' + Math.random().toString(36).substring(7);
dataList.push(jsonData);
kinesis.putRecords({
Records: dataList,
StreamName: 'sample-stream'
});
if (sendDataType === 'eventStack') {
flushEventStack();
}
});
};
function pushEvent(eventType, args) {
if (eventType === bidRequestConst) {
if (checkAdUnitConfig()) {
args.bids = filterBidsByAdUnit(args.bids);
}
if (args.bids.length > 0) {
eventStack.events.push({ eventType: eventType, args: args });
}
} else {
if (isValidEvent(eventType, args.adUnitCode)) {
eventStack.events.push({ eventType: eventType, args: args });
}
}
}
adapterManager.registerAnalyticsAdapter({
adapter: sigmoidAdapter,
code: 'sigmoid'
});
export default sigmoidAdapter;