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

Merge Guardian optimised build into master #14

Merged
merged 41 commits into from
Mar 8, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
3c7a8da
Commit dist/prebid.js output file
Dec 13, 2017
3c53b20
Ignore dev build files
kelvin-chappell Jan 8, 2018
d8b896c
Add TrustX to demand partners
kelvin-chappell Jan 8, 2018
e4f9d97
Merge pull request #2 from guardian/kc-guardian-optimised-build
kelvin-chappell Jan 9, 2018
f5a4c9e
Modify Sonobi adapter to take an App Nexus targeting param
kelvin-chappell Jan 15, 2018
f8d19fd
Merge pull request #3 from guardian/kc-sonobi-appnexus
kelvin-chappell Jan 15, 2018
40d9ec7
Add hb_ttr param to ad-server targeting
kelvin-chappell Jan 29, 2018
ad97abe
Merge pull request #4 from guardian/kc-time-kv
kelvin-chappell Feb 2, 2018
e5dde7a
Add pageview ID to Sonobi bids
kelvin-chappell Feb 5, 2018
2a7ed50
Add newly-generated dist
kelvin-chappell Feb 6, 2018
bde021a
Merge pull request #5 from guardian/kc-pvid
kelvin-chappell Feb 6, 2018
32b96ab
Add improvedigital adapter
kelvin-chappell Feb 8, 2018
e4ac91e
Merge pull request #6 from guardian/kc-improve
kelvin-chappell Feb 8, 2018
7f1b3d7
Build v1 Index Exchange adapter
kelvin-chappell Feb 26, 2018
9d9aa61
Use modules.json to manage adapters in use.
kelvin-chappell Feb 26, 2018
3210874
Merge pull request #8 from guardian/kc-modules
kelvin-chappell Feb 26, 2018
842090f
Merge remote-tracking branch 'origin/guardian-optimised-build' into k…
kelvin-chappell Feb 26, 2018
32d4586
Update adapters list
kelvin-chappell Feb 26, 2018
74bebef
Update dist
kelvin-chappell Feb 26, 2018
628ea9f
Merge pull request #7 from guardian/kc-gu-index-v1
kelvin-chappell Feb 26, 2018
fb6fcfe
Replace Sonobi adapter with v1 version
kelvin-chappell Feb 27, 2018
5b58e02
Add pageViewId to Sonobi v1 adapter
kelvin-chappell Feb 27, 2018
c966405
Add AppNexus targeting to Sonobi v1 adapter
kelvin-chappell Feb 27, 2018
75bfe5c
Add doc file for Sonobi v1 adapter
kelvin-chappell Feb 27, 2018
1367d9f
Merge remote-tracking branch 'origin/guardian-optimised-build' into k…
kelvin-chappell Feb 27, 2018
6efda85
Update dist
kelvin-chappell Feb 27, 2018
18d34c3
Merge pull request #9 from guardian/kc-sonobi-v1
kelvin-chappell Feb 28, 2018
92c3c18
Stop double-encoding parameters
kelvin-chappell Feb 28, 2018
e792549
Update dist
kelvin-chappell Feb 28, 2018
aa1a425
Merge pull request #10 from guardian/kc-sonobi-v1
kelvin-chappell Feb 28, 2018
489c1cd
Fix error in Prod
kelvin-chappell Feb 28, 2018
5e2a31c
Merge pull request #11 from guardian/kc-sonobi-fix
kelvin-chappell Feb 28, 2018
78925bf
Merge remote-tracking branch 'origin/master' into kc-v1
kelvin-chappell Mar 1, 2018
ef2d1ec
Build dist
kelvin-chappell Mar 1, 2018
26c1ee3
Set hb_ttr
kelvin-chappell Mar 1, 2018
46358a0
Modify ttl value for Index adapter
kelvin-chappell Mar 5, 2018
e90a412
Update dist
kelvin-chappell Mar 5, 2018
7243aee
Merge pull request #12 from guardian/kc-v1
kelvin-chappell Mar 6, 2018
046f33d
Make sync safe
kelvin-chappell Mar 6, 2018
6bf347f
Update dist
kelvin-chappell Mar 6, 2018
d419362
Merge pull request #13 from guardian/kc-sonobi-fix
kelvin-chappell Mar 6, 2018
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Built Files
node_modules/
build
!build/dist/prebid.js

