prebid.js 7.35.0 → 7.37.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 (229) hide show
  1. package/.devcontainer/Dockerfile +2 -0
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admaruBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/aidemBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/aolBidAdapter.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/audiencerunBidAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bluebillywigBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/brightcomBidAdapter.js +1 -1
  28. package/dist/brightcomSSPBidAdapter.js +1 -0
  29. package/dist/carodaBidAdapter.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectadBidAdapter.js +1 -1
  33. package/dist/consumableBidAdapter.js +1 -1
  34. package/dist/conversantBidAdapter.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/cwireBidAdapter.js +1 -1
  38. package/dist/dependencies.json +3 -0
  39. package/dist/discoveryBidAdapter.js +1 -1
  40. package/dist/dspxBidAdapter.js +1 -1
  41. package/dist/eplanningBidAdapter.js +1 -1
  42. package/dist/feedadBidAdapter.js +1 -1
  43. package/dist/finativeBidAdapter.js +1 -1
  44. package/dist/freewheel-sspBidAdapter.js +1 -1
  45. package/dist/glimpseBidAdapter.js +1 -1
  46. package/dist/gmosspBidAdapter.js +1 -1
  47. package/dist/goldbachBidAdapter.js +1 -1
  48. package/dist/gridBidAdapter.js +1 -1
  49. package/dist/gridNMBidAdapter.js +1 -1
  50. package/dist/gumgumBidAdapter.js +1 -1
  51. package/dist/h12mediaBidAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/impactifyBidAdapter.js +1 -1
  54. package/dist/improvedigitalBidAdapter.js +1 -1
  55. package/dist/incrxBidAdapter.js +1 -1
  56. package/dist/inmarBidAdapter.js +1 -1
  57. package/dist/insticatorBidAdapter.js +1 -1
  58. package/dist/ixBidAdapter.js +1 -1
  59. package/dist/jixieBidAdapter.js +1 -1
  60. package/dist/justpremiumBidAdapter.js +1 -1
  61. package/dist/konduitAnalyticsAdapter.js +1 -1
  62. package/dist/kueezBidAdapter.js +1 -1
  63. package/dist/kueezRtbBidAdapter.js +1 -1
  64. package/dist/lassoBidAdapter.js +1 -1
  65. package/dist/lifestreetBidAdapter.js +1 -1
  66. package/dist/limelightDigitalBidAdapter.js +1 -1
  67. package/dist/liveIntentIdSystem.js +1 -1
  68. package/dist/livewrappedBidAdapter.js +1 -1
  69. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  70. package/dist/logicadBidAdapter.js +1 -1
  71. package/dist/loglyliftBidAdapter.js +1 -1
  72. package/dist/magniteAnalyticsAdapter.js +1 -1
  73. package/dist/malltvAnalyticsAdapter.js +1 -1
  74. package/dist/marsmediaBidAdapter.js +1 -1
  75. package/dist/mediafuseBidAdapter.js +1 -1
  76. package/dist/mediagoBidAdapter.js +1 -1
  77. package/dist/mediakeysBidAdapter.js +1 -1
  78. package/dist/mediasquareBidAdapter.js +1 -1
  79. package/dist/mgidBidAdapter.js +1 -1
  80. package/dist/minutemediaBidAdapter.js +1 -1
  81. package/dist/minutemediaplusBidAdapter.js +1 -0
  82. package/dist/neuwoRtdProvider.js +1 -0
  83. package/dist/nextMillenniumBidAdapter.js +1 -1
  84. package/dist/nexx360BidAdapter.js +1 -1
  85. package/dist/not-for-prod/prebid.js +141 -137
  86. package/dist/oguryBidAdapter.js +1 -1
  87. package/dist/onetagBidAdapter.js +1 -1
  88. package/dist/ooloAnalyticsAdapter.js +1 -1
  89. package/dist/outbrainBidAdapter.js +1 -1
  90. package/dist/parrableIdSystem.js +1 -1
  91. package/dist/pixfutureBidAdapter.js +1 -1
  92. package/dist/prebid-core.js +1 -1
  93. package/dist/prebidServerBidAdapter.js +1 -1
  94. package/dist/proxistoreBidAdapter.js +1 -1
  95. package/dist/publinkIdSystem.js +1 -1
  96. package/dist/pubmaticBidAdapter.js +1 -1
  97. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  98. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  99. package/dist/pxyzBidAdapter.js +1 -1
  100. package/dist/quantcastBidAdapter.js +1 -1
  101. package/dist/readpeakBidAdapter.js +1 -1
  102. package/dist/relaidoBidAdapter.js +1 -1
  103. package/dist/rhythmoneBidAdapter.js +1 -1
  104. package/dist/riseBidAdapter.js +1 -1
  105. package/dist/rubiconAnalyticsAdapter.js +1 -1
  106. package/dist/rubiconBidAdapter.js +1 -1
  107. package/dist/scatteredBidAdapter.js +1 -0
  108. package/dist/seedingAllianceBidAdapter.js +1 -1
  109. package/dist/seedtagBidAdapter.js +1 -1
  110. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  111. package/dist/sharethroughBidAdapter.js +1 -1
  112. package/dist/shinezBidAdapter.js +1 -1
  113. package/dist/sirdataRtdProvider.js +1 -1
  114. package/dist/smaatoBidAdapter.js +1 -1
  115. package/dist/smartadserverBidAdapter.js +1 -1
  116. package/dist/smartxBidAdapter.js +1 -1
  117. package/dist/smilewantedBidAdapter.js +1 -1
  118. package/dist/sonobiBidAdapter.js +1 -1
  119. package/dist/sovrnAnalyticsAdapter.js +1 -1
  120. package/dist/sovrnBidAdapter.js +1 -1
  121. package/dist/sspBCBidAdapter.js +1 -1
  122. package/dist/sublimeBidAdapter.js +1 -1
  123. package/dist/synacormediaBidAdapter.js +1 -1
  124. package/dist/targetVideoBidAdapter.js +1 -1
  125. package/dist/teadsBidAdapter.js +1 -1
  126. package/dist/trionBidAdapter.js +1 -1
  127. package/dist/tripleliftBidAdapter.js +1 -1
  128. package/dist/ttdBidAdapter.js +1 -1
  129. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  130. package/dist/uid2IdSystem.js +1 -1
  131. package/dist/underdogmediaBidAdapter.js +1 -1
  132. package/dist/undertoneBidAdapter.js +1 -1
  133. package/dist/userId.js +1 -1
  134. package/dist/vidazooBidAdapter.js +1 -1
  135. package/dist/videobyteBidAdapter.js +1 -1
  136. package/dist/visxBidAdapter.js +1 -1
  137. package/dist/vuukleBidAdapter.js +1 -1
  138. package/dist/widespaceBidAdapter.js +1 -1
  139. package/dist/winrBidAdapter.js +1 -1
  140. package/dist/yahoosspBidAdapter.js +1 -1
  141. package/dist/yieldmoBidAdapter.js +1 -1
  142. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  143. package/integrationExamples/gpt/neuwoRtdProvider_example.html +190 -0
  144. package/modules/33acrossBidAdapter.js +13 -4
  145. package/modules/adagioBidAdapter.js +14 -14
  146. package/modules/adagioBidAdapter.md +3 -1
  147. package/modules/admaruBidAdapter.js +19 -1
  148. package/modules/aidemBidAdapter.js +90 -65
  149. package/modules/aidemBidAdapter.md +10 -7
  150. package/modules/ajaBidAdapter.js +6 -1
  151. package/modules/amxIdSystem.md +2 -10
  152. package/modules/aolBidAdapter.js +1 -1
  153. package/modules/appnexusBidAdapter.js +45 -48
  154. package/modules/brightcomBidAdapter.js +1 -0
  155. package/modules/brightcomSSPBidAdapter.js +323 -0
  156. package/modules/brightcomSSPBidAdapter.md +46 -0
  157. package/modules/criteoBidAdapter.js +4 -5
  158. package/modules/cwireBidAdapter.md +9 -3
  159. package/modules/discoveryBidAdapter.js +22 -12
  160. package/modules/feedadBidAdapter.js +35 -15
  161. package/modules/fpdModule/index.md +5 -2
  162. package/modules/freewheel-sspBidAdapter.js +5 -1
  163. package/modules/gridBidAdapter.js +3 -1
  164. package/modules/incrxBidAdapter.js +2 -0
  165. package/modules/ixBidAdapter.js +318 -175
  166. package/modules/kueezRtbBidAdapter.js +54 -20
  167. package/modules/limelightDigitalBidAdapter.js +6 -1
  168. package/modules/limelightDigitalBidAdapter.md +12 -2
  169. package/modules/liveIntentIdSystem.js +1 -1
  170. package/modules/livewrappedBidAdapter.js +28 -16
  171. package/modules/mediagoBidAdapter.js +22 -17
  172. package/modules/minutemediaplusBidAdapter.js +291 -0
  173. package/modules/minutemediaplusBidAdapter.md +35 -0
  174. package/modules/neuwoRtdProvider.js +171 -0
  175. package/modules/neuwoRtdProvider.md +40 -0
  176. package/modules/nextMillenniumBidAdapter.js +9 -1
  177. package/modules/nexx360BidAdapter.js +1 -1
  178. package/modules/prebidServerBidAdapter/ortbConverter.js +6 -0
  179. package/modules/proxistoreBidAdapter.js +2 -2
  180. package/modules/pubmaticBidAdapter.js +4 -0
  181. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  182. package/modules/scatteredBidAdapter.js +72 -0
  183. package/modules/scatteredBidAdapter.md +36 -0
  184. package/modules/sirdataRtdProvider.js +262 -284
  185. package/modules/smartxBidAdapter.js +2 -0
  186. package/modules/smilewantedBidAdapter.js +5 -0
  187. package/modules/sonobiBidAdapter.js +1 -10
  188. package/modules/topicsFpdModule.md +62 -0
  189. package/modules/tripleliftBidAdapter.js +4 -0
  190. package/modules/userId/eids.js +1 -1
  191. package/modules/vidazooBidAdapter.js +3 -1
  192. package/modules/yahoosspBidAdapter.js +1 -1
  193. package/modules/yieldmoBidAdapter.js +1 -0
  194. package/package.json +2 -2
  195. package/src/adapterManager.js +30 -14
  196. package/src/utils.js +1 -1
  197. package/test/spec/modules/33acrossBidAdapter_spec.js +51 -18
  198. package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
  199. package/test/spec/modules/admaruBidAdapter_spec.js +48 -0
  200. package/test/spec/modules/aidemBidAdapter_spec.js +77 -10
  201. package/test/spec/modules/ajaBidAdapter_spec.js +21 -1
  202. package/test/spec/modules/aolBidAdapter_spec.js +2 -2
  203. package/test/spec/modules/appnexusBidAdapter_spec.js +123 -16
  204. package/test/spec/modules/brightcomSSPBidAdapter_spec.js +411 -0
  205. package/test/spec/modules/criteoBidAdapter_spec.js +24 -1
  206. package/test/spec/modules/eids_spec.js +1 -1
  207. package/test/spec/modules/feedadBidAdapter_spec.js +47 -77
  208. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +1 -1
  209. package/test/spec/modules/incrxBidAdapter_spec.js +4 -0
  210. package/test/spec/modules/ixBidAdapter_spec.js +24 -54
  211. package/test/spec/modules/kueezRtbBidAdapter_spec.js +63 -22
  212. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +35 -5
  213. package/test/spec/modules/livewrappedBidAdapter_spec.js +267 -2
  214. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +519 -0
  215. package/test/spec/modules/neuwoRtdProvider_spec.js +123 -0
  216. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +11 -0
  217. package/test/spec/modules/prebidServerBidAdapter_spec.js +56 -0
  218. package/test/spec/modules/proxistoreBidAdapter_spec.js +2 -2
  219. package/test/spec/modules/pubmaticBidAdapter_spec.js +15 -0
  220. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +3 -1
  221. package/test/spec/modules/scatteredBidAdapter_spec.js +210 -0
  222. package/test/spec/modules/sirdataRtdProvider_spec.js +116 -22
  223. package/test/spec/modules/smilewantedBidAdapter_spec.js +54 -3
  224. package/test/spec/modules/sonobiBidAdapter_spec.js +3 -25
  225. package/test/spec/modules/tripleliftBidAdapter_spec.js +9 -2
  226. package/test/spec/modules/userId_spec.js +1 -1
  227. package/test/spec/modules/vidazooBidAdapter_spec.js +4 -1
  228. package/test/spec/modules/yahoosspBidAdapter_spec.js +1 -1
  229. package/test/spec/unit/core/adapterManager_spec.js +147 -0
