prebid.js 7.49.0 → 7.51.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 (213) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adhashBidAdapter.js +1 -1
  7. package/dist/adkernelBidAdapter.js +1 -1
  8. package/dist/admanBidAdapter.js +1 -1
  9. package/dist/adnuntiusBidAdapter.js +1 -1
  10. package/dist/adqueryBidAdapter.js +1 -1
  11. package/dist/adrelevantisBidAdapter.js +1 -1
  12. package/dist/adrinoBidAdapter.js +1 -1
  13. package/dist/adtelligentBidAdapter.js +1 -1
  14. package/dist/adtrgtmeBidAdapter.js +1 -1
  15. package/dist/adxcgBidAdapter.js +1 -1
  16. package/dist/adyoulikeBidAdapter.js +1 -1
  17. package/dist/ajaBidAdapter.js +1 -1
  18. package/dist/amxBidAdapter.js +1 -1
  19. package/dist/amxIdSystem.js +1 -1
  20. package/dist/appierAnalyticsAdapter.js +1 -1
  21. package/dist/appnexusBidAdapter.js +1 -1
  22. package/dist/asoBidAdapter.js +1 -1
  23. package/dist/axonixBidAdapter.js +1 -1
  24. package/dist/beopBidAdapter.js +1 -1
  25. package/dist/bidglassBidAdapter.js +1 -1
  26. package/dist/big-richmediaBidAdapter.js +1 -1
  27. package/dist/bridgewellBidAdapter.js +1 -1
  28. package/dist/brightMountainMediaBidAdapter.js +1 -1
  29. package/dist/carodaBidAdapter.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/cleanioRtdProvider.js +1 -1
  32. package/dist/concertBidAdapter.js +1 -1
  33. package/dist/confiantRtdProvider.js +1 -1
  34. package/dist/connectadBidAdapter.js +1 -1
  35. package/dist/consumableBidAdapter.js +1 -1
  36. package/dist/conversantAnalyticsAdapter.js +1 -1
  37. package/dist/conversantBidAdapter.js +1 -1
  38. package/dist/craftBidAdapter.js +1 -1
  39. package/dist/criteoBidAdapter.js +1 -1
  40. package/dist/cwireBidAdapter.js +1 -1
  41. package/dist/dependencies.json +3 -0
  42. package/dist/dspxBidAdapter.js +1 -1
  43. package/dist/eplanningBidAdapter.js +1 -1
  44. package/dist/feedadBidAdapter.js +1 -1
  45. package/dist/finativeBidAdapter.js +1 -1
  46. package/dist/freewheel-sspBidAdapter.js +1 -1
  47. package/dist/glimpseBidAdapter.js +1 -1
  48. package/dist/gmosspBidAdapter.js +1 -1
  49. package/dist/goldbachBidAdapter.js +1 -1
  50. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  51. package/dist/greenbidsRtdProvider.js +1 -1
  52. package/dist/gridBidAdapter.js +1 -1
  53. package/dist/gumgumBidAdapter.js +1 -1
  54. package/dist/h12mediaBidAdapter.js +1 -1
  55. package/dist/id5IdSystem.js +1 -1
  56. package/dist/improvedigitalBidAdapter.js +1 -1
  57. package/dist/inmarBidAdapter.js +1 -1
  58. package/dist/insticatorBidAdapter.js +1 -1
  59. package/dist/ixBidAdapter.js +1 -1
  60. package/dist/justpremiumBidAdapter.js +1 -1
  61. package/dist/kargoBidAdapter.js +1 -1
  62. package/dist/konduitAnalyticsAdapter.js +1 -1
  63. package/dist/kueezBidAdapter.js +1 -1
  64. package/dist/kueezRtbBidAdapter.js +1 -1
  65. package/dist/kulturemediaBidAdapter.js +1 -1
  66. package/dist/lassoBidAdapter.js +1 -1
  67. package/dist/lifestreetBidAdapter.js +1 -1
  68. package/dist/liveIntentIdSystem.js +1 -1
  69. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  70. package/dist/logicadBidAdapter.js +1 -1
  71. package/dist/loglyliftBidAdapter.js +1 -1
  72. package/dist/magniteAnalyticsAdapter.js +1 -1
  73. package/dist/malltvAnalyticsAdapter.js +1 -1
  74. package/dist/marsmediaBidAdapter.js +1 -1
  75. package/dist/mediafuseBidAdapter.js +1 -1
  76. package/dist/mediasquareBidAdapter.js +1 -1
  77. package/dist/mgidBidAdapter.js +1 -1
  78. package/dist/minutemediaBidAdapter.js +1 -1
  79. package/dist/minutemediaplusBidAdapter.js +1 -1
  80. package/dist/nexx360BidAdapter.js +1 -1
  81. package/dist/not-for-prod/prebid.js +140 -139
  82. package/dist/oguryBidAdapter.js +1 -1
  83. package/dist/onetagBidAdapter.js +1 -1
  84. package/dist/ooloAnalyticsAdapter.js +1 -1
  85. package/dist/optidigitalBidAdapter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/parrableIdSystem.js +1 -1
  88. package/dist/permutiveRtdProvider.js +1 -1
  89. package/dist/pixfutureBidAdapter.js +1 -1
  90. package/dist/prebid-core.js +1 -1
  91. package/dist/prebidServerBidAdapter.js +1 -1
  92. package/dist/publinkIdSystem.js +1 -1
  93. package/dist/pubmaticBidAdapter.js +1 -1
  94. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  95. package/dist/pxyzBidAdapter.js +1 -1
  96. package/dist/quantcastBidAdapter.js +1 -1
  97. package/dist/readpeakBidAdapter.js +1 -1
  98. package/dist/relaidoBidAdapter.js +1 -1
  99. package/dist/retailspotBidAdapter.js +1 -1
  100. package/dist/rhythmoneBidAdapter.js +1 -1
  101. package/dist/riseBidAdapter.js +1 -1
  102. package/dist/rubiconAnalyticsAdapter.js +1 -1
  103. package/dist/rubiconBidAdapter.js +1 -1
  104. package/dist/seedingAllianceBidAdapter.js +1 -1
  105. package/dist/seedtagBidAdapter.js +1 -1
  106. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  107. package/dist/sharethroughBidAdapter.js +1 -1
  108. package/dist/shinezBidAdapter.js +1 -1
  109. package/dist/silverpushBidAdapter.js +1 -0
  110. package/dist/smaatoBidAdapter.js +1 -1
  111. package/dist/smartadserverBidAdapter.js +1 -1
  112. package/dist/smartxBidAdapter.js +1 -1
  113. package/dist/smilewantedBidAdapter.js +1 -1
  114. package/dist/sonobiBidAdapter.js +1 -1
  115. package/dist/sovrnAnalyticsAdapter.js +1 -1
  116. package/dist/sovrnBidAdapter.js +1 -1
  117. package/dist/sspBCBidAdapter.js +1 -1
  118. package/dist/stvBidAdapter.js +1 -1
  119. package/dist/sublimeBidAdapter.js +1 -1
  120. package/dist/synacormediaBidAdapter.js +1 -1
  121. package/dist/targetVideoBidAdapter.js +1 -1
  122. package/dist/teadsBidAdapter.js +1 -1
  123. package/dist/trionBidAdapter.js +1 -1
  124. package/dist/tripleliftBidAdapter.js +1 -1
  125. package/dist/ttdBidAdapter.js +1 -1
  126. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  127. package/dist/uid2IdSystem.js +1 -1
  128. package/dist/underdogmediaBidAdapter.js +1 -1
  129. package/dist/undertoneBidAdapter.js +1 -1
  130. package/dist/vidazooBidAdapter.js +1 -1
  131. package/dist/video.js +1 -1
  132. package/dist/videoModule.js +1 -1
  133. package/dist/videobyteBidAdapter.js +1 -1
  134. package/dist/visxBidAdapter.js +1 -1
  135. package/dist/vuukleBidAdapter.js +1 -1
  136. package/dist/widespaceBidAdapter.js +1 -1
  137. package/dist/winrBidAdapter.js +1 -1
  138. package/dist/yahoosspBidAdapter.js +1 -1
  139. package/dist/yieldmoBidAdapter.js +1 -1
  140. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  141. package/integrationExamples/videoModule/eventsUI/eventsUI.css +205 -0
  142. package/integrationExamples/videoModule/eventsUI/eventsUI.js +181 -0
  143. package/integrationExamples/videoModule/jwplayer/eventsUI.html +295 -0
  144. package/integrationExamples/videoModule/videojs/eventsUI.html +319 -0
  145. package/libraries/video/shared/helpers.js +14 -0
  146. package/modules/33acrossBidAdapter.js +1 -1
  147. package/modules/adhashBidAdapter.js +28 -17
  148. package/modules/adkernelBidAdapter.js +2 -1
  149. package/modules/admanBidAdapter.js +30 -22
  150. package/modules/adnuntiusBidAdapter.js +98 -79
  151. package/modules/adnuntiusBidAdapter.md +2 -1
  152. package/modules/adqueryBidAdapter.js +7 -1
  153. package/modules/adrinoBidAdapter.js +1 -0
  154. package/modules/adtelligentBidAdapter.js +4 -2
  155. package/modules/appnexusBidAdapter.js +2 -0
  156. package/modules/beopBidAdapter.js +1 -0
  157. package/modules/cleanioRtdProvider.js +2 -4
  158. package/modules/confiantRtdProvider.js +15 -12
  159. package/modules/conversantAnalyticsAdapter.js +7 -5
  160. package/modules/conversantBidAdapter.js +1 -1
  161. package/modules/criteoBidAdapter.js +58 -4
  162. package/modules/freewheel-sspBidAdapter.js +10 -2
  163. package/modules/gridBidAdapter.js +3 -0
  164. package/modules/gumgumBidAdapter.js +5 -0
  165. package/modules/liveIntentIdSystem.js +8 -4
  166. package/modules/magniteAnalyticsAdapter.js +26 -3
  167. package/modules/minutemediaBidAdapter.js +13 -3
  168. package/modules/permutiveRtdProvider.js +9 -38
  169. package/modules/prebidServerBidAdapter/index.js +7 -8
  170. package/modules/pubmaticBidAdapter.js +1 -0
  171. package/modules/riseBidAdapter.js +13 -3
  172. package/modules/rtbhouseBidAdapter.md +24 -0
  173. package/modules/rubiconBidAdapter.js +6 -2
  174. package/modules/silverpushBidAdapter.js +326 -0
  175. package/modules/silverpushBidAdapter.md +107 -0
  176. package/modules/underdogmediaBidAdapter.js +2 -2
  177. package/modules/videoModule/adQueue.js +2 -2
  178. package/modules/videoModule/index.js +9 -5
  179. package/modules/yahoosspBidAdapter.js +6 -0
  180. package/modules/yahoosspBidAdapter.md +37 -0
  181. package/package.json +1 -1
  182. package/src/adloader.js +2 -1
  183. package/src/native.js +20 -4
  184. package/test/spec/modules/33acrossBidAdapter_spec.js +4 -3
  185. package/test/spec/modules/adhashBidAdapter_spec.js +51 -1
  186. package/test/spec/modules/admanBidAdapter_spec.js +1 -2
  187. package/test/spec/modules/adnuntiusBidAdapter_spec.js +535 -264
  188. package/test/spec/modules/adqueryBidAdapter_spec.js +9 -0
  189. package/test/spec/modules/adrinoBidAdapter_spec.js +4 -0
  190. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  191. package/test/spec/modules/beopBidAdapter_spec.js +4 -0
  192. package/test/spec/modules/cleanioRtdProvider_spec.js +7 -8
  193. package/test/spec/modules/confiantRtdProvider_spec.js +4 -1
  194. package/test/spec/modules/conversantBidAdapter_spec.js +2 -1
  195. package/test/spec/modules/criteoBidAdapter_spec.js +159 -2
  196. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -2
  197. package/test/spec/modules/gridBidAdapter_spec.js +3 -0
  198. package/test/spec/modules/gumgumBidAdapter_spec.js +14 -0
  199. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +28 -0
  200. package/test/spec/modules/liveIntentIdSystem_spec.js +45 -0
  201. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +16 -36
  202. package/test/spec/modules/mass_spec.js +2 -0
  203. package/test/spec/modules/minutemediaBidAdapter_spec.js +69 -1
  204. package/test/spec/modules/permutiveRtdProvider_spec.js +0 -20
  205. package/test/spec/modules/prebidServerBidAdapter_spec.js +3 -1
  206. package/test/spec/modules/pubmaticBidAdapter_spec.js +7 -0
  207. package/test/spec/modules/riseBidAdapter_spec.js +69 -1
  208. package/test/spec/modules/rubiconBidAdapter_spec.js +143 -67
  209. package/test/spec/modules/silverpushBidAdapter_spec.js +394 -0
  210. package/test/spec/modules/underdogmediaBidAdapter_spec.js +1 -1
  211. package/test/spec/modules/videoModule/shared/helpers_spec.js +22 -0
  212. package/test/spec/modules/yahoosspBidAdapter_spec.js +60 -1
  213. package/test/spec/native_spec.js +12 -12
