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
@@ -1,6 +1,8 @@
1
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
2
2
  import { VIDEO } from '../src/mediaTypes.js';
3
3
  import { deepAccess } from '../src/utils.js';
4
+ import { config } from '../src/config.js';
5
+ import { userSync } from '../src/userSync.js';
4
6
 
5
7
  /**
6
8
  * Get video metadata from bid request
@@ -90,6 +92,22 @@ function getVideoMetadata(bidRequest, bidderRequest) {
90
92
  return videoMetadata;
91
93
  }
92
94
 
95
+ /**
96
+ * Check if user sync is enabled for Dailymotion
97
+ *
98
+ * @return boolean True if user sync is enabled
99
+ */
100
+ function isUserSyncEnabled() {
101
+ const syncEnabled = deepAccess(config.getConfig('userSync'), 'syncEnabled');
102
+
103
+ if (!syncEnabled) return false;
104
+
105
+ const canSyncWithIframe = userSync.canBidderRegisterSync('iframe', 'dailymotion');
106
+ const canSyncWithPixel = userSync.canBidderRegisterSync('image', 'dailymotion');
107
+
108
+ return !!(canSyncWithIframe || canSyncWithPixel);
109
+ }
110
+
93
111
  export const spec = {
94
112
  code: 'dailymotion',
95
113
  gvlid: 573,
@@ -189,6 +207,7 @@ export const spec = {
189
207
  atts: deepAccess(bidderRequest, 'ortb2.device.ext.atts', 0),
190
208
  },
191
209
  } : {}),
