prebid.js 7.48.0 → 7.50.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 (219) hide show
  1. package/README.md +3 -0
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admixerBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/aidemBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/asoBidAdapter.js +1 -1
  19. package/dist/axonixBidAdapter.js +1 -1
  20. package/dist/beopBidAdapter.js +1 -1
  21. package/dist/bidglassBidAdapter.js +1 -1
  22. package/dist/big-richmediaBidAdapter.js +1 -1
  23. package/dist/bridgewellBidAdapter.js +1 -1
  24. package/dist/brightMountainMediaBidAdapter.js +1 -1
  25. package/dist/carodaBidAdapter.js +1 -1
  26. package/dist/chtnwBidAdapter.js +1 -1
  27. package/dist/concertBidAdapter.js +1 -1
  28. package/dist/confiantRtdProvider.js +1 -1
  29. package/dist/connectadBidAdapter.js +1 -1
  30. package/dist/consumableBidAdapter.js +1 -1
  31. package/dist/conversantAnalyticsAdapter.js +1 -1
  32. package/dist/conversantBidAdapter.js +1 -1
  33. package/dist/craftBidAdapter.js +1 -1
  34. package/dist/criteoBidAdapter.js +1 -1
  35. package/dist/cwireBidAdapter.js +1 -1
  36. package/dist/dependencies.json +3 -0
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/eplanningBidAdapter.js +1 -1
  39. package/dist/feedadBidAdapter.js +1 -1
  40. package/dist/finativeBidAdapter.js +1 -1
  41. package/dist/freewheel-sspBidAdapter.js +1 -1
  42. package/dist/glimpseBidAdapter.js +1 -1
  43. package/dist/gmosspBidAdapter.js +1 -1
  44. package/dist/goldbachBidAdapter.js +1 -1
  45. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  46. package/dist/greenbidsRtdProvider.js +1 -1
  47. package/dist/gridBidAdapter.js +1 -1
  48. package/dist/gumgumBidAdapter.js +1 -1
  49. package/dist/h12mediaBidAdapter.js +1 -1
  50. package/dist/id5IdSystem.js +1 -1
  51. package/dist/improvedigitalBidAdapter.js +1 -1
  52. package/dist/inmarBidAdapter.js +1 -1
  53. package/dist/insticatorBidAdapter.js +1 -1
  54. package/dist/ixBidAdapter.js +1 -1
  55. package/dist/justpremiumBidAdapter.js +1 -1
  56. package/dist/kargoBidAdapter.js +1 -1
  57. package/dist/konduitAnalyticsAdapter.js +1 -1
  58. package/dist/kueezBidAdapter.js +1 -1
  59. package/dist/kueezRtbBidAdapter.js +1 -1
  60. package/dist/kulturemediaBidAdapter.js +1 -1
  61. package/dist/lassoBidAdapter.js +1 -1
  62. package/dist/lifestreetBidAdapter.js +1 -1
  63. package/dist/liveIntentIdSystem.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/magniteAnalyticsAdapter.js +1 -1
  68. package/dist/malltvAnalyticsAdapter.js +1 -1
  69. package/dist/marsmediaBidAdapter.js +1 -1
  70. package/dist/mediafuseBidAdapter.js +1 -1
  71. package/dist/mediasquareBidAdapter.js +1 -1
  72. package/dist/mgidBidAdapter.js +1 -1
  73. package/dist/minutemediaBidAdapter.js +1 -1
  74. package/dist/minutemediaplusBidAdapter.js +1 -1
  75. package/dist/nexx360BidAdapter.js +1 -1
  76. package/dist/not-for-prod/prebid.js +136 -134
  77. package/dist/oguryBidAdapter.js +1 -1
  78. package/dist/onetagBidAdapter.js +1 -1
  79. package/dist/ooloAnalyticsAdapter.js +1 -1
  80. package/dist/optidigitalBidAdapter.js +1 -1
  81. package/dist/outbrainBidAdapter.js +1 -1
  82. package/dist/parrableIdSystem.js +1 -1
  83. package/dist/permutiveRtdProvider.js +1 -1
  84. package/dist/pixfutureBidAdapter.js +1 -1
  85. package/dist/prebid-core.js +1 -1
  86. package/dist/prebidServerBidAdapter.js +1 -1
  87. package/dist/publinkIdSystem.js +1 -1
  88. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  89. package/dist/pubmaticBidAdapter.js +1 -1
  90. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  91. package/dist/pxyzBidAdapter.js +1 -1
  92. package/dist/quantcastBidAdapter.js +1 -1
  93. package/dist/readpeakBidAdapter.js +1 -1
  94. package/dist/relaidoBidAdapter.js +1 -1
  95. package/dist/retailspotBidAdapter.js +1 -0
  96. package/dist/rhythmoneBidAdapter.js +1 -1
  97. package/dist/riseBidAdapter.js +1 -1
  98. package/dist/rubiconAnalyticsAdapter.js +1 -1
  99. package/dist/rubiconBidAdapter.js +1 -1
  100. package/dist/seedingAllianceBidAdapter.js +1 -1
  101. package/dist/seedtagBidAdapter.js +1 -1
  102. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  103. package/dist/sharethroughBidAdapter.js +1 -1
  104. package/dist/shinezBidAdapter.js +1 -1
  105. package/dist/silverpushBidAdapter.js +1 -0
  106. package/dist/smaatoBidAdapter.js +1 -1
  107. package/dist/smartadserverBidAdapter.js +1 -1
  108. package/dist/smartxBidAdapter.js +1 -1
  109. package/dist/smilewantedBidAdapter.js +1 -1
  110. package/dist/sonobiBidAdapter.js +1 -1
  111. package/dist/sovrnAnalyticsAdapter.js +1 -1
  112. package/dist/sovrnBidAdapter.js +1 -1
  113. package/dist/sspBCBidAdapter.js +1 -1
  114. package/dist/stvBidAdapter.js +1 -1
  115. package/dist/sublimeBidAdapter.js +1 -1
  116. package/dist/synacormediaBidAdapter.js +1 -1
  117. package/dist/targetVideoBidAdapter.js +1 -1
  118. package/dist/teadsBidAdapter.js +1 -1
  119. package/dist/trionBidAdapter.js +1 -1
  120. package/dist/tripleliftBidAdapter.js +1 -1
  121. package/dist/ttdBidAdapter.js +1 -1
  122. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  123. package/dist/uid2IdSystem.js +1 -1
  124. package/dist/underdogmediaBidAdapter.js +1 -1
  125. package/dist/undertoneBidAdapter.js +1 -1
  126. package/dist/vidazooBidAdapter.js +1 -1
  127. package/dist/video.js +1 -1
  128. package/dist/videoModule.js +1 -1
  129. package/dist/videobyteBidAdapter.js +1 -1
  130. package/dist/visxBidAdapter.js +1 -1
  131. package/dist/vuukleBidAdapter.js +1 -1
  132. package/dist/widespaceBidAdapter.js +1 -1
  133. package/dist/winrBidAdapter.js +1 -1
  134. package/dist/yahoosspBidAdapter.js +1 -1
  135. package/dist/yieldlabBidAdapter.js +1 -1
  136. package/dist/yieldmoBidAdapter.js +1 -1
  137. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  138. package/integrationExamples/videoModule/eventsUI/eventsUI.css +205 -0
  139. package/integrationExamples/videoModule/eventsUI/eventsUI.js +181 -0
  140. package/integrationExamples/videoModule/jwplayer/eventsUI.html +295 -0
  141. package/integrationExamples/videoModule/videojs/eventsUI.html +319 -0
  142. package/libraries/video/shared/helpers.js +14 -0
  143. package/modules/33acrossBidAdapter.js +1 -1
  144. package/modules/adgenerationBidAdapter.js +24 -15
  145. package/modules/admixerBidAdapter.js +15 -9
  146. package/modules/aidemBidAdapter.js +3 -1
  147. package/modules/appnexusBidAdapter.js +1 -0
  148. package/modules/beopBidAdapter.js +1 -0
  149. package/modules/confiantRtdProvider.js +15 -12
  150. package/modules/conversantAnalyticsAdapter.js +7 -5
  151. package/modules/conversantBidAdapter.js +1 -1
  152. package/modules/criteoBidAdapter.js +17 -1
  153. package/modules/gridBidAdapter.js +3 -0
  154. package/modules/ixBidAdapter.js +65 -47
  155. package/modules/kueezRtbBidAdapter.js +30 -33
  156. package/modules/liveIntentIdSystem.js +8 -4
  157. package/modules/magniteAnalyticsAdapter.js +26 -3
  158. package/modules/mgidBidAdapter.js +9 -8
  159. package/modules/minutemediaBidAdapter.js +6 -0
  160. package/modules/minutemediaplusBidAdapter.js +30 -32
  161. package/modules/nexx360BidAdapter.js +2 -1
  162. package/modules/permutiveRtdProvider.js +9 -38
  163. package/modules/prebidServerBidAdapter/index.js +1 -3
  164. package/modules/prebidServerBidAdapter/ortbConverter.js +5 -1
  165. package/modules/pubmaticAnalyticsAdapter.js +3 -2
  166. package/modules/retailspotBidAdapter .md +32 -0
  167. package/modules/retailspotBidAdapter.js +186 -0
  168. package/modules/riseBidAdapter.js +6 -0
  169. package/modules/rubiconBidAdapter.js +6 -2
  170. package/modules/silverpushBidAdapter.js +326 -0
  171. package/modules/silverpushBidAdapter.md +107 -0
  172. package/modules/ttdBidAdapter.js +23 -22
  173. package/modules/underdogmediaBidAdapter.js +2 -2
  174. package/modules/vidazooBidAdapter.js +28 -32
  175. package/modules/videoModule/adQueue.js +2 -2
  176. package/modules/videoModule/index.js +9 -5
  177. package/modules/yahoosspBidAdapter.js +6 -0
  178. package/modules/yahoosspBidAdapter.md +37 -0
  179. package/modules/yieldlabBidAdapter.js +27 -5
  180. package/package.json +1 -1
  181. package/src/adapterManager.js +4 -0
  182. package/src/adapters/bidderFactory.js +1 -0
  183. package/src/auction.js +2 -0
  184. package/src/prebid.js +36 -12
  185. package/src/utils/cpm.js +4 -1
  186. package/test/spec/modules/33acrossBidAdapter_spec.js +4 -3
  187. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  188. package/test/spec/modules/admixerBidAdapter_spec.js +64 -25
  189. package/test/spec/modules/aidemBidAdapter_spec.js +3 -0
  190. package/test/spec/modules/beopBidAdapter_spec.js +4 -0
  191. package/test/spec/modules/confiantRtdProvider_spec.js +4 -1
  192. package/test/spec/modules/conversantBidAdapter_spec.js +2 -1
  193. package/test/spec/modules/criteoBidAdapter_spec.js +109 -0
  194. package/test/spec/modules/gridBidAdapter_spec.js +3 -0
  195. package/test/spec/modules/ixBidAdapter_spec.js +66 -1
  196. package/test/spec/modules/kueezRtbBidAdapter_spec.js +3 -2
  197. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +28 -0
  198. package/test/spec/modules/liveIntentIdSystem_spec.js +45 -0
  199. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +16 -36
  200. package/test/spec/modules/mass_spec.js +2 -0
  201. package/test/spec/modules/mgidBidAdapter_spec.js +9 -9
  202. package/test/spec/modules/minutemediaBidAdapter_spec.js +18 -0
  203. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +3 -2
  204. package/test/spec/modules/permutiveRtdProvider_spec.js +0 -20
  205. package/test/spec/modules/prebidServerBidAdapter_spec.js +96 -1
  206. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +6 -1
  207. package/test/spec/modules/retailspotBidAdapter_spec.js +426 -0
  208. package/test/spec/modules/riseBidAdapter_spec.js +18 -0
  209. package/test/spec/modules/rubiconBidAdapter_spec.js +143 -67
  210. package/test/spec/modules/silverpushBidAdapter_spec.js +394 -0
  211. package/test/spec/modules/ttdBidAdapter_spec.js +129 -2
  212. package/test/spec/modules/underdogmediaBidAdapter_spec.js +1 -1
  213. package/test/spec/modules/vidazooBidAdapter_spec.js +3 -2
  214. package/test/spec/modules/videoModule/shared/helpers_spec.js +22 -0
  215. package/test/spec/modules/yahoosspBidAdapter_spec.js +60 -1
  216. package/test/spec/modules/yieldlabBidAdapter_spec.js +8 -1
  217. package/test/spec/unit/core/bidderFactory_spec.js +9 -9
  218. package/test/spec/unit/pbjs_api_spec.js +59 -1
  219. package/test/spec/unit/utils/cpm_spec.js +56 -1