@@ -8,8 +8,11 @@ import { verify } from 'criteo-direct-rsa-validate/build/verify.js'; // ref#2
8
8
  import { getStorageManager } from '../src/storageManager.js';
9
9
  import { getRefererInfo } from '../src/refererDetection.js';
10
10
  import { hasPurpose1Consent } from '../src/utils/gpdr.js';
11
+ import { Renderer } from '../src/Renderer.js';
12
+ import { OUTSTREAM } from '../src/video.js';
13
+
11
14
  const GVLID = 91;
12
- export const ADAPTER_VERSION = 35;
15
+ export const ADAPTER_VERSION = 36;
13
16
  const BIDDER_CODE = 'criteo';
14
17
  const CDB_ENDPOINT = 'https://bidder.criteo.com/cdb';
15
18
  const PROFILE_ID_INLINE = 207;
@@ -29,6 +32,7 @@ export const FAST_BID_VERSION_CURRENT = 135;
29
32
  const FAST_BID_VERSION_LATEST = 'latest';
30
33
  const FAST_BID_VERSION_NONE = 'none';
31
34
  const PUBLISHER_TAG_URL_TEMPLATE = 'https://static.criteo.net/js/ld/publishertag.prebid' + FAST_BID_VERSION_PLACEHOLDER + '.js';
