prebid.js 5.16.0 → 5.20.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 (182) hide show
  1. package/.devcontainer/Dockerfile +11 -0
  2. package/.devcontainer/devcontainer.json +27 -0
  3. package/.devcontainer/postCreate.sh +6 -0
  4. package/browsers.json +1 -0
  5. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  6. package/modules/.submodules.json +1 -0
  7. package/modules/adfBidAdapter.js +21 -16
  8. package/modules/adgenerationBidAdapter.js +28 -4
  9. package/modules/adkernelBidAdapter.js +3 -1
  10. package/modules/admixerBidAdapter.js +11 -0
  11. package/modules/adnuntiusBidAdapter.js +1 -0
  12. package/modules/adtelligentBidAdapter.js +2 -1
  13. package/modules/airgridRtdProvider.js +1 -1
  14. package/modules/akamaiDapRtdProvider.js +474 -0
  15. package/modules/akamaiDapRtdProvider.md +47 -0
  16. package/modules/aolBidAdapter.js +2 -1
  17. package/modules/appnexusBidAdapter.js +5 -3
  18. package/modules/atsAnalyticsAdapter.js +89 -63
  19. package/modules/atsAnalyticsAdapter.md +1 -0
  20. package/modules/betweenBidAdapter.js +20 -3
  21. package/modules/bliinkBidAdapter.js +58 -32
  22. package/modules/bliinkBidAdapter.md +29 -6
  23. package/modules/browsiRtdProvider.js +106 -18
  24. package/modules/cleanioRtdProvider.js +192 -0
  25. package/modules/cleanioRtdProvider.md +59 -0
  26. package/modules/codefuelBidAdapter.js +183 -0
  27. package/modules/codefuelBidAdapter.md +111 -0
  28. package/modules/connectIdSystem.js +104 -0
  29. package/modules/connectIdSystem.md +33 -0
  30. package/modules/cwireBidAdapter.js +272 -0
  31. package/modules/cwireBidAdapter.md +43 -0
  32. package/modules/deepintentBidAdapter.js +106 -9
  33. package/modules/deepintentBidAdapter.md +36 -1
  34. package/modules/deltaprojectsBidAdapter.js +252 -0
  35. package/modules/deltaprojectsBidAdapter.md +32 -0
  36. package/modules/dgkeywordRtdProvider.js +0 -1
  37. package/modules/engageyaBidAdapter.js +157 -0
  38. package/modules/glimpseBidAdapter.js +160 -48
  39. package/modules/glimpseBidAdapter.md +11 -74
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gridNMBidAdapter.js +7 -6
  42. package/modules/gumgumBidAdapter.js +16 -2
  43. package/modules/iasRtdProvider.js +83 -67
  44. package/modules/inskinBidAdapter.js +7 -3
  45. package/modules/ixBidAdapter.js +8 -1
  46. package/modules/jixieBidAdapter.js +8 -2
  47. package/modules/justpremiumBidAdapter.js +6 -1
  48. package/modules/kargoBidAdapter.js +14 -7
  49. package/modules/kargoBidAdapter.md +20 -0
  50. package/modules/limelightDigitalBidAdapter.js +22 -2
  51. package/modules/livewrappedAnalyticsAdapter.js +53 -3
  52. package/modules/mediakeysBidAdapter.js +405 -14
  53. package/modules/mediakeysBidAdapter.md +108 -0
  54. package/modules/multibid/index.js +3 -3
  55. package/modules/mytargetBidAdapter.js +112 -0
  56. package/modules/nativoBidAdapter.js +48 -29
  57. package/modules/nativoBidAdapter.md +0 -1
  58. package/modules/nextMillenniumBidAdapter.js +12 -3
  59. package/modules/nextrollBidAdapter.js +375 -0
  60. package/modules/nobidBidAdapter.js +2 -1
  61. package/modules/oguryBidAdapter.js +36 -7
  62. package/modules/openxBidAdapter.js +34 -22
  63. package/modules/operaadsBidAdapter.js +21 -1
  64. package/modules/otmBidAdapter.js +146 -0
  65. package/modules/otmBidAdapter.md +27 -26
  66. package/modules/outbrainBidAdapter.js +5 -0
  67. package/modules/pixfutureBidAdapter.js +24 -4
  68. package/modules/pixfutureBidAdapter.md +127 -0
  69. package/modules/playwireBidAdapter.md +61 -0
  70. package/modules/prebidServerBidAdapter/index.js +1 -1
  71. package/modules/proxistoreBidAdapter.js +4 -6
  72. package/modules/publinkIdSystem.js +17 -7
  73. package/modules/publinkIdSystem.md +7 -2
  74. package/modules/pubmaticBidAdapter.js +22 -6
  75. package/modules/pubmaticBidAdapter.md +1 -1
  76. package/modules/relaidoBidAdapter.js +8 -2
  77. package/modules/rtdModule/index.js +2 -2
  78. package/modules/sharethroughBidAdapter.js +12 -19
  79. package/modules/slimcutBidAdapter.js +121 -0
  80. package/modules/sonobiBidAdapter.js +7 -0
  81. package/modules/sortableBidAdapter.js +1 -0
  82. package/modules/spotxBidAdapter.js +15 -1
  83. package/modules/sspBCBidAdapter.js +207 -12
  84. package/modules/sspBCBidAdapter.md +1 -1
  85. package/modules/talkadsBidAdapter.js +129 -0
  86. package/modules/talkadsBidAdapter.md +60 -0
  87. package/modules/tappxBidAdapter.js +6 -5
  88. package/modules/teadsBidAdapter.js +3 -0
  89. package/modules/tripleliftBidAdapter.js +22 -5
  90. package/modules/trustxBidAdapter.js +17 -11
  91. package/modules/undertoneBidAdapter.js +9 -5
  92. package/modules/undertoneBidAdapter.md +5 -1
  93. package/modules/unicornBidAdapter.js +3 -3
  94. package/modules/userId/eids.js +18 -0
  95. package/modules/userId/eids.md +7 -0
  96. package/modules/userId/userId.md +12 -0
  97. package/modules/ventesBidAdapter.js +370 -0
  98. package/modules/ventesBidAdapter.md +94 -0
  99. package/modules/videobyteBidAdapter.js +13 -6
  100. package/modules/videobyteBidAdapter.md +49 -0
  101. package/modules/vidoomyBidAdapter.js +20 -12
  102. package/modules/visxBidAdapter.js +15 -22
  103. package/modules/yahoosspBidAdapter.js +637 -0
  104. package/modules/yahoosspBidAdapter.md +795 -0
  105. package/modules/yieldlabBidAdapter.js +48 -3
  106. package/modules/yieldlabBidAdapter.md +16 -1
  107. package/modules/yieldmoBidAdapter.js +20 -6
  108. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  109. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  110. package/package.json +1 -1
  111. package/src/adapterManager.js +5 -0
  112. package/src/adapters/bidderFactory.js +4 -3
  113. package/src/auction.js +11 -11
  114. package/src/constants.json +1 -0
  115. package/src/secureCreatives.js +6 -7
  116. package/src/targeting.js +11 -9
  117. package/test/.eslintrc.js +2 -1
  118. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  119. package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
  120. package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
  121. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  122. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  123. package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
  124. package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
  125. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  126. package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
  127. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  128. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  129. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  130. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  131. package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
  132. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  133. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  134. package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
  135. package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
  136. package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
  137. package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
  138. package/test/spec/modules/iasRtdProvider_spec.js +71 -6
  139. package/test/spec/modules/ixBidAdapter_spec.js +13 -3
  140. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  141. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  142. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  143. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
  144. package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
  145. package/test/spec/modules/multibid_spec.js +31 -31
  146. package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
  147. package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
  148. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  149. package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
  150. package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
  151. package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
  152. package/test/spec/modules/openxBidAdapter_spec.js +85 -13
  153. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  154. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  155. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  156. package/test/spec/modules/publinkIdSystem_spec.js +34 -15
  157. package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
  158. package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
  159. package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
  160. package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
  161. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  162. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  163. package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
  164. package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
  165. package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
  166. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  167. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  168. package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
  169. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  170. package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
  171. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  172. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  173. package/test/spec/modules/visxBidAdapter_spec.js +48 -4
  174. package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
  175. package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
  176. package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
  177. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  178. package/test/spec/unit/core/adapterManager_spec.js +32 -0
  179. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  180. package/test/spec/unit/pbjs_api_spec.js +37 -2
  181. package/test/spec/unit/secureCreatives_spec.js +54 -25
  182. package/modules/turktelekomBidAdapter.md +0 -49
