Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding back ZEDO adapter with changes to make it compatible to latest prebid #5276

Merged
merged 67 commits into from
Jun 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
418baed
initial commit
skazedo Jul 12, 2018
4381ccd
updated contact and tag details
skazedo Jul 13, 2018
cd09dbc
changes ti support the renderers
skazedo Jul 16, 2018
66892e6
Merge remote-tracking branch 'upstream/master'
skazedo Jul 17, 2018
f134156
changes to pass dimId
skazedo Jul 17, 2018
c5293b7
fixed names of internal mapping
skazedo Jul 19, 2018
c9e5aca
Merge remote-tracking branch 'upstream/master'
skazedo Jul 19, 2018
ed1562f
Merge remote-tracking branch 'upstream/master'
skazedo Jul 20, 2018
bf996ec
added comment
skazedo Jul 20, 2018
b9efb20
Merge remote-tracking branch 'upstream/master'
skazedo Jul 23, 2018
c768fe5
added gdpr param to request and other fixes
skazedo Jul 23, 2018
de39585
sync main branch
skazedo Aug 6, 2018
0aeb5e7
modified api url
skazedo Aug 29, 2018
b672912
Merge remote-tracking branch 'upstream/master'
skazedo Aug 29, 2018
263d670
Merge remote-tracking branch 'upstream/master'
skazedo Sep 5, 2018
7e2f030
Merge remote-tracking branch 'upstream/master'
skazedo Sep 6, 2018
7f846dd
fix
skazedo Sep 6, 2018
e75970a
fixed the secure api call
skazedo Sep 19, 2018
92165ad
Merge remote-tracking branch 'upstream/master'
skazedo Sep 19, 2018
c605a70
rolled back video event callback till we support it
skazedo Sep 19, 2018
f78d4dc
Merge remote-tracking branch 'upstream/master'
skazedo Oct 16, 2018
76aef15
updated doc with video details
skazedo Oct 17, 2018
8483174
Merge remote-tracking branch 'upstream/master'
skazedo Oct 17, 2018
26dacc6
Merge remote-tracking branch 'upstream/master'
skazedo Oct 23, 2018
c07b17e
added bid won and timeout pixel
skazedo Oct 23, 2018
a6496ba
added testcase for bid events
skazedo Oct 24, 2018
d3e19dd
modified testcase
skazedo Oct 25, 2018
4c85915
fixed the url logged
skazedo Oct 29, 2018
cdf4148
Merge remote-tracking branch 'upstream/master' into tracking
skazedo Oct 29, 2018
3d8622a
Merge remote-tracking branch 'upstream/master'
skazedo Nov 2, 2018
064dd16
Merge remote-tracking branch 'upstream/master'
skazedo Nov 7, 2018
23b0cde
tag param values passed ot renderer
skazedo Nov 8, 2018
cbd0ea6
Merge remote-tracking branch 'upstream/master'
skazedo Nov 8, 2018
a427b52
added a conditioal check
skazedo Nov 8, 2018
fef6d50
Merge remote-tracking branch 'upstream/master'
skazedo Jan 14, 2019
42762ed
changes to support new param to adserver for purpose of tracking
skazedo Jan 14, 2019
2f3f955
passed param to renderer
skazedo Jan 16, 2019
99a0a16
missing variable defined
skazedo Jan 16, 2019
d02238d
Merge remote-tracking branch 'upstream/master'
skazedo Jan 22, 2019
b89b772
Merge with upstream
skazedo Oct 25, 2019
648a3cc
changes to pass schain
skazedo Oct 28, 2019
4c2cacf
fix
skazedo Oct 28, 2019
7ea0218
added protocol to url
skazedo Oct 29, 2019
e5aec84
Merge remote-tracking branch 'upstream/master'
skazedo Oct 29, 2019
8d97f40
fixed test for protocol
skazedo Oct 29, 2019
a96e36c
Merge branch 'master' into schain
skazedo Oct 30, 2019
8961397
changed urls to secure only
skazedo Oct 31, 2019
9e85d67
Merge remote-tracking branch 'upstream/master'
skazedo Oct 31, 2019
94777f2
merged with master
skazedo Oct 31, 2019
91ff53a
Merge remote-tracking branch 'upstream/master'
skazedo Nov 1, 2019
efa71d3
Merge remote-tracking branch 'upstream/master'
skazedo Nov 4, 2019
08985cc
Merge branch 'master' into schain
skazedo Nov 4, 2019
4af131a
Merge pull request #1 from skazedo/schain
skazedo Nov 8, 2019
6450982
Marge
skazedo Nov 8, 2019
807828b
Merge remote-tracking branch 'upstream/master'
skazedo Nov 8, 2019
66476ef
Adding back zedo adapter
Apr 20, 2020
9d3494d
fixes to make it compatible to head
Apr 20, 2020
db78265
added support for ccpa
Apr 21, 2020
ff60055
Merge remote-tracking branch 'upstream/master'
May 20, 2020
7ec0e27
Fixed path of find module
May 20, 2020
70c6e5a
Remove package.json
May 28, 2020
fd46d16
Merge remote-tracking branch 'upstream/master'
May 28, 2020
c9cafc2
updated test example with new setup
Jun 1, 2020
e398ccb
Adding back the file
skazedo Jun 7, 2020
9223437
trying to resolve conflict
skazedo Jun 7, 2020
1f67a8e
Merge remote-tracking branch 'upstream/master'
Jun 8, 2020
337863d
fix conflict
Jun 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
342 changes: 342 additions & 0 deletions modules/zedoBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,342 @@
import * as utils from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';
import find from 'core-js-pure/features/array/find';
import { Renderer } from '../src/Renderer.js';
import { getRefererInfo } from '../src/refererDetection.js';

