prebid.js 7.18.0 → 7.20.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 (313) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adfBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.js +1 -1
  9. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  10. package/dist/adkernelBidAdapter.js +1 -1
  11. package/dist/adlooxAdServerVideo.js +1 -1
  12. package/dist/adlooxAnalyticsAdapter.js +1 -1
  13. package/dist/adlooxRtdProvider.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adqueryIdSystem.js +1 -1
  16. package/dist/adrelevantisBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -1
  18. package/dist/adxcgAnalyticsAdapter.js +1 -1
  19. package/dist/adxcgBidAdapter.js +1 -1
  20. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aolBidAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +1 -1
  31. package/dist/bidViewability.js +1 -1
  32. package/dist/bidglassBidAdapter.js +1 -1
  33. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/byDataAnalyticsAdapter.js +1 -1
  38. package/dist/carodaBidAdapter.js +1 -1
  39. package/dist/categoryTranslation.js +1 -1
  40. package/dist/cleanioRtdProvider.js +1 -1
  41. package/dist/colossussspBidAdapter.js +1 -1
  42. package/dist/concertAnalyticsAdapter.js +1 -1
  43. package/dist/concertBidAdapter.js +1 -1
  44. package/dist/connectIdSystem.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -0
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/currency.js +1 -1
  54. package/dist/datablocksAnalyticsAdapter.js +1 -1
  55. package/dist/dchain.js +1 -1
  56. package/dist/debugging-standalone.js +1 -1
  57. package/dist/debugging.js +1 -1
  58. package/dist/dependencies.json +9 -0
  59. package/dist/dfpAdServerVideo.js +1 -1
  60. package/dist/dgkeywordRtdProvider.js +1 -1
  61. package/dist/dianomiBidAdapter.js +1 -1
  62. package/dist/dspxBidAdapter.js +1 -1
  63. package/dist/enrichmentFpdModule.js +1 -1
  64. package/dist/eplanningAnalyticsAdapter.js +1 -1
  65. package/dist/eplanningBidAdapter.js +1 -1
  66. package/dist/finativeBidAdapter.js +1 -1
  67. package/dist/fintezaAnalyticsAdapter.js +1 -1
  68. package/dist/fpd.js +1 -0
  69. package/dist/ftrackIdSystem.js +1 -1
  70. package/dist/gdprEnforcement.js +1 -1
  71. package/dist/glimpseBidAdapter.js +1 -1
  72. package/dist/gmosspBidAdapter.js +1 -1
  73. package/dist/goldbachBidAdapter.js +1 -1
  74. package/dist/googleAnalyticsAdapter.js +1 -1
  75. package/dist/gridBidAdapter.js +1 -1
  76. package/dist/gridNMBidAdapter.js +1 -1
  77. package/dist/gumgumBidAdapter.js +1 -1
  78. package/dist/h12mediaBidAdapter.js +1 -1
  79. package/dist/hadronAnalyticsAdapter.js +1 -1
  80. package/dist/id5AnalyticsAdapter.js +1 -1
  81. package/dist/id5IdSystem.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/kargoAnalyticsAdapter.js +1 -1
  89. package/dist/kinessoIdSystem.js +1 -1
  90. package/dist/konduitAnalyticsAdapter.js +1 -1
  91. package/dist/kueezBidAdapter.js +1 -1
  92. package/dist/lassoBidAdapter.js +1 -1
  93. package/dist/lifestreetBidAdapter.js +1 -1
  94. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  95. package/dist/liveIntentIdSystem.js +1 -1
  96. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  97. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  98. package/dist/logicadBidAdapter.js +1 -1
  99. package/dist/loglyliftBidAdapter.js +1 -1
  100. package/dist/lotamePanoramaIdSystem.js +1 -1
  101. package/dist/magniteAnalyticsAdapter.js +1 -0
  102. package/dist/malltvAnalyticsAdapter.js +1 -1
  103. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  104. package/dist/marsmediaBidAdapter.js +1 -1
  105. package/dist/mass.js +1 -1
  106. package/dist/mediafuseBidAdapter.js +1 -1
  107. package/dist/mediakeysBidAdapter.js +1 -1
  108. package/dist/medianetAnalyticsAdapter.js +1 -1
  109. package/dist/mediasquareBidAdapter.js +1 -1
  110. package/dist/mgidBidAdapter.js +1 -1
  111. package/dist/minutemediaBidAdapter.js +1 -1
  112. package/dist/multibid.js +1 -1
  113. package/dist/nativoBidAdapter.js +1 -1
  114. package/dist/not-for-prod/prebid.js +198 -194
  115. package/dist/oguryBidAdapter.js +1 -1
  116. package/dist/onetagBidAdapter.js +1 -1
  117. package/dist/ooloAnalyticsAdapter.js +1 -1
  118. package/dist/openxAnalyticsAdapter.js +1 -1
  119. package/dist/optimonAnalyticsAdapter.js +1 -1
  120. package/dist/outbrainBidAdapter.js +1 -1
  121. package/dist/parrableIdSystem.js +1 -1
  122. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  123. package/dist/pixfutureBidAdapter.js +1 -1
  124. package/dist/prebid-core.js +2 -2
  125. package/dist/prebidServerBidAdapter.js +1 -1
  126. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  127. package/dist/priceFloors.js +1 -1
  128. package/dist/publinkIdSystem.js +1 -1
  129. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  130. package/dist/pubmaticBidAdapter.js +1 -1
  131. package/dist/pubperfAnalyticsAdapter.js +1 -1
  132. package/dist/pubstackAnalyticsAdapter.js +1 -1
  133. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  134. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  135. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  136. package/dist/pxyzBidAdapter.js +1 -1
  137. package/dist/quantcastBidAdapter.js +1 -1
  138. package/dist/quantcastIdSystem.js +1 -1
  139. package/dist/readpeakBidAdapter.js +1 -1
  140. package/dist/realvuAnalyticsAdapter.js +1 -1
  141. package/dist/relaidoBidAdapter.js +1 -1
  142. package/dist/relevantAnalyticsAdapter.js +1 -1
  143. package/dist/rhythmoneBidAdapter.js +1 -1
  144. package/dist/riseBidAdapter.js +1 -1
  145. package/dist/rivrAnalyticsAdapter.js +1 -1
  146. package/dist/roxotAnalyticsAdapter.js +1 -1
  147. package/dist/rtdModule.js +1 -1
  148. package/dist/rubiconAnalyticsAdapter.js +1 -1
  149. package/dist/rubiconBidAdapter.js +1 -1
  150. package/dist/s2sTesting.js +1 -1
  151. package/dist/scaleableAnalyticsAdapter.js +1 -1
  152. package/dist/schain.js +1 -1
  153. package/dist/seedingAllianceBidAdapter.js +1 -1
  154. package/dist/seedtagBidAdapter.js +1 -1
  155. package/dist/sharedIdSystem.js +1 -1
  156. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  157. package/dist/sharethroughBidAdapter.js +1 -1
  158. package/dist/shinezBidAdapter.js +1 -1
  159. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  160. package/dist/smaatoBidAdapter.js +1 -1
  161. package/dist/smartadserverBidAdapter.js +1 -1
  162. package/dist/smartxBidAdapter.js +1 -1
  163. package/dist/smilewantedBidAdapter.js +1 -1
  164. package/dist/sonobiAnalyticsAdapter.js +1 -1
  165. package/dist/sonobiBidAdapter.js +1 -1
  166. package/dist/sovrnAnalyticsAdapter.js +1 -1
  167. package/dist/sovrnBidAdapter.js +1 -1
  168. package/dist/sspBCBidAdapter.js +1 -1
  169. package/dist/staqAnalyticsAdapter.js +1 -1
  170. package/dist/sublimeBidAdapter.js +1 -1
  171. package/dist/synacormediaBidAdapter.js +1 -1
  172. package/dist/taboolaBidAdapter.js +1 -1
  173. package/dist/tapadIdSystem.js +1 -1
  174. package/dist/targetVideoBidAdapter.js +1 -1
  175. package/dist/teadsBidAdapter.js +1 -1
  176. package/dist/teadsIdSystem.js +1 -0
  177. package/dist/terceptAnalyticsAdapter.js +1 -1
  178. package/dist/trionBidAdapter.js +1 -1
  179. package/dist/tripleliftBidAdapter.js +1 -1
  180. package/dist/ttdBidAdapter.js +1 -1
  181. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  182. package/dist/underdogmediaBidAdapter.js +1 -1
  183. package/dist/undertoneBidAdapter.js +1 -1
  184. package/dist/userId.js +1 -1
  185. package/dist/vidazooBidAdapter.js +1 -1
  186. package/dist/videobyteBidAdapter.js +1 -1
  187. package/dist/visxBidAdapter.js +1 -1
  188. package/dist/vrtcalBidAdapter.js +1 -1
  189. package/dist/vuukleBidAdapter.js +1 -1
  190. package/dist/weboramaRtdProvider.js +1 -1
  191. package/dist/widespaceBidAdapter.js +1 -1
  192. package/dist/winrBidAdapter.js +1 -1
  193. package/dist/yahoosspBidAdapter.js +1 -1
  194. package/dist/yandexBidAdapter.js +1 -1
  195. package/dist/yieldmoBidAdapter.js +1 -1
  196. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  197. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  198. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  199. package/libraries/fpd/sua.js +98 -0
  200. package/modules/.submodules.json +1 -0
  201. package/modules/adfBidAdapter.js +1 -1
  202. package/modules/adkernelAdnBidAdapter.js +1 -0
  203. package/modules/adkernelBidAdapter.js +2 -2
  204. package/modules/adqueryIdSystem.js +8 -8
  205. package/modules/adxcgBidAdapter.js +1 -1
  206. package/modules/amxBidAdapter.js +1 -1
  207. package/modules/aolBidAdapter.js +25 -2
  208. package/modules/appnexusBidAdapter.js +19 -2
  209. package/modules/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +0 -0
  210. package/modules/{andBeyondMediaBidAdapter.md → beyondmediaBidAdapter.md} +1 -1
  211. package/modules/categoryTranslation.js +4 -4
  212. package/modules/cleanioRtdProvider.js +3 -4
  213. package/modules/colossussspBidAdapter.js +2 -1
  214. package/modules/connectIdSystem.js +16 -1
  215. package/modules/conversantAnalyticsAdapter.js +560 -0
  216. package/modules/conversantAnalyticsAdapter.md +47 -0
  217. package/modules/criteoBidAdapter.js +1 -1
  218. package/modules/currency.js +11 -11
  219. package/modules/dchain.js +2 -2
  220. package/modules/debugging/bidInterceptor.js +2 -2
  221. package/modules/debugging/debugging.js +10 -2
  222. package/modules/debugging/legacy.js +2 -2
  223. package/modules/dgkeywordRtdProvider.js +21 -3
  224. package/modules/dianomiBidAdapter.js +1 -1
  225. package/modules/enrichmentFpdModule.js +33 -14
  226. package/modules/eplanningBidAdapter.js +48 -2
  227. package/modules/finativeBidAdapter.js +1 -1
  228. package/modules/gridBidAdapter.js +187 -117
  229. package/modules/improvedigitalBidAdapter.js +2 -2
  230. package/modules/ixBidAdapter.js +94 -23
  231. package/modules/liveIntentIdSystem.js +39 -5
  232. package/modules/lotamePanoramaIdSystem.js +10 -6
  233. package/modules/magniteAnalyticsAdapter.js +902 -0
  234. package/modules/magniteAnalyticsAdapter.md +18 -0
  235. package/modules/mass.js +2 -2
  236. package/modules/mediakeysBidAdapter.js +6 -1
  237. package/modules/mediakeysBidAdapter.md +50 -40
  238. package/modules/multibid/index.js +5 -5
  239. package/modules/nativoBidAdapter.js +1 -1
  240. package/modules/pixfutureBidAdapter.js +46 -15
  241. package/modules/prebidServerBidAdapter/index.js +54 -19
  242. package/modules/priceFloors.js +8 -22
  243. package/modules/readpeakBidAdapter.js +1 -1
  244. package/modules/rubiconAnalyticsAdapter.js +14 -9
  245. package/modules/rubiconBidAdapter.js +2 -3
  246. package/modules/seedingAllianceBidAdapter.js +1 -1
  247. package/modules/sharethroughBidAdapter.js +1 -1
  248. package/modules/taboolaBidAdapter.js +5 -5
  249. package/modules/talkadsBidAdapter.js +1 -0
  250. package/modules/teadsIdSystem.js +234 -0
  251. package/modules/teadsIdSystem.md +22 -0
  252. package/modules/truereachBidAdapter.js +1 -0
  253. package/modules/ttdBidAdapter.js +1 -1
  254. package/modules/userId/index.js +21 -14
  255. package/modules/vrtcalBidAdapter.js +7 -1
  256. package/modules/vuukleBidAdapter.js +34 -3
  257. package/modules/yahoosspBidAdapter.js +4 -2
  258. package/modules/yandexBidAdapter.js +31 -8
  259. package/package.json +2 -2
  260. package/src/adapterManager.js +2 -4
  261. package/src/adapters/bidderFactory.js +13 -11
  262. package/src/auction.js +140 -69
  263. package/src/constants.json +8 -0
  264. package/src/cpmBucketManager.js +22 -3
  265. package/src/native.js +1 -5
  266. package/src/prebid.js +5 -6
  267. package/src/targeting.js +31 -14
  268. package/test/fixtures/fixtures.js +2 -1
  269. package/test/spec/auctionmanager_spec.js +109 -21
  270. package/test/spec/cpmBucketManager_spec.js +239 -177
  271. package/test/spec/fpd/sua_spec.js +244 -0
  272. package/test/spec/modules/adfBidAdapter_spec.js +2 -3
  273. package/test/spec/modules/adqueryIdSystem_spec.js +0 -2
  274. package/test/spec/modules/adxcgBidAdapter_spec.js +2 -3
  275. package/test/spec/modules/amxBidAdapter_spec.js +3 -2
  276. package/test/spec/modules/aolBidAdapter_spec.js +42 -9
  277. package/test/spec/modules/appnexusBidAdapter_spec.js +24 -0
  278. package/test/spec/modules/{andBeyondMediaBidAdapter_spec.js → beyondmediaBidAdapter_spec.js} +1 -1
  279. package/test/spec/modules/colossussspBidAdapter_spec.js +4 -2
  280. package/test/spec/modules/connectIdSystem_spec.js +20 -0
  281. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +963 -0
  282. package/test/spec/modules/currency_spec.js +14 -6
  283. package/test/spec/modules/debugging_mod_spec.js +9 -0
  284. package/test/spec/modules/dgkeywordRtdProvider_spec.js +83 -1
  285. package/test/spec/modules/dianomiBidAdapter_spec.js +2 -3
  286. package/test/spec/modules/enrichmentFpdModule_spec.js +50 -7
  287. package/test/spec/modules/eplanningBidAdapter_spec.js +285 -1
  288. package/test/spec/modules/fpdModule_spec.js +9 -0
  289. package/test/spec/modules/gridBidAdapter_spec.js +87 -31
  290. package/test/spec/modules/ixBidAdapter_spec.js +221 -2
  291. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +62 -8
  292. package/test/spec/modules/liveIntentIdSystem_spec.js +62 -8
  293. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +0 -1
  294. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +1942 -0
  295. package/test/spec/modules/mediakeysBidAdapter_spec.js +20 -3
  296. package/test/spec/modules/nativoBidAdapter_spec.js +13 -2
  297. package/test/spec/modules/prebidServerBidAdapter_spec.js +202 -15
  298. package/test/spec/modules/priceFloors_spec.js +5 -5
  299. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +2 -3
  300. package/test/spec/modules/seedtagBidAdapter_spec.js +15 -18
  301. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  302. package/test/spec/modules/taboolaBidAdapter_spec.js +112 -13
  303. package/test/spec/modules/teadsIdSystem_spec.js +271 -0
  304. package/test/spec/modules/ttdBidAdapter_spec.js +3 -3
  305. package/test/spec/modules/userId_spec.js +39 -4
  306. package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -1
  307. package/test/spec/modules/vuukleBidAdapter_spec.js +87 -0
  308. package/test/spec/modules/yahoosspBidAdapter_spec.js +48 -1
  309. package/test/spec/modules/yandexBidAdapter_spec.js +8 -5
  310. package/test/spec/native_spec.js +5 -0
  311. package/test/spec/unit/core/bidderFactory_spec.js +66 -11
  312. package/test/spec/unit/core/targeting_spec.js +28 -9
  313. package/test/spec/unit/pbjs_api_spec.js +48 -2
