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.
Files changed (168) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +4 -2
  3. package/browsers.json +13 -37
  4. package/gulpfile.js +1 -8
  5. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  6. package/karma.conf.maker.js +1 -1
  7. package/modules/33acrossBidAdapter.js +189 -102
  8. package/modules/adagioBidAdapter.js +1 -1
  9. package/modules/addefendBidAdapter.js +1 -0
  10. package/modules/adheseBidAdapter.js +7 -2
  11. package/modules/adkernelBidAdapter.js +1 -0
  12. package/modules/adlivetechBidAdapter.md +61 -0
  13. package/modules/admanBidAdapter.js +1 -0
  14. package/modules/admixerBidAdapter.js +3 -2
  15. package/modules/adnuntiusBidAdapter.js +5 -2
  16. package/modules/adomikAnalyticsAdapter.js +10 -4
  17. package/modules/adplusBidAdapter.js +203 -0
  18. package/modules/adplusBidAdapter.md +39 -0
  19. package/modules/adxcgBidAdapter.js +311 -359
  20. package/modules/adxcgBidAdapter.md +22 -21
  21. package/modules/adyoulikeBidAdapter.js +7 -2
  22. package/modules/appnexusBidAdapter.js +23 -3
  23. package/modules/beachfrontBidAdapter.js +14 -17
  24. package/modules/beopBidAdapter.js +5 -3
  25. package/modules/codefuelBidAdapter.js +1 -3
  26. package/modules/codefuelBidAdapter.md +3 -3
  27. package/modules/colossussspBidAdapter.js +7 -0
  28. package/modules/craftBidAdapter.js +5 -3
  29. package/modules/criteoBidAdapter.js +1 -1
  30. package/modules/cwireBidAdapter.js +3 -0
  31. package/modules/datablocksBidAdapter.js +3 -3
  32. package/modules/dchain.js +149 -0
  33. package/modules/dchain.md +45 -0
  34. package/modules/deepintentBidAdapter.js +1 -1
  35. package/modules/dspxBidAdapter.js +1 -1
  36. package/modules/emx_digitalBidAdapter.js +9 -1
  37. package/modules/engageyaBidAdapter.js +68 -54
  38. package/modules/freewheel-sspBidAdapter.js +6 -0
  39. package/modules/futureads.md +48 -0
  40. package/modules/glimpseBidAdapter.js +44 -16
  41. package/modules/goldbachBidAdapter.js +1176 -0
  42. package/modules/goldbachBidAdapter.md +151 -0
  43. package/modules/gptPreAuction.js +11 -5
  44. package/modules/gridBidAdapter.js +1 -1
  45. package/modules/gumgumBidAdapter.js +7 -3
  46. package/modules/id5IdSystem.md +6 -6
  47. package/modules/imRtdProvider.js +31 -0
  48. package/modules/intersectionRtdProvider.js +114 -0
  49. package/modules/invibesBidAdapter.js +15 -9
  50. package/modules/ipromBidAdapter.js +79 -0
  51. package/modules/ixBidAdapter.js +166 -21
  52. package/modules/kinessoIdSystem.js +1 -1
  53. package/modules/limelightDigitalBidAdapter.js +2 -1
  54. package/modules/lotamePanoramaIdSystem.js +80 -8
  55. package/modules/luponmediaBidAdapter.js +570 -0
  56. package/modules/mediasquareBidAdapter.js +1 -9
  57. package/modules/merkleIdSystem.js +5 -0
  58. package/modules/missenaBidAdapter.js +89 -0
  59. package/modules/nativoBidAdapter.js +27 -1
  60. package/modules/nextMillenniumBidAdapter.js +29 -1
  61. package/modules/oguryBidAdapter.js +2 -1
  62. package/modules/openxBidAdapter.js +6 -1
  63. package/modules/prebidServerBidAdapter/index.js +19 -15
  64. package/modules/pubmaticBidAdapter.js +5 -3
  65. package/modules/relaidoBidAdapter.js +86 -65
  66. package/modules/richaudienceBidAdapter.js +2 -3
  67. package/modules/rtdModule/index.js +48 -18
  68. package/modules/rubiconBidAdapter.js +10 -8
  69. package/modules/saambaaBidAdapter.js +420 -0
  70. package/modules/saambaaBidAdapter.md +65 -68
  71. package/modules/seedtagBidAdapter.js +6 -0
  72. package/modules/sharedIdSystem.js +27 -1
  73. package/modules/smaatoBidAdapter.js +9 -1
  74. package/modules/smartxBidAdapter.js +17 -1
  75. package/modules/sspBCBidAdapter.js +34 -3
  76. package/modules/tappxBidAdapter.js +3 -1
  77. package/modules/targetVideoBidAdapter.js +187 -0
  78. package/modules/targetVideoBidAdapter.md +34 -0
  79. package/modules/trustxBidAdapter.js +10 -1
  80. package/modules/undertoneBidAdapter.js +8 -1
  81. package/modules/userId/index.js +27 -2
  82. package/modules/ventes.md +71 -0
  83. package/modules/ventesBidAdapter.js +104 -64
  84. package/modules/ventesBidAdapter.md +0 -1
  85. package/modules/vidoomyBidAdapter.js +65 -108
  86. package/modules/visxBidAdapter.js +20 -3
  87. package/modules/visxBidAdapter.md +4 -6
  88. package/modules/weboramaRtdProvider.js +288 -73
  89. package/modules/weboramaRtdProvider.md +27 -10
  90. package/modules/yahoosspBidAdapter.js +5 -1
  91. package/modules/yahoosspBidAdapter.md +1 -1
  92. package/modules/yieldlabBidAdapter.js +41 -10
  93. package/modules/yieldlabBidAdapter.md +91 -48
  94. package/modules/yieldoneBidAdapter.js +115 -11
  95. package/modules/zetaSspBidAdapter.md +33 -1
  96. package/modules/zeta_global_sspBidAdapter.js +22 -1
  97. package/package.json +6 -1
  98. package/plugins/pbjsGlobals.js +28 -1
  99. package/src/adapterManager.js +14 -8
  100. package/src/auction.js +3 -2
  101. package/src/prebid.js +1 -2
  102. package/src/targeting.js +24 -3
  103. package/src/utils.js +41 -7
  104. package/test/spec/integration/faker/googletag.js +6 -0
  105. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  106. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  107. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  108. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  109. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  110. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  111. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  112. package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
  113. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  114. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  115. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  116. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  117. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  118. package/test/spec/modules/dchain_spec.js +329 -0
  119. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  120. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  121. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  122. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  123. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  124. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  125. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  126. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  127. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  128. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  129. package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
  130. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  131. package/test/spec/modules/ixBidAdapter_spec.js +285 -2
  132. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  133. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  134. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  135. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  136. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  137. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  138. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  139. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  140. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +18 -0
  141. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  142. package/test/spec/modules/openxBidAdapter_spec.js +5 -0
  143. package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
  144. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  145. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  146. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  147. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  148. package/test/spec/modules/rubiconBidAdapter_spec.js +17 -0
  149. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  150. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  151. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  152. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  153. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  154. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  155. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  156. package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
  157. package/test/spec/modules/userId_spec.js +51 -0
  158. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  159. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  160. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  161. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  162. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  163. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  164. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  165. package/test/spec/unit/core/adapterManager_spec.js +24 -6
  166. package/test/spec/unit/core/targeting_spec.js +116 -0
  167. package/test/spec/utils_spec.js +38 -0
  168. 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
