prebid.js 7.35.0 → 7.36.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 (188) 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/dspxBidAdapter.js +1 -1
  40. package/dist/eplanningBidAdapter.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freewheel-sspBidAdapter.js +1 -1
  44. package/dist/glimpseBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/gridBidAdapter.js +1 -1
  48. package/dist/gridNMBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/impactifyBidAdapter.js +1 -1
  53. package/dist/improvedigitalBidAdapter.js +1 -1
  54. package/dist/inmarBidAdapter.js +1 -1
  55. package/dist/insticatorBidAdapter.js +1 -1
  56. package/dist/ixBidAdapter.js +1 -1
  57. package/dist/jixieBidAdapter.js +1 -1
  58. package/dist/justpremiumBidAdapter.js +1 -1
  59. package/dist/konduitAnalyticsAdapter.js +1 -1
  60. package/dist/kueezBidAdapter.js +1 -1
  61. package/dist/kueezRtbBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/limelightDigitalBidAdapter.js +1 -1
  65. package/dist/liveIntentIdSystem.js +1 -1
  66. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  67. package/dist/logicadBidAdapter.js +1 -1
  68. package/dist/loglyliftBidAdapter.js +1 -1
  69. package/dist/magniteAnalyticsAdapter.js +1 -1
  70. package/dist/malltvAnalyticsAdapter.js +1 -1
  71. package/dist/marsmediaBidAdapter.js +1 -1
  72. package/dist/mediafuseBidAdapter.js +1 -1
  73. package/dist/mediakeysBidAdapter.js +1 -1
  74. package/dist/mediasquareBidAdapter.js +1 -1
  75. package/dist/mgidBidAdapter.js +1 -1
  76. package/dist/minutemediaBidAdapter.js +1 -1
  77. package/dist/neuwoRtdProvider.js +1 -0
  78. package/dist/nexx360BidAdapter.js +1 -1
  79. package/dist/not-for-prod/prebid.js +132 -129
  80. package/dist/oguryBidAdapter.js +1 -1
  81. package/dist/onetagBidAdapter.js +1 -1
  82. package/dist/ooloAnalyticsAdapter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/pixfutureBidAdapter.js +1 -1
  86. package/dist/prebid-core.js +1 -1
  87. package/dist/publinkIdSystem.js +1 -1
  88. package/dist/pubmaticBidAdapter.js +1 -1
  89. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  90. package/dist/pxyzBidAdapter.js +1 -1
  91. package/dist/quantcastBidAdapter.js +1 -1
  92. package/dist/readpeakBidAdapter.js +1 -1
  93. package/dist/relaidoBidAdapter.js +1 -1
  94. package/dist/rhythmoneBidAdapter.js +1 -1
  95. package/dist/riseBidAdapter.js +1 -1
  96. package/dist/rubiconAnalyticsAdapter.js +1 -1
  97. package/dist/rubiconBidAdapter.js +1 -1
  98. package/dist/scatteredBidAdapter.js +1 -0
  99. package/dist/seedingAllianceBidAdapter.js +1 -1
  100. package/dist/seedtagBidAdapter.js +1 -1
  101. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  102. package/dist/sharethroughBidAdapter.js +1 -1
  103. package/dist/shinezBidAdapter.js +1 -1
  104. package/dist/sirdataRtdProvider.js +1 -1
  105. package/dist/smaatoBidAdapter.js +1 -1
  106. package/dist/smartadserverBidAdapter.js +1 -1
  107. package/dist/smartxBidAdapter.js +1 -1
  108. package/dist/smilewantedBidAdapter.js +1 -1
  109. package/dist/sonobiBidAdapter.js +1 -1
  110. package/dist/sovrnAnalyticsAdapter.js +1 -1
  111. package/dist/sovrnBidAdapter.js +1 -1
  112. package/dist/sspBCBidAdapter.js +1 -1
  113. package/dist/sublimeBidAdapter.js +1 -1
  114. package/dist/synacormediaBidAdapter.js +1 -1
  115. package/dist/targetVideoBidAdapter.js +1 -1
  116. package/dist/teadsBidAdapter.js +1 -1
  117. package/dist/trionBidAdapter.js +1 -1
  118. package/dist/tripleliftBidAdapter.js +1 -1
  119. package/dist/ttdBidAdapter.js +1 -1
  120. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  121. package/dist/uid2IdSystem.js +1 -1
  122. package/dist/underdogmediaBidAdapter.js +1 -1
  123. package/dist/undertoneBidAdapter.js +1 -1
  124. package/dist/userId.js +1 -1
  125. package/dist/vidazooBidAdapter.js +1 -1
  126. package/dist/videobyteBidAdapter.js +1 -1
  127. package/dist/visxBidAdapter.js +1 -1
  128. package/dist/vuukleBidAdapter.js +1 -1
  129. package/dist/widespaceBidAdapter.js +1 -1
  130. package/dist/winrBidAdapter.js +1 -1
  131. package/dist/yahoosspBidAdapter.js +1 -1
  132. package/dist/yieldmoBidAdapter.js +1 -1
  133. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  134. package/integrationExamples/gpt/neuwoRtdProvider_example.html +190 -0
  135. package/modules/33acrossBidAdapter.js +13 -4
  136. package/modules/admaruBidAdapter.js +19 -1
  137. package/modules/aidemBidAdapter.js +90 -65
  138. package/modules/aidemBidAdapter.md +10 -7
  139. package/modules/ajaBidAdapter.js +6 -1
  140. package/modules/amxIdSystem.md +2 -10
  141. package/modules/aolBidAdapter.js +1 -1
  142. package/modules/appnexusBidAdapter.js +45 -48
  143. package/modules/brightcomBidAdapter.js +1 -0
  144. package/modules/brightcomSSPBidAdapter.js +323 -0
  145. package/modules/brightcomSSPBidAdapter.md +46 -0
  146. package/modules/feedadBidAdapter.js +35 -15
  147. package/modules/fpdModule/index.md +5 -2
  148. package/modules/freewheel-sspBidAdapter.js +5 -1
  149. package/modules/gridBidAdapter.js +3 -1
  150. package/modules/ixBidAdapter.js +318 -175
  151. package/modules/limelightDigitalBidAdapter.js +6 -1
  152. package/modules/limelightDigitalBidAdapter.md +12 -2
  153. package/modules/liveIntentIdSystem.js +1 -1
  154. package/modules/neuwoRtdProvider.js +171 -0
  155. package/modules/neuwoRtdProvider.md +40 -0
  156. package/modules/nexx360BidAdapter.js +1 -1
  157. package/modules/pubmaticBidAdapter.js +4 -0
  158. package/modules/scatteredBidAdapter.js +72 -0
  159. package/modules/scatteredBidAdapter.md +36 -0
  160. package/modules/sirdataRtdProvider.js +262 -284
  161. package/modules/smartxBidAdapter.js +2 -0
  162. package/modules/smilewantedBidAdapter.js +5 -0
  163. package/modules/topicsFpdModule.md +62 -0
  164. package/modules/userId/eids.js +1 -1
  165. package/modules/vidazooBidAdapter.js +3 -1
  166. package/modules/yahoosspBidAdapter.js +1 -1
  167. package/package.json +2 -2
  168. package/test/spec/modules/33acrossBidAdapter_spec.js +51 -18
  169. package/test/spec/modules/admaruBidAdapter_spec.js +48 -0
  170. package/test/spec/modules/aidemBidAdapter_spec.js +77 -10
  171. package/test/spec/modules/ajaBidAdapter_spec.js +21 -1
  172. package/test/spec/modules/aolBidAdapter_spec.js +2 -2
  173. package/test/spec/modules/appnexusBidAdapter_spec.js +123 -16
  174. package/test/spec/modules/brightcomSSPBidAdapter_spec.js +411 -0
  175. package/test/spec/modules/eids_spec.js +1 -1
  176. package/test/spec/modules/feedadBidAdapter_spec.js +47 -77
  177. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +1 -1
  178. package/test/spec/modules/ixBidAdapter_spec.js +24 -54
  179. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +35 -5
  180. package/test/spec/modules/neuwoRtdProvider_spec.js +123 -0
  181. package/test/spec/modules/pubmaticBidAdapter_spec.js +15 -0
  182. package/test/spec/modules/scatteredBidAdapter_spec.js +210 -0
  183. package/test/spec/modules/sirdataRtdProvider_spec.js +116 -22
  184. package/test/spec/modules/smilewantedBidAdapter_spec.js +54 -3
  185. package/test/spec/modules/tripleliftBidAdapter_spec.js +2 -2
  186. package/test/spec/modules/userId_spec.js +1 -1
  187. package/test/spec/modules/vidazooBidAdapter_spec.js +4 -1
  188. package/test/spec/modules/yahoosspBidAdapter_spec.js +1 -1
