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
package/.babelrc.js CHANGED
@@ -14,16 +14,7 @@ module.exports = {
14
14
  [
15
15
  useLocal('@babel/preset-env'),
16
16
  {
17
- "targets": {
18
- "browsers": [
19
- "chrome >= 75",
20
- "safari >=10",
21
- "edge >= 70",
22
- "ff >= 70",
23
- "ie >= 11",
24
- "ios >= 11"
25
- ]
26
- }
17
+ "useBuiltIns": "entry"
27
18
  }
28
19
  ]
29
20
  ],
package/README.md CHANGED
@@ -59,6 +59,8 @@ module.exports = {
59
59
  loader: 'babel-loader',
60
60
  // presets and plugins for Prebid.js must be manually specified separate from your other babel rule.
61
61
  // this can be accomplished by requiring prebid's .babelrc.js file (requires Babel 7 and Node v8.9.0+)
62
+ // as of Prebid 6, babelrc.js only targets modern browsers. One can change the targets and build for
63
+ // older browsers if they prefer, but integration tests on ie11 were removed in Prebid.js 6.0
62
64
  options: require('prebid.js/.babelrc.js')
63
65
  }
64
66
  }
@@ -272,7 +274,7 @@ As you make code changes, the bundles will be rebuilt and the page reloaded auto
272
274
 
273
275
  ## Contribute
274
276
 
