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,3 +1,4 @@
|
|
|
1
|
+
import { generateUUID, getParameterByName, logError, parseUrl, logInfo } from '../src/utils.js';
|
|
1
2
|
import {ajaxBuilder} from '../src/ajax.js';
|
|
2
3
|
import adapter from '../src/AnalyticsAdapter.js';
|
|
3
4
|
import adapterManager from '../src/adapterManager.js';
|
|
@@ -11,13 +12,12 @@ const DEFAULT_EVENT_URL = 'https://endpoint.prebidmanager.com/endpoint'
|
|
|
11
12
|
const analyticsType = 'endpoint';
|
|
12
13
|
const analyticsName = 'Prebid Manager Analytics: ';
|
|
13
14
|
|
|
14
|
-
var utils = require('../src/utils.js');
|
|
15
15
|
var CONSTANTS = require('../src/constants.json');
|
|
16
16
|
let ajax = ajaxBuilder(0);
|
|
17
17
|
|
|
18
18
|
var _VERSION = 1;
|
|
19
19
|
var initOptions = null;
|
|
20
|
-
var _pageViewId =
|
|
20
|
+
var _pageViewId = generateUUID();
|
|
21
21
|
var _startAuction = 0;
|
|
22
22
|
var _bidRequestTimeout = 0;
|
|
23
23
|
let flushInterval;
|
|
@@ -76,7 +76,7 @@ function collectUtmTagData() {
|
|
|
76
76
|
let pmUtmTags = {};
|
|
77
77
|
try {
|
|
78
78
|
utmTags.forEach(function (utmKey) {
|
|
79
|
-
let utmValue =
|
|
79
|
+
let utmValue = getParameterByName(utmKey);
|
|
80
80
|
if (utmValue !== '') {
|
|
81
81
|
newUtm = true;
|
|
82
82
|
}
|
|
@@ -95,7 +95,7 @@ function collectUtmTagData() {
|
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
} catch (e) {
|
|
98
|
-
|
|
98
|
+
logError(`${analyticsName}Error`, e);
|
|
99
99
|
pmUtmTags['error_utm'] = 1;
|
|
100
100
|
}
|
|
101
101
|
return pmUtmTags;
|
|
@@ -106,7 +106,7 @@ function collectPageInfo() {
|
|
|
106
106
|
domain: window.location.hostname,
|
|
107
107
|
}
|
|
108
108
|
if (document.referrer) {
|
|
109
|
-
pageInfo.referrerDomain =
|
|
109
|
+
pageInfo.referrerDomain = parseUrl(document.referrer).hostname;
|
|
110
110
|
}
|
|
111
111
|
return pageInfo;
|
|
112
112
|
}
|
|
@@ -128,7 +128,7 @@ function flush() {
|
|
|
128
128
|
|
|
129
129
|
ajax(
|
|
130
130
|
initOptions.url,
|
|
131
|
-
() =>
|
|
131
|
+
() => logInfo(`${analyticsName} sent events batch`),
|
|
132
132
|
_VERSION + ':' + JSON.stringify(data),
|
|
133
133
|
{
|
|
134
134
|
contentType: 'text/plain',
|
|
@@ -215,7 +215,7 @@ function handleEvent(eventType, eventArgs) {
|
|
|
215
215
|
|
|
216
216
|
function sendEvent(event) {
|
|
217
217
|
_eventQueue.push(event);
|
|
218
|
-
|
|
218
|
+
logInfo(`${analyticsName}Event ${event.eventType}:`, event);
|
|
219
219
|
|
|
220
220
|
if (event.eventType === CONSTANTS.EVENTS.AUCTION_END) {
|
|
221
221
|
flush();
|
package/modules/priceFloors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { parseUrl, deepAccess, parseGPTSingleSizeArray, getGptSlotInfoForAdUnitCode, deepSetValue, logWarn, deepClone, getParameterByName, generateUUID, logError, logInfo, isNumber, pick, debugTurnedOn } from '../src/utils.js';
|
|
1
2
|
import { getGlobal } from '../src/prebidGlobal.js';
|
|
2
3
|
import { config } from '../src/config.js';
|
|
3
|
-
import * as utils from '../src/utils.js';
|
|
4
4
|
import { ajaxBuilder } from '../src/ajax.js';
|
|
5
5
|
import events from '../src/events.js';
|
|
6
6
|
import CONSTANTS from '../src/constants.json';
|
|
@@ -60,13 +60,13 @@ function roundUp(number, precision) {
|
|
|
60
60
|
|
|
61
61
|
let referrerHostname;
|
|
62
62
|
function getHostNameFromReferer(referer) {
|
|
63
|
-
referrerHostname =
|
|
63
|
+
referrerHostname = parseUrl(referer, {noDecodeWholeURL: true}).hostname;
|
|
64
64
|
return referrerHostname;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
// First look into bidRequest!
|
|
68
68
|
function getGptSlotFromBidRequest(bidRequest) {
|
|
69
|
-
const isGam =
|
|
69
|
+
const isGam = deepAccess(bidRequest, 'ortb2Imp.ext.data.adserver.name') === 'gam';
|
|
70
70
|
return isGam && bidRequest.ortb2Imp.ext.data.adserver.adslot;
|
|
71
71
|
}
|
|
72
72
|
|
|
@@ -74,9 +74,9 @@ function getGptSlotFromBidRequest(bidRequest) {
|
|
|
74
74
|
* @summary floor field types with their matching functions to resolve the actual matched value
|
|
75
75
|
*/
|
|
76
76
|
export let fieldMatchingFunctions = {
|
|
77
|
-
'size': (bidRequest, bidResponse) =>
|
|
77
|
+
'size': (bidRequest, bidResponse) => parseGPTSingleSizeArray(bidResponse.size) || '*',
|
|
78
78
|
'mediaType': (bidRequest, bidResponse) => bidResponse.mediaType || 'banner',
|
|
79
|
-
'gptSlot': (bidRequest, bidResponse) => getGptSlotFromBidRequest(bidRequest) ||
|
|
79
|
+
'gptSlot': (bidRequest, bidResponse) => getGptSlotFromBidRequest(bidRequest) || getGptSlotInfoForAdUnitCode(bidRequest.adUnitCode).gptSlot,
|
|
80
80
|
'domain': (bidRequest, bidResponse) => referrerHostname || getHostNameFromReferer(getRefererInfo().referer),
|
|
81
81
|
'adUnitCode': (bidRequest, bidResponse) => bidRequest.adUnitCode
|
|
82
82
|
}
|
|
@@ -101,17 +101,17 @@ function enumeratePossibleFieldValues(floorFields, bidObject, responseObject) {
|
|
|
101
101
|
* Generates all possible rule matches and picks the first matching one.
|
|
102
102
|
*/
|
|
103
103
|
export function getFirstMatchingFloor(floorData, bidObject, responseObject = {}) {
|
|
104
|
-
let fieldValues = enumeratePossibleFieldValues(
|
|
104
|
+
let fieldValues = enumeratePossibleFieldValues(deepAccess(floorData, 'schema.fields') || [], bidObject, responseObject);
|
|
105
105
|
if (!fieldValues.length) return { matchingFloor: floorData.default };
|
|
106
106
|
|
|
107
107
|
// look to see if a request for this context was made already
|
|
108
108
|
let matchingInput = fieldValues.map(field => field[0]).join('-');
|
|
109
109
|
// if we already have gotten the matching rule from this matching input then use it! No need to look again
|
|
110
|
-
let previousMatch =
|
|
110
|
+
let previousMatch = deepAccess(floorData, `matchingInputs.${matchingInput}`);
|
|
111
111
|
if (previousMatch) {
|
|
112
112
|
return {...previousMatch};
|
|
113
113
|
}
|
|
114
|
-
let allPossibleMatches = generatePossibleEnumerations(fieldValues,
|
|
114
|
+
let allPossibleMatches = generatePossibleEnumerations(fieldValues, deepAccess(floorData, 'schema.delimiter') || '|');
|
|
115
115
|
let matchingRule = find(allPossibleMatches, hashValue => floorData.values.hasOwnProperty(hashValue));
|
|
116
116
|
|
|
117
117
|
let matchingData = {
|
|
@@ -122,7 +122,7 @@ export function getFirstMatchingFloor(floorData, bidObject, responseObject = {})
|
|
|
122
122
|
};
|
|
123
123
|
matchingData.matchingFloor = Math.max(matchingData.floorMin, matchingData.floorRuleValue);
|
|
124
124
|
// save for later lookup if needed
|
|
125
|
-
|
|
125
|
+
deepSetValue(floorData, `matchingInputs.${matchingInput}`, {...matchingData});
|
|
126
126
|
return matchingData;
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -147,7 +147,7 @@ function generatePossibleEnumerations(arrayOfFields, delimiter) {
|
|
|
147
147
|
* @summary If a the input bidder has a registered cpmadjustment it returns the input CPM after being adjusted
|
|
148
148
|
*/
|
|
149
149
|
export function getBiddersCpmAdjustment(bidderName, inputCpm, bid = {}) {
|
|
150
|
-
const adjustmentFunction =
|
|
150
|
+
const adjustmentFunction = deepAccess(getGlobal(), `bidderSettings.${bidderName}.bidCpmAdjustment`) || deepAccess(getGlobal(), 'bidderSettings.standard.bidCpmAdjustment');
|
|
151
151
|
if (adjustmentFunction) {
|
|
152
152
|
return parseFloat(adjustmentFunction(inputCpm, {...bid, cpm: inputCpm}));
|
|
153
153
|
}
|
|
@@ -167,9 +167,9 @@ export function calculateAdjustedFloor(oldFloor, newFloor) {
|
|
|
167
167
|
* @summary gets the prebid set sizes depending on the input mediaType
|
|
168
168
|
*/
|
|
169
169
|
const getMediaTypesSizes = {
|
|
170
|
-
banner: (bid) =>
|
|
171
|
-
video: (bid) =>
|
|
172
|
-
native: (bid) =>
|
|
170
|
+
banner: (bid) => deepAccess(bid, 'mediaTypes.banner.sizes') || [],
|
|
171
|
+
video: (bid) => deepAccess(bid, 'mediaTypes.video.playerSize') || [],
|
|
172
|
+
native: (bid) => deepAccess(bid, 'mediaTypes.native.image.sizes') ? [deepAccess(bid, 'mediaTypes.native.image.sizes')] : []
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
/**
|
|
@@ -208,7 +208,7 @@ export function getFloor(requestParams = {currency: 'USD', mediaType: '*', size:
|
|
|
208
208
|
try {
|
|
209
209
|
floorInfo.matchingFloor = getGlobal().convertCurrency(floorInfo.matchingFloor, floorData.data.currency, currency);
|
|
210
210
|
} catch (err) {
|
|
211
|
-
|
|
211
|
+
logWarn(`${MODULE_NAME}: Unable to get currency conversion for getFloor for bidder ${bidRequest.bidder}. You must have currency module enabled with defaultRates in your currency config`);
|
|
212
212
|
// since we were unable to convert to the bidders requested currency, we send back just the actual floors currency to them
|
|
213
213
|
currency = floorData.data.currency;
|
|
214
214
|
}
|
|
@@ -233,7 +233,7 @@ export function getFloor(requestParams = {currency: 'USD', mediaType: '*', size:
|
|
|
233
233
|
* @summary Takes a floorsData object and converts it into a hash map with appropriate keys
|
|
234
234
|
*/
|
|
235
235
|
export function getFloorsDataForAuction(floorData, adUnitCode) {
|
|
236
|
-
let auctionFloorData =
|
|
236
|
+
let auctionFloorData = deepClone(floorData);
|
|
237
237
|
auctionFloorData.schema.delimiter = floorData.schema.delimiter || '|';
|
|
238
238
|
auctionFloorData.values = normalizeRulesForAuction(auctionFloorData, adUnitCode);
|
|
239
239
|
// default the currency to USD if not passed in
|
|
@@ -296,10 +296,10 @@ export function updateAdUnitsForAuction(adUnits, floorData, auctionId) {
|
|
|
296
296
|
skipped: floorData.skipped,
|
|
297
297
|
skipRate: floorData.skipRate,
|
|
298
298
|
floorMin: floorData.floorMin,
|
|
299
|
-
modelVersion:
|
|
300
|
-
modelWeight:
|
|
301
|
-
modelTimestamp:
|
|
302
|
-
location:
|
|
299
|
+
modelVersion: deepAccess(floorData, 'data.modelVersion'),
|
|
300
|
+
modelWeight: deepAccess(floorData, 'data.modelWeight'),
|
|
301
|
+
modelTimestamp: deepAccess(floorData, 'data.modelTimestamp'),
|
|
302
|
+
location: deepAccess(floorData, 'data.location', 'noData'),
|
|
303
303
|
floorProvider: floorData.floorProvider,
|
|
304
304
|
fetchStatus: _floorsConfig.fetchStatus
|
|
305
305
|
};
|
|
@@ -323,27 +323,27 @@ export function pickRandomModel(modelGroups, weightSum) {
|
|
|
323
323
|
* @summary Updates the adUnits accordingly and returns the necessary floorsData for the current auction
|
|
324
324
|
*/
|
|
325
325
|
export function createFloorsDataForAuction(adUnits, auctionId) {
|
|
326
|
-
let resolvedFloorsData =
|
|
326
|
+
let resolvedFloorsData = deepClone(_floorsConfig);
|
|
327
327
|
// if using schema 2 pick a model here:
|
|
328
|
-
if (
|
|
328
|
+
if (deepAccess(resolvedFloorsData, 'data.floorsSchemaVersion') === 2) {
|
|
329
329
|
// merge the models specific stuff into the top level data settings (now it looks like floorsSchemaVersion 1!)
|
|
330
330
|
let { modelGroups, ...rest } = resolvedFloorsData.data;
|
|
331
331
|
resolvedFloorsData.data = Object.assign(rest, pickRandomModel(modelGroups, rest.modelWeightSum));
|
|
332
332
|
}
|
|
333
333
|
|
|
334
334
|
// if we do not have a floors data set, we will try to use data set on adUnits
|
|
335
|
-
let useAdUnitData = Object.keys(
|
|
335
|
+
let useAdUnitData = Object.keys(deepAccess(resolvedFloorsData, 'data.values') || {}).length === 0;
|
|
336
336
|
if (useAdUnitData) {
|
|
337
337
|
resolvedFloorsData.data = getFloorDataFromAdUnits(adUnits);
|
|
338
338
|
} else {
|
|
339
339
|
resolvedFloorsData.data = getFloorsDataForAuction(resolvedFloorsData.data);
|
|
340
340
|
}
|
|
341
341
|
// if we still do not have a valid floor data then floors is not on for this auction, so skip
|
|
342
|
-
if (Object.keys(
|
|
342
|
+
if (Object.keys(deepAccess(resolvedFloorsData, 'data.values') || {}).length === 0) {
|
|
343
343
|
resolvedFloorsData.skipped = true;
|
|
344
344
|
} else {
|
|
345
345
|
// determine the skip rate now
|
|
346
|
-
const auctionSkipRate =
|
|
346
|
+
const auctionSkipRate = getParameterByName('pbjs_skipRate') || resolvedFloorsData.skipRate;
|
|
347
347
|
const isSkipped = Math.random() * 100 < parseFloat(auctionSkipRate);
|
|
348
348
|
resolvedFloorsData.skipped = isSkipped;
|
|
349
349
|
}
|
|
@@ -364,7 +364,7 @@ export function continueAuction(hookConfig) {
|
|
|
364
364
|
_delayedAuctions = _delayedAuctions.filter(auctionConfig => auctionConfig.timer !== hookConfig.timer);
|
|
365
365
|
|
|
366
366
|
// We need to know the auctionId at this time. So we will use the passed in one or generate and set it ourselves
|
|
367
|
-
hookConfig.reqBidsConfigObj.auctionId = hookConfig.reqBidsConfigObj.auctionId ||
|
|
367
|
+
hookConfig.reqBidsConfigObj.auctionId = hookConfig.reqBidsConfigObj.auctionId || generateUUID();
|
|
368
368
|
|
|
369
369
|
// now we do what we need to with adUnits and save the data object to be used for getFloor and enforcement calls
|
|
370
370
|
_floorDataForAuction[hookConfig.reqBidsConfigObj.auctionId] = createFloorsDataForAuction(hookConfig.reqBidsConfigObj.adUnits || getGlobal().adUnits, hookConfig.reqBidsConfigObj.auctionId);
|
|
@@ -378,7 +378,7 @@ function validateSchemaFields(fields) {
|
|
|
378
378
|
if (Array.isArray(fields) && fields.length > 0 && fields.every(field => allowedFields.indexOf(field) !== -1)) {
|
|
379
379
|
return true;
|
|
380
380
|
}
|
|
381
|
-
|
|
381
|
+
logError(`${MODULE_NAME}: Fields recieved do not match allowed fields`);
|
|
382
382
|
return false;
|
|
383
383
|
}
|
|
384
384
|
|
|
@@ -406,7 +406,7 @@ function validateRules(floorsData, numFields, delimiter) {
|
|
|
406
406
|
|
|
407
407
|
function modelIsValid(model) {
|
|
408
408
|
// schema.fields has only allowed attributes
|
|
409
|
-
if (!validateSchemaFields(
|
|
409
|
+
if (!validateSchemaFields(deepAccess(model, 'schema.fields'))) {
|
|
410
410
|
return false;
|
|
411
411
|
}
|
|
412
412
|
return validateRules(model, model.schema.fields.length, model.schema.delimiter || '|')
|
|
@@ -446,7 +446,7 @@ export function isFloorsDataValid(floorsData) {
|
|
|
446
446
|
}
|
|
447
447
|
floorsData.floorsSchemaVersion = floorsData.floorsSchemaVersion || 1;
|
|
448
448
|
if (typeof floorsSchemaValidation[floorsData.floorsSchemaVersion] !== 'function') {
|
|
449
|
-
|
|
449
|
+
logError(`${MODULE_NAME}: Unknown floorsSchemaVersion: `, floorsData.floorsSchemaVersion);
|
|
450
450
|
return false;
|
|
451
451
|
}
|
|
452
452
|
return floorsSchemaValidation[floorsData.floorsSchemaVersion](floorsData);
|
|
@@ -457,13 +457,13 @@ export function isFloorsDataValid(floorsData) {
|
|
|
457
457
|
*/
|
|
458
458
|
export function parseFloorData(floorsData, location) {
|
|
459
459
|
if (floorsData && typeof floorsData === 'object' && isFloorsDataValid(floorsData)) {
|
|
460
|
-
|
|
460
|
+
logInfo(`${MODULE_NAME}: A ${location} set the auction floor data set to `, floorsData);
|
|
461
461
|
return {
|
|
462
462
|
...floorsData,
|
|
463
463
|
location
|
|
464
464
|
};
|
|
465
465
|
}
|
|
466
|
-
|
|
466
|
+
logError(`${MODULE_NAME}: The floors data did not contain correct values`, floorsData);
|
|
467
467
|
}
|
|
468
468
|
|
|
469
469
|
/**
|
|
@@ -484,7 +484,7 @@ export function requestBidsHook(fn, reqBidsConfigObj) {
|
|
|
484
484
|
// If auction delay > 0 AND we are fetching -> Then wait until it finishes
|
|
485
485
|
if (_floorsConfig.auctionDelay > 0 && fetching) {
|
|
486
486
|
hookConfig.timer = setTimeout(() => {
|
|
487
|
-
|
|
487
|
+
logWarn(`${MODULE_NAME}: Fetch attempt did not return in time for auction`);
|
|
488
488
|
_floorsConfig.fetchStatus = 'timeout';
|
|
489
489
|
continueAuction(hookConfig);
|
|
490
490
|
}, _floorsConfig.auctionDelay);
|
|
@@ -526,7 +526,7 @@ export function handleFetchResponse(fetchResponse) {
|
|
|
526
526
|
// set .data to it
|
|
527
527
|
_floorsConfig.data = fetchData;
|
|
528
528
|
// set skipRate override if necessary
|
|
529
|
-
_floorsConfig.skipRate =
|
|
529
|
+
_floorsConfig.skipRate = isNumber(fetchData.skipRate) ? fetchData.skipRate : _floorsConfig.skipRate;
|
|
530
530
|
_floorsConfig.floorProvider = fetchData.floorProvider || _floorsConfig.floorProvider;
|
|
531
531
|
}
|
|
532
532
|
|
|
@@ -537,7 +537,7 @@ export function handleFetchResponse(fetchResponse) {
|
|
|
537
537
|
function handleFetchError(status) {
|
|
538
538
|
fetching = false;
|
|
539
539
|
_floorsConfig.fetchStatus = 'error';
|
|
540
|
-
|
|
540
|
+
logError(`${MODULE_NAME}: Fetch errored with: `, status);
|
|
541
541
|
|
|
542
542
|
// if any auctions are waiting for fetch to finish, we need to continue them!
|
|
543
543
|
resumeDelayedAuctions();
|
|
@@ -553,13 +553,13 @@ export function generateAndHandleFetch(floorEndpoint) {
|
|
|
553
553
|
// default to GET and we only support GET for now
|
|
554
554
|
let requestMethod = floorEndpoint.method || 'GET';
|
|
555
555
|
if (requestMethod !== 'GET') {
|
|
556
|
-
|
|
556
|
+
logError(`${MODULE_NAME}: 'GET' is the only request method supported at this time!`);
|
|
557
557
|
} else {
|
|
558
558
|
ajax(floorEndpoint.url, { success: handleFetchResponse, error: handleFetchError }, null, { method: 'GET' });
|
|
559
559
|
fetching = true;
|
|
560
560
|
}
|
|
561
561
|
} else if (fetching) {
|
|
562
|
-
|
|
562
|
+
logWarn(`${MODULE_NAME}: A fetch is already occuring. Skipping.`);
|
|
563
563
|
}
|
|
564
564
|
}
|
|
565
565
|
|
|
@@ -580,14 +580,14 @@ function addFieldOverrides(overrides) {
|
|
|
580
580
|
* @summary This is the function which controls what happens during a pbjs.setConfig({...floors: {}}) is called
|
|
581
581
|
*/
|
|
582
582
|
export function handleSetFloorsConfig(config) {
|
|
583
|
-
_floorsConfig =
|
|
583
|
+
_floorsConfig = pick(config, [
|
|
584
584
|
'floorMin',
|
|
585
585
|
'enabled', enabled => enabled !== false, // defaults to true
|
|
586
586
|
'auctionDelay', auctionDelay => auctionDelay || 0,
|
|
587
|
-
'floorProvider', floorProvider =>
|
|
587
|
+
'floorProvider', floorProvider => deepAccess(config, 'data.floorProvider', floorProvider),
|
|
588
588
|
'endpoint', endpoint => endpoint || {},
|
|
589
|
-
'skipRate', () => !isNaN(
|
|
590
|
-
'enforcement', enforcement =>
|
|
589
|
+
'skipRate', () => !isNaN(deepAccess(config, 'data.skipRate')) ? config.data.skipRate : config.skipRate || 0,
|
|
590
|
+
'enforcement', enforcement => pick(enforcement || {}, [
|
|
591
591
|
'enforceJS', enforceJS => enforceJS !== false, // defaults to true
|
|
592
592
|
'enforcePBS', enforcePBS => enforcePBS === true, // defaults to false
|
|
593
593
|
'floorDeals', floorDeals => floorDeals === true, // defaults to false
|
|
@@ -613,11 +613,11 @@ export function handleSetFloorsConfig(config) {
|
|
|
613
613
|
getGlobal().requestBids.before(requestBidsHook, 50);
|
|
614
614
|
// if user has debug on then we want to allow the debugging module to run before this, assuming they are testing priceFloors
|
|
615
615
|
// debugging is currently set at 5 priority
|
|
616
|
-
getHook('addBidResponse').before(addBidResponseHook,
|
|
616
|
+
getHook('addBidResponse').before(addBidResponseHook, debugTurnedOn() ? 4 : 50);
|
|
617
617
|
addedFloorsHook = true;
|
|
618
618
|
}
|
|
619
619
|
} else {
|
|
620
|
-
|
|
620
|
+
logInfo(`${MODULE_NAME}: Turning off module`);
|
|
621
621
|
|
|
622
622
|
_floorsConfig = {};
|
|
623
623
|
_floorDataForAuction = {};
|
|
@@ -653,8 +653,8 @@ function addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm) {
|
|
|
653
653
|
* @summary takes the enforcement flags and the bid itself and determines if it should be floored
|
|
654
654
|
*/
|
|
655
655
|
function shouldFloorBid(floorData, floorInfo, bid) {
|
|
656
|
-
let enforceJS =
|
|
657
|
-
let shouldFloorDeal =
|
|
656
|
+
let enforceJS = deepAccess(floorData, 'enforcement.enforceJS') !== false;
|
|
657
|
+
let shouldFloorDeal = deepAccess(floorData, 'enforcement.floorDeals') === true || !bid.dealId;
|
|
658
658
|
let bidBelowFloor = bid.floorData.cpmAfterAdjustments < floorInfo.matchingFloor;
|
|
659
659
|
return enforceJS && (bidBelowFloor && shouldFloorDeal);
|
|
660
660
|
}
|
|
@@ -675,7 +675,7 @@ export function addBidResponseHook(fn, adUnitCode, bid) {
|
|
|
675
675
|
let floorInfo = getFirstMatchingFloor(floorData.data, {...matchingBidRequest}, {...bid, size: [bid.width, bid.height]});
|
|
676
676
|
|
|
677
677
|
if (!floorInfo.matchingFloor) {
|
|
678
|
-
|
|
678
|
+
logWarn(`${MODULE_NAME}: unable to determine a matching price floor for bidResponse`, bid);
|
|
679
679
|
return fn.call(this, adUnitCode, bid);
|
|
680
680
|
}
|
|
681
681
|
|
|
@@ -691,7 +691,7 @@ export function addBidResponseHook(fn, adUnitCode, bid) {
|
|
|
691
691
|
try {
|
|
692
692
|
adjustedCpm = getGlobal().convertCurrency(bid.cpm, bidResponseCurrency.toUpperCase(), floorCurrency);
|
|
693
693
|
} catch (err) {
|
|
694
|
-
|
|
694
|
+
logError(`${MODULE_NAME}: Unable do get currency conversion for bidResponse to Floor Currency. Do you have Currency module enabled? ${bid}`);
|
|
695
695
|
return fn.call(this, adUnitCode, bid);
|
|
696
696
|
}
|
|
697
697
|
}
|
|
@@ -707,7 +707,7 @@ export function addBidResponseHook(fn, adUnitCode, bid) {
|
|
|
707
707
|
// bid fails floor -> throw it out
|
|
708
708
|
// create basic bid no-bid with necessary data fro analytics adapters
|
|
709
709
|
let flooredBid = createBid(CONSTANTS.STATUS.NO_BID, matchingBidRequest);
|
|
710
|
-
Object.assign(flooredBid,
|
|
710
|
+
Object.assign(flooredBid, pick(bid, [
|
|
711
711
|
'floorData',
|
|
712
712
|
'width',
|
|
713
713
|
'height',
|
|
@@ -720,7 +720,7 @@ export function addBidResponseHook(fn, adUnitCode, bid) {
|
|
|
720
720
|
flooredBid.status = CONSTANTS.BID_STATUS.BID_REJECTED;
|
|
721
721
|
// if floor not met update bid with 0 cpm so it is not included downstream and marked as no-bid
|
|
722
722
|
flooredBid.cpm = 0;
|
|
723
|
-
|
|
723
|
+
logWarn(`${MODULE_NAME}: ${flooredBid.bidderCode}'s Bid Response for ${adUnitCode} was rejected due to floor not met`, bid);
|
|
724
724
|
return fn.call(this, adUnitCode, flooredBid);
|
|
725
725
|
}
|
|
726
726
|
return fn.call(this, adUnitCode, bid);
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { isFn, isPlainObject } from '../src/utils.js';
|
|
1
2
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
|
-
import * as utils from '../src/utils.js';
|
|
3
3
|
|
|
4
4
|
const BIDDER_CODE = 'proxistore';
|
|
5
5
|
const PROXISTORE_VENDOR_ID = 418;
|
|
6
6
|
const COOKIE_BASE_URL = 'https://abs.proxistore.com/v3/rtb/prebid/multi';
|
|
7
|
-
const COOKIE_LESS_URL =
|
|
7
|
+
const COOKIE_LESS_URL =
|
|
8
|
+
'https://abs.cookieless-proxistore.com/v3/rtb/prebid/multi';
|
|
8
9
|
|
|
9
10
|
function _createServerRequest(bidRequests, bidderRequest) {
|
|
10
11
|
var sizeIds = [];
|
|
@@ -170,7 +171,7 @@ function interpretResponse(serverResponse, bidRequest) {
|
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
function _assignFloor(bid) {
|
|
173
|
-
if (!
|
|
174
|
+
if (!isFn(bid.getFloor)) {
|
|
174
175
|
// eslint-disable-next-line no-console
|
|
175
176
|
console.log(bid.params.bidFloor);
|
|
176
177
|
return bid.params.bidFloor ? bid.params.bidFloor : null;
|
|
@@ -181,11 +182,7 @@ function _assignFloor(bid) {
|
|
|
181
182
|
size: '*',
|
|
182
183
|
});
|
|
183
184
|
|
|
184
|
-
if (
|
|
185
|
-
utils.isPlainObject(floor) &&
|
|
186
|
-
!isNaN(floor.floor) &&
|
|
187
|
-
floor.currency === 'EUR'
|
|
188
|
-
) {
|
|
185
|
+
if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') {
|
|
189
186
|
return floor.floor;
|
|
190
187
|
}
|
|
191
188
|
return null;
|
|
@@ -196,6 +193,7 @@ export const spec = {
|
|
|
196
193
|
isBidRequestValid: isBidRequestValid,
|
|
197
194
|
buildRequests: buildRequests,
|
|
198
195
|
interpretResponse: interpretResponse,
|
|
196
|
+
gvlid: PROXISTORE_VENDOR_ID,
|
|
199
197
|
};
|
|
200
198
|
|
|
201
199
|
registerBidder(spec);
|
package/modules/pubCommonId.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* stored in the page's domain. When the module is included, an id is generated if needed,
|
|
4
4
|
* persisted as a cookie, and automatically appended to all the bidRequest as bid.crumbs.pubcid.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import { logMessage, parseUrl, buildUrl, triggerPixel, generateUUID, isArray } from '../src/utils.js';
|
|
7
7
|
import { config } from '../src/config.js';
|
|
8
8
|
import events from '../src/events.js';
|
|
9
9
|
import CONSTANTS from '../src/constants.json';
|
|
@@ -44,7 +44,7 @@ export function setStorageItem(key, val, expires) {
|
|
|
44
44
|
|
|
45
45
|
storage.setDataInLocalStorage(key, val);
|
|
46
46
|
} catch (e) {
|
|
47
|
-
|
|
47
|
+
logMessage(e);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -74,7 +74,7 @@ export function getStorageItem(key) {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
} catch (e) {
|
|
77
|
-
|
|
77
|
+
logMessage(e);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
return val;
|
|
@@ -89,7 +89,7 @@ export function removeStorageItem(key) {
|
|
|
89
89
|
storage.removeDataFromLocalStorage(key + EXP_SUFFIX);
|
|
90
90
|
storage.removeDataFromLocalStorage(key);
|
|
91
91
|
} catch (e) {
|
|
92
|
-
|
|
92
|
+
logMessage(e);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -141,13 +141,13 @@ function queuePixelCallback(pixelUrl, id) {
|
|
|
141
141
|
id = id || '';
|
|
142
142
|
|
|
143
143
|
// Use pubcid as a cache buster
|
|
144
|
-
const urlInfo =
|
|
144
|
+
const urlInfo = parseUrl(pixelUrl);
|
|
145
145
|
urlInfo.search.id = encodeURIComponent('pubcid:' + id);
|
|
146
|
-
const targetUrl =
|
|
146
|
+
const targetUrl = buildUrl(urlInfo);
|
|
147
147
|
|
|
148
148
|
events.on(CONSTANTS.EVENTS.AUCTION_END, function auctionEndHandler() {
|
|
149
149
|
events.off(CONSTANTS.EVENTS.AUCTION_END, auctionEndHandler);
|
|
150
|
-
|
|
150
|
+
triggerPixel(targetUrl);
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
return true;
|
|
@@ -177,7 +177,7 @@ export function requestBidHook(next, config) {
|
|
|
177
177
|
if (typeof window[PUB_COMMON] === 'object') {
|
|
178
178
|
// If the page includes its own pubcid object, then use that instead.
|
|
179
179
|
pubcid = window[PUB_COMMON].getId();
|
|
180
|
-
|
|
180
|
+
logMessage(PUB_COMMON + ': pubcid = ' + pubcid);
|
|
181
181
|
} else {
|
|
182
182
|
// Otherwise get the existing cookie
|
|
183
183
|
pubcid = readValue(ID_NAME);
|
|
@@ -190,7 +190,7 @@ export function requestBidHook(next, config) {
|
|
|
190
190
|
}
|
|
191
191
|
// Generate a new id
|
|
192
192
|
if (!pubcid) {
|
|
193
|
-
pubcid =
|
|
193
|
+
pubcid = generateUUID();
|
|
194
194
|
}
|
|
195
195
|
// Update the cookie/storage with the latest expiration date
|
|
196
196
|
writeValue(ID_NAME, pubcid, pubcidConfig.interval);
|
|
@@ -205,14 +205,14 @@ export function requestBidHook(next, config) {
|
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
logMessage('pbjs: pubcid = ' + pubcid);
|
|
209
209
|
}
|
|
210
210
|
|
|
211
211
|
// Append pubcid to each bid object, which will be incorporated
|
|
212
212
|
// into bid requests later.
|
|
213
213
|
if (adUnits && pubcid) {
|
|
214
214
|
adUnits.forEach((unit) => {
|
|
215
|
-
if (unit.bids &&
|
|
215
|
+
if (unit.bids && isArray(unit.bids)) {
|
|
216
216
|
unit.bids.forEach((bid) => {
|
|
217
217
|
Object.assign(bid, {crumbs: {pubcid}});
|
|
218
218
|
});
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {submodule} from '../src/hook.js';
|
|
9
|
-
import
|
|
9
|
+
import { logInfo, isArray } from '../src/utils.js';
|
|
10
10
|
|
|
11
11
|
const MODULE_NAME = 'pubProvidedId';
|
|
12
12
|
|
|
@@ -27,7 +27,7 @@ export const pubProvidedIdSubmodule = {
|
|
|
27
27
|
*/
|
|
28
28
|
decode(value) {
|
|
29
29
|
const res = value ? {pubProvidedId: value} : undefined;
|
|
30
|
-
|
|
30
|
+
logInfo('PubProvidedId: Decoded value ' + JSON.stringify(res));
|
|
31
31
|
return res;
|
|
32
32
|
},
|
|
33
33
|
|
|
@@ -40,7 +40,7 @@ export const pubProvidedIdSubmodule = {
|
|
|
40
40
|
getId(config) {
|
|
41
41
|
const configParams = (config && config.params) || {};
|
|
42
42
|
let res = [];
|
|
43
|
-
if (
|
|
43
|
+
if (isArray(configParams.eids)) {
|
|
44
44
|
res = res.concat(configParams.eids);
|
|
45
45
|
}
|
|
46
46
|
if (typeof configParams.eidsFunction === 'function') {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import {submodule} from '../src/hook.js';
|
|
9
9
|
import {getStorageManager} from '../src/storageManager.js';
|
|
10
10
|
import {ajax} from '../src/ajax.js';
|
|
11
|
-
import
|
|
11
|
+
import { parseUrl, buildUrl, logError } from '../src/utils.js';
|
|
12
12
|
import {uspDataHandler} from '../src/adapterManager.js';
|
|
13
13
|
|
|
14
14
|
const MODULE_NAME = 'publinkId';
|
|
@@ -18,24 +18,33 @@ const PUBLINK_S2S_COOKIE = '_publink_srv';
|
|
|
18
18
|
|
|
19
19
|
export const storage = getStorageManager(GVLID);
|
|
20
20
|
|
|
21
|
+
function isHex(s) {
|
|
22
|
+
return /^[A-F0-9]+$/i.test(s);
|
|
23
|
+
}
|
|
24
|
+
|
|
21
25
|
function publinkIdUrl(params, consentData) {
|
|
22
|
-
let url =
|
|
26
|
+
let url = parseUrl('https://proc.ad.cpe.dotomi.com/cvx/client/sync/publink');
|
|
23
27
|
url.search = {
|
|
24
28
|
deh: params.e,
|
|
25
29
|
mpn: 'Prebid.js',
|
|
26
30
|
mpv: '$prebid.version$',
|
|
27
31
|
};
|
|
32
|
+
|
|
28
33
|
if (consentData) {
|
|
29
34
|
url.search.gdpr = (consentData.gdprApplies) ? 1 : 0;
|
|
30
35
|
url.search.gdpr_consent = consentData.consentString;
|
|
31
36
|
}
|
|
32
37
|
|
|
38
|
+
if (params.site_id) { url.search.sid = params.site_id; }
|
|
39
|
+
|
|
40
|
+
if (params.api_key) { url.search.apikey = params.api_key; }
|
|
41
|
+
|
|
33
42
|
const usPrivacyString = uspDataHandler.getConsentData();
|
|
34
43
|
if (usPrivacyString && typeof usPrivacyString === 'string') {
|
|
35
44
|
url.search.us_privacy = usPrivacyString;
|
|
36
45
|
}
|
|
37
46
|
|
|
38
|
-
return
|
|
47
|
+
return buildUrl(url);
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
function makeCallback(config = {}, consentData) {
|
|
@@ -49,8 +58,13 @@ function makeCallback(config = {}, consentData) {
|
|
|
49
58
|
}
|
|
50
59
|
}
|
|
51
60
|
};
|
|
61
|
+
|
|
52
62
|
if (config.params && config.params.e) {
|
|
53
|
-
|
|
63
|
+
if (isHex(config.params.e)) {
|
|
64
|
+
ajax(publinkIdUrl(config.params, consentData), handleResponse, undefined, options);
|
|
65
|
+
} else {
|
|
66
|
+
logError('params.e must be a hex string');
|
|
67
|
+
}
|
|
54
68
|
}
|
|
55
69
|
};
|
|
56
70
|
}
|
|
@@ -73,7 +87,7 @@ function getlocalValue() {
|
|
|
73
87
|
return obj.publink;
|
|
74
88
|
}
|
|
75
89
|
} catch (e) {
|
|
76
|
-
|
|
90
|
+
logError(e);
|
|
77
91
|
}
|
|
78
92
|
}
|
|
79
93
|
}
|
|
@@ -96,11 +110,11 @@ export const publinkIdSubmodule = {
|
|
|
96
110
|
/**
|
|
97
111
|
* decode the stored id value for passing to bid requests
|
|
98
112
|
* @function
|
|
99
|
-
* @param {string}
|
|
113
|
+
* @param {string} publinkId encrypted userid
|
|
100
114
|
* @returns {{publinkId: string} | undefined}
|
|
101
115
|
*/
|
|
102
116
|
decode(publinkId) {
|
|
103
|
-
return {
|
|
117
|
+
return {publinkId: publinkId};
|
|
104
118
|
},
|
|
105
119
|
|
|
106
120
|
/**
|
|
@@ -108,6 +122,8 @@ export const publinkIdSubmodule = {
|
|
|
108
122
|
* Use a publink cookie first if it is present, otherwise use prebids copy, if neither are available callout to get a new id
|
|
109
123
|
* @function
|
|
110
124
|
* @param {SubmoduleConfig} [config] Config object with params and storage properties
|
|
125
|
+
* @param {ConsentData|undefined} consentData GDPR consent
|
|
126
|
+
* @param {(Object|undefined)} storedId Previously cached id
|
|
111
127
|
* @returns {IdResponse}
|
|
112
128
|
*/
|
|
113
129
|
getId: function(config, consentData, storedId) {
|
|
@@ -7,7 +7,10 @@ Publink user id module
|
|
|
7
7
|
| Param Name | Required | Type | Description | Example |
|
|
8
8
|
| --- | --- | --- | --- | --- |
|
|
9
9
|
| name | Yes | String | module identifier | `"publinkId"` |
|
|
10
|
-
| params.e | Yes | String | hashed email address | `"
|
|
10
|
+
| params.e | Yes | String | hashed email address | `"7D320454942620664D96EF78ED4E3A2A"` |
|
|
11
|
+
| params.api_key | Yes | String | api key for access | `"7ab62359-bdc0-4095-b573-ef474fb55d24"` |
|
|
12
|
+
| params.site_id | Yes | String | site identifier | `"123456"` |
|
|
13
|
+
|
|
11
14
|
|
|
12
15
|
### Example configuration for Publink
|
|
13
16
|
```
|
|
@@ -20,7 +23,9 @@ pbjs.setConfig({
|
|
|
20
23
|
type: "html5"
|
|
21
24
|
},
|
|
22
25
|
params: {
|
|
23
|
-
e: "
|
|
26
|
+
e: "7D320454942620664D96EF78ED4E3A2A", // example hashed email (md5)
|
|
27
|
+
site_id: "123456", // provided by Epsilon
|
|
28
|
+
api_key: "7ab62359-bdc0-4095-b573-ef474fb55d2" // provided by Epsilon
|
|
24
29
|
}
|
|
25
30
|
}],
|
|
26
31
|
}
|