prebid.js 8.43.0 → 8.45.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/README.md +7 -1
- package/creative/constants.js +7 -7
- package/creative/renderers/display/constants.js +2 -2
- package/creative/renderers/native/constants.js +2 -2
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxAnalyticsAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adomikAnalyticsAdapter.js +1 -1
- package/dist/adpod.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adxpremiumAnalyticsAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/analyticsAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/asteriobidAnalyticsAdapter.js +1 -1
- package/dist/atsAnalyticsAdapter.js +1 -1
- package/dist/automatadAnalyticsAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidViewability.js +1 -1
- package/dist/bidViewabilityIO.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/brandmetricsRtdProvider.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/browsiRtdProvider.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/chunk-paapi.js +1 -1
- package/dist/cleanioRtdProvider.js +1 -1
- package/dist/concertAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/confiantRtdProvider.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagementUsp.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/creative-renderer-native.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/currency.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -0
- package/dist/datablocksAnalyticsAdapter.js +1 -1
- package/dist/datawrkzBidAdapter.js +1 -1
- package/dist/debugging-standalone.js +1 -1
- package/dist/debugging.js +1 -1
- package/dist/dependencies.json +3 -3
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/dsaControl.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/genericAnalyticsAdapter.js +1 -1
- package/dist/geoedgeRtdProvider.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/growthCodeAnalyticsAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronAnalyticsAdapter.js +1 -1
- package/dist/holidBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/illuminBidAdapter.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/instreamTracking.js +1 -1
- package/dist/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerRtdProvider.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/limelightDigitalBidAdapter.js +1 -1
- package/dist/liveIntentAnalyticsAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/loyalBidAdapter.js +1 -0
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafilterRtdProvider.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/multibid.js +1 -1
- package/dist/neuwoRtdProvider.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +242 -239
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/optimonAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionAnalyticsAdapter.js +1 -1
- package/dist/oxxionRtdProvider.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pbsExtensions.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pgamsspBidAdapter.js +1 -1
- package/dist/pianoDmpAnalyticsAdapter.js +1 -1
- package/dist/pirIdSystem.js +1 -0
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
- package/dist/priceFloors.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubperfAnalyticsAdapter.js +1 -1
- package/dist/pubstackAnalyticsAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pulsepointAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/qortexRtdProvider.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevantAnalyticsAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rivrAnalyticsAdapter.js +1 -1
- package/dist/roxotAnalyticsAdapter.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/s2sTesting.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/schain.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/shinezRtbBidAdapter.js +1 -1
- package/dist/sigmoidAnalyticsAdapter.js +1 -1
- package/dist/sirdataRtdProvider.js +1 -1
- package/dist/sizeMapping.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiAnalyticsAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/staqAnalyticsAdapter.js +1 -1
- package/dist/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tagorasBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.js +1 -1
- package/dist/topicsFpdModule.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videoModule.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/weboramaRtdProvider.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yandexAnalyticsAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/gulpfile.js +9 -1
- package/integrationExamples/gpt/adnuntius_example.html +7 -1
- package/integrationExamples/gpt/azerionedgeRtdProvider_example.html +3 -3
- package/integrationExamples/gpt/top-level-paapi/decisionLogic.js +57 -0
- package/integrationExamples/gpt/top-level-paapi/tl_paapi_example.html +188 -0
- package/integrationExamples/gpt/x-domain/creative.html +1 -1
- package/integrationExamples/{gpt → realTimeData}/jwplayerRtdProvider_example.html +28 -42
- package/libraries/analyticsAdapter/AnalyticsAdapter.js +4 -4
- package/libraries/creative-renderer-native/renderer.js +1 -1
- package/modules/33acrossAnalyticsAdapter.js +2 -4
- package/modules/33acrossIdSystem.js +1 -1
- package/modules/adWMGAnalyticsAdapter.js +9 -11
- package/modules/adagioAnalyticsAdapter.js +49 -46
- package/modules/adkernelAdnAnalyticsAdapter.js +8 -8
- package/modules/adkernelBidAdapter.js +23 -102
- package/modules/adlooxAdServerVideo.js +2 -2
- package/modules/adlooxAnalyticsAdapter.js +4 -4
- package/modules/adnuntiusBidAdapter.js +50 -32
- package/modules/adomikAnalyticsAdapter.js +7 -7
- package/modules/adpod.js +3 -3
- package/modules/adxcgAnalyticsAdapter.js +10 -10
- package/modules/adxpremiumAnalyticsAdapter.js +8 -10
- package/modules/agmaAnalyticsAdapter.js +6 -7
- package/modules/appierAnalyticsAdapter.js +5 -7
- package/modules/appnexusBidAdapter.js +1 -0
- package/modules/asteriobidAnalyticsAdapter.js +14 -14
- package/modules/atsAnalyticsAdapter.js +4 -4
- package/modules/automatadAnalyticsAdapter.js +20 -20
- package/modules/azerionedgeRtdProvider.md +4 -2
- package/modules/bidViewability.js +3 -3
- package/modules/bidViewabilityIO.js +3 -3
- package/modules/bidwatchAnalyticsAdapter.js +7 -9
- package/modules/brandmetricsRtdProvider.js +6 -6
- package/modules/browsiRtdProvider.js +3 -3
- package/modules/byDataAnalyticsAdapter.js +3 -3
- package/modules/cleanioRtdProvider.js +3 -3
- package/modules/concertAnalyticsAdapter.js +5 -7
- package/modules/confiantRtdProvider.js +2 -2
- package/modules/conversantAnalyticsAdapter.js +2 -4
- package/modules/criteoBidAdapter.js +53 -10
- package/modules/currency.js +7 -7
- package/modules/dailymotionBidAdapter.js +139 -0
- package/modules/dailymotionBidAdapter.md +140 -0
- package/modules/datawrkzBidAdapter.js +4 -4
- package/modules/debugging/pbsInterceptor.js +2 -2
- package/modules/dfpAdServerVideo.js +2 -2
- package/modules/discoveryBidAdapter.js +21 -0
- package/modules/dsaControl.js +5 -5
- package/modules/eplanningAnalyticsAdapter.js +8 -8
- package/modules/fintezaAnalyticsAdapter.js +5 -5
- package/modules/gdprEnforcement.js +3 -3
- package/modules/geoedgeRtdProvider.js +2 -2
- package/modules/greenbidsAnalyticsAdapter.js +13 -10
- package/modules/greenbidsRtdProvider.js +2 -2
- package/modules/gridBidAdapter.js +2 -2
- package/modules/growthCodeAnalyticsAdapter.js +14 -14
- package/modules/gumgumBidAdapter.js +4 -1
- package/modules/hadronAnalyticsAdapter.js +14 -14
- package/modules/holidBidAdapter.js +2 -2
- package/modules/id5AnalyticsAdapter.js +7 -9
- package/modules/improvedigitalBidAdapter.js +2 -1
- package/modules/insticatorBidAdapter.js +137 -27
- package/modules/instreamTracking.js +4 -4
- package/modules/invisiblyAnalyticsAdapter.js +15 -17
- package/modules/ixBidAdapter.js +3 -3
- package/modules/jwplayerRtdProvider.js +93 -26
- package/modules/jwplayerRtdProvider.md +23 -2
- package/modules/kargoAnalyticsAdapter.js +3 -3
- package/modules/kargoBidAdapter.js +26 -31
- package/modules/konduitAnalyticsAdapter.js +13 -13
- package/modules/lassoBidAdapter.js +11 -2
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/liveIntentAnalyticsAdapter.js +2 -2
- package/modules/livewrappedAnalyticsAdapter.js +10 -10
- package/modules/loyalBidAdapter.js +190 -0
- package/modules/loyalBidAdapter.md +79 -0
- package/modules/magniteAnalyticsAdapter.js +25 -23
- package/modules/malltvAnalyticsAdapter.js +4 -6
- package/modules/mediafilterRtdProvider.js +2 -2
- package/modules/medianetAnalyticsAdapter.js +12 -12
- package/modules/medianetBidAdapter.js +1 -1
- package/modules/multibid/index.js +2 -2
- package/modules/neuwoRtdProvider.js +2 -2
- package/modules/nextMillenniumBidAdapter.js +4 -4
- package/modules/nobidAnalyticsAdapter.js +9 -11
- package/modules/ooloAnalyticsAdapter.js +2 -2
- package/modules/oxxionAnalyticsAdapter.js +7 -9
- package/modules/paapi.js +20 -6
- package/modules/permutiveRtdProvider.js +21 -2
- package/modules/pgamsspBidAdapter.js +26 -3
- package/modules/pirIdSystem.js +62 -0
- package/modules/pirIdSystem.md +27 -0
- package/modules/prebidServerBidAdapter/index.js +8 -8
- package/modules/prebidServerBidAdapter/ortbConverter.js +3 -3
- package/modules/prebidmanagerAnalyticsAdapter.js +14 -14
- package/modules/priceFloors.js +10 -5
- package/modules/pubmaticAnalyticsAdapter.js +32 -22
- package/modules/pubmaticBidAdapter.js +1 -17
- package/modules/pubwiseAnalyticsAdapter.js +11 -11
- package/modules/pubxaiAnalyticsAdapter.js +6 -6
- package/modules/qortexRtdProvider.js +2 -2
- package/modules/roxotAnalyticsAdapter.js +8 -10
- package/modules/rtdModule/index.js +7 -7
- package/modules/scaleableAnalyticsAdapter.js +5 -5
- package/modules/seedtagBidAdapter.js +12 -3
- package/modules/sigmoidAnalyticsAdapter.js +7 -7
- package/modules/sirdataRtdProvider.js +2 -0
- package/modules/smaatoBidAdapter.js +1 -2
- package/modules/sonobiAnalyticsAdapter.js +10 -12
- package/modules/sonobiBidAdapter.js +2 -5
- package/modules/sovrnAnalyticsAdapter.js +7 -9
- package/modules/sovrnBidAdapter.js +1 -1
- package/modules/staqAnalyticsAdapter.js +9 -9
- package/modules/teadsBidAdapter.js +2 -0
- package/modules/terceptAnalyticsAdapter.js +7 -7
- package/modules/topicsFpdModule.js +3 -0
- package/modules/topicsFpdModule.md +4 -0
- package/modules/ucfunnelAnalyticsAdapter.js +5 -7
- package/modules/userId/index.js +3 -3
- package/modules/videoModule/index.js +4 -4
- package/modules/yandexAnalyticsAdapter.js +2 -2
- package/modules/yieldoneAnalyticsAdapter.js +7 -7
- package/modules/yuktamediaAnalyticsAdapter.js +9 -9
- package/modules/zeta_global_sspAnalyticsAdapter.js +5 -5
- package/modules/zeta_global_sspBidAdapter.js +8 -1
- package/package.json +1 -1
- package/src/adRendering.js +15 -15
- package/src/adUnits.js +9 -21
- package/src/adapterManager.js +23 -13
- package/src/adapters/bidderFactory.js +8 -8
- package/src/auction.js +26 -28
- package/src/auctionManager.js +4 -4
- package/src/bidderSettings.js +2 -2
- package/src/config.js +2 -2
- package/src/constants.js +190 -0
- package/src/events.js +3 -3
- package/src/native.js +6 -8
- package/src/prebid.js +6 -10
- package/src/secureCreatives.js +5 -5
- package/src/targeting.js +13 -13
- package/src/utils.js +4 -4
- package/test/fixtures/fixtures.js +44 -44
- package/test/helpers/analytics.js +6 -6
- package/test/spec/AnalyticsAdapter_spec.js +3 -3
- package/test/spec/auctionmanager_spec.js +82 -82
- package/test/spec/modules/33acrossAnalyticsAdapter_spec.js +1 -2
- package/test/spec/modules/33acrossIdSystem_spec.js +3 -3
- package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +14 -14
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +79 -55
- package/test/spec/modules/adkernelAdnAnalytics_spec.js +6 -6
- package/test/spec/modules/adkernelBidAdapter_spec.js +63 -24
- package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +10 -7
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/adxcgAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/adxpremiumAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/agmaAnalyticsAdapter_spec.js +18 -14
- package/test/spec/modules/appierAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/asteriobidAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +8 -8
- package/test/spec/modules/automatadAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
- package/test/spec/modules/bidViewability_spec.js +4 -4
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +7 -6
- package/test/spec/modules/byDataAnalyticsAdapter_spec.js +5 -4
- package/test/spec/modules/cleanioRtdProvider_spec.js +6 -6
- package/test/spec/modules/concertAnalyticsAdapter_spec.js +7 -6
- package/test/spec/modules/confiantRtdProvider_spec.js +2 -2
- package/test/spec/modules/conversantAnalyticsAdapter_spec.js +61 -61
- package/test/spec/modules/criteoBidAdapter_spec.js +112 -6
- package/test/spec/modules/currency_spec.js +6 -6
- package/test/spec/modules/dailymotionBidAdapter_spec.js +369 -0
- package/test/spec/modules/discoveryBidAdapter_spec.js +35 -1
- package/test/spec/modules/dsaControl_spec.js +4 -4
- package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +20 -13
- package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +5 -5
- package/test/spec/modules/genericAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/geoedgeRtdProvider_spec.js +37 -37
- package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +15 -2
- package/test/spec/modules/greenbidsRtdProvider_spec.js +2 -2
- package/test/spec/modules/gridBidAdapter_spec.js +3 -1
- package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/gumgumBidAdapter_spec.js +23 -0
- package/test/spec/modules/hadronAnalyticsAdapter_spec.js +3 -3
- package/test/spec/modules/id5AnalyticsAdapter_spec.js +5 -5
- package/test/spec/modules/id5IdSystem_spec.js +2 -2
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -3
- package/test/spec/modules/insticatorBidAdapter_spec.js +275 -22
- package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +40 -40
- package/test/spec/modules/jwplayerRtdProvider_spec.js +672 -29
- package/test/spec/modules/kargoAnalyticsAdapter_spec.js +3 -3
- package/test/spec/modules/kargoBidAdapter_spec.js +36 -0
- package/test/spec/modules/konduitAnalyticsAdapter_spec.js +13 -13
- package/test/spec/modules/lassoBidAdapter_spec.js +1 -0
- package/test/spec/modules/lemmaDigitalBidAdapter_spec.js +1 -1
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +16 -1
- package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -3
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +15 -20
- package/test/spec/modules/loyalBidAdapter_spec .js +375 -0
- package/test/spec/modules/magniteAnalyticsAdapter_spec.js +31 -15
- package/test/spec/modules/malltvAnalyticsAdapter_spec.js +3 -3
- package/test/spec/modules/mediafilterRtdProvider_spec.js +2 -2
- package/test/spec/modules/medianetAnalyticsAdapter_spec.js +3 -3
- package/test/spec/modules/nobidAnalyticsAdapter_spec.js +23 -23
- package/test/spec/modules/ooloAnalyticsAdapter_spec.js +33 -33
- package/test/spec/modules/optimonAnalyticsAdapter_spec.js +0 -1
- package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/paapi_spec.js +40 -14
- package/test/spec/modules/permutiveRtdProvider_spec.js +29 -1
- package/test/spec/modules/pgamsspBidAdapter_spec.js +50 -4
- package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +9 -9
- package/test/spec/modules/pirIdSystem_spec.js +77 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +7 -7
- package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/priceFloors_spec.js +6 -5
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +12 -14
- package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
- package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +0 -1
- package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +14 -14
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/qortexRtdProvider_spec.js +2 -2
- package/test/spec/modules/realTimeDataModule_spec.js +9 -9
- package/test/spec/modules/relevantAnalyticsAdapter_spec.js +3 -3
- package/test/spec/modules/relevantdigitalBidAdapter_spec.js +2 -2
- package/test/spec/modules/rivrAnalyticsAdapter_spec.js +4 -4
- package/test/spec/modules/roxotAnalyticsAdapter_spec.js +25 -25
- package/test/spec/modules/scaleableAnalyticsAdapter_spec.js +5 -5
- package/test/spec/modules/seedtagBidAdapter_spec.js +56 -3
- package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +0 -1
- package/test/spec/modules/sonobiAnalyticsAdapter_spec.js +8 -7
- package/test/spec/modules/sonobiBidAdapter_spec.js +4 -6
- package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +2 -2
- package/test/spec/modules/sovrnBidAdapter_spec.js +5 -5
- package/test/spec/modules/staqAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/teadsBidAdapter_spec.js +35 -0
- package/test/spec/modules/terceptAnalyticsAdapter_spec.js +7 -7
- package/test/spec/modules/trionBidAdapter_spec.js +1 -1
- package/test/spec/modules/ucfunnelAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/userId_spec.js +4 -4
- package/test/spec/modules/videoModule/pbVideo_spec.js +3 -3
- package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +22 -21
- package/test/spec/modules/yuktamediaAnalyticsAdapter_spec.js +33 -32
- package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +8 -8
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +1 -1
- package/test/spec/native_spec.js +19 -19
- package/test/spec/unit/adRendering_spec.js +14 -14
- package/test/spec/unit/adUnits_spec.js +1 -1
- package/test/spec/unit/core/adapterManager_spec.js +99 -59
- package/test/spec/unit/core/bidderFactory_spec.js +6 -6
- package/test/spec/unit/core/targeting_spec.js +47 -47
- package/test/spec/unit/pbjs_api_spec.js +81 -81
- package/test/spec/unit/secureCreatives_spec.js +27 -27
- package/test/spec/utils_spec.js +2 -2
- package/src/constants.json +0 -196
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {config} from '../src/config.js';
|
|
2
2
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
3
3
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
4
|
-
import {deepAccess, generateUUID, logError, isArray, isInteger, isArrayOfNums} from '../src/utils.js';
|
|
4
|
+
import {deepAccess, generateUUID, logError, isArray, isInteger, isArrayOfNums, deepSetValue} from '../src/utils.js';
|
|
5
5
|
import {getStorageManager} from '../src/storageManager.js';
|
|
6
6
|
import {find} from '../src/polyfill.js';
|
|
7
7
|
|
|
@@ -12,35 +12,37 @@ const USER_ID_COOKIE_EXP = 2592000000; // 30 days
|
|
|
12
12
|
const BID_TTL = 300; // 5 minutes
|
|
13
13
|
const GVLID = 910;
|
|
14
14
|
|
|
15
|
-
const isSubarray = (arr, target) => {
|
|
16
|
-
if (!isArrayOfNums(arr) || arr.length === 0) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
const targetSet = new Set(target);
|
|
20
|
-
return arr.every(el => targetSet.has(el));
|
|
21
|
-
};
|
|
22
|
-
|
|
23
15
|
export const OPTIONAL_VIDEO_PARAMS = {
|
|
24
16
|
'minduration': (value) => isInteger(value),
|
|
25
17
|
'maxduration': (value) => isInteger(value),
|
|
26
|
-
'protocols': (value) =>
|
|
18
|
+
'protocols': (value) => isArrayOfNums(value), // protocols values supported by Inticator, according to the OpenRTB spec
|
|
27
19
|
'startdelay': (value) => isInteger(value),
|
|
28
20
|
'linearity': (value) => isInteger(value) && [1].includes(value),
|
|
29
21
|
'skip': (value) => isInteger(value) && [1, 0].includes(value),
|
|
30
22
|
'skipmin': (value) => isInteger(value),
|
|
31
23
|
'skipafter': (value) => isInteger(value),
|
|
32
24
|
'sequence': (value) => isInteger(value),
|
|
33
|
-
'battr': (value) =>
|
|
25
|
+
'battr': (value) => isArrayOfNums(value),
|
|
34
26
|
'maxextended': (value) => isInteger(value),
|
|
35
27
|
'minbitrate': (value) => isInteger(value),
|
|
36
28
|
'maxbitrate': (value) => isInteger(value),
|
|
37
|
-
'playbackmethod': (value) =>
|
|
29
|
+
'playbackmethod': (value) => isArrayOfNums(value),
|
|
38
30
|
'playbackend': (value) => isInteger(value) && [1, 2, 3].includes(value),
|
|
39
|
-
'delivery': (value) =>
|
|
31
|
+
'delivery': (value) => isArrayOfNums(value),
|
|
40
32
|
'pos': (value) => isInteger(value) && [0, 1, 2, 3, 4, 5, 6, 7].includes(value),
|
|
41
|
-
'api': (value) =>
|
|
33
|
+
'api': (value) => isArrayOfNums(value),
|
|
42
34
|
};
|
|
43
35
|
|
|
36
|
+
const ORTB_SITE_FIRST_PARTY_DATA = {
|
|
37
|
+
'cat': v => Array.isArray(v) && v.every(c => typeof c === 'string'),
|
|
38
|
+
'sectioncat': v => Array.isArray(v) && v.every(c => typeof c === 'string'),
|
|
39
|
+
'pagecat': v => Array.isArray(v) && v.every(c => typeof c === 'string'),
|
|
40
|
+
'search': v => typeof v === 'string',
|
|
41
|
+
'mobile': v => isInteger(),
|
|
42
|
+
'content': v => typeof v === 'object',
|
|
43
|
+
'keywords': v => typeof v === 'string',
|
|
44
|
+
}
|
|
45
|
+
|
|
44
46
|
export const storage = getStorageManager({bidderCode: BIDDER_CODE});
|
|
45
47
|
|
|
46
48
|
config.setDefaults({
|
|
@@ -103,6 +105,7 @@ function buildVideo(bidRequest) {
|
|
|
103
105
|
const placement = deepAccess(bidRequest, 'mediaTypes.video.placement') || 3;
|
|
104
106
|
const plcmt = deepAccess(bidRequest, 'mediaTypes.video.plcmt') || undefined;
|
|
105
107
|
const playerSize = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
|
|
108
|
+
const context = deepAccess(bidRequest, 'mediaTypes.video.context');
|
|
106
109
|
|
|
107
110
|
if (!w && playerSize) {
|
|
108
111
|
if (Array.isArray(playerSize[0])) {
|
|
@@ -121,17 +124,26 @@ function buildVideo(bidRequest) {
|
|
|
121
124
|
|
|
122
125
|
const bidRequestVideo = deepAccess(bidRequest, 'mediaTypes.video');
|
|
123
126
|
const videoBidderParams = deepAccess(bidRequest, 'params.video', {});
|
|
127
|
+
|
|
124
128
|
let optionalParams = {};
|
|
125
129
|
for (const param in OPTIONAL_VIDEO_PARAMS) {
|
|
126
|
-
if (bidRequestVideo[param]) {
|
|
130
|
+
if (bidRequestVideo[param] && OPTIONAL_VIDEO_PARAMS[param](bidRequestVideo[param])) {
|
|
127
131
|
optionalParams[param] = bidRequestVideo[param];
|
|
128
132
|
}
|
|
133
|
+
// remove invalid optional params from bidder specific overrides
|
|
134
|
+
if (videoBidderParams[param] && !OPTIONAL_VIDEO_PARAMS[param](videoBidderParams[param])) {
|
|
135
|
+
delete videoBidderParams[param];
|
|
136
|
+
}
|
|
129
137
|
}
|
|
130
138
|
|
|
131
139
|
if (plcmt) {
|
|
132
140
|
optionalParams['plcmt'] = plcmt;
|
|
133
141
|
}
|
|
134
142
|
|
|
143
|
+
if (context !== undefined) {
|
|
144
|
+
optionalParams['context'] = context;
|
|
145
|
+
}
|
|
146
|
+
|
|
135
147
|
let videoObj = {
|
|
136
148
|
placement,
|
|
137
149
|
mimes,
|
|
@@ -190,31 +202,102 @@ function buildDevice(bidRequest) {
|
|
|
190
202
|
return device;
|
|
191
203
|
}
|
|
192
204
|
|
|
205
|
+
function _getCoppa(bidderRequest) {
|
|
206
|
+
const coppa = deepAccess(bidderRequest, 'ortb2.regs.coppa');
|
|
207
|
+
|
|
208
|
+
// If coppa is defined in the request, use it
|
|
209
|
+
if (coppa !== undefined) {
|
|
210
|
+
return coppa;
|
|
211
|
+
}
|
|
212
|
+
return config.getConfig('coppa') === true ? 1 : 0;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function _getGppConsent(bidderRequest) {
|
|
216
|
+
let gpp = deepAccess(bidderRequest, 'gppConsent.gppString')
|
|
217
|
+
let gppSid = deepAccess(bidderRequest, 'gppConsent.applicableSections')
|
|
218
|
+
|
|
219
|
+
if (!gpp || !gppSid) {
|
|
220
|
+
gpp = deepAccess(bidderRequest, 'ortb2.regs.gpp', '')
|
|
221
|
+
gppSid = deepAccess(bidderRequest, 'ortb2.regs.gpp_sid', [])
|
|
222
|
+
}
|
|
223
|
+
return { gpp, gppSid }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function _getUspConsent(bidderRequest) {
|
|
227
|
+
return (deepAccess(bidderRequest, 'uspConsent')) ? { uspConsent: bidderRequest.uspConsent } : false;
|
|
228
|
+
}
|
|
229
|
+
|
|
193
230
|
function buildRegs(bidderRequest) {
|
|
231
|
+
let regs = {
|
|
232
|
+
ext: {},
|
|
233
|
+
};
|
|
194
234
|
if (bidderRequest.gdprConsent) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
235
|
+
regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
|
|
236
|
+
regs.ext.gdprConsentString = bidderRequest.gdprConsent.consentString;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
regs.coppa = _getCoppa(bidderRequest);
|
|
240
|
+
|
|
241
|
+
const { gpp, gppSid } = _getGppConsent(bidderRequest);
|
|
242
|
+
|
|
243
|
+
if (gpp) {
|
|
244
|
+
regs.ext.gpp = gpp;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (gppSid) {
|
|
248
|
+
regs.ext.gppSid = gppSid;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const usp = _getUspConsent(bidderRequest);
|
|
252
|
+
|
|
253
|
+
if (usp) {
|
|
254
|
+
regs.ext.us_privacy = usp.uspConsent;
|
|
255
|
+
regs.ext.ccpa = usp.uspConsent
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const dsa = deepAccess(bidderRequest, 'ortb2.regs.ext.dsa');
|
|
259
|
+
if (dsa) {
|
|
260
|
+
regs.ext.dsa = dsa;
|
|
201
261
|
}
|
|
202
262
|
|
|
203
|
-
return
|
|
263
|
+
return regs;
|
|
204
264
|
}
|
|
205
265
|
|
|
206
266
|
function buildUser(bid) {
|
|
207
267
|
const userId = getUserId() || generateUUID();
|
|
208
268
|
const yob = deepAccess(bid, 'params.user.yob')
|
|
209
269
|
const gender = deepAccess(bid, 'params.user.gender')
|
|
270
|
+
const keywords = deepAccess(bid, 'params.user.keywords')
|
|
271
|
+
const data = deepAccess(bid, 'params.user.data')
|
|
272
|
+
const ext = deepAccess(bid, 'params.user.ext')
|
|
210
273
|
|
|
211
274
|
setUserId(userId);
|
|
212
275
|
|
|
213
|
-
|
|
276
|
+
const userData = {
|
|
214
277
|
id: userId,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (yob) {
|
|
281
|
+
userData.yob = yob;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (gender) {
|
|
285
|
+
userData.gender = gender;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (keywords) {
|
|
289
|
+
userData.keywords = keywords;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (data) {
|
|
293
|
+
userData.data = data;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (ext) {
|
|
297
|
+
userData.ext = ext;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return userData
|
|
218
301
|
}
|
|
219
302
|
|
|
220
303
|
function extractSchain(bids, requestId) {
|
|
@@ -283,6 +366,20 @@ function buildRequest(validBidRequests, bidderRequest) {
|
|
|
283
366
|
req.user.ext = { eids };
|
|
284
367
|
}
|
|
285
368
|
|
|
369
|
+
const ortb2SiteData = deepAccess(bidderRequest, 'ortb2.site');
|
|
370
|
+
if (ortb2SiteData) {
|
|
371
|
+
for (const key in ORTB_SITE_FIRST_PARTY_DATA) {
|
|
372
|
+
const value = ortb2SiteData[key];
|
|
373
|
+
if (value && ORTB_SITE_FIRST_PARTY_DATA[key](value)) {
|
|
374
|
+
req.site[key] = value;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (bidderRequest.gdprConsent) {
|
|
380
|
+
deepSetValue(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
|
|
381
|
+
}
|
|
382
|
+
|
|
286
383
|
return req;
|
|
287
384
|
}
|
|
288
385
|
|
|
@@ -326,6 +423,13 @@ function buildBid(bid, bidderRequest) {
|
|
|
326
423
|
bidResponse.vastUrl = 'data:text/xml;charset=utf-8;base64,' + window.btoa(bidResponse.vastXml.replace(/\\"/g, '"'));
|
|
327
424
|
}
|
|
328
425
|
|
|
426
|
+
if (bid.ext && bid.ext.dsa) {
|
|
427
|
+
bidResponse.ext = {
|
|
428
|
+
...bidResponse.ext,
|
|
429
|
+
dsa: bid.ext.dsa,
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
329
433
|
return bidResponse;
|
|
330
434
|
}
|
|
331
435
|
|
|
@@ -453,7 +557,6 @@ function validateVideo(bid) {
|
|
|
453
557
|
if (video[param]) {
|
|
454
558
|
if (!OPTIONAL_VIDEO_PARAMS[param](video[param])) {
|
|
455
559
|
logError(`insticator: video ${param} is invalid or not supported by insticator`);
|
|
456
|
-
return false
|
|
457
560
|
}
|
|
458
561
|
}
|
|
459
562
|
}
|
|
@@ -485,6 +588,13 @@ export const spec = {
|
|
|
485
588
|
let endpointUrl = config.getConfig('insticator.endpointUrl') || ENDPOINT;
|
|
486
589
|
endpointUrl = endpointUrl.replace(/^http:/, 'https:');
|
|
487
590
|
|
|
591
|
+
// Use the first bid request's bid_request_url if it exists ( for updating server url)
|
|
592
|
+
if (validBidRequests.length > 0) {
|
|
593
|
+
if (deepAccess(validBidRequests[0], 'params.bid_endpoint_request_url')) {
|
|
594
|
+
endpointUrl = deepAccess(validBidRequests[0], 'params.bid_endpoint_request_url').replace(/^http:/, 'https:');
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
488
598
|
if (validBidRequests.length > 0) {
|
|
489
599
|
requests.push({
|
|
490
600
|
method: 'POST',
|
|
@@ -3,7 +3,7 @@ import { config } from '../src/config.js';
|
|
|
3
3
|
import { auctionManager } from '../src/auctionManager.js';
|
|
4
4
|
import { INSTREAM } from '../src/video.js';
|
|
5
5
|
import * as events from '../src/events.js';
|
|
6
|
-
import
|
|
6
|
+
import { EVENTS, TARGETING_KEYS, BID_STATUS } from '../src/constants.js'
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
|
|
@@ -11,9 +11,9 @@ import CONSTANTS from '../src/constants.json'
|
|
|
11
11
|
* @typedef {import('../src/adapters/bidderFactory.js').AdUnit} AdUnit
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
const {CACHE_ID, UUID} =
|
|
15
|
-
const {BID_WON, AUCTION_END} =
|
|
16
|
-
const {RENDERED} =
|
|
14
|
+
const { CACHE_ID, UUID } = TARGETING_KEYS;
|
|
15
|
+
const { BID_WON, AUCTION_END } = EVENTS;
|
|
16
|
+
const { RENDERED } = BID_STATUS;
|
|
17
17
|
|
|
18
18
|
const INSTREAM_TRACKING_DEFAULT_CONFIG = {
|
|
19
19
|
enabled: false,
|
|
@@ -6,7 +6,7 @@ import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
|
|
|
6
6
|
import adapterManager from '../src/adapterManager.js';
|
|
7
7
|
|
|
8
8
|
import { generateUUID, logInfo } from '../src/utils.js';
|
|
9
|
-
import
|
|
9
|
+
import { EVENTS } from '../src/constants.js';
|
|
10
10
|
|
|
11
11
|
const DEFAULT_EVENT_URL = 'https://api.pymx5.com/v1/' + 'sites/events';
|
|
12
12
|
const analyticsType = 'endpoint';
|
|
@@ -15,22 +15,20 @@ const ajax = ajaxBuilder(0);
|
|
|
15
15
|
|
|
16
16
|
// Events needed
|
|
17
17
|
const {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
} = CONSTANTS;
|
|
18
|
+
AUCTION_INIT,
|
|
19
|
+
AUCTION_END,
|
|
20
|
+
BID_ADJUSTMENT,
|
|
21
|
+
BID_TIMEOUT,
|
|
22
|
+
BID_REQUESTED,
|
|
23
|
+
BID_RESPONSE,
|
|
24
|
+
NO_BID,
|
|
25
|
+
BID_WON,
|
|
26
|
+
BIDDER_DONE,
|
|
27
|
+
SET_TARGETING,
|
|
28
|
+
REQUEST_BIDS,
|
|
29
|
+
ADD_AD_UNITS,
|
|
30
|
+
AD_RENDER_FAILED,
|
|
31
|
+
} = EVENTS;
|
|
34
32
|
|
|
35
33
|
const _VERSION = 1;
|
|
36
34
|
const _pageViewId = generateUUID();
|
package/modules/ixBidAdapter.js
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
} from '../src/utils.js';
|
|
19
19
|
import { BANNER, VIDEO, NATIVE } from '../src/mediaTypes.js';
|
|
20
20
|
import { config } from '../src/config.js';
|
|
21
|
-
import
|
|
21
|
+
import { EVENTS } from '../src/constants.js';
|
|
22
22
|
import { getStorageManager } from '../src/storageManager.js';
|
|
23
23
|
import * as events from '../src/events.js';
|
|
24
24
|
import { find } from '../src/polyfill.js';
|
|
@@ -1739,8 +1739,8 @@ export const spec = {
|
|
|
1739
1739
|
*/
|
|
1740
1740
|
isBidRequestValid: function (bid) {
|
|
1741
1741
|
if (!hasRegisteredHandler) {
|
|
1742
|
-
events.on(
|
|
1743
|
-
events.on(
|
|
1742
|
+
events.on(EVENTS.AUCTION_DEBUG, localStorageHandler);
|
|
1743
|
+
events.on(EVENTS.AD_RENDER_FAILED, localStorageHandler);
|
|
1744
1744
|
hasRegisteredHandler = true;
|
|
1745
1745
|
}
|
|
1746
1746
|
|
|
@@ -23,10 +23,20 @@ import {getGlobal} from '../src/prebidGlobal.js';
|
|
|
23
23
|
|
|
24
24
|
const SUBMODULE_NAME = 'jwplayer';
|
|
25
25
|
const JWPLAYER_DOMAIN = SUBMODULE_NAME + '.com';
|
|
26
|
-
const
|
|
26
|
+
const ENRICH_ALWAYS = 'always';
|
|
27
|
+
const ENRICH_WHEN_EMPTY = 'whenEmpty';
|
|
28
|
+
const ENRICH_NEVER = 'never';
|
|
29
|
+
const overrideValidationRegex = /^(always|never|whenEmpty)$/;
|
|
30
|
+
const playlistItemCache = {};
|
|
27
31
|
const pendingRequests = {};
|
|
28
32
|
let activeRequestCount = 0;
|
|
29
33
|
let resumeBidRequest;
|
|
34
|
+
// defaults to 'always' for backwards compatibility
|
|
35
|
+
// TODO: Prebid 9 - replace with ENRICH_WHEN_EMPTY
|
|
36
|
+
let overrideContentId = ENRICH_ALWAYS;
|
|
37
|
+
let overrideContentUrl = ENRICH_WHEN_EMPTY;
|
|
38
|
+
let overrideContentTitle = ENRICH_WHEN_EMPTY;
|
|
39
|
+
let overrideContentDescription = ENRICH_WHEN_EMPTY;
|
|
30
40
|
|
|
31
41
|
/** @type {RtdSubmodule} */
|
|
32
42
|
export const jwplayerSubmodule = {
|
|
@@ -38,7 +48,7 @@ export const jwplayerSubmodule = {
|
|
|
38
48
|
/**
|
|
39
49
|
* add targeting data to bids and signal completion to realTimeData module
|
|
40
50
|
* @function
|
|
41
|
-
* @param {
|
|
51
|
+
* @param {object} bidReqConfig
|
|
42
52
|
* @param {function} onDone
|
|
43
53
|
*/
|
|
44
54
|
getBidRequestData: enrichBidRequest,
|
|
@@ -53,6 +63,7 @@ config.getConfig('realTimeData', ({realTimeData}) => {
|
|
|
53
63
|
return;
|
|
54
64
|
}
|
|
55
65
|
fetchTargetingInformation(params);
|
|
66
|
+
setOverrides(params);
|
|
56
67
|
});
|
|
57
68
|
|
|
58
69
|
submodule('realTimeData', jwplayerSubmodule);
|
|
@@ -71,15 +82,32 @@ export function fetchTargetingInformation(jwTargeting) {
|
|
|
71
82
|
});
|
|
72
83
|
}
|
|
73
84
|
|
|
85
|
+
export function setOverrides(params) {
|
|
86
|
+
// For backwards compatibility, default to always unless overridden by Publisher.
|
|
87
|
+
// TODO: Prebid 9 - replace with ENRICH_WHEN_EMPTY
|
|
88
|
+
overrideContentId = sanitizeOverrideParam(params.overrideContentId, ENRICH_ALWAYS);
|
|
89
|
+
overrideContentUrl = sanitizeOverrideParam(params.overrideContentUrl, ENRICH_WHEN_EMPTY);
|
|
90
|
+
overrideContentTitle = sanitizeOverrideParam(params.overrideContentTitle, ENRICH_WHEN_EMPTY);
|
|
91
|
+
overrideContentDescription = sanitizeOverrideParam(params.overrideContentDescription, ENRICH_WHEN_EMPTY);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function sanitizeOverrideParam(overrideParam, defaultValue) {
|
|
95
|
+
if (overrideValidationRegex.test(overrideParam)) {
|
|
96
|
+
return overrideParam;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return defaultValue;
|
|
100
|
+
}
|
|
101
|
+
|
|
74
102
|
export function fetchTargetingForMediaId(mediaId) {
|
|
75
103
|
const ajax = ajaxBuilder();
|
|
76
104
|
// TODO: Avoid checking undefined vs null by setting a callback to pendingRequests.
|
|
77
105
|
pendingRequests[mediaId] = null;
|
|
78
106
|
ajax(`https://cdn.${JWPLAYER_DOMAIN}/v2/media/${mediaId}`, {
|
|
79
107
|
success: function (response) {
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
onRequestCompleted(mediaId, !!
|
|
108
|
+
const item = parsePlaylistItem(response);
|
|
109
|
+
cachePlaylistItem(item, mediaId);
|
|
110
|
+
onRequestCompleted(mediaId, !!item);
|
|
83
111
|
},
|
|
84
112
|
error: function () {
|
|
85
113
|
logError('failed to retrieve targeting information');
|
|
@@ -88,8 +116,8 @@ export function fetchTargetingForMediaId(mediaId) {
|
|
|
88
116
|
});
|
|
89
117
|
}
|
|
90
118
|
|
|
91
|
-
function
|
|
92
|
-
let
|
|
119
|
+
function parsePlaylistItem(response) {
|
|
120
|
+
let item;
|
|
93
121
|
try {
|
|
94
122
|
const data = JSON.parse(response);
|
|
95
123
|
if (!data) {
|
|
@@ -101,16 +129,16 @@ function parseSegment(response) {
|
|
|
101
129
|
throw ('Empty playlist');
|
|
102
130
|
}
|
|
103
131
|
|
|
104
|
-
|
|
132
|
+
item = playlist[0];
|
|
105
133
|
} catch (err) {
|
|
106
134
|
logError(err);
|
|
107
135
|
}
|
|
108
|
-
return
|
|
136
|
+
return item;
|
|
109
137
|
}
|
|
110
138
|
|
|
111
|
-
function
|
|
112
|
-
if (
|
|
113
|
-
|
|
139
|
+
function cachePlaylistItem(playlistItem, mediaId) {
|
|
140
|
+
if (playlistItem && mediaId) {
|
|
141
|
+
playlistItemCache[mediaId] = playlistItem;
|
|
114
142
|
}
|
|
115
143
|
}
|
|
116
144
|
|
|
@@ -167,7 +195,7 @@ export function enrichAdUnits(adUnits, ortb2Fragments = {}) {
|
|
|
167
195
|
const contentData = getContentData(mediaId, contentSegments);
|
|
168
196
|
const targeting = formatTargetingResponse(vat);
|
|
169
197
|
enrichBids(adUnit.bids, targeting, contentId, contentData);
|
|
170
|
-
addOrtbSiteContent(ortb2Fragments.global, contentId, contentData);
|
|
198
|
+
addOrtbSiteContent(ortb2Fragments.global, contentId, contentData, vat.title, vat.description, vat.mediaUrl);
|
|
171
199
|
};
|
|
172
200
|
loadVat(jwTargeting, onVatResponse);
|
|
173
201
|
});
|
|
@@ -217,18 +245,27 @@ function loadVatForPendingRequest(playerDivId, mediaID, callback) {
|
|
|
217
245
|
}
|
|
218
246
|
|
|
219
247
|
export function getVatFromCache(mediaID) {
|
|
220
|
-
const
|
|
248
|
+
const item = playlistItemCache[mediaID];
|
|
221
249
|
|
|
222
|
-
if (!
|
|
250
|
+
if (!item) {
|
|
223
251
|
return null;
|
|
224
252
|
}
|
|
225
253
|
|
|
254
|
+
const mediaUrl = item.file ?? getFileFromSources(item);
|
|
255
|
+
|
|
226
256
|
return {
|
|
227
|
-
segments,
|
|
257
|
+
segments: item.jwpseg,
|
|
258
|
+
title: item.title,
|
|
259
|
+
description: item.description,
|
|
260
|
+
mediaUrl,
|
|
228
261
|
mediaID
|
|
229
262
|
};
|
|
230
263
|
}
|
|
231
264
|
|
|
265
|
+
function getFileFromSources(playlistItem) {
|
|
266
|
+
return playlistItem.sources?.find?.(source => !!source.file)?.file;
|
|
267
|
+
}
|
|
268
|
+
|
|
232
269
|
export function getVatFromPlayer(playerDivId, mediaID) {
|
|
233
270
|
const player = getPlayer(playerDivId);
|
|
234
271
|
if (!player) {
|
|
@@ -241,12 +278,18 @@ export function getVatFromPlayer(playerDivId, mediaID) {
|
|
|
241
278
|
}
|
|
242
279
|
|
|
243
280
|
mediaID = mediaID || item.mediaid;
|
|
281
|
+
const title = item.title;
|
|
282
|
+
const description = item.description;
|
|
283
|
+
const mediaUrl = item.file;
|
|
244
284
|
const segments = item.jwpseg;
|
|
245
|
-
|
|
285
|
+
cachePlaylistItem(item, mediaID)
|
|
246
286
|
|
|
247
287
|
return {
|
|
248
288
|
segments,
|
|
249
|
-
mediaID
|
|
289
|
+
mediaID,
|
|
290
|
+
title,
|
|
291
|
+
mediaUrl,
|
|
292
|
+
description
|
|
250
293
|
};
|
|
251
294
|
}
|
|
252
295
|
|
|
@@ -313,11 +356,7 @@ export function getContentData(mediaId, segments) {
|
|
|
313
356
|
return contentData;
|
|
314
357
|
}
|
|
315
358
|
|
|
316
|
-
export function addOrtbSiteContent(ortb2, contentId, contentData) {
|
|
317
|
-
if (!contentId && !contentData) {
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
|
|
359
|
+
export function addOrtbSiteContent(ortb2, contentId, contentData, contentTitle, contentDescription, contentUrl) {
|
|
321
360
|
if (ortb2 == null) {
|
|
322
361
|
ortb2 = {};
|
|
323
362
|
}
|
|
@@ -325,11 +364,24 @@ export function addOrtbSiteContent(ortb2, contentId, contentData) {
|
|
|
325
364
|
let site = ortb2.site = ortb2.site || {};
|
|
326
365
|
let content = site.content = site.content || {};
|
|
327
366
|
|
|
328
|
-
if (contentId) {
|
|
367
|
+
if (shouldOverride(content.id, contentId, overrideContentId)) {
|
|
329
368
|
content.id = contentId;
|
|
330
369
|
}
|
|
331
370
|
|
|
332
|
-
|
|
371
|
+
if (shouldOverride(content.url, contentUrl, overrideContentUrl)) {
|
|
372
|
+
content.url = contentUrl;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (shouldOverride(content.title, contentTitle, overrideContentTitle)) {
|
|
376
|
+
content.title = contentTitle;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (shouldOverride(content.ext && content.ext.description, contentDescription, overrideContentDescription)) {
|
|
380
|
+
content.ext = content.ext || {};
|
|
381
|
+
content.ext.description = contentDescription;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const currentData = content.data || [];
|
|
333
385
|
// remove old jwplayer data
|
|
334
386
|
const data = currentData.filter(datum => datum.name !== JWPLAYER_DOMAIN);
|
|
335
387
|
|
|
@@ -337,11 +389,26 @@ export function addOrtbSiteContent(ortb2, contentId, contentData) {
|
|
|
337
389
|
data.push(contentData);
|
|
338
390
|
}
|
|
339
391
|
|
|
340
|
-
|
|
392
|
+
if (data.length) {
|
|
393
|
+
content.data = data;
|
|
394
|
+
}
|
|
341
395
|
|
|
342
396
|
return ortb2;
|
|
343
397
|
}
|
|
344
398
|
|
|
399
|
+
function shouldOverride(currentValue, newValue, configValue) {
|
|
400
|
+
switch (configValue) {
|
|
401
|
+
case ENRICH_ALWAYS:
|
|
402
|
+
return !!newValue;
|
|
403
|
+
case ENRICH_NEVER:
|
|
404
|
+
return false;
|
|
405
|
+
case ENRICH_WHEN_EMPTY:
|
|
406
|
+
return !!newValue && currentValue === undefined;
|
|
407
|
+
default:
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
345
412
|
function enrichBids(bids, targeting, contentId, contentData) {
|
|
346
413
|
if (!bids) {
|
|
347
414
|
return;
|
|
@@ -78,6 +78,19 @@ realTimeData = {
|
|
|
78
78
|
};
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
## Configuration syntax
|
|
82
|
+
|
|
83
|
+
| Name |Type | Description | Notes |
|
|
84
|
+
| :------------ | :------------ | :------------ |:------------ |
|
|
85
|
+
| name | String | Real time data module name | Always 'jwplayer' |
|
|
86
|
+
| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
|
|
87
|
+
| params | Object | | |
|
|
88
|
+
| params.mediaIDs | Array of Strings | Media Ids for prefetching | Optional |
|
|
89
|
+
| params.overrideContentId | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.id | Defaults to 'always' |
|
|
90
|
+
| params.overrideContentUrl | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.url | Defaults to 'whenEmpty' |
|
|
91
|
+
| params.overrideContentTitle | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.title | Defaults to 'whenEmpty' |
|
|
92
|
+
| params.overrideContentDescription | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.ext.description | Defaults to 'whenEmpty' |
|
|
93
|
+
|
|
81
94
|
# Usage for Bid Adapters:
|
|
82
95
|
|
|
83
96
|
Implement the `buildRequests` function. When it is called, the `bidRequests` param will be an array of bids.
|
|
@@ -94,6 +107,8 @@ Example:
|
|
|
94
107
|
site: {
|
|
95
108
|
content: {
|
|
96
109
|
id: 'jw_abc123',
|
|
110
|
+
title: 'media title',
|
|
111
|
+
url: 'https:www.cdn.com/media.mp4',
|
|
97
112
|
data: [{
|
|
98
113
|
name: 'jwplayer.com',
|
|
99
114
|
ext: {
|
|
@@ -105,7 +120,10 @@ Example:
|
|
|
105
120
|
}, {
|
|
106
121
|
id: '456'
|
|
107
122
|
}]
|
|
108
|
-
}]
|
|
123
|
+
}],
|
|
124
|
+
ext: {
|
|
125
|
+
description: 'media description'
|
|
126
|
+
}
|
|
109
127
|
}
|
|
110
128
|
}
|
|
111
129
|
}
|
|
@@ -116,7 +134,10 @@ where:
|
|
|
116
134
|
- `ortb2` is an object containing first party data
|
|
117
135
|
- `site` is an object containing page specific information
|
|
118
136
|
- `content` is an object containing metadata for the media. It may contain the following information:
|
|
119
|
-
- `id` is a unique identifier for the specific media asset
|
|
137
|
+
- `id` is a unique identifier for the specific media asset,
|
|
138
|
+
- `title` is the title of the media content
|
|
139
|
+
- `url` is the url of the media asset
|
|
140
|
+
- `ext.description` is the description of the media content
|
|
120
141
|
- `data` is an array containing segment taxonomy objects that have the following parameters:
|
|
121
142
|
- `name` is the `jwplayer.com` string indicating the provider name
|
|
122
143
|
- `ext.segtax` whose `502` value is the unique identifier for JW Player's proprietary taxonomy
|
|
@@ -2,7 +2,7 @@ import { logError } from '../src/utils.js';
|
|
|
2
2
|
import { ajax } from '../src/ajax.js';
|
|
3
3
|
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
|
|
4
4
|
import adapterManager from '../src/adapterManager.js';
|
|
5
|
-
import
|
|
5
|
+
import { EVENTS } from '../src/constants.js';
|
|
6
6
|
|
|
7
7
|
const EVENT_URL = 'https://krk.kargo.com/api/v1/event';
|
|
8
8
|
const KARGO_BIDDER_CODE = 'kargo';
|
|
@@ -23,11 +23,11 @@ var kargoAnalyticsAdapter = Object.assign(
|
|
|
23
23
|
adapter({ analyticsType }), {
|
|
24
24
|
track({ eventType, args }) {
|
|
25
25
|
switch (eventType) {
|
|
26
|
-
case
|
|
26
|
+
case EVENTS.AUCTION_INIT: {
|
|
27
27
|
_logBidResponseData.auctionTimeout = args.timeout;
|
|
28
28
|
break;
|
|
29
29
|
}
|
|
30
|
-
case
|
|
30
|
+
case EVENTS.BID_RESPONSE: {
|
|
31
31
|
handleBidResponseData(args);
|
|
32
32
|
break;
|
|
33
33
|
}
|