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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Playwire 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: "playwire",
|
|
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: "playwire",
|
|
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: "playwire",
|
|
54
|
+
params: {
|
|
55
|
+
uid: 11
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
```
|
|
@@ -731,7 +731,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
731
731
|
return;
|
|
732
732
|
}
|
|
733
733
|
const request = {
|
|
734
|
-
id:
|
|
734
|
+
id: firstBidRequest.auctionId,
|
|
735
735
|
source: {tid: s2sBidRequest.tid},
|
|
736
736
|
tmax: s2sConfig.timeout,
|
|
737
737
|
imp: imps,
|
|
@@ -751,7 +751,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
751
751
|
}
|
|
752
752
|
};
|
|
753
753
|
|
|
754
|
-
//
|
|
754
|
+
// This is no longer overwritten unless name and version explicitly overwritten by extPrebid (mergeDeep)
|
|
755
755
|
request.ext.prebid = Object.assign(request.ext.prebid, {channel: {name: 'pbjs', version: $$PREBID_GLOBAL$$.version}})
|
|
756
756
|
|
|
757
757
|
// set debug flag if in debug mode
|
|
@@ -761,7 +761,7 @@ const OPEN_RTB_PROTOCOL = {
|
|
|
761
761
|
|
|
762
762
|
// s2sConfig video.ext.prebid is passed through openrtb to PBS
|
|
763
763
|
if (s2sConfig.extPrebid && typeof s2sConfig.extPrebid === 'object') {
|
|
764
|
-
request.ext.prebid =
|
|
764
|
+
request.ext.prebid = mergeDeep(request.ext.prebid, s2sConfig.extPrebid);
|
|
765
765
|
}
|
|
766
766
|
|
|
767
767
|
/**
|
|
@@ -81,13 +81,18 @@ function getlocalValue() {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
if (typeof value === 'string') {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
// if it's a json object parse it and return the publink value, otherwise assume the value is the id
|
|
85
|
+
if (value.charAt(0) === '{') {
|
|
86
|
+
try {
|
|
87
|
+
const obj = JSON.parse(value);
|
|
88
|
+
if (obj) {
|
|
89
|
+
return obj.publink;
|
|
90
|
+
}
|
|
91
|
+
} catch (e) {
|
|
92
|
+
logError(e);
|
|
88
93
|
}
|
|
89
|
-
}
|
|
90
|
-
|
|
94
|
+
} else {
|
|
95
|
+
return value;
|
|
91
96
|
}
|
|
92
97
|
}
|
|
93
98
|
}
|
|
@@ -11,6 +11,7 @@ const USER_SYNC_URL_IFRAME = 'https://ads.pubmatic.com/AdServer/js/user_sync.htm
|
|
|
11
11
|
const USER_SYNC_URL_IMAGE = 'https://image8.pubmatic.com/AdServer/ImgSync?p=';
|
|
12
12
|
const DEFAULT_CURRENCY = 'USD';
|
|
13
13
|
const AUCTION_TYPE = 1;
|
|
14
|
+
const GROUPM_ALIAS = {code: 'groupm', gvlid: 98};
|
|
14
15
|
const UNDEFINED = undefined;
|
|
15
16
|
const DEFAULT_WIDTH = 0;
|
|
16
17
|
const DEFAULT_HEIGHT = 0;
|
|
@@ -1005,6 +1006,7 @@ export const spec = {
|
|
|
1005
1006
|
code: BIDDER_CODE,
|
|
1006
1007
|
gvlid: 76,
|
|
1007
1008
|
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
|
|
1009
|
+
aliases: [GROUPM_ALIAS],
|
|
1008
1010
|
/**
|
|
1009
1011
|
* Determines whether or not the given bid request is valid. Valid bid request must have placementId and hbid
|
|
1010
1012
|
*
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
* @function?
|
|
43
43
|
* @summary modify bid request data
|
|
44
44
|
* @name RtdSubmodule#getBidRequestData
|
|
45
|
-
* @param {SubmoduleConfig} config
|
|
46
|
-
* @param {UserConsentData} userConsent
|
|
47
45
|
* @param {Object} reqBidsConfigObj
|
|
48
46
|
* @param {function} callback
|
|
47
|
+
* @param {SubmoduleConfig} config
|
|
48
|
+
* @param {UserConsentData} userConsent
|
|
49
49
|
*/
|
|
50
50
|
|
|
51
51
|
/**
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { deepAccess, isFn, generateUUID, parseUrl, isEmpty, parseSizesInput } from '../src/utils.js';
|
|
2
|
+
import { config } from '../src/config.js';
|
|
3
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
4
|
+
import { VIDEO, BANNER } from '../src/mediaTypes.js';
|
|
5
|
+
import find from 'core-js-pure/features/array/find.js';
|
|
6
|
+
import includes from 'core-js-pure/features/array/includes.js';
|
|
7
|
+
|
|
8
|
+
const ADAPTER_VERSION = '1.0';
|
|
9
|
+
const BIDDER_CODE = 'saambaa';
|
|
10
|
+
|
|
11
|
+
export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
|
|
12
|
+
export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
|
|
13
|
+
export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js';
|
|
14
|
+
export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip', 'playerSize', 'context'];
|
|
15
|
+
export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
|
|
16
|
+
|
|
17
|
+
let pubid = '';
|
|
18
|
+
|
|
19
|
+
export const spec = {
|
|
20
|
+
code: BIDDER_CODE,
|
|
21
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
22
|
+
|
|
23
|
+
isBidRequestValid(bidRequest) {
|
|
24
|
+
if (typeof bidRequest != 'undefined') {
|
|
25
|
+
if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { return false; }
|
|
26
|
+
if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { return false; }
|
|
27
|
+
return true;
|
|
28
|
+
} else { return false; }
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
buildRequests(bids, bidderRequest) {
|
|
32
|
+
let requests = [];
|
|
33
|
+
let videoBids = bids.filter(bid => isVideoBidValid(bid));
|
|
34
|
+
let bannerBids = bids.filter(bid => isBannerBidValid(bid));
|
|
35
|
+
videoBids.forEach(bid => {
|
|
36
|
+
pubid = getVideoBidParam(bid, 'pubid');
|
|
37
|
+
requests.push({
|
|
38
|
+
method: 'POST',
|
|
39
|
+
url: VIDEO_ENDPOINT + pubid,
|
|
40
|
+
data: createVideoRequestData(bid, bidderRequest),
|
|
41
|
+
bidRequest: bid
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
bannerBids.forEach(bid => {
|
|
46
|
+
pubid = getBannerBidParam(bid, 'pubid');
|
|
47
|
+
|
|
48
|
+
requests.push({
|
|
49
|
+
method: 'POST',
|
|
50
|
+
url: BANNER_ENDPOINT + pubid,
|
|
51
|
+
data: createBannerRequestData(bid, bidderRequest),
|
|
52
|
+
bidRequest: bid
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
return requests;
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
interpretResponse(serverResponse, {bidRequest}) {
|
|
59
|
+
let response = serverResponse.body;
|
|
60
|
+
if (response !== null && isEmpty(response) == false) {
|
|
61
|
+
if (isVideoBid(bidRequest)) {
|
|
62
|
+
let bidResponse = {
|
|
63
|
+
requestId: response.id,
|
|
64
|
+
bidderCode: BIDDER_CODE,
|
|
65
|
+
cpm: response.seatbid[0].bid[0].price,
|
|
66
|
+
width: response.seatbid[0].bid[0].w,
|
|
67
|
+
height: response.seatbid[0].bid[0].h,
|
|
68
|
+
ttl: response.seatbid[0].bid[0].ttl || 60,
|
|
69
|
+
creativeId: response.seatbid[0].bid[0].crid,
|
|
70
|
+
currency: response.cur,
|
|
71
|
+
meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
|
|
72
|
+
mediaType: VIDEO,
|
|
73
|
+
netRevenue: true
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (response.seatbid[0].bid[0].adm) {
|
|
77
|
+
bidResponse.vastXml = response.seatbid[0].bid[0].adm;
|
|
78
|
+
bidResponse.adResponse = {
|
|
79
|
+
content: response.seatbid[0].bid[0].adm
|
|
80
|
+
};
|
|
81
|
+
} else {
|
|
82
|
+
bidResponse.vastUrl = response.seatbid[0].bid[0].nurl;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return bidResponse;
|
|
86
|
+
} else {
|
|
87
|
+
return {
|
|
88
|
+
requestId: response.id,
|
|
89
|
+
bidderCode: BIDDER_CODE,
|
|
90
|
+
cpm: response.seatbid[0].bid[0].price,
|
|
91
|
+
width: response.seatbid[0].bid[0].w,
|
|
92
|
+
height: response.seatbid[0].bid[0].h,
|
|
93
|
+
ad: response.seatbid[0].bid[0].adm,
|
|
94
|
+
ttl: response.seatbid[0].bid[0].ttl || 60,
|
|
95
|
+
creativeId: response.seatbid[0].bid[0].crid,
|
|
96
|
+
currency: response.cur,
|
|
97
|
+
meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
|
|
98
|
+
mediaType: BANNER,
|
|
99
|
+
netRevenue: true
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
function isBannerBid(bid) {
|
|
107
|
+
return deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function isVideoBid(bid) {
|
|
111
|
+
return deepAccess(bid, 'mediaTypes.video');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function getBannerBidFloor(bid) {
|
|
115
|
+
let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'banner', size: '*' }) : {};
|
|
116
|
+
return floorInfo.floor || getBannerBidParam(bid, 'bidfloor');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function getVideoBidFloor(bid) {
|
|
120
|
+
let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'video', size: '*' }) : {};
|
|
121
|
+
return floorInfo.floor || getVideoBidParam(bid, 'bidfloor');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function isVideoBidValid(bid) {
|
|
125
|
+
return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function isBannerBidValid(bid) {
|
|
129
|
+
return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function getVideoBidParam(bid, key) {
|
|
133
|
+
return deepAccess(bid, 'params.video.' + key) || deepAccess(bid, 'params.' + key);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function getBannerBidParam(bid, key) {
|
|
137
|
+
return deepAccess(bid, 'params.banner.' + key) || deepAccess(bid, 'params.' + key);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function isMobile() {
|
|
141
|
+
return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function isConnectedTV() {
|
|
145
|
+
return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function getDoNotTrack() {
|
|
149
|
+
return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes';
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function findAndFillParam(o, key, value) {
|
|
153
|
+
try {
|
|
154
|
+
if (typeof value === 'function') {
|
|
155
|
+
o[key] = value();
|
|
156
|
+
} else {
|
|
157
|
+
o[key] = value;
|
|
158
|
+
}
|
|
159
|
+
} catch (ex) {}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function getOsVersion() {
|
|
163
|
+
let clientStrings = [
|
|
164
|
+
{ s: 'Android', r: /Android/ },
|
|
165
|
+
{ s: 'iOS', r: /(iPhone|iPad|iPod)/ },
|
|
166
|
+
{ s: 'Mac OS X', r: /Mac OS X/ },
|
|
167
|
+
{ s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
|
|
168
|
+
{ s: 'Linux', r: /(Linux|X11)/ },
|
|
169
|
+
{ s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
|
|
170
|
+
{ s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
|
|
171
|
+
{ s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
|
|
172
|
+
{ s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
|
|
173
|
+
{ s: 'Windows Vista', r: /Windows NT 6.0/ },
|
|
174
|
+
{ s: 'Windows Server 2003', r: /Windows NT 5.2/ },
|
|
175
|
+
{ s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
|
|
176
|
+
{ s: 'UNIX', r: /UNIX/ },
|
|
177
|
+
{ s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
|
|
178
|
+
];
|
|
179
|
+
let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent));
|
|
180
|
+
return cs ? cs.s : 'unknown';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function getFirstSize(sizes) {
|
|
184
|
+
return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function parseSizes(sizes) {
|
|
188
|
+
return parseSizesInput(sizes).map(size => {
|
|
189
|
+
let [ width, height ] = size.split('x');
|
|
190
|
+
return {
|
|
191
|
+
w: parseInt(width, 10) || undefined,
|
|
192
|
+
h: parseInt(height, 10) || undefined
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function getVideoSizes(bid) {
|
|
198
|
+
return parseSizes(deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function getBannerSizes(bid) {
|
|
202
|
+
return parseSizes(deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function getTopWindowReferrer() {
|
|
206
|
+
try {
|
|
207
|
+
return window.top.document.referrer;
|
|
208
|
+
} catch (e) {
|
|
209
|
+
return '';
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function getVideoTargetingParams(bid) {
|
|
214
|
+
const result = {};
|
|
215
|
+
const excludeProps = ['playerSize', 'context', 'w', 'h'];
|
|
216
|
+
Object.keys(Object(bid.mediaTypes.video))
|
|
217
|
+
.filter(key => !includes(excludeProps, key))
|
|
218
|
+
.forEach(key => {
|
|
219
|
+
result[ key ] = bid.mediaTypes.video[ key ];
|
|
220
|
+
});
|
|
221
|
+
Object.keys(Object(bid.params.video))
|
|
222
|
+
.filter(key => includes(VIDEO_TARGETING, key))
|
|
223
|
+
.forEach(key => {
|
|
224
|
+
result[ key ] = bid.params.video[ key ];
|
|
225
|
+
});
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function createVideoRequestData(bid, bidderRequest) {
|
|
230
|
+
let topLocation = getTopWindowLocation(bidderRequest);
|
|
231
|
+
let topReferrer = getTopWindowReferrer();
|
|
232
|
+
|
|
233
|
+
// if size is explicitly given via adapter params
|
|
234
|
+
let paramSize = getVideoBidParam(bid, 'size');
|
|
235
|
+
let sizes = [];
|
|
236
|
+
let coppa = config.getConfig('coppa');
|
|
237
|
+
|
|
238
|
+
if (typeof paramSize !== 'undefined' && paramSize != '') {
|
|
239
|
+
sizes = parseSizes(paramSize);
|
|
240
|
+
} else {
|
|
241
|
+
sizes = getVideoSizes(bid);
|
|
242
|
+
}
|
|
243
|
+
const firstSize = getFirstSize(sizes);
|
|
244
|
+
let floor = (getVideoBidFloor(bid) == null || typeof getVideoBidFloor(bid) == 'undefined') ? 0.5 : getVideoBidFloor(bid);
|
|
245
|
+
let video = getVideoTargetingParams(bid);
|
|
246
|
+
const o = {
|
|
247
|
+
'device': {
|
|
248
|
+
'langauge': (global.navigator.language).split('-')[0],
|
|
249
|
+
'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
|
|
250
|
+
'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
|
|
251
|
+
'js': 1,
|
|
252
|
+
'os': getOsVersion()
|
|
253
|
+
},
|
|
254
|
+
'at': 2,
|
|
255
|
+
'site': {},
|
|
256
|
+
'tmax': 3000,
|
|
257
|
+
'cur': ['USD'],
|
|
258
|
+
'id': bid.bidId,
|
|
259
|
+
'imp': [],
|
|
260
|
+
'regs': {
|
|
261
|
+
'ext': {
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
'user': {
|
|
265
|
+
'ext': {
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
o.site['page'] = topLocation.href;
|
|
271
|
+
o.site['domain'] = topLocation.hostname;
|
|
272
|
+
o.site['search'] = topLocation.search;
|
|
273
|
+
o.site['domain'] = topLocation.hostname;
|
|
274
|
+
o.site['ref'] = topReferrer;
|
|
275
|
+
o.site['mobile'] = isMobile() ? 1 : 0;
|
|
276
|
+
const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
|
|
277
|
+
|
|
278
|
+
o.device['dnt'] = getDoNotTrack() ? 1 : 0;
|
|
279
|
+
|
|
280
|
+
findAndFillParam(o.site, 'name', function() {
|
|
281
|
+
return global.top.document.title;
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
findAndFillParam(o.device, 'h', function() {
|
|
285
|
+
return global.screen.height;
|
|
286
|
+
});
|
|
287
|
+
findAndFillParam(o.device, 'w', function() {
|
|
288
|
+
return global.screen.width;
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
let placement = getVideoBidParam(bid, 'placement');
|
|
292
|
+
|
|
293
|
+
for (let j = 0; j < sizes.length; j++) {
|
|
294
|
+
o.imp.push({
|
|
295
|
+
'id': '' + j,
|
|
296
|
+
'displaymanager': '' + BIDDER_CODE,
|
|
297
|
+
'displaymanagerver': '' + ADAPTER_VERSION,
|
|
298
|
+
'tagId': placement,
|
|
299
|
+
'bidfloor': floor,
|
|
300
|
+
'bidfloorcur': 'USD',
|
|
301
|
+
'secure': secure,
|
|
302
|
+
'video': Object.assign({
|
|
303
|
+
'id': generateUUID(),
|
|
304
|
+
'pos': 0,
|
|
305
|
+
'w': firstSize.w,
|
|
306
|
+
'h': firstSize.h,
|
|
307
|
+
'mimes': DEFAULT_MIMES
|
|
308
|
+
}, video)
|
|
309
|
+
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (coppa) {
|
|
313
|
+
o.regs.ext = {'coppa': 1};
|
|
314
|
+
}
|
|
315
|
+
if (bidderRequest && bidderRequest.gdprConsent) {
|
|
316
|
+
let { gdprApplies, consentString } = bidderRequest.gdprConsent;
|
|
317
|
+
o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
|
|
318
|
+
o.user.ext = {'consent': consentString};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return o;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function getTopWindowLocation(bidderRequest) {
|
|
325
|
+
let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer;
|
|
326
|
+
return parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true });
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function createBannerRequestData(bid, bidderRequest) {
|
|
330
|
+
let topLocation = getTopWindowLocation(bidderRequest);
|
|
331
|
+
let topReferrer = getTopWindowReferrer();
|
|
332
|
+
|
|
333
|
+
// if size is explicitly given via adapter params
|
|
334
|
+
|
|
335
|
+
let paramSize = getBannerBidParam(bid, 'size');
|
|
336
|
+
let sizes = [];
|
|
337
|
+
let coppa = config.getConfig('coppa');
|
|
338
|
+
if (typeof paramSize !== 'undefined' && paramSize != '') {
|
|
339
|
+
sizes = parseSizes(paramSize);
|
|
340
|
+
} else {
|
|
341
|
+
sizes = getBannerSizes(bid);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
let floor = (getBannerBidFloor(bid) == null || typeof getBannerBidFloor(bid) == 'undefined') ? 0.1 : getBannerBidFloor(bid);
|
|
345
|
+
const o = {
|
|
346
|
+
'device': {
|
|
347
|
+
'langauge': (global.navigator.language).split('-')[0],
|
|
348
|
+
'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
|
|
349
|
+
'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
|
|
350
|
+
'js': 1
|
|
351
|
+
},
|
|
352
|
+
'at': 2,
|
|
353
|
+
'site': {},
|
|
354
|
+
'tmax': 3000,
|
|
355
|
+
'cur': ['USD'],
|
|
356
|
+
'id': bid.bidId,
|
|
357
|
+
'imp': [],
|
|
358
|
+
'regs': {
|
|
359
|
+
'ext': {
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
'user': {
|
|
363
|
+
'ext': {
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
o.site['page'] = topLocation.href;
|
|
369
|
+
o.site['domain'] = topLocation.hostname;
|
|
370
|
+
o.site['search'] = topLocation.search;
|
|
371
|
+
o.site['domain'] = topLocation.hostname;
|
|
372
|
+
o.site['ref'] = topReferrer;
|
|
373
|
+
o.site['mobile'] = isMobile() ? 1 : 0;
|
|
374
|
+
const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
|
|
375
|
+
|
|
376
|
+
o.device['dnt'] = getDoNotTrack() ? 1 : 0;
|
|
377
|
+
|
|
378
|
+
findAndFillParam(o.site, 'name', function() {
|
|
379
|
+
return global.top.document.title;
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
findAndFillParam(o.device, 'h', function() {
|
|
383
|
+
return global.screen.height;
|
|
384
|
+
});
|
|
385
|
+
findAndFillParam(o.device, 'w', function() {
|
|
386
|
+
return global.screen.width;
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
let placement = getBannerBidParam(bid, 'placement');
|
|
390
|
+
for (let j = 0; j < sizes.length; j++) {
|
|
391
|
+
let size = sizes[j];
|
|
392
|
+
|
|
393
|
+
o.imp.push({
|
|
394
|
+
'id': '' + j,
|
|
395
|
+
'displaymanager': '' + BIDDER_CODE,
|
|
396
|
+
'displaymanagerver': '' + ADAPTER_VERSION,
|
|
397
|
+
'tagId': placement,
|
|
398
|
+
'bidfloor': floor,
|
|
399
|
+
'bidfloorcur': 'USD',
|
|
400
|
+
'secure': secure,
|
|
401
|
+
'banner': {
|
|
402
|
+
'id': generateUUID(),
|
|
403
|
+
'pos': 0,
|
|
404
|
+
'w': size['w'],
|
|
405
|
+
'h': size['h']
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
if (coppa) {
|
|
410
|
+
o.regs.ext = {'coppa': 1};
|
|
411
|
+
}
|
|
412
|
+
if (bidderRequest && bidderRequest.gdprConsent) {
|
|
413
|
+
let { gdprApplies, consentString } = bidderRequest.gdprConsent;
|
|
414
|
+
o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
|
|
415
|
+
o.user.ext = {'consent': consentString};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return o;
|
|
419
|
+
}
|
|
420
|
+
registerBidder(spec);
|
|
@@ -1,69 +1,66 @@
|
|
|
1
|
-
# Overview
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
Module Name: Saambaa Bidder Adapter
|
|
5
|
-
Module Type: Bidder Adapter
|
|
6
|
-
Maintainer: matt.voigt@saambaa.com
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
# Description
|
|
10
|
-
|
|
11
|
-
Connects to Saambaa exchange for bids.
|
|
12
|
-
|
|
13
|
-
Saambaa bid adapter supports Banner and Video ads currently.
|
|
14
|
-
|
|
15
|
-
For more informatio
|
|
16
|
-
|
|
17
|
-
# Sample Display Ad Unit: For Publishers
|
|
18
|
-
```javascript
|
|
19
|
-
|
|
20
|
-
var displayAdUnit = [
|
|
21
|
-
{
|
|
22
|
-
code: 'display',
|
|
23
|
-
mediaTypes: {
|
|
24
|
-
banner: {
|
|
25
|
-
sizes: [[300, 250],[320, 50]]
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
bids: [{
|
|
29
|
-
bidder: 'saambaa',
|
|
30
|
-
params: {
|
|
31
|
-
pubid: '121ab139faf7ac67428a23f1d0a9a71b',
|
|
32
|
-
placement: 1234,
|
|
33
|
-
size: '320x50'
|
|
34
|
-
}
|
|
35
|
-
}]
|
|
36
|
-
}];
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
# Sample Video Ad Unit: For Publishers
|
|
40
|
-
```javascript
|
|
41
|
-
|
|
42
|
-
var videoAdUnit = {
|
|
43
|
-
code: 'video',
|
|
44
|
-
sizes: [320,480],
|
|
45
|
-
mediaTypes: {
|
|
46
|
-
video: {
|
|
47
|
-
playerSize : [[320, 480]],
|
|
48
|
-
context: 'instream'
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
]
|
|
68
|
-
};
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: Saambaa Bidder Adapter
|
|
5
|
+
Module Type: Bidder Adapter
|
|
6
|
+
Maintainer: matt.voigt@saambaa.com
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Connects to Saambaa exchange for bids.
|
|
12
|
+
|
|
13
|
+
Saambaa bid adapter supports Banner and Video ads currently.
|
|
14
|
+
|
|
15
|
+
For more informatio
|
|
16
|
+
|
|
17
|
+
# Sample Display Ad Unit: For Publishers
|
|
18
|
+
```javascript
|
|
19
|
+
|
|
20
|
+
var displayAdUnit = [
|
|
21
|
+
{
|
|
22
|
+
code: 'display',
|
|
23
|
+
mediaTypes: {
|
|
24
|
+
banner: {
|
|
25
|
+
sizes: [[300, 250],[320, 50]]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
bids: [{
|
|
29
|
+
bidder: 'saambaa',
|
|
30
|
+
params: {
|
|
31
|
+
pubid: '121ab139faf7ac67428a23f1d0a9a71b',
|
|
32
|
+
placement: 1234,
|
|
33
|
+
size: '320x50'
|
|
34
|
+
}
|
|
35
|
+
}]
|
|
36
|
+
}];
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
# Sample Video Ad Unit: For Publishers
|
|
40
|
+
```javascript
|
|
41
|
+
|
|
42
|
+
var videoAdUnit = {
|
|
43
|
+
code: 'video',
|
|
44
|
+
sizes: [320,480],
|
|
45
|
+
mediaTypes: {
|
|
46
|
+
video: {
|
|
47
|
+
playerSize : [[320, 480]],
|
|
48
|
+
context: 'instream',
|
|
49
|
+
skip: 1,
|
|
50
|
+
mimes : ['video/mp4', 'application/javascript'],
|
|
51
|
+
playbackmethod : [2,6],
|
|
52
|
+
maxduration: 30
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
bids: [
|
|
56
|
+
{
|
|
57
|
+
bidder: 'saambaa',
|
|
58
|
+
params: {
|
|
59
|
+
pubid: '121ab139faf7ac67428a23f1d0a9a71b',
|
|
60
|
+
placement: 1234,
|
|
61
|
+
size: "320x480"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
};
|
|
69
66
|
```
|