prebid.js 7.18.0 → 7.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adfBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.js +1 -1
  9. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  10. package/dist/adkernelBidAdapter.js +1 -1
  11. package/dist/adlooxAdServerVideo.js +1 -1
  12. package/dist/adlooxAnalyticsAdapter.js +1 -1
  13. package/dist/adlooxRtdProvider.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adqueryIdSystem.js +1 -1
  16. package/dist/adrelevantisBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -1
  18. package/dist/adxcgAnalyticsAdapter.js +1 -1
  19. package/dist/adxcgBidAdapter.js +1 -1
  20. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aolBidAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +1 -1
  31. package/dist/bidViewability.js +1 -1
  32. package/dist/bidglassBidAdapter.js +1 -1
  33. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/byDataAnalyticsAdapter.js +1 -1
  38. package/dist/carodaBidAdapter.js +1 -1
  39. package/dist/categoryTranslation.js +1 -1
  40. package/dist/cleanioRtdProvider.js +1 -1
  41. package/dist/colossussspBidAdapter.js +1 -1
  42. package/dist/concertAnalyticsAdapter.js +1 -1
  43. package/dist/concertBidAdapter.js +1 -1
  44. package/dist/connectIdSystem.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -0
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/currency.js +1 -1
  54. package/dist/datablocksAnalyticsAdapter.js +1 -1
  55. package/dist/dchain.js +1 -1
  56. package/dist/debugging-standalone.js +1 -1
  57. package/dist/debugging.js +1 -1
  58. package/dist/dependencies.json +9 -0
  59. package/dist/dfpAdServerVideo.js +1 -1
  60. package/dist/dgkeywordRtdProvider.js +1 -1
  61. package/dist/dianomiBidAdapter.js +1 -1
  62. package/dist/dspxBidAdapter.js +1 -1
  63. package/dist/enrichmentFpdModule.js +1 -1
  64. package/dist/eplanningAnalyticsAdapter.js +1 -1
  65. package/dist/eplanningBidAdapter.js +1 -1
  66. package/dist/finativeBidAdapter.js +1 -1
  67. package/dist/fintezaAnalyticsAdapter.js +1 -1
  68. package/dist/fpd.js +1 -0
  69. package/dist/ftrackIdSystem.js +1 -1
  70. package/dist/gdprEnforcement.js +1 -1
  71. package/dist/glimpseBidAdapter.js +1 -1
  72. package/dist/gmosspBidAdapter.js +1 -1
  73. package/dist/goldbachBidAdapter.js +1 -1
  74. package/dist/googleAnalyticsAdapter.js +1 -1
  75. package/dist/gridBidAdapter.js +1 -1
  76. package/dist/gridNMBidAdapter.js +1 -1
  77. package/dist/gumgumBidAdapter.js +1 -1
  78. package/dist/h12mediaBidAdapter.js +1 -1
  79. package/dist/hadronAnalyticsAdapter.js +1 -1
  80. package/dist/id5AnalyticsAdapter.js +1 -1
  81. package/dist/id5IdSystem.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/kargoAnalyticsAdapter.js +1 -1
  89. package/dist/kinessoIdSystem.js +1 -1
  90. package/dist/konduitAnalyticsAdapter.js +1 -1
  91. package/dist/kueezBidAdapter.js +1 -1
  92. package/dist/lassoBidAdapter.js +1 -1
  93. package/dist/lifestreetBidAdapter.js +1 -1
  94. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  95. package/dist/liveIntentIdSystem.js +1 -1
  96. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  97. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  98. package/dist/logicadBidAdapter.js +1 -1
  99. package/dist/loglyliftBidAdapter.js +1 -1
  100. package/dist/lotamePanoramaIdSystem.js +1 -1
  101. package/dist/magniteAnalyticsAdapter.js +1 -0
  102. package/dist/malltvAnalyticsAdapter.js +1 -1
  103. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  104. package/dist/marsmediaBidAdapter.js +1 -1
  105. package/dist/mass.js +1 -1
  106. package/dist/mediafuseBidAdapter.js +1 -1
  107. package/dist/mediakeysBidAdapter.js +1 -1
  108. package/dist/medianetAnalyticsAdapter.js +1 -1
  109. package/dist/mediasquareBidAdapter.js +1 -1
  110. package/dist/mgidBidAdapter.js +1 -1
  111. package/dist/minutemediaBidAdapter.js +1 -1
  112. package/dist/multibid.js +1 -1
  113. package/dist/nativoBidAdapter.js +1 -1
  114. package/dist/not-for-prod/prebid.js +198 -194
  115. package/dist/oguryBidAdapter.js +1 -1
  116. package/dist/onetagBidAdapter.js +1 -1
  117. package/dist/ooloAnalyticsAdapter.js +1 -1
  118. package/dist/openxAnalyticsAdapter.js +1 -1
  119. package/dist/optimonAnalyticsAdapter.js +1 -1
  120. package/dist/outbrainBidAdapter.js +1 -1
  121. package/dist/parrableIdSystem.js +1 -1
  122. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  123. package/dist/pixfutureBidAdapter.js +1 -1
  124. package/dist/prebid-core.js +2 -2
  125. package/dist/prebidServerBidAdapter.js +1 -1
  126. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  127. package/dist/priceFloors.js +1 -1
  128. package/dist/publinkIdSystem.js +1 -1
  129. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  130. package/dist/pubmaticBidAdapter.js +1 -1
  131. package/dist/pubperfAnalyticsAdapter.js +1 -1
  132. package/dist/pubstackAnalyticsAdapter.js +1 -1
  133. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  134. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  135. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  136. package/dist/pxyzBidAdapter.js +1 -1
  137. package/dist/quantcastBidAdapter.js +1 -1
  138. package/dist/quantcastIdSystem.js +1 -1
  139. package/dist/readpeakBidAdapter.js +1 -1
  140. package/dist/realvuAnalyticsAdapter.js +1 -1
  141. package/dist/relaidoBidAdapter.js +1 -1
  142. package/dist/relevantAnalyticsAdapter.js +1 -1
  143. package/dist/rhythmoneBidAdapter.js +1 -1
  144. package/dist/riseBidAdapter.js +1 -1
  145. package/dist/rivrAnalyticsAdapter.js +1 -1
  146. package/dist/roxotAnalyticsAdapter.js +1 -1
  147. package/dist/rtdModule.js +1 -1
  148. package/dist/rubiconAnalyticsAdapter.js +1 -1
  149. package/dist/rubiconBidAdapter.js +1 -1
  150. package/dist/s2sTesting.js +1 -1
  151. package/dist/scaleableAnalyticsAdapter.js +1 -1
  152. package/dist/schain.js +1 -1
  153. package/dist/seedingAllianceBidAdapter.js +1 -1
  154. package/dist/seedtagBidAdapter.js +1 -1
  155. package/dist/sharedIdSystem.js +1 -1
  156. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  157. package/dist/sharethroughBidAdapter.js +1 -1
  158. package/dist/shinezBidAdapter.js +1 -1
  159. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  160. package/dist/smaatoBidAdapter.js +1 -1
  161. package/dist/smartadserverBidAdapter.js +1 -1
  162. package/dist/smartxBidAdapter.js +1 -1
  163. package/dist/smilewantedBidAdapter.js +1 -1
  164. package/dist/sonobiAnalyticsAdapter.js +1 -1
  165. package/dist/sonobiBidAdapter.js +1 -1
  166. package/dist/sovrnAnalyticsAdapter.js +1 -1
  167. package/dist/sovrnBidAdapter.js +1 -1
  168. package/dist/sspBCBidAdapter.js +1 -1
  169. package/dist/staqAnalyticsAdapter.js +1 -1
  170. package/dist/sublimeBidAdapter.js +1 -1
  171. package/dist/synacormediaBidAdapter.js +1 -1
  172. package/dist/taboolaBidAdapter.js +1 -1
  173. package/dist/tapadIdSystem.js +1 -1
  174. package/dist/targetVideoBidAdapter.js +1 -1
  175. package/dist/teadsBidAdapter.js +1 -1
  176. package/dist/teadsIdSystem.js +1 -0
  177. package/dist/terceptAnalyticsAdapter.js +1 -1
  178. package/dist/trionBidAdapter.js +1 -1
  179. package/dist/tripleliftBidAdapter.js +1 -1
  180. package/dist/ttdBidAdapter.js +1 -1
  181. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  182. package/dist/underdogmediaBidAdapter.js +1 -1
  183. package/dist/undertoneBidAdapter.js +1 -1
  184. package/dist/userId.js +1 -1
  185. package/dist/vidazooBidAdapter.js +1 -1
  186. package/dist/videobyteBidAdapter.js +1 -1
  187. package/dist/visxBidAdapter.js +1 -1
  188. package/dist/vrtcalBidAdapter.js +1 -1
  189. package/dist/vuukleBidAdapter.js +1 -1
  190. package/dist/weboramaRtdProvider.js +1 -1
  191. package/dist/widespaceBidAdapter.js +1 -1
  192. package/dist/winrBidAdapter.js +1 -1
  193. package/dist/yahoosspBidAdapter.js +1 -1
  194. package/dist/yandexBidAdapter.js +1 -1
  195. package/dist/yieldmoBidAdapter.js +1 -1
  196. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  197. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  198. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  199. package/libraries/fpd/sua.js +98 -0
  200. package/modules/.submodules.json +1 -0
  201. package/modules/adfBidAdapter.js +1 -1
  202. package/modules/adkernelAdnBidAdapter.js +1 -0
  203. package/modules/adkernelBidAdapter.js +2 -2
  204. package/modules/adqueryIdSystem.js +8 -8
  205. package/modules/adxcgBidAdapter.js +1 -1
  206. package/modules/amxBidAdapter.js +1 -1
  207. package/modules/aolBidAdapter.js +25 -2
  208. package/modules/appnexusBidAdapter.js +19 -2
  209. package/modules/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +0 -0
  210. package/modules/{andBeyondMediaBidAdapter.md → beyondmediaBidAdapter.md} +1 -1
  211. package/modules/categoryTranslation.js +4 -4
  212. package/modules/cleanioRtdProvider.js +3 -4
  213. package/modules/colossussspBidAdapter.js +2 -1
  214. package/modules/connectIdSystem.js +16 -1
  215. package/modules/conversantAnalyticsAdapter.js +560 -0
  216. package/modules/conversantAnalyticsAdapter.md +47 -0
  217. package/modules/criteoBidAdapter.js +1 -1
  218. package/modules/currency.js +11 -11
  219. package/modules/dchain.js +2 -2
  220. package/modules/debugging/bidInterceptor.js +2 -2
  221. package/modules/debugging/debugging.js +10 -2
  222. package/modules/debugging/legacy.js +2 -2
  223. package/modules/dgkeywordRtdProvider.js +21 -3
  224. package/modules/dianomiBidAdapter.js +1 -1
  225. package/modules/enrichmentFpdModule.js +33 -14
  226. package/modules/eplanningBidAdapter.js +48 -2
  227. package/modules/finativeBidAdapter.js +1 -1
  228. package/modules/gridBidAdapter.js +187 -117
  229. package/modules/improvedigitalBidAdapter.js +2 -2
  230. package/modules/ixBidAdapter.js +94 -23
  231. package/modules/liveIntentIdSystem.js +39 -5
  232. package/modules/lotamePanoramaIdSystem.js +10 -6
  233. package/modules/magniteAnalyticsAdapter.js +902 -0
  234. package/modules/magniteAnalyticsAdapter.md +18 -0
  235. package/modules/mass.js +2 -2
  236. package/modules/mediakeysBidAdapter.js +6 -1
  237. package/modules/mediakeysBidAdapter.md +50 -40
  238. package/modules/multibid/index.js +5 -5
  239. package/modules/nativoBidAdapter.js +1 -1
  240. package/modules/pixfutureBidAdapter.js +46 -15
  241. package/modules/prebidServerBidAdapter/index.js +54 -19
  242. package/modules/priceFloors.js +8 -22
  243. package/modules/readpeakBidAdapter.js +1 -1
  244. package/modules/rubiconAnalyticsAdapter.js +14 -9
  245. package/modules/rubiconBidAdapter.js +2 -3
  246. package/modules/seedingAllianceBidAdapter.js +1 -1
  247. package/modules/sharethroughBidAdapter.js +1 -1
  248. package/modules/taboolaBidAdapter.js +5 -5
  249. package/modules/talkadsBidAdapter.js +1 -0
  250. package/modules/teadsIdSystem.js +234 -0
  251. package/modules/teadsIdSystem.md +22 -0
  252. package/modules/truereachBidAdapter.js +1 -0
  253. package/modules/ttdBidAdapter.js +1 -1
  254. package/modules/userId/index.js +21 -14
  255. package/modules/vrtcalBidAdapter.js +7 -1
  256. package/modules/vuukleBidAdapter.js +34 -3
  257. package/modules/yahoosspBidAdapter.js +4 -2
  258. package/modules/yandexBidAdapter.js +31 -8
  259. package/package.json +2 -2
  260. package/src/adapterManager.js +2 -4
  261. package/src/adapters/bidderFactory.js +13 -11
  262. package/src/auction.js +140 -69
  263. package/src/constants.json +8 -0
  264. package/src/cpmBucketManager.js +22 -3
  265. package/src/native.js +1 -5
  266. package/src/prebid.js +5 -6
  267. package/src/targeting.js +31 -14
  268. package/test/fixtures/fixtures.js +2 -1
  269. package/test/spec/auctionmanager_spec.js +109 -21
  270. package/test/spec/cpmBucketManager_spec.js +239 -177
  271. package/test/spec/fpd/sua_spec.js +244 -0
  272. package/test/spec/modules/adfBidAdapter_spec.js +2 -3
  273. package/test/spec/modules/adqueryIdSystem_spec.js +0 -2
  274. package/test/spec/modules/adxcgBidAdapter_spec.js +2 -3
  275. package/test/spec/modules/amxBidAdapter_spec.js +3 -2
  276. package/test/spec/modules/aolBidAdapter_spec.js +42 -9
  277. package/test/spec/modules/appnexusBidAdapter_spec.js +24 -0
  278. package/test/spec/modules/{andBeyondMediaBidAdapter_spec.js → beyondmediaBidAdapter_spec.js} +1 -1
  279. package/test/spec/modules/colossussspBidAdapter_spec.js +4 -2
  280. package/test/spec/modules/connectIdSystem_spec.js +20 -0
  281. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +963 -0
  282. package/test/spec/modules/currency_spec.js +14 -6
  283. package/test/spec/modules/debugging_mod_spec.js +9 -0
  284. package/test/spec/modules/dgkeywordRtdProvider_spec.js +83 -1
  285. package/test/spec/modules/dianomiBidAdapter_spec.js +2 -3
  286. package/test/spec/modules/enrichmentFpdModule_spec.js +50 -7
  287. package/test/spec/modules/eplanningBidAdapter_spec.js +285 -1
  288. package/test/spec/modules/fpdModule_spec.js +9 -0
  289. package/test/spec/modules/gridBidAdapter_spec.js +87 -31
  290. package/test/spec/modules/ixBidAdapter_spec.js +221 -2
  291. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +62 -8
  292. package/test/spec/modules/liveIntentIdSystem_spec.js +62 -8
  293. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +0 -1
  294. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +1942 -0
  295. package/test/spec/modules/mediakeysBidAdapter_spec.js +20 -3
  296. package/test/spec/modules/nativoBidAdapter_spec.js +13 -2
  297. package/test/spec/modules/prebidServerBidAdapter_spec.js +202 -15
  298. package/test/spec/modules/priceFloors_spec.js +5 -5
  299. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +2 -3
  300. package/test/spec/modules/seedtagBidAdapter_spec.js +15 -18
  301. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  302. package/test/spec/modules/taboolaBidAdapter_spec.js +112 -13
  303. package/test/spec/modules/teadsIdSystem_spec.js +271 -0
  304. package/test/spec/modules/ttdBidAdapter_spec.js +3 -3
  305. package/test/spec/modules/userId_spec.js +39 -4
  306. package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -1
  307. package/test/spec/modules/vuukleBidAdapter_spec.js +87 -0
  308. package/test/spec/modules/yahoosspBidAdapter_spec.js +48 -1
  309. package/test/spec/modules/yandexBidAdapter_spec.js +8 -5
  310. package/test/spec/native_spec.js +5 -0
  311. package/test/spec/unit/core/bidderFactory_spec.js +66 -11
  312. package/test/spec/unit/core/targeting_spec.js +28 -9
  313. package/test/spec/unit/pbjs_api_spec.js +48 -2
