Skip to content

Commit 139c0b6

Browse files
Roffraydluxemburg
authored andcommitted
Add vuble adapter (prebid#2201)
* Add: vuble bid adapter * Add: vuble bid adapter unit tests * Fix: getUserSync returns an empty array if no user sync is found * Add: unit tests for getUserSync * Mod vuble unit test use single quotes * Mod: check mediatypes for bid request valid check on vuble adapter * Add: vuble adapter: bid id and env in request data * Fix: vuble adaptor uses bid data in interpret reponse * Del: unused size param anymore
1 parent ec8821d commit 139c0b6

File tree

3 files changed

+461
-0
lines changed

3 files changed

+461
-0
lines changed

modules/vubleBidAdapter.js

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
// Vuble Adapter
2+
3+
import * as utils from 'src/utils';
4+
import {registerBidder} from 'src/adapters/bidderFactory';
5+
6+
const BIDDER_CODE = 'vuble';
7+
8+
const ENVS = ['com', 'net'];
9+
const CURRENCIES = {
10+
com: 'EUR',
11+
net: 'USD'
12+
};
13+
const TTL = 60;
14+
15+
export const spec = {
16+
code: BIDDER_CODE,
17+
supportedMediaTypes: ['video'],
18+
19+
/**
20+
* Determines whether or not the given bid request is valid.
21+
*
22+
* @param {BidRequest} bid The bid params to validate.
23+
* @return boolean True if this is a valid bid, and false otherwise.
24+
*/
25+
isBidRequestValid: function (bid) {
26+
if (utils.isEmpty(bid.sizes) || utils.parseSizesInput(bid.sizes).length == 0) {
27+
return false;
28+
}
29+
30+
if (!utils.deepAccess(bid, 'mediaTypes.video.context')) {
31+
return false;
32+
}
33+
34+
if (!utils.contains(ENVS, bid.params.env)) {
35+
return false;
36+
}
37+
38+
return !!(bid.params.env && bid.params.pubId && bid.params.zoneId);
39+
},
40+
41+
/**
42+
* Make a server request from the list of BidRequests.
43+
*
44+
* @param {validBidRequests[]} - an array of bids
45+
* @return ServerRequest Info describing the request to the server.
46+
*/
47+
buildRequests: function (validBidRequests) {
48+
return validBidRequests.map(bid => {
49+
// We take the first size
50+
let size = utils.parseSizesInput(bid.sizes)[0].split('x');
51+
52+
// Get the page's url
53+
let referrer = utils.getTopWindowUrl();
54+
if (bid.params.referrer) {
55+
referrer = bid.params.referrer;
56+
}
57+
58+
// Get Video Context
59+
let context = utils.deepAccess(bid, 'mediaTypes.video.context');
60+
61+
let url = '//player.mediabong.' + bid.params.env + '/prebid/request';
62+
let data = {
63+
width: size[0],
64+
height: size[1],
65+
pub_id: bid.params.pubId,
66+
zone_id: bid.params.zoneId,
67+
context: context,
68+
floor_price: bid.params.floorPrice ? bid.params.floorPrice : 0,
69+
url: referrer,
70+
env: bid.params.env,
71+
bid_id: bid.bidId
72+
};
73+
74+
return {
75+
method: 'POST',
76+
url: url,
77+
data: data
78+
};
79+
});
80+
},
81+
82+
/**
83+
* Unpack the response from the server into a list of bids.
84+
*
85+
* @param {ServerResponse} serverResponse A successful response from the server.
86+
* @return {Bid[]} An array of bids which were nested inside the server.
87+
*/
88+
interpretResponse: function (serverResponse, bid) {
89+
const responseBody = serverResponse.body;
90+
91+
if (typeof responseBody !== 'object' || responseBody.status !== 'ok') {
92+
return [];
93+
}
94+
95+
let responses = [];
96+
let reponse = {
97+
requestId: bid.data.bid_id,
98+
cpm: responseBody.cpm,
99+
width: bid.data.width,
100+
height: bid.data.height,
101+
ttl: TTL,
102+
creativeId: responseBody.creativeId,
103+
netRevenue: true,
104+
currency: CURRENCIES[bid.data.env],
105+
vastUrl: responseBody.url
106+
};
107+
responses.push(reponse);
108+
109+
return responses;
110+
},
111+
112+
/**
113+
* Register the user sync pixels which should be dropped after the auction.
114+
*
115+
* @param {SyncOptions} syncOptions Which user syncs are allowed?
116+
* @param {ServerResponse[]} serverResponses List of server's responses.
117+
* @return {UserSync[]} The user syncs which should be dropped.
118+
*/
119+
getUserSyncs: function (syncOptions, serverResponses) {
120+
if (syncOptions.iframeEnabled) {
121+
if (serverResponses.length > 0) {
122+
let responseBody = serverResponses[0].body;
123+
if (typeof responseBody !== 'object' || responseBody.iframeSync) {
124+
return [{
125+
type: 'iframe',
126+
url: responseBody.iframeSync
127+
}];
128+
}
129+
}
130+
}
131+
return [];
132+
}
133+
};
134+
135+
registerBidder(spec);

modules/vubleBidAdapter.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Overview
2+
3+
```
4+
Module Name: Vuble Bidder Adapter
5+
Module Type: Vuble Adapter
6+
Maintainer: [email protected]
7+
```
8+
9+
# Description
10+
11+
Module that connects to Vuble's demand sources
12+
13+
# Test Parameters
14+
```
15+
var adUnits = [
16+
{
17+
code: 'test-video-instream',
18+
sizes: [[640, 360]],
19+
mediaTypes: {
20+
video: {
21+
context: 'instream'
22+
}
23+
},
24+
bids: [
25+
{
26+
bidder: "vuble",
27+
params: {
28+
env: 'net',
29+
pubId: '3',
30+
zoneId: '12345',
31+
referrer: "http://www.vuble.tv/", // optional
32+
floorPrice: 5.00 // optional
33+
}
34+
}
35+
]
36+
},
37+
{
38+
code: 'test-video-outstream',
39+
sizes: [[640, 360]],
40+
mediaTypes: {
41+
video: {
42+
context: 'outstream'
43+
}
44+
},
45+
bids: [
46+
{
47+
bidder: "vuble",
48+
params: {
49+
env: 'net',
50+
pubId: '3',
51+
zoneId: '12345',
52+
referrer: "http://www.vuble.tv/", // optional
53+
floorPrice: 5.00 // optional
54+
}
55+
}
56+
]
57+
}
58+
];

0 commit comments

Comments
 (0)