prebid.js 7.33.0 → 7.35.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 (219) hide show
  1. package/.devcontainer/devcontainer.json +2 -1
  2. package/.github/workflows/issue_tracker.yml +27 -16
  3. package/dist/33acrossBidAdapter.js +1 -1
  4. package/dist/33acrossIdSystem.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/admaticBidAdapter.js +1 -1
  9. package/dist/admixerBidAdapter.js +1 -1
  10. package/dist/adnuntiusBidAdapter.js +1 -1
  11. package/dist/adrelevantisBidAdapter.js +1 -1
  12. package/dist/adtrgtmeBidAdapter.js +1 -1
  13. package/dist/adxcgBidAdapter.js +1 -1
  14. package/dist/adyoulikeBidAdapter.js +1 -1
  15. package/dist/ajaBidAdapter.js +1 -1
  16. package/dist/amxBidAdapter.js +1 -1
  17. package/dist/amxIdSystem.js +1 -1
  18. package/dist/appierAnalyticsAdapter.js +1 -1
  19. package/dist/appnexusBidAdapter.js +1 -1
  20. package/dist/arcspanRtdProvider.js +1 -0
  21. package/dist/asoBidAdapter.js +1 -1
  22. package/dist/axonixBidAdapter.js +1 -1
  23. package/dist/bidglassBidAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bliinkBidAdapter.js +1 -1
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/chtnwBidAdapter.js +1 -1
  30. package/dist/concertBidAdapter.js +1 -1
  31. package/dist/connectadBidAdapter.js +1 -1
  32. package/dist/consentManagement.js +1 -1
  33. package/dist/consumableBidAdapter.js +1 -1
  34. package/dist/conversantBidAdapter.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/cwireBidAdapter.js +1 -1
  38. package/dist/dspxBidAdapter.js +1 -1
  39. package/dist/emx_digitalBidAdapter.js +1 -1
  40. package/dist/eplanningBidAdapter.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/glimpseBidAdapter.js +1 -1
  44. package/dist/gmosspBidAdapter.js +1 -1
  45. package/dist/goldbachBidAdapter.js +1 -1
  46. package/dist/gridBidAdapter.js +1 -1
  47. package/dist/gridNMBidAdapter.js +1 -1
  48. package/dist/gumgumBidAdapter.js +1 -1
  49. package/dist/h12mediaBidAdapter.js +1 -1
  50. package/dist/hadronIdSystem.js +1 -1
  51. package/dist/holidBidAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/improvedigitalBidAdapter.js +1 -1
  54. package/dist/inmarBidAdapter.js +1 -1
  55. package/dist/insticatorBidAdapter.js +1 -1
  56. package/dist/ixBidAdapter.js +1 -1
  57. package/dist/justpremiumBidAdapter.js +1 -1
  58. package/dist/kargoBidAdapter.js +1 -1
  59. package/dist/konduitAnalyticsAdapter.js +1 -1
  60. package/dist/kueezBidAdapter.js +1 -1
  61. package/dist/kueezRtbBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/lotamePanoramaIdSystem.js +1 -1
  68. package/dist/magniteAnalyticsAdapter.js +1 -1
  69. package/dist/malltvAnalyticsAdapter.js +1 -1
  70. package/dist/marsmediaBidAdapter.js +1 -1
  71. package/dist/mediafuseBidAdapter.js +1 -1
  72. package/dist/mediasquareBidAdapter.js +1 -1
  73. package/dist/mgidBidAdapter.js +1 -1
  74. package/dist/minutemediaBidAdapter.js +1 -1
  75. package/dist/nextMillenniumBidAdapter.js +1 -1
  76. package/dist/nexx360BidAdapter.js +1 -1
  77. package/dist/not-for-prod/prebid.js +140 -149
  78. package/dist/oguryBidAdapter.js +1 -1
  79. package/dist/onetagBidAdapter.js +1 -1
  80. package/dist/ooloAnalyticsAdapter.js +1 -1
  81. package/dist/openxBidAdapter.js +1 -1
  82. package/dist/ortbConverter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/permutiveRtdProvider.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/priceFloors.js +1 -1
  90. package/dist/publinkIdSystem.js +1 -1
  91. package/dist/pubmaticBidAdapter.js +1 -1
  92. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  93. package/dist/pulsepointBidAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/riseBidAdapter.js +1 -1
  100. package/dist/rubiconAnalyticsAdapter.js +1 -1
  101. package/dist/rubiconBidAdapter.js +1 -1
  102. package/dist/seedingAllianceBidAdapter.js +1 -1
  103. package/dist/seedtagBidAdapter.js +1 -1
  104. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  105. package/dist/sharethroughBidAdapter.js +1 -1
  106. package/dist/shinezBidAdapter.js +1 -1
  107. package/dist/smaatoBidAdapter.js +1 -1
  108. package/dist/smartadserverBidAdapter.js +1 -1
  109. package/dist/smartxBidAdapter.js +1 -1
  110. package/dist/smartytechBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/sublimeBidAdapter.js +1 -1
  117. package/dist/synacormediaBidAdapter.js +1 -1
  118. package/dist/taboolaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/trionBidAdapter.js +1 -1
  122. package/dist/tripleliftBidAdapter.js +1 -1
  123. package/dist/ttdBidAdapter.js +1 -1
  124. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  125. package/dist/uid2IdSystem.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/vidazooBidAdapter.js +1 -1
  129. package/dist/videobyteBidAdapter.js +1 -1
  130. package/dist/visxBidAdapter.js +1 -1
  131. package/dist/vuukleBidAdapter.js +1 -1
  132. package/dist/widespaceBidAdapter.js +1 -1
  133. package/dist/winrBidAdapter.js +1 -1
  134. package/dist/yahoosspBidAdapter.js +1 -1
  135. package/dist/yieldmoBidAdapter.js +1 -1
  136. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  137. package/dist/zeta_global_sspBidAdapter.js +1 -1
  138. package/dist/zeusPrimeRtdProvider.js +4 -14
  139. package/integrationExamples/gpt/hello_world.html +0 -0
  140. package/libraries/ortbConverter/processors/default.js +19 -1
  141. package/modules/.submodules.json +1 -0
  142. package/modules/admaticBidAdapter.js +2 -1
  143. package/modules/admixerBidAdapter.js +26 -4
  144. package/modules/adnuntiusBidAdapter.js +36 -38
  145. package/modules/adyoulikeBidAdapter.js +2 -0
  146. package/modules/arcspanRtdProvider.js +73 -0
  147. package/modules/arcspanRtdProvider.md +11 -0
  148. package/modules/bliinkBidAdapter.js +1 -1
  149. package/modules/consentManagement.js +33 -5
  150. package/modules/consumableBidAdapter.js +20 -2
  151. package/modules/criteoBidAdapter.js +1 -1
  152. package/modules/cwireBidAdapter.js +169 -242
  153. package/modules/cwireBidAdapter.md +15 -14
  154. package/modules/emx_digitalBidAdapter.js +9 -2
  155. package/modules/hadronIdSystem.js +37 -32
  156. package/modules/holidBidAdapter.js +9 -4
  157. package/modules/kargoBidAdapter.js +5 -1
  158. package/modules/lotamePanoramaIdSystem.js +9 -1
  159. package/modules/nextMillenniumBidAdapter.js +19 -9
  160. package/modules/nexx360BidAdapter.js +1 -2
  161. package/modules/onetagBidAdapter.js +12 -1
  162. package/modules/openxBidAdapter.js +5 -0
  163. package/modules/outbrainBidAdapter.js +103 -6
  164. package/modules/permutiveRtdProvider.js +17 -12
  165. package/modules/prebidServerBidAdapter/index.js +14 -1
  166. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -1
  167. package/modules/priceFloors.js +7 -8
  168. package/modules/pulsepointBidAdapter.js +2 -0
  169. package/modules/seedingAllianceBidAdapter.js +129 -116
  170. package/modules/smartadserverBidAdapter.js +39 -28
  171. package/modules/smartyadsBidAdapter.md +9 -0
  172. package/modules/smartytechBidAdapter.js +67 -10
  173. package/modules/smartytechBidAdapter.md +44 -33
  174. package/modules/sonobiBidAdapter.js +17 -10
  175. package/modules/taboolaBidAdapter.js +2 -1
  176. package/modules/tripleliftBidAdapter.js +4 -0
  177. package/modules/vidazooBidAdapter.js +56 -22
  178. package/modules/zeta_global_sspBidAdapter.js +15 -0
  179. package/modules/zeusPrimeRtdProvider.js +3 -323
  180. package/modules/zeusPrimeRtdProvider.md +3 -0
  181. package/package.json +1 -1
  182. package/src/adloader.js +2 -1
  183. package/src/auction.js +2 -11
  184. package/src/prebid.js +8 -0
  185. package/src/utils/cpm.js +17 -0
  186. package/test/spec/modules/admixerBidAdapter_spec.js +140 -60
  187. package/test/spec/modules/adnuntiusBidAdapter_spec.js +120 -120
  188. package/test/spec/modules/adyoulikeBidAdapter_spec.js +3 -0
  189. package/test/spec/modules/arcspanRtdProvider_spec.js +187 -0
  190. package/test/spec/modules/bliinkBidAdapter_spec.js +7 -7
  191. package/test/spec/modules/consentManagement_spec.js +49 -1
  192. package/test/spec/modules/consumableBidAdapter_spec.js +46 -0
  193. package/test/spec/modules/cwireBidAdapter_spec.js +249 -335
  194. package/test/spec/modules/emx_digitalBidAdapter_spec.js +30 -1
  195. package/test/spec/modules/hadronIdSystem_spec.js +4 -6
  196. package/test/spec/modules/holidBidAdapter_spec.js +29 -0
  197. package/test/spec/modules/kargoBidAdapter_spec.js +32 -0
  198. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +16 -10
  199. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +14 -2
  200. package/test/spec/modules/nexx360BidAdapter_spec.js +0 -4
  201. package/test/spec/modules/onetagBidAdapter_spec.js +43 -0
  202. package/test/spec/modules/openxBidAdapter_spec.js +41 -0
  203. package/test/spec/modules/openxOrtbBidAdapter_spec.js +41 -0
  204. package/test/spec/modules/outbrainBidAdapter_spec.js +182 -18
  205. package/test/spec/modules/prebidServerBidAdapter_spec.js +138 -0
  206. package/test/spec/modules/pulsepointBidAdapter_spec.js +11 -1
  207. package/test/spec/modules/seedingAllianceAdapter_spec.js +66 -23
  208. package/test/spec/modules/smartadserverBidAdapter_spec.js +116 -5
  209. package/test/spec/modules/smartytechBidAdapter_spec.js +172 -14
  210. package/test/spec/modules/sonobiBidAdapter_spec.js +2 -1
  211. package/test/spec/modules/taboolaBidAdapter_spec.js +12 -3
  212. package/test/spec/modules/tripleliftBidAdapter_spec.js +13 -0
  213. package/test/spec/modules/userId_spec.js +19 -14
  214. package/test/spec/modules/vidazooBidAdapter_spec.js +61 -22
  215. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +8 -0
  216. package/test/spec/ortbConverter/default_processors_spec.js +23 -0
  217. package/test/spec/unit/pbjs_api_spec.js +14 -0
  218. package/test/spec/unit/utils/cpm_spec.js +64 -0
  219. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +0 -410
