prebid.js 7.35.0 → 7.37.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 (229) hide show
  1. package/.devcontainer/Dockerfile +2 -0
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admaruBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/aidemBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/aolBidAdapter.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/audiencerunBidAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bluebillywigBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/brightcomBidAdapter.js +1 -1
  28. package/dist/brightcomSSPBidAdapter.js +1 -0
  29. package/dist/carodaBidAdapter.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectadBidAdapter.js +1 -1
  33. package/dist/consumableBidAdapter.js +1 -1
  34. package/dist/conversantBidAdapter.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/cwireBidAdapter.js +1 -1
  38. package/dist/dependencies.json +3 -0
  39. package/dist/discoveryBidAdapter.js +1 -1
  40. package/dist/dspxBidAdapter.js +1 -1
  41. package/dist/eplanningBidAdapter.js +1 -1
  42. package/dist/feedadBidAdapter.js +1 -1
  43. package/dist/finativeBidAdapter.js +1 -1
  44. package/dist/freewheel-sspBidAdapter.js +1 -1
  45. package/dist/glimpseBidAdapter.js +1 -1
  46. package/dist/gmosspBidAdapter.js +1 -1
  47. package/dist/goldbachBidAdapter.js +1 -1
  48. package/dist/gridBidAdapter.js +1 -1
  49. package/dist/gridNMBidAdapter.js +1 -1
  50. package/dist/gumgumBidAdapter.js +1 -1
  51. package/dist/h12mediaBidAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/impactifyBidAdapter.js +1 -1
  54. package/dist/improvedigitalBidAdapter.js +1 -1
  55. package/dist/incrxBidAdapter.js +1 -1
  56. package/dist/inmarBidAdapter.js +1 -1
  57. package/dist/insticatorBidAdapter.js +1 -1
  58. package/dist/ixBidAdapter.js +1 -1
  59. package/dist/jixieBidAdapter.js +1 -1
  60. package/dist/justpremiumBidAdapter.js +1 -1
  61. package/dist/konduitAnalyticsAdapter.js +1 -1
  62. package/dist/kueezBidAdapter.js +1 -1
  63. package/dist/kueezRtbBidAdapter.js +1 -1
  64. package/dist/lassoBidAdapter.js +1 -1
  65. package/dist/lifestreetBidAdapter.js +1 -1
  66. package/dist/limelightDigitalBidAdapter.js +1 -1
  67. package/dist/liveIntentIdSystem.js +1 -1
  68. package/dist/livewrappedBidAdapter.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/mediagoBidAdapter.js +1 -1
  77. package/dist/mediakeysBidAdapter.js +1 -1
  78. package/dist/mediasquareBidAdapter.js +1 -1
  79. package/dist/mgidBidAdapter.js +1 -1
  80. package/dist/minutemediaBidAdapter.js +1 -1
  81. package/dist/minutemediaplusBidAdapter.js +1 -0
  82. package/dist/neuwoRtdProvider.js +1 -0
  83. package/dist/nextMillenniumBidAdapter.js +1 -1
  84. package/dist/nexx360BidAdapter.js +1 -1
  85. package/dist/not-for-prod/prebid.js +141 -137
  86. package/dist/oguryBidAdapter.js +1 -1
  87. package/dist/onetagBidAdapter.js +1 -1
  88. package/dist/ooloAnalyticsAdapter.js +1 -1
  89. package/dist/outbrainBidAdapter.js +1 -1
  90. package/dist/parrableIdSystem.js +1 -1
  91. package/dist/pixfutureBidAdapter.js +1 -1
  92. package/dist/prebid-core.js +1 -1
  93. package/dist/prebidServerBidAdapter.js +1 -1
  94. package/dist/proxistoreBidAdapter.js +1 -1
  95. package/dist/publinkIdSystem.js +1 -1
  96. package/dist/pubmaticBidAdapter.js +1 -1
  97. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  98. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  99. package/dist/pxyzBidAdapter.js +1 -1
  100. package/dist/quantcastBidAdapter.js +1 -1
  101. package/dist/readpeakBidAdapter.js +1 -1
  102. package/dist/relaidoBidAdapter.js +1 -1
  103. package/dist/rhythmoneBidAdapter.js +1 -1
  104. package/dist/riseBidAdapter.js +1 -1
  105. package/dist/rubiconAnalyticsAdapter.js +1 -1
  106. package/dist/rubiconBidAdapter.js +1 -1
  107. package/dist/scatteredBidAdapter.js +1 -0
  108. package/dist/seedingAllianceBidAdapter.js +1 -1
  109. package/dist/seedtagBidAdapter.js +1 -1
  110. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  111. package/dist/sharethroughBidAdapter.js +1 -1
  112. package/dist/shinezBidAdapter.js +1 -1
  113. package/dist/sirdataRtdProvider.js +1 -1
  114. package/dist/smaatoBidAdapter.js +1 -1
  115. package/dist/smartadserverBidAdapter.js +1 -1
  116. package/dist/smartxBidAdapter.js +1 -1
  117. package/dist/smilewantedBidAdapter.js +1 -1
  118. package/dist/sonobiBidAdapter.js +1 -1
  119. package/dist/sovrnAnalyticsAdapter.js +1 -1
  120. package/dist/sovrnBidAdapter.js +1 -1
  121. package/dist/sspBCBidAdapter.js +1 -1
  122. package/dist/sublimeBidAdapter.js +1 -1
  123. package/dist/synacormediaBidAdapter.js +1 -1
  124. package/dist/targetVideoBidAdapter.js +1 -1
  125. package/dist/teadsBidAdapter.js +1 -1
  126. package/dist/trionBidAdapter.js +1 -1
  127. package/dist/tripleliftBidAdapter.js +1 -1
  128. package/dist/ttdBidAdapter.js +1 -1
  129. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  130. package/dist/uid2IdSystem.js +1 -1
  131. package/dist/underdogmediaBidAdapter.js +1 -1
  132. package/dist/undertoneBidAdapter.js +1 -1
  133. package/dist/userId.js +1 -1
  134. package/dist/vidazooBidAdapter.js +1 -1
  135. package/dist/videobyteBidAdapter.js +1 -1
  136. package/dist/visxBidAdapter.js +1 -1
  137. package/dist/vuukleBidAdapter.js +1 -1
  138. package/dist/widespaceBidAdapter.js +1 -1
  139. package/dist/winrBidAdapter.js +1 -1
  140. package/dist/yahoosspBidAdapter.js +1 -1
  141. package/dist/yieldmoBidAdapter.js +1 -1
  142. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  143. package/integrationExamples/gpt/neuwoRtdProvider_example.html +190 -0
  144. package/modules/33acrossBidAdapter.js +13 -4
  145. package/modules/adagioBidAdapter.js +14 -14
  146. package/modules/adagioBidAdapter.md +3 -1
  147. package/modules/admaruBidAdapter.js +19 -1
  148. package/modules/aidemBidAdapter.js +90 -65
  149. package/modules/aidemBidAdapter.md +10 -7
  150. package/modules/ajaBidAdapter.js +6 -1
  151. package/modules/amxIdSystem.md +2 -10
  152. package/modules/aolBidAdapter.js +1 -1
  153. package/modules/appnexusBidAdapter.js +45 -48
  154. package/modules/brightcomBidAdapter.js +1 -0
  155. package/modules/brightcomSSPBidAdapter.js +323 -0
  156. package/modules/brightcomSSPBidAdapter.md +46 -0
  157. package/modules/criteoBidAdapter.js +4 -5
  158. package/modules/cwireBidAdapter.md +9 -3
  159. package/modules/discoveryBidAdapter.js +22 -12
  160. package/modules/feedadBidAdapter.js +35 -15
  161. package/modules/fpdModule/index.md +5 -2
  162. package/modules/freewheel-sspBidAdapter.js +5 -1
  163. package/modules/gridBidAdapter.js +3 -1
  164. package/modules/incrxBidAdapter.js +2 -0
  165. package/modules/ixBidAdapter.js +318 -175
  166. package/modules/kueezRtbBidAdapter.js +54 -20
  167. package/modules/limelightDigitalBidAdapter.js +6 -1
  168. package/modules/limelightDigitalBidAdapter.md +12 -2
  169. package/modules/liveIntentIdSystem.js +1 -1
  170. package/modules/livewrappedBidAdapter.js +28 -16
  171. package/modules/mediagoBidAdapter.js +22 -17
  172. package/modules/minutemediaplusBidAdapter.js +291 -0
  173. package/modules/minutemediaplusBidAdapter.md +35 -0
  174. package/modules/neuwoRtdProvider.js +171 -0
  175. package/modules/neuwoRtdProvider.md +40 -0
  176. package/modules/nextMillenniumBidAdapter.js +9 -1
  177. package/modules/nexx360BidAdapter.js +1 -1
  178. package/modules/prebidServerBidAdapter/ortbConverter.js +6 -0
  179. package/modules/proxistoreBidAdapter.js +2 -2
  180. package/modules/pubmaticBidAdapter.js +4 -0
  181. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  182. package/modules/scatteredBidAdapter.js +72 -0
  183. package/modules/scatteredBidAdapter.md +36 -0
  184. package/modules/sirdataRtdProvider.js +262 -284
  185. package/modules/smartxBidAdapter.js +2 -0
  186. package/modules/smilewantedBidAdapter.js +5 -0
  187. package/modules/sonobiBidAdapter.js +1 -10
  188. package/modules/topicsFpdModule.md +62 -0
  189. package/modules/tripleliftBidAdapter.js +4 -0
  190. package/modules/userId/eids.js +1 -1
  191. package/modules/vidazooBidAdapter.js +3 -1
  192. package/modules/yahoosspBidAdapter.js +1 -1
  193. package/modules/yieldmoBidAdapter.js +1 -0
  194. package/package.json +2 -2
  195. package/src/adapterManager.js +30 -14
  196. package/src/utils.js +1 -1
  197. package/test/spec/modules/33acrossBidAdapter_spec.js +51 -18
  198. package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
  199. package/test/spec/modules/admaruBidAdapter_spec.js +48 -0
  200. package/test/spec/modules/aidemBidAdapter_spec.js +77 -10
  201. package/test/spec/modules/ajaBidAdapter_spec.js +21 -1
  202. package/test/spec/modules/aolBidAdapter_spec.js +2 -2
  203. package/test/spec/modules/appnexusBidAdapter_spec.js +123 -16
  204. package/test/spec/modules/brightcomSSPBidAdapter_spec.js +411 -0
  205. package/test/spec/modules/criteoBidAdapter_spec.js +24 -1
  206. package/test/spec/modules/eids_spec.js +1 -1
  207. package/test/spec/modules/feedadBidAdapter_spec.js +47 -77
  208. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +1 -1
  209. package/test/spec/modules/incrxBidAdapter_spec.js +4 -0
  210. package/test/spec/modules/ixBidAdapter_spec.js +24 -54
  211. package/test/spec/modules/kueezRtbBidAdapter_spec.js +63 -22
  212. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +35 -5
  213. package/test/spec/modules/livewrappedBidAdapter_spec.js +267 -2
  214. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +519 -0
  215. package/test/spec/modules/neuwoRtdProvider_spec.js +123 -0
  216. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +11 -0
  217. package/test/spec/modules/prebidServerBidAdapter_spec.js +56 -0
  218. package/test/spec/modules/proxistoreBidAdapter_spec.js +2 -2
  219. package/test/spec/modules/pubmaticBidAdapter_spec.js +15 -0
  220. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +3 -1
  221. package/test/spec/modules/scatteredBidAdapter_spec.js +210 -0
  222. package/test/spec/modules/sirdataRtdProvider_spec.js +116 -22
  223. package/test/spec/modules/smilewantedBidAdapter_spec.js +54 -3
  224. package/test/spec/modules/sonobiBidAdapter_spec.js +3 -25
  225. package/test/spec/modules/tripleliftBidAdapter_spec.js +9 -2
  226. package/test/spec/modules/userId_spec.js +1 -1
  227. package/test/spec/modules/vidazooBidAdapter_spec.js +4 -1
  228. package/test/spec/modules/yahoosspBidAdapter_spec.js +1 -1
  229. package/test/spec/unit/core/adapterManager_spec.js +147 -0
