prebid.js 7.36.0 → 7.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/adxcgBidAdapter.js +1 -1
  9. package/dist/adyoulikeBidAdapter.js +1 -1
  10. package/dist/ajaBidAdapter.js +1 -1
  11. package/dist/amxBidAdapter.js +1 -1
  12. package/dist/amxIdSystem.js +1 -1
  13. package/dist/appierAnalyticsAdapter.js +1 -1
  14. package/dist/appnexusBidAdapter.js +1 -1
  15. package/dist/asoBidAdapter.js +1 -1
  16. package/dist/axonixBidAdapter.js +1 -1
  17. package/dist/bidglassBidAdapter.js +1 -1
  18. package/dist/big-richmediaBidAdapter.js +1 -1
  19. package/dist/bridgewellBidAdapter.js +1 -1
  20. package/dist/brightMountainMediaBidAdapter.js +1 -1
  21. package/dist/carodaBidAdapter.js +1 -1
  22. package/dist/chtnwBidAdapter.js +1 -1
  23. package/dist/concertBidAdapter.js +1 -1
  24. package/dist/connectadBidAdapter.js +1 -1
  25. package/dist/consumableBidAdapter.js +1 -1
  26. package/dist/conversantBidAdapter.js +1 -1
  27. package/dist/craftBidAdapter.js +1 -1
  28. package/dist/criteoBidAdapter.js +1 -1
  29. package/dist/cwireBidAdapter.js +1 -1
  30. package/dist/discoveryBidAdapter.js +1 -1
  31. package/dist/dspxBidAdapter.js +1 -1
  32. package/dist/eplanningBidAdapter.js +1 -1
  33. package/dist/feedadBidAdapter.js +1 -1
  34. package/dist/finativeBidAdapter.js +1 -1
  35. package/dist/glimpseBidAdapter.js +1 -1
  36. package/dist/gmosspBidAdapter.js +1 -1
  37. package/dist/goldbachBidAdapter.js +1 -1
  38. package/dist/gridBidAdapter.js +1 -1
  39. package/dist/gridNMBidAdapter.js +1 -1
  40. package/dist/gumgumBidAdapter.js +1 -1
  41. package/dist/h12mediaBidAdapter.js +1 -1
  42. package/dist/id5IdSystem.js +1 -1
  43. package/dist/improvedigitalBidAdapter.js +1 -1
  44. package/dist/incrxBidAdapter.js +1 -1
  45. package/dist/inmarBidAdapter.js +1 -1
  46. package/dist/insticatorBidAdapter.js +1 -1
  47. package/dist/ixBidAdapter.js +1 -1
  48. package/dist/justpremiumBidAdapter.js +1 -1
  49. package/dist/konduitAnalyticsAdapter.js +1 -1
  50. package/dist/kueezBidAdapter.js +1 -1
  51. package/dist/kueezRtbBidAdapter.js +1 -1
  52. package/dist/lassoBidAdapter.js +1 -1
  53. package/dist/lifestreetBidAdapter.js +1 -1
  54. package/dist/livewrappedBidAdapter.js +1 -1
  55. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  56. package/dist/logicadBidAdapter.js +1 -1
  57. package/dist/loglyliftBidAdapter.js +1 -1
  58. package/dist/magniteAnalyticsAdapter.js +1 -1
  59. package/dist/malltvAnalyticsAdapter.js +1 -1
  60. package/dist/marsmediaBidAdapter.js +1 -1
  61. package/dist/mediafuseBidAdapter.js +1 -1
  62. package/dist/mediagoBidAdapter.js +1 -1
  63. package/dist/mediasquareBidAdapter.js +1 -1
  64. package/dist/mgidBidAdapter.js +1 -1
  65. package/dist/minutemediaBidAdapter.js +1 -1
  66. package/dist/minutemediaplusBidAdapter.js +1 -0
  67. package/dist/nextMillenniumBidAdapter.js +1 -1
  68. package/dist/nexx360BidAdapter.js +1 -1
  69. package/dist/not-for-prod/prebid.js +124 -123
  70. package/dist/oguryBidAdapter.js +1 -1
  71. package/dist/onetagBidAdapter.js +1 -1
  72. package/dist/ooloAnalyticsAdapter.js +1 -1
  73. package/dist/outbrainBidAdapter.js +1 -1
  74. package/dist/parrableIdSystem.js +1 -1
  75. package/dist/pixfutureBidAdapter.js +1 -1
  76. package/dist/prebid-core.js +1 -1
  77. package/dist/prebidServerBidAdapter.js +1 -1
  78. package/dist/proxistoreBidAdapter.js +1 -1
  79. package/dist/publinkIdSystem.js +1 -1
  80. package/dist/pubmaticBidAdapter.js +1 -1
  81. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  82. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  83. package/dist/pxyzBidAdapter.js +1 -1
  84. package/dist/quantcastBidAdapter.js +1 -1
  85. package/dist/readpeakBidAdapter.js +1 -1
  86. package/dist/relaidoBidAdapter.js +1 -1
  87. package/dist/rhythmoneBidAdapter.js +1 -1
  88. package/dist/riseBidAdapter.js +1 -1
  89. package/dist/rubiconAnalyticsAdapter.js +1 -1
  90. package/dist/rubiconBidAdapter.js +1 -1
  91. package/dist/seedingAllianceBidAdapter.js +1 -1
  92. package/dist/seedtagBidAdapter.js +1 -1
  93. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  94. package/dist/sharethroughBidAdapter.js +1 -1
  95. package/dist/shinezBidAdapter.js +1 -1
  96. package/dist/smaatoBidAdapter.js +1 -1
  97. package/dist/smartadserverBidAdapter.js +1 -1
  98. package/dist/smartxBidAdapter.js +1 -1
  99. package/dist/smilewantedBidAdapter.js +1 -1
  100. package/dist/sonobiBidAdapter.js +1 -1
  101. package/dist/sovrnAnalyticsAdapter.js +1 -1
  102. package/dist/sovrnBidAdapter.js +1 -1
  103. package/dist/sspBCBidAdapter.js +1 -1
  104. package/dist/sublimeBidAdapter.js +1 -1
  105. package/dist/synacormediaBidAdapter.js +1 -1
  106. package/dist/targetVideoBidAdapter.js +1 -1
  107. package/dist/teadsBidAdapter.js +1 -1
  108. package/dist/trionBidAdapter.js +1 -1
  109. package/dist/tripleliftBidAdapter.js +1 -1
  110. package/dist/ttdBidAdapter.js +1 -1
  111. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  112. package/dist/uid2IdSystem.js +1 -1
  113. package/dist/underdogmediaBidAdapter.js +1 -1
  114. package/dist/undertoneBidAdapter.js +1 -1
  115. package/dist/vidazooBidAdapter.js +1 -1
  116. package/dist/videobyteBidAdapter.js +1 -1
  117. package/dist/visxBidAdapter.js +1 -1
  118. package/dist/vuukleBidAdapter.js +1 -1
  119. package/dist/widespaceBidAdapter.js +1 -1
  120. package/dist/winrBidAdapter.js +1 -1
  121. package/dist/yahoosspBidAdapter.js +1 -1
  122. package/dist/yieldmoBidAdapter.js +1 -1
  123. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  124. package/modules/adagioBidAdapter.js +14 -14
  125. package/modules/adagioBidAdapter.md +3 -1
  126. package/modules/criteoBidAdapter.js +4 -5
  127. package/modules/cwireBidAdapter.md +9 -3
  128. package/modules/discoveryBidAdapter.js +22 -12
  129. package/modules/incrxBidAdapter.js +2 -0
  130. package/modules/kueezRtbBidAdapter.js +54 -20
  131. package/modules/livewrappedBidAdapter.js +28 -16
  132. package/modules/mediagoBidAdapter.js +22 -17
  133. package/modules/minutemediaplusBidAdapter.js +291 -0
  134. package/modules/minutemediaplusBidAdapter.md +35 -0
  135. package/modules/nextMillenniumBidAdapter.js +9 -1
  136. package/modules/prebidServerBidAdapter/ortbConverter.js +6 -0
  137. package/modules/proxistoreBidAdapter.js +2 -2
  138. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  139. package/modules/sonobiBidAdapter.js +1 -10
  140. package/modules/tripleliftBidAdapter.js +4 -0
  141. package/modules/yieldmoBidAdapter.js +1 -0
  142. package/package.json +1 -1
  143. package/src/adapterManager.js +30 -14
  144. package/src/utils.js +1 -1
  145. package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
  146. package/test/spec/modules/criteoBidAdapter_spec.js +24 -1
  147. package/test/spec/modules/incrxBidAdapter_spec.js +4 -0
  148. package/test/spec/modules/kueezRtbBidAdapter_spec.js +63 -22
  149. package/test/spec/modules/livewrappedBidAdapter_spec.js +267 -2
  150. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +519 -0
  151. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +11 -0
  152. package/test/spec/modules/prebidServerBidAdapter_spec.js +56 -0
  153. package/test/spec/modules/proxistoreBidAdapter_spec.js +2 -2
  154. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +3 -1
  155. package/test/spec/modules/sonobiBidAdapter_spec.js +3 -25
  156. package/test/spec/modules/tripleliftBidAdapter_spec.js +7 -0
  157. package/test/spec/unit/core/adapterManager_spec.js +147 -0
