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,33 +2,28 @@ 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 = 'shinez';
20
19
  const ADAPTER_VERSION = '1.0.0';
21
20
  const TTL = 360;
22
21
  const CURRENCY = 'USD';
23
- const SELLER_ENDPOINT = 'https://hb.sweetgum.io/';
22
+ const BASE_URL = 'https://hb.sweetgum.io/';
24
23
  const MODES = {
25
24
  PRODUCTION: 'hb-sz-multi',
26
25
  TEST: 'hb-multi-sz-test'
27
- }
28
- const SUPPORTED_SYNC_METHODS = {
29
- IFRAME: 'iframe',
30
- PIXEL: 'pixel'
31
- }
26
+ };
32
27
 
33
28
  export const spec = {
34
29
  code: BIDDER_CODE,
@@ -59,7 +54,7 @@ export const spec = {
59
54
 
60
55
  return {
61
56
  method: 'POST',
62
- url: getEndpoint(testMode),
57
+ url: getEndpoint(testMode, BASE_URL, MODES),
63
58
  data: combinedRequestsObject
64
59
  }
65
60
  },
@@ -68,32 +63,7 @@ export const spec = {
68
63
 
69
64
  if (body.bids) {
70
65
  body.bids.forEach(adUnit => {
71
- const bidResponse = {
72
- requestId: adUnit.requestId,
73
- cpm: adUnit.cpm,
74
- currency: adUnit.currency || CURRENCY,
75
- width: adUnit.width,
76
- height: adUnit.height,
77
- ttl: adUnit.ttl || TTL,
78
- creativeId: adUnit.requestId,
79
- netRevenue: adUnit.netRevenue || true,
80
- nurl: adUnit.nurl,
81
- mediaType: adUnit.mediaType,
82
- meta: {
83
- mediaType: adUnit.mediaType
84
- }
85
- };
86
-
87
- if (adUnit.mediaType === VIDEO) {
88
- bidResponse.vastXml = adUnit.vastXml;
89
- } else if (adUnit.mediaType === BANNER) {
90
- bidResponse.ad = adUnit.ad;
91
- }
92
-
93
- if (adUnit.adomain && adUnit.adomain.length) {
94
- bidResponse.meta.advertiserDomains = adUnit.adomain;
95
- }
96
-
66
+ const bidResponse = buildBidResponse(adUnit, CURRENCY, TTL, VIDEO, BANNER);
97
67
  bidResponses.push(bidResponse);
98
68
  });
99
69
  }
@@ -103,20 +73,20 @@ export const spec = {
103
73
  getUserSyncs: function (syncOptions, serverResponses) {
104
74
  const syncs = [];
105
75
  for (const response of serverResponses) {
106
- if (syncOptions.iframeEnabled && response.body.params.userSyncURL) {
76
+ if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
107
77
  syncs.push({
108
78
  type: 'iframe',
109
- url: response.body.params.userSyncURL
79
+ url: deepAccess(response, 'body.params.userSyncURL')
110
80
  });
111
81
  }
112
- if (syncOptions.pixelEnabled && isArray(response.body.params.userSyncPixels)) {
82
+ if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
113
83
  const pixels = response.body.params.userSyncPixels.map(pixel => {
114
84
  return {
115
85
  type: 'image',
116
86
  url: pixel
117
87
  }
118
- })
119
- syncs.push(...pixels)
88
+ });
89
+ syncs.push(...pixels);
120
90
  }
121
91
  }
122
92
  return syncs;
@@ -134,317 +104,3 @@ export const spec = {
134
104
  };
135
105
 
136
106
  registerBidder(spec);
137
-
138
- /**
139
- * Get floor price
140
- * @param bid {bid}
141
- * @returns {Number}
142
- */
143
- function getFloor(bid, mediaType) {
144
- if (!isFn(bid.getFloor)) {
145
- return 0;
146
- }
147
- let floorResult = bid.getFloor({
148
- currency: CURRENCY,
149
- mediaType: mediaType,
150
- size: '*'
151
- });
152
- return floorResult.currency === CURRENCY && floorResult.floor ? floorResult.floor : 0;
153
- }
154
-
155
- /**
156
- * Get the the ad sizes array from the bid
157
- * @param bid {bid}
158
- * @returns {Array}
159
- */
160
- function getSizesArray(bid, mediaType) {
161
- let sizesArray = []
162
-
163
- if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
164
- sizesArray = bid.mediaTypes[mediaType].sizes;
165
- } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
166
- sizesArray = bid.sizes;
167
- }
168
-
169
- return sizesArray;
170
- }
171
-
172
- /**
173
- * Get schain string value
174
- * @param schainObject {Object}
175
- * @returns {string}
176
- */
177
- function getSupplyChain(schainObject) {
178
- if (isEmpty(schainObject)) {
179
- return '';
180
- }
181
- let scStr = `${schainObject.ver},${schainObject.complete}`;
182
- schainObject.nodes.forEach((node) => {
183
- scStr += '!';
184
- scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
185
- scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
186
- scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
187
- scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
188
- scStr += `${getEncodedValIfNotEmpty(node.name)},`;
189
- scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
190
- });
191
- return scStr;
192
- }
193
-
194
- /**
195
- * Get encoded node value
196
- * @param val {string}
197
- * @returns {string}
198
- */
199
- function getEncodedValIfNotEmpty(val) {
200
- return !isEmpty(val) ? encodeURIComponent(val) : '';
201
- }
202
-
203
- /**
204
- * Get preferred user-sync method based on publisher configuration
205
- * @param bidderCode {string}
206
- * @returns {string}
207
- */
208
- function getAllowedSyncMethod(filterSettings, bidderCode) {
209
- const iframeConfigsToCheck = ['all', 'iframe'];
210
- const pixelConfigToCheck = 'image';
211
- if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
212
- return SUPPORTED_SYNC_METHODS.IFRAME;
213
- }
214
- if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
215
- return SUPPORTED_SYNC_METHODS.PIXEL;
216
- }
217
- }
218
-
219
- /**
220
- * Check if sync rule is supported
221
- * @param syncRule {Object}
222
- * @param bidderCode {string}
223
- * @returns {boolean}
224
- */
225
- function isSyncMethodAllowed(syncRule, bidderCode) {
226
- if (!syncRule) {
227
- return false;
228
- }
229
- const isInclude = syncRule.filter === 'include';
230
- const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
231
- return isInclude && contains(bidders, bidderCode);
232
- }
233
-
234
- /**
235
- * Get the seller endpoint
236
- * @param testMode {boolean}
237
- * @returns {string}
238
- */
239
- function getEndpoint(testMode) {
240
- return testMode
241
- ? SELLER_ENDPOINT + MODES.TEST
242
- : SELLER_ENDPOINT + MODES.PRODUCTION;
243
- }
244
-
245
- /**
246
- * get device type
247
- * @param uad {ua}
248
- * @returns {string}
249
- */
250
- function getDeviceType(ua) {
251
- if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
252
- .test(ua.toLowerCase())) {
253
- return '5';
254
- }
255
- if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
256
- .test(ua.toLowerCase())) {
257
- return '4';
258
- }
259
- if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
260
- .test(ua.toLowerCase())) {
261
- return '3';
262
- }
263
- return '1';
264
- }
265
-
266
- function generateBidsParams(validBidRequests, bidderRequest) {
267
- const bidsArray = [];
268
-
269
- if (validBidRequests.length) {
270
- validBidRequests.forEach(bid => {
271
- bidsArray.push(generateBidParameters(bid, bidderRequest));
272
- });
273
- }
274
-
275
- return bidsArray;
276
- }
277
-
278
- /**
279
- * Generate bid specific parameters
280
- * @param {bid} bid
281
- * @param {bidderRequest} bidderRequest
282
- * @returns {Object} bid specific params object
283
- */
284
- function generateBidParameters(bid, bidderRequest) {
285
- const {params} = bid;
286
- const mediaType = isBanner(bid) ? BANNER : VIDEO;
287
- const sizesArray = getSizesArray(bid, mediaType);
288
-
289
- // fix floor price in case of NAN
290
- if (isNaN(params.floorPrice)) {
291
- params.floorPrice = 0;
292
- }
293
-
294
- const bidObject = {
295
- mediaType,
296
- adUnitCode: getBidIdParameter('adUnitCode', bid),
297
- sizes: sizesArray,
298
- floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
299
- bidId: getBidIdParameter('bidId', bid),
300
- bidderRequestId: getBidIdParameter('bidderRequestId', bid),
301
- transactionId: bid.ortb2Imp?.ext?.tid || '',
302
- };
303
-
304
- const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
305
- if (pos) {
306
- bidObject.pos = pos;
307
- }
308
-
309
- const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
310
- if (gpid) {
311
- bidObject.gpid = gpid;
312
- }
313
-
314
- const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
315
- if (placementId) {
316
- bidObject.placementId = placementId;
317
- }
318
-
319
- if (mediaType === VIDEO) {
320
- const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
321
- let playbackMethodValue;
322
-
323
- // verify playbackMethod is of type integer array, or integer only.
324
- if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
325
- // only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
326
- playbackMethodValue = playbackMethod[0];
327
- } else if (isInteger(playbackMethod)) {
328
- playbackMethodValue = playbackMethod;
329
- }
330
-
331
- if (playbackMethodValue) {
332
- bidObject.playbackMethod = playbackMethodValue;
333
- }
334
-
335
- const placement = deepAccess(bid, `mediaTypes.video.placement`);
336
- if (placement) {
337
- bidObject.placement = placement;
338
- }
339
- const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
340
- if (plcmt) {
341
- bidObject.plcmt = plcmt;
342
- }
343
- const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
344
- if (minDuration) {
345
- bidObject.minDuration = minDuration;
346
- }
347
-
348
- const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
349
- if (maxDuration) {
350
- bidObject.maxDuration = maxDuration;
351
- }
352
-
353
- const skip = deepAccess(bid, `mediaTypes.video.skip`);
354
- if (skip) {
355
- bidObject.skip = skip;
356
- }
357
-
358
- const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
359
- if (linearity) {
360
- bidObject.linearity = linearity;
361
- }
362
- }
363
-
364
- return bidObject;
365
- }
366
-
367
- function isBanner(bid) {
368
- return bid.mediaTypes && bid.mediaTypes.banner;
369
- }
370
-
371
- /**
372
- * Generate params that are common between all bids
373
- * @param {single bid object} generalObject
374
- * @param {bidderRequest} bidderRequest
375
- * @returns {object} the common params object
376
- */
377
- function generateGeneralParams(generalObject, bidderRequest) {
378
- const domain = window.location.hostname;
379
- const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
380
- const {bidderCode} = bidderRequest;
381
- const generalBidParams = generalObject.params;
382
- const timeout = bidderRequest.timeout;
383
-
384
- // these params are snake_case instead of camelCase to allow backwards compatability on the server.
385
- // in the future, these will be converted to camelCase to match our convention.
386
- const generalParams = {
387
- wrapper_type: 'prebidjs',
388
- wrapper_vendor: '$$PREBID_GLOBAL$$',
389
- wrapper_version: '$prebid.version$',
390
- adapter_version: ADAPTER_VERSION,
391
- auction_start: timestamp(),
392
- publisher_id: generalBidParams.org,
393
- publisher_name: domain,
394
- site_domain: domain,
395
- dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
396
- device_type: getDeviceType(navigator.userAgent),
397
- ua: navigator.userAgent,
398
- session_id: getBidIdParameter('auctionId', generalObject),
399
- tmax: timeout
400
- };
401
-
402
- const userIdsParam = getBidIdParameter('userId', generalObject);
403
- if (userIdsParam) {
404
- generalParams.userIds = JSON.stringify(userIdsParam);
405
- }
406
-
407
- const ortb2Metadata = bidderRequest.ortb2 || {};
408
- if (ortb2Metadata.site) {
409
- generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
410
- }
411
- if (ortb2Metadata.user) {
412
- generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
413
- }
414
-
415
- if (syncEnabled) {
416
- const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
417
- if (allowedSyncMethod) {
418
- generalParams.cs_method = allowedSyncMethod;
419
- }
420
- }
421
-
422
- if (bidderRequest.uspConsent) {
423
- generalParams.us_privacy = bidderRequest.uspConsent;
424
- }
425
-
426
- if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
427
- generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
428
- generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
429
- }
430
-
431
- if (generalBidParams.ifa) {
432
- generalParams.ifa = generalBidParams.ifa;
433
- }
434
-
435
- if (generalObject.schain) {
436
- generalParams.schain = getSupplyChain(generalObject.schain);
437
- }
438
-
439
- if (bidderRequest.ortb2 && bidderRequest.ortb2.site) {
440
- generalParams.referrer = bidderRequest.ortb2.site.ref;
441
- generalParams.page_url = bidderRequest.ortb2.site.page;
442
- }
443
-
444
- if (bidderRequest && bidderRequest.refererInfo) {
445
- generalParams.referrer = generalParams.referrer || deepAccess(bidderRequest, 'refererInfo.referer');
446
- generalParams.page_url = generalParams.page_url || config.getConfig('pageUrl') || deepAccess(window, 'location.href');
447
- }
448
-
449
- return generalParams;
450
- }
@@ -1,23 +1,28 @@
1
- import {deepAccess, isFn, logError, logMessage} from '../src/utils.js';
2
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
2
  import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