@@ -15,6 +15,7 @@ import {
15
15
  isFn,
16
16
  isInteger,
17
17
  isNumber,
18
+ isArrayOfNums,
18
19
  logError,
19
20
  logInfo,
20
21
  logWarn,
@@ -48,33 +49,32 @@ const ADAGIO_PUBKEY = 'AL16XT44Sfp+8SHVF1UdC7hydPSMVLMhsYknKDdwqq+0ToDSJrP0+Qh0k
48
49
  const ADAGIO_PUBKEY_E = 65537;
49
50
  const CURRENCY = 'USD';
50
51
 
51
- // This provide a whitelist and a basic validation
52
- // of OpenRTB 2.5 options used by the Adagio SSP.
53
- // https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf
52
+ // This provide a whitelist and a basic validation of OpenRTB 2.6 options used by the Adagio SSP.
53
+ // https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf
54
54
  export const ORTB_VIDEO_PARAMS = {
55
55
  'mimes': (value) => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'),
56
56
  'minduration': (value) => isInteger(value),
57
57
  'maxduration': (value) => isInteger(value),
58
- 'protocols': (value) => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].indexOf(v) !== -1),
58
+ 'protocols': (value) => isArrayOfNums(value),
59
59
  'w': (value) => isInteger(value),
60
60
  'h': (value) => isInteger(value),
