UNPKG

mk9-prebid

Version:

Header Bidding Management Library

317 lines (294 loc) 9.33 kB
import * as utils from '../src/utils.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {config} from '../src/config.js'; import {Renderer} from '../src/Renderer.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import includes from 'core-js-pure/features/array/includes.js'; export const helper = { getTopWindowDomain: function (url) { const domainStart = url.indexOf('://') + '://'.length; return url.substring(domainStart, url.indexOf('/', domainStart) < 0 ? url.length : url.indexOf('/', domainStart)); }, startsWith: function (str, search) { return str.substr(0, search.length) === search; }, getMediaType: function (bid) { if (bid.ext) { if (bid.ext.media_type) { return bid.ext.media_type.toLowerCase(); } else if (bid.ext.vast_url) { return VIDEO; } else { return BANNER; } } return BANNER; } }; export const spec = { code: 'cleanmedianet', aliases: [], supportedMediaTypes: [BANNER, VIDEO], isBidRequestValid: function (bid) { return ( !!bid.params.supplyPartnerId && typeof bid.params.supplyPartnerId === 'string' && (typeof bid.params.bidfloor === 'undefined' || typeof bid.params.bidfloor === 'number') && (typeof bid.params['adpos'] === 'undefined' || typeof bid.params['adpos'] === 'number') && (typeof bid.params['protocols'] === 'undefined' || Array.isArray(bid.params['protocols'])) && (typeof bid.params.instl === 'undefined' || bid.params.instl === 0 || bid.params.instl === 1) ); }, buildRequests: function (validBidRequests, bidderRequest) { return validBidRequests.map(bidRequest => { const { adUnitCode, auctionId, mediaTypes, params, sizes, transactionId } = bidRequest; const baseEndpoint = 'https://bidder.cleanmediaads.com'; const rtbEndpoint = `${baseEndpoint}/r/${ params.supplyPartnerId }/bidr?rformat=open_rtb&reqformat=rtb_json&bidder=prebid` + (params.query ? '&' + params.query : ''); let url = config.getConfig('pageUrl') || bidderRequest.refererInfo.referer; const rtbBidRequest = { id: auctionId, site: { domain: helper.getTopWindowDomain(url), page: url, ref: bidderRequest.refererInfo.referer }, device: { ua: navigator.userAgent, dnt: utils.getDNT() ? 1 : 0, h: screen.height, w: screen.width, language: navigator.language }, imp: [], ext: {}, user: { ext: {} } }; if ( bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString && bidderRequest.gdprConsent.gdprApplies ) { rtbBidRequest.ext.gdpr_consent = { consent_string: bidderRequest.gdprConsent.consentString, consent_required: bidderRequest.gdprConsent.gdprApplies }; rtbBidRequest.regs = { ext: { gdpr: bidderRequest.gdprConsent.gdprApplies === true ? 1 : 0 } }; rtbBidRequest.user = { ext: { consent: bidderRequest.gdprConsent.consentString } } } const imp = { id: transactionId, instl: params.instl === 1 ? 1 : 0, tagid: adUnitCode, bidfloor: 0, bidfloorcur: 'USD', secure: 1 }; const hasFavoredMediaType = params.favoredMediaType && includes(this.supportedMediaTypes, params.favoredMediaType); if (!mediaTypes || mediaTypes.banner) { if (!hasFavoredMediaType || params.favoredMediaType === BANNER) { const bannerImp = Object.assign({}, imp, { banner: { w: sizes.length ? sizes[0][0] : 300, h: sizes.length ? sizes[0][1] : 250, pos: params.pos || 0, topframe: utils.inIframe() ? 0 : 1 } }); rtbBidRequest.imp.push(bannerImp); } } if (mediaTypes && mediaTypes.video) { if (!hasFavoredMediaType || params.favoredMediaType === VIDEO) { let videoImp = { video: { protocols: params.protocols || [1, 2, 3, 4, 5, 6], pos: params.pos || 0, ext: {context: mediaTypes.video.context} } }; let playerSize = mediaTypes.video.playerSize || sizes; if (utils.isArray(playerSize[0])) { videoImp.video.w = playerSize[0][0]; videoImp.video.h = playerSize[0][1]; } else if (utils.isNumber(playerSize[0])) { videoImp.video.w = playerSize[0]; videoImp.video.h = playerSize[1]; } else { videoImp.video.w = 300; videoImp.video.h = 250; } videoImp = Object.assign({}, imp, videoImp); rtbBidRequest.imp.push(videoImp); } } if (rtbBidRequest.imp.length === 0) { return; } return { method: 'POST', url: rtbEndpoint, data: rtbBidRequest, bidRequest }; }); }, interpretResponse: function (serverResponse, bidRequest) { const response = serverResponse && serverResponse.body; if (!response) { utils.logError('empty response'); return []; } const bids = response.seatbid.reduce( (acc, seatBid) => acc.concat(seatBid.bid), [] ); let outBids = []; bids.forEach(bid => { const outBid = { requestId: bidRequest.bidRequest.bidId, cpm: bid.price, width: bid.w, height: bid.h, ttl: 360, creativeId: bid.crid || bid.adid, netRevenue: true, currency: bid.cur || response.cur, mediaType: helper.getMediaType(bid) }; if ( utils.deepAccess( bidRequest.bidRequest, 'mediaTypes.' + outBid.mediaType ) ) { if (outBid.mediaType === BANNER) { outBids.push(Object.assign({}, outBid, {ad: bid.adm})); } else if (outBid.mediaType === VIDEO) { const context = utils.deepAccess( bidRequest.bidRequest, 'mediaTypes.video.context' ); outBids.push( Object.assign({}, outBid, { vastUrl: bid.ext.vast_url, vastXml: bid.adm, renderer: context === 'outstream' ? newRenderer(bidRequest.bidRequest, bid) : undefined }) ); } } }); return outBids; }, getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { const syncs = []; const gdprApplies = gdprConsent && typeof gdprConsent.gdprApplies === 'boolean' ? gdprConsent.gdprApplies : false; const suffix = gdprApplies ? 'gc=' + encodeURIComponent(gdprConsent.consentString) : 'gc=missing'; serverResponses.forEach(resp => { if (resp.body) { const bidResponse = resp.body; if (bidResponse.ext && Array.isArray(bidResponse.ext['utrk'])) { bidResponse.ext['utrk'].forEach(pixel => { const url = pixel.url + (pixel.url.indexOf('?') > 0 ? '&' + suffix : '?' + suffix); return syncs.push({type: pixel.type, url}); }); } if (Array.isArray(bidResponse.seatbid)) { bidResponse.seatbid.forEach(seatBid => { if (Array.isArray(seatBid.bid)) { seatBid.bid.forEach(bid => { if (bid.ext && Array.isArray(bid.ext['utrk'])) { bid.ext['utrk'].forEach(pixel => { const url = pixel.url + (pixel.url.indexOf('?') > 0 ? '&' + suffix : '?' + suffix); return syncs.push({type: pixel.type, url}); }); } }); } }); } } }); return syncs; } }; function newRenderer(bidRequest, bid, rendererOptions = {}) { const renderer = Renderer.install({ url: (bidRequest.params && bidRequest.params.rendererUrl) || (bid.ext && bid.ext.renderer_url) || 'https://s.wlplayer.com/video/latest/renderer.js', config: rendererOptions, loaded: false }); try { renderer.setRender(renderOutstream); } catch (err) { utils.logWarn('Prebid Error calling setRender on renderer', err); } return renderer; } function renderOutstream(bid) { bid.renderer.push(() => { const unitId = bid.adUnitCode + '/' + bid.adId; window['GamoshiPlayer'].renderAd({ id: unitId, debug: window.location.href.indexOf('pbjsDebug') >= 0, placement: document.getElementById(bid.adUnitCode), width: bid.width, height: bid.height, events: { ALL_ADS_COMPLETED: () => window.setTimeout(() => { window['GamoshiPlayer'].removeAd(unitId); }, 300) }, vastUrl: bid.vastUrl, vastXml: bid.vastXml }); }); } registerBidder(spec);