@@ -72,10 +72,14 @@ export const spec = {
72
72
  let forceBidderName = false;
73
73
  let {bidderRequestId, auctionId, gdprConsent, uspConsent, timeout, refererInfo} = bidderRequest || {};
74
74
 
75
- // TODO: is 'page' the right value here?
76
75
  const referer = refererInfo ? encodeURIComponent(refererInfo.page) : '';
76
+ const bidderTimeout = config.getConfig('bidderTimeout') || timeout;
77
+ const tmax = timeout ? Math.min(bidderTimeout, timeout) : bidderTimeout;
77
78
  const imp = [];
78
79
  const bidsMap = {};
80
+ const requests = [];
81
+ const sources = [];
82
+ const bidsArray = [];
79
83
 
80
84
  validBidRequests.forEach((bid) => {
81
85
  if (!bidderRequestId) {
@@ -93,7 +97,8 @@ export const spec = {
93
97
  if (!endpoint) {
94
98
  endpoint = ALIAS_CONFIG[bid.bidder] && ALIAS_CONFIG[bid.bidder].endpoint;
95
99
  }
96
- const { params: { uid, keywords, forceBidder }, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp } = bid;
100
+ const { params: { uid, keywords, forceBidder, multiRequest }, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp } = bid;
101
+ const { pubdata, secid, pubid, source, content: bidParamsContent } = bid.params;
97
102
  bidsMap[bidId] = bid;
98
103
  const bidFloor = _getFloor(mediaTypes || {}, bid);
99
104
  const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting;
@@ -105,9 +110,10 @@ export const spec = {
105
110
  content = jwTargeting.content;
106
111
  }
107
112
  }
113
+
108
114
  let impObj = {
109
115
  id: bidId.toString(),
110
- tagid: uid.toString(),
116
+ tagid: (secid || uid).toString(),
111
117
  ext: {
112
118
  divid: adUnitCode.toString()
113
119
  }
@@ -150,7 +156,54 @@ export const spec = {
150
156
  }
151
157
 
152
158
  if (impObj.banner || impObj.video) {
153
- imp.push(impObj);
159
+ if (multiRequest) {
160
+ const reqSource = {
161
+ tid: bid.auctionId && bid.auctionId.toString(),
162
+ ext: {
163
+ wrapper: 'Prebid_js',
164
+ wrapper_version: '$prebid.version$'
165
+ }
166
+ };
167
+ if (bid.schain) {
168
+ reqSource.ext.schain = bid.schain;
169
+ }
170
+ const request = {
171
+ id: bid.bidderRequestId && bid.bidderRequestId.toString(),
172
+ site: {
173
+ page: referer,
174
+ },
175
+ tmax,
176
+ source: reqSource,
177
+ imp: [impObj]
178
+ };
179
+
180
+ if (pubid) {
181
+ request.site.publisher = { id: pubid };
182
+ }
183
+
184
+ const reqJwpseg = (pubdata && pubdata.jwpseg) || (jwTargeting && jwTargeting.segments);
185
+
186
+ const siteContent = bidParamsContent || (jwTargeting && jwTargeting.content);
187
+
188
+ if (siteContent) {
189
+ request.site.content = siteContent;
190
+ }
191
+
192
+ if (reqJwpseg && reqJwpseg.length) {
193
+ request.user = {
194
+ data: [{
195
+ name: 'iow_labs_pub_data',
196
+ segment: segmentProcessing(reqJwpseg, 'jwpseg'),
197
+ }]
198
+ };
199
+ }
200
+
201
+ requests.push(request);
202
+ sources.push(source);
203
+ bidsArray.push(bid);
204
+ } else {
205
+ imp.push(impObj);
206
+ }
154
207
  }
155
208
 
156
209
  if (!forceBidderName && forceBidder && ALIAS_CONFIG[forceBidder]) {
@@ -165,7 +218,7 @@ export const spec = {
165
218
  this.forceBidderName = forceBidderName;
166
219
  }
167
220
 
168
- const source = {
221
+ const reqSource = {
169
222
  tid: auctionId && auctionId.toString(),
170
223
  ext: {
171
224
  wrapper: 'Prebid_js',
@@ -174,28 +227,25 @@ export const spec = {
174
227
  };
175
228
 
176
229
  if (schain) {
177
- source.ext.schain = schain;
230
+ reqSource.ext.schain = schain;
178
231
  }
179
232
 
180
- const bidderTimeout = config.getConfig('bidderTimeout') || timeout;
181
- const tmax = timeout ? Math.min(bidderTimeout, timeout) : bidderTimeout;
182
-
183
- let request = {
233
+ const mainRequest = (imp.length || !requests.length) ? {
184
234
  id: bidderRequestId && bidderRequestId.toString(),
185
235
  site: {
186
236
  page: referer
187
237
  },
188
238
  tmax,
189
- source,
239
+ source: reqSource,
190
240
  imp
191
- };
241
+ } : null;
192
242
 
193
243
  if (content) {
194
- request.site.content = content;
244
+ mainRequest.site.content = content;
195
245
  }
196
246
 
197
247
  if (jwpseg && jwpseg.length) {
198
- user = {
248
+ mainRequest.user = {
199
249
  data: [{
200
250
  name: 'iow_labs_pub_data',
201
251
  segment: segmentProcessing(jwpseg, 'jwpseg'),
@@ -203,131 +253,151 @@ export const spec = {
203
253
  };
204
254
  }
205
255
 
206
- const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data');
207
- if (ortb2UserData && ortb2UserData.length) {
208
- if (!user) {
209
- user = { data: [] };
256
+ [...requests, mainRequest].forEach((request) => {
257
+ if (!request) {
258
+ return;
210
259
  }
211
- user = mergeDeep(user, {
212
- data: [...ortb2UserData]
213
- });
214
- }
215
260
 
216
- if (gdprConsent && gdprConsent.consentString) {
217
- userExt = {consent: gdprConsent.consentString};
218
- }
261
+ const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data');
262
+ if (ortb2UserData && ortb2UserData.length) {
263
+ user = request.user || { data: [] };
264
+ user = mergeDeep(user, {
265
+ data: [...ortb2UserData]
266
+ });
267
+ }
219
268
 
220
- const ortb2UserExtDevice = deepAccess(bidderRequest, 'ortb2.user.ext.device');
221
- if (ortb2UserExtDevice) {
222
- userExt = userExt || {};
223
- userExt.device = { ...ortb2UserExtDevice };
224
- }
269
+ if (gdprConsent && gdprConsent.consentString) {
270
+ userExt = {consent: gdprConsent.consentString};
271
+ }
225
272
 
226
- if (userIdAsEids && userIdAsEids.length) {
227
- userExt = userExt || {};
228
- userExt.eids = [...userIdAsEids];
229
- }
273
+ const ortb2UserExtDevice = deepAccess(bidderRequest, 'ortb2.user.ext.device');
274
+ if (ortb2UserExtDevice) {
275
+ userExt = userExt || {};
276
+ userExt.device = { ...ortb2UserExtDevice };
277
+ }
230
278
 
231
- if (userExt && Object.keys(userExt).length) {
232
- user = user || {};
233
- user.ext = userExt;
234
- }
279
+ if (userIdAsEids && userIdAsEids.length) {
280
+ userExt = userExt || {};
281
+ userExt.eids = [...userIdAsEids];
282
+ }
235
283
 
236
- const fpdUserId = getUserIdFromFPDStorage();
284
+ if (userExt && Object.keys(userExt).length) {
285
+ user = user || {};
286
+ user.ext = userExt;
287
+ }
237
288
 
238
- if (fpdUserId) {
239
- user = user || {};
240
- user.id = fpdUserId.toString();
241
- }
289
+ const fpdUserId = getUserIdFromFPDStorage();
242
290
 
243
- if (user) {
244
- request.user = user;
245
- }
291
+ if (fpdUserId) {
292
+ user = user || {};
293
+ user.id = fpdUserId.toString();
294
+ }
246
295
 
247
- const userKeywords = deepAccess(bidderRequest, 'ortb2.user.keywords') || null;
248
- const siteKeywords = deepAccess(bidderRequest, 'ortb2.site.keywords') || null;
296
+ if (user) {
297
+ request.user = user;
298
+ }
249
299
 
250
- if (userKeywords) {
251
- pageKeywords = pageKeywords || {};
252
- pageKeywords.user = pageKeywords.user || {};
253
- pageKeywords.user.ortb2 = [
254
- {
255
- name: 'keywords',
256
- keywords: userKeywords.split(','),
257
- }
258
- ];
259
- }
260
- if (siteKeywords) {
261
- pageKeywords = pageKeywords || {};
262
- pageKeywords.site = pageKeywords.site || {};
263
- pageKeywords.site.ortb2 = [
264
- {
265
- name: 'keywords',
266
- keywords: siteKeywords.split(','),
267
- }
268
- ];
269
- }
300
+ const userKeywords = deepAccess(bidderRequest, 'ortb2.user.keywords') || null;
301
+ const siteKeywords = deepAccess(bidderRequest, 'ortb2.site.keywords') || null;
270
302
 
271
- if (pageKeywords) {
272
- pageKeywords = reformatKeywords(pageKeywords);
273
- if (pageKeywords) {
274
- request.ext = {
275
- keywords: pageKeywords
276
- };
303
+ if (userKeywords) {
304
+ pageKeywords = pageKeywords || {};
305
+ pageKeywords.user = pageKeywords.user || {};
306
+ pageKeywords.user.ortb2 = [
307
+ {
308
+ name: 'keywords',
309
+ keywords: userKeywords.split(','),
310
+ }
311
+ ];
312
+ }
313
+ if (siteKeywords) {
314
+ pageKeywords = pageKeywords || {};
315
+ pageKeywords.site = pageKeywords.site || {};
316
+ pageKeywords.site.ortb2 = [
317
+ {
318
+ name: 'keywords',
319
+ keywords: siteKeywords.split(','),
320
+ }
321
+ ];
277
322
  }
278
- }
279
323
 
280
- if (gdprConsent && gdprConsent.gdprApplies) {
281
- request.regs = {
282
- ext: {
283
- gdpr: gdprConsent.gdprApplies ? 1 : 0
324
+ if (pageKeywords) {
325
+ pageKeywords = reformatKeywords(pageKeywords);
326
+ if (pageKeywords) {
327
+ request.ext = {
328
+ keywords: pageKeywords
329
+ };
284
330
  }
285
- };
286
- }
287
-
288
- if (uspConsent) {
289
- if (!request.regs) {
290
- request.regs = {ext: {}};
291
331
  }
292
- request.regs.ext.us_privacy = uspConsent;
293
- }
294
332
 
295
- if (config.getConfig('coppa') === true) {
296
- if (!request.regs) {
297
- request.regs = {};
333
+ if (gdprConsent && gdprConsent.gdprApplies) {
334
+ request.regs = {
335
+ ext: {
336
+ gdpr: gdprConsent.gdprApplies ? 1 : 0
337
+ }
338
+ };
298
339
  }
299
- request.regs.coppa = 1;
300
- }
301
340
 
302
- const site = deepAccess(bidderRequest, 'ortb2.site');
303
- if (site) {
304
- const pageCategory = [...(site.cat || []), ...(site.pagecat || [])].filter((category) => {
305
- return category && typeof category === 'string'
306
- });
307
- if (pageCategory.length) {
308
- request.site.cat = pageCategory;
309
- }
310
- const genre = deepAccess(site, 'content.genre');
311
- if (genre && typeof genre === 'string') {
312
- request.site.content = {...request.site.content, genre};
341
+ if (uspConsent) {
342
+ if (!request.regs) {
343
+ request.regs = {ext: {}};
344
+ }
345
+ request.regs.ext.us_privacy = uspConsent;
313
346
  }
314
- const data = deepAccess(site, 'content.data');
315
- if (data && data.length) {
316
- const siteContent = request.site.content || {};
317
- request.site.content = mergeDeep(siteContent, { data });
347
+
348
+ if (config.getConfig('coppa') === true) {
349
+ if (!request.regs) {
350
+ request.regs = {};
351
+ }
352
+ request.regs.coppa = 1;
318
353
  }
319
- const id = deepAccess(site, 'content.id');
320
- if (id) {
321
- request.site.content = {...request.site.content, id};
354
+
355
+ const site = deepAccess(bidderRequest, 'ortb2.site');
356
+ if (site) {
357
+ const pageCategory = [...(site.cat || []), ...(site.pagecat || [])].filter((category) => {
358
+ return category && typeof category === 'string'
359
+ });
360
+ if (pageCategory.length) {
361
+ request.site.cat = pageCategory;
362
+ }
363
+ const genre = deepAccess(site, 'content.genre');
364
+ if (genre && typeof genre === 'string') {
365
+ request.site.content = {...request.site.content, genre};
366
+ }
367
+ const data = deepAccess(site, 'content.data');
368
+ if (data && data.length) {
369
+ const siteContent = request.site.content || {};
370
+ request.site.content = mergeDeep(siteContent, { data });
371
+ }
372
+ const id = deepAccess(site, 'content.id');
373
+ if (id) {
374
+ request.site.content = {...request.site.content, id};
375
+ }
322
376
  }
323
- }
377
+ });
324
378
 
325
- return {
379
+ return [...requests.map((req, i) => {
380
+ let sp;
381
+ const url = (endpoint || ENDPOINT_URL).replace(/[?&]sp=([^?&=]+)/, (i, found) => {
382
+ if (found) {
383
+ sp = found;
384
+ }
385
+ return '';
386
+ });
387
+ let currentSource = sources[i] || sp;
388
+ const urlWithParams = url + (url.indexOf('?') > -1 ? '&' : '?') + 'no_mapping=1' + (currentSource ? `&sp=${currentSource}` : '');
389
+ return {
390
+ method: 'POST',
391
+ url: urlWithParams,
392
+ data: JSON.stringify(req),
393
+ bid: bidsArray[i],
394
+ };
395
+ }), ...(mainRequest ? [{
326
396
  method: 'POST',
327
397
  url: endpoint || ENDPOINT_URL,
328
- data: JSON.stringify(request),
398
+ data: JSON.stringify(mainRequest),
329
399
  bidsMap
330
- };
400
+ }] : [])];
331
401
  },
332
402
  /**
333
403
  * Unpack the response from the server into a list of bids.
@@ -395,7 +465,7 @@ export const spec = {
395
465
  */
396
466
  function _getFloor (mediaTypes, bid) {
397
467
  const curMediaType = mediaTypes.video ? 'video' : 'banner';
398
- let floor = bid.params.bidFloor || 0;
468
+ let floor = bid.params.bidFloor || bid.params.floorcpm || 0;
399
469
 
400
470
  if (typeof bid.getFloor === 'function') {
401
471
  const floorInfo = bid.getFloor({
@@ -431,7 +501,7 @@ function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bid
431
501
  if (!serverBid.auid) errorMessage = LOG_ERROR_MESS.noAuid + JSON.stringify(serverBid);
432
502
  if (!errorMessage && !serverBid.adm && !serverBid.nurl) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);
433
503
  else {
434
- const bid = bidRequest.bidsMap[serverBid.impid];
504
+ const bid = bidRequest.bidsMap ? bidRequest.bidsMap[serverBid.impid] : bidRequest.bid;
435
505
  if (bid) {
436
506
  const bidResponse = {
437
507
  requestId: bid.bidId, // bid.bidderRequestId
@@ -483,7 +553,7 @@ function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bid
483
553
  }
484
554
 
485
555
  function createVideoRequest(bid, mediaType) {
486
- const {playerSize, mimes, durationRangeSec, protocols} = mediaType;
556
+ const { playerSize, mimes, durationRangeSec, protocols } = mediaType;
487
557
  const size = (playerSize || bid.sizes || [])[0];
488
558
  if (!size) return;
489
559
 
@@ -307,10 +307,10 @@ const ID_REQUEST = {
307
307
  }
308
308
  // In the single request mode, split imps between those going to the ad server and those going to extend server
309
309
  if (extendImps.length) {
310
- requests.push(formatRequest(extendImps, null, true));
310
+ requests.push(formatRequest(extendImps, bidderRequest.auctionId, true));
311
311
  }
312
312
  if (adServerImps.length) {
313
- requests.push(formatRequest(adServerImps, null, false));
313
+ requests.push(formatRequest(adServerImps, bidderRequest.auctionId, false));
314
314
  }
315
315
 
316
316
  return requests;
@@ -13,7 +13,8 @@ import {
13
13
  logError,
14
14
  logWarn,
15
15
  mergeDeep,
16
- parseQueryStringParameters
16
+ parseQueryStringParameters,
17
+ safeJSONParse
17
18
  } from '../src/utils.js';
18
19
  import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
19
20
  import {config} from '../src/config.js';
@@ -99,8 +100,46 @@ const VIDEO_PARAMS_ALLOW_LIST = [
99
100
  'playerSize', 'w', 'h'
100
101
  ];
101
102
  const LOCAL_STORAGE_KEY = 'ixdiag';
103
+ export const LOCAL_STORAGE_FEATURE_TOGGLES_KEY = `${BIDDER_CODE}_features`;
102
104
  let hasRegisteredHandler = false;
103
105
  export const storage = getStorageManager({gvlid: GLOBAL_VENDOR_ID, bidderCode: BIDDER_CODE});
106
+ export const FEATURE_TOGGLES = {
107
+ featureToggles: {},
108
+ isFeatureEnabled: function(ft) {
109
+ return deepAccess(this.featureToggles, `features.${ft}.activated`)
110
+ },
111
+ getFeatureToggles: function() {
112
+ if (storage.localStorageIsEnabled()) {
113
+ const parsedToggles = safeJSONParse(storage.getDataFromLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY));
114
+ if (deepAccess(parsedToggles, 'expiry') && parsedToggles.expiry >= new Date().getTime()) {
115
+ this.featureToggles = parsedToggles
116
+ } else {
117
+ this.clearFeatureToggles();
118
+ }
119
+ }
120
+ },
121
+ setFeatureToggles: function(serverResponse) {
122
+ const responseBody = serverResponse.body;
123
+ const expiryTime = new Date();
124
+ const toggles = deepAccess(responseBody, 'ext.features');
125
+
126
+ if (toggles) {
127
+ this.featureToggles = {
128
+ expiry: expiryTime.setHours(expiryTime.getHours() + 1),
129
+ features: toggles
130
+ }
131
+ if (storage.localStorageIsEnabled()) {
132
+ storage.setDataInLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY, JSON.stringify(this.featureToggles));
133
+ }
134
+ }
135
+ },
136
+ clearFeatureToggles: function() {
137
+ this.featureToggles = {};
138
+ if (storage.localStorageIsEnabled()) {
139
+ storage.removeDataFromLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY);
140
+ }
141
+ }
142
+ };
104
143
  let siteID = 0;
105
144
  let gdprConsent = '';
106
145
  let usPrivacy = '';
@@ -578,6 +617,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
578
617
  r.ext = {};
579
618
  r.ext.source = 'prebid';
580
619
  r.ext.ixdiag = {};
620
+ r.ext.ixdiag.ls = storage.localStorageIsEnabled();
581
621
  r.imp = [];
582
622
  r.at = 1;
583
623
 
@@ -602,13 +642,15 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
602
642
  r.ext.ixdiag.err = cachedErrors;
603
643
  }
604
644
 
645
+ // set source.tid to auctionId for outgoing request to Exchange.
646
+ r.source = {
647
+ tid: validBidRequests[0].auctionId,
648
+ }
649
+
605
650
  // if an schain is provided, send it along
606
651
  if (validBidRequests[0].schain) {
607
- r.source = {
608
- ext: {
609
- schain: validBidRequests[0].schain
610
- }
611
- };
652
+ r.source.ext = {};
653
+ r.source.ext.schain = validBidRequests[0].schain;
612
654
  }
613
655
 
614
656
  if (userEids.length > 0) {
@@ -665,14 +707,17 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
665
707
  // Use the siteId in the first bid request as the main siteId.
666
708
  siteID = validBidRequests[0].params.siteId;
667
709
  payload.s = siteID;
668
- if (version) {
669
- payload.v = version;
670
- }
671
- payload.ac = 'j';
672
- payload.sd = 1;
673
710
 
674
- if (version === VIDEO_ENDPOINT_VERSION) {
675
- payload.nf = 1;
711
+ if (!FEATURE_TOGGLES.isFeatureEnabled('pbjs_enable_post')) {
712
+ if (version) {
713
+ payload.v = version;
714
+ }
715
+ payload.ac = 'j';
716
+ payload.sd = 1;
717
+
718
+ if (version === VIDEO_ENDPOINT_VERSION) {
719
+ payload.nf = 1;
720
+ }
676
721
  }
677
722
 
678
723
  // Parse additional runtime configs.
@@ -718,9 +763,11 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
718
763
  }
719
764
  }
720
765
 
721
- // Create t in payload if timeout is configured.
722
- if (typeof otherIxConfig.timeout === 'number') {
723
- payload.t = otherIxConfig.timeout;
766
+ if (!FEATURE_TOGGLES.isFeatureEnabled('pbjs_enable_post')) {
767
+ // Create t in payload if timeout is configured.
768
+ if (typeof otherIxConfig.timeout === 'number') {
769
+ payload.t = otherIxConfig.timeout;
770
+ }
724
771
  }
725
772
  }
726
773
 
@@ -866,12 +913,27 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
866
913
  requestSequenceNumber++;
867
914
  clonedPayload.r = JSON.stringify(r);
868
915
 
869
- requests.push({
870
- method: 'GET',
871
- url: baseUrl,
872
- data: clonedPayload,
873
- validBidRequests
874
- });
916
+ let requestData;
917
+
918
+ if (FEATURE_TOGGLES.isFeatureEnabled('pbjs_enable_post')) {
919
+ requestData = {
920
+ method: 'POST',
921
+ url: baseUrl + '?s=' + payload.s,
922
+ data: deepClone(r),
923
+ option: {
924
+ contentType: 'text/plain',
925
+ },
926
+ validBidRequests
927
+ }
928
+ } else {
929
+ requestData = {
930
+ method: 'GET',
931
+ url: baseUrl,
932
+ data: clonedPayload,
933
+ validBidRequests
934
+ }
935
+ }
936
+ requests.push(requestData);
875
937
 
876
938
  currentRequestSize = baseRequestSize;
877
939
  r.imp = [];
@@ -1381,6 +1443,7 @@ export const spec = {
1381
1443
  const videoImps = {}; // Stores created video impressions
1382
1444
  const nativeImps = {}; // Stores created native impressions
1383
1445
  const missingBannerSizes = {}; // To capture the missing sizes i.e not configured for ix
1446
+ FEATURE_TOGGLES.getFeatureToggles();
1384
1447
 
1385
1448
  // Step 1: Create impresssions from IX params
1386
1449
  validBidRequests.forEach((validBidRequest) => {
@@ -1451,6 +1514,7 @@ export const spec = {
1451
1514
  let bid = null;
1452
1515
 
1453
1516
  if (!serverResponse.hasOwnProperty('body') || !serverResponse.body.hasOwnProperty('seatbid')) {
1517
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
1454
1518
  return bids;
1455
1519
  }
1456
1520
 
@@ -1463,7 +1527,13 @@ export const spec = {
1463
1527
 
1464
1528
  // Transform rawBid in bid response to the format that will be accepted by prebid.
1465
1529
  const innerBids = seatbid[i].bid;
1466
- let requestBid = JSON.parse(bidderRequest.data.r);
1530
+ let requestBid;
1531
+
1532
+ if (FEATURE_TOGGLES.isFeatureEnabled('pbjs_enable_post')) {
1533
+ requestBid = bidderRequest.data;
1534
+ } else {
1535
+ requestBid = safeJSONParse(bidderRequest.data.r);
1536
+ }
1467
1537
 
1468
1538
  for (let j = 0; j < innerBids.length; j++) {
1469
1539
  const bidRequest = getBidRequest(innerBids[j].impid, requestBid.imp, bidderRequest.validBidRequests);
@@ -1491,6 +1561,7 @@ export const spec = {
1491
1561
  }
1492
1562
  }
1493
1563
 
1564
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
1494
1565
  return bids;
1495
1566
  },
1496
1567