const BIDDER_CODE = 'zedo';
const SECURE_URL = 'https://saxp.zedo.com/asw/fmh.json';
const DIM_TYPE = {
'7': 'display',
'9': 'display',
'14': 'display',
'70': 'SBR',
'83': 'CurtainRaiser',
'85': 'Inarticle',
'86': 'pswipeup',
'88': 'Inview',
'100': 'display',
'101': 'display',
'102': 'display',
'103': 'display'
// '85': 'pre-mid-post-roll',
};
const SECURE_EVENT_PIXEL_URL = 'tt1.zedo.com/log/p.gif';

export const spec = {
code: BIDDER_CODE,
aliases: [],
supportedMediaTypes: [BANNER, VIDEO],

/**
* Determines whether or not the given bid request is valid.
*
* @param {object} bid The bid to validate.
* @return boolean True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: function (bid) {
return !!(bid.params && bid.params.channelCode && bid.params.dimId);
},

/**
* Make a server request from the list of BidRequests.
*
* @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
* @return ServerRequest Info describing the request to the server.
*/
buildRequests: function (bidRequests, bidderRequest) {
let data = {
placements: []
};
bidRequests.map(bidRequest => {
let channelCode = parseInt(bidRequest.params.channelCode);
let network = parseInt(channelCode / 1000000);
let channel = channelCode % 1000000;
let dim = getSizes(bidRequest.sizes);
let placement = {
id: bidRequest.bidId,
network: network,
channel: channel,
publisher: bidRequest.params.pubId ? bidRequest.params.pubId : 0,
width: dim[0],
height: dim[1],
dimension: bidRequest.params.dimId,
version: '$prebid.version$',
keyword: '',
transactionId: bidRequest.transactionId
}
if (bidderRequest && bidderRequest.gdprConsent) {
if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
data.gdpr = Number(bidderRequest.gdprConsent.gdprApplies);
}
data.gdpr_consent = bidderRequest.gdprConsent.consentString;
}
// Add CCPA consent string
if (bidderRequest && bidderRequest.uspConsent) {
data.usp = bidderRequest.uspConsent;
}

let dimType = DIM_TYPE[String(bidRequest.params.dimId)]
if (dimType) {
placement['renderers'] = [{
'name': dimType
}]
} else { // default to display
placement['renderers'] = [{
'name': 'display'
}]
}
data['placements'].push(placement);
});
// adding schain object
if (bidRequests[0].schain) {
data['supplyChain'] = getSupplyChain(bidRequests[0].schain);
}
return {
method: 'GET',
url: SECURE_URL,
data: 'g=' + JSON.stringify(data)
}
},