@@ -295,22 +295,29 @@ function _findBidderRequest(bidderRequests, bidId) {
295
295
  }
296
296
  }
297
297
 
298
+ // This function takes all the possible sizes.
299
+ // returns string csv.
298
300
  function _validateSize(bid) {
299
- if (deepAccess(bid, 'mediaTypes.video')) {
300
- return ''; // Video bids arent allowed to override sizes via the trinity request
301
+ let size = [];
302
+ if (deepAccess(bid, 'mediaTypes.video.playerSize')) {
303
+ size.push(deepAccess(bid, 'mediaTypes.video.playerSize'))
301
304
  }
302
-
303
- if (bid.params.sizes) {
304
- return parseSizesInput(bid.params.sizes).join(',');
305
+ if (deepAccess(bid, 'mediaTypes.video.sizes')) {
306
+ size.push(deepAccess(bid, 'mediaTypes.video.sizes'))
307
+ }
308
+ if (deepAccess(bid, 'params.sizes')) {
309
+ size.push(deepAccess(bid, 'params.sizes'));
305
310
  }
306
311
  if (deepAccess(bid, 'mediaTypes.banner.sizes')) {
307
- return parseSizesInput(deepAccess(bid, 'mediaTypes.banner.sizes')).join(',');
312
+ size.push(deepAccess(bid, 'mediaTypes.banner.sizes'))
308
313
  }
309
-
310
- // Handle deprecated sizes definition
311
- if (bid.sizes) {
312
- return parseSizesInput(bid.sizes).join(',');
314
+ if (deepAccess(bid, 'sizes')) {
315
+ size.push(deepAccess(bid, 'sizes'))
313
316
  }
317
+ // Pass the 2d sizes array into parseSizeInput to flatten it into an array of x separated sizes.
318
+ // Then throw it into Set to uniquify it.
319
+ // Then spread it to an array again. Then join it into a csv of sizes.
320
+ return [...new Set(parseSizesInput(...size))].join(',');
314
321
  }
315
322
 
316
323
  function _validateSlot(bid) {
@@ -279,7 +279,7 @@ function getBid(bids, currency, bidResponse) {
279
279
  return;
280
280
  }
281
281
  const {
282
- price: cpm, crid: creativeId, adm: ad, w: width, h: height, exp: ttl, adomain: advertiserDomains, meta = {}
282
+ price: cpm, nurl, crid: creativeId, adm: ad, w: width, h: height, exp: ttl, adomain: advertiserDomains, meta = {}
283
283
  } = bidResponse;
284
284
  let requestId = bids[bidResponse.impid - 1].bidId;
285
285
  if (advertiserDomains && advertiserDomains.length > 0) {
@@ -297,6 +297,7 @@ function getBid(bids, currency, bidResponse) {
297
297
  width,
298
298
  height,
299
299
  meta,
300
+ nurl,
300
301
  netRevenue: true
301
302
  };
302
303
  }
@@ -154,6 +154,10 @@ function _buildPostBody(bidRequests, bidderRequest) {
154
154
  if (!isEmpty(ext)) {
155
155
  data.ext = ext;
156
156
  }
157
+
158
+ if (bidderRequest?.ortb2?.regs?.gpp) {
159
+ data.regs = Object.assign({}, bidderRequest.ortb2.regs);
160
+ }
157
161
  return data;
158
162
  }
159
163
 
@@ -1,8 +1,9 @@
1
- import { _each, deepAccess, parseSizesInput, parseUrl, uniques, isFn } from '../src/utils.js';
2
- import { registerBidder } from '../src/adapters/bidderFactory.js';
3
- import { BANNER, VIDEO } from '../src/mediaTypes.js';
4
- import { getStorageManager } from '../src/storageManager.js';
5
- import { bidderSettings } from '../src/bidderSettings.js';
1
+ import {_each, deepAccess, parseSizesInput, parseUrl, uniques, isFn} from '../src/utils.js';
2
+ import {registerBidder} from '../src/adapters/bidderFactory.js';
3
+ import {BANNER, VIDEO} from '../src/mediaTypes.js';
4
+ import {getStorageManager} from '../src/storageManager.js';
5
+ import {bidderSettings} from '../src/bidderSettings.js';
6
+ import { config } from '../src/config.js';
6
7
 
7
8
  const GVLID = 744;
8
9
  const DEFAULT_SUB_DOMAIN = 'prebid';
@@ -26,11 +27,11 @@ export const SUPPORTED_ID_SYSTEMS = {
26
27
  'tdid': 1,
27
28
  'pubProvidedId': 1
28
29
  };
29
- const storage = getStorageManager({ gvlid: GVLID, bidderCode: BIDDER_CODE });
30
+ const storage = getStorageManager({gvlid: GVLID, bidderCode: BIDDER_CODE});
30
31
 
31
32
  function getTopWindowQueryParams() {
32
33
  try {
33
- const parsedUrl = parseUrl(window.top.document.URL, { decodeSearchAsString: true });
34
+ const parsedUrl = parseUrl(window.top.document.URL, {decodeSearchAsString: true});
34
35
  return parsedUrl.search;
35
36
  } catch (e) {
36
37
  return '';
@@ -58,10 +59,23 @@ function isBidRequestValid(bid) {
58
59
  return !!(extractCID(params) && extractPID(params));
59
60
  }
60
61
 
61
- function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
62
- const { params, bidId, userId, adUnitCode, schain, mediaTypes } = bid;
63
- const { ext } = params;
64
- let { bidFloor } = params;
62
+ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
63
+ const {
64
+ params,
65
+ bidId,
66
+ userId,
67
+ adUnitCode,
68
+ schain,
69
+ mediaTypes,
70
+ auctionId,
71
+ transactionId,
72
+ bidderRequestId,
73
+ bidRequestsCount,
74
+ bidderRequestsCount,
75
+ bidderWinsCount
76
+ } = bid;
77
+ const {ext} = params;
78
+ let {bidFloor} = params;
65
79
  const hashUrl = hashCode(topWindowUrl);
66
80
  const dealId = getNextDealId(hashUrl);
67
81
  const uniqueDealId = getUniqueDealId(hashUrl);
@@ -110,7 +124,14 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
110
124
  isStorageAllowed: isStorageAllowed,
111
125
  gpid: gpid,
112
126
  cat: cat,
113
- pagecat: pagecat
127
+ pagecat: pagecat,
128
+ auctionId: auctionId,
129
+ transactionId: transactionId,
130
+ bidderRequestId: bidderRequestId,
131
+ bidRequestsCount: bidRequestsCount,
132
+ bidderRequestsCount: bidderRequestsCount,
133
+ bidderWinsCount: bidderWinsCount,
134
+ bidderTimeout: bidderTimeout
114
135
  };
115
136
 
116
137
  appendUserIdsToRequestPayload(data, userId);
@@ -127,6 +148,14 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
127
148
  data.usPrivacy = bidderRequest.uspConsent;
128
149
  }
129
150
 
151
+ if (bidderRequest.gppConsent) {
152
+ data.gppString = bidderRequest.gppConsent.gppString;
153
+ data.gppSid = bidderRequest.gppConsent.applicableSections;
154
+ } else if (bidderRequest.ortb2?.regs?.gpp) {
155
+ data.gppString = bidderRequest.ortb2.regs.gpp;
156
+ data.gppSid = bidderRequest.ortb2.regs.gpp_sid;
157
+ }
158
+
130
159
  const dto = {
131
160
  method: 'POST',
132
161
  url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
@@ -169,10 +198,11 @@ function appendUserIdsToRequestPayload(payloadRef, userIds) {
169
198
  function buildRequests(validBidRequests, bidderRequest) {
170
199
  // TODO: does the fallback make sense here?
171
200
  const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
201
+ const bidderTimeout = config.getConfig('bidderTimeout');
172
202
  const requests = [];
173
203
  validBidRequests.forEach(validBidRequest => {
174
204
  const sizes = parseSizesInput(validBidRequest.sizes);
175
- const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest);
205
+ const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
176
206
  requests.push(request);
177
207
  });
178
208
  return requests;
@@ -182,14 +212,14 @@ function interpretResponse(serverResponse, request) {
182
212
  if (!serverResponse || !serverResponse.body) {
183
213
  return [];
184
214
  }
185
- const { bidId } = request.data;
186
- const { results } = serverResponse.body;
215
+ const {bidId} = request.data;
216
+ const {results} = serverResponse.body;
187
217
 
188
218
  let output = [];
189
219
 
190
220
  try {
191
221
  results.forEach(result => {
192
- const { creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER } = result;
222
+ const {creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER} = result;
193
223
  if (!ad || !price) {
194
224
  return;
195
225
  }
@@ -228,8 +258,8 @@ function interpretResponse(serverResponse, request) {
228
258
 
229
259
  function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '') {
230
260
  let syncs = [];
231
- const { iframeEnabled, pixelEnabled } = syncOptions;
232
- const { gdprApplies, consentString = '' } = gdprConsent;
261
+ const {iframeEnabled, pixelEnabled} = syncOptions;
262
+ const {gdprApplies, consentString = ''} = gdprConsent;
233
263
 
234
264
  const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
235
265
  const params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`
@@ -253,7 +283,9 @@ export function hashCode(s, prefix = '_') {
253
283
  let h = 0
254
284
  let i = 0;
255
285
  if (l > 0) {
256
- while (i < l) { h = (h << 5) - h + s.charCodeAt(i++) | 0; }
286
+ while (i < l) {
287
+ h = (h << 5) - h + s.charCodeAt(i++) | 0;
288
+ }
257
289
  }
258
290
  return prefix + h;
259
291
  }
@@ -310,7 +342,8 @@ export function getCacheOpt() {
310
342
  export function getStorageItem(key) {
311
343
  try {
312
344
  return tryParseJSON(storage.getDataFromLocalStorage(key));
313
- } catch (e) { }
345
+ } catch (e) {
346
+ }
314
347
 
315
348
  return null;
316
349
  }
@@ -318,9 +351,10 @@ export function getStorageItem(key) {
318
351
  export function setStorageItem(key, value, timestamp) {
319
352
  try {
320
353
  const created = timestamp || Date.now();
321
- const data = JSON.stringify({ value, created });
354
+ const data = JSON.stringify({value, created});
322
355
  storage.setDataInLocalStorage(key, data);
323
- } catch (e) { }
356
+ } catch (e) {
357
+ }
324
358
  }
325
359
 
326
360
  export function tryParseJSON(value) {
@@ -90,6 +90,21 @@ export const spec = {
90
90
  if (!impData.banner && !impData.video) {
91
91
  impData.banner = buildBanner(request);
92
92
  }
93
+
94
+ if (typeof request.getFloor === 'function') {
95
+ const floorInfo = request.getFloor({
96
+ currency: 'USD',
97
+ mediaType: impData.video ? 'video' : 'banner',
98
+ size: [ impData.video ? impData.video.w : impData.banner.w, impData.video ? impData.video.h : impData.banner.h ]
99
+ });
100
+ if (floorInfo && floorInfo.floor) {
101
+ impData.bidfloor = floorInfo.floor;
102
+ }
103
+ }
104
+ if (!impData.bidfloor && params.bidfloor) {
105
+ impData.bidfloor = params.bidfloor;
106
+ }
107
+
93
108
  return impData;
94
109
  });
95
110
 
@@ -1,328 +1,8 @@
1
- /**
2
- * This module adds Zeus Insights For Publishers (ZIP) provider to the real time data module
3
- * The {@link module:modules/realTimeData} module is required
4
- *
5
- * This module will request the article topics for the current page and add them as page keyvalues
6
- * for the ad requests.
7
- *
8
- * @module modules/zeusInsightsForPublishersRtdProvider
9
- * @requires module:modules/realTimeData
10
- */
11
-
12
- import { logInfo, logError, logWarn, logMessage } from '../src/utils.js'
1
+ import { logWarn } from '../src/utils.js'
13
2
  import { submodule } from '../src/hook.js'
14
- import { ajaxBuilder } from '../src/ajax.js'
15
-
16
- class Logger {
17
- get showDebug() {
18
- if (this._showDebug === true || this._showDebug === false) {
19
- return this._showDebug
20
- }
21
-
22
- return window.zeusPrime?.debug || false
23
- }
24
- set showDebug(shouldShow) {
25
- this._showDebug = shouldShow
26
- }
27
-
28
- get error() {
29
- return logError.bind(this, 'zeusPrimeRtdProvider: ')
30
- }
31
- get warn() {
32
- return logWarn.bind(this, 'zeusPrimeRtdProvider: ')
33
- }
34
- get info() {
35
- return logInfo.bind(this, 'zeusPrimeRtdProvider: ')
36
- }
37
- get debug() {
38
- if (this.showDebug) {
39
- return logMessage.bind(this, 'zeusPrimeRtdProvider: ')
40
- }
41
-
42
- return () => {}
43
- }
44
- }
45
-
46
- var logger = new Logger()
47
-
48
- function loadCommandQueue() {
49
- window.zeusPrime = window.zeusPrime || { cmd: [] }
50
- const queue = [...window.zeusPrime.cmd]
51
-
52
- window.zeusPrime.cmd = []
53
- window.zeusPrime.cmd.push = (callback) => {
54
- callback(window.zeusPrime)
55
- }
56
-
57
- queue.forEach((callback) => callback(window.zeusPrime))
58
- }
59
-
60
- function markStatusComplete(key) {
61
- const status = window?.zeusPrime?.status
62
- if (status) {
63
- status[key] = true
64
- }
65
- }
66
-
67
- function createStatus() {
68
- if (window.zeusPrime && !window.zeusPrime.status) {
69
- Object.defineProperty(window.zeusPrime, 'status', {
70
- enumerable: false,
71
- value: {
72
- initComplete: false,
73
- primeKeyValueSet: false,
74
- insightsReqSent: false,
75
- insightsReqReceived: false,
76
- insightsKeyValueSet: false,
77
- scriptComplete: false,
78
- },
79
- })
80
- }
81
- }
82
-
83
- function loadPrimeQueryParams() {
84
- try {
85
- const params = new URLSearchParams(window.location.search)
86
- params.forEach((paramValue, paramKey) => {
87
- if (!paramKey.startsWith('zeus_prime_')) {
88
- return
89
- }
90
-
91
- let key = paramKey.replace('zeus_prime_', '')
92
- let value = paramValue.toLowerCase()
93
-
94
- if (value === 'true' || value === '1') {
95
- value = true
96
- } else if (value === 'false' || value === '0') {
97
- value = false
98
- }
99
-
100
- window.zeusPrime[key] = value
101
- })
102
- } catch (_) {}
103
- }
104
-
105
- const DEFAULT_API = 'https://insights.zeustechnology.com'
106
-
107
- function init(gamId = null, options = {}) {
108
- window.zeusPrime = window.zeusPrime || { cmd: [] }
109
-
110
- window.zeusPrime.gamId = gamId || options.gamId || window.zeusPrime.gamId || undefined
111
- window.zeusPrime.api = DEFAULT_API
112
- window.zeusPrime.hostname = options.hostname || window.location?.hostname || ''
113
- window.zeusPrime.pathname = options.pathname || window.location?.pathname || ''
114
- window.zeusPrime.pageUrl = `${window.zeusPrime.hostname}${window.zeusPrime.pathname}`
115
- window.zeusPrime.pageHash = options.pageHash || null
116
- window.zeusPrime.debug = window.zeusPrime.debug || options.debug === true || false
117
- window.zeusPrime.disabled = window.zeusPrime.disabled || options.disabled === true || false
118
-
119
- loadPrimeQueryParams()
120
-
121
- logger.showDebug = window.zeusPrime.debug
122
-
123
- createStatus()
124
- markStatusComplete('initComplete')
125
- }
126
-
127
- function setTargeting() {
128
- const { gamId, hostname } = window.zeusPrime
129
-
130
- if (typeof gamId !== 'string') {
131
- throw new Error(`window.zeusPrime.gamId must be a string. Received: ${String(gamId)}`)
132
- }
133
-
134
- addKeyValueToGoogletag(`zeus_${gamId}`, hostname)
135
- logger.debug(`Setting zeus_${gamId}=${hostname}`)
136
- markStatusComplete('primeKeyValueSet')
137
- }
138
3
 
139
- function setPrimeAsDisabled() {
140
- addKeyValueToGoogletag('zeus_prime', 'false')
141
- logger.debug('Disabling prime; Setting key-value zeus_prime to false')
142
- }
143
-
144
- function addKeyValueToGoogletag(key, value) {
145
- window.googletag = window.googletag || { cmd: [] }
146
- window.googletag.cmd.push(function () {
147
- window.googletag.pubads().setTargeting(key, value)
148
- })
149
- }
150
-
151
- function isInsightsPage(pathname = '') {
152
- const NOT_SECTIONS = [
153
- {
154
- test: /\/search/,
155
- type: 'search',
156
- },
157
- {
158
- test: /\/author/,
159
- type: 'author',
160
- },
161
- {
162
- test: /\/event/,
163
- type: 'event',
164
- },
165
- {
166
- test: /\/homepage/,
167
- type: 'front',
168
- },
169
- {
170
- test: /^\/?$/,
171
- type: 'front',
172
- },
173
- ]
174
-
175
- const typeObj = NOT_SECTIONS.find((pg) => pathname.match(pg.test))
176
- return typeObj === undefined
177
- }
178
-
179
- async function getUrlHash(canonical) {
180
- try {
181
- const buf = await window.crypto.subtle.digest(
182
- 'SHA-1',
183
- new TextEncoder('utf-8').encode(canonical)
184
- )
185
- const hashed = Array.prototype.map
186
- .call(new Uint8Array(buf), (x) => `00${x.toString(16)}`.slice(-2))
187
- .join('')
188
-
189
- return hashed
190
- } catch (e) {
191
- logger.error('Failed to load hash', e.message)
192
- logger.debug('Exception', e)
193
- return ''
194
- }
195
- }
196
-
197
- async function sendPrebidRequest(url) {
198
- return new Promise((resolve, reject) => {
199
- const ajax = ajaxBuilder()
200
- ajax(url, {
201
- success: (responseText, response) => {
202
- resolve({
203
- ...response,
204
- status: response.status,
205
- json: () => JSON.parse(responseText),
206
- })
207
- },
208
-
209
- error: (responseText, response) => {
210
- if (!response.status) {
211
- reject(response)
212
- }
213
-
214
- let json = responseText
215
- if (responseText) {
216
- try {
217
- json = JSON.parse(responseText)
218
- } catch (_) {
219
- json = null
220
- }
221
- }
222
-
223
- resolve({
224
- status: response.status,
225
- json: () => json || null,
226
- responseValue: json,
227
- })
228
- },
229
- })
230
- })
231
- }
232
-
233
- async function requestTopics() {
234
- const { api, hostname, pageUrl } = window.zeusPrime
235
-
236
- if (!window.zeusPrime.pageHash) {
237
- window.zeusPrime.pageHash = await getUrlHash(pageUrl)
238
- }
239
-
240
- const pageHash = window.zeusPrime.pageHash
241
- const zeusInsightsUrl = `${api}/${hostname}/${pageHash}?article_location=${pageUrl}`
242
-
243
- logger.debug('Requesting topics', zeusInsightsUrl)
244
- try {
245
- markStatusComplete('insightsReqSent')
246
- const response = await sendPrebidRequest(zeusInsightsUrl)
247
- if (response.status === 200) {
248
- logger.debug('topics found')
249
- markStatusComplete('insightsReqReceived')
250
- return await response.json()
251
- } else if (
252
- response.status === 204 ||
253
- response.status < 200 ||
254
- (response.status >= 300 && response.status <= 399)
255
- ) {
256
- logger.debug('no topics found')
257
- markStatusComplete('insightsReqReceived')
258
- return null
259
- } else {
260
- logger.error(`Topics request returned error: ${response.status}`)
261
- markStatusComplete('insightsReqReceived')
262
- return null
263
- }
264
- } catch (e) {
265
- logger.error('failed to request topics', e)
266
- return null
267
- }
268
- }
269
-
270
- function setTopicsTargeting(topics = []) {
271
- if (topics.length === 0) {
272
- return
273
- }
274
-
275
- window.googletag = window.googletag || { cmd: [] }
276
- window.googletag.cmd.push(function () {
277
- window.googletag.pubads().setTargeting('zeus_insights', topics)
278
- })
279
-
280
- markStatusComplete('insightsKeyValueSet')
281
- }
282
-
283
- async function startTopicsRequest() {
284
- if (isInsightsPage(window.zeusPrime.pathname)) {
285
- const response = await requestTopics()
286
- if (response) {
287
- setTopicsTargeting(response?.topics)
288
- }
289
- } else {
290
- logger.debug('This page is not eligible for topics, request will be skipped')
291
- }
292
- }
293
-
294
- async function run(gamId, options = {}) {
295
- logger.showDebug = options.debug || false
296
-
297
- try {
298
- init(gamId, options)
299
- loadCommandQueue()
300
-
301
- if (window.zeusPrime.disabled) {
302
- setPrimeAsDisabled()
303
- } else {
304
- setTargeting()
305
- await startTopicsRequest()
306
- }
307
- } catch (e) {
308
- logger.error('Failed to run.', e.message || e)
309
- } finally {
310
- markStatusComplete('scriptComplete')
311
- }
312
- }
313
-
314
- /**
315
- * @preserve
316
- * Initializes the ZeusPrime RTD Submodule. The config provides the GamID for this
317
- * site that is used to configure Prime.
318
- * @param {object} config The Prebid configuration for this module.
319
- * @param {object} config.params The parameters for this module.
320
- * @param {string} config.params.gamId The Gam ID (or Network Code) in GAM for this site.
321
- */
322
- function initModule(config) {
323
- const { params } = config || {}
324
- const { gamId, ...rest } = params || {}
325
- run(gamId, rest)
4
+ function initModule() {
5
+ logWarn('Zeus Prime has been deprecated. This module will be removed in Prebid 8.')
326
6
  }
327
7
 
328
8
  /**
@@ -1,5 +1,8 @@
1
1
  # Overview
2
2
 
3
+ # NOTE: ZEUS PRIME HAS BEEN DEPRECATED!
4
+ # THIS MODULE WILL BE REMOVED IN PREBID 8.
5
+
3
6
  Module Name: Zeus Prime RTD Provider
4
7
  Module Type: Rtd Provider
5
8
  Maintainer: support@zeustechnology.com
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.33.0",
3
+ "version": "7.35.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
package/src/adloader.js CHANGED
@@ -21,7 +21,8 @@ const _approvedLoadExternalJSList = [
21
21
  'medianet',
22
22
  'improvedigital',
23
23
  'aaxBlockmeter',
24
- 'confiant'
24
+ 'confiant',
25
+ 'arcspan'
25
26
  ]
26
27
 
27
28
  /**
package/src/auction.js CHANGED
@@ -93,6 +93,7 @@ import CONSTANTS from './constants.json';
93
93
  import {GreedyPromise} from './utils/promise.js';
94
94
  import {useMetrics} from './utils/perfMetrics.js';
95
95
  import {createBid} from './bidfactory.js';
96
+ import {adjustCpm} from './utils/cpm.js';
96
97
 
97
98
  const { syncUsers } = userSync;
98
99
 
@@ -971,17 +972,7 @@ function setKeys(keyValues, bidderSettings, custBidObj, bidReq) {
971
972
  }
972
973
 
973
974
  export function adjustBids(bid) {
974
- let code = bid.bidderCode;
975
- let bidPriceAdjusted = bid.cpm;
976
- const bidCpmAdjustment = bidderSettings.get(code || null, 'bidCpmAdjustment');
977
-
978
- if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
979
- try {
980
- bidPriceAdjusted = bidCpmAdjustment(bid.cpm, Object.assign({}, bid));
981
- } catch (e) {
982
- logError('Error during bid adjustment', 'bidmanager.js', e);
983
- }
984
- }
975
+ let bidPriceAdjusted = adjustCpm(bid.cpm, bid);
985
976
 
986
977
  if (bidPriceAdjusted >= 0) {
987
978
  bid.cpm = bidPriceAdjusted;
package/src/prebid.js CHANGED
@@ -915,6 +915,14 @@ $$PREBID_GLOBAL$$.aliasBidder = function (bidderCode, alias, options) {
915
915
  }
916
916
  };
917
917
 
918
+ /**
919
+ * @alias module:pbjs.aliasRegistry
920
+ */
921
+ $$PREBID_GLOBAL$$.aliasRegistry = adapterManager.aliasRegistry;
922
+ config.getConfig('aliasRegistry', config => {
923
+ if (config.aliasRegistry === 'private') delete $$PREBID_GLOBAL$$.aliasRegistry;
924
+ });
925
+
918
926
  /**
919
927
  * The bid response object returned by an external bidder adapter during the auction.
920
928
  * @typedef {Object} AdapterBidResponse
@@ -0,0 +1,17 @@
1
+ import {auctionManager} from '../auctionManager.js';
2
+ import {bidderSettings} from '../bidderSettings.js';
3
+ import {logError} from '../utils.js';
4
+
5
+ export function adjustCpm(cpm, bidResponse, bidRequest, {index = auctionManager.index, bs = bidderSettings} = {}) {
6
+ bidRequest = bidRequest || index.getBidRequest(bidResponse);
7
+ const bidCpmAdjustment = bs.get(bidResponse?.bidderCode || bidRequest?.bidder, 'bidCpmAdjustment');
8
+
9
+ if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
10
+ try {
11
+ return bidCpmAdjustment(cpm, Object.assign({}, bidResponse), bidRequest);
12
+ } catch (e) {
13
+ logError('Error during bid adjustment', e);
14
+ }
15
+ }
16
+ return cpm;
17
+ }