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.
Files changed (201) hide show
  1. package/.babelrc.js +1 -7
  2. package/.circleci/config.yml +1 -1
  3. package/README.md +1 -1
  4. package/browsers.json +13 -29
  5. package/gulpfile.js +88 -82
  6. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  7. package/karma.conf.maker.js +2 -2
  8. package/modules/33acrossBidAdapter.js +189 -102
  9. package/modules/adagioBidAdapter.js +1 -1
  10. package/modules/addefendBidAdapter.js +1 -0
  11. package/modules/adheseBidAdapter.js +7 -2
  12. package/modules/adkernelBidAdapter.js +147 -61
  13. package/modules/adlivetechBidAdapter.md +61 -0
  14. package/modules/adlooxAdServerVideo.js +2 -2
  15. package/modules/adlooxAnalyticsAdapter.js +4 -4
  16. package/modules/admanBidAdapter.js +1 -0
  17. package/modules/admixerBidAdapter.js +3 -2
  18. package/modules/adnuntiusBidAdapter.js +5 -2
  19. package/modules/adomikAnalyticsAdapter.js +16 -4
  20. package/modules/adplusBidAdapter.js +203 -0
  21. package/modules/adplusBidAdapter.md +39 -0
  22. package/modules/adxcgBidAdapter.js +311 -359
  23. package/modules/adxcgBidAdapter.md +22 -21
  24. package/modules/adyoulikeBidAdapter.js +7 -2
  25. package/modules/aniviewBidAdapter.js +1 -1
  26. package/modules/appnexusBidAdapter.js +23 -3
  27. package/modules/beachfrontBidAdapter.js +14 -17
  28. package/modules/beopBidAdapter.js +6 -4
  29. package/modules/bidViewability.js +3 -3
  30. package/modules/bidViewabilityIO.js +3 -3
  31. package/modules/codefuelBidAdapter.js +1 -3
  32. package/modules/codefuelBidAdapter.md +3 -3
  33. package/modules/colossussspBidAdapter.js +7 -0
  34. package/modules/compassBidAdapter.js +201 -0
  35. package/modules/compassBidAdapter.md +79 -0
  36. package/modules/craftBidAdapter.js +5 -3
  37. package/modules/criteoBidAdapter.js +1 -1
  38. package/modules/currency.js +2 -2
  39. package/modules/cwireBidAdapter.js +3 -0
  40. package/modules/dailyhuntBidAdapter.js +435 -0
  41. package/modules/dailyhuntBidAdapter.md +4 -0
  42. package/modules/datablocksBidAdapter.js +3 -3
  43. package/modules/dchain.js +149 -0
  44. package/modules/dchain.md +45 -0
  45. package/modules/deepintentBidAdapter.js +1 -1
  46. package/modules/dspxBidAdapter.js +1 -1
  47. package/modules/emx_digitalBidAdapter.js +9 -1
  48. package/modules/engageyaBidAdapter.js +68 -54
  49. package/modules/feedadBidAdapter.js +2 -2
  50. package/modules/feedadBidAdapter.md +4 -2
  51. package/modules/freewheel-sspBidAdapter.js +6 -0
  52. package/modules/futureads.md +48 -0
  53. package/modules/glimpseBidAdapter.js +44 -16
  54. package/modules/goldbachBidAdapter.js +1176 -0
  55. package/modules/goldbachBidAdapter.md +151 -0
  56. package/modules/gptPreAuction.js +11 -5
  57. package/modules/gridBidAdapter.js +5 -4
  58. package/modules/gumgumBidAdapter.js +7 -3
  59. package/modules/id5IdSystem.md +6 -6
  60. package/modules/imRtdProvider.js +31 -0
  61. package/modules/improvedigitalBidAdapter.js +19 -3
  62. package/modules/instreamTracking.js +4 -4
  63. package/modules/intersectionRtdProvider.js +114 -0
  64. package/modules/invibesBidAdapter.js +64 -14
  65. package/modules/invibesBidAdapter.md +2 -1
  66. package/modules/ipromBidAdapter.js +79 -0
  67. package/modules/ixBidAdapter.js +185 -22
  68. package/modules/kinessoIdSystem.js +1 -1
  69. package/modules/limelightDigitalBidAdapter.js +2 -1
  70. package/modules/livewrappedBidAdapter.js +8 -2
  71. package/modules/lotamePanoramaIdSystem.js +80 -8
  72. package/modules/luponmediaBidAdapter.js +570 -0
  73. package/modules/mediasquareBidAdapter.js +1 -9
  74. package/modules/merkleIdSystem.js +5 -0
  75. package/modules/missenaBidAdapter.js +89 -0
  76. package/modules/nativoBidAdapter.js +27 -1
  77. package/modules/nextMillenniumBidAdapter.js +37 -7
  78. package/modules/oguryBidAdapter.js +2 -1
  79. package/modules/openxBidAdapter.js +6 -1
  80. package/modules/prebidServerBidAdapter/index.js +19 -15
  81. package/modules/pubgeniusBidAdapter.js +1 -1
  82. package/modules/pubmaticBidAdapter.js +5 -3
  83. package/modules/pubxaiAnalyticsAdapter.js +17 -0
  84. package/modules/relaidoBidAdapter.js +86 -65
  85. package/modules/richaudienceBidAdapter.js +2 -3
  86. package/modules/rtdModule/index.js +48 -18
  87. package/modules/rubiconBidAdapter.js +31 -19
  88. package/modules/saambaaBidAdapter.js +420 -0
  89. package/modules/saambaaBidAdapter.md +65 -68
  90. package/modules/seedtagBidAdapter.js +6 -0
  91. package/modules/sharedIdSystem.js +27 -1
  92. package/modules/smaatoBidAdapter.js +9 -1
  93. package/modules/smartxBidAdapter.js +17 -1
  94. package/modules/sspBCBidAdapter.js +34 -3
  95. package/modules/tappxBidAdapter.js +3 -1
  96. package/modules/targetVideoBidAdapter.js +187 -0
  97. package/modules/targetVideoBidAdapter.md +34 -0
  98. package/modules/telariaBidAdapter.js +2 -2
  99. package/modules/trustxBidAdapter.js +18 -17
  100. package/modules/undertoneBidAdapter.js +8 -1
  101. package/modules/userId/index.js +27 -2
  102. package/modules/ventes.md +71 -0
  103. package/modules/ventesBidAdapter.js +104 -64
  104. package/modules/ventesBidAdapter.md +0 -1
  105. package/modules/vidoomyBidAdapter.js +65 -108
  106. package/modules/visxBidAdapter.js +20 -3
  107. package/modules/visxBidAdapter.md +4 -6
  108. package/modules/weboramaRtdProvider.js +288 -73
  109. package/modules/weboramaRtdProvider.md +27 -10
  110. package/modules/yahoosspBidAdapter.js +5 -1
  111. package/modules/yahoosspBidAdapter.md +1 -1
  112. package/modules/yieldlabBidAdapter.js +41 -10
  113. package/modules/yieldlabBidAdapter.md +91 -48
  114. package/modules/yieldoneBidAdapter.js +115 -11
  115. package/modules/zetaSspBidAdapter.md +33 -1
  116. package/modules/zeta_global_sspBidAdapter.js +22 -1
  117. package/package.json +6 -1
  118. package/plugins/pbjsGlobals.js +28 -1
  119. package/src/adapterManager.js +14 -8
  120. package/src/auction.js +5 -4
  121. package/src/prebid.js +1 -2
  122. package/src/targeting.js +24 -3
  123. package/src/utils.js +41 -7
  124. package/test/helpers/prebidGlobal.js +1 -0
  125. package/test/spec/integration/faker/googletag.js +6 -0
  126. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  127. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  128. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  129. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  130. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
  131. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  132. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  133. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  134. package/test/spec/modules/appnexusBidAdapter_spec.js +63 -1
  135. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  136. package/test/spec/modules/beopBidAdapter_spec.js +1 -1
  137. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  138. package/test/spec/modules/bidViewability_spec.js +4 -4
  139. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  140. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  141. package/test/spec/modules/compassBidAdapter_spec.js +397 -0
  142. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  143. package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
  144. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  145. package/test/spec/modules/dchain_spec.js +329 -0
  146. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  147. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  148. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  149. package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
  150. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  151. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  152. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  153. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  154. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  155. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  156. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
  157. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  158. package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
  159. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  160. package/test/spec/modules/ixBidAdapter_spec.js +293 -2
  161. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  162. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  163. package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
  164. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  165. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  166. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  167. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  168. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  169. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  170. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
  171. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  172. package/test/spec/modules/openxBidAdapter_spec.js +5 -0
  173. package/test/spec/modules/prebidServerBidAdapter_spec.js +62 -2
  174. package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
  175. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  176. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
  177. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  178. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  179. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  180. package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
  181. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  182. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  183. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  184. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  185. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  186. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  187. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  188. package/test/spec/modules/trustxBidAdapter_spec.js +42 -0
  189. package/test/spec/modules/userId_spec.js +51 -0
  190. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  191. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  192. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  193. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  194. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  195. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  196. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  197. package/test/spec/unit/core/adapterManager_spec.js +24 -6
  198. package/test/spec/unit/core/targeting_spec.js +116 -0
  199. package/test/spec/utils_spec.js +38 -0
  200. package/test/test_deps.js +3 -0
  201. 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 {registerBidder} from '../src/adapters/bidderFactory.js';