@@ -44,7 +44,7 @@ const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid';
44
44
  const VIDEO_TARGETING = ['id', 'minduration', 'maxduration',
45
45
  'skippable', 'playback_method', 'frameworks', 'context', 'skipoffset'];
46
46
  const VIDEO_RTB_TARGETING = ['minduration', 'maxduration', 'skip', 'skipafter', 'playbackmethod', 'api', 'startdelay'];
47
- const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
47
+ const USER_PARAMS = ['age', 'externalUid', 'external_uid', 'segments', 'gender', 'dnt', 'language'];
48
48
  const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
49
49
  const DEBUG_PARAMS = ['enabled', 'dongle', 'member_id', 'debug_timeout'];
50
50
  const DEBUG_QUERY_PARAM_MAP = {
@@ -120,7 +120,9 @@ export const spec = {
120
120
  * @return boolean True if this is a valid bid, and false otherwise.
121
121
  */
122
122
  isBidRequestValid: function (bid) {
123
- return !!(bid.params.placementId || (bid.params.member && bid.params.invCode));
123
+ return !!(
124
+ (bid.params.placementId || bid.params.placement_id) ||
125
+ (bid.params.member && (bid.params.invCode || bid.params.inv_code)));
124
126
  },
125
127
 
126
128
  /**
@@ -343,20 +345,18 @@ export const spec = {
343
345
 
344
346
  if (bidRequests[0].userId) {
345
347
  let eids = [];
346
-
347
- addUserId(eids, deepAccess(bidRequests[0], `userId.criteoId`), 'criteo.com', null);
348
- addUserId(eids, deepAccess(bidRequests[0], `userId.netId`), 'netid.de', null);
349
- addUserId(eids, deepAccess(bidRequests[0], `userId.idl_env`), 'liveramp.com', null);
350
- addUserId(eids, deepAccess(bidRequests[0], `userId.tdid`), 'adserver.org', 'TDID');
351
- addUserId(eids, deepAccess(bidRequests[0], `userId.uid2.id`), 'uidapi.com', 'UID2');
352
- if (bidRequests[0].userId.pubProvidedId) {
353
- bidRequests[0].userId.pubProvidedId.forEach(ppId => {
354
- ppId.uids.forEach(uid => {
355
- eids.push({ source: ppId.source, id: uid.id });
356
- });
348
+ bidRequests[0].userIdAsEids.forEach(eid => {
349
+ if (!eid || !eid.uids || eid.uids.length < 1) { return; }
350
+ eid.uids.forEach(uid => {
351
+ let tmp = {'source': eid.source, 'id': uid.id};
352
+ if (eid.source == 'adserver.org') {
353
+ tmp.rti_partner = 'TDID';
354
+ } else if (eid.source == 'uidapi.com') {
355
+ tmp.rti_partner = 'UID2';
356
+ }
357
+ eids.push(tmp);
357
358
  });
358
- }
359
-
359
+ });
360
360
  if (eids.length) {
361
361
  payload.eids = eids;
362
362
  }
@@ -484,9 +484,6 @@ export const spec = {
484
484
  }, params);
485
485
 
486
486
  if (isOpenRtb) {
487
- params.use_pmt_rule = (typeof params.usePaymentRule === 'boolean') ? params.usePaymentRule : false;
488
- if (params.usePaymentRule) { delete params.usePaymentRule; }
489
-
490
487
  if (isPopulatedArray(params.keywords)) {
491
488
  params.keywords.forEach(deleteValues);
492
489
  }
@@ -498,6 +495,9 @@ export const spec = {
498
495
  delete params[paramKey];
499
496
  }
500
497
  });
498
+
499
+ params.use_pmt_rule = (typeof params.use_payment_rule === 'boolean') ? params.use_payment_rule : false;
500
+ if (params.use_payment_rule) { delete params.use_payment_rule; }
501
501
  }
502
502
 
503
503
  return params;
@@ -771,17 +771,25 @@ function newBid(serverBid, rtbBid, bidderRequest) {
771
771
 
772
772
  function bidToTag(bid) {
773
773
  const tag = {};
774
+ Object.keys(bid.params).forEach(paramKey => {
775
+ let convertedKey = convertCamelToUnderscore(paramKey);
776
+ if (convertedKey !== paramKey) {
777
+ bid.params[convertedKey] = bid.params[paramKey];
778
+ delete bid.params[paramKey];
779
+ }
780
+ });
774
781
  tag.sizes = transformSizes(bid.sizes);
775
782
  tag.primary_size = tag.sizes[0];
776
783
  tag.ad_types = [];
777
784
  tag.uuid = bid.bidId;
778
- if (bid.params.placementId) {
779
- tag.id = parseInt(bid.params.placementId, 10);
785
+ if (bid.params.placement_id) {
786
+ tag.id = parseInt(bid.params.placement_id, 10);
780
787
  } else {
781
- tag.code = bid.params.invCode;
788
+ tag.code = bid.params.inv_code;
782
789
  }
783
- tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false;
784
- tag.use_pmt_rule = bid.params.usePaymentRule || false;
790
+ tag.allow_smaller_sizes = bid.params.allow_smaller_sizes || false;
791
+ tag.use_pmt_rule = (typeof bid.params.use_payment_rule === 'boolean') ? bid.params.use_payment_rule
792
+ : (typeof bid.params.use_pmt_rule === 'boolean') ? bid.params.use_pmt_rule : false;
785
793
  tag.prebid = true;
786
794
  tag.disable_psa = true;
787
795
  let bidFloor = getBidFloor(bid);
@@ -798,26 +806,26 @@ function bidToTag(bid) {
798
806
  tag.position = (mediaTypePos === 3) ? 2 : mediaTypePos;
799
807
  }
800
808
  }
801
- if (bid.params.trafficSourceCode) {
802
- tag.traffic_source_code = bid.params.trafficSourceCode;
809
+ if (bid.params.traffic_source_code) {
810
+ tag.traffic_source_code = bid.params.traffic_source_code;
803
811
  }
804
- if (bid.params.privateSizes) {
805
- tag.private_sizes = transformSizes(bid.params.privateSizes);
812
+ if (bid.params.private_sizes) {
813
+ tag.private_sizes = transformSizes(bid.params.private_sizes);
806
814
  }
807
- if (bid.params.supplyType) {
808
- tag.supply_type = bid.params.supplyType;
815
+ if (bid.params.supply_type) {
816
+ tag.supply_type = bid.params.supply_type;
809
817
  }
810
- if (bid.params.pubClick) {
811
- tag.pubclick = bid.params.pubClick;
818
+ if (bid.params.pub_click) {
819
+ tag.pubclick = bid.params.pub_click;
812
820
  }
813
- if (bid.params.extInvCode) {
814
- tag.ext_inv_code = bid.params.extInvCode;
821
+ if (bid.params.ext_inv_code) {
822
+ tag.ext_inv_code = bid.params.ext_inv_code;
815
823
  }
816
- if (bid.params.publisherId) {
817
- tag.publisher_id = parseInt(bid.params.publisherId, 10);
824
+ if (bid.params.publisher_id) {
825
+ tag.publisher_id = parseInt(bid.params.publisher_id, 10);
818
826
  }
819
- if (bid.params.externalImpId) {
820
- tag.external_imp_id = bid.params.externalImpId;
827
+ if (bid.params.external_imp_id) {
828
+ tag.external_imp_id = bid.params.external_imp_id;
821
829
  }
822
830
 
823
831
  let ortb2ImpKwStr = deepAccess(bid, 'ortb2Imp.ext.data.keywords');
@@ -1218,17 +1226,6 @@ function parseMediaType(rtbBid) {
1218
1226
  }
1219
1227
  }
1220
1228
 
1221
- function addUserId(eids, id, source, rti) {
1222
- if (id) {
1223
- if (rti) {
1224
- eids.push({ source, id, rti_partner: rti });
1225
- } else {
1226
- eids.push({ source, id });
1227
- }
1228
- }
1229
- return eids;
1230
- }
1231
-
1232
1229
  function getBidFloor(bid) {
1233
1230
  if (!isFn(bid.getFloor)) {
1234
1231
  return (bid.params.reserve) ? bid.params.reserve : null;
@@ -9,6 +9,7 @@ const URL = 'https://brightcombid.marphezis.com/hb';
9
9
  export const spec = {
10
10
  code: BIDDER_CODE,
11
11
  supportedMediaTypes: [BANNER],
12
+ gvlid: 883,
12
13
  isBidRequestValid,
13
14
  buildRequests,
14
15
  interpretResponse,
@@ -0,0 +1,323 @@
1
+ import {
2
+ getBidIdParameter,
3
+ isArray,
4
+ getWindowTop,
5
+ getUniqueIdentifierStr,
6
+ deepSetValue,
7
+ logError,
8
+ logWarn,
9
+ createTrackPixelHtml,
10
+ getWindowSelf,
11
+ isFn,
12
+ isPlainObject,
13
+ } from '../src/utils.js';
14
+ import {registerBidder} from '../src/adapters/bidderFactory.js';
15
+ import {BANNER} from '../src/mediaTypes.js';
16
+ import {config} from '../src/config.js';
17
+ import {ajax} from '../src/ajax.js';
18
+
19
+ const BIDDER_CODE = 'bcmssp';
20
+ const URL = 'https://rt.marphezis.com/hb';
21
+ const TRACK_EVENT_URL = 'https://rt.marphezis.com/prebid'
22
+
23
+ export const spec = {
24
+ code: BIDDER_CODE,
25
+ gvlid: 883,
26
+ supportedMediaTypes: [BANNER],
27
+ isBidRequestValid,
28
+ buildRequests,
29
+ interpretResponse,
30
+ onBidderError,
31
+ onTimeout,
32
+ onBidWon,
33
+ getUserSyncs,
34
+ };
35
+
36
+ function buildRequests(bidReqs, bidderRequest) {
37
+ try {
38
+ const impressions = bidReqs.map(bid => {
39
+ let bidSizes = bid?.mediaTypes?.banner?.sizes || bid.sizes;
40
+ bidSizes = ((isArray(bidSizes) && isArray(bidSizes[0])) ? bidSizes : [bidSizes]);
41
+ bidSizes = bidSizes.filter(size => isArray(size));
42
+ const processedSizes = bidSizes.map(size => ({w: parseInt(size[0], 10), h: parseInt(size[1], 10)}));
43
+
44
+ const element = document.getElementById(bid.adUnitCode);
45
+ const minSize = _getMinSize(processedSizes);
46
+ const viewabilityAmount = _isViewabilityMeasurable(element) ? _getViewability(element, getWindowTop(), minSize) : 'na';
47
+ const viewabilityAmountRounded = isNaN(viewabilityAmount) ? viewabilityAmount : Math.round(viewabilityAmount);
48
+
49
+ const imp = {
50
+ id: bid.bidId,
51
+ banner: {
52
+ format: processedSizes,
53
+ ext: {
54
+ viewability: viewabilityAmountRounded
55
+ }
56
+ },
57
+ tagid: String(bid.adUnitCode)
58
+ };
59
+
60
+ const bidFloor = _getBidFloor(bid);
61
+
62
+ if (bidFloor) {
63
+ imp.bidfloor = bidFloor;
64
+ }
65
+
66
+ return imp;
67
+ })
68
+
69
+ const referrer = bidderRequest?.refererInfo?.page || '';
70
+ const publisherId = getBidIdParameter('publisherId', bidReqs[0].params);
71
+
72
+ const payload = {
73
+ id: getUniqueIdentifierStr(),
74
+ imp: impressions,
75
+ site: {
76
+ domain: bidderRequest?.refererInfo?.domain || '',
77
+ page: referrer,
78
+ publisher: {
79
+ id: publisherId
80
+ }
81
+ },
82
+ device: {
83
+ devicetype: _getDeviceType(),
84
+ w: screen.width,
85
+ h: screen.height
86
+ },
87
+ tmax: config.getConfig('bidderTimeout')
88
+ };
89
+
90
+ if (bidderRequest?.gdprConsent) {
91
+ deepSetValue(payload, 'regs.ext.gdpr', +bidderRequest.gdprConsent.gdprApplies);
92
+ deepSetValue(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
93
+ }
94
+
95
+ if (bidderRequest?.uspConsent) {
96
+ deepSetValue(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent);
97
+ }
98
+
99
+ if (config.getConfig('coppa') === true) {
100
+ deepSetValue(payload, 'regs.coppa', 1);
101
+ }
102
+
103
+ if (bidReqs?.[0]?.schain) {
104
+ deepSetValue(payload, 'source.ext.schain', bidReqs[0].schain)
105
+ }
106
+
107
+ if (bidReqs?.[0]?.userIdAsEids) {
108
+ deepSetValue(payload, 'user.ext.eids', bidReqs[0].userIdAsEids || [])
109
+ }
110
+
111
+ if (bidReqs?.[0].userId) {
112
+ deepSetValue(payload, 'user.ext.ids', bidReqs[0].userId || [])
113
+ }
114
+
115
+ return {
116
+ method: 'POST',
117
+ url: URL,
118
+ data: JSON.stringify(payload),
119
+ options: {contentType: 'text/plain', withCredentials: false}
120
+ };
121
+ } catch (e) {
122
+ logError(e, {bidReqs, bidderRequest});
123
+ }
124
+ }
125
+
126
+ function isBidRequestValid(bid) {
127
+ if (bid.bidder !== BIDDER_CODE || !bid.params || !bid.params.publisherId) {
128
+ return false;
129
+ }
130
+
131
+ return true;
132
+ }
133
+
134
+ function interpretResponse(serverResponse) {
135
+ let response = [];
136
+ if (!serverResponse.body || typeof serverResponse.body != 'object') {
137
+ logWarn('Brightcom server returned empty/non-json response: ' + JSON.stringify(serverResponse.body));
138
+ return response;
139
+ }
140
+
141
+ const {body: {id, seatbid}} = serverResponse;
142
+
143
+ try {
144
+ if (id && seatbid && seatbid.length > 0 && seatbid[0].bid && seatbid[0].bid.length > 0) {
145
+ response = seatbid[0].bid.map(bid => {
146
+ return {
147
+ requestId: bid.impid,
148
+ cpm: parseFloat(bid.price),
149
+ width: parseInt(bid.w),
150
+ height: parseInt(bid.h),
151
+ creativeId: bid.crid || bid.id,
152
+ currency: 'USD',
153
+ netRevenue: true,
154
+ mediaType: BANNER,
155
+ ad: _getAdMarkup(bid),
156
+ ttl: 60,
157
+ meta: {
158
+ advertiserDomains: bid?.adomain || []
159
+ }
160
+ };
161
+ });
162
+ }
163
+ } catch (e) {
164
+ logError(e, {id, seatbid});
165
+ }
166
+
167
+ return response;
168
+ }
169
+
170
+ // Don't do user sync for now
171
+ function getUserSyncs(syncOptions, responses, gdprConsent) {
172
+ return [];
173
+ }
174
+
175
+ function onTimeout(timeoutData) {
176
+ if (timeoutData === null) {
177
+ return;
178
+ }
179
+
180
+ _trackEvent('timeout', timeoutData);
181
+ }
182
+
183
+ function onBidderError(errorData) {
184
+ if (errorData === null || !errorData.bidderRequest) {
185
+ return;
186
+ }
187
+
188
+ _trackEvent('error', errorData.bidderRequest)
189
+ }
190
+
191
+ function onBidWon(bid) {
192
+ if (bid === null) {
193
+ return;
194
+ }
195
+
196
+ _trackEvent('bidwon', bid)
197
+ }
198
+
199
+ function _trackEvent(endpoint, data) {
200
+ ajax(`${TRACK_EVENT_URL}/${endpoint}`, null, JSON.stringify(data), {
201
+ method: 'POST',
202
+ withCredentials: false
203
+ });
204
+ }
205
+
206
+ function _isMobile() {
207
+ return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
208
+ }
209
+
210
+ function _isConnectedTV() {
211
+ return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
212
+ }
213
+
214
+ function _getDeviceType() {
215
+ return _isMobile() ? 1 : _isConnectedTV() ? 3 : 2;
216
+ }
217
+
218
+ function _getAdMarkup(bid) {
219
+ let adm = bid.adm;
220
+ if ('nurl' in bid) {
221
+ adm += createTrackPixelHtml(bid.nurl);
222
+ }
223
+ return adm;
224
+ }
225
+
226
+ function _isViewabilityMeasurable(element) {
227
+ return !_isIframe() && element !== null;
228
+ }
229
+
230
+ function _getViewability(element, topWin, {w, h} = {}) {
231
+ return getWindowTop().document.visibilityState === 'visible' ? _getPercentInView(element, topWin, {w, h}) : 0;
232
+ }
233
+
234
+ function _isIframe() {
235
+ try {
236
+ return getWindowSelf() !== getWindowTop();
237
+ } catch (e) {
238
+ return true;
239
+ }
240
+ }
241
+
242
+ function _getMinSize(sizes) {
243
+ return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min);
244
+ }
245
+
246
+ function _getBoundingBox(element, {w, h} = {}) {
247
+ let {width, height, left, top, right, bottom} = element.getBoundingClientRect();
248
+
249
+ if ((width === 0 || height === 0) && w && h) {
250
+ width = w;
251
+ height = h;
252
+ right = left + w;
253
+ bottom = top + h;
254
+ }
255
+
256
+ return {width, height, left, top, right, bottom};
257
+ }
258
+
259
+ function _getIntersectionOfRects(rects) {
260
+ const bbox = {
261
+ left: rects[0].left, right: rects[0].right, top: rects[0].top, bottom: rects[0].bottom
262
+ };
263
+
264
+ for (let i = 1; i < rects.length; ++i) {
265
+ bbox.left = Math.max(bbox.left, rects[i].left);
266
+ bbox.right = Math.min(bbox.right, rects[i].right);
267
+
268
+ if (bbox.left >= bbox.right) {
269
+ return null;
270
+ }
271
+
272
+ bbox.top = Math.max(bbox.top, rects[i].top);
273
+ bbox.bottom = Math.min(bbox.bottom, rects[i].bottom);
274
+
275
+ if (bbox.top >= bbox.bottom) {
276
+ return null;
277
+ }
278
+ }
279
+
280
+ bbox.width = bbox.right - bbox.left;
281
+ bbox.height = bbox.bottom - bbox.top;
282
+
283
+ return bbox;
284
+ }
285
+
286
+ function _getPercentInView(element, topWin, {w, h} = {}) {
287
+ const elementBoundingBox = _getBoundingBox(element, {w, h});
288
+
289
+ // Obtain the intersection of the element and the viewport
290
+ const elementInViewBoundingBox = _getIntersectionOfRects([{
291
+ left: 0, top: 0, right: topWin.innerWidth, bottom: topWin.innerHeight
292
+ }, elementBoundingBox]);
293
+
294
+ let elementInViewArea, elementTotalArea;
295
+
296
+ if (elementInViewBoundingBox !== null) {
297
+ // Some or all of the element is in view
298
+ elementInViewArea = elementInViewBoundingBox.width * elementInViewBoundingBox.height;
299
+ elementTotalArea = elementBoundingBox.width * elementBoundingBox.height;
300
+
301
+ return ((elementInViewArea / elementTotalArea) * 100);
302
+ }
303
+
304
+ // No overlap between element and the viewport; therefore, the element
305
+ // lies completely out of view
306
+ return 0;
307
+ }
308
+
309
+ function _getBidFloor(bid) {
310
+ if (!isFn(bid.getFloor)) {
311
+ return bid.params.bidFloor ? bid.params.bidFloor : null;
312
+ }
313
+
314
+ let floor = bid.getFloor({
315
+ currency: 'USD', mediaType: '*', size: '*'
316
+ });
317
+ if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
318
+ return floor.floor;
319
+ }
320
+ return null;
321
+ }
322
+
323
+ registerBidder(spec);
@@ -0,0 +1,46 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: Brightcom SSP Bid Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: alexandruc@brightcom.com
7
+ ```
8
+
9
+ # Description
10
+
11
+ Brightcom's adapter integration to the Prebid library.
12
+
13
+ # Test Parameters
14
+
15
+ ```
16
+ var adUnits = [
17
+ {
18
+ code: 'test-leaderboard',
19
+ mediaTypes: {
20
+ banner: {
21
+ sizes: [[728, 90]]
22
+ }
23
+ },
24
+ bids: [{
25
+ bidder: 'bcmssp',
26
+ params: {
27
+ publisherId: 2141020,
28
+ bidFloor: 0.01
29
+ }
30
+ }]
31
+ }, {
32
+ code: 'test-banner',
33
+ mediaTypes: {
34
+ banner: {
35
+ sizes: [[300, 250]]
36
+ }
37
+ },
38
+ bids: [{
39
+ bidder: 'bcmssp',
40
+ params: {
41
+ publisherId: 2141020
42
+ }
43
+ }]
44
+ }
45
+ ]
46
+ ```
@@ -11,7 +11,7 @@ import { getRefererInfo } from '../src/refererDetection.js';
11
11
  import { hasPurpose1Consent } from '../src/utils/gpdr.js';
12
12
 
13
13
  const GVLID = 91;
14
- export const ADAPTER_VERSION = 34;
14
+ export const ADAPTER_VERSION = 35;
15
15
  const BIDDER_CODE = 'criteo';
16
16
  const CDB_ENDPOINT = 'https://bidder.criteo.com/cdb';
17
17
  const PROFILE_ID_INLINE = 207;
@@ -27,7 +27,7 @@ const LOG_PREFIX = 'Criteo: ';
27
27
  Unminified source code can be found in the privately shared repo: https://github.com/Prebid-org/prebid-js-external-js-criteo/blob/master/dist/prod.js
28
28
  */
29
29
  const FAST_BID_VERSION_PLACEHOLDER = '%FAST_BID_VERSION%';
30
- export const FAST_BID_VERSION_CURRENT = 134;
30
+ export const FAST_BID_VERSION_CURRENT = 135;
31
31
  const FAST_BID_VERSION_LATEST = 'latest';
32
32
  const FAST_BID_VERSION_NONE = 'none';
33
33
  const PUBLISHER_TAG_URL_TEMPLATE = 'https://static.criteo.net/js/ld/publishertag.prebid' + FAST_BID_VERSION_PLACEHOLDER + '.js';
@@ -523,9 +523,8 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
523
523
  }
524
524
  };