@@ -13,9 +13,6 @@ export const storage = getStorageManager();
13
13
  */
14
14
 
15
15
  const analyticsType = 'endpoint';
16
- // dev endpoints
17
- // const preflightUrl = 'https://analytics-check.publishersite.xyz/check/';
18
- // export const analyticsUrl = 'https://analyticsv2.publishersite.xyz';
19
16
 
20
17
  const preflightUrl = 'https://check.analytics.rlcdn.com/check/';
21
18
  export const analyticsUrl = 'https://analytics.rlcdn.com';
@@ -23,7 +20,7 @@ export const analyticsUrl = 'https://analytics.rlcdn.com';
23
20
  let handlerRequest = [];
24
21
  let handlerResponse = [];
25
22
 
26
- let atsAnalyticsAdapterVersion = 1;
23
+ let atsAnalyticsAdapterVersion = 3;
27
24
 
28
25
  let browsersList = [
29
26
  /* Googlebot */
@@ -207,12 +204,6 @@ let browsersList = [
207
204
  },
208
205
  ];
209
206
 
210
- function setSamplingCookie(samplRate) {
211
- let now = new Date();
212
- now.setTime(now.getTime() + 3600000);
213
- storage.setCookie('_lr_sampling_rate', samplRate, now.toUTCString());
214
- }
215
-
216
207
  let listOfSupportedBrowsers = ['Safari', 'Chrome', 'Firefox', 'Microsoft Edge'];