35
+ const PUBLISHER_TAG_OUTSTREAM_SRC = 'https://static.criteo.net/js/ld/publishertag.renderer.js'
32
36
  const FAST_BID_PUBKEY_E = 65537;
33
37
  const FAST_BID_PUBKEY_N = 'ztQYwCE5BU7T9CDM5he6rKoabstXRmkzx54zFPZkWbK530dwtLBDeaWBMxHBUT55CYyboR/EZ4efghPi3CoNGfGWezpjko9P6p2EwGArtHEeS4slhu/SpSIFMjG6fdrpRoNuIAMhq1Z+Pr/+HOd1pThFKeGFr2/NhtAg+TXAzaU=';
34
38
 
@@ -230,6 +234,9 @@ export const spec = {
230
234
  if (slot.adomain) {
231
235
  bid.meta = Object.assign({}, bid.meta, { advertiserDomains: [slot.adomain].flat() });
232
236
  }
237
+ if (slot.ext?.meta?.networkName) {
238
+ bid.meta = Object.assign({}, bid.meta, {networkName: slot.ext.meta.networkName})
239
+ }
233
240
  if (slot.native) {
234
241
  if (bidRequest.params.nativeCallback) {
235
242
  bid.ad = createNativeAd(bidId, slot.native, bidRequest.params.nativeCallback);
@@ -240,6 +247,11 @@ export const spec = {
240
247
  } else if (slot.video) {
241
248
  bid.vastUrl = slot.displayurl;
242
249
  bid.mediaType = VIDEO;
250
+ const context = deepAccess(bidRequest, 'mediaTypes.video.context');
251
+ // if outstream video, add a default render for it.
252
+ if (context === OUTSTREAM) {
253
+ bid.renderer = createOutstreamVideoRenderer(slot);
254
+ }
243
255
  } else {
244
256
  bid.ad = slot.creative;
245
257
  }
@@ -249,7 +261,6 @@ export const spec = {
249
261
 
250
262
  return bids;
251
263
  },
252
-
253
264
  /**
254
265
  * @param {TimedOutBid} timeoutData
255
266
  */
@@ -407,6 +418,7 @@ function checkNativeSendId(bidRequest) {
407
418
  function buildCdbRequest(context, bidRequests, bidderRequest) {
408
419
  let networkId;
409
420
  let schain;
421
+ let userIdAsEids;
410
422
  const request = {
411
423
  publisher: {
412
424
  url: context.url,
@@ -418,6 +430,9 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
418
430
  gpp_sid: bidderRequest.ortb2?.regs?.gpp_sid
419
431
  },
420
432
  slots: bidRequests.map(bidRequest => {
433
+ if (!userIdAsEids) {
434
+ userIdAsEids = bidRequest.userIdAsEids;
435
+ }
421
436
  networkId = bidRequest.params.networkId || networkId;
422
437
  schain = bidRequest.schain || schain;
423
438
  const slot = {
@@ -431,11 +446,16 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
431
446
  if (deepAccess(bidRequest, 'ortb2Imp.ext')) {
432
447
  slot.ext = bidRequest.ortb2Imp.ext;
433
448
  }
449
+
450
+ if (deepAccess(bidRequest, 'ortb2Imp.rwdd')) {
451
+ slot.rwdd = bidRequest.ortb2Imp.rwdd;
452
+ }
453
+
434
454
  if (bidRequest.params.ext) {
435
455
  slot.ext = Object.assign({}, slot.ext, bidRequest.params.ext);
436
456
  }
437
457
  if (bidRequest.nativeOrtbRequest?.assets) {
438
- slot.ext = Object.assign({}, slot.ext, {assets: bidRequest.nativeOrtbRequest.assets});
458
+ slot.ext = Object.assign({}, slot.ext, { assets: bidRequest.nativeOrtbRequest.assets });
439
459
  }
440
460
  if (bidRequest.params.publisherSubId) {
441
461
  slot.publishersubid = bidRequest.params.publisherSubId;
@@ -465,7 +485,8 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
465
485
  placement: bidRequest.mediaTypes.video.placement,
466
486
  minduration: bidRequest.mediaTypes.video.minduration,
467
487
  playbackmethod: bidRequest.mediaTypes.video.playbackmethod,
468
- startdelay: bidRequest.mediaTypes.video.startdelay
488
+ startdelay: bidRequest.mediaTypes.video.startdelay,
489
+ plcmt: bidRequest.mediaTypes.video.plcmt
469
490
  };
470
491
  const paramsVideo = bidRequest.params.video;
471
492
  if (paramsVideo !== undefined) {
@@ -516,6 +537,10 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
516
537
  request.user.ext = request.user.ext || {};
517
538
  request.user.ext.sua = bidderRequest.ortb2?.device?.sua || {};
518
539
  }
540
+ if (userIdAsEids) {
541
+ request.user.ext = request.user.ext || {};
542
+ request.user.ext.eids = [...userIdAsEids];
543
+ }
519
544
  return request;
520
545
  }
521
546
 
@@ -695,6 +720,35 @@ export function getFastBidUrl(fastBidVersion) {
695
720
  return PUBLISHER_TAG_URL_TEMPLATE.replace(FAST_BID_VERSION_PLACEHOLDER, version);
696
721
  }
697
722
 
723
+ function createOutstreamVideoRenderer(slot) {
724
+ if (slot.ext.videoPlayerConfig === undefined || slot.ext.videoPlayerType === undefined) {
725
+ return undefined;
726
+ }
727
+
728
+ const config = {
729
+ documentResolver: (bid, sourceDocument, renderDocument) => {
730
+ return renderDocument ?? sourceDocument;
731
+ }
732
+ }
733
+
734
+ const render = (bid, renderDocument) => {
735
+ let payload = {
736
+ slotid: slot.impid,
737
+ vastUrl: slot.displayurl,
738
+ vastXml: slot.creative,
739
+ documentContext: renderDocument,
740
+ };
741
+
742
+ let outstreamConfig = slot.ext.videoPlayerConfig;
743
+
744
+ window.CriteoOutStream[slot.ext.videoPlayerType].play(payload, outstreamConfig)
745
+ };
746
+
747
+ const renderer = Renderer.install({url: PUBLISHER_TAG_OUTSTREAM_SRC, config: config});
748
+ renderer.setRender(render);
749
+ return renderer;
750
+ }
751
+
698
752
  export function tryGetCriteoFastBid() {
699
753
  // begin ref#1
700
754
  try {
@@ -340,6 +340,7 @@ export const spec = {
340
340
  var timeInMillis = new Date().getTime();
341
341
  var keyCode = hashcode(zone + '' + timeInMillis);
342
342
  var bidfloor = getBidFloor(currentBidRequest, config);
343
+ var format = currentBidRequest.params.format;
343
344
 
344
345
  var requestParams = {
345
346
  reqType: 'AdsSetup',
@@ -435,10 +436,17 @@ export const spec = {
435
436
 
436
437
  // Add video context and placement in requestParams
437
438
  if (currentBidRequest.mediaTypes.video) {
438
- var videoContext = currentBidRequest.mediaTypes.video.context ? currentBidRequest.mediaTypes.video.context : 'instream';
439
- var videoPlacement = currentBidRequest.mediaTypes.video.placement ? currentBidRequest.mediaTypes.video.placement : 1;
439
+ var videoContext = currentBidRequest.mediaTypes.video.context ? currentBidRequest.mediaTypes.video.context : '';
440
+ var videoPlacement = currentBidRequest.mediaTypes.video.placement ? currentBidRequest.mediaTypes.video.placement : null;
441
+ var videoPlcmt = currentBidRequest.mediaTypes.video.plcmt ? currentBidRequest.mediaTypes.video.plcmt : null;
442
+
443
+ if (format == 'inbanner') {
444
+ videoPlacement = 2;
445
+ videoContext = 'In-Banner';
446
+ }
440
447
  requestParams.video_context = videoContext;
441
448
  requestParams.video_placement = videoPlacement;
449
+ requestParams.video_plcmt = videoPlcmt;
442
450
  }
443
451
 
444
452
  return {
@@ -984,6 +984,9 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
984
984
  playbackmethod: bidRequest.mediaTypes.video.playbackmethod,
985
985
  startdelay: bidRequest.mediaTypes.video.startdelay
986
986
  };
987
+ if ('plcmt' in bidRequest.mediaTypes.video) {
988
+ video.plcmt = bidRequest.mediaTypes.video.plcmt;
989
+ }
987
990
  const paramsVideo = bidRequest.params.video;
988
991
  if (paramsVideo !== undefined) {
989
992
  video.skip = video.skip || paramsVideo.skip || 0;
@@ -312,6 +312,11 @@ function buildRequests(validBidRequests, bidderRequest) {
312
312
  data.lt = lt;
313
313
  data.to = to;
314
314
 
315
+ // ADJS-1286 Read id5 id linktype field
316
+ if (userId && userId.id5id && userId.id5id.uid && userId.id5id.ext) {
317
+ data.id5Id = userId.id5id.uid || null
318
+ data.id5IdLinkType = userId.id5id.ext.linkType || null
319
+ }
315
320
  // ADTS-169 add adUnitCode to requests
316
321
  if (adUnitCode) data.aun = adUnitCode;
317
322
 
@@ -92,21 +92,25 @@ function initializeLiveConnect(configParams) {
92
92
 
93
93
  const publisherId = configParams.publisherId || 'any';
94
94
  const identityResolutionConfig = {
95
- source: 'prebid',
96
95
  publisherId: publisherId,
97
96
  requestedAttributes: parseRequestedAttributes(configParams.requestedAttributesOverrides)
98
97
  };
99
98
  if (configParams.url) {
100
99
  identityResolutionConfig.url = configParams.url
101
100
  }
102
- if (configParams.partner) {
103
- identityResolutionConfig.source = configParams.partner
104
- }
105
101
  if (configParams.ajaxTimeout) {
106
102
  identityResolutionConfig.ajaxTimeout = configParams.ajaxTimeout;
107
103
  }
108
104
 
109
105
  const liveConnectConfig = parseLiveIntentCollectorConfig(configParams.liCollectConfig);
106
+
107
+ if (!liveConnectConfig.appId && configParams.distributorId) {
108
+ liveConnectConfig.distributorId = configParams.distributorId;
109
+ identityResolutionConfig.source = configParams.distributorId;
110
+ } else {
111
+ identityResolutionConfig.source = configParams.partner || 'prebid'
112
+ }
113
+
110
114
  liveConnectConfig.wrapperName = 'prebid';
111
115
  liveConnectConfig.identityResolutionConfig = identityResolutionConfig;
112
116
  liveConnectConfig.identifiersToResolve = configParams.identifiersToResolve || [];
@@ -702,6 +702,25 @@ magniteAdapter.onDataDeletionRequest = function () {
702
702
  magniteAdapter.MODULE_INITIALIZED_TIME = Date.now();
703
703
  magniteAdapter.referrerHostname = '';
704
704
 
705
+ const getLatencies = (args, auctionStart) => {
706
+ try {
707
+ const metrics = args.metrics.getMetrics();
708
+ const src = args.src || args.source;
709
+ return {
710
+ total: parseInt(metrics[`adapter.${src}.total`]),
711
+ // If it is array, get slowest
712
+ net: parseInt(Array.isArray(metrics[`adapter.${src}.net`]) ? metrics[`adapter.${src}.net`][metrics[`adapter.${src}.net`].length - 1] : metrics[`adapter.${src}.net`])
713
+ }
714
+ } catch (error) {
715
+ // default to old way if not able to get better ones
716
+ const latency = Date.now() - auctionStart;
717
+ return {
718
+ total: latency,
719
+ net: latency
720
+ }
721
+ }
722
+ }
723
+
705
724
  let browser;
706
725
  magniteAdapter.track = ({ eventType, args }) => {
707
726
  switch (eventType) {
@@ -872,7 +891,9 @@ magniteAdapter.track = ({ eventType, args }) => {
872
891
  code: 'request-error'
873
892
  };
874
893
  }
875
- bid.clientLatencyMillis = args.timeToRespond || Date.now() - cache.auctions[args.auctionId].auction.auctionStart;
894
+ const latencies = getLatencies(args, auctionEntry.auctionStart);
895
+ bid.clientLatencyMillis = latencies.total;
896
+ bid.httpLatencyMillis = latencies.net;
876
897
  bid.bidResponse = parseBidResponse(args, bid.bidResponse);
877
898
 
878
899
  // if pbs gave us back a bidId, we need to use it and update our bidId to PBA
@@ -904,8 +925,10 @@ magniteAdapter.track = ({ eventType, args }) => {
904
925
  }
905
926
 
906
927
  // set client latency if not done yet
907
- if (!cachedBid.clientLatencyMillis) {
908
- cachedBid.clientLatencyMillis = Date.now() - cache.auctions[args.auctionId].auction.auctionStart;
928
+ if (!cachedBid.clientLatencyMillis || !cachedBid.httpLatencyMillis) {
929
+ const latencies = getLatencies(bid, deepAccess(cache, `auctions.${args.auctionId}.auction.auctionStart`));
930
+ cachedBid.clientLatencyMillis = cachedBid.clientLatencyMillis || latencies.total;
931
+ cachedBid.httpLatencyMillis = cachedBid.httpLatencyMillis || latencies.net;
909
932
  }
910
933
  });
911
934
  break;
@@ -307,6 +307,16 @@ function generateBidParameters(bid, bidderRequest) {
307
307
  bidObject.placementId = placementId;
308
308
  }
309
309
 
310
+ const sua = deepAccess(bid, `ortb2.device.sua`);
311
+ if (sua) {
312
+ bidObject.sua = sua;
313
+ }
314
+
315
+ const coppa = deepAccess(bid, `ortb2.regs.coppa`)
316
+ if (coppa) {
317
+ bidObject.coppa = 1;
318
+ }
319
+
310
320
  if (mediaType === VIDEO) {
311
321
  const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
312
322
  let playbackMethodValue;
@@ -348,9 +358,9 @@ function generateBidParameters(bid, bidderRequest) {
348
358
  bidObject.linearity = linearity;
349
359
  }
350
360
 
351
- const coppa = deepAccess(bid, `ortb2.regs.coppa`);
352
- if (coppa) {
353
- bidObject.coppa = 1;
361
+ const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
362
+ if (plcmt) {
363
+ bidObject.plcmt = plcmt;
354
364
  }
355
365
  }
356
366
 
@@ -201,6 +201,12 @@ function updateOrtbConfig(bidder, currConfig, segmentIDs, sspSegmentIDs, transfo
201
201
  logger.logInfo(`Extending ortb2.user.ext.data with "${PERMUTIVE_CUSTOM_COHORTS_KEYWORD}"`, customCohortsData)
202
202
  }
203
203
 
204
+ // Set site extensions
205
+ if (segmentIDs.length > 0) {
206
+ deepSetValue(ortbConfig, `ortb2.site.ext.permutive.${PERMUTIVE_STANDARD_KEYWORD}`, segmentIDs)
207
+ logger.logInfo(`Extending ortb2.site.ext.permutive with "${PERMUTIVE_STANDARD_KEYWORD}"`, segmentIDs)
208
+ }
209
+
204
210
  logger.logInfo(`Updated ortb2 config`, { bidder, config: ortbConfig })
205
211
  return ortbConfig
206
212
  }
@@ -230,12 +236,11 @@ function setSegments (reqBidsConfigObj, moduleConfig, segmentData) {
230
236
  }
231
237
  const acEnabled = isAcEnabled(moduleConfig, bidder)
232
238
  const customFn = getCustomBidderFn(moduleConfig, bidder)
233
- const defaultFn = getDefaultBidderFn(bidder)
234
239
 
235
240
  if (customFn) {
236
- customFn(bid, segmentData, acEnabled, utils, defaultFn)
237
- } else if (defaultFn) {
238
- defaultFn(bid, segmentData, acEnabled)
241
+ // For backwards compatibility we pass an identity function to any custom bidder function set by a publisher
242
+ const bidIdentity = (bid) => bid
243
+ customFn(bid, segmentData, acEnabled, utils, bidIdentity)
239
244
  }
240
245
  })
241
246
  })
@@ -263,40 +268,6 @@ function getCustomBidderFn (moduleConfig, bidder) {
263
268
  }
264
269
  }
265
270
 
266
- /**
267
- * Returns a function that receives a `bid` object, a `data` object and a `acEnabled` boolean
268
- * and which will set the right segment targeting keys for `bid` based on `data` and `acEnabled`
269
- * @param {string} bidder - Bidder name
270
- * @return {Object} Bidder function
271
- */
272
- function getDefaultBidderFn (bidder) {
273
- const isPStandardTargetingEnabled = (data, acEnabled) => {
274
- return (acEnabled && data.ac && data.ac.length) || (data.ssp && data.ssp.cohorts && data.ssp.cohorts.length)
275
- }
276
- const pStandardTargeting = (data, acEnabled) => {
277
- const ac = (acEnabled) ? (data.ac ?? []) : []
278
- const ssp = data?.ssp?.cohorts ?? []
279
- return [...new Set([...ac, ...ssp])]
280
- }
281
- const bidderMap = {
282
- ozone: function (bid, data, acEnabled) {
283
- if (isPStandardTargetingEnabled(data, acEnabled)) {
284
- const segments = pStandardTargeting(data, acEnabled)
285
- deepSetValue(bid, 'params.customData.0.targeting.p_standard', segments)
286
- }
287
-
288
- return bid
289
- }
290
- }
291
-
292
- // On no default bidder just return the same bid as passed in
293
- function bidIdentity(bid) {
294
- return bid
295
- }
296
-
297
- return bidderMap[bidder] || bidIdentity
298
- }
299
-
300
271
  /**
301
272
  * Check whether ac is enabled for bidder
302
273
  * @param {Object} moduleConfig - Module configuration
@@ -472,7 +472,13 @@ export function PrebidServer() {
472
472
  bidRequests.forEach(bidderRequest => events.emit(CONSTANTS.EVENTS.BIDDER_DONE, bidderRequest));
473
473
  }
474
474
  if (shouldEmitNonbids(s2sBidRequest.s2sConfig, response)) {
475
- emitNonBids(response.ext.seatnonbid, bidRequests[0].auctionId);
475
+ events.emit(CONSTANTS.EVENTS.SEAT_NON_BID, {
476
+ seatnonbid: response.ext.seatnonbid,
477
+ auctionId: bidRequests[0].auctionId,
478
+ requestedBidders,
479
+ response,
480
+ adapterMetrics
481
+ });
476
482
  }
477
483
  done();
478
484
  doClientSideSyncs(requestedBidders, gdprConsent, uspConsent, gppConsent);
@@ -578,13 +584,6 @@ function shouldEmitNonbids(s2sConfig, response) {
578
584
  return s2sConfig?.extPrebid?.returnallbidstatus && response?.ext?.seatnonbid;
579
585
  }
580
586
 
581
- function emitNonBids(seatnonbid, auctionId) {
582
- events.emit(CONSTANTS.EVENTS.SEAT_NON_BID, {
583
- seatnonbid,
584
- auctionId
585
- });
586
- }
587
-
588
587
  /**
589
588
  * Global setter that sets eids permissions for bidders
590
589
  * This setter is to be used by userId module when included
@@ -51,6 +51,7 @@ const VIDEO_CUSTOM_PARAMS = {
51
51
  'battr': DATA_TYPES.ARRAY,
52
52
  'linearity': DATA_TYPES.NUMBER,
53
53
  'placement': DATA_TYPES.NUMBER,
54
+ 'plcmt': DATA_TYPES.NUMBER,
54
55
  'minbitrate': DATA_TYPES.NUMBER,
55
56
  'maxbitrate': DATA_TYPES.NUMBER,
56
57
  'skip': DATA_TYPES.NUMBER
@@ -320,6 +320,16 @@ function generateBidParameters(bid, bidderRequest) {
320
320
  bidObject.api = api;
321
321
  }
322
322
 
323
+ const sua = deepAccess(bid, `ortb2.device.sua`);
324
+ if (sua) {
325
+ bidObject.sua = sua;
326
+ }
327
+
328
+ const coppa = deepAccess(bid, `ortb2.regs.coppa`)
329
+ if (coppa) {
330
+ bidObject.coppa = 1;
331
+ }
332
+
323
333
  if (mediaType === VIDEO) {
324
334
  const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
325
335
  let playbackMethodValue;
@@ -366,9 +376,9 @@ function generateBidParameters(bid, bidderRequest) {
366
376
  bidObject.protocols = protocols;
367
377
  }
368
378
 
369
- const coppa = deepAccess(bid, 'ortb2.regs.coppa')
370
- if (coppa) {
371
- bidObject.coppa = 1;
379
+ const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
380
+ if (plcmt) {
381
+ bidObject.plcmt = plcmt;
372
382
  }
373
383
  }
374
384
 
@@ -65,3 +65,27 @@ Please reach out to pmp@rtbhouse.com to receive your own
65
65
  }
66
66
  ];
67
67
  ```
68
+
69
+ # Protected Audience API (FLEDGE) support
70
+ There’s an option to receive demand for Protected Audience API (FLEDGE/PAAPI)
71
+ ads using RTB House bid adapter.
72
+ Prebid’s [fledgeForGpt](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html)
73
+ module and Google Ad Manager is currently required.
74
+
75
+ The following steps should be taken to setup Protected Audience for RTB House:
76
+
77
+ 1. Reach out to your RTB House representative for setup coordination.
78
+
79
+ 2. Build and enable FLEDGE module as described in
80
+ [fledgeForGpt](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html)
81
+ module documentation.
82
+
83
+ a. Make sure to enable RTB House bidder to participate in FLEDGE. If there are any other bidders to be allowed for that, add them to the **bidders** array:
84
+ ```javascript
85
+ pbjs.setBidderConfig({
86
+ bidders: ["rtbhouse"],
87
+ config: {
88
+ fledgeEnabled: true
89
+ }
90
+ });
91
+ ```
@@ -207,11 +207,15 @@ export const converter = ortbConverter({
207
207
  const bidResponse = buildBidResponse(bid, context);
208
208
  bidResponse.meta.mediaType = deepAccess(bid, 'ext.prebid.type');
209
209
  const {bidRequest} = context;
210
+
211
+ let [parseSizeWidth, parseSizeHeight] = bidRequest.mediaTypes.video?.context === 'outstream' ? parseSizes(bidRequest, VIDEO) : [undefined, undefined];
212
+
213
+ bidResponse.width = bid.w || parseSizeWidth || bidResponse.playerWidth;
214
+ bidResponse.height = bid.h || parseSizeHeight || bidResponse.playerHeight;
215
+
210
216
  if (bidResponse.mediaType === VIDEO && bidRequest.mediaTypes.video.context === 'outstream') {
211
217
  bidResponse.renderer = outstreamRenderer(bidResponse);
212
218
  }
213
- bidResponse.width = bid.w || deepAccess(bidRequest, 'mediaTypes.video.w') || deepAccess(bidRequest, 'params.video.playerWidth');
214
- bidResponse.height = bid.h || deepAccess(bidRequest, 'mediaTypes.video.h') || deepAccess(bidRequest, 'params.video.playerHeight');
215
219
 
216
220
  if (deepAccess(bid, 'ext.bidder.rp.advid')) {
217
221
  deepSetValue(bidResponse, 'meta.advertiserId', bid.ext.bidder.rp.advid);