/**
* Unpack the response from the server into a list of bids.
*
* @param {*} serverResponse A successful response from the server.
* @return {Bid[]} An array of bids which were nested inside the server.
*/
interpretResponse: function (serverResponse, request) {
serverResponse = serverResponse.body;
const bids = [];
if (!serverResponse || serverResponse.error) {
let errorMessage = `in response for ${request.bidderCode} adapter`;
if (serverResponse && serverResponse.error) { errorMessage += `: ${serverResponse.error}`; }
utils.logError(errorMessage);
return bids;
}

if (serverResponse.ad) {
serverResponse.ad.forEach(ad => {
const creativeBid = getCreative(ad);
if (creativeBid) {
if (parseInt(creativeBid.cpm) !== 0) {
const bid = newBid(ad, creativeBid, request);
bid.mediaType = parseMediaType(creativeBid);
bids.push(bid);
}
}
});
}
return bids;
},

getUserSyncs: function (syncOptions, responses, gdprConsent) {
if (syncOptions.iframeEnabled) {
let url = 'https://tt3.zedo.com/rs/us/fcs.html';
if (gdprConsent && typeof gdprConsent.consentString === 'string') {
// add 'gdpr' only if 'gdprApplies' is defined
if (typeof gdprConsent.gdprApplies === 'boolean') {
url += `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
} else {
url += `?gdpr_consent=${gdprConsent.consentString}`;
}
}
return [{
type: 'iframe',
url: url
}];
}
},

onTimeout: function (timeoutData) {
try {
logEvent('117', timeoutData);
} catch (e) {
utils.logError(e);
}
},

onBidWon: function (bid) {
try {
logEvent('116', [bid]);
} catch (e) {
utils.logError(e);
}
}

};

function getSupplyChain (supplyChain) {
return {
complete: supplyChain.complete,
nodes: supplyChain.nodes
}
};

function getCreative(ad) {
return ad && ad.creatives && ad.creatives.length && find(ad.creatives, creative => creative.adId);
};
/**
* Unpack the Server's Bid into a Prebid-compatible one.
* @param serverBid
* @param rtbBid
* @param bidderRequest
* @return Bid
*/
function newBid(serverBid, creativeBid, bidderRequest) {
const bid = {
requestId: serverBid.slotId,
creativeId: creativeBid.adId,
network: serverBid.network,
adType: creativeBid.creativeDetails.type,
dealId: 99999999,
currency: 'USD',
netRevenue: true,
ttl: 300
};

if (creativeBid.creativeDetails.type === 'VAST') {
Object.assign(bid, {
width: creativeBid.width,
height: creativeBid.height,
vastXml: creativeBid.creativeDetails.adContent,
cpm: parseInt(creativeBid.bidCpm) / 1000000,
ttl: 3600
});
const rendererOptions = utils.deepAccess(
bidderRequest,
'renderer.options'
);
let rendererUrl = 'https://ss3.zedo.com/gecko/beta/fmpbgt.min.js';
Object.assign(bid, {
adResponse: serverBid,
renderer: getRenderer(bid.adUnitCode, serverBid.slotId, rendererUrl, rendererOptions)
});
} else {
Object.assign(bid, {
width: creativeBid.width,
height: creativeBid.height,
cpm: parseInt(creativeBid.bidCpm) / 1000000,
ad: creativeBid.creativeDetails.adContent,
});
}

return bid;
}
/* Turn bid request sizes into compatible format */
function getSizes(requestSizes) {
let width = 0;
let height = 0;
if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
!utils.isArray(requestSizes[0])) {
width = parseInt(requestSizes[0], 10);
height = parseInt(requestSizes[1], 10);
} else if (typeof requestSizes === 'object') {
for (let i = 0; i < requestSizes.length; i++) {
let size = requestSizes[i];
width = parseInt(size[0], 10);
height = parseInt(size[1], 10);
break;
}
}
return [width, height];
}

function getRenderer(adUnitCode, rendererId, rendererUrl, rendererOptions = {}) {
const renderer = Renderer.install({
id: rendererId,
url: rendererUrl,
config: rendererOptions,
loaded: false,
});

try {
renderer.setRender(videoRenderer);
} catch (err) {
utils.logWarn('Prebid Error calling setRender on renderer', err);
}

renderer.setEventHandlers({
impression: () => utils.logMessage('ZEDO video impression'),
loaded: () => utils.logMessage('ZEDO video loaded'),
ended: () => {
utils.logMessage('ZEDO renderer video ended');
document.querySelector(`#${adUnitCode}`).style.display = 'none';
}
});
return renderer;
}

