prebid.js 9.5.0 → 9.7.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/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- package/.github/release-drafter.yml +4 -0
- package/README.md +4 -4
- 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/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.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/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/aidemBidAdapter.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/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/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/cleanmedianetBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/connectionInfo.js +1 -0
- 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/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/dependencies.json +31 -2
- package/dist/docereeAdManagerBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gamoshiBidAdapter.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/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/idImportLibrary.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.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/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/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.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/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/missenaBidAdapter.js +1 -1
- package/dist/mobianRtdProvider.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +174 -170
- 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/orbidderBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/ownadxBidAdapter.js +1 -0
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prismaBidAdapter.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/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/riseUtils.js +1 -0
- package/dist/rubiconBidAdapter.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/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smarthubBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.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/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/telariaBidAdapter.js +1 -1
- package/dist/teqblazeUtils.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.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/uid2IdSystem_shared.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/viantOrtbBidAdapter.js +1 -1
- package/dist/vidazooUtils.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/wurflRtdProvider.js +1 -0
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/wurflRtdProvider_example.html +106 -0
- package/libraries/connectionInfo/connectionUtils.js +33 -0
- package/libraries/ortbConverter/processors/video.js +2 -24
- package/libraries/riseUtils/index.js +331 -0
- package/libraries/teqblazeUtils/bidderUtils.js +15 -11
- package/libraries/vidazooUtils/bidderUtils.js +16 -0
- package/modules/.submodules.json +3 -1
- package/modules/51DegreesRtdProvider.md +11 -7
- package/modules/adagioAnalyticsAdapter.js +101 -84
- package/modules/adagioAnalyticsAdapter.md +4 -0
- package/modules/adagioBidAdapter.js +14 -66
- package/modules/adkernelBidAdapter.js +2 -2
- package/modules/aidemBidAdapter.js +2 -0
- package/modules/appnexusBidAdapter.js +1 -1
- package/modules/cleanmedianetBidAdapter.js +1 -1
- package/modules/connectIdSystem.js +5 -3
- package/modules/dailymotionBidAdapter.js +19 -0
- package/modules/docereeAdManagerBidAdapter.js +9 -12
- package/modules/gamoshiBidAdapter.js +1 -1
- package/modules/greenbidsAnalyticsAdapter.js +7 -4
- package/modules/greenbidsRtdProvider.js +15 -5
- package/modules/id5IdSystem.js +14 -93
- package/modules/idImportLibrary.js +14 -6
- package/modules/insticatorBidAdapter.js +35 -31
- package/modules/kargoBidAdapter.js +11 -14
- package/modules/kimberliteBidAdapter.js +24 -7
- package/modules/kimberliteBidAdapter.md +30 -1
- package/modules/minutemediaBidAdapter.js +21 -398
- package/modules/mobianRtdProvider.js +28 -14
- package/modules/nexx360BidAdapter.js +3 -2
- package/modules/openwebBidAdapter.js +18 -396
- package/modules/ownadxBidAdapter.js +99 -0
- package/modules/prismaBidAdapter.js +1 -27
- package/modules/publirBidAdapter.js +20 -273
- package/modules/pubmaticBidAdapter.js +2 -1
- package/modules/resetdigitalBidAdapter.md +54 -45
- package/modules/riseBidAdapter.js +19 -400
- package/modules/sharethroughBidAdapter.js +5 -0
- package/modules/shinezBidAdapter.js +17 -361
- package/modules/smarthubBidAdapter.js +45 -177
- package/modules/stnBidAdapter.js +22 -398
- package/modules/telariaBidAdapter.js +2 -32
- package/modules/ttdBidAdapter.js +14 -32
- package/modules/uid2IdSystem_shared.js +51 -39
- package/modules/viantOrtbBidAdapter.js +1 -1
- package/modules/wurflRtdProvider.js +213 -0
- package/modules/wurflRtdProvider.md +67 -0
- package/package.json +1 -1
- package/src/adloader.js +1 -0
- package/src/prebid.js +6 -1
- package/src/video.js +78 -1
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
- package/test/spec/modules/adagioBidAdapter_spec.js +32 -67
- package/test/spec/modules/appnexusBidAdapter_spec.js +0 -33
- package/test/spec/modules/cleanmedianetBidAdapter_spec.js +1 -1
- package/test/spec/modules/connectIdSystem_spec.js +27 -28
- package/test/spec/modules/dailymotionBidAdapter_spec.js +50 -0
- package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +1 -0
- package/test/spec/modules/gamoshiBidAdapter_spec.js +1 -1
- package/test/spec/modules/id5IdSystem_spec.js +25 -98
- package/test/spec/modules/idImportLibrary_spec.js +14 -0
- package/test/spec/modules/insticatorBidAdapter_spec.js +8 -1
- package/test/spec/modules/kargoBidAdapter_spec.js +7 -8
- package/test/spec/modules/kimberliteBidAdapter_spec.js +137 -65
- package/test/spec/modules/mobianRtdProvider_spec.js +46 -43
- package/test/spec/modules/nexx360BidAdapter_spec.js +1 -1
- package/test/spec/modules/ownadxBidAdapter_spec.js +103 -0
- package/test/spec/modules/pubmaticBidAdapter_spec.js +18 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +35 -0
- package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
- package/test/spec/modules/ttdBidAdapter_spec.js +10 -1
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +1 -1
- package/test/spec/modules/vidazooBidAdapter_spec.js +12 -4
- package/test/spec/modules/wurflRtdProvider_spec.js +324 -0
- package/test/spec/unit/pbjs_api_spec.js +11 -0
- package/test/spec/video_spec.js +103 -1
|
@@ -2,33 +2,28 @@ import {
|
|
|
2
2
|
logWarn,
|
|
3
3
|
logInfo,
|
|
4
4
|
isArray,
|
|
5
|
-
isFn,
|
|
6
5
|
deepAccess,
|
|
7
|
-
|
|
8
|
-
contains,
|
|
9
|
-
triggerPixel,
|
|
10
|
-
isInteger,
|
|
11
|
-
getBidIdParameter,
|
|
12
|
-
getDNT
|
|
6
|
+
triggerPixel
|
|
13
7
|
} from '../src/utils.js';
|
|
14
|
-
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
15
|
-
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
16
|
-
import {
|
|
8
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
9
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
10
|
+
import {
|
|
11
|
+
getEndpoint,
|
|
12
|
+
generateBidsParams,
|
|
13
|
+
generateGeneralParams,
|
|
14
|
+
buildBidResponse,
|
|
15
|
+
} from '../libraries/riseUtils/index.js';
|
|
17
16
|
|
|
18
17
|
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
|
|
19
18
|
const BIDDER_CODE = 'openweb';
|
|
20
19
|
const ADAPTER_VERSION = '6.0.0';
|
|
21
20
|
const TTL = 360;
|
|
22
21
|
const DEFAULT_CURRENCY = 'USD';
|
|
23
|
-
const
|
|
22
|
+
const BASE_URL = 'https://hb.openwebmp.com/';
|
|
24
23
|
const MODES = {
|
|
25
24
|
PRODUCTION: 'hb-multi',
|
|
26
25
|
TEST: 'hb-multi-test'
|
|
27
|
-
}
|
|
28
|
-
const SUPPORTED_SYNC_METHODS = {
|
|
29
|
-
IFRAME: 'iframe',
|
|
30
|
-
PIXEL: 'pixel'
|
|
31
|
-
}
|
|
26
|
+
};
|
|
32
27
|
|
|
33
28
|
export const spec = {
|
|
34
29
|
code: BIDDER_CODE,
|
|
@@ -65,7 +60,7 @@ export const spec = {
|
|
|
65
60
|
|
|
66
61
|
return {
|
|
67
62
|
method: 'POST',
|
|
68
|
-
url: getEndpoint(testMode),
|
|
63
|
+
url: getEndpoint(testMode, BASE_URL, MODES),
|
|
69
64
|
data: combinedRequestsObject
|
|
70
65
|
}
|
|
71
66
|
},
|
|
@@ -74,32 +69,7 @@ export const spec = {
|
|
|
74
69
|
|
|
75
70
|
if (body && body.bids && body.bids.length) {
|
|
76
71
|
body.bids.forEach(adUnit => {
|
|
77
|
-
const bidResponse =
|
|
78
|
-
requestId: adUnit.requestId,
|
|
79
|
-
cpm: adUnit.cpm,
|
|
80
|
-
currency: adUnit.currency || DEFAULT_CURRENCY,
|
|
81
|
-
width: adUnit.width,
|
|
82
|
-
height: adUnit.height,
|
|
83
|
-
ttl: adUnit.ttl || TTL,
|
|
84
|
-
creativeId: adUnit.creativeId,
|
|
85
|
-
netRevenue: adUnit.netRevenue || true,
|
|
86
|
-
nurl: adUnit.nurl,
|
|
87
|
-
mediaType: adUnit.mediaType,
|
|
88
|
-
meta: {
|
|
89
|
-
mediaType: adUnit.mediaType
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
if (adUnit.mediaType === VIDEO) {
|
|
94
|
-
bidResponse.vastXml = adUnit.vastXml;
|
|
95
|
-
} else if (adUnit.mediaType === BANNER) {
|
|
96
|
-
bidResponse.ad = adUnit.ad;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (adUnit.adomain && adUnit.adomain.length) {
|
|
100
|
-
bidResponse.meta.advertiserDomains = adUnit.adomain;
|
|
101
|
-
}
|
|
102
|
-
|
|
72
|
+
const bidResponse = buildBidResponse(adUnit, DEFAULT_CURRENCY, TTL, VIDEO, BANNER);
|
|
103
73
|
bidResponses.push(bidResponse);
|
|
104
74
|
});
|
|
105
75
|
}
|
|
@@ -109,20 +79,20 @@ export const spec = {
|
|
|
109
79
|
getUserSyncs: function (syncOptions, serverResponses) {
|
|
110
80
|
const syncs = [];
|
|
111
81
|
for (const response of serverResponses) {
|
|
112
|
-
if (syncOptions.iframeEnabled && response
|
|
82
|
+
if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
|
|
113
83
|
syncs.push({
|
|
114
84
|
type: 'iframe',
|
|
115
|
-
url: response
|
|
85
|
+
url: deepAccess(response, 'body.params.userSyncURL')
|
|
116
86
|
});
|
|
117
87
|
}
|
|
118
|
-
if (syncOptions.pixelEnabled && isArray(response
|
|
88
|
+
if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
|
|
119
89
|
const pixels = response.body.params.userSyncPixels.map(pixel => {
|
|
120
90
|
return {
|
|
121
91
|
type: 'image',
|
|
122
92
|
url: pixel
|
|
123
93
|
}
|
|
124
|
-
})
|
|
125
|
-
syncs.push(...pixels)
|
|
94
|
+
});
|
|
95
|
+
syncs.push(...pixels);
|
|
126
96
|
}
|
|
127
97
|
}
|
|
128
98
|
return syncs;
|
|
@@ -140,351 +110,3 @@ export const spec = {
|
|
|
140
110
|
};
|
|
141
111
|
|
|
142
112
|
registerBidder(spec);
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Get floor price
|
|
146
|
-
* @param bid {bid}
|
|
147
|
-
* @returns {Number}
|
|
148
|
-
*/
|
|
149
|
-
function getFloor(bid, mediaType) {
|
|
150
|
-
if (!isFn(bid.getFloor)) {
|
|
151
|
-
return 0;
|
|
152
|
-
}
|
|
153
|
-
let floorResult = bid.getFloor({
|
|
154
|
-
currency: DEFAULT_CURRENCY,
|
|
155
|
-
mediaType: mediaType,
|
|
156
|
-
size: '*'
|
|
157
|
-
});
|
|
158
|
-
return floorResult.currency === DEFAULT_CURRENCY && floorResult.floor ? floorResult.floor : 0;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Get the the ad sizes array from the bid
|
|
163
|
-
* @param bid {bid}
|
|
164
|
-
* @returns {Array}
|
|
165
|
-
*/
|
|
166
|
-
function getSizesArray(bid, mediaType) {
|
|
167
|
-
let sizesArray = []
|
|
168
|
-
|
|
169
|
-
if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
|
|
170
|
-
sizesArray = bid.mediaTypes[mediaType].sizes;
|
|
171
|
-
} else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
|
|
172
|
-
sizesArray = bid.sizes;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return sizesArray;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Get schain string value
|
|
180
|
-
* @param schainObject {Object}
|
|
181
|
-
* @returns {string}
|
|
182
|
-
*/
|
|
183
|
-
function getSupplyChain(schainObject) {
|
|
184
|
-
if (isEmpty(schainObject)) {
|
|
185
|
-
return '';
|
|
186
|
-
}
|
|
187
|
-
let scStr = `${schainObject.ver},${schainObject.complete}`;
|
|
188
|
-
schainObject.nodes.forEach((node) => {
|
|
189
|
-
scStr += '!';
|
|
190
|
-
scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
|
|
191
|
-
scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
|
|
192
|
-
scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
|
|
193
|
-
scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
|
|
194
|
-
scStr += `${getEncodedValIfNotEmpty(node.name)},`;
|
|
195
|
-
scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
|
|
196
|
-
});
|
|
197
|
-
return scStr;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Get encoded node value
|
|
202
|
-
* @param val {string}
|
|
203
|
-
* @returns {string}
|
|
204
|
-
*/
|
|
205
|
-
function getEncodedValIfNotEmpty(val) {
|
|
206
|
-
return !isEmpty(val) ? encodeURIComponent(val) : '';
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Get preferred user-sync method based on publisher configuration
|
|
211
|
-
* @param bidderCode {string}
|
|
212
|
-
* @returns {string}
|
|
213
|
-
*/
|
|
214
|
-
function getAllowedSyncMethod(filterSettings, bidderCode) {
|
|
215
|
-
const iframeConfigsToCheck = ['all', 'iframe'];
|
|
216
|
-
const pixelConfigToCheck = 'image';
|
|
217
|
-
if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
|
|
218
|
-
return SUPPORTED_SYNC_METHODS.IFRAME;
|
|
219
|
-
}
|
|
220
|
-
if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
|
|
221
|
-
return SUPPORTED_SYNC_METHODS.PIXEL;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Check if sync rule is supported
|
|
227
|
-
* @param syncRule {Object}
|
|
228
|
-
* @param bidderCode {string}
|
|
229
|
-
* @returns {boolean}
|
|
230
|
-
*/
|
|
231
|
-
function isSyncMethodAllowed(syncRule, bidderCode) {
|
|
232
|
-
if (!syncRule) {
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
const isInclude = syncRule.filter === 'include';
|
|
236
|
-
const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
|
|
237
|
-
return isInclude && contains(bidders, bidderCode);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Get the seller endpoint
|
|
242
|
-
* @param testMode {boolean}
|
|
243
|
-
* @returns {string}
|
|
244
|
-
*/
|
|
245
|
-
function getEndpoint(testMode) {
|
|
246
|
-
return testMode
|
|
247
|
-
? SELLER_ENDPOINT + MODES.TEST
|
|
248
|
-
: SELLER_ENDPOINT + MODES.PRODUCTION;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* get device type
|
|
253
|
-
* @param uad {ua}
|
|
254
|
-
* @returns {string}
|
|
255
|
-
*/
|
|
256
|
-
function getDeviceType(ua) {
|
|
257
|
-
if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
|
|
258
|
-
.test(ua.toLowerCase())) {
|
|
259
|
-
return '5';
|
|
260
|
-
}
|
|
261
|
-
if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
|
|
262
|
-
.test(ua.toLowerCase())) {
|
|
263
|
-
return '4';
|
|
264
|
-
}
|
|
265
|
-
if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
|
|
266
|
-
.test(ua.toLowerCase())) {
|
|
267
|
-
return '3';
|
|
268
|
-
}
|
|
269
|
-
return '1';
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
function generateBidsParams(validBidRequests, bidderRequest) {
|
|
273
|
-
const bidsArray = [];
|
|
274
|
-
|
|
275
|
-
if (validBidRequests.length) {
|
|
276
|
-
validBidRequests.forEach(bid => {
|
|
277
|
-
bidsArray.push(generateBidParameters(bid, bidderRequest));
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
return bidsArray;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Generate bid specific parameters
|
|
286
|
-
* @param {bid} bid
|
|
287
|
-
* @param {bidderRequest} bidderRequest
|
|
288
|
-
* @returns {Object} bid specific params object
|
|
289
|
-
*/
|
|
290
|
-
function generateBidParameters(bid, bidderRequest) {
|
|
291
|
-
const {params} = bid;
|
|
292
|
-
const mediaType = isBanner(bid) ? BANNER : VIDEO;
|
|
293
|
-
const sizesArray = getSizesArray(bid, mediaType);
|
|
294
|
-
|
|
295
|
-
// fix floor price in case of NAN
|
|
296
|
-
if (isNaN(params.floorPrice)) {
|
|
297
|
-
params.floorPrice = 0;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const bidObject = {
|
|
301
|
-
mediaType,
|
|
302
|
-
adUnitCode: getBidIdParameter('adUnitCode', bid),
|
|
303
|
-
sizes: sizesArray,
|
|
304
|
-
floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
|
|
305
|
-
bidId: getBidIdParameter('bidId', bid),
|
|
306
|
-
loop: getBidIdParameter('bidderRequestsCount', bid),
|
|
307
|
-
bidderRequestId: getBidIdParameter('bidderRequestId', bid),
|
|
308
|
-
transactionId: bid.ortb2Imp?.ext?.tid || '',
|
|
309
|
-
coppa: 0,
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
|
|
313
|
-
if (pos) {
|
|
314
|
-
bidObject.pos = pos;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
|
|
318
|
-
if (gpid) {
|
|
319
|
-
bidObject.gpid = gpid;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
|
|
323
|
-
if (placementId) {
|
|
324
|
-
bidObject.placementId = placementId;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
const mimes = deepAccess(bid, `mediaTypes.${mediaType}.mimes`);
|
|
328
|
-
if (mimes) {
|
|
329
|
-
bidObject.mimes = mimes;
|
|
330
|
-
}
|
|
331
|
-
const api = deepAccess(bid, `mediaTypes.${mediaType}.api`);
|
|
332
|
-
if (api) {
|
|
333
|
-
bidObject.api = api;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
const sua = deepAccess(bid, `ortb2.device.sua`);
|
|
337
|
-
if (sua) {
|
|
338
|
-
bidObject.sua = sua;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
const coppa = deepAccess(bid, `ortb2.regs.coppa`);
|
|
342
|
-
if (coppa) {
|
|
343
|
-
bidObject.coppa = 1;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (mediaType === VIDEO) {
|
|
347
|
-
const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
|
|
348
|
-
let playbackMethodValue;
|
|
349
|
-
|
|
350
|
-
// verify playbackMethod is of type integer array, or integer only.
|
|
351
|
-
if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
|
|
352
|
-
// only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
|
|
353
|
-
playbackMethodValue = playbackMethod[0];
|
|
354
|
-
} else if (isInteger(playbackMethod)) {
|
|
355
|
-
playbackMethodValue = playbackMethod;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if (playbackMethodValue) {
|
|
359
|
-
bidObject.playbackMethod = playbackMethodValue;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const placement = deepAccess(bid, `mediaTypes.video.placement`);
|
|
363
|
-
if (placement) {
|
|
364
|
-
bidObject.placement = placement;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
|
|
368
|
-
if (minDuration) {
|
|
369
|
-
bidObject.minDuration = minDuration;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
|
|
373
|
-
if (maxDuration) {
|
|
374
|
-
bidObject.maxDuration = maxDuration;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const skip = deepAccess(bid, `mediaTypes.video.skip`);
|
|
378
|
-
if (skip) {
|
|
379
|
-
bidObject.skip = skip;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
|
|
383
|
-
if (linearity) {
|
|
384
|
-
bidObject.linearity = linearity;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
const protocols = deepAccess(bid, `mediaTypes.video.protocols`);
|
|
388
|
-
if (protocols) {
|
|
389
|
-
bidObject.protocols = protocols;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
|
|
393
|
-
if (plcmt) {
|
|
394
|
-
bidObject.plcmt = plcmt;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
return bidObject;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
function isBanner(bid) {
|
|
402
|
-
return bid.mediaTypes && bid.mediaTypes.banner;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
/**
|
|
406
|
-
* Generate params that are common between all bids
|
|
407
|
-
* @param {single bid object} generalObject
|
|
408
|
-
* @param {bidderRequest} bidderRequest
|
|
409
|
-
* @returns {object} the common params object
|
|
410
|
-
*/
|
|
411
|
-
function generateGeneralParams(generalObject, bidderRequest) {
|
|
412
|
-
const domain = deepAccess(bidderRequest, 'refererInfo.domain') || window.location.hostname;
|
|
413
|
-
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
|
|
414
|
-
const {bidderCode, timeout} = bidderRequest;
|
|
415
|
-
const generalBidParams = generalObject.params;
|
|
416
|
-
|
|
417
|
-
// these params are snake_case instead of camelCase to allow backwards compatability on the server.
|
|
418
|
-
// in the future, these will be converted to camelCase to match our convention.
|
|
419
|
-
const generalParams = {
|
|
420
|
-
wrapper_type: 'prebidjs',
|
|
421
|
-
wrapper_vendor: '$$PREBID_GLOBAL$$',
|
|
422
|
-
wrapper_version: '$prebid.version$',
|
|
423
|
-
adapter_version: ADAPTER_VERSION,
|
|
424
|
-
publisher_id: generalBidParams.org,
|
|
425
|
-
publisher_name: domain,
|
|
426
|
-
site_domain: domain,
|
|
427
|
-
dnt: getDNT() ? 1 : 0,
|
|
428
|
-
device_type: getDeviceType(navigator.userAgent),
|
|
429
|
-
ua: navigator.userAgent,
|
|
430
|
-
is_wrapper: !!generalBidParams.isWrapper,
|
|
431
|
-
session_id: generalBidParams.sessionId || getBidIdParameter('bidderRequestId', generalObject),
|
|
432
|
-
tmax: timeout
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
const userIdsParam = getBidIdParameter('userId', generalObject);
|
|
436
|
-
if (userIdsParam) {
|
|
437
|
-
generalParams.userIds = JSON.stringify(userIdsParam);
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const ortb2Metadata = bidderRequest.ortb2 || {};
|
|
441
|
-
if (ortb2Metadata.site) {
|
|
442
|
-
generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
|
|
443
|
-
}
|
|
444
|
-
if (ortb2Metadata.user) {
|
|
445
|
-
generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
if (syncEnabled) {
|
|
449
|
-
const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
|
|
450
|
-
if (allowedSyncMethod) {
|
|
451
|
-
generalParams.cs_method = allowedSyncMethod;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
if (bidderRequest.auctionStart) {
|
|
456
|
-
generalParams.auction_start = bidderRequest.auctionStart;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
if (bidderRequest.uspConsent) {
|
|
460
|
-
generalParams.us_privacy = bidderRequest.uspConsent;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
|
|
464
|
-
generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
|
|
465
|
-
generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
if (bidderRequest.gppConsent) {
|
|
469
|
-
generalParams.gpp = bidderRequest.gppConsent.gppString;
|
|
470
|
-
generalParams.gpp_sid = bidderRequest.gppConsent.applicableSections;
|
|
471
|
-
} else if (bidderRequest.ortb2?.regs?.gpp) {
|
|
472
|
-
generalParams.gpp = bidderRequest.ortb2.regs.gpp;
|
|
473
|
-
generalParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
if (generalBidParams.ifa) {
|
|
477
|
-
generalParams.ifa = generalBidParams.ifa;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
if (generalObject.schain) {
|
|
481
|
-
generalParams.schain = getSupplyChain(generalObject.schain);
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
if (bidderRequest && bidderRequest.refererInfo) {
|
|
485
|
-
generalParams.referrer = deepAccess(bidderRequest, 'refererInfo.ref');
|
|
486
|
-
generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || deepAccess(window, 'location.href');
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
return generalParams;
|
|
490
|
-
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { parseSizesInput, isEmpty } from '../src/utils.js';
|
|
2
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
|
+
import { BANNER } from '../src/mediaTypes.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
|
|
7
|
+
* @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid
|
|
8
|
+
* @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const BIDDER_CODE = 'ownadx';
|
|
12
|
+
const CUR = 'USD';
|
|
13
|
+
const CREATIVE_TTL = 300;
|
|
14
|
+
|
|
15
|
+
export const spec = {
|
|
16
|
+
code: BIDDER_CODE,
|
|
17
|
+
supportedMediaTypes: [BANNER],
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Determines whether or not the given bid request is valid.
|
|
21
|
+
*
|
|
22
|
+
* @param {BidRequest} bid The bid params to validate.
|
|
23
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
24
|
+
*/
|
|
25
|
+
isBidRequestValid: function (bid) {
|
|
26
|
+
return !!(bid.params.tokenId && bid.params.sspId && bid.params.seatId);
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Make a server request from the list of BidRequests.
|
|
31
|
+
*
|
|
32
|
+
* @param validBidRequests
|
|
33
|
+
* @param bidderRequest
|
|
34
|
+
* @return Array Info describing the request to the server.
|
|
35
|
+
*/
|
|
36
|
+
buildRequests: function (validBidRequests, bidderRequest) {
|
|
37
|
+
return validBidRequests.map(bidRequest => {
|
|
38
|
+
const sizes = parseSizesInput(bidRequest.params.size || bidRequest.sizes);
|
|
39
|
+
let mtype = 0;
|
|
40
|
+
if (bidRequest.mediaTypes[BANNER]) {
|
|
41
|
+
mtype = 1;
|
|
42
|
+
} else {
|
|
43
|
+
mtype = 2;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let tkn = bidRequest.params.tokenId;
|
|
47
|
+
let seatid = bidRequest.params.seatId;
|
|
48
|
+
let sspid = bidRequest.params.sspId;
|
|
49
|
+
|
|
50
|
+
const payload = {
|
|
51
|
+
sizes: sizes,
|
|
52
|
+
slotBidId: bidRequest.bidId,
|
|
53
|
+
PageUrl: bidderRequest.refererInfo.page,
|
|
54
|
+
mediaChannel: mtype
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
url: `https://pbs-js.prebid-ownadx.com/publisher/prebid/${seatid}/${sspid}?token=${tkn}`,
|
|
59
|
+
data: payload
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Unpack the response from the server into a list of bids.
|
|
66
|
+
*
|
|
67
|
+
* @param {ServerResponse} serverResponse A successful response from the server.
|
|
68
|
+
* @return {Bid[]} An array of bids which were nested inside the server.
|
|
69
|
+
*/
|
|
70
|
+
interpretResponse: function (serverResponse) {
|
|
71
|
+
const response = serverResponse.body;
|
|
72
|
+
const bids = [];
|
|
73
|
+
if (isEmpty(response)) {
|
|
74
|
+
return bids;
|
|
75
|
+
}
|
|
76
|
+
const responseBid = {
|
|
77
|
+
width: response.width,
|
|
78
|
+
height: response.height,
|
|
79
|
+
token: response.tokenId,
|
|
80
|
+
ttl: CREATIVE_TTL,
|
|
81
|
+
requestId: response.slotBidId,
|
|
82
|
+
aType: response.adType || '1',
|
|
83
|
+
cpm: response.cpm,
|
|
84
|
+
creativeId: response.creativeId || 0,
|
|
85
|
+
netRevenue: response.netRevenue || false,
|
|
86
|
+
currency: response.currency || CUR,
|
|
87
|
+
meta: {
|
|
88
|
+
mediaType: response.mediaType || BANNER,
|
|
89
|
+
advertiserDomains: response.advertiserDomains || []
|
|
90
|
+
},
|
|
91
|
+
ad: response.adm
|
|
92
|
+
};
|
|
93
|
+
bids.push(responseBid);
|
|
94
|
+
return bids;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
registerBidder(spec);
|
|
@@ -3,6 +3,7 @@ import {config} from '../src/config.js';
|
|
|
3
3
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
4
4
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
5
5
|
import {getANKeywordParam} from '../libraries/appnexusUtils/anKeywords.js';
|
|
6
|
+
import {getConnectionType} from '../libraries/connectionInfo/connectionUtils.js'
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
|
|
@@ -20,33 +21,6 @@ const METRICS_TRACKER_URL = 'https://prisma.nexx360.io/track-imp';
|
|
|
20
21
|
|
|
21
22
|
const GVLID = 965;
|
|
22
23
|
|
|
23
|
-
function getConnectionType() {
|
|
24
|
-
const connection = navigator.connection || navigator.webkitConnection;
|
|
25
|
-
if (!connection) {
|
|
26
|
-
return 0;
|
|
27
|
-
}
|
|
28
|
-
switch (connection.type) {
|
|
29
|
-
case 'ethernet':
|
|
30
|
-
return 1;
|
|
31
|
-
case 'wifi':
|
|
32
|
-
return 2;
|
|
33
|
-
case 'cellular':
|
|
34
|
-
switch (connection.effectiveType) {
|
|
35
|
-
case 'slow-2g':
|
|
36
|
-
case '2g':
|
|
37
|
-
return 4;
|
|
38
|
-
case '3g':
|
|
39
|
-
return 5;
|
|
40
|
-
case '4g':
|
|
41
|
-
return 6;
|
|
42
|
-
default:
|
|
43
|
-
return 3;
|
|
44
|
-
}
|
|
45
|
-
default:
|
|
46
|
-
return 0;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
24
|
export const spec = {
|
|
51
25
|
code: BIDDER_CODE,
|
|
52
26
|
gvlid: GVLID,
|