/* Notify Prebid of bid responses so bids can get in the auction */ function handleResponse(response, requestedBidders, bidderRequests, addBidResponse, done) { let result; let bids = []; try { result = JSON.parse(response); bids = protocolAdapter().interpretResponse( result, bidderRequests, requestedBidders ); bids.forEach(({adUnit, bid}) => { if (isValid(adUnit, bid, bidderRequests)) { addBidResponse(adUnit, bid); } }); bidderRequests.forEach(bidderRequest => events.emit(EVENTS.BIDDER_DONE, bidderRequest)); if (result.status === 'no_cookie' && _s2sConfig.cookieSet && typeof _s2sConfig.cookieSetUrl === 'string') { // cookie sync cookieSet(_s2sConfig.cookieSetUrl); } } catch (error) { utils.logError(error); } if (!result || (result.status && includes(result.status, 'Error'))) { utils.logError('error parsing response: ', result.status); } const videoBid = bids.some(bidResponse => bidResponse.bid.mediaType === 'video'); const cacheEnabled = config.getConfig('cache.url'); // video bids with cache enabled need to be cached first before they are considered done if (!(videoBid && cacheEnabled)) { done(); } doClientSideSyncs(requestedBidders); }
/* Notify Prebid of bid responses so bids can get in the auction */ function handleResponse(response, requestedBidders) { let result; try { result = JSON.parse(response); if (result.status === 'OK' || result.status === 'no_cookie') { if (result.bidder_status) { result.bidder_status.forEach(bidder => { if (bidder.no_cookie && !_cookiesQueued) { doBidderSync(bidder.usersync.type, bidder.usersync.url, bidder.bidder); } }); } if (result.bids) { result.bids.forEach(bidObj => { let bidRequest = utils.getBidRequest(bidObj.bid_id); let cpm = bidObj.price; let status; if (cpm !== 0) { status = STATUS.GOOD; } else { status = STATUS.NO_BID; } let bidObject = bidfactory.createBid(status, bidRequest); bidObject.source = TYPE; bidObject.creative_id = bidObj.creative_id; bidObject.bidderCode = bidObj.bidder; bidObject.cpm = cpm; bidObject.ad = bidObj.adm; if (bidObj.nurl) { bidObject.ad += utils.createTrackPixelHtml(decodeURIComponent(bidObj.nurl)); } bidObject.width = bidObj.width; bidObject.height = bidObj.height; bidObject.adserverTargeting = bidObj.ad_server_targeting; if (bidObj.deal_id) { bidObject.dealId = bidObj.deal_id; } bidmanager.addBidResponse(bidObj.code, bidObject); }); } const receivedBidIds = result.bids ? result.bids.map(bidObj => bidObj.bid_id) : []; // issue a no-bid response for every bid request that can not be matched with received bids requestedBidders.forEach(bidder => { utils .getBidderRequestAllAdUnits(bidder) .bids.filter(bidRequest => !receivedBidIds.includes(bidRequest.bidId)) .forEach(bidRequest => { let bidObject = bidfactory.createBid(STATUS.NO_BID, bidRequest); bidObject.source = TYPE; bidObject.adUnitCode = bidRequest.placementCode; bidObject.bidderCode = bidRequest.bidder; bidmanager.addBidResponse(bidObject.adUnitCode, bidObject); }); }); } if (result.status === 'no_cookie' && config.cookieSet) { // cookie sync cookieSet(cookieSetUrl); } } catch (error) { utils.logError(error); } if (!result || (result.status && result.status.includes('Error'))) { utils.logError('error parsing response: ', result.status); } }
/* Notify Prebid of bid responses so bids can get in the auction */ function handleResponse(response, requestedBidders) { let result; try { result = JSON.parse(response); if (result.status === 'OK' || result.status === 'no_cookie') { if (result.bidder_status) { result.bidder_status.forEach(bidder => { if (bidder.no_cookie && !_cookiesQueued) { doBidderSync(bidder.usersync.type, bidder.usersync.url, bidder.bidder); } }); } // do client-side syncs if available requestedBidders.forEach(bidder => { let clientAdapter = adaptermanager.getBidAdapter(bidder); if (clientAdapter && clientAdapter.registerSyncs) { clientAdapter.registerSyncs(); } }); if (result.bids) { result.bids.forEach(bidObj => { let bidRequest = utils.getBidRequest(bidObj.bid_id); let cpm = bidObj.price; let status; if (cpm !== 0) { status = STATUS.GOOD; } else { status = STATUS.NO_BID; } let bidObject = bidfactory.createBid(status, bidRequest); bidObject.source = TYPE; bidObject.creative_id = bidObj.creative_id; bidObject.bidderCode = bidObj.bidder; bidObject.cpm = cpm; // From ORTB see section 4.2.3: adm Optional means of conveying ad markup in case the bid wins; supersedes the win notice if markup is included in both. if (bidObj.media_type === VIDEO) { bidObject.mediaType = VIDEO; if (bidObj.adm) { bidObject.vastXml = bidObj.adm; } if (bidObj.nurl) { bidObject.vastUrl = bidObj.nurl; } } else { if (bidObj.adm && bidObj.nurl) { bidObject.ad = bidObj.adm; bidObject.ad += utils.createTrackPixelHtml(decodeURIComponent(bidObj.nurl)); } else if (bidObj.adm) { bidObject.ad = bidObj.adm; } else if (bidObj.nurl) { bidObject.adUrl = bidObj.nurl } } bidObject.width = bidObj.width; bidObject.height = bidObj.height; bidObject.adserverTargeting = bidObj.ad_server_targeting; if (bidObj.deal_id) { bidObject.dealId = bidObj.deal_id; } bidmanager.addBidResponse(bidObj.code, bidObject); }); } const receivedBidIds = result.bids ? result.bids.map(bidObj => bidObj.bid_id) : []; // issue a no-bid response for every bid request that can not be matched with received bids requestedBidders.forEach(bidder => { utils .getBidderRequestAllAdUnits(bidder) .bids.filter(bidRequest => !receivedBidIds.includes(bidRequest.bidId)) .forEach(bidRequest => { let bidObject = bidfactory.createBid(STATUS.NO_BID, bidRequest); bidObject.source = TYPE; bidObject.adUnitCode = bidRequest.placementCode; bidObject.bidderCode = bidRequest.bidder; bidmanager.addBidResponse(bidObject.adUnitCode, bidObject); }); }); } if (result.status === 'no_cookie' && config.cookieSet) { // cookie sync cookieSet(cookieSetUrl); } } catch (error) { utils.logError(error); } if (!result || (result.status && result.status.includes('Error'))) { utils.logError('error parsing response: ', result.status); } }