UNPKG

mk9-prebid

Version:

Header Bidding Management Library

182 lines (171 loc) 5.37 kB
import * as utils from '../src/utils.js'; import {config} from '../src/config.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; const BIDDER_CODE = 'etarget'; const countryMap = { 1: 'sk', 2: 'cz', 3: 'hu', 4: 'ro', 5: 'rs', 6: 'bg', 7: 'pl', 8: 'hr', 9: 'at', 10: 'co', 11: 'de', 255: 'en' } export const spec = { code: BIDDER_CODE, supportedMediaTypes: [ BANNER, VIDEO ], isBidRequestValid: function (bid) { return !!(bid.params.refid && bid.params.country); }, buildRequests: function (validBidRequests, bidderRequest) { var i, l, bid, reqParams, netRevenue, gdprObject; var request = []; var bids = JSON.parse(JSON.stringify(validBidRequests)); var lastCountry = 'sk'; var floors = []; for (i = 0, l = bids.length; i < l; i++) { bid = bids[i]; if (countryMap[bid.params.country]) { lastCountry = countryMap[bid.params.country]; } reqParams = bid.params; reqParams.transactionId = bid.transactionId; request.push(formRequestUrl(reqParams)); floors[i] = getBidFloor(bid); } request.unshift('https://' + lastCountry + '.search.etargetnet.com/hb/?hbget=1'); netRevenue = 'net'; if (bidderRequest) { if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { gdprObject = { gdpr: bidderRequest.gdprConsent.gdprApplies, gdpr_consent: bidderRequest.gdprConsent.consentString }; request.push('gdpr=' + gdprObject.gdpr); request.push('gdpr_consent=' + gdprObject.gdpr_consent); } bidderRequest.metaData = getMetaData(); if (floors.length > 0) { bidderRequest.floors = floors; } } return { method: 'POST', url: request.join('&'), data: bidderRequest, bids: validBidRequests, netRevenue: netRevenue, bidder: 'etarget', gdpr: gdprObject }; function getMetaData() { var mts = {}; var hmetas = document.getElementsByTagName('meta'); var wnames = ['title', 'og:title', 'description', 'og:description', 'og:url', 'base', 'keywords']; try { for (var k in hmetas) { if (typeof hmetas[k] == 'object') { var mname = hmetas[k].name || hmetas[k].getAttribute('property'); var mcont = hmetas[k].content; if (!!mname && mname != 'null' && !!mcont) { if (wnames.indexOf(mname) >= 0) { if (!mts[mname]) { mts[mname] = []; } mts[mname].push(mcont); } } } } mts['title'] = [(document.getElementsByTagName('title')[0] || []).innerHTML]; mts['base'] = [(document.getElementsByTagName('base')[0] || {}).href]; mts['referer'] = [document.location.href]; mts['ortb2'] = (config.getConfig('ortb2') || {}); } catch (e) { mts.error = e; } return mts; } function formRequestUrl(reqData) { var key; var url = []; for (key in reqData) { if (reqData.hasOwnProperty(key) && reqData[key]) { url.push(key, '=', reqData[key], '&'); } } return encodeURIComponent(btoa(url.join('').slice(0, -1))); } }, interpretResponse: function (serverResponse, bidRequest) { const VALID_RESPONSES = { banner: 1, video: 1 }; var bidObject, bid, type; var bidRespones = []; var bids = bidRequest.bids; var responses = serverResponse.body; var data = []; for (var i = 0; i < responses.length; i++) { data = responses[i]; type = data.response === 'banner' ? BANNER : VIDEO; bid = bids[i]; if (VALID_RESPONSES[data.response] && (verifySize(data, bid.sizes) || type === VIDEO)) { bidObject = { requestId: bid.bidId, cpm: data.win_bid ? data.win_bid : 0, width: data.width, height: data.height, creativeId: data.creativeId, currency: data.win_cur, netRevenue: true, ttl: 360, reason: data.reason ? data.reason : 'none', ad: data.banner, vastXml: data.vast_content, vastUrl: data.vast_link, mediaType: data.response, transactionId: bid.transactionId }; if (bidRequest.gdpr) { bidObject.gdpr = bidRequest.gdpr.gdpr; bidObject.gdpr_consent = bidRequest.gdpr.gdpr_consent; } if (bid.adomain) { utils.deepSetValue(bidObject, 'meta.advertiserDomains', Array.isArray(bid.adomain) ? bid.adomain : [bid.adomain]); } bidRespones.push(bidObject); } } return bidRespones; function verifySize(adItem, validSizes) { for (var j = 0, k = validSizes.length; j < k; j++) { if (adItem.width == validSizes[j][0] && adItem.height == validSizes[j][1]) { return true; } } return false; } } }; function getBidFloor(bid) { if (!utils.isFn(bid.getFloor)) { return null; } let floor = bid.getFloor({ currency: 'EUR', mediaType: '*', size: '*' }); if (utils.isPlainObject(floor) && !isNaN(floor.floor)) { return floor.floor; } return null; } registerBidder(spec);