prebid.js 7.11.0 → 7.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/issue_tracker.yml +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adriverBidAdapter.js +1 -1
- package/dist/adriverIdSystem.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/alkimiBidAdapter.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/betweenBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.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/dfpAdServerVideo.js +1 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/displayioBidAdapter.js +1 -3
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.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/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/lassoBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.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 -0
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +120 -121
- 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/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/rasBidAdapter.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/tappxBidAdapter.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/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.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/adkernelBidAdapter.js +28 -12
- package/modules/adriverBidAdapter.js +5 -12
- package/modules/adriverIdSystem.js +2 -1
- package/modules/adtelligentBidAdapter.js +2 -0
- package/modules/alkimiBidAdapter.js +2 -1
- package/modules/betweenBidAdapter.js +3 -3
- package/modules/bidwatchAnalyticsAdapter.js +112 -59
- package/modules/consumableBidAdapter.js +2 -2
- package/modules/criteoBidAdapter.js +19 -13
- package/modules/dgkeywordRtdProvider.js +9 -0
- package/modules/displayioBidAdapter.js +92 -97
- package/modules/id5IdSystem.js +160 -111
- package/modules/id5IdSystem.md +16 -14
- package/modules/improvedigitalBidAdapter.js +50 -28
- package/modules/ixBidAdapter.js +13 -306
- package/modules/mediagoBidAdapter.js +462 -0
- package/modules/mediagoBidAdapter.md +34 -0
- package/modules/nextMillenniumBidAdapter.js +25 -6
- package/modules/pubmaticAnalyticsAdapter.js +1 -1
- package/modules/rasBidAdapter.js +8 -0
- package/modules/rasBidAdapter.md +14 -13
- package/modules/sonobiBidAdapter.js +1 -0
- package/modules/tappxBidAdapter.js +9 -0
- package/package.json +1 -1
- package/src/adloader.js +2 -1
- package/src/adserver.js +0 -56
- package/src/auction.js +58 -15
- package/src/native.js +1 -0
- package/src/refererDetection.js +12 -1
- package/src/videoCache.js +8 -2
- package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
- package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
- package/test/spec/modules/adriverIdSystem_spec.js +3 -8
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
- package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
- package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
- package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
- package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
- package/test/spec/modules/enrichmentFpdModule_spec.js +2 -1
- package/test/spec/modules/fpdModule_spec.js +2 -1
- package/test/spec/modules/id5IdSystem_spec.js +529 -172
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
- package/test/spec/modules/ixBidAdapter_spec.js +210 -104
- package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
- package/test/spec/modules/rasBidAdapter_spec.js +2 -0
- package/test/spec/native_spec.js +144 -0
- package/test/spec/videoCache_spec.js +37 -7
package/src/adserver.js
CHANGED
|
@@ -1,61 +1,5 @@
|
|
|
1
|
-
import { formatQS } from './utils.js';
|
|
2
|
-
import { targeting } from './targeting.js';
|
|
3
1
|
import {hook} from './hook.js';
|
|
4
2
|
|
|
5
|
-
// Adserver parent class
|
|
6
|
-
const AdServer = function(attr) {
|
|
7
|
-
this.name = attr.adserver;
|
|
8
|
-
this.code = attr.code;
|
|
9
|
-
this.getWinningBidByCode = function() {
|
|
10
|
-
return targeting.getWinningBids(this.code)[0];
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
// DFP ad server
|
|
15
|
-
// TODO: this seems to be unused?
|
|
16
|
-
export function dfpAdserver(options, urlComponents) {
|
|
17
|
-
var adserver = new AdServer(options);
|
|
18
|
-
adserver.urlComponents = urlComponents;
|
|
19
|
-
|
|
20
|
-
var dfpReqParams = {
|
|
21
|
-
'env': 'vp',
|
|
22
|
-
'gdfp_req': '1',
|
|
23
|
-
'impl': 's',
|
|
24
|
-
'unviewed_position_start': '1'
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
var dfpParamsWithVariableValue = ['output', 'iu', 'sz', 'url', 'correlator', 'description_url', 'hl'];
|
|
28
|
-
|
|
29
|
-
var getCustomParams = function(targeting) {
|
|
30
|
-
return encodeURIComponent(formatQS(targeting));
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
adserver.appendQueryParams = function() {
|
|
34
|
-
var bid = adserver.getWinningBidByCode();
|
|
35
|
-
if (bid) {
|
|
36
|
-
this.urlComponents.search.description_url = encodeURIComponent(bid.vastUrl);
|
|
37
|
-
this.urlComponents.search.cust_params = getCustomParams(bid.adserverTargeting);
|
|
38
|
-
this.urlComponents.search.correlator = Date.now();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
adserver.verifyAdserverTag = function() {
|
|
43
|
-
for (var key in dfpReqParams) {
|
|
44
|
-
if (!this.urlComponents.search.hasOwnProperty(key) || this.urlComponents.search[key] !== dfpReqParams[key]) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
for (var i in dfpParamsWithVariableValue) {
|
|
49
|
-
if (!this.urlComponents.search.hasOwnProperty(dfpParamsWithVariableValue[i])) {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return true;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
return adserver;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
3
|
/**
|
|
60
4
|
* return the GAM PPID, if available (eid for the userID configured with `userSync.ppidSource`)
|
|
61
5
|
*/
|
package/src/auction.js
CHANGED
|
@@ -514,28 +514,71 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
|
|
|
514
514
|
}
|
|
515
515
|
}
|
|
516
516
|
|
|
517
|
-
|
|
518
|
-
store(
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
} else {
|
|
524
|
-
if (cacheIds[0].uuid === '') {
|
|
525
|
-
logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
|
|
517
|
+
const storeInCache = (batch) => {
|
|
518
|
+
store(batch.map(entry => entry.bidResponse), function (error, cacheIds) {
|
|
519
|
+
cacheIds.forEach((cacheId, i) => {
|
|
520
|
+
const { auctionInstance, bidResponse, afterBidAdded } = batch[i];
|
|
521
|
+
if (error) {
|
|
522
|
+
logWarn(`Failed to save to the video cache: ${error}. Video bid must be discarded.`);
|
|
526
523
|
|
|
527
524
|
doCallbacksIfTimedout(auctionInstance, bidResponse);
|
|
528
525
|
} else {
|
|
529
|
-
|
|
526
|
+
if (cacheId.uuid === '') {
|
|
527
|
+
logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
|
|
530
528
|
|
|
531
|
-
|
|
532
|
-
|
|
529
|
+
doCallbacksIfTimedout(auctionInstance, bidResponse);
|
|
530
|
+
} else {
|
|
531
|
+
bidResponse.videoCacheKey = cacheId.uuid;
|
|
532
|
+
|
|
533
|
+
if (!bidResponse.vastUrl) {
|
|
534
|
+
bidResponse.vastUrl = getCacheUrl(bidResponse.videoCacheKey);
|
|
535
|
+
}
|
|
536
|
+
addBidToAuction(auctionInstance, bidResponse);
|
|
537
|
+
afterBidAdded();
|
|
533
538
|
}
|
|
534
|
-
addBidToAuction(auctionInstance, bidResponse);
|
|
535
|
-
afterBidAdded();
|
|
536
539
|
}
|
|
537
|
-
}
|
|
540
|
+
});
|
|
538
541
|
});
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
let batchSize, batchTimeout;
|
|
545
|
+
config.getConfig('cache', (cacheConfig) => {
|
|
546
|
+
batchSize = typeof cacheConfig.cache.batchSize === 'number' && cacheConfig.cache.batchSize > 0
|
|
547
|
+
? cacheConfig.cache.batchSize
|
|
548
|
+
: 1;
|
|
549
|
+
batchTimeout = typeof cacheConfig.cache.batchTimeout === 'number' && cacheConfig.cache.batchTimeout > 0
|
|
550
|
+
? cacheConfig.cache.batchTimeout
|
|
551
|
+
: 0;
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
export const batchingCache = (timeout = setTimeout, cache = storeInCache) => {
|
|
555
|
+
let batches = [[]];
|
|
556
|
+
let debouncing = false;
|
|
557
|
+
const noTimeout = cb => cb();
|
|
558
|
+
|
|
559
|
+
return function(auctionInstance, bidResponse, afterBidAdded) {
|
|
560
|
+
const batchFunc = batchTimeout > 0 ? timeout : noTimeout;
|
|
561
|
+
if (batches[batches.length - 1].length >= batchSize) {
|
|
562
|
+
batches.push([]);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
batches[batches.length - 1].push({auctionInstance, bidResponse, afterBidAdded});
|
|
566
|
+
|
|
567
|
+
if (!debouncing) {
|
|
568
|
+
debouncing = true;
|
|
569
|
+
batchFunc(() => {
|
|
570
|
+
batches.forEach(cache);
|
|
571
|
+
batches = [[]];
|
|
572
|
+
debouncing = false;
|
|
573
|
+
}, batchTimeout);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
|
|
578
|
+
const batchAndStore = batchingCache();
|
|
579
|
+
|
|
580
|
+
export const callPrebidCache = hook('async', function(auctionInstance, bidResponse, afterBidAdded, videoMediaType) {
|
|
581
|
+
batchAndStore(auctionInstance, bidResponse, afterBidAdded);
|
|
539
582
|
}, 'callPrebidCache');
|
|
540
583
|
|
|
541
584
|
// Postprocess the bids so that all the universal properties exist, no matter which bidder they came from.
|
package/src/native.js
CHANGED
|
@@ -735,6 +735,7 @@ function toLegacyResponse(ortbResponse, ortbRequest) {
|
|
|
735
735
|
const legacyResponse = {};
|
|
736
736
|
const requestAssets = ortbRequest?.assets || [];
|
|
737
737
|
legacyResponse.clickUrl = ortbResponse.link.url;
|
|
738
|
+
legacyResponse.privacyLink = ortbResponse.privacy;
|
|
738
739
|
for (const asset of ortbResponse?.assets || []) {
|
|
739
740
|
const requestAsset = requestAssets.find(reqAsset => asset.id === reqAsset.id);
|
|
740
741
|
if (asset.title) {
|
package/src/refererDetection.js
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
import { config } from './config.js';
|
|
12
12
|
import {logWarn} from './utils.js';
|
|
13
13
|
|
|
14
|
+
let RI = new WeakMap();
|
|
15
|
+
|
|
14
16
|
/**
|
|
15
17
|
* Prepend a URL with the page's protocol (http/https), if necessary.
|
|
16
18
|
*/
|
|
@@ -252,10 +254,19 @@ export function detectReferer(win) {
|
|
|
252
254
|
};
|
|
253
255
|
}
|
|
254
256
|
|
|
255
|
-
return
|
|
257
|
+
return function() {
|
|
258
|
+
if (!RI.has(win)) {
|
|
259
|
+
RI.set(win, Object.freeze(refererInfo()));
|
|
260
|
+
}
|
|
261
|
+
return RI.get(win);
|
|
262
|
+
}
|
|
256
263
|
}
|
|
257
264
|
|
|
258
265
|
/**
|
|
259
266
|
* @type {function(): refererInfo}
|
|
260
267
|
*/
|
|
261
268
|
export const getRefererInfo = detectReferer(window);
|
|
269
|
+
|
|
270
|
+
export function resetRefererInfo() {
|
|
271
|
+
RI = new WeakMap();
|
|
272
|
+
}
|
package/src/videoCache.js
CHANGED
|
@@ -13,6 +13,12 @@ import { ajax } from './ajax.js';
|
|
|
13
13
|
import { config } from './config.js';
|
|
14
14
|
import {auctionManager} from './auctionManager.js';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Might be useful to be configurable in the future
|
|
18
|
+
* Depending on publisher needs
|
|
19
|
+
*/
|
|
20
|
+
const ttlBufferInSeconds = 15;
|
|
21
|
+
|
|
16
22
|
/**
|
|
17
23
|
* @typedef {object} CacheableUrlBid
|
|
18
24
|
* @property {string} vastUrl A URL which loads some valid VAST XML.
|
|
@@ -63,11 +69,11 @@ function wrapURI(uri, impUrl) {
|
|
|
63
69
|
function toStorageRequest(bid, {index = auctionManager.index} = {}) {
|
|
64
70
|
const vastValue = bid.vastXml ? bid.vastXml : wrapURI(bid.vastUrl, bid.vastImpUrl);
|
|
65
71
|
const auction = index.getAuction(bid);
|
|
66
|
-
|
|
72
|
+
const ttlWithBuffer = Number(bid.ttl) + ttlBufferInSeconds;
|
|
67
73
|
let payload = {
|
|
68
74
|
type: 'xml',
|
|
69
75
|
value: vastValue,
|
|
70
|
-
ttlseconds:
|
|
76
|
+
ttlseconds: ttlWithBuffer
|
|
71
77
|
};
|
|
72
78
|
|
|
73
79
|
if (config.getConfig('cache.vasttrack')) {
|
|
@@ -17,6 +17,9 @@ describe('Adkernel adapter', function () {
|
|
|
17
17
|
banner: {
|
|
18
18
|
sizes: [[300, 250], [300, 200]]
|
|
19
19
|
}
|
|
20
|
+
},
|
|
21
|
+
ortb2Imp: {
|
|
22
|
+
battr: [6, 7, 9]
|
|
20
23
|
}
|
|
21
24
|
}, bid2_zone2 = {
|
|
22
25
|
bidder: 'adkernel',
|
|
@@ -95,12 +98,12 @@ describe('Adkernel adapter', function () {
|
|
|
95
98
|
params: {
|
|
96
99
|
zoneId: 1,
|
|
97
100
|
host: 'rtb.adkernel.com',
|
|
98
|
-
video: {api: [1, 2]}
|
|
99
101
|
},
|
|
100
102
|
mediaTypes: {
|
|
101
103
|
video: {
|
|
102
104
|
context: 'instream',
|
|
103
|
-
playerSize: [[640, 480]]
|
|
105
|
+
playerSize: [[640, 480]],
|
|
106
|
+
api: [1, 2]
|
|
104
107
|
}
|
|
105
108
|
},
|
|
106
109
|
adUnitCode: 'ad-unit-1'
|
|
@@ -293,6 +296,7 @@ describe('Adkernel adapter', function () {
|
|
|
293
296
|
|
|
294
297
|
describe('banner request building', function () {
|
|
295
298
|
let bidRequest, bidRequests, _;
|
|
299
|
+
|
|
296
300
|
before(function () {
|
|
297
301
|
[_, bidRequests] = buildRequest([bid1_zone1]);
|
|
298
302
|
bidRequest = bidRequests[0];
|
|
@@ -337,6 +341,11 @@ describe('Adkernel adapter', function () {
|
|
|
337
341
|
expect(bidRequest.device).to.have.property('dnt', 1);
|
|
338
342
|
});
|
|
339
343
|
|
|
344
|
+
it('should copy FPD to imp.banner', function() {
|
|
345
|
+
expect(bidRequest.imp[0].banner).to.have.property('battr');
|
|
346
|
+
expect(bidRequest.imp[0].banner.battr).to.be.eql([6, 7, 9]);
|
|
347
|
+
});
|
|
348
|
+
|
|
340
349
|
it('shouldn\'t contain gdpr nor ccpa information for default request', function () {
|
|
341
350
|
let [_, bidRequests] = buildRequest([bid1_zone1]);
|
|
342
351
|
expect(bidRequests[0]).to.not.have.property('regs');
|
|
@@ -297,25 +297,18 @@ describe('adriverAdapter', function () {
|
|
|
297
297
|
{ adrcid: undefined }
|
|
298
298
|
]
|
|
299
299
|
cookieValues.forEach(cookieValue => describe('test cookie exist or not behavior', function () {
|
|
300
|
-
let expectedValues =
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
tmax: '',
|
|
305
|
-
site: '',
|
|
306
|
-
id: '',
|
|
307
|
-
user: '',
|
|
308
|
-
device: '',
|
|
309
|
-
imp: ''
|
|
310
|
-
}
|
|
300
|
+
let expectedValues = [
|
|
301
|
+
'buyerid',
|
|
302
|
+
'ext'
|
|
303
|
+
]
|
|
311
304
|
|
|
312
305
|
it('check adrcid if it exists', function () {
|
|
313
306
|
bidRequests[0].userId.adrcid = cookieValue.adrcid;
|
|
314
307
|
const payload = JSON.parse(spec.buildRequests(bidRequests).data);
|
|
315
308
|
if (cookieValue.adrcid) {
|
|
316
|
-
expect(Object.keys(payload)).to.have.members(
|
|
309
|
+
expect(Object.keys(payload.user)).to.have.members(expectedValues);
|
|
317
310
|
} else {
|
|
318
|
-
expect(payload.
|
|
311
|
+
expect(payload.user.buyerid).to.equal(0);
|
|
319
312
|
}
|
|
320
313
|
});
|
|
321
314
|
}));
|
|
@@ -32,7 +32,6 @@ describe('AdriverIdSystem', function () {
|
|
|
32
32
|
expect(request.url).to.include('https://ad.adriver.ru/cgi-bin/json.cgi');
|
|
33
33
|
request.respond(503, null, 'Unavailable');
|
|
34
34
|
expect(logErrorStub.calledOnce).to.be.true;
|
|
35
|
-
expect(callbackSpy.calledOnce).to.be.true;
|
|
36
35
|
});
|
|
37
36
|
|
|
38
37
|
it('test call user sync url with the right params', function() {
|
|
@@ -67,16 +66,12 @@ describe('AdriverIdSystem', function () {
|
|
|
67
66
|
let request = server.requests[0];
|
|
68
67
|
request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ adrcid: response.adrcid }));
|
|
69
68
|
|
|
70
|
-
let
|
|
71
|
-
|
|
69
|
+
let now = new Date();
|
|
70
|
+
now.setTime(now.getTime() + 86400 * 1825 * 1000);
|
|
72
71
|
const minimalDate = new Date(0).toString();
|
|
73
72
|
|
|
74
|
-
function dateStringFor(date, maxDeltaMs = 2000) {
|
|
75
|
-
return sinon.match((val) => Math.abs(date.getTime() - new Date(val).getTime()) <= maxDeltaMs)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
73
|
if (response.adrcid) {
|
|
79
|
-
expect(setCookieStub.calledWith('adrcid', response.adrcid,
|
|
74
|
+
expect(setCookieStub.calledWith('adrcid', response.adrcid, now.toUTCString())).to.be.true;
|
|
80
75
|
expect(setLocalStorageStub.calledWith('adrcid', response.adrcid)).to.be.true;
|
|
81
76
|
} else {
|
|
82
77
|
expect(setCookieStub.calledWith('adrcid', '', minimalDate)).to.be.false;
|
|
@@ -20,6 +20,7 @@ const aliasEP = {
|
|
|
20
20
|
janet: 'https://ghb.bidder.jmgads.com/v2/auction/',
|
|
21
21
|
pgam: 'https://ghb.pgamssp.com/v2/auction/',
|
|
22
22
|
ocm: 'https://ghb.cenarius.orangeclickmedia.com/v2/auction/',
|
|
23
|
+
vidcrunchllc: 'https://ghb.platform.vidcrunch.com/v2/auction/',
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
const DEFAULT_ADATPER_REQ = { bidderCode: 'adtelligent' };
|
|
@@ -6,6 +6,7 @@ const REQUEST = {
|
|
|
6
6
|
'bidId': '456',
|
|
7
7
|
'bidder': 'alkimi',
|
|
8
8
|
'sizes': [[300, 250]],
|
|
9
|
+
'adUnitCode': 'bannerAdUnitCode',
|
|
9
10
|
'mediaTypes': {
|
|
10
11
|
'banner': {
|
|
11
12
|
'sizes': [[300, 250]]
|
|
@@ -138,7 +139,7 @@ describe('alkimiBidAdapter', function () {
|
|
|
138
139
|
expect(bidderRequest.data.requestId).to.equal('123')
|
|
139
140
|
expect(bidderRequest.data.referer).to.equal('http://test.com/path.html')
|
|
140
141
|
expect(bidderRequest.data.schain).to.deep.contains({ver: '1.0', complete: 1, nodes: [{asi: 'alkimi-onboarding.com', sid: '00001', hp: 1}]})
|
|
141
|
-
expect(bidderRequest.data.signRequest.bids).to.deep.contains({ token: 'e64782a4-8e68-4c38-965b-80ccf115d46f', pos: 7, bidFloor: 0.1, width: 300, height: 250, impMediaType: 'Banner' })
|
|
142
|
+
expect(bidderRequest.data.signRequest.bids).to.deep.contains({ token: 'e64782a4-8e68-4c38-965b-80ccf115d46f', pos: 7, bidFloor: 0.1, width: 300, height: 250, impMediaType: 'Banner', adUnitCode: 'bannerAdUnitCode' })
|
|
142
143
|
expect(bidderRequest.data.signRequest.randomUUID).to.equal(undefined)
|
|
143
144
|
expect(bidderRequest.data.bidIds).to.deep.contains('456')
|
|
144
145
|
expect(bidderRequest.data.signature).to.equal(undefined)
|
|
@@ -85,6 +85,23 @@ describe('betweenBidAdapterTests', function () {
|
|
|
85
85
|
|
|
86
86
|
expect(req_data.cur).to.equal('THX');
|
|
87
87
|
});
|
|
88
|
+
it('validate default cur USD', function() {
|
|
89
|
+
let bidRequestData = [{
|
|
90
|
+
bidId: 'bid1234',
|
|
91
|
+
bidder: 'between',
|
|
92
|
+
params: {
|
|
93
|
+
w: 240,
|
|
94
|
+
h: 400,
|
|
95
|
+
s: 1112
|
|
96
|
+
},
|
|
97
|
+
sizes: [[240, 400]]
|
|
98
|
+
}];
|
|
99
|
+
|
|
100
|
+
let request = spec.buildRequests(bidRequestData);
|
|
101
|
+
let req_data = JSON.parse(request.data)[0].data;
|
|
102
|
+
|
|
103
|
+
expect(req_data.cur).to.equal('USD');
|
|
104
|
+
});
|
|
88
105
|
it('validate subid param', function() {
|
|
89
106
|
let bidRequestData = [{
|
|
90
107
|
bidId: 'bid1234',
|
|
@@ -260,15 +260,15 @@ describe('BidWatch Analytics', function () {
|
|
|
260
260
|
describe('main test flow', function () {
|
|
261
261
|
beforeEach(function () {
|
|
262
262
|
sinon.stub(events, 'getEvents').returns([]);
|
|
263
|
+
sinon.spy(bidwatchAnalytics, 'track');
|
|
263
264
|
});
|
|
264
|
-
|
|
265
265
|
afterEach(function () {
|
|
266
266
|
events.getEvents.restore();
|
|
267
|
+
bidwatchAnalytics.disableAnalytics();
|
|
268
|
+
bidwatchAnalytics.track.restore();
|
|
267
269
|
});
|
|
268
270
|
|
|
269
|
-
it('
|
|
270
|
-
sinon.spy(bidwatchAnalytics, 'track');
|
|
271
|
-
|
|
271
|
+
it('test auctionEnd', function () {
|
|
272
272
|
adapterManager.registerAnalyticsAdapter({
|
|
273
273
|
code: 'bidwatch',
|
|
274
274
|
adapter: bidwatchAnalytics
|
|
@@ -280,6 +280,9 @@ describe('BidWatch Analytics', function () {
|
|
|
280
280
|
domain: 'test'
|
|
281
281
|
}
|
|
282
282
|
});
|
|
283
|
+
|
|
284
|
+
events.emit(constants.EVENTS.BID_REQUESTED, auctionEnd['bidderRequests'][0]);
|
|
285
|
+
events.emit(constants.EVENTS.BID_RESPONSE, auctionEnd['bidsReceived'][0]);
|
|
283
286
|
events.emit(constants.EVENTS.BID_TIMEOUT, bidTimeout);
|
|
284
287
|
events.emit(constants.EVENTS.AUCTION_END, auctionEnd);
|
|
285
288
|
expect(server.requests.length).to.equal(1);
|
|
@@ -287,18 +290,31 @@ describe('BidWatch Analytics', function () {
|
|
|
287
290
|
expect(message).to.have.property('auctionEnd').exist;
|
|
288
291
|
expect(message.auctionEnd).to.have.lengthOf(1);
|
|
289
292
|
expect(message.auctionEnd[0]).to.have.property('bidsReceived').and.to.have.lengthOf(1);
|
|
290
|
-
expect(message.auctionEnd[0].bidsReceived[0]).to.have.property('ad');
|
|
291
|
-
expect(message.auctionEnd[0].bidsReceived[0].ad).to.equal('emptied');
|
|
293
|
+
expect(message.auctionEnd[0].bidsReceived[0]).not.to.have.property('ad');
|
|
292
294
|
expect(message.auctionEnd[0]).to.have.property('bidderRequests').and.to.have.lengthOf(1);
|
|
293
295
|
expect(message.auctionEnd[0].bidderRequests[0]).to.have.property('gdprConsent');
|
|
294
|
-
expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).to.have.property('vendorData');
|
|
295
|
-
|
|
296
|
+
expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).not.to.have.property('vendorData');
|
|
297
|
+
sinon.assert.callCount(bidwatchAnalytics.track, 4);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('test bidWon', function() {
|
|
301
|
+
adapterManager.registerAnalyticsAdapter({
|
|
302
|
+
code: 'bidwatch',
|
|
303
|
+
adapter: bidwatchAnalytics
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
adapterManager.enableAnalytics({
|
|
307
|
+
provider: 'bidwatch',
|
|
308
|
+
options: {
|
|
309
|
+
domain: 'test'
|
|
310
|
+
}
|
|
311
|
+
});
|
|
296
312
|
events.emit(constants.EVENTS.BID_WON, bidWon);
|
|
297
|
-
expect(server.requests.length).to.equal(
|
|
298
|
-
message = JSON.parse(server.requests[
|
|
299
|
-
expect(message).to.have.property('ad')
|
|
313
|
+
expect(server.requests.length).to.equal(1);
|
|
314
|
+
let message = JSON.parse(server.requests[0].requestBody);
|
|
315
|
+
expect(message).not.to.have.property('ad');
|
|
300
316
|
expect(message).to.have.property('cpmIncrement').and.to.equal(27.4276);
|
|
301
|
-
sinon.assert.callCount(bidwatchAnalytics.track,
|
|
317
|
+
sinon.assert.callCount(bidwatchAnalytics.track, 1);
|
|
302
318
|
});
|
|
303
319
|
});
|
|
304
320
|
});
|
|
@@ -13,7 +13,7 @@ import * as utils from 'src/utils.js';
|
|
|
13
13
|
import * as refererDetection from 'src/refererDetection.js';
|
|
14
14
|
import { config } from '../../../src/config.js';
|
|
15
15
|
import * as storageManager from 'src/storageManager.js';
|
|
16
|
-
import {BANNER, NATIVE, VIDEO} from '../../../src/mediaTypes.js';
|
|
16
|
+
import { BANNER, NATIVE, VIDEO } from '../../../src/mediaTypes.js';
|
|
17
17
|
|
|
18
18
|
describe('The Criteo bidding adapter', function () {
|
|
19
19
|
let utilsMock, sandbox;
|
|
@@ -707,7 +707,7 @@ describe('The Criteo bidding adapter', function () {
|
|
|
707
707
|
expect(ortbRequest.slots[0].sizes[0]).to.equal('undefinedxundefined');
|
|
708
708
|
});
|
|
709
709
|
|
|
710
|
-
it('should properly detect and
|
|
710
|
+
it('should properly detect and forward native flag', function () {
|
|
711
711
|
const bidRequests = [
|
|
712
712
|
{
|
|
713
713
|
mediaTypes: {
|
|
@@ -722,11 +722,10 @@ describe('The Criteo bidding adapter', function () {
|
|
|
722
722
|
];
|
|
723
723
|
const request = spec.buildRequests(bidRequests, bidderRequest);
|
|
724
724
|
const ortbRequest = request.data;
|
|
725
|
-
expect(ortbRequest.slots[0].
|
|
726
|
-
expect(ortbRequest.slots[0].sizes[0]).to.equal('2x2');
|
|
725
|
+
expect(ortbRequest.slots[0].native).to.equal(true);
|
|
727
726
|
});
|
|
728
727
|
|
|
729
|
-
it('should properly detect and
|
|
728
|
+
it('should properly detect and forward native flag', function () {
|
|
730
729
|
const bidRequests = [
|
|
731
730
|
{
|
|
732
731
|
mediaTypes: {
|
|
@@ -741,8 +740,7 @@ describe('The Criteo bidding adapter', function () {
|
|
|
741
740
|
];
|
|
742
741
|
const request = spec.buildRequests(bidRequests, bidderRequest);
|
|
743
742
|
const ortbRequest = request.data;
|
|
744
|
-
expect(ortbRequest.slots[0].
|
|
745
|
-
expect(ortbRequest.slots[0].sizes[0]).to.equal('2x2');
|
|
743
|
+
expect(ortbRequest.slots[0].native).to.equal(true);
|
|
746
744
|
});
|
|
747
745
|
|
|
748
746
|
it('should properly build a networkId request', function () {
|
|
@@ -1258,11 +1256,13 @@ describe('The Criteo bidding adapter', function () {
|
|
|
1258
1256
|
if (inputParams.mediaType === BANNER && inputParams.size[0] === 300 && inputParams.size[1] === 250) {
|
|
1259
1257
|
return {
|
|
1260
1258
|
currency: 'USD',
|
|
1261
|
-
floor: 1.0
|
|
1259
|
+
floor: 1.0
|
|
1260
|
+
};
|
|
1262
1261
|
} else if (inputParams.mediaType === BANNER && inputParams.size[0] === 728 && inputParams.size[1] === 90) {
|
|
1263
1262
|
return {
|
|
1264
1263
|
currency: 'USD',
|
|
1265
|
-
floor: 2.0
|
|
1264
|
+
floor: 2.0
|
|
1265
|
+
};
|
|
1266
1266
|
} else {
|
|
1267
1267
|
return {}
|
|
1268
1268
|
}
|
|
@@ -1273,9 +1273,10 @@ describe('The Criteo bidding adapter', function () {
|
|
|
1273
1273
|
const request = spec.buildRequests(bidRequests, bidderRequest);
|
|
1274
1274
|
expect(request.data.slots[0].ext.floors).to.deep.equal({
|
|
1275
1275
|
'banner': {
|
|
1276
|
-
'300x250': {'currency': 'USD', 'floor': 1},
|
|
1277
|
-
'728x90': {'currency': 'USD', 'floor': 2}
|
|
1278
|
-
}
|
|
1276
|
+
'300x250': { 'currency': 'USD', 'floor': 1 },
|
|
1277
|
+
'728x90': { 'currency': 'USD', 'floor': 2 }
|
|
1278
|
+
}
|
|
1279
|
+
});
|
|
1279
1280
|
});
|
|
1280
1281
|
|
|
1281
1282
|
it('should properly build a video request with several player sizes with floors', function () {
|
|
@@ -1297,11 +1298,13 @@ describe('The Criteo bidding adapter', function () {
|
|
|
1297
1298
|
if (inputParams.mediaType === VIDEO && inputParams.size[0] === 300 && inputParams.size[1] === 250) {
|
|
1298
1299
|
return {
|
|
1299
1300
|
currency: 'USD',
|
|
1300
|
-
floor: 1.0
|
|
1301
|
+
floor: 1.0
|
|
1302
|
+
};
|
|
1301
1303
|
} else if (inputParams.mediaType === VIDEO && inputParams.size[0] === 728 && inputParams.size[1] === 90) {
|
|
1302
1304
|
return {
|
|
1303
1305
|
currency: 'USD',
|
|
1304
|
-
floor: 2.0
|
|
1306
|
+
floor: 2.0
|
|
1307
|
+
};
|
|
1305
1308
|
} else {
|
|
1306
1309
|
return {}
|
|
1307
1310
|
}
|
|
@@ -1312,9 +1315,10 @@ describe('The Criteo bidding adapter', function () {
|
|
|
1312
1315
|
const request = spec.buildRequests(bidRequests, bidderRequest);
|
|
1313
1316
|
expect(request.data.slots[0].ext.floors).to.deep.equal({
|
|
1314
1317
|
'video': {
|
|
1315
|
-
'300x250': {'currency': 'USD', 'floor': 1},
|
|
1316
|
-
'728x90': {'currency': 'USD', 'floor': 2}
|
|
1317
|
-
}
|
|
1318
|
+
'300x250': { 'currency': 'USD', 'floor': 1 },
|
|
1319
|
+
'728x90': { 'currency': 'USD', 'floor': 2 }
|
|
1320
|
+
}
|
|
1321
|
+
});
|
|
1318
1322
|
});
|
|
1319
1323
|
|
|
1320
1324
|
it('should properly build a multi format request with floors', function () {
|
|
@@ -1347,19 +1351,23 @@ describe('The Criteo bidding adapter', function () {
|
|
|
1347
1351
|
if (inputParams.mediaType === BANNER && inputParams.size[0] === 300 && inputParams.size[1] === 250) {
|
|
1348
1352
|
return {
|
|
1349
1353
|
currency: 'USD',
|
|
1350
|
-
floor: 1.0
|
|
1354
|
+
floor: 1.0
|
|
1355
|
+
};
|
|
1351
1356
|
} else if (inputParams.mediaType === BANNER && inputParams.size[0] === 728 && inputParams.size[1] === 90) {
|
|
1352
1357
|
return {
|
|
1353
1358
|
currency: 'USD',
|
|
1354
|
-
floor: 2.0
|
|
1359
|
+
floor: 2.0
|
|
1360
|
+
};
|
|
1355
1361
|
} else if (inputParams.mediaType === VIDEO && inputParams.size[0] === 640 && inputParams.size[1] === 480) {
|
|
1356
1362
|
return {
|
|
1357
1363
|
currency: 'EUR',
|
|
1358
|
-
floor: 3.2
|
|
1364
|
+
floor: 3.2
|
|
1365
|
+
};
|
|
1359
1366
|
} else if (inputParams.mediaType === NATIVE && inputParams.size === '*') {
|
|
1360
1367
|
return {
|
|
1361
1368
|
currency: 'YEN',
|
|
1362
|
-
floor: 4.99
|
|
1369
|
+
floor: 4.99
|
|
1370
|
+
};
|
|
1363
1371
|
} else {
|
|
1364
1372
|
return {}
|
|
1365
1373
|
}
|
|
@@ -1371,15 +1379,16 @@ describe('The Criteo bidding adapter', function () {
|
|
|
1371
1379
|
expect(request.data.slots[0].ext.data.someContextAttribute).to.deep.equal('abc');
|
|
1372
1380
|
expect(request.data.slots[0].ext.floors).to.deep.equal({
|
|
1373
1381
|
'banner': {
|
|
1374
|
-
'300x250': {'currency': 'USD', 'floor': 1},
|
|
1375
|
-
'728x90': {'currency': 'USD', 'floor': 2}
|
|
1382
|
+
'300x250': { 'currency': 'USD', 'floor': 1 },
|
|
1383
|
+
'728x90': { 'currency': 'USD', 'floor': 2 }
|
|
1376
1384
|
},
|
|
1377
1385
|
'video': {
|
|
1378
|
-
'640x480': {'currency': 'EUR', 'floor': 3.2}
|
|
1386
|
+
'640x480': { 'currency': 'EUR', 'floor': 3.2 }
|
|
1379
1387
|
},
|
|
1380
1388
|
'native': {
|
|
1381
|
-
'*': {'currency': 'YEN', 'floor': 4.99}
|
|
1382
|
-
}
|
|
1389
|
+
'*': { 'currency': 'YEN', 'floor': 4.99 }
|
|
1390
|
+
}
|
|
1391
|
+
});
|
|
1383
1392
|
});
|
|
1384
1393
|
});
|
|
1385
1394
|
|