@@ -1,4 +1,4 @@
1
- import {deepAccess, getWindowTop, isSafariBrowser, mergeDeep} from '../src/utils.js';
1
+ import {deepAccess, getWindowTop, isSafariBrowser, mergeDeep, isFn, isPlainObject} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {config} from '../src/config.js';
4
4
  import {find} from '../src/polyfill.js';
@@ -68,7 +68,9 @@ export const spec = {
68
68
  bidUrl = bidUrl ? bidUrl.params.bidUrl : URL;
69
69
  url = url ? url.params.url : (getAppDomain() || getTopWindowLocation(bidderRequest));
70
70
  test = test ? test.params.test : undefined;
71
- var adRequests = bidRequests.map(bidToAdRequest);
71
+ const currency = config.getConfig('currency.adServerCurrency') || 'USD';
72
+ var adRequests = bidRequests.map(b => bidToAdRequest(b, currency));
73
+ const adRequestsContainFloors = adRequests.some(r => r.flr !== undefined);
72
74
 
73
75
  if (eids) {
74
76
  ortb2 = mergeDeep(mergeDeep({}, ortb2 || {}), eids);
@@ -96,7 +98,8 @@ export const spec = {
96
98
  rcv: getAdblockerRecovered(),
97
99
  adRequests: [...adRequests],
98
100
  rtbData: ortb2,
99
- schain: schain
101
+ schain: schain,
102
+ flrCur: adRequestsContainFloors ? currency : undefined
100
103
  };
101
104
 
102
105
  if (config.getConfig().debug) {
@@ -223,13 +226,14 @@ function hasPubcid(bid) {
223
226
  return !!bid.crumbs && !!bid.crumbs.pubcid;
224
227
  }
225
228
 
226
- function bidToAdRequest(bid) {
229
+ function bidToAdRequest(bid, currency) {
227
230
  var adRequest = {
228
231
  adUnitId: bid.params.adUnitId,
229
232
  callerAdUnitId: bid.params.adUnitName || bid.adUnitCode || bid.placementCode,
230
233
  bidId: bid.bidId,
231
234
  transactionId: bid.transactionId,
232
235
  formats: getSizes(bid).map(sizeToFormat),
236
+ flr: getBidFloor(bid, currency),
233
237
  options: bid.params.options
234
238
  };
235
239
 
@@ -264,6 +268,22 @@ function sizeToFormat(size) {
264
268
  }
265
269
  }
266
270
 
271
+ function getBidFloor(bid, currency) {
272
+ if (!isFn(bid.getFloor)) {
273
+ return undefined;
274
+ }
275
+
276
+ const floor = bid.getFloor({
277
+ currency: currency,
278
+ mediaType: '*',
279
+ size: '*'
280
+ });
281
+
282
+ return isPlainObject(floor) && !isNaN(floor.floor) && floor.currency == currency
283
+ ? floor.floor
284
+ : undefined;
285
+ }
286
+
267
287
  function getAdblockerRecovered() {
268
288
  try {
269
289
  return getWindowTop().I12C && getWindowTop().I12C.Morph === 1;
@@ -302,21 +322,13 @@ function getDeviceIfa() {
302
322
  }
303
323
 
304
324
  function getDeviceWidth() {
305
- let device = config.getConfig('device');
306
- if (typeof device === 'object' && device.width) {
307
- return device.width;
308
- }
309
-
310
- return window.innerWidth;
325
+ const device = config.getConfig('device') || {};
326
+ return device.w || window.innerWidth;
311
327
  }
312
328
 
313
329
  function getDeviceHeight() {
314
- let device = config.getConfig('device');
315
- if (typeof device === 'object' && device.height) {
316
- return device.height;
317
- }
318
-
319
- return window.innerHeight;
330
+ const device = config.getConfig('device') || {};
331
+ return device.h || window.innerHeight;
320
332
  }
321
333
 
322
334
  function getCoppa() {
@@ -148,12 +148,12 @@ function isMobileAndTablet() {
148
148
  */
149
149
  // function getBidFloor(bid, mediaType, sizes) {
150
150
  // var floor;
151
- // var size = sizes.length === 1 ? sizes[0] : "*";
152
- // if (typeof bid.getFloor === "function") {
153
- // const floorInfo = bid.getFloor({ currency: "USD", mediaType, size });
151
+ // var size = sizes.length === 1 ? sizes[0] : '*';
152
+ // if (typeof bid.getFloor === 'function') {
153
+ // const floorInfo = bid.getFloor({ currency: 'USD', mediaType, size });
154
154
  // if (
155
- // typeof floorInfo === "object" &&
156
- // floorInfo.currency === "USD" &&
155
+ // typeof floorInfo === 'object' &&
156
+ // floorInfo.currency === 'USD' &&
157
157
  // !isNaN(parseFloat(floorInfo.floor))
158
158
  // ) {
159
159
  // floor = parseFloat(floorInfo.floor);
@@ -255,7 +255,6 @@ function getItems(validBidRequests, bidderRequest) {
255
255
  // utils.deepAccess(req, 'ortb2Imp.ext.gpid') ||
256
256
  // utils.deepAccess(req, 'ortb2Imp.ext.data.pbadslot') ||
257
257
  // utils.deepAccess(req, 'params.placementId', 0);
258
- // console.log("wjh getItems:", req, bidFloor, gpid);
259
258
 
260
259
  // if (mediaTypes.native) {}
261
260
  // banner广告类型
@@ -270,7 +269,7 @@ function getItems(validBidRequests, bidderRequest) {
270
269
  pos: 1,
271
270
  },
272
271
  ext: {
273
- // gpid: gpid, // 加入后无法返回广告
272
+ // gpid: gpid, // 加入后无法返回广告
274
273
  },
275
274
  };
276
275
  itemMaps[id] = {
@@ -296,6 +295,8 @@ function getParam(validBidRequests, bidderRequest) {
296
295
  const sharedid =
297
296
  utils.deepAccess(validBidRequests[0], 'userId.sharedid.id') ||
298
297
  utils.deepAccess(validBidRequests[0], 'userId.pubcid');
298
+ const eids = validBidRequests[0].userIdAsEids || validBidRequests[0].userId;
299
+
299
300
  let isMobile = isMobileAndTablet() ? 1 : 0;
300
301
  // input test status by Publisher. more frequently for test true req
301
302
  let isTest = validBidRequests[0].params.test || 0;
@@ -318,19 +319,23 @@ function getParam(validBidRequests, bidderRequest) {
318
319
  cur: ['USD'],
319
320
  device: {
320
321
  connectiontype: 0,
321
- // ip: '64.188.178.115',
322
+ // ip: '98.61.5.0',
322
323
  js: 1,
323
- // language: "en",
324
- // os: "Microsoft Windows",
325
- // ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19043",
324
+ // language: 'en',
325
+ // os: 'Microsoft Windows',
326
+ // ua: 'Mozilla/5.0 (Linux; Android 12; SM-G970U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36',
326
327
  os: navigator.platform || '',
327
328
  ua: navigator.userAgent,
328
329
  language: /en/.test(navigator.language) ? 'en' : navigator.language,
329
330
  },
330
- ext: {},
331
+ ext: {
332
+ eids,
333
+ },
331
334
  user: {
332
- id: sharedid || pubcid || getUserID(),
335
+ buyeruid: getUserID(),
336
+ id: sharedid || pubcid,
333
337
  },
338
+ eids,
334
339
  site: {
335
340
  name: domain,
336
341
  domain: domain,
@@ -420,12 +425,12 @@ export const spec = {
420
425
  nurl: getProperty(bid, 'nurl'),
421
426
  // adserverTargeting: {
422
427
  // granularityMultiplier: 0.1,
423
- // priceGranularity: "pbHg",
424
- // pbMg: "0.01",
428
+ // priceGranularity: 'pbHg',
429
+ // pbMg: '0.01',
425
430
  // },
426
- // pbMg: "0.01",
431
+ // pbMg: '0.01',
427
432
  // granularityMultiplier: 0.1,
428
- // priceGranularity: "pbHg",
433
+ // priceGranularity: 'pbHg',
429
434
  };
430
435
  bidResponses.push(bidResponse);
431
436
  }
@@ -0,0 +1,291 @@
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
+
6
+ const GVLID = 918;
7
+ const DEFAULT_SUB_DOMAIN = 'exchange';
8
+ const BIDDER_CODE = 'mmplus';
9
+ const BIDDER_VERSION = '1.0.0';
10
+ const CURRENCY = 'USD';
11
+ const TTL_SECONDS = 60 * 5;
12
+ const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 15;
13
+ export const SUPPORTED_ID_SYSTEMS = {
14
+ 'britepoolid': 1,
15
+ 'criteoId': 1,
16
+ 'id5id': 1,
17
+ 'idl_env': 1,
18
+ 'lipb': 1,
19
+ 'netId': 1,
20
+ 'parrableId': 1,
21
+ 'pubcid': 1,
22
+ 'tdid': 1,
23
+ 'pubProvidedId': 1
24
+ };
25
+ const storage = getStorageManager({ gvlid: GVLID, bidderCode: BIDDER_CODE });
26
+
27
+ function getTopWindowQueryParams() {
28
+ try {
29
+ const parsedUrl = parseUrl(window.top.document.URL, { decodeSearchAsString: true });
30
+ return parsedUrl.search;
31
+ } catch (e) {
32
+ return '';
33
+ }
34
+ }
35
+
36
+ export function createDomain(subDomain = DEFAULT_SUB_DOMAIN) {
37
+ return `https://${subDomain}.minutemedia-prebid.com`;
38
+ }
39
+
40
+ export function extractCID(params) {
41
+ return params.cId || params.CID || params.cID || params.CId || params.cid || params.ciD || params.Cid || params.CiD;
42
+ }
43
+
44
+ export function extractPID(params) {
45
+ return params.pId || params.PID || params.pID || params.PId || params.pid || params.piD || params.Pid || params.PiD;
46
+ }
47
+
48
+ export function extractSubDomain(params) {
49
+ return params.subDomain || params.SubDomain || params.Subdomain || params.subdomain || params.SUBDOMAIN || params.subDOMAIN;
50
+ }
51
+
52
+ function isBidRequestValid(bid) {
53
+ const params = bid.params || {};
54
+ return !!(extractCID(params) && extractPID(params));
55
+ }
56
+
57
+ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
58
+ const { params, bidId, userId, adUnitCode, schain, mediaTypes } = bid;
59
+ let { bidFloor, ext } = params;
60
+ const hashUrl = hashCode(topWindowUrl);
61
+ const uniqueDealId = getUniqueDealId(hashUrl);
62
+ const cId = extractCID(params);
63
+ const pId = extractPID(params);
64
+ const subDomain = extractSubDomain(params);
65
+
66
+ if (isFn(bid.getFloor)) {
67
+ const floorInfo = bid.getFloor({
68
+ currency: 'USD',
69
+ mediaType: '*',
70
+ size: '*'
71
+ });
72
+
73
+ if (floorInfo.currency === 'USD') {
74
+ bidFloor = floorInfo.floor;
75
+ }
76
+ }
77
+
78
+ let data = {
79
+ url: encodeURIComponent(topWindowUrl),
80
+ uqs: getTopWindowQueryParams(),
81
+ cb: Date.now(),
82
+ bidFloor: bidFloor,
83
+ bidId: bidId,
84
+ referrer: bidderRequest.refererInfo.ref,
85
+ adUnitCode: adUnitCode,
86
+ publisherId: pId,
87
+ sizes: sizes,
88
+ uniqueDealId: uniqueDealId,
89
+ bidderVersion: BIDDER_VERSION,
90
+ prebidVersion: '$prebid.version$',
91
+ res: `${screen.width}x${screen.height}`,
92
+ schain: schain,
93
+ mediaTypes: mediaTypes
94
+ };
95
+
96
+ appendUserIdsToRequestPayload(data, userId);
97
+
98
+ if (bidderRequest.gdprConsent) {
99
+ if (bidderRequest.gdprConsent.consentString) {
100
+ data.gdprConsent = bidderRequest.gdprConsent.consentString;
101
+ }
102
+ if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
103
+ data.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
104
+ }
105
+ }
106
+ if (bidderRequest.uspConsent) {
107
+ data.usPrivacy = bidderRequest.uspConsent;
108
+ }
109
+
110
+ const dto = {
111
+ method: 'POST',
112
+ url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
113
+ data: data
114
+ };
115
+
116
+ _each(ext, (value, key) => {
117
+ dto.data['ext.' + key] = value;
118
+ });
119
+
120
+ return dto;
121
+ }
122
+
123
+ function appendUserIdsToRequestPayload(payloadRef, userIds) {
124
+ let key;
125
+ _each(userIds, (userId, idSystemProviderName) => {
126
+ if (SUPPORTED_ID_SYSTEMS[idSystemProviderName]) {
127
+ key = `uid.${idSystemProviderName}`;
128
+
129
+ switch (idSystemProviderName) {
130
+ case 'digitrustid':
131
+ payloadRef[key] = deepAccess(userId, 'data.id');
132
+ break;
133
+ case 'lipb':
134
+ payloadRef[key] = userId.lipbid;
135
+ break;
136
+ case 'parrableId':
137
+ payloadRef[key] = userId.eid;
138
+ break;
139
+ case 'id5id':
140
+ payloadRef[key] = userId.uid;
141
+ break;
142
+ default:
143
+ payloadRef[key] = userId;
144
+ }
145
+ }
146
+ });
147
+ }
148
+
149
+ function buildRequests(validBidRequests, bidderRequest) {
150
+ const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
151
+ const requests = [];
152
+ validBidRequests.forEach(validBidRequest => {
153
+ const sizes = parseSizesInput(validBidRequest.sizes);
154
+ const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest);
155
+ requests.push(request);
156
+ });
157
+ return requests;
158
+ }
159
+
160
+ function interpretResponse(serverResponse, request) {
161
+ if (!serverResponse || !serverResponse.body) {
162
+ return [];
163
+ }
164
+ const { bidId } = request.data;
165
+ const { results } = serverResponse.body;
166
+
167
+ let output = [];
168
+
169
+ try {
170
+ results.forEach(result => {
171
+ const { creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER } = result;
172
+ if (!ad || !price) {
173
+ return;
174
+ }
175
+
176
+ const response = {
177
+ requestId: bidId,
178
+ cpm: price,
179
+ width: width,
180
+ height: height,
181
+ creativeId: creativeId,
182
+ currency: currency || CURRENCY,
183
+ netRevenue: true,
184
+ ttl: exp || TTL_SECONDS,
185
+ meta: {
186
+ advertiserDomains: advertiserDomains || []
187
+ }
188
+ };
189
+
190
+ if (mediaType === BANNER) {
191
+ Object.assign(response, {
192
+ ad: ad,
193
+ });
194
+ } else {
195
+ Object.assign(response, {
196
+ vastXml: ad,
197
+ mediaType: VIDEO
198
+ });
199
+ }
200
+ output.push(response);
201
+ });
202
+ return output;
203
+ } catch (e) {
204
+ return [];
205
+ }
206
+ }
207
+
208
+ function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '') {
209
+ let syncs = [];
210
+ const { iframeEnabled, pixelEnabled } = syncOptions;
211
+ const { gdprApplies, consentString = '' } = gdprConsent;
212
+
213
+ const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
214
+ const params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`
215
+ if (iframeEnabled) {
216
+ syncs.push({
217
+ type: 'iframe',
218
+ url: `https://sync.minutemedia-prebid.com/api/sync/iframe/${params}`
219
+ });
220
+ }
221
+ if (pixelEnabled) {
222
+ syncs.push({
223
+ type: 'image',
224
+ url: `https://sync.minutemedia-prebid.com/api/sync/image/${params}`
225
+ });
226
+ }
227
+ return syncs;
228
+ }
229
+
230
+ export function hashCode(s, prefix = '_') {
231
+ const l = s.length;
232
+ let h = 0
233
+ let i = 0;
234
+ if (l > 0) {
235
+ while (i < l) { h = (h << 5) - h + s.charCodeAt(i++) | 0; }
236
+ }
237
+ return prefix + h;
238
+ }
239
+
240
+ export function getUniqueDealId(key, expiry = UNIQUE_DEAL_ID_EXPIRY) {
241
+ const storageKey = `u_${key}`;
242
+ const now = Date.now();
243
+ const data = getStorageItem(storageKey);
244
+ let uniqueId;
245
+
246
+ if (!data || !data.value || now - data.created > expiry) {
247
+ uniqueId = `${key}_${now.toString()}`;
248
+ setStorageItem(storageKey, uniqueId);
249
+ } else {
250
+ uniqueId = data.value;
251
+ }
252
+
253
+ return uniqueId;
254
+ }
255
+
256
+ export function getStorageItem(key) {
257
+ try {
258
+ return tryParseJSON(storage.getDataFromLocalStorage(key));
259
+ } catch (e) { }
260
+
261
+ return null;
262
+ }
263
+
264
+ export function setStorageItem(key, value, timestamp) {
265
+ try {
266
+ const created = timestamp || Date.now();
267
+ const data = JSON.stringify({ value, created });
268
+ storage.setDataInLocalStorage(key, data);
269
+ } catch (e) { }
270
+ }
271
+
272
+ export function tryParseJSON(value) {
273
+ try {
274
+ return JSON.parse(value);
275
+ } catch (e) {
276
+ return value;
277
+ }
278
+ }
279
+
280
+ export const spec = {
281
+ code: BIDDER_CODE,
282
+ version: BIDDER_VERSION,
283
+ gvlid: GVLID,
284
+ supportedMediaTypes: [BANNER, VIDEO],
285
+ isBidRequestValid,
286
+ buildRequests,
287
+ interpretResponse,
288
+ getUserSyncs
289
+ };
290
+
291
+ registerBidder(spec);
@@ -0,0 +1,35 @@
1
+ # Overview
2
+
3
+ **Module Name:** MinuteMediaPlus Bidder Adapter
4
+
5
+ **Module Type:** Bidder Adapter
6
+
7
+ **Maintainer:** hb@minutemedia.com
8
+
9
+ # Description
10
+
11
+ Module that connects to MinuteMediaPlus's demand sources.
12
+
13
+ # Test Parameters
14
+ ```js
15
+ var adUnits = [
16
+ {
17
+ code: 'test-ad',
18
+ sizes: [[300, 250]],
19
+ bids: [
20
+ {
21
+ bidder: 'mmplus',
22
+ params: {
23
+ cId: '562524b21b1c1f08117fc7f9',
24
+ pId: '59ac17c192832d0011283fe3',
25
+ bidFloor: 0.0001,
26
+ ext: {
27
+ param1: 'loremipsum',
28
+ param2: 'dolorsitamet'
29
+ }
30
+ }
31
+ }
32
+ ]
33
+ }
34
+ ];
35
+ ```
@@ -24,6 +24,7 @@ import { getRefererInfo } from '../src/refererDetection.js';
24
24
  const BIDDER_CODE = 'nextMillennium';
25
25
  const ENDPOINT = 'https://pbs.nextmillmedia.com/openrtb2/auction';
26
26
  const TEST_ENDPOINT = 'https://test.pbs.nextmillmedia.com/openrtb2/auction';
27
+ const SYNC_ENDPOINT = 'https://cookies.nextmillmedia.com/sync?';
27
28
  const REPORT_ENDPOINT = 'https://report2.hb.brainlyads.com/statistics/metric';
28
29
  const TIME_TO_LIVE = 360;
29
30
  const VIDEO_PARAMS = [
@@ -182,7 +183,7 @@ export const spec = {
182
183
  height: bid.h,
183
184
  creativeId: bid.adid,
184
185
  currency: response.cur,
185
- netRevenue: false,
186
+ netRevenue: true,
186
187
  ttl: TIME_TO_LIVE,
187
188
  meta: {
188
189
  advertiserDomains: bid.adomain || []
@@ -231,6 +232,13 @@ export const spec = {
231
232
  })
232
233
  }
233
234
 
235
+ if (!pixels.length) {
236
+ let syncUrl = SYNC_ENDPOINT;
237
+ if (gdprConsent && gdprConsent.gdprApplies) syncUrl += 'gdpr=1&gdpr_consent=' + gdprConsent.consentString + '&';
238
+ if (uspConsent) syncUrl += 'us_privacy=' + uspConsent + '&';
239
+ if (syncOptions.iframeEnabled) pixels.push({type: 'iframe', url: syncUrl + 'type=iframe'});
240
+ if (syncOptions.pixelEnabled) pixels.push({type: 'image', url: syncUrl + 'type=image'});
241
+ }
234
242
  return pixels;
235
243
  },
236
244
 
@@ -32,6 +32,12 @@ const PBS_CONVERTER = ortbConverter({
32
32
  imp(buildImp, proxyBidRequest, context) {
33
33
  Object.assign(context, proxyBidRequest.pbsData);
34
34
  const imp = buildImp(proxyBidRequest, context);
35
+ (proxyBidRequest.bids || []).forEach(bid => {
36
+ if (bid.ortb2Imp && Object.keys(bid.ortb2Imp).length > 0) {
37
+ // set bidder-level imp attributes; see https://github.com/prebid/prebid-server/issues/2335
38
+ deepSetValue(imp, `ext.prebid.imp.${bid.bidder}`, bid.ortb2Imp);
39
+ }
40
+ });
35
41
  if (Object.values(SUPPORTED_MEDIA_TYPES).some(mtype => imp[mtype])) {
36
42
  imp.secure = context.s2sBidRequest.s2sConfig.secure;
37
43
  return imp;
@@ -3,9 +3,9 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
 
4
4
  const BIDDER_CODE = 'proxistore';
5
5
  const PROXISTORE_VENDOR_ID = 418;
6
- const COOKIE_BASE_URL = 'https://abs.proxistore.com/v3/rtb/prebid/multi';
6
+ const COOKIE_BASE_URL = 'https://api.proxistore.com/v3/rtb/prebid/multi';
7
7
  const COOKIE_LESS_URL =
8
- 'https://abs.cookieless-proxistore.com/v3/rtb/prebid/multi';
8
+ 'https://api.cookieless-proxistore.com/v3/rtb/prebid/multi';
9
9
 
10
10
  function _createServerRequest(bidRequests, bidderRequest) {
11
11
  var sizeIds = [];
@@ -6,7 +6,7 @@ import CONSTANTS from '../src/constants.json';
6
6
 
7
7
  const emptyUrl = '';
8
8
  const analyticsType = 'endpoint';
9
- const pubxaiAnalyticsVersion = 'v1.1.0';
9
+ const pubxaiAnalyticsVersion = 'v1.2.0';
10
10
  const defaultHost = 'api.pbxai.com';
11
11
  const auctionPath = '/analytics/auction';
12
12
  const winningBidPath = '/analytics/bidwon';
@@ -154,7 +154,7 @@ function send(data, status) {
154
154
  search: location.search
155
155
  });
156
156
  if (typeof data !== 'undefined' && typeof data.auctionInit !== 'undefined') {
157
- data.pageDetail.adUnitCount = data.auctionInit.adUnitCodes ? data.auctionInit.adUnitCodes.length : null;
157
+ data.pageDetail.adUnits = data.auctionInit.adUnitCodes;
158
158
  data.initOptions.auctionId = data.auctionInit.auctionId;
159
159
  delete data.auctionInit;
160
160
 
@@ -1,5 +1,5 @@
1
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
2
- import { parseSizesInput, logError, generateUUID, isEmpty, deepAccess, logWarn, logMessage, deepClone, getGptSlotInfoForAdUnitCode, isFn, isPlainObject } from '../src/utils.js';
2
+ import { parseSizesInput, logError, generateUUID, isEmpty, deepAccess, logWarn, logMessage, getGptSlotInfoForAdUnitCode, isFn, isPlainObject } from '../src/utils.js';
3
3
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
4
4
  import { config } from '../src/config.js';
5
5
  import { Renderer } from '../src/Renderer.js';
@@ -132,15 +132,6 @@ export const spec = {
132
132
  if (validBidRequests[0].schain) {
133
133
  payload.schain = JSON.stringify(validBidRequests[0].schain);
134
134
  }
135
- if (deepAccess(validBidRequests[0], 'userId') && Object.keys(validBidRequests[0].userId).length > 0) {
136
- const userIds = deepClone(validBidRequests[0].userId);
137
-
138
- if (userIds.id5id) {
139
- userIds.id5id = deepAccess(userIds, 'id5id.uid');
140
- }
141
-
142
- payload.userid = JSON.stringify(userIds);
143
- }
144
135
 
145
136
  const eids = deepAccess(validBidRequests[0], 'userIdAsEids');
146
137
  if (Array.isArray(eids) && eids.length > 0) {
@@ -436,6 +436,10 @@ function _buildResponseObject(bidderRequest, bid) {
436
436
  if (bid.tl_source && bid.tl_source == 'tlx') {
437
437
  bidResponse.meta.mediaType = 'native';
438
438
  }
439
+
440
+ if (creativeId) {
441
+ bidResponse.meta.networkId = creativeId.slice(0, creativeId.indexOf('_'));
442
+ }
439
443
  };
440
444
  return bidResponse;
441
445
  }
@@ -382,6 +382,7 @@ function openRtbRequest(bidRequests, bidderRequest) {
382
382
  const schain = bidRequests[0].schain;
383
383
  let openRtbRequest = {
384
384
  id: bidRequests[0].bidderRequestId,
385
+ tmax: bidderRequest.timeout || 400,
385
386
  at: 1,
386
387
  imp: bidRequests.map(bidRequest => openRtbImpression(bidRequest)),
387
388
  site: openRtbSite(bidRequests[0], bidderRequest),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.36.0",
3
+ "version": "7.37.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {