prebid.js 5.18.0 → 6.1.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 -10
- package/README.md +3 -1
- package/browsers.json +1 -8
- package/gulpfile.js +1 -0
- package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +21 -16
- package/modules/adheseBidAdapter.js +7 -2
- package/modules/adkernelBidAdapter.js +1 -0
- package/modules/adlivetechBidAdapter.md +61 -0
- package/modules/adomikAnalyticsAdapter.js +10 -4
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/airgridRtdProvider.js +1 -1
- package/modules/akamaiDapRtdProvider.js +474 -0
- package/modules/akamaiDapRtdProvider.md +47 -0
- package/modules/appnexusBidAdapter.js +9 -3
- package/modules/atsAnalyticsAdapter.js +67 -46
- package/modules/atsAnalyticsAdapter.md +1 -0
- package/modules/betweenBidAdapter.js +20 -3
- package/modules/browsiRtdProvider.js +106 -18
- package/modules/cleanioRtdProvider.js +192 -0
- package/modules/cleanioRtdProvider.md +59 -0
- package/modules/codefuelBidAdapter.js +181 -0
- package/modules/codefuelBidAdapter.md +111 -0
- package/modules/connectIdSystem.js +104 -0
- package/modules/connectIdSystem.md +33 -0
- package/modules/datablocksBidAdapter.js +3 -3
- package/modules/deepintentBidAdapter.js +107 -10
- package/modules/deepintentBidAdapter.md +36 -1
- package/modules/deltaprojectsBidAdapter.js +252 -0
- package/modules/deltaprojectsBidAdapter.md +32 -0
- package/modules/engageyaBidAdapter.js +171 -0
- package/modules/glimpseBidAdapter.js +31 -16
- package/modules/gptPreAuction.js +11 -5
- package/modules/gridBidAdapter.js +1 -0
- package/modules/gumgumBidAdapter.js +8 -0
- package/modules/id5IdSystem.md +6 -6
- package/modules/imRtdProvider.js +31 -0
- package/modules/inskinBidAdapter.js +7 -3
- package/modules/ixBidAdapter.js +174 -22
- package/modules/jixieBidAdapter.js +8 -2
- package/modules/justpremiumBidAdapter.js +6 -1
- package/modules/limelightDigitalBidAdapter.js +22 -2
- package/modules/livewrappedAnalyticsAdapter.js +49 -1
- package/modules/merkleIdSystem.js +5 -0
- package/modules/multibid/index.js +3 -3
- package/modules/nativoBidAdapter.js +32 -2
- package/modules/nextMillenniumBidAdapter.js +12 -3
- package/modules/oguryBidAdapter.js +16 -2
- package/modules/openxBidAdapter.js +40 -23
- package/modules/operaadsBidAdapter.js +21 -1
- package/modules/otmBidAdapter.js +146 -0
- package/modules/otmBidAdapter.md +27 -26
- package/modules/outbrainBidAdapter.js +5 -0
- package/modules/playwireBidAdapter.md +61 -0
- package/modules/prebidServerBidAdapter/index.js +3 -3
- package/modules/publinkIdSystem.js +11 -6
- package/modules/pubmaticBidAdapter.js +2 -0
- package/modules/rtdModule/index.js +2 -2
- package/modules/saambaaBidAdapter.js +420 -0
- package/modules/saambaaBidAdapter.md +65 -68
- package/modules/seedtagBidAdapter.js +6 -0
- package/modules/smaatoBidAdapter.js +6 -1
- package/modules/sonobiBidAdapter.js +7 -0
- package/modules/sortableBidAdapter.js +1 -0
- package/modules/sspBCBidAdapter.js +34 -3
- package/modules/teadsBidAdapter.js +3 -0
- package/modules/tripleliftBidAdapter.js +22 -5
- package/modules/trustxBidAdapter.js +18 -7
- package/modules/undertoneBidAdapter.js +9 -5
- package/modules/undertoneBidAdapter.md +5 -1
- package/modules/userId/eids.js +18 -0
- package/modules/userId/eids.md +7 -0
- package/modules/userId/userId.md +12 -0
- package/modules/ventesBidAdapter.js +370 -0
- package/modules/ventesBidAdapter.md +94 -0
- package/modules/videobyteBidAdapter.js +13 -6
- package/modules/videobyteBidAdapter.md +49 -0
- package/modules/vidoomyBidAdapter.js +51 -100
- package/modules/visxBidAdapter.js +1 -1
- package/modules/yahoosspBidAdapter.js +6 -6
- package/modules/yieldlabBidAdapter.js +41 -10
- package/modules/yieldlabBidAdapter.md +91 -48
- package/modules/yieldmoSyntheticInventoryModule.js +46 -0
- package/modules/yieldmoSyntheticInventoryModule.md +68 -0
- package/package.json +6 -1
- package/src/adapterManager.js +19 -8
- package/src/adapters/bidderFactory.js +4 -3
- package/src/auction.js +11 -11
- package/src/constants.json +1 -0
- package/src/secureCreatives.js +6 -7
- package/src/targeting.js +11 -9
- package/test/spec/modules/adfBidAdapter_spec.js +83 -29
- package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +16 -1
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
- package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
- package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
- package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
- package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
- package/test/spec/modules/connectIdSystem_spec.js +189 -0
- package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
- package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
- package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +422 -0
- package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
- package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
- package/test/spec/modules/gptPreAuction_spec.js +58 -4
- package/test/spec/modules/gumgumBidAdapter_spec.js +5 -1
- package/test/spec/modules/imRtdProvider_spec.js +25 -0
- package/test/spec/modules/ixBidAdapter_spec.js +298 -5
- package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
- package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
- package/test/spec/modules/konduitWrapper_spec.js +0 -1
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +52 -7
- package/test/spec/modules/merkleIdSystem_spec.js +18 -0
- package/test/spec/modules/multibid_spec.js +31 -31
- package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +66 -23
- package/test/spec/modules/openxBidAdapter_spec.js +90 -13
- package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
- package/test/spec/modules/otmBidAdapter_spec.js +67 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +19 -2
- package/test/spec/modules/publinkIdSystem_spec.js +6 -6
- package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
- package/test/spec/modules/smaatoBidAdapter_spec.js +30 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
- package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
- package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +45 -3
- package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
- package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
- package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
- package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
- package/test/spec/modules/visxBidAdapter_spec.js +1 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
- package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
- package/test/spec/unit/core/adapterManager_spec.js +56 -6
- package/test/spec/unit/core/bidderFactory_spec.js +61 -1
- package/test/spec/unit/pbjs_api_spec.js +37 -2
- package/test/spec/unit/secureCreatives_spec.js +54 -25
- package/wdio.conf.js +1 -1
package/src/adapterManager.js
CHANGED
|
@@ -262,14 +262,16 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a
|
|
|
262
262
|
}
|
|
263
263
|
|
|
264
264
|
let adUnitsS2SCopy = getAdUnitCopyForPrebidServer(adUnits, s2sConfig);
|
|
265
|
-
|
|
265
|
+
|
|
266
|
+
// uniquePbsTid is so we know which server to send which bids to during the callBids function
|
|
267
|
+
let uniquePbsTid = generateUUID();
|
|
266
268
|
adaptersServerSide.forEach(bidderCode => {
|
|
267
269
|
const bidderRequestId = getUniqueIdentifierStr();
|
|
268
270
|
const bidderRequest = {
|
|
269
271
|
bidderCode,
|
|
270
272
|
auctionId,
|
|
271
273
|
bidderRequestId,
|
|
272
|
-
|
|
274
|
+
uniquePbsTid,
|
|
273
275
|
bids: hookedGetBids({bidderCode, auctionId, bidderRequestId, 'adUnits': deepClone(adUnitsS2SCopy), labels, src: CONSTANTS.S2S.SRC}),
|
|
274
276
|
auctionStart: auctionStart,
|
|
275
277
|
timeout: s2sConfig.timeout,
|
|
@@ -350,7 +352,7 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
350
352
|
serverBidRequests.forEach(serverBidRequest => {
|
|
351
353
|
var index = -1;
|
|
352
354
|
for (var i = 0; i < uniqueServerBidRequests.length; ++i) {
|
|
353
|
-
if (serverBidRequest.
|
|
355
|
+
if (serverBidRequest.uniquePbsTid === uniqueServerBidRequests[i].uniquePbsTid) {
|
|
354
356
|
index = i;
|
|
355
357
|
break;
|
|
356
358
|
}
|
|
@@ -360,7 +362,10 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
360
362
|
}
|
|
361
363
|
});
|
|
362
364
|
|
|
363
|
-
let counter = 0
|
|
365
|
+
let counter = 0;
|
|
366
|
+
|
|
367
|
+
// $.source.tid MUST be a unique UUID and also THE SAME between all PBS Requests for a given Auction
|
|
368
|
+
const sourceTid = generateUUID();
|
|
364
369
|
_s2sConfigs.forEach((s2sConfig) => {
|
|
365
370
|
if (s2sConfig && uniqueServerBidRequests[counter] && includes(s2sConfig.bidders, uniqueServerBidRequests[counter].bidderCode)) {
|
|
366
371
|
// s2s should get the same client side timeout as other client side requests.
|
|
@@ -370,13 +375,13 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
370
375
|
} : undefined);
|
|
371
376
|
let adaptersServerSide = s2sConfig.bidders;
|
|
372
377
|
const s2sAdapter = _bidderRegistry[s2sConfig.adapter];
|
|
373
|
-
let
|
|
378
|
+
let uniquePbsTid = uniqueServerBidRequests[counter].uniquePbsTid;
|
|
374
379
|
let adUnitsS2SCopy = uniqueServerBidRequests[counter].adUnitsS2SCopy;
|
|
375
380
|
|
|
376
|
-
let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.
|
|
381
|
+
let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.uniquePbsTid === uniquePbsTid);
|
|
377
382
|
|
|
378
383
|
if (s2sAdapter) {
|
|
379
|
-
let s2sBidRequest = {tid, 'ad_units': adUnitsS2SCopy, s2sConfig};
|
|
384
|
+
let s2sBidRequest = {tid: sourceTid, 'ad_units': adUnitsS2SCopy, s2sConfig};
|
|
380
385
|
if (s2sBidRequest.ad_units.length) {
|
|
381
386
|
let doneCbs = uniqueServerRequests.map(bidRequest => {
|
|
382
387
|
bidRequest.start = timestamp();
|
|
@@ -391,7 +396,8 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request
|
|
|
391
396
|
|
|
392
397
|
// fire BID_REQUESTED event for each s2s bidRequest
|
|
393
398
|
uniqueServerRequests.forEach(bidRequest => {
|
|
394
|
-
|
|
399
|
+
// add the new sourceTid
|
|
400
|
+
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, {...bidRequest, tid: sourceTid});
|
|
395
401
|
});
|
|
396
402
|
|
|
397
403
|
// make bid requests
|
|
@@ -621,4 +627,9 @@ adapterManager.callBidViewableBidder = function(bidder, bid) {
|
|
|
621
627
|
tryCallBidderMethod(bidder, 'onBidViewable', bid);
|
|
622
628
|
};
|
|
623
629
|
|
|
630
|
+
adapterManager.callBidderError = function(bidder, error, bidderRequest) {
|
|
631
|
+
const param = { error, bidderRequest };
|
|
632
|
+
tryCallBidderMethod(bidder, 'onBidderError', param);
|
|
633
|
+
};
|
|
634
|
+
|
|
624
635
|
export default adapterManager;
|
|
@@ -335,10 +335,11 @@ export function newBidder(spec) {
|
|
|
335
335
|
|
|
336
336
|
// If the server responds with an error, there's not much we can do. Log it, and make sure to
|
|
337
337
|
// call onResponse() so that we're one step closer to calling done().
|
|
338
|
-
function onFailure(
|
|
338
|
+
function onFailure(errorMessage, error) {
|
|
339
339
|
onTimelyResponse(spec.code);
|
|
340
|
-
|
|
341
|
-
|
|
340
|
+
adapterManager.callBidderError(spec.code, error, bidderRequest)
|
|
341
|
+
events.emit(CONSTANTS.EVENTS.BIDDER_ERROR, { error, bidderRequest });
|
|
342
|
+
logError(`Server call for ${spec.code} failed: ${errorMessage} ${error.status}. Continuing without bids.`);
|
|
342
343
|
onResponse();
|
|
343
344
|
}
|
|
344
345
|
}
|
package/src/auction.js
CHANGED
|
@@ -613,7 +613,8 @@ export const getPriceGranularity = (mediaType, bidReq) => {
|
|
|
613
613
|
* @returns {function}
|
|
614
614
|
*/
|
|
615
615
|
export const getPriceByGranularity = (granularity) => {
|
|
616
|
-
return (bid) => {
|
|
616
|
+
return (bid, bidReq) => {
|
|
617
|
+
granularity = granularity || getPriceGranularity(bid.mediaType, bidReq);
|
|
617
618
|
if (granularity === CONSTANTS.GRANULARITY_OPTIONS.AUTO) {
|
|
618
619
|
return bid.pbAg;
|
|
619
620
|
} else if (granularity === CONSTANTS.GRANULARITY_OPTIONS.DENSE) {
|
|
@@ -646,14 +647,14 @@ export const getAdvertiserDomain = () => {
|
|
|
646
647
|
* @param {BidRequest} bidReq
|
|
647
648
|
* @returns {*}
|
|
648
649
|
*/
|
|
649
|
-
export function getStandardBidderSettings(mediaType, bidderCode
|
|
650
|
+
export function getStandardBidderSettings(mediaType, bidderCode) {
|
|
650
651
|
// factory for key value objs
|
|
651
652
|
function createKeyVal(key, value) {
|
|
652
653
|
return {
|
|
653
654
|
key,
|
|
654
655
|
val: (typeof value === 'function')
|
|
655
|
-
? function (bidResponse) {
|
|
656
|
-
return value(bidResponse);
|
|
656
|
+
? function (bidResponse, bidReq) {
|
|
657
|
+
return value(bidResponse, bidReq);
|
|
657
658
|
}
|
|
658
659
|
: function (bidResponse) {
|
|
659
660
|
return getValue(bidResponse, value);
|
|
@@ -661,7 +662,6 @@ export function getStandardBidderSettings(mediaType, bidderCode, bidReq) {
|
|
|
661
662
|
};
|
|
662
663
|
}
|
|
663
664
|
const TARGETING_KEYS = CONSTANTS.TARGETING_KEYS;
|
|
664
|
-
const granularity = getPriceGranularity(mediaType, bidReq);
|
|
665
665
|
|
|
666
666
|
let bidderSettings = $$PREBID_GLOBAL$$.bidderSettings;
|
|
667
667
|
if (!bidderSettings[CONSTANTS.JSON_MAPPING.BD_SETTING_STANDARD]) {
|
|
@@ -671,7 +671,7 @@ export function getStandardBidderSettings(mediaType, bidderCode, bidReq) {
|
|
|
671
671
|
bidderSettings[CONSTANTS.JSON_MAPPING.BD_SETTING_STANDARD][CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING] = [
|
|
672
672
|
createKeyVal(TARGETING_KEYS.BIDDER, 'bidderCode'),
|
|
673
673
|
createKeyVal(TARGETING_KEYS.AD_ID, 'adId'),
|
|
674
|
-
createKeyVal(TARGETING_KEYS.PRICE_BUCKET, getPriceByGranularity(
|
|
674
|
+
createKeyVal(TARGETING_KEYS.PRICE_BUCKET, getPriceByGranularity()),
|
|
675
675
|
createKeyVal(TARGETING_KEYS.SIZE, 'size'),
|
|
676
676
|
createKeyVal(TARGETING_KEYS.DEAL, 'dealId'),
|
|
677
677
|
createKeyVal(TARGETING_KEYS.SOURCE, 'source'),
|
|
@@ -716,12 +716,12 @@ export function getKeyValueTargetingPairs(bidderCode, custBidObj, bidReq) {
|
|
|
716
716
|
// 1) set the keys from "standard" setting or from prebid defaults
|
|
717
717
|
if (bidderSettings) {
|
|
718
718
|
// initialize default if not set
|
|
719
|
-
const standardSettings = getStandardBidderSettings(custBidObj.mediaType, bidderCode
|
|
720
|
-
setKeys(keyValues, standardSettings, custBidObj);
|
|
719
|
+
const standardSettings = getStandardBidderSettings(custBidObj.mediaType, bidderCode);
|
|
720
|
+
setKeys(keyValues, standardSettings, custBidObj, bidReq);
|
|
721
721
|
|
|
722
722
|
// 2) set keys from specific bidder setting override if they exist
|
|
723
723
|
if (bidderCode && bidderSettings[bidderCode] && bidderSettings[bidderCode][CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING]) {
|
|
724
|
-
setKeys(keyValues, bidderSettings[bidderCode], custBidObj);
|
|
724
|
+
setKeys(keyValues, bidderSettings[bidderCode], custBidObj, bidReq);
|
|
725
725
|
custBidObj.sendStandardTargeting = bidderSettings[bidderCode].sendStandardTargeting;
|
|
726
726
|
}
|
|
727
727
|
}
|
|
@@ -734,7 +734,7 @@ export function getKeyValueTargetingPairs(bidderCode, custBidObj, bidReq) {
|
|
|
734
734
|
return keyValues;
|
|
735
735
|
}
|
|
736
736
|
|
|
737
|
-
function setKeys(keyValues, bidderSettings, custBidObj) {
|
|
737
|
+
function setKeys(keyValues, bidderSettings, custBidObj, bidReq) {
|
|
738
738
|
var targeting = bidderSettings[CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING];
|
|
739
739
|
custBidObj.size = custBidObj.getSize();
|
|
740
740
|
|
|
@@ -748,7 +748,7 @@ function setKeys(keyValues, bidderSettings, custBidObj) {
|
|
|
748
748
|
|
|
749
749
|
if (isFn(value)) {
|
|
750
750
|
try {
|
|
751
|
-
value = value(custBidObj);
|
|
751
|
+
value = value(custBidObj, bidReq);
|
|
752
752
|
} catch (e) {
|
|
753
753
|
logError('bidmanager', 'ERROR', e);
|
|
754
754
|
}
|
package/src/constants.json
CHANGED
package/src/secureCreatives.js
CHANGED
|
@@ -60,7 +60,6 @@ export function receiveMessage(ev) {
|
|
|
60
60
|
if (data.action === 'assetRequest') {
|
|
61
61
|
const message = getAssetMessage(data, adObject);
|
|
62
62
|
ev.source.postMessage(JSON.stringify(message), ev.origin);
|
|
63
|
-
return;
|
|
64
63
|
} else if (data.action === 'allAssetRequest') {
|
|
65
64
|
const message = getAllAssetsMessage(data, adObject);
|
|
66
65
|
ev.source.postMessage(JSON.stringify(message), ev.origin);
|
|
@@ -68,13 +67,13 @@ export function receiveMessage(ev) {
|
|
|
68
67
|
adObject.height = data.height;
|
|
69
68
|
adObject.width = data.width;
|
|
70
69
|
resizeRemoteCreative(adObject);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (trackerType === 'click') { return; }
|
|
70
|
+
} else {
|
|
71
|
+
const trackerType = fireNativeTrackers(data, adObject);
|
|
72
|
+
if (trackerType === 'click') { return; }
|
|
75
73
|
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
auctionManager.addWinningBid(adObject);
|
|
75
|
+
events.emit(BID_WON, adObject);
|
|
76
|
+
}
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
}
|
package/src/targeting.js
CHANGED
|
@@ -123,17 +123,19 @@ export function newTargeting(auctionManager) {
|
|
|
123
123
|
if (isGptPubadsDefined()) {
|
|
124
124
|
const adUnitCodes = getAdUnitCodes(adUnitCode);
|
|
125
125
|
const adUnits = auctionManager.getAdUnits().filter(adUnit => includes(adUnitCodes, adUnit.code));
|
|
126
|
+
let unsetKeys = pbTargetingKeys.reduce((reducer, key) => {
|
|
127
|
+
reducer[key] = null;
|
|
128
|
+
return reducer;
|
|
129
|
+
}, {});
|
|
126
130
|
window.googletag.pubads().getSlots().forEach(slot => {
|
|
127
131
|
let customSlotMatchingFunc = isFn(customSlotMatching) && customSlotMatching(slot);
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
});
|
|
132
|
+
// reset only registered adunits
|
|
133
|
+
adUnits.forEach(unit => {
|
|
134
|
+
if (unit.code === slot.getAdUnitPath() ||
|
|
135
|
+
unit.code === slot.getSlotElementId() ||
|
|
136
|
+
(isFn(customSlotMatchingFunc) && customSlotMatchingFunc(unit.code))) {
|
|
137
|
+
slot.updateTargetingFromMap(unsetKeys);
|
|
138
|
+
}
|
|
137
139
|
});
|
|
138
140
|
});
|
|
139
141
|
}
|
|
@@ -29,11 +29,34 @@ describe('Adf adapter', function () {
|
|
|
29
29
|
|
|
30
30
|
it('should return true when required params found', function () {
|
|
31
31
|
assert(spec.isBidRequestValid(bid));
|
|
32
|
+
|
|
33
|
+
bid.params = {
|
|
34
|
+
inv: 1234,
|
|
35
|
+
mname: 'some-placement'
|
|
36
|
+
};
|
|
37
|
+
assert(spec.isBidRequestValid(bid));
|
|
38
|
+
|
|
39
|
+
bid.params = {
|
|
40
|
+
mid: 4332,
|
|
41
|
+
inv: 1234,
|
|
42
|
+
mname: 'some-placement'
|
|
43
|
+
};
|
|
44
|
+
assert(spec.isBidRequestValid(bid));
|
|
32
45
|
});
|
|
33
46
|
|
|
34
47
|
it('should return false when required params are missing', function () {
|
|
35
48
|
bid.params = { adxDomain: 'adx.adform.net' };
|
|
36
49
|
assert.isFalse(spec.isBidRequestValid(bid));
|
|
50
|
+
|
|
51
|
+
bid.params = {
|
|
52
|
+
mname: 'some-placement'
|
|
53
|
+
};
|
|
54
|
+
assert.isFalse(spec.isBidRequestValid(bid));
|
|
55
|
+
|
|
56
|
+
bid.params = {
|
|
57
|
+
inv: 1234
|
|
58
|
+
};
|
|
59
|
+
assert.isFalse(spec.isBidRequestValid(bid));
|
|
37
60
|
});
|
|
38
61
|
});
|
|
39
62
|
|
|
@@ -331,6 +354,30 @@ describe('Adf adapter', function () {
|
|
|
331
354
|
}
|
|
332
355
|
});
|
|
333
356
|
|
|
357
|
+
describe('dynamic placement tag', function () {
|
|
358
|
+
it('should add imp parameters correctly', function () {
|
|
359
|
+
const validBidRequests = [
|
|
360
|
+
{ bidId: 'bidId', params: { inv: 1000, mname: 'placement' }, mediaTypes: {video: {}} },
|
|
361
|
+
{ bidId: 'bidId', params: { mid: 1234, inv: 1002, mname: 'placement2' }, mediaTypes: {video: {}} },
|
|
362
|
+
{ bidId: 'bidId', params: { mid: 1234 }, mediaTypes: {video: {}} }
|
|
363
|
+
];
|
|
364
|
+
const [ imp1, imp2, imp3 ] = getRequestImps(validBidRequests);
|
|
365
|
+
|
|
366
|
+
assert.equal(imp1.ext.bidder.inv, 1000);
|
|
367
|
+
assert.equal(imp1.ext.bidder.mname, 'placement');
|
|
368
|
+
assert.equal('tagid' in imp1, false);
|
|
369
|
+
|
|
370
|
+
assert.equal(imp2.ext.bidder.inv, 1002);
|
|
371
|
+
assert.equal(imp2.ext.bidder.mname, 'placement2');
|
|
372
|
+
assert.equal(imp2.tagid, 1234);
|
|
373
|
+
|
|
374
|
+
assert.ok(imp3.ext.bidder);
|
|
375
|
+
assert.equal('inv' in imp3.ext.bidder, false);
|
|
376
|
+
assert.equal('mname' in imp3.ext.bidder, false);
|
|
377
|
+
assert.equal(imp3.tagid, 1234);
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
|
|
334
381
|
describe('price floors', function () {
|
|
335
382
|
it('should not add if floors module not configured', function () {
|
|
336
383
|
const validBidRequests = [{ bidId: 'bidId', params: {mid: 1000}, mediaTypes: {video: {}} }];
|
|
@@ -376,18 +423,14 @@ describe('Adf adapter', function () {
|
|
|
376
423
|
return {
|
|
377
424
|
currency: currency,
|
|
378
425
|
floor
|
|
379
|
-
}
|
|
426
|
+
};
|
|
380
427
|
}
|
|
381
428
|
};
|
|
382
429
|
}
|
|
383
|
-
|
|
384
|
-
function getRequestImps(validBidRequests) {
|
|
385
|
-
return JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
|
|
386
|
-
}
|
|
387
430
|
});
|
|
388
431
|
|
|
389
432
|
describe('multiple media types', function () {
|
|
390
|
-
it('should use
|
|
433
|
+
it('should use all configured media types for bidding', function () {
|
|
391
434
|
let validBidRequests = [{
|
|
392
435
|
bidId: 'bidId',
|
|
393
436
|
params: { mid: 1000 },
|
|
@@ -414,20 +457,23 @@ describe('Adf adapter', function () {
|
|
|
414
457
|
banner: {
|
|
415
458
|
sizes: [[100, 100], [200, 300]]
|
|
416
459
|
},
|
|
417
|
-
native: {}
|
|
460
|
+
native: {},
|
|
461
|
+
video: {}
|
|
418
462
|
}
|
|
419
463
|
}];
|
|
420
|
-
let [
|
|
421
|
-
|
|
422
|
-
assert.ok(
|
|
423
|
-
assert.
|
|
424
|
-
assert.equal(
|
|
425
|
-
|
|
426
|
-
assert.
|
|
427
|
-
assert.equal(
|
|
428
|
-
assert.
|
|
429
|
-
|
|
430
|
-
assert.
|
|
464
|
+
let [ first, second, third ] = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
|
|
465
|
+
|
|
466
|
+
assert.ok(first.banner);
|
|
467
|
+
assert.ok(first.video);
|
|
468
|
+
assert.equal(first.native, undefined);
|
|
469
|
+
|
|
470
|
+
assert.ok(second.video);
|
|
471
|
+
assert.equal(second.banner, undefined);
|
|
472
|
+
assert.equal(second.native, undefined);
|
|
473
|
+
|
|
474
|
+
assert.ok(third.native);
|
|
475
|
+
assert.ok(third.video);
|
|
476
|
+
assert.ok(third.banner);
|
|
431
477
|
});
|
|
432
478
|
});
|
|
433
479
|
|
|
@@ -626,6 +672,10 @@ describe('Adf adapter', function () {
|
|
|
626
672
|
});
|
|
627
673
|
});
|
|
628
674
|
});
|
|
675
|
+
|
|
676
|
+
function getRequestImps(validBidRequests) {
|
|
677
|
+
return JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data).imp;
|
|
678
|
+
}
|
|
629
679
|
});
|
|
630
680
|
|
|
631
681
|
describe('interpretResponse', function () {
|
|
@@ -754,7 +804,12 @@ describe('Adf adapter', function () {
|
|
|
754
804
|
imptrackers: ['imptrackers url1', 'imptrackers url2']
|
|
755
805
|
},
|
|
756
806
|
dealid: 'deal-id',
|
|
757
|
-
adomain: [ 'demo.com' ]
|
|
807
|
+
adomain: [ 'demo.com' ],
|
|
808
|
+
ext: {
|
|
809
|
+
prebid: {
|
|
810
|
+
type: 'native'
|
|
811
|
+
}
|
|
812
|
+
}
|
|
758
813
|
}
|
|
759
814
|
]
|
|
760
815
|
}],
|
|
@@ -767,7 +822,6 @@ describe('Adf adapter', function () {
|
|
|
767
822
|
{
|
|
768
823
|
bidId: 'bidId1',
|
|
769
824
|
params: { mid: 1000 },
|
|
770
|
-
mediaType: 'native',
|
|
771
825
|
nativeParams: {
|
|
772
826
|
title: { required: true, len: 140 },
|
|
773
827
|
image: { required: false, wmin: 836, hmin: 627, w: 325, h: 300, mimes: ['image/jpg', 'image/gif'] },
|
|
@@ -899,7 +953,7 @@ describe('Adf adapter', function () {
|
|
|
899
953
|
let serverResponse = {
|
|
900
954
|
body: {
|
|
901
955
|
seatbid: [{
|
|
902
|
-
bid: [{ impid: '1', adm: '<banner>' }]
|
|
956
|
+
bid: [{ impid: '1', adm: '<banner>', ext: { prebid: { type: 'banner' } } }]
|
|
903
957
|
}]
|
|
904
958
|
}
|
|
905
959
|
};
|
|
@@ -908,8 +962,7 @@ describe('Adf adapter', function () {
|
|
|
908
962
|
bids: [
|
|
909
963
|
{
|
|
910
964
|
bidId: 'bidId1',
|
|
911
|
-
params: { mid: 1000 }
|
|
912
|
-
mediaType: 'banner'
|
|
965
|
+
params: { mid: 1000 }
|
|
913
966
|
}
|
|
914
967
|
]
|
|
915
968
|
};
|
|
@@ -917,6 +970,8 @@ describe('Adf adapter', function () {
|
|
|
917
970
|
bids = spec.interpretResponse(serverResponse, bidRequest);
|
|
918
971
|
assert.equal(bids.length, 1);
|
|
919
972
|
assert.equal(bids[0].ad, '<banner>');
|
|
973
|
+
assert.equal(bids[0].mediaType, 'banner');
|
|
974
|
+
assert.equal(bids[0].meta.mediaType, 'banner');
|
|
920
975
|
});
|
|
921
976
|
});
|
|
922
977
|
|
|
@@ -925,7 +980,7 @@ describe('Adf adapter', function () {
|
|
|
925
980
|
let serverResponse = {
|
|
926
981
|
body: {
|
|
927
982
|
seatbid: [{
|
|
928
|
-
bid: [{ impid: '1', adm: '<vast>' }]
|
|
983
|
+
bid: [{ impid: '1', adm: '<vast>', ext: { prebid: { type: 'video' } } }]
|
|
929
984
|
}]
|
|
930
985
|
}
|
|
931
986
|
};
|
|
@@ -934,8 +989,7 @@ describe('Adf adapter', function () {
|
|
|
934
989
|
bids: [
|
|
935
990
|
{
|
|
936
991
|
bidId: 'bidId1',
|
|
937
|
-
params: { mid: 1000 }
|
|
938
|
-
mediaType: 'video'
|
|
992
|
+
params: { mid: 1000 }
|
|
939
993
|
}
|
|
940
994
|
]
|
|
941
995
|
};
|
|
@@ -943,13 +997,15 @@ describe('Adf adapter', function () {
|
|
|
943
997
|
bids = spec.interpretResponse(serverResponse, bidRequest);
|
|
944
998
|
assert.equal(bids.length, 1);
|
|
945
999
|
assert.equal(bids[0].vastXml, '<vast>');
|
|
1000
|
+
assert.equal(bids[0].mediaType, 'video');
|
|
1001
|
+
assert.equal(bids[0].meta.mediaType, 'video');
|
|
946
1002
|
});
|
|
947
1003
|
|
|
948
1004
|
it('should add renderer for outstream bids', function () {
|
|
949
1005
|
let serverResponse = {
|
|
950
1006
|
body: {
|
|
951
1007
|
seatbid: [{
|
|
952
|
-
bid: [{ impid: '1', adm: '<vast>' }, { impid: '2', adm: '<vast>' }]
|
|
1008
|
+
bid: [{ impid: '1', adm: '<vast>', ext: { prebid: { type: 'video' } } }, { impid: '2', adm: '<vast>', ext: { prebid: { type: 'video' } } }]
|
|
953
1009
|
}]
|
|
954
1010
|
}
|
|
955
1011
|
};
|
|
@@ -959,7 +1015,6 @@ describe('Adf adapter', function () {
|
|
|
959
1015
|
{
|
|
960
1016
|
bidId: 'bidId1',
|
|
961
1017
|
params: { mid: 1000 },
|
|
962
|
-
mediaType: 'video',
|
|
963
1018
|
mediaTypes: {
|
|
964
1019
|
video: {
|
|
965
1020
|
context: 'outstream'
|
|
@@ -969,7 +1024,6 @@ describe('Adf adapter', function () {
|
|
|
969
1024
|
{
|
|
970
1025
|
bidId: 'bidId2',
|
|
971
1026
|
params: { mid: 1000 },
|
|
972
|
-
mediaType: 'video',
|
|
973
1027
|
mediaTypes: {
|
|
974
1028
|
video: {
|
|
975
1029
|
constext: 'instream'
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {expect} from 'chai';
|
|
2
2
|
import {spec} from 'modules/adheseBidAdapter.js';
|
|
3
|
+
import {config} from 'src/config.js';
|
|
3
4
|
|
|
4
5
|
const BID_ID = 456;
|
|
5
6
|
const TTL = 360;
|
|
@@ -131,12 +132,21 @@ describe('AdheseAdapter', function () {
|
|
|
131
132
|
expect(JSON.parse(req.data)).to.not.have.key('eids');
|
|
132
133
|
});
|
|
133
134
|
|
|
134
|
-
it('should request vast content as url', function () {
|
|
135
|
+
it('should request vast content as url by default', function () {
|
|
135
136
|
let req = spec.buildRequests([ minimalBid() ], bidderRequest);
|
|
136
137
|
|
|
137
138
|
expect(JSON.parse(req.data).vastContentAsUrl).to.equal(true);
|
|
138
139
|
});
|
|
139
140
|
|
|
141
|
+
it('should request vast content as markup when configured', function () {
|
|
142
|
+
sinon.stub(config, 'getConfig').withArgs('adhese').returns({ vastContentAsUrl: false });
|
|
143
|
+
|
|
144
|
+
let req = spec.buildRequests([ minimalBid() ], bidderRequest);
|
|
145
|
+
|
|
146
|
+
expect(JSON.parse(req.data).vastContentAsUrl).to.equal(false);
|
|
147
|
+
config.getConfig.restore();
|
|
148
|
+
});
|
|
149
|
+
|
|
140
150
|
it('should include bids', function () {
|
|
141
151
|
let bid = minimalBid();
|
|
142
152
|
let req = spec.buildRequests([ bid ], bidderRequest);
|
|
@@ -155,6 +165,22 @@ describe('AdheseAdapter', function () {
|
|
|
155
165
|
|
|
156
166
|
expect(req.url).to.equal('https://ads-demo.adhese.com/json');
|
|
157
167
|
});
|
|
168
|
+
|
|
169
|
+
it('should include params specified in the config', function () {
|
|
170
|
+
sinon.stub(config, 'getConfig').withArgs('adhese').returns({ globalTargets: { 'tl': [ 'all' ] } });
|
|
171
|
+
let req = spec.buildRequests([ minimalBid() ], bidderRequest);
|
|
172
|
+
|
|
173
|
+
expect(JSON.parse(req.data).parameters).to.deep.include({ 'tl': [ 'all' ] });
|
|
174
|
+
config.getConfig.restore();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('should give priority to bid params over config params', function () {
|
|
178
|
+
sinon.stub(config, 'getConfig').withArgs('adhese').returns({ globalTargets: { 'xt': ['CONFIG_CONSENT_STRING'] } });
|
|
179
|
+
let req = spec.buildRequests([ minimalBid() ], bidderRequest);
|
|
180
|
+
|
|
181
|
+
expect(JSON.parse(req.data).parameters).to.deep.include({ 'xt': [ 'CONSENT_STRING' ] });
|
|
182
|
+
config.getConfig.restore();
|
|
183
|
+
});
|
|
158
184
|
});
|
|
159
185
|
|
|
160
186
|
describe('interpretResponse', () => {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import adomikAnalytics from 'modules/adomikAnalyticsAdapter.js';
|
|
2
2
|
import {expect} from 'chai';
|
|
3
|
+
|
|
3
4
|
let events = require('src/events');
|
|
4
5
|
let adapterManager = require('src/adapterManager').default;
|
|
5
6
|
let constants = require('src/constants.json');
|
|
@@ -8,6 +9,7 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
8
9
|
let sendEventStub;
|
|
9
10
|
let sendWonEventStub;
|
|
10
11
|
let clock;
|
|
12
|
+
|
|
11
13
|
before(function () {
|
|
12
14
|
clock = sinon.useFakeTimers();
|
|
13
15
|
});
|
|
@@ -91,7 +93,7 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
91
93
|
type: 'request',
|
|
92
94
|
event: {
|
|
93
95
|
bidder: 'BIDDERTEST',
|
|
94
|
-
placementCode: '
|
|
96
|
+
placementCode: '0000',
|
|
95
97
|
}
|
|
96
98
|
});
|
|
97
99
|
|
|
@@ -17,6 +17,7 @@ const aliasEP = {
|
|
|
17
17
|
mediafuse: 'https://ghb.hbmp.mediafuse.com/v2/auction/',
|
|
18
18
|
navelix: 'https://ghb.hb.navelix.com/v2/auction/',
|
|
19
19
|
bidsxchange: 'https://ghb.hbd.bidsxchange.com/v2/auction/',
|
|
20
|
+
streamkey: 'https://ghb.hb.streamkey.net/v2/auction/',
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
const DEFAULT_ADATPER_REQ = { bidderCode: 'adtelligent' };
|