prebid.js 6.0.0 → 6.4.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/.babelrc.js +1 -7
- package/.circleci/config.yml +1 -1
- package/README.md +1 -1
- package/browsers.json +13 -29
- package/gulpfile.js +88 -82
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
- package/karma.conf.maker.js +2 -2
- package/modules/33acrossBidAdapter.js +189 -102
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/addefendBidAdapter.js +1 -0
- package/modules/adheseBidAdapter.js +7 -2
- package/modules/adkernelBidAdapter.js +147 -61
- package/modules/adlivetechBidAdapter.md +61 -0
- package/modules/adlooxAdServerVideo.js +2 -2
- package/modules/adlooxAnalyticsAdapter.js +4 -4
- package/modules/admanBidAdapter.js +1 -0
- package/modules/admixerBidAdapter.js +3 -2
- package/modules/adnuntiusBidAdapter.js +5 -2
- package/modules/adomikAnalyticsAdapter.js +16 -4
- package/modules/adplusBidAdapter.js +203 -0
- package/modules/adplusBidAdapter.md +39 -0
- package/modules/adxcgBidAdapter.js +311 -359
- package/modules/adxcgBidAdapter.md +22 -21
- package/modules/adyoulikeBidAdapter.js +7 -2
- package/modules/aniviewBidAdapter.js +1 -1
- package/modules/appnexusBidAdapter.js +23 -3
- package/modules/beachfrontBidAdapter.js +14 -17
- package/modules/beopBidAdapter.js +6 -4
- package/modules/bidViewability.js +3 -3
- package/modules/bidViewabilityIO.js +3 -3
- package/modules/codefuelBidAdapter.js +1 -3
- package/modules/codefuelBidAdapter.md +3 -3
- package/modules/colossussspBidAdapter.js +7 -0
- package/modules/compassBidAdapter.js +201 -0
- package/modules/compassBidAdapter.md +79 -0
- package/modules/craftBidAdapter.js +5 -3
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/currency.js +2 -2
- package/modules/cwireBidAdapter.js +3 -0
- package/modules/dailyhuntBidAdapter.js +435 -0
- package/modules/dailyhuntBidAdapter.md +4 -0
- package/modules/datablocksBidAdapter.js +3 -3
- package/modules/dchain.js +149 -0
- package/modules/dchain.md +45 -0
- package/modules/deepintentBidAdapter.js +1 -1
- package/modules/dspxBidAdapter.js +1 -1
- package/modules/emx_digitalBidAdapter.js +9 -1
- package/modules/engageyaBidAdapter.js +68 -54
- package/modules/feedadBidAdapter.js +2 -2
- package/modules/feedadBidAdapter.md +4 -2
- package/modules/freewheel-sspBidAdapter.js +6 -0
- package/modules/futureads.md +48 -0
- package/modules/glimpseBidAdapter.js +44 -16
- package/modules/goldbachBidAdapter.js +1176 -0
- package/modules/goldbachBidAdapter.md +151 -0
- package/modules/gptPreAuction.js +11 -5
- package/modules/gridBidAdapter.js +5 -4
- package/modules/gumgumBidAdapter.js +7 -3
- package/modules/id5IdSystem.md +6 -6
- package/modules/imRtdProvider.js +31 -0
- package/modules/improvedigitalBidAdapter.js +19 -3
- package/modules/instreamTracking.js +4 -4
- package/modules/intersectionRtdProvider.js +114 -0
- package/modules/invibesBidAdapter.js +64 -14
- package/modules/invibesBidAdapter.md +2 -1
- package/modules/ipromBidAdapter.js +79 -0
- package/modules/ixBidAdapter.js +185 -22
- package/modules/kinessoIdSystem.js +1 -1
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/livewrappedBidAdapter.js +8 -2
- package/modules/lotamePanoramaIdSystem.js +80 -8
- package/modules/luponmediaBidAdapter.js +570 -0
- package/modules/mediasquareBidAdapter.js +1 -9
- package/modules/merkleIdSystem.js +5 -0
- package/modules/missenaBidAdapter.js +89 -0
- package/modules/nativoBidAdapter.js +27 -1
- package/modules/nextMillenniumBidAdapter.js +37 -7
- package/modules/oguryBidAdapter.js +2 -1
- package/modules/openxBidAdapter.js +6 -1
- package/modules/prebidServerBidAdapter/index.js +19 -15
- package/modules/pubgeniusBidAdapter.js +1 -1
- package/modules/pubmaticBidAdapter.js +5 -3
- package/modules/pubxaiAnalyticsAdapter.js +17 -0
- package/modules/relaidoBidAdapter.js +86 -65
- package/modules/richaudienceBidAdapter.js +2 -3
- package/modules/rtdModule/index.js +48 -18
- package/modules/rubiconBidAdapter.js +31 -19
- package/modules/saambaaBidAdapter.js +420 -0
- package/modules/saambaaBidAdapter.md +65 -68
- package/modules/seedtagBidAdapter.js +6 -0
- package/modules/sharedIdSystem.js +27 -1
- package/modules/smaatoBidAdapter.js +9 -1
- package/modules/smartxBidAdapter.js +17 -1
- package/modules/sspBCBidAdapter.js +34 -3
- package/modules/tappxBidAdapter.js +3 -1
- package/modules/targetVideoBidAdapter.js +187 -0
- package/modules/targetVideoBidAdapter.md +34 -0
- package/modules/telariaBidAdapter.js +2 -2
- package/modules/trustxBidAdapter.js +18 -17
- package/modules/undertoneBidAdapter.js +8 -1
- package/modules/userId/index.js +27 -2
- package/modules/ventes.md +71 -0
- package/modules/ventesBidAdapter.js +104 -64
- package/modules/ventesBidAdapter.md +0 -1
- package/modules/vidoomyBidAdapter.js +65 -108
- package/modules/visxBidAdapter.js +20 -3
- package/modules/visxBidAdapter.md +4 -6
- package/modules/weboramaRtdProvider.js +288 -73
- package/modules/weboramaRtdProvider.md +27 -10
- package/modules/yahoosspBidAdapter.js +5 -1
- package/modules/yahoosspBidAdapter.md +1 -1
- package/modules/yieldlabBidAdapter.js +41 -10
- package/modules/yieldlabBidAdapter.md +91 -48
- package/modules/yieldoneBidAdapter.js +115 -11
- package/modules/zetaSspBidAdapter.md +33 -1
- package/modules/zeta_global_sspBidAdapter.js +22 -1
- package/package.json +6 -1
- package/plugins/pbjsGlobals.js +28 -1
- package/src/adapterManager.js +14 -8
- package/src/auction.js +5 -4
- package/src/prebid.js +1 -2
- package/src/targeting.js +24 -3
- package/src/utils.js +41 -7
- package/test/helpers/prebidGlobal.js +1 -0
- package/test/spec/integration/faker/googletag.js +6 -0
- package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
- package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
- package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
- package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
- package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
- package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
- package/test/spec/modules/beopBidAdapter_spec.js +1 -1
- package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
- package/test/spec/modules/bidViewability_spec.js +4 -4
- package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
- package/test/spec/modules/compassBidAdapter_spec.js +397 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
- package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
- package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
- package/test/spec/modules/dchain_spec.js +329 -0
- package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
- package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
- package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
- package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
- package/test/spec/modules/gptPreAuction_spec.js +58 -4
- package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
- package/test/spec/modules/imRtdProvider_spec.js +25 -0
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
- package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
- package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
- package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
- package/test/spec/modules/ixBidAdapter_spec.js +293 -2
- package/test/spec/modules/konduitWrapper_spec.js +0 -1
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
- package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
- package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
- package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
- package/test/spec/modules/merkleIdSystem_spec.js +18 -0
- package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
- package/test/spec/modules/openxBidAdapter_spec.js +5 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
- package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
- package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
- package/test/spec/modules/realTimeDataModule_spec.js +135 -49
- package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
- package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
- package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
- package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
- package/test/spec/modules/sharedIdSystem_spec.js +52 -6
- package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
- package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
- package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
- package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
- package/test/spec/modules/userId_spec.js +51 -0
- package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
- package/test/spec/modules/visxBidAdapter_spec.js +121 -5
- package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
- package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
- package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
- package/test/spec/unit/core/adapterManager_spec.js +24 -6
- package/test/spec/unit/core/targeting_spec.js +116 -0
- package/test/spec/utils_spec.js +38 -0
- package/test/test_deps.js +3 -0
- package/test/test_index.js +1 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isStr, isArray, isPlainObject, deepSetValue, isNumber, deepAccess, getAdUnitSizes, parseGPTSingleSizeArrayToRtbSize,
|
|
3
|
-
cleanObj, contains, getDNT, parseUrl, createTrackPixelHtml, _each, isArrayOfNums
|
|
3
|
+
cleanObj, contains, getDNT, parseUrl, createTrackPixelHtml, _each, isArrayOfNums, mergeDeep, isEmpty, inIframe
|
|
4
4
|
} from '../src/utils.js';
|
|
5
5
|
import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
|
|
6
6
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
@@ -75,6 +75,7 @@ export const spec = {
|
|
|
75
75
|
{code: 'denakop'},
|
|
76
76
|
{code: 'rtbanalytica'},
|
|
77
77
|
{code: 'unibots'},
|
|
78
|
+
{code: 'catapultx'},
|
|
78
79
|
{code: 'ergadx'},
|
|
79
80
|
{code: 'turktelekom'}
|
|
80
81
|
],
|
|
@@ -102,17 +103,16 @@ export const spec = {
|
|
|
102
103
|
* @returns {ServerRequest[]}
|
|
103
104
|
*/
|
|
104
105
|
buildRequests: function (bidRequests, bidderRequest) {
|
|
105
|
-
let
|
|
106
|
+
let impGroups = groupImpressionsByHostZone(bidRequests, bidderRequest.refererInfo);
|
|
106
107
|
let requests = [];
|
|
107
108
|
let schain = bidRequests[0].schain;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
109
|
+
_each(impGroups, impGroup => {
|
|
110
|
+
let {host, zoneId, imps} = impGroup;
|
|
111
|
+
const request = buildRtbRequest(imps, bidderRequest, schain);
|
|
112
|
+
requests.push({
|
|
113
|
+
method: 'POST',
|
|
114
|
+
url: `https://${host}/hb?zone=${zoneId}&v=${VERSION}`,
|
|
115
|
+
data: JSON.stringify(request)
|
|
116
116
|
});
|
|
117
117
|
});
|
|
118
118
|
return requests;
|
|
@@ -208,17 +208,19 @@ registerBidder(spec);
|
|
|
208
208
|
* @param bidRequests {BidRequest[]}
|
|
209
209
|
* @param refererInfo {refererInfo}
|
|
210
210
|
*/
|
|
211
|
-
function
|
|
211
|
+
function groupImpressionsByHostZone(bidRequests, refererInfo) {
|
|
212
212
|
let secure = (refererInfo && refererInfo.referer.indexOf('https:') === 0);
|
|
213
|
-
return
|
|
214
|
-
.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
213
|
+
return Object.values(
|
|
214
|
+
bidRequests.map(bidRequest => buildImp(bidRequest, secure))
|
|
215
|
+
.reduce((acc, curr, index) => {
|
|
216
|
+
let bidRequest = bidRequests[index];
|
|
217
|
+
let {zoneId, host} = bidRequest.params;
|
|
218
|
+
let key = `${host}_${zoneId}`;
|
|
219
|
+
acc[key] = acc[key] || {host: host, zoneId: zoneId, imps: []};
|
|
220
|
+
acc[key].imps.push(curr);
|
|
221
|
+
return acc;
|
|
222
|
+
}, {})
|
|
223
|
+
);
|
|
222
224
|
}
|
|
223
225
|
|
|
224
226
|
function getBidFloor(bid, mediaType, sizes) {
|
|
@@ -364,57 +366,142 @@ function getAllowedSyncMethod(bidderCode) {
|
|
|
364
366
|
}
|
|
365
367
|
|
|
366
368
|
/**
|
|
367
|
-
*
|
|
368
|
-
* @param
|
|
369
|
-
* @
|
|
370
|
-
* @param schain {Object=} Supply chain config
|
|
371
|
-
* @return {Object} Complete rtb request
|
|
369
|
+
* Create device object from fpd and host-collected data
|
|
370
|
+
* @param fpd {Object}
|
|
371
|
+
* @returns {{device: Object}}
|
|
372
372
|
*/
|
|
373
|
-
function
|
|
374
|
-
let
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
'
|
|
378
|
-
'
|
|
379
|
-
'
|
|
380
|
-
|
|
381
|
-
'device': {
|
|
382
|
-
'ip': 'caller',
|
|
383
|
-
'ipv6': 'caller',
|
|
384
|
-
'ua': 'caller',
|
|
385
|
-
'js': 1,
|
|
386
|
-
'language': getLanguage()
|
|
387
|
-
},
|
|
388
|
-
'tmax': parseInt(timeout)
|
|
389
|
-
};
|
|
373
|
+
function makeDevice(fpd) {
|
|
374
|
+
let device = mergeDeep({
|
|
375
|
+
'ip': 'caller',
|
|
376
|
+
'ipv6': 'caller',
|
|
377
|
+
'ua': 'caller',
|
|
378
|
+
'js': 1,
|
|
379
|
+
'language': getLanguage()
|
|
380
|
+
}, fpd.device || {});
|
|
390
381
|
if (getDNT()) {
|
|
391
|
-
|
|
382
|
+
device.dnt = 1;
|
|
383
|
+
}
|
|
384
|
+
return {device: device};
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Create site or app description object
|
|
389
|
+
* @param bidderRequest {BidderRequest}
|
|
390
|
+
* @param fpd {Object}
|
|
391
|
+
* @returns {{site: Object}|{app: Object}}
|
|
392
|
+
*/
|
|
393
|
+
function makeSiteOrApp(bidderRequest, fpd) {
|
|
394
|
+
let {refererInfo} = bidderRequest;
|
|
395
|
+
let appConfig = config.getConfig('app');
|
|
396
|
+
if (isEmpty(appConfig)) {
|
|
397
|
+
return {site: createSite(refererInfo, fpd)}
|
|
398
|
+
} else {
|
|
399
|
+
return {app: appConfig};
|
|
392
400
|
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Create user description object
|
|
405
|
+
* @param bidderRequest {BidderRequest}
|
|
406
|
+
* @param fpd {Object}
|
|
407
|
+
* @returns {{user: Object} | undefined}
|
|
408
|
+
*/
|
|
409
|
+
function makeUser(bidderRequest, fpd) {
|
|
410
|
+
let {gdprConsent} = bidderRequest;
|
|
411
|
+
let user = fpd.user || {};
|
|
412
|
+
if (gdprConsent && gdprConsent.consentString !== undefined) {
|
|
413
|
+
deepSetValue(user, 'ext.consent', gdprConsent.consentString);
|
|
414
|
+
}
|
|
415
|
+
let eids = getExtendedUserIds(bidderRequest);
|
|
416
|
+
if (eids) {
|
|
417
|
+
deepSetValue(user, 'ext.eids', eids);
|
|
418
|
+
}
|
|
419
|
+
if (!isEmpty(user)) { return {user: user}; }
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Create privacy regulations object
|
|
424
|
+
* @param bidderRequest {BidderRequest}
|
|
425
|
+
* @returns {{regs: Object} | undefined}
|
|
426
|
+
*/
|
|
427
|
+
function makeRegulations(bidderRequest) {
|
|
428
|
+
let {gdprConsent, uspConsent} = bidderRequest;
|
|
429
|
+
let regs = {};
|
|
393
430
|
if (gdprConsent) {
|
|
394
431
|
if (gdprConsent.gdprApplies !== undefined) {
|
|
395
|
-
deepSetValue(
|
|
396
|
-
}
|
|
397
|
-
if (gdprConsent.consentString !== undefined) {
|
|
398
|
-
deepSetValue(req, 'user.ext.consent', gdprConsent.consentString);
|
|
432
|
+
deepSetValue(regs, 'regs.ext.gdpr', ~~gdprConsent.gdprApplies);
|
|
399
433
|
}
|
|
400
434
|
}
|
|
401
435
|
if (uspConsent) {
|
|
402
|
-
deepSetValue(
|
|
436
|
+
deepSetValue(regs, 'regs.ext.us_privacy', uspConsent);
|
|
437
|
+
}
|
|
438
|
+
if (config.getConfig('coppa')) {
|
|
439
|
+
deepSetValue(regs, 'regs.coppa', 1);
|
|
403
440
|
}
|
|
404
|
-
if (
|
|
405
|
-
|
|
441
|
+
if (!isEmpty(regs)) {
|
|
442
|
+
return regs;
|
|
406
443
|
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Create top-level request object
|
|
448
|
+
* @param bidderRequest {BidderRequest}
|
|
449
|
+
* @param imps {Object} Impressions
|
|
450
|
+
* @param fpd {Object} First party data
|
|
451
|
+
* @returns
|
|
452
|
+
*/
|
|
453
|
+
function makeBaseRequest(bidderRequest, imps, fpd) {
|
|
454
|
+
let {auctionId, timeout} = bidderRequest;
|
|
455
|
+
let request = {
|
|
456
|
+
'id': auctionId,
|
|
457
|
+
'imp': imps,
|
|
458
|
+
'at': 1,
|
|
459
|
+
'tmax': parseInt(timeout)
|
|
460
|
+
};
|
|
461
|
+
if (!isEmpty(fpd.bcat)) {
|
|
462
|
+
request.bcat = fpd.bcat;
|
|
463
|
+
}
|
|
464
|
+
if (!isEmpty(fpd.badv)) {
|
|
465
|
+
request.badv = fpd.badv;
|
|
466
|
+
}
|
|
467
|
+
return request;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Initialize sync capabilities
|
|
472
|
+
* @param bidderRequest {BidderRequest}
|
|
473
|
+
*/
|
|
474
|
+
function makeSyncInfo(bidderRequest) {
|
|
475
|
+
let {bidderCode} = bidderRequest;
|
|
407
476
|
let syncMethod = getAllowedSyncMethod(bidderCode);
|
|
408
477
|
if (syncMethod) {
|
|
409
|
-
|
|
478
|
+
let res = {};
|
|
479
|
+
deepSetValue(res, 'ext.adk_usersync', syncMethod);
|
|
480
|
+
return res;
|
|
410
481
|
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Builds complete rtb request
|
|
486
|
+
* @param imps {Object} Collection of rtb impressions
|
|
487
|
+
* @param bidderRequest {BidderRequest}
|
|
488
|
+
* @param schain {Object=} Supply chain config
|
|
489
|
+
* @return {Object} Complete rtb request
|
|
490
|
+
*/
|
|
491
|
+
function buildRtbRequest(imps, bidderRequest, schain) {
|
|
492
|
+
let fpd = config.getConfig('ortb2') || {};
|
|
493
|
+
|
|
494
|
+
let req = mergeDeep(
|
|
495
|
+
makeBaseRequest(bidderRequest, imps, fpd),
|
|
496
|
+
makeDevice(fpd),
|
|
497
|
+
makeSiteOrApp(bidderRequest, fpd),
|
|
498
|
+
makeUser(bidderRequest, fpd),
|
|
499
|
+
makeRegulations(bidderRequest),
|
|
500
|
+
makeSyncInfo(bidderRequest)
|
|
501
|
+
);
|
|
411
502
|
if (schain) {
|
|
412
503
|
deepSetValue(req, 'source.ext.schain', schain);
|
|
413
504
|
}
|
|
414
|
-
let eids = getExtendedUserIds(bidderRequest);
|
|
415
|
-
if (eids) {
|
|
416
|
-
deepSetValue(req, 'user.ext.eids', eids);
|
|
417
|
-
}
|
|
418
505
|
return req;
|
|
419
506
|
}
|
|
420
507
|
|
|
@@ -430,18 +517,17 @@ function getLanguage() {
|
|
|
430
517
|
/**
|
|
431
518
|
* Creates site description object
|
|
432
519
|
*/
|
|
433
|
-
function createSite(refInfo) {
|
|
520
|
+
function createSite(refInfo, fpd) {
|
|
434
521
|
let url = parseUrl(refInfo.referer);
|
|
435
522
|
let site = {
|
|
436
523
|
'domain': url.hostname,
|
|
437
524
|
'page': `${url.protocol}://${url.hostname}${url.pathname}`
|
|
438
525
|
};
|
|
439
|
-
|
|
526
|
+
mergeDeep(site, fpd.site);
|
|
527
|
+
if (!inIframe() && document.referrer) {
|
|
440
528
|
site.ref = document.referrer;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
if (keywords && keywords.content) {
|
|
444
|
-
site.keywords = keywords.content;
|
|
529
|
+
} else {
|
|
530
|
+
delete site.ref;
|
|
445
531
|
}
|
|
446
532
|
return site;
|
|
447
533
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Adlivetech Bidder Adapter
|
|
4
|
+
Module Type: Bidder Adapter
|
|
5
|
+
Maintainer: grid-tech@themediagrid.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
Module that connects to Grid demand source to fetch bids.
|
|
10
|
+
The adapter is GDPR compliant and supports banner and video (instream and outstream).
|
|
11
|
+
|
|
12
|
+
# Test Parameters
|
|
13
|
+
```
|
|
14
|
+
var adUnits = [
|
|
15
|
+
{
|
|
16
|
+
code: 'test-div',
|
|
17
|
+
sizes: [[300, 250]],
|
|
18
|
+
bids: [
|
|
19
|
+
{
|
|
20
|
+
bidder: "adlivetech",
|
|
21
|
+
params: {
|
|
22
|
+
uid: '1',
|
|
23
|
+
bidFloor: 0.5
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},{
|
|
28
|
+
code: 'test-div',
|
|
29
|
+
sizes: [[728, 90]],
|
|
30
|
+
bids: [
|
|
31
|
+
{
|
|
32
|
+
bidder: "adlivetech",
|
|
33
|
+
params: {
|
|
34
|
+
uid: 2,
|
|
35
|
+
keywords: {
|
|
36
|
+
brandsafety: ['disaster'],
|
|
37
|
+
topic: ['stress', 'fear']
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: 'test-div',
|
|
45
|
+
sizes: [[728, 90]],
|
|
46
|
+
mediaTypes: { video: {
|
|
47
|
+
context: 'instream',
|
|
48
|
+
playerSize: [728, 90],
|
|
49
|
+
mimes: ['video/mp4']
|
|
50
|
+
},
|
|
51
|
+
bids: [
|
|
52
|
+
{
|
|
53
|
+
bidder: "adlivetech",
|
|
54
|
+
params: {
|
|
55
|
+
uid: 11
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
```
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { registerVideoSupport } from '../src/adServerManager.js';
|
|
10
10
|
import { command as analyticsCommand, COMMAND } from './adlooxAnalyticsAdapter.js';
|
|
11
11
|
import { ajax } from '../src/ajax.js';
|
|
12
|
-
import
|
|
12
|
+
import CONSTANTS from '../src/constants.json';
|
|
13
13
|
import { targeting } from '../src/targeting.js';
|
|
14
14
|
import { logInfo, isFn, logError, isPlainObject, isStr, isBoolean, deepSetValue, deepClone, timestamp, logWarn } from '../src/utils.js';
|
|
15
15
|
|
|
@@ -74,7 +74,7 @@ function track(options, callback) {
|
|
|
74
74
|
bid.ext.adloox.video.adserver = false;
|
|
75
75
|
|
|
76
76
|
analyticsCommand(COMMAND.TRACK, {
|
|
77
|
-
eventType: EVENTS.BID_WON,
|
|
77
|
+
eventType: CONSTANTS.EVENTS.BID_WON,
|
|
78
78
|
args: bid
|
|
79
79
|
});
|
|
80
80
|
}
|
|
@@ -9,7 +9,7 @@ import adapter from '../src/AnalyticsAdapter.js';
|
|
|
9
9
|
import { loadExternalScript } from '../src/adloader.js';
|
|
10
10
|
import { auctionManager } from '../src/auctionManager.js';
|
|
11
11
|
import { AUCTION_COMPLETED } from '../src/auction.js';
|
|
12
|
-
import
|
|
12
|
+
import CONSTANTS from '../src/constants.json';
|
|
13
13
|
import find from 'core-js-pure/features/array/find.js';
|
|
14
14
|
import {
|
|
15
15
|
deepAccess, logInfo, isPlainObject, logError, isStr, isNumber, getGptSlotInfoForAdUnitCode,
|
|
@@ -199,9 +199,9 @@ analyticsAdapter.url = function(url, args, bid) {
|
|
|
199
199
|
return url + a2qs(args);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = function(auctionDetails) {
|
|
202
|
+
analyticsAdapter[`handle_${CONSTANTS.EVENTS.AUCTION_END}`] = function(auctionDetails) {
|
|
203
203
|
if (!(auctionDetails.auctionStatus == AUCTION_COMPLETED && auctionDetails.bidsReceived.length > 0)) return;
|
|
204
|
-
analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = NOOP;
|
|
204
|
+
analyticsAdapter[`handle_${CONSTANTS.EVENTS.AUCTION_END}`] = NOOP;
|
|
205
205
|
|
|
206
206
|
logMessage(MODULE, 'preloading verification JS');
|
|
207
207
|
|
|
@@ -214,7 +214,7 @@ analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = function(auctionDetails) {
|
|
|
214
214
|
insertElement(link);
|
|
215
215
|
}
|
|
216
216
|
|
|
217
|
-
analyticsAdapter[`handle_${EVENTS.BID_WON}`] = function(bid) {
|
|
217
|
+
analyticsAdapter[`handle_${CONSTANTS.EVENTS.BID_WON}`] = function(bid) {
|
|
218
218
|
if (deepAccess(bid, 'ext.adloox.video.adserver')) {
|
|
219
219
|
logMessage(MODULE, `measuring '${bid.mediaType}' ad unit code '${bid.adUnitCode}' via Ad Server module`);
|
|
220
220
|
return;
|
|
@@ -108,6 +108,7 @@ export const spec = {
|
|
|
108
108
|
}
|
|
109
109
|
if (bid.userId) {
|
|
110
110
|
getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com');
|
|
111
|
+
getUserId(placement.eids, bid.userId.lotamePanoramaId, 'lotame.com');
|
|
111
112
|
}
|
|
112
113
|
if (traff === VIDEO) {
|
|
113
114
|
placement.playerSize = bid.mediaTypes[VIDEO].playerSize;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { logError } from '../src/utils.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {config} from '../src/config.js';
|
|
4
|
+
import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
|
|
4
5
|
|
|
5
6
|
const BIDDER_CODE = 'admixer';
|
|
6
|
-
const ALIASES = ['go2net', 'adblender', 'adsyield'];
|
|
7
|
+
const ALIASES = ['go2net', 'adblender', 'adsyield', 'futureads'];
|
|
7
8
|
const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
|
|
8
9
|
export const spec = {
|
|
9
10
|
code: BIDDER_CODE,
|
|
10
11
|
aliases: ALIASES,
|
|
11
|
-
supportedMediaTypes: [
|
|
12
|
+
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
|
|
12
13
|
/**
|
|
13
14
|
* Determines whether or not the given bid request is valid.
|
|
14
15
|
*/
|
|
@@ -37,7 +37,8 @@ const handleMeta = function () {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
const getUsi = function (meta, ortb2, bidderRequest) {
|
|
40
|
-
|
|
40
|
+
let usi = (meta !== null && meta.usi) ? meta.usi : false;
|
|
41
|
+
if (ortb2 && ortb2.user && ortb2.user.id) { usi = ortb2.user.id }
|
|
41
42
|
return usi
|
|
42
43
|
}
|
|
43
44
|
|
|
@@ -55,6 +56,8 @@ export const spec = {
|
|
|
55
56
|
const requests = [];
|
|
56
57
|
const request = [];
|
|
57
58
|
const ortb2 = config.getConfig('ortb2');
|
|
59
|
+
const bidderConfig = config.getConfig();
|
|
60
|
+
|
|
58
61
|
const adnMeta = handleMeta()
|
|
59
62
|
const usi = getUsi(adnMeta, ortb2, bidderRequest)
|
|
60
63
|
const segments = getSegmentsFromOrtb(ortb2);
|
|
@@ -67,7 +70,7 @@ export const spec = {
|
|
|
67
70
|
if (gdprApplies !== undefined) request.push('consentString=' + consentString);
|
|
68
71
|
if (segments.length > 0) request.push('segments=' + segments.join(','));
|
|
69
72
|
if (usi) request.push('userId=' + usi);
|
|
70
|
-
|
|
73
|
+
if (bidderConfig.useCookie === false) request.push('noCookies=true')
|
|
71
74
|
for (var i = 0; i < validBidRequests.length; i++) {
|
|
72
75
|
const bid = validBidRequests[i]
|
|
73
76
|
const network = bid.params.network || 'network';
|
|
@@ -12,6 +12,7 @@ const bidRequested = CONSTANTS.EVENTS.BID_REQUESTED;
|
|
|
12
12
|
const bidResponse = CONSTANTS.EVENTS.BID_RESPONSE;
|
|
13
13
|
const bidWon = CONSTANTS.EVENTS.BID_WON;
|
|
14
14
|
const bidTimeout = CONSTANTS.EVENTS.BID_TIMEOUT;
|
|
15
|
+
const ua = navigator.userAgent;
|
|
15
16
|
|
|
16
17
|
let adomikAdapter = Object.assign(adapter({}),
|
|
17
18
|
{
|
|
@@ -47,7 +48,7 @@ let adomikAdapter = Object.assign(adapter({}),
|
|
|
47
48
|
type: 'request',
|
|
48
49
|
event: {
|
|
49
50
|
bidder: bid.bidder.toUpperCase(),
|
|
50
|
-
placementCode: bid.
|
|
51
|
+
placementCode: bid.adUnitCode
|
|
51
52
|
}
|
|
52
53
|
});
|
|
53
54
|
});
|
|
@@ -67,10 +68,16 @@ adomikAdapter.initializeBucketEvents = function() {
|
|
|
67
68
|
adomikAdapter.bucketEvents = [];
|
|
68
69
|
}
|
|
69
70
|
|
|
71
|
+
adomikAdapter.maxPartLength = function () {
|
|
72
|
+
return (ua.includes(' MSIE ')) ? 1600 : 60000;
|
|
73
|
+
};
|
|
74
|
+
|
|
70
75
|
adomikAdapter.sendTypedEvent = function() {
|
|
71
76
|
const groupedTypedEvents = adomikAdapter.buildTypedEvents();
|
|
72
77
|
|
|
73
78
|
const bulkEvents = {
|
|
79
|
+
testId: adomikAdapter.currentContext.testId,
|
|
80
|
+
testValue: adomikAdapter.currentContext.testValue,
|
|
74
81
|
uid: adomikAdapter.currentContext.uid,
|
|
75
82
|
ahbaid: adomikAdapter.currentContext.id,
|
|
76
83
|
hostname: window.location.hostname,
|
|
@@ -108,9 +115,10 @@ adomikAdapter.sendTypedEvent = function() {
|
|
|
108
115
|
// Encode object in base64
|
|
109
116
|
const encodedBuf = window.btoa(stringBulkEvents);
|
|
110
117
|
|
|
111
|
-
// Create final url and split it
|
|
118
|
+
// Create final url and split it (+endpoint length)
|
|
112
119
|
const encodedUri = encodeURIComponent(encodedBuf);
|
|
113
|
-
const
|
|
120
|
+
const maxLength = adomikAdapter.maxPartLength();
|
|
121
|
+
const splittedUrl = encodedUri.match(new RegExp(`.{1,${maxLength}}`, 'g'));
|
|
114
122
|
|
|
115
123
|
splittedUrl.forEach((split, i) => {
|
|
116
124
|
const partUrl = `${split}&id=${adomikAdapter.currentContext.id}&part=${i}&on=${splittedUrl.length - 1}`;
|
|
@@ -120,8 +128,10 @@ adomikAdapter.sendTypedEvent = function() {
|
|
|
120
128
|
};
|
|
121
129
|
|
|
122
130
|
adomikAdapter.sendWonEvent = function (wonEvent) {
|
|
131
|
+
let keyValues = { testId: adomikAdapter.currentContext.testId, testValue: adomikAdapter.currentContext.testValue }
|
|
132
|
+
wonEvent = {...wonEvent, ...keyValues}
|
|
123
133
|
const stringWonEvent = JSON.stringify(wonEvent)
|
|
124
|
-
logInfo('Won event sent to adomik prebid analytic ' +
|
|
134
|
+
logInfo('Won event sent to adomik prebid analytic ' + stringWonEvent);
|
|
125
135
|
|
|
126
136
|
// Encode object in base64
|
|
127
137
|
const encodedBuf = window.btoa(stringWonEvent);
|
|
@@ -199,6 +209,8 @@ adomikAdapter.enableAnalytics = function (config) {
|
|
|
199
209
|
adomikAdapter.currentContext = {
|
|
200
210
|
uid: initOptions.id,
|
|
201
211
|
url: initOptions.url,
|
|
212
|
+
testId: initOptions.testId,
|
|
213
|
+
testValue: initOptions.testValue,
|
|
202
214
|
id: '',
|
|
203
215
|
timeouted: false,
|
|
204
216
|
}
|