4
- import {config} from '../src/config.js';
5
- import {convertOrtbRequestToProprietaryNative} from '../src/native.js';
3
+ import {
4
+ buildPlacementProcessingFunction,
5
+ buildRequestsBase,
6
+ interpretResponseBuilder,
7
+ isBidRequestValid
8
+ } from '../libraries/teqblazeUtils/bidderUtils.js';
6
9
 
7
10
  const BIDDER_CODE = 'smarthub';
8
11
  const ALIASES = [
9
12
  {code: 'markapp', skipPbsAliasing: true},
10
13
  {code: 'jdpmedia', skipPbsAliasing: true},
11
14
  {code: 'tredio', skipPbsAliasing: true},
15
+ {code: 'vimayx', skipPbsAliasing: true},
12
16
  ];
13
17
  const BASE_URLS = {
14
18
  smarthub: 'https://prebid.smart-hub.io/pbjs',
15
19
  markapp: 'https://markapp-prebid.smart-hub.io/pbjs',
16
20
  jdpmedia: 'https://jdpmedia-prebid.smart-hub.io/pbjs',
17
- tredio: 'https://tredio-prebid.smart-hub.io/pbjs'
21
+ tredio: 'https://tredio-prebid.smart-hub.io/pbjs',
22
+ vimayx: 'https://vimayx-prebid.smart-hub.io/pbjs',
18
23
  };
