prebid.js 7.10.0 → 7.13.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/.github/PULL_REQUEST_TEMPLATE.md +16 -10
- package/.github/codeql/codeql-config.yml +4 -0
- package/.github/workflows/codeql-analysis.yml +73 -0
- package/.github/workflows/issue_tracker.yml +1 -1
- package/README.md +0 -2
- package/babelConfig.js +10 -4
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/acuityAdsBidAdapter.js +1 -0
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adriverBidAdapter.js +1 -1
- package/dist/adriverIdSystem.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -0
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/alkimiBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/aniviewBidAdapter.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/audiencerunBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/betweenBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bluebillywigBidAdapter.js +1 -1
- package/dist/brandmetricsRtdProvider.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/browsiRtdProvider.js +1 -1
- 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/cpmstarBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/currency.js +1 -1
- package/dist/datawrkzBidAdapter.js +1 -0
- package/dist/debugging-standalone.js +1 -1
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/displayioBidAdapter.js +1 -3
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/enrichmentFpdModule.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/imRtdProvider.js +1 -1
- package/dist/impactifyBidAdapter.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/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- 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 -0
- package/dist/limelightDigitalBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.js +1 -0
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediagoBidAdapter.js +1 -0
- package/dist/mediakeysBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +153 -147
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/oneKeyIdSystem.js +1 -0
- package/dist/oneKeyRtdProvider.js +1 -0
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +2 -2
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.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/rasBidAdapter.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/rtbhouseBidAdapter.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/tappxBidAdapter.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/trustpidSystem.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/viewability.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/dist/zeta_global_sspBidAdapter.js +1 -1
- package/integrationExamples/gpt/permutiveRtdProvider_example.html +1 -1
- package/karma.conf.maker.js +2 -13
- package/modules/.submodules.json +2 -0
- package/modules/acuityAdsBidAdapter.js +207 -0
- package/modules/acuityAdsBidAdapter.md +79 -0
- package/modules/adagioBidAdapter.js +2 -3
- package/modules/adgenerationBidAdapter.js +2 -2
- package/modules/adkernelBidAdapter.js +28 -12
- package/modules/admixerBidAdapter.js +1 -1
- package/modules/adnowBidAdapter.js +1 -1
- package/modules/adpod.js +1 -1
- package/modules/adrelevantisBidAdapter.js +2 -2
- package/modules/adriverBidAdapter.js +5 -12
- package/modules/adriverIdSystem.js +2 -1
- package/modules/adtargetBidAdapter.js +1 -1
- package/modules/adtelligentBidAdapter.js +6 -2
- package/modules/adtrgtmeBidAdapter.js +333 -0
- package/modules/adtrgtmeBidAdapter.md +69 -0
- package/modules/adtrueBidAdapter.js +1 -1
- package/modules/adxpremiumAnalyticsAdapter.js +1 -1
- package/modules/adyoulikeBidAdapter.js +1 -1
- package/modules/alkimiBidAdapter.js +2 -1
- package/modules/aniviewBidAdapter.js +1 -1
- package/modules/appnexusBidAdapter.js +13 -93
- package/modules/apstreamBidAdapter.js +2 -2
- package/modules/beopBidAdapter.js +4 -4
- package/modules/betweenBidAdapter.js +4 -4
- package/modules/bidwatchAnalyticsAdapter.js +112 -59
- package/modules/bizzclickBidAdapter.js +1 -1
- package/modules/brightMountainMediaBidAdapter.js +1 -1
- package/modules/browsiRtdProvider.js +24 -10
- package/modules/cleanmedianetBidAdapter.js +1 -1
- package/modules/consentManagement.js +1 -1
- package/modules/consentManagementUsp.js +1 -1
- package/modules/consumableBidAdapter.js +43 -3
- package/modules/cpmstarBidAdapter.js +23 -13
- package/modules/criteoBidAdapter.js +19 -13
- package/modules/currency.js +1 -0
- package/modules/cwireBidAdapter.js +1 -1
- package/modules/datablocksBidAdapter.js +1 -1
- package/modules/datawrkzBidAdapter.js +633 -0
- package/modules/datawrkzBidAdapter.md +160 -0
- package/modules/dfpAdServerVideo.js +2 -2
- package/modules/dgkeywordRtdProvider.js +10 -1
- package/modules/displayioBidAdapter.js +92 -97
- package/modules/dspxBidAdapter.js +1 -1
- package/modules/e_volutionBidAdapter.js +3 -3
- package/modules/ebdrBidAdapter.js +1 -1
- package/modules/emx_digitalBidAdapter.js +1 -1
- package/modules/enrichmentFpdModule.js +11 -0
- package/modules/fabrickIdSystem.js +2 -2
- package/modules/gamoshiBidAdapter.js +1 -1
- package/modules/getintentBidAdapter.js +1 -1
- package/modules/gjirafaBidAdapter.js +2 -2
- package/modules/goldbachBidAdapter.js +8 -8
- package/modules/gothamadsBidAdapter.js +2 -2
- package/modules/gumgumBidAdapter.js +3 -3
- package/modules/h12mediaBidAdapter.js +1 -1
- package/modules/id5AnalyticsAdapter.js +1 -1
- package/modules/id5IdSystem.js +160 -111
- package/modules/id5IdSystem.md +16 -14
- package/modules/imRtdProvider.js +20 -7
- package/modules/imRtdProvider.md +3 -1
- package/modules/impactifyBidAdapter.js +1 -1
- package/modules/improvedigitalBidAdapter.js +50 -28
- package/modules/inskinBidAdapter.js +1 -1
- package/modules/insticatorBidAdapter.js +1 -1
- package/modules/integr8BidAdapter.js +2 -2
- package/modules/intentIqIdSystem.js +2 -2
- package/modules/interactiveOffersBidAdapter.js +1 -1
- package/modules/iqmBidAdapter.js +1 -1
- package/modules/ixBidAdapter.js +21 -328
- package/modules/ixBidAdapter.md +1 -19
- package/modules/kargoBidAdapter.js +4 -5
- package/modules/krushmediaBidAdapter.js +2 -2
- package/modules/lassoBidAdapter.js +3 -3
- package/modules/lifestreetBidAdapter.js +143 -0
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/livewrappedAnalyticsAdapter.js +3 -3
- package/modules/lkqdBidAdapter.js +3 -3
- package/modules/loganBidAdapter.js +2 -2
- package/modules/luponmediaBidAdapter.js +3 -3
- package/modules/mabidderBidAdapter.js +60 -0
- package/modules/mabidderBidAdapter.md +31 -0
- package/modules/malltvBidAdapter.js +2 -2
- package/modules/mediagoBidAdapter.js +462 -0
- package/modules/mediagoBidAdapter.md +34 -0
- package/modules/mediakeysBidAdapter.js +2 -2
- package/modules/mgidBidAdapter.js +2 -2
- package/modules/nextMillenniumBidAdapter.js +25 -6
- package/modules/nobidBidAdapter.js +2 -2
- package/modules/novatiqIdSystem.js +1 -1
- package/modules/oneKeyIdSystem.js +78 -0
- package/modules/oneKeyIdSystem.md +109 -0
- package/modules/oneKeyRtdProvider.js +98 -0
- package/modules/oneKeyRtdProvider.md +127 -0
- package/modules/open8BidAdapter.js +1 -1
- package/modules/openwebBidAdapter.js +1 -1
- package/modules/openxAnalyticsAdapter.js +5 -744
- package/modules/openxAnalyticsAdapter.md +4 -0
- package/modules/openxBidAdapter.js +3 -3
- package/modules/permutiveRtdProvider.js +55 -8
- package/modules/pixfutureBidAdapter.js +1 -1
- package/modules/prebidmanagerAnalyticsAdapter.js +1 -1
- package/modules/priceFloors.js +1 -1
- package/modules/pubmaticAnalyticsAdapter.js +1 -1
- package/modules/pubmaticBidAdapter.js +19 -1
- package/modules/pubwiseAnalyticsAdapter.js +1 -1
- package/modules/pubwiseBidAdapter.js +3 -3
- package/modules/pubxBidAdapter.js +1 -1
- package/modules/pubxaiAnalyticsAdapter.js +2 -2
- package/modules/quantcastIdSystem.js +1 -1
- package/modules/radsBidAdapter.js +1 -1
- package/modules/rasBidAdapter.js +8 -0
- package/modules/rasBidAdapter.md +14 -13
- package/modules/revcontentBidAdapter.js +1 -1
- package/modules/richaudienceBidAdapter.js +1 -1
- package/modules/rtbhouseBidAdapter.js +25 -1
- package/modules/schain.js +1 -1
- package/modules/seedtagBidAdapter.md +25 -56
- package/modules/showheroes-bsBidAdapter.js +1 -1
- package/modules/sizeMappingV2.js +1 -1
- package/modules/smaatoBidAdapter.js +2 -2
- package/modules/sonobiAnalyticsAdapter.js +1 -1
- package/modules/sonobiBidAdapter.js +4 -3
- package/modules/staqAnalyticsAdapter.js +1 -1
- package/modules/tappxBidAdapter.js +11 -2
- package/modules/targetVideoBidAdapter.js +1 -1
- package/modules/theAdxBidAdapter.js +2 -2
- package/modules/tpmnBidAdapter.js +1 -1
- package/modules/trionBidAdapter.js +2 -2
- package/modules/tripleliftBidAdapter.js +20 -1
- package/modules/trustpidSystem.js +6 -42
- package/modules/trustpidSystem.md +10 -10
- package/modules/underdogmediaBidAdapter.js +1 -1
- package/modules/userId/eids.js +26 -0
- package/modules/userId/userId.md +2 -2
- package/modules/vdoaiBidAdapter.js +1 -1
- package/modules/vidazooBidAdapter.js +7 -5
- package/modules/vidoomyBidAdapter.js +1 -1
- package/modules/viewability.js +14 -14
- package/modules/winrBidAdapter.js +1 -1
- package/modules/yahoosspBidAdapter.js +3 -3
- package/modules/yandexBidAdapter.js +1 -1
- package/modules/yieldmoBidAdapter.js +3 -3
- package/modules/yieldoneBidAdapter.js +2 -2
- package/modules/zeta_global_sspBidAdapter.js +24 -21
- package/package.json +3 -3
- package/src/Renderer.js +1 -1
- package/src/adloader.js +2 -1
- package/src/adserver.js +0 -56
- package/src/auction.js +60 -16
- package/src/bidfactory.js +1 -1
- package/src/native.js +75 -60
- package/src/refererDetection.js +12 -1
- package/src/sizeMapping.js +5 -7
- package/src/targeting.js +1 -1
- package/src/userSync.js +1 -1
- package/src/utils/promise.js +3 -1
- package/src/utils.js +27 -0
- package/src/video.js +5 -4
- package/src/videoCache.js +8 -2
- package/test/pages/instream.html +2 -2
- package/test/spec/modules/acuityAdsBidAdapter_spec.js +398 -0
- package/test/spec/modules/adagioBidAdapter_spec.js +2 -0
- package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
- package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
- package/test/spec/modules/adriverIdSystem_spec.js +3 -8
- package/test/spec/modules/adtelligentBidAdapter_spec.js +2 -0
- package/test/spec/modules/adtrgtmeBidAdapter_spec.js +802 -0
- package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
- package/test/spec/modules/appnexusBidAdapter_spec.js +1 -0
- package/test/spec/modules/beopBidAdapter_spec.js +11 -0
- package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
- package/test/spec/modules/big-richmediaBidAdapter_spec.js +1 -0
- package/test/spec/modules/browsiRtdProvider_spec.js +40 -1
- package/test/spec/modules/consumableBidAdapter_spec.js +158 -0
- package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
- package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
- package/test/spec/modules/currency_spec.js +22 -0
- package/test/spec/modules/datawrkzBidAdapter_spec.js +656 -0
- package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
- package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
- package/test/spec/modules/enrichmentFpdModule_spec.js +16 -1
- package/test/spec/modules/fpdModule_spec.js +2 -1
- package/test/spec/modules/id5IdSystem_spec.js +529 -172
- package/test/spec/modules/imRtdProvider_spec.js +10 -5
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
- package/test/spec/modules/ixBidAdapter_spec.js +216 -123
- package/test/spec/modules/kargoBidAdapter_spec.js +11 -2
- package/test/spec/modules/lifestreetBidAdapter_spec.js +232 -0
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +59 -7
- package/test/spec/modules/mabidderBidAdapter_spec.js +125 -0
- package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
- package/test/spec/modules/oneKeyIdSystem_spec.js +107 -0
- package/test/spec/modules/oneKeyRtdProvider_spec.js +152 -0
- package/test/spec/modules/openxAnalyticsAdapter_spec.js +6 -638
- package/test/spec/modules/permutiveRtdProvider_spec.js +152 -2
- package/test/spec/modules/pubmaticBidAdapter_spec.js +69 -4
- package/test/spec/modules/rasBidAdapter_spec.js +2 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +18 -0
- package/test/spec/modules/trustpidSystem_spec.js +27 -45
- package/test/spec/modules/vidazooBidAdapter_spec.js +36 -23
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +59 -0
- package/test/spec/native_spec.js +257 -2
- package/test/spec/videoCache_spec.js +37 -7
package/src/adserver.js
CHANGED
|
@@ -1,61 +1,5 @@
|
|
|
1
|
-
import { formatQS } from './utils.js';
|
|
2
|
-
import { targeting } from './targeting.js';
|
|
3
1
|
import {hook} from './hook.js';
|
|
4
2
|
|
|
5
|
-
// Adserver parent class
|
|
6
|
-
const AdServer = function(attr) {
|
|
7
|
-
this.name = attr.adserver;
|
|
8
|
-
this.code = attr.code;
|
|
9
|
-
this.getWinningBidByCode = function() {
|
|
10
|
-
return targeting.getWinningBids(this.code)[0];
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
// DFP ad server
|
|
15
|
-
// TODO: this seems to be unused?
|
|
16
|
-
export function dfpAdserver(options, urlComponents) {
|
|
17
|
-
var adserver = new AdServer(options);
|
|
18
|
-
adserver.urlComponents = urlComponents;
|
|
19
|
-
|
|
20
|
-
var dfpReqParams = {
|
|
21
|
-
'env': 'vp',
|
|
22
|
-
'gdfp_req': '1',
|
|
23
|
-
'impl': 's',
|
|
24
|
-
'unviewed_position_start': '1'
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
var dfpParamsWithVariableValue = ['output', 'iu', 'sz', 'url', 'correlator', 'description_url', 'hl'];
|
|
28
|
-
|
|
29
|
-
var getCustomParams = function(targeting) {
|
|
30
|
-
return encodeURIComponent(formatQS(targeting));
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
adserver.appendQueryParams = function() {
|
|
34
|
-
var bid = adserver.getWinningBidByCode();
|
|
35
|
-
if (bid) {
|
|
36
|
-
this.urlComponents.search.description_url = encodeURIComponent(bid.vastUrl);
|
|
37
|
-
this.urlComponents.search.cust_params = getCustomParams(bid.adserverTargeting);
|
|
38
|
-
this.urlComponents.search.correlator = Date.now();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
adserver.verifyAdserverTag = function() {
|
|
43
|
-
for (var key in dfpReqParams) {
|
|
44
|
-
if (!this.urlComponents.search.hasOwnProperty(key) || this.urlComponents.search[key] !== dfpReqParams[key]) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
for (var i in dfpParamsWithVariableValue) {
|
|
49
|
-
if (!this.urlComponents.search.hasOwnProperty(dfpParamsWithVariableValue[i])) {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return true;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
return adserver;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
3
|
/**
|
|
60
4
|
* return the GAM PPID, if available (eid for the userID configured with `userSync.ppidSource`)
|
|
61
5
|
*/
|
package/src/auction.js
CHANGED
|
@@ -498,8 +498,9 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
|
|
|
498
498
|
transactionId: bidResponse.transactionId
|
|
499
499
|
}), 'video');
|
|
500
500
|
const context = videoMediaType && deepAccess(videoMediaType, 'context');
|
|
501
|
+
const useCacheKey = videoMediaType && deepAccess(videoMediaType, 'useCacheKey');
|
|
501
502
|
|
|
502
|
-
if (config.getConfig('cache.url') && context !== OUTSTREAM) {
|
|
503
|
+
if (config.getConfig('cache.url') && (useCacheKey || context !== OUTSTREAM)) {
|
|
503
504
|
if (!bidResponse.videoCacheKey || config.getConfig('cache.ignoreBidderCacheKey')) {
|
|
504
505
|
addBid = false;
|
|
505
506
|
callPrebidCache(auctionInstance, bidResponse, afterBidAdded, videoMediaType);
|
|
@@ -514,28 +515,71 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
|
|
|
514
515
|
}
|
|
515
516
|
}
|
|
516
517
|
|
|
517
|
-
|
|
518
|
-
store(
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
} else {
|
|
524
|
-
if (cacheIds[0].uuid === '') {
|
|
525
|
-
logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
|
|
518
|
+
const storeInCache = (batch) => {
|
|
519
|
+
store(batch.map(entry => entry.bidResponse), function (error, cacheIds) {
|
|
520
|
+
cacheIds.forEach((cacheId, i) => {
|
|
521
|
+
const { auctionInstance, bidResponse, afterBidAdded } = batch[i];
|
|
522
|
+
if (error) {
|
|
523
|
+
logWarn(`Failed to save to the video cache: ${error}. Video bid must be discarded.`);
|
|
526
524
|
|
|
527
525
|
doCallbacksIfTimedout(auctionInstance, bidResponse);
|
|
528
526
|
} else {
|
|
529
|
-
|
|
527
|
+
if (cacheId.uuid === '') {
|
|
528
|
+
logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
|
|
530
529
|
|
|
531
|
-
|
|
532
|
-
|
|
530
|
+
doCallbacksIfTimedout(auctionInstance, bidResponse);
|
|
531
|
+
} else {
|
|
532
|
+
bidResponse.videoCacheKey = cacheId.uuid;
|
|
533
|
+
|
|
534
|
+
if (!bidResponse.vastUrl) {
|
|
535
|
+
bidResponse.vastUrl = getCacheUrl(bidResponse.videoCacheKey);
|
|
536
|
+
}
|
|
537
|
+
addBidToAuction(auctionInstance, bidResponse);
|
|
538
|
+
afterBidAdded();
|
|
533
539
|
}
|
|
534
|
-
addBidToAuction(auctionInstance, bidResponse);
|
|
535
|
-
afterBidAdded();
|
|
536
540
|
}
|
|
537
|
-
}
|
|
541
|
+
});
|
|
538
542
|
});
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
let batchSize, batchTimeout;
|
|
546
|
+
config.getConfig('cache', (cacheConfig) => {
|
|
547
|
+
batchSize = typeof cacheConfig.cache.batchSize === 'number' && cacheConfig.cache.batchSize > 0
|
|
548
|
+
? cacheConfig.cache.batchSize
|
|
549
|
+
: 1;
|
|
550
|
+
batchTimeout = typeof cacheConfig.cache.batchTimeout === 'number' && cacheConfig.cache.batchTimeout > 0
|
|
551
|
+
? cacheConfig.cache.batchTimeout
|
|
552
|
+
: 0;
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
export const batchingCache = (timeout = setTimeout, cache = storeInCache) => {
|
|
556
|
+
let batches = [[]];
|
|
557
|
+
let debouncing = false;
|
|
558
|
+
const noTimeout = cb => cb();
|
|
559
|
+
|
|
560
|
+
return function(auctionInstance, bidResponse, afterBidAdded) {
|
|
561
|
+
const batchFunc = batchTimeout > 0 ? timeout : noTimeout;
|
|
562
|
+
if (batches[batches.length - 1].length >= batchSize) {
|
|
563
|
+
batches.push([]);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
batches[batches.length - 1].push({auctionInstance, bidResponse, afterBidAdded});
|
|
567
|
+
|
|
568
|
+
if (!debouncing) {
|
|
569
|
+
debouncing = true;
|
|
570
|
+
batchFunc(() => {
|
|
571
|
+
batches.forEach(cache);
|
|
572
|
+
batches = [[]];
|
|
573
|
+
debouncing = false;
|
|
574
|
+
}, batchTimeout);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
const batchAndStore = batchingCache();
|
|
580
|
+
|
|
581
|
+
export const callPrebidCache = hook('async', function(auctionInstance, bidResponse, afterBidAdded, videoMediaType) {
|
|
582
|
+
batchAndStore(auctionInstance, bidResponse, afterBidAdded);
|
|
539
583
|
}, 'callPrebidCache');
|
|
540
584
|
|
|
541
585
|
// Postprocess the bids so that all the universal properties exist, no matter which bidder they came from.
|
package/src/bidfactory.js
CHANGED
package/src/native.js
CHANGED
|
@@ -272,7 +272,7 @@ export function fireNativeTrackers(message, bidResponse) {
|
|
|
272
272
|
const nativeResponse = bidResponse.native.ortb || legacyPropertiesToOrtbNative(bidResponse.native);
|
|
273
273
|
|
|
274
274
|
if (message.action === 'click') {
|
|
275
|
-
fireClickTrackers(nativeResponse);
|
|
275
|
+
fireClickTrackers(nativeResponse, message?.assetId);
|
|
276
276
|
} else {
|
|
277
277
|
fireImpressionTrackers(nativeResponse);
|
|
278
278
|
}
|
|
@@ -305,8 +305,27 @@ export function fireImpressionTrackers(nativeResponse, {runMarkup = (mkup) => in
|
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
307
|
|
|
308
|
-
export function fireClickTrackers(nativeResponse, {fetchURL = triggerPixel} = {}) {
|
|
309
|
-
|
|
308
|
+
export function fireClickTrackers(nativeResponse, assetId = null, {fetchURL = triggerPixel} = {}) {
|
|
309
|
+
// legacy click tracker
|
|
310
|
+
if (!assetId) {
|
|
311
|
+
(nativeResponse.link?.clicktrackers || []).forEach(url => fetchURL(url));
|
|
312
|
+
} else {
|
|
313
|
+
// ortb click tracker. This will try to call the clicktracker associated with the asset;
|
|
314
|
+
// will fallback to the link if none is found.
|
|
315
|
+
const assetIdLinkMap = (nativeResponse.assets || [])
|
|
316
|
+
.filter(a => a.link)
|
|
317
|
+
.reduce((map, asset) => {
|
|
318
|
+
map[asset.id] = asset.link;
|
|
319
|
+
return map
|
|
320
|
+
}, {});
|
|
321
|
+
const masterClickTrackers = nativeResponse.link?.clicktrackers || [];
|
|
322
|
+
let assetLink = assetIdLinkMap[assetId];
|
|
323
|
+
let clickTrackers = masterClickTrackers;
|
|
324
|
+
if (assetLink) {
|
|
325
|
+
clickTrackers = assetLink.clicktrackers || [];
|
|
326
|
+
}
|
|
327
|
+
clickTrackers.forEach(url => fetchURL(url));
|
|
328
|
+
}
|
|
310
329
|
}
|
|
311
330
|
|
|
312
331
|
/**
|
|
@@ -366,34 +385,9 @@ export function getNativeTargeting(bid, {index = auctionManager.index} = {}) {
|
|
|
366
385
|
return keyValues;
|
|
367
386
|
}
|
|
368
387
|
|
|
369
|
-
|
|
370
|
-
* Constructs a message object containing asset values for each of the
|
|
371
|
-
* requested data keys.
|
|
372
|
-
*/
|
|
373
|
-
export function getAssetMessage(data, adObject) {
|
|
374
|
-
const message = {
|
|
375
|
-
message: 'assetResponse',
|
|
376
|
-
adId: data.adId,
|
|
377
|
-
assets: [],
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
if (adObject.native.hasOwnProperty('adTemplate')) {
|
|
381
|
-
message.adTemplate = getAssetValue(adObject.native['adTemplate']);
|
|
382
|
-
} if (adObject.native.hasOwnProperty('rendererUrl')) {
|
|
383
|
-
message.rendererUrl = getAssetValue(adObject.native['rendererUrl']);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
data.assets.forEach(asset => {
|
|
387
|
-
const key = getKeyByValue(CONSTANTS.NATIVE_KEYS, asset);
|
|
388
|
-
const value = getAssetValue(adObject.native[key]);
|
|
388
|
+
const getNativeRequest = (bidResponse) => auctionManager.index.getAdUnit(bidResponse)?.nativeOrtbRequest;
|
|
389
389
|
|
|
390
|
-
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
return message;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse) => auctionManager.index.getAdUnit(bidResponse).nativeOrtbRequest} = {}) {
|
|
390
|
+
function assetsMessage(data, adObject, keys, {getNativeReq = getNativeRequest} = {}) {
|
|
397
391
|
const message = {
|
|
398
392
|
message: 'assetResponse',
|
|
399
393
|
adId: data.adId,
|
|
@@ -401,12 +395,12 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse
|
|
|
401
395
|
|
|
402
396
|
// Pass to Prebid Universal Creative all assets, the legacy ones + the ortb ones (under ortb property)
|
|
403
397
|
const ortbRequest = getNativeReq(adObject);
|
|
404
|
-
let
|
|
398
|
+
let nativeResp = adObject.native;
|
|
405
399
|
const ortbResponse = adObject.native?.ortb;
|
|
406
400
|
let legacyResponse = {};
|
|
407
401
|
if (ortbRequest && ortbResponse) {
|
|
408
402
|
legacyResponse = toLegacyResponse(ortbResponse, ortbRequest);
|
|
409
|
-
|
|
403
|
+
nativeResp = {
|
|
410
404
|
...adObject.native,
|
|
411
405
|
...legacyResponse
|
|
412
406
|
};
|
|
@@ -416,20 +410,20 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse
|
|
|
416
410
|
}
|
|
417
411
|
message.assets = [];
|
|
418
412
|
|
|
419
|
-
Object.keys(
|
|
420
|
-
if (key === 'adTemplate' &&
|
|
421
|
-
message.adTemplate = getAssetValue(
|
|
422
|
-
} else if (key === 'rendererUrl' &&
|
|
423
|
-
message.rendererUrl = getAssetValue(
|
|
413
|
+
(keys == null ? Object.keys(nativeResp) : keys).forEach(function(key) {
|
|
414
|
+
if (key === 'adTemplate' && nativeResp[key]) {
|
|
415
|
+
message.adTemplate = getAssetValue(nativeResp[key]);
|
|
416
|
+
} else if (key === 'rendererUrl' && nativeResp[key]) {
|
|
417
|
+
message.rendererUrl = getAssetValue(nativeResp[key]);
|
|
424
418
|
} else if (key === 'ext') {
|
|
425
|
-
Object.keys(
|
|
426
|
-
if (
|
|
427
|
-
const value = getAssetValue(
|
|
419
|
+
Object.keys(nativeResp[key]).forEach(extKey => {
|
|
420
|
+
if (nativeResp[key][extKey]) {
|
|
421
|
+
const value = getAssetValue(nativeResp[key][extKey]);
|
|
428
422
|
message.assets.push({ key: extKey, value });
|
|
429
423
|
}
|
|
430
424
|
})
|
|
431
|
-
} else if (
|
|
432
|
-
const value = getAssetValue(
|
|
425
|
+
} else if (nativeResp[key] && CONSTANTS.NATIVE_KEYS.hasOwnProperty(key)) {
|
|
426
|
+
const value = getAssetValue(nativeResp[key]);
|
|
433
427
|
|
|
434
428
|
message.assets.push({ key, value });
|
|
435
429
|
}
|
|
@@ -437,6 +431,19 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse
|
|
|
437
431
|
return message;
|
|
438
432
|
}
|
|
439
433
|
|
|
434
|
+
/**
|
|
435
|
+
* Constructs a message object containing asset values for each of the
|
|
436
|
+
* requested data keys.
|
|
437
|
+
*/
|
|
438
|
+
export function getAssetMessage(data, adObject, {getNativeReq = getNativeRequest} = {}) {
|
|
439
|
+
const keys = data.assets.map((k) => getKeyByValue(CONSTANTS.NATIVE_KEYS, k));
|
|
440
|
+
return assetsMessage(data, adObject, keys, {getNativeReq});
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export function getAllAssetsMessage(data, adObject, {getNativeReq = getNativeRequest} = {}) {
|
|
444
|
+
return assetsMessage(data, adObject, null, {getNativeReq});
|
|
445
|
+
}
|
|
446
|
+
|
|
440
447
|
/**
|
|
441
448
|
* Native assets can be a string or an object with a url prop. Returns the value
|
|
442
449
|
* appropriate for sending in adserver targeting or placeholder replacement.
|
|
@@ -689,40 +696,47 @@ export function legacyPropertiesToOrtbNative(legacyNative) {
|
|
|
689
696
|
}
|
|
690
697
|
|
|
691
698
|
export function toOrtbNativeResponse(legacyResponse, ortbRequest) {
|
|
692
|
-
// copy the request, so we don't pollute it with response data below
|
|
693
|
-
ortbRequest = deepClone(ortbRequest);
|
|
694
|
-
|
|
695
699
|
const ortbResponse = {
|
|
696
700
|
...legacyPropertiesToOrtbNative(legacyResponse),
|
|
697
701
|
assets: []
|
|
698
702
|
};
|
|
703
|
+
|
|
704
|
+
function useRequestAsset(predicate, fn) {
|
|
705
|
+
let asset = ortbRequest.assets.find(predicate);
|
|
706
|
+
if (asset != null) {
|
|
707
|
+
asset = deepClone(asset);
|
|
708
|
+
fn(asset);
|
|
709
|
+
ortbResponse.assets.push(asset);
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
699
713
|
Object.keys(legacyResponse).filter(key => !!legacyResponse[key]).forEach(key => {
|
|
700
714
|
const value = legacyResponse[key];
|
|
701
715
|
switch (key) {
|
|
702
716
|
// process titles
|
|
703
717
|
case 'title':
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
718
|
+
useRequestAsset(asset => asset.title != null, titleAsset => {
|
|
719
|
+
titleAsset.title = {
|
|
720
|
+
text: value
|
|
721
|
+
};
|
|
722
|
+
})
|
|
709
723
|
break;
|
|
710
724
|
case 'image':
|
|
711
725
|
case 'icon':
|
|
712
726
|
const imageType = key === 'image' ? NATIVE_IMAGE_TYPES.MAIN : NATIVE_IMAGE_TYPES.ICON;
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
727
|
+
useRequestAsset(asset => asset.img != null && asset.img.type === imageType, imageAsset => {
|
|
728
|
+
imageAsset.img = {
|
|
729
|
+
url: value
|
|
730
|
+
};
|
|
731
|
+
})
|
|
718
732
|
break;
|
|
719
733
|
default:
|
|
720
734
|
if (key in PREBID_NATIVE_DATA_KEYS_TO_ORTB) {
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
735
|
+
useRequestAsset(asset => asset.data != null && asset.data.type === NATIVE_ASSET_TYPES[PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]], dataAsset => {
|
|
736
|
+
dataAsset.data = {
|
|
737
|
+
value
|
|
738
|
+
};
|
|
739
|
+
})
|
|
726
740
|
}
|
|
727
741
|
break;
|
|
728
742
|
}
|
|
@@ -740,6 +754,7 @@ function toLegacyResponse(ortbResponse, ortbRequest) {
|
|
|
740
754
|
const legacyResponse = {};
|
|
741
755
|
const requestAssets = ortbRequest?.assets || [];
|
|
742
756
|
legacyResponse.clickUrl = ortbResponse.link.url;
|
|
757
|
+
legacyResponse.privacyLink = ortbResponse.privacy;
|
|
743
758
|
for (const asset of ortbResponse?.assets || []) {
|
|
744
759
|
const requestAsset = requestAssets.find(reqAsset => asset.id === reqAsset.id);
|
|
745
760
|
if (asset.title) {
|
package/src/refererDetection.js
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
import { config } from './config.js';
|
|
12
12
|
import {logWarn} from './utils.js';
|
|
13
13
|
|
|
14
|
+
let RI = new WeakMap();
|
|
15
|
+
|
|
14
16
|
/**
|
|
15
17
|
* Prepend a URL with the page's protocol (http/https), if necessary.
|
|
16
18
|
*/
|
|
@@ -252,10 +254,19 @@ export function detectReferer(win) {
|
|
|
252
254
|
};
|
|
253
255
|
}
|
|
254
256
|
|
|
255
|
-
return
|
|
257
|
+
return function() {
|
|
258
|
+
if (!RI.has(win)) {
|
|
259
|
+
RI.set(win, Object.freeze(refererInfo()));
|
|
260
|
+
}
|
|
261
|
+
return RI.get(win);
|
|
262
|
+
}
|
|
256
263
|
}
|
|
257
264
|
|
|
258
265
|
/**
|
|
259
266
|
* @type {function(): refererInfo}
|
|
260
267
|
*/
|
|
261
268
|
export const getRefererInfo = detectReferer(window);
|
|
269
|
+
|
|
270
|
+
export function resetRefererInfo() {
|
|
271
|
+
RI = new WeakMap();
|
|
272
|
+
}
|
package/src/sizeMapping.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { config } from './config.js';
|
|
2
2
|
import {logWarn, logInfo, isPlainObject, deepAccess, deepClone, getWindowTop} from './utils.js';
|
|
3
3
|
import {includes} from './polyfill.js';
|
|
4
|
+
import {BANNER} from './mediaTypes.js';
|
|
4
5
|
|
|
5
6
|
let sizeConfig = [];
|
|
6
7
|
|
|
@@ -75,22 +76,19 @@ export function resolveStatus({labels = [], labelAll = false, activeLabels = []}
|
|
|
75
76
|
} else {
|
|
76
77
|
mediaTypes = {};
|
|
77
78
|
}
|
|
78
|
-
} else {
|
|
79
|
-
mediaTypes = deepClone(mediaTypes);
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
let oldSizes = deepAccess(mediaTypes, 'banner.sizes');
|
|
83
82
|
if (maps.shouldFilter && oldSizes) {
|
|
83
|
+
mediaTypes = deepClone(mediaTypes);
|
|
84
84
|
mediaTypes.banner.sizes = oldSizes.filter(size => maps.sizesSupported[size]);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
let allMediaTypes = Object.keys(mediaTypes);
|
|
88
|
-
|
|
89
87
|
let results = {
|
|
90
88
|
active: (
|
|
91
|
-
|
|
89
|
+
!mediaTypes.hasOwnProperty(BANNER)
|
|
92
90
|
) || (
|
|
93
|
-
|
|
91
|
+
deepAccess(mediaTypes, 'banner.sizes.length') > 0 && (
|
|
94
92
|
labels.length === 0 || (
|
|
95
93
|
(!labelAll && (
|
|
96
94
|
labels.some(label => maps.labels[label]) ||
|
|
@@ -111,7 +109,7 @@ export function resolveStatus({labels = [], labelAll = false, activeLabels = []}
|
|
|
111
109
|
results.filterResults = {
|
|
112
110
|
before: oldSizes,
|
|
113
111
|
after: mediaTypes.banner.sizes
|
|
114
|
-
}
|
|
112
|
+
};
|
|
115
113
|
}
|
|
116
114
|
|
|
117
115
|
return results;
|
package/src/targeting.js
CHANGED
package/src/userSync.js
CHANGED
package/src/utils/promise.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import {getGlobal} from '../prebidGlobal.js';
|
|
2
|
+
|
|
1
3
|
const SUCCESS = 0;
|
|
2
4
|
const FAIL = 1;
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
7
|
* A version of Promise that runs callbacks synchronously when it can (i.e. after it's been fulfilled or rejected).
|
|
6
8
|
*/
|
|
7
|
-
export class GreedyPromise extends Promise {
|
|
9
|
+
export class GreedyPromise extends (getGlobal().Promise || Promise) {
|
|
8
10
|
#result;
|
|
9
11
|
#callbacks;
|
|
10
12
|
#parent = null;
|
package/src/utils.js
CHANGED
|
@@ -1381,3 +1381,30 @@ export function setScriptAttributes(script, attributes) {
|
|
|
1381
1381
|
}
|
|
1382
1382
|
}
|
|
1383
1383
|
}
|
|
1384
|
+
|
|
1385
|
+
/**
|
|
1386
|
+
* Encode a string for inclusion in HTML.
|
|
1387
|
+
* See https://pragmaticwebsecurity.com/articles/spasecurity/json-stringify-xss.html and
|
|
1388
|
+
* https://codeql.github.com/codeql-query-help/javascript/js-bad-code-sanitization/
|
|
1389
|
+
* @return {string}
|
|
1390
|
+
*/
|
|
1391
|
+
export const escapeUnsafeChars = (() => {
|
|
1392
|
+
const escapes = {
|
|
1393
|
+
'<': '\\u003C',
|
|
1394
|
+
'>': '\\u003E',
|
|
1395
|
+
'/': '\\u002F',
|
|
1396
|
+
'\\': '\\\\',
|
|
1397
|
+
'\b': '\\b',
|
|
1398
|
+
'\f': '\\f',
|
|
1399
|
+
'\n': '\\n',
|
|
1400
|
+
'\r': '\\r',
|
|
1401
|
+
'\t': '\\t',
|
|
1402
|
+
'\0': '\\0',
|
|
1403
|
+
'\u2028': '\\u2028',
|
|
1404
|
+
'\u2029': '\\u2029'
|
|
1405
|
+
};
|
|
1406
|
+
|
|
1407
|
+
return function(str) {
|
|
1408
|
+
return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g, x => escapes[x])
|
|
1409
|
+
}
|
|
1410
|
+
})();
|
package/src/video.js
CHANGED
|
@@ -35,15 +35,16 @@ export const hasNonVideoBidder = adUnit =>
|
|
|
35
35
|
export function isValidVideoBid(bid, {index = auctionManager.index} = {}) {
|
|
36
36
|
const videoMediaType = deepAccess(index.getMediaTypes(bid), 'video');
|
|
37
37
|
const context = videoMediaType && deepAccess(videoMediaType, 'context');
|
|
38
|
+
const useCacheKey = videoMediaType && deepAccess(videoMediaType, 'useCacheKey');
|
|
38
39
|
const adUnit = index.getAdUnit(bid);
|
|
39
40
|
|
|
40
41
|
// if context not defined assume default 'instream' for video bids
|
|
41
42
|
// instream bids require a vast url or vast xml content
|
|
42
|
-
return checkVideoBidSetup(bid, adUnit, videoMediaType, context);
|
|
43
|
+
return checkVideoBidSetup(bid, adUnit, videoMediaType, context, useCacheKey);
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
export const checkVideoBidSetup = hook('sync', function(bid, adUnit, videoMediaType, context) {
|
|
46
|
-
if (videoMediaType && context !== OUTSTREAM) {
|
|
46
|
+
export const checkVideoBidSetup = hook('sync', function(bid, adUnit, videoMediaType, context, useCacheKey) {
|
|
47
|
+
if (videoMediaType && (useCacheKey || context !== OUTSTREAM)) {
|
|
47
48
|
// xml-only video bids require a prebid cache url
|
|
48
49
|
if (!config.getConfig('cache.url') && bid.vastXml && !bid.vastUrl) {
|
|
49
50
|
logError(`
|
|
@@ -57,7 +58,7 @@ export const checkVideoBidSetup = hook('sync', function(bid, adUnit, videoMediaT
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
// outstream bids require a renderer on the bid or pub-defined on adunit
|
|
60
|
-
if (context === OUTSTREAM) {
|
|
61
|
+
if (context === OUTSTREAM && !useCacheKey) {
|
|
61
62
|
return !!(bid.renderer || (adUnit && adUnit.renderer) || videoMediaType.renderer);
|
|
62
63
|
}
|
|
63
64
|
|
package/src/videoCache.js
CHANGED
|
@@ -13,6 +13,12 @@ import { ajax } from './ajax.js';
|
|
|
13
13
|
import { config } from './config.js';
|
|
14
14
|
import {auctionManager} from './auctionManager.js';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Might be useful to be configurable in the future
|
|
18
|
+
* Depending on publisher needs
|
|
19
|
+
*/
|
|
20
|
+
const ttlBufferInSeconds = 15;
|
|
21
|
+
|
|
16
22
|
/**
|
|
17
23
|
* @typedef {object} CacheableUrlBid
|
|
18
24
|
* @property {string} vastUrl A URL which loads some valid VAST XML.
|
|
@@ -63,11 +69,11 @@ function wrapURI(uri, impUrl) {
|
|
|
63
69
|
function toStorageRequest(bid, {index = auctionManager.index} = {}) {
|
|
64
70
|
const vastValue = bid.vastXml ? bid.vastXml : wrapURI(bid.vastUrl, bid.vastImpUrl);
|
|
65
71
|
const auction = index.getAuction(bid);
|
|
66
|
-
|
|
72
|
+
const ttlWithBuffer = Number(bid.ttl) + ttlBufferInSeconds;
|
|
67
73
|
let payload = {
|
|
68
74
|
type: 'xml',
|
|
69
75
|
value: vastValue,
|
|
70
|
-
ttlseconds:
|
|
76
|
+
ttlseconds: ttlWithBuffer
|
|
71
77
|
};
|
|
72
78
|
|
|
73
79
|
if (config.getConfig('cache.vasttrack')) {
|
package/test/pages/instream.html
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<title>Prebid.js video adUnit example</title>
|
|
9
9
|
|
|
10
10
|
<!-- videojs -->
|
|
11
|
-
<link rel="stylesheet" href="
|
|
12
|
-
<script type="text/javascript" src="
|
|
11
|
+
<link rel="stylesheet" href="https://vjs.zencdn.net/5.9.2/video-js.css">
|
|
12
|
+
<script type="text/javascript" src="https://vjs.zencdn.net/5.9.2/video.js"></script>
|
|
13
13
|
|
|
14
14
|
<!-- videojs-vast-vpaid -->
|
|
15
15
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/videojs-vast-vpaid/2.0.2/videojs.vast.vpaid.min.css" rel="stylesheet">
|