Skip to content

Commit

Permalink
Refactor of Prebid (#349)
Browse files Browse the repository at this point in the history
* Concurrent bid requests

* remove small helper functions for readability
* remove bidmanager.setBidderMap (not used)
* remove createEmptyBidResponseObj (just return object literal)
* remove pb_preBidders as unused
* refactor pbjs.requestBids and adaptermanager.callBids
* refactor bid count, rearrange getPriceBucketStrings
* refactor of targeting to set and clear before and after ad server call

* ad being rendered, still in progress

* fix bug in appnexus adapter, lower timeout duration

* notes

* render ads as soon as all bids are back

* remove deprecated code

* add small composable functions for readability, comment out a few API methods

* comment API methods and related tests

* adds fixtures, refactor tests, comment some api tests until methods are restored

* restore API methods, add fixtures functions, fix tests

* restore all adpaters, remove deprecated code and tests

* review notes

* review notes: naming things, restore api methods, move composables to utils

* exclude adapters from coverage reporting

* include adapters in coverage reporting

* restore `bidsAvailableForAdapter` API method, move `getBidRequest` to utils

* restore test for `getAdserverTargetingForAdUnitCodeStr`

* Fix `pbjs.enableSendAllBids()` when using DivId for your adunit.code.

* fix object destructuring bug in `pbjs.requestBids` method signature

* bug fixes: allBidsAvailable should return boolean, wrap one time external callback in array, object destructuring in requestBids method signature restored

* move `getKeys` and `getVal` to utils module, rename `bidSet` to `bidderRequest`

* Derive bidder codes from adUnits, fixes "Calling All Bidders" bug, also move `getBidderCodes` to utils

* fix `getAdServerTargeting` test

* Fix token illegal error

* Concurrent bid requests

* remove small helper functions for readability
* remove bidmanager.setBidderMap (not used)
* remove createEmptyBidResponseObj (just return object literal)
* remove pb_preBidders as unused
* refactor pbjs.requestBids and adaptermanager.callBids
* refactor bid count, rearrange getPriceBucketStrings
* refactor of targeting to set and clear before and after ad server call

* ad being rendered, still in progress

* fix bug in appnexus adapter, lower timeout duration

* notes

* render ads as soon as all bids are back

* remove deprecated code

* add small composable functions for readability, comment out a few API methods

* comment API methods and related tests

* adds fixtures, refactor tests, comment some api tests until methods are restored

* restore API methods, add fixtures functions, fix tests

* restore all adpaters, remove deprecated code and tests

* review notes

* review notes: naming things, restore api methods, move composables to utils

* exclude adapters from coverage reporting

* include adapters in coverage reporting

* restore `bidsAvailableForAdapter` API method, move `getBidRequest` to utils

* restore test for `getAdserverTargetingForAdUnitCodeStr`

* fix object destructuring bug in `pbjs.requestBids` method signature

* bug fixes: allBidsAvailable should return boolean, wrap one time external callback in array, object destructuring in requestBids method signature restored

* move `getKeys` and `getVal` to utils module, rename `bidSet` to `bidderRequest`

* Derive bidder codes from adUnits, fixes "Calling All Bidders" bug, also move `getBidderCodes` to utils

* fix `getAdServerTargeting` test

* Fix token illegal error

* restore return value format for `pbjs.getBidResponses`

* restore return format for `getAdServerTargeting()`

* restore `getAdServerTargeting` return value as map
merge `getBidResponses` to map
some more helper functions
fixtures and tests

* Restore getBidResponsesForAdUnitCode()

* restore `getAdServerTargetingForAdUnitCodeStr` return value as string of querystring params
more fixtures and tests

* check if send all bids before adding bid landscape targeting

* Implement 'dense' price bucket mode
- Don't export getPriceBucketString
- Test 'dense' price bucket mode integration
  • Loading branch information
Nate Guisinger committed May 18, 2016
1 parent 197a81d commit 2ad8150
Show file tree
Hide file tree
Showing 23 changed files with 1,661 additions and 1,121 deletions.
1 change: 0 additions & 1 deletion .jscsrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"maxErrors": 1000,
"esnext": true,
"requireTrailingComma": null,
"requireCamelCaseOrUpperCaseIdentifiers": null,
"requireSpacesInAnonymousFunctionExpression": null,
Expand Down
63 changes: 37 additions & 26 deletions src/adaptermanager.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/** @module adaptermanger */

var bidmanager = require('./bidmanager.js');
import { flatten, getBidderCodes } from './utils';

var utils = require('./utils.js');
var CONSTANTS = require('./constants.json');
var events = require('./events');
Expand All @@ -9,34 +10,44 @@ import { BaseAdapter } from './adapters/baseAdapter';
var _bidderRegistry = {};
exports.bidderRegistry = _bidderRegistry;

exports.callBids = function (bidderArr) {
for (var i = 0; i < bidderArr.length; i++) {
//use the bidder code to identify which function to call
var bidder = bidderArr[i];
if (bidder.bidderCode && _bidderRegistry[bidder.bidderCode]) {
utils.logMessage('CALLING BIDDER ======= ' + bidder.bidderCode);
var currentBidder = _bidderRegistry[bidder.bidderCode];

//emit 'bidRequested' event
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, bidder);
currentBidder.callBids(bidder);

// if the bidder didn't explicitly set the number of bids
// expected, default to the number of bids passed into the bidder
if (bidmanager.getExpectedBidsCount(bidder.bidderCode) === undefined) {
bidmanager.setExpectedBidsCount(bidder.bidderCode, bidder.bids.length);
}

var currentTime = new Date().getTime();
bidmanager.registerBidRequestTime(bidder.bidderCode, currentTime);

if (currentBidder.defaultBidderSettings) {
bidmanager.registerDefaultBidderSetting(bidder.bidderCode, currentBidder.defaultBidderSettings);
function getBids({ bidderCode, requestId, bidderRequestId }) {
return pbjs.adUnits.map(adUnit => {
return adUnit.bids.filter(bid => bid.bidder === bidderCode)
.map(bid => Object.assign(bid, {
placementCode: adUnit.code,
sizes: adUnit.sizes,
bidId: utils.getUniqueIdentifierStr(),
bidderRequestId,
requestId
}));
}).reduce(flatten, []);
}

exports.callBids = () => {
const requestId = utils.getUniqueIdentifierStr();

getBidderCodes().forEach(bidderCode => {
const adapter = _bidderRegistry[bidderCode];
if (adapter) {
const bidderRequestId = utils.getUniqueIdentifierStr();
const bidderRequest = {
bidderCode,
requestId,
bidderRequestId,
bids: getBids({ bidderCode, requestId, bidderRequestId }),
start: new Date().getTime()
};
console.log('bid set:', bidderCode, bidderRequestId);
utils.logMessage(`CALLING BIDDER ======= ${bidderCode}`);
pbjs._bidsRequested.push(bidderRequest);
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, bidderRequest);
if (bidderRequest.bids && bidderRequest.bids.length) {
adapter.callBids(bidderRequest);
}
} else {
utils.logError('Adapter trying to be called which does not exist: ' + bidder.bidderCode, 'adaptermanager.callBids');
utils.logError(`Adapter trying to be called which does not exist: ${bidderCode} adaptermanager.callBids`);
}
}
});
};

exports.registerBidAdapter = function (bidAdaptor, bidderCode) {
Expand Down
3 changes: 2 additions & 1 deletion src/adapters/adform.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ function AdformAdapter() {
};

function _callBids(params) {
var callbackName = '_adf_' + utils.getUniqueIdentifierStr();
//var callbackName = '_adf_' + utils.getUniqueIdentifierStr();
var bid;
var noDomain = true;
var bids = params.bids;
var request = [];
var callbackName = '_adf_' + utils.getUniqueIdentifierStr();

for (var i = 0, l = bids.length; i < l; i++) {
bid = bids[i];
Expand Down
17 changes: 10 additions & 7 deletions src/adapters/appnexus.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { getBidRequest } from '../utils.js';

var CONSTANTS = require('../constants.json');
var utils = require('../utils.js');
var adloader = require('../adloader.js');
Expand All @@ -10,21 +12,22 @@ AppNexusAdapter = function AppNexusAdapter() {
var baseAdapter = Adapter.createNew('appnexus');

baseAdapter.callBids = function (params) {
var bidCode = baseAdapter.getBidderCode();
//var bidCode = baseAdapter.getBidderCode();

var anArr = params.bids;
var bidsCount = anArr.length;

//var bidsCount = anArr.length;

//set expected bids count for callback execution
bidmanager.setExpectedBidsCount(bidCode, bidsCount);
//bidmanager.setExpectedBidsCount(bidCode, bidsCount);

for (var i = 0; i < bidsCount; i++) {
for (var i = 0; i < anArr.length; i++) {
var bidRequest = anArr[i];
var callbackId = utils.getUniqueIdentifierStr();
var callbackId = bidRequest.bidId;
adloader.loadScript(buildJPTCall(bidRequest, callbackId));

//store a reference to the bidRequest from the callback id
bidmanager.pbCallbackMap[callbackId] = bidRequest;
//bidmanager.pbCallbackMap[callbackId] = bidRequest;
}
};

Expand Down Expand Up @@ -149,7 +152,7 @@ AppNexusAdapter = function AppNexusAdapter() {
var responseCPM;
var id = jptResponseObj.callback_uid;
var placementCode = '';
var bidObj = bidmanager.getPlacementIdByCBIdentifer(id);
var bidObj = getBidRequest(id);
if (bidObj) {

bidCode = bidObj.bidder;
Expand Down
6 changes: 3 additions & 3 deletions src/adapters/brightcom.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ var BrightcomAdapter = function BrightcomAdapter() {
// Add current impression to collection
brightcomImps.push(imp);
// Add mapping to current bid via impression id
bidmanager.pbCallbackMap[imp.id] = bid;
//bidmanager.pbCallbackMap[imp.id] = bid;

// Add current ad unit's code to tracking
reqAdUnitsCode.push(bid.placementCode);
Expand Down Expand Up @@ -136,8 +136,8 @@ var BrightcomAdapter = function BrightcomAdapter() {
brightcomResponseObj.seatbid[0].bid.forEach( function(curBid) {

// Get the bid request data
var bidRequest = bidmanager.getPlacementIdByCBIdentifer(curBid.impid);
var bidRequest = pbjs._bidsRequested.find(bidSet => bidSet.bidderCode === 'brightcom').bids[0]; // this assumes a single request only

// Make sure the bid exists
if (bidRequest) {

Expand Down
2 changes: 1 addition & 1 deletion src/adapters/indexExchange.js
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ var IndexExchangeAdapter = function IndexExchangeAdapter() {
utils.logError('Too many unique sizes on slots, will use the first 20.', ADAPTER_NAME);
}

bidmanager.setExpectedBidsCount(ADAPTER_CODE, expectedBids);
//bidmanager.setExpectedBidsCount(ADAPTER_CODE, expectedBids);
adloader.loadScript(cygnus_index_start());

var responded = false;
Expand Down
5 changes: 3 additions & 2 deletions src/adapters/nginad.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ var NginAdAdapter = function NginAdAdapter() {
};

nginadImps.push(imp);
bidmanager.pbCallbackMap[imp.id] = bid;
//bidmanager.pbCallbackMap[imp.id] = bid;

rtbServerDomain = bid.params.nginadDomain;

Expand Down Expand Up @@ -141,7 +141,8 @@ var NginAdAdapter = function NginAdAdapter() {
var id = nginadBid.impid;

// try to fetch the bid request we sent NginAd
var bidObj = bidmanager.getPlacementIdByCBIdentifer(id);
var bidObj = pbjs._bidsRequested.find(bidSet => bidSet.bidderCode === 'nginad').bids
.filter(bid => bid.params && bid.params.impId === id);
if (!bidObj) {
return handleErrorResponse(nginadBid, defaultPlacementForBadBid);
}
Expand Down
2 changes: 1 addition & 1 deletion src/adapters/pubmatic.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ var PubmaticAdapter = function PubmaticAdapter() {
bids = params.bids;
for (var i = 0; i < bids.length; i++) {
var bid = bids[i];
bidmanager.pbCallbackMap['' + bid.params.adSlot] = bid;
//bidmanager.pbCallbackMap['' + bid.params.adSlot] = bid;
_pm_pub_id = _pm_pub_id || bid.params.publisherId;
_pm_optimize_adslots.push(bid.params.adSlot);
}
Expand Down
4 changes: 2 additions & 2 deletions src/adapters/sovrn.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ var SovrnAdapter = function SovrnAdapter() {
bidfloor: bidFloor
};
sovrnImps.push(imp);
bidmanager.pbCallbackMap[imp.id] = bid;
//bidmanager.pbCallbackMap[imp.id] = bid;
allPlacementCodes.push(bid.placementCode);
});

Expand Down Expand Up @@ -105,7 +105,7 @@ var SovrnAdapter = function SovrnAdapter() {
var bid = {};

// try to fetch the bid request we sent Sovrn
var bidObj = bidmanager.getPlacementIdByCBIdentifer(id);
var bidObj = pbjs._bidsRequested.map(bidSet => bidSet.bids.filter(bid => bid.params && bid.params.impId === id));
if (bidObj) {
placementCode = bidObj.placementCode;
placementsWithBidsBack.push(placementCode);
Expand Down
12 changes: 7 additions & 5 deletions src/adapters/springserve.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ SpringServeAdapter = function SpringServeAdapter() {
var bids = params.bids || [];
for (var i = 0; i < bids.length; i++) {
var bid = bids[i];
bidmanager.pbCallbackMap[bid.params.impId] = params;
//bidmanager.pbCallbackMap[bid.params.impId] = params;
adloader.loadScript(buildSpringServeCall(bid));
}
}
Expand All @@ -67,13 +67,15 @@ SpringServeAdapter = function SpringServeAdapter() {
responseObj.seatbid[0].bid[0] !== undefined) {
//look up the request attributs stored in the bidmanager
var responseBid = responseObj.seatbid[0].bid[0];
var requestObj = bidmanager.getPlacementIdByCBIdentifer(responseBid.impid);
//var requestObj = bidmanager.getPlacementIdByCBIdentifer(responseBid.impid);
var requestBids = pbjs._bidsRequested.find(bidSet => bidSet.bidderCode === 'springserve').bids
.filter(bid => bid.params && bid.params.impId === +responseBid.impid);
var bid = bidfactory.createBid(1);
var placementCode;

//assign properties from the original request to the bid object
for (var i = 0; i < requestObj.bids.length; i++) {
var bidRequest = requestObj.bids[i];
for (var i = 0; i < requestBids.length; i++) {
var bidRequest = requestBids[i];
if (bidRequest.bidder === 'springserve') {
placementCode = bidRequest.placementCode;
var size = bidRequest.sizes[0];
Expand All @@ -82,7 +84,7 @@ SpringServeAdapter = function SpringServeAdapter() {
}
}

bid.bidderCode = requestObj.bidderCode;
bid.bidderCode = requestBids[0].bidder;

if (responseBid.hasOwnProperty('price') && responseBid.hasOwnProperty('adm')) {
//assign properties from the response to the bid object
Expand Down
15 changes: 8 additions & 7 deletions src/adapters/triplelift.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ var TripleLiftAdapter = function TripleLiftAdapter() {
var bidsCount = tlReq.length;

//set expected bids count for callback execution
bidmanager.setExpectedBidsCount('triplelift',bidsCount);
//bidmanager.setExpectedBidsCount('triplelift',bidsCount);

for (var i = 0; i < bidsCount; i++) {
var bidReqeust = tlReq[i];
var callbackId = utils.getUniqueIdentifierStr();
adloader.loadScript(buildTLCall(bidReqeust, callbackId));
var bidRequest = tlReq[i];
var callbackId = bidRequest.bidderRequestId;
adloader.loadScript(buildTLCall(bidRequest, callbackId));
//store a reference to the bidRequest from the callback id
bidmanager.pbCallbackMap[callbackId] = bidReqeust;
//bidmanager.pbCallbackMap[callbackId] = bidRequest;
}

}
Expand Down Expand Up @@ -72,8 +72,9 @@ var TripleLiftAdapter = function TripleLiftAdapter() {
//expose the callback to the global object:
pbjs.TLCB = function(tlResponseObj) {
if (tlResponseObj && tlResponseObj.callback_id) {
var bidObj = bidmanager.pbCallbackMap[tlResponseObj.callback_id],
placementCode = bidObj.placementCode;
//var bidObj = bidmanager.pbCallbackMap[tlResponseObj.callback_id],
var bidObj = pbjs._bidsRequested.find(bidSet => bidSet.bidderRequestId === tlResponseObj.callback_id).bids.reduce((a, b) => b);
var placementCode = bidObj.placementCode;

// @if NODE_ENV='debug'
utils.logMessage('JSONP callback function called for inventory code: ' + bidObj.params.inventoryCode);
Expand Down
4 changes: 2 additions & 2 deletions src/bidfactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,6 @@ function Bid(statusCode) {
}

// Bid factory function.
exports.createBid = function (statusCde) {
return new Bid(statusCde);
exports.createBid = function (statusCode) {
return new Bid(statusCode);
};
Loading

0 comments on commit 2ad8150

Please sign in to comment.