@@ -2,6 +2,7 @@ import * as utils from '../src/utils.js';
2
2
  import { config } from '../src/config.js';
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
5
+ import {isNumber} from '../src/utils.js';
5
6
 
6
7
  const BIDADAPTERVERSION = 'TTD-PREBID-2022.06.28';
7
8
  const BIDDER_CODE = 'ttd';
@@ -75,7 +76,7 @@ function getSource(validBidRequests) {
75
76
  return source;
76
77
  }
77
78
 
78
- function getDevice() {
79
+ function getDevice(firstPartyData) {
79
80
  const language = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
80
81
  let device = {
81
82
  ua: navigator.userAgent,
@@ -84,6 +85,8 @@ function getDevice() {
84
85
  connectiontype: getConnectionType()
85
86
  };
86
87
 
88
+ utils.mergeDeep(device, firstPartyData.device)
89
+
87
90
  return device;
88
91
  };
89
92
 
@@ -114,7 +117,7 @@ function getConnectionType() {
114
117
  }
115
118
  }
116
119
 
117
- function getUser(bidderRequest) {
120
+ function getUser(bidderRequest, firstPartyData) {
118
121
  let user = {};
119
122
  if (bidderRequest.gdprConsent) {
120
123
  utils.deepSetValue(user, 'ext.consent', bidderRequest.gdprConsent.consentString);
@@ -129,13 +132,8 @@ function getUser(bidderRequest) {
129
132
  utils.deepSetValue(user, 'ext.eids', eids);
130
133
  }
131
134
 
132
- // gather user.data
133
- const ortb2UserData = utils.deepAccess(bidderRequest, 'ortb2.user.data');
134
- if (ortb2UserData && ortb2UserData.length) {
135
- user = utils.mergeDeep(user, {
136
- data: [...ortb2UserData]
137
- });
138
- };
135
+ utils.mergeDeep(user, firstPartyData.user)
136
+
139
137
  return user;
140
138
  }
141
139
 
@@ -163,16 +161,6 @@ function getImpression(bidRequest) {
163
161
  };
164
162
 
165
163
  const gpid = utils.deepAccess(bidRequest, 'ortb2Imp.ext.gpid');
166
- const tid = utils.deepAccess(bidRequest, 'ortb2Imp.ext.tid');
167
- const rwdd = utils.deepAccess(bidRequest, 'ortb2Imp.rwdd');
168
- if (gpid || tid) {
169
- impression.ext = {}
170
- if (gpid) { impression.ext.gpid = gpid }
171
- if (tid) { impression.ext.tid = tid }
172
- }
173
- if (rwdd) {
174
- impression.rwdd = rwdd;
175
- }
176
164
  const tagid = gpid || bidRequest.params.placementId;
177
165
  if (tagid) {
178
166
  impression.tagid = tagid;
@@ -197,6 +185,11 @@ function getImpression(bidRequest) {
197
185
  impression.bidfloorcur = 'USD';
198
186
  }
199
187
 
188
+ const secure = utils.deepAccess(bidRequest, 'ortb2Imp.secure');
189
+ impression.secure = isNumber(secure) ? secure : 1
190
+
191
+ utils.mergeDeep(impression, bidRequest.ortb2Imp)
192
+
200
193
  return impression;
201
194
  }
202
195
 
@@ -416,8 +409,8 @@ export const spec = {
416
409
  id: bidderRequest.auctionId,
417
410
  imp: validBidRequests.map(bidRequest => getImpression(bidRequest)),
418
411
  site: getSite(bidderRequest, firstPartyData),
419
- device: getDevice(),
420
- user: getUser(bidderRequest),
412
+ device: getDevice(firstPartyData),
413
+ user: getUser(bidderRequest, firstPartyData),
421
414
  at: 1,
422
415
  cur: ['USD'],
423
416
  regs: getRegs(bidderRequest),
@@ -433,6 +426,14 @@ export const spec = {
433
426
  topLevel.badv = firstPartyData.badv;
434
427
  }
435
428
 
429
+ if (firstPartyData && firstPartyData.app) {
430
+ topLevel.app = firstPartyData.app
431
+ }
432
+
433
+ if (firstPartyData && firstPartyData.pmp) {
434
+ topLevel.pmp = firstPartyData.pmp
435
+ }
436
+
436
437
  let url = BIDDER_ENDPOINT + bidderRequest.bids[0].params.supplySourceId;
437
438
 
438
439
  let serverRequest = {
@@ -468,7 +469,7 @@ export const spec = {
468
469
  * @param {ttdResponseObj} bidResponse A successful response from ttd.
469
470
  * @param {ServerRequest} serverRequest The result of buildRequests() that lead to this response.
470
471
  * @return {Bid[]} An array of formatted bids.
471
- */
472
+ */
472
473
  interpretResponse: function (response, serverRequest) {
473
474
  let seatBidsInResponse = utils.deepAccess(response, 'body.seatbid');
474
475
  const currency = utils.deepAccess(response, 'body.cur');
@@ -74,7 +74,7 @@ export const spec = {
74
74
  pbTimeout: config.getConfig('bidderTimeout'),
75
75
  pbjsVersion: prebidVersion,
76
76
  placements: [],
77
- ref: deepAccess(bidderRequest, 'refererInfo.ref') ? bidderRequest.refererInfo.ref : undefined,
77
+ ref: deepAccess(bidderRequest, 'refererInfo.page') ? bidderRequest.refererInfo.page : undefined,
78
78
  usp: {},
79
79
  userIds: {
80
80
  '33acrossId': deepAccess(validBidRequests[0], 'userId.33acrossId.envelope') ? validBidRequests[0].userId['33acrossId'].envelope : undefined,
@@ -193,7 +193,7 @@ export const spec = {
193
193
  creativeId: mid.mid,
194
194
  currency: 'USD',
195
195
  netRevenue: false,
196
- ttl: mid.ttl || 60,
196
+ ttl: mid.ttl || 300,
197
197
  meta: {
198
198
  advertiserDomains: mid.advertiser_domains || []
199
199
  }
@@ -15,18 +15,6 @@ const DEAL_ID_EXPIRY = 1000 * 60 * 15;
15
15
  const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60;
16
16
  const SESSION_ID_KEY = 'vidSid';
17
17
  const OPT_CACHE_KEY = 'vdzwopt';
18
- export const SUPPORTED_ID_SYSTEMS = {
19
- 'britepoolid': 1,
20
- 'criteoId': 1,
21
- 'id5id': 1,
22
- 'idl_env': 1,
23
- 'lipb': 1,
24
- 'netId': 1,
25
- 'parrableId': 1,
26
- 'pubcid': 1,
27
- 'tdid': 1,
28
- 'pubProvidedId': 1
29
- };
30
18
  export const webSessionId = 'wsid_' + parseInt(Date.now() * Math.random());
31
19
  const storage = getStorageManager({bidderCode: BIDDER_CODE});
32
20
 
@@ -180,25 +168,22 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
180
168
  function appendUserIdsToRequestPayload(payloadRef, userIds) {
181
169
  let key;
182
170
  _each(userIds, (userId, idSystemProviderName) => {
183
- if (SUPPORTED_ID_SYSTEMS[idSystemProviderName]) {
184
- key = `uid.${idSystemProviderName}`;
185
-
186
- switch (idSystemProviderName) {
187
- case 'digitrustid':
188
- payloadRef[key] = deepAccess(userId, 'data.id');
189
- break;
190
- case 'lipb':
191
- payloadRef[key] = userId.lipbid;
192
- break;
193
- case 'parrableId':
194
- payloadRef[key] = userId.eid;
195
- break;
196
- case 'id5id':
197
- payloadRef[key] = userId.uid;
198
- break;
199
- default:
200
- payloadRef[key] = userId;
201
- }
171
+ key = `uid.${idSystemProviderName}`;
172
+ switch (idSystemProviderName) {
173
+ case 'digitrustid':
174
+ payloadRef[key] = deepAccess(userId, 'data.id');
175
+ break;
176
+ case 'lipb':
177
+ payloadRef[key] = userId.lipbid;
178
+ break;
179
+ case 'parrableId':
180
+ payloadRef[key] = userId.eid;
181
+ break;
182
+ case 'id5id':
183
+ payloadRef[key] = userId.uid;
184
+ break;
185
+ default:
186
+ payloadRef[key] = userId;
202
187
  }
203
188
  });
204
189
  }
@@ -227,7 +212,18 @@ function interpretResponse(serverResponse, request) {
227
212
 
228
213
  try {
229
214
  results.forEach(result => {
230
- const {creativeId, ad, price, exp, width, height, currency, advertiserDomains, metaData, mediaType = BANNER} = result;
215
+ const {
216
+ creativeId,
217
+ ad,
218
+ price,
219
+ exp,
220
+ width,
221
+ height,
222
+ currency,
223
+ advertiserDomains,
224
+ metaData,
225
+ mediaType = BANNER
226
+ } = result;
231
227
  if (!ad || !price) {
232
228
  return;
233
229
  }
@@ -1,5 +1,5 @@
1
1
  import { AD_BREAK_END, AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, SETUP_COMPLETE } from '../../libraries/video/constants/events.js'
2
- import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
2
+ import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
3
3
 
4
4
  export function AdQueueCoordinator(videoCore, pbEvents) {
5
5
  const storage = {};
@@ -58,6 +58,6 @@ export function AdQueueCoordinator(videoCore, pbEvents) {
58
58
 
59
59
  function triggerEvent(eventName, adTagUrl, options) {
60
60
  const payload = Object.assign({ adTagUrl }, options);
61
- pbEvents.emit(getExternalVideoEventName(eventName), payload);
61
+ pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, payload));
62
62
  }
63
63
  }
@@ -1,7 +1,7 @@
1
1
  import { config } from '../../src/config.js';
2
2
  import { find } from '../../src/polyfill.js';
3
3
  import * as events from '../../src/events.js';
4
- import { mergeDeep } from '../../src/utils.js';
4
+ import { mergeDeep, logWarn } from '../../src/utils.js';
5
5
  import { getGlobal } from '../../src/prebidGlobal.js';
6
6
  import CONSTANTS from '../../src/constants.json';
7
7
  import {
@@ -20,7 +20,7 @@ import { videoCoreFactory } from './coreVideo.js';
20
20
  import { gamSubmoduleFactory } from './gamAdServerSubmodule.js';
21
21
  import { videoImpressionVerifierFactory } from './videoImpressionVerifier.js';
22
22
  import { AdQueueCoordinator } from './adQueue.js';
23
- import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
23
+ import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
24
24
 
25
25
  const allVideoEvents = Object.keys(videoEvents).map(eventKey => videoEvents[eventKey]);
26
26
  events.addEvents(allVideoEvents.concat([AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, AUCTION_AD_LOAD_ABORT, BID_IMPRESSION, BID_ERROR]).map(getExternalVideoEventName));
@@ -54,7 +54,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
54
54
  adQueueCoordinator.registerProvider(divId);
55
55
  videoCore.initProvider(divId);
56
56
  videoCore.onEvents(videoEvents, (type, payload) => {
57
- pbEvents.emit(getExternalVideoEventName(type), payload);
57
+ pbEvents.emit(getExternalVideoEventName(type), getExternalVideoEventPayload(type, payload));
58
58
  }, divId);
59
59
 
60
60
  const adServerConfig = provider.adServer;
@@ -145,6 +145,10 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
145
145
  video.context = ortbVideo.placement === PLACEMENT.INSTREAM ? 'instream' : 'outstream';
146
146
  }
147
147
 
148
+ if (!video.plcmt) {
149
+ logWarn('Video.plcmt has not been set. Failure to set a value may result in loss of bids');
150
+ }
151
+
148
152
  const width = ortbVideo.w;
149
153
  const height = ortbVideo.h;
150
154
  if (!video.playerSize && width && height) {
@@ -199,7 +203,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
199
203
 
200
204
  const highestCpmBids = pbGlobal.getHighestCpmBids(adUnitCode);
201
205
  if (!highestCpmBids.length) {
202
- pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), options);
206
+ pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), getExternalVideoEventPayload(AUCTION_AD_LOAD_ABORT, options));
203
207
  return;
204
208
  }
205
209
 
@@ -223,7 +227,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
223
227
  }
224
228
 
225
229
  pbGlobal.markWinningBidAsUsed(bid);
226
- pbEvents.emit(getExternalVideoEventName(eventName), { bid, adEvent: adEventPayload });
230
+ pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, { bid, adEvent: adEventPayload }));
227
231
  }
228
232
 
229
233
  function getBid(adPayload) {
@@ -380,6 +380,7 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
380
380
  const ortb2Object = bid.ortb2;
381
381
  const siteObject = deepAccess(ortb2Object, 'site') || undefined;
382
382
  const siteContentObject = deepAccess(siteObject, 'content') || undefined;
383
+ const sitePublisherObject = deepAccess(siteObject, 'publisher') || undefined;
383
384
  const siteContentDataArray = deepAccess(siteObject, 'content.data') || undefined;
384
385
  const appContentObject = deepAccess(ortb2Object, 'app.content') || undefined;
385
386
  const appContentDataArray = deepAccess(ortb2Object, 'app.content.data') || undefined;
@@ -394,6 +395,11 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
394
395
  outBoundBidRequest.site = validateAppendObject('object', allowedSiteObjectKeys, siteObject, outBoundBidRequest.site);
395
396
  };
396
397
 
398
+ if (sitePublisherObject && isPlainObject(sitePublisherObject)) {
399
+ const allowedPublisherObjectKeys = ['ext'];
400
+ outBoundBidRequest.site.publisher = validateAppendObject('object', allowedPublisherObjectKeys, sitePublisherObject, outBoundBidRequest.site.publisher);
401
+ }
402
+
397
403
  if (siteContentObject && isPlainObject(siteContentObject)) {
398
404
  const allowedContentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language'];
399
405
  const allowedContentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len'];
@@ -435,6 +435,43 @@ pbjs.setConfig({
435
435
  }
436
436
  });
437
437
  ```
438
+
439
+ Notes: The first party site info is filtered and only the following specific keys are allowed in the bidRequests:
440
+
441
+ | Field | Type |
442
+ |-----------------------------|--------|
443
+ | site.name | String |
444
+ | site.domain | String |
445
+ | site.page | String |
446
+ | site.ref | String |
447
+ | site.keywords | String |
448
+ | site.search | String |
449
+ | site.cat | Array |
450
+ | site.sectioncat | Array |
451
+ | site.pagecat | Array |
452
+ | site.ext | Object |
453
+ | site.publisher.ext | Object |
454
+ | site.content.id | String |
455
+ | site.content.title | String |
456
+ | site.content.series | String |
457
+ | site.content.season | String |
458
+ | site.content.genre | String |
459
+ | site.content.contentrating | String |
460
+ | site.content.language | String |
461
+ | site.content.episode | Number |
462
+ | site.content.prodq | Number |
463
+ | site.content.context | Number |
464
+ | site.content.livestream | Number |
465
+ | site.content.len | Number |
466
+ | site.content.cat | Array |
467
+ | site.content.ext | Object |
468
+ | site.content.data | Array |
469
+ | site.content.data[].id | String |
470
+ | site.content.data[].name | String |
471
+ | site.content.data[].segment | Array |
472
+ | site.content.data[].ext | Object |
473
+
474
+
438
475
  ### Passing First Party "user" data:
439
476
  ```javascript
440
477
  pbjs.setConfig({
@@ -184,13 +184,12 @@ export const spec = {
184
184
 
185
185
  if (isNative(bidRequest, adType)) {
186
186
  // there may be publishers still rely on it
187
- const url = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
188
- bidResponse.adUrl = url;
187
+ bidResponse.adUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
189
188
  bidResponse.mediaType = NATIVE;
190
- const nativeImageAssetObj = find(matchedBid.native.assets, e => e.id === 2);
189
+ const nativeImageAssetObj = find(matchedBid.native.assets, asset => isMainImage(asset));
191
190
  const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : { url: '', w: 0, h: 0 };
192
- const nativeTitleAsset = find(matchedBid.native.assets, e => e.id === 1);
193
- const nativeBodyAsset = find(matchedBid.native.assets, e => e.id === 3);
191
+ const nativeTitleAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'title'));
192
+ const nativeBodyAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'data'));
194
193
  bidResponse.native = {
195
194
  title: nativeTitleAsset ? nativeTitleAsset.title.text : '',
196
195
  body: nativeBodyAsset ? nativeBodyAsset.data.value : '',
@@ -201,6 +200,7 @@ export const spec = {
201
200
  },
202
201
  clickUrl: matchedBid.native.link.url,
203
202
  impressionTrackers: matchedBid.native.imptrackers,
203
+ assets: matchedBid.native.assets,
204
204
  };
205
205
  }
206
206
 
@@ -505,4 +505,26 @@ function getBidFloor(bid, sizes) {
505
505
  return undefined;
506
506
  }
507
507
 
508
+ /**
509
+ * Checks if an object has a property with a given name and the property value is not null or undefined.
510
+ *
511
+ * @param {Object} obj - The object to check.
512
+ * @param {string} propName - The name of the property to check.
513
+ * @returns {boolean} Returns true if the object has a property with the given name and the property value is not null or undefined, otherwise false.
514
+ */
515
+ function hasValidProperty(obj, propName) {
516
+ return obj.hasOwnProperty(propName) && obj[propName] != null;
517
+ }
518
+
519
+ /**
520
+ * Checks if an asset object is a main image.
521
+ * A main image is defined as an image asset whose type value is 3.
522
+ *
523
+ * @param {Object} asset - The asset object to check.
524
+ * @returns {boolean} Returns true if the object has a property img.type with a value of 3, otherwise false.
525
+ */
526
+ function isMainImage(asset) {
527
+ return asset?.img?.type === 3
528
+ }
529
+
508
530
  registerBidder(spec);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.48.0",
3
+ "version": "7.50.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
@@ -612,6 +612,10 @@ adapterManager.callBidWonBidder = function(bidder, bid, adUnits) {
612
612
  tryCallBidderMethod(bidder, 'onBidWon', bid);
613
613
  };
614
614
 
615
+ adapterManager.callBidBillableBidder = function(bid) {
616
+ tryCallBidderMethod(bid.bidder, 'onBidBillable', bid);
617
+ };
618
+
615
619
  adapterManager.callSetTargetingBidder = function(bidder, bid) {
616
620
  tryCallBidderMethod(bidder, 'onSetTargeting', bid);
617
621
  };
@@ -306,6 +306,7 @@ export function newBidder(spec) {
306
306
  return true;
307
307
  }
308
308
  }
309
+
309
310
  return false;
310
311
  }
311
312
 
package/src/auction.js CHANGED
@@ -367,8 +367,10 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
367
367
  }
368
368
 
369
369
  function addWinningBid(winningBid) {
370
+ const winningAd = adUnits.find(adUnit => adUnit.transactionId === winningBid.transactionId);
370
371
  _winningBids = _winningBids.concat(winningBid);
371
372
  adapterManager.callBidWonBidder(winningBid.adapterCode || winningBid.bidder, winningBid, adUnits);
373
+ if (winningAd && !winningAd.deferBilling) adapterManager.callBidBillableBidder(winningBid);
372
374
  }
373
375
 
374
376
  function setBidTargeting(bid) {
package/src/prebid.js CHANGED
@@ -1001,18 +1001,7 @@ if (FEATURES.VIDEO) {
1001
1001
  * @alias module:pbjs.markWinningBidAsUsed
1002
1002
  */
1003
1003
  pbjsInstance.markWinningBidAsUsed = function (markBidRequest) {
1004
- let bids = [];
1005
-
1006
- if (markBidRequest.adUnitCode && markBidRequest.adId) {
1007
- bids = auctionManager.getBidsReceived()
1008
- .filter(bid => bid.adId === markBidRequest.adId && bid.adUnitCode === markBidRequest.adUnitCode);
1009
- } else if (markBidRequest.adUnitCode) {
1010
- bids = targeting.getWinningBids(markBidRequest.adUnitCode);
1011
- } else if (markBidRequest.adId) {
1012
- bids = auctionManager.getBidsReceived().filter(bid => bid.adId === markBidRequest.adId);
1013
- } else {
1014
- logWarn('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
1015
- }
1004
+ const bids = fetchReceivedBids(markBidRequest, 'Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
1016
1005
 
1017
1006
  if (bids.length > 0) {
1018
1007
  bids[0].status = CONSTANTS.BID_STATUS.RENDERED;
@@ -1020,6 +1009,23 @@ if (FEATURES.VIDEO) {
1020
1009
  }
1021
1010
  }
1022
1011
 
1012
+ const fetchReceivedBids = (bidRequest, warningMessage) => {
1013
+ let bids = [];
1014
+
1015
+ if (bidRequest.adUnitCode && bidRequest.adId) {
1016
+ bids = auctionManager.getBidsReceived()
1017
+ .filter(bid => bid.adId === bidRequest.adId && bid.adUnitCode === bidRequest.adUnitCode);
1018
+ } else if (bidRequest.adUnitCode) {
1019
+ bids = targeting.getWinningBids(bidRequest.adUnitCode);
1020
+ } else if (bidRequest.adId) {
1021
+ bids = auctionManager.getBidsReceived().filter(bid => bid.adId === bidRequest.adId);
1022
+ } else {
1023
+ logWarn(warningMessage);
1024
+ }
1025
+
1026
+ return bids;
1027
+ };
1028
+
1023
1029
  /**
1024
1030
  * Get Prebid config options
1025
1031
  * @param {Object} options
@@ -1097,4 +1103,22 @@ pbjsInstance.processQueue = function () {
1097
1103
  processQueue(pbjsInstance.cmd);
1098
1104
  };
1099
1105
 
1106
+ /**
1107
+ * @alias module:pbjs.triggerBilling
1108
+ */
1109
+ pbjsInstance.triggerBilling = (winningBid) => {
1110
+ const bids = fetchReceivedBids(winningBid, 'Improper use of triggerBilling. It requires a bid with at least an adUnitCode or an adId to function.');
1111
+ const triggerBillingBid = bids.find(bid => bid.requestId === winningBid.requestId) || bids[0];
1112
+
1113
+ if (bids.length > 0 && triggerBillingBid) {
1114
+ try {
1115
+ adapterManager.callBidBillableBidder(triggerBillingBid);
1116
+ } catch (e) {
1117
+ logError('Error when triggering billing :', e);
1118
+ }
1119
+ } else {
1120
+ logWarn('The bid provided to triggerBilling did not match any bids received.');
1121
+ }
1122
+ };
1123
+
1100
1124
  export default pbjsInstance;
package/src/utils/cpm.js CHANGED
@@ -4,7 +4,10 @@ import {logError} from '../utils.js';
4
4
 
5
5
  export function adjustCpm(cpm, bidResponse, bidRequest, {index = auctionManager.index, bs = bidderSettings} = {}) {
6
6
  bidRequest = bidRequest || index.getBidRequest(bidResponse);
7
- const bidCpmAdjustment = bs.get(bidResponse?.bidderCode || bidRequest?.bidder, 'bidCpmAdjustment');
7
+ const adapterCode = bidResponse?.adapterCode;
8
+ const bidderCode = bidResponse?.bidderCode || bidRequest?.bidder;
9
+ const adjustAlternateBids = bs.get(bidResponse?.adapterCode, 'adjustAlternateBids');
10
+ const bidCpmAdjustment = bs.getOwn(bidderCode, 'bidCpmAdjustment') || bs.get(adjustAlternateBids ? adapterCode : bidderCode, 'bidCpmAdjustment');
8
11
 
9
12
  if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
10
13
  try {
@@ -53,7 +53,8 @@ describe('33acrossBidAdapter:', function () {
53
53
  brand: 'macOS',
54
54
  version: ['11', '6', '8']
55
55
  },
56
- model: ''
56
+ model: '',
57
+ mobile: 0
57
58
  }
58
59
  },
59
60
  id: 'r1',
@@ -337,7 +338,7 @@ describe('33acrossBidAdapter:', function () {
337
338
  version: ['11', '6', '8']
338
339
  },
339
340
  model: '',
340
- mobile: false
341
+ mobile: 0
341
342
  }
342
343
  }
343
344
  }
@@ -369,7 +370,7 @@ describe('33acrossBidAdapter:', function () {
369
370
  version: ['11', '6', '8']
370
371
  },
371
372
  model: '',
372
- mobile: false
373
+ mobile: 0
373
374
  }
374
375
  }
375
376
  },
@@ -144,12 +144,12 @@ describe('AdgenerationAdapter', function () {
144
144
  }
145
145
  };
146
146
  const data = {
147
- banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
148
- bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
149
- native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&tp=https%3A%2F%2Fexample.com`,
150
- bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
151
- bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
152
- bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
147
+ banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
148
+ bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
149
+ native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&tp=https%3A%2F%2Fexample.com`,
150
+ bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
151
+ bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
152
+ bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
153
153
  };
154
154
  it('sends bid request to ENDPOINT via GET', function () {
155
155
  const request = spec.buildRequests(bidRequests, bidderRequest)[0];