prebid.js 7.17.0 → 7.19.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 (220) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adfBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adqueryBidAdapter.js +1 -1
  7. package/dist/adqueryIdSystem.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/ajaBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/audiencerunBidAdapter.js +1 -1
  19. package/dist/axonixBidAdapter.js +1 -1
  20. package/dist/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +1 -1
  21. package/dist/bidglassBidAdapter.js +1 -1
  22. package/dist/bidwatchAnalyticsAdapter.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/carodaBidAdapter.js +1 -1
  28. package/dist/cleanioRtdProvider.js +1 -1
  29. package/dist/colossussspBidAdapter.js +1 -1
  30. package/dist/concertBidAdapter.js +1 -1
  31. package/dist/connectadBidAdapter.js +1 -1
  32. package/dist/consumableBidAdapter.js +1 -1
  33. package/dist/conversantAnalyticsAdapter.js +1 -0
  34. package/dist/conversantBidAdapter.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/debugging-standalone.js +1 -1
  38. package/dist/debugging.js +1 -1
  39. package/dist/dependencies.json +6 -0
  40. package/dist/dgkeywordRtdProvider.js +1 -1
  41. package/dist/dianomiBidAdapter.js +1 -1
  42. package/dist/dspxBidAdapter.js +1 -1
  43. package/dist/enrichmentFpdModule.js +1 -1
  44. package/dist/eplanningBidAdapter.js +1 -1
  45. package/dist/finativeBidAdapter.js +1 -1
  46. package/dist/fpd.js +1 -0
  47. package/dist/glimpseBidAdapter.js +1 -1
  48. package/dist/gmosspBidAdapter.js +1 -1
  49. package/dist/goldbachBidAdapter.js +1 -1
  50. package/dist/gridBidAdapter.js +1 -1
  51. package/dist/gridNMBidAdapter.js +1 -1
  52. package/dist/growthCodeIdSystem.js +1 -0
  53. package/dist/gumgumBidAdapter.js +1 -1
  54. package/dist/h12mediaBidAdapter.js +1 -1
  55. package/dist/id5IdSystem.js +1 -1
  56. package/dist/impactifyBidAdapter.js +1 -1
  57. package/dist/improvedigitalBidAdapter.js +1 -1
  58. package/dist/inmarBidAdapter.js +1 -1
  59. package/dist/insticatorBidAdapter.js +1 -1
  60. package/dist/ixBidAdapter.js +1 -1
  61. package/dist/jixieBidAdapter.js +1 -1
  62. package/dist/justpremiumBidAdapter.js +1 -1
  63. package/dist/konduitAnalyticsAdapter.js +1 -1
  64. package/dist/kueezBidAdapter.js +1 -1
  65. package/dist/lassoBidAdapter.js +1 -1
  66. package/dist/lifestreetBidAdapter.js +1 -1
  67. package/dist/liveIntentIdSystem.js +1 -1
  68. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  69. package/dist/logicadBidAdapter.js +1 -1
  70. package/dist/loglyliftBidAdapter.js +1 -1
  71. package/dist/malltvAnalyticsAdapter.js +1 -1
  72. package/dist/marsmediaBidAdapter.js +1 -1
  73. package/dist/mediafuseBidAdapter.js +1 -1
  74. package/dist/mediakeysBidAdapter.js +1 -1
  75. package/dist/mediasquareBidAdapter.js +1 -1
  76. package/dist/mgidBidAdapter.js +1 -1
  77. package/dist/minutemediaBidAdapter.js +1 -1
  78. package/dist/nativoBidAdapter.js +1 -1
  79. package/dist/nextMillenniumBidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +133 -130
  81. package/dist/oguryBidAdapter.js +1 -1
  82. package/dist/onetagBidAdapter.js +1 -1
  83. package/dist/ooloAnalyticsAdapter.js +1 -1
  84. package/dist/outbrainBidAdapter.js +1 -1
  85. package/dist/parrableIdSystem.js +1 -1
  86. package/dist/pixfutureBidAdapter.js +1 -1
  87. package/dist/prebid-core.js +1 -1
  88. package/dist/prebidServerBidAdapter.js +1 -1
  89. package/dist/publinkIdSystem.js +1 -1
  90. package/dist/pubmaticBidAdapter.js +1 -1
  91. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  92. package/dist/pxyzBidAdapter.js +1 -1
  93. package/dist/quantcastBidAdapter.js +1 -1
  94. package/dist/readpeakBidAdapter.js +1 -1
  95. package/dist/relaidoBidAdapter.js +1 -1
  96. package/dist/rhythmoneBidAdapter.js +1 -1
  97. package/dist/riseBidAdapter.js +1 -1
  98. package/dist/rubiconAnalyticsAdapter.js +1 -1
  99. package/dist/rubiconBidAdapter.js +1 -1
  100. package/dist/seedingAllianceBidAdapter.js +1 -1
  101. package/dist/seedtagBidAdapter.js +1 -1
  102. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  103. package/dist/sharethroughBidAdapter.js +1 -1
  104. package/dist/shinezBidAdapter.js +1 -1
  105. package/dist/smaatoBidAdapter.js +1 -1
  106. package/dist/smartadserverBidAdapter.js +1 -1
  107. package/dist/smartxBidAdapter.js +1 -1
  108. package/dist/smilewantedBidAdapter.js +1 -1
  109. package/dist/sonobiBidAdapter.js +1 -1
  110. package/dist/sovrnAnalyticsAdapter.js +1 -1
  111. package/dist/sovrnBidAdapter.js +1 -1
  112. package/dist/sspBCBidAdapter.js +1 -1
  113. package/dist/sublimeBidAdapter.js +1 -1
  114. package/dist/synacormediaBidAdapter.js +1 -1
  115. package/dist/taboolaBidAdapter.js +1 -1
  116. package/dist/targetVideoBidAdapter.js +1 -1
  117. package/dist/teadsBidAdapter.js +1 -1
  118. package/dist/trionBidAdapter.js +1 -1
  119. package/dist/tripleliftBidAdapter.js +1 -1
  120. package/dist/ttdBidAdapter.js +1 -1
  121. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  122. package/dist/underdogmediaBidAdapter.js +1 -1
  123. package/dist/undertoneBidAdapter.js +1 -1
  124. package/dist/userId.js +1 -1
  125. package/dist/vidazooBidAdapter.js +1 -1
  126. package/dist/videobyteBidAdapter.js +1 -1
  127. package/dist/visxBidAdapter.js +1 -1
  128. package/dist/vuukleBidAdapter.js +1 -1
  129. package/dist/widespaceBidAdapter.js +1 -1
  130. package/dist/winrBidAdapter.js +1 -1
  131. package/dist/yahoosspBidAdapter.js +1 -1
  132. package/dist/yandexBidAdapter.js +1 -1
  133. package/dist/yieldmoBidAdapter.js +1 -1
  134. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  135. package/libraries/fpd/sua.js +98 -0
  136. package/modules/adagioBidAdapter.js +2 -1
  137. package/modules/adfBidAdapter.js +1 -1
  138. package/modules/adkernelAdnBidAdapter.js +1 -0
  139. package/modules/adqueryBidAdapter.js +4 -2
  140. package/modules/adqueryIdSystem.js +8 -8
  141. package/modules/adxcgBidAdapter.js +1 -1
  142. package/modules/amxBidAdapter.js +1 -1
  143. package/modules/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +0 -0
  144. package/modules/{andBeyondMediaBidAdapter.md → beyondmediaBidAdapter.md} +1 -1
  145. package/modules/bidwatchAnalyticsAdapter.js +1 -1
  146. package/modules/cleanioRtdProvider.js +3 -4
  147. package/modules/colossussspBidAdapter.js +2 -1
  148. package/modules/conversantAnalyticsAdapter.js +560 -0
  149. package/modules/conversantAnalyticsAdapter.md +47 -0
  150. package/modules/criteoBidAdapter.js +1 -1
  151. package/modules/debugging/bidInterceptor.js +2 -2
  152. package/modules/debugging/debugging.js +10 -2
  153. package/modules/dgkeywordRtdProvider.js +21 -3
  154. package/modules/dianomiBidAdapter.js +1 -1
  155. package/modules/enrichmentFpdModule.js +33 -14
  156. package/modules/finativeBidAdapter.js +1 -1
  157. package/modules/gridBidAdapter.js +188 -118
  158. package/modules/growthCodeIdSystem.js +164 -0
  159. package/modules/growthCodeIdSystem.md +37 -0
  160. package/modules/improvedigitalBidAdapter.js +2 -2
  161. package/modules/ixBidAdapter.js +94 -23
  162. package/modules/liveIntentIdSystem.js +39 -5
  163. package/modules/mediakeysBidAdapter.js +6 -1
  164. package/modules/mediakeysBidAdapter.md +50 -40
  165. package/modules/nativoBidAdapter.js +3 -2
  166. package/modules/nextMillenniumBidAdapter.js +34 -11
  167. package/modules/prebidServerBidAdapter/index.js +44 -13
  168. package/modules/readpeakBidAdapter.js +1 -1
  169. package/modules/rubiconBidAdapter.js +2 -3
  170. package/modules/seedingAllianceBidAdapter.js +1 -1
  171. package/modules/seedtagBidAdapter.js +4 -0
  172. package/modules/sharethroughBidAdapter.js +1 -1
  173. package/modules/taboolaBidAdapter.js +4 -8
  174. package/modules/talkadsBidAdapter.js +1 -0
  175. package/modules/truereachBidAdapter.js +1 -0
  176. package/modules/ttdBidAdapter.js +1 -1
  177. package/modules/userId/eids.js +19 -0
  178. package/modules/vidazooBidAdapter.js +1 -1
  179. package/modules/vuukleBidAdapter.js +34 -3
  180. package/modules/yahoosspBidAdapter.js +3 -1
  181. package/modules/yandexBidAdapter.js +31 -8
  182. package/package.json +2 -2
  183. package/src/adapterManager.js +2 -4
  184. package/src/cpmBucketManager.js +22 -3
  185. package/src/native.js +1 -5
  186. package/src/prebid.js +3 -3
  187. package/test/spec/cpmBucketManager_spec.js +239 -177
  188. package/test/spec/fpd/sua_spec.js +244 -0
  189. package/test/spec/modules/adagioBidAdapter_spec.js +23 -0
  190. package/test/spec/modules/adfBidAdapter_spec.js +2 -3
  191. package/test/spec/modules/adqueryBidAdapter_spec.js +11 -0
  192. package/test/spec/modules/adqueryIdSystem_spec.js +0 -2
  193. package/test/spec/modules/adxcgBidAdapter_spec.js +2 -3
  194. package/test/spec/modules/amxBidAdapter_spec.js +3 -2
  195. package/test/spec/modules/{andBeyondMediaBidAdapter_spec.js → beyondmediaBidAdapter_spec.js} +1 -1
  196. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +2 -0
  197. package/test/spec/modules/colossussspBidAdapter_spec.js +4 -2
  198. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +963 -0
  199. package/test/spec/modules/debugging_mod_spec.js +9 -0
  200. package/test/spec/modules/dgkeywordRtdProvider_spec.js +83 -1
  201. package/test/spec/modules/dianomiBidAdapter_spec.js +2 -3
  202. package/test/spec/modules/enrichmentFpdModule_spec.js +50 -7
  203. package/test/spec/modules/fpdModule_spec.js +9 -0
  204. package/test/spec/modules/gridBidAdapter_spec.js +87 -31
  205. package/test/spec/modules/growthCodeIdSystem_spec.js +83 -0
  206. package/test/spec/modules/ixBidAdapter_spec.js +221 -2
  207. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +62 -8
  208. package/test/spec/modules/liveIntentIdSystem_spec.js +62 -8
  209. package/test/spec/modules/mediakeysBidAdapter_spec.js +20 -3
  210. package/test/spec/modules/nativoBidAdapter_spec.js +13 -2
  211. package/test/spec/modules/prebidServerBidAdapter_spec.js +171 -4
  212. package/test/spec/modules/seedtagBidAdapter_spec.js +42 -0
  213. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  214. package/test/spec/modules/taboolaBidAdapter_spec.js +2 -2
  215. package/test/spec/modules/ttdBidAdapter_spec.js +3 -3
  216. package/test/spec/modules/vuukleBidAdapter_spec.js +87 -0
  217. package/test/spec/modules/yahoosspBidAdapter_spec.js +3 -1
  218. package/test/spec/modules/yandexBidAdapter_spec.js +8 -5
  219. package/test/spec/native_spec.js +5 -0
  220. package/test/spec/unit/pbjs_api_spec.js +44 -0
