mk9-prebid
Version:
Header Bidding Management Library
215 lines (198 loc) • 7.63 kB
JavaScript
import * as utils from '../src/utils.js';
import {config} from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import { Renderer } from '../src/Renderer.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';
const BIDDER_CODE = 'yieldone';
const ENDPOINT_URL = 'https://y.one.impact-ad.jp/h_bid';
const USER_SYNC_URL = 'https://y.one.impact-ad.jp/push_sync';
const VIDEO_PLAYER_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/dac-video-prebid.min.js';
const CMER_PLAYER_URL = 'https://an.cmertv.com/hb/renderer/cmertv-video-yone-prebid.min.js';
const VIEWABLE_PERCENTAGE_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/prebid-adformat-config.js';
export const spec = {
code: BIDDER_CODE,
aliases: ['y1'],
supportedMediaTypes: [BANNER, VIDEO],
isBidRequestValid: function(bid) {
return !!(bid.params.placementId);
},
buildRequests: function(validBidRequests, bidderRequest) {
return validBidRequests.map(bidRequest => {
const params = bidRequest.params;
const placementId = params.placementId;
const cb = Math.floor(Math.random() * 99999999999);
const referrer = bidderRequest.refererInfo.referer;
const bidId = bidRequest.bidId;
const transactionId = bidRequest.transactionId;
const unitCode = bidRequest.adUnitCode;
const timeout = config.getConfig('bidderTimeout');
const payload = {
v: 'hb1',
p: placementId,
cb: cb,
r: referrer,
uid: bidId,
tid: transactionId,
uc: unitCode,
tmax: timeout,
t: 'i'
};
const videoMediaType = utils.deepAccess(bidRequest, 'mediaTypes.video');
if ((utils.isEmpty(bidRequest.mediaType) && utils.isEmpty(bidRequest.mediaTypes)) ||
(bidRequest.mediaType === BANNER || (bidRequest.mediaTypes && bidRequest.mediaTypes[BANNER]))) {
const sizes = utils.deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes;
payload.sz = utils.parseSizesInput(sizes).join(',');
} else if (bidRequest.mediaType === VIDEO || videoMediaType) {
const sizes = utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize') || bidRequest.sizes;
const size = utils.parseSizesInput(sizes)[0];
payload.w = size.split('x')[0];
payload.h = size.split('x')[1];
}
// LiveRampID
const idlEnv = utils.deepAccess(bidRequest, 'userId.idl_env');
if (utils.isStr(idlEnv) && !utils.isEmpty(idlEnv)) {
payload.lr_env = idlEnv;
}
return {
method: 'GET',
url: ENDPOINT_URL,
data: payload,
}
});
},
interpretResponse: function(serverResponse, bidRequest) {
const bidResponses = [];
const response = serverResponse.body;
const crid = response.crid || 0;
const width = response.width || 0;
const height = response.height || 0;
const cpm = response.cpm * 1000 || 0;
if (width !== 0 && height !== 0 && cpm !== 0 && crid !== 0) {
const dealId = response.dealId || '';
const renderId = response.renderid || '';
const currency = response.currency || 'JPY';
const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
const referrer = bidRequest.data.r || '';
const bidResponse = {
requestId: response.uid,
cpm: cpm,
width: response.width,
height: response.height,
creativeId: crid,
dealId: dealId,
currency: currency,
netRevenue: netRevenue,
ttl: config.getConfig('_bidderTimeout'),
referrer: referrer,
meta: {
advertiserDomains: response.adomain ? response.adomain : []
},
};
if (response.adTag && renderId === 'ViewableRendering') {
bidResponse.mediaType = BANNER;
let viewableScript = `
<script src="${VIEWABLE_PERCENTAGE_URL}"></script>
<script>
let width =${bidResponse.width};
let height =${bidResponse.height};
let adTag = \`${response.adTag.replace(/\\/g, '\\\\').replace(/\//g, '\\/').replace(/'/g, "\\'").replace(/"/g, '\\"')}\`;
let targetId ="${bidRequest.data.uc}";
window.YONEPBViewable = {};
window.YONEPBViewable.executed = false;
const viewablePercentage = window.pb_conf.viewablePercentage;
const viewableRange = height * 0.01 * viewablePercentage;
const iframe = document.createElement('iframe');
iframe.setAttribute("style", "border: 0; margin: 0 auto; left: 0; top: 0; width:" + width + "px; height:" + height + "px;");
iframe.frameBorder = 0; iframe.scrolling = 'no';
const inDap = document.createElement('script');
inDap.innerHTML = "inDapIF = true;";
iframe.appendChild(inDap);
window.frameElement.parentElement.appendChild(iframe);
const doc = iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument;
if(!window.parent.$sf){
let target = window.top.document.getElementById(targetId);
window.top.addEventListener('scroll', () => {
const targetRect = target.getBoundingClientRect();
if (!window.YONEPBViewable.executed && window.top.innerHeight - targetRect.top > viewableRange) {
window.YONEPBViewable.executed = true;
doc.open(); doc.write(adTag); doc.close();
window.frameElement.style.display = "none";
}
}, false);
}else{
let disp = function(){
if(!window.YONEPBViewable.executed && window.parent.$sf.ext.inViewPercentage() > viewablePercentage){
window.YONEPBViewable.executed = true;
doc.open(); doc.write(adTag); doc.close();
window.frameElement.style.display = "none";
}
let id = setTimeout(disp, 100);
if(window.YONEPBViewable.executed){clearTimeout(id);}
};
disp();
}
</script>
`;
bidResponse.ad = viewableScript;
} else if (response.adTag) {
bidResponse.mediaType = BANNER;
bidResponse.ad = response.adTag;
} else if (response.adm) {
bidResponse.mediaType = VIDEO;
bidResponse.vastXml = response.adm;
if (renderId === 'cmer') {
bidResponse.renderer = newCmerRenderer(response);
} else {
bidResponse.renderer = newRenderer(response);
}
}
bidResponses.push(bidResponse);
}
return bidResponses;
},
getUserSyncs: function(syncOptions) {
if (syncOptions.iframeEnabled) {
return [{
type: 'iframe',
url: USER_SYNC_URL
}];
}
},
}
function newRenderer(response) {
const renderer = Renderer.install({
id: response.uid,
url: VIDEO_PLAYER_URL,
loaded: false,
});
try {
renderer.setRender(outstreamRender);
} catch (err) {
utils.logWarn('Prebid Error calling setRender on newRenderer', err);
}
return renderer;
}
function outstreamRender(bid) {
bid.renderer.push(() => {
window.DACIVTPREBID.renderPrebid(bid);
});
}
function newCmerRenderer(response) {
const renderer = Renderer.install({
id: response.uid,
url: CMER_PLAYER_URL,
loaded: false,
});
try {
renderer.setRender(cmerRender);
} catch (err) {
utils.logWarn('Prebid Error calling setRender on newRenderer', err);
}
return renderer;
}
function cmerRender(bid) {
bid.renderer.push(() => {
window.CMERYONEPREBID.renderPrebid(bid);
});
}
registerBidder(spec);