@@ -202,6 +202,8 @@ export function newBidder(spec) {
202
202
  adUnitCodesHandled[adUnitCode] = true;
203
203
  if (metrics.measureTime('addBidResponse.validate', () => isValid(adUnitCode, bid))) {
204
204
  addBidResponse(adUnitCode, bid);
205
+ } else {
206
+ addBidResponse.reject(adUnitCode, bid, CONSTANTS.REJECTION_REASON.INVALID)
205
207
  }
206
208
  }
207
209
 
@@ -262,6 +264,7 @@ export function newBidder(spec) {
262
264
  bid.adapterCode = bidRequest.bidder;
263
265
  if (isInvalidAlternateBidder(bid.bidderCode, bidRequest.bidder)) {
264
266
  logWarn(`${bid.bidderCode} is not a registered partner or known bidder of ${bidRequest.bidder}, hence continuing without bid. If you wish to support this bidder, please mark allowAlternateBidderCodes as true in bidderSettings.`);
267
+ addBidResponse.reject(bidRequest.adUnitCode, bid, CONSTANTS.REJECTION_REASON.BIDDER_DISALLOWED)
265
268
  return;
266
269
  }
267
270
  // creating a copy of original values as cpm and currency are modified later
@@ -272,6 +275,7 @@ export function newBidder(spec) {
272
275
  addBidWithCode(bidRequest.adUnitCode, prebidBid);
273
276
  } else {
274
277
  logWarn(`Bidder ${spec.code} made bid for unknown request ID: ${bid.requestId}. Ignoring.`);
278
+ addBidResponse.reject(null, bid, CONSTANTS.REJECTION_REASON.INVALID_REQUEST_ID);
275
279
  }
276
280
  },