525
525
  };
526
- request.user = {
527
- ext: bidderRequest.userExt
528
- };
526
+ request.user = bidderRequest.ortb2?.user || {};
527
+ request.site = bidderRequest.ortb2?.site || {};
529
528
  if (bidderRequest && bidderRequest.ceh) {
530
529
  request.user.ceh = bidderRequest.ceh;
531
530
  }
@@ -3,7 +3,7 @@
3
3
  ```
4
4
  Module Name: C-WIRE Bid Adapter
5
5
  Module Type: Bidder Adapter
6
- Maintainer: devs@cwire.ch
6
+ Maintainer: devs@cwire.com
7
7
  ```
8
8
 
9
9
  ## Description
@@ -40,10 +40,16 @@ var adUnits = [
40
40
  params: {
41
41
  pageId: 1422, // required - number
42
42
  placementId: 2211521, // required - number
43
- cwcreative: '42', // optional - id of creative to force
44
- refgroups: 'test-user', // optional - name of group or coma separated list of groups to force
45
43
  }
46
44
  }]
47
45
  }
48
46
  ];
49
47
  ```
48
+
49
+ ### URL parameters
50
+
51
+ For debugging and testing purposes url parameters can be set.
52
+
53
+ **Example:**
54
+
55
+ `https://www.some-site.com/article.html?cwdebug=true&cwfeatures=feature1,feature2&cwcreative=1234`
@@ -40,7 +40,7 @@ const NATIVERET = {
40
40
  title: {
41
41
  len: 75,
42
42
  },
43
- }
43
+ },
44
44
  ],
