mk9-prebid
Version:
Header Bidding Management Library
161 lines (149 loc) • 4.32 kB
JavaScript
import * as utils from '../src/utils.js';
import {BANNER} from '../src/mediaTypes.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {getStorageManager} from '../src/storageManager.js';
const storage = getStorageManager();
const BIDDER_CODE = 'unicorn';
const UNICORN_ENDPOINT = 'https://ds.uncn.jp/pb/0/bid.json';
const UNICORN_DEFAULT_CURRENCY = 'JPY';
const UNICORN_PB_COOKIE_KEY = '__pb_unicorn_aud';
const UNICORN_PB_VERSION = '1.0';
/**
* Placement ID and Account ID are required.
* @param {BidRequest} bidRequest
* @returns {boolean}
*/
const isBidRequestValid = bidRequest => {
return !!bidRequest.adUnitCode && !!bidRequest.params.accountId;
};
/**
* @param {Array<BidRequest>} validBidRequests
* @param {any} bidderRequest
* @returns {ServerRequest}
*/
export const buildRequests = (validBidRequests, bidderRequest) => {
return {
method: 'POST',
url: UNICORN_ENDPOINT,
data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest)
};
};
/**
* Transform BidRequest to OpenRTB-formatted BidRequest Object
* @param {Array<BidRequest>} validBidRequests
* @param {any} bidderRequest
* @returns {string}
*/
function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
utils.logInfo('[UNICORN] buildOpenRtbBidRequestPayload.validBidRequests:', validBidRequests);
utils.logInfo('[UNICORN] buildOpenRtbBidRequestPayload.bidderRequest:', bidderRequest);
const imp = validBidRequests.map(br => {
return {
id: br.bidId,
banner: {
format: makeFormat(br.sizes),
w: br.sizes[0][0],
h: br.sizes[0][1]
},
tagid: utils.deepAccess(br, 'params.placementId') || br.adUnitCode,
secure: 1,
bidfloor: parseFloat(0)
};
});
const request = {
id: bidderRequest.auctionId,
at: 1,
imp,
cur: UNICORN_DEFAULT_CURRENCY,
site: {
id: utils.deepAccess(validBidRequests[0], 'params.mediaId') || '',
publisher: {
id: utils.deepAccess(validBidRequests[0], 'params.publisherId') || 0
},
domain: window.location.hostname,
page: window.location.href,
ref: bidderRequest.refererInfo.referer
},
device: {
language: navigator.language,
ua: navigator.userAgent
},
user: {
id: getUid()
},
bcat: utils.deepAccess(validBidRequests[0], 'params.bcat') || [],
source: {
ext: {
stype: 'prebid_uncn',
bidder: BIDDER_CODE,
prebid_version: UNICORN_PB_VERSION
}
},
ext: {
accountId: utils.deepAccess(validBidRequests[0], 'params.accountId')
}
};
utils.logInfo('[UNICORN] OpenRTB Formatted Request:', request);
return JSON.stringify(request);
}
const interpretResponse = (serverResponse, request) => {
utils.logInfo('[UNICORN] interpretResponse.serverResponse:', serverResponse);
utils.logInfo('[UNICORN] interpretResponse.request:', request);
const res = serverResponse.body;
var bids = []
if (res) {
res.seatbid.forEach(sb => {
sb.bid.forEach(b => {
var bid = {
requestId: b.impid,
cpm: b.price || 0,
width: b.w,
height: b.h,
ad: b.adm,
ttl: 1000,
creativeId: b.crid,
netRevenue: false,
currency: res.cur
}
if (b.adomain != undefined || b.adomain != null) {
bid.meta = { advertiserDomains: b.adomain };
}
bids.push(bid)
})
});
}
utils.logInfo('[UNICORN] interpretResponse bids:', bids);
return bids;
};
/**
* Get or Create Uid for First Party Cookie
*/
const getUid = () => {
const ck = storage.getCookie(UNICORN_PB_COOKIE_KEY);
if (ck) {
return JSON.parse(ck)['uid'];
} else {
const newCk = {
uid: utils.generateUUID()
};
const expireIn = new Date(Date.now() + 24 * 60 * 60 * 10000).toUTCString();
storage.setCookie(UNICORN_PB_COOKIE_KEY, JSON.stringify(newCk), expireIn);
return newCk.uid;
}
};
/**
* Make imp.banner.format
* @param {Array<Number>} arr
*/
const makeFormat = arr => arr.map((s) => {
return {w: s[0], h: s[1]};
});
export const spec = {
code: BIDDER_CODE,
aliases: ['uncn'],
supportedMediaTypes: [BANNER],
isBidRequestValid,
buildRequests,
interpretResponse
};
registerBidder(spec);