Skip to content

Commit 7e0cda1

Browse files
authored
Escalax Bid Adapter: initial release (prebid#12483)
* init escalax adapter * region substitution based on time zone
1 parent f030154 commit 7e0cda1

File tree

3 files changed

+489
-0
lines changed

3 files changed

+489
-0
lines changed

modules/escalaxBidAdapter.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import { ortbConverter } from '../libraries/ortbConverter/converter.js';
2+
import { registerBidder } from '../src/adapters/bidderFactory.js';
3+
import { config } from '../src/config.js';
4+
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
5+
6+
const BIDDER_CODE = 'escalax';
7+
const ESCALAX_SOURCE_ID_MACRO = '[sourceId]';
8+
const ESCALAX_ACCOUNT_ID_MACRO = '[accountId]';
9+
const ESCALAX_SUBDOMAIN_MACRO = '[subdomain]';
10+
const ESCALAX_URL = `https://${ESCALAX_SUBDOMAIN_MACRO}.escalax.io/bid?type=pjs&partner=${ESCALAX_SOURCE_ID_MACRO}&token=${ESCALAX_ACCOUNT_ID_MACRO}`;
11+
const ESCALAX_DEFAULT_CURRENCY = 'USD';
12+
const ESCALAX_DEFAULT_SUBDOMAIN = 'bidder_us';
13+
14+
function createImp(buildImp, bidRequest, context) {
15+
const imp = buildImp(bidRequest, context);
16+
imp.ext = {
17+
[BIDDER_CODE]: {
18+
sourceId: bidRequest.params.sourceId,
19+
accountId: bidRequest.params.accountId,
20+
}
21+
};
22+
if (!imp.bidfloor) imp.bidfloor = bidRequest.params.bidfloor;
23+
return imp;
24+
}
25+
26+
function createRequest(buildRequest, imps, bidderRequest, context) {
27+
const request = buildRequest(imps, bidderRequest, context);
28+
const bid = context.bidRequests[0];
29+
request.test = config.getConfig('debug') ? 1 : 0;
30+
if (!request.cur) request.cur = [bid.params.currency || ESCALAX_DEFAULT_CURRENCY];
31+
return request;
32+
}
33+
34+
function createBidResponse(buildBidResponse, bid, context) {
35+
const bidResponse = buildBidResponse(bid, context);
36+
bidResponse.cur = 'USD';
37+
return bidResponse;
38+
}
39+
40+
function getSubdomain() {
41+
const regionMap = {
42+
'Europe': 'bidder_eu',
43+
'Africa': 'bidder_eu',
44+
'Atlantic': 'bidder_eu',
45+
'Arctic': 'bidder_eu',
46+
'Asia': 'bidder_apac',
47+
'Australia': 'bidder_apac',
48+
'Antarctica': 'bidder_apac',
49+
'Pacific': 'bidder_apac',
50+
'Indian': 'bidder_apac',
51+
'America': 'bidder_us'
52+
};
53+
54+
try {
55+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
56+
const region = timezone.split('/')[0];
57+
return regionMap[region] || 'bidder_us';
58+
} catch (err) {
59+
return 'bidder_us';
60+
}
61+
}
62+
63+
const converter = ortbConverter({
64+
context: {
65+
netRevenue: true,
66+
ttl: 20,
67+
},
68+
imp: createImp,
69+
request: createRequest,
70+
bidResponse: createBidResponse
71+
});
72+
73+
export const spec = {
74+
code: BIDDER_CODE,
75+
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
76+
77+
isBidRequestValid: (bid) => {
78+
return Boolean(bid.params.sourceId) && Boolean(bid.params.accountId);
79+
},
80+
81+
buildRequests: (validBidRequests, bidderRequest) => {
82+
if (validBidRequests && validBidRequests.length === 0) return [];
83+
const { sourceId, accountId } = validBidRequests[0].params;
84+
const subdomain = getSubdomain();
85+
const endpointURL = ESCALAX_URL
86+
.replace(ESCALAX_SUBDOMAIN_MACRO, subdomain || ESCALAX_DEFAULT_SUBDOMAIN)
87+
.replace(ESCALAX_ACCOUNT_ID_MACRO, sourceId)
88+
.replace(ESCALAX_SOURCE_ID_MACRO, accountId);
89+
const request = converter.toORTB({ bidRequests: validBidRequests, bidderRequest });
90+
return {
91+
method: 'POST',
92+
url: endpointURL,
93+
data: request
94+
};
95+
},
96+
97+
interpretResponse: (response, request) => {
98+
if (response?.body) {
99+
const bids = converter.fromORTB({ response: response.body, request: request.data }).bids;
100+
return bids;
101+
}
102+
return [];
103+
},
104+
};
105+
106+
registerBidder(spec);

modules/escalaxBidAdapter.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Overview
2+
3+
```
4+
Module Name: Escalax SSP Bidder Adapter
5+
Module Type: Bidder Adapter
6+
Maintainer: connect@escalax.io
7+
```
8+
9+
# Description
10+
11+
Escalax Bidding adapter requires setup before beginning. Please contact us at <connect@escalax.io>
12+
13+
# Test Parameters
14+
15+
```js
16+
const adUnits = [
17+
{
18+
code: "banner1",
19+
mediaTypes: {
20+
banner: {
21+
sizes: [
22+
[300, 250],
23+
[300, 600],
24+
],
25+
},
26+
},
27+
bids: [
28+
{
29+
bidder: "escalax",
30+
params: {
31+
accountId: "hash",
32+
sourceId: "sourceId",
33+
},
34+
},
35+
],
36+
},
37+
{
38+
code: "native_example",
39+
mediaTypes: {
40+
native: {},
41+
},
42+
bids: [
43+
{
44+
bidder: "escalax",
45+
params: {
46+
accountId: "hash",
47+
sourceId: "sourceId",
48+
},
49+
},
50+
],
51+
},
52+
{
53+
code: "video1",
54+
sizes: [640, 480],
55+
mediaTypes: {
56+
video: {
57+
minduration: 0,
58+
maxduration: 999,
59+
boxingallowed: 1,
60+
skip: 0,
61+
mimes: ["application/javascript", "video/mp4"],
62+
w: 1920,
63+
h: 1080,
64+
protocols: [2],
65+
linearity: 1,
66+
api: [1, 2],
67+
},
68+
},
69+
bids: [
70+
{
71+
bidder: "escalax",
72+
params: {
73+
accountId: "hash",
74+
sourceId: "sourceId",
75+
},
76+
},
77+
],
78+
},
79+
];
80+
```

0 commit comments

Comments
 (0)