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 = 'minutemedia';
20
19
  const ADAPTER_VERSION = '6.0.0';
21
20
  const TTL = 360;
22
21
  const DEFAULT_CURRENCY = 'USD';
23
- const SELLER_ENDPOINT = 'https://hb.minutemedia-prebid.com/';
22
+ const BASE_URL = 'https://hb.minutemedia-prebid.com/';
24
23
  const MODES = {
25
24
  PRODUCTION: 'hb-mm-multi',
26
25
  TEST: 'hb-multi-mm-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,
@@ -51,50 +46,24 @@ export const spec = {
51
46
  buildRequests: function (validBidRequests, bidderRequest) {
52
47
  const combinedRequestsObject = {};
53
48
 
54
- // use data from the first bid, to create the general params for all bids
55
49
  const generalObject = validBidRequests[0];
56
50
  const testMode = generalObject.params.testMode;
57
51
 
58
- combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest);
52
+ combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest, ADAPTER_VERSION);
59
53
  combinedRequestsObject.bids = generateBidsParams(validBidRequests, bidderRequest);
60
54
 
61
55
  return {
62
56
  method: 'POST',
63
- url: getEndpoint(testMode),
57
+ url: getEndpoint(testMode, BASE_URL, MODES),
64
58
  data: combinedRequestsObject
65
- }
59
+ };
66
60
  },