# Test Files
test/app
Expand Down
8 changes: 8 additions & 0 deletions build/dist/prebid.js

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions modules.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[
"sonobiBidAdapter",
"guIndexExchangeBidAdapter",
"trustxBidAdapter",
"improvedigitalBidAdapter"
]
183 changes: 183 additions & 0 deletions modules/guIndexExchangeBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
// Based on v0.34 /modules/indexExchangeBidAdapter.js

import * as utils from 'src/utils';
import {registerBidder} from 'src/adapters/bidderFactory';
import {STATUS} from 'src/constants';
import bidfactory from 'src/bidfactory';

const bidderCode = 'indexExchange';
const prebidVersion = encodeURIComponent('$prebid.version$');
const url = 'https://as-sec.casalemedia.com';
const timeToLive = 360;
const currency = 'USD';

// eslint-disable-next-line
const escapable = /[\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;

const escapeCharacter = function (character) {
const escaped = meta[character];
if (typeof escaped === 'string') {
return escaped;
} else {
return '\\u' + ('0000' + character.charCodeAt(0).toString(16)).slice(-4);
}
};

const quote = function (string) {
escapable.lastIndex = 0;
if (escapable.test(string)) {
return string.replace(escapable, escapeCharacter);
} else {
return string;
}
};

const serialize = function (request) {
if (typeof _IndexRequestData.requestCounter === 'undefined') {
_IndexRequestData.requestCounter = Math.floor(Math.random() * 256);
} else {
_IndexRequestData.requestCounter = (_IndexRequestData.requestCounter + 1) % 256;
}
const requestId = String((new Date().getTime() % 2592000) * 256 + _IndexRequestData.requestCounter + 256);
const sitePage = utils.getTopWindowUrl();

let json = '{"id":"' + requestId + '","site":{"page":"' + quote(sitePage) + '"';
if (typeof document.referrer === 'string' && document.referrer !== '') {
json += ',"ref":"' + quote(document.referrer) + '"';
}
json += '},"imp":[';

for (let i = 0; i < request.sizes.length; i++) {
const size = request.sizes[i];
const ext = [];
const idx = i + 1;
json += '{"id":"' + idx + '", "banner":{"w":' + size[0] + ',"h":' + size[1] + ',"topframe":1}';
ext.push('"sid":"' + quote(request.params.id) + '_' + idx + '"');
ext.push('"siteID":' + request.params.siteID);
json += ',"ext": {' + ext.join() + '}';
if (i + 1 === request.sizes.length) {
json += '}';
} else {
json += '},';
}
}

json += ']}';
return encodeURI(json);
};

const setUpIndexRequestData = function() {
if (typeof window._IndexRequestData === 'undefined') {
window._IndexRequestData = {};
window._IndexRequestData.impIDToSlotID = {};
window._IndexRequestData.reqOptions = {};
}
// clear custom targets at the beginning of every request
_IndexRequestData.targetAggregate = {'open': {}, 'private': {}};
};

export const spec = {
code: bidderCode,

/**
* Determines whether or not the given bid request is valid.
*
* @param {BidRequest} request The bid params to validate.
* @return boolean True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: function (request) {
return !!(request.params.id && request.params.siteID);
},

/**
* Make a server request from the list of BidRequests.
*
* @param {BidRequest[]} validBidRequests - an array of bids
* @return ServerRequest[] Info describing the request to the server.
*/
buildRequests: function (validBidRequests) {
const serverRequests = [];

setUpIndexRequestData();

for (let i = 0; i < validBidRequests.length; i++) {
const request = validBidRequests[i];
const path = '/cygnus?v=7&fn=cygnus_index_parse_res&s=' + request.params.siteID + '&r=' + serialize(request) + '&pid=pb' + prebidVersion;

serverRequests.push({
method: 'GET',
url: url + path,
bidRequest: request
});
}

return serverRequests;
},

/**
* Unpack the response from the server into a list of bids.
*
* @param {*} serverResponse A successful response from the server.
* @param {*} bidRequest
* @return {Bid[]} An array of bids which were nested inside the server.
*/
interpretResponse: function (serverResponse, bidRequest) {
const bidResponses = [];

const response = JSON.parse(serverResponse.body.replace(/^cygnus_index_parse_res\((.+)\);$/, '$1'));
const seatbidLength = typeof response.seatbid === 'undefined' ? 0 : response.seatbid.length;

if (seatbidLength === 0) {
const bidResponse = bidfactory.createBid(STATUS.NO_BID);
bidResponse.requestId = bidRequest.bidRequest.bidId;
bidResponse.bidderCode = bidderCode;
bidResponse.cpm = 0;
bidResponse.width = 0;
bidResponse.height = 0;
bidResponse.ttl = timeToLive;
bidResponse.creativeId = '';
bidResponse.netRevenue = true;
bidResponse.currency = currency;
bidResponses.push(bidResponse);
}

for (let i = 0; i < seatbidLength; i++) {
for (let j = 0; j < response.seatbid[i].bid.length; j++) {
const bid = response.seatbid[i].bid[j];
if (typeof bid.ext !== 'object' || typeof bid.ext.pricelevel !== 'string') {
continue;
}
const bidResponse = bidfactory.createBid(STATUS.GOOD);
bidResponse.requestId = bidRequest.bidRequest.bidId;
bidResponse.bidderCode = bidderCode;
const size = bidRequest.bidRequest.sizes[bid.impid - 1];
bidResponse.width = size[0];
bidResponse.height = size[1];
if (typeof bid.ext.dealid !== 'undefined') {
bidResponse.dealID = bid.ext.dealid;
}
if (typeof bid.ext.pricelevel === 'string') {
let priceLevel = bid.ext.pricelevel;
if (priceLevel.charAt(0) === '_') priceLevel = priceLevel.slice(1);
bidResponse.cpm = priceLevel / 100;
if (!utils.isNumber(bidResponse.cpm) || isNaN(bidResponse.cpm)) {
utils.logInfo('Cygnus returned invalid price');
bidResponse.cpm = 0;
}
} else {
bidResponse.cpm = 0;
}
bidResponse.ttl = timeToLive;
bidResponse.ad = bid.adm;
bidResponse.creativeId = bid.crid;
bidResponse.netRevenue = true;
bidResponse.currency = currency;
bidResponses.push(bidResponse);
}
}

return bidResponses;
},
};

registerBidder(spec);
13 changes: 11 additions & 2 deletions modules/sonobiBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,18 @@ export const spec = {
'key_maker': JSON.stringify(data),
'ref': getTopWindowLocation().host,
's': utils.generateUUID(),
'pv': PAGEVIEW_ID,
};

if (validBidRequests[0].params.pageViewId) {
payload.pv = validBidRequests[0].params.pageViewId;
} else {
payload.pv = PAGEVIEW_ID;
}

if (validBidRequests[0].params.appNexusTargeting) {
payload.gmgt = validBidRequests[0].params.appNexusTargeting;
}

if (validBidRequests[0].params.hfa) {
payload.hfa = validBidRequests[0].params.hfa;
}
Expand Down Expand Up @@ -105,7 +114,7 @@ export const spec = {
*/
getUserSyncs: (syncOptions, serverResponses) => {
const syncs = [];
if (syncOptions.pixelEnabled && serverResponses[0].body.sbi_px) {
if (syncOptions.pixelEnabled && serverResponses && serverResponses[0] && serverResponses[0].body && serverResponses[0].body.sbi_px) {
serverResponses[0].body.sbi_px.forEach(pixel => {
syncs.push({
type: pixel.type,
Expand Down
6 changes: 6 additions & 0 deletions src/auction.js
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,12 @@ export function getStandardBidderSettings() {
return bidResponse.mediaType;
}
},
{
key: 'hb_ttr',
val: function (bidResponse) {
return bidResponse.timeToRespond;
}
},
]
}
return bidder_settings[CONSTANTS.JSON_MAPPING.BD_SETTING_STANDARD];
Expand Down
3 changes: 2 additions & 1 deletion src/constants.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@
"hb_size",
"hb_deal",
"hb_source",
"hb_format"
"hb_format",
"hb_ttr"
],
"S2S" : {
"SRC" : "s2s",
Expand Down
13 changes: 12 additions & 1 deletion src/targeting.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ export function newTargeting(auctionManager) {
}
};

function addTimedOutIncompleteAuction(adUnitCode, targeting) {
return targeting.push({[adUnitCode]: [{hb_ttr: [-1]}]});
}

/**
* Returns all ad server targeting for all ad units.
* @param {string=} adUnitCode
Expand All @@ -59,7 +63,8 @@ export function newTargeting(auctionManager) {

// Get targeting for the winning bid. Add targeting for any bids that have
// `alwaysUseBid=true`. If sending all bids is enabled, add targeting for losing bids.
var targeting = getWinningBidTargeting(adUnitCodes, bidsReceived)
const winningBidTargeting = getWinningBidTargeting(adUnitCodes, bidsReceived);
var targeting = winningBidTargeting
.concat(getCustomBidTargeting(adUnitCodes, bidsReceived))
.concat(config.getConfig('enableSendAllBids') ? getBidLandscapeTargeting(adUnitCodes, bidsReceived) : []);

Expand All @@ -74,6 +79,12 @@ export function newTargeting(auctionManager) {
});
});

const winningBid = winningBidTargeting.length > 0;
const allBidsReceived = bidsReceived.length === auctionManager.getBidsRequested().length;
if (!(winningBid || allBidsReceived)) {
addTimedOutIncompleteAuction(adUnitCodes[0], targeting);
}

targeting = flattenTargeting(targeting);
return targeting;
};
Expand Down
7 changes: 7 additions & 0 deletions test/spec/auctionmanager_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ describe('auctionmanager.js', function () {
var source = 'client';
var mediatype = 'banner';

const timeToRespond = 123;

before(function () {
bid.cpm = bidPriceCpm;
bid.pbLg = bidPbLg;
Expand All @@ -67,6 +69,7 @@ describe('auctionmanager.js', function () {
bid.adId = adId;
bid.source = source;
bid.mediaType = mediatype;
bid.timeToRespond = timeToRespond;
});

it('No bidder level configuration defined - default', function () {
Expand All @@ -77,6 +80,7 @@ describe('auctionmanager.js', function () {
'hb_size': size,
'hb_source': source,
'hb_format': mediatype,
'hb_ttr': timeToRespond,
};
var response = getKeyValueTargetingPairs(bidderCode, bid, CONSTANTS.GRANULARITY_OPTIONS.MEDIUM);
assert.deepEqual(response, expected);
Expand Down Expand Up @@ -177,6 +181,7 @@ describe('auctionmanager.js', function () {
'hb_size': size,
'hb_source': source,
'hb_format': mediatype,
'hb_ttr': timeToRespond,
};
var response = getKeyValueTargetingPairs(bidderCode, bid);
assert.deepEqual(response, expected);
Expand Down Expand Up @@ -221,6 +226,7 @@ describe('auctionmanager.js', function () {
'hb_size': size,
'hb_source': source,
'hb_format': mediatype,
'hb_ttr': timeToRespond
};
var response = getKeyValueTargetingPairs(bidderCode, bid, CONSTANTS.GRANULARITY_OPTIONS.MEDIUM);
assert.deepEqual(response, expected);
Expand Down Expand Up @@ -387,6 +393,7 @@ describe('auctionmanager.js', function () {
'hb_size': '300x250',
'hb_source': source,
'hb_format': mediatype,
'hb_ttr': timeToRespond,
};
var response = getKeyValueTargetingPairs(bidderCode, bid);
assert.deepEqual(response, expected);
Expand Down
Loading