- var adUnits = [
16
- {
17
- code: "banner",
18
- sizes: [[728, 90]],
19
- bids: [{
20
- bidder: "yieldlab",
21
- params: {
22
- adslotId: "5220336",
23
- supplyId: "1381604",
24
- targeting: {
25
- key1: "value1",
26
- key2: "value2"
27
- },
28
- extId: "abc",
29
- iabContent: {
30
- id: "some_id",
31
- episode: "1",
32
- title: "some title",
33
- series: "some series",
34
- season: "s1",
35
- artist: "John Doe",
36
- genre: "some genre",
37
- isrc: "CC-XXX-YY-NNNNN",
38
- url: "http://foo_url.de",
39
- cat: ["IAB1-1", "IAB1-2", "IAB2-10"],
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 { deepAccess, isEmpty, parseSizesInput, isStr, logWarn } from '../src/utils.js';
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 videoMediaType = deepAccess(bidRequest, 'mediaTypes.video');
44
- if ((isEmpty(bidRequest.mediaType) && isEmpty(bidRequest.mediaTypes)) ||
45
- (bidRequest.mediaType === BANNER || (bidRequest.mediaTypes && bidRequest.mediaTypes[BANNER]))) {
46
- const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes;
47
- payload.sz = parseSizesInput(sizes).join(',');
48
- } else if (bidRequest.mediaType === VIDEO || videoMediaType) {
49
- const sizes = deepAccess(bidRequest, 'mediaTypes.video.playerSize') || bidRequest.sizes;
50
- const size = parseSizesInput(sizes)[0];
51
- payload.w = size.split('x')[0];
52
- payload.h = size.split('x')[1];
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
- # Test Parameters
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 { logWarn, deepSetValue, deepAccess, isArray, isNumber, isBoolean, isStr } from '../src/utils.js';
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": "5.20.0",
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",
@@ -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$$': options.globalVarName || prebid.globalVarName,
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)) {
@@ -262,14 +262,16 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a
262
262
  }
263
263
 
264
264
  let adUnitsS2SCopy = getAdUnitCopyForPrebidServer(adUnits, s2sConfig);
265
- let tid = generateUUID();
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
- tid,
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.tid === uniqueServerBidRequests[i].tid) {
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 tid = uniqueServerBidRequests[counter].tid;
378
+ let uniquePbsTid = uniqueServerBidRequests[counter].uniquePbsTid;
374
379
  let adUnitsS2SCopy = uniqueServerBidRequests[counter].adUnitsS2SCopy;
375
380
 
376
- let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.tid === tid)
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
- events.emit(CONSTANTS.EVENTS.BID_REQUESTED, bidRequest);
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
- if (bidObject.bidderCode && (bidObject.cpm > 0 || bidObject.dealId)) {
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
- // modules list generated from build
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
- const allowedKeys = config.getConfig('targetingControls.allowTargetingKeys') || defaultKeys;
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