67
- interpretResponse: function ({body}) {
61
+ interpretResponse: function ({ body }) {
68
62
  const bidResponses = [];
69
63
 
70
64
  if (body.bids) {
71
65
  body.bids.forEach(adUnit => {
72
- const bidResponse = {
73
- requestId: adUnit.requestId,
74
- cpm: adUnit.cpm,
75
- currency: adUnit.currency || DEFAULT_CURRENCY,
76
- width: adUnit.width,
77
- height: adUnit.height,
78
- ttl: adUnit.ttl || TTL,
79
- creativeId: adUnit.creativeId,
80
- netRevenue: adUnit.netRevenue || true,
81
- nurl: adUnit.nurl,
82
- mediaType: adUnit.mediaType,
83
- meta: {
84
- mediaType: adUnit.mediaType
85
- }
86
- };
87
-
88
- if (adUnit.mediaType === VIDEO) {
89
- bidResponse.vastXml = adUnit.vastXml;
90
- } else if (adUnit.mediaType === BANNER) {
91
- bidResponse.ad = adUnit.ad;
92
- }
93
-
94
- if (adUnit.adomain && adUnit.adomain.length) {
95
- bidResponse.meta.advertiserDomains = adUnit.adomain;
96
- }
97
-
66
+ const bidResponse = buildBidResponse(adUnit, DEFAULT_CURRENCY, TTL, VIDEO, BANNER);
98
67
  bidResponses.push(bidResponse);
99
68
  });
100
69
  }
@@ -104,20 +73,20 @@ export const spec = {
104
73
  getUserSyncs: function (syncOptions, serverResponses) {
105
74
  const syncs = [];
106
75
  for (const response of serverResponses) {
107
- if (syncOptions.iframeEnabled && response.body.params.userSyncURL) {
76
+ if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
108
77
  syncs.push({
109
78
  type: 'iframe',
110
- url: response.body.params.userSyncURL
79
+ url: deepAccess(response, 'body.params.userSyncURL')
111
80
  });
112
81
  }
113
- if (syncOptions.pixelEnabled && isArray(response.body.params.userSyncPixels)) {
82
+ if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
114
83
  const pixels = response.body.params.userSyncPixels.map(pixel => {
115
84
  return {
116
85
  type: 'image',
117
86
  url: pixel
118
- }
119
- })
120
- syncs.push(...pixels)
87
+ };
88
+ });
89
+ syncs.push(...pixels);
121
90
  }
122
91
  }
123
92
  return syncs;
@@ -135,349 +104,3 @@ export const spec = {
135
104
  };
136
105
 
137
106
  registerBidder(spec);
138
-
139
- /**
140
- * Get floor price
141
- * @param bid {bid}
142
- * @returns {Number}
143
- */
144
- function getFloor(bid, mediaType) {
145
- if (!isFn(bid.getFloor)) {
146
- return 0;
147
- }
148
- let floorResult = bid.getFloor({
149
- currency: DEFAULT_CURRENCY,
150
- mediaType: mediaType,
151
- size: '*'
152
- });
153
- return floorResult.currency === DEFAULT_CURRENCY && floorResult.floor ? floorResult.floor : 0;
154
- }
155
-
156
- /**
157
- * Get the the ad sizes array from the bid
158
- * @param bid {bid}
159
- * @returns {Array}
160
- */
161
- function getSizesArray(bid, mediaType) {
162
- let sizesArray = []
163
-
164
- if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
165
- sizesArray = bid.mediaTypes[mediaType].sizes;
166
- } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
167
- sizesArray = bid.sizes;
168
- }
169
-
170
- return sizesArray;
171
- }
172
-
173
- /**
174
- * Get schain string value
175
- * @param schainObject {Object}
176
- * @returns {string}
177
- */
178
- function getSupplyChain(schainObject) {
179
- if (isEmpty(schainObject)) {
180
- return '';
181
- }
182
- let scStr = `${schainObject.ver},${schainObject.complete}`;
183
- schainObject.nodes.forEach((node) => {
184
- scStr += '!';
185
- scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
186
- scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
187
- scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
188
- scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
189
- scStr += `${getEncodedValIfNotEmpty(node.name)},`;
190
- scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
191
- });
192
- return scStr;
193
- }
194
-
195
- /**
196
- * Get encoded node value
197
- * @param val {string}
198
- * @returns {string}
199
- */
200
- function getEncodedValIfNotEmpty(val) {
201
- return !isEmpty(val) ? encodeURIComponent(val) : '';
202
- }
203
-
204
- /**
205
- * Get preferred user-sync method based on publisher configuration
206
- * @param bidderCode {string}
207
- * @returns {string}
208
- */
209
- function getAllowedSyncMethod(filterSettings, bidderCode) {
210
- const iframeConfigsToCheck = ['all', 'iframe'];
211
- const pixelConfigToCheck = 'image';
212
- if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
213
- return SUPPORTED_SYNC_METHODS.IFRAME;
214
- }
215
- if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
216
- return SUPPORTED_SYNC_METHODS.PIXEL;
217
- }
218
- }
219
-
220
- /**
221
- * Check if sync rule is supported
222
- * @param syncRule {Object}
223
- * @param bidderCode {string}
224
- * @returns {boolean}
225
- */
226
- function isSyncMethodAllowed(syncRule, bidderCode) {
227
- if (!syncRule) {
228
- return false;
229
- }
230
- const isInclude = syncRule.filter === 'include';
231
- const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
232
- return isInclude && contains(bidders, bidderCode);
233
- }
234
-
235
- /**
236
- * Get the seller endpoint
237
- * @param testMode {boolean}
238
- * @returns {string}
239
- */
240
- function getEndpoint(testMode) {
241
- return testMode
242
- ? SELLER_ENDPOINT + MODES.TEST
243
- : SELLER_ENDPOINT + MODES.PRODUCTION;
244
- }
245
-
246
- /**
247
- * get device type
248
- * @param uad {ua}
249
- * @returns {string}
250
- */
251
- function getDeviceType(ua) {
252
- if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
253
- .test(ua.toLowerCase())) {
254
- return '5';
255
- }
256
- if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
257
- .test(ua.toLowerCase())) {
258
- return '4';
259
- }
260
- if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
261
- .test(ua.toLowerCase())) {
262
- return '3';
263
- }
264
- return '1';
265
- }
266
-
267
- function generateBidsParams(validBidRequests, bidderRequest) {
268
- const bidsArray = [];
269
-
270
- if (validBidRequests.length) {
271
- validBidRequests.forEach(bid => {
272
- bidsArray.push(generateBidParameters(bid, bidderRequest));
273
- });
274
- }
275
-
276
- return bidsArray;
277
- }
278
-
279
- /**
280
- * Generate bid specific parameters
281
- * @param {bid} bid
282
- * @param {bidderRequest} bidderRequest
283
- * @returns {Object} bid specific params object
284
- */
285
- function generateBidParameters(bid, bidderRequest) {
286
- const {params} = bid;
287
- const mediaType = isBanner(bid) ? BANNER : VIDEO;
288
- const sizesArray = getSizesArray(bid, mediaType);
289
-
290
- // fix floor price in case of NAN
291
- if (isNaN(params.floorPrice)) {
292
- params.floorPrice = 0;
293
- }
294
-
295
- const bidObject = {
296
- mediaType,
297
- adUnitCode: getBidIdParameter('adUnitCode', bid),
298
- sizes: sizesArray,
299
- floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
300
- bidId: getBidIdParameter('bidId', bid),
301
- loop: getBidIdParameter('bidderRequestsCount', bid),
302
- bidderRequestId: getBidIdParameter('bidderRequestId', bid),
303
- transactionId: bid.ortb2Imp?.ext?.tid || '',
304
- coppa: 0,
305
- };
306
-
307
- const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
308
- if (pos) {
309
- bidObject.pos = pos;
310
- }
311
-
312
- const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
313
- if (gpid) {
314
- bidObject.gpid = gpid;
315
- }
316
-
317
- const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
318
- if (placementId) {
319
- bidObject.placementId = placementId;
320
- }
321
-
322
- const mimes = deepAccess(bid, `mediaTypes.${mediaType}.mimes`);
323
- if (mimes) {
324
- bidObject.mimes = mimes;
325
- }
326
- const api = deepAccess(bid, `mediaTypes.${mediaType}.api`);
327
- if (api) {
328
- bidObject.api = api;
329
- }
330
-
331
- const sua = deepAccess(bid, `ortb2.device.sua`);
332
- if (sua) {
333
- bidObject.sua = sua;
334
- }
335
-
336
- const coppa = deepAccess(bid, `ortb2.regs.coppa`)
337
- if (coppa) {
338
- bidObject.coppa = 1;
339
- }
340
-
341
- if (mediaType === VIDEO) {
342
- const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
343
- let playbackMethodValue;
344
-
345
- // verify playbackMethod is of type integer array, or integer only.
346
- if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
347
- // only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
348
- playbackMethodValue = playbackMethod[0];
349
- } else if (isInteger(playbackMethod)) {
350
- playbackMethodValue = playbackMethod;
351
- }
352
-
353
- if (playbackMethodValue) {
354
- bidObject.playbackMethod = playbackMethodValue;
355
- }
356
-
357
- const placement = deepAccess(bid, `mediaTypes.video.placement`);
358
- if (placement) {
359
- bidObject.placement = placement;
360
- }
361
-
362
- const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
363
- if (minDuration) {
364
- bidObject.minDuration = minDuration;
365
- }
366
-
367
- const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
368
- if (maxDuration) {
369
- bidObject.maxDuration = maxDuration;
370
- }
371
-
372
- const skip = deepAccess(bid, `mediaTypes.video.skip`);
373
- if (skip) {
374
- bidObject.skip = skip;
375
- }
376
-
377
- const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
378
- if (linearity) {
379
- bidObject.linearity = linearity;
380
- }
381
-
382
- const protocols = deepAccess(bid, `mediaTypes.video.protocols`);
383
- if (protocols) {
384
- bidObject.protocols = protocols;
385
- }
386
-
387
- const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
388
- if (plcmt) {
389
- bidObject.plcmt = plcmt;
390
- }
391
- }
392
-
393
- return bidObject;
394
- }
395
-
396
- function isBanner(bid) {
397
- return bid.mediaTypes && bid.mediaTypes.banner;
398
- }
399
-
400
- /**
401
- * Generate params that are common between all bids
402
- * @param {single bid object} generalObject
403
- * @param {bidderRequest} bidderRequest
404
- * @returns {object} the common params object
405
- */
406
- function generateGeneralParams(generalObject, bidderRequest) {
407
- const domain = window.location.hostname;
408
- const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
409
- const {bidderCode} = bidderRequest;
410
- const generalBidParams = generalObject.params;
411
- const timeout = bidderRequest.timeout;
412
-
413
- // these params are snake_case instead of camelCase to allow backwards compatability on the server.
414
- // in the future, these will be converted to camelCase to match our convention.
415
- const generalParams = {
416
- wrapper_type: 'prebidjs',
417
- wrapper_vendor: '$$PREBID_GLOBAL$$',
418
- wrapper_version: '$prebid.version$',
419
- adapter_version: ADAPTER_VERSION,
420
- auction_start: timestamp(),
421
- publisher_id: generalBidParams.org,
422
- publisher_name: domain,
423
- site_domain: domain,
424
- dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
425
- device_type: getDeviceType(navigator.userAgent),
426
- ua: navigator.userAgent,
427
- is_wrapper: !!generalBidParams.isWrapper,
428
- session_id: generalBidParams.sessionId || getBidIdParameter('bidderRequestId', generalObject),
429
- tmax: timeout
430
- }
431
-
432
- const userIdsParam = getBidIdParameter('userId', generalObject);
433
- if (userIdsParam) {
434
- generalParams.userIds = JSON.stringify(userIdsParam);
435
- }
436
-
437
- const ortb2Metadata = bidderRequest.ortb2 || {};
438
- if (ortb2Metadata.site) {
439
- generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
440
- }
441
- if (ortb2Metadata.user) {
442
- generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
443
- }
444
-
445
- if (syncEnabled) {
446
- const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
447
- if (allowedSyncMethod) {
448
- generalParams.cs_method = allowedSyncMethod;
449
- }
450
- }
451
-
452
- if (bidderRequest.uspConsent) {
453
- generalParams.us_privacy = bidderRequest.uspConsent;
454
- }
455
-
456
- if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
457
- generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
458
- generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
459
- }
460
-
461
- if (bidderRequest.gppConsent) {
462
- generalParams.gpp = bidderRequest.gppConsent.gppString;
463
- generalParams.gpp_sid = bidderRequest.gppConsent.applicableSections;
464
- } else if (bidderRequest.ortb2?.regs?.gpp) {
465
- generalParams.gpp = bidderRequest.ortb2.regs.gpp;
466
- generalParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid;
467
- }
468
-
469
- if (generalBidParams.ifa) {
470
- generalParams.ifa = generalBidParams.ifa;
471
- }
472
-
473
- if (generalObject.schain) {
474
- generalParams.schain = getSupplyChain(generalObject.schain);
475
- }
476
-
477
- if (bidderRequest && bidderRequest.refererInfo) {
478
- generalParams.referrer = deepAccess(bidderRequest, 'refererInfo.ref');
479
- generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || deepAccess(window, 'location.href');
480
- }
481
-
482
- return generalParams
483
- }
@@ -1,12 +1,10 @@
1
1
  /**
2
2
  * This module adds the Mobian RTD provider to the real time data module
3
3
  * The {@link module:modules/realTimeData} module is required
4
- * @module modules/anonymisedRtdProvider
5
- * @requires module:modules/realTimeData
6
4
  */