210
+ userSyncEnabled: isUserSyncEnabled(),
192
211
  request: {
193
212
  adUnitCode: deepAccess(bid, 'adUnitCode', ''),
194
213
  auctionId: deepAccess(bid, 'auctionId', ''),
@@ -74,16 +74,11 @@ function getPayload(bid, userData) {
74
74
  if (!userData || !bid) {
75
75
  return false;
76
76
  }
77
-
78
77
  const { bidId, params } = bid;
79
78
  const { placementId } = params;
80
79
  const {
81
80
  userid,
82
- email,
83
- firstname,
84
- lastname,
85
81
  specialization,
86
- hcpid,
87
82
  gender,
88
83
  city,
89
84
  state,
@@ -94,16 +89,17 @@ function getPayload(bid, userData) {
94
89
  hashedmobile,
95
90
  country,
96
91
  organization,
97
- dob,
92
+ platformUid,
93
+ mobile
98
94
  } = userData;
99
95
 
100
96
  const data = {
101
- userid: userid || '',
102
- email: email || '',
103
- firstname: firstname || '',
104
- lastname: lastname || '',
97
+ userid: platformUid || userid || '',
98
+ email: '',
99
+ firstname: '',
100
+ lastname: '',
105
101
  specialization: specialization || '',
106
- hcpid: hcpid || '',
102
+ hcpid: '',
107
103
  gender: gender || '',
108
104
  city: city || '',
109
105
  state: state || '',
@@ -117,8 +113,9 @@ function getPayload(bid, userData) {
117
113
  hashedmobile: hashedmobile || '',
118
114
  country: country || '',
119
115
  organization: organization || '',
120
- dob: dob || '',
116
+ dob: '',
121
117
  userconsent: 1,
118
+ mobile: mobile || ''
122
119
  };
123
120
  return {
124
121
  data,
@@ -157,7 +157,7 @@ export const spec = {
157
157
  maxduration: bidRequest.mediaTypes.video.maxduration,
158
158
  api: bidRequest.mediaTypes.video.api,
159
159
  skip: bidRequest.mediaTypes.video.skip || bidRequest.params.video.skip,
160
- placement: bidRequest.mediaTypes.video.plcmt || bidRequest.params.video.plcmt,
160
+ plcmt: bidRequest.mediaTypes.video.plcmt || bidRequest.params.video.plcmt,
161
161
  minduration: bidRequest.mediaTypes.video.minduration || bidRequest.params.video.minduration,
162
162
  playbackmethod: bidRequest.mediaTypes.video.playbackmethod || bidRequest.params.video.playbackmethod,
163
163
  startdelay: bidRequest.mediaTypes.video.startdelay || bidRequest.params.video.startdelay
@@ -6,7 +6,7 @@ import {deepClone, generateUUID, logError, logInfo, logWarn, getParameterByName}
6
6
 
7
7
  const analyticsType = 'endpoint';
8
8
 
9
- export const ANALYTICS_VERSION = '2.3.0';
9
+ export const ANALYTICS_VERSION = '2.3.1';
10
10
 
11
11
  const ANALYTICS_SERVER = 'https://a.greenbids.ai';
12
12
 
@@ -197,9 +197,12 @@ export const greenbidsAnalyticsAdapter = Object.assign(adapter({ANALYTICS_SERVER
197
197
  },
198
198
  handleAuctionEnd(auctionEndArgs) {
199
199
  const cachedAuction = this.getCachedAuction(auctionEndArgs.auctionId);
200
- this.sendEventMessage('/',
201
- this.createBidMessage(auctionEndArgs, cachedAuction)
202
- );
200
+ const isFilteringForced = getParameterByName('greenbids_force_filtering');
201
+ if (!isFilteringForced) {
202
+ this.sendEventMessage('/',
203
+ this.createBidMessage(auctionEndArgs, cachedAuction)
204
+ )
205
+ };
203
206
  },
204
207
  handleBidTimeout(timeoutBids) {
205
208
  timeoutBids.forEach((bid) => {
@@ -1,11 +1,11 @@
1
- import { logError, deepClone, generateUUID, deepSetValue, deepAccess } from '../src/utils.js';
1
+ import { logError, logInfo, logWarn, deepClone, generateUUID, deepSetValue, deepAccess, getParameterByName } from '../src/utils.js';
2
2
  import { ajax } from '../src/ajax.js';
3
3
  import { submodule } from '../src/hook.js';
4
4
  import * as events from '../src/events.js';
5
5
  import { EVENTS } from '../src/constants.js';
6
6
 
7
7
  const MODULE_NAME = 'greenbidsRtdProvider';
8
- const MODULE_VERSION = '2.0.0';
8
+ const MODULE_VERSION = '2.0.1';
9
9
  const ENDPOINT = 'https://t.greenbids.ai';
10
10
 
11
11
  const rtdOptions = {};
@@ -46,6 +46,7 @@ function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) {
46
46
  function createPromise(reqBidsConfigObj, greenbidsId) {
47
47
  return new Promise((resolve) => {
48
48
  const timeoutId = setTimeout(() => {
49
+ logWarn('GreenbidsRtdProvider: Greenbids API timeout, skipping shaping');
49
50
  resolve(reqBidsConfigObj);
50
51
  }, rtdOptions.timeout);
51
52
  ajax(
@@ -57,6 +58,7 @@ function createPromise(reqBidsConfigObj, greenbidsId) {
57
58
  },
58
59
  error: () => {
59
60
  clearTimeout(timeoutId);
61
+ logWarn('GreenbidsRtdProvider: Greenbids API response error, skipping shaping');
60
62
  resolve(reqBidsConfigObj);
61
63
  },
62
64
  },
@@ -73,11 +75,16 @@ function createPromise(reqBidsConfigObj, greenbidsId) {
73
75
 
74
76
  function processSuccessResponse(response, timeoutId, reqBidsConfigObj, greenbidsId) {
75
77
  clearTimeout(timeoutId);
76
- const responseAdUnits = JSON.parse(response);
77
- updateAdUnitsBasedOnResponse(reqBidsConfigObj.adUnits, responseAdUnits, greenbidsId);
78
+ try {
79
+ const responseAdUnits = JSON.parse(response);
80
+ updateAdUnitsBasedOnResponse(reqBidsConfigObj.adUnits, responseAdUnits, greenbidsId);
81
+ } catch (e) {
82
+ logWarn('GreenbidsRtdProvider: Greenbids API response parsing error, skipping shaping');
83
+ }
78
84
  }
79
85
 
80
86
  function updateAdUnitsBasedOnResponse(adUnits, responseAdUnits, greenbidsId) {
87
+ const isFilteringForced = getParameterByName('greenbids_force_filtering');
81
88
  adUnits.forEach((adUnit) => {
82
89
  const matchingAdUnit = findMatchingAdUnit(responseAdUnits, adUnit.code);
83
90
  if (matchingAdUnit) {
@@ -86,7 +93,10 @@ function updateAdUnitsBasedOnResponse(adUnits, responseAdUnits, greenbidsId) {
86
93
  keptInAuction: matchingAdUnit.bidders,
87
94
  isExploration: matchingAdUnit.isExploration
88
95
  });
89
- if (!matchingAdUnit.isExploration) {
96
+ if (isFilteringForced) {
97
+ adUnit.bids = [];
98
+ logInfo('Greenbids Rtd: filtering flag detected, forcing filtering of Rtd module.');
99
+ } else if (!matchingAdUnit.isExploration) {
90
100
  removeFalseBidders(adUnit, matchingAdUnit);
91
101
  }
92
102
  }
@@ -13,14 +13,13 @@ import {
13
13
  isPlainObject,
14
14
  logError,
15
15
  logInfo,
16
- logWarn,
17
- safeJSONParse
16
+ logWarn
18
17
  } from '../src/utils.js';
19
18
  import {fetch} from '../src/ajax.js';
20
19
  import {submodule} from '../src/hook.js';
21
20
  import {getRefererInfo} from '../src/refererDetection.js';
22
21
  import {getStorageManager} from '../src/storageManager.js';
23
- import {uspDataHandler, gppDataHandler} from '../src/adapterManager.js';
22
+ import {gppDataHandler, uspDataHandler} from '../src/adapterManager.js';
24
23
  import {MODULE_TYPE_UID} from '../src/activities/modules.js';
25
24
  import {GreedyPromise} from '../src/utils/promise.js';
26
25
  import {loadExternalScript} from '../src/adloader.js';
@@ -34,19 +33,12 @@ import {loadExternalScript} from '../src/adloader.js';
34
33
 
35
34
  const MODULE_NAME = 'id5Id';
36
35
  const GVLID = 131;
37
- const NB_EXP_DAYS = 30;
38
36
  export const ID5_STORAGE_NAME = 'id5id';
39
- export const ID5_PRIVACY_STORAGE_NAME = `${ID5_STORAGE_NAME}_privacy`;
40
- const LOCAL_STORAGE = 'html5';
41
37
  const LOG_PREFIX = 'User ID - ID5 submodule: ';
42
38
  const ID5_API_CONFIG_URL = 'https://id5-sync.com/api/config/prebid';
43
39
  const ID5_DOMAIN = 'id5-sync.com';
44
40
  const TRUE_LINK_SOURCE = 'true-link-id5-sync.com';
45
41
 
46
- // order the legacy cookie names in reverse priority order so the last
47
- // cookie in the array is the most preferred to use
48
- const LEGACY_COOKIE_NAMES = ['pbjs-id5id', 'id5id.1st', 'id5id'];
49
-
50
42
  export const storage = getStorageManager({moduleType: MODULE_TYPE_UID, moduleName: MODULE_NAME});
51
43
 
52
44
  /**
@@ -231,7 +223,7 @@ export const id5IdSubmodule = {
231
223
  * @param {SubmoduleConfig} config
232
224
  * @param {ConsentData|undefined} consentData
233
225
  * @param {Object} cacheIdObj - existing id, if any
234
- * @return {(IdResponse|function(callback:function))} A response object that contains id and/or callback.
226
+ * @return {IdResponse} A response object that contains id.
235
227
  */
236
228
  extendId(config, consentData, cacheIdObj) {
237
229
  if (!hasWriteConsentToLocalStorage(consentData)) {
@@ -239,10 +231,10 @@ export const id5IdSubmodule = {
239
231
  return cacheIdObj;
240
232
  }
241
233
 
242
- const partnerId = validateConfig(config) ? config.params.partner : 0;
243
- incrementNb(partnerId);
244
-
245
234
  logInfo(LOG_PREFIX + 'using cached ID', cacheIdObj);
235
+ if (cacheIdObj) {
236
+ cacheIdObj.nbPage = incrementNb(cacheIdObj)
237
+ }
246
238
  return cacheIdObj;
247
239
  },
248
240
  eids: {
@@ -401,8 +393,8 @@ export class IdFetchFlow {
401
393
  const params = this.submoduleConfig.params;
402
394
  const hasGdpr = (this.gdprConsentData && typeof this.gdprConsentData.gdprApplies === 'boolean' && this.gdprConsentData.gdprApplies) ? 1 : 0;
403
395
  const referer = getRefererInfo();
404
- const signature = (this.cacheIdObj && this.cacheIdObj.signature) ? this.cacheIdObj.signature : getLegacyCookieSignature();
405
- const nbPage = incrementAndResetNb(params.partner);
396
+ const signature = this.cacheIdObj ? this.cacheIdObj.signature : undefined;
397
+ const nbPage = incrementNb(this.cacheIdObj);
406
398
  const trueLinkInfo = window.id5Bootstrap ? window.id5Bootstrap.getTrueLinkInfo() : {booted: false};
407
399
 
408
400
  const data = {
@@ -456,7 +448,6 @@ export class IdFetchFlow {
456
448
  #processFetchCallResponse(fetchCallResponse) {
457
449
  try {
458
450
  if (fetchCallResponse.privacy) {
459
- storeInLocalStorage(ID5_PRIVACY_STORAGE_NAME, JSON.stringify(fetchCallResponse.privacy), NB_EXP_DAYS);
460
451
  if (window.id5Bootstrap && window.id5Bootstrap.setPrivacy) {
461
452
  window.id5Bootstrap.setPrivacy(fetchCallResponse.privacy);
462
453
  }
@@ -507,89 +498,19 @@ function validateConfig(config) {
507
498
  logError(LOG_PREFIX + 'storage required to be set');
508
499
  return false;
509
500
  }
510
-
511
- // in a future release, we may return false if storage type or name are not set as required
512
- if (config.storage.type !== LOCAL_STORAGE) {
513
- logWarn(LOG_PREFIX + `storage type recommended to be '${LOCAL_STORAGE}'. In a future release this may become a strict requirement`);
514
- }
515
- // in a future release, we may return false if storage type or name are not set as required
516
501
  if (config.storage.name !== ID5_STORAGE_NAME) {
517
- logWarn(LOG_PREFIX + `storage name recommended to be '${ID5_STORAGE_NAME}'. In a future release this may become a strict requirement`);
502
+ logWarn(LOG_PREFIX + `storage name recommended to be '${ID5_STORAGE_NAME}'.`);
518
503
  }
519
504
 
520
505
  return true;
521
506
  }
522
507
 
523
- export function expDaysStr(expDays) {
524
- return (new Date(Date.now() + (1000 * 60 * 60 * 24 * expDays))).toUTCString();
525
- }
526
-
527
- export function nbCacheName(partnerId) {
528
- return `${ID5_STORAGE_NAME}_${partnerId}_nb`;
529
- }
530
-
531
- export function storeNbInCache(partnerId, nb) {
532
- storeInLocalStorage(nbCacheName(partnerId), nb, NB_EXP_DAYS);
533
- }
534
-
535
- export function getNbFromCache(partnerId) {
536
- let cacheNb = getFromLocalStorage(nbCacheName(partnerId));
537
- return (cacheNb) ? parseInt(cacheNb) : 0;
538
- }
539
-
540
- function incrementNb(partnerId) {
541
- const nb = (getNbFromCache(partnerId) + 1);
542
- storeNbInCache(partnerId, nb);
543
- return nb;
544
- }
545
-
546
- function incrementAndResetNb(partnerId) {
547
- const result = incrementNb(partnerId);
548
- storeNbInCache(partnerId, 0);
549
- return result;
550
- }
551
-
552
- function getLegacyCookieSignature() {
553
- let legacyStoredValue;
554
- LEGACY_COOKIE_NAMES.forEach(function (cookie) {
555
- if (storage.getCookie(cookie)) {
556
- legacyStoredValue = safeJSONParse(storage.getCookie(cookie)) || legacyStoredValue;
557
- }
558
- });
559
- return (legacyStoredValue && legacyStoredValue.signature) || '';
560
- }
561
-
562
- /**
563
- * This will make sure we check for expiration before accessing local storage
564
- * @param {string} key
565
- */
566
- export function getFromLocalStorage(key) {
567
- const storedValueExp = storage.getDataFromLocalStorage(`${key}_exp`);
568
- // empty string means no expiration set
569
- if (storedValueExp === '') {
570
- return storage.getDataFromLocalStorage(key);
571
- } else if (storedValueExp) {
572
- if ((new Date(storedValueExp)).getTime() - Date.now() > 0) {
573
- return storage.getDataFromLocalStorage(key);
574
- }
508
+ function incrementNb(cachedObj) {
509
+ if (cachedObj && cachedObj.nbPage !== undefined) {
510
+ return cachedObj.nbPage + 1;
511
+ } else {
512
+ return 1;
575
513
  }
576
- // if we got here, then we have an expired item or we didn't set an
577
- // expiration initially somehow, so we need to remove the item from the
578
- // local storage
579
- storage.removeDataFromLocalStorage(key);
580
- return null;
581
- }
582
-
583
- /**
584
- * Ensure that we always set an expiration in local storage since
585
- * by default it's not required
586
- * @param {string} key
587
- * @param {any} value
588
- * @param {number} expDays
589
- */
590
- export function storeInLocalStorage(key, value, expDays) {
591
- storage.setDataInLocalStorage(`${key}_exp`, expDaysStr(expDays));
592
- storage.setDataInLocalStorage(`${key}`, value);
593
514
  }
594
515
 
595
516
  /**
@@ -1,15 +1,19 @@
1
- import { logInfo, logError } from '../src/utils.js';
2
- import {getGlobal} from '../src/prebidGlobal.js';
3
- import {ajax} from '../src/ajax.js';
4
- import {config} from '../src/config.js';
5
1
  import MD5 from 'crypto-js/md5.js';
2
+ import { ACTIVITY_ENRICH_UFPD } from '../src/activities/activities.js';
3
+ import { activityParams } from '../src/activities/activityParams.js';
4
+ import { MODULE_TYPE_PREBID } from '../src/activities/modules.js';
5
+ import { isActivityAllowed } from '../src/activities/rules.js';
6
+ import { ajax } from '../src/ajax.js';
7
+ import { config } from '../src/config.js';
8
+ import { getGlobal } from '../src/prebidGlobal.js';
9
+ import { logError, logInfo } from '../src/utils.js';
6
10
 
7
11
  let email;
8
12
  let conf;
9
13
  const LOG_PRE_FIX = 'ID-Library: ';
10
14
  const CONF_DEFAULT_OBSERVER_DEBOUNCE_MS = 250;
11
- const CONF_DEFAULT_FULL_BODY_SCAN = false;
12
- const CONF_DEFAULT_INPUT_SCAN = false;
15
+ export const CONF_DEFAULT_FULL_BODY_SCAN = false;
16
+ export const CONF_DEFAULT_INPUT_SCAN = false;
13
17
  const OBSERVER_CONFIG = {
14
18
  subtree: true,
15
19
  attributes: true,
@@ -257,6 +261,10 @@ export function setConfig(config) {
257
261
  _logError('The required url is not configured');
258
262
  return;
259
263
  }
264
+ if (!isActivityAllowed(ACTIVITY_ENRICH_UFPD, activityParams(MODULE_TYPE_PREBID, 'idImportLibrary'))) {
265
+ _logError('Permission for id import was denied by CMP');
266
+ return;
267
+ }
260
268
  if (typeof config.debounce !== 'number') {
261
269
  config.debounce = CONF_DEFAULT_OBSERVER_DEBOUNCE_MS;
262
270
  _logInfo('Set default observer debounce to ' + CONF_DEFAULT_OBSERVER_DEBOUNCE_MS);
@@ -107,19 +107,8 @@ function buildVideo(bidRequest) {
107
107
  const playerSize = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
108
108
  const context = deepAccess(bidRequest, 'mediaTypes.video.context');
109
109
 
110
- if (!w && playerSize) {
111
- if (Array.isArray(playerSize[0])) {
112
- w = parseInt(playerSize[0][0], 10);
113
- } else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) {
114
- w = parseInt(playerSize[0], 10);
115
- }
116
- }
117
- if (!h && playerSize) {
118
- if (Array.isArray(playerSize[0])) {
119
- h = parseInt(playerSize[0][1], 10);
120
- } else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) {
121
- h = parseInt(playerSize[1], 10);
122
- }
110
+ if (!h && !w && playerSize) {
111
+ ({w, h} = parsePlayerSizeToWidthHeight(playerSize, w, h));
123
112
  }
124
113
 
125
114
  const bidRequestVideo = deepAccess(bidRequest, 'mediaTypes.video');
@@ -173,6 +162,14 @@ function buildImpression(bidRequest) {
173
162
  },
174
163
  }
175
164
 
165
+ if (bidRequest?.params?.adUnitId) {
166
+ deepSetValue(imp, 'ext.prebid.bidder.insticator.adUnitId', bidRequest.params.adUnitId);
167
+ }
168
+
169
+ if (bidRequest?.params?.publisherId) {
170
+ deepSetValue(imp, 'ext.prebid.bidder.insticator.publisherId', bidRequest.params.publisherId);
171
+ }
172
+
176
173
  let bidFloor = parseFloat(deepAccess(bidRequest, 'params.floor'));
177
174
 
178
175
  if (!isNaN(bidFloor)) {
@@ -247,7 +244,7 @@ function buildDevice(bidRequest) {
247
244
  const device = {
248
245
  w: window.innerWidth,
249
246
  h: window.innerHeight,
250
- js: true,
247
+ js: 1,
251
248
  ext: {
252
249
  localStorage: storage.localStorageIsEnabled(),
253
250
  cookies: storage.cookiesAreEnabled(),
@@ -569,24 +566,12 @@ function validateVideo(bid) {
569
566
  let w = deepAccess(bid, 'mediaTypes.video.w');
570
567
  let h = deepAccess(bid, 'mediaTypes.video.h');
571
568
  const playerSize = deepAccess(bid, 'mediaTypes.video.playerSize');
572
- if (!w && playerSize) {
573
- if (Array.isArray(playerSize[0])) {
574
- w = parseInt(playerSize[0][0], 10);
575
- } else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) {
576
- w = parseInt(playerSize[0], 10);
577
- }
578
- }
579
- if (!h && playerSize) {
580
- if (Array.isArray(playerSize[0])) {
581
- h = parseInt(playerSize[0][1], 10);
582
- } else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) {
583
- h = parseInt(playerSize[1], 10);
584
- }
569
+
570
+ if (!h && !w && playerSize) {
571
+ ({w, h} = parsePlayerSizeToWidthHeight(playerSize, w, h));
585
572
  }
586
- const videoSize = [
587
- w,
588
- h,
589
- ];
573
+
574
+ const videoSize = [w, h];
590
575
 
591
576
  if (
592
577
  !validateSize(videoSize)
@@ -625,6 +610,25 @@ function validateVideo(bid) {
625
610
  return true;
626
611
  }
627
612
 
613
+ function parsePlayerSizeToWidthHeight(playerSize, w, h) {
614
+ if (!w && playerSize) {
615
+ if (Array.isArray(playerSize[0])) {
616
+ w = parseInt(playerSize[0][0], 10);
617
+ } else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) {
618
+ w = parseInt(playerSize[0], 10);
619
+ }
620
+ }
621
+ if (!h && playerSize) {
622
+ if (Array.isArray(playerSize[0])) {
623
+ h = parseInt(playerSize[0][1], 10);
624
+ } else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) {
625
+ h = parseInt(playerSize[1], 10);
626
+ }
627
+ }
628
+
629
+ return { w, h };
630
+ }
631
+
628
632
  export const spec = {
629
633
  code: BIDDER_CODE,
630
634
  gvlid: GVLID,
@@ -48,7 +48,7 @@ const SUA_ATTRIBUTES = [
48
48
 
49
49
  const CERBERUS = Object.freeze({
50
50
  KEY: 'krg_crb',
51
- SYNC_URL: 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&idx={INDEX}&gdpr={GDPR}&gdpr_consent={GDPR_CONSENT}&us_privacy={US_PRIVACY}&gpp={GPP_STRING}&gpp_sid={GPP_SID}',
51
+ SYNC_URL: 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&gdpr={GDPR}&gdpr_consent={GDPR_CONSENT}&us_privacy={US_PRIVACY}&gpp={GPP_STRING}&gpp_sid={GPP_SID}',
52
52
  SYNC_COUNT: 5,
53
53
  PAGE_VIEW_ID: 'pageViewId',
54
54
  PAGE_VIEW_TIMESTAMP: 'pageViewTimestamp',
@@ -274,19 +274,16 @@ function getUserSyncs(syncOptions, _, gdprConsent, usPrivacy, gppConsent) {
274
274
  return syncs;
275
275
  }
276
276
  if (syncOptions.iframeEnabled && seed && clientId) {
277
- for (let i = 0; i < CERBERUS.SYNC_COUNT; i++) {
278
- syncs.push({
279
- type: 'iframe',
280
- url: CERBERUS.SYNC_URL.replace('{UUID}', clientId)
281
- .replace('{SEED}', seed)
282
- .replace('{INDEX}', i)
283
- .replace('{GDPR}', gdpr)
284
- .replace('{GDPR_CONSENT}', gdprConsentString)
285
- .replace('{US_PRIVACY}', usPrivacy || '')
286
- .replace('{GPP_STRING}', gppString)
287
- .replace('{GPP_SID}', gppApplicableSections)
288
- });
289
- }
277
+ syncs.push({
278
+ type: 'iframe',
279
+ url: CERBERUS.SYNC_URL.replace('{UUID}', clientId)
280
+ .replace('{SEED}', seed)
281
+ .replace('{GDPR}', gdpr)
282
+ .replace('{GDPR_CONSENT}', gdprConsentString)
283
+ .replace('{US_PRIVACY}', usPrivacy || '')
284
+ .replace('{GPP_STRING}', gppString)
285
+ .replace('{GPP_SID}', gppApplicableSections)
286
+ })
290
287
  }
291
288
  return syncs;
292
289
  }
@@ -1,13 +1,14 @@
1
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
2
- import { BANNER } from '../src/mediaTypes.js';
2
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
3
3
  import { ortbConverter } from '../libraries/ortbConverter/converter.js'
4
4
  import { deepSetValue } from '../src/utils.js';
5
+ import {ORTB_MTYPES} from '../libraries/ortbConverter/processors/mediaType.js';
5
6
 
6
- const VERSION = '1.0.0';
7
+ const VERSION = '1.1.0';
7
8
 
8
9
  const BIDDER_CODE = 'kimberlite';
9
10
  const METHOD = 'POST';
10
- const ENDPOINT_URL = 'https://kimberlite.io/rtb/bid/pbjs';
11
+ export const ENDPOINT_URL = 'https://kimberlite.io/rtb/bid/pbjs';
11
12
 
12
13
  const VERSION_INFO = {
13
14
  ver: '$prebid.version$',
@@ -16,7 +17,6 @@ const VERSION_INFO = {
16
17
 
17
18
  const converter = ortbConverter({
18
19
  context: {
19
- mediaType: BANNER,
20
20
  netRevenue: true,
21
21
  ttl: 300
22
22
  },
@@ -35,18 +35,32 @@ const converter = ortbConverter({
35
35
  const imp = buildImp(bidRequest, context);
36
36
  imp.tagid = bidRequest.params.placementId;
37
37
  return imp;
38
- }
38
+ },
39
+
40
+ bidResponse: function (buildBidResponse, bid, context) {
41
+ if (!bid.price) return;
42
+
43
+ const [type] = Object.keys(context.bidRequest.mediaTypes);
44
+ if (Object.values(ORTB_MTYPES).includes(type)) {
45
+ context.mediaType = type;
46
+ }
47
+
48
+ const bidResponse = buildBidResponse(bid, context);
49
+ return bidResponse;
50
+ },
39
51
  });
40
52
 
41
53
  export const spec = {
42
54
  code: BIDDER_CODE,
43
- supportedMediaTypes: [BANNER],
55
+ supportedMediaTypes: [BANNER, VIDEO],
44
56
 
45
57
  isBidRequestValid: (bidRequest = {}) => {
46
58
  const { params, mediaTypes } = bidRequest;
47
59
  let isValid = Boolean(params && params.placementId);
48
60
  if (mediaTypes && mediaTypes[BANNER]) {
49
61
  isValid = isValid && Boolean(mediaTypes[BANNER].sizes);
62
+ } else if (mediaTypes && mediaTypes[VIDEO]) {
63
+ isValid = isValid && Boolean(mediaTypes[VIDEO].mimes);
50
64
  } else {
51
65
  isValid = false;
52
66
  }
@@ -58,7 +72,10 @@ export const spec = {
58
72
  return {
59
73
  method: METHOD,
60
74
  url: ENDPOINT_URL,
61
- data: converter.toORTB({ bidderRequest, bidRequests })
75
+ data: converter.toORTB({
76
+ bidRequests,
77
+ bidderRequest
78
+ })
62
79
  }
63
80
  },
64
81
 
@@ -20,7 +20,7 @@ var adUnits = [
20
20
  code: 'test-div',
21
21
  mediaTypes: {
22
22
  banner: {
23
- sizes: [[320, 250], [640, 480]],
23
+ sizes: [[320, 250], [640, 480]], // Required.
24
24
  }
25
25
  },
26
26
  bids: [
@@ -34,3 +34,32 @@ var adUnits = [
34
34
  }
35
35
  ]
36
36
  ```
37
+
38
+ ## Video AdUnit
39
+
40
+ ```javascript
41
+ var adUnits = [
42
+ {
43
+ code: 'test-div',
44
+ mediaTypes: {
45
+ video: {
46
+ // ORTB 2.5 options.
47
+ mimes: ['video/mp4'], // Required.
48
+ // Other options are optional.
49
+ placement: 1,
50
+ protocols: [3, 6],
51
+ linearity: 1,
52
+ startdelay: 0
53
+ }
54
+ },
55
+ bids: [
56
+ {
57
+ bidder: "kimberlite",
58
+ params: {
59
+ placementId: 'testVideo'
60
+ }
61
+ }
62
+ ]
63
+ }
64
+ ]
65
+ ```