prebid.js 8.4.0 → 8.6.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 (332) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/a1MediaRtdProvider.js +1 -0
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adfBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnBidAdapter.js +1 -1
  9. package/dist/adkernelBidAdapter.js +1 -1
  10. package/dist/admixerIdSystem.js +1 -1
  11. package/dist/adnuntiusBidAdapter.js +1 -1
  12. package/dist/adqueryBidAdapter.js +1 -1
  13. package/dist/adqueryIdSystem.js +1 -1
  14. package/dist/adrelevantisBidAdapter.js +1 -1
  15. package/dist/adsinteractiveBidAdapter.js +1 -1
  16. package/dist/adtelligentIdSystem.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/amxBidAdapter.js +1 -1
  22. package/dist/amxIdSystem.js +1 -1
  23. package/dist/appierAnalyticsAdapter.js +1 -1
  24. package/dist/appnexusBidAdapter.js +1 -1
  25. package/dist/asoBidAdapter.js +1 -1
  26. package/dist/axonixBidAdapter.js +1 -1
  27. package/dist/beachfrontBidAdapter.js +1 -1
  28. package/dist/bidglassBidAdapter.js +1 -1
  29. package/dist/big-richmediaBidAdapter.js +1 -1
  30. package/dist/bridBidAdapter.js +1 -1
  31. package/dist/bridgewellBidAdapter.js +1 -1
  32. package/dist/brightMountainMediaBidAdapter.js +1 -1
  33. package/dist/britepoolIdSystem.js +1 -1
  34. package/dist/carodaBidAdapter.js +1 -1
  35. package/dist/chtnwBidAdapter.js +1 -1
  36. package/dist/concertBidAdapter.js +1 -1
  37. package/dist/connectIdSystem.js +1 -1
  38. package/dist/connectadBidAdapter.js +1 -1
  39. package/dist/consentManagementGpp.js +1 -1
  40. package/dist/consumableBidAdapter.js +1 -1
  41. package/dist/conversantAnalyticsAdapter.js +1 -1
  42. package/dist/conversantBidAdapter.js +1 -1
  43. package/dist/craftBidAdapter.js +1 -1
  44. package/dist/criteoBidAdapter.js +1 -1
  45. package/dist/criteoIdSystem.js +1 -1
  46. package/dist/cwireBidAdapter.js +1 -1
  47. package/dist/czechAdIdSystem.js +1 -1
  48. package/dist/dacIdSystem.js +1 -1
  49. package/dist/deepintentDpesIdSystem.js +1 -1
  50. package/dist/dependencies.json +6 -0
  51. package/dist/dmdIdSystem.js +1 -1
  52. package/dist/dspxBidAdapter.js +1 -1
  53. package/dist/eplanningBidAdapter.js +1 -1
  54. package/dist/euidIdSystem.js +1 -1
  55. package/dist/fabrickIdSystem.js +1 -1
  56. package/dist/feedadBidAdapter.js +1 -1
  57. package/dist/finativeBidAdapter.js +1 -1
  58. package/dist/freewheel-sspBidAdapter.js +1 -1
  59. package/dist/ftrackIdSystem.js +1 -1
  60. package/dist/geolocationRtdProvider.js +1 -0
  61. package/dist/gmosspBidAdapter.js +1 -1
  62. package/dist/goldbachBidAdapter.js +1 -1
  63. package/dist/gravitoIdSystem.js +1 -1
  64. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  65. package/dist/greenbidsRtdProvider.js +1 -1
  66. package/dist/gridBidAdapter.js +1 -1
  67. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  68. package/dist/growthCodeIdSystem.js +1 -1
  69. package/dist/gumgumBidAdapter.js +1 -1
  70. package/dist/h12mediaBidAdapter.js +1 -1
  71. package/dist/hadronIdSystem.js +1 -1
  72. package/dist/hypelabBidAdapter.js +1 -1
  73. package/dist/id5IdSystem.js +1 -1
  74. package/dist/identityLinkIdSystem.js +1 -1
  75. package/dist/idxIdSystem.js +1 -1
  76. package/dist/imdsBidAdapter.js +1 -1
  77. package/dist/improvedigitalBidAdapter.js +1 -1
  78. package/dist/imuIdSystem.js +1 -1
  79. package/dist/insticatorBidAdapter.js +1 -1
  80. package/dist/intentIqIdSystem.js +1 -1
  81. package/dist/invibesBidAdapter.js +1 -1
  82. package/dist/ixBidAdapter.js +1 -1
  83. package/dist/justIdSystem.js +1 -1
  84. package/dist/justpremiumBidAdapter.js +1 -1
  85. package/dist/kargoBidAdapter.js +1 -1
  86. package/dist/kinessoIdSystem.js +1 -1
  87. package/dist/konduitAnalyticsAdapter.js +1 -1
  88. package/dist/kueezBidAdapter.js +1 -1
  89. package/dist/kueezRtbBidAdapter.js +1 -1
  90. package/dist/kulturemediaBidAdapter.js +1 -1
  91. package/dist/lassoBidAdapter.js +1 -1
  92. package/dist/lifestreetBidAdapter.js +1 -1
  93. package/dist/liveIntentIdSystem.js +1 -1
  94. package/dist/logicadBidAdapter.js +1 -1
  95. package/dist/loglyliftBidAdapter.js +1 -1
  96. package/dist/lotamePanoramaIdSystem.js +1 -1
  97. package/dist/magniteAnalyticsAdapter.js +1 -1
  98. package/dist/malltvAnalyticsAdapter.js +1 -1
  99. package/dist/marsmediaBidAdapter.js +1 -1
  100. package/dist/mediafuseBidAdapter.js +1 -1
  101. package/dist/mediasquareBidAdapter.js +1 -1
  102. package/dist/merkleIdSystem.js +1 -1
  103. package/dist/mgidBidAdapter.js +1 -1
  104. package/dist/minutemediaBidAdapter.js +1 -1
  105. package/dist/minutemediaplusBidAdapter.js +1 -1
  106. package/dist/mspa.js +1 -1
  107. package/dist/mwOpenLinkIdSystem.js +1 -1
  108. package/dist/naveggIdSystem.js +1 -1
  109. package/dist/netIdSystem.js +1 -1
  110. package/dist/newspassidBidAdapter.js +1 -1
  111. package/dist/nexx360BidAdapter.js +1 -1
  112. package/dist/not-for-prod/prebid.js +186 -181
  113. package/dist/novatiqIdSystem.js +1 -1
  114. package/dist/oguryBidAdapter.js +1 -1
  115. package/dist/oneKeyIdSystem.js +1 -1
  116. package/dist/onetagBidAdapter.js +1 -1
  117. package/dist/ooloAnalyticsAdapter.js +1 -1
  118. package/dist/optidigitalBidAdapter.js +1 -1
  119. package/dist/outbrainBidAdapter.js +1 -1
  120. package/dist/ozoneBidAdapter.js +1 -1
  121. package/dist/pairIdSystem.js +1 -1
  122. package/dist/parrableIdSystem.js +1 -1
  123. package/dist/pixfutureBidAdapter.js +1 -1
  124. package/dist/prebid-core.js +1 -1
  125. package/dist/pubCircleBidAdapter.js +1 -0
  126. package/dist/publinkIdSystem.js +1 -1
  127. package/dist/pubmaticBidAdapter.js +1 -1
  128. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  129. package/dist/pxyzBidAdapter.js +1 -1
  130. package/dist/quantcastBidAdapter.js +1 -1
  131. package/dist/quantcastIdSystem.js +1 -1
  132. package/dist/readpeakBidAdapter.js +1 -1
  133. package/dist/relaidoBidAdapter.js +1 -1
  134. package/dist/relevadRtdProvider.js +1 -1
  135. package/dist/retailspotBidAdapter.js +1 -1
  136. package/dist/rhythmoneBidAdapter.js +1 -1
  137. package/dist/riseBidAdapter.js +1 -1
  138. package/dist/rubiconBidAdapter.js +1 -1
  139. package/dist/seedingAllianceBidAdapter.js +1 -1
  140. package/dist/seedtagBidAdapter.js +1 -1
  141. package/dist/sharedIdSystem.js +1 -1
  142. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  143. package/dist/sharethroughBidAdapter.js +1 -1
  144. package/dist/shinezBidAdapter.js +1 -1
  145. package/dist/silverpushBidAdapter.js +1 -1
  146. package/dist/smaatoBidAdapter.js +1 -1
  147. package/dist/smartadserverBidAdapter.js +1 -1
  148. package/dist/smartxBidAdapter.js +1 -1
  149. package/dist/smilewantedBidAdapter.js +1 -1
  150. package/dist/sonobiBidAdapter.js +1 -1
  151. package/dist/sovrnAnalyticsAdapter.js +1 -1
  152. package/dist/sovrnBidAdapter.js +1 -1
  153. package/dist/ssmasBidAdapter.js +1 -0
  154. package/dist/sspBCBidAdapter.js +1 -1
  155. package/dist/stvBidAdapter.js +1 -1
  156. package/dist/sublimeBidAdapter.js +1 -1
  157. package/dist/tapadIdSystem.js +1 -1
  158. package/dist/tappxBidAdapter.js +1 -1
  159. package/dist/targetVideoBidAdapter.js +1 -1
  160. package/dist/teadsBidAdapter.js +1 -1
  161. package/dist/tncIdSystem.js +1 -1
  162. package/dist/topicsFpdModule.js +1 -1
  163. package/dist/trionBidAdapter.js +1 -1
  164. package/dist/tripleliftBidAdapter.js +1 -1
  165. package/dist/ttdBidAdapter.js +1 -1
  166. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  167. package/dist/uid2IdSystem.js +1 -1
  168. package/dist/underdogmediaBidAdapter.js +1 -1
  169. package/dist/undertoneBidAdapter.js +1 -1
  170. package/dist/unifiedIdSystem.js +1 -1
  171. package/dist/userId.js +1 -1
  172. package/dist/utiqSystem.js +1 -1
  173. package/dist/verizonMediaIdSystem.js +1 -1
  174. package/dist/viantOrtbBidAdapter.js +1 -0
  175. package/dist/vidazooBidAdapter.js +1 -1
  176. package/dist/videobyteBidAdapter.js +1 -1
  177. package/dist/videojsVideoProvider.js +1 -1
  178. package/dist/visxBidAdapter.js +1 -1
  179. package/dist/vrtcalBidAdapter.js +1 -1
  180. package/dist/vuukleBidAdapter.js +1 -1
  181. package/dist/widespaceBidAdapter.js +1 -1
  182. package/dist/winrBidAdapter.js +1 -1
  183. package/dist/yahoosspBidAdapter.js +1 -1
  184. package/dist/yieldmoBidAdapter.js +1 -1
  185. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  186. package/dist/zeotapIdPlusIdSystem.js +1 -1
  187. package/integrationExamples/gpt/adUnitFloors.html +0 -1
  188. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
  189. package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +1 -1
  190. package/integrationExamples/videoModule/jwplayer/bidsBackHandlerOverride.html +137 -0
  191. package/integrationExamples/videoModule/jwplayer/eventListeners.html +1 -1
  192. package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
  193. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
  194. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
  195. package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
  196. package/integrationExamples/videoModule/videojs/bidsBackHandlerOverride.html +164 -0
  197. package/libraries/mspa/activityControls.js +51 -32
  198. package/modules/.submodules.json +1 -0
  199. package/modules/33acrossIdSystem.js +9 -0
  200. package/modules/a1MediaRtdProvider.js +92 -0
  201. package/modules/a1MediaRtdProvider.md +46 -0
  202. package/modules/adfBidAdapter.js +4 -1
  203. package/modules/adgenerationBidAdapter.js +3 -3
  204. package/modules/adkernelAdnBidAdapter.js +1 -1
  205. package/modules/adkernelBidAdapter.js +10 -3
  206. package/modules/admixerIdSystem.js +6 -0
  207. package/modules/adnuntiusBidAdapter.js +5 -13
  208. package/modules/adqueryIdSystem.js +6 -0
  209. package/modules/adsinteractiveBidAdapter.js +2 -2
  210. package/modules/adtelligentIdSystem.js +6 -0
  211. package/modules/adyoulikeBidAdapter.js +6 -3
  212. package/modules/amxIdSystem.js +6 -0
  213. package/modules/appnexusBidAdapter.js +1 -1
  214. package/modules/beachfrontBidAdapter.js +32 -6
  215. package/modules/britepoolIdSystem.js +6 -0
  216. package/modules/connectIdSystem.js +6 -0
  217. package/modules/consentManagementGpp.js +10 -1
  218. package/modules/consumableBidAdapter.js +9 -1
  219. package/modules/criteoBidAdapter.js +18 -0
  220. package/modules/criteoIdSystem.js +6 -0
  221. package/modules/cwireBidAdapter.js +19 -0
  222. package/modules/czechAdIdSystem.js +6 -0
  223. package/modules/dacIdSystem.js +6 -0
  224. package/modules/deepintentDpesIdSystem.js +7 -2
  225. package/modules/dmdIdSystem.js +6 -0
  226. package/modules/euidIdSystem.js +9 -0
  227. package/modules/fabrickIdSystem.js +6 -0
  228. package/modules/ftrackIdSystem.js +16 -0
  229. package/modules/geolocationRtdProvider.js +65 -0
  230. package/modules/gravitoIdSystem.js +6 -0
  231. package/modules/greenbidsRtdProvider.js +1 -1
  232. package/modules/growthCodeAnalyticsAdapter.js +7 -2
  233. package/modules/growthCodeIdSystem.js +20 -1
  234. package/modules/hadronIdSystem.js +6 -0
  235. package/modules/id5IdSystem.js +34 -8
  236. package/modules/identityLinkIdSystem.js +6 -0
  237. package/modules/idxIdSystem.js +6 -0
  238. package/modules/imdsBidAdapter.js +38 -14
  239. package/modules/imuIdSystem.js +10 -0
  240. package/modules/intentIqIdSystem.js +6 -0
  241. package/modules/invibesBidAdapter.js +5 -5
  242. package/modules/ixBidAdapter.js +16 -0
  243. package/modules/justIdSystem.js +6 -0
  244. package/modules/kinessoIdSystem.js +7 -2
  245. package/modules/liveIntentIdSystem.js +53 -0
  246. package/modules/lotamePanoramaIdSystem.js +6 -0
  247. package/modules/merkleIdSystem.js +24 -0
  248. package/modules/mwOpenLinkIdSystem.js +6 -0
  249. package/modules/naveggIdSystem.js +6 -0
  250. package/modules/netIdSystem.js +6 -0
  251. package/modules/newspassid.md +76 -0
  252. package/modules/newspassidBidAdapter.js +44 -18
  253. package/modules/novatiqIdSystem.js +12 -0
  254. package/modules/oneKeyIdSystem.js +26 -0
  255. package/modules/ozoneBidAdapter.js +65 -18
  256. package/modules/ozoneBidAdapter.md +3 -1
  257. package/modules/pairIdSystem.js +6 -0
  258. package/modules/parrableIdSystem.js +38 -2
  259. package/modules/pubCircleBidAdapter.js +231 -0
  260. package/modules/pubCircleBidAdapter.md +79 -0
  261. package/modules/publinkIdSystem.js +7 -1
  262. package/modules/quantcastIdSystem.js +6 -0
  263. package/modules/relevadRtdProvider.js +6 -7
  264. package/modules/rubiconBidAdapter.js +9 -0
  265. package/modules/sharedIdSystem.js +6 -0
  266. package/modules/silverpushBidAdapter.js +2 -2
  267. package/modules/ssmasBidAdapter.js +126 -0
  268. package/modules/ssmasBidAdapter.md +35 -0
  269. package/modules/sspBCBidAdapter.js +36 -13
  270. package/modules/tapadIdSystem.js +6 -0
  271. package/modules/tappxBidAdapter.js +10 -1
  272. package/modules/tappxBidAdapter.md +17 -0
  273. package/modules/tncIdSystem.js +6 -0
  274. package/modules/topicsFpdModule.js +21 -48
  275. package/modules/tripleliftBidAdapter.js +5 -0
  276. package/modules/uid2IdSystem.js +14 -0
  277. package/modules/unifiedIdSystem.js +11 -0
  278. package/modules/userId/eids.js +6 -445
  279. package/modules/userId/index.js +36 -24
  280. package/modules/utiqSystem.js +9 -0
  281. package/modules/verizonMediaIdSystem.js +6 -0
  282. package/modules/viantOrtbBidAdapter.js +113 -0
  283. package/modules/viantOrtbBidAdapter.md +54 -0
  284. package/modules/vidazooBidAdapter.js +9 -2
  285. package/modules/videojsVideoProvider.js +9 -2
  286. package/modules/vrtcalBidAdapter.js +10 -6
  287. package/modules/zeotapIdPlusIdSystem.js +6 -0
  288. package/package.json +1 -1
  289. package/src/adapters/bidderFactory.js +15 -6
  290. package/src/adloader.js +2 -1
  291. package/test/spec/libraries/mspa/activityControls_spec.js +145 -212
  292. package/test/spec/modules/a1MediaRtdProvider_spec.js +105 -0
  293. package/test/spec/modules/adfBidAdapter_spec.js +47 -0
  294. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  295. package/test/spec/modules/adkernelAdnBidAdapter_spec.js +1 -2
  296. package/test/spec/modules/adkernelBidAdapter_spec.js +7 -2
  297. package/test/spec/modules/adnuntiusBidAdapter_spec.js +116 -64
  298. package/test/spec/modules/adyoulikeBidAdapter_spec.js +13 -24
  299. package/test/spec/modules/appnexusBidAdapter_spec.js +12 -1
  300. package/test/spec/modules/beachfrontBidAdapter_spec.js +35 -2
  301. package/test/spec/modules/consentManagementGpp_spec.js +16 -0
  302. package/test/spec/modules/consumableBidAdapter_spec.js +15 -0
  303. package/test/spec/modules/criteoBidAdapter_spec.js +31 -3
  304. package/test/spec/modules/cwireBidAdapter_spec.js +47 -0
  305. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -5
  306. package/test/spec/modules/geolocationRtdProvider_spec.js +119 -0
  307. package/test/spec/modules/greenbidsRtdProvider_spec.js +1 -1
  308. package/test/spec/modules/id5IdSystem_spec.js +18 -0
  309. package/test/spec/modules/imdsBidAdapter_spec.js +98 -17
  310. package/test/spec/modules/invibesBidAdapter_spec.js +123 -32
  311. package/test/spec/modules/ixBidAdapter_spec.js +23 -5
  312. package/test/spec/modules/medianetBidAdapter_spec.js +117 -0
  313. package/test/spec/modules/newspassidBidAdapter_spec.js +6 -0
  314. package/test/spec/modules/outbrainBidAdapter_spec.js +3 -5
  315. package/test/spec/modules/ozoneBidAdapter_spec.js +27 -1
  316. package/test/spec/modules/prebidServerBidAdapter_spec.js +2 -20
  317. package/test/spec/modules/priceFloors_spec.js +14 -0
  318. package/test/spec/modules/pubCircleBidAdapter_spec.js +399 -0
  319. package/test/spec/modules/pubmaticBidAdapter_spec.js +6 -373
  320. package/test/spec/modules/rubiconBidAdapter_spec.js +220 -9
  321. package/test/spec/modules/smaatoBidAdapter_spec.js +4 -6
  322. package/test/spec/modules/ssmasBidAdapter_spec.js +244 -0
  323. package/test/spec/modules/sspBCBidAdapter_spec.js +18 -19
  324. package/test/spec/modules/topicsFpdModule_spec.js +343 -365
  325. package/test/spec/modules/tripleliftBidAdapter_spec.js +40 -0
  326. package/test/spec/modules/userId_spec.js +116 -7
  327. package/test/spec/modules/viantOrtbBidAdapter_spec.js +432 -0
  328. package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -4
  329. package/test/spec/modules/xeBidAdapter_spec.js +366 -368
  330. package/test/spec/modules/yahoosspBidAdapter_spec.js +5 -18
  331. package/test/spec/unit/core/bidderFactory_spec.js +61 -14
  332. package/integrationExamples/gpt/pbjs_video_adUnit.html +0 -109
