prebid.js 7.20.0 → 7.22.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 (189) hide show
  1. package/dist/1plusXRtdProvider.js +1 -1
  2. package/dist/33acrossBidAdapter.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/audiencerunBidAdapter.js +1 -1
  17. package/dist/axonixBidAdapter.js +1 -1
  18. package/dist/bidglassBidAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bluebillywigBidAdapter.js +1 -1
  21. package/dist/bridgewellBidAdapter.js +1 -1
  22. package/dist/brightMountainMediaBidAdapter.js +1 -1
  23. package/dist/brightcomBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/concertBidAdapter.js +1 -1
  26. package/dist/connectadBidAdapter.js +1 -1
  27. package/dist/consumableBidAdapter.js +1 -1
  28. package/dist/conversantBidAdapter.js +1 -1
  29. package/dist/craftBidAdapter.js +1 -1
  30. package/dist/criteoBidAdapter.js +1 -1
  31. package/dist/dacIdSystem.js +1 -1
  32. package/dist/dspxBidAdapter.js +1 -1
  33. package/dist/eplanningBidAdapter.js +1 -1
  34. package/dist/finativeBidAdapter.js +1 -1
  35. package/dist/freewheel-sspBidAdapter.js +1 -1
  36. package/dist/ftrackIdSystem.js +1 -1
  37. package/dist/glimpseBidAdapter.js +1 -1
  38. package/dist/gmosspBidAdapter.js +1 -1
  39. package/dist/goldbachBidAdapter.js +1 -1
  40. package/dist/gridBidAdapter.js +1 -1
  41. package/dist/gridNMBidAdapter.js +1 -1
  42. package/dist/gumgumBidAdapter.js +1 -1
  43. package/dist/h12mediaBidAdapter.js +1 -1
  44. package/dist/iasRtdProvider.js +1 -1
  45. package/dist/id5IdSystem.js +1 -1
  46. package/dist/impactifyBidAdapter.js +1 -1
  47. package/dist/improvedigitalBidAdapter.js +1 -1
  48. package/dist/inmarBidAdapter.js +1 -1
  49. package/dist/insticatorBidAdapter.js +1 -1
  50. package/dist/ixBidAdapter.js +1 -1
  51. package/dist/jixieBidAdapter.js +1 -1
  52. package/dist/justpremiumBidAdapter.js +1 -1
  53. package/dist/konduitAnalyticsAdapter.js +1 -1
  54. package/dist/kueezBidAdapter.js +1 -1
  55. package/dist/lassoBidAdapter.js +1 -1
  56. package/dist/lifestreetBidAdapter.js +1 -1
  57. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  58. package/dist/logicadBidAdapter.js +1 -1
  59. package/dist/loglyliftBidAdapter.js +1 -1
  60. package/dist/magniteAnalyticsAdapter.js +1 -1
  61. package/dist/malltvAnalyticsAdapter.js +1 -1
  62. package/dist/marsmediaBidAdapter.js +1 -1
  63. package/dist/mediafuseBidAdapter.js +1 -1
  64. package/dist/mediakeysBidAdapter.js +1 -1
  65. package/dist/medianetAnalyticsAdapter.js +1 -1
  66. package/dist/medianetBidAdapter.js +1 -1
  67. package/dist/mediasquareBidAdapter.js +1 -1
  68. package/dist/mgidBidAdapter.js +1 -1
  69. package/dist/minutemediaBidAdapter.js +1 -1
  70. package/dist/not-for-prod/prebid.js +127 -127
  71. package/dist/oguryBidAdapter.js +1 -1
  72. package/dist/onetagBidAdapter.js +1 -1
  73. package/dist/ooloAnalyticsAdapter.js +1 -1
  74. package/dist/outbrainBidAdapter.js +1 -1
  75. package/dist/parrableIdSystem.js +1 -1
  76. package/dist/pixfutureBidAdapter.js +1 -1
  77. package/dist/prebid-core.js +1 -1
  78. package/dist/prebidServerBidAdapter.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/pubwiseBidAdapter.js +1 -1
  83. package/dist/pulsepointBidAdapter.js +1 -1
  84. package/dist/pxyzBidAdapter.js +1 -1
  85. package/dist/quantcastBidAdapter.js +1 -1
  86. package/dist/readpeakBidAdapter.js +1 -1
  87. package/dist/relaidoBidAdapter.js +1 -1
  88. package/dist/rhythmoneBidAdapter.js +1 -1
  89. package/dist/riseBidAdapter.js +1 -1
  90. package/dist/rubiconAnalyticsAdapter.js +1 -1
  91. package/dist/rubiconBidAdapter.js +1 -1
  92. package/dist/seedingAllianceBidAdapter.js +1 -1
  93. package/dist/seedtagBidAdapter.js +1 -1
  94. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  95. package/dist/sharethroughBidAdapter.js +1 -1
  96. package/dist/shinezBidAdapter.js +1 -1
  97. package/dist/smaatoBidAdapter.js +1 -1
  98. package/dist/smartadserverBidAdapter.js +1 -1
  99. package/dist/smartxBidAdapter.js +1 -1
  100. package/dist/smilewantedBidAdapter.js +1 -1
  101. package/dist/sonobiBidAdapter.js +1 -1
  102. package/dist/sovrnAnalyticsAdapter.js +1 -1
  103. package/dist/sovrnBidAdapter.js +1 -1
  104. package/dist/sspBCBidAdapter.js +1 -1
  105. package/dist/sublimeBidAdapter.js +1 -1
  106. package/dist/synacormediaBidAdapter.js +1 -1
  107. package/dist/targetVideoBidAdapter.js +1 -1
  108. package/dist/teadsBidAdapter.js +1 -1
  109. package/dist/trionBidAdapter.js +1 -1
  110. package/dist/tripleliftBidAdapter.js +1 -1
  111. package/dist/ttdBidAdapter.js +1 -1
  112. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  113. package/dist/underdogmediaBidAdapter.js +1 -1
  114. package/dist/undertoneBidAdapter.js +1 -1
  115. package/dist/userId.js +1 -1
  116. package/dist/vidazooBidAdapter.js +1 -1
  117. package/dist/videobyteBidAdapter.js +1 -1
  118. package/dist/visxBidAdapter.js +1 -1
  119. package/dist/vuukleBidAdapter.js +1 -1
  120. package/dist/weboramaRtdProvider.js +1 -1
  121. package/dist/widespaceBidAdapter.js +1 -1
  122. package/dist/winrBidAdapter.js +1 -1
  123. package/dist/yahoosspBidAdapter.js +1 -1
  124. package/dist/yieldmoBidAdapter.js +1 -1
  125. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  126. package/dist/yieldoneBidAdapter.js +1 -1
  127. package/integrationExamples/gpt/weboramaRtdProvider_example.html +10 -51
  128. package/modules/1plusXRtdProvider.js +32 -5
  129. package/modules/33acrossBidAdapter.js +18 -11
  130. package/modules/adyoulikeBidAdapter.js +12 -6
  131. package/modules/asoBidAdapter.js +11 -6
  132. package/modules/asoBidAdapter.md +5 -6
  133. package/modules/brightcomBidAdapter.js +30 -10
  134. package/modules/dacIdSystem.js +145 -27
  135. package/modules/dacIdSystem.md +7 -2
  136. package/modules/fledgeForGpt.md +101 -23
  137. package/modules/freewheel-sspBidAdapter.js +48 -7
  138. package/modules/freewheel-sspBidAdapter.md +1 -1
  139. package/modules/ftrackIdSystem.js +28 -9
  140. package/modules/gridBidAdapter.js +1 -0
  141. package/modules/iasRtdProvider.js +21 -6
  142. package/modules/iasRtdProvider.md +1 -1
  143. package/modules/ixBidAdapter.js +9 -4
  144. package/modules/medianetAnalyticsAdapter.js +26 -22
  145. package/modules/medianetBidAdapter.js +5 -1
  146. package/modules/mediasquareBidAdapter.js +42 -3
  147. package/modules/mgidBidAdapter.js +8 -1
  148. package/modules/oguryBidAdapter.js +6 -2
  149. package/modules/prebidServerBidAdapter/index.js +1 -1
  150. package/modules/pubmaticBidAdapter.js +27 -3
  151. package/modules/pubwiseBidAdapter.js +14 -12
  152. package/modules/pulsepointBidAdapter.js +11 -6
  153. package/modules/smaatoBidAdapter.js +54 -5
  154. package/modules/smaatoBidAdapter.md +78 -0
  155. package/modules/teadsBidAdapter.js +26 -8
  156. package/modules/ttdBidAdapter.js +8 -0
  157. package/modules/userId/eids.js +7 -11
  158. package/modules/weboramaRtdProvider.js +800 -643
  159. package/modules/weboramaRtdProvider.md +32 -0
  160. package/modules/yieldoneBidAdapter.js +7 -4
  161. package/package.json +3 -3
  162. package/src/adapters/bidderFactory.js +11 -9
  163. package/src/auction.js +3 -3
  164. package/test/spec/auctionmanager_spec.js +29 -20
  165. package/test/spec/modules/1plusXRtdProvider_spec.js +30 -14
  166. package/test/spec/modules/33acrossBidAdapter_spec.js +44 -1
  167. package/test/spec/modules/adyoulikeBidAdapter_spec.js +1 -1
  168. package/test/spec/modules/asoBidAdapter_spec.js +2 -2
  169. package/test/spec/modules/brightcomBidAdapter_spec.js +94 -1
  170. package/test/spec/modules/dacIdSystem_spec.js +93 -11
  171. package/test/spec/modules/eids_spec.js +11 -7
  172. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +25 -4
  173. package/test/spec/modules/ftrackIdSystem_spec.js +200 -90
  174. package/test/spec/modules/iasRtdProvider_spec.js +57 -1
  175. package/test/spec/modules/ixBidAdapter_spec.js +12 -0
  176. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +50 -8
  177. package/test/spec/modules/medianetBidAdapter_spec.js +76 -0
  178. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -2
  179. package/test/spec/modules/mgidBidAdapter_spec.js +50 -0
  180. package/test/spec/modules/oguryBidAdapter_spec.js +33 -17
  181. package/test/spec/modules/prebidServerBidAdapter_spec.js +24 -0
  182. package/test/spec/modules/pubmaticBidAdapter_spec.js +60 -5
  183. package/test/spec/modules/pubwiseBidAdapter_spec.js +6 -4
  184. package/test/spec/modules/pulsepointBidAdapter_spec.js +123 -0
  185. package/test/spec/modules/smaatoBidAdapter_spec.js +307 -36
  186. package/test/spec/modules/teadsBidAdapter_spec.js +119 -6
  187. package/test/spec/modules/weboramaRtdProvider_spec.js +382 -0
  188. package/test/spec/modules/yieldoneBidAdapter_spec.js +2 -3
  189. package/test/spec/unit/core/bidderFactory_spec.js +0 -4
