prebid.js 7.23.0 → 7.23.1

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 (110) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adgenerationBidAdapter.js +1 -1
  5. package/dist/adrelevantisBidAdapter.js +1 -1
  6. package/dist/adtrgtmeBidAdapter.js +1 -1
  7. package/dist/adxcgBidAdapter.js +1 -1
  8. package/dist/ajaBidAdapter.js +1 -1
  9. package/dist/amxBidAdapter.js +1 -1
  10. package/dist/amxIdSystem.js +1 -1
  11. package/dist/appierAnalyticsAdapter.js +1 -1
  12. package/dist/appnexusBidAdapter.js +1 -1
  13. package/dist/asoBidAdapter.js +1 -1
  14. package/dist/axonixBidAdapter.js +1 -1
  15. package/dist/bidglassBidAdapter.js +1 -1
  16. package/dist/big-richmediaBidAdapter.js +1 -1
  17. package/dist/bridgewellBidAdapter.js +1 -1
  18. package/dist/brightMountainMediaBidAdapter.js +1 -1
  19. package/dist/carodaBidAdapter.js +1 -1
  20. package/dist/chtnwBidAdapter.js +1 -1
  21. package/dist/concertBidAdapter.js +1 -1
  22. package/dist/connectadBidAdapter.js +1 -1
  23. package/dist/consumableBidAdapter.js +1 -1
  24. package/dist/conversantBidAdapter.js +1 -1
  25. package/dist/craftBidAdapter.js +1 -1
  26. package/dist/criteoBidAdapter.js +1 -1
  27. package/dist/dspxBidAdapter.js +1 -1
  28. package/dist/eplanningBidAdapter.js +1 -1
  29. package/dist/finativeBidAdapter.js +1 -1
  30. package/dist/glimpseBidAdapter.js +1 -1
  31. package/dist/gmosspBidAdapter.js +1 -1
  32. package/dist/goldbachBidAdapter.js +1 -1
  33. package/dist/gridBidAdapter.js +1 -1
  34. package/dist/gridNMBidAdapter.js +1 -1
  35. package/dist/gumgumBidAdapter.js +1 -1
  36. package/dist/h12mediaBidAdapter.js +1 -1
  37. package/dist/id5IdSystem.js +1 -1
  38. package/dist/improvedigitalBidAdapter.js +1 -1
  39. package/dist/inmarBidAdapter.js +1 -1
  40. package/dist/insticatorBidAdapter.js +1 -1
  41. package/dist/ixBidAdapter.js +1 -1
  42. package/dist/justpremiumBidAdapter.js +1 -1
  43. package/dist/konduitAnalyticsAdapter.js +1 -1
  44. package/dist/kueezBidAdapter.js +1 -1
  45. package/dist/lassoBidAdapter.js +1 -1
  46. package/dist/lifestreetBidAdapter.js +1 -1
  47. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  48. package/dist/logicadBidAdapter.js +1 -1
  49. package/dist/loglyliftBidAdapter.js +1 -1
  50. package/dist/magniteAnalyticsAdapter.js +1 -1
  51. package/dist/malltvAnalyticsAdapter.js +1 -1
  52. package/dist/marsmediaBidAdapter.js +1 -1
  53. package/dist/mediafuseBidAdapter.js +1 -1
  54. package/dist/mediasquareBidAdapter.js +1 -1
  55. package/dist/mgidBidAdapter.js +1 -1
  56. package/dist/minutemediaBidAdapter.js +1 -1
  57. package/dist/not-for-prod/prebid.js +108 -108
  58. package/dist/oguryBidAdapter.js +1 -1
  59. package/dist/onetagBidAdapter.js +1 -1
  60. package/dist/ooloAnalyticsAdapter.js +1 -1
  61. package/dist/outbrainBidAdapter.js +1 -1
  62. package/dist/parrableIdSystem.js +1 -1
  63. package/dist/pixfutureBidAdapter.js +1 -1
  64. package/dist/prebid-core.js +1 -1
  65. package/dist/publinkIdSystem.js +1 -1
  66. package/dist/pubmaticBidAdapter.js +1 -1
  67. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  68. package/dist/pxyzBidAdapter.js +1 -1
  69. package/dist/quantcastBidAdapter.js +1 -1
  70. package/dist/readpeakBidAdapter.js +1 -1
  71. package/dist/relaidoBidAdapter.js +1 -1
  72. package/dist/rhythmoneBidAdapter.js +1 -1
  73. package/dist/riseBidAdapter.js +1 -1
  74. package/dist/rubiconAnalyticsAdapter.js +1 -1
  75. package/dist/rubiconBidAdapter.js +1 -1
  76. package/dist/seedingAllianceBidAdapter.js +1 -1
  77. package/dist/seedtagBidAdapter.js +1 -1
  78. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  79. package/dist/sharethroughBidAdapter.js +1 -1
  80. package/dist/shinezBidAdapter.js +1 -1
  81. package/dist/smaatoBidAdapter.js +1 -1
  82. package/dist/smartadserverBidAdapter.js +1 -1
  83. package/dist/smartxBidAdapter.js +1 -1
  84. package/dist/smilewantedBidAdapter.js +1 -1
  85. package/dist/sonobiBidAdapter.js +1 -1
  86. package/dist/sovrnAnalyticsAdapter.js +1 -1
  87. package/dist/sovrnBidAdapter.js +1 -1
  88. package/dist/sspBCBidAdapter.js +1 -1
  89. package/dist/sublimeBidAdapter.js +1 -1
  90. package/dist/synacormediaBidAdapter.js +1 -1
  91. package/dist/targetVideoBidAdapter.js +1 -1
  92. package/dist/teadsBidAdapter.js +1 -1
  93. package/dist/trionBidAdapter.js +1 -1
  94. package/dist/tripleliftBidAdapter.js +1 -1
  95. package/dist/ttdBidAdapter.js +1 -1
  96. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  97. package/dist/underdogmediaBidAdapter.js +1 -1
  98. package/dist/undertoneBidAdapter.js +1 -1
  99. package/dist/vidazooBidAdapter.js +1 -1
  100. package/dist/videobyteBidAdapter.js +1 -1
  101. package/dist/visxBidAdapter.js +1 -1
  102. package/dist/vuukleBidAdapter.js +1 -1
  103. package/dist/widespaceBidAdapter.js +1 -1
  104. package/dist/winrBidAdapter.js +1 -1
  105. package/dist/yahoosspBidAdapter.js +1 -1
  106. package/dist/yieldmoBidAdapter.js +1 -1
  107. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  108. package/package.json +1 -1
  109. package/src/prebid.js +83 -79
  110. package/test/spec/unit/pbjs_api_spec.js +17 -1
