prebid.js 9.5.0 → 9.7.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 (253) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  2. package/.github/release-drafter.yml +4 -0
  3. package/README.md +4 -4
  4. package/dist/33acrossAnalyticsAdapter.js +1 -1
  5. package/dist/33acrossBidAdapter.js +1 -1
  6. package/dist/33acrossIdSystem.js +1 -1
  7. package/dist/BTBidAdapter.js +1 -1
  8. package/dist/adagioAnalyticsAdapter.js +1 -1
  9. package/dist/adagioBidAdapter.js +1 -1
  10. package/dist/adagioUtils.js +1 -1
  11. package/dist/addefendBidAdapter.js +1 -1
  12. package/dist/adgenerationBidAdapter.js +1 -1
  13. package/dist/adkernelBidAdapter.js +1 -1
  14. package/dist/adlooxRtdProvider.js +1 -1
  15. package/dist/adqueryBidAdapter.js +1 -1
  16. package/dist/adrelevantisBidAdapter.js +1 -1
  17. package/dist/adstirBidAdapter.js +1 -1
  18. package/dist/adtrgtmeBidAdapter.js +1 -1
  19. package/dist/adxcgAnalyticsAdapter.js +1 -1
  20. package/dist/adxcgBidAdapter.js +1 -1
  21. package/dist/adyoulikeBidAdapter.js +1 -1
  22. package/dist/agmaAnalyticsAdapter.js +1 -1
  23. package/dist/aidemBidAdapter.js +1 -1
  24. package/dist/ajaBidAdapter.js +1 -1
  25. package/dist/amxBidAdapter.js +1 -1
  26. package/dist/amxIdSystem.js +1 -1
  27. package/dist/appierAnalyticsAdapter.js +1 -1
  28. package/dist/appnexusBidAdapter.js +1 -1
  29. package/dist/asoBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/bidglassBidAdapter.js +1 -1
  32. package/dist/big-richmediaBidAdapter.js +1 -1
  33. package/dist/bridBidAdapter.js +1 -1
  34. package/dist/bridgewellBidAdapter.js +1 -1
  35. package/dist/brightMountainMediaBidAdapter.js +1 -1
  36. package/dist/carodaBidAdapter.js +1 -1
  37. package/dist/chtnwBidAdapter.js +1 -1
  38. package/dist/chunk-core.js +1 -1
  39. package/dist/cleanmedianetBidAdapter.js +1 -1
  40. package/dist/concertBidAdapter.js +1 -1
  41. package/dist/connectIdSystem.js +1 -1
  42. package/dist/connectadBidAdapter.js +1 -1
  43. package/dist/connectionInfo.js +1 -0
  44. package/dist/consumableBidAdapter.js +1 -1
  45. package/dist/conversantAnalyticsAdapter.js +1 -1
  46. package/dist/conversantBidAdapter.js +1 -1
  47. package/dist/craftBidAdapter.js +1 -1
  48. package/dist/criteoBidAdapter.js +1 -1
  49. package/dist/cwireBidAdapter.js +1 -1
  50. package/dist/dailymotionBidAdapter.js +1 -1
  51. package/dist/dependencies.json +31 -2
  52. package/dist/docereeAdManagerBidAdapter.js +1 -1
  53. package/dist/dspxBidAdapter.js +1 -1
  54. package/dist/dxkultureBidAdapter.js +1 -1
  55. package/dist/eplanningBidAdapter.js +1 -1
  56. package/dist/euidIdSystem.js +1 -1
  57. package/dist/exadsBidAdapter.js +1 -1
  58. package/dist/feedadBidAdapter.js +1 -1
  59. package/dist/finativeBidAdapter.js +1 -1
  60. package/dist/freewheel-sspBidAdapter.js +1 -1
  61. package/dist/gamoshiBidAdapter.js +1 -1
  62. package/dist/gmosspBidAdapter.js +1 -1
  63. package/dist/goldbachBidAdapter.js +1 -1
  64. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  65. package/dist/greenbidsRtdProvider.js +1 -1
  66. package/dist/gridBidAdapter.js +1 -1
  67. package/dist/gumgumBidAdapter.js +1 -1
  68. package/dist/h12mediaBidAdapter.js +1 -1
  69. package/dist/hypelabBidAdapter.js +1 -1
  70. package/dist/id5AnalyticsAdapter.js +1 -1
  71. package/dist/id5IdSystem.js +1 -1
  72. package/dist/idImportLibrary.js +1 -1
  73. package/dist/imdsBidAdapter.js +1 -1
  74. package/dist/improvedigitalBidAdapter.js +1 -1
  75. package/dist/insticatorBidAdapter.js +1 -1
  76. package/dist/intentIqAnalyticsAdapter.js +1 -1
  77. package/dist/ixBidAdapter.js +1 -1
  78. package/dist/jixieBidAdapter.js +1 -1
  79. package/dist/justpremiumBidAdapter.js +1 -1
  80. package/dist/kargoBidAdapter.js +1 -1
  81. package/dist/kimberliteBidAdapter.js +1 -1
  82. package/dist/konduitAnalyticsAdapter.js +1 -1
  83. package/dist/kueezBidAdapter.js +1 -1
  84. package/dist/lassoBidAdapter.js +1 -1
  85. package/dist/lifestreetBidAdapter.js +1 -1
  86. package/dist/liveIntentIdSystem.js +1 -1
  87. package/dist/logicadBidAdapter.js +1 -1
  88. package/dist/loglyliftBidAdapter.js +1 -1
  89. package/dist/luceadBidAdapter.js +1 -1
  90. package/dist/mabidderBidAdapter.js +1 -1
  91. package/dist/magniteAnalyticsAdapter.js +1 -1
  92. package/dist/malltvAnalyticsAdapter.js +1 -1
  93. package/dist/marsmediaBidAdapter.js +1 -1
  94. package/dist/mediafuseBidAdapter.js +1 -1
  95. package/dist/medianetAnalyticsAdapter.js +1 -1
  96. package/dist/medianetBidAdapter.js +1 -1
  97. package/dist/mediasquareBidAdapter.js +1 -1
  98. package/dist/mgidBidAdapter.js +1 -1
  99. package/dist/minutemediaBidAdapter.js +1 -1
  100. package/dist/missenaBidAdapter.js +1 -1
  101. package/dist/mobianRtdProvider.js +1 -1
  102. package/dist/nexx360BidAdapter.js +1 -1
  103. package/dist/nobidAnalyticsAdapter.js +1 -1
  104. package/dist/nobidBidAdapter.js +1 -1
  105. package/dist/not-for-prod/prebid.js +174 -170
  106. package/dist/oguryBidAdapter.js +1 -1
  107. package/dist/onetagBidAdapter.js +1 -1
  108. package/dist/ooloAnalyticsAdapter.js +1 -1
  109. package/dist/openwebBidAdapter.js +1 -1
  110. package/dist/openxBidAdapter.js +1 -1
  111. package/dist/optidigitalBidAdapter.js +1 -1
  112. package/dist/orbidderBidAdapter.js +1 -1
  113. package/dist/ortbConverter.js +1 -1
  114. package/dist/outbrainBidAdapter.js +1 -1
  115. package/dist/ownadxBidAdapter.js +1 -0
  116. package/dist/pixfutureBidAdapter.js +1 -1
  117. package/dist/prismaBidAdapter.js +1 -1
  118. package/dist/publinkIdSystem.js +1 -1
  119. package/dist/publirBidAdapter.js +1 -1
  120. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  121. package/dist/pubmaticBidAdapter.js +1 -1
  122. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  123. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  124. package/dist/pxyzBidAdapter.js +1 -1
  125. package/dist/quantcastBidAdapter.js +1 -1
  126. package/dist/readpeakBidAdapter.js +1 -1
  127. package/dist/relaidoBidAdapter.js +1 -1
  128. package/dist/retailspotBidAdapter.js +1 -1
  129. package/dist/rhythmoneBidAdapter.js +1 -1
  130. package/dist/riseBidAdapter.js +1 -1
  131. package/dist/riseUtils.js +1 -0
  132. package/dist/rubiconBidAdapter.js +1 -1
  133. package/dist/seedingAllianceBidAdapter.js +1 -1
  134. package/dist/seedtagBidAdapter.js +1 -1
  135. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  136. package/dist/sharethroughBidAdapter.js +1 -1
  137. package/dist/shinezBidAdapter.js +1 -1
  138. package/dist/smaatoBidAdapter.js +1 -1
  139. package/dist/smartadserverBidAdapter.js +1 -1
  140. package/dist/smarthubBidAdapter.js +1 -1
  141. package/dist/smartxBidAdapter.js +1 -1
  142. package/dist/smilewantedBidAdapter.js +1 -1
  143. package/dist/snigelBidAdapter.js +1 -1
  144. package/dist/sonobiBidAdapter.js +1 -1
  145. package/dist/sovrnBidAdapter.js +1 -1
  146. package/dist/sspBCBidAdapter.js +1 -1
  147. package/dist/stnBidAdapter.js +1 -1
  148. package/dist/stvBidAdapter.js +1 -1
  149. package/dist/sublimeBidAdapter.js +1 -1
  150. package/dist/taboolaBidAdapter.js +1 -1
  151. package/dist/tappxBidAdapter.js +1 -1
  152. package/dist/targetVideoBidAdapter.js +1 -1
  153. package/dist/teadsBidAdapter.js +1 -1
  154. package/dist/telariaBidAdapter.js +1 -1
  155. package/dist/teqblazeUtils.js +1 -1
  156. package/dist/terceptAnalyticsAdapter.js +1 -1
  157. package/dist/themoneytizerBidAdapter.js +1 -1
  158. package/dist/trionBidAdapter.js +1 -1
  159. package/dist/tripleliftBidAdapter.js +1 -1
  160. package/dist/ttdBidAdapter.js +1 -1
  161. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  162. package/dist/uid2IdSystem.js +1 -1
  163. package/dist/uid2IdSystem_shared.js +1 -1
  164. package/dist/underdogmediaBidAdapter.js +1 -1
  165. package/dist/undertoneBidAdapter.js +1 -1
  166. package/dist/unrulyBidAdapter.js +1 -1
  167. package/dist/viantOrtbBidAdapter.js +1 -1
  168. package/dist/vidazooUtils.js +1 -1
  169. package/dist/videobyteBidAdapter.js +1 -1
  170. package/dist/visxBidAdapter.js +1 -1
  171. package/dist/vuukleBidAdapter.js +1 -1
  172. package/dist/widespaceBidAdapter.js +1 -1
  173. package/dist/winrBidAdapter.js +1 -1
  174. package/dist/wurflRtdProvider.js +1 -0
  175. package/dist/yahooAdsBidAdapter.js +1 -1
  176. package/dist/yieldmoBidAdapter.js +1 -1
  177. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  178. package/integrationExamples/gpt/wurflRtdProvider_example.html +106 -0
  179. package/libraries/connectionInfo/connectionUtils.js +33 -0
  180. package/libraries/ortbConverter/processors/video.js +2 -24
  181. package/libraries/riseUtils/index.js +331 -0
  182. package/libraries/teqblazeUtils/bidderUtils.js +15 -11
  183. package/libraries/vidazooUtils/bidderUtils.js +16 -0
  184. package/modules/.submodules.json +3 -1
  185. package/modules/51DegreesRtdProvider.md +11 -7
  186. package/modules/adagioAnalyticsAdapter.js +101 -84
  187. package/modules/adagioAnalyticsAdapter.md +4 -0
  188. package/modules/adagioBidAdapter.js +14 -66
  189. package/modules/adkernelBidAdapter.js +2 -2
  190. package/modules/aidemBidAdapter.js +2 -0
  191. package/modules/appnexusBidAdapter.js +1 -1
  192. package/modules/cleanmedianetBidAdapter.js +1 -1
  193. package/modules/connectIdSystem.js +5 -3
  194. package/modules/dailymotionBidAdapter.js +19 -0
  195. package/modules/docereeAdManagerBidAdapter.js +9 -12
  196. package/modules/gamoshiBidAdapter.js +1 -1
  197. package/modules/greenbidsAnalyticsAdapter.js +7 -4
  198. package/modules/greenbidsRtdProvider.js +15 -5
  199. package/modules/id5IdSystem.js +14 -93
  200. package/modules/idImportLibrary.js +14 -6
  201. package/modules/insticatorBidAdapter.js +35 -31
  202. package/modules/kargoBidAdapter.js +11 -14
  203. package/modules/kimberliteBidAdapter.js +24 -7
  204. package/modules/kimberliteBidAdapter.md +30 -1
  205. package/modules/minutemediaBidAdapter.js +21 -398
  206. package/modules/mobianRtdProvider.js +28 -14
  207. package/modules/nexx360BidAdapter.js +3 -2
  208. package/modules/openwebBidAdapter.js +18 -396
  209. package/modules/ownadxBidAdapter.js +99 -0
  210. package/modules/prismaBidAdapter.js +1 -27
  211. package/modules/publirBidAdapter.js +20 -273
  212. package/modules/pubmaticBidAdapter.js +2 -1
  213. package/modules/resetdigitalBidAdapter.md +54 -45
  214. package/modules/riseBidAdapter.js +19 -400
  215. package/modules/sharethroughBidAdapter.js +5 -0
  216. package/modules/shinezBidAdapter.js +17 -361
  217. package/modules/smarthubBidAdapter.js +45 -177
  218. package/modules/stnBidAdapter.js +22 -398
  219. package/modules/telariaBidAdapter.js +2 -32
  220. package/modules/ttdBidAdapter.js +14 -32
  221. package/modules/uid2IdSystem_shared.js +51 -39
  222. package/modules/viantOrtbBidAdapter.js +1 -1
  223. package/modules/wurflRtdProvider.js +213 -0
  224. package/modules/wurflRtdProvider.md +67 -0
  225. package/package.json +1 -1
  226. package/src/adloader.js +1 -0
  227. package/src/prebid.js +6 -1
  228. package/src/video.js +78 -1
  229. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
  230. package/test/spec/modules/adagioBidAdapter_spec.js +32 -67
  231. package/test/spec/modules/appnexusBidAdapter_spec.js +0 -33
  232. package/test/spec/modules/cleanmedianetBidAdapter_spec.js +1 -1
  233. package/test/spec/modules/connectIdSystem_spec.js +27 -28
  234. package/test/spec/modules/dailymotionBidAdapter_spec.js +50 -0
  235. package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +1 -0
  236. package/test/spec/modules/gamoshiBidAdapter_spec.js +1 -1
  237. package/test/spec/modules/id5IdSystem_spec.js +25 -98
  238. package/test/spec/modules/idImportLibrary_spec.js +14 -0
  239. package/test/spec/modules/insticatorBidAdapter_spec.js +8 -1
  240. package/test/spec/modules/kargoBidAdapter_spec.js +7 -8
  241. package/test/spec/modules/kimberliteBidAdapter_spec.js +137 -65
  242. package/test/spec/modules/mobianRtdProvider_spec.js +46 -43
  243. package/test/spec/modules/nexx360BidAdapter_spec.js +1 -1
  244. package/test/spec/modules/ownadxBidAdapter_spec.js +103 -0
  245. package/test/spec/modules/pubmaticBidAdapter_spec.js +18 -0
  246. package/test/spec/modules/sharethroughBidAdapter_spec.js +35 -0
  247. package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
  248. package/test/spec/modules/ttdBidAdapter_spec.js +10 -1
  249. package/test/spec/modules/viantOrtbBidAdapter_spec.js +1 -1
  250. package/test/spec/modules/vidazooBidAdapter_spec.js +12 -4
  251. package/test/spec/modules/wurflRtdProvider_spec.js +324 -0
  252. package/test/spec/unit/pbjs_api_spec.js +11 -0
  253. package/test/spec/video_spec.js +103 -1