61
61
  'startdelay': (value) => isInteger(value),
62
- 'placement': (value) => [1, 2, 3, 4, 5].indexOf(value) !== -1,
63
- 'linearity': (value) => [1, 2].indexOf(value) !== -1,
64
- 'skip': (value) => [0, 1].indexOf(value) !== -1,
62
+ 'placement': (value) => isInteger(value),
63
+ 'linearity': (value) => isInteger(value),
64
+ 'skip': (value) => isInteger(value),
65
65
  'skipmin': (value) => isInteger(value),
66
66
  'skipafter': (value) => isInteger(value),
67
67
  'sequence': (value) => isInteger(value),
68
- 'battr': (value) => Array.isArray(value) && value.every(v => Array.from({length: 17}, (_, i) => i + 1).indexOf(v) !== -1),
68
+ 'battr': (value) => isArrayOfNums(value),
69
69
  'maxextended': (value) => isInteger(value),
70
70
  'minbitrate': (value) => isInteger(value),
71
71
  'maxbitrate': (value) => isInteger(value),
72
- 'boxingallowed': (value) => [0, 1].indexOf(value) !== -1,
73
- 'playbackmethod': (value) => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6].indexOf(v) !== -1),
74
- 'playbackend': (value) => [1, 2, 3].indexOf(value) !== -1,
75
- 'delivery': (value) => [1, 2, 3].indexOf(value) !== -1,
76
- 'pos': (value) => [0, 1, 2, 3, 4, 5, 6, 7].indexOf(value) !== -1,
77
- 'api': (value) => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6].indexOf(v) !== -1)
72
+ 'boxingallowed': (value) => isInteger(value),
73
+ 'playbackmethod': (value) => isArrayOfNums(value),
74
+ 'playbackend': (value) => isInteger(value),
75
+ 'delivery': (value) => isInteger(value),
76
+ 'pos': (value) => isInteger(value),
77
+ 'api': (value) => isArrayOfNums(value)
78
78
  };
