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,17 +1,72 @@
|
|
|
1
|
+
import find from 'core-js-pure/features/array/find.js';
|
|
2
|
+
import arrayFrom from 'core-js-pure/features/array/from';
|
|
3
|
+
import { getWindowTop, isFn, logWarn, getDNT, deepAccess, isArray, inIframe, mergeDeep, isStr, isEmpty, deepSetValue, deepClone, parseUrl, cleanObj, logError, triggerPixel, isInteger, isNumber } from '../src/utils.js';
|
|
1
4
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
5
|
import { config } from '../src/config.js';
|
|
3
6
|
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
|
|
4
|
-
import * as utils from '../src/utils.js';
|
|
5
7
|
import { createEidsArray } from './userId/eids.js';
|
|
6
8
|
|
|
7
9
|
const AUCTION_TYPE = 1;
|
|
8
10
|
const BIDDER_CODE = 'mediakeys';
|
|
9
11
|
const ENDPOINT = 'https://prebid.eu-central-1.bidder.mediakeys.io/bids';
|
|
10
12
|
const GVLID = 498;
|
|
11
|
-
const SUPPORTED_MEDIA_TYPES = [BANNER];
|
|
13
|
+
const SUPPORTED_MEDIA_TYPES = [BANNER, NATIVE, VIDEO];
|
|
12
14
|
const DEFAULT_CURRENCY = 'USD';
|
|
13
15
|
const NET_REVENUE = true;
|
|
14
16
|
|
|
17
|
+
const NATIVE_ASSETS_MAPPING = [
|
|
18
|
+
{ name: 'title', id: 1, type: 0 },
|
|
19
|
+
{ name: 'image', id: 2, type: 3 },
|
|
20
|
+
{ name: 'icon', id: 3, type: 1 },
|
|
21
|
+
{ name: 'sponsoredBy', id: 5, type: 1 },
|
|
22
|
+
{ name: 'body', id: 6, type: 2 },
|
|
23
|
+
{ name: 'rating', id: 7, type: 3 },
|
|
24
|
+
{ name: 'likes', id: 8, type: 4 },
|
|
25
|
+
{ name: 'downloads', id: 9, type: 5 },
|
|
26
|
+
{ name: 'price', id: 10, type: 6 },
|
|
27
|
+
{ name: 'salePrice', id: 11, type: 7 },
|
|
28
|
+
{ name: 'phone', id: 12, type: 8 },
|
|
29
|
+
{ name: 'address', id: 13, type: 9 },
|
|
30
|
+
{ name: 'body2', id: 14, type: 10 },
|
|
31
|
+
{ name: 'displayUrl', id: 15, type: 11 },
|
|
32
|
+
{ name: 'cta', id: 16, type: 12 },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
// This provide a whitelist and a basic validation of OpenRTB native 1.2 options.
|
|
36
|
+
// https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf
|
|
37
|
+
const ORTB_NATIVE_PARAMS = {
|
|
38
|
+
context: value => [1, 2, 3].indexOf(value) !== -1,
|
|
39
|
+
plcmttype: value => [1, 2, 3, 4].indexOf(value) !== -1
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// This provide a whitelist and a basic validation of OpenRTB 2.5 video options.
|
|
43
|
+
// https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf
|
|
44
|
+
const ORTB_VIDEO_PARAMS = {
|
|
45
|
+
mimes: value => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'),
|
|
46
|
+
minduration: value => isInteger(value),
|
|
47
|
+
maxduration: value => isInteger(value),
|
|
48
|
+
protocols: value => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].indexOf(v) !== -1),
|
|
49
|
+
w: value => isInteger(value),
|
|
50
|
+
h: value => isInteger(value),
|
|
51
|
+
startdelay: value => isInteger(value),
|
|
52
|
+
placement: value => [1, 2, 3, 4, 5].indexOf(value) !== -1,
|
|
53
|
+
linearity: value => [1, 2].indexOf(value) !== -1,
|
|
54
|
+
skip: value => [0, 1].indexOf(value) !== -1,
|
|
55
|
+
skipmin: value => isInteger(value),
|
|
56
|
+
skipafter: value => isInteger(value),
|
|
57
|
+
sequence: value => isInteger(value),
|
|
58
|
+
battr: value => Array.isArray(value) && value.every(v => arrayFrom({length: 17}, (_, i) => i + 1).indexOf(v) !== -1),
|
|
59
|
+
maxextended: value => isInteger(value),
|
|
60
|
+
minbitrate: value => isInteger(value),
|
|
61
|
+
maxbitrate: value => isInteger(value),
|
|
62
|
+
boxingallowed: value => [0, 1].indexOf(value) !== -1,
|
|
63
|
+
playbackmethod: value => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6].indexOf(v) !== -1),
|
|
64
|
+
playbackend: value => [1, 2, 3].indexOf(value) !== -1,
|
|
65
|
+
delivery: value => [1, 2, 3].indexOf(value) !== -1,
|
|
66
|
+
pos: value => [0, 1, 2, 3, 4, 5, 6, 7].indexOf(value) !== -1,
|
|
67
|
+
api: value => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6].indexOf(v) !== -1),
|
|
68
|
+
};
|
|
69
|
+
|
|
15
70
|
/**
|
|
16
71
|
* Detects the capability to reach window.top.
|
|
17
72
|
*
|
|
@@ -19,7 +74,7 @@ const NET_REVENUE = true;
|
|
|
19
74
|
*/
|
|
20
75
|
function canAccessTopWindow() {
|
|
21
76
|
try {
|
|
22
|
-
return !!
|
|
77
|
+
return !!getWindowTop().location.href;
|
|
23
78
|
} catch (error) {
|
|
24
79
|
return false;
|
|
25
80
|
}
|
|
@@ -65,12 +120,12 @@ function getOS() {
|
|
|
65
120
|
* @returns {number|boolean}
|
|
66
121
|
*/
|
|
67
122
|
function getFloor(bid, mediaType, size = '*') {
|
|
68
|
-
if (!
|
|
123
|
+
if (!isFn(bid.getFloor)) {
|
|
69
124
|
return false;
|
|
70
125
|
}
|
|
71
126
|
|
|
72
127
|
if (SUPPORTED_MEDIA_TYPES.indexOf(mediaType) === -1) {
|
|
73
|
-
|
|
128
|
+
logWarn(`${BIDDER_CODE}: Unable to detect floor price for unsupported mediaType ${mediaType}. No floor will be used.`);
|
|
74
129
|
return false;
|
|
75
130
|
}
|
|
76
131
|
|
|
@@ -83,6 +138,33 @@ function getFloor(bid, mediaType, size = '*') {
|
|
|
83
138
|
return (!isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) ? floor.floor : false
|
|
84
139
|
}
|
|
85
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Returns the highest floor price found when a bid have
|
|
143
|
+
* several mediaTypes.
|
|
144
|
+
*
|
|
145
|
+
* @param {*} bid a Prebid.js bid (request) object
|
|
146
|
+
* @returns {number|boolean}
|
|
147
|
+
*/
|
|
148
|
+
function getHighestFloor(bid) {
|
|
149
|
+
const floors = [];
|
|
150
|
+
|
|
151
|
+
for (let mediaType in bid.mediaTypes) {
|
|
152
|
+
const floor = getFloor(bid, mediaType);
|
|
153
|
+
|
|
154
|
+
if (isNumber(floor)) {
|
|
155
|
+
floors.push(floor);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!floors.length) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return floors.reduce((a, b) => {
|
|
164
|
+
return Math.max(a, b);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
86
168
|
/**
|
|
87
169
|
* Returns an openRTB 2.5 object.
|
|
88
170
|
* This one will be populated at each step of the buildRequest process.
|
|
@@ -99,7 +181,7 @@ function createOrtbTemplate() {
|
|
|
99
181
|
device: {
|
|
100
182
|
ip: '',
|
|
101
183
|
js: 1,
|
|
102
|
-
dnt:
|
|
184
|
+
dnt: getDNT(),
|
|
103
185
|
ua: navigator.userAgent,
|
|
104
186
|
devicetype: getDeviceType(),
|
|
105
187
|
os: getOS(),
|
|
@@ -128,10 +210,10 @@ function createOrtbTemplate() {
|
|
|
128
210
|
*/
|
|
129
211
|
function createBannerImp(bid) {
|
|
130
212
|
let sizes = bid.mediaTypes.banner.sizes;
|
|
131
|
-
const params =
|
|
213
|
+
const params = deepAccess(bid, 'params', {});
|
|
132
214
|
|
|
133
|
-
if (!
|
|
134
|
-
|
|
215
|
+
if (!isArray(sizes) || !sizes.length) {
|
|
216
|
+
logWarn(`${BIDDER_CODE}: mediaTypes.banner.size missing for adunit: ${bid.params.adUnit}. Ignoring the banner impression in the adunit.`);
|
|
135
217
|
} else {
|
|
136
218
|
const banner = {};
|
|
137
219
|
|
|
@@ -146,13 +228,197 @@ function createBannerImp(bid) {
|
|
|
146
228
|
});
|
|
147
229
|
banner.format = format;
|
|
148
230
|
|
|
149
|
-
banner.topframe =
|
|
231
|
+
banner.topframe = inIframe() ? 0 : 1;
|
|
150
232
|
banner.pos = params.pos || 0;
|
|
151
233
|
|
|
152
234
|
return banner;
|
|
153
235
|
}
|
|
154
236
|
}
|
|
155
237
|
|
|
238
|
+
/**
|
|
239
|
+
* Returns an openRtb 2.5 native object with a native 1.2 request.
|
|
240
|
+
*
|
|
241
|
+
* @param {object} bid Prebid bid object from request
|
|
242
|
+
* @returns {object}
|
|
243
|
+
*/
|
|
244
|
+
function createNativeImp(bid) {
|
|
245
|
+
if (!bid.nativeParams) {
|
|
246
|
+
logWarn(`${BIDDER_CODE}: bid.nativeParams object has not been found.`);
|
|
247
|
+
return
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const nativeParams = deepClone(bid.nativeParams);
|
|
251
|
+
|
|
252
|
+
const nativeAdUnitParams = deepAccess(bid, 'mediaTypes.native', {});
|
|
253
|
+
const nativeBidderParams = deepAccess(bid, 'params.native', {});
|
|
254
|
+
|
|
255
|
+
const extraParams = {
|
|
256
|
+
...nativeAdUnitParams,
|
|
257
|
+
...nativeBidderParams
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const nativeObject = {
|
|
261
|
+
ver: '1.2',
|
|
262
|
+
context: 1, // overwrited later if needed
|
|
263
|
+
plcmttype: 1, // overwrited later if needed
|
|
264
|
+
assets: []
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
Object.keys(ORTB_NATIVE_PARAMS).forEach(name => {
|
|
268
|
+
if (extraParams.hasOwnProperty(name)) {
|
|
269
|
+
if (ORTB_NATIVE_PARAMS[name](extraParams[name])) {
|
|
270
|
+
nativeObject[name] = extraParams[name];
|
|
271
|
+
} else {
|
|
272
|
+
logWarn(`${BIDDER_CODE}: the OpenRTB native param ${name} has been skipped due to misformating. Please refer to OpenRTB Native spec.`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// just a helper function
|
|
278
|
+
const setImageAssetSizes = function(asset, param) {
|
|
279
|
+
if (param.sizes && param.sizes.length) {
|
|
280
|
+
asset.img.w = param.sizes ? param.sizes[0] : undefined;
|
|
281
|
+
asset.img.h = param.sizes ? param.sizes[1] : undefined;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (!asset.img.w) {
|
|
285
|
+
asset.img.wmin = 0;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (!asset.img.h) {
|
|
289
|
+
asset.img.hmin = 0;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Prebid.js "image" type support.
|
|
294
|
+
// Add some defaults to support special type provided by Prebid.js `mediaTypes.native.type: "image"`
|
|
295
|
+
const nativeImageType = deepAccess(bid, 'mediaTypes.native.type');
|
|
296
|
+
if (nativeImageType === 'image') {
|
|
297
|
+
// Default value is ones of the recommended by the spec: https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf
|
|
298
|
+
nativeParams.title.len = 90;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
for (let key in nativeParams) {
|
|
302
|
+
if (nativeParams.hasOwnProperty(key)) {
|
|
303
|
+
const internalNativeAsset = find(NATIVE_ASSETS_MAPPING, ref => ref.name === key);
|
|
304
|
+
if (!internalNativeAsset) {
|
|
305
|
+
logWarn(`${BIDDER_CODE}: the asset "${key}" has not been found in Prebid assets map. Skipped for request.`);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const param = nativeParams[key];
|
|
310
|
+
|
|
311
|
+
const asset = {
|
|
312
|
+
id: internalNativeAsset.id,
|
|
313
|
+
required: param.required ? 1 : 0
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
switch (key) {
|
|
317
|
+
case 'title':
|
|
318
|
+
if (param.len || param.length) {
|
|
319
|
+
asset.title = {
|
|
320
|
+
len: param.len || param.length,
|
|
321
|
+
ext: param.ext
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
logWarn(`${BIDDER_CODE}: "title.length" property for native asset is required. Skipped for request.`)
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
break;
|
|
328
|
+
|
|
329
|
+
case 'image':
|
|
330
|
+
asset.img = {
|
|
331
|
+
type: internalNativeAsset.type,
|
|
332
|
+
mimes: param.mimes,
|
|
333
|
+
ext: param.ext,
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
setImageAssetSizes(asset, param);
|
|
337
|
+
|
|
338
|
+
break;
|
|
339
|
+
case 'icon':
|
|
340
|
+
asset.img = {
|
|
341
|
+
type: internalNativeAsset.type,
|
|
342
|
+
mimes: param.mimes,
|
|
343
|
+
ext: param.ext,
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
setImageAssetSizes(asset, param);
|
|
347
|
+
break;
|
|
348
|
+
|
|
349
|
+
case 'sponsoredBy': // sponsored
|
|
350
|
+
case 'body': // desc
|
|
351
|
+
case 'rating':
|
|
352
|
+
case 'likes':
|
|
353
|
+
case 'downloads':
|
|
354
|
+
case 'price':
|
|
355
|
+
case 'salePrice':
|
|
356
|
+
case 'phone':
|
|
357
|
+
case 'address':
|
|
358
|
+
case 'body2': // desc2
|
|
359
|
+
case 'displayUrl':
|
|
360
|
+
case 'cta':
|
|
361
|
+
// generic asset.data
|
|
362
|
+
asset.data = {
|
|
363
|
+
type: internalNativeAsset.type,
|
|
364
|
+
len: param.len,
|
|
365
|
+
ext: param.ext
|
|
366
|
+
}
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
nativeObject.assets.push(asset);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (nativeObject.assets.length) {
|
|
375
|
+
return {
|
|
376
|
+
request: nativeObject
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Returns an openRtb 2.5 video object.
|
|
383
|
+
*
|
|
384
|
+
* @param {object} bid Prebid bid object from request
|
|
385
|
+
* @returns {object}
|
|
386
|
+
*/
|
|
387
|
+
function createVideoImp(bid) {
|
|
388
|
+
const videoAdUnitParams = deepAccess(bid, 'mediaTypes.video', {});
|
|
389
|
+
const videoBidderParams = deepAccess(bid, 'params.video', {});
|
|
390
|
+
const computedParams = {};
|
|
391
|
+
|
|
392
|
+
// Special case for playerSize.
|
|
393
|
+
// Eeach props will be overrided if they are defined in config.
|
|
394
|
+
if (Array.isArray(videoAdUnitParams.playerSize)) {
|
|
395
|
+
const tempSize = (Array.isArray(videoAdUnitParams.playerSize[0])) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize;
|
|
396
|
+
computedParams.w = tempSize[0];
|
|
397
|
+
computedParams.h = tempSize[1];
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const videoParams = {
|
|
401
|
+
...computedParams,
|
|
402
|
+
...videoAdUnitParams,
|
|
403
|
+
...videoBidderParams
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
const video = {};
|
|
407
|
+
|
|
408
|
+
// Only whitelisted OpenRTB options need to be validated.
|
|
409
|
+
Object.keys(ORTB_VIDEO_PARAMS).forEach(name => {
|
|
410
|
+
if (videoParams.hasOwnProperty(name)) {
|
|
411
|
+
if (ORTB_VIDEO_PARAMS[name](videoParams[name])) {
|
|
412
|
+
video[name] = videoParams[name];
|
|
413
|
+
} else {
|
|
414
|
+
logWarn(`${BIDDER_CODE}: the OpenRTB video param ${name} has been skipped due to misformating. Please refer to OpenRTB 2.5 spec.`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
return video
|
|
420
|
+
}
|
|
421
|
+
|
|
156
422
|
/**
|
|
157
423
|
* Create the OpenRTB 2.5 imp object.
|
|
158
424
|
*
|
|
@@ -167,28 +433,42 @@ function createImp(bid) {
|
|
|
167
433
|
secure: 1,
|
|
168
434
|
};
|
|
169
435
|
|
|
436
|
+
// There is no default floor. bidfloor is set only
|
|
437
|
+
// if the priceFloors module is activated and returns a valid floor.
|
|
438
|
+
const floor = getHighestFloor(bid);
|
|
439
|
+
if (isNumber(floor)) {
|
|
440
|
+
imp.bidfloor = floor;
|
|
441
|
+
}
|
|
442
|
+
|
|
170
443
|
// Only supports proper mediaTypes definition…
|
|
171
444
|
for (let mediaType in bid.mediaTypes) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
445
|
+
switch (mediaType) {
|
|
446
|
+
case BANNER:
|
|
447
|
+
const banner = createBannerImp(bid);
|
|
448
|
+
if (banner) {
|
|
449
|
+
imp.banner = banner;
|
|
450
|
+
}
|
|
451
|
+
break;
|
|
452
|
+
case NATIVE:
|
|
453
|
+
const native = createNativeImp(bid);
|
|
454
|
+
if (native) {
|
|
455
|
+
imp.native = native;
|
|
456
|
+
}
|
|
457
|
+
break;
|
|
458
|
+
case VIDEO:
|
|
459
|
+
const video = createVideoImp(bid);
|
|
460
|
+
if (video) {
|
|
461
|
+
imp.video = video;
|
|
462
|
+
}
|
|
463
|
+
break;
|
|
184
464
|
}
|
|
185
465
|
}
|
|
186
466
|
|
|
187
467
|
// handle FPD for imp.
|
|
188
|
-
const ortb2Imp =
|
|
468
|
+
const ortb2Imp = deepAccess(bid, 'ortb2Imp.ext.data');
|
|
189
469
|
if (ortb2Imp) {
|
|
190
470
|
const fpd = { ...bid.ortb2Imp };
|
|
191
|
-
|
|
471
|
+
mergeDeep(imp, fpd);
|
|
192
472
|
}
|
|
193
473
|
|
|
194
474
|
return imp;
|
|
@@ -202,17 +482,105 @@ function createImp(bid) {
|
|
|
202
482
|
* @returns {string|null}
|
|
203
483
|
*/
|
|
204
484
|
function getPrimaryCatFromResponse(cat) {
|
|
205
|
-
if (!cat || (
|
|
485
|
+
if (!cat || (isArray(cat) && !cat.length)) {
|
|
206
486
|
return;
|
|
207
487
|
}
|
|
208
488
|
|
|
209
|
-
if (
|
|
489
|
+
if (isArray(cat)) {
|
|
210
490
|
return cat[0];
|
|
211
|
-
} else if (
|
|
491
|
+
} else if (isStr(cat)) {
|
|
212
492
|
return cat;
|
|
213
493
|
}
|
|
214
494
|
}
|
|
215
495
|
|
|
496
|
+
/**
|
|
497
|
+
* Create the Prebid.js native object from response.
|
|
498
|
+
*
|
|
499
|
+
* @param {*} bid bid object from response
|
|
500
|
+
* @returns {object} Prebid.js native object used in response
|
|
501
|
+
*/
|
|
502
|
+
function nativeBidResponseHandler(bid) {
|
|
503
|
+
const nativeAdm = JSON.parse(bid.adm);
|
|
504
|
+
if (!nativeAdm || !nativeAdm.assets.length) {
|
|
505
|
+
logError(`${BIDDER_CODE}: invalid native response.`);
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const native = {}
|
|
510
|
+
|
|
511
|
+
nativeAdm.assets.forEach(asset => {
|
|
512
|
+
if (asset.title) {
|
|
513
|
+
native.title = asset.title.text;
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (asset.img) {
|
|
518
|
+
switch (asset.img.type) {
|
|
519
|
+
case 1:
|
|
520
|
+
native.icon = {
|
|
521
|
+
url: asset.img.url,
|
|
522
|
+
width: asset.img.w,
|
|
523
|
+
height: asset.img.h
|
|
524
|
+
};
|
|
525
|
+
break;
|
|
526
|
+
default:
|
|
527
|
+
native.image = {
|
|
528
|
+
url: asset.img.url,
|
|
529
|
+
width: asset.img.w,
|
|
530
|
+
height: asset.img.h
|
|
531
|
+
};
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
if (asset.data) {
|
|
538
|
+
const internalNativeAsset = find(NATIVE_ASSETS_MAPPING, ref => ref.id === asset.id);
|
|
539
|
+
if (internalNativeAsset) {
|
|
540
|
+
native[internalNativeAsset.name] = asset.data.value;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
if (nativeAdm.link) {
|
|
546
|
+
if (nativeAdm.link.url) {
|
|
547
|
+
native.clickUrl = nativeAdm.link.url;
|
|
548
|
+
}
|
|
549
|
+
if (Array.isArray(nativeAdm.link.clicktrackers)) {
|
|
550
|
+
native.clickTrackers = nativeAdm.link.clicktrackers
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
if (Array.isArray(nativeAdm.eventtrackers)) {
|
|
555
|
+
native.impressionTrackers = [];
|
|
556
|
+
nativeAdm.eventtrackers.forEach(tracker => {
|
|
557
|
+
// Only Impression events are supported. Prebid does not support Viewability events yet.
|
|
558
|
+
if (tracker.event !== 1) {
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// methods:
|
|
563
|
+
// 1: image
|
|
564
|
+
// 2: js
|
|
565
|
+
// note: javascriptTrackers is a string. If there's more than one JS tracker in bid response, the last script will be used.
|
|
566
|
+
switch (tracker.method) {
|
|
567
|
+
case 1:
|
|
568
|
+
native.impressionTrackers.push(tracker.url);
|
|
569
|
+
break;
|
|
570
|
+
case 2:
|
|
571
|
+
native.javascriptTrackers = `<script src=\"${tracker.url}\"></script>`;
|
|
572
|
+
break;
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
if (nativeAdm.privacy) {
|
|
578
|
+
native.privacyLink = nativeAdm.privacy;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
return native;
|
|
582
|
+
}
|
|
583
|
+
|
|
216
584
|
export const spec = {
|
|
217
585
|
code: BIDDER_CODE,
|
|
218
586
|
|
|
@@ -221,7 +589,7 @@ export const spec = {
|
|
|
221
589
|
supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
|
|
222
590
|
|
|
223
591
|
isBidRequestValid: function(bid) {
|
|
224
|
-
return !!(bid && !
|
|
592
|
+
return !!(bid && !isEmpty(bid));
|
|
225
593
|
},
|
|
226
594
|
|
|
227
595
|
buildRequests: function(validBidRequests, bidderRequest) {
|
|
@@ -229,11 +597,11 @@ export const spec = {
|
|
|
229
597
|
|
|
230
598
|
// Pass the auctionId as ortb2 id
|
|
231
599
|
// See https://github.com/prebid/Prebid.js/issues/6563
|
|
232
|
-
|
|
233
|
-
|
|
600
|
+
deepSetValue(payload, 'id', bidderRequest.auctionId);
|
|
601
|
+
deepSetValue(payload, 'source.tid', bidderRequest.auctionId);
|
|
234
602
|
|
|
235
603
|
validBidRequests.forEach(validBid => {
|
|
236
|
-
let bid =
|
|
604
|
+
let bid = deepClone(validBid);
|
|
237
605
|
|
|
238
606
|
// No additional params atm.
|
|
239
607
|
const imp = createImp(bid);
|
|
@@ -242,37 +610,37 @@ export const spec = {
|
|
|
242
610
|
});
|
|
243
611
|
|
|
244
612
|
if (validBidRequests[0].schain) {
|
|
245
|
-
|
|
613
|
+
deepSetValue(payload, 'source.ext.schain', validBidRequests[0].schain);
|
|
246
614
|
}
|
|
247
615
|
|
|
248
616
|
if (bidderRequest && bidderRequest.gdprConsent) {
|
|
249
|
-
|
|
250
|
-
|
|
617
|
+
deepSetValue(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
|
|
618
|
+
deepSetValue(payload, 'regs.ext.gdpr', (bidderRequest.gdprConsent.gdprApplies ? 1 : 0));
|
|
251
619
|
}
|
|
252
620
|
|
|
253
621
|
if (bidderRequest && bidderRequest.uspConsent) {
|
|
254
|
-
|
|
622
|
+
deepSetValue(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent);
|
|
255
623
|
}
|
|
256
624
|
|
|
257
625
|
if (config.getConfig('coppa') === true) {
|
|
258
|
-
|
|
626
|
+
deepSetValue(payload, 'regs.coppa', 1);
|
|
259
627
|
}
|
|
260
628
|
|
|
261
|
-
if (
|
|
262
|
-
|
|
629
|
+
if (deepAccess(validBidRequests[0], 'userId')) {
|
|
630
|
+
deepSetValue(payload, 'user.ext.eids', createEidsArray(validBidRequests[0].userId));
|
|
263
631
|
}
|
|
264
632
|
|
|
265
633
|
// Assign payload.site from refererinfo
|
|
266
634
|
if (bidderRequest.refererInfo) {
|
|
267
635
|
if (bidderRequest.refererInfo.reachedTop) {
|
|
268
636
|
const sitePage = bidderRequest.refererInfo.referer;
|
|
269
|
-
|
|
270
|
-
|
|
637
|
+
deepSetValue(payload, 'site.page', sitePage);
|
|
638
|
+
deepSetValue(payload, 'site.domain', parseUrl(sitePage, {
|
|
271
639
|
noDecodeWholeURL: true
|
|
272
640
|
}).hostname);
|
|
273
641
|
|
|
274
642
|
if (canAccessTopWindow()) {
|
|
275
|
-
|
|
643
|
+
deepSetValue(payload, 'site.ref', getWindowTop().document.referrer);
|
|
276
644
|
}
|
|
277
645
|
}
|
|
278
646
|
}
|
|
@@ -280,15 +648,15 @@ export const spec = {
|
|
|
280
648
|
// Handle First Party Data (need publisher fpd setup)
|
|
281
649
|
const fpd = config.getConfig('ortb2') || {};
|
|
282
650
|
if (fpd.site) {
|
|
283
|
-
|
|
651
|
+
mergeDeep(payload, { site: fpd.site });
|
|
284
652
|
}
|
|
285
653
|
if (fpd.user) {
|
|
286
|
-
|
|
654
|
+
mergeDeep(payload, { user: fpd.user });
|
|
287
655
|
}
|
|
288
656
|
// Here we can handle device.geo prop
|
|
289
|
-
const deviceGeo =
|
|
657
|
+
const deviceGeo = deepAccess(fpd, 'device.geo');
|
|
290
658
|
if (deviceGeo) {
|
|
291
|
-
|
|
659
|
+
mergeDeep(payload.device, { geo: deviceGeo });
|
|
292
660
|
}
|
|
293
661
|
|
|
294
662
|
const request = {
|
|
@@ -307,19 +675,19 @@ export const spec = {
|
|
|
307
675
|
const bidResponses = [];
|
|
308
676
|
|
|
309
677
|
try {
|
|
310
|
-
if (serverResponse.body && serverResponse.body.seatbid &&
|
|
678
|
+
if (serverResponse.body && serverResponse.body.seatbid && isArray(serverResponse.body.seatbid)) {
|
|
311
679
|
const currency = serverResponse.body.cur || DEFAULT_CURRENCY;
|
|
312
680
|
const referrer = bidRequest.site && bidRequest.site.ref ? bidRequest.site.ref : '';
|
|
313
681
|
|
|
314
682
|
serverResponse.body.seatbid.forEach(bidderSeat => {
|
|
315
|
-
if (!
|
|
683
|
+
if (!isArray(bidderSeat.bid) || !bidderSeat.bid.length) {
|
|
316
684
|
return;
|
|
317
685
|
}
|
|
318
686
|
|
|
319
687
|
bidderSeat.bid.forEach(bid => {
|
|
320
688
|
let mediaType;
|
|
321
689
|
// Actually only BANNER is supported, but other types will be added soon.
|
|
322
|
-
switch (
|
|
690
|
+
switch (deepAccess(bid, 'ext.prebid.type')) {
|
|
323
691
|
case 'V':
|
|
324
692
|
mediaType = VIDEO;
|
|
325
693
|
break;
|
|
@@ -332,8 +700,8 @@ export const spec = {
|
|
|
332
700
|
|
|
333
701
|
const meta = {
|
|
334
702
|
advertiserDomains: (Array.isArray(bid.adomain) && bid.adomain.length) ? bid.adomain : [],
|
|
335
|
-
advertiserName:
|
|
336
|
-
agencyName:
|
|
703
|
+
advertiserName: deepAccess(bid, 'ext.advertiser_name', null),
|
|
704
|
+
agencyName: deepAccess(bid, 'ext.agency_name', null),
|
|
337
705
|
primaryCatId: getPrimaryCatFromResponse(bid.cat),
|
|
338
706
|
mediaType
|
|
339
707
|
}
|
|
@@ -352,15 +720,38 @@ export const spec = {
|
|
|
352
720
|
ad: bid.adm,
|
|
353
721
|
mediaType,
|
|
354
722
|
burl: bid.burl,
|
|
355
|
-
meta:
|
|
723
|
+
meta: cleanObj(meta)
|
|
356
724
|
};
|
|
357
725
|
|
|
726
|
+
if (mediaType === NATIVE) {
|
|
727
|
+
const native = nativeBidResponseHandler(bid);
|
|
728
|
+
if (native) {
|
|
729
|
+
newBid.native = native;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
if (mediaType === VIDEO) {
|
|
734
|
+
// Note:
|
|
735
|
+
// Mediakeys bid adapter expects a publisher has set his own video player
|
|
736
|
+
// in the `mediaTypes.video` configuration object.
|
|
737
|
+
|
|
738
|
+
// Mediakeys bidder does not provide inline XML in the bid response
|
|
739
|
+
// newBid.vastXml = bid.ext.vast_url;
|
|
740
|
+
|
|
741
|
+
// For instream video, disable server cache as vast is generated per bid request
|
|
742
|
+
newBid.videoCacheKey = 'no_cache';
|
|
743
|
+
|
|
744
|
+
// The vast URL is server independently and must be fetched before video rendering in the renderer
|
|
745
|
+
// appending '&no_cache' is safe and fast as the vast url always have parameters
|
|
746
|
+
newBid.vastUrl = bid.ext.vast_url + '&no_cache';
|
|
747
|
+
}
|
|
748
|
+
|
|
358
749
|
bidResponses.push(newBid);
|
|
359
750
|
});
|
|
360
751
|
});
|
|
361
752
|
}
|
|
362
753
|
} catch (e) {
|
|
363
|
-
|
|
754
|
+
logError(BIDDER_CODE, e);
|
|
364
755
|
}
|
|
365
756
|
|
|
366
757
|
return bidResponses;
|
|
@@ -373,7 +764,7 @@ export const spec = {
|
|
|
373
764
|
|
|
374
765
|
const url = bid.burl.replace(/\$\{AUCTION_PRICE\}/, bid.cpm);
|
|
375
766
|
|
|
376
|
-
|
|
767
|
+
triggerPixel(url);
|
|
377
768
|
}
|
|
378
769
|
}
|
|
379
770
|
|