@@ -2,18 +2,17 @@ import {
2
2
  logWarn,
3
3
  logInfo,
4
4
  isArray,
5
- isFn,
6
5
  deepAccess,
7
- isEmpty,
8
- contains,
9
- timestamp,
10
6
  triggerPixel,
11
- isInteger,
12
- getBidIdParameter
13
7
  } from '../src/utils.js';
14
- import {registerBidder} from '../src/adapters/bidderFactory.js';
15
- import {BANNER, VIDEO} from '../src/mediaTypes.js';
16
- import {config} from '../src/config.js';
8
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
9
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
10
+ import {
11
+ getEndpoint,
12
+ generateBidsParams,
13
+ generateGeneralParams,
14
+ buildBidResponse,
15
+ } from '../libraries/riseUtils/index.js';
17
16
 
18
17
  const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
19
18
  const BIDDER_CODE = 'rise';
@@ -21,15 +20,11 @@ const ADAPTER_VERSION = '6.0.0';
21
20
  const TTL = 360;
22
21
  const DEFAULT_CURRENCY = 'USD';
23
22
  const DEFAULT_GVLID = 1043;
24
- const DEFAULT_SELLER_ENDPOINT = 'https://hb.yellowblue.io/';
23
+ const BASE_URL = 'https://hb.yellowblue.io/';
25
24
  const MODES = {
26
25
  PRODUCTION: 'hb-multi',
27
26
  TEST: 'hb-multi-test'
28
- }
29
- const SUPPORTED_SYNC_METHODS = {
30
- IFRAME: 'iframe',
31
- PIXEL: 'pixel'
32
- }
27
+ };
33
28
 
