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.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +108 -108
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/package.json +1 -1
- package/src/prebid.js +83 -79
- 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('
|
|
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
|
-
//
|
|
638
|
-
//
|
|
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
|
-
|
|
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('
|
|
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
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
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
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
const
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
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
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
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
|
-
|
|
737
|
-
|
|
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
|
|
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
|
})
|