7
5
  import { submodule } from '../src/hook.js';
8
6
  import { ajaxBuilder } from '../src/ajax.js';
9
- import { deepSetValue } from '../src/utils.js';
7
+ import { deepSetValue, safeJSONParse } from '../src/utils.js';
10
8
 
11
9
  /**
12
10
  * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule
@@ -24,6 +22,7 @@ export const mobianBrandSafetySubmodule = {
24
22
  function init() {
25
23
  return true;
26
24
  }
25
+
27
26
  function getBidRequestData(bidReqConfig, callback, config) {
28
27
  const { site: ortb2Site } = bidReqConfig.ortb2Fragments.global;
29
28
  const pageUrl = encodeURIComponent(getPageUrl());
@@ -33,20 +32,35 @@ function getBidRequestData(bidReqConfig, callback, config) {
33
32
 
34
33
  return new Promise((resolve) => {
35
34
  ajax(requestUrl, {
36
- success: function(response) {
37
- const risks = ['garm_high_risk', 'garm_medium_risk', 'garm_low_risk', 'garm_no_risk'];
38
- const riskLevels = ['high_risk', 'medium_risk', 'low_risk', 'no_risk'];
39
-
40
- let mobianGarmRisk = 'unknown';
41
- for (let i = 0; i < risks.length; i++) {
42
- if (response[risks[i]]) {
43
- mobianGarmRisk = riskLevels[i];
44
- break;
45
- }
35
+ success: function(responseData) {
36
+ let response = safeJSONParse(responseData);
37
+ if (!response) {
38
+ resolve({});
39
+ callback();
40
+ return;
46
41
  }
42
+
43
+ let mobianRisk = response.garm_risk || 'unknown';
44
+
45
+ const categories = Object.keys(response)
46
+ .filter(key => key.startsWith('garm_content_category_') && response[key])
47
+ .map(key => key.replace('garm_content_category_', ''));
48
+
49
+ const sentiment = Object.keys(response)
50
+ .find(key => key.startsWith('sentiment_') && response[key])
51
+ ?.replace('sentiment_', '') || 'unknown';
52
+
53
+ const emotions = Object.keys(response)
54
+ .filter(key => key.startsWith('emotion_') && response[key])
55
+ .map(key => key.replace('emotion_', ''));
56
+
47
57
  const risk = {
48
- 'mobianGarmRisk': mobianGarmRisk
58
+ 'risk': mobianRisk,
59
+ 'contentCategories': categories,
60
+ 'sentiment': sentiment,
61
+ 'emotions': emotions
49
62
  };
63
+
50
64
  resolve(risk);
51
65
  deepSetValue(ortb2Site.ext, 'data.mobian', risk);
52
66
  callback()
@@ -22,7 +22,7 @@ const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstre
22
22
  const BIDDER_CODE = 'nexx360';
23
23
  const REQUEST_URL = 'https://fast.nexx360.io/booster';
24
24
  const PAGE_VIEW_ID = generateUUID();
25
- const BIDDER_VERSION = '4.1';
25
+ const BIDDER_VERSION = '4.2';
26
26
  const GVLID = 965;
27
27
  const NEXXID_KEY = 'nexx360_storage';
28
28
 
@@ -33,6 +33,7 @@ const ALIASES = [
33
33
  { code: 'league-m', gvlid: 965 },
34
34
  { code: 'prjads' },
35
35
  { code: 'pubtech' },
36
+ { code: '1accord', gvlid: 965 },
36
37
  ];
37
38
 
38
39
  export const storage = getStorageManager({
@@ -125,7 +126,7 @@ const converter = ortbConverter({
125
126
  deepSetValue(request, 'ext.localStorage.nexx360Id', nexx360LocalStorage.nexx360Id);
126
127
  }
127
128
  const amxId = getAmxId();
128
- if (amxId) deepSetValue(request, 'ext.localStorage.amxId', amxId());
129
+ if (amxId) deepSetValue(request, 'ext.localStorage.amxId', amxId);
129
130
  deepSetValue(request, 'ext.version', '$prebid.version$');
130
131
  deepSetValue(request, 'ext.source', 'prebid.js');
131
132
  deepSetValue(request, 'ext.pageViewId', PAGE_VIEW_ID);