prebid.js 6.0.0 → 6.4.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 (201) hide show
  1. package/.babelrc.js +1 -7
  2. package/.circleci/config.yml +1 -1
  3. package/README.md +1 -1
  4. package/browsers.json +13 -29
  5. package/gulpfile.js +88 -82
  6. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  7. package/karma.conf.maker.js +2 -2
  8. package/modules/33acrossBidAdapter.js +189 -102
  9. package/modules/adagioBidAdapter.js +1 -1
  10. package/modules/addefendBidAdapter.js +1 -0
  11. package/modules/adheseBidAdapter.js +7 -2
  12. package/modules/adkernelBidAdapter.js +147 -61
  13. package/modules/adlivetechBidAdapter.md +61 -0
  14. package/modules/adlooxAdServerVideo.js +2 -2
  15. package/modules/adlooxAnalyticsAdapter.js +4 -4
  16. package/modules/admanBidAdapter.js +1 -0
  17. package/modules/admixerBidAdapter.js +3 -2
  18. package/modules/adnuntiusBidAdapter.js +5 -2
  19. package/modules/adomikAnalyticsAdapter.js +16 -4
  20. package/modules/adplusBidAdapter.js +203 -0
  21. package/modules/adplusBidAdapter.md +39 -0
  22. package/modules/adxcgBidAdapter.js +311 -359
  23. package/modules/adxcgBidAdapter.md +22 -21
  24. package/modules/adyoulikeBidAdapter.js +7 -2
  25. package/modules/aniviewBidAdapter.js +1 -1
  26. package/modules/appnexusBidAdapter.js +23 -3
  27. package/modules/beachfrontBidAdapter.js +14 -17
  28. package/modules/beopBidAdapter.js +6 -4
  29. package/modules/bidViewability.js +3 -3
  30. package/modules/bidViewabilityIO.js +3 -3
  31. package/modules/codefuelBidAdapter.js +1 -3
  32. package/modules/codefuelBidAdapter.md +3 -3
  33. package/modules/colossussspBidAdapter.js +7 -0
  34. package/modules/compassBidAdapter.js +201 -0
  35. package/modules/compassBidAdapter.md +79 -0
  36. package/modules/craftBidAdapter.js +5 -3
  37. package/modules/criteoBidAdapter.js +1 -1
  38. package/modules/currency.js +2 -2
  39. package/modules/cwireBidAdapter.js +3 -0
  40. package/modules/dailyhuntBidAdapter.js +435 -0
  41. package/modules/dailyhuntBidAdapter.md +4 -0
  42. package/modules/datablocksBidAdapter.js +3 -3
  43. package/modules/dchain.js +149 -0
  44. package/modules/dchain.md +45 -0
  45. package/modules/deepintentBidAdapter.js +1 -1
  46. package/modules/dspxBidAdapter.js +1 -1
  47. package/modules/emx_digitalBidAdapter.js +9 -1
  48. package/modules/engageyaBidAdapter.js +68 -54
  49. package/modules/feedadBidAdapter.js +2 -2
  50. package/modules/feedadBidAdapter.md +4 -2
  51. package/modules/freewheel-sspBidAdapter.js +6 -0
  52. package/modules/futureads.md +48 -0
  53. package/modules/glimpseBidAdapter.js +44 -16
  54. package/modules/goldbachBidAdapter.js +1176 -0
  55. package/modules/goldbachBidAdapter.md +151 -0
  56. package/modules/gptPreAuction.js +11 -5
  57. package/modules/gridBidAdapter.js +5 -4
  58. package/modules/gumgumBidAdapter.js +7 -3
  59. package/modules/id5IdSystem.md +6 -6
  60. package/modules/imRtdProvider.js +31 -0
  61. package/modules/improvedigitalBidAdapter.js +19 -3
  62. package/modules/instreamTracking.js +4 -4
  63. package/modules/intersectionRtdProvider.js +114 -0
  64. package/modules/invibesBidAdapter.js +64 -14
  65. package/modules/invibesBidAdapter.md +2 -1
  66. package/modules/ipromBidAdapter.js +79 -0
  67. package/modules/ixBidAdapter.js +185 -22
  68. package/modules/kinessoIdSystem.js +1 -1
  69. package/modules/limelightDigitalBidAdapter.js +2 -1
  70. package/modules/livewrappedBidAdapter.js +8 -2
  71. package/modules/lotamePanoramaIdSystem.js +80 -8
  72. package/modules/luponmediaBidAdapter.js +570 -0
  73. package/modules/mediasquareBidAdapter.js +1 -9
  74. package/modules/merkleIdSystem.js +5 -0
  75. package/modules/missenaBidAdapter.js +89 -0
  76. package/modules/nativoBidAdapter.js +27 -1
  77. package/modules/nextMillenniumBidAdapter.js +37 -7
  78. package/modules/oguryBidAdapter.js +2 -1
  79. package/modules/openxBidAdapter.js +6 -1
  80. package/modules/prebidServerBidAdapter/index.js +19 -15
  81. package/modules/pubgeniusBidAdapter.js +1 -1
  82. package/modules/pubmaticBidAdapter.js +5 -3
  83. package/modules/pubxaiAnalyticsAdapter.js +17 -0
  84. package/modules/relaidoBidAdapter.js +86 -65
  85. package/modules/richaudienceBidAdapter.js +2 -3
  86. package/modules/rtdModule/index.js +48 -18
  87. package/modules/rubiconBidAdapter.js +31 -19
  88. package/modules/saambaaBidAdapter.js +420 -0
  89. package/modules/saambaaBidAdapter.md +65 -68
  90. package/modules/seedtagBidAdapter.js +6 -0
  91. package/modules/sharedIdSystem.js +27 -1
  92. package/modules/smaatoBidAdapter.js +9 -1
  93. package/modules/smartxBidAdapter.js +17 -1
  94. package/modules/sspBCBidAdapter.js +34 -3
  95. package/modules/tappxBidAdapter.js +3 -1
  96. package/modules/targetVideoBidAdapter.js +187 -0
  97. package/modules/targetVideoBidAdapter.md +34 -0
  98. package/modules/telariaBidAdapter.js +2 -2
  99. package/modules/trustxBidAdapter.js +18 -17
  100. package/modules/undertoneBidAdapter.js +8 -1
  101. package/modules/userId/index.js +27 -2
  102. package/modules/ventes.md +71 -0
  103. package/modules/ventesBidAdapter.js +104 -64
  104. package/modules/ventesBidAdapter.md +0 -1
  105. package/modules/vidoomyBidAdapter.js +65 -108
  106. package/modules/visxBidAdapter.js +20 -3
  107. package/modules/visxBidAdapter.md +4 -6
  108. package/modules/weboramaRtdProvider.js +288 -73
  109. package/modules/weboramaRtdProvider.md +27 -10
  110. package/modules/yahoosspBidAdapter.js +5 -1
  111. package/modules/yahoosspBidAdapter.md +1 -1
  112. package/modules/yieldlabBidAdapter.js +41 -10
  113. package/modules/yieldlabBidAdapter.md +91 -48
  114. package/modules/yieldoneBidAdapter.js +115 -11
  115. package/modules/zetaSspBidAdapter.md +33 -1
  116. package/modules/zeta_global_sspBidAdapter.js +22 -1
  117. package/package.json +6 -1
  118. package/plugins/pbjsGlobals.js +28 -1
  119. package/src/adapterManager.js +14 -8
  120. package/src/auction.js +5 -4
  121. package/src/prebid.js +1 -2
  122. package/src/targeting.js +24 -3
  123. package/src/utils.js +41 -7
  124. package/test/helpers/prebidGlobal.js +1 -0
  125. package/test/spec/integration/faker/googletag.js +6 -0
  126. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  127. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  128. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  129. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  130. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
  131. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  132. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  133. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  134. package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
  135. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  136. package/test/spec/modules/beopBidAdapter_spec.js +1 -1
  137. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  138. package/test/spec/modules/bidViewability_spec.js +4 -4
  139. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  140. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  141. package/test/spec/modules/compassBidAdapter_spec.js +397 -0
  142. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  143. package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
  144. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  145. package/test/spec/modules/dchain_spec.js +329 -0
  146. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  147. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  148. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  149. package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
  150. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  151. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  152. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  153. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  154. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  155. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  156. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
  157. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  158. package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
  159. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  160. package/test/spec/modules/ixBidAdapter_spec.js +293 -2
  161. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  162. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  163. package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
  164. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  165. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  166. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  167. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  168. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  169. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  170. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
  171. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  172. package/test/spec/modules/openxBidAdapter_spec.js +5 -0
  173. package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
  174. package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
  175. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  176. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
  177. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  178. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  179. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  180. package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
  181. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  182. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  183. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  184. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  185. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  186. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  187. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  188. package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
  189. package/test/spec/modules/userId_spec.js +51 -0
  190. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  191. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  192. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  193. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  194. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  195. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  196. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  197. package/test/spec/unit/core/adapterManager_spec.js +24 -6
  198. package/test/spec/unit/core/targeting_spec.js +116 -0
  199. package/test/spec/utils_spec.js +38 -0
  200. package/test/test_deps.js +3 -0
  201. package/test/test_index.js +1 -3
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isStr, isArray, isPlainObject, deepSetValue, isNumber, deepAccess, getAdUnitSizes, parseGPTSingleSizeArrayToRtbSize,
3
- cleanObj, contains, getDNT, parseUrl, createTrackPixelHtml, _each, isArrayOfNums
3
+ cleanObj, contains, getDNT, parseUrl, createTrackPixelHtml, _each, isArrayOfNums, mergeDeep, isEmpty, inIframe
4
4
  } from '../src/utils.js';
