prebid.js 6.7.0 → 6.11.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 (160) hide show
  1. package/.eslintrc.js +8 -1
  2. package/integrationExamples/gpt/{haloRtdProvider_example.html → hadronRtdProvider_example.html} +9 -9
  3. package/integrationExamples/gpt/idImportLibrary_example.html +2 -2
  4. package/integrationExamples/gpt/userId_example.html +2 -2
  5. package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
  6. package/integrationExamples/gpt/x-domain/creative.html +63 -29
  7. package/modules/.submodules.json +3 -0
  8. package/modules/adagioBidAdapter.js +0 -8
  9. package/modules/adagioBidAdapter.md +1 -1
  10. package/modules/adkernelBidAdapter.js +2 -1
  11. package/modules/adnuntiusRtdProvider.js +96 -0
  12. package/modules/adnuntiusRtdProvider.md +41 -0
  13. package/modules/adotBidAdapter.js +516 -567
  14. package/modules/adotBidAdapter.md +6 -44
  15. package/modules/adpod.js +12 -14
  16. package/modules/adyoulikeBidAdapter.js +2 -0
  17. package/modules/appnexusBidAdapter.js +14 -2
  18. package/modules/asealBidAdapter.js +58 -0
  19. package/modules/asealBidAdapter.md +52 -0
  20. package/modules/brandmetricsRtdProvider.js +168 -0
  21. package/modules/brandmetricsRtdProvider.md +40 -0
  22. package/modules/conversantBidAdapter.js +7 -0
  23. package/modules/criteoBidAdapter.js +9 -0
  24. package/modules/currency.js +27 -5
  25. package/modules/displayioBidAdapter.js +157 -0
  26. package/modules/displayioBidAdapter.md +148 -0
  27. package/modules/dspxBidAdapter.js +69 -29
  28. package/modules/dspxBidAdapter.md +2 -1
  29. package/modules/e_volutionBidAdapter.js +158 -0
  30. package/modules/gridBidAdapter.js +15 -1
  31. package/modules/gumgumBidAdapter.js +52 -38
  32. package/modules/hadronIdSystem.js +96 -0
  33. package/modules/hadronIdSystem.md +35 -0
  34. package/modules/hadronRtdProvider.js +254 -0
  35. package/modules/hadronRtdProvider.md +126 -0
  36. package/modules/haloIdSystem.md +4 -35
  37. package/modules/haloRtdProvider.md +3 -126
  38. package/modules/imRtdProvider.js +10 -0
  39. package/modules/improvedigitalBidAdapter.js +5 -0
  40. package/modules/interactiveOffersBidAdapter.js +9 -6
  41. package/modules/iqzoneBidAdapter.js +10 -3
  42. package/modules/iqzoneBidAdapter.md +16 -0
  43. package/modules/ixBidAdapter.js +2 -6
  44. package/modules/kubientBidAdapter.js +50 -19
  45. package/modules/lunamediahbBidAdapter.js +32 -4
  46. package/modules/malltvBidAdapter.js +7 -3
  47. package/modules/malltvBidAdapter.md +64 -51
  48. package/modules/mass.js +3 -5
  49. package/modules/mediakeysBidAdapter.js +0 -5
  50. package/modules/medianetAnalyticsAdapter.js +1 -1
  51. package/modules/mediasquareBidAdapter.js +9 -1
  52. package/modules/nextMillenniumBidAdapter.js +1 -0
  53. package/modules/oguryBidAdapter.js +7 -14
  54. package/modules/prebidServerBidAdapter/index.js +61 -39
  55. package/modules/priceFloors.js +20 -12
  56. package/modules/pubmaticBidAdapter.js +1 -1
  57. package/modules/richaudienceBidAdapter.js +8 -3
  58. package/modules/riseBidAdapter.js +17 -6
  59. package/modules/rtbhouseBidAdapter.js +2 -0
  60. package/modules/rubiconAnalyticsAdapter.js +5 -0
  61. package/modules/rubiconBidAdapter.js +2 -2
  62. package/modules/sizeMappingV2.js +1 -8
  63. package/modules/sortableAnalyticsAdapter.js +5 -4
  64. package/modules/sovrnBidAdapter.js +93 -18
  65. package/modules/sovrnBidAdapter.md +80 -2
  66. package/modules/sspBCBidAdapter.js +53 -20
  67. package/modules/telariaBidAdapter.js +22 -29
  68. package/modules/trustpidSystem.js +197 -0
  69. package/modules/trustpidSystem.md +45 -0
  70. package/modules/undertoneBidAdapter.js +17 -1
  71. package/modules/userId/eids.js +16 -1
  72. package/modules/userId/eids.md +10 -2
  73. package/modules/userId/userId.md +17 -2
  74. package/modules/vibrantmediaBidAdapter.js +220 -0
  75. package/modules/vibrantmediaBidAdapter.md +92 -0
  76. package/modules/vidoomyBidAdapter.js +8 -0
  77. package/modules/vidoomyBidAdapter.md +4 -2
  78. package/modules/weboramaRtdProvider.js +264 -34
  79. package/modules/weboramaRtdProvider.md +110 -40
  80. package/modules/yahoosspBidAdapter.js +3 -1
  81. package/modules/yieldoneBidAdapter.js +6 -0
  82. package/package.json +2 -1
  83. package/src/adRendering.js +38 -0
  84. package/src/adapterManager.js +24 -19
  85. package/src/adapters/bidderFactory.js +14 -11
  86. package/src/adloader.js +2 -1
  87. package/src/auction.js +138 -115
  88. package/src/auctionIndex.js +85 -0
  89. package/src/auctionManager.js +3 -0
  90. package/src/bidderSettings.js +69 -0
  91. package/src/bidfactory.js +18 -6
  92. package/src/native.js +29 -21
  93. package/src/prebid.js +3 -19
  94. package/src/secureCreatives.js +128 -45
  95. package/src/targeting.js +11 -2
  96. package/src/utils.js +14 -17
  97. package/src/video.js +10 -11
  98. package/src/videoCache.js +10 -9
  99. package/test/fixtures/fixtures.js +2 -1
  100. package/test/helpers/indexStub.js +28 -0
  101. package/test/helpers/syncPromise.js +71 -0
  102. package/test/spec/auctionmanager_spec.js +268 -89
  103. package/test/spec/config_spec.js +24 -1
  104. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  105. package/test/spec/modules/adnuntiusRtdProvider_spec.js +145 -0
  106. package/test/spec/modules/adotBidAdapter_spec.js +294 -3124
  107. package/test/spec/modules/adpod_spec.js +91 -156
  108. package/test/spec/modules/adyoulikeBidAdapter_spec.js +4 -0
  109. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  110. package/test/spec/modules/asealBidAdapter_spec.js +144 -0
  111. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  112. package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
  113. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  114. package/test/spec/modules/currency_spec.js +36 -15
  115. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  116. package/test/spec/modules/dspxBidAdapter_spec.js +20 -15
  117. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  118. package/test/spec/modules/eids_spec.js +2 -2
  119. package/test/spec/modules/gridBidAdapter_spec.js +18 -0
  120. package/test/spec/modules/gumgumBidAdapter_spec.js +49 -3
  121. package/test/spec/modules/hadronIdSystem_spec.js +57 -0
  122. package/test/spec/modules/hadronRtdProvider_spec.js +762 -0
  123. package/test/spec/modules/imRtdProvider_spec.js +30 -1
  124. package/test/spec/modules/improvedigitalBidAdapter_spec.js +19 -0
  125. package/test/spec/modules/iqzoneBidAdapter_spec.js +1 -0
  126. package/test/spec/modules/ixBidAdapter_spec.js +1 -1
  127. package/test/spec/modules/kubientBidAdapter_spec.js +182 -84
  128. package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
  129. package/test/spec/modules/mass_spec.js +2 -14
  130. package/test/spec/modules/mediakeysBidAdapter_spec.js +9 -5
  131. package/test/spec/modules/mediasquareBidAdapter_spec.js +25 -1
  132. package/test/spec/modules/oguryBidAdapter_spec.js +63 -5
  133. package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -6
  134. package/test/spec/modules/priceFloors_spec.js +83 -24
  135. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  136. package/test/spec/modules/riseBidAdapter_spec.js +30 -4
  137. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +31 -1
  138. package/test/spec/modules/rubiconBidAdapter_spec.js +1 -1
  139. package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
  140. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  141. package/test/spec/modules/sspBCBidAdapter_spec.js +7 -7
  142. package/test/spec/modules/telariaBidAdapter_spec.js +1 -3
  143. package/test/spec/modules/trustpidSystem_spec.js +232 -0
  144. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  145. package/test/spec/modules/userId_spec.js +39 -39
  146. package/test/spec/modules/vibrantmediaBidAdapter_spec.js +1237 -0
  147. package/test/spec/modules/vidoomyBidAdapter_spec.js +7 -1
  148. package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
  149. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  150. package/test/spec/modules/yieldoneBidAdapter_spec.js +33 -0
  151. package/test/spec/native_spec.js +62 -40
  152. package/test/spec/unit/core/adapterManager_spec.js +22 -0
  153. package/test/spec/unit/core/auctionIndex_spec.js +129 -0
  154. package/test/spec/unit/core/bidderFactory_spec.js +65 -12
  155. package/test/spec/unit/core/bidderSettings_spec.js +123 -0
  156. package/test/spec/unit/core/targeting_spec.js +93 -0
  157. package/test/spec/unit/pbjs_api_spec.js +80 -42
  158. package/test/spec/unit/secureCreatives_spec.js +143 -24
  159. package/test/spec/videoCache_spec.js +18 -19
  160. package/test/spec/video_spec.js +51 -61
