mk9-prebid
Version:
Header Bidding Management Library
159 lines (134 loc) • 4.53 kB
JavaScript
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
import * as utils from '../src/utils.js';
const BIDDER_CODE = 'microad';
const ENDPOINT_URLS = {
'production': 'https://s-rtb-pb.send.microad.jp/prebid',
'test': 'https://rtbtest.send.microad.jp/prebid'
};
export let ENVIRONMENT = 'production';
/* eslint-disable no-template-curly-in-string */
const EXT_URL_STRING = '${COMPASS_EXT_URL}';
const EXT_REF_STRING = '${COMPASS_EXT_REF}';
const EXT_IFA_STRING = '${COMPASS_EXT_IFA}';
const EXT_APPID_STRING = '${COMPASS_EXT_APPID}';
const EXT_GEO_STRING = '${COMPASS_EXT_GEO}';
/* eslint-enable no-template-curly-in-string */
const BANNER_CODE = 1;
const NATIVE_CODE = 2;
const VIDEO_CODE = 4;
function createCBT() {
const randomValue = Math.floor(Math.random() * Math.pow(10, 18)).toString(16);
const date = new Date().getTime().toString(16);
return randomValue + date;
}
function createBitSequenceFromMediaType(hi, code) {
return (hi ? -1 : 0) & code;
}
function convertMediaTypes(bid) {
return createBitSequenceFromMediaType(bid.mediaTypes.banner, BANNER_CODE) |
createBitSequenceFromMediaType(bid.mediaTypes.native, NATIVE_CODE) |
createBitSequenceFromMediaType(bid.mediaTypes.video, VIDEO_CODE);
}
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [BANNER],
isBidRequestValid: function(bid) {
return !!(bid && bid.params && bid.params.spot && bid.mediaTypes && (bid.mediaTypes.banner || bid.mediaTypes.native || bid.mediaTypes.video));
},
buildRequests: function(validBidRequests, bidderRequest) {
const requests = [];
validBidRequests.forEach(bid => {
const bidParams = bid.params;
const params = {
spot: bidParams.spot,
url: bidderRequest.refererInfo.canonicalUrl || window.location.href,
referrer: bidderRequest.refererInfo.referer,
bid_id: bid.bidId,
transaction_id: bid.transactionId,
media_types: convertMediaTypes(bid),
cbt: createCBT()
};
if (bidParams.url) {
params['url_macro'] = bidParams.url.replace(EXT_URL_STRING, '');
}
if (bidParams.referrer) {
params['referrer_macro'] = bidParams.referrer.replace(EXT_REF_STRING, '');
}
if (bidParams.ifa) {
params['ifa'] = bidParams.ifa.replace(EXT_IFA_STRING, '');
}
if (bidParams.appid) {
params['appid'] = bidParams.appid.replace(EXT_APPID_STRING, '');
}
if (bidParams.geo) {
const geo = bidParams.geo.replace(EXT_GEO_STRING, '');
if (/^[0-9.\-]+,[0-9.\-]+$/.test(geo)) {
params['geo'] = geo;
}
}
const idlEnv = utils.deepAccess(bid, 'userId.idl_env')
if (!utils.isEmpty(idlEnv) && utils.isStr(idlEnv)) {
params['idl_env'] = idlEnv
}
requests.push({
method: 'GET',
url: ENDPOINT_URLS[ENVIRONMENT],
data: params,
options: { Accept: 'application/json' }
});
});
return requests;
},
interpretResponse: function(serverResponse) {
const body = serverResponse.body;
const bidResponses = [];
if (body.cpm && body.cpm > 0) {
const bidResponse = {
requestId: body.requestId,
cpm: body.cpm,
width: body.width,
height: body.height,
ad: body.ad,
ttl: body.ttl,
creativeId: body.creativeId,
netRevenue: body.netRevenue,
currency: body.currency,
meta: body.meta || { advertiserDomains: [] }
};
if (body.dealId) {
bidResponse['dealId'] = body.dealId;
}
bidResponses.push(bidResponse);
}
return bidResponses;
},
getUserSyncs: function(syncOptions, serverResponses) {
const syncs = [];
if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) {
return syncs;
}
serverResponses.forEach(resp => {
const syncIframeUrls = resp.body.syncUrls.iframe;
const syncImageUrls = resp.body.syncUrls.image;
if (syncOptions.iframeEnabled && syncIframeUrls) {
syncIframeUrls.forEach(syncIframeUrl => {
syncs.push({
type: 'iframe',
url: syncIframeUrl
});
});
}
if (syncOptions.pixelEnabled && syncImageUrls) {
syncImageUrls.forEach(syncImageUrl => {
syncs.push({
type: 'image',
url: syncImageUrl
});
});
}
});
return syncs;
}
};
registerBidder(spec);