prebid.js 5.19.0 → 5.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +4 -5
- package/modules/adxcgBidAdapter.js +311 -359
- package/modules/airgridRtdProvider.js +1 -1
- package/modules/appnexusBidAdapter.js +9 -3
- package/modules/atsAnalyticsAdapter.js +67 -46
- package/modules/atsAnalyticsAdapter.md +1 -0
- package/modules/betweenBidAdapter.js +2 -1
- package/modules/browsiRtdProvider.js +106 -18
- package/modules/cleanioRtdProvider.js +192 -0
- package/modules/cleanioRtdProvider.md +59 -0
- package/modules/deltaprojectsBidAdapter.js +252 -0
- package/modules/deltaprojectsBidAdapter.md +32 -0
- package/modules/gridBidAdapter.js +1 -0
- package/modules/ipromBidAdapter.js +79 -0
- package/modules/ixBidAdapter.js +7 -1
- package/modules/jixieBidAdapter.js +8 -2
- package/modules/justpremiumBidAdapter.js +6 -1
- package/modules/kinessoIdSystem.js +1 -1
- package/modules/livewrappedAnalyticsAdapter.js +5 -0
- package/modules/multibid/index.js +3 -3
- package/modules/nativoBidAdapter.js +5 -1
- package/modules/openxBidAdapter.js +1 -1
- package/modules/operaadsBidAdapter.js +21 -1
- package/modules/otmBidAdapter.js +146 -0
- package/modules/otmBidAdapter.md +27 -26
- package/modules/outbrainBidAdapter.js +5 -0
- package/modules/playwireBidAdapter.md +61 -0
- package/modules/pubmaticBidAdapter.js +1 -1
- package/modules/rtdModule/index.js +2 -2
- package/modules/sonobiBidAdapter.js +7 -0
- package/modules/sortableBidAdapter.js +1 -0
- package/modules/teadsBidAdapter.js +3 -0
- package/modules/trustxBidAdapter.js +8 -6
- package/modules/ventesBidAdapter.js +370 -0
- package/modules/ventesBidAdapter.md +94 -0
- package/modules/yahoosspBidAdapter.js +6 -6
- package/package.json +1 -1
- package/src/auction.js +11 -11
- package/src/prebid.js +20 -4
- package/src/targeting.js +8 -0
- package/test/fixtures/fixtures.js +2 -1
- package/test/spec/modules/adxcgBidAdapter_spec.js +827 -571
- package/test/spec/modules/appnexusBidAdapter_spec.js +16 -1
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
- package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
- package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
- package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
- package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
- package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
- package/test/spec/modules/ixBidAdapter_spec.js +3 -3
- package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
- package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +23 -4
- package/test/spec/modules/multibid_spec.js +31 -31
- package/test/spec/modules/openxBidAdapter_spec.js +0 -26
- package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
- package/test/spec/modules/otmBidAdapter_spec.js +67 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
- package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
- package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
- package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +3 -3
- package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
- package/test/spec/unit/core/adapterManager_spec.js +7 -3
- package/test/spec/unit/core/targeting_spec.js +93 -0
- package/test/spec/unit/pbjs_api_spec.js +3 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
|
+
import {logInfo, logError, getBidIdParameter, _each, getValue, isFn, isPlainObject} from '../src/utils.js';
|
|
3
|
+
import { BANNER } from '../src/mediaTypes.js';
|
|
4
|
+
|
|
5
|
+
const BIDDER_CODE = 'otm';
|
|
6
|
+
const OTM_BID_URL = 'https://ssp.otm-r.com/adjson';
|
|
7
|
+
const DEF_CUR = 'RUB'
|
|
8
|
+
|
|
9
|
+
export const spec = {
|
|
10
|
+
|
|
11
|
+
code: BIDDER_CODE,
|
|
12
|
+
url: OTM_BID_URL,
|
|
13
|
+
supportedMediaTypes: [ BANNER ],
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Determines whether or not the given bid request is valid.
|
|
17
|
+
*
|
|
18
|
+
* @param {object} bid The bid to validate.
|
|
19
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
20
|
+
*/
|
|
21
|
+
isBidRequestValid: function (bid) {
|
|
22
|
+
return !!bid.params.tid;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Build bidder requests.
|
|
27
|
+
*
|
|
28
|
+
* @param validBidRequests
|
|
29
|
+
* @param bidderRequest
|
|
30
|
+
* @returns {[]}
|
|
31
|
+
*/
|
|
32
|
+
buildRequests: function (validBidRequests, bidderRequest) {
|
|
33
|
+
logInfo('validBidRequests', validBidRequests);
|
|
34
|
+
|
|
35
|
+
const bidRequests = [];
|
|
36
|
+
let tz = new Date().getTimezoneOffset()
|
|
37
|
+
let referrer = '';
|
|
38
|
+
if (bidderRequest && bidderRequest.refererInfo) {
|
|
39
|
+
referrer = bidderRequest.refererInfo.referer;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_each(validBidRequests, (bid) => {
|
|
43
|
+
let domain = getValue(bid.params, 'domain') || ''
|
|
44
|
+
let tid = getValue(bid.params, 'tid')
|
|
45
|
+
let cur = getValue(bid.params, 'currency') || DEF_CUR
|
|
46
|
+
let bidid = getBidIdParameter('bidId', bid)
|
|
47
|
+
let transactionid = getBidIdParameter('transactionId', bid)
|
|
48
|
+
let auctionid = getBidIdParameter('auctionId', bid)
|
|
49
|
+
let bidfloor = _getBidFloor(bid)
|
|
50
|
+
|
|
51
|
+
_each(bid.sizes, size => {
|
|
52
|
+
let width = 0;
|
|
53
|
+
let height = 0;
|
|
54
|
+
if (size.length && typeof size[0] === 'number' && typeof size[1] === 'number') {
|
|
55
|
+
width = size[0];
|
|
56
|
+
height = size[1];
|
|
57
|
+
}
|
|
58
|
+
bidRequests.push({
|
|
59
|
+
method: 'GET',
|
|
60
|
+
url: OTM_BID_URL,
|
|
61
|
+
data: {
|
|
62
|
+
tz: tz,
|
|
63
|
+
w: width,
|
|
64
|
+
h: height,
|
|
65
|
+
domain: domain,
|
|
66
|
+
l: referrer,
|
|
67
|
+
s: tid,
|
|
68
|
+
cur: cur,
|
|
69
|
+
bidid: bidid,
|
|
70
|
+
transactionid: transactionid,
|
|
71
|
+
auctionid: auctionid,
|
|
72
|
+
bidfloor: bidfloor,
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
return bidRequests;
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Generate response.
|
|
82
|
+
*
|
|
83
|
+
* @param serverResponse
|
|
84
|
+
* @param request
|
|
85
|
+
* @returns {[]|*[]}
|
|
86
|
+
*/
|
|
87
|
+
interpretResponse: function (serverResponse, request) {
|
|
88
|
+
logInfo('serverResponse', serverResponse.body);
|
|
89
|
+
|
|
90
|
+
const responsesBody = serverResponse ? serverResponse.body : {};
|
|
91
|
+
const bidResponses = [];
|
|
92
|
+
try {
|
|
93
|
+
if (responsesBody.length === 0) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
_each(responsesBody, (bid) => {
|
|
98
|
+
if (bid.ad) {
|
|
99
|
+
bidResponses.push({
|
|
100
|
+
requestId: bid.bidid,
|
|
101
|
+
cpm: bid.cpm,
|
|
102
|
+
width: bid.w,
|
|
103
|
+
height: bid.h,
|
|
104
|
+
creativeId: bid.creativeid,
|
|
105
|
+
currency: bid.currency || 'RUB',
|
|
106
|
+
netRevenue: true,
|
|
107
|
+
ad: bid.ad,
|
|
108
|
+
ttl: bid.ttl,
|
|
109
|
+
transactionId: bid.transactionid,
|
|
110
|
+
meta: {
|
|
111
|
+
advertiserDomains: bid.adDomain ? [bid.adDomain] : []
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
} catch (error) {
|
|
117
|
+
logError(error);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return bidResponses;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get floor value
|
|
126
|
+
* @param bid
|
|
127
|
+
* @returns {null|*}
|
|
128
|
+
* @private
|
|
129
|
+
*/
|
|
130
|
+
function _getBidFloor(bid) {
|
|
131
|
+
if (!isFn(bid.getFloor)) {
|
|
132
|
+
return bid.params.bidfloor ? bid.params.bidfloor : 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let floor = bid.getFloor({
|
|
136
|
+
currency: DEF_CUR,
|
|
137
|
+
mediaType: '*',
|
|
138
|
+
size: '*'
|
|
139
|
+
});
|
|
140
|
+
if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEF_CUR) {
|
|
141
|
+
return floor.floor;
|
|
142
|
+
}
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
registerBidder(spec);
|
package/modules/otmBidAdapter.md
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
# Overview
|
|
2
2
|
|
|
3
|
-
Module Name
|
|
4
|
-
Module Type
|
|
5
|
-
Maintainer
|
|
3
|
+
**Module Name**: OTM Bidder Adapter
|
|
4
|
+
**Module Type**: Bidder Adapter
|
|
5
|
+
**Maintainer**: e.kretsu@otm-r.com
|
|
6
6
|
|
|
7
7
|
# Description
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
OTM Bidder Adapter for Prebid.js. About: https://otm-r.com
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Use `otm` as bidder:
|
|
12
12
|
|
|
13
|
+
# Params
|
|
14
|
+
- `tid` required, specific id AdUnit slot.
|
|
15
|
+
- `domain` optional, specific custom domain.
|
|
16
|
+
- `bidfloor` optional.
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
```javascript
|
|
16
|
-
var adUnits = [
|
|
17
|
-
{
|
|
18
|
-
code: 'div-otm-example',
|
|
19
|
-
sizes: [[320, 480]],
|
|
20
|
-
bids: [
|
|
21
|
-
{
|
|
22
|
-
bidder: "otm",
|
|
23
|
-
params: {
|
|
24
|
-
tid: "99",
|
|
25
|
-
bidfloor: 20
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
|
-
];
|
|
18
|
+
## AdUnits configuration example
|
|
31
19
|
```
|
|
20
|
+
var adUnits = [{
|
|
21
|
+
code: 'your-slot', //use exactly the same code as your slot div id.
|
|
22
|
+
mediaTypes: {
|
|
23
|
+
banner: {
|
|
24
|
+
sizes: [[320, 480]]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
bids: [{
|
|
28
|
+
bidder: 'otm',
|
|
29
|
+
params: {
|
|
30
|
+
tid: 'XXXXX',
|
|
31
|
+
domain: 'specific custom domain, if needed',
|
|
32
|
+
bidfloor: 20
|
|
33
|
+
}
|
|
34
|
+
}]
|
|
35
|
+
}];
|
|
32
36
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* tid - A tag id (should have low cardinality)
|
|
36
|
-
* bidfloor - Floor price
|
|
37
|
+
```
|
|
@@ -40,6 +40,7 @@ export const spec = {
|
|
|
40
40
|
const publisher = setOnAny(validBidRequests, 'params.publisher');
|
|
41
41
|
const bcat = setOnAny(validBidRequests, 'params.bcat');
|
|
42
42
|
const badv = setOnAny(validBidRequests, 'params.badv');
|
|
43
|
+
const eids = setOnAny(validBidRequests, 'userIdAsEids')
|
|
43
44
|
const cur = CURRENCY;
|
|
44
45
|
const endpointUrl = config.getConfig('outbrain.bidderUrl');
|
|
45
46
|
const timeout = bidderRequest.timeout;
|
|
@@ -105,6 +106,10 @@ export const spec = {
|
|
|
105
106
|
deepSetValue(request, 'regs.coppa', config.getConfig('coppa') & 1)
|
|
106
107
|
}
|
|
107
108
|
|
|
109
|
+
if (eids) {
|
|
110
|
+
deepSetValue(request, 'user.ext.eids', eids);
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
return {
|
|
109
114
|
method: 'POST',
|
|
110
115
|
url: endpointUrl,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Playwire Bidder Adapter
|
|
4
|
+
Module Type: Bidder Adapter
|
|
5
|
+
Maintainer: grid-tech@themediagrid.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
Module that connects to Grid demand source to fetch bids.
|
|
10
|
+
The adapter is GDPR compliant and supports banner and video (instream and outstream).
|
|
11
|
+
|
|
12
|
+
# Test Parameters
|
|
13
|
+
```
|
|
14
|
+
var adUnits = [
|
|
15
|
+
{
|
|
16
|
+
code: 'test-div',
|
|
17
|
+
sizes: [[300, 250]],
|
|
18
|
+
bids: [
|
|
19
|
+
{
|
|
20
|
+
bidder: "playwire",
|
|
21
|
+
params: {
|
|
22
|
+
uid: '1',
|
|
23
|
+
bidFloor: 0.5
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},{
|
|
28
|
+
code: 'test-div',
|
|
29
|
+
sizes: [[728, 90]],
|
|
30
|
+
bids: [
|
|
31
|
+
{
|
|
32
|
+
bidder: "playwire",
|
|
33
|
+
params: {
|
|
34
|
+
uid: 2,
|
|
35
|
+
keywords: {
|
|
36
|
+
brandsafety: ['disaster'],
|
|
37
|
+
topic: ['stress', 'fear']
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: 'test-div',
|
|
45
|
+
sizes: [[728, 90]],
|
|
46
|
+
mediaTypes: { video: {
|
|
47
|
+
context: 'instream',
|
|
48
|
+
playerSize: [728, 90],
|
|
49
|
+
mimes: ['video/mp4']
|
|
50
|
+
},
|
|
51
|
+
bids: [
|
|
52
|
+
{
|
|
53
|
+
bidder: "playwire",
|
|
54
|
+
params: {
|
|
55
|
+
uid: 11
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
```
|
|
@@ -1078,7 +1078,7 @@ export const spec = {
|
|
|
1078
1078
|
bid = deepClone(originalBid);
|
|
1079
1079
|
bid.params.adSlot = bid.params.adSlot || '';
|
|
1080
1080
|
_parseAdSlot(bid);
|
|
1081
|
-
if (bid.params.hasOwnProperty('video')) {
|
|
1081
|
+
if ((bid.mediaTypes && bid.mediaTypes.hasOwnProperty('video')) || bid.params.hasOwnProperty('video')) {
|
|
1082
1082
|
// Nothing to do
|
|
1083
1083
|
} else {
|
|
1084
1084
|
// If we have a native mediaType configured alongside banner, its ok if the banner size is not set in width and height
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
* @function?
|
|
43
43
|
* @summary modify bid request data
|
|
44
44
|
* @name RtdSubmodule#getBidRequestData
|
|
45
|
-
* @param {SubmoduleConfig} config
|
|
46
|
-
* @param {UserConsentData} userConsent
|
|
47
45
|
* @param {Object} reqBidsConfigObj
|
|
48
46
|
* @param {function} callback
|
|
47
|
+
* @param {SubmoduleConfig} config
|
|
48
|
+
* @param {UserConsentData} userConsent
|
|
49
49
|
*/
|
|
50
50
|
|
|
51
51
|
/**
|
|
@@ -83,8 +83,15 @@ export const spec = {
|
|
|
83
83
|
'lib_name': 'prebid',
|
|
84
84
|
'lib_v': '$prebid.version$',
|
|
85
85
|
'us': 0,
|
|
86
|
+
|
|
86
87
|
};
|
|
87
88
|
|
|
89
|
+
const fpd = config.getConfig('ortb2');
|
|
90
|
+
|
|
91
|
+
if (fpd) {
|
|
92
|
+
payload.fpd = JSON.stringify(fpd);
|
|
93
|
+
}
|
|
94
|
+
|
|
88
95
|
if (config.getConfig('userSync') && config.getConfig('userSync').syncsPerBidder) {
|
|
89
96
|
payload.us = config.getConfig('userSync').syncsPerBidder;
|
|
90
97
|
}
|
|
@@ -190,6 +190,8 @@ function buildRequestObject(bid) {
|
|
|
190
190
|
const reqObj = {};
|
|
191
191
|
let placementId = getValue(bid.params, 'placementId');
|
|
192
192
|
let pageId = getValue(bid.params, 'pageId');
|
|
193
|
+
const impressionData = deepAccess(bid, 'ortb2Imp.ext.data');
|
|
194
|
+
const gpid = deepAccess(impressionData, 'pbadslot') || deepAccess(impressionData, 'adserver.adslot');
|
|
193
195
|
|
|
194
196
|
reqObj.sizes = getSizes(bid);
|
|
195
197
|
reqObj.bidId = getBidIdParameter('bidId', bid);
|
|
@@ -199,6 +201,7 @@ function buildRequestObject(bid) {
|
|
|
199
201
|
reqObj.adUnitCode = getBidIdParameter('adUnitCode', bid);
|
|
200
202
|
reqObj.auctionId = getBidIdParameter('auctionId', bid);
|
|
201
203
|
reqObj.transactionId = getBidIdParameter('transactionId', bid);
|
|
204
|
+
if (gpid) { reqObj.gpid = gpid; }
|
|
202
205
|
return reqObj;
|
|
203
206
|
}
|
|
204
207
|
|
|
@@ -429,9 +429,10 @@ function addSegments(name, segName, segments, data, bidConfigName) {
|
|
|
429
429
|
if (segments && segments.length) {
|
|
430
430
|
data.push({
|
|
431
431
|
name: name,
|
|
432
|
-
segment: segments
|
|
433
|
-
|
|
434
|
-
|
|
432
|
+
segment: segments
|
|
433
|
+
.map((seg) => seg && (seg.id || seg))
|
|
434
|
+
.filter((seg) => seg && (typeof seg === 'string' || typeof seg === 'number'))
|
|
435
|
+
.map((seg) => ({ name: segName, value: seg.toString() }))
|
|
435
436
|
});
|
|
436
437
|
} else if (bidConfigName) {
|
|
437
438
|
const configData = config.getConfig('ortb2.user.data');
|
|
@@ -445,9 +446,10 @@ function addSegments(name, segName, segments, data, bidConfigName) {
|
|
|
445
446
|
if (segData && segData.length) {
|
|
446
447
|
data.push({
|
|
447
448
|
name: name,
|
|
448
|
-
segment: segData
|
|
449
|
-
|
|
450
|
-
|
|
449
|
+
segment: segData
|
|
450
|
+
.map((seg) => seg && (seg.id || seg))
|
|
451
|
+
.filter((seg) => seg && (typeof seg === 'string' || typeof seg === 'number'))
|
|
452
|
+
.map((seg) => ({ name: segName, value: seg.toString() }))
|
|
451
453
|
});
|
|
452
454
|
}
|
|
453
455
|
}
|