217
208
 
218
209
  function bidRequestedHandler(args) {
@@ -231,7 +222,8 @@ function bidRequestedHandler(args) {
231
222
  auction_start: new Date(args.auctionStart).toJSON(),
232
223
  domain: window.location.hostname,
233
224
  pid: atsAnalyticsAdapter.context.pid,
234
- adapter_version: atsAnalyticsAdapterVersion
225
+ adapter_version: atsAnalyticsAdapterVersion,
226
+ bid_won: false
235
227
  };
236
228
  });
237
229
  return requests;
@@ -260,13 +252,14 @@ export function parseBrowser() {
260
252
  }
261
253
  }
262
254
 
263
- function sendDataToAnalytic () {
255
+ function sendDataToAnalytic (events) {
264
256
  // send data to ats analytic endpoint
265
257
  try {
266
- let dataToSend = {'Data': atsAnalyticsAdapter.context.events};
258
+ let dataToSend = {'Data': events};
267
259
  let strJSON = JSON.stringify(dataToSend);
268
260
  logInfo('ATS Analytics - tried to send analytics data!');
269
261
  ajax(analyticsUrl, function () {
262
+ logInfo('ATS Analytics - events sent successfully!');
270
263
  }, strJSON, {method: 'POST', contentType: 'application/json'});
271
264
  } catch (err) {
272
265
  logError('ATS Analytics - request encounter an error: ', err);
@@ -274,41 +267,26 @@ function sendDataToAnalytic () {
274
267
  }
275
268
 
276
269
  // preflight request, to check did publisher have permission to send data to analytics endpoint
277
- function preflightRequest (envelopeSourceCookieValue) {
270
+ function preflightRequest (envelopeSourceCookieValue, events) {
278
271
  logInfo('ATS Analytics - preflight request!');
279
- ajax(preflightUrl + atsAnalyticsAdapter.context.pid, function (data) {
280
- let samplingRateObject = JSON.parse(data);
281
- logInfo('ATS Analytics - Sampling Rate: ', samplingRateObject);
282
- let samplingRate = samplingRateObject['samplingRate'];
283
- setSamplingCookie(samplingRate);
284
- let samplingRateNumber = Number(samplingRate);
285
- if (data && samplingRate && atsAnalyticsAdapter.shouldFireRequest(samplingRateNumber) && envelopeSourceCookieValue != null) {
286
- sendDataToAnalytic();
287
- }
288
- }, undefined, { method: 'GET', crossOrigin: true });
289
- }
290
-
291
- function callHandler(evtype, args) {
292
- if (evtype === CONSTANTS.EVENTS.BID_REQUESTED) {
293
- handlerRequest = handlerRequest.concat(bidRequestedHandler(args));
294
- } else if (evtype === CONSTANTS.EVENTS.BID_RESPONSE) {
295
- handlerResponse.push(bidResponseHandler(args));
296
- }
297
- if (evtype === CONSTANTS.EVENTS.AUCTION_END) {
298
- if (handlerRequest.length) {
299
- let events = [];
300
- if (handlerResponse.length) {
301
- events = handlerRequest.filter(request => handlerResponse.filter(function(response) {
302
- if (request.bid_id === response.bid_id) {
303
- Object.assign(request, response);
304
- }
305
- }));
306
- } else {
307
- events = handlerRequest;
272
+ ajax(preflightUrl + atsAnalyticsAdapter.context.pid,
273
+ {
274
+ success: function (data) {
275
+ let samplingRateObject = JSON.parse(data);
276
+ logInfo('ATS Analytics - Sampling Rate: ', samplingRateObject);
277
+ let samplingRate = samplingRateObject.samplingRate;
278
+ atsAnalyticsAdapter.setSamplingCookie(samplingRate);
279
+ let samplingRateNumber = Number(samplingRate);
280
+ if (data && samplingRate && atsAnalyticsAdapter.shouldFireRequest(samplingRateNumber) && envelopeSourceCookieValue != null) {
281
+ logInfo('ATS Analytics - events to send: ', events);
282
+ sendDataToAnalytic(events);
283
+ }
284
+ },
285
+ error: function () {
286
+ atsAnalyticsAdapter.setSamplingCookie(0);
287
+ logInfo('ATS Analytics - Sampling Rate Request Error!');
308
288
  }
309
- atsAnalyticsAdapter.context.events = events;
310
- }
311
- }
289
+ }, undefined, {method: 'GET', crossOrigin: true});
312
290
  }
313
291
 
314
292
  let atsAnalyticsAdapter = Object.assign(adapter(
@@ -318,22 +296,7 @@ let atsAnalyticsAdapter = Object.assign(adapter(
318
296
  {
319
297
  track({eventType, args}) {
320
298
  if (typeof args !== 'undefined') {
321
- callHandler(eventType, args);
322
- }
323
- if (eventType === CONSTANTS.EVENTS.AUCTION_END) {
324
- let envelopeSourceCookieValue = storage.getCookie('_lr_env_src_ats');
325
- try {
326
- let samplingRateCookie = storage.getCookie('_lr_sampling_rate');
327
- if (!samplingRateCookie) {
328
- preflightRequest(envelopeSourceCookieValue);
329
- } else {
330
- if (atsAnalyticsAdapter.shouldFireRequest(parseInt(samplingRateCookie)) && envelopeSourceCookieValue != null) {
331
- sendDataToAnalytic();
332
- }
333
- }
334
- } catch (err) {
335
- logError('ATS Analytics - preflight request encounter an error: ', err);
336
- }
299
+ atsAnalyticsAdapter.callHandler(eventType, args);
337
300
  }
338
301
  }
339
302
  });
@@ -356,6 +319,13 @@ atsAnalyticsAdapter.shouldFireRequest = function (samplingRate) {
356
319
  atsAnalyticsAdapter.getUserAgent = function () {
357
320
  return window.navigator.userAgent;
358
321
  };
322
+
323
+ atsAnalyticsAdapter.setSamplingCookie = function (samplRate) {
324
+ const now = new Date();
325
+ now.setTime(now.getTime() + 86400000);
326
+ storage.setCookie('_lr_sampling_rate', samplRate, now.toUTCString());
327
+ }
328
+
359
329
  // override enableAnalytics so we can get access to the config passed in from the page
360
330
  atsAnalyticsAdapter.enableAnalytics = function (config) {
361
331
  if (!config.options.pid) {
@@ -364,13 +334,69 @@ atsAnalyticsAdapter.enableAnalytics = function (config) {
364
334
  }
365
335
  atsAnalyticsAdapter.context = {
366
336
  events: [],
367
- pid: config.options.pid
337
+ pid: config.options.pid,
338
+ bidWonTimeout: config.options.bidWonTimeout
368
339
  };
369
340
  let initOptions = config.options;
370
341
  logInfo('ATS Analytics - adapter enabled! ');
371
342
  atsAnalyticsAdapter.originEnableAnalytics(initOptions); // call the base class function
372
343
  };
373
344
 
345
+ atsAnalyticsAdapter.callHandler = function (evtype, args) {
346
+ if (evtype === CONSTANTS.EVENTS.BID_REQUESTED) {
347
+ handlerRequest = handlerRequest.concat(bidRequestedHandler(args));
348
+ } else if (evtype === CONSTANTS.EVENTS.BID_RESPONSE) {
349
+ handlerResponse.push(bidResponseHandler(args));
350
+ }
351
+ if (evtype === CONSTANTS.EVENTS.AUCTION_END) {
352
+ let bidWonTimeout = atsAnalyticsAdapter.context.bidWonTimeout ? atsAnalyticsAdapter.context.bidWonTimeout : 2000;
353
+ let events = [];
354
+ setTimeout(() => {
355
+ let winningBids = $$PREBID_GLOBAL$$.getAllWinningBids();
356
+ logInfo('ATS Analytics - winning bids: ', winningBids)
357
+ // prepare format data for sending to analytics endpoint
358
+ if (handlerRequest.length) {
359
+ let wonEvent = {};
360
+ if (handlerResponse.length) {
361
+ events = handlerRequest.filter(request => handlerResponse.filter(function (response) {
362
+ if (request.bid_id === response.bid_id) {
363
+ Object.assign(request, response);
364
+ }
365
+ }));
366
+ if (winningBids.length) {
367
+ events = events.filter(event => winningBids.filter(function (won) {
368
+ wonEvent.bid_id = won.requestId;
369
+ wonEvent.bid_won = true;
370
+ if (event.bid_id === wonEvent.bid_id) {
371
+ Object.assign(event, wonEvent);
372
+ }
373
+ }))
374
+ }
375
+ } else {
376
+ events = handlerRequest;
377
+ }
378
+ // check should we send data to analytics or not, check first cookie value _lr_sampling_rate
379
+ try {
380
+ let envelopeSourceCookieValue = storage.getCookie('_lr_env_src_ats');
381
+ let samplingRateCookie = storage.getCookie('_lr_sampling_rate');
382
+ if (!samplingRateCookie) {
383
+ preflightRequest(envelopeSourceCookieValue, events);
384
+ } else {
385
+ if (atsAnalyticsAdapter.shouldFireRequest(parseInt(samplingRateCookie)) && envelopeSourceCookieValue != null) {
386
+ logInfo('ATS Analytics - events to send: ', events);
387
+ sendDataToAnalytic(events);
388
+ }
389
+ }
390
+ // empty events array to not send duplicate events
391
+ events = [];
392
+ } catch (err) {
393
+ logError('ATS Analytics - preflight request encounter an error: ', err);
394
+ }
395
+ }
396
+ }, bidWonTimeout);
397
+ }
398
+ }
399
+
374
400
  adaptermanager.registerAnalyticsAdapter({
375
401
  adapter: atsAnalyticsAdapter,
376
402
  code: 'atsAnalytics',
@@ -17,6 +17,7 @@ Analytics adapter for Authenticated Traffic Solution(ATS), provided by LiveRamp.
17
17
  provider: 'atsAnalytics',
18
18
  options: {
19
19
  pid: '999', // publisher ID
20
+ bidWonTimeout: 2000 // on auction end for how long to wait for bid_won events, by default it's 2000 miliseconds, if it's not set it will be 2000 miliseconds.
20
21
  }
21
22
  }
22
23
  ```
@@ -3,12 +3,14 @@ import { getAdUnitSizes, parseSizesInput } from '../src/utils.js';
3
3
  import { getRefererInfo } from '../src/refererDetection.js';
4
4
 
5
5
  const BIDDER_CODE = 'between';
6
- const ENDPOINT = 'https://ads.betweendigital.com/adjson?t=prebid';
6
+ let ENDPOINT = 'https://ads.betweendigital.com/adjson?t=prebid';
7
+ const CODE_TYPES = ['inpage', 'preroll', 'midroll', 'postroll'];
7
8
 
9
+ const includes = require('core-js-pure/features/array/includes.js');
8
10
  export const spec = {
9
11
  code: BIDDER_CODE,
10
12
  aliases: ['btw'],
11
- supportedMediaTypes: ['banner'],
13
+ supportedMediaTypes: ['banner', 'video'],
12
14
  /**
13
15
  * Determines whether or not the given bid request is valid.
14
16
  *
@@ -30,6 +32,8 @@ export const spec = {
30
32
  const refInfo = getRefererInfo();
31
33
 
32
34
  validBidRequests.forEach((i) => {
35
+ const video = i.mediaTypes && i.mediaTypes.video;
36
+
33
37
  let params = {
34
38
  eids: getUsersIds(i),
35
39
  sizes: parseSizesInput(getAdUnitSizes(i)),
@@ -38,12 +42,21 @@ export const spec = {
38
42
  tz: getTz(),
39
43
  fl: getFl(),
40
44
  rr: getRr(),
41
- s: i.params.s,
45
+ s: i.params && i.params.s,
42
46
  bidid: i.bidId,
43
47
  transactionid: i.transactionId,
44
48
  auctionid: i.auctionId
45
49
  };
46
50
 
51
+ if (video) {
52
+ params.mediaType = 2;
53
+ params.maxd = video.maxd;
54
+ params.mind = video.mind;
55
+ params.pos = 'atf';
56
+ ENDPOINT += '&jst=pvc';
57
+ params.codeType = includes(CODE_TYPES, video.codeType) ? video.codeType : 'inpage';
58
+ }
59
+
47
60
  if (i.params.itu !== undefined) {
48
61
  params.itu = i.params.itu;
49
62
  }
@@ -94,12 +107,15 @@ export const spec = {
94
107
  */
95
108
  interpretResponse: function(serverResponse, bidRequest) {
96
109
  const bidResponses = [];
110
+
97
111
  for (var i = 0; i < serverResponse.body.length; i++) {
98
112
  let bidResponse = {
99
113
  requestId: serverResponse.body[i].bidid,
100
114
  cpm: serverResponse.body[i].cpm || 0,
101
115
  width: serverResponse.body[i].w,
102
116
  height: serverResponse.body[i].h,
117
+ vastXml: serverResponse.body[i].vastXml,
118
+ mediaType: serverResponse.body[i].mediaType,
103
119
  ttl: serverResponse.body[i].ttl,
104
120
  creativeId: serverResponse.body[i].creativeid,
105
121
  currency: serverResponse.body[i].currency || 'RUB',
@@ -109,6 +125,7 @@ export const spec = {
109
125
  advertiserDomains: serverResponse.body[i].adomain ? serverResponse.body[i].adomain : []
110
126
  }
111
127
  };
128
+
112
129
  bidResponses.push(bidResponse);
113
130
  }
114
131
  return bidResponses;
@@ -10,10 +10,9 @@ export const META_KEYWORDS = 'keywords'
10
10
  export const META_DESCRIPTION = 'description'
11
11
 
12
12
  const VIDEO = 'video'
13
- const NATIVE = 'native'
14
13
  const BANNER = 'banner'
15
14
 
16
- const supportedMediaTypes = [BANNER, VIDEO, NATIVE]
15
+ const supportedMediaTypes = [BANNER, VIDEO]
17
16
  const aliasBidderCode = ['bk']
18
17
 
19
18
  export function getMetaList(name) {
@@ -90,7 +89,11 @@ export const parseXML = (content) => {
90
89
  if (typeof content !== 'string' || content.length === 0) return null
91
90
 
92
91
  const parser = new DOMParser()
93
- const xml = parser.parseFromString(content, 'text/xml')
92
+ let xml;
93
+
94
+ try {
95
+ xml = parser.parseFromString(content, 'text/xml')
96
+ } catch (e) {}
94
97
 
95
98
  if (xml &&
96
99
  xml.getElementsByTagName('VAST')[0] &&
@@ -104,19 +107,19 @@ export const parseXML = (content) => {
104
107
  /**
105
108
  * @param bidRequest
106
109
  * @param bliinkCreative
107
- * @return {{cpm, netRevenue: boolean, ad: string, requestId, width: number, currency: string, mediaType: string, vastXml, ttl: number, height: number}|null}
110
+ * @return {{cpm, netRevenue: boolean, requestId, width: (*|number), currency, ttl: number, creativeId, height: (*|number)} & {mediaType: string, vastXml}}
108
111
  */
109
112
  export const buildBid = (bidRequest, bliinkCreative) => {
110
113
  if (!bidRequest && !bliinkCreative) return null
111
114
 
112
115
  const body = {
113
116
  requestId: bidRequest.bidId,
117
+ currency: bliinkCreative.currency,
114
118
  cpm: bliinkCreative.price,
115
119
  creativeId: bliinkCreative.creativeId,
116
- currency: 'EUR',
120
+ width: (bidRequest.sizes && bidRequest.sizes[0][0]) || 1,
121
+ height: (bidRequest.sizes && bidRequest.sizes[0][1]) || 1,
117
122
  netRevenue: false,
118
- width: 1,
119
- height: 1,
120
123
  ttl: 3600,
121
124
  }
122
125
 
@@ -131,14 +134,20 @@ export const buildBid = (bidRequest, bliinkCreative) => {
131
134
 
132
135
  delete bidRequest['bids']
133
136
 
134
- return Object.assign(body, {
135
- currency: bliinkCreative.currency,
136
- width: 1,
137
- height: 1,
138
- mediaType: VIDEO,
139
- ad: '<html lang="en"></html>',
140
- vastXml: bliinkCreative.content,
141
- })
137
+ switch (bliinkCreative.media_type) {
138
+ case VIDEO:
139
+ return Object.assign(body, {
140
+ mediaType: VIDEO,
141
+ vastXml: bliinkCreative.content,
142
+ })
143
+ case BANNER:
144
+ return Object.assign(body, {
145
+ mediaType: BANNER,
146
+ ad: (bliinkCreative && bliinkCreative.content && bliinkCreative.content.creative && bliinkCreative.content.creative.adm) || '',
147
+ })
148
+ default:
149
+ break;
150
+ }
142
151
  }
143
152
 
144
153
  /**
@@ -209,7 +218,7 @@ export const buildRequests = (_, bidderRequest) => {
209
218
  * @return
210
219
  */
211
220
  const interpretResponse = (serverResponse, request) => {
212
- if ((serverResponse && serverResponse.mode === 'no-ad') && (!request.params)) {
221
+ if ((serverResponse && serverResponse.mode === 'no-ad')) {
213
222
  return []
214
223
  }
215
224
 
@@ -218,23 +227,40 @@ const interpretResponse = (serverResponse, request) => {
218
227
 
219
228
  const xml = parseXML(body)
220
229
 
221
- if (xml) {
222
- const price = xml.getElementsByTagName('Price') && xml.getElementsByTagName('Price')[0]
223
- const currency = xml.getElementsByTagName('Currency') && xml.getElementsByTagName('Currency')[0]
224
- const creativeId = xml.getElementsByTagName('CreativeId') && xml.getElementsByTagName('CreativeId')[0]
225
-
226
- const creative = {
227
- content: body,
228
- price: (price && price.textContent) || 0,
229
- currency: (currency && currency.textContent) || 'EUR',
230
- creativeId: creativeId || 0,
231
- media_type: 'video',
232
- }
233
-
234
- return buildBid(serverBody.bids[0], creative);
230
+ let creative;
231
+
232
+ switch (serverBody.bids[0].params.placement) {
233
+ case xml && VIDEO:
234
+ const price = xml.getElementsByTagName('Price') && xml.getElementsByTagName('Price')[0]
235
+ const currency = xml.getElementsByTagName('Currency') && xml.getElementsByTagName('Currency')[0]
236
+ const creativeId = xml.getElementsByTagName('CreativeId') && xml.getElementsByTagName('CreativeId')[0]
237
+
238
+ creative = {
239
+ content: body,
240
+ price: (price && price.textContent) || 0,
241
+ currency: (currency && currency.textContent) || 'EUR',
242
+ creativeId: creativeId || 0,
243
+ media_type: 'video',
244
+ }
245
+
246
+ return buildBid(serverBody.bids[0], creative)
247
+ case BANNER:
248
+ if (body) {
249
+ creative = {
250
+ content: body,
251
+ price: body.price,
252
+ currency: body.currency,
253
+ creativeId: 0,
254
+ media_type: 'banner',
255
+ }
256
+
257
+ return buildBid(serverBody.bids[0], creative)
258
+ }
259
+
260
+ break
261
+ default:
262
+ break
235
263
  }
236
-
237
- return []
238
264
  }
239
265
 
240
266
  /**
@@ -31,7 +31,7 @@ const adUnits = [
31
31
  bidder: 'bliink',
32
32
  params: {
33
33
  placement: 'banner',
34
- tagId: '14f30eca-85d2-11e8-9eed-0242ac120007'
34
+ tagId: '41'
35
35
  }
36
36
  }
37
37
  ]
@@ -50,11 +50,34 @@ const adUnits = [
50
50
  mediaTypes: {
51
51
  video: {
52
52
  context: 'instream',
53
- playerSize: [640, 480],
54
- mimes: ['video/mp4'],
55
- protocols: [1, 2, 3, 4, 5, 6, 7, 8],
56
- playbackmethod: [2],
57
- skip: 1
53
+ playerSize: [[640,480]],
54
+ }
55
+ },
56
+ bids: [
57
+ {
58
+ bidder: 'bliink',
59
+ params: {
60
+ tagId: '41',
61
+ placement: 'video',
62
+ }
63
+ }
64
+ ]
65
+ }
66
+ ]
67
+ ```
68
+
69
+ ## Sample outstream Video Ad Unit
70
+
71
+ ```js
72
+ const adUnits = [
73
+ {
74
+ code: '/19968336/prebid_cache_video_adunit',
75
+ sizes: [[640,480]],
76
+ mediaType: 'video',
77
+ mediaTypes: {
78
+ video: {
79
+ context: 'outstream',
80
+ playerSize: [[640,480]],
58
81
  }
59
82
  },
60
83
  bids: [