34
29
  export const spec = {
35
30
  code: BIDDER_CODE,
@@ -59,48 +54,23 @@ export const spec = {
59
54
  // use data from the first bid, to create the general params for all bids
60
55
  const generalObject = validBidRequests[0];
61
56
  const testMode = generalObject.params.testMode;
62
- const rtbDomain = generalObject.params.rtbDomain;
57
+ const rtbDomain = generalObject.params.rtbDomain || BASE_URL;
63
58
 
64
59
  combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest);
65
60
  combinedRequestsObject.bids = generateBidsParams(validBidRequests, bidderRequest);
66
61
 
67
62
  return {
68
63
  method: 'POST',
69
- url: getEndpoint(testMode, rtbDomain),
64
+ url: getEndpoint(testMode, rtbDomain, MODES),
70
65
  data: combinedRequestsObject
71
66
  }
72
67
  },
73
- interpretResponse: function ({body}) {
68
+ interpretResponse: function ({ body }) {
74
69
  const bidResponses = [];
75
70
 
76
71
  if (body.bids) {
77
72
  body.bids.forEach(adUnit => {
78
- const bidResponse = {
79
- requestId: adUnit.requestId,
80
- cpm: adUnit.cpm,
81
- currency: adUnit.currency || DEFAULT_CURRENCY,
82
- width: adUnit.width,
83
- height: adUnit.height,
84
- ttl: adUnit.ttl || TTL,
85
- creativeId: adUnit.creativeId,
86
- netRevenue: adUnit.netRevenue || true,
87
- nurl: adUnit.nurl,
88
- mediaType: adUnit.mediaType,
89
- meta: {
90
- mediaType: adUnit.mediaType
91
- }
92
- };
93
-
94
- if (adUnit.mediaType === VIDEO) {
95
- bidResponse.vastXml = adUnit.vastXml;
96
- } else if (adUnit.mediaType === BANNER) {
97
- bidResponse.ad = adUnit.ad;
98
- }
99
-
100
- if (adUnit.adomain && adUnit.adomain.length) {
101
- bidResponse.meta.advertiserDomains = adUnit.adomain;
102
- }
103
-
73
+ const bidResponse = buildBidResponse(adUnit, DEFAULT_CURRENCY, TTL, VIDEO, BANNER);
104
74
  bidResponses.push(bidResponse);
105
75
  });
106
76
  }
@@ -110,20 +80,20 @@ export const spec = {
110
80
  getUserSyncs: function (syncOptions, serverResponses) {
111
81
  const syncs = [];
112
82
  for (const response of serverResponses) {
113
- if (syncOptions.iframeEnabled && response.body.params.userSyncURL) {
83
+ if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
114
84
  syncs.push({
115
85
  type: 'iframe',
116
- url: response.body.params.userSyncURL
86
+ url: deepAccess(response, 'body.params.userSyncURL')
117
87
  });
118
88
  }
119
- if (syncOptions.pixelEnabled && isArray(response.body.params.userSyncPixels)) {
89
+ if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
120
90
  const pixels = response.body.params.userSyncPixels.map(pixel => {
121
91
  return {
122
92
  type: 'image',
123
93
  url: pixel
124
94
  }
125
- })
126
- syncs.push(...pixels)
95
+ });
96
+ syncs.push(...pixels);
127
97
  }
128
98
  }
129
99
  return syncs;
@@ -141,354 +111,3 @@ export const spec = {
141
111
  };
142
112
 
143
113
  registerBidder(spec);
144
-
145
- /**
146
- * Get floor price
147
- * @param bid {bid}
148
- * @param mediaType {string}
149
- * @returns {Number}
150
- */
151
- function getFloor(bid, mediaType) {
152
- if (!isFn(bid.getFloor)) {
153
- return 0;
154
- }
155
- let floorResult = bid.getFloor({
156
- currency: DEFAULT_CURRENCY,
157
- mediaType: mediaType,
158
- size: '*'
159
- });
160
- return floorResult.currency === DEFAULT_CURRENCY && floorResult.floor ? floorResult.floor : 0;
161
- }
162
-
163
- /**
164
- * Get the the ad sizes array from the bid
165
- * @param bid {bid}
166
- * @returns {Array}
167
- */
168
- function getSizesArray(bid, mediaType) {
169
- let sizesArray = []
170
-
171
- if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
172
- sizesArray = bid.mediaTypes[mediaType].sizes;
173
- } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
174
- sizesArray = bid.sizes;
175
- }
176
-
177
- return sizesArray;
178
- }
179
-
180
- /**
181
- * Get schain string value
182
- * @param schainObject {Object}
183
- * @returns {string}
184
- */
185
- function getSupplyChain(schainObject) {
186
- if (isEmpty(schainObject)) {
187
- return '';
188
- }
189
- let scStr = `${schainObject.ver},${schainObject.complete}`;
190
- schainObject.nodes.forEach((node) => {
191
- scStr += '!';
192
- scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
193
- scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
194
- scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
195
- scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
196
- scStr += `${getEncodedValIfNotEmpty(node.name)},`;
197
- scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
198
- });
199
- return scStr;
200
- }
201
-
202
- /**
203
- * Get encoded node value
204
- * @param val {string}
205
- * @returns {string}
206
- */
207
- function getEncodedValIfNotEmpty(val) {
208
- return !isEmpty(val) ? encodeURIComponent(val) : '';
209
- }
210
-
211
- /**
212
- * Get preferred user-sync method based on publisher configuration
213
- * @param bidderCode {string}
214
- * @returns {string}
215
- */
216
- function getAllowedSyncMethod(filterSettings, bidderCode) {
217
- const iframeConfigsToCheck = ['all', 'iframe'];
218
- const pixelConfigToCheck = 'image';
219
- if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
220
- return SUPPORTED_SYNC_METHODS.IFRAME;
221
- }
222
- if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
223
- return SUPPORTED_SYNC_METHODS.PIXEL;
224
- }
225
- }
226
-
227
- /**
228
- * Check if sync rule is supported
229
- * @param syncRule {Object}
230
- * @param bidderCode {string}
231
- * @returns {boolean}
232
- */
233
- function isSyncMethodAllowed(syncRule, bidderCode) {
234
- if (!syncRule) {
235
- return false;
236
- }
237
- const isInclude = syncRule.filter === 'include';
238
- const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
239
- return isInclude && contains(bidders, bidderCode);
240
- }
241
-
242
- /**
243
- * Get the seller endpoint
244
- * @param testMode {boolean}
245
- * @param rtbDomain {string}
246
- * @returns {string}
247
- */
248
- function getEndpoint(testMode, rtbDomain) {
249
- const SELLER_ENDPOINT = rtbDomain ? `https://${rtbDomain}/` : DEFAULT_SELLER_ENDPOINT;
250
- return testMode
251
- ? SELLER_ENDPOINT + MODES.TEST
252
- : SELLER_ENDPOINT + MODES.PRODUCTION;
253
- }
254
-
255
- /**
256
- * get device type
257
- * @param uad {ua}
258
- * @returns {string}
259
- */
260
- function getDeviceType(ua) {
261
- if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
262
- .test(ua.toLowerCase())) {
263
- return '5';
264
- }
265
- if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
266
- .test(ua.toLowerCase())) {
267
- return '4';
268
- }
269
- if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
270
- .test(ua.toLowerCase())) {
271
- return '3';
272
- }
273
- return '1';
274
- }
275
-
276
- function generateBidsParams(validBidRequests, bidderRequest) {
277
- const bidsArray = [];
278
-
279
- if (validBidRequests.length) {
280
- validBidRequests.forEach(bid => {
281
- bidsArray.push(generateBidParameters(bid, bidderRequest));
282
- });
283
- }
284
-
285
- return bidsArray;
286
- }
287
-
288
- /**
289
- * Generate bid specific parameters
290
- * @param {bid} bid
291
- * @param {bidderRequest} bidderRequest
292
- * @returns {Object} bid specific params object
293
- */
294
- function generateBidParameters(bid, bidderRequest) {
295
- const {params} = bid;
296
- const mediaType = isBanner(bid) ? BANNER : VIDEO;
297
- const sizesArray = getSizesArray(bid, mediaType);
298
- // fix floor price in case of NAN
299
- if (isNaN(params.floorPrice)) {
300
- params.floorPrice = 0;
301
- }
302
-
303
- const bidObject = {
304
- mediaType,
305
- adUnitCode: getBidIdParameter('adUnitCode', bid),
306
- sizes: sizesArray,
307
- floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
308
- bidId: getBidIdParameter('bidId', bid),
309
- bidderRequestId: getBidIdParameter('bidderRequestId', bid),
310
- loop: getBidIdParameter('bidderRequestsCount', bid),
311
- transactionId: bid.ortb2Imp?.ext?.tid,
312
- coppa: 0,
313
- };
314
-
315
- const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
316
- if (pos) {
317
- bidObject.pos = pos;
318
- }
319
-
320
- const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
321
- if (gpid) {
322
- bidObject.gpid = gpid;
323
- }
324
-
325
- const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
326
- if (placementId) {
327
- bidObject.placementId = placementId;
328
- }
329
-
330
- const mimes = deepAccess(bid, `mediaTypes.${mediaType}.mimes`);
331
- if (mimes) {
332
- bidObject.mimes = mimes;
333
- }
334
-
335
- const api = deepAccess(bid, `mediaTypes.${mediaType}.api`);
336
- if (api) {
337
- bidObject.api = api;
338
- }
339
-
340
- const sua = deepAccess(bid, `ortb2.device.sua`);
341
- if (sua) {
342
- bidObject.sua = sua;
343
- }
344
-
345
- const coppa = deepAccess(bid, `ortb2.regs.coppa`)
346
- if (coppa) {
347
- bidObject.coppa = 1;
348
- }
349
-
350
- if (mediaType === VIDEO) {
351
- const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
352
- let playbackMethodValue;
353
-
354
- // verify playbackMethod is of type integer array, or integer only.
355
- if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
356
- // only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
357
- playbackMethodValue = playbackMethod[0];
358
- } else if (isInteger(playbackMethod)) {
359
- playbackMethodValue = playbackMethod;
360
- }
361
-
362
- if (playbackMethodValue) {
363
- bidObject.playbackMethod = playbackMethodValue;
364
- }
365
-
366
- const placement = deepAccess(bid, `mediaTypes.video.placement`);
367
- if (placement) {
368
- bidObject.placement = placement;
369
- }
370
-
371
- const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
372
- if (minDuration) {
373
- bidObject.minDuration = minDuration;
374
- }
375
-
376
- const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
377
- if (maxDuration) {
378
- bidObject.maxDuration = maxDuration;
379
- }
380
-
381
- const skip = deepAccess(bid, `mediaTypes.video.skip`);
382
- if (skip) {
383
- bidObject.skip = skip;
384
- }
385
-
386
- const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
387
- if (linearity) {
388
- bidObject.linearity = linearity;
389
- }
390
-
391
- const protocols = deepAccess(bid, `mediaTypes.video.protocols`);
392
- if (protocols) {
393
- bidObject.protocols = protocols;
394
- }
395
-
396
- const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
397
- if (plcmt) {
398
- bidObject.plcmt = plcmt;
399
- }
400
- }
401
-
402
- return bidObject;
403
- }
404
-
405
- function isBanner(bid) {
406
- return bid.mediaTypes && bid.mediaTypes.banner;
407
- }
408
-
409
- /**
410
- * Generate params that are common between all bids
411
- * @param {single bid object} generalObject
412
- * @param {bidderRequest} bidderRequest
413
- * @returns {object} the common params object
414
- */
415
- function generateGeneralParams(generalObject, bidderRequest) {
416
- const domain = window.location.hostname;
417
- const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
418
- const {bidderCode} = bidderRequest;
419
- const generalBidParams = generalObject.params;
420
- const timeout = bidderRequest.timeout;
421
-
422
- // these params are snake_case instead of camelCase to allow backwards compatability on the server.
423
- // in the future, these will be converted to camelCase to match our convention.
424
- const generalParams = {
425
- wrapper_type: 'prebidjs',
426
- wrapper_vendor: '$$PREBID_GLOBAL$$',
427
- wrapper_version: '$prebid.version$',
428
- adapter_version: ADAPTER_VERSION,
429
- auction_start: timestamp(),
430
- publisher_id: generalBidParams.org,
431
- publisher_name: domain,
432
- site_domain: domain,
433
- dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
434
- device_type: getDeviceType(navigator.userAgent),
435
- ua: navigator.userAgent,
436
- is_wrapper: !!generalBidParams.isWrapper,
437
- session_id: generalBidParams.sessionId || getBidIdParameter('bidderRequestId', generalObject),
438
- tmax: timeout
439
- };
440
-
441
- const userIdsParam = getBidIdParameter('userId', generalObject);
442
- if (userIdsParam) {
443
- generalParams.userIds = JSON.stringify(userIdsParam);
444
- }
445
-
446
- const ortb2Metadata = bidderRequest.ortb2 || {};
447
- if (ortb2Metadata.site) {
448
- generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
449
- }
450
- if (ortb2Metadata.user) {
451
- generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
452
- }
453
-
454
- if (syncEnabled) {
455
- const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
456
- if (allowedSyncMethod) {
457
- generalParams.cs_method = allowedSyncMethod;
458
- }
459
- }
460
-
461
- if (bidderRequest.uspConsent) {
462
- generalParams.us_privacy = bidderRequest.uspConsent;
463
- }
464
-
465
- if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
466
- generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
467
- generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
468
- }
469
-
470
- if (bidderRequest && bidderRequest.gppConsent) {
471
- generalParams.gpp = bidderRequest.gppConsent.gppString;
472
- generalParams.gpp_sid = bidderRequest.gppConsent.applicableSections;
473
- } else if (bidderRequest.ortb2?.regs?.gpp) {
474
- generalParams.gpp = bidderRequest.ortb2.regs.gpp;
475
- generalParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid;
476
- }
477
-
478
- if (generalBidParams.ifa) {
479
- generalParams.ifa = generalBidParams.ifa;
480
- }
481
-
482
- if (generalObject.schain) {
483
- generalParams.schain = getSupplyChain(generalObject.schain);
484
- }
485
-
486
- if (bidderRequest && bidderRequest.refererInfo) {
487
- // TODO: is 'ref' the right value here?
488
- generalParams.referrer = deepAccess(bidderRequest, 'refererInfo.ref');
489
- // TODO: does the fallback make sense here?
490
- generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || deepAccess(window, 'location.href');
491
- }
492
-
493
- return generalParams;
494
- }
@@ -68,6 +68,11 @@ export const sharethroughAdapterSpec = {
68
68
  req.device.ext['cdep'] = bidderRequest.ortb2.device.ext.cdep;
69
69
  }
70
70
 
71
+ // if present, merge device object from ortb2 into `req.device`
72
+ if (bidderRequest?.ortb2?.device) {
73
+ mergeDeep(req.device, bidderRequest.ortb2.device);
74
+ }
75
+
71
76
  req.user = nullish(firstPartyData.user, {});
72
77
  if (!req.user.ext) req.user.ext = {};
73
78
  req.user.ext.eids = bidRequests[0].userIdAsEids || [];