prebid.js 8.4.0 → 8.6.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/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/a1MediaRtdProvider.js +1 -0
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adfBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/admixerIdSystem.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adqueryIdSystem.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adsinteractiveBidAdapter.js +1 -1
- package/dist/adtelligentIdSystem.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beachfrontBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/britepoolIdSystem.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagementGpp.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/criteoBidAdapter.js +1 -1
- package/dist/criteoIdSystem.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/czechAdIdSystem.js +1 -1
- package/dist/dacIdSystem.js +1 -1
- package/dist/deepintentDpesIdSystem.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/dmdIdSystem.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/fabrickIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/geolocationRtdProvider.js +1 -0
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gravitoIdSystem.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/growthCodeIdSystem.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronIdSystem.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/identityLinkIdSystem.js +1 -1
- package/dist/idxIdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/imuIdSystem.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/invibesBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justIdSystem.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kinessoIdSystem.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/merkleIdSystem.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/mspa.js +1 -1
- package/dist/mwOpenLinkIdSystem.js +1 -1
- package/dist/naveggIdSystem.js +1 -1
- package/dist/netIdSystem.js +1 -1
- package/dist/newspassidBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +186 -181
- package/dist/novatiqIdSystem.js +1 -1
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/oneKeyIdSystem.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/ozoneBidAdapter.js +1 -1
- package/dist/pairIdSystem.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/pubCircleBidAdapter.js +1 -0
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/quantcastIdSystem.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevadRtdProvider.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/silverpushBidAdapter.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/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/ssmasBidAdapter.js +1 -0
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/tapadIdSystem.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/tncIdSystem.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/unifiedIdSystem.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/utiqSystem.js +1 -1
- package/dist/verizonMediaIdSystem.js +1 -1
- package/dist/viantOrtbBidAdapter.js +1 -0
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/videojsVideoProvider.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vrtcalBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/zeotapIdPlusIdSystem.js +1 -1
- package/integrationExamples/gpt/adUnitFloors.html +0 -1
- package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
- package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +1 -1
- package/integrationExamples/videoModule/jwplayer/bidsBackHandlerOverride.html +137 -0
- package/integrationExamples/videoModule/jwplayer/eventListeners.html +1 -1
- package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
- package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
- package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
- package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
- package/integrationExamples/videoModule/videojs/bidsBackHandlerOverride.html +164 -0
- package/libraries/mspa/activityControls.js +51 -32
- package/modules/.submodules.json +1 -0
- package/modules/33acrossIdSystem.js +9 -0
- package/modules/a1MediaRtdProvider.js +92 -0
- package/modules/a1MediaRtdProvider.md +46 -0
- package/modules/adfBidAdapter.js +4 -1
- package/modules/adgenerationBidAdapter.js +3 -3
- package/modules/adkernelAdnBidAdapter.js +1 -1
- package/modules/adkernelBidAdapter.js +10 -3
- package/modules/admixerIdSystem.js +6 -0
- package/modules/adnuntiusBidAdapter.js +5 -13
- package/modules/adqueryIdSystem.js +6 -0
- package/modules/adsinteractiveBidAdapter.js +2 -2
- package/modules/adtelligentIdSystem.js +6 -0
- package/modules/adyoulikeBidAdapter.js +6 -3
- package/modules/amxIdSystem.js +6 -0
- package/modules/appnexusBidAdapter.js +1 -1
- package/modules/beachfrontBidAdapter.js +32 -6
- package/modules/britepoolIdSystem.js +6 -0
- package/modules/connectIdSystem.js +6 -0
- package/modules/consentManagementGpp.js +10 -1
- package/modules/consumableBidAdapter.js +9 -1
- package/modules/criteoBidAdapter.js +18 -0
- package/modules/criteoIdSystem.js +6 -0
- package/modules/cwireBidAdapter.js +19 -0
- package/modules/czechAdIdSystem.js +6 -0
- package/modules/dacIdSystem.js +6 -0
- package/modules/deepintentDpesIdSystem.js +7 -2
- package/modules/dmdIdSystem.js +6 -0
- package/modules/euidIdSystem.js +9 -0
- package/modules/fabrickIdSystem.js +6 -0
- package/modules/ftrackIdSystem.js +16 -0
- package/modules/geolocationRtdProvider.js +65 -0
- package/modules/gravitoIdSystem.js +6 -0
- package/modules/greenbidsRtdProvider.js +1 -1
- package/modules/growthCodeAnalyticsAdapter.js +7 -2
- package/modules/growthCodeIdSystem.js +20 -1
- package/modules/hadronIdSystem.js +6 -0
- package/modules/id5IdSystem.js +34 -8
- package/modules/identityLinkIdSystem.js +6 -0
- package/modules/idxIdSystem.js +6 -0
- package/modules/imdsBidAdapter.js +38 -14
- package/modules/imuIdSystem.js +10 -0
- package/modules/intentIqIdSystem.js +6 -0
- package/modules/invibesBidAdapter.js +5 -5
- package/modules/ixBidAdapter.js +16 -0
- package/modules/justIdSystem.js +6 -0
- package/modules/kinessoIdSystem.js +7 -2
- package/modules/liveIntentIdSystem.js +53 -0
- package/modules/lotamePanoramaIdSystem.js +6 -0
- package/modules/merkleIdSystem.js +24 -0
- package/modules/mwOpenLinkIdSystem.js +6 -0
- package/modules/naveggIdSystem.js +6 -0
- package/modules/netIdSystem.js +6 -0
- package/modules/newspassid.md +76 -0
- package/modules/newspassidBidAdapter.js +44 -18
- package/modules/novatiqIdSystem.js +12 -0
- package/modules/oneKeyIdSystem.js +26 -0
- package/modules/ozoneBidAdapter.js +65 -18
- package/modules/ozoneBidAdapter.md +3 -1
- package/modules/pairIdSystem.js +6 -0
- package/modules/parrableIdSystem.js +38 -2
- package/modules/pubCircleBidAdapter.js +231 -0
- package/modules/pubCircleBidAdapter.md +79 -0
- package/modules/publinkIdSystem.js +7 -1
- package/modules/quantcastIdSystem.js +6 -0
- package/modules/relevadRtdProvider.js +6 -7
- package/modules/rubiconBidAdapter.js +9 -0
- package/modules/sharedIdSystem.js +6 -0
- package/modules/silverpushBidAdapter.js +2 -2
- package/modules/ssmasBidAdapter.js +126 -0
- package/modules/ssmasBidAdapter.md +35 -0
- package/modules/sspBCBidAdapter.js +36 -13
- package/modules/tapadIdSystem.js +6 -0
- package/modules/tappxBidAdapter.js +10 -1
- package/modules/tappxBidAdapter.md +17 -0
- package/modules/tncIdSystem.js +6 -0
- package/modules/topicsFpdModule.js +21 -48
- package/modules/tripleliftBidAdapter.js +5 -0
- package/modules/uid2IdSystem.js +14 -0
- package/modules/unifiedIdSystem.js +11 -0
- package/modules/userId/eids.js +6 -445
- package/modules/userId/index.js +36 -24
- package/modules/utiqSystem.js +9 -0
- package/modules/verizonMediaIdSystem.js +6 -0
- package/modules/viantOrtbBidAdapter.js +113 -0
- package/modules/viantOrtbBidAdapter.md +54 -0
- package/modules/vidazooBidAdapter.js +9 -2
- package/modules/videojsVideoProvider.js +9 -2
- package/modules/vrtcalBidAdapter.js +10 -6
- package/modules/zeotapIdPlusIdSystem.js +6 -0
- package/package.json +1 -1
- package/src/adapters/bidderFactory.js +15 -6
- package/src/adloader.js +2 -1
- package/test/spec/libraries/mspa/activityControls_spec.js +145 -212
- package/test/spec/modules/a1MediaRtdProvider_spec.js +105 -0
- package/test/spec/modules/adfBidAdapter_spec.js +47 -0
- package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
- package/test/spec/modules/adkernelAdnBidAdapter_spec.js +1 -2
- package/test/spec/modules/adkernelBidAdapter_spec.js +7 -2
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +116 -64
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +13 -24
- package/test/spec/modules/appnexusBidAdapter_spec.js +12 -1
- package/test/spec/modules/beachfrontBidAdapter_spec.js +35 -2
- package/test/spec/modules/consentManagementGpp_spec.js +16 -0
- package/test/spec/modules/consumableBidAdapter_spec.js +15 -0
- package/test/spec/modules/criteoBidAdapter_spec.js +31 -3
- package/test/spec/modules/cwireBidAdapter_spec.js +47 -0
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -5
- package/test/spec/modules/geolocationRtdProvider_spec.js +119 -0
- package/test/spec/modules/greenbidsRtdProvider_spec.js +1 -1
- package/test/spec/modules/id5IdSystem_spec.js +18 -0
- package/test/spec/modules/imdsBidAdapter_spec.js +98 -17
- package/test/spec/modules/invibesBidAdapter_spec.js +123 -32
- package/test/spec/modules/ixBidAdapter_spec.js +23 -5
- package/test/spec/modules/medianetBidAdapter_spec.js +117 -0
- package/test/spec/modules/newspassidBidAdapter_spec.js +6 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +3 -5
- package/test/spec/modules/ozoneBidAdapter_spec.js +27 -1
- package/test/spec/modules/prebidServerBidAdapter_spec.js +2 -20
- package/test/spec/modules/priceFloors_spec.js +14 -0
- package/test/spec/modules/pubCircleBidAdapter_spec.js +399 -0
- package/test/spec/modules/pubmaticBidAdapter_spec.js +6 -373
- package/test/spec/modules/rubiconBidAdapter_spec.js +220 -9
- package/test/spec/modules/smaatoBidAdapter_spec.js +4 -6
- package/test/spec/modules/ssmasBidAdapter_spec.js +244 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +18 -19
- package/test/spec/modules/topicsFpdModule_spec.js +343 -365
- package/test/spec/modules/tripleliftBidAdapter_spec.js +40 -0
- package/test/spec/modules/userId_spec.js +116 -7
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +432 -0
- package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -4
- package/test/spec/modules/xeBidAdapter_spec.js +366 -368
- package/test/spec/modules/yahoosspBidAdapter_spec.js +5 -18
- package/test/spec/unit/core/bidderFactory_spec.js +61 -14
- package/integrationExamples/gpt/pbjs_video_adUnit.html +0 -109
|
@@ -7,7 +7,8 @@ import {
|
|
|
7
7
|
isArray,
|
|
8
8
|
contains,
|
|
9
9
|
mergeDeep,
|
|
10
|
-
parseUrl
|
|
10
|
+
parseUrl,
|
|
11
|
+
generateUUID
|
|
11
12
|
} from '../src/utils.js';
|
|
12
13
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
13
14
|
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
|
|
@@ -16,12 +17,12 @@ import {getPriceBucketString} from '../src/cpmBucketManager.js';
|
|
|
16
17
|
import { Renderer } from '../src/Renderer.js';
|
|
17
18
|
import {getRefererInfo} from '../src/refererDetection.js';
|
|
18
19
|
const BIDDER_CODE = 'ozone';
|
|
19
|
-
const ORIGIN = 'https://elb.the-ozone-project.com'
|
|
20
|
+
const ORIGIN = 'https://elb.the-ozone-project.com' // applies only to auction & cookie
|
|
20
21
|
const AUCTIONURI = '/openrtb2/auction';
|
|
21
22
|
const OZONECOOKIESYNC = '/static/load-cookie.html';
|
|
22
23
|
const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js';
|
|
23
24
|
const ORIGIN_DEV = 'https://test.ozpr.net';
|
|
24
|
-
const OZONEVERSION = '2.
|
|
25
|
+
const OZONEVERSION = '2.9.0';
|
|
25
26
|
export const spec = {
|
|
26
27
|
gvlid: 524,
|
|
27
28
|
aliases: [{code: 'lmc', gvlid: 524}],
|
|
@@ -36,7 +37,8 @@ export const spec = {
|
|
|
36
37
|
'keyPrefix': 'oz',
|
|
37
38
|
'auctionUrl': ORIGIN + AUCTIONURI,
|
|
38
39
|
'cookieSyncUrl': ORIGIN + OZONECOOKIESYNC,
|
|
39
|
-
'rendererUrl': OZONE_RENDERER_URL
|
|
40
|
+
'rendererUrl': OZONE_RENDERER_URL,
|
|
41
|
+
'batchRequests': false /* you can change this to true OR override it in the config: config.ozone.batchRequests */
|
|
40
42
|
},
|
|
41
43
|
loadWhitelabelData(bid) {
|
|
42
44
|
if (this.propertyBag.whitelabel) { return; }
|
|
@@ -73,6 +75,9 @@ export const spec = {
|
|
|
73
75
|
this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.auctionUrl;
|
|
74
76
|
}
|
|
75
77
|
}
|
|
78
|
+
if (bidderConfig.hasOwnProperty('batchRequests')) {
|
|
79
|
+
this.propertyBag.whitelabel.batchRequests = bidderConfig.batchRequests;
|
|
80
|
+
}
|
|
76
81
|
try {
|
|
77
82
|
if (arr.hasOwnProperty('auction') && arr.auction === 'dev') {
|
|
78
83
|
logInfo('GET: auction=dev');
|
|
@@ -94,11 +99,14 @@ export const spec = {
|
|
|
94
99
|
getRendererUrl() {
|
|
95
100
|
return this.propertyBag.whitelabel.rendererUrl;
|
|
96
101
|
},
|
|
102
|
+
isBatchRequests() {
|
|
103
|
+
return this.propertyBag.whitelabel.batchRequests;
|
|
104
|
+
},
|
|
97
105
|
isBidRequestValid(bid) {
|
|
98
106
|
this.loadWhitelabelData(bid);
|
|
99
107
|
logInfo('isBidRequestValid : ', config.getConfig(), bid);
|
|
100
108
|
let adUnitCode = bid.adUnitCode; // adunit[n].code
|
|
101
|
-
let err1 = 'VALIDATION FAILED : missing {param} : siteId, placementId and publisherId are REQUIRED'
|
|
109
|
+
let err1 = 'VALIDATION FAILED : missing {param} : siteId, placementId and publisherId are REQUIRED'
|
|
102
110
|
if (!(bid.params.hasOwnProperty('placementId'))) {
|
|
103
111
|
logError(err1.replace('{param}', 'placementId'), adUnitCode);
|
|
104
112
|
return false;
|
|
@@ -199,7 +207,7 @@ export const spec = {
|
|
|
199
207
|
let placementId = placementIdOverrideFromGetParam || this.getPlacementId(ozoneBidRequest); // prefer to use a valid override param, else the bidRequest placement Id
|
|
200
208
|
obj.id = ozoneBidRequest.bidId; // this causes an error if we change it to something else, even if you update the bidRequest object: "WARNING: Bidder ozone made bid for unknown request ID: mb7953.859498327448. Ignoring."
|
|
201
209
|
obj.tagid = placementId;
|
|
202
|
-
let parsed = parseUrl(getRefererInfo().page);
|
|
210
|
+
let parsed = parseUrl(this.getRefererInfo().page);
|
|
203
211
|
obj.secure = parsed.protocol === 'https' ? 1 : 0;
|
|
204
212
|
let arrBannerSizes = [];
|
|
205
213
|
if (!ozoneBidRequest.hasOwnProperty('mediaTypes')) {
|
|
@@ -262,9 +270,7 @@ export const spec = {
|
|
|
262
270
|
obj.placementId = placementId;
|
|
263
271
|
deepSetValue(obj, 'ext.prebid', {'storedrequest': {'id': placementId}});
|
|
264
272
|
obj.ext[whitelabelBidder] = {};
|
|
265
|
-
// TODO: fix auctionId/transactionID leak: https://github.com/prebid/Prebid.js/issues/9781
|
|
266
273
|
obj.ext[whitelabelBidder].adUnitCode = ozoneBidRequest.adUnitCode; // eg. 'mpu'
|
|
267
|
-
obj.ext[whitelabelBidder].transactionId = ozoneBidRequest.transactionId; // this is the transactionId PER adUnit, common across bidders for this unit
|
|
268
274
|
if (ozoneBidRequest.params.hasOwnProperty('customData')) {
|
|
269
275
|
obj.ext[whitelabelBidder].customData = ozoneBidRequest.params.customData;
|
|
270
276
|
}
|
|
@@ -291,6 +297,10 @@ export const spec = {
|
|
|
291
297
|
if (!schain && deepAccess(ozoneBidRequest, 'schain')) {
|
|
292
298
|
schain = ozoneBidRequest.schain;
|
|
293
299
|
}
|
|
300
|
+
let gpid = deepAccess(ozoneBidRequest, 'ortb2Imp.ext.gpid');
|
|
301
|
+
if (gpid) {
|
|
302
|
+
deepSetValue(obj, 'ext.gpid', gpid);
|
|
303
|
+
}
|
|
294
304
|
return obj;
|
|
295
305
|
});
|
|
296
306
|
let extObj = {};
|
|
@@ -326,7 +336,7 @@ export const spec = {
|
|
|
326
336
|
let userExtEids = deepAccess(validBidRequests, '0.userIdAsEids', []); // generate the UserIDs in the correct format for UserId module
|
|
327
337
|
ozoneRequest.site = {
|
|
328
338
|
'publisher': {'id': htmlParams.publisherId},
|
|
329
|
-
'page': getRefererInfo().page,
|
|
339
|
+
'page': this.getRefererInfo().page,
|
|
330
340
|
'id': htmlParams.siteId
|
|
331
341
|
};
|
|
332
342
|
ozoneRequest.test = config.getConfig('debug') ? 1 : 0;
|
|
@@ -355,13 +365,33 @@ export const spec = {
|
|
|
355
365
|
if (config.getConfig('coppa') === true) {
|
|
356
366
|
deepSetValue(ozoneRequest, 'regs.coppa', 1);
|
|
357
367
|
}
|
|
368
|
+
let ozUuid = generateUUID();
|
|
369
|
+
if (this.isBatchRequests()) {
|
|
370
|
+
logInfo('going to batch the requests');
|
|
371
|
+
let arrRet = []; // return an array of objects containing data describing max 10 bids
|
|
372
|
+
for (let i = 0; i < tosendtags.length; i += 10) {
|
|
373
|
+
ozoneRequest.id = ozUuid; // Unique ID of the bid request, provided by the exchange. (REQUIRED)
|
|
374
|
+
ozoneRequest.imp = tosendtags.slice(i, i + 10);
|
|
375
|
+
ozoneRequest.ext = extObj;
|
|
376
|
+
deepSetValue(ozoneRequest, 'user.ext.eids', userExtEids);
|
|
377
|
+
if (ozoneRequest.imp.length > 0) {
|
|
378
|
+
arrRet.push({
|
|
379
|
+
method: 'POST',
|
|
380
|
+
url: this.getAuctionUrl(),
|
|
381
|
+
data: JSON.stringify(ozoneRequest),
|
|
382
|
+
bidderRequest: bidderRequest
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
logInfo('batch request going to return : ', arrRet);
|
|
387
|
+
return arrRet;
|
|
388
|
+
}
|
|
389
|
+
logInfo('requests will not be batched.');
|
|
358
390
|
if (singleRequest) {
|
|
359
391
|
logInfo('buildRequests starting to generate response for a single request');
|
|
360
|
-
ozoneRequest.id =
|
|
361
|
-
ozoneRequest.auctionId = bidderRequest.auctionId; // not sure if this should be here?
|
|
392
|
+
ozoneRequest.id = ozUuid; // Unique ID of the bid request, provided by the exchange. (REQUIRED)
|
|
362
393
|
ozoneRequest.imp = tosendtags;
|
|
363
394
|
ozoneRequest.ext = extObj;
|
|
364
|
-
deepSetValue(ozoneRequest, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
|
|
365
395
|
deepSetValue(ozoneRequest, 'user.ext.eids', userExtEids);
|
|
366
396
|
var ret = {
|
|
367
397
|
method: 'POST',
|
|
@@ -377,12 +407,9 @@ export const spec = {
|
|
|
377
407
|
let arrRet = tosendtags.map(imp => {
|
|
378
408
|
logInfo('buildRequests starting to generate non-single response, working on imp : ', imp);
|
|
379
409
|
let ozoneRequestSingle = Object.assign({}, ozoneRequest);
|
|
380
|
-
|
|
381
|
-
ozoneRequestSingle.id = imp.ext[whitelabelBidder].transactionId; // Unique ID of the bid request, provided by the exchange.
|
|
382
|
-
ozoneRequestSingle.auctionId = imp.ext[whitelabelBidder].transactionId; // not sure if this should be here?
|
|
410
|
+
ozoneRequestSingle.id = generateUUID(); // Unique ID of the bid request, provided by the exchange. (REQUIRED)
|
|
383
411
|
ozoneRequestSingle.imp = [imp];
|
|
384
412
|
ozoneRequestSingle.ext = extObj;
|
|
385
|
-
deepSetValue(ozoneRequestSingle, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
|
|
386
413
|
deepSetValue(ozoneRequestSingle, 'user.ext.eids', userExtEids);
|
|
387
414
|
logInfo('buildRequests RequestSingle (for non-single) = ', ozoneRequestSingle);
|
|
388
415
|
return {
|
|
@@ -424,6 +451,7 @@ export const spec = {
|
|
|
424
451
|
logInfo(`interpretResponse time: ${startTime} . Time between buildRequests done and interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
|
|
425
452
|
logInfo(`serverResponse, request`, JSON.parse(JSON.stringify(serverResponse)), JSON.parse(JSON.stringify(request)));
|
|
426
453
|
serverResponse = serverResponse.body || {};
|
|
454
|
+
let aucId = serverResponse.id; // this will be correct for single requests and non-single
|
|
427
455
|
if (!serverResponse.hasOwnProperty('seatbid')) {
|
|
428
456
|
return [];
|
|
429
457
|
}
|
|
@@ -518,7 +546,7 @@ export const spec = {
|
|
|
518
546
|
}
|
|
519
547
|
}
|
|
520
548
|
let {seat: winningSeat, bid: winningBid} = ozoneGetWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid);
|
|
521
|
-
adserverTargeting[whitelabelPrefix + '_auc_id'] = String(request.bidderRequest.auctionId
|
|
549
|
+
adserverTargeting[whitelabelPrefix + '_auc_id'] = String(aucId); // was request.bidderRequest.auctionId
|
|
522
550
|
adserverTargeting[whitelabelPrefix + '_winner'] = String(winningSeat);
|
|
523
551
|
adserverTargeting[whitelabelPrefix + '_bid'] = 'true';
|
|
524
552
|
adserverTargeting[whitelabelPrefix + '_cache_id'] = deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_id', 'no-id');
|
|
@@ -686,10 +714,29 @@ export const spec = {
|
|
|
686
714
|
return null;
|
|
687
715
|
},
|
|
688
716
|
getGetParametersAsObject() {
|
|
689
|
-
let parsed = parseUrl(getRefererInfo().
|
|
717
|
+
let parsed = parseUrl(this.getRefererInfo().location);
|
|
690
718
|
logInfo('getGetParametersAsObject found:', parsed.search);
|
|
691
719
|
return parsed.search;
|
|
692
720
|
},
|
|
721
|
+
getRefererInfo() {
|
|
722
|
+
if (getRefererInfo().hasOwnProperty('location')) {
|
|
723
|
+
logInfo('FOUND location on getRefererInfo OK (prebid >= 7); will use getRefererInfo for location & page');
|
|
724
|
+
return getRefererInfo();
|
|
725
|
+
} else {
|
|
726
|
+
logInfo('DID NOT FIND location on getRefererInfo (prebid < 7); will use legacy code that ALWAYS worked reliably to get location & page ;-)');
|
|
727
|
+
try {
|
|
728
|
+
return {
|
|
729
|
+
page: top.location.href,
|
|
730
|
+
location: top.location.href
|
|
731
|
+
};
|
|
732
|
+
} catch (e) {
|
|
733
|
+
return {
|
|
734
|
+
page: window.location.href,
|
|
735
|
+
location: window.location.href
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
},
|
|
693
740
|
blockTheRequest() {
|
|
694
741
|
let ozRequest = this.getWhitelabelConfigItem('ozone.oz_request');
|
|
695
742
|
if (typeof ozRequest == 'boolean' && !ozRequest) {
|
package/modules/pairIdSystem.js
CHANGED
|
@@ -7,7 +7,17 @@
|
|
|
7
7
|
|
|
8
8
|
// ci trigger: 1
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
contains,
|
|
12
|
+
deepClone,
|
|
13
|
+
inIframe,
|
|
14
|
+
isEmpty,
|
|
15
|
+
isPlainObject,
|
|
16
|
+
logError,
|
|
17
|
+
logWarn,
|
|
18
|
+
pick,
|
|
19
|
+
timestamp
|
|
20
|
+
} from '../src/utils.js';
|
|
11
21
|
import {find} from '../src/polyfill.js';
|
|
12
22
|
import {ajax} from '../src/ajax.js';
|
|
13
23
|
import {submodule} from '../src/hook.js';
|
|
@@ -368,7 +378,33 @@ export const parrableIdSubmodule = {
|
|
|
368
378
|
getId(config, gdprConsentData, currentStoredId) {
|
|
369
379
|
const configParams = (config && config.params) || {};
|
|
370
380
|
return fetchId(configParams, gdprConsentData);
|
|
371
|
-
}
|
|
381
|
+
},
|
|
382
|
+
eids: {
|
|
383
|
+
'parrableId': {
|
|
384
|
+
source: 'parrable.com',
|
|
385
|
+
atype: 1,
|
|
386
|
+
getValue: function(parrableId) {
|
|
387
|
+
if (parrableId.eid) {
|
|
388
|
+
return parrableId.eid;
|
|
389
|
+
}
|
|
390
|
+
if (parrableId.ccpaOptout) {
|
|
391
|
+
// If the EID was suppressed due to a non consenting ccpa optout then
|
|
392
|
+
// we still wish to provide this as a reason to the adapters
|
|
393
|
+
return '';
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
},
|
|
397
|
+
getUidExt: function(parrableId) {
|
|
398
|
+
const extendedData = pick(parrableId, [
|
|
399
|
+
'ibaOptout',
|
|
400
|
+
'ccpaOptout'
|
|
401
|
+
]);
|
|
402
|
+
if (Object.keys(extendedData).length) {
|
|
403
|
+
return extendedData;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
},
|
|
372
408
|
};
|
|
373
409
|
|
|
374
410
|
submodule('userId', parrableIdSubmodule);
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { isFn, deepAccess, logMessage, logError } from '../src/utils.js';
|
|
2
|
+
import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
|
|
3
|
+
|
|
4
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
5
|
+
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
|
|
6
|
+
import { config } from '../src/config.js';
|
|
7
|
+
|
|
8
|
+
const BIDDER_CODE = 'pubcircle';
|
|
9
|
+
const AD_URL = 'https://ml.pubcircle.ai/pbjs';
|
|
10
|
+
const SYNC_URL = 'https://cs.pubcircle.ai';
|
|
11
|
+
|
|
12
|
+
function isBidResponseValid(bid) {
|
|
13
|
+
if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
switch (bid.mediaType) {
|
|
18
|
+
case BANNER:
|
|
19
|
+
return Boolean(bid.width && bid.height && bid.ad);
|
|
20
|
+
case VIDEO:
|
|
21
|
+
return Boolean(bid.vastUrl || bid.vastXml);
|
|
22
|
+
case NATIVE:
|
|
23
|
+
return Boolean(bid.native && bid.native.impressionTrackers && bid.native.impressionTrackers.length);
|
|
24
|
+
default:
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getPlacementReqData(bid) {
|
|
30
|
+
const { params, bidId, mediaTypes } = bid;
|
|
31
|
+
const schain = bid.schain || {};
|
|
32
|
+
const { placementId } = params;
|
|
33
|
+
const bidfloor = getBidFloor(bid);
|
|
34
|
+
|
|
35
|
+
const placement = {
|
|
36
|
+
bidId,
|
|
37
|
+
schain,
|
|
38
|
+
bidfloor
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
placement.placementId = placementId;
|
|
42
|
+
placement.type = 'publisher';
|
|
43
|
+
|
|
44
|
+
if (bid.userId) {
|
|
45
|
+
getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com');
|
|
46
|
+
getUserId(placement.eids, bid.userId.lotamePanoramaId, 'lotame.com');
|
|
47
|
+
getUserId(placement.eids, bid.userId.idx, 'idx.lat');
|
|
48
|
+
getUserId(placement.eids, bid.userId.idl_env, 'liveramp.com');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (mediaTypes && mediaTypes[BANNER]) {
|
|
52
|
+
placement.adFormat = BANNER;
|
|
53
|
+
placement.sizes = mediaTypes[BANNER].sizes;
|
|
54
|
+
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
55
|
+
placement.adFormat = VIDEO;
|
|
56
|
+
placement.playerSize = mediaTypes[VIDEO].playerSize;
|
|
57
|
+
placement.minduration = mediaTypes[VIDEO].minduration;
|
|
58
|
+
placement.maxduration = mediaTypes[VIDEO].maxduration;
|
|
59
|
+
placement.mimes = mediaTypes[VIDEO].mimes;
|
|
60
|
+
placement.protocols = mediaTypes[VIDEO].protocols;
|
|
61
|
+
placement.startdelay = mediaTypes[VIDEO].startdelay;
|
|
62
|
+
placement.placement = mediaTypes[VIDEO].placement;
|
|
63
|
+
placement.skip = mediaTypes[VIDEO].skip;
|
|
64
|
+
placement.skipafter = mediaTypes[VIDEO].skipafter;
|
|
65
|
+
placement.minbitrate = mediaTypes[VIDEO].minbitrate;
|
|
66
|
+
placement.maxbitrate = mediaTypes[VIDEO].maxbitrate;
|
|
67
|
+
placement.delivery = mediaTypes[VIDEO].delivery;
|
|
68
|
+
placement.playbackmethod = mediaTypes[VIDEO].playbackmethod;
|
|
69
|
+
placement.api = mediaTypes[VIDEO].api;
|
|
70
|
+
placement.linearity = mediaTypes[VIDEO].linearity;
|
|
71
|
+
} else if (mediaTypes && mediaTypes[NATIVE]) {
|
|
72
|
+
placement.native = mediaTypes[NATIVE];
|
|
73
|
+
placement.adFormat = NATIVE;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return placement;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function getBidFloor(bid) {
|
|
80
|
+
if (!isFn(bid.getFloor)) {
|
|
81
|
+
return deepAccess(bid, 'params.bidfloor', 0);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const bidFloor = bid.getFloor({
|
|
86
|
+
currency: 'USD',
|
|
87
|
+
mediaType: '*',
|
|
88
|
+
size: '*',
|
|
89
|
+
});
|
|
90
|
+
return bidFloor.floor;
|
|
91
|
+
} catch (err) {
|
|
92
|
+
logError(err);
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function getUserId(eids, id, source, uidExt) {
|
|
98
|
+
if (id) {
|
|
99
|
+
var uid = { id };
|
|
100
|
+
if (uidExt) {
|
|
101
|
+
uid.ext = uidExt;
|
|
102
|
+
}
|
|
103
|
+
eids.push({
|
|
104
|
+
source,
|
|
105
|
+
uids: [ uid ]
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const spec = {
|
|
111
|
+
code: BIDDER_CODE,
|
|
112
|
+
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
|
|
113
|
+
|
|
114
|
+
isBidRequestValid: (bid = {}) => {
|
|
115
|
+
const { params, bidId, mediaTypes } = bid;
|
|
116
|
+
let valid = Boolean(bidId && params && params.placementId);
|
|
117
|
+
|
|
118
|
+
if (mediaTypes && mediaTypes[BANNER]) {
|
|
119
|
+
valid = valid && Boolean(mediaTypes[BANNER] && mediaTypes[BANNER].sizes);
|
|
120
|
+
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
121
|
+
valid = valid && Boolean(mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize);
|
|
122
|
+
} else if (mediaTypes && mediaTypes[NATIVE]) {
|
|
123
|
+
valid = valid && Boolean(mediaTypes[NATIVE]);
|
|
124
|
+
} else {
|
|
125
|
+
valid = false;
|
|
126
|
+
}
|
|
127
|
+
return valid;
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
buildRequests: (validBidRequests = [], bidderRequest = {}) => {
|
|
131
|
+
// convert Native ORTB definition to old-style prebid native definition
|
|
132
|
+
validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
|
|
133
|
+
|
|
134
|
+
let deviceWidth = 0;
|
|
135
|
+
let deviceHeight = 0;
|
|
136
|
+
|
|
137
|
+
let winLocation;
|
|
138
|
+
try {
|
|
139
|
+
const winTop = window.top;
|
|
140
|
+
deviceWidth = winTop.screen.width;
|
|
141
|
+
deviceHeight = winTop.screen.height;
|
|
142
|
+
winLocation = winTop.location;
|
|
143
|
+
} catch (e) {
|
|
144
|
+
logMessage(e);
|
|
145
|
+
winLocation = window.location;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const refferUrl = bidderRequest.refererInfo && bidderRequest.refererInfo.page;
|
|
149
|
+
let refferLocation;
|
|
150
|
+
try {
|
|
151
|
+
refferLocation = refferUrl && new URL(refferUrl);
|
|
152
|
+
} catch (e) {
|
|
153
|
+
logMessage(e);
|
|
154
|
+
}
|
|
155
|
+
// TODO: does the fallback make sense here?
|
|
156
|
+
let location = refferLocation || winLocation;
|
|
157
|
+
const language = (navigator && navigator.language) ? navigator.language.split('-')[0] : '';
|
|
158
|
+
const host = location.host;
|
|
159
|
+
const page = location.pathname;
|
|
160
|
+
const secure = location.protocol === 'https:' ? 1 : 0;
|
|
161
|
+
const placements = [];
|
|
162
|
+
const request = {
|
|
163
|
+
deviceWidth,
|
|
164
|
+
deviceHeight,
|
|
165
|
+
language,
|
|
166
|
+
secure,
|
|
167
|
+
host,
|
|
168
|
+
page,
|
|
169
|
+
placements,
|
|
170
|
+
coppa: config.getConfig('coppa') === true ? 1 : 0,
|
|
171
|
+
ccpa: bidderRequest.uspConsent || undefined,
|
|
172
|
+
gdpr: bidderRequest.gdprConsent || undefined,
|
|
173
|
+
tmax: bidderRequest.timeout
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const len = validBidRequests.length;
|
|
177
|
+
for (let i = 0; i < len; i++) {
|
|
178
|
+
const bid = validBidRequests[i];
|
|
179
|
+
placements.push(getPlacementReqData(bid));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
url: AD_URL,
|
|
185
|
+
data: request
|
|
186
|
+
};
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
interpretResponse: (serverResponse) => {
|
|
190
|
+
let response = [];
|
|
191
|
+
for (let i = 0; i < serverResponse.body.length; i++) {
|
|
192
|
+
let resItem = serverResponse.body[i];
|
|
193
|
+
if (isBidResponseValid(resItem)) {
|
|
194
|
+
const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : [];
|
|
195
|
+
resItem.meta = { ...resItem.meta, advertiserDomains };
|
|
196
|
+
|
|
197
|
+
response.push(resItem);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return response;
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
|
|
204
|
+
let syncType = syncOptions.iframeEnabled ? 'iframe' : 'image';
|
|
205
|
+
let syncUrl = SYNC_URL + `/${syncType}?pbjs=1`;
|
|
206
|
+
if (gdprConsent && gdprConsent.consentString) {
|
|
207
|
+
if (typeof gdprConsent.gdprApplies === 'boolean') {
|
|
208
|
+
syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
|
|
209
|
+
} else {
|
|
210
|
+
syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (uspConsent && uspConsent.consentString) {
|
|
214
|
+
syncUrl += `&ccpa_consent=${uspConsent.consentString}`;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const coppa = config.getConfig('coppa') ? 1 : 0;
|
|
218
|
+
syncUrl += `&coppa=${coppa}`;
|
|
219
|
+
|
|
220
|
+
return [{
|
|
221
|
+
type: syncType,
|
|
222
|
+
url: syncUrl
|
|
223
|
+
}];
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
onBidViewable: function (bid) {
|
|
227
|
+
// to do : we need to implement js tag to fire pixel with viewability counter
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: PubCirlce Bidder Adapter
|
|
5
|
+
Module Type: PubCirlce Bidder Adapter
|
|
6
|
+
Maintainer: system@smartyads.com
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Connects to PubCirlce exchange for bids.
|
|
12
|
+
PubCirlce bid adapter supports Banner, Video (instream and outstream) and Native.
|
|
13
|
+
|
|
14
|
+
# Test Parameters
|
|
15
|
+
```
|
|
16
|
+
var adUnits = [
|
|
17
|
+
// Will return static test banner
|
|
18
|
+
{
|
|
19
|
+
code: 'addunit1',
|
|
20
|
+
mediaTypes: {
|
|
21
|
+
banner: {
|
|
22
|
+
sizes: [ [300, 250], [320, 50] ],
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
bids: [
|
|
26
|
+
{
|
|
27
|
+
bidder: 'pubcircle',
|
|
28
|
+
params: {
|
|
29
|
+
placementId: 'testBanner',
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
code: 'addunit2',
|
|
36
|
+
mediaTypes: {
|
|
37
|
+
video: {
|
|
38
|
+
playerSize: [ [640, 480] ],
|
|
39
|
+
context: 'instream',
|
|
40
|
+
minduration: 5,
|
|
41
|
+
maxduration: 60,
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
bids: [
|
|
45
|
+
{
|
|
46
|
+
bidder: 'pubcircle',
|
|
47
|
+
params: {
|
|
48
|
+
placementId: 'testVideo',
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
code: 'addunit3',
|
|
55
|
+
mediaTypes: {
|
|
56
|
+
native: {
|
|
57
|
+
title: {
|
|
58
|
+
required: true
|
|
59
|
+
},
|
|
60
|
+
body: {
|
|
61
|
+
required: true
|
|
62
|
+
},
|
|
63
|
+
icon: {
|
|
64
|
+
required: true,
|
|
65
|
+
size: [64, 64]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
bids: [
|
|
70
|
+
{
|
|
71
|
+
bidder: 'pubcircle',
|
|
72
|
+
params: {
|
|
73
|
+
placementId: 'testNative',
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
```
|
|
@@ -140,6 +140,12 @@ export const publinkIdSubmodule = {
|
|
|
140
140
|
if (!storedId) {
|
|
141
141
|
return {callback: makeCallback(config, consentData)};
|
|
142
142
|
}
|
|
143
|
-
}
|
|
143
|
+
},
|
|
144
|
+
eids: {
|
|
145
|
+
'publinkId': {
|
|
146
|
+
source: 'epsilon.com',
|
|
147
|
+
atype: 3
|
|
148
|
+
},
|
|
149
|
+
},
|
|
144
150
|
};
|
|
145
151
|
submodule('userId', publinkIdSubmodule);
|
|
@@ -110,6 +110,7 @@ function composeOrtb2Data(rtdData, prefix) {
|
|
|
110
110
|
!isEmpty(categories.cat) && deepSetValue(addOrtb2, prefix + '.cat', categories.cat);
|
|
111
111
|
!isEmpty(categories.pagecat) && deepSetValue(addOrtb2, prefix + '.pagecat', categories.pagecat);
|
|
112
112
|
!isEmpty(categories.sectioncat) && deepSetValue(addOrtb2, prefix + '.sectioncat', categories.sectioncat);
|
|
113
|
+
!isEmpty(categories.sectioncat) && deepSetValue(addOrtb2, prefix + '.ext.data.relevad_rtd', categories.sectioncat);
|
|
113
114
|
!isEmpty(categories.cattax) && deepSetValue(addOrtb2, prefix + '.cattax', categories.cattax);
|
|
114
115
|
|
|
115
116
|
if (!isEmpty(content) && !isEmpty(content.segs) && content.segtax) {
|
|
@@ -134,7 +135,8 @@ function setBidderSiteAndContent(bidderOrtbFragment, bidder, rtdData) {
|
|
|
134
135
|
try {
|
|
135
136
|
let addOrtb2 = composeOrtb2Data(rtdData, 'site');
|
|
136
137
|
!isEmpty(rtdData.segments) && deepSetValue(addOrtb2, 'user.ext.data.relevad_rtd', rtdData.segments);
|
|
137
|
-
!isEmpty(rtdData.
|
|
138
|
+
!isEmpty(rtdData.segments) && deepSetValue(addOrtb2, 'user.ext.data.segments', rtdData.segments);
|
|
139
|
+
!isEmpty(rtdData.categories) && deepSetValue(addOrtb2, 'user.ext.data.contextual_categories', rtdData.categories.pagecat);
|
|
138
140
|
if (isEmpty(addOrtb2)) {
|
|
139
141
|
return;
|
|
140
142
|
}
|
|
@@ -180,7 +182,7 @@ function getFiltered(data, minscore) {
|
|
|
180
182
|
const cats = filterByScore(data.cats, minscore);
|
|
181
183
|
const pcats = filterByScore(data.pcats, minscore) || cats;
|
|
182
184
|
const scats = filterByScore(data.scats, minscore) || pcats;
|
|
183
|
-
const cattax = data.cattax ? data.cattax : CATTAX_IAB;
|
|
185
|
+
const cattax = (data.cattax || data.cattax === undefined) ? data.cattax : CATTAX_IAB;
|
|
184
186
|
relevadData.categories = {cat: cats, pagecat: pcats, sectioncat: scats, cattax: cattax};
|
|
185
187
|
|
|
186
188
|
const contsegs = filterByScore(data.contsegs, minscore);
|
|
@@ -268,15 +270,12 @@ export function addRtdData(reqBids, data, moduleConfig) {
|
|
|
268
270
|
}
|
|
269
271
|
if (wb && !isEmpty(relevadList)) {
|
|
270
272
|
setBidderSiteAndContent(reqBids.ortb2Fragments?.bidder, bid.bidder, relevadData);
|
|
273
|
+
setBidderSiteAndContent(bid, 'ortb2', relevadData);
|
|
271
274
|
deepSetValue(bid, 'params.keywords.relevad_rtd', relevadList);
|
|
272
|
-
deepSetValue(bid, 'params.target', [].concat(bid.params?.target ? [bid.params.target] : []).concat(relevadList.map(entry => { return 'relevad_rtd=' + entry; })).join(';'));
|
|
275
|
+
!(bid.params?.target || '').includes('relevad_rtd=') && deepSetValue(bid, 'params.target', [].concat(bid.params?.target ? [bid.params.target] : []).concat(relevadList.map(entry => { return 'relevad_rtd=' + entry; })).join(';'));
|
|
273
276
|
let firstPartyData = {};
|
|
274
277
|
firstPartyData[bid.bidder] = { firstPartyData: { relevad_rtd: relevadList } };
|
|
275
278
|
config.setConfig(firstPartyData);
|
|
276
|
-
!isEmpty(relevadData.segments) && deepSetValue(bid, 'ortb2.user.ext.data.segments', relevadData.segments);
|
|
277
|
-
!isEmpty(relevadData.categories) && deepSetValue(bid, 'ortb2.user.ext.data.contextual_categories', relevadData.categories.pagecat);
|
|
278
|
-
!isEmpty(relevadData.categories) && deepSetValue(bid, 'ortb2.site.ext.data.relevad_rtd', relevadData.categories.pagecat);
|
|
279
|
-
!isEmpty(relevadData.segments) && deepSetValue(bid, 'ortb2.user.ext.data.relevad_rtd', relevadData.segments);
|
|
280
279
|
}
|
|
281
280
|
}
|
|
282
281
|
} catch (e) {
|
|
@@ -200,6 +200,10 @@ export const converter = ortbConverter({
|
|
|
200
200
|
bidRequest.params.position === 'btf' && (imp.video.pos = 3);
|
|
201
201
|
delete imp.ext?.prebid?.storedrequest;
|
|
202
202
|
|
|
203
|
+
if (bidRequest.params.bidonmultiformat === true && bidRequestType.length > 1) {
|
|
204
|
+
deepSetValue(imp, 'ext.prebid.bidder.rubicon.formats', bidRequestType);
|
|
205
|
+
}
|
|
206
|
+
|
|
203
207
|
setBidFloors(bidRequest, imp);
|
|
204
208
|
|
|
205
209
|
return imp;
|
|
@@ -497,6 +501,11 @@ export const spec = {
|
|
|
497
501
|
data['rp_hard_floor'] = typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined;
|
|
498
502
|
}
|
|
499
503
|
|
|
504
|
+
// Send multiformat data if requested
|
|
505
|
+
if (params.bidonmultiformat === true && deepAccess(bidRequest, 'mediaTypes') && Object.keys(bidRequest.mediaTypes).length > 1) {
|
|
506
|
+
data['p_formats'] = Object.keys(bidRequest.mediaTypes).join(',');
|
|
507
|
+
}
|
|
508
|
+
|
|
500
509
|
// add p_pos only if specified and valid
|
|
501
510
|
// For SRA we need to explicitly put empty semi colons so AE treats it as empty, instead of copying the latter value
|
|
502
511
|
let posMapping = {1: 'atf', 3: 'btf'};
|