@@ -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',
@@ -44,7 +44,7 @@ const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid';
44
44
  const VIDEO_TARGETING = ['id', 'minduration', 'maxduration',
45
45
  'skippable', 'playback_method', 'frameworks', 'context', 'skipoffset'];
46
46
  const VIDEO_RTB_TARGETING = ['minduration', 'maxduration', 'skip', 'skipafter', 'playbackmethod', 'api', 'startdelay'];
47
- const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
47
+ const USER_PARAMS = ['age', 'externalUid', 'external_uid', 'segments', 'gender', 'dnt', 'language'];
48
48
  const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
49
49
  const DEBUG_PARAMS = ['enabled', 'dongle', 'member_id', 'debug_timeout'];
50
50
  const DEBUG_QUERY_PARAM_MAP = {
@@ -120,7 +120,9 @@ export const spec = {
120
120
  * @return boolean True if this is a valid bid, and false otherwise.
121
121
  */
122
122
  isBidRequestValid: function (bid) {
123
- return !!(bid.params.placementId || (bid.params.member && bid.params.invCode));
123
+ return !!(
124
+ (bid.params.placementId || bid.params.placement_id) ||
125
+ (bid.params.member && (bid.params.invCode || bid.params.inv_code)));
124
126
  },
125
127
 
126
128
  /**
@@ -343,20 +345,18 @@ export const spec = {
343
345
 
344
346
  if (bidRequests[0].userId) {
345
347
  let eids = [];
346
-
347
- addUserId(eids, deepAccess(bidRequests[0], `userId.criteoId`), 'criteo.com', null);
348
- addUserId(eids, deepAccess(bidRequests[0], `userId.netId`), 'netid.de', null);
349
- addUserId(eids, deepAccess(bidRequests[0], `userId.idl_env`), 'liveramp.com', null);
350
- addUserId(eids, deepAccess(bidRequests[0], `userId.tdid`), 'adserver.org', 'TDID');
351
- addUserId(eids, deepAccess(bidRequests[0], `userId.uid2.id`), 'uidapi.com', 'UID2');
352
- if (bidRequests[0].userId.pubProvidedId) {
353
- bidRequests[0].userId.pubProvidedId.forEach(ppId => {
354
- ppId.uids.forEach(uid => {
355
- eids.push({ source: ppId.source, id: uid.id });
356
- });
348
+ bidRequests[0].userIdAsEids.forEach(eid => {
349
+ if (!eid || !eid.uids || eid.uids.length < 1) { return; }
350
+ eid.uids.forEach(uid => {
351
+ let tmp = {'source': eid.source, 'id': uid.id};
352
+ if (eid.source == 'adserver.org') {
353
+ tmp.rti_partner = 'TDID';
354
+ } else if (eid.source == 'uidapi.com') {
355
+ tmp.rti_partner = 'UID2';
356
+ }
357
+ eids.push(tmp);
357
358
  });
358
- }
359
-
359
+ });
360
360
  if (eids.length) {
361
361
  payload.eids = eids;
362
362
  }
@@ -484,9 +484,6 @@ export const spec = {
484
484
  }, params);
485
485
 
486
486
  if (isOpenRtb) {
487
- params.use_pmt_rule = (typeof params.usePaymentRule === 'boolean') ? params.usePaymentRule : false;
488
- if (params.usePaymentRule) { delete params.usePaymentRule; }
489
-
490
487
  if (isPopulatedArray(params.keywords)) {
491
488
  params.keywords.forEach(deleteValues);
492
489
  }
@@ -498,6 +495,9 @@ export const spec = {
498
495
  delete params[paramKey];
499
496
  }
500
497
  });
498
+
499
+ params.use_pmt_rule = (typeof params.use_payment_rule === 'boolean') ? params.use_payment_rule : false;
500
+ if (params.use_payment_rule) { delete params.use_payment_rule; }
501
501
  }
502
502
 
503
503
  return params;
@@ -771,17 +771,25 @@ function newBid(serverBid, rtbBid, bidderRequest) {
771
771
 
772
772
  function bidToTag(bid) {
773
773
  const tag = {};
774
+ Object.keys(bid.params).forEach(paramKey => {
775
+ let convertedKey = convertCamelToUnderscore(paramKey);
776
+ if (convertedKey !== paramKey) {
777
+ bid.params[convertedKey] = bid.params[paramKey];
778
+ delete bid.params[paramKey];
779
+ }
780
+ });
774
781
  tag.sizes = transformSizes(bid.sizes);
775
782
  tag.primary_size = tag.sizes[0];
776
783
  tag.ad_types = [];
777
784
  tag.uuid = bid.bidId;
778
- if (bid.params.placementId) {
779
- tag.id = parseInt(bid.params.placementId, 10);
785
+ if (bid.params.placement_id) {
786
+ tag.id = parseInt(bid.params.placement_id, 10);
780
787
  } else {
781
- tag.code = bid.params.invCode;
788
+ tag.code = bid.params.inv_code;
782
789
  }
783
- tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false;
784
- tag.use_pmt_rule = bid.params.usePaymentRule || false;
790
+ tag.allow_smaller_sizes = bid.params.allow_smaller_sizes || false;
791
+ tag.use_pmt_rule = (typeof bid.params.use_payment_rule === 'boolean') ? bid.params.use_payment_rule
792
+ : (typeof bid.params.use_pmt_rule === 'boolean') ? bid.params.use_pmt_rule : false;
785
793
  tag.prebid = true;
786
794
  tag.disable_psa = true;
787
795
  let bidFloor = getBidFloor(bid);
@@ -798,26 +806,26 @@ function bidToTag(bid) {
798
806
  tag.position = (mediaTypePos === 3) ? 2 : mediaTypePos;
799
807
  }
800
808
  }
801
- if (bid.params.trafficSourceCode) {
802
- tag.traffic_source_code = bid.params.trafficSourceCode;
809
+ if (bid.params.traffic_source_code) {
810
+ tag.traffic_source_code = bid.params.traffic_source_code;
803
811
  }
804
- if (bid.params.privateSizes) {
805
- tag.private_sizes = transformSizes(bid.params.privateSizes);
812
+ if (bid.params.private_sizes) {
813
+ tag.private_sizes = transformSizes(bid.params.private_sizes);
806
814
  }
807
- if (bid.params.supplyType) {
808
- tag.supply_type = bid.params.supplyType;
815
+ if (bid.params.supply_type) {
816
+ tag.supply_type = bid.params.supply_type;
809
817
  }
810
- if (bid.params.pubClick) {
811
- tag.pubclick = bid.params.pubClick;
818
+ if (bid.params.pub_click) {
819
+ tag.pubclick = bid.params.pub_click;
812
820
  }
813
- if (bid.params.extInvCode) {
814
- tag.ext_inv_code = bid.params.extInvCode;
821
+ if (bid.params.ext_inv_code) {
822
+ tag.ext_inv_code = bid.params.ext_inv_code;
815
823
  }
816
- if (bid.params.publisherId) {
817
- tag.publisher_id = parseInt(bid.params.publisherId, 10);
824
+ if (bid.params.publisher_id) {
825
+ tag.publisher_id = parseInt(bid.params.publisher_id, 10);
818
826
  }
819
- if (bid.params.externalImpId) {
820
- tag.external_imp_id = bid.params.externalImpId;
827
+ if (bid.params.external_imp_id) {
828
+ tag.external_imp_id = bid.params.external_imp_id;
821
829
  }
822
830
 
823
831
  let ortb2ImpKwStr = deepAccess(bid, 'ortb2Imp.ext.data.keywords');
@@ -1218,17 +1226,6 @@ function parseMediaType(rtbBid) {
1218
1226
  }
1219
1227
  }
1220
1228
 
1221
- function addUserId(eids, id, source, rti) {
1222
- if (id) {
1223
- if (rti) {
1224
- eids.push({ source, id, rti_partner: rti });
1225
- } else {
1226
- eids.push({ source, id });
1227
- }
1228
- }
1229
- return eids;
1230
- }
1231
-
1232
1229
  function getBidFloor(bid) {
1233
1230
  if (!isFn(bid.getFloor)) {
1234
1231
  return (bid.params.reserve) ? bid.params.reserve : null;
@@ -9,6 +9,7 @@ const URL = 'https://brightcombid.marphezis.com/hb';
9
9
  export const spec = {
10
10
  code: BIDDER_CODE,
11
11
  supportedMediaTypes: [BANNER],
12
+ gvlid: 883,
12
13
  isBidRequestValid,
13
14
  buildRequests,
14
15
  interpretResponse,