package/src/prebid.js CHANGED
@@ -49,6 +49,7 @@ import {default as adapterManager, gdprDataHandler, getS2SBidderSet, uspDataHand
49
49
  import CONSTANTS from './constants.json';
50
50
  import * as events from './events.js';
51
51
  import {newMetrics, useMetrics} from './utils/perfMetrics.js';
52
+ import {defer} from './utils/promise.js';
52
53
 
53
54
  const $$PREBID_GLOBAL$$ = getGlobal();
54
55
  const { triggerUserSyncs } = userSync;
@@ -622,7 +623,7 @@ $$PREBID_GLOBAL$$.removeAdUnit = function (adUnitCode) {
622
623
  * @alias module:pbjs.requestBids
623
624
  */
624
625
  $$PREBID_GLOBAL$$.requestBids = (function() {
625
- const delegate = hook('sync', function ({ bidsBackHandler, timeout, adUnits, adUnitCodes, labels, auctionId, ttlBuffer, ortb2, metrics } = {}) {
626
+ const delegate = hook('async', function ({ bidsBackHandler, timeout, adUnits, adUnitCodes, labels, auctionId, ttlBuffer, ortb2, metrics, defer } = {}) {
626
627
  events.emit(REQUEST_BIDS);
627
628
  const cbTimeout = timeout || config.getConfig('bidderTimeout');
628
629
  logInfo('Invoking $$PREBID_GLOBAL$$.requestBids', arguments);
@@ -630,23 +631,28 @@ $$PREBID_GLOBAL$$.requestBids = (function() {
630
631
  global: mergeDeep({}, config.getAnyConfig('ortb2') || {}, ortb2 || {}),
631
632
  bidder: Object.fromEntries(Object.entries(config.getBidderConfig()).map(([bidder, cfg]) => [bidder, cfg.ortb2]).filter(([_, ortb2]) => ortb2 != null))
632
633
  }
633
- return startAuction({bidsBackHandler, timeout: cbTimeout, adUnits, adUnitCodes, labels, auctionId, ttlBuffer, ortb2Fragments, metrics});
634
+ return startAuction({bidsBackHandler, timeout: cbTimeout, adUnits, adUnitCodes, labels, auctionId, ttlBuffer, ortb2Fragments, metrics, defer});
634
635
  }, 'requestBids');
635
636
 
636
637
  return wrapHook(delegate, function requestBids(req = {}) {
637
- // if the request does not specify adUnits, clone the global adUnit array - before
638
- // any hook has a chance to run.
638
+ // unlike the main body of `delegate`, this runs before any other hook has a chance to;
639
+ // it's also not restricted in its return value in the way `async` hooks are.
640
+
641
+ // if the request does not specify adUnits, clone the global adUnit array;
639
642
  // otherwise, if the caller goes on to use addAdUnits/removeAdUnits, any asynchronous logic
640
643
  // in any hook might see their effects.
641
- req.metrics = newMetrics();
642
- req.metrics.checkpoint('requestBids');
643
644
  let adUnits = req.adUnits || $$PREBID_GLOBAL$$.adUnits;
644
645
  req.adUnits = (isArray(adUnits) ? adUnits.slice() : [adUnits]);
645
- return delegate.call(this, req);
646
+
647
+ req.metrics = newMetrics();
648
+ req.metrics.checkpoint('requestBids');
649
+ req.defer = defer({promiseFactory: (r) => new Promise(r)})
650
+ delegate.call(this, req);
651
+ return req.defer.promise;
646
652
  });
647
653
  })();
648
654
 
649
- export const startAuction = hook('sync', function ({ bidsBackHandler, timeout: cbTimeout, adUnits, ttlBuffer, adUnitCodes, labels, auctionId, ortb2Fragments, metrics } = {}) {
655
+ export const startAuction = hook('async', function ({ bidsBackHandler, timeout: cbTimeout, adUnits, ttlBuffer, adUnitCodes, labels, auctionId, ortb2Fragments, metrics, defer } = {}) {
650
656
  const s2sBidders = getS2SBidderSet(config.getConfig('s2sConfig') || []);
651
657
  adUnits = useMetrics(metrics).measureTime('requestBids.validate', () => checkAdUnitSetup(adUnits));
652
658
 
@@ -658,85 +664,83 @@ export const startAuction = hook('sync', function ({ bidsBackHandler, timeout: c
658
664
  adUnitCodes = adUnits && adUnits.map(unit => unit.code);
659
665
  }
660
666
 
661
- return new Promise((resolve) => {
662
- function auctionDone(bids, timedOut, auctionId) {
663
- if (typeof bidsBackHandler === 'function') {
664
- try {
665
- bidsBackHandler(bids, timedOut, auctionId);
666
- } catch (e) {
667
- logError('Error executing bidsBackHandler', null, e);
668
- }
667
+ function auctionDone(bids, timedOut, auctionId) {
668
+ if (typeof bidsBackHandler === 'function') {
669
+ try {
670
+ bidsBackHandler(bids, timedOut, auctionId);
671
+ } catch (e) {
672
+ logError('Error executing bidsBackHandler', null, e);
669
673
  }
670
- resolve({bids, timedOut, auctionId});
671
674
  }
675
+ defer.resolve({bids, timedOut, auctionId})
676
+ }
677
+
678
+ /*
679
+ * for a given adunit which supports a set of mediaTypes
680
+ * and a given bidder which supports a set of mediaTypes
681
+ * a bidder is eligible to participate on the adunit
682
+ * if it supports at least one of the mediaTypes on the adunit
683
+ */
684
+ adUnits.forEach(adUnit => {
685
+ // get the adunit's mediaTypes, defaulting to banner if mediaTypes isn't present
686
+ const adUnitMediaTypes = Object.keys(adUnit.mediaTypes || { 'banner': 'banner' });
672
687
 
673
- /*
674
- * for a given adunit which supports a set of mediaTypes
675
- * and a given bidder which supports a set of mediaTypes
676
- * a bidder is eligible to participate on the adunit
677
- * if it supports at least one of the mediaTypes on the adunit
678
- */
679
- adUnits.forEach(adUnit => {
680
- // get the adunit's mediaTypes, defaulting to banner if mediaTypes isn't present
681
- const adUnitMediaTypes = Object.keys(adUnit.mediaTypes || { 'banner': 'banner' });
682
-
683
- // get the bidder's mediaTypes
684
- const allBidders = adUnit.bids.map(bid => bid.bidder);
685
- const bidderRegistry = adapterManager.bidderRegistry;
686
-
687
- const bidders = allBidders.filter(bidder => !s2sBidders.has(bidder));
688
-
689
- const tid = adUnit.ortb2Imp?.ext?.tid || generateUUID();
690
- adUnit.transactionId = tid;
691
- if (ttlBuffer != null && !adUnit.hasOwnProperty('ttlBuffer')) {
692
- adUnit.ttlBuffer = ttlBuffer;
688
+ // get the bidder's mediaTypes
689
+ const allBidders = adUnit.bids.map(bid => bid.bidder);
690
+ const bidderRegistry = adapterManager.bidderRegistry;
691
+
692
+ const bidders = allBidders.filter(bidder => !s2sBidders.has(bidder));
693
+
694
+ const tid = adUnit.ortb2Imp?.ext?.tid || generateUUID();
695
+ adUnit.transactionId = tid;
696
+ if (ttlBuffer != null && !adUnit.hasOwnProperty('ttlBuffer')) {
697
+ adUnit.ttlBuffer = ttlBuffer;
698
+ }
699
+ // Populate ortb2Imp.ext.tid with transactionId. Specifying a transaction ID per item in the ortb impression array, lets multiple transaction IDs be transmitted in a single bid request.
700
+ deepSetValue(adUnit, 'ortb2Imp.ext.tid', tid);
701
+
702
+ bidders.forEach(bidder => {
703
+ const adapter = bidderRegistry[bidder];
704
+ const spec = adapter && adapter.getSpec && adapter.getSpec();
705
+ // banner is default if not specified in spec
706
+ const bidderMediaTypes = (spec && spec.supportedMediaTypes) || ['banner'];
707
+
708
+ // check if the bidder's mediaTypes are not in the adUnit's mediaTypes
709
+ const bidderEligible = adUnitMediaTypes.some(type => includes(bidderMediaTypes, type));
710
+ if (!bidderEligible) {
711
+ // drop the bidder from the ad unit if it's not compatible
712
+ logWarn(unsupportedBidderMessage(adUnit, bidder));
713
+ adUnit.bids = adUnit.bids.filter(bid => bid.bidder !== bidder);
714
+ } else {
715
+ adunitCounter.incrementBidderRequestsCounter(adUnit.code, bidder);
693
716
  }
694
- // Populate ortb2Imp.ext.tid with transactionId. Specifying a transaction ID per item in the ortb impression array, lets multiple transaction IDs be transmitted in a single bid request.
695
- deepSetValue(adUnit, 'ortb2Imp.ext.tid', tid);
696
-
697
- bidders.forEach(bidder => {
698
- const adapter = bidderRegistry[bidder];
699
- const spec = adapter && adapter.getSpec && adapter.getSpec();
700
- // banner is default if not specified in spec
701
- const bidderMediaTypes = (spec && spec.supportedMediaTypes) || ['banner'];
702
-
703
- // check if the bidder's mediaTypes are not in the adUnit's mediaTypes
704
- const bidderEligible = adUnitMediaTypes.some(type => includes(bidderMediaTypes, type));
705
- if (!bidderEligible) {
706
- // drop the bidder from the ad unit if it's not compatible
707
- logWarn(unsupportedBidderMessage(adUnit, bidder));
708
- adUnit.bids = adUnit.bids.filter(bid => bid.bidder !== bidder);
709
- } else {
710
- adunitCounter.incrementBidderRequestsCounter(adUnit.code, bidder);
711
- }
712
- });
713
- adunitCounter.incrementRequestsCounter(adUnit.code);
714
717
  });
718
+ adunitCounter.incrementRequestsCounter(adUnit.code);
719
+ });
715
720
 
716
- if (!adUnits || adUnits.length === 0) {
717
- logMessage('No adUnits configured. No bids requested.');
718
- auctionDone();
719
- } else {
720
- const auction = auctionManager.createAuction({
721
- adUnits,
722
- adUnitCodes,
723
- callback: auctionDone,
724
- cbTimeout,
725
- labels,
726
- auctionId,
727
- ortb2Fragments,
728
- metrics,
729
- });
730
-
731
- let adUnitsLen = adUnits.length;
732
- if (adUnitsLen > 15) {
733
- logInfo(`Current auction ${auction.getAuctionId()} contains ${adUnitsLen} adUnits.`, adUnits);
734
- }
721
+ if (!adUnits || adUnits.length === 0) {
722
+ logMessage('No adUnits configured. No bids requested.');
723
+ auctionDone();
724
+ } else {
725
+ const auction = auctionManager.createAuction({
726
+ adUnits,
727
+ adUnitCodes,
728
+ callback: auctionDone,
729
+ cbTimeout,
730
+ labels,
731
+ auctionId,
732
+ ortb2Fragments,
733
+ metrics,
734
+ });
735
735
 
736
- adUnitCodes.forEach(code => targeting.setLatestAuctionForAdUnit(code, auction.getAuctionId()));
737
- auction.callBids();
736
+ let adUnitsLen = adUnits.length;
737
+ if (adUnitsLen > 15) {
738
+ logInfo(`Current auction ${auction.getAuctionId()} contains ${adUnitsLen} adUnits.`, adUnits);
738
739
  }
739
- });
740
+
741
+ adUnitCodes.forEach(code => targeting.setLatestAuctionForAdUnit(code, auction.getAuctionId()));
742
+ auction.callBids();
743
+ }
740
744
  }, 'startAuction');
741
745
 
742
746
  export function executeCallbacks(fn, reqBidsConfigObj) {
@@ -1615,6 +1615,19 @@ describe('Unit: Prebid Module', function () {
1615
1615
  });
1616
1616
 
1617
1617
  describe('returns a promise that resolves', () => {
1618
+ function delayHook(next, ...args) {
1619
+ setTimeout(() => next(...args))
1620
+ }
1621
+
1622
+ beforeEach(() => {
1623
+ // make sure the return value works correctly when hooks give up priority
1624
+ $$PREBID_GLOBAL$$.requestBids.before(delayHook)
1625
+ });
1626
+
1627
+ afterEach(() => {
1628
+ $$PREBID_GLOBAL$$.requestBids.getHooks({hook: delayHook}).remove();
1629
+ });
1630
+
1618
1631
  Object.entries({
1619
1632
  'immediately, without bidsBackHandler': (req) => $$PREBID_GLOBAL$$.requestBids(req),
1620
1633
  'after bidsBackHandler': (() => {
@@ -1665,7 +1678,10 @@ describe('Unit: Prebid Module', function () {
1665
1678
  sinon.assert.match(bids[bid.adUnitCode].bids[0], bid)
1666
1679
  done();
1667
1680
  });
1668
- completeAuction([bid]);
1681
+ // `completeAuction` won't work until we're out of `delayHook`
1682
+ // and the mocked auction has been set up;
1683
+ // setTimeout here takes us after the setTimeout in `delayHook`
1684
+ setTimeout(() => completeAuction([bid]));
1669
1685
  })
1670
1686
  })
1671
1687
  })