prebid.js 5.17.0 → 6.0.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 (145) hide show
  1. package/.babelrc.js +3 -6
  2. package/README.md +3 -1
  3. package/browsers.json +1 -8
  4. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  5. package/modules/.submodules.json +1 -0
  6. package/modules/adfBidAdapter.js +21 -16
  7. package/modules/adgenerationBidAdapter.js +28 -4
  8. package/modules/adkernelBidAdapter.js +2 -1
  9. package/modules/admixerBidAdapter.js +11 -0
  10. package/modules/adtelligentBidAdapter.js +2 -1
  11. package/modules/airgridRtdProvider.js +1 -1
  12. package/modules/akamaiDapRtdProvider.js +474 -0
  13. package/modules/akamaiDapRtdProvider.md +47 -0
  14. package/modules/aolBidAdapter.js +2 -1
  15. package/modules/appnexusBidAdapter.js +5 -3
  16. package/modules/atsAnalyticsAdapter.js +67 -46
  17. package/modules/atsAnalyticsAdapter.md +1 -0
  18. package/modules/betweenBidAdapter.js +20 -3
  19. package/modules/bliinkBidAdapter.js +58 -32
  20. package/modules/bliinkBidAdapter.md +29 -6
  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 +183 -0
  25. package/modules/codefuelBidAdapter.md +111 -0
  26. package/modules/connectIdSystem.js +104 -0
  27. package/modules/connectIdSystem.md +33 -0
  28. package/modules/cwireBidAdapter.js +272 -0
  29. package/modules/cwireBidAdapter.md +43 -0
  30. package/modules/deepintentBidAdapter.js +106 -9
  31. package/modules/deepintentBidAdapter.md +36 -1
  32. package/modules/deltaprojectsBidAdapter.js +252 -0
  33. package/modules/deltaprojectsBidAdapter.md +32 -0
  34. package/modules/dgkeywordRtdProvider.js +0 -1
  35. package/modules/engageyaBidAdapter.js +157 -0
  36. package/modules/gridBidAdapter.js +1 -0
  37. package/modules/gumgumBidAdapter.js +8 -0
  38. package/modules/inskinBidAdapter.js +7 -3
  39. package/modules/ixBidAdapter.js +8 -1
  40. package/modules/jixieBidAdapter.js +8 -2
  41. package/modules/justpremiumBidAdapter.js +6 -1
  42. package/modules/limelightDigitalBidAdapter.js +22 -2
  43. package/modules/livewrappedAnalyticsAdapter.js +53 -3
  44. package/modules/mediakeysBidAdapter.js +2 -1
  45. package/modules/multibid/index.js +3 -3
  46. package/modules/nativoBidAdapter.js +6 -2
  47. package/modules/nextMillenniumBidAdapter.js +12 -3
  48. package/modules/oguryBidAdapter.js +36 -7
  49. package/modules/openxBidAdapter.js +34 -22
  50. package/modules/operaadsBidAdapter.js +21 -1
  51. package/modules/otmBidAdapter.js +146 -0
  52. package/modules/otmBidAdapter.md +27 -26
  53. package/modules/outbrainBidAdapter.js +5 -0
  54. package/modules/pixfutureBidAdapter.js +24 -4
  55. package/modules/pixfutureBidAdapter.md +127 -0
  56. package/modules/playwireBidAdapter.md +61 -0
  57. package/modules/prebidServerBidAdapter/index.js +1 -1
  58. package/modules/proxistoreBidAdapter.js +4 -6
  59. package/modules/publinkIdSystem.js +11 -6
  60. package/modules/pubmaticBidAdapter.js +9 -0
  61. package/modules/pubmaticBidAdapter.md +1 -1
  62. package/modules/rtdModule/index.js +2 -2
  63. package/modules/sonobiBidAdapter.js +7 -0
  64. package/modules/sortableBidAdapter.js +1 -0
  65. package/modules/talkadsBidAdapter.js +129 -0
  66. package/modules/talkadsBidAdapter.md +60 -0
  67. package/modules/teadsBidAdapter.js +3 -0
  68. package/modules/tripleliftBidAdapter.js +22 -5
  69. package/modules/trustxBidAdapter.js +8 -6
  70. package/modules/undertoneBidAdapter.js +9 -5
  71. package/modules/undertoneBidAdapter.md +5 -1
  72. package/modules/unicornBidAdapter.js +3 -3
  73. package/modules/userId/eids.js +18 -0
  74. package/modules/userId/eids.md +7 -0
  75. package/modules/userId/userId.md +12 -0
  76. package/modules/ventesBidAdapter.js +370 -0
  77. package/modules/ventesBidAdapter.md +94 -0
  78. package/modules/videobyteBidAdapter.js +13 -6
  79. package/modules/videobyteBidAdapter.md +49 -0
  80. package/modules/visxBidAdapter.js +15 -22
  81. package/modules/yahoosspBidAdapter.js +637 -0
  82. package/modules/yahoosspBidAdapter.md +795 -0
  83. package/modules/yieldlabBidAdapter.js +48 -3
  84. package/modules/yieldlabBidAdapter.md +16 -1
  85. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  86. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  87. package/package.json +1 -1
  88. package/src/adapterManager.js +5 -0
  89. package/src/adapters/bidderFactory.js +4 -3
  90. package/src/auction.js +11 -11
  91. package/src/constants.json +1 -0
  92. package/src/secureCreatives.js +6 -7
  93. package/src/targeting.js +11 -9
  94. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  95. package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
  96. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  97. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  98. package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
  99. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  100. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  101. package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
  102. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  103. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  104. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  105. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  106. package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
  107. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  108. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  109. package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
  110. package/test/spec/modules/gumgumBidAdapter_spec.js +5 -1
  111. package/test/spec/modules/ixBidAdapter_spec.js +13 -3
  112. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  113. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  114. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  115. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
  116. package/test/spec/modules/multibid_spec.js +31 -31
  117. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  118. package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
  119. package/test/spec/modules/openxBidAdapter_spec.js +85 -13
  120. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  121. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  122. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  123. package/test/spec/modules/publinkIdSystem_spec.js +6 -6
  124. package/test/spec/modules/pubmaticBidAdapter_spec.js +39 -1
  125. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  126. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  127. package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
  128. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  129. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  130. package/test/spec/modules/trustxBidAdapter_spec.js +3 -3
  131. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  132. package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
  133. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  134. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  135. package/test/spec/modules/visxBidAdapter_spec.js +48 -4
  136. package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
  137. package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
  138. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  139. package/test/spec/unit/core/adapterManager_spec.js +32 -0
  140. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  141. package/test/spec/unit/pbjs_api_spec.js +37 -2
  142. package/test/spec/unit/secureCreatives_spec.js +54 -25
  143. package/wdio.conf.js +1 -1
  144. package/modules/turktelekomBidAdapter.md +0 -49
  145. package/yarn.lock +0 -13122
