Skip to content

Commit 57e2480

Browse files
Millerrokmike-chowla
authored andcommitted
NEW adapter AdtelligentBidAdapter (#2137)
* NEW Adtelligent Bid Adapter * Update MD * add test for multiple request * cleanup * update test bid params
1 parent 4226643 commit 57e2480

File tree

3 files changed

+504
-0
lines changed

3 files changed

+504
-0
lines changed

modules/adtelligentBidAdapter.js

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
import * as utils from 'src/utils';
2+
import {registerBidder} from 'src/adapters/bidderFactory';
3+
import {VIDEO, BANNER} from 'src/mediaTypes';
4+
import {Renderer} from 'src/Renderer';
5+
import findIndex from 'core-js/library/fn/array/find-index';
6+
7+
const URL = '//hb.adtelligent.com/auction/';
8+
const OUTSTREAM_SRC = '//player.adtelligent.com/outstream-unit/2.01/outstream.min.js';
9+
const BIDDER_CODE = 'adtelligent';
10+
const OUTSTREAM = 'outstream';
11+
const DISPLAY = 'display';
12+
13+
export const spec = {
14+
code: BIDDER_CODE,
15+
supportedMediaTypes: [VIDEO, BANNER],
16+
isBidRequestValid: function (bid) {
17+
return bid && bid.params && bid.params.aid;
18+
},
19+
20+
/**
21+
* Make a server request from the list of BidRequests
22+
* @param bidRequests
23+
* @param bidderRequest
24+
*/
25+
buildRequests: function (bidRequests, bidderRequest) {
26+
return {
27+
data: bidToTag(bidRequests),
28+
bidderRequest,
29+
method: 'GET',
30+
url: URL
31+
};
32+
},
33+
34+
/**
35+
* Unpack the response from the server into a list of bids
36+
* @param serverResponse
37+
* @param bidderRequest
38+
* @return {Bid[]} An array of bids which were nested inside the server
39+
*/
40+
interpretResponse: function (serverResponse, {bidderRequest}) {
41+
serverResponse = serverResponse.body;
42+
let bids = [];
43+
44+
if (!utils.isArray(serverResponse)) {
45+
return parseRTBResponse(serverResponse, bidderRequest);
46+
}
47+
48+
serverResponse.forEach(serverBidResponse => {
49+
bids = utils.flatten(bids, parseRTBResponse(serverBidResponse, bidderRequest));
50+
});
51+
52+
return bids;
53+
}
54+
};
55+
56+
function parseRTBResponse(serverResponse, bidderRequest) {
57+
const isInvalidValidResp = !serverResponse || !serverResponse.bids || !serverResponse.bids.length;
58+
59+
let bids = [];
60+
61+
if (isInvalidValidResp) {
62+
let extMessage = serverResponse && serverResponse.ext && serverResponse.ext.message ? `: ${serverResponse.ext.message}` : '';
63+
let errorMessage = `in response for ${bidderRequest.bidderCode} adapter ${extMessage}`;
64+
65+
utils.logError(errorMessage);
66+
67+
return bids;
68+
}
69+
70+
serverResponse.bids.forEach(serverBid => {
71+
const requestId = findIndex(bidderRequest.bids, (bidRequest) => {
72+
return bidRequest.bidId === serverBid.requestId;
73+
});
74+
75+
if (serverBid.cpm !== 0 && requestId !== -1) {
76+
const bid = createBid(serverBid, getMediaType(bidderRequest.bids[requestId]));
77+
78+
bids.push(bid);
79+
}
80+
});
81+
82+
return bids;
83+
}
84+
85+
function bidToTag(bidRequests) {
86+
let tag = {
87+
domain: utils.getTopWindowLocation().hostname
88+
};
89+
90+
for (let i = 0, length = bidRequests.length; i < length; i++) {
91+
Object.assign(tag, prepareRTBRequestParams(i, bidRequests[i]));
92+
}
93+
94+
return tag;
95+
}
96+
97+
/**
98+
* Parse mediaType
99+
* @param _index {number}
100+
* @param bid {object}
101+
* @returns {object}
102+
*/
103+
function prepareRTBRequestParams(_index, bid) {
104+
const mediaType = utils.deepAccess(bid, 'mediaTypes.video') ? VIDEO : DISPLAY;
105+
const index = !_index ? '' : `${_index + 1}`;
106+
107+
return {
108+
['callbackId' + index]: bid.bidId,
109+
['aid' + index]: bid.params.aid,
110+
['ad_type' + index]: mediaType,
111+
['sizes' + index]: utils.parseSizesInput(bid.sizes).join()
112+
};
113+
}
114+
115+
/**
116+
* Prepare all parameters for request
117+
* @param bidderRequest {object}
118+
* @returns {object}
119+
*/
120+
function getMediaType(bidderRequest) {
121+
const videoMediaType = utils.deepAccess(bidderRequest, 'mediaTypes.video');
122+
const context = utils.deepAccess(bidderRequest, 'mediaTypes.video.context');
123+
124+
return !videoMediaType ? DISPLAY : context === OUTSTREAM ? OUTSTREAM : VIDEO;
125+
}
126+
127+
/**
128+
* Configure new bid by response
129+
* @param bidResponse {object}
130+
* @param mediaType {Object}
131+
* @returns {object}
132+
*/
133+
function createBid(bidResponse, mediaType) {
134+
let bid = {
135+
requestId: bidResponse.requestId,
136+
creativeId: bidResponse.cmpId,
137+
height: bidResponse.height,
138+
currency: bidResponse.cur,
139+
width: bidResponse.width,
140+
cpm: bidResponse.cpm,
141+
netRevenue: true,
142+
mediaType,
143+
ttl: 3600
144+
};
145+
146+
if (mediaType === DISPLAY) {
147+
return Object.assign(bid, {
148+
ad: bidResponse.ad
149+
});
150+
}
151+
152+
Object.assign(bid, {
153+
vastUrl: bidResponse.vastUrl
154+
});
155+
156+
if (mediaType === OUTSTREAM) {
157+
Object.assign(bid, {
158+
mediaType: 'video',
159+
adResponse: bidResponse,
160+
renderer: newRenderer(bidResponse.requestId)
161+
});
162+
}
163+
164+
return bid;
165+
}
166+
167+
/**
168+
* Create Adtelligent renderer
169+
* @param requestId
170+
* @returns {*}
171+
*/
172+
function newRenderer(requestId) {
173+
const renderer = Renderer.install({
174+
id: requestId,
175+
url: OUTSTREAM_SRC,
176+
loaded: false
177+
});
178+
179+
renderer.setRender(outstreamRender);
180+
181+
return renderer;
182+
}
183+
184+
/**
185+
* Initialise Adtelligent outstream
186+
* @param bid
187+
*/
188+
function outstreamRender(bid) {
189+
bid.renderer.push(() => {
190+
window.VOutstreamAPI.initOutstreams([{
191+
width: bid.width,
192+
height: bid.height,
193+
vastUrl: bid.vastUrl,
194+
elId: bid.adUnitCode
195+
}]);
196+
});
197+
}
198+
199+
registerBidder(spec);

modules/adtelligentBidAdapter.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Overview
2+
3+
**Module Name**: Adtelligent Bidder Adapter
4+
**Module Type**: Bidder Adapter
5+
**Maintainer**: [email protected]
6+
7+
# Description
8+
9+
Get access to multiple demand partners across Adtelligent Marketplace and maximize your yield with Adtelligent header bidding adapter.
10+
11+
Adtelligent header bidding adapter connects with Adtelligent demand sources in order to fetch bids.
12+
This adapter provides a solution for accessing Video demand and display demand
13+
14+
15+
# Test Parameters
16+
```
17+
var adUnits = [
18+
19+
// Video instream adUnit
20+
{
21+
code: 'div-test-div',
22+
sizes: [[640, 480]],
23+
mediaTypes: {
24+
video: {
25+
context: 'instream'
26+
}
27+
},
28+
bids: [{
29+
bidder: 'adtelligent',
30+
params: {
31+
aid: 331133
32+
}
33+
}]
34+
},
35+
36+
// Video outstream adUnit
37+
{
38+
code: 'outstream-test-div',
39+
sizes: [[640, 480]],
40+
mediaTypes: {
41+
video: {
42+
context: 'outstream'
43+
}
44+
},
45+
bids: [{
46+
bidder: 'adtelligent',
47+
params: {
48+
aid: 331133
49+
}
50+
}]
51+
},
52+
53+
// Banner adUnit
54+
{
55+
code: 'div-test-div',
56+
sizes: [[300, 250]],
57+
bids: [{
58+
bidder: 'adtelligent',
59+
params: {
60+
aid: 350975
61+
}
62+
}]
63+
}
64+
];
65+
```

0 commit comments

Comments
 (0)