prebid.js 7.26.0 → 7.27.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 (305) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  9. package/dist/adlooxAdServerVideo.js +1 -1
  10. package/dist/adlooxAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/admaticBidAdapter.js +1 -1
  13. package/dist/admixerBidAdapter.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adrelevantisBidAdapter.js +1 -1
  16. package/dist/adtrgtmeBidAdapter.js +1 -1
  17. package/dist/adxcgAnalyticsAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  20. package/dist/aidemBidAdapter.js +1 -0
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/analyticsAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/bidViewability.js +1 -1
  31. package/dist/bidglassBidAdapter.js +1 -1
  32. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  33. package/dist/big-richmediaBidAdapter.js +1 -1
  34. package/dist/bridgewellBidAdapter.js +1 -1
  35. package/dist/brightMountainMediaBidAdapter.js +1 -1
  36. package/dist/browsiRtdProvider.js +1 -1
  37. package/dist/bucksenseBidAdapter.js +1 -1
  38. package/dist/byDataAnalyticsAdapter.js +1 -1
  39. package/dist/carodaBidAdapter.js +1 -1
  40. package/dist/chtnwBidAdapter.js +1 -1
  41. package/dist/concertAnalyticsAdapter.js +1 -1
  42. package/dist/concertBidAdapter.js +1 -1
  43. package/dist/connectadBidAdapter.js +1 -1
  44. package/dist/consentManagement.js +1 -1
  45. package/dist/consentManagementUsp.js +1 -1
  46. package/dist/consumableBidAdapter.js +1 -1
  47. package/dist/conversantAnalyticsAdapter.js +1 -1
  48. package/dist/conversantBidAdapter.js +1 -1
  49. package/dist/craftBidAdapter.js +1 -1
  50. package/dist/criteoBidAdapter.js +1 -1
  51. package/dist/datablocksAnalyticsAdapter.js +1 -1
  52. package/dist/dependencies.json +6 -0
  53. package/dist/dfpAdServerVideo.js +1 -1
  54. package/dist/dspxBidAdapter.js +1 -1
  55. package/dist/eplanningAnalyticsAdapter.js +1 -1
  56. package/dist/eplanningBidAdapter.js +1 -1
  57. package/dist/finativeBidAdapter.js +1 -1
  58. package/dist/fintezaAnalyticsAdapter.js +1 -1
  59. package/dist/fluctBidAdapter.js +1 -1
  60. package/dist/ftrackIdSystem.js +1 -1
  61. package/dist/gdprEnforcement.js +1 -1
  62. package/dist/genericAnalyticsAdapter.js +1 -0
  63. package/dist/geoedgeRtdProvider.js +1 -1
  64. package/dist/glimpseBidAdapter.js +1 -1
  65. package/dist/glomexBidAdapter.js +1 -1
  66. package/dist/gmosspBidAdapter.js +1 -1
  67. package/dist/goldbachBidAdapter.js +1 -1
  68. package/dist/googleAnalyticsAdapter.js +1 -1
  69. package/dist/gravitoIdSystem.js +1 -1
  70. package/dist/gridBidAdapter.js +1 -1
  71. package/dist/gridNMBidAdapter.js +1 -1
  72. package/dist/growthCodeAnalyticsAdapter.js +1 -0
  73. package/dist/gumgumBidAdapter.js +1 -1
  74. package/dist/h12mediaBidAdapter.js +1 -1
  75. package/dist/hadronAnalyticsAdapter.js +1 -1
  76. package/dist/id5AnalyticsAdapter.js +1 -1
  77. package/dist/id5IdSystem.js +1 -1
  78. package/dist/impactifyBidAdapter.js +1 -1
  79. package/dist/improvedigitalBidAdapter.js +1 -1
  80. package/dist/inmarBidAdapter.js +1 -1
  81. package/dist/insticatorBidAdapter.js +1 -1
  82. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  83. package/dist/ixBidAdapter.js +1 -1
  84. package/dist/justpremiumBidAdapter.js +1 -1
  85. package/dist/jwplayerRtdProvider.js +1 -1
  86. package/dist/kargoAnalyticsAdapter.js +1 -1
  87. package/dist/kinessoIdSystem.js +1 -1
  88. package/dist/konduitAnalyticsAdapter.js +1 -1
  89. package/dist/kueezBidAdapter.js +1 -1
  90. package/dist/kueezRtbBidAdapter.js +1 -1
  91. package/dist/lassoBidAdapter.js +1 -1
  92. package/dist/lifestreetBidAdapter.js +1 -1
  93. package/dist/limelightDigitalBidAdapter.js +1 -1
  94. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  95. package/dist/liveIntentIdSystem.js +1 -1
  96. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  97. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  98. package/dist/logicadBidAdapter.js +1 -1
  99. package/dist/loglyliftBidAdapter.js +1 -1
  100. package/dist/lotamePanoramaIdSystem.js +1 -1
  101. package/dist/magniteAnalyticsAdapter.js +1 -1
  102. package/dist/malltvAnalyticsAdapter.js +1 -1
  103. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  104. package/dist/marsmediaBidAdapter.js +1 -1
  105. package/dist/mediafuseBidAdapter.js +1 -1
  106. package/dist/medianetAnalyticsAdapter.js +1 -1
  107. package/dist/mediasquareBidAdapter.js +1 -1
  108. package/dist/mgidBidAdapter.js +1 -1
  109. package/dist/minutemediaBidAdapter.js +1 -1
  110. package/dist/nexx360BidAdapter.js +1 -1
  111. package/dist/not-for-prod/prebid.js +200 -196
  112. package/dist/oguryBidAdapter.js +1 -1
  113. package/dist/onetagBidAdapter.js +1 -1
  114. package/dist/ooloAnalyticsAdapter.js +1 -1
  115. package/dist/openxAnalyticsAdapter.js +1 -1
  116. package/dist/optimonAnalyticsAdapter.js +1 -1
  117. package/dist/outbrainBidAdapter.js +1 -1
  118. package/dist/parrableIdSystem.js +1 -1
  119. package/dist/pbsExtensions.js +1 -1
  120. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  121. package/dist/pixfutureBidAdapter.js +1 -1
  122. package/dist/prebid-core.js +1 -1
  123. package/dist/prebidServerBidAdapter.js +1 -1
  124. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  125. package/dist/pubCommonId.js +1 -1
  126. package/dist/pubProvidedIdSystem.js +1 -1
  127. package/dist/publinkIdSystem.js +1 -1
  128. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  129. package/dist/pubmaticBidAdapter.js +1 -1
  130. package/dist/pubperfAnalyticsAdapter.js +1 -1
  131. package/dist/pubstackAnalyticsAdapter.js +1 -1
  132. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  133. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  134. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  135. package/dist/pxyzBidAdapter.js +1 -1
  136. package/dist/quantcastBidAdapter.js +1 -1
  137. package/dist/quantcastIdSystem.js +1 -1
  138. package/dist/rasBidAdapter.js +1 -1
  139. package/dist/readpeakBidAdapter.js +1 -1
  140. package/dist/realvuAnalyticsAdapter.js +1 -1
  141. package/dist/redtramBidAdapter.js +1 -0
  142. package/dist/relaidoBidAdapter.js +1 -1
  143. package/dist/relevantAnalyticsAdapter.js +1 -1
  144. package/dist/rhythmoneBidAdapter.js +1 -1
  145. package/dist/riseBidAdapter.js +1 -1
  146. package/dist/rivrAnalyticsAdapter.js +1 -1
  147. package/dist/roxotAnalyticsAdapter.js +1 -1
  148. package/dist/rtbhouseBidAdapter.js +1 -1
  149. package/dist/rtdModule.js +1 -1
  150. package/dist/rubiconAnalyticsAdapter.js +1 -1
  151. package/dist/rubiconBidAdapter.js +1 -1
  152. package/dist/s2sTesting.js +1 -1
  153. package/dist/scaleableAnalyticsAdapter.js +1 -1
  154. package/dist/schain.js +1 -1
  155. package/dist/seedingAllianceBidAdapter.js +1 -1
  156. package/dist/seedtagBidAdapter.js +1 -1
  157. package/dist/sharedIdSystem.js +1 -1
  158. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  159. package/dist/sharethroughBidAdapter.js +1 -1
  160. package/dist/shinezBidAdapter.js +1 -1
  161. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  162. package/dist/smaatoBidAdapter.js +1 -1
  163. package/dist/smartadserverBidAdapter.js +1 -1
  164. package/dist/smartxBidAdapter.js +1 -1
  165. package/dist/smilewantedBidAdapter.js +1 -1
  166. package/dist/sonobiAnalyticsAdapter.js +1 -1
  167. package/dist/sonobiBidAdapter.js +1 -1
  168. package/dist/sovrnAnalyticsAdapter.js +1 -1
  169. package/dist/sovrnBidAdapter.js +1 -1
  170. package/dist/sspBCBidAdapter.js +1 -1
  171. package/dist/staqAnalyticsAdapter.js +1 -1
  172. package/dist/sublimeBidAdapter.js +1 -1
  173. package/dist/synacormediaBidAdapter.js +1 -1
  174. package/dist/tapadIdSystem.js +1 -1
  175. package/dist/targetVideoBidAdapter.js +1 -1
  176. package/dist/teadsBidAdapter.js +1 -1
  177. package/dist/teadsIdSystem.js +1 -1
  178. package/dist/terceptAnalyticsAdapter.js +1 -1
  179. package/dist/trionBidAdapter.js +1 -1
  180. package/dist/tripleliftBidAdapter.js +1 -1
  181. package/dist/ttdBidAdapter.js +1 -1
  182. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  183. package/dist/underdogmediaBidAdapter.js +1 -1
  184. package/dist/undertoneBidAdapter.js +1 -1
  185. package/dist/userId.js +1 -1
  186. package/dist/vidazooBidAdapter.js +1 -1
  187. package/dist/videobyteBidAdapter.js +1 -1
  188. package/dist/visxBidAdapter.js +1 -1
  189. package/dist/vuukleBidAdapter.js +1 -1
  190. package/dist/weboramaRtdProvider.js +1 -1
  191. package/dist/widespaceBidAdapter.js +1 -1
  192. package/dist/winrBidAdapter.js +1 -1
  193. package/dist/yahoosspBidAdapter.js +1 -1
  194. package/dist/yandexBidAdapter.js +1 -1
  195. package/dist/yieldlabBidAdapter.js +1 -1
  196. package/dist/yieldliftBidAdapter.js +1 -1
  197. package/dist/yieldmoBidAdapter.js +1 -1
  198. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  199. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  200. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  201. package/integrationExamples/gpt/growthcode.html +134 -0
  202. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  203. package/modules/admaticBidAdapter.js +10 -1
  204. package/modules/admixerBidAdapter.js +1 -1
  205. package/modules/aidemBidAdapter.js +492 -0
  206. package/modules/aidemBidAdapter.md +187 -0
  207. package/modules/browsiRtdProvider.js +6 -4
  208. package/modules/bucksenseBidAdapter.js +1 -1
  209. package/modules/criteoBidAdapter.js +3 -3
  210. package/modules/eplanningBidAdapter.js +2 -6
  211. package/modules/fluctBidAdapter.js +5 -0
  212. package/modules/gdprEnforcement.js +26 -24
  213. package/modules/genericAnalyticsAdapter.js +157 -0
  214. package/modules/geoedgeRtdProvider.js +22 -0
  215. package/modules/glomexBidAdapter.js +2 -0
  216. package/modules/gravitoIdSystem.js +3 -4
  217. package/modules/gridBidAdapter.js +1 -1
  218. package/modules/gridNMBidAdapter.js +1 -1
  219. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  220. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  221. package/modules/impactifyBidAdapter.js +19 -1
  222. package/modules/jwplayerRtdProvider.js +1 -2
  223. package/modules/limelightDigitalBidAdapter.js +1 -1
  224. package/modules/minutemediaBidAdapter.md +3 -3
  225. package/modules/nexx360BidAdapter.js +264 -138
  226. package/modules/pubCommonId.js +2 -1
  227. package/modules/pubProvidedIdSystem.js +2 -0
  228. package/modules/rasBidAdapter.js +8 -3
  229. package/modules/rasBidAdapter.md +16 -15
  230. package/modules/redtramBidAdapter.js +155 -0
  231. package/modules/redtramBidAdapter.md +33 -0
  232. package/modules/riseBidAdapter.js +15 -0
  233. package/modules/riseBidAdapter.md +3 -3
  234. package/modules/rtbhouseBidAdapter.js +90 -29
  235. package/modules/rubiconBidAdapter.js +2 -1
  236. package/modules/seedtagBidAdapter.js +67 -56
  237. package/modules/seedtagBidAdapter.md +60 -0
  238. package/modules/sharedIdSystem.js +3 -1
  239. package/modules/smartxBidAdapter.js +1 -1
  240. package/modules/smnBidAdapter.md +52 -0
  241. package/modules/tripleliftBidAdapter.js +1 -1
  242. package/modules/ttdBidAdapter.js +4 -0
  243. package/modules/vidazooBidAdapter.js +11 -1
  244. package/modules/yandexBidAdapter.js +85 -19
  245. package/modules/yandexBidAdapter.md +7 -7
  246. package/modules/yieldlabBidAdapter.js +10 -4
  247. package/modules/yieldliftBidAdapter.js +3 -3
  248. package/package.json +1 -1
  249. package/src/auction.js +19 -3
  250. package/src/consentHandler.js +8 -0
  251. package/src/events.js +4 -0
  252. package/src/native.js +31 -20
  253. package/src/refererDetection.js +6 -1
  254. package/src/storageManager.js +6 -3
  255. package/test/helpers/analytics.js +34 -0
  256. package/test/mocks/analyticsStub.js +3 -1
  257. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  258. package/test/spec/auctionmanager_spec.js +86 -0
  259. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  260. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  261. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  262. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  263. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  264. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  265. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  266. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  267. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  268. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  269. package/test/spec/modules/fpdModule_spec.js +1 -1
  270. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  271. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  272. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  273. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  274. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  275. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  276. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  277. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  278. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  279. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  280. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  281. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  282. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  283. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  284. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  285. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  286. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  287. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  288. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  289. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  290. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  291. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  292. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  293. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  294. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  295. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  296. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  297. package/test/spec/modules/ttdBidAdapter_spec.js +14 -0
  298. package/test/spec/modules/vidazooBidAdapter_spec.js +39 -24
  299. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  300. package/test/spec/modules/yieldlabBidAdapter_spec.js +49 -20
  301. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  302. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  303. package/test/spec/native_spec.js +68 -56
  304. package/test/spec/refererDetection_spec.js +45 -7
  305. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -0,0 +1,41 @@
