prebid.js 5.20.0 → 6.3.0
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/.babelrc.js +1 -10
- package/README.md +4 -2
- package/browsers.json +13 -37
- package/gulpfile.js +1 -8
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
- package/karma.conf.maker.js +1 -1
- package/modules/33acrossBidAdapter.js +189 -102
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/addefendBidAdapter.js +1 -0
- package/modules/adheseBidAdapter.js +7 -2
- package/modules/adkernelBidAdapter.js +1 -0
- package/modules/adlivetechBidAdapter.md +61 -0
- package/modules/admanBidAdapter.js +1 -0
- package/modules/admixerBidAdapter.js +3 -2
- package/modules/adnuntiusBidAdapter.js +5 -2
- package/modules/adomikAnalyticsAdapter.js +10 -4
- package/modules/adplusBidAdapter.js +203 -0
- package/modules/adplusBidAdapter.md +39 -0
- package/modules/adxcgBidAdapter.js +311 -359
- package/modules/adxcgBidAdapter.md +22 -21
- package/modules/adyoulikeBidAdapter.js +7 -2
- package/modules/appnexusBidAdapter.js +23 -3
- package/modules/beachfrontBidAdapter.js +14 -17
- package/modules/beopBidAdapter.js +5 -3
- package/modules/codefuelBidAdapter.js +1 -3
- package/modules/codefuelBidAdapter.md +3 -3
- package/modules/colossussspBidAdapter.js +7 -0
- package/modules/craftBidAdapter.js +5 -3
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/cwireBidAdapter.js +3 -0
- package/modules/datablocksBidAdapter.js +3 -3
- package/modules/dchain.js +149 -0
- package/modules/dchain.md +45 -0
- package/modules/deepintentBidAdapter.js +1 -1
- package/modules/dspxBidAdapter.js +1 -1
- package/modules/emx_digitalBidAdapter.js +9 -1
- package/modules/engageyaBidAdapter.js +68 -54
- package/modules/freewheel-sspBidAdapter.js +6 -0
- package/modules/futureads.md +48 -0
- package/modules/glimpseBidAdapter.js +44 -16
- package/modules/goldbachBidAdapter.js +1176 -0
- package/modules/goldbachBidAdapter.md +151 -0
- package/modules/gptPreAuction.js +11 -5
- package/modules/gridBidAdapter.js +1 -1
- package/modules/gumgumBidAdapter.js +7 -3
- package/modules/id5IdSystem.md +6 -6
- package/modules/imRtdProvider.js +31 -0
- package/modules/intersectionRtdProvider.js +114 -0
- package/modules/invibesBidAdapter.js +15 -9
- package/modules/ipromBidAdapter.js +79 -0
- package/modules/ixBidAdapter.js +166 -21
- package/modules/kinessoIdSystem.js +1 -1
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/lotamePanoramaIdSystem.js +80 -8
- package/modules/luponmediaBidAdapter.js +570 -0
- package/modules/mediasquareBidAdapter.js +1 -9
- package/modules/merkleIdSystem.js +5 -0
- package/modules/missenaBidAdapter.js +89 -0
- package/modules/nativoBidAdapter.js +27 -1
- package/modules/nextMillenniumBidAdapter.js +29 -1
- package/modules/oguryBidAdapter.js +2 -1
- package/modules/openxBidAdapter.js +6 -1
- package/modules/prebidServerBidAdapter/index.js +19 -15
- package/modules/pubmaticBidAdapter.js +5 -3
- package/modules/relaidoBidAdapter.js +86 -65
- package/modules/richaudienceBidAdapter.js +2 -3
- package/modules/rtdModule/index.js +48 -18
- package/modules/rubiconBidAdapter.js +10 -8
- package/modules/saambaaBidAdapter.js +420 -0
- package/modules/saambaaBidAdapter.md +65 -68
- package/modules/seedtagBidAdapter.js +6 -0
- package/modules/sharedIdSystem.js +27 -1
- package/modules/smaatoBidAdapter.js +9 -1
- package/modules/smartxBidAdapter.js +17 -1
- package/modules/sspBCBidAdapter.js +34 -3
- package/modules/tappxBidAdapter.js +3 -1
- package/modules/targetVideoBidAdapter.js +187 -0
- package/modules/targetVideoBidAdapter.md +34 -0
- package/modules/trustxBidAdapter.js +10 -1
- package/modules/undertoneBidAdapter.js +8 -1
- package/modules/userId/index.js +27 -2
- package/modules/ventes.md +71 -0
- package/modules/ventesBidAdapter.js +104 -64
- package/modules/ventesBidAdapter.md +0 -1
- package/modules/vidoomyBidAdapter.js +65 -108
- package/modules/visxBidAdapter.js +20 -3
- package/modules/visxBidAdapter.md +4 -6
- package/modules/weboramaRtdProvider.js +288 -73
- package/modules/weboramaRtdProvider.md +27 -10
- package/modules/yahoosspBidAdapter.js +5 -1
- package/modules/yahoosspBidAdapter.md +1 -1
- package/modules/yieldlabBidAdapter.js +41 -10
- package/modules/yieldlabBidAdapter.md +91 -48
- package/modules/yieldoneBidAdapter.js +115 -11
- package/modules/zetaSspBidAdapter.md +33 -1
- package/modules/zeta_global_sspBidAdapter.js +22 -1
- package/package.json +6 -1
- package/plugins/pbjsGlobals.js +28 -1
- package/src/adapterManager.js +14 -8
- package/src/auction.js +3 -2
- package/src/prebid.js +1 -2
- package/src/targeting.js +24 -3
- package/src/utils.js +41 -7
- package/test/spec/integration/faker/googletag.js +6 -0
- package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
- package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
- package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
- package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
- package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
- package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
- package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
- package/test/spec/modules/dchain_spec.js +329 -0
- package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
- package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
- package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
- package/test/spec/modules/gptPreAuction_spec.js +58 -4
- package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
- package/test/spec/modules/imRtdProvider_spec.js +25 -0
- package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
- package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
- package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
- package/test/spec/modules/ixBidAdapter_spec.js +285 -2
- package/test/spec/modules/konduitWrapper_spec.js +0 -1
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
- package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
- package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
- package/test/spec/modules/merkleIdSystem_spec.js +18 -0
- package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +18 -0
- package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
- package/test/spec/modules/openxBidAdapter_spec.js +5 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
- package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
- package/test/spec/modules/realTimeDataModule_spec.js +135 -49
- package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
- package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
- package/test/spec/modules/rubiconBidAdapter_spec.js +17 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
- package/test/spec/modules/sharedIdSystem_spec.js +52 -6
- package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
- package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
- package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
- package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
- package/test/spec/modules/userId_spec.js +51 -0
- package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
- package/test/spec/modules/visxBidAdapter_spec.js +121 -5
- package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
- package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
- package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
- package/test/spec/unit/core/adapterManager_spec.js +24 -6
- package/test/spec/unit/core/targeting_spec.js +116 -0
- package/test/spec/utils_spec.js +38 -0
- package/wdio.conf.js +1 -1
|
@@ -11,53 +11,96 @@ Maintainer: solutions@yieldlab.de
|
|
|
11
11
|
Module that connects to Yieldlab's demand sources
|
|
12
12
|
|
|
13
13
|
# Test Parameters
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
const adUnits = [
|
|
17
|
+
{
|
|
18
|
+
code: 'banner',
|
|
19
|
+
sizes: [ [ 728, 90 ] ],
|
|
20
|
+
bids: [{
|
|
21
|
+
bidder: 'yieldlab',
|
|
22
|
+
params: {
|
|
23
|
+
adslotId: '5220336',
|
|
24
|
+
supplyId: '1381604',
|
|
25
|
+
targeting: {
|
|
26
|
+
key1: 'value1',
|
|
27
|
+
key2: 'value2'
|
|
28
|
+
},
|
|
29
|
+
extId: 'abc',
|
|
30
|
+
iabContent: {
|
|
31
|
+
id: 'some_id',
|
|
32
|
+
episode: '1',
|
|
33
|
+
title: 'some title',
|
|
34
|
+
series: 'some series',
|
|
35
|
+
season: 's1',
|
|
36
|
+
artist: 'John Doe',
|
|
37
|
+
genre: 'some genre',
|
|
38
|
+
isrc: 'CC-XXX-YY-NNNNN',
|
|
39
|
+
url: 'http://foo_url.de',
|
|
40
|
+
cat: [ 'IAB1-1', 'IAB1-2', 'IAB2-10' ],
|
|
41
|
+
context: '7',
|
|
42
|
+
keywords: ['k1', 'k2'],
|
|
43
|
+
live: '0'
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
code: 'video',
|
|
50
|
+
sizes: [ [ 640, 480 ] ],
|
|
51
|
+
mediaTypes: {
|
|
52
|
+
video: {
|
|
53
|
+
context: 'instream' // or 'outstream'
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
bids: [{
|
|
57
|
+
bidder: 'yieldlab',
|
|
58
|
+
params: {
|
|
59
|
+
adslotId: '5220339',
|
|
60
|
+
supplyId: '1381604'
|
|
61
|
+
}
|
|
62
|
+
}]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
code: 'native',
|
|
66
|
+
mediaTypes: {
|
|
67
|
+
native: {
|
|
68
|
+
// native config
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
bids: [{
|
|
72
|
+
bidder: 'yieldlab',
|
|
73
|
+
params: {
|
|
74
|
+
adslotId: '5220339',
|
|
75
|
+
supplyId: '1381604'
|
|
76
|
+
}
|
|
77
|
+
}]
|
|
78
|
+
}
|
|
79
|
+
];
|
|
14
80
|
```
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
context: "7",
|
|
41
|
-
keywords: ["k1", "k2"],
|
|
42
|
-
live: "0"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}]
|
|
46
|
-
}, {
|
|
47
|
-
code: "video",
|
|
48
|
-
sizes: [[640, 480]],
|
|
49
|
-
mediaTypes: {
|
|
50
|
-
video: {
|
|
51
|
-
context: "instream" // or "outstream"
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
bids: [{
|
|
55
|
-
bidder: "yieldlab",
|
|
56
|
-
params: {
|
|
57
|
-
adslotId: "5220339",
|
|
58
|
-
supplyId: "1381604"
|
|
59
|
-
}
|
|
60
|
-
}]
|
|
61
|
-
}
|
|
62
|
-
];
|
|
81
|
+
|
|
82
|
+
# Multi-Format Setup
|
|
83
|
+
|
|
84
|
+
A general overview of how to set up multi-format ads can be found in the offical Prebid.js docs. See: [show multi-format ads](https://docs.prebid.org/dev-docs/show-multi-format-ads.html)
|
|
85
|
+
|
|
86
|
+
When setting up multi-format ads with Yieldlab make sure to always add at least one eligible Adslot per given media type in the ad unit configuration.
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
const adUnit = {
|
|
90
|
+
code: 'multi-format-adslot',
|
|
91
|
+
mediaTypes: {
|
|
92
|
+
banner: {
|
|
93
|
+
sizes: [ [ 728, 90 ] ]
|
|
94
|
+
},
|
|
95
|
+
native: {
|
|
96
|
+
// native config
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
bids: [
|
|
100
|
+
// banner Adslot
|
|
101
|
+
{ bidder: 'yieldlab', params: { adslotId: '1234', supplyId: '42' } },
|
|
102
|
+
// native Adslot
|
|
103
|
+
{ bidder: 'yieldlab', params: { adslotId: '2345', supplyId: '42' } }
|
|
104
|
+
]
|
|
105
|
+
};
|
|
63
106
|
```
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {deepAccess, isEmpty, isStr, logWarn, parseSizesInput} from '../src/utils.js';
|
|
2
2
|
import {config} from '../src/config.js';
|
|
3
3
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
4
4
|
import { Renderer } from '../src/Renderer.js';
|
|
@@ -11,6 +11,8 @@ const VIDEO_PLAYER_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/d
|
|
|
11
11
|
const CMER_PLAYER_URL = 'https://an.cmertv.com/hb/renderer/cmertv-video-yone-prebid.min.js';
|
|
12
12
|
const VIEWABLE_PERCENTAGE_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/prebid-adformat-config.js';
|
|
13
13
|
|
|
14
|
+
const DEFAULT_VIDEO_SIZE = {w: 640, h: 360};
|
|
15
|
+
|
|
14
16
|
export const spec = {
|
|
15
17
|
code: BIDDER_CODE,
|
|
16
18
|
aliases: ['y1'],
|
|
@@ -40,16 +42,18 @@ export const spec = {
|
|
|
40
42
|
t: 'i'
|
|
41
43
|
};
|
|
42
44
|
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
const mediaType = getMediaType(bidRequest);
|
|
46
|
+
switch (mediaType) {
|
|
47
|
+
case BANNER:
|
|
48
|
+
payload.sz = getBannerSizes(bidRequest);
|
|
49
|
+
break;
|
|
50
|
+
case VIDEO:
|
|
51
|
+
const videoSize = getVideoSize(bidRequest);
|
|
52
|
+
payload.w = videoSize.w;
|
|
53
|
+
payload.h = videoSize.h;
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
break;
|
|
53
57
|
}
|
|
54
58
|
|
|
55
59
|
// LiveRampID
|
|
@@ -167,6 +171,106 @@ export const spec = {
|
|
|
167
171
|
},
|
|
168
172
|
}
|
|
169
173
|
|
|
174
|
+
/**
|
|
175
|
+
* NOTE: server side does not yet support multiple formats.
|
|
176
|
+
* @param {Object} bidRequest -
|
|
177
|
+
* @param {boolean} [enabledOldFormat = true] - default: `true`.
|
|
178
|
+
* @return {string|null} - `"banner"` or `"video"` or `null`.
|
|
179
|
+
*/
|
|
180
|
+
function getMediaType(bidRequest, enabledOldFormat = true) {
|
|
181
|
+
let hasBannerType = Boolean(deepAccess(bidRequest, 'mediaTypes.banner'));
|
|
182
|
+
let hasVideoType = Boolean(deepAccess(bidRequest, 'mediaTypes.video'));
|
|
183
|
+
|
|
184
|
+
if (enabledOldFormat) {
|
|
185
|
+
hasBannerType = hasBannerType || bidRequest.mediaType === BANNER ||
|
|
186
|
+
(isEmpty(bidRequest.mediaTypes) && isEmpty(bidRequest.mediaType));
|
|
187
|
+
hasVideoType = hasVideoType || bidRequest.mediaType === VIDEO;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (hasBannerType && hasVideoType) {
|
|
191
|
+
const playerParams = deepAccess(bidRequest, 'params.playerParams')
|
|
192
|
+
if (playerParams) {
|
|
193
|
+
return VIDEO;
|
|
194
|
+
} else {
|
|
195
|
+
return BANNER;
|
|
196
|
+
}
|
|
197
|
+
} else if (hasBannerType) {
|
|
198
|
+
return BANNER;
|
|
199
|
+
} else if (hasVideoType) {
|
|
200
|
+
return VIDEO;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* NOTE:
|
|
208
|
+
* If `mediaTypes.banner` exists, then `mediaTypes.banner.sizes` must also exist.
|
|
209
|
+
* The reason for this is that Prebid.js will perform the verification and
|
|
210
|
+
* if `mediaTypes.banner.sizes` is inappropriate, it will delete the entire `mediaTypes.banner`.
|
|
211
|
+
* @param {Object} bidRequest -
|
|
212
|
+
* @param {Object} bidRequest.banner -
|
|
213
|
+
* @param {Array<string>} bidRequest.banner.sizes -
|
|
214
|
+
* @param {boolean} [enabledOldFormat = true] - default: `true`.
|
|
215
|
+
* @return {string} - strings like `"300x250"` or `"300x250,728x90"`.
|
|
216
|
+
*/
|
|
217
|
+
function getBannerSizes(bidRequest, enabledOldFormat = true) {
|
|
218
|
+
let sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes');
|
|
219
|
+
|
|
220
|
+
if (enabledOldFormat) {
|
|
221
|
+
sizes = sizes || bidRequest.sizes;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return parseSizesInput(sizes).join(',');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* @param {Object} bidRequest -
|
|
229
|
+
* @param {boolean} [enabledOldFormat = true] - default: `true`.
|
|
230
|
+
* @param {boolean} [enabledFlux = true] - default: `true`.
|
|
231
|
+
* @return {{w: number, h: number}} -
|
|
232
|
+
*/
|
|
233
|
+
function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = true) {
|
|
234
|
+
/**
|
|
235
|
+
* @param {Array<number, number> | Array<Array<number, number>>} sizes -
|
|
236
|
+
* @return {{w: number, h: number} | null} -
|
|
237
|
+
*/
|
|
238
|
+
const _getPlayerSize = (sizes) => {
|
|
239
|
+
let result = null;
|
|
240
|
+
|
|
241
|
+
const size = parseSizesInput(sizes)[0];
|
|
242
|
+
if (isEmpty(size)) {
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const splited = size.split('x');
|
|
247
|
+
const sizeObj = {w: parseInt(splited[0], 10), h: parseInt(splited[1], 10)};
|
|
248
|
+
const _isValidPlayerSize = !(isEmpty(sizeObj)) && (isFinite(sizeObj.w) && isFinite(sizeObj.h));
|
|
249
|
+
if (!_isValidPlayerSize) {
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
result = sizeObj;
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
let playerSize = _getPlayerSize(deepAccess(bidRequest, 'mediaTypes.video.playerSize'));
|
|
258
|
+
|
|
259
|
+
if (enabledOldFormat) {
|
|
260
|
+
playerSize = playerSize || _getPlayerSize(bidRequest.sizes);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (enabledFlux) {
|
|
264
|
+
// NOTE: `video.playerSize` in Flux is always [1,1].
|
|
265
|
+
if (playerSize && (playerSize.w === 1 && playerSize.h === 1)) {
|
|
266
|
+
// NOTE: `params.playerSize` is a specific object to support `FLUX`.
|
|
267
|
+
playerSize = _getPlayerSize(deepAccess(bidRequest, 'params.playerSize'));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return playerSize || DEFAULT_VIDEO_SIZE;
|
|
272
|
+
}
|
|
273
|
+
|
|
170
274
|
function newRenderer(response) {
|
|
171
275
|
const renderer = Renderer.install({
|
|
172
276
|
id: response.uid,
|
|
@@ -10,7 +10,7 @@ Maintainer: miakovlev@zetaglobal.com
|
|
|
10
10
|
|
|
11
11
|
Module that connects to Zeta's SSP
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# Banner Ad Unit: For Publishers
|
|
14
14
|
```
|
|
15
15
|
var adUnits = [
|
|
16
16
|
{
|
|
@@ -40,3 +40,35 @@ Module that connects to Zeta's SSP
|
|
|
40
40
|
}
|
|
41
41
|
];
|
|
42
42
|
```
|
|
43
|
+
|
|
44
|
+
# Video Ad Unit: For Publishers
|
|
45
|
+
```
|
|
46
|
+
var adUnits = [
|
|
47
|
+
{
|
|
48
|
+
mediaTypes: {
|
|
49
|
+
video: {
|
|
50
|
+
playerSize: [640, 480],
|
|
51
|
+
context: 'outstream'
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
bids: [
|
|
55
|
+
{
|
|
56
|
+
bidder: 'zeta_global_ssp',
|
|
57
|
+
bidId: 12345,
|
|
58
|
+
params: {
|
|
59
|
+
placement: 12345,
|
|
60
|
+
user: {
|
|
61
|
+
uid: 12345,
|
|
62
|
+
buyeruid: 12345
|
|
63
|
+
},
|
|
64
|
+
tags: {
|
|
65
|
+
someTag: 123,
|
|
66
|
+
sid: 'publisherId'
|
|
67
|
+
},
|
|
68
|
+
test: 1
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
];
|
|
74
|
+
```
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {deepAccess, deepSetValue, isArray, isBoolean, isNumber, isStr, logWarn} from '../src/utils.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
4
4
|
import {config} from '../src/config.js';
|
|
@@ -11,6 +11,8 @@ const DEFAULT_CUR = 'USD';
|
|
|
11
11
|
const TTL = 200;
|
|
12
12
|
const NET_REV = true;
|
|
13
13
|
|
|
14
|
+
const VIDEO_REGEX = new RegExp(/VAST\s+version/);
|
|
15
|
+
|
|
14
16
|
const DATA_TYPES = {
|
|
15
17
|
'NUMBER': 'number',
|
|
16
18
|
'STRING': 'string',
|
|
@@ -161,6 +163,7 @@ export const spec = {
|
|
|
161
163
|
advertiserDomains: zetaBid.adomain
|
|
162
164
|
};
|
|
163
165
|
}
|
|
166
|
+
provideMediaType(zetaBid, bid);
|
|
164
167
|
bidResponses.push(bid);
|
|
165
168
|
})
|
|
166
169
|
})
|
|
@@ -284,4 +287,22 @@ function isConnectedTV() {
|
|
|
284
287
|
return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent);
|
|
285
288
|
}
|
|
286
289
|
|
|
290
|
+
function provideMediaType(zetaBid, bid) {
|
|
291
|
+
if (zetaBid.ext && zetaBid.ext.bidtype) {
|
|
292
|
+
if (zetaBid.ext.bidtype === VIDEO) {
|
|
293
|
+
bid.mediaType = VIDEO;
|
|
294
|
+
bid.vastXml = bid.ad;
|
|
295
|
+
} else {
|
|
296
|
+
bid.mediaType = BANNER;
|
|
297
|
+
}
|
|
298
|
+
} else {
|
|
299
|
+
if (VIDEO_REGEX.test(bid.ad)) {
|
|
300
|
+
bid.mediaType = VIDEO;
|
|
301
|
+
bid.vastXml = bid.ad;
|
|
302
|
+
} else {
|
|
303
|
+
bid.mediaType = BANNER;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
287
308
|
registerBidder(spec);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prebid.js",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.3.0",
|
|
4
4
|
"description": "Header Bidding Management Library",
|
|
5
5
|
"main": "src/prebid.js",
|
|
6
6
|
"scripts": {
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "https://github.com/prebid/Prebid.js.git"
|
|
13
13
|
},
|
|
14
|
+
"browserslist": [
|
|
15
|
+
"> 0.25%",
|
|
16
|
+
"not IE 11",
|
|
17
|
+
"not op_mini all"
|
|
18
|
+
],
|
|
14
19
|
"keywords": [
|
|
15
20
|
"advertising",
|
|
16
21
|
"auction",
|
package/plugins/pbjsGlobals.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
|
|
2
2
|
let t = require('@babel/core').types;
|
|
3
3
|
let prebid = require('../package.json');
|
|
4
|
+
const path = require('path');
|
|
4
5
|
|
|
5
6
|
module.exports = function(api, options) {
|
|
7
|
+
const pbGlobal = options.globalVarName || prebid.globalVarName;
|
|
6
8
|
let replace = {
|
|
7
9
|
'$prebid.version$': prebid.version,
|
|
8
|
-
'$$PREBID_GLOBAL$$':
|
|
10
|
+
'$$PREBID_GLOBAL$$': pbGlobal,
|
|
9
11
|
'$$REPO_AND_VERSION$$': `${prebid.repository.url.split('/')[3]}_prebid_${prebid.version}`
|
|
10
12
|
};
|
|
11
13
|
|
|
@@ -13,8 +15,33 @@ module.exports = function(api, options) {
|
|
|
13
15
|
'$$REPO_AND_VERSION$$'
|
|
14
16
|
];
|
|
15
17
|
|
|
18
|
+
const PREBID_ROOT = path.resolve(__dirname, '..');
|
|
19
|
+
|
|
20
|
+
function getModuleName(filename) {
|
|
21
|
+
const modPath = path.parse(path.relative(PREBID_ROOT, filename));
|
|
22
|
+
if (modPath.ext.toLowerCase() !== '.js') {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
if (modPath.dir === 'modules') {
|
|
26
|
+
// modules/moduleName.js -> moduleName
|
|
27
|
+
return modPath.name;
|
|
28
|
+
}
|
|
29
|
+
if (modPath.name.toLowerCase() === 'index' && path.dirname(modPath.dir) === 'modules') {
|
|
30
|
+
// modules/moduleName/index.js -> moduleName
|
|
31
|
+
return path.basename(modPath.dir);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
16
36
|
return {
|
|
17
37
|
visitor: {
|
|
38
|
+
Program(path, state) {
|
|
39
|
+
const modName = getModuleName(state.filename);
|
|
40
|
+
if (modName != null) {
|
|
41
|
+
// append "registration" of module file to $$PREBID_GLOBAL$$.installedModules
|
|
42
|
+
path.node.body.push(...api.parse(`window.${pbGlobal}.installedModules.push('${modName}');`).program.body);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
18
45
|
StringLiteral(path) {
|
|
19
46
|
Object.keys(replace).forEach(name => {
|
|
20
47
|
if (path.node.value.includes(name)) {
|
package/src/adapterManager.js
CHANGED
|
@@ -262,14 +262,16 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a
|
|
|
262
262
|
}
|
|
263
263
|
|
|
264
264
|
let adUnitsS2SCopy = getAdUnitCopyForPrebidServer(adUnits, s2sConfig);
|
|
265
|
-
|
|
265
|
+
|
|
266
|
+
// uniquePbsTid is so we know which server to send which bids to during the callBids function
|
|
267
|
+
let uniquePbsTid = generateUUID();
|
|
266
268
|
adaptersServerSide.forEach(bidderCode => {
|
|
267
269
|
const bidderRequestId = getUniqueIdentifierStr();
|
|
268
270
|
const bidderRequest = {
|
|
269
271
|
bidderCode,
|
|
270
272
|
auctionId,
|
|
271
273
|
bidderRequestId,
|
|
272
|
-
|
|
274
|
+
uniquePbsTid,
|
|
273
275
|
bids: hookedGetBids({bidderCode, auctionId, bidderRequestId, 'adUnits': deepClone(adUnitsS2SCopy), labels, src: CONSTANTS.S2S.SRC}),
|
|
274
276
|
auctionStart: auctionStart,
|
|
275
277
|
timeout: s2sConfig.timeout,
|
|
@@ -350,7 +352,7 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
350
352
|
serverBidRequests.forEach(serverBidRequest => {
|
|
351
353
|
var index = -1;
|
|
352
354
|
for (var i = 0; i < uniqueServerBidRequests.length; ++i) {
|
|
353
|
-
if (serverBidRequest.
|
|
355
|
+
if (serverBidRequest.uniquePbsTid === uniqueServerBidRequests[i].uniquePbsTid) {
|
|
354
356
|
index = i;
|
|
355
357
|
break;
|
|
356
358
|
}
|
|
@@ -360,7 +362,10 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
360
362
|
}
|
|
361
363
|
});
|
|
362
364
|
|
|
363
|
-
let counter = 0
|
|
365
|
+
let counter = 0;
|
|
366
|
+
|
|
367
|
+
// $.source.tid MUST be a unique UUID and also THE SAME between all PBS Requests for a given Auction
|
|
368
|
+
const sourceTid = generateUUID();
|
|
364
369
|
_s2sConfigs.forEach((s2sConfig) => {
|
|
365
370
|
if (s2sConfig && uniqueServerBidRequests[counter] && includes(s2sConfig.bidders, uniqueServerBidRequests[counter].bidderCode)) {
|
|
366
371
|
// s2s should get the same client side timeout as other client side requests.
|
|
@@ -370,13 +375,13 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
370
375
|
} : undefined);
|
|
371
376
|
let adaptersServerSide = s2sConfig.bidders;
|
|
372
377
|
const s2sAdapter = _bidderRegistry[s2sConfig.adapter];
|
|
373
|
-
let
|
|
378
|
+
let uniquePbsTid = uniqueServerBidRequests[counter].uniquePbsTid;
|
|
374
379
|
let adUnitsS2SCopy = uniqueServerBidRequests[counter].adUnitsS2SCopy;
|
|
375
380
|
|
|
376
|
-
let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.
|
|
381
|
+
let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.uniquePbsTid === uniquePbsTid);
|
|
377
382
|
|
|
378
383
|
if (s2sAdapter) {
|
|
379
|
-
let s2sBidRequest = {tid, 'ad_units': adUnitsS2SCopy, s2sConfig};
|
|
384
|
+
let s2sBidRequest = {tid: sourceTid, 'ad_units': adUnitsS2SCopy, s2sConfig};
|
|
380
385
|
if (s2sBidRequest.ad_units.length) {
|
|
381
386
|
let doneCbs = uniqueServerRequests.map(bidRequest => {
|
|
382
387
|
bidRequest.start = timestamp();
|
|
@@ -391,7 +396,8 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
391
396
|
|
|
392
397
|
// fire BID_REQUESTED event for each s2s bidRequest
|
|
393
398
|
uniqueServerRequests.forEach(bidRequest => {
|
|
394
|
-
|
|
399
|
+
// add the new sourceTid
|
|
400
|
+
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, {...bidRequest, tid: sourceTid});
|
|
395
401
|
});
|
|
396
402
|
|
|
397
403
|
// make bid requests
|
package/src/auction.js
CHANGED
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
|
|
60
60
|
import {
|
|
61
61
|
flatten, timestamp, adUnitsFilter, deepAccess, getBidRequest, getValue, parseUrl, generateUUID,
|
|
62
|
-
logMessage, bind, logError, logInfo, logWarn, isEmpty, _each, isFn, isEmptyStr
|
|
62
|
+
logMessage, bind, logError, logInfo, logWarn, isEmpty, _each, isFn, isEmptyStr, isAllowZeroCpmBidsEnabled
|
|
63
63
|
} from './utils.js';
|
|
64
64
|
import { getPriceBucketString } from './cpmBucketManager.js';
|
|
65
65
|
import { getNativeTargeting } from './native.js';
|
|
@@ -567,7 +567,8 @@ function getPreparedBidForAuction({adUnitCode, bid, bidderRequest, auctionId}) {
|
|
|
567
567
|
|
|
568
568
|
function setupBidTargeting(bidObject, bidderRequest) {
|
|
569
569
|
let keyValues;
|
|
570
|
-
|
|
570
|
+
const cpmCheck = (isAllowZeroCpmBidsEnabled(bidObject.bidderCode)) ? bidObject.cpm >= 0 : bidObject.cpm > 0;
|
|
571
|
+
if (bidObject.bidderCode && (cpmCheck || bidObject.dealId)) {
|
|
571
572
|
let bidReq = find(bidderRequest.bids, bid => bid.adUnitCode === bidObject.adUnitCode);
|
|
572
573
|
keyValues = getKeyValueTargetingPairs(bidObject.bidderCode, bidObject, bidReq);
|
|
573
574
|
}
|
package/src/prebid.js
CHANGED
|
@@ -47,8 +47,7 @@ $$PREBID_GLOBAL$$.libLoaded = true;
|
|
|
47
47
|
$$PREBID_GLOBAL$$.version = 'v$prebid.version$';
|
|
48
48
|
logInfo('Prebid.js v$prebid.version$ loaded');
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
$$PREBID_GLOBAL$$.installedModules = ['v$prebid.modulesList$'];
|
|
50
|
+
$$PREBID_GLOBAL$$.installedModules = $$PREBID_GLOBAL$$.installedModules || [];
|
|
52
51
|
|
|
53
52
|
// create adUnit array
|
|
54
53
|
$$PREBID_GLOBAL$$.adUnits = $$PREBID_GLOBAL$$.adUnits || [];
|
package/src/targeting.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
uniques, isGptPubadsDefined, getHighestCpm, getOldestHighestCpmBid, groupBy, isAdUnitCodeMatchingSlot, timestamp,
|
|
3
|
-
deepAccess, deepClone, logError, logWarn, logInfo, isFn, isArray, logMessage, isStr
|
|
3
|
+
deepAccess, deepClone, logError, logWarn, logInfo, isFn, isArray, logMessage, isStr, isAllowZeroCpmBidsEnabled
|
|
4
4
|
} from './utils.js';
|
|
5
5
|
import { config } from './config.js';
|
|
6
6
|
import { NATIVE_TARGETING_KEYS } from './native.js';
|
|
@@ -18,6 +18,10 @@ var pbTargetingKeys = [];
|
|
|
18
18
|
const MAX_DFP_KEYLENGTH = 20;
|
|
19
19
|
const TTL_BUFFER = 1000;
|
|
20
20
|
|
|
21
|
+
const CFG_ALLOW_TARGETING_KEYS = `targetingControls.allowTargetingKeys`;
|
|
22
|
+
const CFG_ADD_TARGETING_KEYS = `targetingControls.addTargetingKeys`;
|
|
23
|
+
const TARGETING_KEY_CONFIGURATION_ERROR_MSG = `Only one of "${CFG_ALLOW_TARGETING_KEYS}" or "${CFG_ADD_TARGETING_KEYS}" can be set`;
|
|
24
|
+
|
|
21
25
|
export const TARGETING_KEYS = Object.keys(CONSTANTS.TARGETING_KEYS).map(
|
|
22
26
|
key => CONSTANTS.TARGETING_KEYS[key]
|
|
23
27
|
);
|
|
@@ -261,7 +265,17 @@ export function newTargeting(auctionManager) {
|
|
|
261
265
|
});
|
|
262
266
|
|
|
263
267
|
const defaultKeys = Object.keys(Object.assign({}, CONSTANTS.DEFAULT_TARGETING_KEYS, CONSTANTS.NATIVE_KEYS));
|
|
264
|
-
|
|
268
|
+
let allowedKeys = config.getConfig(CFG_ALLOW_TARGETING_KEYS);
|
|
269
|
+
const addedKeys = config.getConfig(CFG_ADD_TARGETING_KEYS);
|
|
270
|
+
|
|
271
|
+
if (addedKeys != null && allowedKeys != null) {
|
|
272
|
+
throw new Error(TARGETING_KEY_CONFIGURATION_ERROR_MSG);
|
|
273
|
+
} else if (addedKeys != null) {
|
|
274
|
+
allowedKeys = defaultKeys.concat(addedKeys);
|
|
275
|
+
} else {
|
|
276
|
+
allowedKeys = allowedKeys || defaultKeys;
|
|
277
|
+
}
|
|
278
|
+
|
|
265
279
|
if (Array.isArray(allowedKeys) && allowedKeys.length > 0) {
|
|
266
280
|
targeting = getAllowedTargetingKeyValues(targeting, allowedKeys);
|
|
267
281
|
}
|
|
@@ -284,6 +298,13 @@ export function newTargeting(auctionManager) {
|
|
|
284
298
|
return targeting;
|
|
285
299
|
};
|
|
286
300
|
|
|
301
|
+
// warn about conflicting configuration
|
|
302
|
+
config.getConfig('targetingControls', function (config) {
|
|
303
|
+
if (deepAccess(config, CFG_ALLOW_TARGETING_KEYS) != null && deepAccess(config, CFG_ADD_TARGETING_KEYS) != null) {
|
|
304
|
+
logError(TARGETING_KEY_CONFIGURATION_ERROR_MSG);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
|
|
287
308
|
// create an encoded string variant based on the keypairs of the provided object
|
|
288
309
|
// - note this will encode the characters between the keys (ie = and &)
|
|
289
310
|
function convertKeysToQueryForm(keyMap) {
|
|
@@ -438,7 +459,7 @@ export function newTargeting(auctionManager) {
|
|
|
438
459
|
const adUnitCodes = getAdUnitCodes(adUnitCode);
|
|
439
460
|
return bidsReceived
|
|
440
461
|
.filter(bid => includes(adUnitCodes, bid.adUnitCode))
|
|
441
|
-
.filter(bid => bid.cpm > 0)
|
|
462
|
+
.filter(bid => (isAllowZeroCpmBidsEnabled(bid.bidderCode)) ? bid.cpm >= 0 : bid.cpm > 0)
|
|
442
463
|
.map(bid => bid.adUnitCode)
|
|
443
464
|
.filter(uniques)
|
|
444
465
|
.map(adUnitCode => bidsReceived
|