2
- import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
3
- import {convertCamelToUnderscore, isStr, isArray, isNumber, isPlainObject, replaceAuctionPrice} from '../src/utils.js';
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 includes from 'core-js-pure/features/array/includes.js';
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
- const FIRST_PRICE = 1;
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 => ({id, key, values: groups[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
- isArray(banner.sizes) &&
49
- (banner.sizes.length > 0) &&
50
- banner.sizes.every(validateMediaSizes);
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
- (mediaSize.length === 2) &&
56
- mediaSize.every(size => (isNumber(size) && size >= 0));
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, adUnit) {
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
- isPlainObject(serverRequest.data) &&
105
- isArray(serverRequest.data.imp)
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({'id': val});
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 = FIRST_PRICE
176
+ payload.at = 1
173
177
  payload.cur = ['USD']
174
178
  payload.imp = bidRequests.reduce(generateImpressionsFromAdUnit, [])
175
- payload.site = generateSiteFromAdUnitContext(bidRequests, adUnitContext)
176
- payload.device = deviceObj
177
- if (appDeviceObjBid && payload.site != null) {
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 {bidId, mediaTypes, params} = adUnit;
189
- const {placementId} = params;
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 {position, placementId} = params;
222
+ const {
223
+ position,
224
+ placementId
225
+ } = params;
208
226
  const pos = position || 0;
209
227
  const pmp = {};
210
- const ext = {placementId};
211
-
212
- if (placementId) pmp.deals = [{id: placementId}]
228
+ const ext = {
229
+ placementId
230
+ };
213
231
 
214
- return data.sizes.map(([w, h]) => ({id: `${impId}`, banner: {format: [{w, h}], w, h, pos}, pmp, ext, tagid: placementId}));
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
- isPlainObject(serverResponse.body) &&
220
- isStr(serverResponse.body.cur) &&
221
- isArray(serverResponse.body.seatbid);
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(VAST_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: TTL,
308
+ ttl: 10,
277
309
  creativeId: bid.crid,
278
310
  mediaType: mediaType,
279
- netRevenue: NET_REVENUE
311
+ netRevenue: true
280
312
  };
281
313
 
282
314
  if (bid.adomain) {
283
- base.meta = { advertiserDomains: bid.adomain };
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 { width: bid.w, height: bid.h };
335
+ return {
336
+ width: bid.w,
337
+ height: bid.h
338
+ };
304
339
  }
305
- return { width: null, height: null };
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
- allowedBidderCodes.indexOf(adUnit.bidder) !== -1 &&
337
- isStr(adUnit.adUnitCode) &&
338
- isStr(adUnit.bidderRequestId) &&
339
- isStr(adUnit.bidId) &&
340
- validateMediaTypes(adUnit.mediaTypes, this.supportedMediaTypes) &&
341
- validateParameters(adUnit.params, adUnit);
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 {venavenBidderSpec as spec};
408
+ export {
409
+ venavenBidderSpec as spec
410
+ };
@@ -55,7 +55,6 @@ var adUnits = [
55
55
  publisherId: '5cebea3c9eea646c7b623d5e',
56
56
  IABCategories: "['IAB1', 'IAB5']",
57
57
  device:{
58
- ip: '123.145.167.189',
59
58
  ifa:"AEBE52E7-03EE-455A-B3C4-E57283966239",
60
59
  },
61
60
  app: {
@@ -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 COOKIE_SYNC_JSON = 'https://vpaid.vidoomy.com/sync/urls.json';
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 w, h;
65
+ let sizes;
56
66
  if (bid.mediaTypes && bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) {
57
- [w, h] = bid.mediaTypes[BANNER].sizes[0];
67
+ sizes = bid.mediaTypes[BANNER].sizes;
58
68
  adType = BANNER;
59
69
  } else if (bid.mediaTypes && bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) {
60
- [w, h] = bid.mediaTypes[VIDEO].playerSize;
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
- queryParams.push(['id', bid.params.id]);
72
- queryParams.push(['adtype', adType]);
73
- queryParams.push(['w', w]);
74
- queryParams.push(['h', h]);
75
- queryParams.push(['pos', parseInt(bid.params.position) || 1]);
76
- queryParams.push(['ua', navigator.userAgent]);
77
- queryParams.push(['l', navigator.language && navigator.language.indexOf('-') !== -1 ? navigator.language.split('-')[0] : '']);
78
- queryParams.push(['dt', /Mobi/.test(navigator.userAgent) ? 2 : 1]);
79
- queryParams.push(['pid', bid.params.pid]);
80
- queryParams.push(['requestId', bid.bidId]);
81
- queryParams.push(['d', getDomainWithoutSubdomain(hostname)]);
82
- queryParams.push(['sp', encodeURIComponent(aElement.href)]);
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.push(['gdpr', bidderRequest.gdprConsent.gdprApplies]);
85
- queryParams.push(['gdprcs', bidderRequest.gdprConsent.consentString]);
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: url,
98
- data: {videoContext}
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 = [];