prebid.js 5.19.0 → 6.2.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 (161) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +4 -2
  3. package/browsers.json +13 -37
  4. package/gulpfile.js +1 -0
  5. package/karma.conf.maker.js +1 -1
  6. package/modules/adheseBidAdapter.js +7 -2
  7. package/modules/adkernelBidAdapter.js +1 -0
  8. package/modules/adlivetechBidAdapter.md +61 -0
  9. package/modules/admixerBidAdapter.js +2 -1
  10. package/modules/adnuntiusBidAdapter.js +2 -1
  11. package/modules/adomikAnalyticsAdapter.js +10 -4
  12. package/modules/adplusBidAdapter.js +203 -0
  13. package/modules/adplusBidAdapter.md +39 -0
  14. package/modules/adyoulikeBidAdapter.js +7 -2
  15. package/modules/airgridRtdProvider.js +1 -1
  16. package/modules/appnexusBidAdapter.js +28 -5
  17. package/modules/atsAnalyticsAdapter.js +67 -46
  18. package/modules/atsAnalyticsAdapter.md +1 -0
  19. package/modules/beachfrontBidAdapter.js +14 -17
  20. package/modules/betweenBidAdapter.js +2 -1
  21. package/modules/browsiRtdProvider.js +106 -18
  22. package/modules/cleanioRtdProvider.js +192 -0
  23. package/modules/cleanioRtdProvider.md +59 -0
  24. package/modules/codefuelBidAdapter.js +1 -3
  25. package/modules/codefuelBidAdapter.md +3 -3
  26. package/modules/craftBidAdapter.js +5 -3
  27. package/modules/datablocksBidAdapter.js +3 -3
  28. package/modules/dchain.js +149 -0
  29. package/modules/dchain.md +45 -0
  30. package/modules/deepintentBidAdapter.js +1 -1
  31. package/modules/deltaprojectsBidAdapter.js +252 -0
  32. package/modules/deltaprojectsBidAdapter.md +32 -0
  33. package/modules/emx_digitalBidAdapter.js +9 -1
  34. package/modules/engageyaBidAdapter.js +68 -54
  35. package/modules/freewheel-sspBidAdapter.js +6 -0
  36. package/modules/glimpseBidAdapter.js +31 -16
  37. package/modules/goldbachBidAdapter.js +1176 -0
  38. package/modules/goldbachBidAdapter.md +151 -0
  39. package/modules/gptPreAuction.js +11 -5
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gumgumBidAdapter.js +5 -1
  42. package/modules/id5IdSystem.md +6 -6
  43. package/modules/imRtdProvider.js +31 -0
  44. package/modules/intersectionRtdProvider.js +114 -0
  45. package/modules/invibesBidAdapter.js +15 -9
  46. package/modules/ipromBidAdapter.js +79 -0
  47. package/modules/ixBidAdapter.js +173 -22
  48. package/modules/jixieBidAdapter.js +8 -2
  49. package/modules/justpremiumBidAdapter.js +6 -1
  50. package/modules/limelightDigitalBidAdapter.js +2 -1
  51. package/modules/livewrappedAnalyticsAdapter.js +5 -0
  52. package/modules/luponmediaBidAdapter.js +570 -0
  53. package/modules/merkleIdSystem.js +5 -0
  54. package/modules/missenaBidAdapter.js +89 -0
  55. package/modules/multibid/index.js +3 -3
  56. package/modules/nativoBidAdapter.js +32 -2
  57. package/modules/oguryBidAdapter.js +2 -1
  58. package/modules/openxBidAdapter.js +7 -2
  59. package/modules/operaadsBidAdapter.js +21 -1
  60. package/modules/otmBidAdapter.js +146 -0
  61. package/modules/otmBidAdapter.md +27 -26
  62. package/modules/outbrainBidAdapter.js +5 -0
  63. package/modules/playwireBidAdapter.md +61 -0
  64. package/modules/prebidServerBidAdapter/index.js +3 -3
  65. package/modules/pubmaticBidAdapter.js +5 -3
  66. package/modules/relaidoBidAdapter.js +86 -65
  67. package/modules/richaudienceBidAdapter.js +1 -1
  68. package/modules/rtdModule/index.js +2 -2
  69. package/modules/saambaaBidAdapter.js +420 -0
  70. package/modules/saambaaBidAdapter.md +65 -68
  71. package/modules/seedtagBidAdapter.js +6 -0
  72. package/modules/smaatoBidAdapter.js +9 -1
  73. package/modules/smartxBidAdapter.js +17 -1
  74. package/modules/sonobiBidAdapter.js +7 -0
  75. package/modules/sortableBidAdapter.js +1 -0
  76. package/modules/sspBCBidAdapter.js +34 -3
  77. package/modules/tappxBidAdapter.js +3 -1
  78. package/modules/teadsBidAdapter.js +3 -0
  79. package/modules/trustxBidAdapter.js +18 -7
  80. package/modules/undertoneBidAdapter.js +8 -1
  81. package/modules/userId/index.js +27 -2
  82. package/modules/ventes.md +71 -0
  83. package/modules/ventesBidAdapter.js +410 -0
  84. package/modules/ventesBidAdapter.md +93 -0
  85. package/modules/vidoomyBidAdapter.js +51 -100
  86. package/modules/visxBidAdapter.js +20 -3
  87. package/modules/visxBidAdapter.md +4 -6
  88. package/modules/yahoosspBidAdapter.js +6 -6
  89. package/modules/yahoosspBidAdapter.md +1 -1
  90. package/modules/yieldlabBidAdapter.js +41 -10
  91. package/modules/yieldlabBidAdapter.md +91 -48
  92. package/modules/yieldoneBidAdapter.js +115 -11
  93. package/package.json +6 -1
  94. package/src/adapterManager.js +14 -8
  95. package/src/auction.js +14 -13
  96. package/src/targeting.js +2 -2
  97. package/src/utils.js +7 -0
  98. package/test/spec/integration/faker/googletag.js +6 -0
  99. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  100. package/test/spec/modules/adnuntiusBidAdapter_spec.js +18 -0
  101. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  102. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  103. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  104. package/test/spec/modules/appnexusBidAdapter_spec.js +65 -2
  105. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  106. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  107. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  108. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  109. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  110. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  111. package/test/spec/modules/dchain_spec.js +329 -0
  112. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  113. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  114. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  115. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  116. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  117. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  118. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  119. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  120. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  121. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  122. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  123. package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
  124. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  125. package/test/spec/modules/ixBidAdapter_spec.js +288 -5
  126. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  127. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  128. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  129. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  130. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +23 -4
  131. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  132. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  133. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  134. package/test/spec/modules/multibid_spec.js +31 -31
  135. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  136. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  137. package/test/spec/modules/openxBidAdapter_spec.js +5 -26
  138. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  139. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  140. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  141. package/test/spec/modules/prebidServerBidAdapter_spec.js +19 -2
  142. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  143. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  144. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  145. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  146. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  147. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  148. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  149. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  150. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  151. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  152. package/test/spec/modules/trustxBidAdapter_spec.js +45 -3
  153. package/test/spec/modules/userId_spec.js +51 -0
  154. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  155. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  156. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  157. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  158. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  159. package/test/spec/unit/core/adapterManager_spec.js +26 -7
  160. package/test/spec/unit/core/targeting_spec.js +44 -0
  161. package/wdio.conf.js +1 -1