19
24
 
20
- function getUrl(partnerName) {
25
+ const _getUrl = (partnerName) => {
21
26
  const aliases = ALIASES.map(el => el.code);
22
27
  if (aliases.includes(partnerName)) {
23
28
  return BASE_URLS[partnerName];
@@ -26,187 +31,50 @@ function getUrl(partnerName) {
26
31
  return `${BASE_URLS[BIDDER_CODE]}?partnerName=${partnerName}`;
27
32
  }
28
33
 
29
- function isBidResponseValid(bid) {
30
- if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency || !bid.hasOwnProperty('netRevenue')) {
31
- return false;
32
- }
33
- switch (bid.mediaType) {
34
- case BANNER:
35
- return Boolean(bid.width && bid.height && bid.ad);
36
- case VIDEO:
37
- return Boolean(bid.width && bid.height && (bid.vastUrl || bid.vastXml));
38
- case NATIVE:
39
- return Boolean(bid.native && bid.native.impressionTrackers && bid.native.impressionTrackers.length);
40
- default:
41
- return false;
42
- }
43
- }
44
-
45
- function getPlacementReqData(bid) {
46
- const { params, bidId, mediaTypes, bidder } = bid;
47
- const schain = bid.schain || {};
48
- const { partnerName, seat, token, iabCat, minBidfloor, pos } = params;
49
- const bidfloor = getBidFloor(bid);
50
-
51
- const plcmt = {
52
- partnerName: String(partnerName || bidder).toLowerCase(),
53
- seat,
54
- token,
55
- iabCat,
56
- minBidfloor,
57
- pos,
58
- bidId,
59
- schain,
60
- bidfloor,
61
- };
62
-
63
- if (mediaTypes && mediaTypes[BANNER]) {
64
- plcmt.adFormat = BANNER;
65
- plcmt.sizes = mediaTypes[BANNER].sizes;
66
- } else if (mediaTypes && mediaTypes[VIDEO]) {
67
- plcmt.adFormat = VIDEO;
68
- plcmt.playerSize = mediaTypes[VIDEO].playerSize;
69
- plcmt.minduration = mediaTypes[VIDEO].minduration;
70
- plcmt.maxduration = mediaTypes[VIDEO].maxduration;
71
- plcmt.mimes = mediaTypes[VIDEO].mimes;
72
- plcmt.protocols = mediaTypes[VIDEO].protocols;
73
- plcmt.startdelay = mediaTypes[VIDEO].startdelay;
74
- plcmt.placement = mediaTypes[VIDEO].plcmt;
75
- plcmt.plcmt = mediaTypes[VIDEO].plcmt; // https://github.com/prebid/Prebid.js/issues/10452
76
- plcmt.skip = mediaTypes[VIDEO].skip;
77
- plcmt.skipafter = mediaTypes[VIDEO].skipafter;
78
- plcmt.minbitrate = mediaTypes[VIDEO].minbitrate;
79
- plcmt.maxbitrate = mediaTypes[VIDEO].maxbitrate;
80
- plcmt.delivery = mediaTypes[VIDEO].delivery;
81
- plcmt.playbackmethod = mediaTypes[VIDEO].playbackmethod;
82
- plcmt.api = mediaTypes[VIDEO].api;
83
- plcmt.linearity = mediaTypes[VIDEO].linearity;
84
- } else if (mediaTypes && mediaTypes[NATIVE]) {
85
- plcmt.native = mediaTypes[NATIVE];
86
- plcmt.adFormat = NATIVE;
87
- }
88
-
89
- return plcmt;
90
- }
91
-
92
- function getBidFloor(bid) {
93
- if (!isFn(bid.getFloor)) {
94
- return deepAccess(bid, 'params.bidfloor', 0);
95
- }
96
-
97
- try {
98
- const bidFloor = bid.getFloor({
99
- currency: 'USD',
100
- mediaType: '*',
101
- size: '*',
34
+ const getPartnerName = (bid) => String(bid.params?.partnerName || bid.bidder).toLowerCase();
35
+
36
+ const getPlacementReqData = buildPlacementProcessingFunction({
37
+ addPlacementType() {},
38
+ addCustomFieldsToPlacement(bid, bidderRequest, placement) {
39
+ const { seat, token, iabCat, minBidfloor, pos } = bid.params;
40
+ Object.assign(placement, {
41
+ partnerName: getPartnerName(bid),
42
+ seat,
43
+ token,
44
+ iabCat,
45
+ minBidfloor,
46
+ pos,
102
47
  });
103
- return bidFloor.floor;
104
- } catch (e) {
105
- logError(e);
106
- return 0;
107
- }
108
- }
109
-
110
- function buildRequestParams(bidderRequest = {}, placements = []) {
111
- let deviceWidth = 0;
112
- let deviceHeight = 0;
113
-
114
- let winLocation;
115
- try {
116
- const winTop = window.top;
117
- deviceWidth = winTop.screen.width;
118
- deviceHeight = winTop.screen.height;
119
- winLocation = winTop.location;
120
- } catch (e) {
121
- logMessage(e);
122
- winLocation = window.location;
123
- }
124
-
125
- const refferUrl = bidderRequest.refererInfo && bidderRequest.refererInfo.page;
126
- let refferLocation;
127
- try {
128
- refferLocation = refferUrl && new URL(refferUrl);
129
- } catch (e) {
130
- logMessage(e);
131
48
  }
132
-
133
- let location = refferLocation || winLocation;
134
- const language = (navigator && navigator.language) ? navigator.language.split('-')[0] : '';
135
- const host = location.host;
136
- const page = location.pathname;
137
- const secure = location.protocol === 'https:' ? 1 : 0;
138
- return {
139
- deviceWidth,
140
- deviceHeight,
141
- language,
142
- secure,
143
- host,
144
- page,
145
- placements,
146
- coppa: config.getConfig('coppa') === true ? 1 : 0,
147
- ccpa: bidderRequest.uspConsent || undefined,
148
- gdpr: bidderRequest.gdprConsent || undefined,
149
- tmax: bidderRequest.timeout
150
- };
49
+ })
50
+
51
+ const buildRequests = (validBidRequests = [], bidderRequest = {}) => {
52
+ const bidsByPartner = validBidRequests.reduce((bidsByPartner, bid) => {
53
+ const partner = getPartnerName(bid);
54
+ (bidsByPartner[partner] = bidsByPartner[partner] || []).push(bid);
55
+ return bidsByPartner;
56
+ }, {});
57
+ return Object.entries(bidsByPartner).map(([partner, validBidRequests]) => {
58
+ return buildRequestsBase({
59
+ adUrl: _getUrl(partner),
60
+ bidderRequest,
61
+ validBidRequests,
62
+ placementProcessingFunction: getPlacementReqData
63
+ })
64
+ })
151
65
  }
152
66
 
153
67
  export const spec = {
154
68
  code: BIDDER_CODE,
155
69
  aliases: ALIASES,
156
70
  supportedMediaTypes: [BANNER, VIDEO, NATIVE],
157
-
158
- isBidRequestValid: (bid = {}) => {
159
- const { params, bidId, mediaTypes } = bid;
160
- let valid = Boolean(bidId && params && params.seat && params.token);
161
-
162
- if (mediaTypes && mediaTypes[BANNER]) {
163
- valid = valid && Boolean(mediaTypes[BANNER] && mediaTypes[BANNER].sizes);
164
- } else if (mediaTypes && mediaTypes[VIDEO]) {
165
- valid = valid && Boolean(mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize);
166
- } else if (mediaTypes && mediaTypes[NATIVE]) {
167
- valid = valid && Boolean(mediaTypes[NATIVE]);
168
- } else {
169
- valid = false;
71
+ isBidRequestValid: isBidRequestValid(['seat', 'token'], 'every'),
72
+ buildRequests,
73
+ interpretResponse: interpretResponseBuilder({
74
+ addtlBidValidation(bid) {
75
+ return bid.hasOwnProperty('netRevenue')
170
76
  }
171
- return valid;
172
- },
173
-
174
- buildRequests: (validBidRequests = [], bidderRequest = {}) => {
175
- // convert Native ORTB definition to old-style prebid native definition
176
- validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
177
- const tempObj = {};
178
-
179
- const len = validBidRequests.length;
180
- for (let i = 0; i < len; i++) {
181
- const bid = validBidRequests[i];
182
- const data = getPlacementReqData(bid);
183
- tempObj[data.partnerName] = tempObj[data.partnerName] || [];
184
- tempObj[data.partnerName].push(data);
185
- }
186
-
187
- return Object.keys(tempObj).map(key => {
188
- const request = buildRequestParams(bidderRequest, tempObj[key]);
189
- return {
190
- method: 'POST',
191
- url: getUrl(key),
192
- data: request,
193
- }
194
- });
195
- },
196
-
197
- interpretResponse: (serverResponse) => {
198
- let response = [];
199
- for (let i = 0; i < serverResponse.body.length; i++) {
200
- let resItem = serverResponse.body[i];
201
- if (isBidResponseValid(resItem)) {
202
- const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : [];
203
- resItem.meta = { ...resItem.meta, advertiserDomains };
204
-
205
- response.push(resItem);
206
- }
207
- }
208
- return response;
209
- }
77
+ })
210
78
  };
211
79
 
212
80
  registerBidder(spec);