UNPKG

mk9-prebid

Version:

Header Bidding Management Library

201 lines (179 loc) 6.55 kB
import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {config} from '../src/config.js'; import * as utils from '../src/utils.js'; import { Renderer } from '../src/Renderer.js'; import { INSTREAM, OUTSTREAM } from '../src/video.js'; const ENDPOINT = `https://d.vidoomy.com/api/rtbserver/prebid/`; const BIDDER_CODE = 'vidoomy'; const GVLID = 380; const isBidRequestValid = bid => { if (!bid.params) { utils.logError(BIDDER_CODE + ': bid.params should be non-empty'); return false; } if (!+bid.params.pid) { utils.logError(BIDDER_CODE + ': bid.params.pid should be non-empty Number'); return false; } if (!+bid.params.id) { utils.logError(BIDDER_CODE + ': bid.params.id should be non-empty Number'); return false; } if (bid.params && bid.params.mediaTypes && bid.params.mediaTypes.video && bid.params.mediaTypes.video.context === INSTREAM && !bid.params.mediaTypes.video.playerSize) { utils.logError(BIDDER_CODE + ': bid.params.mediaType.video should have a playerSize property to tell player size when is INSTREAM'); return false; } return true; }; const isBidResponseValid = bid => { if (!bid.requestId || !bid.cpm || !bid.ttl || !bid.currency) { return false; } switch (bid.mediaType) { case BANNER: return Boolean(bid.width && bid.height && bid.ad); case VIDEO: return Boolean(bid.vastUrl); default: return false; } } const buildRequests = (validBidRequests, bidderRequest) => { const serverRequests = validBidRequests.map(bid => { let adType = BANNER; let w, h; if (bid.mediaTypes && bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) { [w, h] = bid.mediaTypes[BANNER].sizes[0]; adType = BANNER; } else if (bid.mediaTypes && bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) { [w, h] = bid.mediaTypes[VIDEO].playerSize; adType = VIDEO; } let host = ''; try { host = bidderRequest.refererInfo.referer.split('#')[0].replace(/^(https\:\/\/|http\:\/\/)|(\/)$/g, '').split('/')[0]; } catch (eBidRequest) { try { host = window.location.href.replace(/^(https\:\/\/|http\:\/\/)|(\/)$/g, '').split('/')[0]; } catch (eLocationHref) { host = window.location.href; } } const hostname = host.split(':')[0]; const videoContext = utils.deepAccess(bid, 'mediaTypes.video.context'); const queryParams = []; queryParams.push(['id', bid.params.id]); queryParams.push(['adtype', adType]); queryParams.push(['w', w]); queryParams.push(['h', h]); queryParams.push(['pos', parseInt(bid.params.position) || 1]); queryParams.push(['ua', navigator.userAgent]); queryParams.push(['l', navigator.language && navigator.language.indexOf('-') !== -1 ? navigator.language.split('-')[0] : '']); queryParams.push(['dt', /Mobi/.test(navigator.userAgent) ? 2 : 1]); queryParams.push(['pid', bid.params.pid]); queryParams.push(['requestId', bid.bidId]); queryParams.push(['d', hostname]); queryParams.push(['sp', encodeURIComponent(bidderRequest.refererInfo.referer)]); if (bidderRequest.gdprConsent) { queryParams.push(['gdpr', bidderRequest.gdprConsent.gdprApplies]); queryParams.push(['gdprcs', bidderRequest.gdprConsent.consentString]); } queryParams.push(['usp', bidderRequest.uspConsent || '']); queryParams.push(['coppa', !!config.getConfig('coppa')]); const rawQueryParams = queryParams.map(qp => qp.join('=')).join('&'); const url = `${ENDPOINT}?${rawQueryParams}`; return { method: 'GET', url: url, data: {videoContext} } }); return serverRequests; }; const render = (bid) => { bid.ad = bid.vastUrl; var obj = { vastTimeout: 5000, maxAllowedVastTagRedirects: 3, allowVpaid: true, autoPlay: true, preload: true, mute: true, } window.outstreamPlayer(bid, bid.adUnitCode, obj); } const interpretResponse = (serverResponse, bidRequest) => { try { let responseBody = serverResponse.body; if (responseBody.mediaType === 'video') { responseBody.ad = responseBody.vastUrl; const videoContext = bidRequest.data.videoContext; if (videoContext === OUTSTREAM) { try { const renderer = Renderer.install({ id: bidRequest.bidId, adunitcode: bidRequest.tagId, loaded: false, config: responseBody.mediaType, url: responseBody.meta.rendererUrl }); renderer.setRender(render); responseBody.renderer = renderer; } catch (e) { responseBody.ad = responseBody.vastUrl; utils.logError(BIDDER_CODE + ': error while installing renderer to show outstream ad'); } } } const bid = { vastUrl: responseBody.vastUrl, ad: responseBody.ad, renderer: responseBody.renderer, mediaType: responseBody.mediaType, requestId: responseBody.requestId, cpm: responseBody.cpm, currency: responseBody.currency, width: responseBody.width, height: responseBody.height, creativeId: responseBody.creativeId, netRevenue: responseBody.netRevenue, ttl: responseBody.ttl, meta: { mediaType: responseBody.meta.mediaType, rendererUrl: responseBody.meta.rendererUrl, advertiserDomains: responseBody.meta.advertiserDomains, advertiserId: responseBody.meta.advertiserId, advertiserName: responseBody.meta.advertiserName, agencyId: responseBody.meta.agencyId, agencyName: responseBody.meta.agencyName, brandId: responseBody.meta.brandId, brandName: responseBody.meta.brandName, dchain: responseBody.meta.dchain, networkId: responseBody.meta.networkId, networkName: responseBody.meta.networkName, primaryCatId: responseBody.meta.primaryCatId, secondaryCatIds: responseBody.meta.secondaryCatIds } }; const bids = []; if (isBidResponseValid(bid)) { bids.push(bid); } else { utils.logError(BIDDER_CODE + ': server returns invalid response'); } return bids; } catch (e) { utils.logError(BIDDER_CODE + ': error parsing server response to Prebid format'); return []; } }; export const spec = { code: BIDDER_CODE, supportedMediaTypes: [BANNER, VIDEO], isBidRequestValid, buildRequests, interpretResponse, gvlid: GVLID, }; registerBidder(spec);