@@ -7,7 +7,8 @@ import {
7
7
  isArray,
8
8
  contains,
9
9
  mergeDeep,
10
- parseUrl
10
+ parseUrl,
11
+ generateUUID
11
12
  } from '../src/utils.js';
12
13
  import { registerBidder } from '../src/adapters/bidderFactory.js';
13
14
  import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
@@ -16,12 +17,12 @@ import {getPriceBucketString} from '../src/cpmBucketManager.js';
16
17
  import { Renderer } from '../src/Renderer.js';
17
18
  import {getRefererInfo} from '../src/refererDetection.js';
18
19
  const BIDDER_CODE = 'ozone';
19
- const ORIGIN = 'https://elb.the-ozone-project.com'; // applies only to auction & cookie
20
+ const ORIGIN = 'https://elb.the-ozone-project.com' // applies only to auction & cookie
20
21
  const AUCTIONURI = '/openrtb2/auction';
21
22
  const OZONECOOKIESYNC = '/static/load-cookie.html';
22
23
  const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js';
23
24
  const ORIGIN_DEV = 'https://test.ozpr.net';
24
- const OZONEVERSION = '2.8.0';
25
+ const OZONEVERSION = '2.9.0';
25
26
  export const spec = {
26
27
  gvlid: 524,
27
28
  aliases: [{code: 'lmc', gvlid: 524}],
@@ -36,7 +37,8 @@ export const spec = {
36
37
  'keyPrefix': 'oz',
37
38
  'auctionUrl': ORIGIN + AUCTIONURI,
38
39
  'cookieSyncUrl': ORIGIN + OZONECOOKIESYNC,
39
- 'rendererUrl': OZONE_RENDERER_URL
40
+ 'rendererUrl': OZONE_RENDERER_URL,
41
+ 'batchRequests': false /* you can change this to true OR override it in the config: config.ozone.batchRequests */
40
42
  },
41
43
  loadWhitelabelData(bid) {
42
44
  if (this.propertyBag.whitelabel) { return; }
@@ -73,6 +75,9 @@ export const spec = {
73
75
  this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.auctionUrl;
74
76
  }
75
77
  }
78
+ if (bidderConfig.hasOwnProperty('batchRequests')) {
79
+ this.propertyBag.whitelabel.batchRequests = bidderConfig.batchRequests;
80
+ }
76
81
  try {
77
82
  if (arr.hasOwnProperty('auction') && arr.auction === 'dev') {
78
83
  logInfo('GET: auction=dev');
@@ -94,11 +99,14 @@ export const spec = {
94
99
  getRendererUrl() {
95
100
  return this.propertyBag.whitelabel.rendererUrl;
96
101
  },
102
+ isBatchRequests() {
103
+ return this.propertyBag.whitelabel.batchRequests;
104
+ },
97
105
  isBidRequestValid(bid) {
98
106
  this.loadWhitelabelData(bid);
99
107
  logInfo('isBidRequestValid : ', config.getConfig(), bid);
100
108
  let adUnitCode = bid.adUnitCode; // adunit[n].code
101
- let err1 = 'VALIDATION FAILED : missing {param} : siteId, placementId and publisherId are REQUIRED';
109
+ let err1 = 'VALIDATION FAILED : missing {param} : siteId, placementId and publisherId are REQUIRED'
102
110
  if (!(bid.params.hasOwnProperty('placementId'))) {
103
111
  logError(err1.replace('{param}', 'placementId'), adUnitCode);
104
112
  return false;
@@ -199,7 +207,7 @@ export const spec = {
199
207
  let placementId = placementIdOverrideFromGetParam || this.getPlacementId(ozoneBidRequest); // prefer to use a valid override param, else the bidRequest placement Id
200
208
  obj.id = ozoneBidRequest.bidId; // this causes an error if we change it to something else, even if you update the bidRequest object: "WARNING: Bidder ozone made bid for unknown request ID: mb7953.859498327448. Ignoring."
201
209
  obj.tagid = placementId;
202
- let parsed = parseUrl(getRefererInfo().page);
210
+ let parsed = parseUrl(this.getRefererInfo().page);
203
211
  obj.secure = parsed.protocol === 'https' ? 1 : 0;
204
212
  let arrBannerSizes = [];
205
213
  if (!ozoneBidRequest.hasOwnProperty('mediaTypes')) {
@@ -262,9 +270,7 @@ export const spec = {
262
270
  obj.placementId = placementId;
263
271
  deepSetValue(obj, 'ext.prebid', {'storedrequest': {'id': placementId}});
264
272
  obj.ext[whitelabelBidder] = {};
265
- // TODO: fix auctionId/transactionID leak: https://github.com/prebid/Prebid.js/issues/9781
266
273
  obj.ext[whitelabelBidder].adUnitCode = ozoneBidRequest.adUnitCode; // eg. 'mpu'
267
- obj.ext[whitelabelBidder].transactionId = ozoneBidRequest.transactionId; // this is the transactionId PER adUnit, common across bidders for this unit
268
274
  if (ozoneBidRequest.params.hasOwnProperty('customData')) {
269
275
  obj.ext[whitelabelBidder].customData = ozoneBidRequest.params.customData;
270
276
  }
@@ -291,6 +297,10 @@ export const spec = {
291
297
  if (!schain && deepAccess(ozoneBidRequest, 'schain')) {
292
298
  schain = ozoneBidRequest.schain;
293
299
  }
300
+ let gpid = deepAccess(ozoneBidRequest, 'ortb2Imp.ext.gpid');
301
+ if (gpid) {
302
+ deepSetValue(obj, 'ext.gpid', gpid);
303
+ }
294
304
  return obj;
295
305
  });
296
306
  let extObj = {};
@@ -326,7 +336,7 @@ export const spec = {
326
336
  let userExtEids = deepAccess(validBidRequests, '0.userIdAsEids', []); // generate the UserIDs in the correct format for UserId module
327
337
  ozoneRequest.site = {
328
338
  'publisher': {'id': htmlParams.publisherId},
329
- 'page': getRefererInfo().page,
339
+ 'page': this.getRefererInfo().page,
330
340
  'id': htmlParams.siteId
331
341
  };
332
342
  ozoneRequest.test = config.getConfig('debug') ? 1 : 0;
@@ -355,13 +365,33 @@ export const spec = {
355
365
  if (config.getConfig('coppa') === true) {
356
366
  deepSetValue(ozoneRequest, 'regs.coppa', 1);
357
367
  }
368
+ let ozUuid = generateUUID();
369
+ if (this.isBatchRequests()) {
370
+ logInfo('going to batch the requests');
371
+ let arrRet = []; // return an array of objects containing data describing max 10 bids
372
+ for (let i = 0; i < tosendtags.length; i += 10) {
373
+ ozoneRequest.id = ozUuid; // Unique ID of the bid request, provided by the exchange. (REQUIRED)
374
+ ozoneRequest.imp = tosendtags.slice(i, i + 10);
375
+ ozoneRequest.ext = extObj;
376
+ deepSetValue(ozoneRequest, 'user.ext.eids', userExtEids);
377
+ if (ozoneRequest.imp.length > 0) {
378
+ arrRet.push({
379
+ method: 'POST',
380
+ url: this.getAuctionUrl(),
381
+ data: JSON.stringify(ozoneRequest),
382
+ bidderRequest: bidderRequest
383
+ });
384
+ }
385
+ }
386
+ logInfo('batch request going to return : ', arrRet);
387
+ return arrRet;
388
+ }
389
+ logInfo('requests will not be batched.');
358
390
  if (singleRequest) {
359
391
  logInfo('buildRequests starting to generate response for a single request');
360
- ozoneRequest.id = bidderRequest.auctionId; // Unique ID of the bid request, provided by the exchange.
361
- ozoneRequest.auctionId = bidderRequest.auctionId; // not sure if this should be here?
392
+ ozoneRequest.id = ozUuid; // Unique ID of the bid request, provided by the exchange. (REQUIRED)
362
393
  ozoneRequest.imp = tosendtags;
363
394
  ozoneRequest.ext = extObj;
364
- deepSetValue(ozoneRequest, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
365
395
  deepSetValue(ozoneRequest, 'user.ext.eids', userExtEids);
366
396
  var ret = {
367
397
  method: 'POST',
@@ -377,12 +407,9 @@ export const spec = {
377
407
  let arrRet = tosendtags.map(imp => {
378
408
  logInfo('buildRequests starting to generate non-single response, working on imp : ', imp);
379
409
  let ozoneRequestSingle = Object.assign({}, ozoneRequest);
380
- imp.ext[whitelabelBidder].pageAuctionId = bidderRequest['auctionId']; // make a note in the ext object of what the original auctionId was, in the bidderRequest object
381
- ozoneRequestSingle.id = imp.ext[whitelabelBidder].transactionId; // Unique ID of the bid request, provided by the exchange.
382
- ozoneRequestSingle.auctionId = imp.ext[whitelabelBidder].transactionId; // not sure if this should be here?
410
+ ozoneRequestSingle.id = generateUUID(); // Unique ID of the bid request, provided by the exchange. (REQUIRED)
383
411
  ozoneRequestSingle.imp = [imp];
384
412
  ozoneRequestSingle.ext = extObj;
385
- deepSetValue(ozoneRequestSingle, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
386
413
  deepSetValue(ozoneRequestSingle, 'user.ext.eids', userExtEids);
387
414
  logInfo('buildRequests RequestSingle (for non-single) = ', ozoneRequestSingle);
388
415
  return {
@@ -424,6 +451,7 @@ export const spec = {
424
451
  logInfo(`interpretResponse time: ${startTime} . Time between buildRequests done and interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
425
452
  logInfo(`serverResponse, request`, JSON.parse(JSON.stringify(serverResponse)), JSON.parse(JSON.stringify(request)));
426
453
  serverResponse = serverResponse.body || {};
454
+ let aucId = serverResponse.id; // this will be correct for single requests and non-single
427
455
  if (!serverResponse.hasOwnProperty('seatbid')) {
428
456
  return [];
429
457
  }
@@ -518,7 +546,7 @@ export const spec = {
518
546
  }
519
547
  }
520
548
  let {seat: winningSeat, bid: winningBid} = ozoneGetWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid);
521
- adserverTargeting[whitelabelPrefix + '_auc_id'] = String(request.bidderRequest.auctionId);
549
+ adserverTargeting[whitelabelPrefix + '_auc_id'] = String(aucId); // was request.bidderRequest.auctionId
522
550
  adserverTargeting[whitelabelPrefix + '_winner'] = String(winningSeat);
523
551
  adserverTargeting[whitelabelPrefix + '_bid'] = 'true';
524
552
  adserverTargeting[whitelabelPrefix + '_cache_id'] = deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_id', 'no-id');
@@ -686,10 +714,29 @@ export const spec = {
686
714
  return null;
687
715
  },
688
716
  getGetParametersAsObject() {
689
- let parsed = parseUrl(getRefererInfo().page);
717
+ let parsed = parseUrl(this.getRefererInfo().location);
690
718
  logInfo('getGetParametersAsObject found:', parsed.search);
691
719
  return parsed.search;
692
720
  },
721
+ getRefererInfo() {
722
+ if (getRefererInfo().hasOwnProperty('location')) {
723
+ logInfo('FOUND location on getRefererInfo OK (prebid >= 7); will use getRefererInfo for location & page');
724
+ return getRefererInfo();
725
+ } else {
726
+ logInfo('DID NOT FIND location on getRefererInfo (prebid < 7); will use legacy code that ALWAYS worked reliably to get location & page ;-)');
727
+ try {
728
+ return {
729
+ page: top.location.href,
730
+ location: top.location.href
731
+ };
732
+ } catch (e) {
733
+ return {
734
+ page: window.location.href,
735
+ location: window.location.href
736
+ };
737
+ }
738
+ }
739
+ },
693
740
  blockTheRequest() {
694
741
  let ozRequest = this.getWhitelabelConfigItem('ozone.oz_request');
695
742
  if (typeof ozRequest == 'boolean' && !ozRequest) {
@@ -73,6 +73,8 @@ adUnits = [{
73
73
  }];
74
74
  ```
75
75
 
76
+
77
+ ```
76
78
  //Instream Video adUnit
77
79
 
78
80
  adUnits = [{
@@ -108,4 +110,4 @@ adUnits = [{
108
110
  }
109
111
  }]
110
112
  };
111
- ```
113
+ ```
@@ -78,6 +78,12 @@ export const pairIdSubmodule = {
78
78
  return undefined;
79
79
  }
80
80
  return {'id': ids};
81
+ },
82
+ eids: {
83
+ 'pairId': {
84
+ source: 'google.com',
85
+ atype: 571187
86
+ },
81
87
  }
82
88
  };
83
89
 
@@ -7,7 +7,17 @@
7
7
 
8
8
  // ci trigger: 1
9
9
 
10
- import {contains, deepClone, inIframe, isEmpty, isPlainObject, logError, logWarn, timestamp} from '../src/utils.js';
10
+ import {
11
+ contains,
12
+ deepClone,
13
+ inIframe,
14
+ isEmpty,
15
+ isPlainObject,
16
+ logError,
17
+ logWarn,
18
+ pick,
19
+ timestamp
20
+ } from '../src/utils.js';
11
21
  import {find} from '../src/polyfill.js';
12
22
  import {ajax} from '../src/ajax.js';
13
23
  import {submodule} from '../src/hook.js';
@@ -368,7 +378,33 @@ export const parrableIdSubmodule = {
368
378
  getId(config, gdprConsentData, currentStoredId) {
369
379
  const configParams = (config && config.params) || {};
370
380
  return fetchId(configParams, gdprConsentData);
371
- }
381
+ },
382
+ eids: {
383
+ 'parrableId': {
384
+ source: 'parrable.com',
385
+ atype: 1,
386
+ getValue: function(parrableId) {
387
+ if (parrableId.eid) {
388
+ return parrableId.eid;
389
+ }
390
+ if (parrableId.ccpaOptout) {
391
+ // If the EID was suppressed due to a non consenting ccpa optout then
392
+ // we still wish to provide this as a reason to the adapters
393
+ return '';
394
+ }
395
+ return null;
396
+ },
397
+ getUidExt: function(parrableId) {
398
+ const extendedData = pick(parrableId, [
399
+ 'ibaOptout',
400
+ 'ccpaOptout'
401
+ ]);
402
+ if (Object.keys(extendedData).length) {
403
+ return extendedData;
404
+ }
405
+ }
406
+ },
407
+ },
372
408
  };
373
409
 
374
410
  submodule('userId', parrableIdSubmodule);
@@ -0,0 +1,231 @@
1
+ import { isFn, deepAccess, logMessage, logError } from '../src/utils.js';
2
+ import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
3
+
4
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
5
+ import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
6
+ import { config } from '../src/config.js';
7
+
8
+ const BIDDER_CODE = 'pubcircle';
9
+ const AD_URL = 'https://ml.pubcircle.ai/pbjs';
10
+ const SYNC_URL = 'https://cs.pubcircle.ai';
11
+
12
+ function isBidResponseValid(bid) {
13
+ if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
14
+ return false;
15
+ }
16
+
17
+ switch (bid.mediaType) {
18
+ case BANNER:
19
+ return Boolean(bid.width && bid.height && bid.ad);
20
+ case VIDEO:
21
+ return Boolean(bid.vastUrl || bid.vastXml);
22
+ case NATIVE:
23
+ return Boolean(bid.native && bid.native.impressionTrackers && bid.native.impressionTrackers.length);
24
+ default:
25
+ return false;
26
+ }
27
+ }
28
+
29
+ function getPlacementReqData(bid) {
30
+ const { params, bidId, mediaTypes } = bid;
31
+ const schain = bid.schain || {};
32
+ const { placementId } = params;
33
+ const bidfloor = getBidFloor(bid);
34
+
35
+ const placement = {
36
+ bidId,
37
+ schain,
38
+ bidfloor
39
+ };
40
+
41
+ placement.placementId = placementId;
42
+ placement.type = 'publisher';
43
+
44
+ if (bid.userId) {
45
+ getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com');
46
+ getUserId(placement.eids, bid.userId.lotamePanoramaId, 'lotame.com');
47
+ getUserId(placement.eids, bid.userId.idx, 'idx.lat');
48
+ getUserId(placement.eids, bid.userId.idl_env, 'liveramp.com');
49
+ }
50
+
51
+ if (mediaTypes && mediaTypes[BANNER]) {
52
+ placement.adFormat = BANNER;
53
+ placement.sizes = mediaTypes[BANNER].sizes;
54
+ } else if (mediaTypes && mediaTypes[VIDEO]) {
55
+ placement.adFormat = VIDEO;
56
+ placement.playerSize = mediaTypes[VIDEO].playerSize;
57
+ placement.minduration = mediaTypes[VIDEO].minduration;
58
+ placement.maxduration = mediaTypes[VIDEO].maxduration;
59
+ placement.mimes = mediaTypes[VIDEO].mimes;
60
+ placement.protocols = mediaTypes[VIDEO].protocols;
61
+ placement.startdelay = mediaTypes[VIDEO].startdelay;
62
+ placement.placement = mediaTypes[VIDEO].placement;
63
+ placement.skip = mediaTypes[VIDEO].skip;
64
+ placement.skipafter = mediaTypes[VIDEO].skipafter;
65
+ placement.minbitrate = mediaTypes[VIDEO].minbitrate;
66
+ placement.maxbitrate = mediaTypes[VIDEO].maxbitrate;
67
+ placement.delivery = mediaTypes[VIDEO].delivery;
68
+ placement.playbackmethod = mediaTypes[VIDEO].playbackmethod;
69
+ placement.api = mediaTypes[VIDEO].api;
70
+ placement.linearity = mediaTypes[VIDEO].linearity;
71
+ } else if (mediaTypes && mediaTypes[NATIVE]) {
72
+ placement.native = mediaTypes[NATIVE];
73
+ placement.adFormat = NATIVE;
74
+ }
75
+
76
+ return placement;
77
+ }
78
+
79
+ function getBidFloor(bid) {
80
+ if (!isFn(bid.getFloor)) {
81
+ return deepAccess(bid, 'params.bidfloor', 0);
82
+ }
83
+
84
+ try {
85
+ const bidFloor = bid.getFloor({
86
+ currency: 'USD',
87
+ mediaType: '*',
88
+ size: '*',
89
+ });
90
+ return bidFloor.floor;
91
+ } catch (err) {
92
+ logError(err);
93
+ return 0;
94
+ }
95
+ }
96
+
97
+ function getUserId(eids, id, source, uidExt) {
98
+ if (id) {
99
+ var uid = { id };
100
+ if (uidExt) {
101
+ uid.ext = uidExt;
102
+ }
103
+ eids.push({
104
+ source,
105
+ uids: [ uid ]
106
+ });
107
+ }
108
+ }
109
+
110
+ export const spec = {
111
+ code: BIDDER_CODE,
112
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
113
+
114
+ isBidRequestValid: (bid = {}) => {
115
+ const { params, bidId, mediaTypes } = bid;
116
+ let valid = Boolean(bidId && params && params.placementId);
117
+
118
+ if (mediaTypes && mediaTypes[BANNER]) {
119
+ valid = valid && Boolean(mediaTypes[BANNER] && mediaTypes[BANNER].sizes);
120
+ } else if (mediaTypes && mediaTypes[VIDEO]) {
121
+ valid = valid && Boolean(mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize);
122
+ } else if (mediaTypes && mediaTypes[NATIVE]) {
123
+ valid = valid && Boolean(mediaTypes[NATIVE]);
124
+ } else {
125
+ valid = false;
126
+ }
127
+ return valid;
128
+ },
129
+
130
+ buildRequests: (validBidRequests = [], bidderRequest = {}) => {
131
+ // convert Native ORTB definition to old-style prebid native definition
132
+ validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
133
+
134
+ let deviceWidth = 0;
135
+ let deviceHeight = 0;
136
+
137
+ let winLocation;
138
+ try {
139
+ const winTop = window.top;
140
+ deviceWidth = winTop.screen.width;
141
+ deviceHeight = winTop.screen.height;
142
+ winLocation = winTop.location;
143
+ } catch (e) {
144
+ logMessage(e);
145
+ winLocation = window.location;
146
+ }
147
+
148
+ const refferUrl = bidderRequest.refererInfo && bidderRequest.refererInfo.page;
149
+ let refferLocation;
150
+ try {
151
+ refferLocation = refferUrl && new URL(refferUrl);
152
+ } catch (e) {
153
+ logMessage(e);
154
+ }
155
+ // TODO: does the fallback make sense here?
156
+ let location = refferLocation || winLocation;
157
+ const language = (navigator && navigator.language) ? navigator.language.split('-')[0] : '';
158
+ const host = location.host;
159
+ const page = location.pathname;
160
+ const secure = location.protocol === 'https:' ? 1 : 0;
161
+ const placements = [];
162
+ const request = {
163
+ deviceWidth,
164
+ deviceHeight,
165
+ language,
166
+ secure,
167
+ host,
168
+ page,
169
+ placements,
170
+ coppa: config.getConfig('coppa') === true ? 1 : 0,
171
+ ccpa: bidderRequest.uspConsent || undefined,
172
+ gdpr: bidderRequest.gdprConsent || undefined,
173
+ tmax: bidderRequest.timeout
174
+ };
175
+
176
+ const len = validBidRequests.length;
177
+ for (let i = 0; i < len; i++) {
178
+ const bid = validBidRequests[i];
179
+ placements.push(getPlacementReqData(bid));
180
+ }
181
+
182
+ return {
183
+ method: 'POST',
184
+ url: AD_URL,
185
+ data: request
186
+ };
187
+ },
188
+
189
+ interpretResponse: (serverResponse) => {
190
+ let response = [];
191
+ for (let i = 0; i < serverResponse.body.length; i++) {
192
+ let resItem = serverResponse.body[i];
193
+ if (isBidResponseValid(resItem)) {
194
+ const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : [];
195
+ resItem.meta = { ...resItem.meta, advertiserDomains };
196
+
197
+ response.push(resItem);
198
+ }
199
+ }
200
+ return response;
201
+ },
202
+
203
+ getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
204
+ let syncType = syncOptions.iframeEnabled ? 'iframe' : 'image';
205
+ let syncUrl = SYNC_URL + `/${syncType}?pbjs=1`;
206
+ if (gdprConsent && gdprConsent.consentString) {
207
+ if (typeof gdprConsent.gdprApplies === 'boolean') {
208
+ syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
209
+ } else {
210
+ syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`;
211
+ }
212
+ }
213
+ if (uspConsent && uspConsent.consentString) {
214
+ syncUrl += `&ccpa_consent=${uspConsent.consentString}`;
215
+ }
216
+
217
+ const coppa = config.getConfig('coppa') ? 1 : 0;
218
+ syncUrl += `&coppa=${coppa}`;
219
+
220
+ return [{
221
+ type: syncType,
222
+ url: syncUrl
223
+ }];
224
+ },
225
+
226
+ onBidViewable: function (bid) {
227
+ // to do : we need to implement js tag to fire pixel with viewability counter
228
+ }
229
+ };
230
+
231
+ registerBidder(spec);
@@ -0,0 +1,79 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: PubCirlce Bidder Adapter
5
+ Module Type: PubCirlce Bidder Adapter
6
+ Maintainer: system@smartyads.com
7
+ ```
8
+
9
+ # Description
10
+
11
+ Connects to PubCirlce exchange for bids.
12
+ PubCirlce bid adapter supports Banner, Video (instream and outstream) and Native.
13
+
14
+ # Test Parameters
15
+ ```
16
+ var adUnits = [
17
+ // Will return static test banner
18
+ {
19
+ code: 'addunit1',
20
+ mediaTypes: {
21
+ banner: {
22
+ sizes: [ [300, 250], [320, 50] ],
23
+ }
24
+ },
25
+ bids: [
26
+ {
27
+ bidder: 'pubcircle',
28
+ params: {
29
+ placementId: 'testBanner',
30
+ }
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ code: 'addunit2',
36
+ mediaTypes: {
37
+ video: {
38
+ playerSize: [ [640, 480] ],
39
+ context: 'instream',
40
+ minduration: 5,
41
+ maxduration: 60,
42
+ }
43
+ },
44
+ bids: [
45
+ {
46
+ bidder: 'pubcircle',
47
+ params: {
48
+ placementId: 'testVideo',
49
+ }
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ code: 'addunit3',
55
+ mediaTypes: {
56
+ native: {
57
+ title: {
58
+ required: true
59
+ },
60
+ body: {
61
+ required: true
62
+ },
63
+ icon: {
64
+ required: true,
65
+ size: [64, 64]
66
+ }
67
+ }
68
+ },
69
+ bids: [
70
+ {
71
+ bidder: 'pubcircle',
72
+ params: {
73
+ placementId: 'testNative',
74
+ }
75
+ }
76
+ ]
77
+ }
78
+ ];
79
+ ```
@@ -140,6 +140,12 @@ export const publinkIdSubmodule = {
140
140
  if (!storedId) {
141
141
  return {callback: makeCallback(config, consentData)};
142
142
  }
143
- }
143
+ },
144
+ eids: {
145
+ 'publinkId': {
146
+ source: 'epsilon.com',
147
+ atype: 3
148
+ },
149
+ },
144
150
  };
145
151
  submodule('userId', publinkIdSubmodule);
@@ -214,6 +214,12 @@ export const quantcastIdSubmodule = {
214
214
  }
215
215
 
216
216
  return { id: fpa ? { quantcastId: fpa } : undefined };
217
+ },
218
+ eids: {
219
+ 'quantcastId': {
220
+ source: 'quantcast.com',
221
+ atype: 1
222
+ },
217
223
  }
218
224
  };
219
225
 
@@ -110,6 +110,7 @@ function composeOrtb2Data(rtdData, prefix) {
110
110
  !isEmpty(categories.cat) && deepSetValue(addOrtb2, prefix + '.cat', categories.cat);
111
111
  !isEmpty(categories.pagecat) && deepSetValue(addOrtb2, prefix + '.pagecat', categories.pagecat);
112
112
  !isEmpty(categories.sectioncat) && deepSetValue(addOrtb2, prefix + '.sectioncat', categories.sectioncat);
113
+ !isEmpty(categories.sectioncat) && deepSetValue(addOrtb2, prefix + '.ext.data.relevad_rtd', categories.sectioncat);
113
114
  !isEmpty(categories.cattax) && deepSetValue(addOrtb2, prefix + '.cattax', categories.cattax);
114
115
 
115
116
  if (!isEmpty(content) && !isEmpty(content.segs) && content.segtax) {
@@ -134,7 +135,8 @@ function setBidderSiteAndContent(bidderOrtbFragment, bidder, rtdData) {
134
135
  try {
135
136
  let addOrtb2 = composeOrtb2Data(rtdData, 'site');
136
137
  !isEmpty(rtdData.segments) && deepSetValue(addOrtb2, 'user.ext.data.relevad_rtd', rtdData.segments);
137
- !isEmpty(rtdData.categories?.sectioncat) && deepSetValue(addOrtb2, 'site.ext.data.relevad_rtd', rtdData.categories.sectioncat);
138
+ !isEmpty(rtdData.segments) && deepSetValue(addOrtb2, 'user.ext.data.segments', rtdData.segments);
139
+ !isEmpty(rtdData.categories) && deepSetValue(addOrtb2, 'user.ext.data.contextual_categories', rtdData.categories.pagecat);
138
140
  if (isEmpty(addOrtb2)) {
139
141
  return;
140
142
  }
@@ -180,7 +182,7 @@ function getFiltered(data, minscore) {
180
182
  const cats = filterByScore(data.cats, minscore);
181
183
  const pcats = filterByScore(data.pcats, minscore) || cats;
182
184
  const scats = filterByScore(data.scats, minscore) || pcats;
183
- const cattax = data.cattax ? data.cattax : CATTAX_IAB;
185
+ const cattax = (data.cattax || data.cattax === undefined) ? data.cattax : CATTAX_IAB;
184
186
  relevadData.categories = {cat: cats, pagecat: pcats, sectioncat: scats, cattax: cattax};
185
187
 
186
188
  const contsegs = filterByScore(data.contsegs, minscore);
@@ -268,15 +270,12 @@ export function addRtdData(reqBids, data, moduleConfig) {
268
270
  }
269
271
  if (wb && !isEmpty(relevadList)) {
270
272
  setBidderSiteAndContent(reqBids.ortb2Fragments?.bidder, bid.bidder, relevadData);
273
+ setBidderSiteAndContent(bid, 'ortb2', relevadData);
271
274
  deepSetValue(bid, 'params.keywords.relevad_rtd', relevadList);
272
- deepSetValue(bid, 'params.target', [].concat(bid.params?.target ? [bid.params.target] : []).concat(relevadList.map(entry => { return 'relevad_rtd=' + entry; })).join(';'));
275
+ !(bid.params?.target || '').includes('relevad_rtd=') && deepSetValue(bid, 'params.target', [].concat(bid.params?.target ? [bid.params.target] : []).concat(relevadList.map(entry => { return 'relevad_rtd=' + entry; })).join(';'));
273
276
  let firstPartyData = {};
274
277
  firstPartyData[bid.bidder] = { firstPartyData: { relevad_rtd: relevadList } };
275
278
  config.setConfig(firstPartyData);
276
- !isEmpty(relevadData.segments) && deepSetValue(bid, 'ortb2.user.ext.data.segments', relevadData.segments);
277
- !isEmpty(relevadData.categories) && deepSetValue(bid, 'ortb2.user.ext.data.contextual_categories', relevadData.categories.pagecat);
278
- !isEmpty(relevadData.categories) && deepSetValue(bid, 'ortb2.site.ext.data.relevad_rtd', relevadData.categories.pagecat);
279
- !isEmpty(relevadData.segments) && deepSetValue(bid, 'ortb2.user.ext.data.relevad_rtd', relevadData.segments);
280
279
  }
281
280
  }
282
281
  } catch (e) {
@@ -200,6 +200,10 @@ export const converter = ortbConverter({
200
200
  bidRequest.params.position === 'btf' && (imp.video.pos = 3);
201
201
  delete imp.ext?.prebid?.storedrequest;
202
202
 
203
+ if (bidRequest.params.bidonmultiformat === true && bidRequestType.length > 1) {
204
+ deepSetValue(imp, 'ext.prebid.bidder.rubicon.formats', bidRequestType);
205
+ }
206
+
203
207
  setBidFloors(bidRequest, imp);
204
208
 
205
209
  return imp;
@@ -497,6 +501,11 @@ export const spec = {
497
501
  data['rp_hard_floor'] = typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined;
498
502
  }
499
503
 
504
+ // Send multiformat data if requested
505
+ if (params.bidonmultiformat === true && deepAccess(bidRequest, 'mediaTypes') && Object.keys(bidRequest.mediaTypes).length > 1) {
506
+ data['p_formats'] = Object.keys(bidRequest.mediaTypes).join(',');
507
+ }
508
+
500
509
  // add p_pos only if specified and valid
501
510
  // For SRA we need to explicitly put empty semi colons so AE treats it as empty, instead of copying the latter value
502
511
  let posMapping = {1: 'atf', 3: 'btf'};