@@ -1377,6 +1377,11 @@ describe('IndexexchangeAdapter', function () {
1377
1377
  expect(requestUrl).to.equal(IX_SECURE_ENDPOINT);
1378
1378
  });
1379
1379
 
1380
+ it('auction type should be set correctly', function () {
1381
+ const at = JSON.parse(query.r).at;
1382
+ expect(at).to.equal(1);
1383
+ })
1384
+
1380
1385
  it('query object (version, siteID and request) should be correct', function () {
1381
1386
  expect(query.v).to.equal(BANNER_ENDPOINT_VERSION);
1382
1387
  expect(query.s).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
@@ -1400,16 +1405,16 @@ describe('IndexexchangeAdapter', function () {
1400
1405
  }
1401
1406
  };
1402
1407
  const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1403
- const { dfp_ad_unit_code } = JSON.parse(requests[0].data.r).imp[0].banner.format[0].ext;
1408
+ const { ext: { dfp_ad_unit_code } } = JSON.parse(requests[0].data.r).imp[0];
1404
1409
  expect(dfp_ad_unit_code).to.equal(AD_UNIT_CODE);
1405
1410
  });
1406
1411
 
1407
1412
  it('should not send dfp_adunit_code in request if ortb2Imp.ext.data.adserver.adslot does not exists', function () {
1408
1413
  const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
1409
1414
  const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1410
- const { dfp_ad_unit_code } = JSON.parse(requests[0].data.r).imp[0].banner.format[0].ext;
1415
+ const { ext } = JSON.parse(requests[0].data.r).imp[0];
1411
1416
 
1412
- expect(dfp_ad_unit_code).to.not.exist;
1417
+ expect(ext).to.not.exist;
1413
1418
  });
1414
1419
 
