prebid.js 7.40.0 → 7.41.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 (167) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/aduptechBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.js +1 -1
  10. package/dist/adyoulikeBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/amxBidAdapter.js +1 -1
  13. package/dist/amxIdSystem.js +1 -1
  14. package/dist/appierAnalyticsAdapter.js +1 -1
  15. package/dist/appnexusBidAdapter.js +1 -1
  16. package/dist/asoBidAdapter.js +1 -1
  17. package/dist/axonixBidAdapter.js +1 -1
  18. package/dist/bidglassBidAdapter.js +1 -1
  19. package/dist/big-richmediaBidAdapter.js +1 -1
  20. package/dist/bridgewellBidAdapter.js +1 -1
  21. package/dist/brightMountainMediaBidAdapter.js +1 -1
  22. package/dist/browsiBidAdapter.js +1 -0
  23. package/dist/carodaBidAdapter.js +1 -1
  24. package/dist/chtnwBidAdapter.js +1 -1
  25. package/dist/cleanmedianetBidAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantAnalyticsAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/cwireBidAdapter.js +1 -1
  34. package/dist/dfpAdServerVideo.js +1 -1
  35. package/dist/dspxBidAdapter.js +1 -1
  36. package/dist/eplanningBidAdapter.js +1 -1
  37. package/dist/feedadBidAdapter.js +1 -1
  38. package/dist/finativeBidAdapter.js +1 -1
  39. package/dist/freewheel-sspBidAdapter.js +1 -1
  40. package/dist/glimpseBidAdapter.js +1 -1
  41. package/dist/gmosspBidAdapter.js +1 -1
  42. package/dist/goldbachBidAdapter.js +1 -1
  43. package/dist/gridBidAdapter.js +1 -1
  44. package/dist/gridNMBidAdapter.js +1 -1
  45. package/dist/gumgumBidAdapter.js +1 -1
  46. package/dist/h12mediaBidAdapter.js +1 -1
  47. package/dist/id5IdSystem.js +1 -1
  48. package/dist/improvedigitalBidAdapter.js +1 -1
  49. package/dist/inmarBidAdapter.js +1 -1
  50. package/dist/insticatorBidAdapter.js +1 -1
  51. package/dist/ixBidAdapter.js +1 -1
  52. package/dist/justpremiumBidAdapter.js +1 -1
  53. package/dist/kargoBidAdapter.js +1 -1
  54. package/dist/konduitAnalyticsAdapter.js +1 -1
  55. package/dist/kueezBidAdapter.js +1 -1
  56. package/dist/kueezRtbBidAdapter.js +1 -1
  57. package/dist/lassoBidAdapter.js +1 -1
  58. package/dist/lifestreetBidAdapter.js +1 -1
  59. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  60. package/dist/logicadBidAdapter.js +1 -1
  61. package/dist/loglyliftBidAdapter.js +1 -1
  62. package/dist/magniteAnalyticsAdapter.js +1 -1
  63. package/dist/malltvAnalyticsAdapter.js +1 -1
  64. package/dist/marsmediaBidAdapter.js +1 -1
  65. package/dist/mediafuseBidAdapter.js +1 -1
  66. package/dist/mediasquareBidAdapter.js +1 -1
  67. package/dist/mgidBidAdapter.js +1 -1
  68. package/dist/minutemediaBidAdapter.js +1 -1
  69. package/dist/minutemediaplusBidAdapter.js +1 -1
  70. package/dist/missenaBidAdapter.js +1 -1
  71. package/dist/nexx360BidAdapter.js +1 -1
  72. package/dist/nobidBidAdapter.js +1 -1
  73. package/dist/not-for-prod/prebid.js +130 -129
  74. package/dist/oguryBidAdapter.js +1 -1
  75. package/dist/onetagBidAdapter.js +1 -1
  76. package/dist/ooloAnalyticsAdapter.js +1 -1
  77. package/dist/optidigitalBidAdapter.js +1 -1
  78. package/dist/outbrainBidAdapter.js +1 -1
  79. package/dist/parrableIdSystem.js +1 -1
  80. package/dist/permutiveRtdProvider.js +1 -1
  81. package/dist/pixfutureBidAdapter.js +1 -1
  82. package/dist/prebid-core.js +1 -1
  83. package/dist/publinkIdSystem.js +1 -1
  84. package/dist/pubmaticBidAdapter.js +1 -1
  85. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  86. package/dist/pubwiseBidAdapter.js +1 -1
  87. package/dist/pxyzBidAdapter.js +1 -1
  88. package/dist/quantcastBidAdapter.js +1 -1
  89. package/dist/readpeakBidAdapter.js +1 -1
  90. package/dist/relaidoBidAdapter.js +1 -1
  91. package/dist/rhythmoneBidAdapter.js +1 -1
  92. package/dist/riseBidAdapter.js +1 -1
  93. package/dist/rubiconAnalyticsAdapter.js +1 -1
  94. package/dist/rubiconBidAdapter.js +1 -1
  95. package/dist/seedingAllianceBidAdapter.js +1 -1
  96. package/dist/seedtagBidAdapter.js +1 -1
  97. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  98. package/dist/sharethroughBidAdapter.js +1 -1
  99. package/dist/shinezBidAdapter.js +1 -1
  100. package/dist/smaatoBidAdapter.js +1 -1
  101. package/dist/smartadserverBidAdapter.js +1 -1
  102. package/dist/smartxBidAdapter.js +1 -1
  103. package/dist/smilewantedBidAdapter.js +1 -1
  104. package/dist/sonobiBidAdapter.js +1 -1
  105. package/dist/sovrnAnalyticsAdapter.js +1 -1
  106. package/dist/sovrnBidAdapter.js +1 -1
  107. package/dist/sspBCBidAdapter.js +1 -1
  108. package/dist/stvBidAdapter.js +1 -0
  109. package/dist/sublimeBidAdapter.js +1 -1
  110. package/dist/synacormediaBidAdapter.js +1 -1
  111. package/dist/targetVideoBidAdapter.js +1 -1
  112. package/dist/teadsBidAdapter.js +1 -1
  113. package/dist/trionBidAdapter.js +1 -1
  114. package/dist/tripleliftBidAdapter.js +1 -1
  115. package/dist/ttdBidAdapter.js +1 -1
  116. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  117. package/dist/uid2IdSystem.js +1 -1
  118. package/dist/underdogmediaBidAdapter.js +1 -1
  119. package/dist/undertoneBidAdapter.js +1 -1
  120. package/dist/vidazooBidAdapter.js +1 -1
  121. package/dist/videobyteBidAdapter.js +1 -1
  122. package/dist/visxBidAdapter.js +1 -1
  123. package/dist/vuukleBidAdapter.js +1 -1
  124. package/dist/widespaceBidAdapter.js +1 -1
  125. package/dist/winrBidAdapter.js +1 -1
  126. package/dist/yahoosspBidAdapter.js +1 -1
  127. package/dist/yandexBidAdapter.js +1 -1
  128. package/dist/yieldmoBidAdapter.js +1 -1
  129. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  130. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  131. package/modules/aduptechBidAdapter.js +43 -37
  132. package/modules/browsiBidAdapter.js +171 -0
  133. package/modules/browsiBidAdapter.md +38 -0
  134. package/modules/cleanmedianetBidAdapter.js +191 -126
  135. package/modules/cleanmedianetBidAdapter.md +64 -18
  136. package/modules/conversantBidAdapter.js +4 -0
  137. package/modules/dfpAdServerVideo.js +8 -8
  138. package/modules/freewheel-sspBidAdapter.js +9 -0
  139. package/modules/gridBidAdapter.js +12 -1
  140. package/modules/ixBidAdapter.js +1 -1
  141. package/modules/missenaBidAdapter.js +2 -1
  142. package/modules/neuwoRtdProvider.js +1 -1
  143. package/modules/nobidBidAdapter.js +13 -2
  144. package/modules/nobidBidAdapter.md +2 -2
  145. package/modules/permutiveRtdProvider.js +8 -2
  146. package/modules/pubwiseBidAdapter.js +265 -33
  147. package/modules/stvBidAdapter.js +330 -0
  148. package/modules/stvBidAdapter.md +62 -0
  149. package/modules/yandexBidAdapter.js +259 -71
  150. package/modules/yandexBidAdapter.md +52 -15
  151. package/package.json +1 -1
  152. package/src/videoCache.js +4 -4
  153. package/test/spec/modules/browsiBidAdapter_spec.js +209 -0
  154. package/test/spec/modules/cleanmedianetBidAdapter_spec.js +462 -407
  155. package/test/spec/modules/conversantBidAdapter_spec.js +8 -0
  156. package/test/spec/modules/dfpAdServerVideo_spec.js +36 -4
  157. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  158. package/test/spec/modules/gridBidAdapter_spec.js +24 -0
  159. package/test/spec/modules/ixBidAdapter_spec.js +4 -4
  160. package/test/spec/modules/nobidBidAdapter_spec.js +32 -0
  161. package/test/spec/modules/permutiveRtdProvider_spec.js +61 -4
  162. package/test/spec/modules/pubwiseBidAdapter_spec.js +313 -3
  163. package/test/spec/modules/stvBidAdapter_spec.js +402 -0
  164. package/test/spec/modules/yandexBidAdapter_spec.js +315 -45
  165. package/test/spec/videoCache_spec.js +23 -0
  166. package/dist/flocIdSystem.js +0 -1
  167. package/modules/flocIdSystem.js +0 -0
