Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PBJS support for stored responses #4032

Merged
merged 84 commits into from
Jan 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
8d635ff
Add microadBidAdapter
Feb 15, 2019
3055b90
Remove unnecessary encodeURIComponent from microadBidAdapter
Feb 26, 2019
67fb91b
Submit Advangelists Prebid Adapter
Feb 26, 2019
3ebb916
Submit Advangelists Prebid Adapter 1.1
Feb 27, 2019
4f5c451
Correct procudtion endpoint for prebid
Feb 28, 2019
2dc6d1d
Merge branch 'microad-bid-adapter' of git://github.com/strong-zero/Pr…
Feb 28, 2019
fa3e081
Merge remote-tracking branch 'origin/master' into master-rubicon-clean
Mar 18, 2019
600a46e
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Mar 18, 2019
7f578b3
Merge branch 'master' of https://github.com/prebid/Prebid.js
Mar 23, 2019
176a312
Merge branch 'master' of https://github.com/prebid/Prebid.js
Mar 26, 2019
9abf89c
Merge branch 'master' of https://github.com/prebid/Prebid.js
May 13, 2019
6ce04ab
Merge remote-tracking branch 'upstream/master'
Jun 10, 2019
415e2f6
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jun 27, 2019
61fb82c
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 11, 2019
3cc4c67
analytics update with wrapper name
Jul 11, 2019
cd81e02
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 15, 2019
e2b4e04
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 15, 2019
53b5970
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 15, 2019
5c00ed5
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 16, 2019
28848ad
reverted error merge
Jul 16, 2019
ab635ee
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 19, 2019
93308f5
Merge branch 'master' of https://github.com/prebid/Prebid.js into mas…
Jul 24, 2019
1cfd52d
Merge branch 'master' of https://github.com/prebid/Prebid.js
Jul 25, 2019
d619807
Merge branch 'master' of https://github.com/prebid/Prebid.js
Jul 27, 2019
7c2965b
add support to override bidRequests
Jul 27, 2019
a6ecc05
update to last commit
Jul 27, 2019
3a09b38
updated naming and added missing log out
Jul 27, 2019
9893f0f
Merge branch 'master' of https://github.com/prebid/Prebid.js
Aug 7, 2019
16b259e
Merge branches 'add-debug-override-bidrequests' and 'master' of https…
Aug 7, 2019
19c7afc
updated to resolve broken tests in other tests
Aug 7, 2019
bb5ea14
update formatting to match existing
Aug 7, 2019
c43ed92
support passing stored auction request to video requests
Aug 7, 2019
b3f70a4
support passing stored auction request to video requests
Aug 7, 2019
986a251
Merge remote-tracking branch 'upstream/master'
Aug 23, 2019
2cae7c0
Merge branch 'master' of https://github.com/prebid/Prebid.js into ori…
Aug 27, 2019
da0539e
bugfix for incorrect argument name, renamed item to bidderRequest
Aug 27, 2019
d4a4b57
bugfix for incorrect argument name, renamed item to bidderRequest
Aug 27, 2019
2ef2f27
Merge remote-tracking branch 'origin/add-debug-override-bidrequests' …
Aug 27, 2019
d7fd252
Merge branch 'master' of https://github.com/prebid/Prebid.js
Sep 4, 2019
c7c01ba
Merge branch 'master' of https://github.com/prebid/Prebid.js
Sep 10, 2019
24a28aa
Merge branch 'master' of https://github.com/prebid/Prebid.js
Sep 10, 2019
e9f29dd
Merge branch 'master' of https://github.com/rubicon-project/Prebid.js…
Sep 10, 2019
a7aea05
add log message when override is active
Sep 10, 2019
7a1a4ec
Merge branch 'master' of https://github.com/rubicon-project/Prebid.js
Sep 25, 2019
4173d16
Merge branch 'master' of https://github.com/prebid/Prebid.js
Sep 25, 2019
ca13952
update changed default value of netRevenue to true
Sep 27, 2019
0b6cd48
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 3, 2019
5f0110d
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 3, 2019
b24553f
Merge branch 'update-pbs-adapter-storedauctionresponse' into add-debu…
Oct 4, 2019
2b99dde
Merge branch 'update-rubicon-adapter-storedauctionresponse' into add-…
Oct 4, 2019
c5d4fc4
change logInfo to logMessage
Oct 4, 2019
3aac6ce
update addBidRequestHook to filter by adUnitCode
Oct 5, 2019
e7e3c97
Merge branch 'master' of https://github.com/rubicon-project/Prebid.js…
Oct 5, 2019
f930a34
Merge remote-tracking branch 'upstream/master'
Oct 8, 2019
9bff282
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 14, 2019
b9a5e49
Merge branch 'master' of https://github.com/rubicon-project/Prebid.js…
Oct 14, 2019
9d0dad8
Merge branch 'master' of https://github.com/prebid/Prebid.js into add…
Oct 14, 2019
dae5cae
reverted newline
Oct 14, 2019
168e7c6
reverted changes
Oct 14, 2019
ae7b2bd
update obj path to storedAuctionResponse
Oct 15, 2019
79ecf16
updates for pr comments
Oct 15, 2019
712ec9e
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 29, 2019
f192f65
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 29, 2019
006f53c
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 29, 2019
318c692
add unit test
Oct 24, 2019
3a10cdb
Merge branch 'master' of https://github.com/prebid/Prebid.js into add…
Oct 30, 2019
0341150
Merge branch 'master' of https://github.com/prebid/Prebid.js
Oct 31, 2019
fa59897
Merge branch 'master' of https://github.com/prebid/Prebid.js
Nov 15, 2019
dcff2cf
Merge branch 'master' of https://github.com/prebid/Prebid.js
Nov 20, 2019
0222ce2
Merge branch 'master' of https://github.com/prebid/Prebid.js
Nov 24, 2019
227beca
Merge branch 'master' of https://github.com/prebid/Prebid.js
Nov 25, 2019
bcdc770
Merge branch 'master' of https://github.com/rubicon-project/Prebid.js…
Nov 25, 2019
887578c
temp commit, code changes in-progress
Nov 25, 2019
3202807
temp
Nov 25, 2019
6d26899
bugfix and optimization for processing the bidRequests overrides
Nov 26, 2019
cb4c0ec
Merge branch 'master' of https://github.com/prebid/Prebid.js into add…
Nov 27, 2019
0bd48e9
tests added/fixed and medium refactoring
Dec 4, 2019
670b0a5
changed add bid requests hook to be synchronous
Dec 4, 2019
12e2f3b
Merge branch 'master' of https://github.com/prebid/Prebid.js into add…
Dec 4, 2019
06fabf5
update replace use of filter with find
Jan 7, 2020
7b624c3
Merge branch 'master' of https://github.com/prebid/Prebid.js into add…
Jan 7, 2020
d2a0645
fix pbserver test missing obj reference to access requests
Jan 7, 2020
f2eff37
Merge branch 'master' of https://github.com/prebid/Prebid.js into add…
Jan 23, 2020
7220afd
fix merge error
Jan 23, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions modules/prebidServerBidAdapter/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import events from '../../src/events';
import includes from 'core-js/library/fn/array/includes';
import { S2S_VENDORS } from './config.js';
import { ajax } from '../../src/ajax';
import find from 'core-js/library/fn/array/find';

