mk9-prebid
Version:
Header Bidding Management Library
239 lines (214 loc) • 6.88 kB
JavaScript
import * as utils from '../src/utils.js';
import {config} from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER} from '../src/mediaTypes.js';
import {getRefererInfo} from '../src/refererDetection.js';
const BIDDER_CODE = 'kobler';
const BIDDER_ENDPOINT = 'https://bid.essrtb.com/bid/prebid_rtb_call';
const TIMEOUT_NOTIFICATION_ENDPOINT = 'https://bid.essrtb.com/notify/prebid_timeout';
const SUPPORTED_CURRENCY = 'USD';
const DEFAULT_TIMEOUT = 1000;
const TIME_TO_LIVE_IN_SECONDS = 10 * 60;
export const isBidRequestValid = function (bid) {
return !!(bid && bid.bidId && bid.params && bid.params.placementId);
};
export const buildRequests = function (validBidRequests, bidderRequest) {
return {
method: 'POST',
url: BIDDER_ENDPOINT,
data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest),
options: {
contentType: 'application/json'
}
};
};
export const interpretResponse = function (serverResponse) {
const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
const res = serverResponse.body;
const bids = []
if (res) {
res.seatbid.forEach(sb => {
sb.bid.forEach(b => {
const adWithCorrectCurrency = b.adm
.replace(/\${AUCTION_PRICE_CURRENCY}/g, adServerPriceCurrency);
bids.push({
requestId: b.impid,
cpm: b.price,
currency: res.cur,
width: b.w,
height: b.h,
creativeId: b.crid,
dealId: b.dealid,
netRevenue: true,
ttl: TIME_TO_LIVE_IN_SECONDS,
ad: adWithCorrectCurrency,
nurl: b.nurl,
meta: {
advertiserDomains: b.adomain
}
})
})
});
}
return bids;
};
export const onBidWon = function (bid) {
const cpm = bid.cpm || 0;
const cpmCurrency = bid.currency || SUPPORTED_CURRENCY;
const adServerPrice = utils.deepAccess(bid, 'adserverTargeting.hb_pb', 0);
const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
if (utils.isStr(bid.nurl) && bid.nurl !== '') {
const winNotificationUrl = utils.replaceAuctionPrice(bid.nurl, cpm)
.replace(/\${AUCTION_PRICE_CURRENCY}/g, cpmCurrency)
.replace(/\${AD_SERVER_PRICE}/g, adServerPrice)
.replace(/\${AD_SERVER_PRICE_CURRENCY}/g, adServerPriceCurrency);
utils.triggerPixel(winNotificationUrl);
}
};
export const onTimeout = function (timeoutDataArray) {
if (utils.isArray(timeoutDataArray)) {
const refererInfo = getRefererInfo();
const pageUrl = (refererInfo && refererInfo.referer)
? refererInfo.referer
: window.location.href;
timeoutDataArray.forEach(timeoutData => {
const query = utils.parseQueryStringParameters({
ad_unit_code: timeoutData.adUnitCode,
auction_id: timeoutData.auctionId,
bid_id: timeoutData.bidId,
timeout: timeoutData.timeout,
placement_id: utils.deepAccess(timeoutData, 'params.0.placementId'),
page_url: pageUrl,
});
const timeoutNotificationUrl = `${TIMEOUT_NOTIFICATION_ENDPOINT}?${query}`;
utils.triggerPixel(timeoutNotificationUrl);
});
}
};
function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
const imps = validBidRequests.map(buildOpenRtbImpObject);
const timeout = bidderRequest.timeout || config.getConfig('bidderTimeout') || DEFAULT_TIMEOUT;
const pageUrl = (bidderRequest.refererInfo && bidderRequest.refererInfo.referer)
? bidderRequest.refererInfo.referer
: window.location.href;
const request = {
id: bidderRequest.auctionId,
at: 1,
tmax: timeout,
cur: [SUPPORTED_CURRENCY],
imp: imps,
device: {
devicetype: getDevice(),
geo: getGeo(validBidRequests[0])
},
site: {
page: pageUrl,
},
test: getTest(validBidRequests[0])
};
return JSON.stringify(request);
}
function buildOpenRtbImpObject(validBidRequest) {
const sizes = getSizes(validBidRequest);
const mainSize = sizes[0];
const floorInfo = getFloorInfo(validBidRequest, mainSize);
return {
id: validBidRequest.bidId,
banner: {
format: buildFormatArray(sizes),
w: mainSize[0],
h: mainSize[1],
ext: {
kobler: {
pos: getPosition(validBidRequest)
}
}
},
tagid: validBidRequest.params.placementId,
bidfloor: floorInfo.floor,
bidfloorcur: floorInfo.currency,
pmp: buildPmpObject(validBidRequest)
};
}
function getDevice() {
const ws = utils.getWindowSelf();
const ua = ws.navigator.userAgent;
if (/(tablet|ipad|playbook|silk|android 3.0|xoom|sch-i800|kindle)|(android(?!.*mobi))/i
.test(ua.toLowerCase())) {
return 5; // tablet
}
if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i
.test(ua.toLowerCase())) {
return 4; // phone
}
return 2; // personal computers
}
function getGeo(validBidRequest) {
if (validBidRequest.params.zip) {
return {
zip: validBidRequest.params.zip
};
}
return {};
}
function getTest(validBidRequest) {
return validBidRequest.params.test ? 1 : 0;
}
function getSizes(validBidRequest) {
const sizes = utils.deepAccess(validBidRequest, 'mediaTypes.banner.sizes', validBidRequest.sizes);
if (utils.isArray(sizes) && sizes.length > 0) {
return sizes;
}
return [[0, 0]];
}
function buildFormatArray(sizes) {
return sizes.map(size => {
return {
w: size[0],
h: size[1]
};
});
}
function getPosition(validBidRequest) {
return parseInt(validBidRequest.params.position) || 0;
}
function getFloorInfo(validBidRequest, mainSize) {
if (typeof validBidRequest.getFloor === 'function') {
const sizeParam = mainSize[0] === 0 && mainSize[1] === 0 ? '*' : mainSize;
return validBidRequest.getFloor({
currency: SUPPORTED_CURRENCY,
mediaType: BANNER,
size: sizeParam
});
} else {
return {
currency: SUPPORTED_CURRENCY,
floor: getFloorPrice(validBidRequest)
};
}
}
function getFloorPrice(validBidRequest) {
return parseFloat(validBidRequest.params.floorPrice) || 0.0;
}
function buildPmpObject(validBidRequest) {
if (validBidRequest.params.dealIds) {
return {
deals: validBidRequest.params.dealIds.map(dealId => {
return {
id: dealId
};
})
};
}
return {};
}
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [BANNER],
isBidRequestValid,
buildRequests,
interpretResponse,
onBidWon,
onTimeout
};
registerBidder(spec);