prebid.js 9.5.0 → 9.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/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/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.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/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/dependencies.json +26 -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/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/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/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +163 -162
- 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/outbrainBidAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.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/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/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/libraries/riseUtils/index.js +330 -0
- package/libraries/teqblazeUtils/bidderUtils.js +15 -11
- package/modules/adagioAnalyticsAdapter.js +101 -84
- package/modules/adagioAnalyticsAdapter.md +4 -0
- package/modules/adagioBidAdapter.js +4 -16
- package/modules/adkernelBidAdapter.js +2 -2
- package/modules/aidemBidAdapter.js +2 -0
- package/modules/connectIdSystem.js +5 -3
- 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/nexx360BidAdapter.js +3 -2
- package/modules/openwebBidAdapter.js +18 -396
- package/modules/publirBidAdapter.js +20 -273
- package/modules/resetdigitalBidAdapter.md +54 -45
- package/modules/riseBidAdapter.js +19 -400
- 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/uid2IdSystem_shared.js +51 -39
- package/package.json +1 -1
- package/src/prebid.js +4 -0
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
- package/test/spec/modules/adagioBidAdapter_spec.js +32 -66
- package/test/spec/modules/connectIdSystem_spec.js +27 -28
- 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/nexx360BidAdapter_spec.js +1 -1
- package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
- package/test/spec/unit/pbjs_api_spec.js +11 -0
|
@@ -2,33 +2,28 @@ import {
|
|
|
2
2
|
logWarn,
|
|
3
3
|
logInfo,
|
|
4
4
|
isArray,
|
|
5
|
-
isFn,
|
|
6
5
|
deepAccess,
|
|
7
|
-
isEmpty,
|
|
8
|
-
contains,
|
|
9
|
-
timestamp,
|
|
10
6
|
triggerPixel,
|
|
11
|
-
isInteger,
|
|
12
|
-
getBidIdParameter
|
|
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 = 'shinez';
|
|
20
19
|
const ADAPTER_VERSION = '1.0.0';
|
|
21
20
|
const TTL = 360;
|
|
22
21
|
const CURRENCY = 'USD';
|
|
23
|
-
const
|
|
22
|
+
const BASE_URL = 'https://hb.sweetgum.io/';
|
|
24
23
|
const MODES = {
|
|
25
24
|
PRODUCTION: 'hb-sz-multi',
|
|
26
25
|
TEST: 'hb-multi-sz-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,
|
|
@@ -59,7 +54,7 @@ export const spec = {
|
|
|
59
54
|
|
|
60
55
|
return {
|
|
61
56
|
method: 'POST',
|
|
62
|
-
url: getEndpoint(testMode),
|
|
57
|
+
url: getEndpoint(testMode, BASE_URL, MODES),
|
|
63
58
|
data: combinedRequestsObject
|
|
64
59
|
}
|
|
65
60
|
},
|
|
@@ -68,32 +63,7 @@ export const spec = {
|
|
|
68
63
|
|
|
69
64
|
if (body.bids) {
|
|
70
65
|
body.bids.forEach(adUnit => {
|
|
71
|
-
const bidResponse =
|
|
72
|
-
requestId: adUnit.requestId,
|
|
73
|
-
cpm: adUnit.cpm,
|
|
74
|
-
currency: adUnit.currency || CURRENCY,
|
|
75
|
-
width: adUnit.width,
|
|
76
|
-
height: adUnit.height,
|
|
77
|
-
ttl: adUnit.ttl || TTL,
|
|
78
|
-
creativeId: adUnit.requestId,
|
|
79
|
-
netRevenue: adUnit.netRevenue || true,
|
|
80
|
-
nurl: adUnit.nurl,
|
|
81
|
-
mediaType: adUnit.mediaType,
|
|
82
|
-
meta: {
|
|
83
|
-
mediaType: adUnit.mediaType
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
if (adUnit.mediaType === VIDEO) {
|
|
88
|
-
bidResponse.vastXml = adUnit.vastXml;
|
|
89
|
-
} else if (adUnit.mediaType === BANNER) {
|
|
90
|
-
bidResponse.ad = adUnit.ad;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (adUnit.adomain && adUnit.adomain.length) {
|
|
94
|
-
bidResponse.meta.advertiserDomains = adUnit.adomain;
|
|
95
|
-
}
|
|
96
|
-
|
|
66
|
+
const bidResponse = buildBidResponse(adUnit, CURRENCY, TTL, VIDEO, BANNER);
|
|
97
67
|
bidResponses.push(bidResponse);
|
|
98
68
|
});
|
|
99
69
|
}
|
|
@@ -103,20 +73,20 @@ export const spec = {
|
|
|
103
73
|
getUserSyncs: function (syncOptions, serverResponses) {
|
|
104
74
|
const syncs = [];
|
|
105
75
|
for (const response of serverResponses) {
|
|
106
|
-
if (syncOptions.iframeEnabled && response
|
|
76
|
+
if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
|
|
107
77
|
syncs.push({
|
|
108
78
|
type: 'iframe',
|
|
109
|
-
url: response
|
|
79
|
+
url: deepAccess(response, 'body.params.userSyncURL')
|
|
110
80
|
});
|
|
111
81
|
}
|
|
112
|
-
if (syncOptions.pixelEnabled && isArray(response
|
|
82
|
+
if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
|
|
113
83
|
const pixels = response.body.params.userSyncPixels.map(pixel => {
|
|
114
84
|
return {
|
|
115
85
|
type: 'image',
|
|
116
86
|
url: pixel
|
|
117
87
|
}
|
|
118
|
-
})
|
|
119
|
-
syncs.push(...pixels)
|
|
88
|
+
});
|
|
89
|
+
syncs.push(...pixels);
|
|
120
90
|
}
|
|
121
91
|
}
|
|
122
92
|
return syncs;
|
|
@@ -134,317 +104,3 @@ export const spec = {
|
|
|
134
104
|
};
|
|
135
105
|
|
|
136
106
|
registerBidder(spec);
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Get floor price
|
|
140
|
-
* @param bid {bid}
|
|
141
|
-
* @returns {Number}
|
|
142
|
-
*/
|
|
143
|
-
function getFloor(bid, mediaType) {
|
|
144
|
-
if (!isFn(bid.getFloor)) {
|
|
145
|
-
return 0;
|
|
146
|
-
}
|
|
147
|
-
let floorResult = bid.getFloor({
|
|
148
|
-
currency: CURRENCY,
|
|
149
|
-
mediaType: mediaType,
|
|
150
|
-
size: '*'
|
|
151
|
-
});
|
|
152
|
-
return floorResult.currency === CURRENCY && floorResult.floor ? floorResult.floor : 0;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Get the the ad sizes array from the bid
|
|
157
|
-
* @param bid {bid}
|
|
158
|
-
* @returns {Array}
|
|
159
|
-
*/
|
|
160
|
-
function getSizesArray(bid, mediaType) {
|
|
161
|
-
let sizesArray = []
|
|
162
|
-
|
|
163
|
-
if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
|
|
164
|
-
sizesArray = bid.mediaTypes[mediaType].sizes;
|
|
165
|
-
} else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
|
|
166
|
-
sizesArray = bid.sizes;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return sizesArray;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Get schain string value
|
|
174
|
-
* @param schainObject {Object}
|
|
175
|
-
* @returns {string}
|
|
176
|
-
*/
|
|
177
|
-
function getSupplyChain(schainObject) {
|
|
178
|
-
if (isEmpty(schainObject)) {
|
|
179
|
-
return '';
|
|
180
|
-
}
|
|
181
|
-
let scStr = `${schainObject.ver},${schainObject.complete}`;
|
|
182
|
-
schainObject.nodes.forEach((node) => {
|
|
183
|
-
scStr += '!';
|
|
184
|
-
scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
|
|
185
|
-
scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
|
|
186
|
-
scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
|
|
187
|
-
scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
|
|
188
|
-
scStr += `${getEncodedValIfNotEmpty(node.name)},`;
|
|
189
|
-
scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
|
|
190
|
-
});
|
|
191
|
-
return scStr;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Get encoded node value
|
|
196
|
-
* @param val {string}
|
|
197
|
-
* @returns {string}
|
|
198
|
-
*/
|
|
199
|
-
function getEncodedValIfNotEmpty(val) {
|
|
200
|
-
return !isEmpty(val) ? encodeURIComponent(val) : '';
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Get preferred user-sync method based on publisher configuration
|
|
205
|
-
* @param bidderCode {string}
|
|
206
|
-
* @returns {string}
|
|
207
|
-
*/
|
|
208
|
-
function getAllowedSyncMethod(filterSettings, bidderCode) {
|
|
209
|
-
const iframeConfigsToCheck = ['all', 'iframe'];
|
|
210
|
-
const pixelConfigToCheck = 'image';
|
|
211
|
-
if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
|
|
212
|
-
return SUPPORTED_SYNC_METHODS.IFRAME;
|
|
213
|
-
}
|
|
214
|
-
if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
|
|
215
|
-
return SUPPORTED_SYNC_METHODS.PIXEL;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Check if sync rule is supported
|
|
221
|
-
* @param syncRule {Object}
|
|
222
|
-
* @param bidderCode {string}
|
|
223
|
-
* @returns {boolean}
|
|
224
|
-
*/
|
|
225
|
-
function isSyncMethodAllowed(syncRule, bidderCode) {
|
|
226
|
-
if (!syncRule) {
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
const isInclude = syncRule.filter === 'include';
|
|
230
|
-
const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
|
|
231
|
-
return isInclude && contains(bidders, bidderCode);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Get the seller endpoint
|
|
236
|
-
* @param testMode {boolean}
|
|
237
|
-
* @returns {string}
|
|
238
|
-
*/
|
|
239
|
-
function getEndpoint(testMode) {
|
|
240
|
-
return testMode
|
|
241
|
-
? SELLER_ENDPOINT + MODES.TEST
|
|
242
|
-
: SELLER_ENDPOINT + MODES.PRODUCTION;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* get device type
|
|
247
|
-
* @param uad {ua}
|
|
248
|
-
* @returns {string}
|
|
249
|
-
*/
|
|
250
|
-
function getDeviceType(ua) {
|
|
251
|
-
if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
|
|
252
|
-
.test(ua.toLowerCase())) {
|
|
253
|
-
return '5';
|
|
254
|
-
}
|
|
255
|
-
if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
|
|
256
|
-
.test(ua.toLowerCase())) {
|
|
257
|
-
return '4';
|
|
258
|
-
}
|
|
259
|
-
if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
|
|
260
|
-
.test(ua.toLowerCase())) {
|
|
261
|
-
return '3';
|
|
262
|
-
}
|
|
263
|
-
return '1';
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
function generateBidsParams(validBidRequests, bidderRequest) {
|
|
267
|
-
const bidsArray = [];
|
|
268
|
-
|
|
269
|
-
if (validBidRequests.length) {
|
|
270
|
-
validBidRequests.forEach(bid => {
|
|
271
|
-
bidsArray.push(generateBidParameters(bid, bidderRequest));
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
return bidsArray;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Generate bid specific parameters
|
|
280
|
-
* @param {bid} bid
|
|
281
|
-
* @param {bidderRequest} bidderRequest
|
|
282
|
-
* @returns {Object} bid specific params object
|
|
283
|
-
*/
|
|
284
|
-
function generateBidParameters(bid, bidderRequest) {
|
|
285
|
-
const {params} = bid;
|
|
286
|
-
const mediaType = isBanner(bid) ? BANNER : VIDEO;
|
|
287
|
-
const sizesArray = getSizesArray(bid, mediaType);
|
|
288
|
-
|
|
289
|
-
// fix floor price in case of NAN
|
|
290
|
-
if (isNaN(params.floorPrice)) {
|
|
291
|
-
params.floorPrice = 0;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const bidObject = {
|
|
295
|
-
mediaType,
|
|
296
|
-
adUnitCode: getBidIdParameter('adUnitCode', bid),
|
|
297
|
-
sizes: sizesArray,
|
|
298
|
-
floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
|
|
299
|
-
bidId: getBidIdParameter('bidId', bid),
|
|
300
|
-
bidderRequestId: getBidIdParameter('bidderRequestId', bid),
|
|
301
|
-
transactionId: bid.ortb2Imp?.ext?.tid || '',
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
|
|
305
|
-
if (pos) {
|
|
306
|
-
bidObject.pos = pos;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
|
|
310
|
-
if (gpid) {
|
|
311
|
-
bidObject.gpid = gpid;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
|
|
315
|
-
if (placementId) {
|
|
316
|
-
bidObject.placementId = placementId;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
if (mediaType === VIDEO) {
|
|
320
|
-
const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
|
|
321
|
-
let playbackMethodValue;
|
|
322
|
-
|
|
323
|
-
// verify playbackMethod is of type integer array, or integer only.
|
|
324
|
-
if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
|
|
325
|
-
// only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
|
|
326
|
-
playbackMethodValue = playbackMethod[0];
|
|
327
|
-
} else if (isInteger(playbackMethod)) {
|
|
328
|
-
playbackMethodValue = playbackMethod;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
if (playbackMethodValue) {
|
|
332
|
-
bidObject.playbackMethod = playbackMethodValue;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
const placement = deepAccess(bid, `mediaTypes.video.placement`);
|
|
336
|
-
if (placement) {
|
|
337
|
-
bidObject.placement = placement;
|
|
338
|
-
}
|
|
339
|
-
const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
|
|
340
|
-
if (plcmt) {
|
|
341
|
-
bidObject.plcmt = plcmt;
|
|
342
|
-
}
|
|
343
|
-
const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
|
|
344
|
-
if (minDuration) {
|
|
345
|
-
bidObject.minDuration = minDuration;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
|
|
349
|
-
if (maxDuration) {
|
|
350
|
-
bidObject.maxDuration = maxDuration;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
const skip = deepAccess(bid, `mediaTypes.video.skip`);
|
|
354
|
-
if (skip) {
|
|
355
|
-
bidObject.skip = skip;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
|
|
359
|
-
if (linearity) {
|
|
360
|
-
bidObject.linearity = linearity;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
return bidObject;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
function isBanner(bid) {
|
|
368
|
-
return bid.mediaTypes && bid.mediaTypes.banner;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Generate params that are common between all bids
|
|
373
|
-
* @param {single bid object} generalObject
|
|
374
|
-
* @param {bidderRequest} bidderRequest
|
|
375
|
-
* @returns {object} the common params object
|
|
376
|
-
*/
|
|
377
|
-
function generateGeneralParams(generalObject, bidderRequest) {
|
|
378
|
-
const domain = window.location.hostname;
|
|
379
|
-
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
|
|
380
|
-
const {bidderCode} = bidderRequest;
|
|
381
|
-
const generalBidParams = generalObject.params;
|
|
382
|
-
const timeout = bidderRequest.timeout;
|
|
383
|
-
|
|
384
|
-
// these params are snake_case instead of camelCase to allow backwards compatability on the server.
|
|
385
|
-
// in the future, these will be converted to camelCase to match our convention.
|
|
386
|
-
const generalParams = {
|
|
387
|
-
wrapper_type: 'prebidjs',
|
|
388
|
-
wrapper_vendor: '$$PREBID_GLOBAL$$',
|
|
389
|
-
wrapper_version: '$prebid.version$',
|
|
390
|
-
adapter_version: ADAPTER_VERSION,
|
|
391
|
-
auction_start: timestamp(),
|
|
392
|
-
publisher_id: generalBidParams.org,
|
|
393
|
-
publisher_name: domain,
|
|
394
|
-
site_domain: domain,
|
|
395
|
-
dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
|
|
396
|
-
device_type: getDeviceType(navigator.userAgent),
|
|
397
|
-
ua: navigator.userAgent,
|
|
398
|
-
session_id: getBidIdParameter('auctionId', generalObject),
|
|
399
|
-
tmax: timeout
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
const userIdsParam = getBidIdParameter('userId', generalObject);
|
|
403
|
-
if (userIdsParam) {
|
|
404
|
-
generalParams.userIds = JSON.stringify(userIdsParam);
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const ortb2Metadata = bidderRequest.ortb2 || {};
|
|
408
|
-
if (ortb2Metadata.site) {
|
|
409
|
-
generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
|
|
410
|
-
}
|
|
411
|
-
if (ortb2Metadata.user) {
|
|
412
|
-
generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
if (syncEnabled) {
|
|
416
|
-
const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
|
|
417
|
-
if (allowedSyncMethod) {
|
|
418
|
-
generalParams.cs_method = allowedSyncMethod;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
if (bidderRequest.uspConsent) {
|
|
423
|
-
generalParams.us_privacy = bidderRequest.uspConsent;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
|
|
427
|
-
generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
|
|
428
|
-
generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
if (generalBidParams.ifa) {
|
|
432
|
-
generalParams.ifa = generalBidParams.ifa;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
if (generalObject.schain) {
|
|
436
|
-
generalParams.schain = getSupplyChain(generalObject.schain);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
if (bidderRequest.ortb2 && bidderRequest.ortb2.site) {
|
|
440
|
-
generalParams.referrer = bidderRequest.ortb2.site.ref;
|
|
441
|
-
generalParams.page_url = bidderRequest.ortb2.site.page;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
if (bidderRequest && bidderRequest.refererInfo) {
|
|
445
|
-
generalParams.referrer = generalParams.referrer || deepAccess(bidderRequest, 'refererInfo.referer');
|
|
446
|
-
generalParams.page_url = generalParams.page_url || config.getConfig('pageUrl') || deepAccess(window, 'location.href');
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
return generalParams;
|
|
450
|
-
}
|
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
import {deepAccess, isFn, logError, logMessage} from '../src/utils.js';
|
|
2
1
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
2
|
import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import {
|
|
4
|
+
buildPlacementProcessingFunction,
|
|
5
|
+
buildRequestsBase,
|
|
6
|
+
interpretResponseBuilder,
|
|
7
|
+
isBidRequestValid
|
|
8
|
+
} from '../libraries/teqblazeUtils/bidderUtils.js';
|
|
6
9
|
|
|
7
10
|
const BIDDER_CODE = 'smarthub';
|
|
8
11
|
const ALIASES = [
|
|
9
12
|
{code: 'markapp', skipPbsAliasing: true},
|
|
10
13
|
{code: 'jdpmedia', skipPbsAliasing: true},
|
|
11
14
|
{code: 'tredio', skipPbsAliasing: true},
|
|
15
|
+
{code: 'vimayx', skipPbsAliasing: true},
|
|
12
16
|
];
|
|
13
17
|
const BASE_URLS = {
|
|
14
18
|
smarthub: 'https://prebid.smart-hub.io/pbjs',
|
|
15
19
|
markapp: 'https://markapp-prebid.smart-hub.io/pbjs',
|
|
16
20
|
jdpmedia: 'https://jdpmedia-prebid.smart-hub.io/pbjs',
|
|
17
|
-
tredio: 'https://tredio-prebid.smart-hub.io/pbjs'
|
|
21
|
+
tredio: 'https://tredio-prebid.smart-hub.io/pbjs',
|
|
22
|
+
vimayx: 'https://vimayx-prebid.smart-hub.io/pbjs',
|
|
18
23
|
};
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
const _getUrl = (partnerName) => {
|
|
21
26
|
const aliases = ALIASES.map(el => el.code);
|
|
22
27
|
if (aliases.includes(partnerName)) {
|
|
23
28
|
return BASE_URLS[partnerName];
|
|
@@ -26,187 +31,50 @@ function getUrl(partnerName) {
|
|
|
26
31
|
return `${BASE_URLS[BIDDER_CODE]}?partnerName=${partnerName}`;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function getPlacementReqData(bid) {
|
|
46
|
-
const { params, bidId, mediaTypes, bidder } = bid;
|
|
47
|
-
const schain = bid.schain || {};
|
|
48
|
-
const { partnerName, seat, token, iabCat, minBidfloor, pos } = params;
|
|
49
|
-
const bidfloor = getBidFloor(bid);
|
|
50
|
-
|
|
51
|
-
const plcmt = {
|
|
52
|
-
partnerName: String(partnerName || bidder).toLowerCase(),
|
|
53
|
-
seat,
|
|
54
|
-
token,
|
|
55
|
-
iabCat,
|
|
56
|
-
minBidfloor,
|
|
57
|
-
pos,
|
|
58
|
-
bidId,
|
|
59
|
-
schain,
|
|
60
|
-
bidfloor,
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
if (mediaTypes && mediaTypes[BANNER]) {
|
|
64
|
-
plcmt.adFormat = BANNER;
|
|
65
|
-
plcmt.sizes = mediaTypes[BANNER].sizes;
|
|
66
|
-
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
67
|
-
plcmt.adFormat = VIDEO;
|
|
68
|
-
plcmt.playerSize = mediaTypes[VIDEO].playerSize;
|
|
69
|
-
plcmt.minduration = mediaTypes[VIDEO].minduration;
|
|
70
|
-
plcmt.maxduration = mediaTypes[VIDEO].maxduration;
|
|
71
|
-
plcmt.mimes = mediaTypes[VIDEO].mimes;
|
|
72
|
-
plcmt.protocols = mediaTypes[VIDEO].protocols;
|
|
73
|
-
plcmt.startdelay = mediaTypes[VIDEO].startdelay;
|
|
74
|
-
plcmt.placement = mediaTypes[VIDEO].plcmt;
|
|
75
|
-
plcmt.plcmt = mediaTypes[VIDEO].plcmt; // https://github.com/prebid/Prebid.js/issues/10452
|
|
76
|
-
plcmt.skip = mediaTypes[VIDEO].skip;
|
|
77
|
-
plcmt.skipafter = mediaTypes[VIDEO].skipafter;
|
|
78
|
-
plcmt.minbitrate = mediaTypes[VIDEO].minbitrate;
|
|
79
|
-
plcmt.maxbitrate = mediaTypes[VIDEO].maxbitrate;
|
|
80
|
-
plcmt.delivery = mediaTypes[VIDEO].delivery;
|
|
81
|
-
plcmt.playbackmethod = mediaTypes[VIDEO].playbackmethod;
|
|
82
|
-
plcmt.api = mediaTypes[VIDEO].api;
|
|
83
|
-
plcmt.linearity = mediaTypes[VIDEO].linearity;
|
|
84
|
-
} else if (mediaTypes && mediaTypes[NATIVE]) {
|
|
85
|
-
plcmt.native = mediaTypes[NATIVE];
|
|
86
|
-
plcmt.adFormat = NATIVE;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return plcmt;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function getBidFloor(bid) {
|
|
93
|
-
if (!isFn(bid.getFloor)) {
|
|
94
|
-
return deepAccess(bid, 'params.bidfloor', 0);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
const bidFloor = bid.getFloor({
|
|
99
|
-
currency: 'USD',
|
|
100
|
-
mediaType: '*',
|
|
101
|
-
size: '*',
|
|
34
|
+
const getPartnerName = (bid) => String(bid.params?.partnerName || bid.bidder).toLowerCase();
|
|
35
|
+
|
|
36
|
+
const getPlacementReqData = buildPlacementProcessingFunction({
|
|
37
|
+
addPlacementType() {},
|
|
38
|
+
addCustomFieldsToPlacement(bid, bidderRequest, placement) {
|
|
39
|
+
const { seat, token, iabCat, minBidfloor, pos } = bid.params;
|
|
40
|
+
Object.assign(placement, {
|
|
41
|
+
partnerName: getPartnerName(bid),
|
|
42
|
+
seat,
|
|
43
|
+
token,
|
|
44
|
+
iabCat,
|
|
45
|
+
minBidfloor,
|
|
46
|
+
pos,
|
|
102
47
|
});
|
|
103
|
-
return bidFloor.floor;
|
|
104
|
-
} catch (e) {
|
|
105
|
-
logError(e);
|
|
106
|
-
return 0;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function buildRequestParams(bidderRequest = {}, placements = []) {
|
|
111
|
-
let deviceWidth = 0;
|
|
112
|
-
let deviceHeight = 0;
|
|
113
|
-
|
|
114
|
-
let winLocation;
|
|
115
|
-
try {
|
|
116
|
-
const winTop = window.top;
|
|
117
|
-
deviceWidth = winTop.screen.width;
|
|
118
|
-
deviceHeight = winTop.screen.height;
|
|
119
|
-
winLocation = winTop.location;
|
|
120
|
-
} catch (e) {
|
|
121
|
-
logMessage(e);
|
|
122
|
-
winLocation = window.location;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const refferUrl = bidderRequest.refererInfo && bidderRequest.refererInfo.page;
|
|
126
|
-
let refferLocation;
|
|
127
|
-
try {
|
|
128
|
-
refferLocation = refferUrl && new URL(refferUrl);
|
|
129
|
-
} catch (e) {
|
|
130
|
-
logMessage(e);
|
|
131
48
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
gdpr: bidderRequest.gdprConsent || undefined,
|
|
149
|
-
tmax: bidderRequest.timeout
|
|
150
|
-
};
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
const buildRequests = (validBidRequests = [], bidderRequest = {}) => {
|
|
52
|
+
const bidsByPartner = validBidRequests.reduce((bidsByPartner, bid) => {
|
|
53
|
+
const partner = getPartnerName(bid);
|
|
54
|
+
(bidsByPartner[partner] = bidsByPartner[partner] || []).push(bid);
|
|
55
|
+
return bidsByPartner;
|
|
56
|
+
}, {});
|
|
57
|
+
return Object.entries(bidsByPartner).map(([partner, validBidRequests]) => {
|
|
58
|
+
return buildRequestsBase({
|
|
59
|
+
adUrl: _getUrl(partner),
|
|
60
|
+
bidderRequest,
|
|
61
|
+
validBidRequests,
|
|
62
|
+
placementProcessingFunction: getPlacementReqData
|
|
63
|
+
})
|
|
64
|
+
})
|
|
151
65
|
}
|
|
152
66
|
|
|
153
67
|
export const spec = {
|
|
154
68
|
code: BIDDER_CODE,
|
|
155
69
|
aliases: ALIASES,
|
|
156
70
|
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if (mediaTypes && mediaTypes[BANNER]) {
|
|
163
|
-
valid = valid && Boolean(mediaTypes[BANNER] && mediaTypes[BANNER].sizes);
|
|
164
|
-
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
165
|
-
valid = valid && Boolean(mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize);
|
|
166
|
-
} else if (mediaTypes && mediaTypes[NATIVE]) {
|
|
167
|
-
valid = valid && Boolean(mediaTypes[NATIVE]);
|
|
168
|
-
} else {
|
|
169
|
-
valid = false;
|
|
71
|
+
isBidRequestValid: isBidRequestValid(['seat', 'token'], 'every'),
|
|
72
|
+
buildRequests,
|
|
73
|
+
interpretResponse: interpretResponseBuilder({
|
|
74
|
+
addtlBidValidation(bid) {
|
|
75
|
+
return bid.hasOwnProperty('netRevenue')
|
|
170
76
|
}
|
|
171
|
-
|
|
172
|
-
},
|
|
173
|
-
|
|
174
|
-
buildRequests: (validBidRequests = [], bidderRequest = {}) => {
|
|
175
|
-
// convert Native ORTB definition to old-style prebid native definition
|
|
176
|
-
validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
|
|
177
|
-
const tempObj = {};
|
|
178
|
-
|
|
179
|
-
const len = validBidRequests.length;
|
|
180
|
-
for (let i = 0; i < len; i++) {
|
|
181
|
-
const bid = validBidRequests[i];
|
|
182
|
-
const data = getPlacementReqData(bid);
|
|
183
|
-
tempObj[data.partnerName] = tempObj[data.partnerName] || [];
|
|
184
|
-
tempObj[data.partnerName].push(data);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return Object.keys(tempObj).map(key => {
|
|
188
|
-
const request = buildRequestParams(bidderRequest, tempObj[key]);
|
|
189
|
-
return {
|
|
190
|
-
method: 'POST',
|
|
191
|
-
url: getUrl(key),
|
|
192
|
-
data: request,
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
},
|
|
196
|
-
|
|
197
|
-
interpretResponse: (serverResponse) => {
|
|
198
|
-
let response = [];
|
|
199
|
-
for (let i = 0; i < serverResponse.body.length; i++) {
|
|
200
|
-
let resItem = serverResponse.body[i];
|
|
201
|
-
if (isBidResponseValid(resItem)) {
|
|
202
|
-
const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : [];
|
|
203
|
-
resItem.meta = { ...resItem.meta, advertiserDomains };
|
|
204
|
-
|
|
205
|
-
response.push(resItem);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return response;
|
|
209
|
-
}
|
|
77
|
+
})
|
|
210
78
|
};
|
|
211
79
|
|
|
212
80
|
registerBidder(spec);
|