Skip to content

Commit

Permalink
Merge pull request #4 from playground-xyz/master-updated-upstream
Browse files Browse the repository at this point in the history
Master updated upstream
  • Loading branch information
LucaConfa authored May 16, 2018
2 parents ac1dfeb + 814763e commit f0b84d9
Show file tree
Hide file tree
Showing 26 changed files with 1,614 additions and 109 deletions.
3 changes: 2 additions & 1 deletion karma.conf.maker.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ module.exports = function(codeCoverage, browserstack, watchMode, file) {

reporters: ['mocha'],
mochaReporter: {
showDiff: true
showDiff: true,
output: 'minimal'
},

// Continuous Integration mode
Expand Down
159 changes: 159 additions & 0 deletions modules/aardvarkBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
import * as utils from 'src/utils';
import {registerBidder} from 'src/adapters/bidderFactory';

const BIDDER_CODE = 'aardvark';
const DEFAULT_ENDPOINT = 'bidder.rtk.io';
const SYNC_ENDPOINT = 'sync.rtk.io';
const AARDVARK_TTL = 300;
const AARDVARK_CURRENCY = 'USD';

let hasSynced = false;

export function resetUserSync() {
hasSynced = false;
}

export const spec = {
code: BIDDER_CODE,

isBidRequestValid: function(bid) {
return ((typeof bid.params.ai === 'string') && !!bid.params.ai.length &&
(typeof bid.params.sc === 'string') && !!bid.params.sc.length);
},

buildRequests: function(validBidRequests, bidderRequest) {
var auctionCodes = [];
var requests = [];
var requestsMap = {};
var referer = utils.getTopWindowUrl();
var pageCategories = [];

if (window.top.rtkcategories && Array.isArray(window.top.rtkcategories)) {
pageCategories = window.top.rtkcategories;
}

utils._each(validBidRequests, function(b) {
var rMap = requestsMap[b.params.ai];
if (!rMap) {
rMap = {
shortCodes: [],
payload: {
version: 1,
jsonp: false,
rtkreferer: referer
},
endpoint: DEFAULT_ENDPOINT
};

if (pageCategories && pageCategories.length) {
rMap.payload.categories = pageCategories.slice(0);
}

if (b.params.categories && b.params.categories.length) {
rMap.payload.categories = rMap.payload.categories || []
utils._each(b.params.categories, function(cat) {
rMap.payload.categories.push(cat);
});
}

if (bidderRequest && bidderRequest.gdprConsent) {
rMap.payload.gdpr = false;
if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
rMap.payload.gdpr = bidderRequest.gdprConsent.gdprApplies;
}
if (rMap.payload.gdpr) {
rMap.payload.consent = bidderRequest.gdprConsent.consentString;
}
}

requestsMap[b.params.ai] = rMap;
auctionCodes.push(b.params.ai);
}

rMap.shortCodes.push(b.params.sc);
rMap.payload[b.params.sc] = b.bidId;

if ((typeof b.params.host === 'string') && b.params.host.length &&
(b.params.host !== rMap.endpoint)) {
rMap.endpoint = b.params.host;
}
});

utils._each(auctionCodes, function(auctionId) {
var req = requestsMap[auctionId];
requests.push({
method: 'GET',
url: `//${req.endpoint}/${auctionId}/${req.shortCodes.join('_')}/aardvark`,
data: req.payload,
bidderRequest
});
});

return requests;
},

interpretResponse: function(serverResponse, bidRequest) {
var bidResponses = [];

if (!Array.isArray(serverResponse.body)) {
serverResponse.body = [serverResponse.body];
}

utils._each(serverResponse.body, function(rawBid) {
var bidResponse = {
requestId: rawBid.cid,
cpm: rawBid.cpm || 0,
width: rawBid.width || 0,
height: rawBid.height || 0,
currency: rawBid.currency ? rawBid.currency : AARDVARK_CURRENCY,
netRevenue: rawBid.netRevenue ? rawBid.netRevenue : true,
ttl: rawBid.ttl ? rawBid.ttl : AARDVARK_TTL,
creativeId: rawBid.creativeId || 0
};

if (rawBid.hasOwnProperty('dealId')) {
bidResponse.dealId = rawBid.dealId
}

switch (rawBid.media) {
case 'banner':
bidResponse.ad = rawBid.adm + utils.createTrackPixelHtml(decodeURIComponent(rawBid.nurl));
break;

default:
return utils.logError('bad Aardvark response (media)', rawBid);
}

bidResponses.push(bidResponse);
});

return bidResponses;
},

getUserSyncs: function(syncOptions, serverResponses, gdprConsent) {
const syncs = [];
var url = '//' + SYNC_ENDPOINT + '/cs';
var gdprApplies = false;
if (gdprConsent && (typeof gdprConsent.gdprApplies === 'boolean')) {
gdprApplies = gdprConsent.gdprApplies;
}

if (syncOptions.iframeEnabled) {
if (!hasSynced) {
hasSynced = true;
if (gdprApplies) {
url = url + '?g=1&c=' + encodeURIComponent(gdprConsent.consentString);
}
syncs.push({
type: 'iframe',
url: url
});
}
} else {
utils.logWarn('Aardvark: Please enable iframe based user sync.');
}
return syncs;
}
};