1415
1420
  it('payload should have correct format and value', function () {
@@ -1929,6 +1934,11 @@ describe('IndexexchangeAdapter', function () {
1929
1934
  expect(query.nf).to.equal(1);
1930
1935
  });
1931
1936
 
1937
+ it('auction type should be set correctly', function () {
1938
+ const at = JSON.parse(query.r).at;
1939
+ expect(at).to.equal(1);
1940
+ })
1941
+
1932
1942
  it('impression should have correct format and value', function () {
1933
1943
  const impression = JSON.parse(query.r).imp[0];
1934
1944
  const sidValue = utils.parseGPTSingleSizeArray(DEFAULT_VIDEO_VALID_BID[0].params.size);
@@ -9,6 +9,7 @@ describe('jixie Adapter', function () {
9
9
  const device_ = 'desktop';
10
10
  const timeout_ = 1000;
11
11
  const currency_ = 'USD';
12
+ const keywords_ = '';
12
13
 
13
14
  /**
14
15
  * Basic
@@ -212,7 +213,7 @@ describe('jixie Adapter', function () {
212
213
  );
213
214
  let miscDimsStub = sinon.stub(jixieaux, 'getMiscDims');
214
215
  miscDimsStub
215
- .returns({ device: device_, pageurl: pageurl_, domain: domain_ });
216
+ .returns({ device: device_, pageurl: pageurl_, domain: domain_, mkeywords: keywords_ });
216
217
 
217
218
  // actual api call:
218
219
  const request = spec.buildRequests(bidRequests_, bidderRequest_);
@@ -229,6 +230,7 @@ describe('jixie Adapter', function () {
229
230
  expect(payload).to.have.property('device', device_);
230
231
  expect(payload).to.have.property('domain', domain_);
231
232
  expect(payload).to.have.property('pageurl', pageurl_);
233
+ expect(payload).to.have.property('mkeywords', keywords_);
232
234
  expect(payload).to.have.property('timeout', timeout_);
233
235
  expect(payload).to.have.property('currency', currency_);
234
236
  expect(payload).to.have.property('bids').that.deep.equals(refBids_);
@@ -243,15 +245,15 @@ describe('jixie Adapter', function () {
243
245
  /**
244
246
  * interpretResponse:
245
247
  */
246
- const JX_OTHER_OUTSTREAM_RENDERER_URL = 'https://scripts.jixie.io/dummyscript.js';
247
- const JX_OUTSTREAM_RENDERER_URL = 'https://scripts.jixie.io/jxhboutstream.js';
248
+ const JX_OTHER_OUTSTREAM_RENDERER_URL = 'https://scripts.jixie.media/dummyscript.js';
249
+ const JX_OUTSTREAM_RENDERER_URL = 'https://scripts.jixie.media/jxhbrenderer.1.1.min.js';
248
250
 
249
- const mockVastXml_ = `<?xml version="1.0" encoding="UTF-8"?><VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd" version="3.0"><Ad id="JXAD521"><InLine><AdSystem>JXADSERVER</AdSystem><AdTitle>Alway%20Live%20Prebid%20Creative</AdTitle><Description>Hybrid in-stream</Description><Error><![CDATA[https://demo.com?action=error&errorcode=[ERRORCODE]&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Error><Impression><![CDATA[https://demo.com?action=impression&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Impression><Creatives><Creative id="JXAD521" sequence="1"><Linear><Duration>00:00:10</Duration><TrackingEvents><Tracking event="start"><![CDATA[https://demo.com?action=start&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="firstQuartile"><![CDATA[https://demo.com?action=firstQuartile&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="midpoint"><![CDATA[https://demo.com?action=midpoint&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="thirdQuartile"><![CDATA[https://demo.com?action=thirdQuartile&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="complete"><![CDATA[https://demo.com?action=complete&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="mute"><![CDATA[https://demo.com?action=mute&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="unmute"><![CDATA[https://demo.com?action=unmute&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="rewind"><![CDATA[https://demo.com?action=rewind&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="pause"><![CDATA[https://demo.com?action=pause&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="resume"><![CDATA[https://demo.com?action=resume&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="fullscreen"><![CDATA[https://demo.com?action=fullscreen&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="creativeView"><![CDATA[https://demo.com?action=creativeView&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking></TrackingEvents><VideoClicks><ClickThrough><![CDATA[https://toko-iot.com/search/?q=Sonos&utm_source=ivs&utm_medium=video&utm_campaign=promo&utm_content=sonos_category]]></ClickThrough><ClickTracking id="521"><![CDATA[https://demo.com?action=click&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></ClickTracking></VideoClicks><MediaFiles><MediaFile apiFramework="VPAID" type="application/javascript"><![CDATA[https://creatives.b-cdn.net/js/jxvpaid_1_0.min.js]]></MediaFile></MediaFiles><AdParameters><![CDATA[{"embed":true,"videos":[{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_240.mp4","bitrate":186,"mimetype":"video/mp4"},{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_360.mp4","bitrate":229,"mimetype":"video/mp4"},{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_480.mp4","bitrate":279,"mimetype":"video/mp4"},{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_720.mp4","bitrate":325,"mimetype":"video/mp4"}],"countpos":"left","hotspots":[{"type":"direct_url","start":0,"duration":10,"position":"top-right","direct_url":"https://toko-iot.com/catalogue/category/audio_8/?utm_source=ivs&utm_medium=banner&utm_campaign=promo&utm_content=audio_category","thumbnail_url":"https://creatives.ivideosmart.com/hotspots/TokoIOT_1.gif","thumbnail_style":"full-height"}],"clickthru":"https://toko-iot.com/search/?q=Sonos&utm_source=ivs&utm_medium=video&utm_campaign=promo&utm_content=sonos_category","reporting":{},"skipoffset":5}]]></AdParameters><Icons><Icon program="AdChoices" width="20" height="20" xPosition="right" yPosition="top" offset="00:00:02"><StaticResource creativeType="image/png"><![CDATA[https://creatives.jixie.io/jxadchoice.png]]></StaticResource><IconClicks><IconClickThrough><![CDATA[https://www.jixie.io/privacy-policy]]></IconClickThrough></IconClicks></Icon></Icons></Linear></Creative><Creative sequence="1"/></Creatives></InLine></Ad></VAST>`;
251
+ const mockVastXml_ = `<?xml version="1.0" encoding="UTF-8"?><VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd" version="3.0"><Ad id="JXAD521"><InLine><AdSystem>JXADSERVER</AdSystem><AdTitle>Alway%20Live%20Prebid%20Creative</AdTitle><Description>Hybrid in-stream</Description><Error><![CDATA[https://demo.com?action=error&errorcode=[ERRORCODE]&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Error><Impression><![CDATA[https://demo.com?action=impression&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Impression><Creatives><Creative id="JXAD521" sequence="1"><Linear><Duration>00:00:10</Duration><TrackingEvents><Tracking event="start"><![CDATA[https://demo.com?action=start&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="firstQuartile"><![CDATA[https://demo.com?action=firstQuartile&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="midpoint"><![CDATA[https://demo.com?action=midpoint&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="thirdQuartile"><![CDATA[https://demo.com?action=thirdQuartile&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="complete"><![CDATA[https://demo.com?action=complete&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="mute"><![CDATA[https://demo.com?action=mute&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="unmute"><![CDATA[https://demo.com?action=unmute&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="rewind"><![CDATA[https://demo.com?action=rewind&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="pause"><![CDATA[https://demo.com?action=pause&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="resume"><![CDATA[https://demo.com?action=resume&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="fullscreen"><![CDATA[https://demo.com?action=fullscreen&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking><Tracking event="creativeView"><![CDATA[https://demo.com?action=creativeView&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></Tracking></TrackingEvents><VideoClicks><ClickThrough><![CDATA[https://toko-iot.com/search/?q=Sonos&utm_source=ivs&utm_medium=video&utm_campaign=promo&utm_content=sonos_category]]></ClickThrough><ClickTracking id="521"><![CDATA[https://demo.com?action=click&mediaurl=[ASSETURI]&abc=1&stackidx=0]]></ClickTracking></VideoClicks><MediaFiles><MediaFile apiFramework="VPAID" type="application/javascript"><![CDATA[https://creatives.b-cdn.net/js/jxvpaid_1_0.min.js]]></MediaFile></MediaFiles><AdParameters><![CDATA[{"embed":true,"videos":[{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_240.mp4","bitrate":186,"mimetype":"video/mp4"},{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_360.mp4","bitrate":229,"mimetype":"video/mp4"},{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_480.mp4","bitrate":279,"mimetype":"video/mp4"},{"url":"https://creative-ivstream.ivideosmart.com/3001004/954006/3001004-954006_720.mp4","bitrate":325,"mimetype":"video/mp4"}],"countpos":"left","hotspots":[{"type":"direct_url","start":0,"duration":10,"position":"top-right","direct_url":"https://toko-iot.com/catalogue/category/audio_8/?utm_source=ivs&utm_medium=banner&utm_campaign=promo&utm_content=audio_category","thumbnail_url":"https://creatives.ivideosmart.com/hotspots/TokoIOT_1.gif","thumbnail_style":"full-height"}],"clickthru":"https://toko-iot.com/search/?q=Sonos&utm_source=ivs&utm_medium=video&utm_campaign=promo&utm_content=sonos_category","reporting":{},"skipoffset":5}]]></AdParameters><Icons><Icon program="AdChoices" width="20" height="20" xPosition="right" yPosition="top" offset="00:00:02"><StaticResource creativeType="image/png"><![CDATA[https://creatives.jixie.media/jxadchoice.png]]></StaticResource><IconClicks><IconClickThrough><![CDATA[https://www.jixie.io/privacy-policy]]></IconClickThrough></IconClicks></Icon></Icons></Linear></Creative><Creative sequence="1"/></Creatives></InLine></Ad></VAST>`;
250
252
  const responseBody_ = {
251
253
  'bids': [
252
254
  // video (vast tag url) returned here
253
255
  {
254
- 'trackingUrlBase': 'https://tr.jixie.io/sync/ad?',
256
+ 'trackingUrlBase': 'https://traid.jixie.io/sync/ad?',
255
257
  'jxBidId': '62847e4c696edcb-028d5dee-2c83-44e3-bed1-b75002475cdf',
256
258
  'requestId': '62847e4c696edcb',
257
259
  'cpm': 2.19,
@@ -284,7 +286,7 @@ describe('jixie Adapter', function () {
284
286
  // display ad returned here: This one there is advertiserDomains
285
287
  // in the response . Will be checked in the unit tests below
286
288
  {
287
- 'trackingUrlBase': 'https://tr.jixie.io/sync/ad?',
289
+ 'trackingUrlBase': 'https://traid.jixie.io/sync/ad?',
288
290
  'jxBidId': '600c9ae6fda1acb-028d5dee-2c83-44e3-bed1-b75002475cdf',
289
291
  'requestId': '600c9ae6fda1acb',
290
292
  'cpm': 1.999,
@@ -317,11 +319,11 @@ describe('jixie Adapter', function () {
317
319
  ],
318
320
  'mediaType': 'BANNER'
319
321
  },
320
- 'ad': '<div id="jxoutstream" style="width: 100%;"> <script type="text/javascript" src="https://scripts.jixie.io/jxfriendly.1.3.min.js" defer=""></script> <script> var p ={ responsive: 1, nested: 1, maxwidth: 640, container: "jxoutstream", creativeid: 520}; function jxdefer(p) { if (window.jxuniversal) { window.jxuniversal.init(p); } else { setTimeout(function() { jxdefer(p) }, 100); } } jxdefer(p); </script> </div>'
322
+ 'ad': '<div id="jxoutstream" style="width: 100%;"> <script type="text/javascript" src="https://scripts.jixie.media/jxfriendly.1.3.min.js" defer=""></script> <script> var p ={ responsive: 1, nested: 1, maxwidth: 640, container: "jxoutstream", creativeid: 520}; function jxdefer(p) { if (window.jxuniversal) { window.jxuniversal.init(p); } else { setTimeout(function() { jxdefer(p) }, 100); } } jxdefer(p); </script> </div>'
321
323
  },
322
324
  // outstream, jx non-default renderer specified:
323
325
  {
324
- 'trackingUrlBase': 'https://tr.jixie.io/sync/ad?',
326
+ 'trackingUrlBase': 'https://traid.jixie.io/sync/ad?',
325
327
  'jxBidId': '99bc539c81b00ce-028d5dee-2c83-44e3-bed1-b75002475cdf',
326
328
  'requestId': '99bc539c81b00ce',
327
329
  'cpm': 2.99,
@@ -340,7 +342,7 @@ describe('jixie Adapter', function () {
340
342
  },
341
343
  // outstream, jx default renderer:
342
344
  {
343
- 'trackingUrlBase': 'https://tr.jixie.io/sync/ad?',
345
+ 'trackingUrlBase': 'https://traid.jixie.io/sync/ad?',
344
346
  'jxBidId': '61bc539c81b00ce-028d5dee-2c83-44e3-bed1-b75002475cdf',
345
347
  'requestId': '61bc539c81b00ce',
346
348
  'cpm': 1.99,
@@ -475,7 +477,7 @@ describe('jixie Adapter', function () {
475
477
  ajaxStub = sinon.stub(jixieaux, 'ajax');
476
478
 
477
479
  miscDimsStub
478
- .returns({ device: device_, pageurl: pageurl_, domain: domain_ });
480
+ .returns({ device: device_, pageurl: pageurl_, domain: domain_, mkeywords: keywords_ });
479
481
  })
480
482
 
481
483
  afterEach(function() {
@@ -537,7 +539,7 @@ describe('jixie Adapter', function () {
537
539
  ajaxStub = sinon.stub(jixieaux, 'ajax');
538
540
  miscDimsStub = sinon.stub(jixieaux, 'getMiscDims');
539
541
  miscDimsStub
540
- .returns({ device: device_, pageurl: pageurl_, domain: domain_ });
542
+ .returns({ device: device_, pageurl: pageurl_, domain: domain_, mkeywords: keywords_ });
541
543
  })
542
544
 
543
545
  afterEach(function() {
@@ -97,7 +97,7 @@ describe('justpremium adapter', function () {
97
97
  expect(jpxRequest.id).to.equal(adUnits[0].params.zone)
98
98
  expect(jpxRequest.mediaTypes && jpxRequest.mediaTypes.banner && jpxRequest.mediaTypes.banner.sizes).to.not.equal('undefined')
99
99
  expect(jpxRequest.version.prebid).to.equal('$prebid.version$')
100
- expect(jpxRequest.version.jp_adapter).to.equal('1.8')
100
+ expect(jpxRequest.version.jp_adapter).to.equal('1.8.1')
101
101
  expect(jpxRequest.pubcid).to.equal('0000000')
102
102
  expect(jpxRequest.uids.tdid).to.equal('1111111')
103
103
  expect(jpxRequest.uids.id5id.uid).to.equal('2222222')
@@ -118,7 +118,10 @@ describe('justpremium adapter', function () {
118
118
  'price': 0.52,
119
119
  'format': 'lb',
120
120
  'adm': 'creative code',
121
- 'adomain': ['justpremium.com']
121
+ 'adomain': ['justpremium.com'],
122
+ 'ext': {
123
+ 'pg': true
124
+ }
122
125
  }]
123
126
  },
124
127
  'pass': {
@@ -142,6 +145,9 @@ describe('justpremium adapter', function () {
142
145
  meta: {
143
146
  advertiserDomains: ['justpremium.com']
144
147
  },
148
+ adserverTargeting: {
149
+ 'hb_deal_justpremium': 'jp_pg'
150
+ }
145
151
  }
146
152
  ]
147
153
 
@@ -159,6 +165,7 @@ describe('justpremium adapter', function () {
159
165
  expect(result[0].netRevenue).to.equal(true)
160
166
  expect(result[0].format).to.equal('lb')
161
167
  expect(result[0].meta.advertiserDomains[0]).to.equal('justpremium.com')
168
+ expect(result[0].adserverTargeting).to.deep.equal({'hb_deal_justpremium': 'jp_pg'})
162
169
  })
163
170
 
164
171
  it('Verify wrong server response', function () {
@@ -299,6 +299,160 @@ describe('limelightDigitalAdapter', function () {
299
299
  expect(spec.interpretResponse(bidResponses)).to.deep.equal([ resObject ]);
300
300
  });
301
301
  });
302
+ describe('getUserSyncs', function () {
303
+ const serverResponses = [
304
+ {
305
+ body: [
306
+ {
307
+ ext: {
308
+ sync: {
309
+ iframe: 'iframeUrl',
310
+ }
311
+ }
312
+ },
313
+ {
314
+ ext: {
315
+ sync: {
316
+ pixel: 'pixelUrl'
317
+ }
318
+ }
319
+ },
320
+ {},
321
+ {
322
+ ext: {}
323
+ },
324
+ {
325
+ ext: {
326
+ sync: {}
327
+ }
328
+ },
329
+ {
330
+ ext: {
331
+ sync: {
332
+ iframe: 'iframeUrl2',
333
+ pixel: 'pixelUrl3'
334
+ }
335
+ }
336
+ }
337
+ ]
338
+ },
339
+ {
340
+ body: [
341
+ {
342
+ ext: {
343
+ sync: {
344
+ iframe: 'iframeUrl2',
345
+ pixel: 'pixelUrl2'
346
+ }
347
+ }
348
+ },
349
+ {
350
+ ext: {
351
+ sync: {
352
+ iframe: 'iframeUrl3',
353
+ pixel: 'pixelUrl3'
354
+ }
355
+ }
356
+ }
357
+ ]
358
+ }
359
+ ];
360
+ it('should return empty array if server responses do not contain sync urls', function () {
361
+ const syncOptions = {
362
+ iframeEnabled: true,
363
+ pixelEnabled: true
364
+ };
365
+ const serverResponsesWithoutSyncUrls = serverResponses.map(serverResponse => {
366
+ const serverResponseWithoutSyncUrls = Object.assign({}, serverResponse);
367
+ serverResponseWithoutSyncUrls.body = serverResponse.body.map(serverResponseBody => {
368
+ const serverResponseBodyWithoutSyncUrls = Object.assign({}, serverResponseBody);
369
+ delete serverResponseBodyWithoutSyncUrls.ext;
370
+ return serverResponseBodyWithoutSyncUrls;
371
+ });
372
+ return serverResponseWithoutSyncUrls;
373
+ });
374
+ expect(spec.getUserSyncs(syncOptions, serverResponsesWithoutSyncUrls)).to.be.an('array').that.is.empty;
375
+ });
376
+ it('should return empty array if all sync types are disabled', function () {
377
+ const syncOptions = {
378
+ iframeEnabled: false,
379
+ pixelEnabled: false
380
+ };
381
+ expect(spec.getUserSyncs(syncOptions, serverResponses)).to.be.an('array').that.is.empty;
382
+ });
383
+ it('should return iframe sync urls if iframe sync is enabled', function () {
384
+ const syncOptions = {
385
+ iframeEnabled: true,
386
+ pixelEnabled: false
387
+ };
388
+ expect(spec.getUserSyncs(syncOptions, serverResponses)).to.deep.equal([
389
+ {
390
+ type: 'iframe',
391
+ url: 'iframeUrl'
392
+ },
393
+ {
394
+ type: 'iframe',
395
+ url: 'iframeUrl2'
396
+ },
397
+ {
398
+ type: 'iframe',
399
+ url: 'iframeUrl3'
400
+ }
401
+ ]);
402
+ });
403
+ it('should return image sync urls if pixel sync is enabled', function () {
404
+ const syncOptions = {
405
+ iframeEnabled: false,
406
+ pixelEnabled: true
407
+ };
408
+ expect(spec.getUserSyncs(syncOptions, serverResponses)).to.deep.equal([
409
+ {
410
+ type: 'image',
411
+ url: 'pixelUrl'
412
+ },
413
+ {
414
+ type: 'image',
415
+ url: 'pixelUrl3'
416
+ },
417
+ {
418
+ type: 'image',
419
+ url: 'pixelUrl2'
420
+ }
421
+ ]);
422
+ });
423
+ it('should return all sync urls if all sync types are enabled', function () {
424
+ const syncOptions = {
425
+ iframeEnabled: true,
426
+ pixelEnabled: true
427
+ }
428
+ expect(spec.getUserSyncs(syncOptions, serverResponses)).to.deep.equal([
429
+ {
430
+ type: 'iframe',
431
+ url: 'iframeUrl'
432
+ },
433
+ {
434
+ type: 'iframe',
435
+ url: 'iframeUrl2'
436
+ },
437
+ {
438
+ type: 'iframe',
439
+ url: 'iframeUrl3'
440
+ },
441
+ {
442
+ type: 'image',
443
+ url: 'pixelUrl'
444
+ },
445
+ {
446
+ type: 'image',
447
+ url: 'pixelUrl3'
448
+ },
449
+ {
450
+ type: 'image',
451
+ url: 'pixelUrl2'
452
+ }
453
+ ]);
454
+ });
455
+ });
302
456
  });
303
457
 
304
458
  function validateAdUnit(adUnit, bid) {
@@ -323,5 +477,5 @@ function validateAdUnit(adUnit, bid) {
323
477
  width: size[0],
324
478
  height: size[1]
325
479
  }
326
- }))
480
+ }));
327
481
  }
@@ -2,6 +2,7 @@ import livewrappedAnalyticsAdapter, { BID_WON_TIMEOUT } from 'modules/livewrappe
2
2
  import CONSTANTS from 'src/constants.json';
3
3
  import { config } from 'src/config.js';
4
4
  import { server } from 'test/mocks/xhr.js';
5
+ import { setConfig } from 'modules/currency.js';
5
6
 
6
7
  let events = require('src/events');
7
8
  let utils = require('src/utils');
@@ -16,7 +17,8 @@ const {
16
17
  BIDDER_DONE,
17
18
  BID_WON,
18
19
  BID_TIMEOUT,
19
- SET_TARGETING
20
+ SET_TARGETING,
21
+ AD_RENDER_FAILED
20
22
  },
21
23
  STATUS: {
22
24
  GOOD
@@ -27,6 +29,9 @@ const BID1 = {
27
29
  width: 980,
28
30
  height: 240,
29
31
  cpm: 1.1,
32
+ originalCpm: 12.0,
33
+ currency: 'USD',
34
+ originalCurrency: 'FOO',
30
35
  timeToRespond: 200,
31
36
  bidId: '2ecff0db240757',
32
37
  requestId: '2ecff0db240757',
@@ -42,6 +47,9 @@ const BID2 = Object.assign({}, BID1, {
42
47
  width: 300,
43
48
  height: 250,
44
49
  cpm: 2.2,
50
+ originalCpm: 23.0,
51
+ currency: 'USD',
52
+ originalCurrency: 'FOO',
45
53
  timeToRespond: 300,
46
54
  bidId: '3ecff0db240757',
47
55
  requestId: '3ecff0db240757',
@@ -115,6 +123,14 @@ const MOCK = {
115
123
  'bidId': '2ecff0db240757',
116
124
  'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa'
117
125
  }
126
+ ],
127
+ AD_RENDER_FAILED: [
128
+ {
129
+ 'bidId': '2ecff0db240757',
130
+ 'reason': CONSTANTS.AD_RENDER_FAILED_REASON.CANNOT_FIND_AD,
131
+ 'message': 'message',
132
+ 'bid': BID1
133
+ }
118
134
  ]
119
135
  };
120
136
 
@@ -169,6 +185,7 @@ const ANALYTICS_MESSAGE = {
169
185
  width: 980,
170
186
  height: 240,
171
187
  cpm: 1.1,
188
+ orgCpm: 120,
172
189
  ttr: 200,
173
190
  IsBid: true,
174
191
  mediaType: 1,
@@ -183,6 +200,7 @@ const ANALYTICS_MESSAGE = {
183
200
  width: 300,
184
201
  height: 250,
185
202
  cpm: 2.2,
203
+ orgCpm: 230,
186
204
  ttr: 300,
187
205
  IsBid: true,
188
206
  mediaType: 1,
@@ -210,6 +228,7 @@ const ANALYTICS_MESSAGE = {
210
228
  width: 980,
211
229
  height: 240,
212
230
  cpm: 1.1,
231
+ orgCpm: 120,
213
232
  mediaType: 1,
214
233
  gdpr: 0,
215
234
  auctionId: 0
@@ -222,10 +241,22 @@ const ANALYTICS_MESSAGE = {
222
241
  width: 300,
223
242
  height: 250,
224
243
  cpm: 2.2,
244
+ orgCpm: 230,
225
245
  mediaType: 1,
226
246
  gdpr: 0,
227
247
  auctionId: 0
228
248
  }
249
+ ],
250
+ rf: [
251
+ {
252
+ timeStamp: 1519149562216,
253
+ adUnit: 'panorama_d_1',
254
+ adUnitId: 'adunitid',
255
+ bidder: 'livewrapped',
256
+ auctionId: 0,
257
+ rsn: CONSTANTS.AD_RENDER_FAILED_REASON.CANNOT_FIND_AD,
258
+ msg: 'message'
259
+ },
229
260
  ]
230
261
  };
231
262
 
@@ -239,6 +270,7 @@ function performStandardAuction() {
239
270
  events.emit(SET_TARGETING, MOCK.SET_TARGETING);
240
271
  events.emit(BID_WON, MOCK.BID_WON[0]);
241
272
  events.emit(BID_WON, MOCK.BID_WON[1]);
273
+ events.emit(AD_RENDER_FAILED, MOCK.AD_RENDER_FAILED[0]);
242
274
  }
243
275
 
244
276
  describe('Livewrapped analytics adapter', function () {
@@ -258,6 +290,14 @@ describe('Livewrapped analytics adapter', function () {
258
290
  sandbox.stub(document, 'getElementById').returns(element);
259
291
 
260
292
  clock = sandbox.useFakeTimers(1519767013781);
293
+ setConfig({
294
+ adServerCurrency: 'USD',
295
+ rates: {
296
+ USD: {
297
+ FOO: 0.1
298
+ }
299
+ }
300
+ });
261
301
  });
262
302
 
263
303
  afterEach(function () {
@@ -300,7 +340,7 @@ describe('Livewrapped analytics adapter', function () {
300
340
  expect(message).to.deep.equal(ANALYTICS_MESSAGE);
301
341
  });
302
342
 
303
- it('should send batched message without BID_WON if necessary and further BID_WON events individually', function () {
343
+ it('should send batched message without BID_WON AND AD_RENDER_FAILED if necessary and further BID_WON and AD_RENDER_FAILED events individually', function () {
304
344
  events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
305
345
  events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
306
346
  events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
@@ -313,8 +353,9 @@ describe('Livewrapped analytics adapter', function () {
313
353
  clock.tick(BID_WON_TIMEOUT + 1000);
314
354
 
315
355
  events.emit(BID_WON, MOCK.BID_WON[1]);
356
+ events.emit(AD_RENDER_FAILED, MOCK.AD_RENDER_FAILED[0]);
316
357
 
317
- expect(server.requests.length).to.equal(2);
358
+ expect(server.requests.length).to.equal(3);
318
359
 
319
360
  let message = JSON.parse(server.requests[0].requestBody);
320
361
  expect(message.wins.length).to.equal(1);
@@ -324,6 +365,10 @@ describe('Livewrapped analytics adapter', function () {
324
365
  message = JSON.parse(server.requests[1].requestBody);
325
366
  expect(message.wins.length).to.equal(1);
326
367
  expect(message.wins[0]).to.deep.equal(ANALYTICS_MESSAGE.wins[1]);
368
+
369
+ message = JSON.parse(server.requests[2].requestBody);
370
+ expect(message.rf.length).to.equal(1);
371
+ expect(message.rf[0]).to.deep.equal(ANALYTICS_MESSAGE.rf[0]);
327
372
  });
328
373
 
329
374
  it('should properly mark bids as timed out', function () {
@@ -416,18 +461,28 @@ describe('Livewrapped analytics adapter', function () {
416
461
  {
417
462
  'bidder': 'livewrapped',
418
463
  'adUnitCode': 'panorama_d_1',
419
- 'bidId': '2ecff0db240757',
420
- 'floorData': {
421
- 'floorValue': 1.1,
422
- 'floorCurrency': 'SEK'
423
- }
464
+ 'bidId': '2ecff0db240757'
424
465
  }
425
466
  ],
426
467
  'start': 1519149562216
427
468
  });
428
469
 
429
- events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
430
- events.emit(BID_WON, MOCK.BID_WON[0]);
470
+ events.emit(BID_RESPONSE, Object.assign({},
471
+ MOCK.BID_RESPONSE[0],
472
+ {
473
+ 'floorData': {
474
+ 'floorValue': 1.1,
475
+ 'floorCurrency': 'FOO'
476
+ }
477
+ }));
478
+ events.emit(BID_WON, Object.assign({},
479
+ MOCK.BID_WON[0],
480
+ {
481
+ 'floorData': {
482
+ 'floorValue': 1.1,
483
+ 'floorCurrency': 'FOO'
484
+ }
485
+ }));
431
486
  events.emit(AUCTION_END, MOCK.AUCTION_END);
432
487
 
433
488
  clock.tick(BID_WON_TIMEOUT + 1000);
@@ -440,11 +495,11 @@ describe('Livewrapped analytics adapter', function () {
440
495
 
441
496
  expect(message.responses.length).to.equal(1);
442
497
  expect(message.responses[0].floor).to.equal(1.1);
443
- expect(message.responses[0].floorCur).to.equal('SEK');
498
+ expect(message.responses[0].floorCur).to.equal('FOO');
444
499
 
445
500
  expect(message.wins.length).to.equal(1);
446
501
  expect(message.wins[0].floor).to.equal(1.1);
447
- expect(message.wins[0].floorCur).to.equal('SEK');
502
+ expect(message.wins[0].floorCur).to.equal('FOO');
448
503
  });
449
504
 
450
505
  it('should forward Livewrapped floor data', function () {