@@ -2,8 +2,7 @@ import { _each, isStr, deepClone, isArray, deepSetValue, inIframe, logMessage, l
2
2
  import { config } from '../src/config.js';
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { BANNER, NATIVE } from '../src/mediaTypes.js';
5
- import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
6
- const VERSION = '0.1.0';
5
+ const VERSION = '0.2.0';
7
6
  const GVLID = 842;
8
7
  const NET_REVENUE = true;
9
8
  const UNDEFINED = undefined;
@@ -117,9 +116,6 @@ export const spec = {
117
116
  * @return ServerRequest Info describing the request to the server.
118
117
  */
119
118
  buildRequests: function (validBidRequests, bidderRequest) {
120
- // convert Native ORTB definition to old-style prebid native definition
121
- validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
122
-
123
119
  var refererInfo;
124
120
  if (bidderRequest && bidderRequest.refererInfo) {
125
121
  refererInfo = bidderRequest.refererInfo;
@@ -170,7 +166,7 @@ export const spec = {
170
166
  payload.user.geo.lon = _parseSlotParam('lon', conf.lon);
171
167
  payload.user.yob = _parseSlotParam('yob', conf.yob);
172
168
  payload.device.geo = payload.user.geo;
173
- payload.site.page = payload.site.page.trim();
169
+ payload.site.page = payload.site?.page?.trim();
174
170
  payload.site.domain = _getDomainFromURL(payload.site.page);
175
171
 
176
172
  // add the content object from config in request
@@ -184,7 +180,7 @@ export const spec = {
184
180
  }
185
181
 
186
182
  // passing transactionId in source.tid
187
- deepSetValue(payload, 'source.tid', conf.transactionId);
183
+ deepSetValue(payload, 'source.tid', bidderRequest?.auctionId);
188
184
 
189
185
  // schain
190
186
  if (validBidRequests[0].schain) {
@@ -440,7 +436,10 @@ function _createImpressionObject(bid, conf) {
440
436
  tagid: bid.params.adUnit || undefined,
441
437
  bidfloor: _parseSlotParam('bidFloor', bid.params.bidFloor), // capitalization dicated by 3.2.4 spec
442
438
  secure: 1,
443
- bidfloorcur: bid.params.currency ? _parseSlotParam('currency', bid.params.currency) : DEFAULT_CURRENCY // capitalization dicated by 3.2.4 spec
439
+ bidfloorcur: bid.params.currency ? _parseSlotParam('currency', bid.params.currency) : DEFAULT_CURRENCY, // capitalization dicated by 3.2.4 spec
440
+ ext: {
441
+ tid: (bid.transactionId ? bid.transactionId : '')
442
+ }
444
443
  };
445
444
 
446
445
  if (bid.hasOwnProperty('mediaTypes')) {
@@ -494,7 +493,11 @@ function _parseSlotParam(paramName, paramValue) {
494
493
 
495
494
  function _parseAdSlot(bid) {
496
495
  _logInfo('parseAdSlot bid', bid)
497
- bid.params.adUnit = '';
496
+ if (bid.adUnitCode) {
497
+ bid.params.adUnit = bid.adUnitCode;
498
+ } else {
499
+ bid.params.adUnit = '';
500
+ }
498
501
  bid.params.width = 0;
499
502
  bid.params.height = 0;
500
503
  bid.params.adSlot = _cleanSlotName(bid.params.adSlot);
@@ -532,9 +535,8 @@ function _cleanSlotName(slotName) {
532
535
 
533
536
  function _initConf(refererInfo) {
534
537
  return {
535
- // TODO: do the fallbacks make sense here?
536
- pageURL: refererInfo?.page || window.location.href,
537
- refURL: refererInfo?.ref || window.document.referrer
538
+ pageURL: refererInfo?.page,
539
+ refURL: refererInfo?.ref
538
540
  };
539
541
  }
540
542
 
@@ -153,6 +153,8 @@ function bidResponseAvailable(request, response) {
153
153
  * Produces an OpenRTBImpression from a slot config.
154
154
  */
155
155
  function impression(slot) {
156
+ var firstPartyData = slot.ortb2Imp?.ext || {};
157
+ var ext = Object.assign({}, firstPartyData, slotUnknownParams(slot));
156
158
  return {
157
159
  id: slot.bidId,
158
160
  banner: banner(slot),
@@ -160,7 +162,7 @@ function impression(slot) {
160
162
  tagid: slot.params.ct.toString(),
161
163
  video: video(slot),
162
164
  bidfloor: bidFloor(slot),
163
- ext: ext(slot),
165
+ ext: Object.keys(ext).length > 0 ? ext : null,
164
166
  };
165
167
  }
166
168
 
@@ -209,7 +211,7 @@ function video(slot) {
209
211
  /**
210
212
  * Unknown params are captured and sent on ext
211
213
  */
212
- function ext(slot) {
214
+ function slotUnknownParams(slot) {
213
215
  const ext = {};
214
216
  const knownParamsMap = {};
215
217
  KNOWN_PARAMS.forEach(value => knownParamsMap[value] = 1);
@@ -330,14 +332,16 @@ function site(bidRequests, bidderRequest) {
330
332
  const pubId = bidRequests && bidRequests.length > 0 ? bidRequests[0].params.cp : '0';
331
333
  const appParams = bidRequests[0].params.app;
332
334
  if (!appParams) {
333
- return {
335
+ // use the first party data if available, and override only publisher/ref/page properties
336
+ var firstPartyData = bidderRequest?.ortb2?.site || {};
337
+ return Object.assign({}, firstPartyData, {
334
338
  publisher: {
335
339
  id: pubId.toString(),
336
340
  },
337
341
  // TODO: does the fallback make sense here?
338
342
  ref: bidderRequest?.refererInfo?.ref || window.document.referrer,
339
343
  page: bidderRequest?.refererInfo?.page || ''
340
- }
344
+ });
341
345
  }
342
346
  return null;
343
347
  }
@@ -406,7 +410,8 @@ function adSize(slot, sizes) {
406
410
  * an openrtb User object.
407
411
  */
408
412
  function user(bidRequest, bidderRequest) {
409
- var ext = {};
413
+ var user = bidderRequest?.ortb2?.user || { ext: {} };
414
+ var ext = user.ext;
410
415
  if (bidderRequest) {
411
416
  if (bidderRequest.gdprConsent) {
412
417
  ext.consent = bidderRequest.gdprConsent.consentString;
@@ -418,7 +423,7 @@ function user(bidRequest, bidderRequest) {
418
423
  ext.eids = eids;
419
424
  }
420
425
  }
421
- return { ext };
426
+ return user;
422
427
  }
423
428
 
424
429
  /**
@@ -1,11 +1,14 @@
1
- import { deepAccess, getDNT, deepSetValue, logInfo, logError, isEmpty, getAdUnitSizes, fill, chunk, getMaxValueFromArray, getMinValueFromArray } from '../src/utils.js';
1
+ import { deepAccess, isNumber, getDNT, deepSetValue, logInfo, logError, isEmpty, getAdUnitSizes, fill, chunk, getMaxValueFromArray, getMinValueFromArray } from '../src/utils.js';
2
+ import {find} from '../src/polyfill.js';
2
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
4
  import {config} from '../src/config.js';
4
- import {ADPOD, BANNER, VIDEO} from '../src/mediaTypes.js';
5
+ import {ADPOD, BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
6
+ import CONSTANTS from '../src/constants.json';
5
7
 
8
+ const { NATIVE_IMAGE_TYPES } = CONSTANTS;
6
9
  const BIDDER_CODE = 'smaato';
7
10
  const SMAATO_ENDPOINT = 'https://prebid.ad.smaato.net/oapi/prebid';
8
- const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.6'
11
+ const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.7'
9
12
  const CURRENCY = 'USD';
10
13
 
11
14
  const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => {
@@ -91,6 +94,12 @@ const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => {
91
94
  }
92
95
  }
93
96
 
97
+ const nativeOrtbRequest = bidRequest.nativeOrtbRequest;
98
+ if (nativeOrtbRequest) {
99
+ const nativeRequest = Object.assign({}, requestTemplate, createNativeImp(bidRequest, nativeOrtbRequest));
100
+ requests.push(nativeRequest);
101
+ }
102
+
94
103
  return requests;
95
104
  }
96
105
 
@@ -109,11 +118,11 @@ const buildServerRequest = (validBidRequest, data) => {
109
118
 
110
119
  export const spec = {
111
120
  code: BIDDER_CODE,
112
- supportedMediaTypes: [BANNER, VIDEO],
121
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
113
122
  gvlid: 82,
114
123
 
115
124
  /**
116
- * Determines whether or not the given bid request is valid.
125
+ * Determines whether the given bid request is valid.
117
126
  *
118
127
  * @param {BidRequest} bid The bid params to validate.
119
128
  * @return boolean True if this is a valid bid, and false otherwise.
@@ -171,6 +180,7 @@ export const spec = {
171
180
  * Unpack the response from the server into a list of bids.
172
181
  *
173
182
  * @param {ServerResponse} serverResponse A successful response from the server.
183
+ * @param {BidRequest} bidRequest
174
184
  * @return {Bid[]} An array of bids which were nested inside the server.
175
185
  */
176
186
  interpretResponse: (serverResponse, bidRequest) => {
@@ -239,6 +249,11 @@ export const spec = {
239
249
  resultingBid.mediaType = VIDEO;
240
250
  bids.push(resultingBid);
241
251
  break;
252
+ case 'Native':
253
+ resultingBid.native = createNativeAd(bid.adm);
254
+ resultingBid.mediaType = NATIVE;
255
+ bids.push(resultingBid);
256
+ break;
242
257
  default:
243
258
  logInfo('[SMAATO] Invalid ad type:', smtAdType);
244
259
  }
@@ -297,6 +312,13 @@ const createRichmediaAd = (adm) => {
297
312
  return markup + '</div>';
298
313
  };
299
314
 
315
+ const createNativeAd = (adm) => {
316
+ const nativeResponse = JSON.parse(adm).native;
317
+ return {
318
+ ortb: nativeResponse
319
+ }
320
+ };
321
+
300
322
  function createBannerImp(bidRequest) {
301
323
  const adUnitSizes = getAdUnitSizes(bidRequest);
302
324
  const sizes = adUnitSizes.map((size) => ({w: size[0], h: size[1]}));
@@ -342,6 +364,33 @@ function createVideoImp(bidRequest, videoMediaType) {
342
364
  };
343
365
  }
344
366
 
367
+ function createNativeImp(bidRequest, nativeRequest) {
368
+ return {
369
+ imp: [{
370
+ id: bidRequest.bidId,
371
+ tagid: deepAccess(bidRequest, 'params.adspaceId'),
372
+ bidfloor: getBidFloor(bidRequest, NATIVE, getNativeMainImageSize(nativeRequest)),
373
+ native: {
374
+ request: JSON.stringify(nativeRequest),
375
+ ver: '1.2'
376
+ }
377
+ }]
378
+ };
379
+ }
380
+
381
+ function getNativeMainImageSize(nativeRequest) {
382
+ const mainImage = find(nativeRequest.assets, asset => asset.hasOwnProperty('img') && asset.img.type === NATIVE_IMAGE_TYPES.MAIN)
383
+ if (mainImage) {
384
+ if (isNumber(mainImage.img.w) && isNumber(mainImage.img.h)) {
385
+ return [[mainImage.img.w, mainImage.img.h]]
386
+ }
387
+ if (isNumber(mainImage.img.wmin) && isNumber(mainImage.img.hmin)) {
388
+ return [[mainImage.img.wmin, mainImage.img.hmin]]
389
+ }
390
+ }
391
+ return []
392
+ }
393
+
345
394
  function createAdPodImp(bidRequest, videoMediaType) {
346
395
  const tagid = deepAccess(bidRequest, 'params.adbreakId')
347
396
  const bce = config.getConfig('adpod.brandCategoryExclusion')
@@ -63,6 +63,84 @@ var adUnits = [{
63
63
  }];
64
64
  ```
65
65
 
66
+ For native adunits:
67
+
68
+ ```
69
+ var adUnits = [{
70
+ "code": "native unit",
71
+ "mediaTypes": {
72
+ native: {
73
+ ortb: {
74
+ ver: "1.2",
75
+ assets: [
76
+ {
77
+ id: 1,
78
+ required: 1,
79
+ img: {
80
+ type: 3,
81
+ w: 150,
82
+ h: 50,
83
+ }
84
+ },
85
+ {
86
+ id: 2,
87
+ required: 1,
88
+ img: {
89
+ type: 2,
90
+ w: 50,
91
+ h: 50
92
+ }
93
+ },
94
+ {
95
+ id: 3,
96
+ required: 1,
97
+ title: {
98
+ len: 80
99
+ }
100
+ },
101
+ {
102
+ id: 4,
103
+ required: 1,
104
+ data: {
105
+ type: 1
106
+ }
107
+ },
108
+ {
109
+ id: 5,
110
+ required: 1,
111
+ data: {
112
+ type: 2
113
+ }
114
+ },
115
+ {
116
+ id: 6,
117
+ required: 0,
118
+ data: {
119
+ type: 3
120
+ }
121
+ },
122
+ {
123
+ id: 7,
124
+ required: 0,
125
+ data: {
126
+ type: 12
127
+ }
128
+ }
129
+ ]
130
+ },
131
+ sendTargetingKeys: false,
132
+ }
133
+ },
134
+ "bids": [{
135
+ "bidder": "smaato",
136
+ "params": {
137
+ "publisherId": "1100042525",
138
+ "adspaceId": "130563103"
139
+ }
140
+ }]
141
+ }];
142
+ ```
143
+
66
144
  For adpod adunits:
67
145
 
68
146
  ```
@@ -55,11 +55,13 @@ export const spec = {
55
55
  deviceWidth: screen.width,
56
56
  hb_version: '$prebid.version$',
57
57
  ...getSharedViewerIdParameters(validBidRequests),
58
- ...getFirstPartyTeadsIdParameter()
58
+ ...getFirstPartyTeadsIdParameter(validBidRequests)
59
59
  };
60
60
 
61
- if (validBidRequests[0].schain) {
62
- payload.schain = validBidRequests[0].schain;
61
+ const firstBidRequest = validBidRequests[0];
62
+
63
+ if (firstBidRequest.schain) {
64
+ payload.schain = firstBidRequest.schain;
63
65
  }
64
66
 
65
67
  let gdpr = bidderRequest.gdprConsent;
@@ -80,6 +82,11 @@ export const spec = {
80
82
  payload.us_privacy = bidderRequest.uspConsent;
81
83
  }
82
84
 
85
+ const userAgentClientHints = deepAccess(firstBidRequest, 'ortb2.device.sua');
86
+ if (userAgentClientHints) {
87
+ payload.userAgentClientHints = userAgentClientHints;
88
+ }
89
+
83
90
  const payloadString = JSON.stringify(payload);
84
91
  return {
85
92
  method: 'POST',
@@ -261,14 +268,25 @@ function _validateId(id) {
261
268
 
262
269
  /**
263
270
  * Get the first-party cookie Teads ID parameter to be sent in bid request.
271
+ * @param validBidRequests an array of bids
264
272
  * @returns `{} | {firstPartyCookieTeadsId: string}`
265
273
  */
266
- function getFirstPartyTeadsIdParameter() {
267
- if (!storage.cookiesAreEnabled()) {
268
- return {};
274
+ function getFirstPartyTeadsIdParameter(validBidRequests) {
275
+ const firstPartyTeadsIdFromUserIdModule = deepAccess(validBidRequests, '0.userId.teadsId');
276
+
277
+ if (firstPartyTeadsIdFromUserIdModule) {
278
+ return {firstPartyCookieTeadsId: firstPartyTeadsIdFromUserIdModule};
269
279
  }
270
- const firstPartyTeadsId = storage.getCookie(FP_TEADS_ID_COOKIE_NAME);
271
- return firstPartyTeadsId ? { firstPartyCookieTeadsId: firstPartyTeadsId } : {};
280
+
281
+ if (storage.cookiesAreEnabled(null)) {
282
+ const firstPartyTeadsIdFromCookie = storage.getCookie(FP_TEADS_ID_COOKIE_NAME, null);
283
+
284
+ if (firstPartyTeadsIdFromCookie) {
285
+ return {firstPartyCookieTeadsId: firstPartyTeadsIdFromCookie};
286
+ }
287
+ }
288
+
289
+ return {};
272
290
  }
273
291
 
274
292
  registerBidder(spec);
@@ -121,12 +121,20 @@ function getUser(bidderRequest) {
121
121
  utils.deepSetValue(user, 'ext.eids', eids);
122
122
  }
123
123
 
124
+ // gather user.data
125
+ const ortb2UserData = utils.deepAccess(bidderRequest, 'ortb2.user.data');
126
+ if (ortb2UserData && ortb2UserData.length) {
127
+ user = utils.mergeDeep(user, {
128
+ data: [...ortb2UserData]
129
+ });
130
+ };
124
131
  return user;
125
132
  }
126
133
 
127
134
  function getSite(bidderRequest, firstPartyData) {
128
135
  var site = {
129
136
  page: utils.deepAccess(bidderRequest, 'refererInfo.page'),
137
+ ref: utils.deepAccess(bidderRequest, 'refererInfo.ref'),
130
138
  publisher: {
131
139
  id: utils.deepAccess(bidderRequest, 'bids.0.params.publisherId'),
132
140
  },
@@ -419,17 +419,12 @@ export function createEidsArray(bidRequestUserId) {
419
419
  if (subModuleKey === 'pubProvidedId') {
420
420
  eids = eids.concat(bidRequestUserId['pubProvidedId']);
421
421
  } else if (subModuleKey === 'ftrackId') {
422
- // ftrack has multiple IDs so we add each one that exists
423
- let eid = {
424
- 'atype': 1,
425
- 'id': (bidRequestUserId.ftrackId.DeviceID || []).join('|'),
426
- 'ext': {}
427
- }
428
- for (let id in bidRequestUserId.ftrackId) {
429
- eid.ext[id] = (bidRequestUserId.ftrackId[id] || []).join('|');
430
- }
431
-
432
- eids.push(eid);
422
+ // Schema based on the return value of ftrack decode() method
423
+ eids.push({
424
+ atype: 1,
425
+ ext: bidRequestUserId.ftrackId.ext,
426
+ id: bidRequestUserId.ftrackId.uid
427
+ });
433
428
  } else if (Array.isArray(bidRequestUserId[subModuleKey])) {
434
429
  bidRequestUserId[subModuleKey].forEach((config, index, arr) => {
435
430
  const eid = createEidObject(config, subModuleKey);
@@ -446,6 +441,7 @@ export function createEidsArray(bidRequestUserId) {
446
441
  }
447
442
  }
448
443
  }
444
+
449
445
  return eids;
450
446
  }
451
447