prebid.js 5.14.0 → 5.18.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/.devcontainer/Dockerfile +11 -0
- package/.devcontainer/devcontainer.json +27 -0
- package/.devcontainer/postCreate.sh +6 -0
- package/allowedModules.js +2 -1
- package/integrationExamples/gpt/afpExample.html +242 -0
- package/integrationExamples/gpt/afpGamExample.html +152 -0
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +126 -0
- package/modules/.submodules.json +29 -27
- package/modules/33acrossBidAdapter.js +23 -20
- package/modules/a4gBidAdapter.js +3 -3
- package/modules/ablidaBidAdapter.js +2 -2
- package/modules/adWMGBidAdapter.js +4 -4
- package/modules/adagioAnalyticsAdapter.js +4 -4
- package/modules/adagioBidAdapter.js +85 -82
- package/modules/adbookpspBidAdapter.js +56 -54
- package/modules/adfBidAdapter.js +24 -16
- package/modules/adgenerationBidAdapter.js +42 -18
- package/modules/adhashBidAdapter.js +105 -0
- package/modules/adhashBidAdapter.md +1 -1
- package/modules/adkernelAdnAnalyticsAdapter.js +6 -6
- package/modules/adkernelAdnBidAdapter.js +23 -23
- package/modules/adkernelBidAdapter.js +49 -44
- package/modules/adlooxAdServerVideo.js +26 -26
- package/modules/adlooxAnalyticsAdapter.js +38 -35
- package/modules/adlooxRtdProvider.js +49 -46
- package/modules/admanBidAdapter.js +4 -4
- package/modules/admixerBidAdapter.js +13 -2
- package/modules/admixerIdSystem.js +4 -4
- package/modules/adnowBidAdapter.js +4 -4
- package/modules/adnuntiusBidAdapter.js +6 -5
- package/modules/adoceanBidAdapter.js +10 -10
- package/modules/adpartnerBidAdapter.js +3 -3
- package/modules/adpod.js +45 -42
- package/modules/adprimeBidAdapter.js +4 -4
- package/modules/adqueryBidAdapter.js +204 -0
- package/modules/adqueryBidAdapter.md +32 -0
- package/modules/adrelevantisBidAdapter.js +30 -27
- package/modules/adriverBidAdapter.js +13 -13
- package/modules/adtargetBidAdapter.js +24 -24
- package/modules/adtelligentBidAdapter.js +29 -29
- package/modules/adtrueBidAdapter.js +35 -35
- package/modules/aduptechBidAdapter.js +10 -10
- package/modules/advangelistsBidAdapter.js +14 -14
- package/modules/adxcgAnalyticsAdapter.js +5 -5
- package/modules/adxcgBidAdapter.js +56 -56
- package/modules/adxpremiumAnalyticsAdapter.js +17 -17
- package/modules/adyoulikeBidAdapter.js +11 -11
- package/modules/afpBidAdapter.js +166 -0
- package/modules/afpBidAdapter.md +348 -0
- package/modules/ajaBidAdapter.js +12 -12
- package/modules/akamaiDAPIdSystem.js +9 -9
- package/modules/aniviewBidAdapter.js +2 -2
- package/modules/aolBidAdapter.js +15 -14
- package/modules/apacdexBidAdapter.js +16 -16
- package/modules/appnexusBidAdapter.js +59 -59
- package/modules/apstreamBidAdapter.js +5 -5
- package/modules/asoBidAdapter.js +30 -30
- package/modules/astraoneBidAdapter.js +2 -2
- package/modules/atsAnalyticsAdapter.js +35 -30
- package/modules/audiencerunBidAdapter.js +15 -15
- package/modules/automatadBidAdapter.js +2 -2
- package/modules/axonixBidAdapter.js +7 -7
- package/modules/beachfrontBidAdapter.js +23 -23
- package/modules/beopBidAdapter.js +22 -22
- package/modules/bidViewabilityIO.js +7 -7
- package/modules/bidglassBidAdapter.js +8 -8
- package/modules/bidscubeBidAdapter.js +3 -3
- package/modules/bizzclickBidAdapter.js +10 -10
- package/modules/bliinkBidAdapter.js +58 -32
- package/modules/bliinkBidAdapter.md +29 -6
- package/modules/bluebillywigBidAdapter.js +30 -30
- package/modules/boldwinBidAdapter.js +4 -4
- package/modules/braveBidAdapter.js +5 -5
- package/modules/bridgewellBidAdapter.js +5 -5
- package/modules/brightMountainMediaBidAdapter.js +10 -10
- package/modules/brightcomBidAdapter.js +18 -18
- package/modules/britepoolIdSystem.js +7 -7
- package/modules/browsiRtdProvider.js +8 -8
- package/modules/bucksenseBidAdapter.js +9 -9
- package/modules/buzzoolaBidAdapter.js +4 -4
- package/modules/byDataAnalyticsAdapter.js +12 -12
- package/modules/ccxBidAdapter.js +38 -38
- package/modules/cleanmedianetBidAdapter.js +9 -9
- package/modules/clickforceBidAdapter.js +4 -4
- package/modules/cointrafficBidAdapter.js +4 -4
- package/modules/coinzillaBidAdapter.js +2 -2
- package/modules/colossussspBidAdapter.js +7 -3
- package/modules/concertAnalyticsAdapter.js +3 -3
- package/modules/concertBidAdapter.js +16 -17
- package/modules/connectadBidAdapter.js +13 -13
- package/modules/consentManagement.js +29 -28
- package/modules/consentManagementUsp.js +14 -14
- package/modules/consumableBidAdapter.js +3 -3
- package/modules/contentexchangeBidAdapter.js +5 -5
- package/modules/conversantBidAdapter.js +32 -31
- package/modules/cpmstarBidAdapter.js +8 -9
- package/modules/craftBidAdapter.js +10 -10
- package/modules/criteoBidAdapter.js +16 -16
- package/modules/criteoIdSystem.js +5 -5
- package/modules/currency.js +18 -18
- package/modules/cwireBidAdapter.js +272 -0
- package/modules/cwireBidAdapter.md +43 -0
- package/modules/datablocksBidAdapter.js +12 -12
- package/modules/deepintentBidAdapter.js +13 -13
- package/modules/dgkeywordRtdProvider.js +10 -11
- package/modules/districtmDMXBidAdapter.js +15 -15
- package/modules/dmdIdSystem.js +5 -5
- package/modules/docereeBidAdapter.js +9 -9
- package/modules/dspxBidAdapter.js +5 -5
- package/modules/ebdrBidAdapter.js +9 -9
- package/modules/emx_digitalBidAdapter.js +23 -23
- package/modules/enrichmentFpdModule.js +10 -9
- package/modules/eplanningAnalyticsAdapter.js +2 -2
- package/modules/eplanningBidAdapter.js +10 -10
- package/modules/etargetBidAdapter.js +4 -4
- package/modules/express.js +9 -10
- package/modules/fabrickIdSystem.js +6 -6
- package/modules/feedadBidAdapter.js +5 -5
- package/modules/fintezaAnalyticsAdapter.js +4 -4
- package/modules/flocIdSystem.js +5 -5
- package/modules/fluctBidAdapter.js +6 -5
- package/modules/freewheel-sspBidAdapter.js +6 -6
- package/modules/gamoshiBidAdapter.js +22 -22
- package/modules/gdprEnforcement.js +13 -14
- package/modules/getintentBidAdapter.js +3 -4
- package/modules/glimpseBidAdapter.js +160 -48
- package/modules/glimpseBidAdapter.md +11 -74
- package/modules/gmosspBidAdapter.js +17 -17
- package/modules/gnetBidAdapter.js +5 -5
- package/modules/googleAnalyticsAdapter.js +6 -6
- package/modules/gothamadsBidAdapter.js +9 -9
- package/modules/gptPreAuction.js +7 -7
- package/modules/gridBidAdapter.js +15 -16
- package/modules/gridNMBidAdapter.js +214 -63
- package/modules/growadvertisingBidAdapter.js +7 -8
- package/modules/gumgumBidAdapter.js +19 -13
- package/modules/h12mediaBidAdapter.js +12 -12
- package/modules/haloIdSystem.js +8 -8
- package/modules/hybridBidAdapter.js +7 -7
- package/modules/iasRtdProvider.js +79 -63
- package/modules/id5IdSystem.js +24 -24
- package/modules/idImportLibrary.js +35 -35
- package/modules/idxIdSystem.js +3 -3
- package/modules/impactifyBidAdapter.js +10 -10
- package/modules/improvedigitalBidAdapter.js +36 -36
- package/modules/imuIdSystem.js +6 -6
- package/modules/inmarBidAdapter.js +2 -2
- package/modules/innityBidAdapter.js +3 -3
- package/modules/inskinBidAdapter.js +14 -2
- package/modules/inskinBidAdapter.md +5 -4
- package/modules/instreamTracking.js +5 -5
- package/modules/integr8BidAdapter.js +4 -4
- package/modules/intentIqIdSystem.js +7 -7
- package/modules/interactiveOffersBidAdapter.js +5 -5
- package/modules/invibesBidAdapter.js +53 -19
- package/modules/invisiblyAnalyticsAdapter.js +5 -5
- package/modules/iqmBidAdapter.js +19 -19
- package/modules/iqzoneBidAdapter.js +5 -5
- package/modules/ixBidAdapter.js +73 -73
- package/modules/jixieBidAdapter.js +6 -6
- package/modules/justpremiumBidAdapter.js +5 -1
- package/modules/kargoBidAdapter.js +16 -9
- package/modules/kargoBidAdapter.md +20 -0
- package/modules/kinessoIdSystem.js +8 -8
- package/modules/koblerBidAdapter.js +12 -12
- package/modules/konduitAnalyticsAdapter.js +4 -4
- package/modules/konduitWrapper.js +14 -14
- package/modules/krushmediaBidAdapter.js +4 -4
- package/modules/kubientBidAdapter.js +5 -5
- package/modules/limelightDigitalBidAdapter.js +4 -4
- package/modules/liveIntentIdSystem.js +4 -5
- package/modules/livewrappedAnalyticsAdapter.js +27 -15
- package/modules/livewrappedBidAdapter.js +7 -7
- package/modules/liveyieldAnalyticsAdapter.js +13 -13
- package/modules/lockerdomeBidAdapter.js +2 -2
- package/modules/loganBidAdapter.js +4 -4
- package/modules/lotamePanoramaIdSystem.js +13 -13
- package/modules/lunamediahbBidAdapter.js +2 -2
- package/modules/madvertiseBidAdapter.js +3 -3
- package/modules/marsmediaBidAdapter.js +26 -26
- package/modules/mathildeadsBidAdapter.js +5 -5
- package/modules/mediaforceBidAdapter.js +11 -11
- package/modules/mediakeysBidAdapter.js +444 -53
- package/modules/mediakeysBidAdapter.md +108 -0
- package/modules/medianetAnalyticsAdapter.js +48 -125
- package/modules/medianetBidAdapter.js +38 -33
- package/modules/medianetRtdProvider.js +7 -7
- package/modules/merkleIdSystem.js +19 -19
- package/modules/mgidBidAdapter.js +50 -50
- package/modules/microadBidAdapter.js +3 -3
- package/modules/multibid/index.js +15 -13
- package/modules/mwOpenLinkIdSystem.js +7 -7
- package/modules/mytargetBidAdapter.js +112 -0
- package/modules/nativoBidAdapter.js +46 -31
- package/modules/nativoBidAdapter.md +0 -1
- package/modules/naveggIdSystem.js +3 -3
- package/modules/nextMillenniumBidAdapter.js +6 -6
- package/modules/nextrollBidAdapter.js +375 -0
- package/modules/nobidBidAdapter.js +12 -11
- package/modules/novatiqIdSystem.js +8 -8
- package/modules/oguryBidAdapter.js +22 -6
- package/modules/oneVideoBidAdapter.js +20 -20
- package/modules/onomagicBidAdapter.js +16 -16
- package/modules/ooloAnalyticsAdapter.js +13 -13
- package/modules/openwebBidAdapter.js +26 -26
- package/modules/openxAnalyticsAdapter.js +33 -33
- package/modules/openxBidAdapter.js +29 -29
- package/modules/operaadsBidAdapter.js +53 -53
- package/modules/optimeraRtdProvider.js +9 -9
- package/modules/optoutBidAdapter.js +3 -3
- package/modules/orbidderBidAdapter.js +3 -3
- package/modules/outbrainBidAdapter.js +13 -13
- package/modules/ozoneBidAdapter.js +131 -131
- package/modules/padsquadBidAdapter.js +4 -4
- package/modules/parrableIdSystem.js +17 -17
- package/modules/pixfutureBidAdapter.js +45 -25
- package/modules/pixfutureBidAdapter.md +127 -0
- package/modules/prebidServerBidAdapter/index.js +109 -105
- package/modules/prebidmanagerAnalyticsAdapter.js +7 -7
- package/modules/priceFloors.js +47 -47
- package/modules/proxistoreBidAdapter.js +6 -8
- package/modules/pubCommonId.js +11 -11
- package/modules/pubProvidedIdSystem.js +3 -3
- package/modules/publinkIdSystem.js +23 -7
- package/modules/publinkIdSystem.md +7 -2
- package/modules/pubmaticAnalyticsAdapter.js +16 -16
- package/modules/pubmaticBidAdapter.js +109 -93
- package/modules/pubmaticBidAdapter.md +1 -1
- package/modules/pubperfAnalyticsAdapter.js +3 -3
- package/modules/pubwiseAnalyticsAdapter.js +6 -6
- package/modules/pubwiseBidAdapter.js +23 -23
- package/modules/pubxBidAdapter.js +2 -2
- package/modules/pubxaiAnalyticsAdapter.js +7 -7
- package/modules/pulsepointBidAdapter.js +13 -13
- package/modules/pxyzBidAdapter.js +7 -7
- package/modules/quantcastBidAdapter.js +16 -16
- package/modules/radsBidAdapter.js +5 -5
- package/modules/realvuAnalyticsAdapter.js +5 -7
- package/modules/reconciliationRtdProvider.js +6 -6
- package/modules/relaidoBidAdapter.js +44 -38
- package/modules/resetdigitalBidAdapter.js +3 -4
- package/modules/revcontentBidAdapter.js +9 -9
- package/modules/rhythmoneBidAdapter.js +17 -16
- package/modules/richaudienceBidAdapter.js +9 -9
- package/modules/riseBidAdapter.js +26 -26
- package/modules/riseBidAdapter.md +1 -3
- package/modules/roxotAnalyticsAdapter.js +14 -14
- package/modules/rtbhouseBidAdapter.js +7 -7
- package/modules/rtbsapeBidAdapter.js +3 -4
- package/modules/rtdModule/index.js +3 -3
- package/modules/rubiconAnalyticsAdapter.js +82 -82
- package/modules/rubiconBidAdapter.js +72 -68
- package/modules/scaleableAnalyticsAdapter.js +2 -2
- package/modules/seedingAllianceBidAdapter.js +231 -0
- package/modules/seedtagBidAdapter.js +10 -10
- package/modules/sharedIdSystem.js +11 -11
- package/modules/sharethroughAnalyticsAdapter.js +8 -8
- package/modules/sharethroughBidAdapter.js +20 -27
- package/modules/showheroes-bsBidAdapter.js +23 -23
- package/modules/sigmoidAnalyticsAdapter.js +4 -5
- package/modules/sirdataRtdProvider.js +34 -34
- package/modules/sizeMappingV2.js +39 -39
- package/modules/slimcutBidAdapter.js +121 -0
- package/modules/smaatoBidAdapter.js +44 -44
- package/modules/smartadserverBidAdapter.js +7 -7
- package/modules/smartxBidAdapter.js +72 -72
- package/modules/smartyadsBidAdapter.js +2 -2
- package/modules/smilewantedBidAdapter.js +6 -6
- package/modules/sonobiAnalyticsAdapter.js +23 -23
- package/modules/sortableAnalyticsAdapter.js +5 -5
- package/modules/sortableBidAdapter.js +28 -28
- package/modules/sovrnAnalyticsAdapter.js +5 -5
- package/modules/sovrnBidAdapter.js +22 -22
- package/modules/spotxBidAdapter.js +97 -83
- package/modules/sspBCBidAdapter.js +216 -21
- package/modules/sspBCBidAdapter.md +1 -1
- package/modules/staqAnalyticsAdapter.js +9 -9
- package/modules/stroeerCoreBidAdapter.js +16 -16
- package/modules/sublimeBidAdapter.js +6 -6
- package/modules/talkadsBidAdapter.js +129 -0
- package/modules/talkadsBidAdapter.md +60 -0
- package/modules/tapadIdSystem.js +3 -3
- package/modules/tappxBidAdapter.js +63 -64
- package/modules/teadsBidAdapter.js +20 -20
- package/modules/telariaBidAdapter.js +17 -17
- package/modules/temedyaBidAdapter.js +4 -4
- package/modules/terceptAnalyticsAdapter.js +4 -4
- package/modules/theAdxBidAdapter.js +16 -16
- package/modules/timeoutRtdProvider.js +15 -15
- package/modules/tpmnBidAdapter.js +3 -3
- package/modules/trionBidAdapter.js +15 -15
- package/modules/tripleliftBidAdapter.js +27 -24
- package/modules/truereachBidAdapter.js +4 -4
- package/modules/trustxBidAdapter.js +22 -18
- package/modules/ucfunnelBidAdapter.js +3 -3
- package/modules/uid2IdSystem.js +6 -6
- package/modules/underdogmediaBidAdapter.js +4 -4
- package/modules/unicornBidAdapter.js +15 -15
- package/modules/unifiedIdSystem.js +4 -4
- package/modules/unrulyBidAdapter.js +16 -16
- package/modules/userId/eids.js +9 -9
- package/modules/userId/index.js +37 -35
- package/modules/validationFpdModule/index.js +15 -15
- package/modules/vdoaiBidAdapter.js +2 -2
- package/modules/verizonMediaIdSystem.js +5 -5
- package/modules/vidazooBidAdapter.js +5 -5
- package/modules/videobyteBidAdapter.js +24 -24
- package/modules/videoreachBidAdapter.js +7 -7
- package/modules/vidoomyBidAdapter.js +105 -22
- package/modules/viewdeosDXBidAdapter.js +17 -17
- package/modules/visxBidAdapter.js +21 -29
- package/modules/voxBidAdapter.js +7 -7
- package/modules/vuukleBidAdapter.js +2 -2
- package/modules/waardexBidAdapter.js +26 -26
- package/modules/weboramaRtdProvider.js +174 -0
- package/modules/weboramaRtdProvider.md +70 -0
- package/modules/winrBidAdapter.js +27 -27
- package/modules/wipesBidAdapter.js +2 -2
- package/modules/yahoosspBidAdapter.js +637 -0
- package/modules/yahoosspBidAdapter.md +795 -0
- package/modules/yieldlabBidAdapter.js +57 -12
- package/modules/yieldlabBidAdapter.md +16 -1
- package/modules/yieldliftBidAdapter.js +9 -9
- package/modules/yieldmoBidAdapter.js +64 -50
- package/modules/yieldoneAnalyticsAdapter.js +6 -6
- package/modules/yieldoneBidAdapter.js +11 -11
- package/modules/yuktamediaAnalyticsAdapter.js +15 -15
- package/modules/zeotapIdPlusIdSystem.js +2 -2
- package/modules/zetaBidAdapter.js +6 -6
- package/modules/zeta_global_sspBidAdapter.js +14 -14
- package/package.json +1 -1
- package/src/AnalyticsAdapter.js +6 -6
- package/src/Renderer.js +10 -8
- package/src/adapterManager.js +45 -42
- package/src/adloader.js +6 -6
- package/src/ajax.js +8 -9
- package/src/auction.js +26 -23
- package/src/bidfactory.js +2 -2
- package/src/config.js +52 -50
- package/src/cpmBucketManager.js +2 -2
- package/src/prebid.js +85 -81
- package/src/storageManager.js +5 -5
- package/src/targeting.js +25 -26
- package/src/userSync.js +35 -22
- package/src/videoCache.js +2 -2
- package/test/.eslintrc.js +2 -1
- package/test/spec/modules/adfBidAdapter_spec.js +55 -0
- package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
- package/test/spec/modules/adhashBidAdapter_spec.js +155 -0
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
- package/test/spec/modules/adqueryBidAdapter_spec.js +185 -0
- package/test/spec/modules/afpBidAdapter_spec.js +306 -0
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +37 -2
- package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
- package/test/spec/modules/colossussspBidAdapter_spec.js +14 -6
- package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
- package/test/spec/modules/eplanningBidAdapter_spec.js +3 -3
- package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
- package/test/spec/modules/gridBidAdapter_spec.js +38 -2
- package/test/spec/modules/gridNMBidAdapter_spec.js +121 -47
- package/test/spec/modules/gumgumBidAdapter_spec.js +27 -6
- package/test/spec/modules/iasRtdProvider_spec.js +71 -6
- package/test/spec/modules/inskinBidAdapter_spec.js +10 -1
- package/test/spec/modules/invibesBidAdapter_spec.js +114 -2
- package/test/spec/modules/justpremiumBidAdapter_spec.js +16 -2
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +33 -7
- package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
- package/test/spec/modules/medianetAnalyticsAdapter_spec.js +39 -7
- package/test/spec/modules/medianetBidAdapter_spec.js +62 -1
- package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
- package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
- package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +120 -7
- package/test/spec/modules/publinkIdSystem_spec.js +42 -12
- package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
- package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
- package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +100 -81
- package/test/spec/modules/rubiconAnalyticsSchema.json +5 -2
- package/test/spec/modules/seedingAllianceAdapter_spec.js +186 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
- package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
- package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
- package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
- package/test/spec/modules/tappxBidAdapter_spec.js +39 -3
- package/test/spec/modules/tripleliftBidAdapter_spec.js +2 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +35 -2
- package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
- package/test/spec/modules/visxBidAdapter_spec.js +48 -4
- package/test/spec/modules/weboramaRtdProvider_spec.js +288 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
- package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
- package/test/spec/unit/pbjs_api_spec.js +4 -0
- package/test/spec/userSync_spec.js +30 -2
- package/modules/turktelekomBidAdapter.md +0 -49
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { logWarn, _each, isBoolean, isStr, isArray, inIframe, mergeDeep, deepAccess, isNumber, deepSetValue, logInfo, logError, deepClone, convertTypes } from '../src/utils.js';
|
|
2
2
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import { BANNER, VIDEO, NATIVE } from '../src/mediaTypes.js';
|
|
4
4
|
import {config} from '../src/config.js';
|
|
@@ -17,6 +17,7 @@ const DEFAULT_HEIGHT = 0;
|
|
|
17
17
|
const PREBID_NATIVE_HELP_LINK = 'http://prebid.org/dev-docs/show-native-ads.html';
|
|
18
18
|
const PUBLICATION = 'pubmatic'; // Your publication on Blue Billywig, potentially with environment (e.g. publication.bbvms.com or publication.test.bbvms.com)
|
|
19
19
|
const RENDERER_URL = 'https://pubmatic.bbvms.com/r/'.concat('$RENDERER', '.js'); // URL of the renderer application
|
|
20
|
+
const MSG_VIDEO_PLACEMENT_MISSING = 'Video.Placement param missing';
|
|
20
21
|
const CUSTOM_PARAMS = {
|
|
21
22
|
'kadpageurl': '', // Custom page url
|
|
22
23
|
'gender': '', // User gender
|
|
@@ -124,7 +125,7 @@ const BB_RENDERER = {
|
|
|
124
125
|
else if (bid.vastUrl) config.vastUrl = bid.vastUrl;
|
|
125
126
|
|
|
126
127
|
if (!bid.vastXml && !bid.vastUrl) {
|
|
127
|
-
|
|
128
|
+
logWarn(`${LOG_WARN_PREFIX}: No vastXml or vastUrl on bid, bailing...`);
|
|
128
129
|
return;
|
|
129
130
|
}
|
|
130
131
|
|
|
@@ -142,7 +143,7 @@ const BB_RENDERER = {
|
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
if (renderer) renderer.bootstrap(config, ele);
|
|
145
|
-
else
|
|
146
|
+
else logWarn(`${LOG_WARN_PREFIX}: Couldn't find a renderer with ${rendererId}`);
|
|
146
147
|
},
|
|
147
148
|
newRenderer: function(rendererCode, adUnitCode) {
|
|
148
149
|
var rendererUrl = RENDERER_URL.replace('$RENDERER', rendererCode);
|
|
@@ -155,7 +156,7 @@ const BB_RENDERER = {
|
|
|
155
156
|
try {
|
|
156
157
|
renderer.setRender(BB_RENDERER.outstreamRender);
|
|
157
158
|
} catch (err) {
|
|
158
|
-
|
|
159
|
+
logWarn(`${LOG_WARN_PREFIX}: Error tying to setRender on renderer`, err);
|
|
159
160
|
}
|
|
160
161
|
|
|
161
162
|
return renderer;
|
|
@@ -180,9 +181,9 @@ let NATIVE_ASSET_ID_TO_KEY_MAP = {};
|
|
|
180
181
|
let NATIVE_ASSET_KEY_TO_ASSET_MAP = {};
|
|
181
182
|
|
|
182
183
|
// loading NATIVE_ASSET_ID_TO_KEY_MAP
|
|
183
|
-
|
|
184
|
+
_each(NATIVE_ASSETS, anAsset => { NATIVE_ASSET_ID_TO_KEY_MAP[anAsset.ID] = anAsset.KEY });
|
|
184
185
|
// loading NATIVE_ASSET_KEY_TO_ASSET_MAP
|
|
185
|
-
|
|
186
|
+
_each(NATIVE_ASSETS, anAsset => { NATIVE_ASSET_KEY_TO_ASSET_MAP[anAsset.KEY] = anAsset });
|
|
186
187
|
|
|
187
188
|
function _getDomainFromURL(url) {
|
|
188
189
|
let anchor = document.createElement('a');
|
|
@@ -191,8 +192,8 @@ function _getDomainFromURL(url) {
|
|
|
191
192
|
}
|
|
192
193
|
|
|
193
194
|
function _parseSlotParam(paramName, paramValue) {
|
|
194
|
-
if (!
|
|
195
|
-
paramValue &&
|
|
195
|
+
if (!isStr(paramValue)) {
|
|
196
|
+
paramValue && logWarn(LOG_WARN_PREFIX + 'Ignoring param key: ' + paramName + ', expects string-value, found ' + typeof paramValue);
|
|
196
197
|
return UNDEFINED;
|
|
197
198
|
}
|
|
198
199
|
|
|
@@ -213,11 +214,11 @@ function _parseSlotParam(paramName, paramValue) {
|
|
|
213
214
|
}
|
|
214
215
|
|
|
215
216
|
function _cleanSlot(slotName) {
|
|
216
|
-
if (
|
|
217
|
+
if (isStr(slotName)) {
|
|
217
218
|
return slotName.replace(/^\s+/g, '').replace(/\s+$/g, '');
|
|
218
219
|
}
|
|
219
220
|
if (slotName) {
|
|
220
|
-
|
|
221
|
+
logWarn(BIDDER_CODE + ': adSlot must be a string. Ignoring adSlot');
|
|
221
222
|
}
|
|
222
223
|
return '';
|
|
223
224
|
}
|
|
@@ -243,7 +244,7 @@ function _parseAdSlot(bid) {
|
|
|
243
244
|
// i.e size is specified in adslot, so consider that and ignore sizes array
|
|
244
245
|
splits = splits[1].split('x');
|
|
245
246
|
if (splits.length != 2) {
|
|
246
|
-
|
|
247
|
+
logWarn(LOG_WARN_PREFIX + 'AdSlot Error: adSlot not in required format');
|
|
247
248
|
return;
|
|
248
249
|
}
|
|
249
250
|
bid.params.width = parseInt(splits[0], 10);
|
|
@@ -294,10 +295,10 @@ function _handleCustomParams(params, conf) {
|
|
|
294
295
|
value = entry.f(value, conf);
|
|
295
296
|
}
|
|
296
297
|
|
|
297
|
-
if (
|
|
298
|
+
if (isStr(value)) {
|
|
298
299
|
conf[key] = value;
|
|
299
300
|
} else {
|
|
300
|
-
|
|
301
|
+
logWarn(LOG_WARN_PREFIX + 'Ignoring param : ' + key + ' with value : ' + CUSTOM_PARAMS[key] + ', expects string-value, found ' + typeof value);
|
|
301
302
|
}
|
|
302
303
|
}
|
|
303
304
|
}
|
|
@@ -334,22 +335,22 @@ function _checkParamDataType(key, value, datatype) {
|
|
|
334
335
|
var functionToExecute;
|
|
335
336
|
switch (datatype) {
|
|
336
337
|
case DATA_TYPES.BOOLEAN:
|
|
337
|
-
functionToExecute =
|
|
338
|
+
functionToExecute = isBoolean;
|
|
338
339
|
break;
|
|
339
340
|
case DATA_TYPES.NUMBER:
|
|
340
|
-
functionToExecute =
|
|
341
|
+
functionToExecute = isNumber;
|
|
341
342
|
break;
|
|
342
343
|
case DATA_TYPES.STRING:
|
|
343
|
-
functionToExecute =
|
|
344
|
+
functionToExecute = isStr;
|
|
344
345
|
break;
|
|
345
346
|
case DATA_TYPES.ARRAY:
|
|
346
|
-
functionToExecute =
|
|
347
|
+
functionToExecute = isArray;
|
|
347
348
|
break;
|
|
348
349
|
}
|
|
349
350
|
if (functionToExecute(value)) {
|
|
350
351
|
return value;
|
|
351
352
|
}
|
|
352
|
-
|
|
353
|
+
logWarn(LOG_WARN_PREFIX + errMsg);
|
|
353
354
|
return UNDEFINED;
|
|
354
355
|
}
|
|
355
356
|
|
|
@@ -386,7 +387,7 @@ function _createNativeRequest(params) {
|
|
|
386
387
|
}
|
|
387
388
|
};
|
|
388
389
|
} else {
|
|
389
|
-
|
|
390
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Title Length is required for native ad: ' + JSON.stringify(params));
|
|
390
391
|
}
|
|
391
392
|
break;
|
|
392
393
|
case NATIVE_ASSETS.IMAGE.KEY:
|
|
@@ -405,7 +406,7 @@ function _createNativeRequest(params) {
|
|
|
405
406
|
}
|
|
406
407
|
};
|
|
407
408
|
} else {
|
|
408
|
-
|
|
409
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Image sizes is required for native ad: ' + JSON.stringify(params));
|
|
409
410
|
}
|
|
410
411
|
break;
|
|
411
412
|
case NATIVE_ASSETS.ICON.KEY:
|
|
@@ -420,7 +421,7 @@ function _createNativeRequest(params) {
|
|
|
420
421
|
}
|
|
421
422
|
};
|
|
422
423
|
} else {
|
|
423
|
-
|
|
424
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Icon sizes is required for native ad: ' + JSON.stringify(params));
|
|
424
425
|
};
|
|
425
426
|
break;
|
|
426
427
|
case NATIVE_ASSETS.VIDEO.KEY:
|
|
@@ -500,13 +501,13 @@ function _createBannerRequest(bid) {
|
|
|
500
501
|
var sizes = bid.mediaTypes.banner.sizes;
|
|
501
502
|
var format = [];
|
|
502
503
|
var bannerObj;
|
|
503
|
-
if (sizes !== UNDEFINED &&
|
|
504
|
+
if (sizes !== UNDEFINED && isArray(sizes)) {
|
|
504
505
|
bannerObj = {};
|
|
505
506
|
if (!bid.params.width && !bid.params.height) {
|
|
506
507
|
if (sizes.length === 0) {
|
|
507
508
|
// i.e. since bid.params does not have width or height, and length of sizes is 0, need to ignore this banner imp
|
|
508
509
|
bannerObj = UNDEFINED;
|
|
509
|
-
|
|
510
|
+
logWarn(LOG_WARN_PREFIX + 'Error: mediaTypes.banner.size missing for adunit: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.');
|
|
510
511
|
return bannerObj;
|
|
511
512
|
} else {
|
|
512
513
|
bannerObj.w = parseInt(sizes[0][0], 10);
|
|
@@ -529,36 +530,44 @@ function _createBannerRequest(bid) {
|
|
|
529
530
|
}
|
|
530
531
|
}
|
|
531
532
|
bannerObj.pos = 0;
|
|
532
|
-
bannerObj.topframe =
|
|
533
|
+
bannerObj.topframe = inIframe() ? 0 : 1;
|
|
533
534
|
} else {
|
|
534
|
-
|
|
535
|
+
logWarn(LOG_WARN_PREFIX + 'Error: mediaTypes.banner.size missing for adunit: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.');
|
|
535
536
|
bannerObj = UNDEFINED;
|
|
536
537
|
}
|
|
537
538
|
return bannerObj;
|
|
538
539
|
}
|
|
539
540
|
|
|
541
|
+
export function checkVideoPlacement(videoData, adUnitCode) {
|
|
542
|
+
// Check for video.placement property. If property is missing display log message.
|
|
543
|
+
if (!deepAccess(videoData, 'placement')) {
|
|
544
|
+
logWarn(MSG_VIDEO_PLACEMENT_MISSING + ' for ' + adUnitCode);
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
|
|
540
548
|
function _createVideoRequest(bid) {
|
|
541
|
-
var videoData =
|
|
549
|
+
var videoData = mergeDeep(deepAccess(bid.mediaTypes, 'video'), bid.params.video);
|
|
542
550
|
var videoObj;
|
|
543
551
|
|
|
544
552
|
if (videoData !== UNDEFINED) {
|
|
545
553
|
videoObj = {};
|
|
554
|
+
checkVideoPlacement(videoData, bid.adUnitCode);
|
|
546
555
|
for (var key in VIDEO_CUSTOM_PARAMS) {
|
|
547
556
|
if (videoData.hasOwnProperty(key)) {
|
|
548
557
|
videoObj[key] = _checkParamDataType(key, videoData[key], VIDEO_CUSTOM_PARAMS[key]);
|
|
549
558
|
}
|
|
550
559
|
}
|
|
551
560
|
// read playersize and assign to h and w.
|
|
552
|
-
if (
|
|
561
|
+
if (isArray(bid.mediaTypes.video.playerSize[0])) {
|
|
553
562
|
videoObj.w = parseInt(bid.mediaTypes.video.playerSize[0][0], 10);
|
|
554
563
|
videoObj.h = parseInt(bid.mediaTypes.video.playerSize[0][1], 10);
|
|
555
|
-
} else if (
|
|
564
|
+
} else if (isNumber(bid.mediaTypes.video.playerSize[0])) {
|
|
556
565
|
videoObj.w = parseInt(bid.mediaTypes.video.playerSize[0], 10);
|
|
557
566
|
videoObj.h = parseInt(bid.mediaTypes.video.playerSize[1], 10);
|
|
558
567
|
}
|
|
559
568
|
} else {
|
|
560
569
|
videoObj = UNDEFINED;
|
|
561
|
-
|
|
570
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Video config params missing for adunit: ' + bid.params.adUnit + ' with mediaType set as video. Ignoring video impression in the adunit.');
|
|
562
571
|
}
|
|
563
572
|
return videoObj;
|
|
564
573
|
}
|
|
@@ -566,19 +575,19 @@ function _createVideoRequest(bid) {
|
|
|
566
575
|
// support for PMP deals
|
|
567
576
|
function _addPMPDealsInImpression(impObj, bid) {
|
|
568
577
|
if (bid.params.deals) {
|
|
569
|
-
if (
|
|
578
|
+
if (isArray(bid.params.deals)) {
|
|
570
579
|
bid.params.deals.forEach(function(dealId) {
|
|
571
|
-
if (
|
|
580
|
+
if (isStr(dealId) && dealId.length > 3) {
|
|
572
581
|
if (!impObj.pmp) {
|
|
573
582
|
impObj.pmp = { private_auction: 0, deals: [] };
|
|
574
583
|
}
|
|
575
584
|
impObj.pmp.deals.push({ id: dealId });
|
|
576
585
|
} else {
|
|
577
|
-
|
|
586
|
+
logWarn(LOG_WARN_PREFIX + 'Error: deal-id present in array bid.params.deals should be a strings with more than 3 charaters length, deal-id ignored: ' + dealId);
|
|
578
587
|
}
|
|
579
588
|
});
|
|
580
589
|
} else {
|
|
581
|
-
|
|
590
|
+
logWarn(LOG_WARN_PREFIX + 'Error: bid.params.deals should be an array of strings.');
|
|
582
591
|
}
|
|
583
592
|
}
|
|
584
593
|
}
|
|
@@ -588,7 +597,7 @@ function _addDealCustomTargetings(imp, bid) {
|
|
|
588
597
|
var dctrLen;
|
|
589
598
|
if (bid.params.dctr) {
|
|
590
599
|
dctr = bid.params.dctr;
|
|
591
|
-
if (
|
|
600
|
+
if (isStr(dctr) && dctr.length > 0) {
|
|
592
601
|
var arr = dctr.split('|');
|
|
593
602
|
dctr = '';
|
|
594
603
|
arr.forEach(val => {
|
|
@@ -600,12 +609,12 @@ function _addDealCustomTargetings(imp, bid) {
|
|
|
600
609
|
}
|
|
601
610
|
imp.ext['key_val'] = dctr.trim()
|
|
602
611
|
} else {
|
|
603
|
-
|
|
612
|
+
logWarn(LOG_WARN_PREFIX + 'Ignoring param : dctr with value : ' + dctr + ', expects string-value, found empty or non-string value');
|
|
604
613
|
}
|
|
605
614
|
}
|
|
606
615
|
}
|
|
607
616
|
|
|
608
|
-
function _addJWPlayerSegmentData(imp, bid) {
|
|
617
|
+
function _addJWPlayerSegmentData(imp, bid, isS2S) {
|
|
609
618
|
var jwSegData = (bid.rtd && bid.rtd.jwplayer && bid.rtd.jwplayer.targeting) || undefined;
|
|
610
619
|
var jwPlayerData = '';
|
|
611
620
|
const jwMark = 'jw-';
|
|
@@ -619,10 +628,15 @@ function _addJWPlayerSegmentData(imp, bid) {
|
|
|
619
628
|
for (var i = 0; i < maxLength; i++) {
|
|
620
629
|
jwPlayerData += '|' + jwMark + jwSegData.segments[i] + '=1';
|
|
621
630
|
}
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
631
|
+
|
|
632
|
+
var ext;
|
|
633
|
+
|
|
634
|
+
if (isS2S) {
|
|
635
|
+
(imp.dctr === undefined || imp.dctr.length == 0) ? imp.dctr = jwPlayerData : imp.dctr += '|' + jwPlayerData;
|
|
636
|
+
} else {
|
|
637
|
+
ext = imp.ext;
|
|
638
|
+
ext && ext.key_val === undefined ? ext.key_val = jwPlayerData : ext.key_val += '|' + jwPlayerData;
|
|
639
|
+
}
|
|
626
640
|
}
|
|
627
641
|
|
|
628
642
|
function _createImpressionObject(bid, conf) {
|
|
@@ -662,7 +676,7 @@ function _createImpressionObject(bid, conf) {
|
|
|
662
676
|
if (!isInvalidNativeRequest) {
|
|
663
677
|
impObj.native = nativeObj;
|
|
664
678
|
} else {
|
|
665
|
-
|
|
679
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Error in Native adunit ' + bid.params.adUnit + '. Ignoring the adunit. Refer to ' + PREBID_NATIVE_HELP_LINK + ' for more details.');
|
|
666
680
|
}
|
|
667
681
|
break;
|
|
668
682
|
case VIDEO:
|
|
@@ -680,9 +694,9 @@ function _createImpressionObject(bid, conf) {
|
|
|
680
694
|
pos: 0,
|
|
681
695
|
w: bid.params.width,
|
|
682
696
|
h: bid.params.height,
|
|
683
|
-
topframe:
|
|
697
|
+
topframe: inIframe() ? 0 : 1
|
|
684
698
|
};
|
|
685
|
-
if (
|
|
699
|
+
if (isArray(sizes) && sizes.length > 1) {
|
|
686
700
|
sizes = sizes.splice(1, sizes.length - 1);
|
|
687
701
|
sizes.forEach(size => {
|
|
688
702
|
format.push({
|
|
@@ -705,31 +719,31 @@ function _createImpressionObject(bid, conf) {
|
|
|
705
719
|
}
|
|
706
720
|
|
|
707
721
|
function _addImpressionFPD(imp, bid) {
|
|
708
|
-
const ortb2 = {...
|
|
722
|
+
const ortb2 = {...deepAccess(bid, 'ortb2Imp.ext.data')};
|
|
709
723
|
Object.keys(ortb2).forEach(prop => {
|
|
710
724
|
/**
|
|
711
725
|
* Prebid AdSlot
|
|
712
726
|
* @type {(string|undefined)}
|
|
713
727
|
*/
|
|
714
728
|
if (prop === 'pbadslot') {
|
|
715
|
-
if (typeof ortb2[prop] === 'string' && ortb2[prop])
|
|
729
|
+
if (typeof ortb2[prop] === 'string' && ortb2[prop]) deepSetValue(imp, 'ext.data.pbadslot', ortb2[prop]);
|
|
716
730
|
} else if (prop === 'adserver') {
|
|
717
731
|
/**
|
|
718
732
|
* Copy GAM AdUnit and Name to imp
|
|
719
733
|
*/
|
|
720
734
|
['name', 'adslot'].forEach(name => {
|
|
721
735
|
/** @type {(string|undefined)} */
|
|
722
|
-
const value =
|
|
736
|
+
const value = deepAccess(ortb2, `adserver.${name}`);
|
|
723
737
|
if (typeof value === 'string' && value) {
|
|
724
|
-
|
|
738
|
+
deepSetValue(imp, `ext.data.adserver.${name.toLowerCase()}`, value);
|
|
725
739
|
// copy GAM ad unit id as imp[].ext.dfp_ad_unit_code
|
|
726
740
|
if (name === 'adslot') {
|
|
727
|
-
|
|
741
|
+
deepSetValue(imp, `ext.dfp_ad_unit_code`, value);
|
|
728
742
|
}
|
|
729
743
|
}
|
|
730
744
|
});
|
|
731
745
|
} else {
|
|
732
|
-
|
|
746
|
+
deepSetValue(imp, `ext.data.${prop}`, ortb2[prop]);
|
|
733
747
|
}
|
|
734
748
|
});
|
|
735
749
|
}
|
|
@@ -746,7 +760,7 @@ function _addFloorFromFloorModule(impObj, bid) {
|
|
|
746
760
|
if (impObj[mediaType].w && impObj[mediaType].h) {
|
|
747
761
|
sizesArray.push([impObj[mediaType].w, impObj[mediaType].h]);
|
|
748
762
|
}
|
|
749
|
-
if (
|
|
763
|
+
if (isArray(impObj[mediaType].format)) {
|
|
750
764
|
impObj[mediaType].format.forEach(size => sizesArray.push([size.w, size.h]));
|
|
751
765
|
}
|
|
752
766
|
}
|
|
@@ -757,16 +771,16 @@ function _addFloorFromFloorModule(impObj, bid) {
|
|
|
757
771
|
|
|
758
772
|
sizesArray.forEach(size => {
|
|
759
773
|
let floorInfo = bid.getFloor({ currency: impObj.bidfloorcur, mediaType: mediaType, size: size });
|
|
760
|
-
|
|
774
|
+
logInfo(LOG_WARN_PREFIX, 'floor from floor module returned for mediatype:', mediaType, ' and size:', size, ' is: currency', floorInfo.currency, 'floor', floorInfo.floor);
|
|
761
775
|
if (typeof floorInfo === 'object' && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) {
|
|
762
776
|
let mediaTypeFloor = parseFloat(floorInfo.floor);
|
|
763
|
-
|
|
777
|
+
logInfo(LOG_WARN_PREFIX, 'floor from floor module:', mediaTypeFloor, 'previous floor value', bidFloor, 'Min:', Math.min(mediaTypeFloor, bidFloor));
|
|
764
778
|
if (bidFloor === -1) {
|
|
765
779
|
bidFloor = mediaTypeFloor;
|
|
766
780
|
} else {
|
|
767
781
|
bidFloor = Math.min(mediaTypeFloor, bidFloor)
|
|
768
782
|
}
|
|
769
|
-
|
|
783
|
+
logInfo(LOG_WARN_PREFIX, 'new floor value:', bidFloor);
|
|
770
784
|
}
|
|
771
785
|
});
|
|
772
786
|
}
|
|
@@ -775,18 +789,18 @@ function _addFloorFromFloorModule(impObj, bid) {
|
|
|
775
789
|
// get highest from impObj.bidfllor and floor from floor module
|
|
776
790
|
// as we are using Math.max, it is ok if we have not got any floor from floorModule, then value of bidFloor will be -1
|
|
777
791
|
if (impObj.bidfloor) {
|
|
778
|
-
|
|
792
|
+
logInfo(LOG_WARN_PREFIX, 'floor from floor module:', bidFloor, 'impObj.bidfloor', impObj.bidfloor, 'Max:', Math.max(bidFloor, impObj.bidfloor));
|
|
779
793
|
bidFloor = Math.max(bidFloor, impObj.bidfloor)
|
|
780
794
|
}
|
|
781
795
|
|
|
782
796
|
// assign value only if bidFloor is > 0
|
|
783
797
|
impObj.bidfloor = ((!isNaN(bidFloor) && bidFloor > 0) ? bidFloor : UNDEFINED);
|
|
784
|
-
|
|
798
|
+
logInfo(LOG_WARN_PREFIX, 'new impObj.bidfloor value:', impObj.bidfloor);
|
|
785
799
|
}
|
|
786
800
|
|
|
787
801
|
function _getFlocId(validBidRequests, flocFormat) {
|
|
788
802
|
var flocIdObject = null;
|
|
789
|
-
var flocId =
|
|
803
|
+
var flocId = deepAccess(validBidRequests, '0.userId.flocId');
|
|
790
804
|
if (flocId && flocId.id) {
|
|
791
805
|
switch (flocFormat) {
|
|
792
806
|
case FLOC_FORMAT.SEGMENT:
|
|
@@ -837,7 +851,7 @@ function _handleFlocId(payload, validBidRequests) {
|
|
|
837
851
|
}
|
|
838
852
|
|
|
839
853
|
function _handleEids(payload, validBidRequests) {
|
|
840
|
-
let bidUserIdAsEids =
|
|
854
|
+
let bidUserIdAsEids = deepAccess(validBidRequests, '0.userIdAsEids');
|
|
841
855
|
let flocObject = _getFlocId(validBidRequests, FLOC_FORMAT.EID);
|
|
842
856
|
if (flocObject) {
|
|
843
857
|
if (!bidUserIdAsEids) {
|
|
@@ -845,8 +859,8 @@ function _handleEids(payload, validBidRequests) {
|
|
|
845
859
|
}
|
|
846
860
|
bidUserIdAsEids.push(flocObject);
|
|
847
861
|
}
|
|
848
|
-
if (
|
|
849
|
-
|
|
862
|
+
if (isArray(bidUserIdAsEids) && bidUserIdAsEids.length > 0) {
|
|
863
|
+
deepSetValue(payload, 'user.eids', bidUserIdAsEids);
|
|
850
864
|
}
|
|
851
865
|
}
|
|
852
866
|
|
|
@@ -855,7 +869,7 @@ function _checkMediaType(bid, newBid) {
|
|
|
855
869
|
if (bid.ext && bid.ext['BidType'] != undefined) {
|
|
856
870
|
newBid.mediaType = MEDIATYPE[bid.ext.BidType];
|
|
857
871
|
} else {
|
|
858
|
-
|
|
872
|
+
logInfo(LOG_WARN_PREFIX + 'bid.ext.BidType does not exist, checking alternatively for mediaType')
|
|
859
873
|
var adm = bid.adm;
|
|
860
874
|
var admStr = '';
|
|
861
875
|
var videoRegex = new RegExp(/VAST\s+version/);
|
|
@@ -870,7 +884,7 @@ function _checkMediaType(bid, newBid) {
|
|
|
870
884
|
newBid.mediaType = NATIVE;
|
|
871
885
|
}
|
|
872
886
|
} catch (e) {
|
|
873
|
-
|
|
887
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Cannot parse native reponse for ad response: ' + adm);
|
|
874
888
|
}
|
|
875
889
|
}
|
|
876
890
|
}
|
|
@@ -883,7 +897,7 @@ function _parseNativeResponse(bid, newBid) {
|
|
|
883
897
|
try {
|
|
884
898
|
adm = JSON.parse(bid.adm.replace(/\\/g, ''));
|
|
885
899
|
} catch (ex) {
|
|
886
|
-
|
|
900
|
+
logWarn(LOG_WARN_PREFIX + 'Error: Cannot parse native reponse for ad response: ' + newBid.adm);
|
|
887
901
|
return;
|
|
888
902
|
}
|
|
889
903
|
if (adm && adm.native && adm.native.assets && adm.native.assets.length > 0) {
|
|
@@ -943,7 +957,7 @@ function _blockedIabCategoriesValidation(payload, blockedIabCategories) {
|
|
|
943
957
|
if (typeof category === 'string') { // only strings
|
|
944
958
|
return true;
|
|
945
959
|
} else {
|
|
946
|
-
|
|
960
|
+
logWarn(LOG_WARN_PREFIX + 'bcat: Each category should be a string, ignoring category: ' + category);
|
|
947
961
|
return false;
|
|
948
962
|
}
|
|
949
963
|
})
|
|
@@ -952,11 +966,11 @@ function _blockedIabCategoriesValidation(payload, blockedIabCategories) {
|
|
|
952
966
|
if (category.length > 3) {
|
|
953
967
|
return arr.indexOf(category) === index; // unique value only
|
|
954
968
|
} else {
|
|
955
|
-
|
|
969
|
+
logWarn(LOG_WARN_PREFIX + 'bcat: Each category should have a value of a length of more than 3 characters, ignoring category: ' + category)
|
|
956
970
|
}
|
|
957
971
|
});
|
|
958
972
|
if (blockedIabCategories.length > 0) {
|
|
959
|
-
|
|
973
|
+
logWarn(LOG_WARN_PREFIX + 'bcat: Selected: ', blockedIabCategories);
|
|
960
974
|
payload.bcat = blockedIabCategories;
|
|
961
975
|
}
|
|
962
976
|
}
|
|
@@ -979,7 +993,7 @@ function _assignRenderer(newBid, request) {
|
|
|
979
993
|
}
|
|
980
994
|
|
|
981
995
|
function isNonEmptyArray(test) {
|
|
982
|
-
if (
|
|
996
|
+
if (isArray(test) === true) {
|
|
983
997
|
if (test.length > 0) {
|
|
984
998
|
return true;
|
|
985
999
|
}
|
|
@@ -999,27 +1013,27 @@ export const spec = {
|
|
|
999
1013
|
*/
|
|
1000
1014
|
isBidRequestValid: bid => {
|
|
1001
1015
|
if (bid && bid.params) {
|
|
1002
|
-
if (!
|
|
1003
|
-
|
|
1016
|
+
if (!isStr(bid.params.publisherId)) {
|
|
1017
|
+
logWarn(LOG_WARN_PREFIX + 'Error: publisherId is mandatory and cannot be numeric (wrap it in quotes in your config). Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(bid));
|
|
1004
1018
|
return false;
|
|
1005
1019
|
}
|
|
1006
1020
|
// video ad validation
|
|
1007
1021
|
if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(VIDEO)) {
|
|
1008
1022
|
// bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array
|
|
1009
|
-
let mediaTypesVideoMimes =
|
|
1010
|
-
let paramsVideoMimes =
|
|
1023
|
+
let mediaTypesVideoMimes = deepAccess(bid.mediaTypes, 'video.mimes');
|
|
1024
|
+
let paramsVideoMimes = deepAccess(bid, 'params.video.mimes');
|
|
1011
1025
|
if (isNonEmptyArray(mediaTypesVideoMimes) === false && isNonEmptyArray(paramsVideoMimes) === false) {
|
|
1012
|
-
|
|
1026
|
+
logWarn(LOG_WARN_PREFIX + 'Error: For video ads, bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(bid));
|
|
1013
1027
|
return false;
|
|
1014
1028
|
}
|
|
1015
1029
|
|
|
1016
1030
|
if (!bid.mediaTypes[VIDEO].hasOwnProperty('context')) {
|
|
1017
|
-
|
|
1031
|
+
logError(`${LOG_WARN_PREFIX}: no context specified in bid. Rejecting bid: `, bid);
|
|
1018
1032
|
return false;
|
|
1019
1033
|
}
|
|
1020
1034
|
|
|
1021
1035
|
if (bid.mediaTypes[VIDEO].context === 'outstream' &&
|
|
1022
|
-
!
|
|
1036
|
+
!isStr(bid.params.outstreamAU) &&
|
|
1023
1037
|
!bid.hasOwnProperty('renderer') &&
|
|
1024
1038
|
!bid.mediaTypes[VIDEO].hasOwnProperty('renderer')) {
|
|
1025
1039
|
// we are here since outstream ad-unit is provided without outstreamAU and renderer
|
|
@@ -1029,10 +1043,10 @@ export const spec = {
|
|
|
1029
1043
|
|
|
1030
1044
|
if (bid.mediaTypes.hasOwnProperty(BANNER) || bid.mediaTypes.hasOwnProperty(NATIVE)) {
|
|
1031
1045
|
delete bid.mediaTypes[VIDEO];
|
|
1032
|
-
|
|
1046
|
+
logWarn(`${LOG_WARN_PREFIX}: for "outstream" bids either outstreamAU parameter must be provided or ad unit supplied renderer is required. Rejecting mediatype Video of bid: `, bid);
|
|
1033
1047
|
return true;
|
|
1034
1048
|
} else {
|
|
1035
|
-
|
|
1049
|
+
logError(`${LOG_WARN_PREFIX}: for "outstream" bids either outstreamAU parameter must be provided or ad unit supplied renderer is required. Rejecting bid: `, bid);
|
|
1036
1050
|
return false;
|
|
1037
1051
|
}
|
|
1038
1052
|
}
|
|
@@ -1061,7 +1075,7 @@ export const spec = {
|
|
|
1061
1075
|
var blockedIabCategories = [];
|
|
1062
1076
|
|
|
1063
1077
|
validBidRequests.forEach(originalBid => {
|
|
1064
|
-
bid =
|
|
1078
|
+
bid = deepClone(originalBid);
|
|
1065
1079
|
bid.params.adSlot = bid.params.adSlot || '';
|
|
1066
1080
|
_parseAdSlot(bid);
|
|
1067
1081
|
if (bid.params.hasOwnProperty('video')) {
|
|
@@ -1070,7 +1084,7 @@ export const spec = {
|
|
|
1070
1084
|
// If we have a native mediaType configured alongside banner, its ok if the banner size is not set in width and height
|
|
1071
1085
|
// The corresponding banner imp object will not be generated, but we still want the native object to be sent, hence the following check
|
|
1072
1086
|
if (!(bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(NATIVE)) && bid.params.width === 0 && bid.params.height === 0) {
|
|
1073
|
-
|
|
1087
|
+
logWarn(LOG_WARN_PREFIX + 'Skipping the non-standard adslot: ', bid.params.adSlot, JSON.stringify(bid));
|
|
1074
1088
|
return;
|
|
1075
1089
|
}
|
|
1076
1090
|
}
|
|
@@ -1080,14 +1094,14 @@ export const spec = {
|
|
|
1080
1094
|
if (bidCurrency === '') {
|
|
1081
1095
|
bidCurrency = bid.params.currency || UNDEFINED;
|
|
1082
1096
|
} else if (bid.params.hasOwnProperty('currency') && bidCurrency !== bid.params.currency) {
|
|
1083
|
-
|
|
1097
|
+
logWarn(LOG_WARN_PREFIX + 'Currency specifier ignored. Only one currency permitted.');
|
|
1084
1098
|
}
|
|
1085
1099
|
bid.params.currency = bidCurrency;
|
|
1086
1100
|
// check if dctr is added to more than 1 adunit
|
|
1087
|
-
if (bid.params.hasOwnProperty('dctr') &&
|
|
1101
|
+
if (bid.params.hasOwnProperty('dctr') && isStr(bid.params.dctr)) {
|
|
1088
1102
|
dctrArr.push(bid.params.dctr);
|
|
1089
1103
|
}
|
|
1090
|
-
if (bid.params.hasOwnProperty('bcat') &&
|
|
1104
|
+
if (bid.params.hasOwnProperty('bcat') && isArray(bid.params.bcat)) {
|
|
1091
1105
|
blockedIabCategories = blockedIabCategories.concat(bid.params.bcat);
|
|
1092
1106
|
}
|
|
1093
1107
|
var impObj = _createImpressionObject(bid, conf);
|
|
@@ -1130,7 +1144,7 @@ export const spec = {
|
|
|
1130
1144
|
}
|
|
1131
1145
|
|
|
1132
1146
|
// passing transactionId in source.tid
|
|
1133
|
-
|
|
1147
|
+
deepSetValue(payload, 'source.tid', conf.transactionId);
|
|
1134
1148
|
|
|
1135
1149
|
// test bids
|
|
1136
1150
|
if (window.location.href.indexOf('pubmaticTest=true') !== -1) {
|
|
@@ -1139,23 +1153,23 @@ export const spec = {
|
|
|
1139
1153
|
|
|
1140
1154
|
// adding schain object
|
|
1141
1155
|
if (validBidRequests[0].schain) {
|
|
1142
|
-
|
|
1156
|
+
deepSetValue(payload, 'source.ext.schain', validBidRequests[0].schain);
|
|
1143
1157
|
}
|
|
1144
1158
|
|
|
1145
1159
|
// Attaching GDPR Consent Params
|
|
1146
1160
|
if (bidderRequest && bidderRequest.gdprConsent) {
|
|
1147
|
-
|
|
1148
|
-
|
|
1161
|
+
deepSetValue(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
|
|
1162
|
+
deepSetValue(payload, 'regs.ext.gdpr', (bidderRequest.gdprConsent.gdprApplies ? 1 : 0));
|
|
1149
1163
|
}
|
|
1150
1164
|
|
|
1151
1165
|
// CCPA
|
|
1152
1166
|
if (bidderRequest && bidderRequest.uspConsent) {
|
|
1153
|
-
|
|
1167
|
+
deepSetValue(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
1154
1168
|
}
|
|
1155
1169
|
|
|
1156
1170
|
// coppa compliance
|
|
1157
1171
|
if (config.getConfig('coppa') === true) {
|
|
1158
|
-
|
|
1172
|
+
deepSetValue(payload, 'regs.coppa', 1);
|
|
1159
1173
|
}
|
|
1160
1174
|
|
|
1161
1175
|
_handleEids(payload, validBidRequests);
|
|
@@ -1164,10 +1178,10 @@ export const spec = {
|
|
|
1164
1178
|
// First Party Data
|
|
1165
1179
|
const commonFpd = config.getConfig('ortb2') || {};
|
|
1166
1180
|
if (commonFpd.site) {
|
|
1167
|
-
|
|
1181
|
+
mergeDeep(payload, {site: commonFpd.site});
|
|
1168
1182
|
}
|
|
1169
1183
|
if (commonFpd.user) {
|
|
1170
|
-
|
|
1184
|
+
mergeDeep(payload, {user: commonFpd.user});
|
|
1171
1185
|
}
|
|
1172
1186
|
|
|
1173
1187
|
// Note: Do not move this block up
|
|
@@ -1205,12 +1219,12 @@ export const spec = {
|
|
|
1205
1219
|
let parsedRequest = JSON.parse(request.data);
|
|
1206
1220
|
let parsedReferrer = parsedRequest.site && parsedRequest.site.ref ? parsedRequest.site.ref : '';
|
|
1207
1221
|
try {
|
|
1208
|
-
if (response.body && response.body.seatbid &&
|
|
1222
|
+
if (response.body && response.body.seatbid && isArray(response.body.seatbid)) {
|
|
1209
1223
|
// Supporting multiple bid responses for same adSize
|
|
1210
1224
|
respCur = response.body.cur || respCur;
|
|
1211
1225
|
response.body.seatbid.forEach(seatbidder => {
|
|
1212
1226
|
seatbidder.bid &&
|
|
1213
|
-
|
|
1227
|
+
isArray(seatbidder.bid) &&
|
|
1214
1228
|
seatbidder.bid.forEach(bid => {
|
|
1215
1229
|
let newBid = {
|
|
1216
1230
|
requestId: bid.impid,
|
|
@@ -1276,7 +1290,7 @@ export const spec = {
|
|
|
1276
1290
|
});
|
|
1277
1291
|
}
|
|
1278
1292
|
} catch (error) {
|
|
1279
|
-
|
|
1293
|
+
logError(error);
|
|
1280
1294
|
}
|
|
1281
1295
|
return bidResponses;
|
|
1282
1296
|
},
|
|
@@ -1322,8 +1336,10 @@ export const spec = {
|
|
|
1322
1336
|
* @param {Boolean} isOpenRtb boolean to check openrtb2 protocol
|
|
1323
1337
|
* @return {Object} params bid params
|
|
1324
1338
|
*/
|
|
1325
|
-
|
|
1326
|
-
|
|
1339
|
+
|
|
1340
|
+
transformBidParams: function (params, isOpenRtb, adUnit, bidRequests) {
|
|
1341
|
+
_addJWPlayerSegmentData(params, adUnit.bids[0], true);
|
|
1342
|
+
return convertTypes({
|
|
1327
1343
|
'publisherId': 'string',
|
|
1328
1344
|
'adSlot': 'string'
|
|
1329
1345
|
}, params);
|
|
@@ -25,7 +25,7 @@ var adUnits = [
|
|
|
25
25
|
bidder: 'pubmatic',
|
|
26
26
|
params: {
|
|
27
27
|
publisherId: '156209', // required, must be a string, not an integer or other js type.
|
|
28
|
-
|
|
28
|
+
outstreamAU: 'renderer_test_pubmatic', // required if mediaTypes-> video-> context is 'outstream' and optional if renderer is defined in adUnits or in mediaType video. This value can be get by BlueBillyWig Team.
|
|
29
29
|
adSlot: 'pubmatic_test2', // optional, must be a string, not an integer or other js type.
|
|
30
30
|
pmzoneid: 'zone1, zone11', // optional
|
|
31
31
|
lat: '40.712775', // optional
|