45
45
  plcmttype: 1,
46
46
  privacy: 1,
@@ -63,9 +63,9 @@ const getUserID = () => {
63
63
  let idm = storage.getCookie(COOKIE_KEY_MGUID);
64
64
 
65
65
  if (idd && !idm) {
66
- idm = idd
66
+ idm = idd;
67
67
  } else if (idm && !idd) {
68
- idd = idm
68
+ idd = idm;
69
69
  } else if (!idd && !idm) {
70
70
  const uuid = utils.generateUUID();
71
71
  storage.setCookie(COOKIE_KEY_MGUID, uuid);
@@ -228,7 +228,7 @@ function getItems(validBidRequests, bidderRequest) {
228
228
  let id = '' + (i + 1);
229
229
 
230
230
  if (mediaTypes.native) {
231
- ret = { ...NATIVERET, ...{ id, bidFloor } }
231
+ ret = { ...NATIVERET, ...{ id, bidFloor } };
232
232
  }
233
233
  // banner
234
234
  if (mediaTypes.banner) {
@@ -276,6 +276,11 @@ function getItems(validBidRequests, bidderRequest) {
276
276
  */
277
277
  function getParam(validBidRequests, bidderRequest) {
278
278
  const pubcid = utils.deepAccess(validBidRequests[0], 'crumbs.pubcid');
279
+ const sharedid =
280
+ utils.deepAccess(validBidRequests[0], 'userId.sharedid.id') ||
281
+ utils.deepAccess(validBidRequests[0], 'userId.pubcid');
282
+ const eids = validBidRequests[0].userIdAsEids || validBidRequests[0].userId;
283
+
279
284
  let isMobile = getDevice() ? 1 : 0;
280
285
  // input test status by Publisher. more frequently for test true req
281
286
  let isTest = validBidRequests[0].params.test || 0;
@@ -284,7 +289,8 @@ function getParam(validBidRequests, bidderRequest) {
284
289
 
285
290
  const timeout = bidderRequest.timeout || 2000;
286
291
 
287
- const domain = utils.deepAccess(bidderRequest, 'refererInfo.domain') || document.domain;
292
+ const domain =
293
+ utils.deepAccess(bidderRequest, 'refererInfo.domain') || document.domain;
288
294
  const location = utils.deepAccess(bidderRequest, 'refererInfo.referer');
289
295
  const page = utils.deepAccess(bidderRequest, 'refererInfo.page');
290
296
  const referer = utils.deepAccess(bidderRequest, 'refererInfo.ref');
@@ -304,10 +310,14 @@ function getParam(validBidRequests, bidderRequest) {
304
310
  ua: navigator.userAgent,
305
311
  language: /en/.test(navigator.language) ? 'en' : navigator.language,
306
312
  },
313
+ ext: {
314
+ eids,
315
+ },
307
316
  user: {
308
317
  buyeruid: getUserID(),
309
- id: pubcid,
318
+ id: sharedid || pubcid,
310
319
  },
320
+ eids,
311
321
  tmax: timeout,
312
322
  site: {
313
323
  name: domain,
@@ -317,7 +327,7 @@ function getParam(validBidRequests, bidderRequest) {
317
327
  mobile: isMobile,
318
328
  cat: [], // todo
319
329
  publisher: {
320
- id: globals['publisher']
330
+ id: globals['publisher'],
321
331
  // todo
322
332
  // name: xxx
323
333
  },
@@ -401,8 +411,8 @@ export const spec = {
401
411
  nurl: getKv(bid, 'nurl'),
402
412
  ttl: TIME_TO_LIVE,
403
413
  meta: {
404
- advertiserDomains: getKv(bid, 'adomain') || []
405
- }
414
+ advertiserDomains: getKv(bid, 'adomain') || [],
415
+ },
406
416
  };
407
417
  if (mediaType === 'native') {
408
418
  const adm = getKv(bid, 'adm');
@@ -448,7 +458,7 @@ export const spec = {
448
458
  native.impressionTrackers.push(tracker.url);
449
459
  break;
450
460
  // case 2:
451
- // native.javascriptTrackers = `<script src=\"${tracker.url}\"></script>`;
461
+ // native.javascriptTrackers = `<script src=\'${tracker.url}\'></script>`;
452
462
  // break;
453
463
  }
454
464
  });
@@ -484,8 +494,8 @@ export const spec = {
484
494
  */
485
495
  onBidWon: function (bid) {
486
496
  if (bid['nurl']) {
487
- utils.triggerPixel(bid['nurl'])
497
+ utils.triggerPixel(bid['nurl']);
488
498
  }
489
- }
499
+ },
490
500
  };
491
501
  registerBidder(spec);