prebid.js 7.18.0 → 7.20.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.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adfBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxAnalyticsAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adomikAnalyticsAdapter.js +1 -1
- package/dist/adqueryIdSystem.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adxpremiumAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/aolBidAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/atsAnalyticsAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +1 -1
- package/dist/bidViewability.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/categoryTranslation.js +1 -1
- package/dist/cleanioRtdProvider.js +1 -1
- package/dist/colossussspBidAdapter.js +1 -1
- package/dist/concertAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -1
- package/dist/consentManagementUsp.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -0
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/currency.js +1 -1
- package/dist/datablocksAnalyticsAdapter.js +1 -1
- package/dist/dchain.js +1 -1
- package/dist/debugging-standalone.js +1 -1
- package/dist/debugging.js +1 -1
- package/dist/dependencies.json +9 -0
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/dianomiBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/enrichmentFpdModule.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/fpd.js +1 -0
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/googleAnalyticsAdapter.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/hadronAnalyticsAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.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/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kinessoIdSystem.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/liveIntentAnalyticsAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -0
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mass.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediakeysBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/multibid.js +1 -1
- package/dist/nativoBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +198 -194
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxAnalyticsAdapter.js +1 -1
- package/dist/optimonAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pianoDmpAnalyticsAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +2 -2
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
- package/dist/priceFloors.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubperfAnalyticsAdapter.js +1 -1
- package/dist/pubstackAnalyticsAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pulsepointAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/quantcastIdSystem.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/realvuAnalyticsAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevantAnalyticsAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rivrAnalyticsAdapter.js +1 -1
- package/dist/roxotAnalyticsAdapter.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/s2sTesting.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/schain.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/sigmoidAnalyticsAdapter.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/sonobiAnalyticsAdapter.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/staqAnalyticsAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tapadIdSystem.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/teadsIdSystem.js +1 -0
- package/dist/terceptAnalyticsAdapter.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/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vrtcalBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/weboramaRtdProvider.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yandexBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/libraries/fpd/sua.js +98 -0
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +1 -1
- package/modules/adkernelAdnBidAdapter.js +1 -0
- package/modules/adkernelBidAdapter.js +2 -2
- package/modules/adqueryIdSystem.js +8 -8
- package/modules/adxcgBidAdapter.js +1 -1
- package/modules/amxBidAdapter.js +1 -1
- package/modules/aolBidAdapter.js +25 -2
- package/modules/appnexusBidAdapter.js +19 -2
- package/modules/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +0 -0
- package/modules/{andBeyondMediaBidAdapter.md → beyondmediaBidAdapter.md} +1 -1
- package/modules/categoryTranslation.js +4 -4
- package/modules/cleanioRtdProvider.js +3 -4
- package/modules/colossussspBidAdapter.js +2 -1
- package/modules/connectIdSystem.js +16 -1
- package/modules/conversantAnalyticsAdapter.js +560 -0
- package/modules/conversantAnalyticsAdapter.md +47 -0
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/currency.js +11 -11
- package/modules/dchain.js +2 -2
- package/modules/debugging/bidInterceptor.js +2 -2
- package/modules/debugging/debugging.js +10 -2
- package/modules/debugging/legacy.js +2 -2
- package/modules/dgkeywordRtdProvider.js +21 -3
- package/modules/dianomiBidAdapter.js +1 -1
- package/modules/enrichmentFpdModule.js +33 -14
- package/modules/eplanningBidAdapter.js +48 -2
- package/modules/finativeBidAdapter.js +1 -1
- package/modules/gridBidAdapter.js +187 -117
- package/modules/improvedigitalBidAdapter.js +2 -2
- package/modules/ixBidAdapter.js +94 -23
- package/modules/liveIntentIdSystem.js +39 -5
- package/modules/lotamePanoramaIdSystem.js +10 -6
- package/modules/magniteAnalyticsAdapter.js +902 -0
- package/modules/magniteAnalyticsAdapter.md +18 -0
- package/modules/mass.js +2 -2
- package/modules/mediakeysBidAdapter.js +6 -1
- package/modules/mediakeysBidAdapter.md +50 -40
- package/modules/multibid/index.js +5 -5
- package/modules/nativoBidAdapter.js +1 -1
- package/modules/pixfutureBidAdapter.js +46 -15
- package/modules/prebidServerBidAdapter/index.js +54 -19
- package/modules/priceFloors.js +8 -22
- package/modules/readpeakBidAdapter.js +1 -1
- package/modules/rubiconAnalyticsAdapter.js +14 -9
- package/modules/rubiconBidAdapter.js +2 -3
- package/modules/seedingAllianceBidAdapter.js +1 -1
- package/modules/sharethroughBidAdapter.js +1 -1
- package/modules/taboolaBidAdapter.js +5 -5
- package/modules/talkadsBidAdapter.js +1 -0
- package/modules/teadsIdSystem.js +234 -0
- package/modules/teadsIdSystem.md +22 -0
- package/modules/truereachBidAdapter.js +1 -0
- package/modules/ttdBidAdapter.js +1 -1
- package/modules/userId/index.js +21 -14
- package/modules/vrtcalBidAdapter.js +7 -1
- package/modules/vuukleBidAdapter.js +34 -3
- package/modules/yahoosspBidAdapter.js +4 -2
- package/modules/yandexBidAdapter.js +31 -8
- package/package.json +2 -2
- package/src/adapterManager.js +2 -4
- package/src/adapters/bidderFactory.js +13 -11
- package/src/auction.js +140 -69
- package/src/constants.json +8 -0
- package/src/cpmBucketManager.js +22 -3
- package/src/native.js +1 -5
- package/src/prebid.js +5 -6
- package/src/targeting.js +31 -14
- package/test/fixtures/fixtures.js +2 -1
- package/test/spec/auctionmanager_spec.js +109 -21
- package/test/spec/cpmBucketManager_spec.js +239 -177
- package/test/spec/fpd/sua_spec.js +244 -0
- package/test/spec/modules/adfBidAdapter_spec.js +2 -3
- package/test/spec/modules/adqueryIdSystem_spec.js +0 -2
- package/test/spec/modules/adxcgBidAdapter_spec.js +2 -3
- package/test/spec/modules/amxBidAdapter_spec.js +3 -2
- package/test/spec/modules/aolBidAdapter_spec.js +42 -9
- package/test/spec/modules/appnexusBidAdapter_spec.js +24 -0
- package/test/spec/modules/{andBeyondMediaBidAdapter_spec.js → beyondmediaBidAdapter_spec.js} +1 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +4 -2
- package/test/spec/modules/connectIdSystem_spec.js +20 -0
- package/test/spec/modules/conversantAnalyticsAdapter_spec.js +963 -0
- package/test/spec/modules/currency_spec.js +14 -6
- package/test/spec/modules/debugging_mod_spec.js +9 -0
- package/test/spec/modules/dgkeywordRtdProvider_spec.js +83 -1
- package/test/spec/modules/dianomiBidAdapter_spec.js +2 -3
- package/test/spec/modules/enrichmentFpdModule_spec.js +50 -7
- package/test/spec/modules/eplanningBidAdapter_spec.js +285 -1
- package/test/spec/modules/fpdModule_spec.js +9 -0
- package/test/spec/modules/gridBidAdapter_spec.js +87 -31
- package/test/spec/modules/ixBidAdapter_spec.js +221 -2
- package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +62 -8
- package/test/spec/modules/liveIntentIdSystem_spec.js +62 -8
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +0 -1
- package/test/spec/modules/magniteAnalyticsAdapter_spec.js +1942 -0
- package/test/spec/modules/mediakeysBidAdapter_spec.js +20 -3
- package/test/spec/modules/nativoBidAdapter_spec.js +13 -2
- package/test/spec/modules/prebidServerBidAdapter_spec.js +202 -15
- package/test/spec/modules/priceFloors_spec.js +5 -5
- package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +2 -3
- package/test/spec/modules/seedtagBidAdapter_spec.js +15 -18
- package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
- package/test/spec/modules/taboolaBidAdapter_spec.js +112 -13
- package/test/spec/modules/teadsIdSystem_spec.js +271 -0
- package/test/spec/modules/ttdBidAdapter_spec.js +3 -3
- package/test/spec/modules/userId_spec.js +39 -4
- package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -1
- package/test/spec/modules/vuukleBidAdapter_spec.js +87 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +48 -1
- package/test/spec/modules/yandexBidAdapter_spec.js +8 -5
- package/test/spec/native_spec.js +5 -0
- package/test/spec/unit/core/bidderFactory_spec.js +66 -11
- package/test/spec/unit/core/targeting_spec.js +28 -9
- package/test/spec/unit/pbjs_api_spec.js +48 -2
|
@@ -202,6 +202,8 @@ export function newBidder(spec) {
|
|
|
202
202
|
adUnitCodesHandled[adUnitCode] = true;
|
|
203
203
|
if (metrics.measureTime('addBidResponse.validate', () => isValid(adUnitCode, bid))) {
|
|
204
204
|
addBidResponse(adUnitCode, bid);
|
|
205
|
+
} else {
|
|
206
|
+
addBidResponse.reject(adUnitCode, bid, CONSTANTS.REJECTION_REASON.INVALID)
|
|
205
207
|
}
|
|
206
208
|
}
|
|
207
209
|
|
|
@@ -262,6 +264,7 @@ export function newBidder(spec) {
|
|
|
262
264
|
bid.adapterCode = bidRequest.bidder;
|
|
263
265
|
if (isInvalidAlternateBidder(bid.bidderCode, bidRequest.bidder)) {
|
|
264
266
|
logWarn(`${bid.bidderCode} is not a registered partner or known bidder of ${bidRequest.bidder}, hence continuing without bid. If you wish to support this bidder, please mark allowAlternateBidderCodes as true in bidderSettings.`);
|
|
267
|
+
addBidResponse.reject(bidRequest.adUnitCode, bid, CONSTANTS.REJECTION_REASON.BIDDER_DISALLOWED)
|
|
265
268
|
return;
|
|
266
269
|
}
|
|
267
270
|
// creating a copy of original values as cpm and currency are modified later
|
|
@@ -272,6 +275,7 @@ export function newBidder(spec) {
|
|
|
272
275
|
addBidWithCode(bidRequest.adUnitCode, prebidBid);
|
|
273
276
|
} else {
|
|
274
277
|
logWarn(`Bidder ${spec.code} made bid for unknown request ID: ${bid.requestId}. Ignoring.`);
|
|
278
|
+
addBidResponse.reject(null, bid, CONSTANTS.REJECTION_REASON.INVALID_REQUEST_ID);
|
|
275
279
|
}
|
|
276
280
|
},
|
|
277
281
|
onCompletion: afterAllResponses,
|
|
@@ -541,24 +545,22 @@ export function getIabSubCategory(bidderCode, category) {
|
|
|
541
545
|
|
|
542
546
|
// check that the bid has a width and height set
|
|
543
547
|
function validBidSize(adUnitCode, bid, {index = auctionManager.index} = {}) {
|
|
544
|
-
if ((bid.width || parseInt(bid.width, 10) === 0) && (bid.height || parseInt(bid.height, 10) === 0)) {
|
|
545
|
-
bid.width = parseInt(bid.width, 10);
|
|
546
|
-
bid.height = parseInt(bid.height, 10);
|
|
547
|
-
return true;
|
|
548
|
-
}
|
|
549
|
-
|
|
550
548
|
const bidRequest = index.getBidRequest(bid);
|
|
551
549
|
const mediaTypes = index.getMediaTypes(bid);
|
|
552
550
|
|
|
553
551
|
const sizes = (bidRequest && bidRequest.sizes) || (mediaTypes && mediaTypes.banner && mediaTypes.banner.sizes);
|
|
554
|
-
const parsedSizes = parseSizesInput(sizes);
|
|
552
|
+
const parsedSizes = parseSizesInput(sizes).map(sz => sz.split('x').map(n => parseInt(n, 10)));
|
|
553
|
+
|
|
554
|
+
if ((bid.width || parseInt(bid.width, 10) === 0) && (bid.height || parseInt(bid.height, 10) === 0)) {
|
|
555
|
+
bid.width = parseInt(bid.width, 10);
|
|
556
|
+
bid.height = parseInt(bid.height, 10);
|
|
557
|
+
return parsedSizes.length === 0 || parsedSizes.some(([w, h]) => bid.width === w && bid.height === h);
|
|
558
|
+
}
|
|
555
559
|
|
|
556
560
|
// if a banner impression has one valid size, we assign that size to any bid
|
|
557
561
|
// response that does not explicitly set width or height
|
|
558
562
|
if (parsedSizes.length === 1) {
|
|
559
|
-
|
|
560
|
-
bid.width = parseInt(width, 10);
|
|
561
|
-
bid.height = parseInt(height, 10);
|
|
563
|
+
([bid.width, bid.height] = parsedSizes[0]);
|
|
562
564
|
return true;
|
|
563
565
|
}
|
|
564
566
|
|
|
@@ -600,7 +602,7 @@ export function isValid(adUnitCode, bid, {index = auctionManager.index} = {}) {
|
|
|
600
602
|
return false;
|
|
601
603
|
}
|
|
602
604
|
if (bid.mediaType === 'banner' && !validBidSize(adUnitCode, bid, {index})) {
|
|
603
|
-
logError(errorMessage(`Banner bids require a width and height`));
|
|
605
|
+
logError(errorMessage(`Banner bids require a width and height that match one of the requested sizes`));
|
|
604
606
|
return false;
|
|
605
607
|
}
|
|
606
608
|
|
package/src/auction.js
CHANGED
|
@@ -58,26 +58,41 @@
|
|
|
58
58
|
*/
|
|
59
59
|
|
|
60
60
|
import {
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
_each,
|
|
62
|
+
adUnitsFilter,
|
|
63
|
+
bind,
|
|
64
|
+
deepAccess,
|
|
65
|
+
flatten,
|
|
66
|
+
generateUUID,
|
|
67
|
+
getValue,
|
|
68
|
+
isEmpty,
|
|
69
|
+
isEmptyStr,
|
|
70
|
+
isFn,
|
|
71
|
+
logError,
|
|
72
|
+
logInfo,
|
|
73
|
+
logMessage,
|
|
74
|
+
logWarn,
|
|
75
|
+
parseUrl,
|
|
76
|
+
timestamp
|
|
63
77
|
} from './utils.js';
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
import {
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
78
|
+
import {getPriceBucketString} from './cpmBucketManager.js';
|
|
79
|
+
import {getNativeTargeting} from './native.js';
|
|
80
|
+
import {getCacheUrl, store} from './videoCache.js';
|
|
81
|
+
import {Renderer} from './Renderer.js';
|
|
82
|
+
import {config} from './config.js';
|
|
83
|
+
import {userSync} from './userSync.js';
|
|
84
|
+
import {hook} from './hook.js';
|
|
71
85
|
import {find, includes} from './polyfill.js';
|
|
72
|
-
import {
|
|
73
|
-
import {
|
|
86
|
+
import {OUTSTREAM} from './video.js';
|
|
87
|
+
import {VIDEO} from './mediaTypes.js';
|
|
74
88
|
import {auctionManager} from './auctionManager.js';
|
|
75
89
|
import {bidderSettings} from './bidderSettings.js';
|
|
76
|
-
import * as events from './events.js'
|
|
90
|
+
import * as events from './events.js';
|
|
77
91
|
import adapterManager from './adapterManager.js';
|
|
78
92
|
import CONSTANTS from './constants.json';
|
|
79
93
|
import {GreedyPromise} from './utils/promise.js';
|
|
80
94
|
import {useMetrics} from './utils/perfMetrics.js';
|
|
95
|
+
import {createBid} from './bidfactory.js';
|
|
81
96
|
|
|
82
97
|
const { syncUsers } = userSync;
|
|
83
98
|
|
|
@@ -119,24 +134,26 @@ export function resetAuctionState() {
|
|
|
119
134
|
*/
|
|
120
135
|
export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, auctionId, ortb2Fragments, metrics}) {
|
|
121
136
|
metrics = useMetrics(metrics);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
137
|
+
const _adUnits = adUnits;
|
|
138
|
+
const _labels = labels;
|
|
139
|
+
const _adUnitCodes = adUnitCodes;
|
|
140
|
+
const _auctionId = auctionId || generateUUID();
|
|
141
|
+
const _timeout = cbTimeout;
|
|
142
|
+
const _timelyBidders = new Set();
|
|
143
|
+
let _bidsRejected = [];
|
|
144
|
+
let _callback = callback;
|
|
125
145
|
let _bidderRequests = [];
|
|
126
146
|
let _bidsReceived = [];
|
|
127
147
|
let _noBids = [];
|
|
148
|
+
let _winningBids = [];
|
|
128
149
|
let _auctionStart;
|
|
129
150
|
let _auctionEnd;
|
|
130
|
-
let _auctionId = auctionId || generateUUID();
|
|
131
|
-
let _auctionStatus;
|
|
132
|
-
let _callback = callback;
|
|
133
151
|
let _timer;
|
|
134
|
-
let
|
|
135
|
-
let _winningBids = [];
|
|
136
|
-
let _timelyBidders = new Set();
|
|
152
|
+
let _auctionStatus;
|
|
137
153
|
|
|
138
154
|
function addBidRequests(bidderRequests) { _bidderRequests = _bidderRequests.concat(bidderRequests); }
|
|
139
155
|
function addBidReceived(bidsReceived) { _bidsReceived = _bidsReceived.concat(bidsReceived); }
|
|
156
|
+
function addBidRejected(bidsRejected) { _bidsRejected = _bidsRejected.concat(bidsRejected); }
|
|
140
157
|
function addNoBid(noBid) { _noBids = _noBids.concat(noBid); }
|
|
141
158
|
|
|
142
159
|
function getProperties() {
|
|
@@ -151,6 +168,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
|
|
|
151
168
|
bidderRequests: _bidderRequests,
|
|
152
169
|
noBids: _noBids,
|
|
153
170
|
bidsReceived: _bidsReceived,
|
|
171
|
+
bidsRejected: _bidsRejected,
|
|
154
172
|
winningBids: _winningBids,
|
|
155
173
|
timeout: _timeout,
|
|
156
174
|
metrics: metrics
|
|
@@ -352,6 +370,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
|
|
|
352
370
|
|
|
353
371
|
return {
|
|
354
372
|
addBidReceived,
|
|
373
|
+
addBidRejected,
|
|
355
374
|
addNoBid,
|
|
356
375
|
executeCallback,
|
|
357
376
|
callBids,
|
|
@@ -372,7 +391,14 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
|
|
|
372
391
|
};
|
|
373
392
|
}
|
|
374
393
|
|
|
375
|
-
|
|
394
|
+
/**
|
|
395
|
+
* Hook into this to intercept bids before they are added to an auction.
|
|
396
|
+
*
|
|
397
|
+
* @param adUnitCode
|
|
398
|
+
* @param bid
|
|
399
|
+
* @param {function(String)} reject: a function that, when called, rejects `bid` with the given reason.
|
|
400
|
+
*/
|
|
401
|
+
export const addBidResponse = hook('sync', function(adUnitCode, bid, reject) {
|
|
376
402
|
this.dispatch.call(null, adUnitCode, bid);
|
|
377
403
|
}, 'addBidResponse');
|
|
378
404
|
|
|
@@ -425,20 +451,49 @@ export function auctionCallbacks(auctionDone, auctionInstance, {index = auctionM
|
|
|
425
451
|
}
|
|
426
452
|
}
|
|
427
453
|
|
|
428
|
-
function handleBidResponse(adUnitCode, bid) {
|
|
454
|
+
function handleBidResponse(adUnitCode, bid, handler) {
|
|
429
455
|
bidResponseMap[bid.requestId] = true;
|
|
430
|
-
|
|
456
|
+
addCommonResponseProperties(bid, adUnitCode)
|
|
431
457
|
outstandingBidsAdded++;
|
|
432
|
-
|
|
458
|
+
return handler(afterBidAdded);
|
|
459
|
+
}
|
|
433
460
|
|
|
434
|
-
|
|
461
|
+
function acceptBidResponse(adUnitCode, bid) {
|
|
462
|
+
handleBidResponse(adUnitCode, bid, (done) => {
|
|
463
|
+
let bidResponse = getPreparedBidForAuction(bid);
|
|
435
464
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
465
|
+
if (bidResponse.mediaType === 'video') {
|
|
466
|
+
tryAddVideoBid(auctionInstance, bidResponse, done);
|
|
467
|
+
} else {
|
|
468
|
+
addBidToAuction(auctionInstance, bidResponse);
|
|
469
|
+
done();
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
function rejectBidResponse(adUnitCode, bid, reason) {
|
|
475
|
+
return handleBidResponse(adUnitCode, bid, (done) => {
|
|
476
|
+
// return a "NO_BID" replacement that the caller can decide to continue with
|
|
477
|
+
// TODO: remove this in v8; see https://github.com/prebid/Prebid.js/issues/8956
|
|
478
|
+
const noBid = createBid(CONSTANTS.STATUS.NO_BID, bid.getIdentifiers());
|
|
479
|
+
Object.assign(noBid, Object.fromEntries(Object.entries(bid).filter(([k]) => !noBid.hasOwnProperty(k) && ![
|
|
480
|
+
'ad',
|
|
481
|
+
'adUrl',
|
|
482
|
+
'vastXml',
|
|
483
|
+
'vastUrl',
|
|
484
|
+
'native',
|
|
485
|
+
].includes(k))));
|
|
486
|
+
noBid.status = CONSTANTS.BID_STATUS.BID_REJECTED;
|
|
487
|
+
noBid.cpm = 0;
|
|
488
|
+
|
|
489
|
+
bid.rejectionReason = reason;
|
|
490
|
+
logWarn(`Bid from ${bid.bidder || 'unknown bidder'} was rejected: ${reason}`, bid)
|
|
491
|
+
events.emit(CONSTANTS.EVENTS.BID_REJECTED, bid);
|
|
492
|
+
auctionInstance.addBidRejected(bid);
|
|
493
|
+
done();
|
|
494
|
+
|
|
495
|
+
return noBid;
|
|
496
|
+
})
|
|
442
497
|
}
|
|
443
498
|
|
|
444
499
|
function adapterDone() {
|
|
@@ -470,12 +525,24 @@ export function auctionCallbacks(auctionDone, auctionInstance, {index = auctionM
|
|
|
470
525
|
}
|
|
471
526
|
|
|
472
527
|
return {
|
|
473
|
-
addBidResponse: function (
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
528
|
+
addBidResponse: (function () {
|
|
529
|
+
function addBid(adUnitCode, bid) {
|
|
530
|
+
const bidderRequest = index.getBidderRequest(bid);
|
|
531
|
+
waitFor((bidderRequest && bidderRequest.bidderRequestId) || '', addBidResponse.call({
|
|
532
|
+
dispatch: acceptBidResponse,
|
|
533
|
+
}, adUnitCode, bid, (() => {
|
|
534
|
+
let rejection;
|
|
535
|
+
return (reason) => {
|
|
536
|
+
if (rejection == null) {
|
|
537
|
+
rejection = rejectBidResponse(adUnitCode, bid, reason);
|
|
538
|
+
}
|
|
539
|
+
return rejection;
|
|
540
|
+
}
|
|
541
|
+
})()));
|
|
542
|
+
}
|
|
543
|
+
addBid.reject = rejectBidResponse;
|
|
544
|
+
return addBid;
|
|
545
|
+
})(),
|
|
479
546
|
adapterDone: function () {
|
|
480
547
|
guard(this, adapterDone.bind(this))
|
|
481
548
|
}
|
|
@@ -492,9 +559,7 @@ export function doCallbacksIfTimedout(auctionInstance, bidResponse) {
|
|
|
492
559
|
export function addBidToAuction(auctionInstance, bidResponse) {
|
|
493
560
|
setupBidTargeting(bidResponse);
|
|
494
561
|
|
|
495
|
-
|
|
496
|
-
metrics.timeSince('addBidResponse', 'addBidResponse.total');
|
|
497
|
-
|
|
562
|
+
useMetrics(bidResponse.metrics).timeSince('addBidResponse', 'addBidResponse.total');
|
|
498
563
|
events.emit(CONSTANTS.EVENTS.BID_RESPONSE, bidResponse);
|
|
499
564
|
auctionInstance.addBidReceived(bidResponse);
|
|
500
565
|
|
|
@@ -595,35 +660,41 @@ export const callPrebidCache = hook('async', function(auctionInstance, bidRespon
|
|
|
595
660
|
batchAndStore(auctionInstance, bidResponse, afterBidAdded);
|
|
596
661
|
}, 'callPrebidCache');
|
|
597
662
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
663
|
+
/**
|
|
664
|
+
* Augment `bidResponse` with properties that are common across all bids - including rejected bids.
|
|
665
|
+
*
|
|
666
|
+
*/
|
|
667
|
+
function addCommonResponseProperties(bidResponse, adUnitCode, {index = auctionManager.index} = {}) {
|
|
668
|
+
const bidderRequest = index.getBidderRequest(bidResponse);
|
|
669
|
+
const start = (bidderRequest && bidderRequest.start) || bidResponse.requestTimestamp;
|
|
670
|
+
|
|
671
|
+
Object.assign(bidResponse, {
|
|
672
|
+
responseTimestamp: bidResponse.responseTimestamp || timestamp(),
|
|
673
|
+
requestTimestamp: bidResponse.requestTimestamp || start,
|
|
674
|
+
cpm: bidResponse.cpm || parseFloat(bidResponse.cpm) || 0,
|
|
675
|
+
bidder: bidResponse.bidder || bidResponse.bidderCode,
|
|
610
676
|
adUnitCode
|
|
611
677
|
});
|
|
612
678
|
|
|
613
|
-
|
|
679
|
+
bidResponse.timeToRespond = bidResponse.responseTimestamp - bidResponse.requestTimestamp;
|
|
680
|
+
}
|
|
614
681
|
|
|
682
|
+
/**
|
|
683
|
+
* Add additional bid response properties that are universal for all _accepted_ bids.
|
|
684
|
+
*/
|
|
685
|
+
function getPreparedBidForAuction(bid, {index = auctionManager.index} = {}) {
|
|
615
686
|
// Let listeners know that now is the time to adjust the bid, if they want to.
|
|
616
687
|
//
|
|
617
688
|
// CAREFUL: Publishers rely on certain bid properties to be available (like cpm),
|
|
618
689
|
// but others to not be set yet (like priceStrings). See #1372 and #1389.
|
|
619
|
-
events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT,
|
|
690
|
+
events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT, bid);
|
|
620
691
|
|
|
621
692
|
// a publisher-defined renderer can be used to render bids
|
|
622
|
-
const adUnitRenderer = index.getAdUnit(
|
|
693
|
+
const adUnitRenderer = index.getAdUnit(bid).renderer;
|
|
623
694
|
|
|
624
695
|
// a publisher can also define a renderer for a mediaType
|
|
625
|
-
const bidObjectMediaType =
|
|
626
|
-
const mediaTypes = index.getMediaTypes(
|
|
696
|
+
const bidObjectMediaType = bid.mediaType;
|
|
697
|
+
const mediaTypes = index.getMediaTypes(bid);
|
|
627
698
|
const bidMediaType = mediaTypes && mediaTypes[bidObjectMediaType];
|
|
628
699
|
|
|
629
700
|
var mediaTypeRenderer = bidMediaType && bidMediaType.renderer;
|
|
@@ -639,25 +710,25 @@ function getPreparedBidForAuction({adUnitCode, bid, auctionId}, {index = auction
|
|
|
639
710
|
|
|
640
711
|
if (renderer) {
|
|
641
712
|
// be aware, an adapter could already have installed the bidder, in which case this overwrite's the existing adapter
|
|
642
|
-
|
|
643
|
-
|
|
713
|
+
bid.renderer = Renderer.install({ url: renderer.url, config: renderer.options });// rename options to config, to make it consistent?
|
|
714
|
+
bid.renderer.setRender(renderer.render);
|
|
644
715
|
}
|
|
645
716
|
|
|
646
717
|
// Use the config value 'mediaTypeGranularity' if it has been defined for mediaType, else use 'customPriceBucket'
|
|
647
718
|
const mediaTypeGranularity = getMediaTypeGranularity(bid.mediaType, mediaTypes, config.getConfig('mediaTypePriceGranularity'));
|
|
648
719
|
const priceStringsObj = getPriceBucketString(
|
|
649
|
-
|
|
720
|
+
bid.cpm,
|
|
650
721
|
(typeof mediaTypeGranularity === 'object') ? mediaTypeGranularity : config.getConfig('customPriceBucket'),
|
|
651
722
|
config.getConfig('currency.granularityMultiplier')
|
|
652
723
|
);
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
return
|
|
724
|
+
bid.pbLg = priceStringsObj.low;
|
|
725
|
+
bid.pbMg = priceStringsObj.med;
|
|
726
|
+
bid.pbHg = priceStringsObj.high;
|
|
727
|
+
bid.pbAg = priceStringsObj.auto;
|
|
728
|
+
bid.pbDg = priceStringsObj.dense;
|
|
729
|
+
bid.pbCg = priceStringsObj.custom;
|
|
730
|
+
|
|
731
|
+
return bid;
|
|
661
732
|
}
|
|
662
733
|
|
|
663
734
|
function setupBidTargeting(bidObject) {
|
package/src/constants.json
CHANGED
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"BID_TIMEOUT": "bidTimeout",
|
|
30
30
|
"BID_REQUESTED": "bidRequested",
|
|
31
31
|
"BID_RESPONSE": "bidResponse",
|
|
32
|
+
"BID_REJECTED": "bidRejected",
|
|
32
33
|
"NO_BID": "noBid",
|
|
33
34
|
"BID_WON": "bidWon",
|
|
34
35
|
"BIDDER_DONE": "bidderDone",
|
|
@@ -119,6 +120,13 @@
|
|
|
119
120
|
"RENDERED": "rendered",
|
|
120
121
|
"BID_REJECTED": "bidRejected"
|
|
121
122
|
},
|
|
123
|
+
"REJECTION_REASON": {
|
|
124
|
+
"INVALID": "Bid has missing or invalid properties",
|
|
125
|
+
"INVALID_REQUEST_ID": "Invalid request ID",
|
|
126
|
+
"BIDDER_DISALLOWED": "Bidder code is not allowed by allowedAlternateBidderCodes / allowUnknownBidderCodes",
|
|
127
|
+
"FLOOR_NOT_MET": "Bid does not meet price floor",
|
|
128
|
+
"CANNOT_CONVERT_CURRENCY": "Unable to convert currency"
|
|
129
|
+
},
|
|
122
130
|
"PREBID_NATIVE_DATA_KEYS_TO_ORTB": {
|
|
123
131
|
"body": "desc",
|
|
124
132
|
"body2": "desc2",
|
package/src/cpmBucketManager.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {find} from './polyfill.js';
|
|
2
|
-
import { isEmpty } from './utils.js';
|
|
2
|
+
import { isEmpty, logWarn } from './utils.js';
|
|
3
|
+
import { config } from './config.js';
|
|
3
4
|
|
|
4
5
|
const _defaultPrecision = 2;
|
|
5
6
|
const _lgPriceConfig = {
|
|
@@ -118,6 +119,11 @@ function getCpmTarget(cpm, bucket, granularityMultiplier) {
|
|
|
118
119
|
const precision = typeof bucket.precision !== 'undefined' ? bucket.precision : _defaultPrecision;
|
|
119
120
|
const increment = bucket.increment * granularityMultiplier;
|
|
120
121
|
const bucketMin = bucket.min * granularityMultiplier;
|
|
122
|
+
let roundingFunction = Math.floor;
|
|
123
|
+
let customRoundingFunction = config.getConfig('cpmRoundingFunction');
|
|
124
|
+
if (typeof customRoundingFunction === 'function') {
|
|
125
|
+
roundingFunction = customRoundingFunction;
|
|
126
|
+
}
|
|
121
127
|
|
|
122
128
|
// start increments at the bucket min and then add bucket min back to arrive at the correct rounding
|
|
123
129
|
// note - we're padding the values to avoid using decimals in the math prior to flooring
|
|
@@ -125,10 +131,23 @@ function getCpmTarget(cpm, bucket, granularityMultiplier) {
|
|
|
125
131
|
// (eg 4.01 / 0.01 = 400.99999999999994)
|
|
126
132
|
// min precison should be 2 to move decimal place over.
|
|
127
133
|
let pow = Math.pow(10, precision + 2);
|
|
128
|
-
let
|
|
129
|
-
let cpmTarget
|
|
134
|
+
let cpmToRound = ((cpm * pow) - (bucketMin * pow)) / (increment * pow);
|
|
135
|
+
let cpmTarget;
|
|
136
|
+
let invalidRounding;
|
|
137
|
+
// It is likely that we will be passed {cpmRoundingFunction: roundingFunction()}
|
|
138
|
+
// rather than the expected {cpmRoundingFunction: roundingFunction}. Default back to floor in that case
|
|
139
|
+
try {
|
|
140
|
+
cpmTarget = (roundingFunction(cpmToRound) * increment) + bucketMin;
|
|
141
|
+
} catch (err) {
|
|
142
|
+
invalidRounding = true;
|
|
143
|
+
}
|
|
144
|
+
if (invalidRounding || typeof cpmTarget !== 'number') {
|
|
145
|
+
logWarn('Invalid rounding function passed in config');
|
|
146
|
+
cpmTarget = (Math.floor(cpmToRound) * increment) + bucketMin;
|
|
147
|
+
}
|
|
130
148
|
// force to 10 decimal places to deal with imprecise decimal/binary conversions
|
|
131
149
|
// (for example 0.1 * 3 = 0.30000000000000004)
|
|
150
|
+
|
|
132
151
|
cpmTarget = Number(cpmTarget.toFixed(10));
|
|
133
152
|
return cpmTarget.toFixed(precision);
|
|
134
153
|
}
|
package/src/native.js
CHANGED
|
@@ -449,11 +449,7 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = getNativeReq
|
|
|
449
449
|
* appropriate for sending in adserver targeting or placeholder replacement.
|
|
450
450
|
*/
|
|
451
451
|
function getAssetValue(value) {
|
|
452
|
-
|
|
453
|
-
return value.url;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
return value;
|
|
452
|
+
return value?.url || value;
|
|
457
453
|
}
|
|
458
454
|
|
|
459
455
|
function getNativeKeys(adUnit) {
|
package/src/prebid.js
CHANGED
|
@@ -36,7 +36,7 @@ import {listenMessagesFromCreative} from './secureCreatives.js';
|
|
|
36
36
|
import {userSync} from './userSync.js';
|
|
37
37
|
import {config} from './config.js';
|
|
38
38
|
import {auctionManager} from './auctionManager.js';
|
|
39
|
-
import {
|
|
39
|
+
import {isBidUsable, targeting} from './targeting.js';
|
|
40
40
|
import {hook, wrapHook} from './hook.js';
|
|
41
41
|
import {loadSession} from './debugging.js';
|
|
42
42
|
import {includes} from './polyfill.js';
|
|
@@ -296,8 +296,7 @@ $$PREBID_GLOBAL$$.getAdserverTargetingForAdUnitCodeStr = function (adunitCode) {
|
|
|
296
296
|
$$PREBID_GLOBAL$$.getHighestUnusedBidResponseForAdUnitCode = function (adunitCode) {
|
|
297
297
|
if (adunitCode) {
|
|
298
298
|
const bid = auctionManager.getAllBidsForAdUnitCode(adunitCode)
|
|
299
|
-
.filter(
|
|
300
|
-
.filter(filters.isBidNotExpired)
|
|
299
|
+
.filter(isBidUsable)
|
|
301
300
|
|
|
302
301
|
return bid.length ? bid.reduce(getHighestCpm) : {}
|
|
303
302
|
} else {
|
|
@@ -662,10 +661,10 @@ export const startAuction = hook('async', function ({ bidsBackHandler, timeout:
|
|
|
662
661
|
|
|
663
662
|
const bidders = allBidders.filter(bidder => !s2sBidders.has(bidder));
|
|
664
663
|
|
|
665
|
-
adUnit.
|
|
666
|
-
|
|
664
|
+
const tid = adUnit.ortb2Imp?.ext?.tid || generateUUID();
|
|
665
|
+
adUnit.transactionId = tid;
|
|
667
666
|
// 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.
|
|
668
|
-
deepSetValue(adUnit, 'ortb2Imp.ext.tid',
|
|
667
|
+
deepSetValue(adUnit, 'ortb2Imp.ext.tid', tid);
|
|
669
668
|
|
|
670
669
|
bidders.forEach(bidder => {
|
|
671
670
|
const adapter = bidderRegistry[bidder];
|
package/src/targeting.js
CHANGED
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
deepAccess,
|
|
3
|
+
deepClone,
|
|
4
|
+
getHighestCpm,
|
|
5
|
+
getOldestHighestCpmBid,
|
|
6
|
+
groupBy,
|
|
7
|
+
isAdUnitCodeMatchingSlot,
|
|
8
|
+
isArray,
|
|
9
|
+
isFn,
|
|
10
|
+
isGptPubadsDefined,
|
|
11
|
+
isStr,
|
|
12
|
+
logError,
|
|
13
|
+
logInfo,
|
|
14
|
+
logMessage,
|
|
15
|
+
logWarn,
|
|
16
|
+
timestamp,
|
|
17
|
+
uniques,
|
|
4
18
|
} from './utils.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {includes, find} from './polyfill.js';
|
|
19
|
+
import {config} from './config.js';
|
|
20
|
+
import {NATIVE_TARGETING_KEYS} from './native.js';
|
|
21
|
+
import {auctionManager} from './auctionManager.js';
|
|
22
|
+
import {ADPOD} from './mediaTypes.js';
|
|
23
|
+
import {hook} from './hook.js';
|
|
24
|
+
import {bidderSettings} from './bidderSettings.js';
|
|
25
|
+
import {find, includes} from './polyfill.js';
|
|
13
26
|
import CONSTANTS from './constants.json';
|
|
14
27
|
|
|
15
28
|
var pbTargetingKeys = [];
|
|
@@ -32,10 +45,17 @@ const isBidNotExpired = (bid) => (bid.responseTimestamp + bid.ttl * 1000 - TTL_B
|
|
|
32
45
|
const isUnusedBid = (bid) => bid && ((bid.status && !includes([CONSTANTS.BID_STATUS.RENDERED], bid.status)) || !bid.status);
|
|
33
46
|
|
|
34
47
|
export let filters = {
|
|
48
|
+
isActualBid(bid) {
|
|
49
|
+
return bid.getStatusCode() === CONSTANTS.STATUS.GOOD
|
|
50
|
+
},
|
|
35
51
|
isBidNotExpired,
|
|
36
52
|
isUnusedBid
|
|
37
53
|
};
|
|
38
54
|
|
|
55
|
+
export function isBidUsable(bid) {
|
|
56
|
+
return !Object.values(filters).some((predicate) => !predicate(bid));
|
|
57
|
+
}
|
|
58
|
+
|
|
39
59
|
// If two bids are found for same adUnitCode, we will use the highest one to take part in auction
|
|
40
60
|
// This can happen in case of concurrent auctions
|
|
41
61
|
// If adUnitBidLimit is set above 0 return top N number of bids
|
|
@@ -449,10 +469,7 @@ export function newTargeting(auctionManager) {
|
|
|
449
469
|
|
|
450
470
|
bidsReceived = bidsReceived
|
|
451
471
|
.filter(bid => deepAccess(bid, 'video.context') !== ADPOD)
|
|
452
|
-
.filter(
|
|
453
|
-
.filter(filters.isUnusedBid)
|
|
454
|
-
.filter(filters.isBidNotExpired)
|
|
455
|
-
;
|
|
472
|
+
.filter(isBidUsable);
|
|
456
473
|
|
|
457
474
|
return getHighestCpmBidsFromBidPool(bidsReceived, getOldestHighestCpmBid);
|
|
458
475
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// jscs:disable
|
|
2
2
|
import CONSTANTS from 'src/constants.json';
|
|
3
|
+
import {createBid} from '../../src/bidfactory.js';
|
|
3
4
|
const utils = require('src/utils.js');
|
|
4
5
|
|
|
5
6
|
function convertTargetingsFromOldToNew(targetings) {
|
|
@@ -1268,7 +1269,7 @@ export function createBidReceived({bidder, cpm, auctionId, responseTimestamp, ad
|
|
|
1268
1269
|
if (typeof status !== 'undefined') {
|
|
1269
1270
|
bid.status = status;
|
|
1270
1271
|
}
|
|
1271
|
-
return bid;
|
|
1272
|
+
return Object.assign(createBid(CONSTANTS.STATUS.GOOD), bid);
|
|
1272
1273
|
}
|
|
1273
1274
|
|
|
1274
1275
|
export function getServerTestingsAds() {
|