277
281
  onCompletion: afterAllResponses,
@@ -541,24 +545,22 @@ export function getIabSubCategory(bidderCode, category) {
541
545
 
542
546
  // check that the bid has a width and height set
543
547
  function validBidSize(adUnitCode, bid, {index = auctionManager.index} = {}) {
544
- if ((bid.width || parseInt(bid.width, 10) === 0) && (bid.height || parseInt(bid.height, 10) === 0)) {
545
- bid.width = parseInt(bid.width, 10);
546
- bid.height = parseInt(bid.height, 10);
547
- return true;
548
- }
549
-
550
548
  const bidRequest = index.getBidRequest(bid);
551
549
  const mediaTypes = index.getMediaTypes(bid);
552
550
 
553
551
  const sizes = (bidRequest && bidRequest.sizes) || (mediaTypes && mediaTypes.banner && mediaTypes.banner.sizes);
554
- const parsedSizes = parseSizesInput(sizes);
552
+ const parsedSizes = parseSizesInput(sizes).map(sz => sz.split('x').map(n => parseInt(n, 10)));
553
+
554
+ if ((bid.width || parseInt(bid.width, 10) === 0) && (bid.height || parseInt(bid.height, 10) === 0)) {
555
+ bid.width = parseInt(bid.width, 10);
556
+ bid.height = parseInt(bid.height, 10);
557
+ return parsedSizes.length === 0 || parsedSizes.some(([w, h]) => bid.width === w && bid.height === h);
558
+ }
555
559
 
556
560
  // if a banner impression has one valid size, we assign that size to any bid
557
561
  // response that does not explicitly set width or height
558
562
  if (parsedSizes.length === 1) {
559
- const [ width, height ] = parsedSizes[0].split('x');
560
- bid.width = parseInt(width, 10);
561
- bid.height = parseInt(height, 10);
563
+ ([bid.width, bid.height] = parsedSizes[0]);
562
564
  return true;
563
565
  }
564
566
 
@@ -600,7 +602,7 @@ export function isValid(adUnitCode, bid, {index = auctionManager.index} = {}) {
600
602
  return false;
601
603
  }
602
604
  if (bid.mediaType === 'banner' && !validBidSize(adUnitCode, bid, {index})) {
603
- logError(errorMessage(`Banner bids require a width and height`));
605
+ logError(errorMessage(`Banner bids require a width and height that match one of the requested sizes`));
604
606
  return false;
605
607
  }
606
608
 
package/src/auction.js CHANGED
@@ -58,26 +58,41 @@
58
58
  */
59
59
 
60
60
  import {
61
- flatten, timestamp, adUnitsFilter, deepAccess, getValue, parseUrl, generateUUID,
62
- logMessage, bind, logError, logInfo, logWarn, isEmpty, _each, isFn, isEmptyStr
61
+ _each,
62
+ adUnitsFilter,
63
+ bind,
64
+ deepAccess,
65
+ flatten,
66
+ generateUUID,
67
+ getValue,
68
+ isEmpty,
69
+ isEmptyStr,
70
+ isFn,
71
+ logError,
72
+ logInfo,
73
+ logMessage,
74
+ logWarn,
75
+ parseUrl,
76
+ timestamp
63
77
  } from './utils.js';
64
- import { getPriceBucketString } from './cpmBucketManager.js';
65
- import { getNativeTargeting } from './native.js';
66
- import { getCacheUrl, store } from './videoCache.js';
67
- import { Renderer } from './Renderer.js';
68
- import { config } from './config.js';
69
- import { userSync } from './userSync.js';
70
- import { hook } from './hook.js';
78
+ import {getPriceBucketString} from './cpmBucketManager.js';
79
+ import {getNativeTargeting} from './native.js';
80
+ import {getCacheUrl, store} from './videoCache.js';
81
+ import {Renderer} from './Renderer.js';
82
+ import {config} from './config.js';
83
+ import {userSync} from './userSync.js';
84
+ import {hook} from './hook.js';
71
85
  import {find, includes} from './polyfill.js';
72
- import { OUTSTREAM } from './video.js';
73
- import { VIDEO } from './mediaTypes.js';
86
+ import {OUTSTREAM} from './video.js';
87
+ import {VIDEO} from './mediaTypes.js';
74
88
  import {auctionManager} from './auctionManager.js';
75
89
  import {bidderSettings} from './bidderSettings.js';
76
- import * as events from './events.js'
90
+ import * as events from './events.js';
77
91
  import adapterManager from './adapterManager.js';
78
92
  import CONSTANTS from './constants.json';
79
93
  import {GreedyPromise} from './utils/promise.js';
80
94
  import {useMetrics} from './utils/perfMetrics.js';
95
+ import {createBid} from './bidfactory.js';
81
96
 
82
97
  const { syncUsers } = userSync;
83
98
 
@@ -119,24 +134,26 @@ export function resetAuctionState() {
119
134
  */
120
135
  export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, auctionId, ortb2Fragments, metrics}) {
121
136
  metrics = useMetrics(metrics);
122
- let _adUnits = adUnits;
123
- let _labels = labels;
124
- let _adUnitCodes = adUnitCodes;
137
+ const _adUnits = adUnits;
138
+ const _labels = labels;
139
+ const _adUnitCodes = adUnitCodes;
140
+ const _auctionId = auctionId || generateUUID();
141
+ const _timeout = cbTimeout;
142
+ const _timelyBidders = new Set();
143
+ let _bidsRejected = [];
144
+ let _callback = callback;
125
145
  let _bidderRequests = [];
126
146
  let _bidsReceived = [];
127
147
  let _noBids = [];
148
+ let _winningBids = [];
128
149
  let _auctionStart;
129
150
  let _auctionEnd;
130
- let _auctionId = auctionId || generateUUID();
131
- let _auctionStatus;
132
- let _callback = callback;
133
151
  let _timer;
134
- let _timeout = cbTimeout;
135
- let _winningBids = [];
136
- let _timelyBidders = new Set();
152
+ let _auctionStatus;
137
153
 
138
154
  function addBidRequests(bidderRequests) { _bidderRequests = _bidderRequests.concat(bidderRequests); }
139
155
  function addBidReceived(bidsReceived) { _bidsReceived = _bidsReceived.concat(bidsReceived); }
156
+ function addBidRejected(bidsRejected) { _bidsRejected = _bidsRejected.concat(bidsRejected); }
140
157
  function addNoBid(noBid) { _noBids = _noBids.concat(noBid); }
141
158
 
142
159
  function getProperties() {
@@ -151,6 +168,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
151
168
  bidderRequests: _bidderRequests,
152
169
  noBids: _noBids,
153
170
  bidsReceived: _bidsReceived,
171
+ bidsRejected: _bidsRejected,
154
172
  winningBids: _winningBids,
155
173
  timeout: _timeout,
156
174
  metrics: metrics
@@ -352,6 +370,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
352
370
 
353
371
  return {
354
372
  addBidReceived,
373
+ addBidRejected,
355
374
  addNoBid,
356
375
  executeCallback,
357
376
  callBids,
@@ -372,7 +391,14 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
372
391
  };
373
392
  }
374
393
 
375
- export const addBidResponse = hook('sync', function(adUnitCode, bid) {
394
+ /**
395
+ * Hook into this to intercept bids before they are added to an auction.
396
+ *
397
+ * @param adUnitCode
398
+ * @param bid
399
+ * @param {function(String)} reject: a function that, when called, rejects `bid` with the given reason.
400
+ */
401
+ export const addBidResponse = hook('sync', function(adUnitCode, bid, reject) {
376
402
  this.dispatch.call(null, adUnitCode, bid);
377
403
  }, 'addBidResponse');
378
404
 
@@ -425,20 +451,49 @@ export function auctionCallbacks(auctionDone, auctionInstance, {index = auctionM
425
451
  }
426
452
  }
427
453
 
428
- function handleBidResponse(adUnitCode, bid) {
454
+ function handleBidResponse(adUnitCode, bid, handler) {
429
455
  bidResponseMap[bid.requestId] = true;
430
-
456
+ addCommonResponseProperties(bid, adUnitCode)
431
457
  outstandingBidsAdded++;
432
- let auctionId = auctionInstance.getAuctionId();
458
+ return handler(afterBidAdded);
459
+ }
433
460
 
434
- let bidResponse = getPreparedBidForAuction({adUnitCode, bid, auctionId});
461
+ function acceptBidResponse(adUnitCode, bid) {
462
+ handleBidResponse(adUnitCode, bid, (done) => {
463
+ let bidResponse = getPreparedBidForAuction(bid);
435
464
 
436
- if (bidResponse.mediaType === 'video') {
437
- tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded);
438
- } else {
439
- addBidToAuction(auctionInstance, bidResponse);
440
- afterBidAdded();
441
- }
465
+ if (bidResponse.mediaType === 'video') {
466
+ tryAddVideoBid(auctionInstance, bidResponse, done);
467
+ } else {
468
+ addBidToAuction(auctionInstance, bidResponse);
469
+ done();
470
+ }
471
+ });
472
+ }
473
+
474
+ function rejectBidResponse(adUnitCode, bid, reason) {
475
+ return handleBidResponse(adUnitCode, bid, (done) => {
476
+ // return a "NO_BID" replacement that the caller can decide to continue with
477
+ // TODO: remove this in v8; see https://github.com/prebid/Prebid.js/issues/8956
478
+ const noBid = createBid(CONSTANTS.STATUS.NO_BID, bid.getIdentifiers());
479
+ Object.assign(noBid, Object.fromEntries(Object.entries(bid).filter(([k]) => !noBid.hasOwnProperty(k) && ![
480
+ 'ad',
481
+ 'adUrl',
482
+ 'vastXml',
483
+ 'vastUrl',
484
+ 'native',
485
+ ].includes(k))));
486
+ noBid.status = CONSTANTS.BID_STATUS.BID_REJECTED;
487
+ noBid.cpm = 0;
488
+
489
+ bid.rejectionReason = reason;
490
+ logWarn(`Bid from ${bid.bidder || 'unknown bidder'} was rejected: ${reason}`, bid)
491
+ events.emit(CONSTANTS.EVENTS.BID_REJECTED, bid);
492
+ auctionInstance.addBidRejected(bid);
493
+ done();
494
+
495
+ return noBid;
496
+ })
442
497
  }
443
498
 
444
499
  function adapterDone() {
@@ -470,12 +525,24 @@ export function auctionCallbacks(auctionDone, auctionInstance, {index = auctionM
470
525
  }
471
526
 
472
527
  return {
473
- addBidResponse: function (adUnit, bid) {
474
- const bidderRequest = index.getBidderRequest(bid);
475
- waitFor((bidderRequest && bidderRequest.bidderRequestId) || '', addBidResponse.call({
476
- dispatch: handleBidResponse,
477
- }, adUnit, bid));
478
- },
528
+ addBidResponse: (function () {
529
+ function addBid(adUnitCode, bid) {
530
+ const bidderRequest = index.getBidderRequest(bid);
531
+ waitFor((bidderRequest && bidderRequest.bidderRequestId) || '', addBidResponse.call({
532
+ dispatch: acceptBidResponse,
533
+ }, adUnitCode, bid, (() => {
534
+ let rejection;
535
+ return (reason) => {
536
+ if (rejection == null) {
537
+ rejection = rejectBidResponse(adUnitCode, bid, reason);
538
+ }
539
+ return rejection;
540
+ }
541
+ })()));
542
+ }
543
+ addBid.reject = rejectBidResponse;
544
+ return addBid;
545
+ })(),
479
546
  adapterDone: function () {
480
547
  guard(this, adapterDone.bind(this))
481
548
  }
@@ -492,9 +559,7 @@ export function doCallbacksIfTimedout(auctionInstance, bidResponse) {
492
559
  export function addBidToAuction(auctionInstance, bidResponse) {
493
560
  setupBidTargeting(bidResponse);
494
561
 
495
- const metrics = useMetrics(bidResponse.metrics);
496
- metrics.timeSince('addBidResponse', 'addBidResponse.total');
497
-
562
+ useMetrics(bidResponse.metrics).timeSince('addBidResponse', 'addBidResponse.total');
498
563
  events.emit(CONSTANTS.EVENTS.BID_RESPONSE, bidResponse);
499
564
  auctionInstance.addBidReceived(bidResponse);
500
565
 
@@ -595,35 +660,41 @@ export const callPrebidCache = hook('async', function(auctionInstance, bidRespon
595
660
  batchAndStore(auctionInstance, bidResponse, afterBidAdded);
596
661
  }, 'callPrebidCache');
597
662
 
598
- // Postprocess the bids so that all the universal properties exist, no matter which bidder they came from.
599
- // This should be called before addBidToAuction().
600
- function getPreparedBidForAuction({adUnitCode, bid, auctionId}, {index = auctionManager.index} = {}) {
601
- const bidderRequest = index.getBidderRequest(bid);
602
- const start = (bidderRequest && bidderRequest.start) || bid.requestTimestamp;
603
-
604
- let bidObject = Object.assign({}, bid, {
605
- auctionId,
606
- responseTimestamp: timestamp(),
607
- requestTimestamp: start,
608
- cpm: parseFloat(bid.cpm) || 0,
609
- bidder: bid.bidderCode,
663
+ /**
664
+ * Augment `bidResponse` with properties that are common across all bids - including rejected bids.
665
+ *
666
+ */
667
+ function addCommonResponseProperties(bidResponse, adUnitCode, {index = auctionManager.index} = {}) {
668
+ const bidderRequest = index.getBidderRequest(bidResponse);
669
+ const start = (bidderRequest && bidderRequest.start) || bidResponse.requestTimestamp;
670
+
671
+ Object.assign(bidResponse, {
672
+ responseTimestamp: bidResponse.responseTimestamp || timestamp(),
673
+ requestTimestamp: bidResponse.requestTimestamp || start,
674
+ cpm: bidResponse.cpm || parseFloat(bidResponse.cpm) || 0,
675
+ bidder: bidResponse.bidder || bidResponse.bidderCode,
610
676
  adUnitCode
611
677
  });
612
678
 
613
- bidObject.timeToRespond = bidObject.responseTimestamp - bidObject.requestTimestamp;
679
+ bidResponse.timeToRespond = bidResponse.responseTimestamp - bidResponse.requestTimestamp;
680
+ }
614
681
 
682
+ /**
683
+ * Add additional bid response properties that are universal for all _accepted_ bids.
684
+ */
685
+ function getPreparedBidForAuction(bid, {index = auctionManager.index} = {}) {
615
686
  // Let listeners know that now is the time to adjust the bid, if they want to.
616
687
  //
617
688
  // CAREFUL: Publishers rely on certain bid properties to be available (like cpm),
618
689
  // but others to not be set yet (like priceStrings). See #1372 and #1389.
619
- events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT, bidObject);
690
+ events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT, bid);
620
691
 
621
692
  // a publisher-defined renderer can be used to render bids
622
- const adUnitRenderer = index.getAdUnit(bidObject).renderer;
693
+ const adUnitRenderer = index.getAdUnit(bid).renderer;
623
694
 
624
695
  // a publisher can also define a renderer for a mediaType
625
- const bidObjectMediaType = bidObject.mediaType;
626
- const mediaTypes = index.getMediaTypes(bidObject);
696
+ const bidObjectMediaType = bid.mediaType;
697
+ const mediaTypes = index.getMediaTypes(bid);
627
698
  const bidMediaType = mediaTypes && mediaTypes[bidObjectMediaType];
628
699
 
629
700
  var mediaTypeRenderer = bidMediaType && bidMediaType.renderer;
@@ -639,25 +710,25 @@ function getPreparedBidForAuction({adUnitCode, bid, auctionId}, {index = auction
639
710
 
640
711
  if (renderer) {
641
712
  // be aware, an adapter could already have installed the bidder, in which case this overwrite's the existing adapter
642
- bidObject.renderer = Renderer.install({ url: renderer.url, config: renderer.options });// rename options to config, to make it consistent?
643
- bidObject.renderer.setRender(renderer.render);
713
+ bid.renderer = Renderer.install({ url: renderer.url, config: renderer.options });// rename options to config, to make it consistent?
714
+ bid.renderer.setRender(renderer.render);
644
715
  }
645
716
 
646
717
  // Use the config value 'mediaTypeGranularity' if it has been defined for mediaType, else use 'customPriceBucket'
647
718
  const mediaTypeGranularity = getMediaTypeGranularity(bid.mediaType, mediaTypes, config.getConfig('mediaTypePriceGranularity'));
648
719
  const priceStringsObj = getPriceBucketString(
649
- bidObject.cpm,
720
+ bid.cpm,
650
721
  (typeof mediaTypeGranularity === 'object') ? mediaTypeGranularity : config.getConfig('customPriceBucket'),
651
722
  config.getConfig('currency.granularityMultiplier')
652
723
  );
653
- bidObject.pbLg = priceStringsObj.low;
654
- bidObject.pbMg = priceStringsObj.med;
655
- bidObject.pbHg = priceStringsObj.high;
656
- bidObject.pbAg = priceStringsObj.auto;
657
- bidObject.pbDg = priceStringsObj.dense;
658
- bidObject.pbCg = priceStringsObj.custom;
659
-
660
- return bidObject;
724
+ bid.pbLg = priceStringsObj.low;
725
+ bid.pbMg = priceStringsObj.med;
726
+ bid.pbHg = priceStringsObj.high;
727
+ bid.pbAg = priceStringsObj.auto;
728
+ bid.pbDg = priceStringsObj.dense;
729
+ bid.pbCg = priceStringsObj.custom;
730
+
731
+ return bid;
661
732
  }
662
733
 
663
734
  function setupBidTargeting(bidObject) {
@@ -29,6 +29,7 @@
29
29
  "BID_TIMEOUT": "bidTimeout",
30
30
  "BID_REQUESTED": "bidRequested",
31
31
  "BID_RESPONSE": "bidResponse",
32
+ "BID_REJECTED": "bidRejected",
32
33
  "NO_BID": "noBid",
33
34
  "BID_WON": "bidWon",
34
35
  "BIDDER_DONE": "bidderDone",
@@ -119,6 +120,13 @@
119
120
  "RENDERED": "rendered",
120
121
  "BID_REJECTED": "bidRejected"
121
122
  },
123
+ "REJECTION_REASON": {
124
+ "INVALID": "Bid has missing or invalid properties",
125
+ "INVALID_REQUEST_ID": "Invalid request ID",
126
+ "BIDDER_DISALLOWED": "Bidder code is not allowed by allowedAlternateBidderCodes / allowUnknownBidderCodes",
127
+ "FLOOR_NOT_MET": "Bid does not meet price floor",
128
+ "CANNOT_CONVERT_CURRENCY": "Unable to convert currency"
129
+ },
122
130
  "PREBID_NATIVE_DATA_KEYS_TO_ORTB": {
123
131
  "body": "desc",
124
132
  "body2": "desc2",
@@ -1,5 +1,6 @@
1
1
  import {find} from './polyfill.js';
2
- import { isEmpty } from './utils.js';
2
+ import { isEmpty, logWarn } from './utils.js';
3
+ import { config } from './config.js';
3
4
 
4
5
  const _defaultPrecision = 2;
5
6
  const _lgPriceConfig = {
@@ -118,6 +119,11 @@ function getCpmTarget(cpm, bucket, granularityMultiplier) {
118
119
  const precision = typeof bucket.precision !== 'undefined' ? bucket.precision : _defaultPrecision;
119
120
  const increment = bucket.increment * granularityMultiplier;
120
121
  const bucketMin = bucket.min * granularityMultiplier;
122
+ let roundingFunction = Math.floor;
123
+ let customRoundingFunction = config.getConfig('cpmRoundingFunction');
124
+ if (typeof customRoundingFunction === 'function') {
125
+ roundingFunction = customRoundingFunction;
126
+ }
121
127
 
122
128
  // start increments at the bucket min and then add bucket min back to arrive at the correct rounding
123
129
  // note - we're padding the values to avoid using decimals in the math prior to flooring
@@ -125,10 +131,23 @@ function getCpmTarget(cpm, bucket, granularityMultiplier) {
125
131
  // (eg 4.01 / 0.01 = 400.99999999999994)
126
132
  // min precison should be 2 to move decimal place over.
127
133
  let pow = Math.pow(10, precision + 2);
128
- let cpmToFloor = ((cpm * pow) - (bucketMin * pow)) / (increment * pow);
129
- let cpmTarget = ((Math.floor(cpmToFloor)) * increment) + bucketMin;
134
+ let cpmToRound = ((cpm * pow) - (bucketMin * pow)) / (increment * pow);
135
+ let cpmTarget;
136
+ let invalidRounding;
137
+ // It is likely that we will be passed {cpmRoundingFunction: roundingFunction()}
138
+ // rather than the expected {cpmRoundingFunction: roundingFunction}. Default back to floor in that case
139
+ try {
140
+ cpmTarget = (roundingFunction(cpmToRound) * increment) + bucketMin;
141
+ } catch (err) {
142
+ invalidRounding = true;
143
+ }
144
+ if (invalidRounding || typeof cpmTarget !== 'number') {
145
+ logWarn('Invalid rounding function passed in config');
146
+ cpmTarget = (Math.floor(cpmToRound) * increment) + bucketMin;
147
+ }
130
148
  // force to 10 decimal places to deal with imprecise decimal/binary conversions
131
149
  // (for example 0.1 * 3 = 0.30000000000000004)
150
+
132
151
  cpmTarget = Number(cpmTarget.toFixed(10));
133
152
  return cpmTarget.toFixed(precision);
134
153
  }
package/src/native.js CHANGED
@@ -449,11 +449,7 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = getNativeReq
449
449
  * appropriate for sending in adserver targeting or placeholder replacement.
450
450
  */
451
451
  function getAssetValue(value) {
452
- if (typeof value === 'object' && value.url) {
453
- return value.url;
454
- }
455
-
456
- return value;
452
+ return value?.url || value;
457
453
  }
458
454
 
459
455
  function getNativeKeys(adUnit) {
package/src/prebid.js CHANGED
@@ -36,7 +36,7 @@ import {listenMessagesFromCreative} from './secureCreatives.js';
36
36
  import {userSync} from './userSync.js';
37
37
  import {config} from './config.js';
38
38
  import {auctionManager} from './auctionManager.js';
39
- import {filters, targeting} from './targeting.js';
39
+ import {isBidUsable, targeting} from './targeting.js';
40
40
  import {hook, wrapHook} from './hook.js';
41
41
  import {loadSession} from './debugging.js';
42
42
  import {includes} from './polyfill.js';
@@ -296,8 +296,7 @@ $$PREBID_GLOBAL$$.getAdserverTargetingForAdUnitCodeStr = function (adunitCode) {
296
296
  $$PREBID_GLOBAL$$.getHighestUnusedBidResponseForAdUnitCode = function (adunitCode) {
297
297
  if (adunitCode) {
298
298
  const bid = auctionManager.getAllBidsForAdUnitCode(adunitCode)
299
- .filter(filters.isUnusedBid)
300
- .filter(filters.isBidNotExpired)
299
+ .filter(isBidUsable)
301
300
 
302
301
  return bid.length ? bid.reduce(getHighestCpm) : {}
303
302
  } else {
@@ -662,10 +661,10 @@ export const startAuction = hook('async', function ({ bidsBackHandler, timeout:
662
661
 
663
662
  const bidders = allBidders.filter(bidder => !s2sBidders.has(bidder));
664
663
 
665
- adUnit.transactionId = generateUUID();
666
-
664
+ const tid = adUnit.ortb2Imp?.ext?.tid || generateUUID();
665
+ adUnit.transactionId = tid;
667
666
  // Populate ortb2Imp.ext.tid with transactionId. Specifying a transaction ID per item in the ortb impression array, lets multiple transaction IDs be transmitted in a single bid request.
668
- deepSetValue(adUnit, 'ortb2Imp.ext.tid', adUnit.transactionId)
667
+ deepSetValue(adUnit, 'ortb2Imp.ext.tid', tid);
669
668
 
670
669
  bidders.forEach(bidder => {
671
670
  const adapter = bidderRegistry[bidder];
package/src/targeting.js CHANGED
@@ -1,15 +1,28 @@
1
1
  import {
2
- uniques, isGptPubadsDefined, getHighestCpm, getOldestHighestCpmBid, groupBy, isAdUnitCodeMatchingSlot, timestamp,
3
- deepAccess, deepClone, logError, logWarn, logInfo, isFn, isArray, logMessage, isStr,
2
+ deepAccess,
3
+ deepClone,
4
+ getHighestCpm,
5
+ getOldestHighestCpmBid,
6
+ groupBy,
7
+ isAdUnitCodeMatchingSlot,
8
+ isArray,
9
+ isFn,
10
+ isGptPubadsDefined,
11
+ isStr,
12
+ logError,
13
+ logInfo,
14
+ logMessage,
15
+ logWarn,
16
+ timestamp,
17
+ uniques,
4
18
  } from './utils.js';
5
- import { config } from './config.js';
6
- import { NATIVE_TARGETING_KEYS } from './native.js';
7
- import { auctionManager } from './auctionManager.js';
8
- import { sizeSupported } from './sizeMapping.js';
9
- import { ADPOD } from './mediaTypes.js';
10
- import { hook } from './hook.js';
11
- import { bidderSettings } from './bidderSettings.js';
12
- import {includes, find} from './polyfill.js';
19
+ import {config} from './config.js';
20
+ import {NATIVE_TARGETING_KEYS} from './native.js';
21
+ import {auctionManager} from './auctionManager.js';
22
+ import {ADPOD} from './mediaTypes.js';
23
+ import {hook} from './hook.js';
24
+ import {bidderSettings} from './bidderSettings.js';
25
+ import {find, includes} from './polyfill.js';
13
26
  import CONSTANTS from './constants.json';
14
27
 
15
28
  var pbTargetingKeys = [];
@@ -32,10 +45,17 @@ const isBidNotExpired = (bid) => (bid.responseTimestamp + bid.ttl * 1000 - TTL_B
32
45
  const isUnusedBid = (bid) => bid && ((bid.status && !includes([CONSTANTS.BID_STATUS.RENDERED], bid.status)) || !bid.status);
33
46
 
34
47
  export let filters = {
48
+ isActualBid(bid) {
49
+ return bid.getStatusCode() === CONSTANTS.STATUS.GOOD
50
+ },
35
51
  isBidNotExpired,
36
52
  isUnusedBid
37
53
  };
38
54
 
55
+ export function isBidUsable(bid) {
56
+ return !Object.values(filters).some((predicate) => !predicate(bid));
57
+ }
58
+
39
59
  // If two bids are found for same adUnitCode, we will use the highest one to take part in auction
40
60
  // This can happen in case of concurrent auctions
41
61
  // If adUnitBidLimit is set above 0 return top N number of bids
@@ -449,10 +469,7 @@ export function newTargeting(auctionManager) {
449
469
 
450
470
  bidsReceived = bidsReceived
451
471
  .filter(bid => deepAccess(bid, 'video.context') !== ADPOD)
452
- .filter(bid => bid.mediaType !== 'banner' || sizeSupported([bid.width, bid.height]))
453
- .filter(filters.isUnusedBid)
454
- .filter(filters.isBidNotExpired)
455
- ;
472
+ .filter(isBidUsable);
456
473
 
457
474
  return getHighestCpmBidsFromBidPool(bidsReceived, getOldestHighestCpmBid);
458
475
  }
@@ -1,5 +1,6 @@
1
1
  // jscs:disable
2
2
  import CONSTANTS from 'src/constants.json';
3
+ import {createBid} from '../../src/bidfactory.js';
3
4
  const utils = require('src/utils.js');
4
5
 
5
6
  function convertTargetingsFromOldToNew(targetings) {
@@ -1268,7 +1269,7 @@ export function createBidReceived({bidder, cpm, auctionId, responseTimestamp, ad
1268
1269
  if (typeof status !== 'undefined') {
1269
1270
  bid.status = status;
1270
1271
  }
1271
- return bid;
1272
+ return Object.assign(createBid(CONSTANTS.STATUS.GOOD), bid);
1272
1273
  }
1273
1274
 
1274
1275
  export function getServerTestingsAds() {