@@ -20,10 +20,8 @@ import { getGlobal } from '../src/prebidGlobal.js';
20
20
  * @param {Object} userConsent
21
21
  */
22
22
  export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, userConsent) {
23
- const URL = 'https://mediaconsortium.profiles.tagger.opecloud.com/api/v1?url=';
24
23
  const PROFILE_TIMEOUT_MS = 1000;
25
24
  const timeout = (moduleConfig && moduleConfig.params && moduleConfig.params.timeout && Number(moduleConfig.params.timeout) > 0) ? Number(moduleConfig.params.timeout) : PROFILE_TIMEOUT_MS;
26
- const url = (moduleConfig && moduleConfig.params && moduleConfig.params.url) ? moduleConfig.params.url : URL + encodeURIComponent(window.location.href);
27
25
  const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
28
26
  callback = (function(cb) {
29
27
  let done = false;
@@ -43,7 +41,7 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us
43
41
  } else {
44
42
  logMessage('[dgkeyword sub module] dgkeyword targets:', setKeywordTargetBidders);
45
43
  logMessage('[dgkeyword sub module] get targets from profile api start.');
46
- ajax(url, {
44
+ ajax(getProfileApiUrl(moduleConfig?.params?.url, moduleConfig?.params?.disableReadFpid), {
47
45
  success: function(response) {
48
46
  const res = JSON.parse(response);
49
47
  if (!isFinish) {
@@ -98,6 +96,26 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us
98
96
  }
99
97
  }
100
98
 
99
+ export function getProfileApiUrl(customeUrl, disableReadFpid) {
100
+ const URL = 'https://mediaconsortium.profiles.tagger.opecloud.com/api/v1';
101
+ const fpid = (disableReadFpid) ? '' : readFpidFromLocalStrage();
102
+ let url = customeUrl || URL;
103
+ url = url + '?url=' + encodeURIComponent(window.location.href) + ((fpid) ? `&fpid=${fpid}` : '');
104
+ return url;
105
+ }
106
+
107
+ export function readFpidFromLocalStrage() {
108
+ try {
109
+ const fpid = window.localStorage.getItem('ope_fpid');
110
+ if (fpid) {
111
+ return fpid;
112
+ }
113
+ return null;
114
+ } catch (error) {
115
+ return null;
116
+ }
117
+ }
118
+
101
119
  /**
102
120
  * get all bidder which hava {dgkeyword: true} in params
103
121
  * @param {Object} adUnits
@@ -112,7 +112,7 @@ export const spec = {
112
112
  setOnAny(validBidRequests, 'params.pt') ||
113
113
  setOnAny(validBidRequests, 'params.priceType') ||
114
114
  'net';
115
- const tid = validBidRequests[0].transactionId;
115
+ const tid = bidderRequest.auctionId;
116
116
  const currency = getConfig('currency.adServerCurrency');
117
117
  const cur = currency && [currency];
118
118
  const eids = setOnAny(validBidRequests, 'userIdAsEids');
@@ -7,11 +7,15 @@ import { timestamp, mergeDeep } from '../src/utils.js';
7
7
  import { submodule } from '../src/hook.js';
8
8
  import {getRefererInfo, parseDomain} from '../src/refererDetection.js';
9
9
  import { getCoreStorageManager } from '../src/storageManager.js';
10
+ import {GreedyPromise} from '../src/utils/promise.js';
11
+ import {getHighEntropySUA, getLowEntropySUA} from '../libraries/fpd/sua.js';
10
12
 
11
- let ortb2 = {};
13
+ let ortb2;
12
14
  let win = (window === window.top) ? window : window.top;
13
15
  export const coreStorage = getCoreStorageManager('enrichmentFpd');
14
16
 
17
+ export const sua = {he: getHighEntropySUA, le: getLowEntropySUA};
18
+
15
19
  /**
16
20
  * Find the root domain
17
21
  * @param {string|undefined} fullDomain
@@ -124,6 +128,17 @@ function setKeywords() {
124
128
  if (keywords && keywords.content) mergeDeep(ortb2, { site: { keywords: keywords.content.replace(/\s/g, '') } });
125
129
  }
126
130
 
131
+ function setDeviceSua(hints) {
132
+ let data = Array.isArray(hints) && hints.length === 0
133
+ ? GreedyPromise.resolve(sua.le())
134
+ : sua.he(hints);
135
+ return data.then((sua) => {
136
+ if (sua != null) {
137
+ mergeDeep(ortb2, {device: {sua}});
138
+ }
139
+ })
140
+ }
141
+
127
142
  /**
128
143
  * Checks the Global Privacy Control status, and if exists and is true, merges into regs.ext.gpc
129
144
  */
@@ -137,30 +152,34 @@ function setGpc() {
137
152
  /**
138
153
  * Resets modules global ortb2 data
139
154
  */
140
- const resetOrtb2 = () => { ortb2 = {} };
155
+ export const resetEnrichments = () => { ortb2 = null };
141
156
 
142
- function runEnrichments() {
157
+ function runEnrichments(fpdConf) {
143
158
  setReferer();
144
159
  setPage();
145
160
  setDomain();
146
161
  setDimensions();
147
162
  setKeywords();
148
163
  setGpc();
149
-
150
- return ortb2;
164
+ return setDeviceSua(fpdConf.uaHints).then(() => ortb2);
151
165
  }
152
166
 
153
- /**
154
- * Sets default values to ortb2 if exists and adds currency and ortb2 setConfig callbacks on init
155
- */
156
167
  export function processFpd(fpdConf, {global}) {
157
- resetOrtb2();
158
-
159
- return {
160
- global: (!fpdConf.skipEnrichments) ? mergeDeep(runEnrichments(), global) : global
161
- };
168
+ if (fpdConf.skipEnrichments) {
169
+ return {global};
170
+ } else {
171
+ let ready;
172
+ if (ortb2 == null) {
173
+ ortb2 = {};
174
+ ready = runEnrichments(fpdConf);
175
+ } else {
176
+ ready = GreedyPromise.resolve();
177
+ }
178
+ return ready.then(() => ({
179
+ global: mergeDeep({}, ortb2, global)
180
+ }))
181
+ }
162
182
  }
163
-
164
183
  /** @type {firstPartyDataSubmodule} */
165
184
  export const enrichmentsSubmodule = {
166
185
  name: 'enrichments',
@@ -63,7 +63,7 @@ export const spec = {
63
63
  // convert Native ORTB definition to old-style prebid native definition
64
64
  validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
65
65
  const pt = setOnAny(validBidRequests, 'params.pt') || setOnAny(validBidRequests, 'params.priceType') || 'net';
66
- const tid = validBidRequests[0].transactionId;
66
+ const tid = bidderRequest.auctionId;
67
67
  const cur = [config.getConfig('currency.adServerCurrency') || DEFAULT_CUR];
68
68
  let url = bidderRequest.refererInfo.referer;
69
69
 
@@ -39,7 +39,7 @@ let hasSynced = false;
39
39
 
40
40
  export const spec = {
41
41
  code: BIDDER_CODE,
42
- aliases: ['playwire', 'adlivetech', 'trustx'],
42
+ aliases: ['playwire', 'adlivetech', { code: 'trustx', skipPbsAliasing: true }],
43
43
  supportedMediaTypes: [ BANNER, VIDEO ],
44
44
  /**
45
45
  * Determines whether or not the given bid request is valid.
@@ -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