79
79
 
80
80
  let currentWindow;
@@ -81,8 +81,10 @@ var adUnits = [
81
81
  cpm: 3.00 // default to 1.00
82
82
  },
83
83
  video: {
84
+ api: [2, 7], // Required - Your video player must at least support the value 2 and/or 7.
85
+ playbackMethod: [6], // Highly recommended
84
86
  skip: 0
85
- // OpenRTB 2.5 video options defined here override ones defined in mediaTypes.
87
+ // OpenRTB video options defined here override ones defined in mediaTypes.
86
88
  },
87
89
  native: {
88
90
  // Optional OpenRTB Native 1.2 request object. Only `context`, `plcmttype` fields are supported.
@@ -5,6 +5,7 @@ const ADMARU_ENDPOINT = 'https://p1.admaru.net/AdCall';
5
5
  const BIDDER_CODE = 'admaru';
6
6
 
7
7
  const DEFAULT_BID_TTL = 360;
8
+ const SYNC_URL = 'https://p2.admaru.net/UserSync/sync'
8
9
 
9
10
  function parseBid(rawBid, currency) {
10
11
  const bid = {};
@@ -75,7 +76,24 @@ export const spec = {
75
76
  }
76
77
 
77
78
  return bidResponses;
78
- }
79
+ },
80
+
81
+ getUserSyncs: function (syncOptions, responses) {
82
+ if (syncOptions.iframeEnabled) {
83
+ return [{
84
+ type: 'iframe',
85
+ url: SYNC_URL
86
+ }];
87
+ }
88
+ if (syncOptions.pixelEnabled) {
89
+ return [{
90
+ type: 'image',
91
+ url: SYNC_URL
92
+ }];
93
+ }
94
+
95
+ return [];
96
+ },
79
97
  }
80
98
 
81
99
  registerBidder(spec);
@@ -1,4 +1,4 @@
1
- import {_each, contains, deepAccess, deepSetValue, getDNT, isBoolean, isStr, logError, logInfo} from '../src/utils.js';
1
+ import {_each, contains, deepAccess, deepSetValue, getDNT, isBoolean, isStr, isNumber, logError, logInfo} from '../src/utils.js';
2
2
  import {config} from '../src/config.js';
3
3
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
4
4
  import {registerBidder} from '../src/adapters/bidderFactory.js';
@@ -21,6 +21,8 @@ export const ERROR_CODES = {
21
21
  SITE_ID_INVALID_VALUE: 4,
22
22
  MEDIA_TYPE_NOT_SUPPORTED: 5,
23
23
  PUBLISHER_ID_INVALID_VALUE: 6,
24
+ INVALID_RATELIMIT: 7,
25
+ PLACEMENT_ID_INVALID_VALUE: 8,
24
26
  };
25
27
 
26
28
  const endpoints = {
@@ -30,29 +32,29 @@ const endpoints = {
30
32
  timeout: `${BASE_URL}/notice/timeout`,
31
33
  error: `${BASE_URL}/notice/error`,
32
34
  }
33
- }
35
+ };
34
36
 
35
37
  export function setEndPoints(env = null, path = '', mediaType = BANNER) {
36
38
  switch (env) {
37
39
  case 'local':
38
- endpoints.request = mediaType === BANNER ? `${LOCAL_BASE_URL}${path}/bid/request` : `${LOCAL_BASE_URL}${path}/bid/videorequest`
39
- endpoints.notice.win = `${LOCAL_BASE_URL}${path}/notice/win`
40
- endpoints.notice.error = `${LOCAL_BASE_URL}${path}/notice/error`
41
- endpoints.notice.timeout = `${LOCAL_BASE_URL}${path}/notice/timeout`
40
+ endpoints.request = mediaType === BANNER ? `${LOCAL_BASE_URL}${path}/bid/request` : `${LOCAL_BASE_URL}${path}/bid/videorequest`;
41
+ endpoints.notice.win = `${LOCAL_BASE_URL}${path}/notice/win`;
42
+ endpoints.notice.error = `${LOCAL_BASE_URL}${path}/notice/error`;
43
+ endpoints.notice.timeout = `${LOCAL_BASE_URL}${path}/notice/timeout`;
42
44
  break;
43
45
  case 'main':
44
- endpoints.request = mediaType === BANNER ? `${BASE_URL}${path}/bid/request` : `${BASE_URL}${path}/bid/videorequest`
45
- endpoints.notice.win = `${BASE_URL}${path}/notice/win`
46
- endpoints.notice.error = `${BASE_URL}${path}/notice/error`
47
- endpoints.notice.timeout = `${BASE_URL}${path}/notice/timeout`
46
+ endpoints.request = mediaType === BANNER ? `${BASE_URL}${path}/bid/request` : `${BASE_URL}${path}/bid/videorequest`;
47
+ endpoints.notice.win = `${BASE_URL}${path}/notice/win`;
48
+ endpoints.notice.error = `${BASE_URL}${path}/notice/error`;
49
+ endpoints.notice.timeout = `${BASE_URL}${path}/notice/timeout`;
48
50
  break;
49
51
  }
50
- return endpoints
52
+ return endpoints;
51
53
  }
