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,6 +1,11 @@
|
|
|
1
1
|
import Adapter from '../../src/adapter.js';
|
|
2
2
|
import { createBid } from '../../src/bidfactory.js';
|
|
3
|
-
import
|
|
3
|
+
import {
|
|
4
|
+
getPrebidInternal, logError, isStr, isPlainObject, logWarn, generateUUID, bind, logMessage,
|
|
5
|
+
triggerPixel, insertUserSyncIframe, deepAccess, mergeDeep, deepSetValue, cleanObj, parseSizesInput,
|
|
6
|
+
getBidRequest, getDefinedParams, createTrackPixelHtml, pick, deepClone, uniques, flatten, isNumber,
|
|
7
|
+
isEmpty, isArray, logInfo
|
|
8
|
+
} from '../../src/utils.js';
|
|
4
9
|
import CONSTANTS from '../../src/constants.json';
|
|
5
10
|
import adapterManager from '../../src/adapterManager.js';
|
|
6
11
|
import { config } from '../../src/config.js';
|
|
@@ -12,7 +17,6 @@ import includes from 'core-js-pure/features/array/includes.js';
|
|
|
12
17
|
import { S2S_VENDORS } from './config.js';
|
|
13
18
|
import { ajax } from '../../src/ajax.js';
|
|
14
19
|
import find from 'core-js-pure/features/array/find.js';
|
|
15
|
-
import { getPrebidInternal } from '../../src/utils.js';
|
|
16
20
|
|
|
17
21
|
const getConfig = config.getConfig;
|
|
18
22
|
|
|
@@ -100,7 +104,7 @@ function updateConfigDefaultVendor(option) {
|
|
|
100
104
|
}
|
|
101
105
|
});
|
|
102
106
|
} else {
|
|
103
|
-
|
|
107
|
+
logError('Incorrect or unavailable prebid server default vendor option: ' + vendor);
|
|
104
108
|
return false;
|
|
105
109
|
}
|
|
106
110
|
}
|
|
@@ -116,7 +120,7 @@ function validateConfigRequiredProps(option) {
|
|
|
116
120
|
const keys = Object.keys(option);
|
|
117
121
|
if (['accountId', 'bidders', 'endpoint'].filter(key => {
|
|
118
122
|
if (!includes(keys, key)) {
|
|
119
|
-
|
|
123
|
+
logError(key + ' missing in server to server config');
|
|
120
124
|
return true;
|
|
121
125
|
}
|
|
122
126
|
return false;
|
|
@@ -129,14 +133,14 @@ function validateConfigRequiredProps(option) {
|
|
|
129
133
|
// could be removed later as part of a major release, if we decide to not support the old format
|
|
130
134
|
function formatUrlParams(option) {
|
|
131
135
|
['endpoint', 'syncEndpoint'].forEach((prop) => {
|
|
132
|
-
if (
|
|
136
|
+
if (isStr(option[prop])) {
|
|
133
137
|
let temp = option[prop];
|
|
134
138
|
option[prop] = { p1Consent: temp, noP1Consent: temp };
|
|
135
139
|
}
|
|
136
|
-
if (
|
|
140
|
+
if (isPlainObject(option[prop]) && (!option[prop].p1Consent || !option[prop].noP1Consent)) {
|
|
137
141
|
['p1Consent', 'noP1Consent'].forEach((conUrl) => {
|
|
138
142
|
if (!option[prop][conUrl]) {
|
|
139
|
-
|
|
143
|
+
logWarn(`s2sConfig.${prop}.${conUrl} not defined. PBS request will be skipped in some P1 scenarios.`);
|
|
140
144
|
}
|
|
141
145
|
});
|
|
142
146
|
}
|
|
@@ -171,7 +175,7 @@ function setS2sConfig(options) {
|
|
|
171
175
|
return true;
|
|
172
176
|
}
|
|
173
177
|
}
|
|
174
|
-
|
|
178
|
+
logWarn('prebidServer: s2s config is disabled');
|
|
175
179
|
return false;
|
|
176
180
|
});
|
|
177
181
|
|
|
@@ -198,13 +202,13 @@ function queueSync(bidderCodes, gdprConsent, uspConsent, s2sConfig) {
|
|
|
198
202
|
_syncCount++;
|
|
199
203
|
|
|
200
204
|
const payload = {
|
|
201
|
-
uuid:
|
|
205
|
+
uuid: generateUUID(),
|
|
202
206
|
bidders: bidderCodes,
|
|
203
207
|
account: s2sConfig.accountId
|
|
204
208
|
};
|
|
205
209
|
|
|
206
210
|
let userSyncLimit = s2sConfig.userSyncLimit;
|
|
207
|
-
if (
|
|
211
|
+
if (isNumber(userSyncLimit) && userSyncLimit > 0) {
|
|
208
212
|
payload['limit'] = userSyncLimit;
|
|
209
213
|
}
|
|
210
214
|
|
|
@@ -232,7 +236,7 @@ function queueSync(bidderCodes, gdprConsent, uspConsent, s2sConfig) {
|
|
|
232
236
|
response = JSON.parse(response);
|
|
233
237
|
doAllSyncs(response.bidder_status, s2sConfig);
|
|
234
238
|
} catch (e) {
|
|
235
|
-
|
|
239
|
+
logError(e);
|
|
236
240
|
}
|
|
237
241
|
},
|
|
238
242
|
jsonPayload,
|
|
@@ -252,7 +256,7 @@ function doAllSyncs(bidders, s2sConfig) {
|
|
|
252
256
|
|
|
253
257
|
// if PBS reports this bidder doesn't have an ID, then call the sync and recurse to the next sync entry
|
|
254
258
|
if (thisSync.no_cookie) {
|
|
255
|
-
doPreBidderSync(thisSync.usersync.type, thisSync.usersync.url, thisSync.bidder,
|
|
259
|
+
doPreBidderSync(thisSync.usersync.type, thisSync.usersync.url, thisSync.bidder, bind.call(doAllSyncs, null, bidders, s2sConfig), s2sConfig);
|
|
256
260
|
} else {
|
|
257
261
|
// bidder already has an ID, so just recurse to the next sync entry
|
|
258
262
|
doAllSyncs(bidders, s2sConfig);
|
|
@@ -287,16 +291,16 @@ function doPreBidderSync(type, url, bidder, done, s2sConfig) {
|
|
|
287
291
|
*/
|
|
288
292
|
function doBidderSync(type, url, bidder, done) {
|
|
289
293
|
if (!url) {
|
|
290
|
-
|
|
294
|
+
logError(`No sync url for bidder "${bidder}": ${url}`);
|
|
291
295
|
done();
|
|
292
296
|
} else if (type === 'image' || type === 'redirect') {
|
|
293
|
-
|
|
294
|
-
|
|
297
|
+
logMessage(`Invoking image pixel user sync for bidder: "${bidder}"`);
|
|
298
|
+
triggerPixel(url, done);
|
|
295
299
|
} else if (type == 'iframe') {
|
|
296
|
-
|
|
297
|
-
|
|
300
|
+
logMessage(`Invoking iframe user sync for bidder: "${bidder}"`);
|
|
301
|
+
insertUserSyncIframe(url, done);
|
|
298
302
|
} else {
|
|
299
|
-
|
|
303
|
+
logError(`User sync type "${type}" not supported for bidder: "${bidder}"`);
|
|
300
304
|
done();
|
|
301
305
|
}
|
|
302
306
|
}
|
|
@@ -312,7 +316,7 @@ function doClientSideSyncs(bidders, gdprConsent, uspConsent) {
|
|
|
312
316
|
if (clientAdapter && clientAdapter.registerSyncs) {
|
|
313
317
|
config.runWithBidder(
|
|
314
318
|
bidder,
|
|
315
|
-
|
|
319
|
+
bind.call(
|
|
316
320
|
clientAdapter.registerSyncs,
|
|
317
321
|
clientAdapter,
|
|
318
322
|
[],
|
|
@@ -333,12 +337,12 @@ function _appendSiteAppDevice(request, pageUrl, accountId) {
|
|
|
333
337
|
request.app.publisher = {id: accountId}
|
|
334
338
|
} else {
|
|
335
339
|
request.site = {};
|
|
336
|
-
if (
|
|
340
|
+
if (isPlainObject(config.getConfig('site'))) {
|
|
337
341
|
request.site = config.getConfig('site');
|
|
338
342
|
}
|
|
339
343
|
// set publisher.id if not already defined
|
|
340
|
-
if (!
|
|
341
|
-
|
|
344
|
+
if (!deepAccess(request.site, 'publisher.id')) {
|
|
345
|
+
deepSetValue(request.site, 'publisher.id', accountId);
|
|
342
346
|
}
|
|
343
347
|
// set site.page if not already defined
|
|
344
348
|
if (!request.site.page) {
|
|
@@ -364,7 +368,7 @@ function addBidderFirstPartyDataToRequest(request) {
|
|
|
364
368
|
const fpdConfigs = Object.keys(bidderConfig).reduce((acc, bidder) => {
|
|
365
369
|
const currBidderConfig = bidderConfig[bidder];
|
|
366
370
|
if (currBidderConfig.ortb2) {
|
|
367
|
-
const ortb2 =
|
|
371
|
+
const ortb2 = mergeDeep({}, currBidderConfig.ortb2);
|
|
368
372
|
|
|
369
373
|
acc.push({
|
|
370
374
|
bidders: [ bidder ],
|
|
@@ -375,7 +379,7 @@ function addBidderFirstPartyDataToRequest(request) {
|
|
|
375
379
|
}, []);
|
|
376
380
|
|
|
377
381
|
if (fpdConfigs.length) {
|
|
378
|
-
|
|
382
|
+
deepSetValue(request, 'ext.prebid.bidderconfig', fpdConfigs);
|
|
379
383
|
}
|
|
380
384
|
}
|
|
381
385
|
|
|
@@ -442,13 +446,13 @@ let wurlMap = {};
|
|
|
442
446
|
* @param {string} wurl events.winurl passed from prebidServer as wurl
|
|
443
447
|
*/
|
|
444
448
|
function addWurl(auctionId, adId, wurl) {
|
|
445
|
-
if ([auctionId, adId].every(
|
|
449
|
+
if ([auctionId, adId].every(isStr)) {
|
|
446
450
|
wurlMap[`${auctionId}${adId}`] = wurl;
|
|
447
451
|
}
|
|
448
452
|
}
|
|
449
453
|
|
|
450
454
|
function getPbsResponseData(bidderRequests, response, pbsName, pbjsName) {
|
|
451
|
-
const bidderValues =
|
|
455
|
+
const bidderValues = deepAccess(response, `ext.${pbsName}`);
|
|
452
456
|
if (bidderValues) {
|
|
453
457
|
Object.keys(bidderValues).forEach(bidder => {
|
|
454
458
|
let biddersReq = find(bidderRequests, bidderReq => bidderReq.bidderCode === bidder);
|
|
@@ -464,7 +468,7 @@ function getPbsResponseData(bidderRequests, response, pbsName, pbjsName) {
|
|
|
464
468
|
* @param {string} adId generated value set to bidObject.adId by bidderFactory Bid()
|
|
465
469
|
*/
|
|
466
470
|
function removeWurl(auctionId, adId) {
|
|
467
|
-
if ([auctionId, adId].every(
|
|
471
|
+
if ([auctionId, adId].every(isStr)) {
|
|
468
472
|
wurlMap[`${auctionId}${adId}`] = undefined;
|
|
469
473
|
}
|
|
470
474
|
}
|
|
@@ -474,7 +478,7 @@ function removeWurl(auctionId, adId) {
|
|
|
474
478
|
* @return {(string|undefined)} events.winurl which was passed as wurl
|
|
475
479
|
*/
|
|
476
480
|
function getWurl(auctionId, adId) {
|
|
477
|
-
if ([auctionId, adId].every(
|
|
481
|
+
if ([auctionId, adId].every(isStr)) {
|
|
478
482
|
return wurlMap[`${auctionId}${adId}`];
|
|
479
483
|
}
|
|
480
484
|
}
|
|
@@ -506,7 +510,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
506
510
|
}
|
|
507
511
|
impIds.add(impressionId);
|
|
508
512
|
|
|
509
|
-
const nativeParams = processNativeAdUnitParams(
|
|
513
|
+
const nativeParams = processNativeAdUnitParams(deepAccess(adUnit, 'mediaTypes.native'));
|
|
510
514
|
let nativeAssets;
|
|
511
515
|
if (nativeParams) {
|
|
512
516
|
try {
|
|
@@ -516,19 +520,19 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
516
520
|
function newAsset(obj) {
|
|
517
521
|
return Object.assign({
|
|
518
522
|
required: params.required ? 1 : 0
|
|
519
|
-
}, obj ?
|
|
523
|
+
}, obj ? cleanObj(obj) : {});
|
|
520
524
|
}
|
|
521
525
|
|
|
522
526
|
switch (type) {
|
|
523
527
|
case 'image':
|
|
524
528
|
case 'icon':
|
|
525
529
|
let imgTypeId = nativeImgIdMap[type];
|
|
526
|
-
let asset =
|
|
530
|
+
let asset = cleanObj({
|
|
527
531
|
type: imgTypeId,
|
|
528
|
-
w:
|
|
529
|
-
h:
|
|
530
|
-
wmin:
|
|
531
|
-
hmin:
|
|
532
|
+
w: deepAccess(params, 'sizes.0'),
|
|
533
|
+
h: deepAccess(params, 'sizes.1'),
|
|
534
|
+
wmin: deepAccess(params, 'aspect_ratios.0.min_width'),
|
|
535
|
+
hmin: deepAccess(params, 'aspect_ratios.0.min_height')
|
|
532
536
|
});
|
|
533
537
|
if (!((asset.w && asset.h) || (asset.hmin && asset.wmin))) {
|
|
534
538
|
throw 'invalid img sizes (must provide sizes or min_height & min_width if using aspect_ratios)';
|
|
@@ -569,11 +573,11 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
569
573
|
return assets;
|
|
570
574
|
}, []);
|
|
571
575
|
} catch (e) {
|
|
572
|
-
|
|
576
|
+
logError('error creating native request: ' + String(e))
|
|
573
577
|
}
|
|
574
578
|
}
|
|
575
|
-
const videoParams =
|
|
576
|
-
const bannerParams =
|
|
579
|
+
const videoParams = deepAccess(adUnit, 'mediaTypes.video');
|
|
580
|
+
const bannerParams = deepAccess(adUnit, 'mediaTypes.banner');
|
|
577
581
|
|
|
578
582
|
adUnit.bids.forEach(bid => {
|
|
579
583
|
// OpenRTB response contains imp.id and bidder name. These are
|
|
@@ -592,7 +596,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
592
596
|
|
|
593
597
|
let mediaTypes = {};
|
|
594
598
|
if (bannerParams && bannerParams.sizes) {
|
|
595
|
-
const sizes =
|
|
599
|
+
const sizes = parseSizesInput(bannerParams.sizes);
|
|
596
600
|
|
|
597
601
|
// get banner sizes in form [{ w: <int>, h: <int> }, ...]
|
|
598
602
|
const format = sizes.map(size => {
|
|
@@ -607,10 +611,10 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
607
611
|
if (bannerParams.pos) mediaTypes['banner'].pos = bannerParams.pos;
|
|
608
612
|
}
|
|
609
613
|
|
|
610
|
-
if (!
|
|
614
|
+
if (!isEmpty(videoParams)) {
|
|
611
615
|
if (videoParams.context === 'outstream' && !videoParams.renderer && !adUnit.renderer) {
|
|
612
616
|
// Don't push oustream w/o renderer to request object.
|
|
613
|
-
|
|
617
|
+
logError('Outstream bid without renderer cannot be sent to Prebid Server.');
|
|
614
618
|
} else {
|
|
615
619
|
if (videoParams.context === 'instream' && !videoParams.hasOwnProperty('placement')) {
|
|
616
620
|
videoParams.placement = 1;
|
|
@@ -619,8 +623,8 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
619
623
|
mediaTypes['video'] = Object.keys(videoParams).filter(param => param !== 'context')
|
|
620
624
|
.reduce((result, param) => {
|
|
621
625
|
if (param === 'playerSize') {
|
|
622
|
-
result.w =
|
|
623
|
-
result.h =
|
|
626
|
+
result.w = deepAccess(videoParams, `${param}.0.0`);
|
|
627
|
+
result.h = deepAccess(videoParams, `${param}.0.1`);
|
|
624
628
|
} else {
|
|
625
629
|
result[param] = videoParams[param];
|
|
626
630
|
}
|
|
@@ -646,7 +650,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
646
650
|
ver: '1.2'
|
|
647
651
|
}
|
|
648
652
|
} catch (e) {
|
|
649
|
-
|
|
653
|
+
logError('error creating native request: ' + String(e))
|
|
650
654
|
}
|
|
651
655
|
}
|
|
652
656
|
|
|
@@ -659,11 +663,11 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
659
663
|
}
|
|
660
664
|
acc[bid.bidder] = (s2sConfig.adapterOptions && s2sConfig.adapterOptions[bid.bidder]) ? Object.assign({}, bid.params, s2sConfig.adapterOptions[bid.bidder]) : bid.params;
|
|
661
665
|
return acc;
|
|
662
|
-
}, {...
|
|
666
|
+
}, {...deepAccess(adUnit, 'ortb2Imp.ext')});
|
|
663
667
|
|
|
664
668
|
const imp = { id: impressionId, ext, secure: s2sConfig.secure };
|
|
665
669
|
|
|
666
|
-
const ortb2 = {...
|
|
670
|
+
const ortb2 = {...deepAccess(adUnit, 'ortb2Imp.ext.data')};
|
|
667
671
|
Object.keys(ortb2).forEach(prop => {
|
|
668
672
|
/**
|
|
669
673
|
* Prebid AdSlot
|
|
@@ -671,7 +675,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
671
675
|
*/
|
|
672
676
|
if (prop === 'pbadslot') {
|
|
673
677
|
if (typeof ortb2[prop] === 'string' && ortb2[prop]) {
|
|
674
|
-
|
|
678
|
+
deepSetValue(imp, 'ext.data.pbadslot', ortb2[prop]);
|
|
675
679
|
} else {
|
|
676
680
|
// remove pbadslot property if it doesn't meet the spec
|
|
677
681
|
delete imp.ext.data.pbadslot;
|
|
@@ -682,13 +686,13 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
682
686
|
*/
|
|
683
687
|
['name', 'adslot'].forEach(name => {
|
|
684
688
|
/** @type {(string|undefined)} */
|
|
685
|
-
const value =
|
|
689
|
+
const value = deepAccess(ortb2, `adserver.${name}`);
|
|
686
690
|
if (typeof value === 'string' && value) {
|
|
687
|
-
|
|
691
|
+
deepSetValue(imp, `ext.data.adserver.${name.toLowerCase()}`, value);
|
|
688
692
|
}
|
|
689
693
|
});
|
|
690
694
|
} else {
|
|
691
|
-
|
|
695
|
+
deepSetValue(imp, `ext.data.${prop}`, ortb2[prop]);
|
|
692
696
|
}
|
|
693
697
|
});
|
|
694
698
|
|
|
@@ -697,7 +701,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
697
701
|
// if storedAuctionResponse has been set, pass SRID
|
|
698
702
|
const storedAuctionResponseBid = find(firstBidRequest.bids, bid => (bid.adUnitCode === adUnit.code && bid.storedAuctionResponse));
|
|
699
703
|
if (storedAuctionResponseBid) {
|
|
700
|
-
|
|
704
|
+
deepSetValue(imp, 'ext.prebid.storedauctionresponse.id', storedAuctionResponseBid.storedAuctionResponse.toString());
|
|
701
705
|
}
|
|
702
706
|
|
|
703
707
|
const getFloorBid = find(firstBidRequest.bids, bid => bid.adUnitCode === adUnit.code && typeof bid.getFloor === 'function');
|
|
@@ -709,7 +713,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
709
713
|
currency: config.getConfig('currency.adServerCurrency') || DEFAULT_S2S_CURRENCY,
|
|
710
714
|
});
|
|
711
715
|
} catch (e) {
|
|
712
|
-
|
|
716
|
+
logError('PBS: getFloor threw an error: ', e);
|
|
713
717
|
}
|
|
714
718
|
if (floorInfo && floorInfo.currency && !isNaN(parseFloat(floorInfo.floor))) {
|
|
715
719
|
imp.bidfloor = parseFloat(floorInfo.floor);
|
|
@@ -723,7 +727,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
723
727
|
});
|
|
724
728
|
|
|
725
729
|
if (!imps.length) {
|
|
726
|
-
|
|
730
|
+
logError('Request to Prebid Server rejected due to invalid media type(s) in adUnit.');
|
|
727
731
|
return;
|
|
728
732
|
}
|
|
729
733
|
const request = {
|
|
@@ -775,36 +779,36 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
775
779
|
_appendSiteAppDevice(request, bidRequests[0].refererInfo.referer, s2sConfig.accountId);
|
|
776
780
|
|
|
777
781
|
// pass schain object if it is present
|
|
778
|
-
const schain =
|
|
782
|
+
const schain = deepAccess(bidRequests, '0.bids.0.schain');
|
|
779
783
|
if (schain) {
|
|
780
784
|
request.source.ext = {
|
|
781
785
|
schain: schain
|
|
782
786
|
};
|
|
783
787
|
}
|
|
784
788
|
|
|
785
|
-
if (!
|
|
789
|
+
if (!isEmpty(aliases)) {
|
|
786
790
|
request.ext.prebid.aliases = {...request.ext.prebid.aliases, ...aliases};
|
|
787
791
|
}
|
|
788
792
|
|
|
789
|
-
const bidUserIdAsEids =
|
|
790
|
-
if (
|
|
791
|
-
|
|
793
|
+
const bidUserIdAsEids = deepAccess(bidRequests, '0.bids.0.userIdAsEids');
|
|
794
|
+
if (isArray(bidUserIdAsEids) && bidUserIdAsEids.length > 0) {
|
|
795
|
+
deepSetValue(request, 'user.ext.eids', bidUserIdAsEids);
|
|
792
796
|
}
|
|
793
797
|
|
|
794
|
-
if (
|
|
795
|
-
if (requestedBidders &&
|
|
798
|
+
if (isArray(eidPermissions) && eidPermissions.length > 0) {
|
|
799
|
+
if (requestedBidders && isArray(requestedBidders)) {
|
|
796
800
|
eidPermissions.forEach(i => {
|
|
797
801
|
if (i.bidders) {
|
|
798
|
-
i.bidders = i.bidders.filter(bidder =>
|
|
802
|
+
i.bidders = i.bidders.filter(bidder => includes(requestedBidders, bidder))
|
|
799
803
|
}
|
|
800
804
|
});
|
|
801
805
|
}
|
|
802
|
-
|
|
806
|
+
deepSetValue(request, 'ext.prebid.data.eidpermissions', eidPermissions);
|
|
803
807
|
}
|
|
804
808
|
|
|
805
809
|
const multibid = config.getConfig('multibid');
|
|
806
810
|
if (multibid) {
|
|
807
|
-
|
|
811
|
+
deepSetValue(request, 'ext.prebid.multibid', multibid.reduce((result, i) => {
|
|
808
812
|
let obj = {};
|
|
809
813
|
|
|
810
814
|
Object.keys(i).forEach(key => {
|
|
@@ -824,25 +828,25 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
824
828
|
if (typeof firstBidRequest.gdprConsent.gdprApplies === 'boolean') {
|
|
825
829
|
gdprApplies = firstBidRequest.gdprConsent.gdprApplies ? 1 : 0;
|
|
826
830
|
}
|
|
827
|
-
|
|
828
|
-
|
|
831
|
+
deepSetValue(request, 'regs.ext.gdpr', gdprApplies);
|
|
832
|
+
deepSetValue(request, 'user.ext.consent', firstBidRequest.gdprConsent.consentString);
|
|
829
833
|
if (firstBidRequest.gdprConsent.addtlConsent && typeof firstBidRequest.gdprConsent.addtlConsent === 'string') {
|
|
830
|
-
|
|
834
|
+
deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', firstBidRequest.gdprConsent.addtlConsent);
|
|
831
835
|
}
|
|
832
836
|
}
|
|
833
837
|
|
|
834
838
|
// US Privacy (CCPA) support
|
|
835
839
|
if (firstBidRequest.uspConsent) {
|
|
836
|
-
|
|
840
|
+
deepSetValue(request, 'regs.ext.us_privacy', firstBidRequest.uspConsent);
|
|
837
841
|
}
|
|
838
842
|
}
|
|
839
843
|
|
|
840
844
|
if (getConfig('coppa') === true) {
|
|
841
|
-
|
|
845
|
+
deepSetValue(request, 'regs.coppa', 1);
|
|
842
846
|
}
|
|
843
847
|
|
|
844
848
|
const commonFpd = getConfig('ortb2') || {};
|
|
845
|
-
|
|
849
|
+
mergeDeep(request, commonFpd);
|
|
846
850
|
|
|
847
851
|
addBidderFirstPartyDataToRequest(request);
|
|
848
852
|
|
|
@@ -862,7 +866,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
862
866
|
let bidRequest;
|
|
863
867
|
let key = `${bid.impid}${seatbid.seat}`;
|
|
864
868
|
if (bidIdMap[key]) {
|
|
865
|
-
bidRequest =
|
|
869
|
+
bidRequest = getBidRequest(
|
|
866
870
|
bidIdMap[key],
|
|
867
871
|
bidderRequests
|
|
868
872
|
);
|
|
@@ -879,31 +883,31 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
879
883
|
|
|
880
884
|
// temporarily leaving attaching it to each bidResponse so no breaking change
|
|
881
885
|
// BUT: this is a flat map, so it should be only attached to bidderRequest, a the change above does
|
|
882
|
-
let serverResponseTimeMs =
|
|
886
|
+
let serverResponseTimeMs = deepAccess(response, ['ext', 'responsetimemillis', seatbid.seat].join('.'));
|
|
883
887
|
if (bidRequest && serverResponseTimeMs) {
|
|
884
888
|
bidRequest.serverResponseTimeMs = serverResponseTimeMs;
|
|
885
889
|
}
|
|
886
890
|
|
|
887
891
|
// Look for seatbid[].bid[].ext.prebid.bidid and place it in the bidResponse object for use in analytics adapters as 'pbsBidId'
|
|
888
|
-
const bidId =
|
|
889
|
-
if (
|
|
892
|
+
const bidId = deepAccess(bid, 'ext.prebid.bidid');
|
|
893
|
+
if (isStr(bidId)) {
|
|
890
894
|
bidObject.pbsBidId = bidId;
|
|
891
895
|
}
|
|
892
896
|
|
|
893
897
|
// store wurl by auctionId and adId so it can be accessed from the BID_WON event handler
|
|
894
|
-
if (
|
|
895
|
-
addWurl(bidRequest.auctionId, bidObject.adId,
|
|
898
|
+
if (isStr(deepAccess(bid, 'ext.prebid.events.win'))) {
|
|
899
|
+
addWurl(bidRequest.auctionId, bidObject.adId, deepAccess(bid, 'ext.prebid.events.win'));
|
|
896
900
|
}
|
|
897
901
|
|
|
898
|
-
let extPrebidTargeting =
|
|
902
|
+
let extPrebidTargeting = deepAccess(bid, 'ext.prebid.targeting');
|
|
899
903
|
|
|
900
904
|
// If ext.prebid.targeting exists, add it as a property value named 'adserverTargeting'
|
|
901
905
|
// The removal of hb_winurl and hb_bidid targeting values is temporary
|
|
902
906
|
// once we get through the transition, this block will be removed.
|
|
903
|
-
if (
|
|
907
|
+
if (isPlainObject(extPrebidTargeting)) {
|
|
904
908
|
// If wurl exists, remove hb_winurl and hb_bidid targeting attributes
|
|
905
|
-
if (
|
|
906
|
-
extPrebidTargeting =
|
|
909
|
+
if (isStr(deepAccess(bid, 'ext.prebid.events.win'))) {
|
|
910
|
+
extPrebidTargeting = getDefinedParams(extPrebidTargeting, Object.keys(extPrebidTargeting)
|
|
907
911
|
.filter(i => (i.indexOf('hb_winurl') === -1 && i.indexOf('hb_bidid') === -1)));
|
|
908
912
|
}
|
|
909
913
|
bidObject.adserverTargeting = extPrebidTargeting;
|
|
@@ -911,7 +915,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
911
915
|
|
|
912
916
|
bidObject.seatBidId = bid.id;
|
|
913
917
|
|
|
914
|
-
if (
|
|
918
|
+
if (deepAccess(bid, 'ext.prebid.type') === VIDEO) {
|
|
915
919
|
bidObject.mediaType = VIDEO;
|
|
916
920
|
let sizes = bidRequest.sizes && bidRequest.sizes[0];
|
|
917
921
|
bidObject.playerWidth = sizes[0];
|
|
@@ -930,7 +934,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
930
934
|
|
|
931
935
|
if (bid.adm) { bidObject.vastXml = bid.adm; }
|
|
932
936
|
if (!bidObject.vastUrl && bid.nurl) { bidObject.vastUrl = bid.nurl; }
|
|
933
|
-
} else if (
|
|
937
|
+
} else if (deepAccess(bid, 'ext.prebid.type') === NATIVE) {
|
|
934
938
|
bidObject.mediaType = NATIVE;
|
|
935
939
|
let adm;
|
|
936
940
|
if (typeof bid.adm === 'string') {
|
|
@@ -956,18 +960,18 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
956
960
|
});
|
|
957
961
|
}
|
|
958
962
|
|
|
959
|
-
if (
|
|
963
|
+
if (isPlainObject(adm) && Array.isArray(adm.assets)) {
|
|
960
964
|
let origAssets = nativeAssetCache[bid.impid];
|
|
961
|
-
bidObject.native =
|
|
965
|
+
bidObject.native = cleanObj(adm.assets.reduce((native, asset) => {
|
|
962
966
|
let origAsset = origAssets[asset.id];
|
|
963
|
-
if (
|
|
964
|
-
native[origAsset.img.type ? nativeImgIdMap[origAsset.img.type] : 'image'] =
|
|
967
|
+
if (isPlainObject(asset.img)) {
|
|
968
|
+
native[origAsset.img.type ? nativeImgIdMap[origAsset.img.type] : 'image'] = pick(
|
|
965
969
|
asset.img,
|
|
966
970
|
['url', 'w as width', 'h as height']
|
|
967
971
|
);
|
|
968
|
-
} else if (
|
|
972
|
+
} else if (isPlainObject(asset.title)) {
|
|
969
973
|
native['title'] = asset.title.text
|
|
970
|
-
} else if (
|
|
974
|
+
} else if (isPlainObject(asset.data)) {
|
|
971
975
|
nativeDataNames.forEach(dataType => {
|
|
972
976
|
if (nativeDataIdMap[dataType] === origAsset.data.type) {
|
|
973
977
|
native[dataType] = asset.data.value;
|
|
@@ -975,19 +979,19 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
975
979
|
});
|
|
976
980
|
}
|
|
977
981
|
return native;
|
|
978
|
-
},
|
|
982
|
+
}, cleanObj({
|
|
979
983
|
clickUrl: adm.link,
|
|
980
|
-
clickTrackers:
|
|
984
|
+
clickTrackers: deepAccess(adm, 'link.clicktrackers'),
|
|
981
985
|
impressionTrackers: trackers[nativeEventTrackerMethodMap.img],
|
|
982
986
|
javascriptTrackers: trackers[nativeEventTrackerMethodMap.js]
|
|
983
987
|
})));
|
|
984
988
|
} else {
|
|
985
|
-
|
|
989
|
+
logError('prebid server native response contained no assets');
|
|
986
990
|
}
|
|
987
991
|
} else { // banner
|
|
988
992
|
if (bid.adm && bid.nurl) {
|
|
989
993
|
bidObject.ad = bid.adm;
|
|
990
|
-
bidObject.ad +=
|
|
994
|
+
bidObject.ad += createTrackPixelHtml(decodeURIComponent(bid.nurl));
|
|
991
995
|
} else if (bid.adm) {
|
|
992
996
|
bidObject.ad = bid.adm;
|
|
993
997
|
} else if (bid.nurl) {
|
|
@@ -1004,8 +1008,8 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
1004
1008
|
if (bid.burl) { bidObject.burl = bid.burl; }
|
|
1005
1009
|
bidObject.currency = (response.cur) ? response.cur : DEFAULT_S2S_CURRENCY;
|
|
1006
1010
|
bidObject.meta = {};
|
|
1007
|
-
let extPrebidMeta =
|
|
1008
|
-
if (extPrebidMeta &&
|
|
1011
|
+
let extPrebidMeta = deepAccess(bid, 'ext.prebid.meta');
|
|
1012
|
+
if (extPrebidMeta && isPlainObject(extPrebidMeta)) { bidObject.meta = deepClone(extPrebidMeta); }
|
|
1009
1013
|
if (bid.adomain) { bidObject.meta.advertiserDomains = bid.adomain; }
|
|
1010
1014
|
|
|
1011
1015
|
// the OpenRTB location for "TTL" as understood by Prebid.js is "exp" (expiration).
|
|
@@ -1028,9 +1032,9 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
1028
1032
|
*/
|
|
1029
1033
|
function bidWonHandler(bid) {
|
|
1030
1034
|
const wurl = getWurl(bid.auctionId, bid.adId);
|
|
1031
|
-
if (
|
|
1032
|
-
|
|
1033
|
-
|
|
1035
|
+
if (isStr(wurl)) {
|
|
1036
|
+
logMessage(`Invoking image pixel for wurl on BID_WIN: "${wurl}"`);
|
|
1037
|
+
triggerPixel(wurl);
|
|
1034
1038
|
|
|
1035
1039
|
// remove from wurl cache, since the wurl url was called
|
|
1036
1040
|
removeWurl(bid.auctionId, bid.adId);
|
|
@@ -1041,7 +1045,7 @@ function hasPurpose1Consent(gdprConsent) {
|
|
|
1041
1045
|
let result = true;
|
|
1042
1046
|
if (gdprConsent) {
|
|
1043
1047
|
if (gdprConsent.gdprApplies && gdprConsent.apiVersion === 2) {
|
|
1044
|
-
result = !!(
|
|
1048
|
+
result = !!(deepAccess(gdprConsent, 'vendorData.purpose.consents.1') === true);
|
|
1045
1049
|
}
|
|
1046
1050
|
}
|
|
1047
1051
|
return result;
|
|
@@ -1068,7 +1072,7 @@ export function PrebidServer() {
|
|
|
1068
1072
|
|
|
1069
1073
|
/* Prebid executes this function when the page asks to send out bid requests */
|
|
1070
1074
|
baseAdapter.callBids = function(s2sBidRequest, bidRequests, addBidResponse, done, ajax) {
|
|
1071
|
-
const adUnits =
|
|
1075
|
+
const adUnits = deepClone(s2sBidRequest.ad_units);
|
|
1072
1076
|
let { gdprConsent, uspConsent } = getConsentData(bidRequests);
|
|
1073
1077
|
|
|
1074
1078
|
// at this point ad units should have a size array either directly or mapped so filter for that
|
|
@@ -1078,9 +1082,9 @@ export function PrebidServer() {
|
|
|
1078
1082
|
|
|
1079
1083
|
// in case config.bidders contains invalid bidders, we only process those we sent requests for
|
|
1080
1084
|
const requestedBidders = validAdUnits
|
|
1081
|
-
.map(adUnit => adUnit.bids.map(bid => bid.bidder).filter(
|
|
1082
|
-
.reduce(
|
|
1083
|
-
.filter(
|
|
1085
|
+
.map(adUnit => adUnit.bids.map(bid => bid.bidder).filter(uniques))
|
|
1086
|
+
.reduce(flatten)
|
|
1087
|
+
.filter(uniques);
|
|
1084
1088
|
|
|
1085
1089
|
if (Array.isArray(_s2sConfigs)) {
|
|
1086
1090
|
if (s2sBidRequest.s2sConfig && s2sBidRequest.s2sConfig.syncEndpoint && getMatchingConsentUrl(s2sBidRequest.s2sConfig.syncEndpoint, gdprConsent)) {
|
|
@@ -1093,7 +1097,7 @@ export function PrebidServer() {
|
|
|
1093
1097
|
|
|
1094
1098
|
const request = OPEN_RTB_PROTOCOL.buildRequest(s2sBidRequest, bidRequests, validAdUnits, s2sBidRequest.s2sConfig, requestedBidders);
|
|
1095
1099
|
const requestJson = request && JSON.stringify(request);
|
|
1096
|
-
|
|
1100
|
+
logInfo('BidRequest: ' + requestJson);
|
|
1097
1101
|
const endpointUrl = getMatchingConsentUrl(s2sBidRequest.s2sConfig.endpoint, gdprConsent);
|
|
1098
1102
|
if (request && requestJson && endpointUrl) {
|
|
1099
1103
|
ajax(
|
|
@@ -1106,7 +1110,7 @@ export function PrebidServer() {
|
|
|
1106
1110
|
{ contentType: 'text/plain', withCredentials: true }
|
|
1107
1111
|
);
|
|
1108
1112
|
} else {
|
|
1109
|
-
|
|
1113
|
+
logError('PBS request not made. Check endpoints.');
|
|
1110
1114
|
}
|
|
1111
1115
|
}
|
|
1112
1116
|
};
|
|
@@ -1134,11 +1138,11 @@ export function PrebidServer() {
|
|
|
1134
1138
|
|
|
1135
1139
|
bidderRequests.forEach(bidderRequest => events.emit(CONSTANTS.EVENTS.BIDDER_DONE, bidderRequest));
|
|
1136
1140
|
} catch (error) {
|
|
1137
|
-
|
|
1141
|
+
logError(error);
|
|
1138
1142
|
}
|
|
1139
1143
|
|
|
1140
1144
|
if (!result || (result.status && includes(result.status, 'Error'))) {
|
|
1141
|
-
|
|
1145
|
+
logError('error parsing response: ', result.status);
|
|
1142
1146
|
}
|
|
1143
1147
|
|
|
1144
1148
|
done();
|