275
- Many SSPs, bidders, and publishers have contributed to this project. [Hundreds of bidders](https://github.com/prebid/Prebid.js/tree/master/src/adapters) are supported by Prebid.js.
277
+ Many SSPs, bidders, and publishers have contributed to this project. [Hundreds of bidders](https://github.com/prebid/Prebid.js/tree/master/modules) are supported by Prebid.js.
276
278
 
277
279
  For guidelines, see [Contributing](./CONTRIBUTING.md).
278
280
 
@@ -314,7 +316,7 @@ For instructions on writing tests for Prebid.js, see [Testing Prebid.js](http://
314
316
 
315
317
  ### Supported Browsers
316
318
 
317
- Prebid.js is supported on IE11 and modern browsers.
319
+ Prebid.js is supported on IE11 and modern browsers until 5.x. 6.x+ transpiles to target >0.25%; not Opera Mini; not IE11.
318
320
 
319
321
  ### Governance
320
322
  Review our governance model [here](https://github.com/prebid/Prebid.js/tree/master/governance.md).
package/browsers.json CHANGED
@@ -1,73 +1,49 @@
1
1
  {
2
- "bs_edge_17_windows_10": {
2
+ "bs_edge_latest_windows_10": {
3
3
  "base": "BrowserStack",
4
4
  "os_version": "10",
5
5
  "browser": "edge",
6
- "browser_version": "17.0",
6
+ "browser_version": "latest",
7
7
  "device": null,
8
8
  "os": "Windows"
9
9
  },
10
- "bs_edge_90_windows_10": {
11
- "base": "BrowserStack",
12
- "os_version": "10",
13
- "browser": "edge",
14
- "browser_version": "90.0",
15
- "device": null,
16
- "os": "Windows"
17
- },
18
- "bs_ie_11_windows_10": {
19
- "base": "BrowserStack",
20
- "os_version": "10",
21
- "browser": "ie",
22
- "browser_version": "11.0",
23
- "device": null,
24
- "os": "Windows"
25
- },
26
- "bs_chrome_90_windows_10": {
10
+ "bs_chrome_latest_windows_10": {
27
11
  "base": "BrowserStack",
28
12
  "os_version": "10",
29
13
  "browser": "chrome",
30
- "browser_version": "90.0",
14
+ "browser_version": "latest",
31
15
  "device": null,
32
16
  "os": "Windows"
33
17
  },
34
- "bs_chrome_79_windows_10": {
18
+ "bs_chrome_87_windows_10": {
35
19
  "base": "BrowserStack",
36
20
  "os_version": "10",
37
21
  "browser": "chrome",
38
- "browser_version": "79.0",
39
- "device": null,
40
- "os": "Windows"
41
- },
42
- "bs_firefox_88_windows_10": {
43
- "base": "BrowserStack",
44
- "os_version": "10",
45
- "browser": "firefox",
46
- "browser_version": "88.0",
22
+ "browser_version": "87.0",
47
23
  "device": null,
48
24
  "os": "Windows"
49
25
  },
50
- "bs_firefox_72_windows_10": {
26
+ "bs_firefox_latest_windows_10": {
51
27
  "base": "BrowserStack",
52
28
  "os_version": "10",
53
29
  "browser": "firefox",
54
- "browser_version": "72.0",
30
+ "browser_version": "latest",
55
31
  "device": null,
56
32
  "os": "Windows"
57
33
  },
58
- "bs_safari_14_mac_bigsur": {
34
+ "bs_safari_latest_mac_bigsur": {
59
35
  "base": "BrowserStack",
60
36
  "os_version": "Big Sur",
61
37
  "browser": "safari",
62
- "browser_version": "14.0",
38
+ "browser_version": "latest",
63
39
  "device": null,
64
40
  "os": "OS X"
65
41
  },
66
- "bs_safari_12_mac_mojave": {
42
+ "bs_safari_15_catalina": {
67
43
  "base": "BrowserStack",
68
- "os_version": "Mojave",
44
+ "os_version": "Catalina",
69
45
  "browser": "safari",
70
- "browser_version": "12.0",
46
+ "browser_version": "13.1",
71
47
  "device": null,
72
48
  "os": "OS X"
73
49
  }
package/gulpfile.js CHANGED
@@ -76,6 +76,7 @@ function lint(done) {
76
76
  'modules/**/*.js',
77
77
  'test/**/*.js',
78
78
  'plugins/**/*.js',
79
+ '!plugins/**/node_modules/**',
79
80
  './*.js'
80
81
  ], { base: './' })
81
82
  .pipe(gulpif(argv.nolintfix, eslint(), eslint({ fix: true })))
@@ -166,7 +166,7 @@ module.exports = function(codeCoverage, browserstack, watchMode, file) {
166
166
  browserNoActivityTimeout: 3e5, // default 10000
167
167
  captureTimeout: 3e5, // default 60000,
168
168
  browserDisconnectTolerance: 3,
169
- concurrency: 5,
169
+ concurrency: 6,
170
170
 
171
171
  plugins: plugins
172
172
  }
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
5
+ import { config } from '../src/config.js';
5
6
 
6
7
  const BIDDER_CODE = 'adhese';
7
8
  const GVLID = 553;
@@ -20,11 +21,15 @@ export const spec = {
20
21
  if (validBidRequests.length === 0) {
21
22
  return null;
22
23
  }
24
+
23
25
  const { gdprConsent, refererInfo } = bidderRequest;
24
26
 
27
+ const adheseConfig = config.getConfig('adhese');
25
28
  const gdprParams = (gdprConsent && gdprConsent.consentString) ? { xt: [gdprConsent.consentString] } : {};
26
29
  const refererParams = (refererInfo && refererInfo.referer) ? { xf: [base64urlEncode(refererInfo.referer)] } : {};
27
- const commonParams = { ...gdprParams, ...refererParams };
30
+ const globalCustomParams = (adheseConfig && adheseConfig.globalTargets) ? cleanTargets(adheseConfig.globalTargets) : {};
31
+ const commonParams = { ...globalCustomParams, ...gdprParams, ...refererParams };
32
+ const vastContentAsUrl = !(adheseConfig && adheseConfig.vastContentAsUrl == false);
28
33
 
29
34
  const slots = validBidRequests.map(bid => ({
30
35
  slotname: bidToSlotName(bid),
@@ -34,7 +39,7 @@ export const spec = {
34
39
  const payload = {
35
40
  slots: slots,
36
41
  parameters: commonParams,
37
- vastContentAsUrl: true,
42
+ vastContentAsUrl: vastContentAsUrl,
38
43
  user: {
39
44
  ext: {
40
45
  eids: getEids(validBidRequests),
@@ -75,6 +75,7 @@ export const spec = {
75
75
  {code: 'denakop'},
76
76
  {code: 'rtbanalytica'},
77
77
  {code: 'unibots'},
78
+ {code: 'catapultx'},
78
79
  {code: 'ergadx'},
79
80
  {code: 'turktelekom'}
80
81
  ],
@@ -0,0 +1,61 @@
1
+ # Overview
2
+
3
+ Module Name: Adlivetech Bidder Adapter
4
+ Module Type: Bidder Adapter
5
+ Maintainer: grid-tech@themediagrid.com
6
+
7
+ # Description
8
+
9
+ Module that connects to Grid demand source to fetch bids.
10
+ The adapter is GDPR compliant and supports banner and video (instream and outstream).
11
+
12
+ # Test Parameters
13
+ ```
14
+ var adUnits = [
15
+ {
16
+ code: 'test-div',
17
+ sizes: [[300, 250]],
18
+ bids: [
19
+ {
20
+ bidder: "adlivetech",
21
+ params: {
22
+ uid: '1',
23
+ bidFloor: 0.5
24
+ }
25
+ }
26
+ ]
27
+ },{
28
+ code: 'test-div',
29
+ sizes: [[728, 90]],
30
+ bids: [
31
+ {
32
+ bidder: "adlivetech",
33
+ params: {
34
+ uid: 2,
35
+ keywords: {
36
+ brandsafety: ['disaster'],
37
+ topic: ['stress', 'fear']
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ code: 'test-div',
45
+ sizes: [[728, 90]],
46
+ mediaTypes: { video: {
47
+ context: 'instream',
48
+ playerSize: [728, 90],
49
+ mimes: ['video/mp4']
50
+ },
51
+ bids: [
52
+ {
53
+ bidder: "adlivetech",
54
+ params: {
55
+ uid: 11
56
+ }
57
+ }
58
+ ]
59
+ }
60
+ ];
61
+ ```
@@ -1,6 +1,7 @@
1
1
  import { logError } from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {config} from '../src/config.js';
4
+ import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
4
5
 
5
6
  const BIDDER_CODE = 'admixer';
6
7
  const ALIASES = ['go2net', 'adblender', 'adsyield'];
@@ -8,7 +9,7 @@ const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
8
9
  export const spec = {
9
10
  code: BIDDER_CODE,
10
11
  aliases: ALIASES,
11
- supportedMediaTypes: ['banner', 'video'],
12
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
12
13
  /**
13
14
  * Determines whether or not the given bid request is valid.
14
15
  */
@@ -37,7 +37,8 @@ const handleMeta = function () {
37
37
  }
38
38
 
39
39
  const getUsi = function (meta, ortb2, bidderRequest) {
40
- const usi = (meta !== null) ? meta.usi : false;
40
+ let usi = (meta !== null && meta.usi) ? meta.usi : false;
41
+ if (ortb2 && ortb2.user && ortb2.user.id) { usi = ortb2.user.id }
41
42
  return usi
42
43
  }
43
44
 
@@ -12,6 +12,7 @@ const bidRequested = CONSTANTS.EVENTS.BID_REQUESTED;
12
12
  const bidResponse = CONSTANTS.EVENTS.BID_RESPONSE;
13
13
  const bidWon = CONSTANTS.EVENTS.BID_WON;
14
14
  const bidTimeout = CONSTANTS.EVENTS.BID_TIMEOUT;
15
+ const ua = navigator.userAgent;
15
16
 
16
17
  let adomikAdapter = Object.assign(adapter({}),
17
18
  {
@@ -47,7 +48,7 @@ let adomikAdapter = Object.assign(adapter({}),
47
48
  type: 'request',
48
49
  event: {
49
50
  bidder: bid.bidder.toUpperCase(),
50
- placementCode: bid.placementCode
51
+ placementCode: bid.adUnitCode
51
52
  }
52
53
  });
53
54
  });
@@ -67,6 +68,10 @@ adomikAdapter.initializeBucketEvents = function() {
67
68
  adomikAdapter.bucketEvents = [];
68
69
  }
69
70
 
71
+ adomikAdapter.maxPartLength = function () {
72
+ return (ua.includes(' MSIE ')) ? 1600 : 60000;
73
+ };
74
+
70
75
  adomikAdapter.sendTypedEvent = function() {
71
76
  const groupedTypedEvents = adomikAdapter.buildTypedEvents();
72
77
 
@@ -108,9 +113,10 @@ adomikAdapter.sendTypedEvent = function() {
108
113
  // Encode object in base64
109
114
  const encodedBuf = window.btoa(stringBulkEvents);
110
115
 
111
- // Create final url and split it in 1600 characters max (+endpoint length)
116
+ // Create final url and split it (+endpoint length)
112
117
  const encodedUri = encodeURIComponent(encodedBuf);
113
- const splittedUrl = encodedUri.match(/.{1,1600}/g);
118
+ const maxLength = adomikAdapter.maxPartLength();
119
+ const splittedUrl = encodedUri.match(new RegExp(`.{1,${maxLength}}`, 'g'));
114
120
 
115
121
  splittedUrl.forEach((split, i) => {
116
122
  const partUrl = `${split}&id=${adomikAdapter.currentContext.id}&part=${i}&on=${splittedUrl.length - 1}`;
@@ -121,7 +127,7 @@ adomikAdapter.sendTypedEvent = function() {
121
127
 
122
128
  adomikAdapter.sendWonEvent = function (wonEvent) {
123
129
  const stringWonEvent = JSON.stringify(wonEvent)
124
- logInfo('Won event sent to adomik prebid analytic ' + wonEvent);
130
+ logInfo('Won event sent to adomik prebid analytic ' + stringWonEvent);
125
131
 
126
132
  // Encode object in base64
127
133
  const encodedBuf = window.btoa(stringWonEvent);
@@ -0,0 +1,203 @@
1
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
2
+ import * as utils from '../src/utils.js';
3
+ import { BANNER } from '../src/mediaTypes.js';
4
+ import { getStorageManager } from '../src/storageManager.js';
5
+
6
+ // #region Constants
7
+ export const BIDDER_CODE = 'adplus';
8
+ export const ADPLUS_ENDPOINT = 'https://ssp.ad-plus.com.tr/server/headerBidding';
9
+ export const DGID_CODE = 'adplus_dg_id';
10
+ export const SESSION_CODE = 'adplus_s_id';
11
+ export const storage = getStorageManager(undefined, BIDDER_CODE);
12
+ const COOKIE_EXP = 1000 * 60 * 60 * 24; // 1 day
13
+ // #endregion
14
+
15
+ // #region Helpers
16
+ export function isValidUuid (uuid) {
17
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
18
+ uuid
19
+ );
20
+ }
21
+
22
+ function getSessionId() {
23
+ let sid = storage.cookiesAreEnabled() && storage.getCookie(SESSION_CODE);
24
+
25
+ if (
26
+ !sid || !isValidUuid(sid)
27
+ ) {
28
+ sid = utils.generateUUID();
29
+ setSessionId(sid);
30
+ }
31
+
32
+ return sid;
33
+ }
34
+
35
+ function setSessionId(sid) {
36
+ if (storage.cookiesAreEnabled()) {
37
+ const expires = new Date(Date.now() + COOKIE_EXP).toISOString();
38
+
39
+ storage.setCookie(SESSION_CODE, sid, expires);
40
+ }
41
+ }
42
+ // #endregion
43
+
44
+ // #region Bid request validation
45
+ function isBidRequestValid(bid) {
46
+ if (!bid) {
47
+ utils.logError(BIDDER_CODE, 'bid, can not be empty', bid);
48
+ return false;
49
+ }
50
+
51
+ if (!bid.params) {
52
+ utils.logError(BIDDER_CODE, 'bid.params is required.');
53
+ return false;
54
+ }
55
+
56
+ if (!bid.params.adUnitId || typeof bid.params.adUnitId !== 'string') {
57
+ utils.logError(
58
+ BIDDER_CODE,
59
+ 'bid.params.adUnitId is missing or has wrong type.'
60
+ );
61
+ return false;
62
+ }
63
+
64
+ if (!bid.params.inventoryId || typeof bid.params.inventoryId !== 'string') {
65
+ utils.logError(
66
+ BIDDER_CODE,
67
+ 'bid.params.inventoryId is missing or has wrong type.'
68
+ );
69
+ return false;
70
+ }
71
+
72
+ if (
73
+ !bid.mediaTypes ||
74
+ !bid.mediaTypes[BANNER] ||
75
+ !utils.isArray(bid.mediaTypes[BANNER].sizes) ||
76
+ bid.mediaTypes[BANNER].sizes.length <= 0 ||
77
+ !utils.isArrayOfNums(bid.mediaTypes[BANNER].sizes[0])
78
+ ) {
79
+ utils.logError(BIDDER_CODE, 'Wrong or missing size parameters.');
80
+ return false;
81
+ }
82
+
83
+ return true;
84
+ }
85
+ // #endregion
86
+
87
+ // #region Building the bid requests
88
+ /**
89
+ *
90
+ * @param {object} bid
91
+ * @returns
92
+ */
93
+ function createBidRequest(bid) {
94
+ // Developer Params
95
+ const {
96
+ inventoryId,
97
+ adUnitId,
98
+ extraData,
99
+ yearOfBirth,
100
+ gender,
101
+ categories,
102
+ latitude,
103
+ longitude,
104
+ sdkVersion,
105
+ } = bid.params;
106
+
107
+ return {
108
+ method: 'GET',
109
+ url: ADPLUS_ENDPOINT,
110
+ data: utils.cleanObj({
111
+ bidId: bid.bidId,
112
+ inventoryId,
113
+ adUnitId,
114
+ adUnitWidth: bid.mediaTypes[BANNER].sizes[0][0],
115
+ adUnitHeight: bid.mediaTypes[BANNER].sizes[0][1],
116
+ extraData,
117
+ yearOfBirth,
118
+ gender,
119
+ categories,
120
+ latitude,
121
+ longitude,
122
+ sdkVersion: sdkVersion || '1',
123
+ session: getSessionId(),
124
+ interstitial: 0,
125
+ token: typeof window.top === 'object' && window.top[DGID_CODE] ? window.top[DGID_CODE] : undefined,
126
+ secure: window.location.protocol === 'https:' ? 1 : 0,
127
+ screenWidth: screen.width,
128
+ screenHeight: screen.height,
129
+ language: window.navigator.language || 'en-US',
130
+ pageUrl: window.location.href,
131
+ domain: window.location.hostname,
132
+ referrer: window.location.referrer,
133
+ }),
134
+ };
135
+ }
136
+
137
+ function buildRequests(validBidRequests, bidderRequest) {
138
+ return validBidRequests.map((req) => createBidRequest(req));
139
+ }
140
+ // #endregion
141
+
142
+ // #region Interpreting Responses
143
+ /**
144
+ *
145
+ * @param {HeaderBiddingResponse} responseData
146
+ * @param { object } bidParams
147
+ * @returns
148
+ */
149
+ function createAdResponse(responseData, bidParams) {
150
+ return {
151
+ requestId: responseData.requestID,
152
+ cpm: responseData.cpm,
153
+ currency: responseData.currency,
154
+ width: responseData.width,
155
+ height: responseData.height,
156
+ creativeId: responseData.creativeID,
157
+ dealId: responseData.dealID,
158
+ netRevenue: responseData.netRevenue,
159
+ ttl: responseData.ttl,
160
+ ad: responseData.ad,
161
+ mediaType: responseData.mediaType,
162
+ meta: {
163
+ advertiserDomains: responseData.advertiserDomains,
164
+ primaryCatId: utils.isArray(responseData.categoryIDs) && responseData.categoryIDs.length > 0
165
+ ? responseData.categoryIDs[0] : undefined,
166
+ secondaryCatIds: responseData.categoryIDs,
167
+ },
168
+ };
169
+ }
170
+
171
+ function interpretResponse(response, request) {
172
+ // In case of empty response
173
+ if (
174
+ response.body == null ||
175
+ !utils.isArray(response.body) ||
176
+ response.body.length === 0
177
+ ) {
178
+ return [];
179
+ }
180
+ const bids = response.body.map((bid) => createAdResponse(bid));
181
+ return bids;
182
+ }
183
+ // #endregion
184
+
185
+ // #region Bidder
186
+ export const spec = {
187
+ code: BIDDER_CODE,
188
+ supportedMediaTypes: [BANNER],
189
+ isBidRequestValid,
190
+ buildRequests,
191
+ interpretResponse,
192
+ onTimeout(timeoutData) {
193
+ utils.logError('Adplus adapter timed out for the auction.', timeoutData);
194
+ },
195
+ onBidWon(bid) {
196
+ utils.logInfo(
197
+ `Adplus adapter won the auction. Bid id: ${bid.bidId}, Ad Unit Id: ${bid.adUnitId}, Inventory Id: ${bid.inventoryId}`
198
+ );
199
+ },
200
+ };
201
+
202
+ registerBidder(spec);
203
+ // #endregion
@@ -0,0 +1,39 @@
1
+ # Overview
2
+
3
+ Module Name: AdPlus Bidder Adapter
4
+
5
+ Module Type: Bidder Adapter
6
+
7
+ Maintainer: adplus.destek@yaani.com.tr
8
+
9
+ # Description
10
+
11
+ AdPlus Prebid.js Bidder Adapter. Only banner formats are supported.
12
+
13
+ About us : https://ssp.ad-plus.com.tr/
14
+
15
+ # Test Parameters
16
+
17
+ ```javascript
18
+ var adUnits = [
19
+ {
20
+ code: "div-adplus",
21
+ mediaTypes: {
22
+ banner: {
23
+ sizes: [
24
+ [300, 250],
25
+ ],
26
+ },
27
+ },
28
+ bids: [
29
+ {
30
+ bidder: "adplus",
31
+ params: {
32
+ inventoryId: "-1",
33
+ adUnitId: "-3",
34
+ },
35
+ },
36
+ ],
37
+ },
38
+ ];
39
+ ```
@@ -1,6 +1,7 @@
1
1
  import { deepAccess, buildUrl, parseSizesInput } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
  import { config } from '../src/config.js';
4
+ import { createEidsArray } from './userId/eids.js';
4
5
  import find from 'core-js-pure/features/array/find.js';
5
6
  import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
6
7
 
@@ -97,17 +98,21 @@ export const spec = {
97
98
  PageRefreshed: getPageRefreshed()
98
99
  };
99
100
 
100
- if (bidderRequest && bidderRequest.gdprConsent) {
101
+ if (bidderRequest.gdprConsent) {
101
102
  payload.gdprConsent = {
102
103
  consentString: bidderRequest.gdprConsent.consentString,
103
104
  consentRequired: (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') ? bidderRequest.gdprConsent.gdprApplies : null
104
105
  };
105
106
  }
106
107
 
107
- if (bidderRequest && bidderRequest.uspConsent) {
108
+ if (bidderRequest.uspConsent) {
108
109
  payload.uspConsent = bidderRequest.uspConsent;
109
110
  }
110
111
 
112
+ if (deepAccess(bidderRequest, 'userId')) {
113
+ payload.userId = createEidsArray(bidderRequest.userId);
114
+ }
115
+
111
116
  const data = JSON.stringify(payload);
112
117
  const options = {
113
118
  withCredentials: true
@@ -33,7 +33,7 @@ export function attachScriptTagToDOM(rtdConfig) {
33
33
  edktInitializor.load = function(e) {
34
34
  var p = e || 'sdk';
35
35
  var n = document.createElement('script');
36
- n.type = 'text/javascript';
36
+ n.type = 'module';
37
37
  n.async = true;
38
38
  n.src = 'https://cdn.edkt.io/' + p + '/edgekit.min.js';
39
39
  document.getElementsByTagName('head')[0].appendChild(n);
@@ -1,4 +1,4 @@
1
- import { convertCamelToUnderscore, isArray, isNumber, isPlainObject, logError, logInfo, deepAccess, logMessage, convertTypes, isStr, getParameterByName, deepClone, chunk, logWarn, getBidRequest, createTrackPixelHtml, isEmpty, transformBidderParamKeywords, getMaxValueFromArray, fill, getMinValueFromArray, isArrayOfNums, isFn } from '../src/utils.js';
1
+ import { convertCamelToUnderscore, isArray, isNumber, isPlainObject, logError, logInfo, deepAccess, logMessage, convertTypes, isStr, getParameterByName, deepClone, chunk, logWarn, getBidRequest, createTrackPixelHtml, isEmpty, transformBidderParamKeywords, getMaxValueFromArray, fill, getMinValueFromArray, isArrayOfNums, isFn, isAllowZeroCpmBidsEnabled } from '../src/utils.js';
2
2
  import { Renderer } from '../src/Renderer.js';
3
3
  import { config } from '../src/config.js';
4
4
  import { registerBidder, getIabSubCategory } from '../src/adapters/bidderFactory.js';
@@ -293,7 +293,8 @@ export const spec = {
293
293
  serverResponse.tags.forEach(serverBid => {
294
294
  const rtbBid = getRtbBid(serverBid);
295
295
  if (rtbBid) {
296
- if (rtbBid.cpm !== 0 && includes(this.supportedMediaTypes, rtbBid.ad_type)) {
296
+ const cpmCheck = (isAllowZeroCpmBidsEnabled(bidderRequest.bidderCode)) ? rtbBid.cpm >= 0 : rtbBid.cpm > 0;
297
+ if (cpmCheck && includes(this.supportedMediaTypes, rtbBid.ad_type)) {
297
298
  const bid = newBid(serverBid, rtbBid, bidderRequest);
298
299
  bid.mediaType = parseMediaType(rtbBid);
299
300
  bids.push(bid);
@@ -598,6 +599,26 @@ function newBid(serverBid, rtbBid, bidderRequest) {
598
599
  bid.meta = Object.assign({}, bid.meta, { advertiserId: rtbBid.advertiser_id });
599
600
  }
600
601
 
602
+ // temporary function; may remove at later date if/when adserver fully supports dchain
603
+ function setupDChain(rtbBid) {
604
+ let dchain = {
605
+ ver: '1.0',
606
+ complete: 0,
607
+ nodes: [{
608
+ bsid: rtbBid.buyer_member_id.toString()
609
+ }],
610
+ };
611
+
612
+ return dchain;
613
+ }
614
+ if (rtbBid.buyer_member_id) {
615
+ bid.meta = Object.assign({}, bid.meta, {dchain: setupDChain(rtbBid)});
616
+ }
617
+
618
+ if (rtbBid.brand_id) {
619
+ bid.meta = Object.assign({}, bid.meta, { brandId: rtbBid.brand_id });
620
+ }
621
+
601
622
  if (rtbBid.rtb.video) {
602
623
  // shared video properties used for all 3 contexts
603
624
  Object.assign(bid, {
@@ -696,9 +717,11 @@ function newBid(serverBid, rtbBid, bidderRequest) {
696
717
  });
697
718
  try {
698
719
  if (rtbBid.rtb.trackers) {
699
- const url = rtbBid.rtb.trackers[0].impression_urls[0];
700
- const tracker = createTrackPixelHtml(url);
701
- bid.ad += tracker;
720
+ for (let i = 0; i < rtbBid.rtb.trackers[0].impression_urls.length; i++) {
721
+ const url = rtbBid.rtb.trackers[0].impression_urls[i];
722
+ const tracker = createTrackPixelHtml(url);
723
+ bid.ad += tracker;
724
+ }
702
725
  }
703
726
  } catch (error) {
704
727
  logError('Error appending tracking pixel', error);