@@ -1,17 +1,50 @@
1
- import { formatQS, deepAccess, triggerPixel, isArray, isNumber } from '../src/utils.js';
1
+ import { formatQS, deepAccess, triggerPixel, _each, _map } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
- import { BANNER } from '../src/mediaTypes.js'
3
+ import { BANNER, NATIVE } from '../src/mediaTypes.js'
4
+ import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
4
5
 
5
6
  const BIDDER_CODE = 'yandex';
6
- const BIDDER_URL = 'https://bs.yandex.ru/metadsp';
7
+ const BIDDER_URL = 'https://bs.yandex.ru/prebid';
7
8
  const DEFAULT_TTL = 180;
8
9
  const DEFAULT_CURRENCY = 'EUR';
10
+ const SUPPORTED_MEDIA_TYPES = [ BANNER, NATIVE ];
9
11
  const SSP_ID = 10500;
10
12
 
13
+ const IMAGE_ASSET_TYPES = {
14
+ ICON: 1,
15
+ IMAGE: 3,
16
+ };
17
+ const DATA_ASSET_TYPES = {
18
+ TITLE: 0,
19
+ SPONSORED: 1,
20
+ DESC: 2,
21
+ RATING: 3,
22
+ LIKES: 4,
23
+ ADDRESS: 9,
24
+ DESC2: 10,
25
+ DISPLAY_URL: 11,
26
+ CTA_TEXT: 12,
27
+ E_504: 504,
28
+ };
29
+ export const NATIVE_ASSETS = {
30
+ title: [1, DATA_ASSET_TYPES.TITLE],
31
+ body: [2, DATA_ASSET_TYPES.DESC],
32
+ body2: [3, DATA_ASSET_TYPES.DESC2],
33
+ sponsoredBy: [4, DATA_ASSET_TYPES.SPONSORED],
34
+ icon: [5, IMAGE_ASSET_TYPES.ICON],
35
+ image: [6, IMAGE_ASSET_TYPES.IMAGE],
36
+ displayUrl: [7, DATA_ASSET_TYPES.DISPLAY_URL],
37
+ cta: [8, DATA_ASSET_TYPES.CTA_TEXT],
38
+ rating: [9, DATA_ASSET_TYPES.RATING],
39
+ likes: [10, DATA_ASSET_TYPES.LIKES],
40
+ }
41
+ const NATIVE_ASSETS_IDS = {};
42
+ _each(NATIVE_ASSETS, (asset, key) => { NATIVE_ASSETS_IDS[asset[0]] = key });
43
+
11
44
  export const spec = {
12
45
  code: BIDDER_CODE,
13
46
  aliases: ['ya'], // short code
14
- supportedMediaTypes: [ BANNER ],
47
+ supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
15
48
 
16
49
  isBidRequestValid: function(bid) {
17
50
  const { params } = bid;
@@ -22,13 +55,11 @@ export const spec = {
22
55
  if (!(pageId && impId)) {
23
56
  return false;
24
57
  }
25
- const sizes = bid.mediaTypes?.banner?.sizes;
26
- return isArray(sizes) && isArray(sizes[0]) && isNumber(sizes[0][0]) && isNumber(sizes[0][1]);
58
+ return true;
27
59
  },
28
60
 
29
61
  buildRequests: function(validBidRequests, bidderRequest) {
30
- const gdprApplies = deepAccess(bidderRequest, 'gdprConsent.gdprApplies');
31
- const consentString = deepAccess(bidderRequest, 'gdprConsent.consentString');
62
+ validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
32
63
 
33
64
  let referrer = '';
34
65
  let domain = '';
@@ -48,9 +79,6 @@ export const spec = {
48
79
  return validBidRequests.map((bidRequest) => {
49
80
  const { params } = bidRequest;
50
81
  const { targetRef, withCredentials = true } = params;
51
- const sizes = bidRequest.mediaTypes.banner.sizes;
52
- const size = sizes[0];
53
- const [ w, h ] = size;
54
82
 
55
83
  const { pageId, impId } = extractPlacementIds(params);
56
84
 
@@ -59,28 +87,24 @@ export const spec = {
59
87
  'target-ref': targetRef || domain,
60
88
  'ssp-id': SSP_ID,
61
89
  };
62
- if (gdprApplies !== undefined) {
90
+
91
+ const gdprApplies = Boolean(deepAccess(bidderRequest, 'gdprConsent.gdprApplies'));
92
+ if (gdprApplies) {
93
+ const consentString = deepAccess(bidderRequest, 'gdprConsent.consentString');
63
94
  queryParams['gdpr'] = 1;
64
95
  queryParams['tcf-consent'] = consentString;
65
96
  }
66
97
 
67
98
  const imp = {
68
99
  id: impId,
69
- banner: {
70
- format: sizes,
71
- w,
72
- h,
73
- }
100
+ banner: mapBanner(bidRequest),
101
+ native: mapNative(bidRequest),
74
102
  };
75
103
 
76
- if (bidRequest.getFloor) {
77
- const floorInfo = bidRequest.getFloor({
78
- currency: DEFAULT_CURRENCY,
79
- size
80
- });
81
-
82
- imp.bidfloor = floorInfo.floor;
83
- imp.bidfloorcur = floorInfo.currency;
104
+ const bidfloor = getBidfloor(bidRequest);
105
+ if (bidfloor) {
106
+ imp.bidfloor = bidfloor.floor;
107
+ imp.bidfloorcur = bidfloor.currency;
84
108
  }
85
109
 
86
110
  const queryParamsString = formatQS(queryParams);
@@ -91,8 +115,9 @@ export const spec = {
91
115
  id: bidRequest.bidId,
92
116
  imp: [imp],
93
117
  site: {
94
- ref_url: referrer,
95
- page_url: page,
118
+ ref: referrer,
119
+ page,
120
+ domain,
96
121
  },
97
122
  tmax: timeout,
98
123
  },
@@ -104,58 +129,27 @@ export const spec = {
104
129
  });
105
130
  },
106
131
 
107
- interpretResponse: function(serverResponse, {bidRequest}) {
108
- let response = serverResponse.body;
109
- if (!response.seatbid) {
110
- return [];
111
- }
112
-
113
- const { cur, seatbid } = serverResponse.body;
114
- const rtbBids = seatbid
115
- .map(seatbid => seatbid.bid)
116
- .reduce((a, b) => a.concat(b), []);
117
-
118
- return rtbBids.map(rtbBid => {
119
- let prBid = {
120
- requestId: bidRequest.bidId,
121
- cpm: rtbBid.price,
122
- currency: cur || DEFAULT_CURRENCY,
123
- width: rtbBid.w,
124
- height: rtbBid.h,
125
- creativeId: rtbBid.adid,
126
- nurl: rtbBid.nurl,
127
-
128
- netRevenue: true,
129
- ttl: DEFAULT_TTL,
130
-
131
- meta: {
132
- advertiserDomains: rtbBid.adomain && rtbBid.adomain.length > 0 ? rtbBid.adomain : [],
133
- }
134
- };
135
-
136
- prBid.ad = rtbBid.adm;
137
-
138
- return prBid;
139
- });
140
- },
132
+ interpretResponse: interpretResponse,
141
133
 
142
134
  onBidWon: function (bid) {
143
135
  let nurl = bid['nurl'];
136
+
144
137
  if (!nurl) {
145
138
  return;
146
139
  }
147
140
 
148
- const cpm = deepAccess(bid, 'adserverTargeting.hb_pb') || '';
149
- const curr = (bid.hasOwnProperty('originalCurrency') && bid.hasOwnProperty('originalCpm'))
150
- ? bid.originalCurrency
151
- : bid.currency;
152
-
153
- nurl = nurl
154
- .replace(/\${AUCTION_PRICE}/, cpm)
155
- .replace(/\${AUCTION_CURRENCY}/, curr)
156
- ;
141
+ let cpm, currency;
142
+ if (bid.hasOwnProperty('originalCurrency') && bid.hasOwnProperty('originalCpm')) {
143
+ cpm = bid.originalCpm;
144
+ currency = bid.originalCurrency;
145
+ } else {
146
+ cpm = bid.cpm;
147
+ currency = bid.currency;
148
+ }
149
+ cpm = deepAccess(bid, 'adserverTargeting.hb_pb') || cpm;
157
150
 
158
- triggerPixel(nurl);
151
+ const pixel = replaceAuctionPrice(nurl, cpm, currency);
152
+ triggerPixel(pixel);
159
153
  }
160
154
  }
161
155
 
@@ -193,4 +187,198 @@ function extractPlacementIds(bidRequestParams) {
193
187
  return result;
194
188
  }
195
189
 
190
+ function getBidfloor(bidRequest) {
191
+ const floors = [];
192
+
193
+ if (typeof bidRequest.getFloor === 'function') {
194
+ SUPPORTED_MEDIA_TYPES.forEach(type => {
195
+ if (bidRequest.hasOwnProperty(type)) {
196
+ const floorInfo = bidRequest.getFloor({
197
+ currency: DEFAULT_CURRENCY,
198
+ mediaType: type,
199
+ size: bidRequest.sizes || '*' }
200
+ )
201
+ floors.push(floorInfo);
202
+ }
203
+ });
204
+ }
205
+
206
+ return floors.sort((a, b) => b.floor - a.floor)[0];
207
+ }
208
+
209
+ function mapBanner(bidRequest) {
210
+ if (deepAccess(bidRequest, 'mediaTypes.banner')) {
211
+ const sizes = bidRequest.sizes || bidRequest.mediaTypes.banner.sizes;
212
+ const format = sizes.map((size) => ({
213
+ w: size[0],
214
+ h: size[1],
215
+ }));
216
+ const { w, h } = format[0];
217
+
218
+ return {
219
+ format,
220
+ w,
221
+ h,
222
+ }
223
+ }
224
+ }
225
+
226
+ function mapNative(bidRequest) {
227
+ const adUnitNativeAssets = deepAccess(bidRequest, 'mediaTypes.native');
228
+ if (adUnitNativeAssets) {
229
+ const assets = [];
230
+
231
+ Object.keys(adUnitNativeAssets).forEach((assetCode) => {
232
+ if (NATIVE_ASSETS.hasOwnProperty(assetCode)) {
233
+ const nativeAsset = NATIVE_ASSETS[assetCode];
234
+ const adUnitAssetParams = adUnitNativeAssets[assetCode];
235
+ const asset = mapAsset(assetCode, adUnitAssetParams, nativeAsset);
236
+ assets.push(asset);
237
+ }
238
+ });
239
+
240
+ return {
241
+ ver: 1.1,
242
+ request: JSON.stringify({
243
+ ver: 1.1,
244
+ assets
245
+ }),
246
+ };
247
+ }
248
+ }
249
+
250
+ function mapAsset(assetCode, adUnitAssetParams, nativeAsset) {
251
+ const [ nativeAssetId, nativeAssetType ] = nativeAsset;
252
+ const asset = {
253
+ id: nativeAssetId,
254
+ };
255
+
256
+ if (adUnitAssetParams.required) {
257
+ asset.required = 1;
258
+ }
259
+
260
+ if (assetCode === 'title') {
261
+ asset.title = {
262
+ len: adUnitAssetParams.len || 25,
263
+ };
264
+ } else if (assetCode === 'image' || assetCode === 'icon') {
265
+ asset.img = mapImageAsset(adUnitAssetParams, nativeAssetType);
266
+ } else {
267
+ asset.data = {
268
+ type: nativeAssetType,
269
+ len: adUnitAssetParams.len,
270
+ };
271
+ }
272
+
273
+ return asset;
274
+ }
275
+
276
+ function mapImageAsset(adUnitImageAssetParams, nativeAssetType) {
277
+ const img = {
278
+ type: nativeAssetType,
279
+ };
280
+
281
+ if (adUnitImageAssetParams.aspect_ratios) {
282
+ const ratio = adUnitImageAssetParams.aspect_ratios[0];
283
+ const minWidth = ratio.min_width || 100;
284
+
285
+ img.wmin = minWidth;
286
+ img.hmin = (minWidth / ratio.ratio_width * ratio.ratio_height);
287
+ }
288
+
289
+ if (adUnitImageAssetParams.sizes) {
290
+ const size = Array.isArray(adUnitImageAssetParams.sizes[0]) ? adUnitImageAssetParams.sizes[0] : adUnitImageAssetParams.sizes;
291
+ img.w = size[0];
292
+ img.h = size[1];
293
+ }
294
+
295
+ return img;
296
+ }
297
+
298
+ function interpretResponse(serverResponse, { bidRequest }) {
299
+ let response = serverResponse.body;
300
+ if (!response.seatbid) {
301
+ return [];
302
+ }
303
+ const { seatbid, cur } = serverResponse.body;
304
+ const bidsReceived = seatbid
305
+ .map(seatbid => seatbid.bid)
306
+ .reduce((a, b) => a.concat(b), []);
307
+
308
+ const currency = cur || DEFAULT_CURRENCY;
309
+
310
+ return bidsReceived.map(bidReceived => {
311
+ const price = bidReceived.price;
312
+ let prBid = {
313
+ requestId: bidRequest.bidId,
314
+ cpm: price,
315
+ currency: currency,
316
+ width: bidReceived.w,
317
+ height: bidReceived.h,
318
+ creativeId: bidReceived.adid,
319
+ nurl: bidReceived.nurl,
320
+
321
+ netRevenue: true,
322
+ ttl: DEFAULT_TTL,
323
+
324
+ meta: {
325
+ advertiserDomains: bidReceived.adomain && bidReceived.adomain.length > 0 ? bidReceived.adomain : [],
326
+ }
327
+ };
328
+
329
+ if (bidReceived.adm.indexOf('{') === 0) {
330
+ prBid.mediaType = NATIVE;
331
+ prBid.native = interpretNativeAd(bidReceived, price, currency);
332
+ } else {
333
+ prBid.mediaType = BANNER;
334
+ prBid.ad = bidReceived.adm;
335
+ }
336
+
337
+ return prBid;
338
+ });
339
+ }
340
+
341
+ function interpretNativeAd(bidReceived, price, currency) {
342
+ try {
343
+ const { adm } = bidReceived;
344
+ const { native } = JSON.parse(adm);
345
+
346
+ const result = {
347
+ clickUrl: native.link.url,
348
+ };
349
+
350
+ native.assets.forEach(asset => {
351
+ const assetCode = NATIVE_ASSETS_IDS[asset.id];
352
+ if (!assetCode) {
353
+ return;
354
+ }
355
+ if (assetCode === 'image' || assetCode === 'icon') {
356
+ result[assetCode] = {
357
+ url: asset.img.url,
358
+ width: asset.img.w,
359
+ height: asset.img.h
360
+ };
361
+ } else if (assetCode === 'title') {
362
+ result[assetCode] = asset.title.text;
363
+ } else {
364
+ result[assetCode] = asset.data.value;
365
+ }
366
+ });
367
+
368
+ result.impressionTrackers = _map(native.imptrackers, (tracker) =>
369
+ replaceAuctionPrice(tracker, price, currency)
370
+ );
371
+
372
+ return result;
373
+ } catch (e) {}
374
+ }
375
+
376
+ function replaceAuctionPrice(url, price, currency) {
377
+ if (!url) return;
378
+
379
+ return url
380
+ .replace(/\${AUCTION_PRICE}/, price)
381
+ .replace(/\${AUCTION_CURRENCY}/, currency);
382
+ }
383
+
196
384
  registerBidder(spec);
@@ -20,21 +20,58 @@ Yandex Bidder Adapter for Prebid.js.
20
20
 
21
21
  # Test Parameters
22
22
 
23
- ```
24
- var adUnits = [{
25
- code: 'banner-1',
26
- mediaTypes: {
27
- banner: {
28
- sizes: [[240, 400], [300, 600]],
29
- }
23
+ ```javascript
24
+ var adUnits = [
25
+ { // banner
26
+ code: 'banner-1',
27
+ mediaTypes: {
28
+ banner: {
29
+ sizes: [[240, 400], [300, 600]],
30
+ }
31
+ },
32
+ bids: [
33
+ {
34
+ bidder: 'yandex',
35
+ params: {
36
+ placementId: '346580-1'
37
+ },
38
+ }
39
+ ],
30
40
  },
31
- bids: [{
32
- {
33
- bidder: 'yandex',
34
- params: {
35
- placementId: '346580-1'
41
+ { // native
42
+ code: 'banner-2',
43
+ mediaTypes: {
44
+ native: {
45
+ title: {
46
+ required: true,
47
+ len: 25
48
+ },
49
+ image: {
50
+ required: true,
51
+ sizes: [300, 250],
52
+ },
53
+ icon: {
54
+ sizes: [32, 32],
55
+ },
56
+ body: {
57
+ len: 90
58
+ },
59
+ body2: {
60
+ len: 90
61
+ },
62
+ sponsoredBy: {
63
+ len: 25,
64
+ }
36
65
  },
37
- }
38
- }]
39
- }];
66
+ },
67
+ bids: [
68
+ {
69
+ bidder: 'yandex',
70
+ params: {
71
+ placementId: '346580-1'
72
+ },
73
+ }
74
+ ],
75
+ },
76
+ ];
40
77
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.40.0",
3
+ "version": "7.41.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
package/src/videoCache.js CHANGED
@@ -9,8 +9,8 @@
9
9
  * This trickery helps integrate with ad servers, which set character limits on request params.
10
10
  */
11
11
 
12
- import { ajax } from './ajax.js';
13
- import { config } from './config.js';
12
+ import {ajaxBuilder} from './ajax.js';
13
+ import {config} from './config.js';
14
14
  import {auctionManager} from './auctionManager.js';
15
15
 
16
16
  /**
@@ -142,11 +142,11 @@ function shimStorageCallback(done) {
142
142
  * @param {videoCacheStoreCallback} [done] An optional callback which should be executed after
143
143
  * the data has been stored in the cache.
144
144
  */
145
- export function store(bids, done) {
145
+ export function store(bids, done, getAjax = ajaxBuilder) {
146
146
  const requestData = {
147
147
  puts: bids.map(toStorageRequest)
148
148
  };
149
-
149
+ const ajax = getAjax(config.getConfig('cache.timeout'));
150
150
  ajax(config.getConfig('cache.url'), shimStorageCallback(done), JSON.stringify(requestData), {
151
151
  contentType: 'text/plain',
152
152
  withCredentials: true