prebid.js 6.0.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc.js +1 -7
- package/.circleci/config.yml +1 -1
- package/README.md +1 -1
- package/browsers.json +13 -29
- package/gulpfile.js +88 -82
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
- package/karma.conf.maker.js +2 -2
- package/modules/33acrossBidAdapter.js +189 -102
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/addefendBidAdapter.js +1 -0
- package/modules/adheseBidAdapter.js +7 -2
- package/modules/adkernelBidAdapter.js +147 -61
- package/modules/adlivetechBidAdapter.md +61 -0
- package/modules/adlooxAdServerVideo.js +2 -2
- package/modules/adlooxAnalyticsAdapter.js +4 -4
- package/modules/admanBidAdapter.js +1 -0
- package/modules/admixerBidAdapter.js +3 -2
- package/modules/adnuntiusBidAdapter.js +5 -2
- package/modules/adomikAnalyticsAdapter.js +16 -4
- package/modules/adplusBidAdapter.js +203 -0
- package/modules/adplusBidAdapter.md +39 -0
- package/modules/adxcgBidAdapter.js +311 -359
- package/modules/adxcgBidAdapter.md +22 -21
- package/modules/adyoulikeBidAdapter.js +7 -2
- package/modules/aniviewBidAdapter.js +1 -1
- package/modules/appnexusBidAdapter.js +23 -3
- package/modules/beachfrontBidAdapter.js +14 -17
- package/modules/beopBidAdapter.js +6 -4
- package/modules/bidViewability.js +3 -3
- package/modules/bidViewabilityIO.js +3 -3
- package/modules/codefuelBidAdapter.js +1 -3
- package/modules/codefuelBidAdapter.md +3 -3
- package/modules/colossussspBidAdapter.js +7 -0
- package/modules/compassBidAdapter.js +201 -0
- package/modules/compassBidAdapter.md +79 -0
- package/modules/craftBidAdapter.js +5 -3
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/currency.js +2 -2
- package/modules/cwireBidAdapter.js +3 -0
- package/modules/dailyhuntBidAdapter.js +435 -0
- package/modules/dailyhuntBidAdapter.md +4 -0
- package/modules/datablocksBidAdapter.js +3 -3
- package/modules/dchain.js +149 -0
- package/modules/dchain.md +45 -0
- package/modules/deepintentBidAdapter.js +1 -1
- package/modules/dspxBidAdapter.js +1 -1
- package/modules/emx_digitalBidAdapter.js +9 -1
- package/modules/engageyaBidAdapter.js +68 -54
- package/modules/feedadBidAdapter.js +2 -2
- package/modules/feedadBidAdapter.md +4 -2
- package/modules/freewheel-sspBidAdapter.js +6 -0
- package/modules/futureads.md +48 -0
- package/modules/glimpseBidAdapter.js +44 -16
- package/modules/goldbachBidAdapter.js +1176 -0
- package/modules/goldbachBidAdapter.md +151 -0
- package/modules/gptPreAuction.js +11 -5
- package/modules/gridBidAdapter.js +5 -4
- package/modules/gumgumBidAdapter.js +7 -3
- package/modules/id5IdSystem.md +6 -6
- package/modules/imRtdProvider.js +31 -0
- package/modules/improvedigitalBidAdapter.js +19 -3
- package/modules/instreamTracking.js +4 -4
- package/modules/intersectionRtdProvider.js +114 -0
- package/modules/invibesBidAdapter.js +64 -14
- package/modules/invibesBidAdapter.md +2 -1
- package/modules/ipromBidAdapter.js +79 -0
- package/modules/ixBidAdapter.js +185 -22
- package/modules/kinessoIdSystem.js +1 -1
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/livewrappedBidAdapter.js +8 -2
- package/modules/lotamePanoramaIdSystem.js +80 -8
- package/modules/luponmediaBidAdapter.js +570 -0
- package/modules/mediasquareBidAdapter.js +1 -9
- package/modules/merkleIdSystem.js +5 -0
- package/modules/missenaBidAdapter.js +89 -0
- package/modules/nativoBidAdapter.js +27 -1
- package/modules/nextMillenniumBidAdapter.js +37 -7
- package/modules/oguryBidAdapter.js +2 -1
- package/modules/openxBidAdapter.js +6 -1
- package/modules/prebidServerBidAdapter/index.js +19 -15
- package/modules/pubgeniusBidAdapter.js +1 -1
- package/modules/pubmaticBidAdapter.js +5 -3
- package/modules/pubxaiAnalyticsAdapter.js +17 -0
- package/modules/relaidoBidAdapter.js +86 -65
- package/modules/richaudienceBidAdapter.js +2 -3
- package/modules/rtdModule/index.js +48 -18
- package/modules/rubiconBidAdapter.js +31 -19
- package/modules/saambaaBidAdapter.js +420 -0
- package/modules/saambaaBidAdapter.md +65 -68
- package/modules/seedtagBidAdapter.js +6 -0
- package/modules/sharedIdSystem.js +27 -1
- package/modules/smaatoBidAdapter.js +9 -1
- package/modules/smartxBidAdapter.js +17 -1
- package/modules/sspBCBidAdapter.js +34 -3
- package/modules/tappxBidAdapter.js +3 -1
- package/modules/targetVideoBidAdapter.js +187 -0
- package/modules/targetVideoBidAdapter.md +34 -0
- package/modules/telariaBidAdapter.js +2 -2
- package/modules/trustxBidAdapter.js +18 -17
- package/modules/undertoneBidAdapter.js +8 -1
- package/modules/userId/index.js +27 -2
- package/modules/ventes.md +71 -0
- package/modules/ventesBidAdapter.js +104 -64
- package/modules/ventesBidAdapter.md +0 -1
- package/modules/vidoomyBidAdapter.js +65 -108
- package/modules/visxBidAdapter.js +20 -3
- package/modules/visxBidAdapter.md +4 -6
- package/modules/weboramaRtdProvider.js +288 -73
- package/modules/weboramaRtdProvider.md +27 -10
- package/modules/yahoosspBidAdapter.js +5 -1
- package/modules/yahoosspBidAdapter.md +1 -1
- package/modules/yieldlabBidAdapter.js +41 -10
- package/modules/yieldlabBidAdapter.md +91 -48
- package/modules/yieldoneBidAdapter.js +115 -11
- package/modules/zetaSspBidAdapter.md +33 -1
- package/modules/zeta_global_sspBidAdapter.js +22 -1
- package/package.json +6 -1
- package/plugins/pbjsGlobals.js +28 -1
- package/src/adapterManager.js +14 -8
- package/src/auction.js +5 -4
- package/src/prebid.js +1 -2
- package/src/targeting.js +24 -3
- package/src/utils.js +41 -7
- package/test/helpers/prebidGlobal.js +1 -0
- package/test/spec/integration/faker/googletag.js +6 -0
- package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
- package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
- package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
- package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
- package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
- package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
- package/test/spec/modules/beopBidAdapter_spec.js +1 -1
- package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
- package/test/spec/modules/bidViewability_spec.js +4 -4
- package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
- package/test/spec/modules/compassBidAdapter_spec.js +397 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
- package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
- package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
- package/test/spec/modules/dchain_spec.js +329 -0
- package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
- package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
- package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
- package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
- package/test/spec/modules/gptPreAuction_spec.js +58 -4
- package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
- package/test/spec/modules/imRtdProvider_spec.js +25 -0
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
- package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
- package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
- package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
- package/test/spec/modules/ixBidAdapter_spec.js +293 -2
- package/test/spec/modules/konduitWrapper_spec.js +0 -1
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
- package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
- package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
- package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
- package/test/spec/modules/merkleIdSystem_spec.js +18 -0
- package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
- package/test/spec/modules/openxBidAdapter_spec.js +5 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
- package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
- package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
- package/test/spec/modules/realTimeDataModule_spec.js +135 -49
- package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
- package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
- package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
- package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
- package/test/spec/modules/sharedIdSystem_spec.js +52 -6
- package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
- package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
- package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
- package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
- package/test/spec/modules/userId_spec.js +51 -0
- package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
- package/test/spec/modules/visxBidAdapter_spec.js +121 -5
- package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
- package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
- package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
- package/test/spec/unit/core/adapterManager_spec.js +24 -6
- package/test/spec/unit/core/targeting_spec.js +116 -0
- package/test/spec/utils_spec.js +38 -0
- package/test/test_deps.js +3 -0
- package/test/test_index.js +1 -3
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: bidder
|
|
3
|
+
title: ventes
|
|
4
|
+
description: Prebid ventes Bidder Adapter
|
|
5
|
+
pbjs: false
|
|
6
|
+
biddercode: ventes
|
|
7
|
+
gdpr_supported: false
|
|
8
|
+
usp_supported: false
|
|
9
|
+
media_types: banner
|
|
10
|
+
coppa_supported: false
|
|
11
|
+
schain_supported: false
|
|
12
|
+
dchain_supported: false
|
|
13
|
+
prebid_member: false
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
### BidParams
|
|
17
|
+
{: .table .table-bordered .table-striped }
|
|
18
|
+
| Name | Scope | Description | Example | Type |
|
|
19
|
+
|-----------------|----------|-----------------------------------------------------------|----------------------------------------------|---------------|
|
|
20
|
+
| `placementId` | required | Placement ID from Ventes Avenues | `'VA-062-0013-0183'` | `string` |
|
|
21
|
+
| `publisherId` | required | Publisher ID from Ventes Avenues | `'VA-062'` | `string` |
|
|
22
|
+
| `user` | optional | Object that specifies information about an external user. | `user: { age: 25, gender: 0, dnt: true}` | `object` |
|
|
23
|
+
| `app` | optional | Object containing mobile app parameters. | `app : { id: 'app-id'}` | `object` |
|
|
24
|
+
|
|
25
|
+
#### User Object
|
|
26
|
+
|
|
27
|
+
{: .table .table-bordered .table-striped }
|
|
28
|
+
| Name | Description | Example | Type |
|
|
29
|
+
|-------------------|-------------------------------------------------------------------------------------------|-----------------------|-----------------------|
|
|
30
|
+
| `age` | The age of the user. | `35` | `integer` |
|
|
31
|
+
| `externalUid` | Specifies a string that corresponds to an external user ID for this user. | `'1234567890abcdefg'` | `string` |
|
|
32
|
+
| `segments` | Specifies the segments to which the user belongs. | `[1, 2]` | `Array<integer>` |
|
|
33
|
+
| `gender` | Specifies the gender of the user. Allowed values: Unknown: `0`; Male: `1`; Female: `2` | `1` | `integer` |
|
|
34
|
+
| `dnt` | Do not track flag. Indicates if tracking cookies should be disabled for this auction | `true` | `boolean` |
|
|
35
|
+
| `language` | Two-letter ANSI code for this user's language. | `EN` | `string` |
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Ad Unit Setup for Banner
|
|
39
|
+
```javascript
|
|
40
|
+
var adUnits = [
|
|
41
|
+
{
|
|
42
|
+
code: 'test-hb-ad-11111-1',
|
|
43
|
+
mediaTypes: {
|
|
44
|
+
banner: {
|
|
45
|
+
sizes: [
|
|
46
|
+
[300, 250]
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
bids: [{
|
|
51
|
+
bidder: 'ventes',
|
|
52
|
+
params: {
|
|
53
|
+
placementId: 'VA-062-0013-0183',
|
|
54
|
+
publisherId: '5cebea3c9eea646c7b623d5e',
|
|
55
|
+
IABCategories: "['IAB1', 'IAB5']",
|
|
56
|
+
device:{
|
|
57
|
+
ip: '123.145.167.189',
|
|
58
|
+
ifa:"AEBE52E7-03EE-455A-B3C4-E57283966239",
|
|
59
|
+
},
|
|
60
|
+
app: {
|
|
61
|
+
id: "agltb3B1Yi1pbmNyDAsSA0FwcBiJkfIUDA",
|
|
62
|
+
name: "Yahoo Weather",
|
|
63
|
+
bundle: 'com.kiloo.subwaysurf',
|
|
64
|
+
storeurl: 'https://play.google.com/store/apps/details?id=com.kiloo.subwaysurf&hl=en',
|
|
65
|
+
domain: 'somoaudience.com',
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}]
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
```
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
BANNER,
|
|
3
|
+
NATIVE,
|
|
4
|
+
VIDEO
|
|
5
|
+
} from '../src/mediaTypes.js';
|
|
6
|
+
import {
|
|
7
|
+
convertCamelToUnderscore,
|
|
8
|
+
isStr,
|
|
9
|
+
isArray,
|
|
10
|
+
isNumber,
|
|
11
|
+
isPlainObject,
|
|
12
|
+
replaceAuctionPrice
|
|
13
|
+
} from '../src/utils.js';
|
|
4
14
|
import find from 'core-js-pure/features/array/find.js';
|
|
5
|
-
import
|
|
15
|
+
import {
|
|
16
|
+
registerBidder
|
|
17
|
+
} from '../src/adapters/bidderFactory.js';
|
|
6
18
|
|
|
7
19
|
const BID_METHOD = 'POST';
|
|
8
20
|
const BIDDER_URL = 'http://13.234.201.146:8088/va/ad';
|
|
9
|
-
|
|
10
|
-
const NET_REVENUE = true;
|
|
11
|
-
const TTL = 10;
|
|
12
|
-
const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
|
|
13
|
-
const DEVICE_PARAMS = ['ua', 'geo', 'dnt', 'lmt', 'ip', 'ipv6', 'devicetype'];
|
|
14
|
-
const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
|
|
21
|
+
|
|
15
22
|
const DOMAIN_REGEX = new RegExp('//([^/]*)');
|
|
16
23
|
|
|
17
24
|
function groupBy(values, key) {
|
|
@@ -26,7 +33,11 @@ function groupBy(values, key) {
|
|
|
26
33
|
|
|
27
34
|
return Object
|
|
28
35
|
.keys(groups)
|
|
29
|
-
.map(id => ({
|
|
36
|
+
.map(id => ({
|
|
37
|
+
id,
|
|
38
|
+
key,
|
|
39
|
+
values: groups[id]
|
|
40
|
+
}));
|
|
30
41
|
}
|
|
31
42
|
|
|
32
43
|
function validateMediaTypes(mediaTypes, allowedMediaTypes) {
|
|
@@ -45,22 +56,22 @@ function isBanner(mediaTypes) {
|
|
|
45
56
|
|
|
46
57
|
function validateBanner(banner) {
|
|
47
58
|
return isPlainObject(banner) &&
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
isArray(banner.sizes) &&
|
|
60
|
+
(banner.sizes.length > 0) &&
|
|
61
|
+
banner.sizes.every(validateMediaSizes);
|
|
51
62
|
}
|
|
52
63
|
|
|
53
64
|
function validateMediaSizes(mediaSize) {
|
|
54
65
|
return isArray(mediaSize) &&
|
|
55
|
-
|
|
56
|
-
|
|
66
|
+
(mediaSize.length === 2) &&
|
|
67
|
+
mediaSize.every(size => (isNumber(size) && size >= 0));
|
|
57
68
|
}
|
|
58
69
|
|
|
59
70
|
function hasUserInfo(bid) {
|
|
60
71
|
return !!bid.params.user;
|
|
61
72
|
}
|
|
62
73
|
|
|
63
|
-
function validateParameters(parameters
|
|
74
|
+
function validateParameters(parameters) {
|
|
64
75
|
if (!(parameters.placementId)) {
|
|
65
76
|
return false;
|
|
66
77
|
}
|
|
@@ -101,8 +112,8 @@ function generateSiteFromAdUnitContext(bidRequests, adUnitContext) {
|
|
|
101
112
|
|
|
102
113
|
function validateServerRequest(serverRequest) {
|
|
103
114
|
return isPlainObject(serverRequest) &&
|
|
104
|
-
|
|
105
|
-
|
|
115
|
+
isPlainObject(serverRequest.data) &&
|
|
116
|
+
isArray(serverRequest.data.imp)
|
|
106
117
|
}
|
|
107
118
|
|
|
108
119
|
function createServerRequestFromAdUnits(adUnits, bidRequestId, adUnitContext) {
|
|
@@ -122,14 +133,15 @@ function generateBidRequestsFromAdUnits(bidRequests, bidRequestId, adUnitContext
|
|
|
122
133
|
let userObj = {};
|
|
123
134
|
if (userObjBid) {
|
|
124
135
|
Object.keys(userObjBid.params.user)
|
|
125
|
-
.filter(param => includes(USER_PARAMS, param))
|
|
126
136
|
.forEach((param) => {
|
|
127
137
|
let uparam = convertCamelToUnderscore(param);
|
|
128
138
|
if (param === 'segments' && isArray(userObjBid.params.user[param])) {
|
|
129
139
|
let segs = [];
|
|
130
140
|
userObjBid.params.user[param].forEach(val => {
|
|
131
141
|
if (isNumber(val)) {
|
|
132
|
-
segs.push({
|
|
142
|
+
segs.push({
|
|
143
|
+
'id': val
|
|
144
|
+
});
|
|
133
145
|
} else if (isPlainObject(val)) {
|
|
134
146
|
segs.push(val);
|
|
135
147
|
}
|
|
@@ -146,7 +158,6 @@ function generateBidRequestsFromAdUnits(bidRequests, bidRequestId, adUnitContext
|
|
|
146
158
|
if (deviceObjBid && deviceObjBid.params && deviceObjBid.params.device) {
|
|
147
159
|
deviceObj = {};
|
|
148
160
|
Object.keys(deviceObjBid.params.device)
|
|
149
|
-
.filter(param => includes(DEVICE_PARAMS, param))
|
|
150
161
|
.forEach(param => deviceObj[param] = deviceObjBid.params.device[param]);
|
|
151
162
|
if (!deviceObjBid.hasOwnProperty('ua')) {
|
|
152
163
|
deviceObj.ua = navigator.userAgent;
|
|
@@ -159,37 +170,41 @@ function generateBidRequestsFromAdUnits(bidRequests, bidRequestId, adUnitContext
|
|
|
159
170
|
deviceObj.ua = navigator.userAgent;
|
|
160
171
|
deviceObj.language = navigator.language;
|
|
161
172
|
}
|
|
162
|
-
const appDeviceObjBid = find(bidRequests, hasAppInfo);
|
|
163
|
-
let appIdObj;
|
|
164
|
-
if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) {
|
|
165
|
-
Object.keys(appDeviceObjBid.params.app)
|
|
166
|
-
.filter(param => includes(APP_DEVICE_PARAMS, param))
|
|
167
|
-
.forEach(param => appDeviceObjBid[param] = appDeviceObjBid.params.app[param]);
|
|
168
|
-
}
|
|
169
173
|
|
|
170
174
|
const payload = {}
|
|
171
175
|
payload.id = bidRequestId
|
|
172
|
-
payload.at =
|
|
176
|
+
payload.at = 1
|
|
173
177
|
payload.cur = ['USD']
|
|
174
178
|
payload.imp = bidRequests.reduce(generateImpressionsFromAdUnit, [])
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
179
|
+
const appDeviceObjBid = find(bidRequests, hasAppInfo);
|
|
180
|
+
if (!appDeviceObjBid) {
|
|
181
|
+
payload.site = generateSiteFromAdUnitContext(bidRequests, adUnitContext)
|
|
182
|
+
} else {
|
|
183
|
+
let appIdObj;
|
|
184
|
+
if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) {
|
|
185
|
+
appIdObj = {};
|
|
186
|
+
Object.keys(appDeviceObjBid.params.app)
|
|
187
|
+
.forEach(param => appIdObj[param] = appDeviceObjBid.params.app[param]);
|
|
188
|
+
}
|
|
178
189
|
payload.app = appIdObj;
|
|
179
190
|
}
|
|
191
|
+
payload.device = deviceObj;
|
|
180
192
|
payload.user = userObj
|
|
181
|
-
// payload.regs = getRegulationFromAdUnitContext(adUnitContext)
|
|
182
|
-
// payload.ext = generateBidRequestExtension()
|
|
183
|
-
|
|
184
193
|
return payload
|
|
185
194
|
}
|
|
186
195
|
|
|
187
196
|
function generateImpressionsFromAdUnit(acc, adUnit) {
|
|
188
|
-
const {
|
|
189
|
-
|
|
197
|
+
const {
|
|
198
|
+
bidId,
|
|
199
|
+
mediaTypes,
|
|
200
|
+
params
|
|
201
|
+
} = adUnit;
|
|
202
|
+
const {
|
|
203
|
+
placementId
|
|
204
|
+
} = params;
|
|
190
205
|
const pmp = {};
|
|
191
206
|
|
|
192
|
-
if (placementId) pmp.deals = [{id: placementId}]
|
|
207
|
+
if (placementId) pmp.deals = [{ id: placementId }]
|
|
193
208
|
|
|
194
209
|
const imps = Object
|
|
195
210
|
.keys(mediaTypes)
|
|
@@ -204,21 +219,40 @@ function generateImpressionsFromAdUnit(acc, adUnit) {
|
|
|
204
219
|
}
|
|
205
220
|
|
|
206
221
|
function generateBannerFromAdUnit(impId, data, params) {
|
|
207
|
-
const {
|
|
222
|
+
const {
|
|
223
|
+
position,
|
|
224
|
+
placementId
|
|
225
|
+
} = params;
|
|
208
226
|
const pos = position || 0;
|
|
209
227
|
const pmp = {};
|
|
210
|
-
const ext = {
|
|
211
|
-
|
|
212
|
-
|
|
228
|
+
const ext = {
|
|
229
|
+
placementId
|
|
230
|
+
};
|
|
213
231
|
|
|
214
|
-
|
|
232
|
+
if (placementId) pmp.deals = [{ id: placementId }]
|
|
233
|
+
|
|
234
|
+
return data.sizes.map(([w, h]) => ({
|
|
235
|
+
id: `${impId}`,
|
|
236
|
+
banner: {
|
|
237
|
+
format: [{
|
|
238
|
+
w,
|
|
239
|
+
h
|
|
240
|
+
}],
|
|
241
|
+
w,
|
|
242
|
+
h,
|
|
243
|
+
pos
|
|
244
|
+
},
|
|
245
|
+
pmp,
|
|
246
|
+
ext,
|
|
247
|
+
tagid: placementId
|
|
248
|
+
}));
|
|
215
249
|
}
|
|
216
250
|
|
|
217
251
|
function validateServerResponse(serverResponse) {
|
|
218
252
|
return isPlainObject(serverResponse) &&
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
253
|
+
isPlainObject(serverResponse.body) &&
|
|
254
|
+
isStr(serverResponse.body.cur) &&
|
|
255
|
+
isArray(serverResponse.body.seatbid);
|
|
222
256
|
}
|
|
223
257
|
|
|
224
258
|
function seatBidsToAds(seatBid, bidResponse, serverRequest) {
|
|
@@ -241,10 +275,8 @@ function validateBids(bid) {
|
|
|
241
275
|
return true;
|
|
242
276
|
}
|
|
243
277
|
|
|
244
|
-
const VAST_REGEXP = /VAST\s+version/;
|
|
245
|
-
|
|
246
278
|
function getMediaType(adm) {
|
|
247
|
-
const videoRegex = new RegExp(
|
|
279
|
+
const videoRegex = new RegExp(/VAST\s+version/);
|
|
248
280
|
|
|
249
281
|
if (videoRegex.test(adm)) {
|
|
250
282
|
return VIDEO;
|
|
@@ -273,14 +305,16 @@ function generateAdFromBid(bid, bidResponse) {
|
|
|
273
305
|
requestId: bid.impid,
|
|
274
306
|
cpm: bid.price,
|
|
275
307
|
currency: bidResponse.cur,
|
|
276
|
-
ttl:
|
|
308
|
+
ttl: 10,
|
|
277
309
|
creativeId: bid.crid,
|
|
278
310
|
mediaType: mediaType,
|
|
279
|
-
netRevenue:
|
|
311
|
+
netRevenue: true
|
|
280
312
|
};
|
|
281
313
|
|
|
282
314
|
if (bid.adomain) {
|
|
283
|
-
base.meta = {
|
|
315
|
+
base.meta = {
|
|
316
|
+
advertiserDomains: bid.adomain
|
|
317
|
+
};
|
|
284
318
|
}
|
|
285
319
|
|
|
286
320
|
const size = getSizeFromBid(bid);
|
|
@@ -292,17 +326,21 @@ function generateAdFromBid(bid, bidResponse) {
|
|
|
292
326
|
width: size.width,
|
|
293
327
|
ad: creative.markup,
|
|
294
328
|
adUrl: creative.markupUrl,
|
|
295
|
-
// vastXml: isVideo && !isStr(creative.markupUrl) ? creative.markup : null,
|
|
296
|
-
// vastUrl: isVideo && isStr(creative.markupUrl) ? creative.markupUrl : null,
|
|
297
329
|
renderer: creative.renderer
|
|
298
330
|
};
|
|
299
331
|
}
|
|
300
332
|
|
|
301
333
|
function getSizeFromBid(bid) {
|
|
302
334
|
if (isNumber(bid.w) && isNumber(bid.h)) {
|
|
303
|
-
return {
|
|
335
|
+
return {
|
|
336
|
+
width: bid.w,
|
|
337
|
+
height: bid.h
|
|
338
|
+
};
|
|
304
339
|
}
|
|
305
|
-
return {
|
|
340
|
+
return {
|
|
341
|
+
width: null,
|
|
342
|
+
height: null
|
|
343
|
+
};
|
|
306
344
|
}
|
|
307
345
|
|
|
308
346
|
function getCreativeFromBid(bid) {
|
|
@@ -333,12 +371,12 @@ const venavenBidderSpec = {
|
|
|
333
371
|
const allowedBidderCodes = [this.code];
|
|
334
372
|
|
|
335
373
|
return isPlainObject(adUnit) &&
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
374
|
+
allowedBidderCodes.indexOf(adUnit.bidder) !== -1 &&
|
|
375
|
+
isStr(adUnit.adUnitCode) &&
|
|
376
|
+
isStr(adUnit.bidderRequestId) &&
|
|
377
|
+
isStr(adUnit.bidId) &&
|
|
378
|
+
validateMediaTypes(adUnit.mediaTypes, this.supportedMediaTypes) &&
|
|
379
|
+
validateParameters(adUnit.params);
|
|
342
380
|
},
|
|
343
381
|
buildRequests(bidRequests, bidderRequest) {
|
|
344
382
|
if (!bidRequests) return null;
|
|
@@ -367,4 +405,6 @@ const venavenBidderSpec = {
|
|
|
367
405
|
|
|
368
406
|
registerBidder(venavenBidderSpec);
|
|
369
407
|
|
|
370
|
-
export {
|
|
408
|
+
export {
|
|
409
|
+
venavenBidderSpec as spec
|
|
410
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logError, deepAccess } from '../src/utils.js';
|
|
1
|
+
import { logError, deepAccess, parseSizesInput } from '../src/utils.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
4
4
|
import {config} from '../src/config.js';
|
|
@@ -9,7 +9,17 @@ const ENDPOINT = `https://d.vidoomy.com/api/rtbserver/prebid/`;
|
|
|
9
9
|
const BIDDER_CODE = 'vidoomy';
|
|
10
10
|
const GVLID = 380;
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const COOKIE_SYNC_FALLBACK_URLS = [
|
|
13
|
+
'https://x.bidswitch.net/sync?ssp=vidoomy',
|
|
14
|
+
'https://ib.adnxs.com/getuid?https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dadnxs%26gdpr%3D{{GDPR}}%26gdpr_consent%3D{{GDPR_CONSENT}}%26uid%3D%24UID',
|
|
15
|
+
'https://pixel-sync.sitescout.com/dmp/pixelSync?nid=120&redir=https%3A%2F%2Fa.vidoomy.com%2Fapi%2Frtbserver%2Fcookie%3Fi%3DCEN%26uid%3D%7BuserId%7D',
|
|
16
|
+
'https://sync.1rx.io/usersync2/vidoomy?redir=https%3A%2F%2Fa.vidoomy.com%2Fapi%2Frtbserver%2Fcookie%3Fi%3DUN%26uid%3D%5BRX_UUID%5D',
|
|
17
|
+
'https://rtb.openx.net/sync/prebid?gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&r=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dopenx%26uid%3D$%7BUID%7D',
|
|
18
|
+
'https://ads.pubmatic.com/AdServer/js/user_sync.html?gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&us_privacy=&predirect=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dpubmatic%26gdpr%3D{{GDPR}}%26gdpr_consent%3D{{GDPR_CONSENT}}%26uid%3D',
|
|
19
|
+
'https://cm.adform.net/cookie?redirect_url=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dadf%26gdpr%3D{{GDPR}}%26gdpr_consent%3D{{GDPR_CONSENT}}%26uid%3D%24UID',
|
|
20
|
+
'https://ups.analytics.yahoo.com/ups/58531/occ?gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}',
|
|
21
|
+
'https://ap.lijit.com/pixel?redir=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dsovrn%26gdpr%3D{{GDPR}}%26gdpr_consent%3D{{GDPR_CONSENT}}%26uid%3D%24UID'
|
|
22
|
+
];
|
|
13
23
|
|
|
14
24
|
const isBidRequestValid = bid => {
|
|
15
25
|
if (!bid.params) {
|
|
@@ -36,14 +46,14 @@ const isBidRequestValid = bid => {
|
|
|
36
46
|
};
|
|
37
47
|
|
|
38
48
|
const isBidResponseValid = bid => {
|
|
39
|
-
if (!bid.requestId || !bid.cpm || !bid.ttl || !bid.currency) {
|
|
49
|
+
if (!bid || !bid.requestId || !bid.cpm || !bid.ttl || !bid.currency) {
|
|
40
50
|
return false;
|
|
41
51
|
}
|
|
42
52
|
switch (bid.mediaType) {
|
|
43
53
|
case BANNER:
|
|
44
54
|
return Boolean(bid.width && bid.height && bid.ad);
|
|
45
55
|
case VIDEO:
|
|
46
|
-
return Boolean(bid.vastUrl);
|
|
56
|
+
return Boolean(bid.vastUrl || bid.vastXml);
|
|
47
57
|
default:
|
|
48
58
|
return false;
|
|
49
59
|
}
|
|
@@ -52,14 +62,15 @@ const isBidResponseValid = bid => {
|
|
|
52
62
|
const buildRequests = (validBidRequests, bidderRequest) => {
|
|
53
63
|
const serverRequests = validBidRequests.map(bid => {
|
|
54
64
|
let adType = BANNER;
|
|
55
|
-
let
|
|
65
|
+
let sizes;
|
|
56
66
|
if (bid.mediaTypes && bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) {
|
|
57
|
-
|
|
67
|
+
sizes = bid.mediaTypes[BANNER].sizes;
|
|
58
68
|
adType = BANNER;
|
|
59
69
|
} else if (bid.mediaTypes && bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) {
|
|
60
|
-
|
|
70
|
+
sizes = bid.mediaTypes[VIDEO].playerSize;
|
|
61
71
|
adType = VIDEO;
|
|
62
72
|
}
|
|
73
|
+
const [w, h] = (parseSizesInput(sizes)[0] || '0x0').split('x');
|
|
63
74
|
|
|
64
75
|
const aElement = document.createElement('a');
|
|
65
76
|
aElement.href = (bidderRequest.refererInfo && bidderRequest.refererInfo.referer) || top.location.href;
|
|
@@ -67,35 +78,34 @@ const buildRequests = (validBidRequests, bidderRequest) => {
|
|
|
67
78
|
|
|
68
79
|
const videoContext = deepAccess(bid, 'mediaTypes.video.context');
|
|
69
80
|
|
|
70
|
-
const queryParams =
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const queryParams = {
|
|
82
|
+
id: bid.params.id,
|
|
83
|
+
adtype: adType,
|
|
84
|
+
auc: bid.adUnitCode,
|
|
85
|
+
w,
|
|
86
|
+
h,
|
|
87
|
+
pos: parseInt(bid.params.position) || 1,
|
|
88
|
+
ua: navigator.userAgent,
|
|
89
|
+
l: navigator.language && navigator.language.indexOf('-') !== -1 ? navigator.language.split('-')[0] : '',
|
|
90
|
+
dt: /Mobi/.test(navigator.userAgent) ? 2 : 1,
|
|
91
|
+
pid: bid.params.pid,
|
|
92
|
+
requestId: bid.bidId,
|
|
93
|
+
d: getDomainWithoutSubdomain(hostname), // 'vidoomy.com',
|
|
94
|
+
sp: encodeURIComponent(aElement.href),
|
|
95
|
+
usp: bidderRequest.uspConsent || '',
|
|
96
|
+
coppa: !!config.getConfig('coppa'),
|
|
97
|
+
videoContext: videoContext || ''
|
|
98
|
+
};
|
|
99
|
+
|
|
83
100
|
if (bidderRequest.gdprConsent) {
|
|
84
|
-
queryParams.
|
|
85
|
-
queryParams.
|
|
101
|
+
queryParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
|
|
102
|
+
queryParams.gdprcs = bidderRequest.gdprConsent.consentString;
|
|
86
103
|
}
|
|
87
|
-
queryParams.push(['usp', bidderRequest.uspConsent || '']);
|
|
88
|
-
queryParams.push(['coppa', !!config.getConfig('coppa')]);
|
|
89
|
-
|
|
90
|
-
const rawQueryParams = queryParams.map(qp => qp.join('=')).join('&');
|
|
91
104
|
|
|
92
|
-
cookieSync(bidderRequest)
|
|
93
|
-
|
|
94
|
-
const url = `${ENDPOINT}?${rawQueryParams}`;
|
|
95
105
|
return {
|
|
96
106
|
method: 'GET',
|
|
97
|
-
url:
|
|
98
|
-
data:
|
|
107
|
+
url: ENDPOINT,
|
|
108
|
+
data: queryParams
|
|
99
109
|
}
|
|
100
110
|
});
|
|
101
111
|
return serverRequests;
|
|
@@ -117,8 +127,9 @@ const render = (bid) => {
|
|
|
117
127
|
const interpretResponse = (serverResponse, bidRequest) => {
|
|
118
128
|
try {
|
|
119
129
|
let responseBody = serverResponse.body;
|
|
130
|
+
if (!responseBody) return;
|
|
120
131
|
if (responseBody.mediaType === 'video') {
|
|
121
|
-
responseBody.ad = responseBody.vastUrl;
|
|
132
|
+
responseBody.ad = responseBody.vastUrl || responseBody.vastXml;
|
|
122
133
|
const videoContext = bidRequest.data.videoContext;
|
|
123
134
|
|
|
124
135
|
if (videoContext === OUTSTREAM) {
|
|
@@ -134,13 +145,12 @@ const interpretResponse = (serverResponse, bidRequest) => {
|
|
|
134
145
|
|
|
135
146
|
responseBody.renderer = renderer;
|
|
136
147
|
} catch (e) {
|
|
137
|
-
responseBody.ad = responseBody.vastUrl;
|
|
148
|
+
responseBody.ad = responseBody.vastUrl || responseBody.vastXml;
|
|
138
149
|
logError(BIDDER_CODE + ': error while installing renderer to show outstream ad');
|
|
139
150
|
}
|
|
140
151
|
}
|
|
141
152
|
}
|
|
142
153
|
const bid = {
|
|
143
|
-
vastUrl: responseBody.vastUrl,
|
|
144
154
|
ad: responseBody.ad,
|
|
145
155
|
renderer: responseBody.renderer,
|
|
146
156
|
mediaType: responseBody.mediaType,
|
|
@@ -169,6 +179,11 @@ const interpretResponse = (serverResponse, bidRequest) => {
|
|
|
169
179
|
secondaryCatIds: responseBody.meta.secondaryCatIds
|
|
170
180
|
}
|
|
171
181
|
};
|
|
182
|
+
if (responseBody.vastUrl) {
|
|
183
|
+
bid.vastUrl = responseBody.vastUrl;
|
|
184
|
+
} else if (responseBody.vastXml) {
|
|
185
|
+
bid.vastXml = responseBody.vastXml;
|
|
186
|
+
}
|
|
172
187
|
|
|
173
188
|
const bids = [];
|
|
174
189
|
|
|
@@ -185,6 +200,21 @@ const interpretResponse = (serverResponse, bidRequest) => {
|
|
|
185
200
|
}
|
|
186
201
|
};
|
|
187
202
|
|
|
203
|
+
function getUserSyncs (syncOptions, responses, gdprConsent, uspConsent) {
|
|
204
|
+
if (syncOptions.iframeEnabled || syncOptions.pixelEnabled) {
|
|
205
|
+
const pixelType = syncOptions.pixelEnabled ? 'image' : 'iframe';
|
|
206
|
+
const urls = deepAccess(responses, '0.body.pixels') || COOKIE_SYNC_FALLBACK_URLS;
|
|
207
|
+
|
|
208
|
+
return [].concat(urls).map(url => ({
|
|
209
|
+
type: pixelType,
|
|
210
|
+
url: url
|
|
211
|
+
.replace('{{GDPR}}', gdprConsent ? (gdprConsent.gdprApplies ? '1' : '0') : '0')
|
|
212
|
+
.replace('{{GDPR_CONSENT}}', gdprConsent ? encodeURIComponent(gdprConsent.consentString) : '')
|
|
213
|
+
.replace('{{USP_CONSENT}}', uspConsent ? encodeURIComponent(uspConsent) : '')
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
188
218
|
export const spec = {
|
|
189
219
|
code: BIDDER_CODE,
|
|
190
220
|
supportedMediaTypes: [BANNER, VIDEO],
|
|
@@ -192,84 +222,11 @@ export const spec = {
|
|
|
192
222
|
buildRequests,
|
|
193
223
|
interpretResponse,
|
|
194
224
|
gvlid: GVLID,
|
|
225
|
+
getUserSyncs,
|
|
195
226
|
};
|
|
196
227
|
|
|
197
228
|
registerBidder(spec);
|
|
198
229
|
|
|
199
|
-
let cookieSynced = false;
|
|
200
|
-
function cookieSync(bidderRequest) {
|
|
201
|
-
if (cookieSynced) return;
|
|
202
|
-
const xhr = new XMLHttpRequest();
|
|
203
|
-
xhr.open('GET', COOKIE_SYNC_JSON)
|
|
204
|
-
xhr.addEventListener('load', function () {
|
|
205
|
-
const macro = Macro({
|
|
206
|
-
gpdr: bidderRequest.gdprConsent ? bidderRequest.gdprConsent.gdprApplies : '0',
|
|
207
|
-
gpdr_consent: bidderRequest.gdprConsent ? bidderRequest.gdprConsent.consentString : '',
|
|
208
|
-
});
|
|
209
|
-
JSON.parse(this.responseText).filter(Boolean).forEach(url => {
|
|
210
|
-
firePixel(macro.replace(url))
|
|
211
|
-
})
|
|
212
|
-
})
|
|
213
|
-
xhr.send()
|
|
214
|
-
cookieSynced = true;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
function firePixel(url) {
|
|
218
|
-
const img = document.createElement('img');
|
|
219
|
-
img.width = 1;
|
|
220
|
-
img.height = 1;
|
|
221
|
-
img.src = url;
|
|
222
|
-
document.body.appendChild(img);
|
|
223
|
-
setTimeout(() => {
|
|
224
|
-
img.remove();
|
|
225
|
-
}, 10000)
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function normalizeKey (x) {
|
|
229
|
-
return x.replace(/_/g, '').toLowerCase();
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
function Macro (obj) {
|
|
233
|
-
const macros = {};
|
|
234
|
-
for (const key in obj) {
|
|
235
|
-
macros[normalizeKey(key)] = obj[key];
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const set = (key, value) => {
|
|
239
|
-
macros[normalizeKey(key)] = typeof value === 'function' ? value : String(value);
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
return {
|
|
243
|
-
set,
|
|
244
|
-
setAll (obj) {
|
|
245
|
-
for (const key in obj) {
|
|
246
|
-
macros[normalizeKey(key)] = set(obj[key]);
|
|
247
|
-
}
|
|
248
|
-
},
|
|
249
|
-
replace (string, extraMacros = {}) {
|
|
250
|
-
const allMacros = {
|
|
251
|
-
...macros,
|
|
252
|
-
...extraMacros,
|
|
253
|
-
};
|
|
254
|
-
const regexes = [
|
|
255
|
-
/{{\s*([a-zA-Z0-9_]+)\s*}}/g,
|
|
256
|
-
/\$\$\s*([a-zA-Z0-9_]+)\s*\$\$/g,
|
|
257
|
-
/\[\s*([a-zA-Z0-9_]+)\s*\]/g,
|
|
258
|
-
/\{\s*([a-zA-Z0-9_]+)\s*\}/g,
|
|
259
|
-
];
|
|
260
|
-
regexes.forEach(regex => {
|
|
261
|
-
string = string.replace(regex, (str, x) => {
|
|
262
|
-
x = normalizeKey(x);
|
|
263
|
-
let value = allMacros[x];
|
|
264
|
-
value = typeof value === 'function' ? value(allMacros) : value;
|
|
265
|
-
return !value && value !== 0 ? '' : value;
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
return string;
|
|
269
|
-
},
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
|
|
273
230
|
function getDomainWithoutSubdomain (hostname) {
|
|
274
231
|
const parts = hostname.split('.');
|
|
275
232
|
const newParts = [];
|