prebid.js 7.22.0 → 7.23.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/aaxBlockmeterRtdProvider.js +1 -0
- 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/analyticsAdapter.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/bidViewability.js +1 -1
- package/dist/bidViewabilityIO.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/browsiRtdProvider.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -0
- package/dist/cleanioRtdProvider.js +1 -1
- package/dist/concertBidAdapter.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/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/currency.js +1 -1
- package/dist/dependencies.json +19 -0
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.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/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/instreamTracking.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerVideoProvider.js +1 -0
- package/dist/kargoBidAdapter.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/multibid.js +1 -1
- package/dist/not-for-prod/prebid.js +141 -132
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxOrtbBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -0
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionRtdProvider.js +1 -0
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pbsExtensions.js +1 -0
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/priceFloors.js +1 -1
- package/dist/pubCommonId.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/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/schain.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/spotxBidAdapter.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/teadsIdSystem.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/video.js +1 -0
- package/dist/videoModule.js +1 -0
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/videojsVideoProvider.js +1 -0
- 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/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +98 -0
- package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +89 -0
- package/integrationExamples/videoModule/jwplayer/eventListeners.html +244 -0
- package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +122 -0
- package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +80 -0
- package/integrationExamples/videoModule/jwplayer/playlist.html +122 -0
- package/integrationExamples/videoModule/videojs/bidMarkedAsUsed.html +126 -0
- package/integrationExamples/videoModule/videojs/bidRequestScheduling.html +132 -0
- package/integrationExamples/videoModule/videojs/eventListeners.html +238 -0
- package/integrationExamples/videoModule/videojs/gamAdServerMediation.html +138 -0
- package/integrationExamples/videoModule/videojs/mediaMetadata.html +103 -0
- package/integrationExamples/videoModule/videojs/playlist.html +151 -0
- package/libraries/ortbConverter/README.md +378 -0
- package/libraries/ortbConverter/converter.js +135 -0
- package/libraries/ortbConverter/lib/composer.js +43 -0
- package/libraries/ortbConverter/lib/mergeProcessors.js +9 -0
- package/libraries/ortbConverter/lib/sizes.js +14 -0
- package/libraries/ortbConverter/processors/banner.js +40 -0
- package/libraries/ortbConverter/processors/default.js +167 -0
- package/libraries/ortbConverter/processors/mediaType.js +21 -0
- package/libraries/ortbConverter/processors/native.js +37 -0
- package/libraries/ortbConverter/processors/video.js +66 -0
- package/libraries/pbsExtensions/pbsExtensions.js +12 -0
- package/libraries/pbsExtensions/processors/aliases.js +17 -0
- package/libraries/pbsExtensions/processors/mediaType.js +23 -0
- package/libraries/pbsExtensions/processors/params.js +22 -0
- package/libraries/pbsExtensions/processors/pbs.js +99 -0
- package/libraries/pbsExtensions/processors/requestExtPrebid.js +30 -0
- package/libraries/pbsExtensions/processors/video.js +23 -0
- package/libraries/video/constants/enums.js +5 -0
- package/libraries/video/constants/events.js +97 -0
- package/libraries/video/constants/ortb.js +169 -0
- package/libraries/video/constants/vendorCodes.js +6 -0
- package/libraries/video/shared/eventHandler.js +18 -0
- package/libraries/video/shared/parentModule.js +82 -0
- package/libraries/video/shared/state.js +47 -0
- package/libraries/video/shared/vastXmlBuilder.js +77 -0
- package/libraries/video/shared/vastXmlEditor.js +115 -0
- package/modules/.submodules.json +6 -1
- package/modules/aaxBlockmeterRtdProvider.js +59 -0
- package/modules/aaxBlockmeterRtdProvider.md +48 -0
- package/modules/appnexusBidAdapter.js +38 -1
- package/modules/chtnwBidAdapter.js +110 -0
- package/modules/chtnwBidAdapter.md +31 -0
- package/modules/concertBidAdapter.js +44 -2
- package/modules/consentManagement.js +22 -1
- package/modules/consentManagementUsp.js +29 -7
- package/modules/criteoBidAdapter.js +25 -5
- package/modules/currency.js +9 -0
- package/modules/dgkeywordRtdProvider.js +3 -3
- package/modules/gridNMBidAdapter.js +10 -14
- package/modules/improvedigitalBidAdapter.js +191 -470
- package/modules/ixBidAdapter.js +24 -64
- package/modules/jwplayerVideoProvider.js +929 -0
- package/modules/jwplayerVideoProvider.md +25 -0
- package/modules/kargoBidAdapter.js +1 -1
- package/modules/multibid/index.js +12 -0
- package/modules/openxOrtbBidAdapter.js +120 -275
- package/modules/oxxionRtdProvider.js +119 -0
- package/modules/oxxionRtdProvider.md +48 -0
- package/modules/prebidServerBidAdapter/index.js +19 -716
- package/modules/prebidServerBidAdapter/ortbConverter.js +274 -0
- package/modules/priceFloors.js +73 -1
- package/modules/rtdModule/index.js +22 -1
- package/modules/schain.js +24 -1
- package/modules/spotxBidAdapter.js +16 -15
- package/modules/synacormediaBidAdapter.js +1 -1
- package/modules/teadsIdSystem.js +5 -0
- package/modules/userId/index.js +64 -6
- package/modules/videoModule/addingSubmodule.md +521 -0
- package/modules/videoModule/coreVideo.js +234 -0
- package/modules/videoModule/gamAdServerSubmodule.js +27 -0
- package/modules/videoModule/index.js +244 -0
- package/modules/videoModule/videoImpressionVerifier.js +206 -0
- package/modules/videojsVideoProvider.js +854 -0
- package/modules/videojsVideoProvider.md +17 -0
- package/package.json +5 -1
- package/src/adapterManager.js +56 -7
- package/src/adloader.js +2 -1
- package/src/auction.js +5 -0
- package/src/events.js +5 -1
- package/src/pbjsORTB.js +35 -0
- package/src/prebid.js +166 -145
- package/src/targeting.js +10 -2
- package/src/utils/currency.js +16 -0
- package/src/utils.js +21 -0
- package/test/spec/auctionmanager_spec.js +6 -0
- package/test/spec/modules/aaxBlockmeter_spec.js +58 -0
- package/test/spec/modules/chtnwBidAdapter_spec.js +105 -0
- package/test/spec/modules/concertBidAdapter_spec.js +56 -0
- package/test/spec/modules/consentManagementUsp_spec.js +64 -18
- package/test/spec/modules/criteoBidAdapter_spec.js +28 -0
- package/test/spec/modules/dgkeywordRtdProvider_spec.js +3 -3
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +231 -211
- package/test/spec/modules/ixBidAdapter_spec.js +230 -371
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +77 -49
- package/test/spec/modules/oxxionRtdProvider_spec.js +142 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +139 -137
- package/test/spec/modules/realTimeDataModule_spec.js +65 -0
- package/test/spec/modules/userId_spec.js +67 -1
- package/test/spec/modules/videoModule/coreVideo_spec.js +98 -0
- package/test/spec/modules/videoModule/pbVideo_spec.js +362 -0
- package/test/spec/modules/videoModule/shared/parentModule_spec.js +73 -0
- package/test/spec/modules/videoModule/shared/state_spec.js +26 -0
- package/test/spec/modules/videoModule/shared/vastXmlBuilder_spec.js +103 -0
- package/test/spec/modules/videoModule/shared/vastXmlEditor_spec.js +209 -0
- package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +846 -0
- package/test/spec/modules/videoModule/submodules/videojsVideoProvider_spec.js +391 -0
- package/test/spec/modules/videoModule/videoImpressionVerifier_spec.js +112 -0
- package/test/spec/ortbConverter/banner_spec.js +203 -0
- package/test/spec/ortbConverter/composer_spec.js +69 -0
- package/test/spec/ortbConverter/converter_spec.js +283 -0
- package/test/spec/ortbConverter/currency_spec.js +40 -0
- package/test/spec/ortbConverter/default_processors_spec.js +61 -0
- package/test/spec/ortbConverter/gdpr_spec.js +38 -0
- package/test/spec/ortbConverter/mediaTypes_spec.js +67 -0
- package/test/spec/ortbConverter/mergeProcessors_spec.js +59 -0
- package/test/spec/ortbConverter/multibid_spec.js +35 -0
- package/test/spec/ortbConverter/native_spec.js +95 -0
- package/test/spec/ortbConverter/pbjsORTB_spec.js +67 -0
- package/test/spec/ortbConverter/pbsExtensions/aliases_spec.js +57 -0
- package/test/spec/ortbConverter/pbsExtensions/params_spec.js +96 -0
- package/test/spec/ortbConverter/pbsExtensions/video_spec.js +52 -0
- package/test/spec/ortbConverter/priceFloors_spec.js +143 -0
- package/test/spec/ortbConverter/schain_spec.js +33 -0
- package/test/spec/ortbConverter/userId_spec.js +21 -0
- package/test/spec/ortbConverter/usp_spec.js +15 -0
- package/test/spec/ortbConverter/video_spec.js +189 -0
- package/test/spec/unit/core/adapterManager_spec.js +102 -0
- package/test/spec/unit/core/targeting_spec.js +34 -0
- package/test/spec/unit/pbjs_api_spec.js +108 -45
- package/test/spec/utils_spec.js +45 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Video.js Video Provider
|
|
4
|
+
Module Type: Video Submodule
|
|
5
|
+
Video Player: video.js
|
|
6
|
+
Player website: https://videojs.com/
|
|
7
|
+
Maintainer: Prebid Video Task Force
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Video provider to connect the Prebid Video Module to video.js.
|
|
12
|
+
|
|
13
|
+
# Requirements
|
|
14
|
+
|
|
15
|
+
- Your page must include a build of video.js. For instructions see https://videojs.com/getting-started .
|
|
16
|
+
- Your video.js instance must include the Google IMA plugin.
|
|
17
|
+
- The Google IMA plugin must be accessible publicly in order for the Video.js Video Provider to reference it.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prebid.js",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.23.0",
|
|
4
4
|
"description": "Header Bidding Management Library",
|
|
5
5
|
"main": "src/prebid.js",
|
|
6
6
|
"scripts": {
|
|
@@ -105,6 +105,10 @@
|
|
|
105
105
|
"through2": "^4.0.2",
|
|
106
106
|
"url": "^0.11.0",
|
|
107
107
|
"url-parse": "^1.0.5",
|
|
108
|
+
"video.js": "^7.17.0",
|
|
109
|
+
"videojs-contrib-ads": "^6.9.0",
|
|
110
|
+
"videojs-ima": "^1.11.0",
|
|
111
|
+
"videojs-playlist": "^5.0.0",
|
|
108
112
|
"webdriverio": "^7.6.1",
|
|
109
113
|
"webpack": "^5.70.0",
|
|
110
114
|
"webpack-bundle-analyzer": "^4.5.0",
|
package/src/adapterManager.js
CHANGED
|
@@ -35,6 +35,7 @@ import {GdprConsentHandler, UspConsentHandler} from './consentHandler.js';
|
|
|
35
35
|
import * as events from './events.js';
|
|
36
36
|
import CONSTANTS from './constants.json';
|
|
37
37
|
import {useMetrics} from './utils/perfMetrics.js';
|
|
38
|
+
import {auctionManager} from './auctionManager.js';
|
|
38
39
|
|
|
39
40
|
export const PARTITIONS = {
|
|
40
41
|
CLIENT: 'client',
|
|
@@ -553,19 +554,30 @@ adapterManager.getAnalyticsAdapter = function(code) {
|
|
|
553
554
|
return _analyticsRegistry[code];
|
|
554
555
|
}
|
|
555
556
|
|
|
556
|
-
function
|
|
557
|
+
function getBidderMethod(bidder, method) {
|
|
558
|
+
const adapter = _bidderRegistry[bidder];
|
|
559
|
+
const spec = adapter?.getSpec && adapter.getSpec();
|
|
560
|
+
if (spec && spec[method] && typeof spec[method] === 'function') {
|
|
561
|
+
return [spec, spec[method]]
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
function invokeBidderMethod(bidder, method, spec, fn, ...params) {
|
|
557
566
|
try {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
if (spec && spec[method] && typeof spec[method] === 'function') {
|
|
561
|
-
logInfo(`Invoking ${bidder}.${method}`);
|
|
562
|
-
config.runWithBidder(bidder, bind.call(spec[method], spec, param));
|
|
563
|
-
}
|
|
567
|
+
logInfo(`Invoking ${bidder}.${method}`);
|
|
568
|
+
config.runWithBidder(bidder, fn.bind(spec, ...params));
|
|
564
569
|
} catch (e) {
|
|
565
570
|
logWarn(`Error calling ${method} of ${bidder}`);
|
|
566
571
|
}
|
|
567
572
|
}
|
|
568
573
|
|
|
574
|
+
function tryCallBidderMethod(bidder, method, param) {
|
|
575
|
+
const target = getBidderMethod(bidder, method);
|
|
576
|
+
if (target != null) {
|
|
577
|
+
invokeBidderMethod(bidder, method, ...target, param);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
569
581
|
adapterManager.callTimedOutBidders = function(adUnits, timedOutBidders, cbTimeout) {
|
|
570
582
|
timedOutBidders = timedOutBidders.map((timedOutBidder) => {
|
|
571
583
|
// Adding user configured params & timeout to timeout event data
|
|
@@ -600,4 +612,41 @@ adapterManager.callBidderError = function(bidder, error, bidderRequest) {
|
|
|
600
612
|
tryCallBidderMethod(bidder, 'onBidderError', param);
|
|
601
613
|
};
|
|
602
614
|
|
|
615
|
+
function resolveAlias(alias) {
|
|
616
|
+
const seen = new Set();
|
|
617
|
+
while (_aliasRegistry.hasOwnProperty(alias) && !seen.has(alias)) {
|
|
618
|
+
seen.add(alias);
|
|
619
|
+
alias = _aliasRegistry[alias];
|
|
620
|
+
}
|
|
621
|
+
return alias;
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Ask every adapter to delete PII.
|
|
625
|
+
* See https://github.com/prebid/Prebid.js/issues/9081
|
|
626
|
+
*/
|
|
627
|
+
adapterManager.callDataDeletionRequest = hook('sync', function (...args) {
|
|
628
|
+
const method = 'onDataDeletionRequest';
|
|
629
|
+
Object.keys(_bidderRegistry)
|
|
630
|
+
.filter((bidder) => !_aliasRegistry.hasOwnProperty(bidder))
|
|
631
|
+
.forEach(bidder => {
|
|
632
|
+
const target = getBidderMethod(bidder, method);
|
|
633
|
+
if (target != null) {
|
|
634
|
+
const bidderRequests = auctionManager.getBidsRequested().filter((br) =>
|
|
635
|
+
resolveAlias(br.bidderCode) === bidder
|
|
636
|
+
);
|
|
637
|
+
invokeBidderMethod(bidder, method, ...target, bidderRequests, ...args);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
Object.entries(_analyticsRegistry).forEach(([name, entry]) => {
|
|
641
|
+
const fn = entry?.adapter?.[method];
|
|
642
|
+
if (typeof fn === 'function') {
|
|
643
|
+
try {
|
|
644
|
+
fn.apply(entry.adapter, args);
|
|
645
|
+
} catch (e) {
|
|
646
|
+
logError(`error calling ${method} of ${name}`, e);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
|
|
603
652
|
export default adapterManager;
|
package/src/adloader.js
CHANGED
package/src/auction.js
CHANGED
|
@@ -666,6 +666,7 @@ export const callPrebidCache = hook('async', function(auctionInstance, bidRespon
|
|
|
666
666
|
*/
|
|
667
667
|
function addCommonResponseProperties(bidResponse, adUnitCode, {index = auctionManager.index} = {}) {
|
|
668
668
|
const bidderRequest = index.getBidderRequest(bidResponse);
|
|
669
|
+
const adUnit = index.getAdUnit(bidResponse);
|
|
669
670
|
const start = (bidderRequest && bidderRequest.start) || bidResponse.requestTimestamp;
|
|
670
671
|
|
|
671
672
|
Object.assign(bidResponse, {
|
|
@@ -676,6 +677,10 @@ function addCommonResponseProperties(bidResponse, adUnitCode, {index = auctionMa
|
|
|
676
677
|
adUnitCode
|
|
677
678
|
});
|
|
678
679
|
|
|
680
|
+
if (adUnit?.ttlBuffer != null) {
|
|
681
|
+
bidResponse.ttlBuffer = adUnit.ttlBuffer;
|
|
682
|
+
}
|
|
683
|
+
|
|
679
684
|
bidResponse.timeToRespond = bidResponse.responseTimestamp - bidResponse.requestTimestamp;
|
|
680
685
|
}
|
|
681
686
|
|
package/src/events.js
CHANGED
|
@@ -133,6 +133,10 @@ const _public = (function () {
|
|
|
133
133
|
return _handlers;
|
|
134
134
|
};
|
|
135
135
|
|
|
136
|
+
_public.addEvents = function (events) {
|
|
137
|
+
allEvents = allEvents.concat(events);
|
|
138
|
+
}
|
|
139
|
+
|
|
136
140
|
/**
|
|
137
141
|
* This method can return a copy of all the events fired
|
|
138
142
|
* @return {Array} array of events fired
|
|
@@ -152,4 +156,4 @@ const _public = (function () {
|
|
|
152
156
|
|
|
153
157
|
utils._setEventEmitter(_public.emit.bind(_public));
|
|
154
158
|
|
|
155
|
-
export const {on, off, get, getEvents, emit} = _public;
|
|
159
|
+
export const {on, off, get, getEvents, emit, addEvents} = _public;
|
package/src/pbjsORTB.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const PROCESSOR_TYPES = ['request', 'imp', 'bidResponse', 'response'];
|
|
2
|
+
export const PROCESSOR_DIALECTS = ['default', 'pbs'];
|
|
3
|
+
export const [REQUEST, IMP, BID_RESPONSE, RESPONSE] = PROCESSOR_TYPES;
|
|
4
|
+
export const [DEFAULT, PBS] = PROCESSOR_DIALECTS;
|
|
5
|
+
|
|
6
|
+
const types = new Set(PROCESSOR_TYPES);
|
|
7
|
+
|
|
8
|
+
export function processorRegistry() {
|
|
9
|
+
const processors = {};
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
registerOrtbProcessor({type, name, fn, priority = 0, dialects = [DEFAULT]}) {
|
|
13
|
+
if (!types.has(type)) {
|
|
14
|
+
throw new Error(`ORTB processor type must be one of: ${PROCESSOR_TYPES.join(', ')}`)
|
|
15
|
+
}
|
|
16
|
+
dialects.forEach(dialect => {
|
|
17
|
+
if (!processors.hasOwnProperty(dialect)) {
|
|
18
|
+
processors[dialect] = {};
|
|
19
|
+
}
|
|
20
|
+
if (!processors[dialect].hasOwnProperty(type)) {
|
|
21
|
+
processors[dialect][type] = {};
|
|
22
|
+
}
|
|
23
|
+
processors[dialect][type][name] = {
|
|
24
|
+
priority,
|
|
25
|
+
fn
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
},
|
|
29
|
+
getProcessors(dialect) {
|
|
30
|
+
return processors[dialect] || {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const {registerOrtbProcessor, getProcessors} = processorRegistry();
|
package/src/prebid.js
CHANGED
|
@@ -485,86 +485,99 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
|
|
|
485
485
|
logInfo('Invoking $$PREBID_GLOBAL$$.renderAd', arguments);
|
|
486
486
|
logMessage('Calling renderAd with adId :' + id);
|
|
487
487
|
|
|
488
|
-
if (
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
if (bid) {
|
|
494
|
-
let shouldRender = true;
|
|
495
|
-
if (bid && bid.status === CONSTANTS.BID_STATUS.RENDERED) {
|
|
496
|
-
logWarn(`Ad id ${bid.adId} has been rendered before`);
|
|
497
|
-
events.emit(STALE_RENDER, bid);
|
|
498
|
-
if (deepAccess(config.getConfig('auctionOptions'), 'suppressStaleRender')) {
|
|
499
|
-
shouldRender = false;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
488
|
+
if (!id) {
|
|
489
|
+
const message = `Error trying to write ad Id :${id} to the page. Missing adId`;
|
|
490
|
+
emitAdRenderFail({ reason: MISSING_DOC_OR_ADID, message, id });
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
502
493
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
// emit 'bid won' event here
|
|
518
|
-
events.emit(BID_WON, bid);
|
|
519
|
-
|
|
520
|
-
const {height, width, ad, mediaType, adUrl, renderer} = bid;
|
|
521
|
-
|
|
522
|
-
const creativeComment = document.createComment(`Creative ${bid.creativeId} served by ${bid.bidder} Prebid.js Header Bidding`);
|
|
523
|
-
insertElement(creativeComment, doc, 'html');
|
|
524
|
-
|
|
525
|
-
if (isRendererRequired(renderer)) {
|
|
526
|
-
executeRenderer(renderer, bid, doc);
|
|
527
|
-
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
528
|
-
emitAdRenderSucceeded({ doc, bid, id });
|
|
529
|
-
} else if ((doc === document && !inIframe()) || mediaType === 'video') {
|
|
530
|
-
const message = `Error trying to write ad. Ad render call ad id ${id} was prevented from writing to the main document.`;
|
|
531
|
-
emitAdRenderFail({reason: PREVENT_WRITING_ON_MAIN_DOCUMENT, message, bid, id});
|
|
532
|
-
} else if (ad) {
|
|
533
|
-
doc.write(ad);
|
|
534
|
-
doc.close();
|
|
535
|
-
setRenderSize(doc, width, height);
|
|
536
|
-
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
537
|
-
callBurl(bid);
|
|
538
|
-
emitAdRenderSucceeded({ doc, bid, id });
|
|
539
|
-
} else if (adUrl) {
|
|
540
|
-
const iframe = createInvisibleIframe();
|
|
541
|
-
iframe.height = height;
|
|
542
|
-
iframe.width = width;
|
|
543
|
-
iframe.style.display = 'inline';
|
|
544
|
-
iframe.style.overflow = 'hidden';
|
|
545
|
-
iframe.src = adUrl;
|
|
546
|
-
|
|
547
|
-
insertElement(iframe, doc, 'body');
|
|
548
|
-
setRenderSize(doc, width, height);
|
|
549
|
-
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
550
|
-
callBurl(bid);
|
|
551
|
-
emitAdRenderSucceeded({ doc, bid, id });
|
|
552
|
-
} else {
|
|
553
|
-
const message = `Error trying to write ad. No ad for bid response id: ${id}`;
|
|
554
|
-
emitAdRenderFail({reason: NO_AD, message, bid, id});
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
} else {
|
|
558
|
-
const message = `Error trying to write ad. Cannot find ad by given id : ${id}`;
|
|
559
|
-
emitAdRenderFail({ reason: CANNOT_FIND_AD, message, id });
|
|
494
|
+
try {
|
|
495
|
+
// lookup ad by ad Id
|
|
496
|
+
const bid = auctionManager.findBidByAdId(id);
|
|
497
|
+
if (!bid) {
|
|
498
|
+
const message = `Error trying to write ad. Cannot find ad by given id : ${id}`;
|
|
499
|
+
emitAdRenderFail({ reason: CANNOT_FIND_AD, message, id });
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (bid.status === CONSTANTS.BID_STATUS.RENDERED) {
|
|
504
|
+
logWarn(`Ad id ${bid.adId} has been rendered before`);
|
|
505
|
+
events.emit(STALE_RENDER, bid);
|
|
506
|
+
if (deepAccess(config.getConfig('auctionOptions'), 'suppressStaleRender')) {
|
|
507
|
+
return;
|
|
560
508
|
}
|
|
561
|
-
} catch (e) {
|
|
562
|
-
const message = `Error trying to write ad Id :${id} to the page:${e.message}`;
|
|
563
|
-
emitAdRenderFail({ reason: EXCEPTION, message, id });
|
|
564
509
|
}
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
510
|
+
|
|
511
|
+
// replace macros according to openRTB with price paid = bid.cpm
|
|
512
|
+
bid.ad = replaceAuctionPrice(bid.ad, bid.originalCpm || bid.cpm);
|
|
513
|
+
bid.adUrl = replaceAuctionPrice(bid.adUrl, bid.originalCpm || bid.cpm);
|
|
514
|
+
// replacing clickthrough if submitted
|
|
515
|
+
if (options && options.clickThrough) {
|
|
516
|
+
const {clickThrough} = options;
|
|
517
|
+
bid.ad = replaceClickThrough(bid.ad, clickThrough);
|
|
518
|
+
bid.adUrl = replaceClickThrough(bid.adUrl, clickThrough);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// save winning bids
|
|
522
|
+
auctionManager.addWinningBid(bid);
|
|
523
|
+
|
|
524
|
+
// emit 'bid won' event here
|
|
525
|
+
events.emit(BID_WON, bid);
|
|
526
|
+
|
|
527
|
+
const {height, width, ad, mediaType, adUrl, renderer} = bid;
|
|
528
|
+
|
|
529
|
+
// video module
|
|
530
|
+
const adUnitCode = bid.adUnitCode;
|
|
531
|
+
const adUnit = $$PREBID_GLOBAL$$.adUnits.filter(adUnit => adUnit.code === adUnitCode);
|
|
532
|
+
const videoModule = $$PREBID_GLOBAL$$.videoModule;
|
|
533
|
+
if (adUnit.video && videoModule) {
|
|
534
|
+
videoModule.renderBid(adUnit.video.divId, bid);
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
if (!doc) {
|
|
539
|
+
const message = `Error trying to write ad Id :${id} to the page. Missing document`;
|
|
540
|
+
emitAdRenderFail({ reason: MISSING_DOC_OR_ADID, message, id });
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
const creativeComment = document.createComment(`Creative ${bid.creativeId} served by ${bid.bidder} Prebid.js Header Bidding`);
|
|
545
|
+
insertElement(creativeComment, doc, 'html');
|
|
546
|
+
|
|
547
|
+
if (isRendererRequired(renderer)) {
|
|
548
|
+
executeRenderer(renderer, bid, doc);
|
|
549
|
+
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
550
|
+
emitAdRenderSucceeded({ doc, bid, id });
|
|
551
|
+
} else if ((doc === document && !inIframe()) || mediaType === 'video') {
|
|
552
|
+
const message = `Error trying to write ad. Ad render call ad id ${id} was prevented from writing to the main document.`;
|
|
553
|
+
emitAdRenderFail({reason: PREVENT_WRITING_ON_MAIN_DOCUMENT, message, bid, id});
|
|
554
|
+
} else if (ad) {
|
|
555
|
+
doc.write(ad);
|
|
556
|
+
doc.close();
|
|
557
|
+
setRenderSize(doc, width, height);
|
|
558
|
+
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
559
|
+
callBurl(bid);
|
|
560
|
+
emitAdRenderSucceeded({ doc, bid, id });
|
|
561
|
+
} else if (adUrl) {
|
|
562
|
+
const iframe = createInvisibleIframe();
|
|
563
|
+
iframe.height = height;
|
|
564
|
+
iframe.width = width;
|
|
565
|
+
iframe.style.display = 'inline';
|
|
566
|
+
iframe.style.overflow = 'hidden';
|
|
567
|
+
iframe.src = adUrl;
|
|
568
|
+
|
|
569
|
+
insertElement(iframe, doc, 'body');
|
|
570
|
+
setRenderSize(doc, width, height);
|
|
571
|
+
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
572
|
+
callBurl(bid);
|
|
573
|
+
emitAdRenderSucceeded({ doc, bid, id });
|
|
574
|
+
} else {
|
|
575
|
+
const message = `Error trying to write ad. No ad for bid response id: ${id}`;
|
|
576
|
+
emitAdRenderFail({reason: NO_AD, message, bid, id});
|
|
577
|
+
}
|
|
578
|
+
} catch (e) {
|
|
579
|
+
const message = `Error trying to write ad Id :${id} to the page:${e.message}`;
|
|
580
|
+
emitAdRenderFail({ reason: EXCEPTION, message, id });
|
|
568
581
|
}
|
|
569
582
|
});
|
|
570
583
|
|
|
@@ -609,7 +622,7 @@ $$PREBID_GLOBAL$$.removeAdUnit = function (adUnitCode) {
|
|
|
609
622
|
* @alias module:pbjs.requestBids
|
|
610
623
|
*/
|
|
611
624
|
$$PREBID_GLOBAL$$.requestBids = (function() {
|
|
612
|
-
const delegate = hook('
|
|
625
|
+
const delegate = hook('sync', function ({ bidsBackHandler, timeout, adUnits, adUnitCodes, labels, auctionId, ttlBuffer, ortb2, metrics } = {}) {
|
|
613
626
|
events.emit(REQUEST_BIDS);
|
|
614
627
|
const cbTimeout = timeout || config.getConfig('bidderTimeout');
|
|
615
628
|
logInfo('Invoking $$PREBID_GLOBAL$$.requestBids', arguments);
|
|
@@ -617,7 +630,7 @@ $$PREBID_GLOBAL$$.requestBids = (function() {
|
|
|
617
630
|
global: mergeDeep({}, config.getAnyConfig('ortb2') || {}, ortb2 || {}),
|
|
618
631
|
bidder: Object.fromEntries(Object.entries(config.getBidderConfig()).map(([bidder, cfg]) => [bidder, cfg.ortb2]).filter(([_, ortb2]) => ortb2 != null))
|
|
619
632
|
}
|
|
620
|
-
return startAuction({bidsBackHandler, timeout: cbTimeout, adUnits, adUnitCodes, labels, auctionId, ortb2Fragments, metrics});
|
|
633
|
+
return startAuction({bidsBackHandler, timeout: cbTimeout, adUnits, adUnitCodes, labels, auctionId, ttlBuffer, ortb2Fragments, metrics});
|
|
621
634
|
}, 'requestBids');
|
|
622
635
|
|
|
623
636
|
return wrapHook(delegate, function requestBids(req = {}) {
|
|
@@ -633,7 +646,7 @@ $$PREBID_GLOBAL$$.requestBids = (function() {
|
|
|
633
646
|
});
|
|
634
647
|
})();
|
|
635
648
|
|
|
636
|
-
export const startAuction = hook('
|
|
649
|
+
export const startAuction = hook('sync', function ({ bidsBackHandler, timeout: cbTimeout, adUnits, ttlBuffer, adUnitCodes, labels, auctionId, ortb2Fragments, metrics } = {}) {
|
|
637
650
|
const s2sBidders = getS2SBidderSet(config.getConfig('s2sConfig') || []);
|
|
638
651
|
adUnits = useMetrics(metrics).measureTime('requestBids.validate', () => checkAdUnitSetup(adUnits));
|
|
639
652
|
|
|
@@ -645,77 +658,85 @@ export const startAuction = hook('async', function ({ bidsBackHandler, timeout:
|
|
|
645
658
|
adUnitCodes = adUnits && adUnits.map(unit => unit.code);
|
|
646
659
|
}
|
|
647
660
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
const adUnitMediaTypes = Object.keys(adUnit.mediaTypes || { 'banner': 'banner' });
|
|
657
|
-
|
|
658
|
-
// get the bidder's mediaTypes
|
|
659
|
-
const allBidders = adUnit.bids.map(bid => bid.bidder);
|
|
660
|
-
const bidderRegistry = adapterManager.bidderRegistry;
|
|
661
|
-
|
|
662
|
-
const bidders = allBidders.filter(bidder => !s2sBidders.has(bidder));
|
|
663
|
-
|
|
664
|
-
const tid = adUnit.ortb2Imp?.ext?.tid || generateUUID();
|
|
665
|
-
adUnit.transactionId = tid;
|
|
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.
|
|
667
|
-
deepSetValue(adUnit, 'ortb2Imp.ext.tid', tid);
|
|
668
|
-
|
|
669
|
-
bidders.forEach(bidder => {
|
|
670
|
-
const adapter = bidderRegistry[bidder];
|
|
671
|
-
const spec = adapter && adapter.getSpec && adapter.getSpec();
|
|
672
|
-
// banner is default if not specified in spec
|
|
673
|
-
const bidderMediaTypes = (spec && spec.supportedMediaTypes) || ['banner'];
|
|
674
|
-
|
|
675
|
-
// check if the bidder's mediaTypes are not in the adUnit's mediaTypes
|
|
676
|
-
const bidderEligible = adUnitMediaTypes.some(type => includes(bidderMediaTypes, type));
|
|
677
|
-
if (!bidderEligible) {
|
|
678
|
-
// drop the bidder from the ad unit if it's not compatible
|
|
679
|
-
logWarn(unsupportedBidderMessage(adUnit, bidder));
|
|
680
|
-
adUnit.bids = adUnit.bids.filter(bid => bid.bidder !== bidder);
|
|
681
|
-
} else {
|
|
682
|
-
adunitCounter.incrementBidderRequestsCounter(adUnit.code, bidder);
|
|
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
|
+
}
|
|
683
669
|
}
|
|
670
|
+
resolve({bids, timedOut, auctionId});
|
|
671
|
+
}
|
|
672
|
+
|
|
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;
|
|
693
|
+
}
|
|
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);
|
|
684
714
|
});
|
|
685
|
-
adunitCounter.incrementRequestsCounter(adUnit.code);
|
|
686
|
-
});
|
|
687
715
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
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);
|
|
696
734
|
}
|
|
697
|
-
}
|
|
698
|
-
return;
|
|
699
|
-
}
|
|
700
735
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
callback: bidsBackHandler,
|
|
705
|
-
cbTimeout,
|
|
706
|
-
labels,
|
|
707
|
-
auctionId,
|
|
708
|
-
ortb2Fragments,
|
|
709
|
-
metrics,
|
|
736
|
+
adUnitCodes.forEach(code => targeting.setLatestAuctionForAdUnit(code, auction.getAuctionId()));
|
|
737
|
+
auction.callBids();
|
|
738
|
+
}
|
|
710
739
|
});
|
|
711
|
-
|
|
712
|
-
let adUnitsLen = adUnits.length;
|
|
713
|
-
if (adUnitsLen > 15) {
|
|
714
|
-
logInfo(`Current auction ${auction.getAuctionId()} contains ${adUnitsLen} adUnits.`, adUnits);
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
adUnitCodes.forEach(code => targeting.setLatestAuctionForAdUnit(code, auction.getAuctionId()));
|
|
718
|
-
auction.callBids();
|
|
719
740
|
}, 'startAuction');
|
|
720
741
|
|
|
721
742
|
export function executeCallbacks(fn, reqBidsConfigObj) {
|
package/src/targeting.js
CHANGED
|
@@ -28,7 +28,15 @@ import CONSTANTS from './constants.json';
|
|
|
28
28
|
var pbTargetingKeys = [];
|
|
29
29
|
|
|
30
30
|
const MAX_DFP_KEYLENGTH = 20;
|
|
31
|
-
|
|
31
|
+
let DEFAULT_TTL_BUFFER = 1;
|
|
32
|
+
|
|
33
|
+
config.getConfig('ttlBuffer', (cfg) => {
|
|
34
|
+
if (typeof cfg.ttlBuffer === 'number') {
|
|
35
|
+
DEFAULT_TTL_BUFFER = cfg.ttlBuffer;
|
|
36
|
+
} else {
|
|
37
|
+
logError('Invalid value for ttlBuffer', cfg.ttlBuffer);
|
|
38
|
+
}
|
|
39
|
+
})
|
|
32
40
|
|
|
33
41
|
const CFG_ALLOW_TARGETING_KEYS = `targetingControls.allowTargetingKeys`;
|
|
34
42
|
const CFG_ADD_TARGETING_KEYS = `targetingControls.addTargetingKeys`;
|
|
@@ -39,7 +47,7 @@ export const TARGETING_KEYS = Object.keys(CONSTANTS.TARGETING_KEYS).map(
|
|
|
39
47
|
);
|
|
40
48
|
|
|
41
49
|
// return unexpired bids
|
|
42
|
-
const isBidNotExpired = (bid) => (bid.responseTimestamp + bid.ttl
|
|
50
|
+
const isBidNotExpired = (bid) => (bid.responseTimestamp + (bid.ttl - (bid.hasOwnProperty('ttlBuffer') ? bid.ttlBuffer : DEFAULT_TTL_BUFFER)) * 1000) > timestamp();
|
|
43
51
|
|
|
44
52
|
// return bids whose status is not set. Winning bids can only have a status of `rendered`.
|
|
45
53
|
const isUnusedBid = (bid) => bid && ((bid.status && !includes([CONSTANTS.BID_STATUS.RENDERED], bid.status)) || !bid.status);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {getGlobal} from '../prebidGlobal.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* "best effort" wrapper around currency conversion; always returns an amount that may or may not be correct.
|
|
5
|
+
*/
|
|
6
|
+
export function beConvertCurrency(amount, from, to) {
|
|
7
|
+
if (from === to) return amount;
|
|
8
|
+
let result = amount;
|
|
9
|
+
if (typeof getGlobal().convertCurrency === 'function') {
|
|
10
|
+
try {
|
|
11
|
+
result = getGlobal().convertCurrency(amount, from, to);
|
|
12
|
+
} catch (e) {
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
package/src/utils.js
CHANGED
|
@@ -1377,6 +1377,27 @@ export function safeJSONParse(data) {
|
|
|
1377
1377
|
} catch (e) {}
|
|
1378
1378
|
}
|
|
1379
1379
|
|
|
1380
|
+
/**
|
|
1381
|
+
* Returns a memoized version of `fn`.
|
|
1382
|
+
*
|
|
1383
|
+
* @param fn
|
|
1384
|
+
* @param key cache key generator, invoked with the same arguments passed to `fn`.
|
|
1385
|
+
* By default, the first argument is used as key.
|
|
1386
|
+
* @return {function(): any}
|
|
1387
|
+
*/
|
|
1388
|
+
export function memoize(fn, key = function (arg) { return arg; }) {
|
|
1389
|
+
const cache = new Map();
|
|
1390
|
+
const memoized = function () {
|
|
1391
|
+
const cacheKey = key.apply(this, arguments);
|
|
1392
|
+
if (!cache.has(cacheKey)) {
|
|
1393
|
+
cache.set(cacheKey, fn.apply(this, arguments));
|
|
1394
|
+
}
|
|
1395
|
+
return cache.get(cacheKey);
|
|
1396
|
+
}
|
|
1397
|
+
memoized.clear = cache.clear.bind(cache);
|
|
1398
|
+
return memoized;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1380
1401
|
/**
|
|
1381
1402
|
* Sets dataset attributes on a script
|
|
1382
1403
|
* @param {Script} script
|
|
@@ -955,6 +955,12 @@ describe('auctionmanager.js', function () {
|
|
|
955
955
|
const addedBid = find(auction.getBidsReceived(), bid => bid.adUnitCode == ADUNIT_CODE);
|
|
956
956
|
assert.equal(addedBid.renderer.url, 'renderer.js');
|
|
957
957
|
});
|
|
958
|
+
|
|
959
|
+
it('sets bidResponse.ttlBuffer from adUnit.ttlBuffer', () => {
|
|
960
|
+
adUnits[0].ttlBuffer = 0;
|
|
961
|
+
auction.callBids();
|
|
962
|
+
expect(auction.getBidsReceived()[0].ttlBuffer).to.eql(0);
|
|
963
|
+
});
|
|
958
964
|
});
|
|
959
965
|
|
|
960
966
|
describe('when auction timeout is 20', function () {
|