const getConfig = config.getConfig;

Expand Down Expand Up @@ -492,6 +493,12 @@ const OPEN_RTB_PROTOCOL = {

Object.assign(imp, mediaTypes);

// if storedAuctionResponse has been set, pass SRID
const storedAuctionResponseBid = find(bidRequests[0].bids, bid => (bid.adUnitCode === adUnit.code && typeof bid.storedAuctionResponse === 'number'));
if (storedAuctionResponseBid) {
utils.deepSetValue(imp, 'ext.prebid.storedauctionresponse.id', storedAuctionResponseBid.storedAuctionResponse.toString());
}

if (imp.banner || imp.video || imp.native) {
imps.push(imp);
}
Expand Down
5 changes: 5 additions & 0 deletions modules/rubiconBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,11 @@ export const spec = {
utils.deepSetValue(data.imp[0].ext, 'context.data.adslot', pbAdSlot);
}

// if storedAuctionResponse has been set, pass SRID
if (typeof bidRequest.storedAuctionResponse === 'number') {
utils.deepSetValue(data.imp[0], 'ext.prebid.storedauctionresponse.id', bidRequest.storedAuctionResponse.toString());
}

return {
method: 'POST',
url: VIDEO_ENDPOINT,
Expand Down
3 changes: 2 additions & 1 deletion src/adapterManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ function getBids({bidderCode, auctionId, bidderRequestId, adUnits, labels, src})
bid = Object.assign({}, bid, getDefinedParams(adUnit, [
'fpd',
'mediaType',
'renderer'
'renderer',
'storedAuctionResponse'
]));

let {
Expand Down
113 changes: 64 additions & 49 deletions src/auction.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
let _winningBids = [];
let _timelyBidders = new Set();

function addBidRequests(bidderRequests) { _bidderRequests = _bidderRequests.concat(bidderRequests) };
function addBidRequests(bidderRequests) { _bidderRequests = _bidderRequests.concat(bidderRequests); }
function addBidReceived(bidsReceived) { _bidsReceived = _bidsReceived.concat(bidsReceived); }
function addNoBid(noBid) { _noBids = _noBids.concat(noBid); }

Expand Down Expand Up @@ -213,62 +213,73 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a

let bidRequests = adapterManager.makeBidRequests(_adUnits, _auctionStart, _auctionId, _timeout, _labels);
utils.logInfo(`Bids Requested for Auction with id: ${_auctionId}`, bidRequests);
bidRequests.forEach(bidRequest => {
addBidRequests(bidRequest);
});

let requests = {};

if (bidRequests.length < 1) {
utils.logWarn('No valid bid requests returned for auction');
auctionDone();
} else {
let call = {
bidRequests,
run: () => {
startAuctionTimer();

_auctionStatus = AUCTION_IN_PROGRESS;

events.emit(CONSTANTS.EVENTS.AUCTION_INIT, getProperties());

let callbacks = auctionCallbacks(auctionDone, this);
adapterManager.callBids(_adUnits, bidRequests, function(...args) {
addBidResponse.apply({
dispatch: callbacks.addBidResponse,
bidderRequest: this
}, args)
}, callbacks.adapterDone, {
request(source, origin) {
increment(outstandingRequests, origin);
increment(requests, source);

if (!sourceInfo[source]) {
sourceInfo[source] = {
SRA: true,
origin
};
}
if (requests[source] > 1) {
sourceInfo[source].SRA = false;
}
},
done(origin) {
outstandingRequests[origin]--;
if (queuedCalls[0]) {
if (runIfOriginHasCapacity(queuedCalls[0])) {
queuedCalls.shift();
}
addBidderRequests.call({
dispatch: addBidderRequestsCallback,
context: this
}, bidRequests);
}
}

/**
* callback executed after addBidderRequests completes
* @param {BidRequest[]} bidRequests
*/
function addBidderRequestsCallback(bidRequests) {
bidRequests.forEach(bidRequest => {
addBidRequests(bidRequest);
});

let requests = {};
let call = {
bidRequests,
run: () => {
startAuctionTimer();

_auctionStatus = AUCTION_IN_PROGRESS;

events.emit(CONSTANTS.EVENTS.AUCTION_INIT, getProperties());

let callbacks = auctionCallbacks(auctionDone, this);
adapterManager.callBids(_adUnits, bidRequests, function(...args) {
addBidResponse.apply({
dispatch: callbacks.addBidResponse,
bidderRequest: this
}, args)
}, callbacks.adapterDone, {
request(source, origin) {
increment(outstandingRequests, origin);
increment(requests, source);

if (!sourceInfo[source]) {
sourceInfo[source] = {
SRA: true,
origin
};
}
if (requests[source] > 1) {
sourceInfo[source].SRA = false;
}
},
done(origin) {
outstandingRequests[origin]--;
if (queuedCalls[0]) {
if (runIfOriginHasCapacity(queuedCalls[0])) {
queuedCalls.shift();
}
}
}, _timeout, onTimelyResponse);
}
};

if (!runIfOriginHasCapacity(call)) {
utils.logWarn('queueing auction due to limited endpoint capacity');
queuedCalls.push(call);
}
}, _timeout, onTimelyResponse);
}
};

if (!runIfOriginHasCapacity(call)) {
utils.logWarn('queueing auction due to limited endpoint capacity');
queuedCalls.push(call);
}

function runIfOriginHasCapacity(call) {
Expand Down Expand Up @@ -344,6 +355,10 @@ export const addBidResponse = hook('async', function(adUnitCode, bid) {
this.dispatch.call(this.bidderRequest, adUnitCode, bid);
}, 'addBidResponse');

export const addBidderRequests = hook('sync', function(bidderRequests) {
this.dispatch.call(this.context, bidderRequests);
}, 'addBidderRequests');

export const bidsBackCallback = hook('async', function (adUnits, callback) {
if (callback) {
callback();
Expand Down
112 changes: 87 additions & 25 deletions src/debugging.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@

import { config } from './config';
import { logMessage as utilsLogMessage, logWarn as utilsLogWarn } from './utils';
import { addBidResponse } from './auction';
import { addBidderRequests, addBidResponse } from './auction';

const OVERRIDE_KEY = '$$PREBID_GLOBAL$$:debugging';

export let boundHook;
export let addBidResponseBound;
export let addBidderRequestsBound;

function logMessage(msg) {
utilsLogMessage('DEBUG: ' + msg);
Expand All @@ -15,52 +16,113 @@ function logWarn(msg) {
utilsLogWarn('DEBUG: ' + msg);
}

function removeHook() {
addBidResponse.getHooks({hook: boundHook}).remove()
function addHooks(overrides) {
addBidResponseBound = addBidResponseHook.bind(overrides);
addBidResponse.before(addBidResponseBound, 5);

addBidderRequestsBound = addBidderRequestsHook.bind(overrides);
addBidderRequests.before(addBidderRequestsBound, 5);
}

function removeHooks() {
addBidResponse.getHooks({hook: addBidResponseBound}).remove();
addBidderRequests.getHooks({hook: addBidderRequestsBound}).remove();
}

function enableOverrides(overrides, fromSession = false) {
export function enableOverrides(overrides, fromSession = false) {
config.setConfig({'debug': true});
removeHooks();
addHooks(overrides);
logMessage(`bidder overrides enabled${fromSession ? ' from session' : ''}`);

removeHook();

boundHook = addBidResponseHook.bind(overrides);
addBidResponse.before(boundHook, 5);
}

export function disableOverrides() {
removeHook();
removeHooks();
logMessage('bidder overrides disabled');
}

/**
* @param {{bidder:string, adUnitCode:string}} overrideObj
* @param {string} bidderCode
* @param {string} adUnitCode
* @returns {boolean}
*/
export function bidExcluded(overrideObj, bidderCode, adUnitCode) {
if (overrideObj.bidder && overrideObj.bidder !== bidderCode) {
return true;
}
if (overrideObj.adUnitCode && overrideObj.adUnitCode !== adUnitCode) {
return true;
}
return false;
}

/**
* @param {string[]} bidders
* @param {string} bidderCode
* @returns {boolean}
*/
export function bidderExcluded(bidders, bidderCode) {
return (Array.isArray(bidders) && bidders.indexOf(bidderCode) === -1);
}

/**
* @param {Object} overrideObj
* @param {Object} bidObj
* @param {Object} bidType
* @returns {Object} bidObj with overridden properties
*/
export function applyBidOverrides(overrideObj, bidObj, bidType) {
return Object.keys(overrideObj).filter(key => (['adUnitCode', 'bidder'].indexOf(key) === -1)).reduce(function(result, key) {
logMessage(`bidder overrides changed '${result.adUnitCode}/${result.bidderCode}' ${bidType}.${key} from '${result[key]}' to '${overrideObj[key]}'`);
result[key] = overrideObj[key];
return result;
}, bidObj);
}

export function addBidResponseHook(next, adUnitCode, bid) {
let overrides = this;
if (Array.isArray(overrides.bidders) && overrides.bidders.indexOf(bid.bidderCode) === -1) {
const overrides = this;

if (bidderExcluded(overrides.bidders, bid.bidderCode)) {
logWarn(`bidder '${bid.bidderCode}' excluded from auction by bidder overrides`);
return;
}

if (Array.isArray(overrides.bids)) {
overrides.bids.forEach(overrideBid => {
if (overrideBid.bidder && overrideBid.bidder !== bid.bidderCode) {
return;
}
if (overrideBid.adUnitCode && overrideBid.adUnitCode !== adUnitCode) {
return;
overrides.bids.forEach(function(overrideBid) {
if (!bidExcluded(overrideBid, bid.bidderCode, adUnitCode)) {
applyBidOverrides(overrideBid, bid, 'bidder');
}
});
}

bid = Object.assign({}, bid);
next(adUnitCode, bid);
}

Object.keys(overrideBid).filter(key => ['bidder', 'adUnitCode'].indexOf(key) === -1).forEach((key) => {
let value = overrideBid[key];
logMessage(`bidder overrides changed '${adUnitCode}/${bid.bidderCode}' bid.${key} from '${bid[key]}' to '${value}'`);
bid[key] = value;
export function addBidderRequestsHook(next, bidderRequests) {
const overrides = this;

const includedBidderRequests = bidderRequests.filter(function(bidderRequest) {
if (bidderExcluded(overrides.bidders, bidderRequest.bidderCode)) {
logWarn(`bidRequest '${bidderRequest.bidderCode}' excluded from auction by bidder overrides`);
return false;
}
return true;
});

if (Array.isArray(overrides.bidRequests)) {
includedBidderRequests.forEach(function(bidderRequest) {
overrides.bidRequests.forEach(function(overrideBid) {
bidderRequest.bids.forEach(function(bid) {
if (!bidExcluded(overrideBid, bidderRequest.bidderCode, bid.adUnitCode)) {
applyBidOverrides(overrideBid, bid, 'bidRequest');
}
});
});
});
}

next(adUnitCode, bid);
next(includedBidderRequests);
}

export function getConfig(debugging) {
Expand Down
Loading