registerBidder(spec);
30 changes: 30 additions & 0 deletions modules/aardvarkBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Overview

**Module Name**: Aardvark Bidder Adapter
**Module Type**: Bidder Adapter
**Maintainer**: chris@rtk.io

# Description

Module that connects to a RTK.io Ad Units to fetch bids.

# Test Parameters
```
var adUnits = [{
mediaTypes: {
banner: {
sizes: [[300, 250]],
}
},
code: 'div-gpt-ad-1460505748561-0',
bids: [{
bidder: 'aardvark',
params: {
ai: '0000',
sc: '1234'
}
}]
}];
```
34 changes: 32 additions & 2 deletions modules/consentManagement.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ const cmpCallMap = {
* based on the appropriate result.
* @param {function(string)} cmpSuccess acts as a success callback when CMP returns a value; pass along consentObject (string) from CMP
* @param {function(string)} cmpError acts as an error callback while interacting with CMP; pass along an error message (string)
* @param {[objects]} adUnits used in the safeframe workflow to know what sizes to include in the $sf.ext.register call
*/
function lookupIabConsent(cmpSuccess, cmpError) {
function lookupIabConsent(cmpSuccess, cmpError, adUnits) {
let cmpCallbacks;

// check if the CMP is located on the same window level as the prebid code.
Expand All @@ -47,10 +48,37 @@ function lookupIabConsent(cmpSuccess, cmpError) {
// in this case, use the IAB's iframe locator sample code (which is slightly cutomized) to try to find the CMP and use postMessage() to communicate with the CMP.
if (utils.isFn(window.__cmp)) {
window.__cmp('getVendorConsents', null, cmpSuccess);
} else if (inASafeFrame() && typeof window.$sf.ext.cmp === 'function') {
callCmpWhileInSafeFrame();
} else {
callCmpWhileInIframe();
}

function inASafeFrame() {
return !!(window.$sf && window.$sf.ext);
}

function callCmpWhileInSafeFrame() {
function sfCallback(msgName, data) {
if (msgName === 'cmpReturn') {
cmpSuccess(data.vendorConsents);
}
}

// find sizes from adUnits object
let width = 1;
let height = 1;

if (Array.isArray(adUnits) && adUnits.length > 0) {
let sizes = utils.getAdUnitSizes(adUnits[0]);
width = sizes[0][0];
height = sizes[0][1];
}

window.$sf.ext.register(width, height, sfCallback);
window.$sf.ext.cmp('getVendorConsents');
}

function callCmpWhileInIframe() {
/**
* START OF STOCK CODE FROM IAB 1.1 CMP SPEC
Expand Down Expand Up @@ -134,6 +162,7 @@ export function requestBidsHook(config, fn) {
args = arguments;
nextFn = fn;
haveExited = false;
let adUnits = config.adUnits || $$PREBID_GLOBAL$$.adUnits;

// in case we already have consent (eg during bid refresh)
if (consentData) {
Expand All @@ -145,7 +174,7 @@ export function requestBidsHook(config, fn) {
return nextFn.apply(context, args);
}

cmpCallMap[userCMP].call(this, processCmpData, cmpFailed);
cmpCallMap[userCMP].call(this, processCmpData, cmpFailed, adUnits);

// only let this code run if module is still active (ie if the callbacks used by CMPs haven't already finished)
if (!haveExited) {
Expand Down Expand Up @@ -245,6 +274,7 @@ function exitModule(errMsg) {
*/
export function resetConsentData() {
consentData = undefined;
gdprDataHandler.setConsentData(null);
}

/**
Expand Down
Loading

0 comments on commit f0b84d9

Please sign in to comment.