function videoRenderer(bid) {
// push to render queue
const refererInfo = getRefererInfo();
let referrer = '';
if (refererInfo) {
referrer = refererInfo.referer;
}
bid.renderer.push(() => {
let channelCode = utils.deepAccess(bid, 'params.0.channelCode') || 0;
let dimId = utils.deepAccess(bid, 'params.0.dimId') || 0;
let publisher = utils.deepAccess(bid, 'params.0.pubId') || 0;
let options = utils.deepAccess(bid, 'params.0.options') || {};
let channel = (channelCode > 0) ? (channelCode - (bid.network * 1000000)) : 0;

var rndr = new window.ZdPBTag(bid.adUnitCode, bid.network, bid.width, bid.height, bid.adType, bid.vastXml, channel, dimId,
(encodeURI(referrer) || ''), options);
rndr.renderAd(publisher);
});
}

function parseMediaType(creativeBid) {
const adType = creativeBid.creativeDetails.type;
if (adType === 'VAST') {
return VIDEO;
} else {
return BANNER;
}
}

function logEvent(eid, data) {
let getParams = {
protocol: 'https',
hostname: SECURE_EVENT_PIXEL_URL,
search: getLoggingData(eid, data)
};
let eventUrl = utils.buildUrl(getParams).replace(/&/g, ';');
utils.triggerPixel(eventUrl);
}

function getLoggingData(eid, data) {
data = (utils.isArray(data) && data) || [];

let params = {};
let channel, network, dim, publisher, adunitCode, timeToRespond, cpm;
data.map((adunit) => {
adunitCode = adunit.adUnitCode;
channel = utils.deepAccess(adunit, 'params.0.channelCode') || 0;
network = channel > 0 ? parseInt(channel / 1000000) : 0;
dim = utils.deepAccess(adunit, 'params.0.dimId') * 256 || 0;
publisher = utils.deepAccess(adunit, 'params.0.pubId') || 0;
timeToRespond = adunit.timeout ? adunit.timeout : adunit.timeToRespond;
cpm = adunit.cpm;
});
let referrer = '';
const refererInfo = getRefererInfo();
if (refererInfo) {
referrer = refererInfo.referer;
}
params.n = network;
params.c = channel;
params.s = publisher;
params.x = dim;
params.ai = encodeURI('Prebid^zedo^' + adunitCode + '^' + cpm + '^' + timeToRespond);
params.pu = encodeURI(referrer) || '';
params.eid = eid;
params.e = 'e';
params.z = Math.random();

return params;
}

registerBidder(spec);
33 changes: 17 additions & 16 deletions modules/zedoBidAdapter.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,23 @@ ZEDO has its own renderer and will render the video unit if not defined in the c
# display
```

var adUnits = [
{
code: 'banner-ad-div',
sizes: [[300, 250], [728, 90]],
bids: [
{
bidder: 'zedo',
params: {
channelCode: 2264004118, // required
dimId: 9, // required
pubId: 1 // optional
}
var adUnits = [{
code: 'div-gpt-ad-1460505748561-0',
mediaTypes: {
banner: {
sizes: [[300, 250], [300,600]],
}
]
}
];
},
// Replace this object to test a new Adapter!
bids: [{
bidder: 'zedo',
params: {
channelCode: 2264004735, //REQUIRED
dimId:9 //REQUIRED
}
}]

}];
```
# video
```
Expand All @@ -54,7 +55,7 @@ ZEDO has its own renderer and will render the video unit if not defined in the c
bidder: 'zedo',
params:
{
channelCode: 2264004593, // required
channelCode: 2264004735, // required
dimId: 85, // required
pubId: 1 // optional
}
Expand Down
Loading