mk9-prebid
Version:
Header Bidding Management Library
184 lines (171 loc) • 6.79 kB
JavaScript
import { ajax } from '../src/ajax.js';
import adapter from '../src/AnalyticsAdapter.js';
import adapterManager from '../src/adapterManager.js';
import CONSTANTS from '../src/constants.json';
import * as utils from '../src/utils.js';
const emptyUrl = '';
const analyticsType = 'endpoint';
const pubxaiAnalyticsVersion = 'v1.1.0';
const defaultHost = 'api.pbxai.com';
const auctionPath = '/analytics/auction';
const winningBidPath = '/analytics/bidwon';
let initOptions;
let auctionTimestamp;
let auctionCache = [];
let events = {
bids: [],
floorDetail: {},
pageDetail: {},
deviceDetail: {}
};
var pubxaiAnalyticsAdapter = Object.assign(adapter(
{
emptyUrl,
analyticsType
}), {
track({ eventType, args }) {
if (typeof args !== 'undefined') {
if (eventType === CONSTANTS.EVENTS.BID_TIMEOUT) {
args.forEach(item => { mapBidResponse(item, 'timeout'); });
} else if (eventType === CONSTANTS.EVENTS.AUCTION_INIT) {
events.auctionInit = args;
events.floorDetail = {};
events.bids = [];
const floorData = utils.deepAccess(args, 'bidderRequests.0.bids.0.floorData');
if (typeof floorData !== 'undefined') {
Object.assign(events.floorDetail, floorData);
}
auctionTimestamp = args.timestamp;
} else if (eventType === CONSTANTS.EVENTS.BID_RESPONSE) {
mapBidResponse(args, 'response');
} else if (eventType === CONSTANTS.EVENTS.BID_WON) {
send({
winningBid: mapBidResponse(args, 'bidwon')
}, 'bidwon');
}
}
if (eventType === CONSTANTS.EVENTS.AUCTION_END) {
send(events, 'auctionEnd');
}
}
});
function mapBidResponse(bidResponse, status) {
if (typeof bidResponse !== 'undefined') {
let bid = {
adUnitCode: bidResponse.adUnitCode,
gptSlotCode: utils.getGptSlotInfoForAdUnitCode(bidResponse.adUnitCode).gptSlot || null,
auctionId: bidResponse.auctionId,
bidderCode: bidResponse.bidder,
cpm: bidResponse.cpm,
creativeId: bidResponse.creativeId,
currency: bidResponse.currency,
floorData: bidResponse.floorData,
mediaType: bidResponse.mediaType,
netRevenue: bidResponse.netRevenue,
requestTimestamp: bidResponse.requestTimestamp,
responseTimestamp: bidResponse.responseTimestamp,
status: bidResponse.status,
statusMessage: bidResponse.statusMessage,
timeToRespond: bidResponse.timeToRespond,
transactionId: bidResponse.transactionId
};
if (status !== 'bidwon') {
Object.assign(bid, {
bidId: status === 'timeout' ? bidResponse.bidId : bidResponse.requestId,
renderStatus: status === 'timeout' ? 3 : 2,
sizes: utils.parseSizesInput(bidResponse.size).toString(),
});
events.bids.push(bid);
} else {
Object.assign(bid, {
bidId: bidResponse.requestId,
floorProvider: events.floorDetail ? events.floorDetail.floorProvider : null,
isWinningBid: true,
placementId: bidResponse.params ? utils.deepAccess(bidResponse, 'params.0.placementId') : null,
renderedSize: bidResponse.size,
renderStatus: 4
});
return bid;
}
}
}
export function getDeviceType() {
if ((/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase()))) {
return 'tablet';
}
if ((/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase()))) {
return 'mobile';
}
return 'desktop';
}
export function getBrowser() {
if (/Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)) return 'Chrome';
else if (navigator.userAgent.match('CriOS')) return 'Chrome';
else if (/Firefox/.test(navigator.userAgent)) return 'Firefox';
else if (/Edg/.test(navigator.userAgent)) return 'Microsoft Edge';
else if (/Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor)) return 'Safari';
else if (/Trident/.test(navigator.userAgent) || /MSIE/.test(navigator.userAgent)) return 'Internet Explorer';
else return 'Others';
}
export function getOS() {
if (navigator.userAgent.indexOf('Android') != -1) return 'Android';
if (navigator.userAgent.indexOf('like Mac') != -1) return 'iOS';
if (navigator.userAgent.indexOf('Win') != -1) return 'Windows';
if (navigator.userAgent.indexOf('Mac') != -1) return 'Macintosh';
if (navigator.userAgent.indexOf('Linux') != -1) return 'Linux';
if (navigator.appVersion.indexOf('X11') != -1) return 'Unix';
return 'Others';
}
// add sampling rate
pubxaiAnalyticsAdapter.shouldFireEventRequest = function (samplingRate = 1) {
return (Math.floor((Math.random() * samplingRate + 1)) === parseInt(samplingRate));
}
function send(data, status) {
if (pubxaiAnalyticsAdapter.shouldFireEventRequest(initOptions.samplingRate)) {
let location = utils.getWindowLocation();
data.initOptions = initOptions;
if (typeof data !== 'undefined' && typeof data.auctionInit !== 'undefined') {
Object.assign(data.pageDetail, {
host: location.host,
path: location.pathname,
search: location.search,
adUnitCount: data.auctionInit.adUnitCodes ? data.auctionInit.adUnitCodes.length : null
});
data.initOptions.auctionId = data.auctionInit.auctionId;
delete data.auctionInit;
}
data.deviceDetail = {};
Object.assign(data.deviceDetail, {
platform: navigator.platform,
deviceType: getDeviceType(),
deviceOS: getOS(),
browser: getBrowser()
});
let pubxaiAnalyticsRequestUrl = utils.buildUrl({
protocol: 'https',
hostname: (initOptions && initOptions.hostName) || defaultHost,
pathname: status == 'bidwon' ? winningBidPath : auctionPath,
search: {
auctionTimestamp: auctionTimestamp,
pubxaiAnalyticsVersion: pubxaiAnalyticsVersion,
prebidVersion: $$PREBID_GLOBAL$$.version
}
});
if (status == 'bidwon') {
ajax(pubxaiAnalyticsRequestUrl, undefined, JSON.stringify(data), { method: 'POST', contentType: 'text/json' });
} else if (status == 'auctionEnd' && auctionCache.indexOf(data.initOptions.auctionId) === -1) {
ajax(pubxaiAnalyticsRequestUrl, undefined, JSON.stringify(data), { method: 'POST', contentType: 'text/json' });
auctionCache.push(data.initOptions.auctionId);
}
}
}
pubxaiAnalyticsAdapter.originEnableAnalytics = pubxaiAnalyticsAdapter.enableAnalytics;
pubxaiAnalyticsAdapter.enableAnalytics = function (config) {
initOptions = config.options;
pubxaiAnalyticsAdapter.originEnableAnalytics(config);
};
adapterManager.registerAnalyticsAdapter({
adapter: pubxaiAnalyticsAdapter,
code: 'pubxai'
});
export default pubxaiAnalyticsAdapter;