52
54
 
53
55
  config.getConfig('aidem', function (config) {
54
- if (config.aidem.env) { setEndPoints(config.aidem.env, config.aidem.path, config.aidem.mediaType) }
55
- })
56
+ if (config.aidem.env) { setEndPoints(config.aidem.env, config.aidem.path, config.aidem.mediaType); }
57
+ });
56
58
 
57
59
  // AIDEM Custom FN
58
60
  function recur(obj) {
@@ -121,8 +123,8 @@ function getDevice() {
121
123
 
122
124
  function getRegs() {
123
125
  let regs = {};
124
- const consentManagement = config.getConfig('consentManagement')
125
- const coppa = config.getConfig('coppa')
126
+ const consentManagement = config.getConfig('consentManagement');
127
+ const coppa = config.getConfig('coppa');
126
128
  if (consentManagement && !!(consentManagement.gdpr)) {
127
129
  deepSetValue(regs, 'gdpr_applies', !!consentManagement.gdpr);
128
130
  } else {
@@ -145,11 +147,15 @@ function getRegs() {
145
147
  }
146
148
 
147
149
  function getPageUrl(bidderRequest) {
148
- return bidderRequest?.refererInfo?.page
150
+ return bidderRequest?.refererInfo?.page;
149
151
  }
150
152
 
151
153
  function buildWinNotice(bid) {
154
+ const params = bid.params[0];
152
155
  return {
156
+ publisherId: params.publisherId,
157
+ siteId: params.siteId,
158
+ placementId: params.placementId,
153
159
  burl: deepAccess(bid, 'meta.burl'),
154
160
  cpm: bid.cpm,
155
161
  currency: bid.currency,
@@ -161,7 +167,7 @@ function buildWinNotice(bid) {
161
167
  ttl: bid.ttl,
162
168
  requestTimestamp: bid.requestTimestamp,
163
169
  responseTimestamp: bid.responseTimestamp,
164
- }
170
+ };
165
171
  }
166
172
 
167
173
  function buildErrorNotice(prebidErrorResponse) {
@@ -171,29 +177,29 @@ function buildErrorNotice(prebidErrorResponse) {
171
177
  auctionId: prebidErrorResponse.auctionId,
172
178
  bidderRequestId: prebidErrorResponse.bidderRequestId,
173
179
  metrics: {}
174
- }
180
+ };
175
181
  }
176
182
 
177
183
  function hasValidFloor(obj) {
178
- if (!obj) return false
179
- const hasValue = !isNaN(Number(obj.value))
180
- const hasCurrency = contains(AVAILABLE_CURRENCIES, obj.currency)
181
- return hasValue && hasCurrency
184
+ if (!obj) return false;
185
+ const hasValue = !isNaN(Number(obj.value));
186
+ const hasCurrency = contains(AVAILABLE_CURRENCIES, obj.currency);
187
+ return hasValue && hasCurrency;
182
188
  }
183
189
 
184
190
  function getMediaType(bidRequest) {
185
- if ((bidRequest.mediaTypes && bidRequest.mediaTypes.hasOwnProperty('video')) || bidRequest.params.hasOwnProperty('video')) { return VIDEO }
186
- return BANNER
191
+ if ((bidRequest.mediaTypes && bidRequest.mediaTypes.hasOwnProperty('video')) || bidRequest.params.hasOwnProperty('video')) { return VIDEO; }
192
+ return BANNER;
187
193
  }
188
194
 
189
195
  function getPrebidRequestFields(bidderRequest, bidRequests) {
190
- const payload = {}
196
+ const payload = {};
191
197
  // Base Payload Data
192
198
  deepSetValue(payload, 'id', bidderRequest.auctionId);
193
199
  // Impressions
194
- setPrebidImpressionObject(bidRequests, payload)
200
+ setPrebidImpressionObject(bidRequests, payload);
195
201
  // Device
196
- deepSetValue(payload, 'device', getDevice())
202
+ deepSetValue(payload, 'device', getDevice());
197
203
  // Timeout
198
204
  deepSetValue(payload, 'tmax', bidderRequest.timeout);
199
205
  // Currency
@@ -203,13 +209,13 @@ function getPrebidRequestFields(bidderRequest, bidRequests) {
203
209
  // Privacy Regs
204
210
  deepSetValue(payload, 'regs', getRegs());
205
211
  // Site
206
- setPrebidSiteObject(bidderRequest, payload)
212
+ setPrebidSiteObject(bidderRequest, payload);
207
213
  // Environment
208
- setPrebidRequestEnvironment(payload)
214
+ setPrebidRequestEnvironment(payload);
209
215
  // AT auction type
210
216
  deepSetValue(payload, 'at', 1);
211
217
 
212
- return payload
218
+ return payload;
213
219
  }
214
220
 
215
221
  function setPrebidImpressionObject(bidRequests, payload) {
@@ -220,24 +226,24 @@ function setPrebidImpressionObject(bidRequests, payload) {
220
226
  deepSetValue(impressionObject, 'id', bidRequest.bidId);
221
227
  // Transaction id
222
228
  deepSetValue(impressionObject, 'tid', deepAccess(bidRequest, 'transactionId'));
223
- // Placement id
229
+ // placement id
224
230
  deepSetValue(impressionObject, 'tagid', deepAccess(bidRequest, 'params.placementId', null));
225
231
  // Publisher id
226
232
  deepSetValue(payload, 'site.publisher.id', deepAccess(bidRequest, 'params.publisherId'));
227
233
  // Site id
228
234
  deepSetValue(payload, 'site.id', deepAccess(bidRequest, 'params.siteId'));
229
- const mediaType = getMediaType(bidRequest)
235
+ const mediaType = getMediaType(bidRequest);
230
236
  switch (mediaType) {
231
237
  case 'banner':
232
- setPrebidImpressionObjectBanner(bidRequest, impressionObject)
238
+ setPrebidImpressionObjectBanner(bidRequest, impressionObject);
233
239
  break;
234
240
  case 'video':
235
- setPrebidImpressionObjectVideo(bidRequest, impressionObject)
241
+ setPrebidImpressionObjectVideo(bidRequest, impressionObject);
236
242
  break;
237
243
  }
238
244
 
239
245
  // Floor (optional)
240
- setPrebidImpressionObjectFloor(bidRequest, impressionObject)
246
+ setPrebidImpressionObjectFloor(bidRequest, impressionObject);
241
247
 
242
248
  impressionObject.imp_ext = {};
243
249
 
@@ -272,10 +278,10 @@ function setPrebidRequestEnvironment(payload) {
272
278
  }
273
279
 
274
280
  function setPrebidImpressionObjectFloor(bidRequest, impressionObject) {
275
- const floor = deepAccess(bidRequest, 'params.floor')
281
+ const floor = deepAccess(bidRequest, 'params.floor');
276
282
  if (hasValidFloor(floor)) {
277
- deepSetValue(impressionObject, 'floor.value', floor.value)
278
- deepSetValue(impressionObject, 'floor.currency', floor.currency)
283
+ deepSetValue(impressionObject, 'floor.value', floor.value);
284
+ deepSetValue(impressionObject, 'floor.currency', floor.currency);
279
285
  }
280
286
  }
281
287
 
@@ -322,7 +328,7 @@ function getPrebidResponseBidObject(openRTBResponseBidObject) {
322
328
  deepSetValue(prebidResponseBidObject, 'currency', openRTBResponseBidObject.cur ? openRTBResponseBidObject.cur.toUpperCase() : DEFAULT_CURRENCY);
323
329
  deepSetValue(prebidResponseBidObject, 'width', openRTBResponseBidObject.w);
324
330
  deepSetValue(prebidResponseBidObject, 'height', openRTBResponseBidObject.h);
325
- deepSetValue(prebidResponseBidObject, 'dealId', openRTBResponseBidObject.dealid)
331
+ deepSetValue(prebidResponseBidObject, 'dealId', openRTBResponseBidObject.dealid);
326
332
  deepSetValue(prebidResponseBidObject, 'netRevenue', true);
327
333
  deepSetValue(prebidResponseBidObject, 'ttl', 60000);
328
334
 
@@ -335,13 +341,13 @@ function getPrebidResponseBidObject(openRTBResponseBidObject) {
335
341
  deepSetValue(prebidResponseBidObject, 'mediaType', BANNER);
336
342
  deepSetValue(prebidResponseBidObject, 'ad', openRTBResponseBidObject.adm);
337
343
  }
338
- setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject)
339
- return prebidResponseBidObject
344
+ setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject);
345
+ return prebidResponseBidObject;
340
346
  }
341
347
 
342
348
  function setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject) {
343
349
  logInfo('AIDEM Bid Adapter meta', openRTBResponseBidObject);
344
- deepSetValue(prebidResponseBidObject, 'meta.advertiserDomains', openRTBResponseBidObject.adomain);
350
+ deepSetValue(prebidResponseBidObject, 'meta.advertiserDomains', deepAccess(openRTBResponseBidObject, 'meta.advertiserDomains'));
345
351
  if (openRTBResponseBidObject.cat && Array.isArray(openRTBResponseBidObject.cat)) {
346
352
  const primaryCatId = openRTBResponseBidObject.cat.shift();
347
353
  deepSetValue(prebidResponseBidObject, 'meta.primaryCatId', primaryCatId);
@@ -357,28 +363,28 @@ function setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponse
357
363
  }
358
364
 
359
365
  function hasValidMediaType(bidRequest) {
360
- const supported = hasBannerMediaType(bidRequest) || hasVideoMediaType(bidRequest)
366
+ const supported = hasBannerMediaType(bidRequest) || hasVideoMediaType(bidRequest);
361
367
  if (!supported) {
362
368
  logError('AIDEM Bid Adapter: media type not supported', { bidder: BIDDER_CODE, code: ERROR_CODES.MEDIA_TYPE_NOT_SUPPORTED });
363
369
  }
364
- return supported
370
+ return supported;
365
371
  }
366
372
 
367
373
  function hasBannerMediaType(bidRequest) {
368
- return !!deepAccess(bidRequest, 'mediaTypes.banner')
374
+ return !!deepAccess(bidRequest, 'mediaTypes.banner');
369
375
  }
370
376
 
371
377
  function hasVideoMediaType(bidRequest) {
372
- return !!deepAccess(bidRequest, 'mediaTypes.video')
378
+ return !!deepAccess(bidRequest, 'mediaTypes.video');
373
379
  }
374
380
 
375
381
  function hasValidBannerMediaType(bidRequest) {
376
- const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes')
382
+ const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes');
377
383
  if (!sizes) {
378
384
  logError('AIDEM Bid Adapter: media type sizes missing', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
379
385
  return false;
380
386
  }
381
- return true
387
+ return true;
382
388
  }
383
389
 
384
390
  function hasValidVideoMediaType(bidRequest) {
@@ -387,23 +393,38 @@ function hasValidVideoMediaType(bidRequest) {
387
393
  logError('AIDEM Bid Adapter: media type playerSize missing', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
388
394
  return false;
389
395
  }
390
- return true
396
+ return true;
391
397
  }
392
398
 
393
399
  function hasValidVideoParameters(bidRequest) {
394
- let valid = true
400
+ let valid = true;
395
401
  const adUnitsParameters = deepAccess(bidRequest, 'mediaTypes.video');
396
402
  const bidderParameter = deepAccess(bidRequest, 'params.video');
397
403
  for (let property of REQUIRED_VIDEO_PARAMS) {
398
- const hasAdUnitParameter = adUnitsParameters.hasOwnProperty(property)
399
- const hasBidderParameter = bidderParameter && bidderParameter.hasOwnProperty(property)
404
+ const hasAdUnitParameter = adUnitsParameters.hasOwnProperty(property);
405
+ const hasBidderParameter = bidderParameter && bidderParameter.hasOwnProperty(property);
400
406
  if (!hasAdUnitParameter && !hasBidderParameter) {
401
407
  logError(`AIDEM Bid Adapter: ${property} is not included in either the adunit or params level`, { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
402
- valid = false
408
+ valid = false;
403
409
  }
404
410
  }
405
411
 
406
- return valid
412
+ return valid;
413
+ }
414
+
415
+ function passesRateLimit(bidRequest) {
416
+ const rateLimit = deepAccess(bidRequest, 'params.rateLimit', 1);
417
+ if (!isNumber(rateLimit) || rateLimit > 1 || rateLimit < 0) {
418
+ logError('AIDEM Bid Adapter: invalid rateLimit (must be a number between 0 and 1)', { bidder: BIDDER_CODE, code: ERROR_CODES.INVALID_RATELIMIT });
419
+ return false;
420
+ }
421
+ if (rateLimit !== 1) {
422
+ const randomRateValue = Math.random();
423
+ if (randomRateValue > rateLimit) {
424
+ return false;
425
+ }
426
+ }
427
+ return true;
407
428
  }
408
429
 
409
430
  function hasValidParameters(bidRequest) {
@@ -421,7 +442,7 @@ function hasValidParameters(bidRequest) {
421
442
  return false;
422
443
  }
423
444
 
424
- return true
445
+ return true;
425
446
  }
426
447
 
427
448
  export const spec = {
@@ -431,28 +452,32 @@ export const spec = {
431
452
  logInfo('bid: ', bidRequest);
432
453
 
433
454
  // check if request has valid mediaTypes
434
- if (!hasValidMediaType(bidRequest)) return false
455
+ if (!hasValidMediaType(bidRequest)) return false;
435
456
 
436
457
  // check if request has valid media type parameters at adUnit level
437
458
  if (hasBannerMediaType(bidRequest) && !hasValidBannerMediaType(bidRequest)) {
438
- return false
459
+ return false;
439
460
  }
440
461
 
441
462
  if (hasVideoMediaType(bidRequest) && !hasValidVideoMediaType(bidRequest)) {
442
- return false
463
+ return false;
443
464
  }
444
465
 
445
466
  if (hasVideoMediaType(bidRequest) && !hasValidVideoParameters(bidRequest)) {
446
- return false
467
+ return false;
447
468
  }
448
469
 
449
- return hasValidParameters(bidRequest)
470
+ if (!hasValidParameters(bidRequest)) {
471
+ return false;
472
+ }
473
+
474
+ return passesRateLimit(bidRequest);
450
475
  },
451
476
 
452
477
  buildRequests: function(validBidRequests, bidderRequest) {
453
478
  logInfo('validBidRequests: ', validBidRequests);
454
479
  logInfo('bidderRequest: ', bidderRequest);
455
- const prebidRequest = getPrebidRequestFields(bidderRequest, validBidRequests)
480
+ const prebidRequest = getPrebidRequestFields(bidderRequest, validBidRequests);
456
481
  const payloadString = JSON.stringify(prebidRequest);
457
482
 
458
483
  return {
@@ -474,7 +499,7 @@ export const spec = {
474
499
  return;
475
500
  }
476
501
  logInfo('CPM OK');
477
- const bid = getPrebidResponseBidObject(bidObject)
502
+ const bid = getPrebidResponseBidObject(bidObject);
478
503
  bids.push(bid);
479
504
  });
480
505
  return bids;
@@ -483,14 +508,14 @@ export const spec = {
483
508
  onBidWon: function(bid) {
484
509
  // Bidder specific code
485
510
  logInfo('onBidWon bid: ', bid);
486
- const notice = buildWinNotice(bid)
511
+ const notice = buildWinNotice(bid);
487
512
  ajax(endpoints.notice.win, null, JSON.stringify(notice), { method: 'POST', withCredentials: true });
488
513
  },
489
514
 
490
515
  onBidderError: function({ bidderRequest }) {
491
516
  // Bidder specific code
492
- const notice = buildErrorNotice(bidderRequest)
517
+ const notice = buildErrorNotice(bidderRequest);
493
518
  ajax(endpoints.notice.error, null, JSON.stringify(notice), { method: 'POST', withCredentials: true });
494
519
  },
495
- }
520
+ };
496
521
  registerBidder(spec);
@@ -14,11 +14,12 @@ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed.
14
14
 
15
15
 
16
16
  ## Global Bid Params
17
- | Name | Scope | Description | Example | Type |
18
- |---------------|----------|---------------------|---------------|----------|
19
- | `siteId` | required | Unique site ID | `'ABCDEF'` | `String` |
20
- | `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `String` |
21
- | `placementId` | optional | Unique publisher tag ID | `'ABCDEF'` | `String` |
17
+ | Name | Scope | Description | Example | Type |
18
+ |---------------|----------|-------------------------|------------|----------|
19
+ | `siteId` | required | Unique site ID | `'ABCDEF'` | `String` |
20
+ | `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `String` |
21
+ | `placementId` | optional | Unique publisher tag ID | `'ABCDEF'` | `String` |
22
+ | `rateLimit` | optional | Limit the volume sent to AIDEM. Must be between 0 and 1 | `0.6` | `Number` |
22
23
 
23
24
 
24
25
  ### Banner Bid Params
@@ -67,7 +68,8 @@ var adUnits = [{
67
68
  bids: [{
68
69
  bidder: 'aidem',
69
70
  params: {
70
- siteId: 'prebid-test-site',
71
+ siteId: 'prebid-test-siteId',
72
+ publisherId: 'prebid-test-publisherId',
71
73
  },
72
74
  }]
73
75
  }];
@@ -90,7 +92,8 @@ var adUnits = [{
90
92
  bids: [{
91
93
  bidder: 'aidem',
92
94
  params: {
93
- siteId: 'prebid-test-site',
95
+ siteId: 'prebid-test-siteId',
96
+ publisherId: 'prebid-test-publisherId',
94
97
  },
95
98
  }]
96
99
  }];
@@ -1,4 +1,4 @@
1
- import { getBidIdParameter, tryAppendQueryString, createTrackPixelHtml, logError, logWarn } from '../src/utils.js';
1
+ import { getBidIdParameter, tryAppendQueryString, createTrackPixelHtml, logError, logWarn, deepAccess } from '../src/utils.js';
2
2
  import { Renderer } from '../src/Renderer.js';
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { VIDEO, BANNER, NATIVE } from '../src/mediaTypes.js';
@@ -64,6 +64,11 @@ export const spec = {
64
64
  }))
65
65
  }
66
66
 
67
+ const sua = deepAccess(bidRequest, 'ortb2.device.sua');
68
+ if (sua) {
69
+ queryString = tryAppendQueryString(queryString, 'sua', JSON.stringify(sua));
70
+ }
71
+
67
72
  bidRequests.push({
68
73
  method: 'GET',
69
74
  url: URL,
@@ -1,6 +1,6 @@
1
- # AMX RTB ID
1
+ # AMX ID
2
2
 
3
- For help adding this module, please contact [prebid@amxrtb.com](prebid@amxrtb.com).
3
+ For help adding this module, please contact [info@amxdt.net](info@amxdt.net).
4
4
 
5
5
  ### Prebid Configuration
6
6
 
@@ -41,11 +41,3 @@ The following settings are available for the `storage` property in the `userSync
41
41
  | name | Required | String | Where the ID will be stored | `"amxId"` |
42
42
  | type | Required | String | This must be `"html5"` | `"html5"` |
43
43
  | expires | Required | Number <= 30 | number of days until the stored ID expires. **Must be less than or equal to 30** | `14` |
44
-
45
- ### Params
46
-
47
- The following options are available in the `params` property in `userSync.userIds[]`:
48
-
49
- | Param under `params` | Scope | Type | Description | Example |
50
- | -------------------- | -------- | ------ | ------------------------------------------------------------------------- | ---------------- |
51
- | tagId | Optional | String | Your AMX tagId (optional) | `cHJlYmlkLm9yZw` |
@@ -35,7 +35,7 @@ const SUPPORTED_USER_ID_SOURCES = [
35
35
  'adserver.org',
36
36
  'adtelligent.com',
37
37
  'akamai.com',
38
- 'amxrtb.com',
38
+ 'amxdt.net',
39
39
  'audigent.com',
40
40
  'britepool.com',
41
41
  'criteo.com',