5
5
  import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
6
6
  import {registerBidder} from '../src/adapters/bidderFactory.js';
@@ -75,6 +75,7 @@ export const spec = {
75
75
  {code: 'denakop'},
76
76
  {code: 'rtbanalytica'},
77
77
  {code: 'unibots'},
78
+ {code: 'catapultx'},
78
79
  {code: 'ergadx'},
79
80
  {code: 'turktelekom'}
80
81
  ],
@@ -102,17 +103,16 @@ export const spec = {
102
103
  * @returns {ServerRequest[]}
103
104
  */
104
105
  buildRequests: function (bidRequests, bidderRequest) {
105
- let impDispatch = dispatchImps(bidRequests, bidderRequest.refererInfo);
106
+ let impGroups = groupImpressionsByHostZone(bidRequests, bidderRequest.refererInfo);
106
107
  let requests = [];
107
108
  let schain = bidRequests[0].schain;
108
- Object.keys(impDispatch).forEach(host => {
109
- Object.keys(impDispatch[host]).forEach(zoneId => {
110
- const request = buildRtbRequest(impDispatch[host][zoneId], bidderRequest, schain);
111
- requests.push({
112
- method: 'POST',
113
- url: `https://${host}/hb?zone=${zoneId}&v=${VERSION}`,
114
- data: JSON.stringify(request)
115
- });
109
+ _each(impGroups, impGroup => {
110
+ let {host, zoneId, imps} = impGroup;
111
+ const request = buildRtbRequest(imps, bidderRequest, schain);
112
+ requests.push({
113
+ method: 'POST',
114
+ url: `https://${host}/hb?zone=${zoneId}&v=${VERSION}`,
115
+ data: JSON.stringify(request)
116
116
  });
117
117
  });
118
118
  return requests;
@@ -208,17 +208,19 @@ registerBidder(spec);
208
208
  * @param bidRequests {BidRequest[]}
209
209
  * @param refererInfo {refererInfo}
210
210
  */
211
- function dispatchImps(bidRequests, refererInfo) {
211
+ function groupImpressionsByHostZone(bidRequests, refererInfo) {
212
212
  let secure = (refererInfo && refererInfo.referer.indexOf('https:') === 0);
213
- return bidRequests.map(bidRequest => buildImp(bidRequest, secure))
214
- .reduce((acc, curr, index) => {
215
- let bidRequest = bidRequests[index];
216
- let {zoneId, host} = bidRequest.params;
217
- acc[host] = acc[host] || {};
218
- acc[host][zoneId] = acc[host][zoneId] || [];
219
- acc[host][zoneId].push(curr);
220
- return acc;
221
- }, {});
213
+ return Object.values(
214
+ bidRequests.map(bidRequest => buildImp(bidRequest, secure))
215
+ .reduce((acc, curr, index) => {
216
+ let bidRequest = bidRequests[index];
217
+ let {zoneId, host} = bidRequest.params;
218
+ let key = `${host}_${zoneId}`;
219
+ acc[key] = acc[key] || {host: host, zoneId: zoneId, imps: []};
220
+ acc[key].imps.push(curr);
221
+ return acc;
222
+ }, {})
223
+ );
222
224
  }
223
225
 
224
226
  function getBidFloor(bid, mediaType, sizes) {
@@ -364,57 +366,142 @@ function getAllowedSyncMethod(bidderCode) {
364
366
  }
365
367
 
366
368
  /**
367
- * Builds complete rtb request
368
- * @param imps {Object} Collection of rtb impressions
369
- * @param bidderRequest {BidderRequest}
370
- * @param schain {Object=} Supply chain config
371
- * @return {Object} Complete rtb request
369
+ * Create device object from fpd and host-collected data
370
+ * @param fpd {Object}
371
+ * @returns {{device: Object}}
372
372
  */
373
- function buildRtbRequest(imps, bidderRequest, schain) {
374
- let {bidderCode, gdprConsent, auctionId, refererInfo, timeout, uspConsent} = bidderRequest;
375
- let coppa = config.getConfig('coppa');
376
- let req = {
377
- 'id': auctionId,
378
- 'imp': imps,
379
- 'site': createSite(refererInfo),
380
- 'at': 1,
381
- 'device': {
382
- 'ip': 'caller',
383
- 'ipv6': 'caller',
384
- 'ua': 'caller',
385
- 'js': 1,
386
- 'language': getLanguage()
387
- },
388
- 'tmax': parseInt(timeout)
389
- };
373
+ function makeDevice(fpd) {
374
+ let device = mergeDeep({
375
+ 'ip': 'caller',
376
+ 'ipv6': 'caller',
377
+ 'ua': 'caller',
378
+ 'js': 1,
379
+ 'language': getLanguage()
380
+ }, fpd.device || {});
390
381
  if (getDNT()) {
391
- req.device.dnt = 1;
382
+ device.dnt = 1;
383
+ }
384
+ return {device: device};
385
+ }
386
+
387
+ /**
388
+ * Create site or app description object
389
+ * @param bidderRequest {BidderRequest}
390
+ * @param fpd {Object}
391
+ * @returns {{site: Object}|{app: Object}}
392
+ */
393
+ function makeSiteOrApp(bidderRequest, fpd) {
394
+ let {refererInfo} = bidderRequest;
395
+ let appConfig = config.getConfig('app');
396
+ if (isEmpty(appConfig)) {
397
+ return {site: createSite(refererInfo, fpd)}
398
+ } else {
399
+ return {app: appConfig};
392
400
  }
401
+ }
402
+
403
+ /**
404
+ * Create user description object
405
+ * @param bidderRequest {BidderRequest}
406
+ * @param fpd {Object}
407
+ * @returns {{user: Object} | undefined}
408
+ */
409
+ function makeUser(bidderRequest, fpd) {
410
+ let {gdprConsent} = bidderRequest;
411
+ let user = fpd.user || {};
412
+ if (gdprConsent && gdprConsent.consentString !== undefined) {
413
+ deepSetValue(user, 'ext.consent', gdprConsent.consentString);
414
+ }
415
+ let eids = getExtendedUserIds(bidderRequest);
416
+ if (eids) {
417
+ deepSetValue(user, 'ext.eids', eids);
418
+ }
419
+ if (!isEmpty(user)) { return {user: user}; }
420
+ }
421
+
422
+ /**
423
+ * Create privacy regulations object
424
+ * @param bidderRequest {BidderRequest}
425
+ * @returns {{regs: Object} | undefined}
426
+ */
427
+ function makeRegulations(bidderRequest) {
428
+ let {gdprConsent, uspConsent} = bidderRequest;
429
+ let regs = {};
393
430
  if (gdprConsent) {
394
431
  if (gdprConsent.gdprApplies !== undefined) {
395
- deepSetValue(req, 'regs.ext.gdpr', ~~gdprConsent.gdprApplies);
396
- }
397
- if (gdprConsent.consentString !== undefined) {
398
- deepSetValue(req, 'user.ext.consent', gdprConsent.consentString);
432
+ deepSetValue(regs, 'regs.ext.gdpr', ~~gdprConsent.gdprApplies);
399
433
  }
400
434
  }
401
435
  if (uspConsent) {
402
- deepSetValue(req, 'regs.ext.us_privacy', uspConsent);
436
+ deepSetValue(regs, 'regs.ext.us_privacy', uspConsent);
437
+ }
438
+ if (config.getConfig('coppa')) {
439
+ deepSetValue(regs, 'regs.coppa', 1);
403
440
  }
404
- if (coppa) {
405
- deepSetValue(req, 'regs.coppa', 1);
441
+ if (!isEmpty(regs)) {
442
+ return regs;
406
443
  }
444
+ }
445
+
446
+ /**
447
+ * Create top-level request object
448
+ * @param bidderRequest {BidderRequest}
449
+ * @param imps {Object} Impressions
450
+ * @param fpd {Object} First party data
451
+ * @returns
452
+ */
453
+ function makeBaseRequest(bidderRequest, imps, fpd) {
454
+ let {auctionId, timeout} = bidderRequest;
455
+ let request = {
456
+ 'id': auctionId,
457
+ 'imp': imps,
458
+ 'at': 1,
459
+ 'tmax': parseInt(timeout)
460
+ };
461
+ if (!isEmpty(fpd.bcat)) {
462
+ request.bcat = fpd.bcat;
463
+ }
464
+ if (!isEmpty(fpd.badv)) {
465
+ request.badv = fpd.badv;
466
+ }
467
+ return request;
468
+ }
469
+
470
+ /**
471
+ * Initialize sync capabilities
472
+ * @param bidderRequest {BidderRequest}
473
+ */
474
+ function makeSyncInfo(bidderRequest) {
475
+ let {bidderCode} = bidderRequest;
407
476
  let syncMethod = getAllowedSyncMethod(bidderCode);
408
477
  if (syncMethod) {
409
- deepSetValue(req, 'ext.adk_usersync', syncMethod);
478
+ let res = {};
479
+ deepSetValue(res, 'ext.adk_usersync', syncMethod);
480
+ return res;
410
481
  }
482
+ }
483
+
484
+ /**
485
+ * Builds complete rtb request
486
+ * @param imps {Object} Collection of rtb impressions
487
+ * @param bidderRequest {BidderRequest}
488
+ * @param schain {Object=} Supply chain config
489
+ * @return {Object} Complete rtb request
490
+ */
491
+ function buildRtbRequest(imps, bidderRequest, schain) {
492
+ let fpd = config.getConfig('ortb2') || {};
493
+
494
+ let req = mergeDeep(
495
+ makeBaseRequest(bidderRequest, imps, fpd),
496
+ makeDevice(fpd),
497
+ makeSiteOrApp(bidderRequest, fpd),
498
+ makeUser(bidderRequest, fpd),
499
+ makeRegulations(bidderRequest),
500
+ makeSyncInfo(bidderRequest)
501
+ );
411
502
  if (schain) {
412
503
  deepSetValue(req, 'source.ext.schain', schain);
413
504
  }
414
- let eids = getExtendedUserIds(bidderRequest);
415
- if (eids) {
416
- deepSetValue(req, 'user.ext.eids', eids);
417
- }
418
505
  return req;
419
506
  }
420
507
 
@@ -430,18 +517,17 @@ function getLanguage() {
430
517
  /**
431
518
  * Creates site description object
432
519
  */
433
- function createSite(refInfo) {
520
+ function createSite(refInfo, fpd) {
434
521
  let url = parseUrl(refInfo.referer);
435
522
  let site = {
436
523
  'domain': url.hostname,
437
524
  'page': `${url.protocol}://${url.hostname}${url.pathname}`
438
525
  };
439
- if (self === top && document.referrer) {
526
+ mergeDeep(site, fpd.site);
527
+ if (!inIframe() && document.referrer) {
440
528
  site.ref = document.referrer;
441
- }
442
- let keywords = document.getElementsByTagName('meta')['keywords'];
443
- if (keywords && keywords.content) {
444
- site.keywords = keywords.content;
529
+ } else {
530
+ delete site.ref;
445
531
  }
446
532
  return site;
447
533
  }
@@ -0,0 +1,61 @@
1
+ # Overview
2
+
3
+ Module Name: Adlivetech Bidder Adapter
4
+ Module Type: Bidder Adapter
5
+ Maintainer: grid-tech@themediagrid.com
6
+
7
+ # Description
8
+
9
+ Module that connects to Grid demand source to fetch bids.
10
+ The adapter is GDPR compliant and supports banner and video (instream and outstream).
11
+
12
+ # Test Parameters
13
+ ```
14
+ var adUnits = [
15
+ {
16
+ code: 'test-div',
17
+ sizes: [[300, 250]],
18
+ bids: [
19
+ {
20
+ bidder: "adlivetech",
21
+ params: {
22
+ uid: '1',
23
+ bidFloor: 0.5
24
+ }
25
+ }
26
+ ]
27
+ },{
28
+ code: 'test-div',
29
+ sizes: [[728, 90]],
30
+ bids: [
31
+ {
32
+ bidder: "adlivetech",
33
+ params: {
34
+ uid: 2,
35
+ keywords: {
36
+ brandsafety: ['disaster'],
37
+ topic: ['stress', 'fear']
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ code: 'test-div',
45
+ sizes: [[728, 90]],
46
+ mediaTypes: { video: {
47
+ context: 'instream',
48
+ playerSize: [728, 90],
49
+ mimes: ['video/mp4']
50
+ },
51
+ bids: [
52
+ {
53
+ bidder: "adlivetech",
54
+ params: {
55
+ uid: 11
56
+ }
57
+ }
58
+ ]
59
+ }
60
+ ];
61
+ ```
@@ -9,7 +9,7 @@
9
9
  import { registerVideoSupport } from '../src/adServerManager.js';
10
10
  import { command as analyticsCommand, COMMAND } from './adlooxAnalyticsAdapter.js';
11
11
  import { ajax } from '../src/ajax.js';
12
- import { EVENTS } from '../src/constants.json';
12
+ import CONSTANTS from '../src/constants.json';
13
13
  import { targeting } from '../src/targeting.js';
14
14
  import { logInfo, isFn, logError, isPlainObject, isStr, isBoolean, deepSetValue, deepClone, timestamp, logWarn } from '../src/utils.js';
15
15
 
@@ -74,7 +74,7 @@ function track(options, callback) {
74
74
  bid.ext.adloox.video.adserver = false;
75
75
 
76
76
  analyticsCommand(COMMAND.TRACK, {
77
- eventType: EVENTS.BID_WON,
77
+ eventType: CONSTANTS.EVENTS.BID_WON,
78
78
  args: bid
79
79
  });
80
80
  }
@@ -9,7 +9,7 @@ import adapter from '../src/AnalyticsAdapter.js';
9
9
  import { loadExternalScript } from '../src/adloader.js';
10
10
  import { auctionManager } from '../src/auctionManager.js';
11
11
  import { AUCTION_COMPLETED } from '../src/auction.js';
12
- import { EVENTS } from '../src/constants.json';
12
+ import CONSTANTS from '../src/constants.json';
13
13
  import find from 'core-js-pure/features/array/find.js';
14
14
  import {
15
15
  deepAccess, logInfo, isPlainObject, logError, isStr, isNumber, getGptSlotInfoForAdUnitCode,
@@ -199,9 +199,9 @@ analyticsAdapter.url = function(url, args, bid) {
199
199
  return url + a2qs(args);
200
200
  }
201
201
 
202
- analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = function(auctionDetails) {
202
+ analyticsAdapter[`handle_${CONSTANTS.EVENTS.AUCTION_END}`] = function(auctionDetails) {
203
203
  if (!(auctionDetails.auctionStatus == AUCTION_COMPLETED && auctionDetails.bidsReceived.length > 0)) return;
204
- analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = NOOP;
204
+ analyticsAdapter[`handle_${CONSTANTS.EVENTS.AUCTION_END}`] = NOOP;
205
205
 
206
206
  logMessage(MODULE, 'preloading verification JS');
207
207
 
@@ -214,7 +214,7 @@ analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = function(auctionDetails) {
214
214
  insertElement(link);
215
215
  }
216
216
 
217
- analyticsAdapter[`handle_${EVENTS.BID_WON}`] = function(bid) {
217
+ analyticsAdapter[`handle_${CONSTANTS.EVENTS.BID_WON}`] = function(bid) {
218
218
  if (deepAccess(bid, 'ext.adloox.video.adserver')) {
219
219
  logMessage(MODULE, `measuring '${bid.mediaType}' ad unit code '${bid.adUnitCode}' via Ad Server module`);
220
220
  return;
@@ -108,6 +108,7 @@ export const spec = {
108
108
  }
109
109
  if (bid.userId) {
110
110
  getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com');
111
+ getUserId(placement.eids, bid.userId.lotamePanoramaId, 'lotame.com');
111
112
  }
112
113
  if (traff === VIDEO) {
113
114
  placement.playerSize = bid.mediaTypes[VIDEO].playerSize;
@@ -1,14 +1,15 @@
1
1
  import { logError } from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {config} from '../src/config.js';
4
+ import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
4
5
 
5
6
  const BIDDER_CODE = 'admixer';
6
- const ALIASES = ['go2net', 'adblender', 'adsyield'];
7
+ const ALIASES = ['go2net', 'adblender', 'adsyield', 'futureads'];
7
8
  const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
8
9
  export const spec = {
9
10
  code: BIDDER_CODE,
10
11
  aliases: ALIASES,
11
- supportedMediaTypes: ['banner', 'video'],
12
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
12
13
  /**
13
14
  * Determines whether or not the given bid request is valid.
14
15
  */
@@ -37,7 +37,8 @@ const handleMeta = function () {
37
37
  }
38
38
 
39
39
  const getUsi = function (meta, ortb2, bidderRequest) {
40
- const usi = (meta !== null) ? meta.usi : false;
40
+ let usi = (meta !== null && meta.usi) ? meta.usi : false;
41
+ if (ortb2 && ortb2.user && ortb2.user.id) { usi = ortb2.user.id }
41
42
  return usi
42
43
  }
43
44
 
@@ -55,6 +56,8 @@ export const spec = {
55
56
  const requests = [];
56
57
  const request = [];
57
58
  const ortb2 = config.getConfig('ortb2');
59
+ const bidderConfig = config.getConfig();
60
+
58
61
  const adnMeta = handleMeta()
59
62
  const usi = getUsi(adnMeta, ortb2, bidderRequest)
60
63
  const segments = getSegmentsFromOrtb(ortb2);
@@ -67,7 +70,7 @@ export const spec = {
67
70
  if (gdprApplies !== undefined) request.push('consentString=' + consentString);
68
71
  if (segments.length > 0) request.push('segments=' + segments.join(','));
69
72
  if (usi) request.push('userId=' + usi);
70
-
73
+ if (bidderConfig.useCookie === false) request.push('noCookies=true')
71
74
  for (var i = 0; i < validBidRequests.length; i++) {
72
75
  const bid = validBidRequests[i]
73
76
  const network = bid.params.network || 'network';
@@ -12,6 +12,7 @@ const bidRequested = CONSTANTS.EVENTS.BID_REQUESTED;
12
12
  const bidResponse = CONSTANTS.EVENTS.BID_RESPONSE;
13
13
  const bidWon = CONSTANTS.EVENTS.BID_WON;
14
14
  const bidTimeout = CONSTANTS.EVENTS.BID_TIMEOUT;
15
+ const ua = navigator.userAgent;
15
16
 
16
17
  let adomikAdapter = Object.assign(adapter({}),
17
18
  {
@@ -47,7 +48,7 @@ let adomikAdapter = Object.assign(adapter({}),
47
48
  type: 'request',
48
49
  event: {
49
50
  bidder: bid.bidder.toUpperCase(),
50
- placementCode: bid.placementCode
51
+ placementCode: bid.adUnitCode
51
52
  }
52
53
  });
53
54
  });
@@ -67,10 +68,16 @@ adomikAdapter.initializeBucketEvents = function() {
67
68
  adomikAdapter.bucketEvents = [];
68
69
  }
69
70
 
71
+ adomikAdapter.maxPartLength = function () {
72
+ return (ua.includes(' MSIE ')) ? 1600 : 60000;
73
+ };
74
+
70
75
  adomikAdapter.sendTypedEvent = function() {
71
76
  const groupedTypedEvents = adomikAdapter.buildTypedEvents();
72
77
 
73
78
  const bulkEvents = {
79
+ testId: adomikAdapter.currentContext.testId,
80
+ testValue: adomikAdapter.currentContext.testValue,
74
81
  uid: adomikAdapter.currentContext.uid,
75
82
  ahbaid: adomikAdapter.currentContext.id,
76
83
  hostname: window.location.hostname,
@@ -108,9 +115,10 @@ adomikAdapter.sendTypedEvent = function() {
108
115
  // Encode object in base64
109
116
  const encodedBuf = window.btoa(stringBulkEvents);
110
117
 
111
- // Create final url and split it in 1600 characters max (+endpoint length)
118
+ // Create final url and split it (+endpoint length)
112
119
  const encodedUri = encodeURIComponent(encodedBuf);
113
- const splittedUrl = encodedUri.match(/.{1,1600}/g);
120
+ const maxLength = adomikAdapter.maxPartLength();
121
+ const splittedUrl = encodedUri.match(new RegExp(`.{1,${maxLength}}`, 'g'));
114
122
 
115
123
  splittedUrl.forEach((split, i) => {
116
124
  const partUrl = `${split}&id=${adomikAdapter.currentContext.id}&part=${i}&on=${splittedUrl.length - 1}`;
@@ -120,8 +128,10 @@ adomikAdapter.sendTypedEvent = function() {
120
128
  };
121
129
 
122
130
  adomikAdapter.sendWonEvent = function (wonEvent) {
131
+ let keyValues = { testId: adomikAdapter.currentContext.testId, testValue: adomikAdapter.currentContext.testValue }
132
+ wonEvent = {...wonEvent, ...keyValues}
123
133
  const stringWonEvent = JSON.stringify(wonEvent)
124
- logInfo('Won event sent to adomik prebid analytic ' + wonEvent);
134
+ logInfo('Won event sent to adomik prebid analytic ' + stringWonEvent);
125
135
 
126
136
  // Encode object in base64
127
137
  const encodedBuf = window.btoa(stringWonEvent);
@@ -199,6 +209,8 @@ adomikAdapter.enableAnalytics = function (config) {
199
209
  adomikAdapter.currentContext = {
200
210
  uid: initOptions.id,
201
211
  url: initOptions.url,
212
+ testId: initOptions.testId,
213
+ testValue: initOptions.testValue,
202
214
  id: '',
203
215
  timeouted: false,
204
216
  }