1
+ ## GrowthCode Analytics Adapter
2
+
3
+ [GrowthCode](https://growthcode.io) offers scaled infrastructure-as-a-service to
4
+ empower independent publishers to harness data and take control of identity and
5
+ audience while rapidly aligning to industry changes and margin pressure.
6
+
7
+ ## Building Prebid with GrowthCode Support
8
+
9
+ First, make sure to add the GrowthCode submodule to your Prebid.js package with:
10
+
11
+ ```
12
+ gulp build --modules=growthCodeIdSystem,growthCodeAnalyticsAdapter,userId
13
+ ```
14
+
15
+ The following configuration parameters are available:
16
+
17
+ ```javascript
18
+ pbjs.enableAnalytics({
19
+ provider: 'growthCodeAnalytics',
20
+ options: {
21
+ pid: '<Contact GrowthCode>',
22
+ trackEvents: [
23
+ 'auctionEnd',
24
+ 'bidAdjustment',
25
+ 'bidTimeout',
26
+ 'bidRequested',
27
+ 'bidResponse',
28
+ 'noBid',
29
+ 'bidWon',
30
+ 'bidderDone']
31
+ }
32
+ });
33
+ ```
34
+
35
+ | Param enableAnalytics | Scope | Type | Description | Example |
36
+ |-----------------------|----------|--------|-------------------------------------------------------------|--------------------------|
37
+ | provider | Required | String | The name of this Adapter. | `"growthCodeAnalytics"` |
38
+ | params | Required | Object | Details of module params. | |
39
+ | params.pid | Required | String | This is the Customer ID value obtained via Intimate Merger. | `"<Contact GrowthCode>"` |
40
+ | params.url | Optional | String | Custom URL for server | |
41
+ | params.trackEvents | Required | String | Name if the variable that holds your publisher ID | |
@@ -1,7 +1,7 @@
1
1
  import { deepAccess, deepSetValue, generateUUID } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
  import { config } from '../src/config.js';
4
- import {ajax} from '../src/ajax.js';
4
+ import { ajax } from '../src/ajax.js';
5
5
  import { createEidsArray } from './userId/eids.js';
6
6
 
7
7
  const BIDDER_CODE = 'impactify';
@@ -27,6 +27,18 @@ const getDeviceType = () => {
27
27
  return 2;
28
28
  };
29
29
 
30
+ const getFloor = (bid) => {
31
+ const floorInfo = bid.getFloor({
32
+ currency: DEFAULT_CURRENCY,
33
+ mediaType: '*',
34
+ size: '*'
35
+ });
36
+ if (typeof floorInfo === 'object' && floorInfo.currency === DEFAULT_CURRENCY && !isNaN(parseFloat(floorInfo.floor))) {
37
+ return parseFloat(floorInfo.floor);
38
+ }
39
+ return null;
40
+ }
41
+
30
42
  const createOpenRtbRequest = (validBidRequests, bidderRequest) => {
31
43
  // Create request and set imp bids inside
32
44
  let request = {
@@ -114,6 +126,12 @@ const createOpenRtbRequest = (validBidRequests, bidderRequest) => {
114
126
  if (bid.params.container) {
115
127
  imp.ext.impactify.container = bid.params.container;
116
128
  }
129
+ if (typeof bid.getFloor === 'function') {
130
+ const floor = getFloor(bid);
131
+ if (floor) {
132
+ imp.bidfloor = floor;
133
+ }
134
+ }
117
135
  request.imp.push(imp);
118
136
  });
119
137
 
@@ -274,8 +274,7 @@ export function getContentSegments(segments) {
274
274
 
275
275
  const formattedSegments = segments.reduce((convertedSegments, rawSegment) => {
276
276
  convertedSegments.push({
277
- id: rawSegment,
278
- value: rawSegment
277
+ id: rawSegment
279
278
  });
280
279
  return convertedSegments;
281
280
  }, []);
@@ -26,7 +26,7 @@ function isBidResponseValid(bid) {
26
26
 
27
27
  export const spec = {
28
28
  code: BIDDER_CODE,
29
- aliases: ['pll'],
29
+ aliases: ['pll', 'iionads'],
30
30
  supportedMediaTypes: [BANNER, VIDEO],
31
31
 
32
32
  /**
@@ -20,7 +20,7 @@ The adapter supports Video(instream) & Banner.
20
20
 
21
21
  | Name | Scope | Type | Description | Example
22
22
  | ---- | ----- | ---- | ----------- | -------
23
- | `org` | required | String | MinuteMedia publisher Id provided by your MinuteMedia representative | "56f91cd4d3e3660002000033"
23
+ | `org` | required | String | MinuteMedia publisher Id provided by your MinuteMedia representative | "1234567890abcdef12345678"
24
24
  | `floorPrice` | optional | Number | Minimum price in USD. Misuse of this parameter can impact revenue | 2.00
25
25
  | `placementId` | optional | String | A unique placement identifier | "12345678"
26
26
  | `testMode` | optional | Boolean | This activates the test mode | false
@@ -43,7 +43,7 @@ var adUnits = [{
43
43
  bids: [{
44
44
  bidder: 'minutemedia',
45
45
  params: {
46
- org: '56f91cd4d3e3660002000033', // Required
46
+ org: '1234567890abcdef12345678', // Required
47
47
  floorPrice: 2.00, // Optional
48
48
  placementId: 'video-test', // Optional
49
49
  testMode: false // Optional
@@ -65,7 +65,7 @@ var adUnits = [{
65
65
  bids: [{
66
66
  bidder: 'minutemedia',
67
67
  params: {
68
- org: '56f91cd4d3e3660002000033', // Required
68
+ org: '1234567890abcdef12345678', // Required
69
69
  floorPrice: 2.00, // Optional
70
70
  placementId: 'banner-test', // Optional
71
71
  testMode: false // Optional
@@ -1,176 +1,302 @@
1
- import {ajax} from '../src/ajax.js';
2
1
  import {config} from '../src/config.js';
3
- import { transformBidderParamKeywords } from '../src/utils.js';
2
+ import * as utils from '../src/utils.js';
4
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
5
4
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
5
+ import {getGlobal} from '../src/prebidGlobal.js';
6
6
 
7
+ const VIDEO_TARGETING = ['startdelay', 'mimes', 'minduration', 'maxduration', 'delivery',
8
+ 'startdelay', 'skip', 'playbackmethod', 'api', 'protocol', 'boxingallowed', 'maxextended',
9
+ 'linearity', 'delivery', 'protocols', 'placement', 'minbitrate', 'maxbitrate', 'battr', 'ext'];
7
10
  const BIDDER_CODE = 'nexx360';
8
- const BIDDER_URL = 'https://fast.nexx360.io/prebid';
9
- const CACHE_URL = 'https://fast.nexx360.io/cache';
10
- const METRICS_TRACKER_URL = 'https://fast.nexx360.io/track-imp';
11
+ const REQUEST_URL = 'https://fast.nexx360.io/booster';
12
+
13
+ const PAGE_VIEW_ID = utils.generateUUID();
14
+
15
+ const BIDDER_VERSION = '1.0';
11
16
 
12
17
  const GVLID = 965;
13
18
 
14
19
  export const spec = {
15
20
  code: BIDDER_CODE,
16
21
  gvlid: GVLID,
17
- aliases: ['revenuemaker'], // short code
22
+ aliases: [
23
+ { code: 'revenuemaker' },
24
+ { code: 'firstid-ssp' },
25
+ ],
18
26
  supportedMediaTypes: [BANNER, VIDEO],
19
- /**
27
+ isBidRequestValid,
28
+ buildRequests,
29
+ interpretResponse,
30
+ getUserSyncs,
31
+ // onBidWon,
32
+ };
33
+
34
+ registerBidder(spec);
35
+
36
+ /**
20
37
  * Determines whether or not the given bid request is valid.
21
38
  *
22
39
  * @param {BidRequest} bid The bid params to validate.
23
40
  * @return boolean True if this is a valid bid, and false otherwise.
24
41
  */
25
- isBidRequestValid: function(bid) {
26
- if (!!bid.params.bidfloorCurrency && !['EUR', 'USD'].includes(bid.params.bidfloorCurrency)) return false;
27
- if (!!bid.params.bidfloor && typeof bid.params.bidfloor !== 'number') return false;
28
- if (!!bid.params.keywords && typeof bid.params.keywords !== 'object') return false;
29
- return !!(bid.params.account && bid.params.tagId);
30
- },
31
- /**
42
+ function isBidRequestValid(bid) {
43
+ return !!bid.params.tagId || !!bid.params.videoTagId;
44
+ };
45
+
46
+ /**
32
47
  * Make a server request from the list of BidRequests.
33
48
  *
34
49
  * @param {validBidRequests[]} - an array of bids
35
50
  * @return ServerRequest Info describing the request to the server.
36
51
  */
37
- buildRequests: function(validBidRequests, bidderRequest) {
38
- const adUnits = [];
39
- const test = config.getConfig('debug') ? 1 : 0;
40
- let adunitValue = null;
41
- let userEids = null;
42
- Object.keys(validBidRequests).forEach(key => {
43
- adunitValue = validBidRequests[key];
44
- const foo = {
45
- account: adunitValue.params.account,
46
- tagId: adunitValue.params.tagId,
47
- videoExt: adunitValue.params.videoExt,
48
- label: adunitValue.adUnitCode,
49
- bidId: adunitValue.bidId,
50
- auctionId: adunitValue.auctionId,
51
- transactionId: adunitValue.transactionId,
52
- mediatypes: adunitValue.mediaTypes,
53
- bidfloor: adunitValue.params.bidfloor || 0,
54
- bidfloorCurrency: adunitValue.params.bidfloorCurrency || 'USD',
55
- keywords: adunitValue.params.keywords ? transformBidderParamKeywords(adunitValue.params.keywords) : [],
52
+
53
+ function buildRequests(bids, bidderRequest) {
54
+ const data = getBaseRequest(bids[0], bidderRequest);
55
+ bids.forEach((bid) => {
56
+ const impObject = createImpObject(bid);
57
+ if (isBannerBid(bid)) impObject.banner = getBannerObject(bid);
58
+ if (isVideoBid(bid)) impObject.video = getVideoObject(bid);
59
+ data.imp.push(impObject);
60
+ });
61
+ return {
62
+ method: 'POST',
63
+ url: REQUEST_URL,
64
+ data,
65
+ }
66
+ }
67
+
68
+ function createImpObject(bid) {
69
+ const floor = getFloor(bid, BANNER);
70
+ const imp = {
71
+ id: bid.bidId,
72
+ tagid: bid.adUnitCode,
73
+ ext: {
74
+ divId: bid.adUnitCode,
75
+ nexx360: {
76
+ videoTagId: bid.params.videoTagId,
77
+ tagId: bid.params.tagId,
78
+ allBids: bid.params.allBids === true,
56
79
  }
57
- adUnits.push(foo);
58
- if (adunitValue.userIdAsEids) userEids = adunitValue.userIdAsEids;
80
+ }
81
+ };
82
+ if (bid.params.customParams) {
83
+ utils.deepSetValue(imp, 'ext.customParams', bid.params.customParams);
84
+ }
85
+ enrichImp(imp, bid, floor);
86
+ return imp;
87
+ }
88
+
89
+ function getBannerObject(bid) {
90
+ return {
91
+ format: toFormat(bid.mediaTypes.banner.sizes),
92
+ topframe: utils.inIframe() ? 0 : 1
93
+ };
94
+ }
95
+
96
+ function getVideoObject(bid) {
97
+ let width, height;
98
+ const videoParams = utils.deepAccess(bid, `mediaTypes.video`);
99
+ const playerSize = utils.deepAccess(bid, 'mediaTypes.video.playerSize');
100
+ const context = utils.deepAccess(bid, 'mediaTypes.video.context');
101
+ // normalize config for video size
102
+ if (utils.isArray(bid.sizes) && bid.sizes.length === 2 && !utils.isArray(bid.sizes[0])) {
103
+ width = parseInt(bid.sizes[0], 10);
104
+ height = parseInt(bid.sizes[1], 10);
105
+ } else if (utils.isArray(bid.sizes) && utils.isArray(bid.sizes[0]) && bid.sizes[0].length === 2) {
106
+ width = parseInt(bid.sizes[0][0], 10);
107
+ height = parseInt(bid.sizes[0][1], 10);
108
+ } else if (utils.isArray(playerSize) && playerSize.length === 2) {
109
+ width = parseInt(playerSize[0], 10);
110
+ height = parseInt(playerSize[1], 10);
111
+ }
112
+ const video = {
113
+ playerSize: [height, width],
114
+ context,
115
+ };
116
+
117
+ Object.keys(videoParams)
118
+ .filter(param => VIDEO_TARGETING.includes(param))
119
+ .forEach(param => video[param] = videoParams[param]);
120
+ return video;
121
+ }
122
+
123
+ function isVideoBid(bid) {
124
+ return utils.deepAccess(bid, 'mediaTypes.video');
125
+ }
126
+
127
+ function isBannerBid(bid) {
128
+ return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
129
+ }
130
+
131
+ function toFormat(sizes) {
132
+ return sizes.map((s) => {
133
+ return { w: s[0], h: s[1] };
134
+ });
135
+ }
136
+
137
+ function getFloor(bid, mediaType) {
138
+ let floor = 0;
139
+ if (typeof bid.getFloor === 'function') {
140
+ const floorInfo = bid.getFloor({
141
+ currency: 'USD',
142
+ mediaType: mediaType,
143
+ size: '*'
59
144
  });
60
- const payload = {
61
- adUnits,
62
- // TODO: does the fallback make sense here?
63
- href: encodeURIComponent(bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation)
64
- };
65
- if (bidderRequest) { // modules informations (gdpr, ccpa, schain, userId)
66
- if (bidderRequest.gdprConsent) {
67
- payload.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
68
- payload.gdprConsent = bidderRequest.gdprConsent.consentString;
69
- } else {
70
- payload.gdpr = 0;
71
- payload.gdprConsent = '';
72
- }
73
- if (bidderRequest.uspConsent) { payload.uspConsent = bidderRequest.uspConsent; }
74
- if (bidderRequest.schain) { payload.schain = bidderRequest.schain; }
75
- if (userEids !== null) payload.userEids = userEids;
76
- };
77
- if (test) payload.test = 1;
78
- const payloadString = JSON.stringify(payload);
79
- return {
80
- method: 'POST',
81
- url: BIDDER_URL,
82
- data: payloadString,
83
- };
84
- },
85
- /**
145
+
146
+ if (typeof floorInfo === 'object' &&
147
+ floorInfo.currency === 'USD' &&
148
+ !isNaN(parseFloat(floorInfo.floor))) {
149
+ floor = Math.max(floor, parseFloat(floorInfo.floor));
150
+ }
151
+ }
152
+
153
+ return floor;
154
+ }
155
+
156
+ function enrichImp(imp, bid, floor) {
157
+ if (bid.params.customParams) {
158
+ utils.deepSetValue(imp, 'ext.customParams', bid.params.customParams);
159
+ }
160
+ if (floor > 0) {
161
+ imp.bidfloor = floor;
162
+ imp.bidfloorcur = 'USD';
163
+ } else if (bid.params.customFloor) {
164
+ imp.bidfloor = bid.params.customFloor;
165
+ }
166
+ if (bid.ortb2Imp && bid.ortb2Imp.ext && bid.ortb2Imp.ext.data) {
167
+ imp.ext.data = bid.ortb2Imp.ext.data;
168
+ }
169
+ }
170
+
171
+ function getBaseRequest(bid, bidderRequest) {
172
+ let req = {
173
+ id: bidderRequest.auctionId,
174
+ imp: [],
175
+ cur: [config.getConfig('currency.adServerCurrency') || 'USD'],
176
+ at: 1,
177
+ tmax: config.getConfig('bidderTimeout'),
178
+ site: {
179
+ page: bidderRequest.refererInfo.topmostLocation || bidderRequest.refererInfo.page,
180
+ domain: bidderRequest.refererInfo.domain,
181
+ },
182
+ regs: {
183
+ coppa: (config.getConfig('coppa') === true || bid.params.coppa) ? 1 : 0,
184
+ },
185
+ device: {
186
+ dnt: (utils.getDNT() || bid.params.doNotTrack) ? 1 : 0,
187
+ h: screen.height,
188
+ w: screen.width,
189
+ ua: window.navigator.userAgent,
190
+ language: window.navigator.language.split('-').shift()
191
+ },
192
+ user: {},
193
+ ext: {
194
+ source: 'prebid.js',
195
+ version: '$prebid.version$',
196
+ pageViewId: PAGE_VIEW_ID,
197
+ bidderVersion: BIDDER_VERSION,
198
+ }
199
+ };
200
+
201
+ if (bid.params.platform) {
202
+ utils.deepSetValue(req, 'ext.platform', bid.params.platform);
203
+ }
204
+ if (bid.params.response_template_name) {
205
+ utils.deepSetValue(req, 'ext.response_template_name', bid.params.response_template_name);
206
+ }
207
+ req.test = config.getConfig('debug') ? 1 : 0;
208
+ if (bidderRequest.gdprConsent) {
209
+ if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
210
+ utils.deepSetValue(req, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies === true ? 1 : 0);
211
+ }
212
+ if (bidderRequest.gdprConsent.consentString !== undefined) {
213
+ utils.deepSetValue(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
214
+ }
215
+ if (bidderRequest.gdprConsent.addtlConsent !== undefined) {
216
+ utils.deepSetValue(req, 'user.ext.ConsentedProvidersSettings.consented_providers', bidderRequest.gdprConsent.addtlConsent);
217
+ }
218
+ }
219
+ if (bidderRequest.uspConsent) {
220
+ utils.deepSetValue(req, 'regs.ext.us_privacy', bidderRequest.uspConsent);
221
+ }
222
+ if (bid.schain) {
223
+ utils.deepSetValue(req, 'source.ext.schain', bid.schain);
224
+ }
225
+ if (bid.userIdAsEids) {
226
+ utils.deepSetValue(req, 'user.ext.eids', bid.userIdAsEids);
227
+ }
228
+ const commonFpd = bidderRequest.ortb2 || {};
229
+ if (commonFpd.site) {
230
+ utils.mergeDeep(req, {site: commonFpd.site});
231
+ }
232
+ if (commonFpd.user) {
233
+ utils.mergeDeep(req, {user: commonFpd.user});
234
+ }
235
+ return req;
236
+ }
237
+
238
+ /**
86
239
  * Unpack the response from the server into a list of bids.
87
240
  *
88
241
  * @param {ServerResponse} serverResponse A successful response from the server.
89
242
  * @return {Bid[]} An array of bids which were nested inside the server.
90
243
  */
91
- interpretResponse: function(serverResponse, bidRequest) {
92
- const serverBody = serverResponse.body;
93
- const bidResponses = [];
94
- let bidResponse = null;
95
- let value = null;
96
- if (serverBody.hasOwnProperty('responses')) {
97
- Object.keys(serverBody['responses']).forEach(key => {
98
- value = serverBody['responses'][key];
99
- const url = `${CACHE_URL}?uuid=${value['uuid']}`;
100
- bidResponse = {
101
- requestId: value['bidId'],
102
- cpm: value['cpm'],
103
- currency: value['currency'],
104
- width: value['width'],
105
- height: value['height'],
106
- ttl: value['ttl'],
107
- creativeId: value['creativeId'],
108
- netRevenue: true,
109
- nexx360: {
110
- 'ssp': value['bidder'],
111
- 'consent': value['consent'],
112
- 'tagId': value['tagId']
113
- },
114
- /*
115
- meta: {
116
- 'advertiserDomains': value['adomain']
117
- }
118
- */
119
- };
120
- if (value.type === 'banner') bidResponse.adUrl = url;
121
- if (value.type === 'video') {
122
- const params = {
123
- type: 'prebid',
124
- mediatype: 'video',
125
- ssp: value.bidder,
126
- tag_id: value.tagId,
127
- consent: value.consent,
128
- price: value.cpm,
129
- };
130
- bidResponse.cpm = value.cpm;
131
- bidResponse.mediaType = 'video';
132
- bidResponse.vastUrl = url;
133
- bidResponse.vastImpUrl = `${METRICS_TRACKER_URL}?${new URLSearchParams(params).toString()}`;
134
- }
135
- bidResponses.push(bidResponse);
136
- });
137
- }
138
- return bidResponses;
139
- },
244
+ function interpretResponse(response, req) {
245
+ const { bidderSettings } = getGlobal();
246
+ const allowAlternateBidderCodes = bidderSettings && bidderSettings.standard ? bidderSettings.standard.allowAlternateBidderCodes : false;
247
+ const respBody = response.body;
248
+ if (!respBody || !Array.isArray(respBody.seatbid)) {
249
+ return [];
250
+ }
251
+
252
+ let bids = [];
253
+ respBody.seatbid.forEach(seatbid => {
254
+ bids = [...bids, ...seatbid.bid.map(bid => {
255
+ const response = {
256
+ requestId: bid.impid,
257
+ cpm: bid.price,
258
+ width: bid.w,
259
+ height: bid.h,
260
+ creativeId: bid.crid,
261
+ dealId: bid.dealid,
262
+ currency: respBody.cur || 'USD',
263
+ netRevenue: true,
264
+ ttl: 120,
265
+ bidderCode: allowAlternateBidderCodes ? `n360-${bid.ssp}` : 'nexx360',
266
+ mediaType: bid.type === 'banner' ? 'banner' : 'video',
267
+ meta: { advertiserDomains: bid.adomain },
268
+ };
269
+ // if (bid.dealid) response.dealid = bid.dealid;
140
270
 
141
- /**
271
+ if (response.mediaType === 'banner') {
272
+ response.adUrl = bid.adUrl;
273
+ }
274
+
275
+ if (['instream', 'outstream'].includes(bid.type)) response.vastXml = bid.vastXml;
276
+
277
+ if (bid.ext) {
278
+ response.meta.networkId = bid.ext.dsp_id;
279
+ response.meta.advertiserId = bid.ext.buyer_id;
280
+ response.meta.brandId = bid.ext.brand_id;
281
+ }
282
+ return response;
283
+ })];
284
+ });
285
+ return bids;
286
+ }
287
+
288
+ /**
142
289
  * Register the user sync pixels which should be dropped after the auction.
143
290
  *
144
291
  * @param {SyncOptions} syncOptions Which user syncs are allowed?
145
292
  * @param {ServerResponse[]} serverResponses List of server's responses.
146
293
  * @return {UserSync[]} The user syncs which should be dropped.
147
294
  */
148
- getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
149
- if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') &&
295
+ function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) {
296
+ if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') &&
150
297
  serverResponses[0].body.hasOwnProperty('cookies') && typeof serverResponses[0].body.cookies === 'object') {
151
- return serverResponses[0].body.cookies.slice(0, 5);
152
- } else {
153
- return [];
154
- }
155
- },
156
-
157
- /**
158
- * Register bidder specific code, which will execute if a bid from this bidder won the auction
159
- * @param {Bid} The bid that won the auction
160
- */
161
- onBidWon: function(bid) {
162
- // fires a pixel to confirm a winning bid
163
- const params = { type: 'prebid', mediatype: 'banner' };
164
- if (bid.hasOwnProperty('nexx360')) {
165
- if (bid.nexx360.hasOwnProperty('ssp')) params.ssp = bid.nexx360.ssp;
166
- if (bid.nexx360.hasOwnProperty('tagId')) params.tag_id = bid.nexx360.tagId;
167
- if (bid.nexx360.hasOwnProperty('consent')) params.consent = bid.nexx360.consent;
168
- };
169
- params.price = bid.cpm;
170
- const url = `${METRICS_TRACKER_URL}?${new URLSearchParams(params).toString()}`;
171
- ajax(url, null, undefined, {method: 'GET', withCredentials: true});
172
- return true;
298
+ return serverResponses[0].body.cookies.slice(0, 5);
299
+ } else {
300
+ return [];
173
301
  }
174
-
175
- }
176
- registerBidder(spec);
302
+ };
@@ -9,8 +9,9 @@ import * as events from '../src/events.js';
9
9
  import CONSTANTS from '../src/constants.json';
10
10
  import { getStorageManager } from '../src/storageManager.js';
11
11
  import {timedAuctionHook} from '../src/utils/perfMetrics.js';
12
+ import {VENDORLESS_GVLID} from '../src/consentHandler.js';
12
13
 
13
- const storage = getStorageManager({moduleName: 'pubCommonId'});
14
+ const storage = getStorageManager({moduleName: 'pubCommonId', gvlid: VENDORLESS_GVLID});
14
15
 
15
16
  const ID_NAME = '_pubcid';
16
17
  const OPTOUT_NAME = '_pubcid_optout';
@@ -7,6 +7,7 @@
7
7
 
8
8
  import {submodule} from '../src/hook.js';
9
9
  import { logInfo, isArray } from '../src/utils.js';
10
+ import {VENDORLESS_GVLID} from '../src/consentHandler.js';
10
11
 
11
12
  const MODULE_NAME = 'pubProvidedId';
12
13
 
@@ -18,6 +19,7 @@ export const pubProvidedIdSubmodule = {
18
19
  * @type {string}
19
20
  */
20
21
  name: MODULE_NAME,
22
+ gvlid: VENDORLESS_GVLID,
21
23
 
22
24
  /**
23
25
  * decode the stored id value for passing to bid request
@@ -1,4 +1,3 @@
1
- import * as utils from '../src/utils.js';
2
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
2
  import { BANNER } from '../src/mediaTypes.js';
4
3
  import { isEmpty, getAdUnitSizes, parseSizesInput, deepAccess } from '../src/utils.js';
@@ -12,9 +11,15 @@ const getEndpoint = (network) => {
12
11
 
13
12
  function parseParams(params, bidderRequest) {
14
13
  const newParams = {};
14
+ if (params.customParams && typeof params.customParams === 'object') {
15
+ for (const param in params.customParams) {
16
+ if (params.customParams.hasOwnProperty(param)) {
17
+ newParams[param] = params.customParams[param];
18
+ }
19
+ }
20
+ }
15
21
  const du = deepAccess(bidderRequest, 'refererInfo.page');
16
22
  const dr = deepAccess(bidderRequest, 'refererInfo.ref');
17
-
18
23
  if (du) {
19
24
  newParams.du = du;
20
25
  }
@@ -93,7 +98,7 @@ const getSlots = (bidRequests) => {
93
98
  const batchSize = bidRequests.length;
94
99
  for (let i = 0; i < batchSize; i++) {
95
100
  const adunit = bidRequests[i];
96
- const slotSequence = utils.deepAccess(adunit, 'params.slotSequence');
101
+ const slotSequence = deepAccess(adunit, 'params.slotSequence');
97
102
 
98
103
  const sizes = parseSizesInput(getAdUnitSizes(adunit)).join(',');
99
104