Skip to content

Commit 1231b4c

Browse files
Freedom Ad Network Bid Adapter: initial release (#12153)
* Create fanAdapter.md * Create fanAdapter.js * Create fanAdapter_spec.js * Update fanAdapter_spec.js * Update fanAdapter.js * Update fanAdapter.js * Update fanAdapter_spec.js * Update fanAdapter.js * Update fanAdapter_spec.js * Update fanAdapter.js * Update fanAdapter_spec.js * Update fanAdapter.js * Update fanAdapter_spec.js * Update fanAdapter.js * Update fanAdapter.js
1 parent 8a544ca commit 1231b4c

File tree

3 files changed

+531
-0
lines changed

3 files changed

+531
-0
lines changed

modules/fanAdapter.js

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
import * as utils from '../src/utils.js';
2+
import { ajax } from '../src/ajax.js';
3+
import { BANNER, NATIVE } from '../src/mediaTypes.js';
4+
import { registerBidder } from '../src/adapters/bidderFactory.js';
5+
6+
/**
7+
* @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest
8+
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
9+
* @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid
10+
* @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse
11+
*/
12+
13+
const BIDDER_CODE = 'freedomadnetwork';
14+
const BASE_URL = 'https://srv.freedomadnetwork.com';
15+
16+
/**
17+
* Build OpenRTB request from bidRequest and bidderRequest
18+
*
19+
* @param {BidRequest} bid
20+
* @param {BidderRequest} bidderRequest
21+
* @returns {Request}
22+
*/
23+
function buildBidRequest(bid, bidderRequest) {
24+
const payload = {
25+
id: bid.bidId,
26+
tmax: bidderRequest.timeout,
27+
placements: [bid.params.placementId],
28+
at: 1,
29+
user: {}
30+
}
31+
32+
const gdprConsent = utils.deepAccess(bidderRequest, 'gdprConsent');
33+
if (!!gdprConsent && gdprConsent.gdprApplies) {
34+
payload.user.gdpr = 1;
35+
payload.user.consent = gdprConsent.consentString;
36+
}
37+
38+
const uspConsent = utils.deepAccess(bidderRequest, 'uspConsent');
39+
if (uspConsent) {
40+
payload.user.usp = uspConsent;
41+
}
42+
43+
return {
44+
method: 'POST',
45+
url: BASE_URL + '/pb/req',
46+
data: JSON.stringify(payload),
47+
options: {
48+
contentType: 'application/json',
49+
withCredentials: false,
50+
customHeaders: {
51+
'Accept-Language': 'en;q=10',
52+
},
53+
},
54+
originalBidRequest: bid
55+
}
56+
}
57+
58+
export const spec = {
59+
code: BIDDER_CODE,
60+
isBidRequestValid: function(bid) {
61+
if (!bid) {
62+
utils.logWarn(BIDDER_CODE, 'Invalid bid', bid);
63+
64+
return false;
65+
}
66+
67+
if (!bid.params) {
68+
utils.logWarn(BIDDER_CODE, 'bid.params is required');
69+
70+
return false;
71+
}
72+
73+
if (!bid.params.placementId) {
74+
utils.logWarn(BIDDER_CODE, 'bid.params.placementId is required');
75+
76+
return false;
77+
}
78+
79+
var banner = utils.deepAccess(bid, 'mediaTypes.banner');
80+
if (banner === undefined) {
81+
return false;
82+
}
83+
84+
return true;
85+
},
86+
87+
buildRequests: function(validBidRequests, bidderRequest) {
88+
return validBidRequests.map(bid => buildBidRequest(bid, bidderRequest));
89+
},
90+
91+
/**
92+
* Unpack the response from the server into a list of bids.
93+
*
94+
* @param {ServerResponse} serverResponse A successful response from the server.
95+
* @return {Bid[]} An array of bids which were nested inside the server.
96+
*/
97+
interpretResponse: function (serverResponse, bidRequest) {
98+
const serverBody = serverResponse.body;
99+
let bidResponses = [];
100+
101+
if (!serverBody) {
102+
return bidResponses;
103+
}
104+
105+
serverBody.forEach((response) => {
106+
const bidResponse = {
107+
requestId: response.id,
108+
bidid: response.bidid,
109+
impid: response.impid,
110+
userId: response.userId,
111+
cpm: response.cpm,
112+
currency: response.currency,
113+
width: response.width,
114+
height: response.height,
115+
ad: response.payload,
116+
ttl: response.ttl,
117+
creativeId: response.crid,
118+
netRevenue: response.netRevenue,
119+
trackers: response.trackers,
120+
meta: {
121+
mediaType: response.mediaType,
122+
advertiserDomains: response.domains,
123+
}
124+
};
125+
126+
bidResponses.push(bidResponse);
127+
});
128+
129+
return bidResponses;
130+
},
131+
132+
/**
133+
* Register bidder specific code, which will execute if a bid from this bidder won the auction
134+
*
135+
* @param {Bid} bid The bid that won the auction
136+
*/
137+
onBidWon: function (bid) {
138+
if (!bid) {
139+
return;
140+
}
141+
142+
const payload = {
143+
id: bid.bidid,
144+
impid: bid.impid,
145+
t: bid.cpm,
146+
u: bid.userId,
147+
}
148+
149+
ajax(BASE_URL + '/pb/imp', null, JSON.stringify(payload), {
150+
method: 'POST',
151+
customHeaders: {
152+
'Accept-Language': 'en;q=10',
153+
},
154+
});
155+
156+
if (bid.trackers && bid.trackers.length > 0) {
157+
for (var i = 0; i < bid.trackers.length; i++) {
158+
if (bid.trackers[i].type == 0) {
159+
utils.triggerPixel(bid.trackers[i].url);
160+
}
161+
}
162+
}
163+
},
164+
onSetTargeting: function(bid) {},
165+
onBidderError: function(error) {
166+
utils.logError(`${BIDDER_CODE} bidder error`, error);
167+
},
168+
getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
169+
const syncs = [];
170+
return syncs;
171+
},
172+
onTimeout: function(timeoutData) {},
173+
supportedMediaTypes: [BANNER, NATIVE]
174+
}
175+
176+
registerBidder(spec);

modules/fanAdapter.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Freedom Ad Network Bidder Adapter
2+
3+
# Overview
4+
5+
```
6+
Module Name: Freedom Ad Network Bidder Adapter
7+
Module Type: Bidder Adapter
8+
Maintainer: [email protected]
9+
```
10+
11+
## Description
12+
13+
Module that connects to FAN's demand sources.
14+
15+
## Bid Parameters
16+
17+
| Name | Scope | Type | Description | Example |
18+
|---------------|----------|--------------------|-----------------------------------------|-------------------------------------------------|
19+
| `placementId` | required | String | The Placement Id provided by FAN. | `e6203f1e-bd6d-4f42-9895-d1a19cdb83c8` |
20+
21+
## Example
22+
23+
### Banner Ads
24+
25+
```javascript
26+
var adUnits = [{
27+
code: 'banner-ad-div',
28+
mediaTypes: {
29+
banner: {
30+
sizes: [[300, 250]]
31+
}
32+
},
33+
bids: [{
34+
bidder: 'freedomadnetwork',
35+
params: {
36+
placementId: 'e6203f1e-bd6d-4f42-9895-d1a19cdb83c8'
37+
}
38+
}]
39+
}];
40+
```

0 commit comments

Comments
 (0)