Skip to content

Commit

Permalink
AudienceRun Bid Adapter: Add Support for User Matching, Referer, … (p…
Browse files Browse the repository at this point in the history
…rebid#8261)

* AudienceRun Bid Adapter: Add Support for User Matching, Referer, US Privacy, Schain

* fix: restore package-lock.json
  • Loading branch information
audiencerun authored and JoelPM committed Apr 25, 2022
1 parent d7e6ecf commit c1d349c
Show file tree
Hide file tree
Showing 2 changed files with 260 additions and 119 deletions.
97 changes: 75 additions & 22 deletions modules/audiencerunBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
import { deepAccess, isFn, logError, getValue, getBidIdParameter, _each, isArray, triggerPixel } from '../src/utils.js';
import {
deepAccess,
isFn,
logError,
getValue,
getBidIdParameter,
_each,
isArray,
triggerPixel,
formatQS,
} from '../src/utils.js';
import { config } from '../src/config.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
import { createEidsArray } from './userId/eids.js';

const BIDDER_CODE = 'audiencerun';
const BASE_URL = 'https://d.audiencerun.com';
const AUCTION_URL = `${BASE_URL}/prebid`;
const TIMEOUT_EVENT_URL = `${BASE_URL}/ps/pbtimeout`;
const ERROR_EVENT_URL = `${BASE_URL}/js_log`;
const DEFAULT_CURRENCY = 'USD';

let requestedBids = [];

/**
* Gets bidder request referer
*
* @param {Object} bidderRequest
* @return {string}
*/
function getPageUrl(bidderRequest) {
return (
config.getConfig('pageUrl') ||
deepAccess(bidderRequest, 'refererInfo.referer') ||
null
);
}

/**
* Returns bidfloor through floors module if available
* Returns bidfloor through floors module if available.
*
* @param {Object} bid
* @returns {number}
Expand All @@ -44,19 +42,53 @@ function getBidFloor(bid) {
});
return bidFloor.floor;
} catch (_) {
return 0
return 0;
}
}

/**
* Returns the most top page referer.
*
* @returns {string}
*/
function getPageReferer() {
let t, e;
do {
t = t ? t.parent : window;
try {
e = t.document.referrer;
} catch (_) {
break;
}
} while (t !== window.top);
return e;
}

/**
* Returns bidder request page url.
*
* @param {Object} bidderRequest
* @return {string}
*/
function getPageUrl(bidderRequest) {
return (
config.getConfig('pageUrl') ||
deepAccess(bidderRequest, 'refererInfo.referer') ||
getPageReferer() ||
null
);
}

export const spec = {
version: '1.1.0',
version: '1.2.0',
code: BIDDER_CODE,
gvlid: 944,
supportedMediaTypes: [BANNER],

/**
* Determines whether or not the given bid request is valid.
*
* @param {object} bid The bid to validate.
* @param {BidRequest} bid The bid params to validate.
* @return boolean True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: function (bid) {
Expand Down Expand Up @@ -95,12 +127,19 @@ export const spec = {

const payload = {
libVersion: this.version,
referer: getPageUrl(bidderRequest),
pageUrl: config.getConfig('pageUrl'),
pageReferer: getPageReferer(),
referer: deepAccess(bidderRequest, 'refererInfo.referer'),
refererInfo: deepAccess(bidderRequest, 'refererInfo'),
currencyCode: config.getConfig('currency.adServerCurrency'),
timeout: config.getConfig('bidderTimeout'),
bids,
};

payload.uspConsent = deepAccess(bidderRequest, 'uspConsent');
payload.schain = deepAccess(bidRequests, '0.schain');
payload.userId = deepAccess(bidRequests, '0.userId') ? createEidsArray(bidRequests[0].userId) : [];

if (bidderRequest && bidderRequest.gdprConsent) {
payload.gdpr = {
consent: bidderRequest.gdprConsent.consentString,
Expand All @@ -117,7 +156,7 @@ export const spec = {

return {
method: 'POST',
url: AUCTION_URL,
url: deepAccess(bidRequests, '0.params.auctionUrl', AUCTION_URL),
data: JSON.stringify(payload),
options: {
withCredentials: true,
Expand Down Expand Up @@ -201,7 +240,9 @@ export const spec = {
}

timeoutData.forEach((bid) => {
const bidOnTimeout = requestedBids.find((requestedBid) => requestedBid.bidId === bid.bidId);
const bidOnTimeout = requestedBids.find(
(requestedBid) => requestedBid.bidId === bid.bidId
);

if (bidOnTimeout) {
triggerPixel(
Expand All @@ -210,6 +251,18 @@ export const spec = {
}
});
},

/**
* Registers bidder specific code, which will execute if the bidder responded with an error.
* @param {{bidderRequest: object}} args An object from which we extract bidderRequest object.
*/
onBidderError: function ({ bidderRequest }) {
const queryString = formatQS({
message: `Prebid.js: Server call for ${bidderRequest.bidderCode} failed.`,
url: encodeURIComponent(getPageUrl(bidderRequest)),
});
triggerPixel(`${ERROR_EVENT_URL}/?${queryString}`);
},
};

registerBidder(spec);
Loading

0 comments on commit c1d349c

Please sign in to comment.