@@ -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
- bids: [
52
- {
53
- bidder: 'saambaa',
54
- params: {
55
- pubid: '121ab139faf7ac67428a23f1d0a9a71b',
56
- placement: 1234,
57
- size: "320x480",
58
- video: {
59
- id: 123,
60
- skip: 1,
61
- mimes : ['video/mp4', 'application/javascript'],
62
- playbackmethod : [2,6],
63
- maxduration: 30
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
  ```
@@ -13,6 +13,11 @@ const ALLOWED_PLACEMENTS = {
13
13
  banner: true,
14
14
  video: true
15
15
  }
16
+
17
+ // Global Vendor List Id
18
+ // https://iabeurope.eu/vendor-list-tcf-v2-0/
19
+ const GVLID = 157;
20
+
16
21
  const mediaTypesMap = {
17
22
  [BANNER]: 'display',
18
23
  [VIDEO]: 'video'
@@ -158,6 +163,7 @@ export function getTimeoutUrl (data) {
158
163
 
159
164
  export const spec = {
160
165
  code: BIDDER_CODE,
166
+ gvlid: GVLID,
161
167
  aliases: [SEEDTAG_ALIAS],
162
168
  supportedMediaTypes: [BANNER, VIDEO],
163
169
  /**
@@ -5,7 +5,7 @@ import {ADPOD, BANNER, VIDEO} from '../src/mediaTypes.js';
5
5
 
6
6
  const BIDDER_CODE = 'smaato';
7
7
  const SMAATO_ENDPOINT = 'https://prebid.ad.smaato.net/oapi/prebid';
8
- const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.4'
8
+ const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.6'
9
9
  const CURRENCY = 'USD';
10
10
 
11
11
  const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => {
@@ -37,6 +37,11 @@ const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => {
37
37
  user: {
38
38
  ext: {}
39
39
  },
40
+ source: {
41
+ ext: {
42
+ schain: bidRequest.schain
43
+ }
44
+ },
40
45
  ext: {
41
46
  client: SMAATO_CLIENT
42
47
  }
@@ -299,6 +304,7 @@ function createBannerImp(bidRequest) {
299
304
  id: bidRequest.bidId,
300
305
  tagid: deepAccess(bidRequest, 'params.adspaceId'),
301
306
  bidfloor: getBidFloor(bidRequest, BANNER, adUnitSizes),
307
+ instl: deepAccess(bidRequest.ortb2Imp, 'instl'),
302
308
  banner: {
303
309
  w: sizes[0].w,
304
310
  h: sizes[0].h,
@@ -314,6 +320,7 @@ function createVideoImp(bidRequest, videoMediaType) {
314
320
  id: bidRequest.bidId,
315
321
  tagid: deepAccess(bidRequest, 'params.adspaceId'),
316
322
  bidfloor: getBidFloor(bidRequest, VIDEO, videoMediaType.playerSize),
323
+ instl: deepAccess(bidRequest.ortb2Imp, 'instl'),
317
324
  video: {
318
325
  mimes: videoMediaType.mimes,
319
326
  minduration: videoMediaType.minduration,
@@ -341,6 +348,7 @@ function createAdPodImp(bidRequest, videoMediaType) {
341
348
  id: bidRequest.bidId,
342
349
  tagid: tagid,
343
350
  bidfloor: getBidFloor(bidRequest, VIDEO, videoMediaType.playerSize),
351
+ instl: deepAccess(bidRequest.ortb2Imp, 'instl'),
344
352
  video: {
345
353
  w: videoMediaType.playerSize[0][0],
346
354
  h: videoMediaType.playerSize[0][1],
@@ -161,11 +161,20 @@ export const spec = {
161
161
  domain: domain,
162
162
  publisher: {
163
163
  id: publisherId
164
+ },
165
+ content: {
166
+ ext: {
167
+ prebid: {
168
+ name: 'pbjs',
169
+ version: '$prebid.version$'
170
+ }
171
+ }
164
172
  }
165
173
  },
166
174
  device: device,
167
175
  at: at,
168
- cur: cur
176
+ cur: cur,
177
+ ext: {}
169
178
  };
170
179
 
171
180
  const userExt = {};
@@ -194,6 +203,8 @@ export const spec = {
194
203
  };
195
204
  }
196
205
 
206
+ // requestPayload.user.ext.ver = pbjs.version;
207
+
197
208
  // Targeting
198
209
  if (getBidIdParameter('data', bid.params.user)) {
199
210
  var targetingarr = [];
@@ -336,6 +347,7 @@ function createOutstreamConfig(bid) {
336
347
  let confTitle = getBidIdParameter('title', bid.renderer.config.outstream_options);
337
348
  let confSkipOffset = getBidIdParameter('skipOffset', bid.renderer.config.outstream_options);
338
349
  let confDesiredBitrate = getBidIdParameter('desiredBitrate', bid.renderer.config.outstream_options);
350
+ let confVisibilityThreshold = getBidIdParameter('visibilityThreshold', bid.renderer.config.outstream_options);
339
351
  let elementId = getBidIdParameter('slot', bid.renderer.config.outstream_options) || bid.adUnitCode;
340
352
 
341
353
  logMessage('[SMARTX][renderer] Handle SmartX outstream renderer');
@@ -384,6 +396,10 @@ function createOutstreamConfig(bid) {
384
396
  smartPlayObj.desiredBitrate = confDesiredBitrate;
385
397
  }
386
398
 
399
+ if (confVisibilityThreshold) {
400
+ smartPlayObj.visibilityThreshold = confVisibilityThreshold;
401
+ }
402
+
387
403
  smartPlayObj.adResponse = bid.vastContent;
388
404
 
389
405
  const divID = '[id="' + elementId + '"]';
@@ -83,8 +83,15 @@ export const spec = {
83
83
  'lib_name': 'prebid',
84
84
  'lib_v': '$prebid.version$',
85
85
  'us': 0,
86
+
86
87
  };
87
88
 
89
+ const fpd = config.getConfig('ortb2');
90
+
91
+ if (fpd) {
92
+ payload.fpd = JSON.stringify(fpd);
93
+ }
94
+
88
95
  if (config.getConfig('userSync') && config.getConfig('userSync').syncsPerBidder) {
89
96
  payload.us = config.getConfig('userSync').syncsPerBidder;
90
97
  }