prebid.js 7.36.0 → 7.37.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/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.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/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.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/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.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/discoveryBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/incrxBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/livewrappedBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.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/mediagoBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -0
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +124 -123
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/proxistoreBidAdapter.js +1 -1
- package/dist/publinkIdSystem.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/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- 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/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/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.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/vidazooBidAdapter.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/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/modules/adagioBidAdapter.js +14 -14
- package/modules/adagioBidAdapter.md +3 -1
- package/modules/criteoBidAdapter.js +4 -5
- package/modules/cwireBidAdapter.md +9 -3
- package/modules/discoveryBidAdapter.js +22 -12
- package/modules/incrxBidAdapter.js +2 -0
- package/modules/kueezRtbBidAdapter.js +54 -20
- package/modules/livewrappedBidAdapter.js +28 -16
- package/modules/mediagoBidAdapter.js +22 -17
- package/modules/minutemediaplusBidAdapter.js +291 -0
- package/modules/minutemediaplusBidAdapter.md +35 -0
- package/modules/nextMillenniumBidAdapter.js +9 -1
- package/modules/prebidServerBidAdapter/ortbConverter.js +6 -0
- package/modules/proxistoreBidAdapter.js +2 -2
- package/modules/pubxaiAnalyticsAdapter.js +2 -2
- package/modules/sonobiBidAdapter.js +1 -10
- package/modules/tripleliftBidAdapter.js +4 -0
- package/modules/yieldmoBidAdapter.js +1 -0
- package/package.json +1 -1
- package/src/adapterManager.js +30 -14
- package/src/utils.js +1 -1
- package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
- package/test/spec/modules/criteoBidAdapter_spec.js +24 -1
- package/test/spec/modules/incrxBidAdapter_spec.js +4 -0
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +63 -22
- package/test/spec/modules/livewrappedBidAdapter_spec.js +267 -2
- package/test/spec/modules/minutemediaplusBidAdapter_spec.js +519 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +11 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +56 -0
- package/test/spec/modules/proxistoreBidAdapter_spec.js +2 -2
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +3 -1
- package/test/spec/modules/sonobiBidAdapter_spec.js +3 -25
- package/test/spec/modules/tripleliftBidAdapter_spec.js +7 -0
- package/test/spec/unit/core/adapterManager_spec.js +147 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {deepAccess, getWindowTop, isSafariBrowser, mergeDeep} from '../src/utils.js';
|
|
1
|
+
import {deepAccess, getWindowTop, isSafariBrowser, mergeDeep, isFn, isPlainObject} from '../src/utils.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {config} from '../src/config.js';
|
|
4
4
|
import {find} from '../src/polyfill.js';
|
|
@@ -68,7 +68,9 @@ export const spec = {
|
|
|
68
68
|
bidUrl = bidUrl ? bidUrl.params.bidUrl : URL;
|
|
69
69
|
url = url ? url.params.url : (getAppDomain() || getTopWindowLocation(bidderRequest));
|
|
70
70
|
test = test ? test.params.test : undefined;
|
|
71
|
-
|
|
71
|
+
const currency = config.getConfig('currency.adServerCurrency') || 'USD';
|
|
72
|
+
var adRequests = bidRequests.map(b => bidToAdRequest(b, currency));
|
|
73
|
+
const adRequestsContainFloors = adRequests.some(r => r.flr !== undefined);
|
|
72
74
|
|
|
73
75
|
if (eids) {
|
|
74
76
|
ortb2 = mergeDeep(mergeDeep({}, ortb2 || {}), eids);
|
|
@@ -96,7 +98,8 @@ export const spec = {
|
|
|
96
98
|
rcv: getAdblockerRecovered(),
|
|
97
99
|
adRequests: [...adRequests],
|
|
98
100
|
rtbData: ortb2,
|
|
99
|
-
schain: schain
|
|
101
|
+
schain: schain,
|
|
102
|
+
flrCur: adRequestsContainFloors ? currency : undefined
|
|
100
103
|
};
|
|
101
104
|
|
|
102
105
|
if (config.getConfig().debug) {
|
|
@@ -223,13 +226,14 @@ function hasPubcid(bid) {
|
|
|
223
226
|
return !!bid.crumbs && !!bid.crumbs.pubcid;
|
|
224
227
|
}
|
|
225
228
|
|
|
226
|
-
function bidToAdRequest(bid) {
|
|
229
|
+
function bidToAdRequest(bid, currency) {
|
|
227
230
|
var adRequest = {
|
|
228
231
|
adUnitId: bid.params.adUnitId,
|
|
229
232
|
callerAdUnitId: bid.params.adUnitName || bid.adUnitCode || bid.placementCode,
|
|
230
233
|
bidId: bid.bidId,
|
|
231
234
|
transactionId: bid.transactionId,
|
|
232
235
|
formats: getSizes(bid).map(sizeToFormat),
|
|
236
|
+
flr: getBidFloor(bid, currency),
|
|
233
237
|
options: bid.params.options
|
|
234
238
|
};
|
|
235
239
|
|
|
@@ -264,6 +268,22 @@ function sizeToFormat(size) {
|
|
|
264
268
|
}
|
|
265
269
|
}
|
|
266
270
|
|
|
271
|
+
function getBidFloor(bid, currency) {
|
|
272
|
+
if (!isFn(bid.getFloor)) {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const floor = bid.getFloor({
|
|
277
|
+
currency: currency,
|
|
278
|
+
mediaType: '*',
|
|
279
|
+
size: '*'
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
return isPlainObject(floor) && !isNaN(floor.floor) && floor.currency == currency
|
|
283
|
+
? floor.floor
|
|
284
|
+
: undefined;
|
|
285
|
+
}
|
|
286
|
+
|
|
267
287
|
function getAdblockerRecovered() {
|
|
268
288
|
try {
|
|
269
289
|
return getWindowTop().I12C && getWindowTop().I12C.Morph === 1;
|
|
@@ -302,21 +322,13 @@ function getDeviceIfa() {
|
|
|
302
322
|
}
|
|
303
323
|
|
|
304
324
|
function getDeviceWidth() {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
return device.width;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
return window.innerWidth;
|
|
325
|
+
const device = config.getConfig('device') || {};
|
|
326
|
+
return device.w || window.innerWidth;
|
|
311
327
|
}
|
|
312
328
|
|
|
313
329
|
function getDeviceHeight() {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
return device.height;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
return window.innerHeight;
|
|
330
|
+
const device = config.getConfig('device') || {};
|
|
331
|
+
return device.h || window.innerHeight;
|
|
320
332
|
}
|
|
321
333
|
|
|
322
334
|
function getCoppa() {
|
|
@@ -148,12 +148,12 @@ function isMobileAndTablet() {
|
|
|
148
148
|
*/
|
|
149
149
|
// function getBidFloor(bid, mediaType, sizes) {
|
|
150
150
|
// var floor;
|
|
151
|
-
// var size = sizes.length === 1 ? sizes[0] :
|
|
152
|
-
// if (typeof bid.getFloor ===
|
|
153
|
-
// const floorInfo = bid.getFloor({ currency:
|
|
151
|
+
// var size = sizes.length === 1 ? sizes[0] : '*';
|
|
152
|
+
// if (typeof bid.getFloor === 'function') {
|
|
153
|
+
// const floorInfo = bid.getFloor({ currency: 'USD', mediaType, size });
|
|
154
154
|
// if (
|
|
155
|
-
// typeof floorInfo ===
|
|
156
|
-
// floorInfo.currency ===
|
|
155
|
+
// typeof floorInfo === 'object' &&
|
|
156
|
+
// floorInfo.currency === 'USD' &&
|
|
157
157
|
// !isNaN(parseFloat(floorInfo.floor))
|
|
158
158
|
// ) {
|
|
159
159
|
// floor = parseFloat(floorInfo.floor);
|
|
@@ -255,7 +255,6 @@ function getItems(validBidRequests, bidderRequest) {
|
|
|
255
255
|
// utils.deepAccess(req, 'ortb2Imp.ext.gpid') ||
|
|
256
256
|
// utils.deepAccess(req, 'ortb2Imp.ext.data.pbadslot') ||
|
|
257
257
|
// utils.deepAccess(req, 'params.placementId', 0);
|
|
258
|
-
// console.log("wjh getItems:", req, bidFloor, gpid);
|
|
259
258
|
|
|
260
259
|
// if (mediaTypes.native) {}
|
|
261
260
|
// banner广告类型
|
|
@@ -270,7 +269,7 @@ function getItems(validBidRequests, bidderRequest) {
|
|
|
270
269
|
pos: 1,
|
|
271
270
|
},
|
|
272
271
|
ext: {
|
|
273
|
-
|
|
272
|
+
// gpid: gpid, // 加入后无法返回广告
|
|
274
273
|
},
|
|
275
274
|
};
|
|
276
275
|
itemMaps[id] = {
|
|
@@ -296,6 +295,8 @@ function getParam(validBidRequests, bidderRequest) {
|
|
|
296
295
|
const sharedid =
|
|
297
296
|
utils.deepAccess(validBidRequests[0], 'userId.sharedid.id') ||
|
|
298
297
|
utils.deepAccess(validBidRequests[0], 'userId.pubcid');
|
|
298
|
+
const eids = validBidRequests[0].userIdAsEids || validBidRequests[0].userId;
|
|
299
|
+
|
|
299
300
|
let isMobile = isMobileAndTablet() ? 1 : 0;
|
|
300
301
|
// input test status by Publisher. more frequently for test true req
|
|
301
302
|
let isTest = validBidRequests[0].params.test || 0;
|
|
@@ -318,19 +319,23 @@ function getParam(validBidRequests, bidderRequest) {
|
|
|
318
319
|
cur: ['USD'],
|
|
319
320
|
device: {
|
|
320
321
|
connectiontype: 0,
|
|
321
|
-
// ip: '
|
|
322
|
+
// ip: '98.61.5.0',
|
|
322
323
|
js: 1,
|
|
323
|
-
// language:
|
|
324
|
-
// os:
|
|
325
|
-
// ua:
|
|
324
|
+
// language: 'en',
|
|
325
|
+
// os: 'Microsoft Windows',
|
|
326
|
+
// ua: 'Mozilla/5.0 (Linux; Android 12; SM-G970U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36',
|
|
326
327
|
os: navigator.platform || '',
|
|
327
328
|
ua: navigator.userAgent,
|
|
328
329
|
language: /en/.test(navigator.language) ? 'en' : navigator.language,
|
|
329
330
|
},
|
|
330
|
-
ext: {
|
|
331
|
+
ext: {
|
|
332
|
+
eids,
|
|
333
|
+
},
|
|
331
334
|
user: {
|
|
332
|
-
|
|
335
|
+
buyeruid: getUserID(),
|
|
336
|
+
id: sharedid || pubcid,
|
|
333
337
|
},
|
|
338
|
+
eids,
|
|
334
339
|
site: {
|
|
335
340
|
name: domain,
|
|
336
341
|
domain: domain,
|
|
@@ -420,12 +425,12 @@ export const spec = {
|
|
|
420
425
|
nurl: getProperty(bid, 'nurl'),
|
|
421
426
|
// adserverTargeting: {
|
|
422
427
|
// granularityMultiplier: 0.1,
|
|
423
|
-
// priceGranularity:
|
|
424
|
-
// pbMg:
|
|
428
|
+
// priceGranularity: 'pbHg',
|
|
429
|
+
// pbMg: '0.01',
|
|
425
430
|
// },
|
|
426
|
-
// pbMg:
|
|
431
|
+
// pbMg: '0.01',
|
|
427
432
|
// granularityMultiplier: 0.1,
|
|
428
|
-
// priceGranularity:
|
|
433
|
+
// priceGranularity: 'pbHg',
|
|
429
434
|
};
|
|
430
435
|
bidResponses.push(bidResponse);
|
|
431
436
|
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { _each, deepAccess, parseSizesInput, parseUrl, uniques, isFn } from '../src/utils.js';
|
|
2
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
4
|
+
import { getStorageManager } from '../src/storageManager.js';
|
|
5
|
+
|
|
6
|
+
const GVLID = 918;
|
|
7
|
+
const DEFAULT_SUB_DOMAIN = 'exchange';
|
|
8
|
+
const BIDDER_CODE = 'mmplus';
|
|
9
|
+
const BIDDER_VERSION = '1.0.0';
|
|
10
|
+
const CURRENCY = 'USD';
|
|
11
|
+
const TTL_SECONDS = 60 * 5;
|
|
12
|
+
const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 15;
|
|
13
|
+
export const SUPPORTED_ID_SYSTEMS = {
|
|
14
|
+
'britepoolid': 1,
|
|
15
|
+
'criteoId': 1,
|
|
16
|
+
'id5id': 1,
|
|
17
|
+
'idl_env': 1,
|
|
18
|
+
'lipb': 1,
|
|
19
|
+
'netId': 1,
|
|
20
|
+
'parrableId': 1,
|
|
21
|
+
'pubcid': 1,
|
|
22
|
+
'tdid': 1,
|
|
23
|
+
'pubProvidedId': 1
|
|
24
|
+
};
|
|
25
|
+
const storage = getStorageManager({ gvlid: GVLID, bidderCode: BIDDER_CODE });
|
|
26
|
+
|
|
27
|
+
function getTopWindowQueryParams() {
|
|
28
|
+
try {
|
|
29
|
+
const parsedUrl = parseUrl(window.top.document.URL, { decodeSearchAsString: true });
|
|
30
|
+
return parsedUrl.search;
|
|
31
|
+
} catch (e) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function createDomain(subDomain = DEFAULT_SUB_DOMAIN) {
|
|
37
|
+
return `https://${subDomain}.minutemedia-prebid.com`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function extractCID(params) {
|
|
41
|
+
return params.cId || params.CID || params.cID || params.CId || params.cid || params.ciD || params.Cid || params.CiD;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function extractPID(params) {
|
|
45
|
+
return params.pId || params.PID || params.pID || params.PId || params.pid || params.piD || params.Pid || params.PiD;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function extractSubDomain(params) {
|
|
49
|
+
return params.subDomain || params.SubDomain || params.Subdomain || params.subdomain || params.SUBDOMAIN || params.subDOMAIN;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function isBidRequestValid(bid) {
|
|
53
|
+
const params = bid.params || {};
|
|
54
|
+
return !!(extractCID(params) && extractPID(params));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
|
|
58
|
+
const { params, bidId, userId, adUnitCode, schain, mediaTypes } = bid;
|
|
59
|
+
let { bidFloor, ext } = params;
|
|
60
|
+
const hashUrl = hashCode(topWindowUrl);
|
|
61
|
+
const uniqueDealId = getUniqueDealId(hashUrl);
|
|
62
|
+
const cId = extractCID(params);
|
|
63
|
+
const pId = extractPID(params);
|
|
64
|
+
const subDomain = extractSubDomain(params);
|
|
65
|
+
|
|
66
|
+
if (isFn(bid.getFloor)) {
|
|
67
|
+
const floorInfo = bid.getFloor({
|
|
68
|
+
currency: 'USD',
|
|
69
|
+
mediaType: '*',
|
|
70
|
+
size: '*'
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
if (floorInfo.currency === 'USD') {
|
|
74
|
+
bidFloor = floorInfo.floor;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let data = {
|
|
79
|
+
url: encodeURIComponent(topWindowUrl),
|
|
80
|
+
uqs: getTopWindowQueryParams(),
|
|
81
|
+
cb: Date.now(),
|
|
82
|
+
bidFloor: bidFloor,
|
|
83
|
+
bidId: bidId,
|
|
84
|
+
referrer: bidderRequest.refererInfo.ref,
|
|
85
|
+
adUnitCode: adUnitCode,
|
|
86
|
+
publisherId: pId,
|
|
87
|
+
sizes: sizes,
|
|
88
|
+
uniqueDealId: uniqueDealId,
|
|
89
|
+
bidderVersion: BIDDER_VERSION,
|
|
90
|
+
prebidVersion: '$prebid.version$',
|
|
91
|
+
res: `${screen.width}x${screen.height}`,
|
|
92
|
+
schain: schain,
|
|
93
|
+
mediaTypes: mediaTypes
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
appendUserIdsToRequestPayload(data, userId);
|
|
97
|
+
|
|
98
|
+
if (bidderRequest.gdprConsent) {
|
|
99
|
+
if (bidderRequest.gdprConsent.consentString) {
|
|
100
|
+
data.gdprConsent = bidderRequest.gdprConsent.consentString;
|
|
101
|
+
}
|
|
102
|
+
if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
|
|
103
|
+
data.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (bidderRequest.uspConsent) {
|
|
107
|
+
data.usPrivacy = bidderRequest.uspConsent;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const dto = {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
|
|
113
|
+
data: data
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
_each(ext, (value, key) => {
|
|
117
|
+
dto.data['ext.' + key] = value;
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
return dto;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function appendUserIdsToRequestPayload(payloadRef, userIds) {
|
|
124
|
+
let key;
|
|
125
|
+
_each(userIds, (userId, idSystemProviderName) => {
|
|
126
|
+
if (SUPPORTED_ID_SYSTEMS[idSystemProviderName]) {
|
|
127
|
+
key = `uid.${idSystemProviderName}`;
|
|
128
|
+
|
|
129
|
+
switch (idSystemProviderName) {
|
|
130
|
+
case 'digitrustid':
|
|
131
|
+
payloadRef[key] = deepAccess(userId, 'data.id');
|
|
132
|
+
break;
|
|
133
|
+
case 'lipb':
|
|
134
|
+
payloadRef[key] = userId.lipbid;
|
|
135
|
+
break;
|
|
136
|
+
case 'parrableId':
|
|
137
|
+
payloadRef[key] = userId.eid;
|
|
138
|
+
break;
|
|
139
|
+
case 'id5id':
|
|
140
|
+
payloadRef[key] = userId.uid;
|
|
141
|
+
break;
|
|
142
|
+
default:
|
|
143
|
+
payloadRef[key] = userId;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function buildRequests(validBidRequests, bidderRequest) {
|
|
150
|
+
const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
|
|
151
|
+
const requests = [];
|
|
152
|
+
validBidRequests.forEach(validBidRequest => {
|
|
153
|
+
const sizes = parseSizesInput(validBidRequest.sizes);
|
|
154
|
+
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest);
|
|
155
|
+
requests.push(request);
|
|
156
|
+
});
|
|
157
|
+
return requests;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function interpretResponse(serverResponse, request) {
|
|
161
|
+
if (!serverResponse || !serverResponse.body) {
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
const { bidId } = request.data;
|
|
165
|
+
const { results } = serverResponse.body;
|
|
166
|
+
|
|
167
|
+
let output = [];
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
results.forEach(result => {
|
|
171
|
+
const { creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER } = result;
|
|
172
|
+
if (!ad || !price) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const response = {
|
|
177
|
+
requestId: bidId,
|
|
178
|
+
cpm: price,
|
|
179
|
+
width: width,
|
|
180
|
+
height: height,
|
|
181
|
+
creativeId: creativeId,
|
|
182
|
+
currency: currency || CURRENCY,
|
|
183
|
+
netRevenue: true,
|
|
184
|
+
ttl: exp || TTL_SECONDS,
|
|
185
|
+
meta: {
|
|
186
|
+
advertiserDomains: advertiserDomains || []
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
if (mediaType === BANNER) {
|
|
191
|
+
Object.assign(response, {
|
|
192
|
+
ad: ad,
|
|
193
|
+
});
|
|
194
|
+
} else {
|
|
195
|
+
Object.assign(response, {
|
|
196
|
+
vastXml: ad,
|
|
197
|
+
mediaType: VIDEO
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
output.push(response);
|
|
201
|
+
});
|
|
202
|
+
return output;
|
|
203
|
+
} catch (e) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '') {
|
|
209
|
+
let syncs = [];
|
|
210
|
+
const { iframeEnabled, pixelEnabled } = syncOptions;
|
|
211
|
+
const { gdprApplies, consentString = '' } = gdprConsent;
|
|
212
|
+
|
|
213
|
+
const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
|
|
214
|
+
const params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`
|
|
215
|
+
if (iframeEnabled) {
|
|
216
|
+
syncs.push({
|
|
217
|
+
type: 'iframe',
|
|
218
|
+
url: `https://sync.minutemedia-prebid.com/api/sync/iframe/${params}`
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
if (pixelEnabled) {
|
|
222
|
+
syncs.push({
|
|
223
|
+
type: 'image',
|
|
224
|
+
url: `https://sync.minutemedia-prebid.com/api/sync/image/${params}`
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return syncs;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function hashCode(s, prefix = '_') {
|
|
231
|
+
const l = s.length;
|
|
232
|
+
let h = 0
|
|
233
|
+
let i = 0;
|
|
234
|
+
if (l > 0) {
|
|
235
|
+
while (i < l) { h = (h << 5) - h + s.charCodeAt(i++) | 0; }
|
|
236
|
+
}
|
|
237
|
+
return prefix + h;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function getUniqueDealId(key, expiry = UNIQUE_DEAL_ID_EXPIRY) {
|
|
241
|
+
const storageKey = `u_${key}`;
|
|
242
|
+
const now = Date.now();
|
|
243
|
+
const data = getStorageItem(storageKey);
|
|
244
|
+
let uniqueId;
|
|
245
|
+
|
|
246
|
+
if (!data || !data.value || now - data.created > expiry) {
|
|
247
|
+
uniqueId = `${key}_${now.toString()}`;
|
|
248
|
+
setStorageItem(storageKey, uniqueId);
|
|
249
|
+
} else {
|
|
250
|
+
uniqueId = data.value;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return uniqueId;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export function getStorageItem(key) {
|
|
257
|
+
try {
|
|
258
|
+
return tryParseJSON(storage.getDataFromLocalStorage(key));
|
|
259
|
+
} catch (e) { }
|
|
260
|
+
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function setStorageItem(key, value, timestamp) {
|
|
265
|
+
try {
|
|
266
|
+
const created = timestamp || Date.now();
|
|
267
|
+
const data = JSON.stringify({ value, created });
|
|
268
|
+
storage.setDataInLocalStorage(key, data);
|
|
269
|
+
} catch (e) { }
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function tryParseJSON(value) {
|
|
273
|
+
try {
|
|
274
|
+
return JSON.parse(value);
|
|
275
|
+
} catch (e) {
|
|
276
|
+
return value;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export const spec = {
|
|
281
|
+
code: BIDDER_CODE,
|
|
282
|
+
version: BIDDER_VERSION,
|
|
283
|
+
gvlid: GVLID,
|
|
284
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
285
|
+
isBidRequestValid,
|
|
286
|
+
buildRequests,
|
|
287
|
+
interpretResponse,
|
|
288
|
+
getUserSyncs
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
**Module Name:** MinuteMediaPlus Bidder Adapter
|
|
4
|
+
|
|
5
|
+
**Module Type:** Bidder Adapter
|
|
6
|
+
|
|
7
|
+
**Maintainer:** hb@minutemedia.com
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Module that connects to MinuteMediaPlus's demand sources.
|
|
12
|
+
|
|
13
|
+
# Test Parameters
|
|
14
|
+
```js
|
|
15
|
+
var adUnits = [
|
|
16
|
+
{
|
|
17
|
+
code: 'test-ad',
|
|
18
|
+
sizes: [[300, 250]],
|
|
19
|
+
bids: [
|
|
20
|
+
{
|
|
21
|
+
bidder: 'mmplus',
|
|
22
|
+
params: {
|
|
23
|
+
cId: '562524b21b1c1f08117fc7f9',
|
|
24
|
+
pId: '59ac17c192832d0011283fe3',
|
|
25
|
+
bidFloor: 0.0001,
|
|
26
|
+
ext: {
|
|
27
|
+
param1: 'loremipsum',
|
|
28
|
+
param2: 'dolorsitamet'
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
```
|
|
@@ -24,6 +24,7 @@ import { getRefererInfo } from '../src/refererDetection.js';
|
|
|
24
24
|
const BIDDER_CODE = 'nextMillennium';
|
|
25
25
|
const ENDPOINT = 'https://pbs.nextmillmedia.com/openrtb2/auction';
|
|
26
26
|
const TEST_ENDPOINT = 'https://test.pbs.nextmillmedia.com/openrtb2/auction';
|
|
27
|
+
const SYNC_ENDPOINT = 'https://cookies.nextmillmedia.com/sync?';
|
|
27
28
|
const REPORT_ENDPOINT = 'https://report2.hb.brainlyads.com/statistics/metric';
|
|
28
29
|
const TIME_TO_LIVE = 360;
|
|
29
30
|
const VIDEO_PARAMS = [
|
|
@@ -182,7 +183,7 @@ export const spec = {
|
|
|
182
183
|
height: bid.h,
|
|
183
184
|
creativeId: bid.adid,
|
|
184
185
|
currency: response.cur,
|
|
185
|
-
netRevenue:
|
|
186
|
+
netRevenue: true,
|
|
186
187
|
ttl: TIME_TO_LIVE,
|
|
187
188
|
meta: {
|
|
188
189
|
advertiserDomains: bid.adomain || []
|
|
@@ -231,6 +232,13 @@ export const spec = {
|
|
|
231
232
|
})
|
|
232
233
|
}
|
|
233
234
|
|
|
235
|
+
if (!pixels.length) {
|
|
236
|
+
let syncUrl = SYNC_ENDPOINT;
|
|
237
|
+
if (gdprConsent && gdprConsent.gdprApplies) syncUrl += 'gdpr=1&gdpr_consent=' + gdprConsent.consentString + '&';
|
|
238
|
+
if (uspConsent) syncUrl += 'us_privacy=' + uspConsent + '&';
|
|
239
|
+
if (syncOptions.iframeEnabled) pixels.push({type: 'iframe', url: syncUrl + 'type=iframe'});
|
|
240
|
+
if (syncOptions.pixelEnabled) pixels.push({type: 'image', url: syncUrl + 'type=image'});
|
|
241
|
+
}
|
|
234
242
|
return pixels;
|
|
235
243
|
},
|
|
236
244
|
|
|
@@ -32,6 +32,12 @@ const PBS_CONVERTER = ortbConverter({
|
|
|
32
32
|
imp(buildImp, proxyBidRequest, context) {
|
|
33
33
|
Object.assign(context, proxyBidRequest.pbsData);
|
|
34
34
|
const imp = buildImp(proxyBidRequest, context);
|
|
35
|
+
(proxyBidRequest.bids || []).forEach(bid => {
|
|
36
|
+
if (bid.ortb2Imp && Object.keys(bid.ortb2Imp).length > 0) {
|
|
37
|
+
// set bidder-level imp attributes; see https://github.com/prebid/prebid-server/issues/2335
|
|
38
|
+
deepSetValue(imp, `ext.prebid.imp.${bid.bidder}`, bid.ortb2Imp);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
35
41
|
if (Object.values(SUPPORTED_MEDIA_TYPES).some(mtype => imp[mtype])) {
|
|
36
42
|
imp.secure = context.s2sBidRequest.s2sConfig.secure;
|
|
37
43
|
return imp;
|
|
@@ -3,9 +3,9 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
|
3
3
|
|
|
4
4
|
const BIDDER_CODE = 'proxistore';
|
|
5
5
|
const PROXISTORE_VENDOR_ID = 418;
|
|
6
|
-
const COOKIE_BASE_URL = 'https://
|
|
6
|
+
const COOKIE_BASE_URL = 'https://api.proxistore.com/v3/rtb/prebid/multi';
|
|
7
7
|
const COOKIE_LESS_URL =
|
|
8
|
-
'https://
|
|
8
|
+
'https://api.cookieless-proxistore.com/v3/rtb/prebid/multi';
|
|
9
9
|
|
|
10
10
|
function _createServerRequest(bidRequests, bidderRequest) {
|
|
11
11
|
var sizeIds = [];
|
|
@@ -6,7 +6,7 @@ import CONSTANTS from '../src/constants.json';
|
|
|
6
6
|
|
|
7
7
|
const emptyUrl = '';
|
|
8
8
|
const analyticsType = 'endpoint';
|
|
9
|
-
const pubxaiAnalyticsVersion = 'v1.
|
|
9
|
+
const pubxaiAnalyticsVersion = 'v1.2.0';
|
|
10
10
|
const defaultHost = 'api.pbxai.com';
|
|
11
11
|
const auctionPath = '/analytics/auction';
|
|
12
12
|
const winningBidPath = '/analytics/bidwon';
|
|
@@ -154,7 +154,7 @@ function send(data, status) {
|
|
|
154
154
|
search: location.search
|
|
155
155
|
});
|
|
156
156
|
if (typeof data !== 'undefined' && typeof data.auctionInit !== 'undefined') {
|
|
157
|
-
data.pageDetail.
|
|
157
|
+
data.pageDetail.adUnits = data.auctionInit.adUnitCodes;
|
|
158
158
|
data.initOptions.auctionId = data.auctionInit.auctionId;
|
|
159
159
|
delete data.auctionInit;
|
|
160
160
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
|
-
import { parseSizesInput, logError, generateUUID, isEmpty, deepAccess, logWarn, logMessage,
|
|
2
|
+
import { parseSizesInput, logError, generateUUID, isEmpty, deepAccess, logWarn, logMessage, getGptSlotInfoForAdUnitCode, isFn, isPlainObject } from '../src/utils.js';
|
|
3
3
|
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
4
4
|
import { config } from '../src/config.js';
|
|
5
5
|
import { Renderer } from '../src/Renderer.js';
|
|
@@ -132,15 +132,6 @@ export const spec = {
|
|
|
132
132
|
if (validBidRequests[0].schain) {
|
|
133
133
|
payload.schain = JSON.stringify(validBidRequests[0].schain);
|
|
134
134
|
}
|
|
135
|
-
if (deepAccess(validBidRequests[0], 'userId') && Object.keys(validBidRequests[0].userId).length > 0) {
|
|
136
|
-
const userIds = deepClone(validBidRequests[0].userId);
|
|
137
|
-
|
|
138
|
-
if (userIds.id5id) {
|
|
139
|
-
userIds.id5id = deepAccess(userIds, 'id5id.uid');
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
payload.userid = JSON.stringify(userIds);
|
|
143
|
-
}
|
|
144
135
|
|
|
145
136
|
const eids = deepAccess(validBidRequests[0], 'userIdAsEids');
|
|
146
137
|
if (Array.isArray(eids) && eids.length > 0) {
|
|
@@ -436,6 +436,10 @@ function _buildResponseObject(bidderRequest, bid) {
|
|
|
436
436
|
if (bid.tl_source && bid.tl_source == 'tlx') {
|
|
437
437
|
bidResponse.meta.mediaType = 'native';
|
|
438
438
|
}
|
|
439
|
+
|
|
440
|
+
if (creativeId) {
|
|
441
|
+
bidResponse.meta.networkId = creativeId.slice(0, creativeId.indexOf('_'));
|
|
442
|
+
}
|
|
439
443
|
};
|
|
440
444
|
return bidResponse;
|
|
441
445
|
}
|
|
@@ -382,6 +382,7 @@ function openRtbRequest(bidRequests, bidderRequest) {
|
|
|
382
382
|
const schain = bidRequests[0].schain;
|
|
383
383
|
let openRtbRequest = {
|
|
384
384
|
id: bidRequests[0].bidderRequestId,
|
|
385
|
+
tmax: bidderRequest.timeout || 400,
|
|
385
386
|
at: 1,
|
|
386
387
|
imp: bidRequests.map(bidRequest => openRtbImpression(bidRequest)),
|
|
387
388
|
site: openRtbSite(bidRequests[0], bidderRequest),
|