@@ -5,7 +5,6 @@
5
5
  */
6
6
 
7
7
  import { isArray, logError, isArrayOfNums, deepClone, logWarn, getWindowTop, deepEqual, logInfo, isValidMediaTypes, deepAccess, getDefinedParams, getUniqueIdentifierStr, flatten } from '../src/utils.js';
8
- import { processNativeAdUnitParams } from '../src/native.js';
9
8
  import { adunitCounter } from '../src/adUnits.js';
10
9
  import includes from 'core-js-pure/features/array/includes.js';
11
10
  import { getHook } from '../src/hook.js';
@@ -536,14 +535,8 @@ export function getBids({ bidderCode, auctionId, bidderRequestId, adUnits, label
536
535
  .reduce((bids, bid) => {
537
536
  if (internal.isLabelActivated(bid, labels, adUnit.code, adUnitInstance)) {
538
537
  // handle native params
539
- const nativeParams = adUnit.nativeParams || deepAccess(adUnit, 'mediaTypes.native');
540
- if (nativeParams) {
541
- bid = Object.assign({}, bid, {
542
- nativeParams: processNativeAdUnitParams(nativeParams)
543
- });
544
- }
545
538
 
546
- bid = Object.assign({}, bid, getDefinedParams(adUnit, ['mediaType', 'renderer']));
539
+ bid = Object.assign({}, bid, getDefinedParams(adUnit, ['mediaType', 'renderer', 'nativeParams']));
547
540
 
548
541
  if (bid.sizeConfig) {
549
542
  const relevantMediaTypes = internal.getRelevantMediaTypesForBidder(bid.sizeConfig, activeViewport);
@@ -5,6 +5,7 @@ import adapterManager from '../src/adapterManager.js';
5
5
  import {ajax} from '../src/ajax.js';
6
6
  import {getGlobal} from '../src/prebidGlobal.js';
7
7
  import { config } from '../src/config.js';
8
+ import {bidderSettings} from '../src/bidderSettings.js';
8
9
 
9
10
  const DEFAULT_PROTOCOL = 'https';
10
11
  const DEFAULT_HOST = 'pa.deployads.com';
@@ -182,11 +183,11 @@ function getFactor(bidder) {
182
183
  }
183
184
 
184
185
  function getBiddersFactors() {
185
- const pb = getGlobal();
186
186
  const result = {};
187
- if (pb && pb.bidderSettings) {
188
- Object.keys(pb.bidderSettings).forEach(bidderKey => {
189
- const bidder = pb.bidderSettings[bidderKey];
187
+ const settings = bidderSettings.getSettings();
188
+ if (settings) {
189
+ Object.keys(settings).forEach(bidderKey => {
190
+ const bidder = settings[bidderKey];
190
191
  const factor = getFactor(bidder);
191
192
  if (factor !== null) {
192
193
  result[bidderKey] = factor;
@@ -1,12 +1,38 @@
1
- import { _each, getBidIdParameter, isArray, deepClone, parseUrl, getUniqueIdentifierStr, deepSetValue, logError, deepAccess } from '../src/utils.js';
1
+ import { _each, getBidIdParameter, isArray, deepClone, parseUrl, getUniqueIdentifierStr, deepSetValue, logError, deepAccess, isInteger, logWarn } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js'
3
- import { BANNER } from '../src/mediaTypes.js'
3
+ import { ADPOD, BANNER, VIDEO } from '../src/mediaTypes.js'
4
4
  import { createEidsArray } from './userId/eids.js';
5
5
  import {config} from '../src/config.js';
6
6
 
7
+ const ORTB_VIDEO_PARAMS = {
8
+ 'mimes': (value) => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'),
9
+ 'minduration': (value) => isInteger(value),
10
+ 'maxduration': (value) => isInteger(value),
11
+ 'protocols': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 10),
12
+ 'w': (value) => isInteger(value),
13
+ 'h': (value) => isInteger(value),
14
+ 'startdelay': (value) => isInteger(value),
15
+ 'placement': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 5),
16
+ 'linearity': (value) => [1, 2].indexOf(value) !== -1,
17
+ 'skip': (value) => [0, 1].indexOf(value) !== -1,
18
+ 'skipmin': (value) => isInteger(value),
19
+ 'skipafter': (value) => isInteger(value),
20
+ 'sequence': (value) => isInteger(value),
21
+ 'battr': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 17),
22
+ 'maxextended': (value) => isInteger(value),
23
+ 'minbitrate': (value) => isInteger(value),
24
+ 'maxbitrate': (value) => isInteger(value),
25
+ 'boxingallowed': (value) => [0, 1].indexOf(value) !== -1,
26
+ 'playbackmethod': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 6),
27
+ 'playbackend': (value) => [1, 2, 3].indexOf(value) !== -1,
28
+ 'delivery': (value) => [1, 2, 3].indexOf(value) !== -1,
29
+ 'pos': (value) => Array.isArray(value) && value.every(v => v >= 0 && v <= 7),
30
+ 'api': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 6)
31
+ }
32
+
7
33
  export const spec = {
8
34
  code: 'sovrn',
9
- supportedMediaTypes: [BANNER],
35
+ supportedMediaTypes: [BANNER, VIDEO],
10
36
  gvlid: 13,
11
37
 
12
38
  /**
@@ -15,7 +41,12 @@ export const spec = {
15
41
  * @return boolean for whether or not a bid is valid
16
42
  */
17
43
  isBidRequestValid: function(bid) {
18
- return !!(bid.params.tagid && !isNaN(parseFloat(bid.params.tagid)) && isFinite(bid.params.tagid))
44
+ return !!(
45
+ bid.params.tagid &&
46
+ !isNaN(parseFloat(bid.params.tagid)) &&
47
+ isFinite(bid.params.tagid) &&
48
+ deepAccess(bid, 'mediaTypes.video.context') !== ADPOD
49
+ )
19
50
  },
20
51
 
21
52
  /**
@@ -50,13 +81,9 @@ export const spec = {
50
81
  }
51
82
  iv = iv || getBidIdParameter('iv', bid.params)
52
83
 
53
- let bidSizes = (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) || bid.sizes
54
- bidSizes = ((isArray(bidSizes) && isArray(bidSizes[0])) ? bidSizes : [bidSizes])
55
- bidSizes = bidSizes.filter(size => isArray(size))
56
- const processedSizes = bidSizes.map(size => ({w: parseInt(size[0], 10), h: parseInt(size[1], 10)}))
57
84
  const floorInfo = (bid.getFloor && typeof bid.getFloor === 'function') ? bid.getFloor({
58
85
  currency: 'USD',
59
- mediaType: 'banner',
86
+ mediaType: bid.mediaTypes && bid.mediaTypes.banner ? 'banner' : 'video',
60
87
  size: '*'
61
88
  }) : {}
62
89
  floorInfo.floor = floorInfo.floor || getBidIdParameter('bidfloor', bid.params)
@@ -64,13 +91,24 @@ export const spec = {
64
91
  const imp = {
65
92
  adunitcode: bid.adUnitCode,
66
93
  id: bid.bidId,
67
- banner: {
94
+ tagid: String(getBidIdParameter('tagid', bid.params)),
95
+ bidfloor: floorInfo.floor
96
+ }
97
+
98
+ if (deepAccess(bid, 'mediaTypes.banner')) {
99
+ let bidSizes = deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes
100
+ bidSizes = (isArray(bidSizes) && isArray(bidSizes[0])) ? bidSizes : [bidSizes]
101
+ bidSizes = bidSizes.filter(size => isArray(size))
102
+ const processedSizes = bidSizes.map(size => ({w: parseInt(size[0], 10), h: parseInt(size[1], 10)}))
103
+
104
+ imp.banner = {
68
105
  format: processedSizes,
69
106
  w: 1,
70
107
  h: 1,
71
- },
72
- tagid: String(getBidIdParameter('tagid', bid.params)),
73
- bidfloor: floorInfo.floor
108
+ };
109
+ }
110
+ if (deepAccess(bid, 'mediaTypes.video')) {
111
+ imp.video = _buildVideoRequestObj(bid);
74
112
  }
75
113
 
76
114
  imp.ext = getBidIdParameter('ext', bid.ortb2Imp) || undefined
@@ -149,7 +187,7 @@ export const spec = {
149
187
  seatbid[0].bid &&
150
188
  seatbid[0].bid.length > 0) {
151
189
  seatbid[0].bid.map(sovrnBid => {
152
- sovrnBidResponses.push({
190
+ const bid = {
153
191
  requestId: sovrnBid.impid,
154
192
  cpm: parseFloat(sovrnBid.price),
155
193
  width: parseInt(sovrnBid.w),
@@ -158,11 +196,18 @@ export const spec = {
158
196
  dealId: sovrnBid.dealid || null,
159
197
  currency: 'USD',
160
198
  netRevenue: true,
161
- mediaType: BANNER,
162
- ad: decodeURIComponent(`${sovrnBid.adm}<img src="${sovrnBid.nurl}">`),
163
199
  ttl: sovrnBid.ext ? (sovrnBid.ext.ttl || 90) : 90,
164
200
  meta: { advertiserDomains: sovrnBid && sovrnBid.adomain ? sovrnBid.adomain : [] }
165
- });
201
+ }
202
+
203
+ if (!sovrnBid.nurl) {
204
+ bid.mediaType = VIDEO
205
+ bid.vastXml = decodeURIComponent(sovrnBid.adm)
206
+ } else {
207
+ bid.mediaType = BANNER
208
+ bid.ad = decodeURIComponent(`${sovrnBid.adm}<img src="${sovrnBid.nurl}">`)
209
+ }
210
+ sovrnBidResponses.push(bid);
166
211
  });
167
212
  }
168
213
  return sovrnBidResponses
@@ -209,4 +254,34 @@ export const spec = {
209
254
  },
210
255
  }
211
256
 
212
- registerBidder(spec);
257
+ function _buildVideoRequestObj(bid) {
258
+ const videoObj = {}
259
+ const videoAdUnitParams = deepAccess(bid, 'mediaTypes.video', {})
260
+ const videoBidderParams = deepAccess(bid, 'params.video', {})
261
+ const computedParams = {}
262
+
263
+ if (Array.isArray(videoAdUnitParams.playerSize)) {
264
+ const sizes = (Array.isArray(videoAdUnitParams.playerSize[0])) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize
265
+ computedParams.w = sizes[0]
266
+ computedParams.h = sizes[1]
267
+ }
268
+
269
+ const videoParams = {
270
+ ...computedParams,
271
+ ...videoAdUnitParams,
272
+ ...videoBidderParams
273
+ };
274
+
275
+ Object.keys(ORTB_VIDEO_PARAMS).forEach(paramName => {
276
+ if (videoParams.hasOwnProperty(paramName)) {
277
+ if (ORTB_VIDEO_PARAMS[paramName](videoParams[paramName])) {
278
+ videoObj[paramName] = videoParams[paramName]
279
+ } else {
280
+ logWarn(`The OpenRTB video param ${paramName} has been skipped due to misformating. Please refer to OpenRTB 2.5 spec.`);
281
+ }
282
+ }
283
+ })
284
+ return videoObj
285
+ }
286
+
287
+ registerBidder(spec)
@@ -10,9 +10,9 @@ Maintainer: jrosendahl@sovrn.com
10
10
 
11
11
  Sovrn's adapter integration to the Prebid library. Posts plain-text JSON to the /rtb/bid endpoint.
12
12
 
13
- # Test Parameters
13
+ # Banner Test Parameters
14
14
 
15
- ```
15
+ ```js
16
16
  var adUnits = [
17
17
  {
18
18
  code: 'test-leaderboard',
@@ -45,3 +45,81 @@ var adUnits = [
45
45
  }
46
46
  ]
47
47
  ```
48
+
49
+ # Video Test Parameters
50
+ ### Instream
51
+ ```js
52
+ var videoAdUnit = {
53
+ code: 'video1',
54
+ sizes: [640, 480],
55
+ mediaTypes: {
56
+ video: {
57
+ context: 'instream',
58
+ playerSize: [640, 480],
59
+ mimes: ['video/mp4'],
60
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
61
+ playbackmethod: [2],
62
+ skip: 1,
63
+ },
64
+ },
65
+ bids: [
66
+ {
67
+ bidder: 'sovrn',
68
+ // Prebid Server Bidder Params https://docs.prebid.org/dev-docs/pbs-bidders.html#sovrn
69
+ params: {
70
+ tagid: '315045',
71
+ bidfloor: '0.04',
72
+ },
73
+ },
74
+ ],
75
+ }
76
+ ```
77
+ ### Outstream
78
+ ```js
79
+ var adUnits = [
80
+ {
81
+ code: videoId,
82
+ mediaTypes: {
83
+ video: {
84
+ context: 'outstream',
85
+ playerSize: [640, 360],
86
+ mimes: ['video/mp4'],
87
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
88
+ playbackmethod: [2],
89
+ skip: 1,
90
+ },
91
+ },
92
+ bids: [
93
+ {
94
+ bidder: 'sovrn',
95
+ // Prebid Server Bidder Params https://docs.prebid.org/dev-docs/pbs-bidders.html#sovrn
96
+ params: {
97
+ tagid: '315045',
98
+ bidfloor: '0.04',
99
+ },
100
+ },
101
+ ],
102
+ renderer: {
103
+ url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js',
104
+ render: function (bid) {
105
+ adResponse = {
106
+ ad: {
107
+ video: {
108
+ content: bid.vastXml,
109
+ player_height: bid.height,
110
+ player_width: bid.width,
111
+ },
112
+ },
113
+ }
114
+ // push to render queue because ANOutstreamVideo may not be loaded yet.
115
+ bid.renderer.push(() => {
116
+ ANOutstreamVideo.renderAd({
117
+ targetId: bid.adUnitCode,
118
+ adResponse: adResponse,
119
+ })
120
+ })
121
+ },
122
+ },
123
+ },
124
+ ]
125
+ ```
@@ -8,8 +8,10 @@ const BIDDER_CODE = 'sspBC';
8
8
  const BIDDER_URL = 'https://ssp.wp.pl/bidder/';
9
9
  const SYNC_URL = 'https://ssp.wp.pl/bidder/usersync';
10
10
  const NOTIFY_URL = 'https://ssp.wp.pl/bidder/notify';
11
+ const TRACKER_URL = 'https://bdr.wpcdn.pl/tag/jstracker.js';
12
+ const GVLID = 676;
11
13
  const TMAX = 450;
12
- const BIDDER_VERSION = '5.3';
14
+ const BIDDER_VERSION = '5.41';
13
15
  const W = window;
14
16
  const { navigator } = W;
15
17
  const oneCodeDetection = {};
@@ -29,8 +31,8 @@ const getNotificationPayload = bidData => {
29
31
  const result = {
30
32
  requestId: undefined,
31
33
  siteId: [],
32
- adUnit: [],
33
34
  slotId: [],
35
+ tagid: [],
34
36
  }
35
37
  bids.forEach(bid => {
36
38
  let params = isArray(bid.params) ? bid.params[0] : bid.params;
@@ -55,7 +57,7 @@ const getNotificationPayload = bidData => {
55
57
  result.adomain = meta.advertiserDomains && meta.advertiserDomains[0];
56
58
  result.networkName = meta.networkName;
57
59
  }
58
- result.adUnit.push(bid.adUnitCode)
60
+ result.tagid.push(bid.adUnitCode);
59
61
  result.requestId = bid.auctionId || result.requestId;
60
62
  result.timeout = bid.timeout || result.timeout;
61
63
  })
@@ -123,7 +125,16 @@ const applyClientHints = ortbRequest => {
123
125
  ]
124
126
  }];
125
127
 
126
- ortbRequest.user = Object.assign(ortbRequest.user, { data });
128
+ const ch = { data };
129
+ ortbRequest.user = { ...ortbRequest.user, ...ch };
130
+ };
131
+
132
+ const applyUserIds = (validBidRequest, ortbRequest) => {
133
+ const eids = validBidRequest.userIdAsEids
134
+ if (eids && eids.length) {
135
+ const ids = { eids };
136
+ ortbRequest.user = { ...ortbRequest.user, ...ids };
137
+ }
127
138
  };
128
139
 
129
140
  /**
@@ -135,8 +146,8 @@ const applyGdpr = (bidderRequest, ortbRequest) => {
135
146
  if (gdprConsent) {
136
147
  const { apiVersion, gdprApplies, consentString } = gdprConsent;
137
148
  consentApiVersion = apiVersion;
138
- ortbRequest.regs = Object.assign(ortbRequest.regs, { '[ortb_extensions.gdpr]': gdprApplies ? 1 : 0 });
139
- ortbRequest.user = Object.assign(ortbRequest.user, { '[ortb_extensions.consent]': consentString });
149
+ ortbRequest.regs = Object.assign(ortbRequest.regs, { 'gdpr': gdprApplies ? 1 : 0 });
150
+ ortbRequest.user = Object.assign(ortbRequest.user, { 'consent': consentString });
140
151
  }
141
152
  }
142
153
 
@@ -299,7 +310,7 @@ const mapImpression = slot => {
299
310
  ext.data = Object.assign({ pbsize: adUnitsCalled[adUnitCode] }, ext.data);
300
311
 
301
312
  const imp = {
302
- id: id && siteId ? id : 'bidid-' + bidId,
313
+ id: id && siteId ? id.padStart(3, '0') : 'bidid-' + bidId,
303
314
  banner: mapBanner(slot),
304
315
  native: mapNative(slot),
305
316
  video: mapVideo(slot),
@@ -342,7 +353,7 @@ const isVideoAd = bid => {
342
353
  const isNativeAd = bid => {
343
354
  const xmlTester = new RegExp(/^{['"]native['"]/);
344
355
 
345
- return bid.adm && bid.adm.match(xmlTester);
356
+ return bid.admNative || (bid.adm && bid.adm.match(xmlTester));
346
357
  }
347
358
 
348
359
  const parseNative = nativeData => {
@@ -450,12 +461,10 @@ const renderCreative = (site, auctionId, bid, seat, request) => {
450
461
  window.gdpr = ${JSON.stringify(request.gdprConsent)};
451
462
  window.page = "${site.page}";
452
463
  window.ref = "${site.ref}";
464
+ window.adlabel = "${site.adLabel ? site.adLabel : ''}";
465
+ window.pubid = "${site.publisherId ? site.publisherId : ''}";
453
466
  `;
454
467
 
455
- if (gam) {
456
- adcode += `window.gam = ${JSON.stringify(gam)};`;
457
- }
458
-
459
468
  adcode += `</script>
460
469
  </head>
461
470
  <body>
@@ -469,6 +478,7 @@ const renderCreative = (site, auctionId, bid, seat, request) => {
469
478
 
470
479
  const spec = {
471
480
  code: BIDDER_CODE,
481
+ gvlid: GVLID,
472
482
  aliases: [],
473
483
  supportedMediaTypes: [BANNER, NATIVE, VIDEO],
474
484
  isBidRequestValid(bid) {
@@ -513,6 +523,7 @@ const spec = {
513
523
 
514
524
  applyGdpr(bidderRequest, payload);
515
525
  applyClientHints(payload);
526
+ applyUserIds(validBidRequests[0], payload);
516
527
 
517
528
  return {
518
529
  method: 'POST',
@@ -558,10 +569,14 @@ const spec = {
558
569
  /*
559
570
  bid response might include ext object containing siteId / slotId, as detected by OneCode
560
571
  update site / slot data in this case
572
+
573
+ ext also might contain publisherId and custom ad label
561
574
  */
562
- const { siteid, slotid } = ext;
575
+ const { siteid, slotid, pubid, adlabel } = ext;
563
576
  site.id = siteid || site.id;
564
577
  site.slot = slotid || site.slot;
578
+ site.publisherId = pubid;
579
+ site.adLabel = adlabel;
565
580
  }
566
581
 
567
582
  if (bidRequest && site.id && !strIncludes(site.id, 'bidid')) {
@@ -598,10 +613,28 @@ const spec = {
598
613
  bid.mediaType = 'native';
599
614
  // check native object
600
615
  try {
601
- const nativeData = JSON.parse(serverBid.adm).native;
616
+ const nativeData = serverBid.admNative || JSON.parse(serverBid.adm).native;
602
617
  bid.native = parseNative(nativeData);
603
618
  bid.width = 1;
604
619
  bid.height = 1;
620
+
621
+ // append viewability tracker
622
+ const jsData = {
623
+ rid: bidRequest.auctionId,
624
+ crid: bid.creativeId,
625
+ adunit: bidRequest.adUnitCode,
626
+ url: bid.native.clickUrl,
627
+ vendor: seat,
628
+ site: site.id,
629
+ slot: site.slot,
630
+ cpm: bid.cpm.toPrecision(4),
631
+ }
632
+ const jsTracker = '<script type="text/javascript" async="true" src="' + TRACKER_URL + '" ' + Object.keys(jsData).reduce((acc, current) => { return acc + ` data-wpar-${current}="${jsData[current]}"` }, '') + '><\/script>';
633
+ if (bid.native.javascriptTrackers) {
634
+ bid.native.javascriptTrackers.push(jsTracker);
635
+ } else {
636
+ bid.native.javascriptTrackers = [jsTracker];
637
+ }
605
638
  } catch (err) {
606
639
  logWarn('Could not parse native data', serverBid.adm);
607
640
  bid.cpm = 0;
@@ -624,15 +657,15 @@ const spec = {
624
657
 
625
658
  return bids;
626
659
  },
627
- getUserSyncs(syncOptions) {
660
+ getUserSyncs(syncOptions, serverResponses, gdprConsent) {
661
+ let mySyncs = [];
628
662
  if (syncOptions.iframeEnabled && consentApiVersion != 1) {
629
- return [{
663
+ mySyncs.push({
630
664
  type: 'iframe',
631
665
  url: `${SYNC_URL}?tcf=${consentApiVersion}`,
632
- }];
633
- } else {
634
- logWarn('sspBC adapter requires iframe based user sync.');
635
- }
666
+ });
667
+ };
668
+ return mySyncs;
636
669
  },
637
670
 
638
671
  onTimeout(timeoutData) {
@@ -1,8 +1,6 @@
1
1
  import { logError, isEmpty, deepAccess, triggerPixel, logWarn, isArray } from '../src/utils.js';
2
- import {createBid as createBidFactory} from '../src/bidfactory.js';
3
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
3
  import {VIDEO} from '../src/mediaTypes.js';
5
- import CONSTANTS from '../src/constants.json';
6
4
 
7
5
  const BIDDER_CODE = 'telaria';
8
6
  const DOMAIN = 'tremorhub.com';
@@ -86,7 +84,9 @@ export const spec = {
86
84
  logError(errorMessage);
87
85
  } else if (!isEmpty(bidResult.seatbid)) {
88
86
  bidResult.seatbid[0].bid.forEach(tag => {
89
- bids.push(createBid(CONSTANTS.STATUS.GOOD, bidderRequest, tag, width, height, BIDDER_CODE));
87
+ if (tag) {
88
+ bids.push(createBid(bidderRequest, tag, width, height));
89
+ }
90
90
  });
91
91
  }
92
92
 
@@ -253,38 +253,31 @@ function generateUrl(bid, bidderRequest) {
253
253
  }
254
254
 
255
255
  /**
256
- * Create and return a bid object based on status and tag
257
- * @param status
256
+ * Create and return a bid response
258
257
  * @param reqBid
259
258
  * @param response
260
259
  * @param width
261
260
  * @param height
262
- * @param bidderCode
263
261
  */
264
- function createBid(status, reqBid, response, width, height, bidderCode) {
265
- let bid = createBidFactory(status, reqBid);
266
-
262
+ function createBid(reqBid, response, width, height) {
267
263
  // TTL 5 mins by default, future support for extended imp wait time
268
- if (response) {
269
- Object.assign(bid, {
270
- requestId: reqBid.bidId,
271
- cpm: response.price,
272
- creativeId: response.crid || '-1',
273
- vastXml: response.adm,
274
- vastUrl: reqBid.vastUrl,
275
- mediaType: 'video',
276
- width: width,
277
- height: height,
278
- bidderCode: bidderCode,
279
- currency: 'USD',
280
- netRevenue: true,
281
- ttl: 300,
282
- ad: response.adm
283
- });
284
- }
285
-
286
- bid.meta = bid.meta || {};
287
- if (response && response.adomain && response.adomain.length > 0) {
264
+ const bid = {
265
+ requestId: reqBid.bidId,
266
+ cpm: response.price,
267
+ creativeId: response.crid || '-1',
268
+ vastXml: response.adm,
269
+ vastUrl: reqBid.vastUrl,
270
+ mediaType: 'video',
271
+ width: width,
272
+ height: height,
273
+ currency: 'USD',
274
+ netRevenue: true,
275
+ ttl: 300,
276
+ ad: response.adm,
277
+ meta: {}
278
+ };
279
+
280
+ if (response.adomain && response.adomain.length > 0) {
288
281
  bid.meta.advertiserDomains = response.adomain;
289
282
  }
290
283