prebid.js 7.24.0 → 7.26.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 (191) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adgenerationBidAdapter.js +1 -1
  5. package/dist/admaticBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/adxcgBidAdapter.js +1 -1
  9. package/dist/ajaBidAdapter.js +1 -1
  10. package/dist/amxBidAdapter.js +1 -1
  11. package/dist/amxIdSystem.js +1 -1
  12. package/dist/appierAnalyticsAdapter.js +1 -1
  13. package/dist/appnexusBidAdapter.js +1 -1
  14. package/dist/asoBidAdapter.js +1 -1
  15. package/dist/axonixBidAdapter.js +1 -1
  16. package/dist/beopBidAdapter.js +1 -1
  17. package/dist/bidglassBidAdapter.js +1 -1
  18. package/dist/big-richmediaBidAdapter.js +1 -1
  19. package/dist/bridgewellBidAdapter.js +1 -1
  20. package/dist/brightMountainMediaBidAdapter.js +1 -1
  21. package/dist/captifyRtdProvider.js +1 -0
  22. package/dist/carodaBidAdapter.js +1 -1
  23. package/dist/chtnwBidAdapter.js +1 -1
  24. package/dist/concertBidAdapter.js +1 -1
  25. package/dist/connectadBidAdapter.js +1 -1
  26. package/dist/consumableBidAdapter.js +1 -1
  27. package/dist/conversantBidAdapter.js +1 -1
  28. package/dist/craftBidAdapter.js +1 -1
  29. package/dist/criteoBidAdapter.js +1 -1
  30. package/dist/discoveryBidAdapter.js +1 -1
  31. package/dist/dspxBidAdapter.js +1 -1
  32. package/dist/eplanningBidAdapter.js +1 -1
  33. package/dist/finativeBidAdapter.js +1 -1
  34. package/dist/glimpseBidAdapter.js +1 -1
  35. package/dist/gmosspBidAdapter.js +1 -1
  36. package/dist/goldbachBidAdapter.js +1 -1
  37. package/dist/gridBidAdapter.js +1 -1
  38. package/dist/gridNMBidAdapter.js +1 -1
  39. package/dist/gumgumBidAdapter.js +1 -1
  40. package/dist/h12mediaBidAdapter.js +1 -1
  41. package/dist/id5IdSystem.js +1 -1
  42. package/dist/improvedigitalBidAdapter.js +1 -1
  43. package/dist/inmarBidAdapter.js +1 -1
  44. package/dist/insticatorBidAdapter.js +1 -1
  45. package/dist/ixBidAdapter.js +1 -1
  46. package/dist/justpremiumBidAdapter.js +1 -1
  47. package/dist/kargoBidAdapter.js +1 -1
  48. package/dist/konduitAnalyticsAdapter.js +1 -1
  49. package/dist/kueezBidAdapter.js +1 -1
  50. package/dist/kueezRtbBidAdapter.js +1 -1
  51. package/dist/lassoBidAdapter.js +1 -1
  52. package/dist/lifestreetBidAdapter.js +1 -1
  53. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  54. package/dist/logicadBidAdapter.js +1 -1
  55. package/dist/loglyliftBidAdapter.js +1 -1
  56. package/dist/magniteAnalyticsAdapter.js +1 -1
  57. package/dist/malltvAnalyticsAdapter.js +1 -1
  58. package/dist/marsmediaBidAdapter.js +1 -1
  59. package/dist/mediafuseBidAdapter.js +1 -1
  60. package/dist/mediasquareBidAdapter.js +1 -1
  61. package/dist/mgidBidAdapter.js +1 -1
  62. package/dist/microadBidAdapter.js +1 -1
  63. package/dist/minutemediaBidAdapter.js +1 -1
  64. package/dist/nextMillenniumBidAdapter.js +1 -1
  65. package/dist/not-for-prod/prebid.js +154 -120
  66. package/dist/oguryBidAdapter.js +1 -1
  67. package/dist/onetagBidAdapter.js +1 -1
  68. package/dist/ooloAnalyticsAdapter.js +1 -1
  69. package/dist/outbrainBidAdapter.js +1 -1
  70. package/dist/parrableIdSystem.js +1 -1
  71. package/dist/pixfutureBidAdapter.js +1 -1
  72. package/dist/prebid-core.js +1 -1
  73. package/dist/publinkIdSystem.js +1 -1
  74. package/dist/pubmaticBidAdapter.js +1 -1
  75. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  76. package/dist/pxyzBidAdapter.js +1 -1
  77. package/dist/quantcastBidAdapter.js +1 -1
  78. package/dist/readpeakBidAdapter.js +1 -1
  79. package/dist/relaidoBidAdapter.js +1 -1
  80. package/dist/rhythmoneBidAdapter.js +1 -1
  81. package/dist/riseBidAdapter.js +1 -1
  82. package/dist/rubiconAnalyticsAdapter.js +1 -1
  83. package/dist/rubiconBidAdapter.js +1 -1
  84. package/dist/seedingAllianceBidAdapter.js +1 -1
  85. package/dist/seedtagBidAdapter.js +1 -1
  86. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  87. package/dist/sharethroughBidAdapter.js +1 -1
  88. package/dist/shinezBidAdapter.js +1 -1
  89. package/dist/smaatoBidAdapter.js +1 -1
  90. package/dist/smartadserverBidAdapter.js +1 -1
  91. package/dist/smartxBidAdapter.js +1 -1
  92. package/dist/smartytechBidAdapter.js +1 -0
  93. package/dist/smilewantedBidAdapter.js +1 -1
  94. package/dist/sonobiBidAdapter.js +1 -1
  95. package/dist/sovrnAnalyticsAdapter.js +1 -1
  96. package/dist/sovrnBidAdapter.js +1 -1
  97. package/dist/sspBCBidAdapter.js +1 -1
  98. package/dist/sublimeBidAdapter.js +1 -1
  99. package/dist/synacormediaBidAdapter.js +1 -1
  100. package/dist/taboolaBidAdapter.js +1 -1
  101. package/dist/tappxBidAdapter.js +1 -1
  102. package/dist/targetVideoBidAdapter.js +1 -1
  103. package/dist/teadsBidAdapter.js +1 -1
  104. package/dist/trionBidAdapter.js +1 -1
  105. package/dist/tripleliftBidAdapter.js +1 -1
  106. package/dist/ttdBidAdapter.js +1 -1
  107. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  108. package/dist/underdogmediaBidAdapter.js +1 -1
  109. package/dist/undertoneBidAdapter.js +1 -1
  110. package/dist/userId.js +1 -1
  111. package/dist/vidazooBidAdapter.js +1 -1
  112. package/dist/videobyteBidAdapter.js +1 -1
  113. package/dist/viqeoBidAdapter.js +1 -0
  114. package/dist/visxBidAdapter.js +1 -1
  115. package/dist/vuukleBidAdapter.js +1 -1
  116. package/dist/widespaceBidAdapter.js +1 -1
  117. package/dist/winrBidAdapter.js +1 -1
  118. package/dist/yahoosspBidAdapter.js +1 -1
  119. package/dist/yieldlabBidAdapter.js +1 -1
  120. package/dist/yieldmoBidAdapter.js +1 -1
  121. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  122. package/dist/zeta_global_sspBidAdapter.js +1 -1
  123. package/dist/zeusPrimeRtdProvider.js +31 -0
  124. package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
  125. package/modules/.submodules.json +3 -1
  126. package/modules/adagioBidAdapter.js +1 -1
  127. package/modules/admaticBidAdapter.js +108 -59
  128. package/modules/admaticBidAdapter.md +2 -2
  129. package/modules/beopBidAdapter.js +17 -2
  130. package/modules/captifyRtdProvider.js +146 -0
  131. package/modules/captifyRtdProvider.md +68 -0
  132. package/modules/concertBidAdapter.js +17 -3
  133. package/modules/conversantAnalyticsAdapter.md +12 -13
  134. package/modules/conversantBidAdapter.md +3 -3
  135. package/modules/discoveryBidAdapter.js +38 -17
  136. package/modules/discoveryBidAdapter.md +7 -6
  137. package/modules/gridBidAdapter.js +440 -22
  138. package/modules/kargoBidAdapter.js +14 -8
  139. package/modules/magniteAnalyticsAdapter.js +1 -1
  140. package/modules/microadBidAdapter.js +22 -11
  141. package/modules/nextMillenniumBidAdapter.js +20 -24
  142. package/modules/oguryBidAdapter.js +5 -2
  143. package/modules/pubmaticBidAdapter.js +1 -1
  144. package/modules/seedtagBidAdapter.js +9 -4
  145. package/modules/smartadserverBidAdapter.js +6 -2
  146. package/modules/smartxBidAdapter.js +10 -7
  147. package/modules/smartytechBidAdapter.js +78 -0
  148. package/modules/smartytechBidAdapter.md +44 -0
  149. package/modules/taboolaBidAdapter.js +3 -3
  150. package/modules/taboolaBidAdapter.md +0 -2
  151. package/modules/tappxBidAdapter.js +21 -6
  152. package/modules/ttdBidAdapter.js +4 -3
  153. package/modules/userId/index.js +1 -1
  154. package/modules/vidazooBidAdapter.js +29 -3
  155. package/modules/viqeoBidAdapter.js +180 -0
  156. package/modules/viqeoBidAdapter.md +56 -0
  157. package/modules/yieldlabBidAdapter.js +19 -8
  158. package/modules/yieldmoBidAdapter.js +22 -8
  159. package/modules/yieldoneBidAdapter.js +60 -8
  160. package/modules/yieldoneBidAdapter.md +109 -9
  161. package/modules/zeta_global_sspBidAdapter.js +4 -0
  162. package/modules/zeusPrimeRtdProvider.js +357 -0
  163. package/modules/zeusPrimeRtdProvider.md +60 -0
  164. package/package.json +1 -1
  165. package/src/adloader.js +0 -1
  166. package/test/spec/modules/adagioBidAdapter_spec.js +2 -2
  167. package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
  168. package/test/spec/modules/beopBidAdapter_spec.js +52 -0
  169. package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
  170. package/test/spec/modules/concertBidAdapter_spec.js +26 -15
  171. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
  172. package/test/spec/modules/gridBidAdapter_spec.js +289 -1
  173. package/test/spec/modules/kargoBidAdapter_spec.js +76 -4
  174. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +20 -0
  175. package/test/spec/modules/microadBidAdapter_spec.js +48 -0
  176. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
  177. package/test/spec/modules/oguryBidAdapter_spec.js +27 -5
  178. package/test/spec/modules/pubmaticBidAdapter_spec.js +2 -2
  179. package/test/spec/modules/seedtagBidAdapter_spec.js +34 -10
  180. package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
  181. package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
  182. package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
  183. package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
  184. package/test/spec/modules/ttdBidAdapter_spec.js +13 -0
  185. package/test/spec/modules/vidazooBidAdapter_spec.js +1 -0
  186. package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
  187. package/test/spec/modules/yieldlabBidAdapter_spec.js +125 -0
  188. package/test/spec/modules/yieldmoBidAdapter_spec.js +3 -4
  189. package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
  190. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
  191. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
@@ -22,7 +22,7 @@ import { getRefererInfo } from '../src/refererDetection.js';
22
22
  const BIDDER_CODE = 'nextMillennium';
23
23
  const ENDPOINT = 'https://pbs.nextmillmedia.com/openrtb2/auction';
24
24
  const TEST_ENDPOINT = 'https://test.pbs.nextmillmedia.com/openrtb2/auction';
25
- const SYNC_ENDPOINT = 'https://statics.nextmillmedia.com/load-cookie.html?v=4';
25
+ const SYNC_ENDPOINT = 'https://cookies.nextmillmedia.com/sync?';
26
26
  const TIME_TO_LIVE = 360;
27
27
  const VIDEO_PARAMS = [
28
28
  'api', 'linearity', 'maxduration', 'mimes', 'minduration', 'placement',
@@ -141,7 +141,7 @@ export const spec = {
141
141
  url: isTest ? TEST_ENDPOINT : ENDPOINT,
142
142
  data: JSON.stringify(postBody),
143
143
  options: {
144
- contentType: 'application/json',
144
+ contentType: 'text/plain',
145
145
  withCredentials: true
146
146
  },
147
147
 
@@ -198,28 +198,24 @@ export const spec = {
198
198
  },
199
199
 
200
200
  getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
201
- if (!syncOptions.iframeEnabled) {
202
- return;
203
- };
204
-
205
- let syncurl = gdprConsent && gdprConsent.gdprApplies ? `${SYNC_ENDPOINT}&gdpr=1&gdpr_consent=${gdprConsent.consentString}` : SYNC_ENDPOINT;
206
-
207
- let bidders = [];
208
- if (responses) {
209
- _each(responses, (response) => {
210
- if (!(response && response.body && response.body.ext && response.body.ext.responsetimemillis)) return;
211
- _each(Object.keys(response.body.ext.responsetimemillis), b => bidders.push(b));
212
- });
213
- };
214
-
215
- if (bidders.length) {
216
- syncurl += `&bidders=${bidders.join(',')}`;
217
- };
218
-
219
- return [{
220
- type: 'iframe',
221
- url: syncurl
222
- }];
201
+ const pixels = [];
202
+ let syncUrl = SYNC_ENDPOINT;
203
+
204
+ if (gdprConsent && gdprConsent.gdprApplies) {
205
+ syncUrl += 'gdpr=1&gdpr_consent=' + gdprConsent.consentString;
206
+ }
207
+ if (uspConsent) {
208
+ syncUrl += 'us_privacy=' + uspConsent;
209
+ }
210
+
211
+ if (syncOptions.iframeEnabled) {
212
+ pixels.push({type: 'iframe', url: syncUrl + 'type=iframe'});
213
+ }
214
+ if (syncOptions.pixelEnabled) {
215
+ pixels.push({type: 'image', url: syncUrl + 'type=image'});
216
+ }
217
+
218
+ return pixels;
223
219
  },
224
220
  };
225
221
 
@@ -11,7 +11,7 @@ const DEFAULT_TIMEOUT = 1000;
11
11
  const BID_HOST = 'https://mweb-hb.presage.io/api/header-bidding-request';
12
12
  const TIMEOUT_MONITORING_HOST = 'https://ms-ads-monitoring-events.presage.io';
13
13
  const MS_COOKIE_SYNC_DOMAIN = 'https://ms-cookie-sync.presage.io';
14
- const ADAPTER_VERSION = '1.3.0';
14
+ const ADAPTER_VERSION = '1.4.0';
15
15
 
16
16
  function getClientWidth() {
17
17
  const documentElementClientWidth = window.top.document.documentElement.clientWidth
@@ -114,7 +114,10 @@ function buildRequests(validBidRequests, bidderRequest) {
114
114
  banner: {
115
115
  format: sizes
116
116
  },
117
- ext: bidRequest.params
117
+ ext: {
118
+ ...bidRequest.params,
119
+ timeSpentOnPage: document.timeline && document.timeline.currentTime ? document.timeline.currentTime : 0
120
+ }
118
121
  });
119
122
  }
120
123
  });
@@ -1254,7 +1254,7 @@ export const spec = {
1254
1254
  seatbidder.bid.forEach(bid => {
1255
1255
  let newBid = {
1256
1256
  requestId: bid.impid,
1257
- cpm: (parseFloat(bid.price) || 0).toFixed(2),
1257
+ cpm: parseFloat((bid.price || 0).toFixed(2)),
1258
1258
  width: bid.w,
1259
1259
  height: bid.h,
1260
1260
  creativeId: bid.crid || bid.id,
@@ -1,6 +1,7 @@
1
1
  import { isArray, _map, triggerPixel } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js'
3
3
  import { VIDEO, BANNER } from '../src/mediaTypes.js'
4
+ import { config } from '../src/config.js';
4
5
 
5
6
  const BIDDER_CODE = 'seedtag';
6
7
  const SEEDTAG_ALIAS = 'st';
@@ -177,7 +178,7 @@ function ttfb() {
177
178
  return ttfb >= 0 && ttfb <= performance.now() ? ttfb : 0;
178
179
  }
179
180
 
180
- export function getTimeoutUrl (data) {
181
+ export function getTimeoutUrl(data) {
181
182
  let queryParams = '';
182
183
  if (
183
184
  isArray(data) && data[0] &&
@@ -235,7 +236,6 @@ export const spec = {
235
236
  if (gdprApplies !== undefined) payload['ga'] = gdprApplies;
236
237
  payload['cd'] = bidderRequest.gdprConsent.consentString;
237
238
  }
238
-
239
239
  if (bidderRequest.uspConsent) {
240
240
  payload['uspConsent'] = bidderRequest.uspConsent
241
241
  }
@@ -244,6 +244,11 @@ export const spec = {
244
244
  payload.schain = validBidRequests[0].schain;
245
245
  }
246
246
 
247
+ let coppa = config.getConfig('coppa')
248
+ if (coppa) {
249
+ payload.coppa = coppa
250
+ }
251
+
247
252
  const payloadString = JSON.stringify(payload)
248
253
  return {
249
254
  method: 'POST',
@@ -258,10 +263,10 @@ export const spec = {
258
263
  * @param {ServerResponse} serverResponse A successful response from the server.
259
264
  * @return {Bid[]} An array of bids which were nested inside the server.
260
265
  */
261
- interpretResponse: function(serverResponse) {
266
+ interpretResponse: function (serverResponse) {
262
267
  const serverBody = serverResponse.body;
263
268
  if (serverBody && serverBody.bids && isArray(serverBody.bids)) {
264
- return _map(serverBody.bids, function(bid) {
269
+ return _map(serverBody.bids, function (bid) {
265
270
  return buildBidResponse(bid);
266
271
  });
267
272
  } else {
@@ -133,6 +133,8 @@ export const spec = {
133
133
  // use bidderRequest.bids[] to get bidder-dependent request info
134
134
 
135
135
  const adServerCurrency = config.getConfig('currency.adServerCurrency');
136
+ const sellerDefinedAudience = deepAccess(bidderRequest, 'ortb2.user.data', config.getAnyConfig('ortb2.user.data'));
137
+ const sellerDefinedContext = deepAccess(bidderRequest, 'ortb2.site.content.data', config.getAnyConfig('ortb2.site.content.data'));
136
138
 
137
139
  // pull requested transaction ID from bidderRequest.bids[].transactionId
138
140
  return validBidRequests.reduce((bidRequests, bid) => {
@@ -154,7 +156,9 @@ export const spec = {
154
156
  timeout: config.getConfig('bidderTimeout'),
155
157
  bidId: bid.bidId,
156
158
  prebidVersion: '$prebid.version$',
157
- schain: spec.serializeSupplyChain(bid.schain)
159
+ schain: spec.serializeSupplyChain(bid.schain),
160
+ sda: sellerDefinedAudience,
161
+ sdc: sellerDefinedContext
158
162
  };
159
163
 
160
164
  if (bidderRequest && bidderRequest.gdprConsent) {
@@ -209,7 +213,7 @@ export const spec = {
209
213
  const bidResponses = [];
210
214
  let response = serverResponse.body;
211
215
  try {
212
- if (response && !response.isNoAd) {
216
+ if (response && !response.isNoAd && (response.ad || response.adUrl)) {
213
217
  const bidRequest = JSON.parse(bidRequestString.data);
214
218
 
215
219
  let bidResponse = {
@@ -67,7 +67,6 @@ export const spec = {
67
67
  * @return ServerRequest Info describing the request to the server.
68
68
  */
69
69
  buildRequests: function (bidRequests, bidderRequest) {
70
- // TODO: does the fallback make sense here?
71
70
  const page = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
72
71
  const isPageSecure = !!page.match(/^https:/)
73
72
 
@@ -197,6 +196,15 @@ export const spec = {
197
196
  userExt.fpc = pubcid;
198
197
  }
199
198
 
199
+ // Add schain object if available
200
+ if (bid && bid.schain) {
201
+ requestPayload['source'] = {
202
+ ext: {
203
+ schain: bid.schain
204
+ }
205
+ };
206
+ }
207
+
200
208
  // Only add the user object if it's not empty
201
209
  if (!isEmpty(userExt)) {
202
210
  requestPayload.user = {
@@ -204,9 +212,7 @@ export const spec = {
204
212
  };
205
213
  }
206
214
 
207
- // requestPayload.user.ext.ver = pbjs.version;
208
-
209
- // Targeting
215
+ // Add targeting
210
216
  if (getBidIdParameter('data', bid.params.user)) {
211
217
  var targetingarr = [];
212
218
  for (var i = 0; i < bid.params.user.data.length; i++) {
@@ -225,8 +231,6 @@ export const spec = {
225
231
  }
226
232
  }
227
233
 
228
- // Todo: USER ID MODULE
229
-
230
234
  requestPayload.user = {
231
235
  ext: userExt,
232
236
  data: targetingarr
@@ -269,7 +273,6 @@ export const spec = {
269
273
  }
270
274
  /**
271
275
  * Make sure currency and price are the right ones
272
- * TODO: what about the pre_market_bid partners sizes?
273
276
  */
274
277
  _each(currentBidRequest.params.pre_market_bids, function (pmb) {
275
278
  if (pmb.deal_id == smartxBid.id) {
@@ -0,0 +1,78 @@
1
+ import {registerBidder} from '../src/adapters/bidderFactory.js';
2
+ import {buildUrl} from '../src/utils.js'
3
+
4
+ const BIDDER_CODE = 'smartytech';
5
+ export const ENDPOINT_PROTOCOL = 'https';
6
+ export const ENDPOINT_DOMAIN = 'server.smartytech.io';
7
+ export const ENDPOINT_PATH = '/hb/bidder';
8
+
9
+ export const spec = {
10
+ code: BIDDER_CODE,
11
+
12
+ isBidRequestValid: function (bidRequest) {
13
+ return !!parseInt(bidRequest.params.endpointId);
14
+ },
15
+
16
+ buildRequests: function (validBidRequests, bidderRequest) {
17
+ const referer = bidderRequest?.refererInfo?.page || window.location.href;
18
+
19
+ const bidRequests = validBidRequests.map((validBidRequest) => {
20
+ return {
21
+ endpointId: validBidRequest.params.endpointId,
22
+ adUnitCode: validBidRequest.adUnitCode,
23
+ sizes: validBidRequest.sizes,
24
+ bidId: validBidRequest.bidId,
25
+ referer: referer
26
+ };
27
+ });
28
+
29
+ let adPartnerRequestUrl = buildUrl({
30
+ protocol: ENDPOINT_PROTOCOL,
31
+ hostname: ENDPOINT_DOMAIN,
32
+ pathname: ENDPOINT_PATH,
33
+ });
34
+
35
+ return {
36
+ method: 'POST',
37
+ url: adPartnerRequestUrl,
38
+ data: bidRequests
39
+ };
40
+ },
41
+
42
+ interpretResponse: function (serverResponse, bidRequest) {
43
+ if (typeof serverResponse.body === 'undefined') {
44
+ return [];
45
+ }
46
+
47
+ const validBids = bidRequest.data;
48
+ const keys = Object.keys(serverResponse.body)
49
+ const responseBody = serverResponse.body;
50
+
51
+ return keys.filter(key => {
52
+ return responseBody[key].ad
53
+ }).map(key => {
54
+ return {
55
+ bid: validBids.find(b => b.adUnitCode === key),
56
+ response: responseBody[key]
57
+ }
58
+ }).map(item => spec.adResponse(item.bid.bidId, item.response));
59
+ },
60
+
61
+ adResponse: function (requestId, response) {
62
+ const bidObject = {
63
+ requestId,
64
+ ad: response.ad,
65
+ cpm: response.cpm,
66
+ width: response.width,
67
+ height: response.height,
68
+ ttl: 60,
69
+ creativeId: response.creativeId,
70
+ netRevenue: true,
71
+ currency: response.currency,
72
+ }
73
+ return bidObject;
74
+ },
75
+
76
+ }
77
+
78
+ registerBidder(spec);
@@ -0,0 +1,44 @@
1
+ # Overview
2
+
3
+ Module Name: SmartyTech Bidder Adapter
4
+
5
+ Module Type: Bidder Adapter
6
+
7
+ Maintainer: info@adpartner.pro
8
+
9
+ # Description
10
+
11
+ You can use this adapter to get a bid from smartytech.io.
12
+
13
+ About us : https://smartytech.io
14
+
15
+ # Test Parameters
16
+
17
+ ```javascript
18
+ var adUnits = [
19
+ {
20
+ code: 'div-smartytech-example',
21
+ sizes: [[300, 250]],
22
+ bids: [
23
+ {
24
+ bidder: "smartytech",
25
+ params: {
26
+ endpointId: 14
27
+ }
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ code: 'div-smartytech-example-2',
33
+ sizes: [[300, 250]],
34
+ bids: [
35
+ {
36
+ bidder: "smartytech",
37
+ params: {
38
+ endpointId: 14
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ ];
44
+ ```
@@ -9,7 +9,7 @@ import {getStorageManager} from '../src/storageManager.js';
9
9
  const BIDDER_CODE = 'taboola';
10
10
  const GVLID = 42;
11
11
  const CURRENCY = 'USD';
12
- export const END_POINT_URL = 'https://hb.bidder.taboola.com/TaboolaHBOpenRTBRequestHandlerServlet';
12
+ export const END_POINT_URL = 'https://display.bidder.taboola.com/OpenRTB/TaboolaHB/auction';
13
13
  const USER_ID = 'user-id';
14
14
  const STORAGE_KEY = `taboola global:${USER_ID}`;
15
15
  const COOKIE_KEY = 'trc_cookie_storage';
@@ -80,7 +80,7 @@ export const spec = {
80
80
  buildRequests: (validBidRequests, bidderRequest) => {
81
81
  const [bidRequest] = validBidRequests;
82
82
  const {refererInfo, gdprConsent = {}, uspConsent} = bidderRequest;
83
- const {publisherId, endpointUrl} = bidRequest.params;
83
+ const {publisherId} = bidRequest.params;
84
84
  const site = getSiteProperties(bidRequest.params, refererInfo);
85
85
  const device = {ua: navigator.userAgent};
86
86
  const imps = getImps(validBidRequests);
@@ -124,7 +124,7 @@ export const spec = {
124
124
  regs
125
125
  };
126
126
 
127
- const url = [endpointUrl || END_POINT_URL, publisherId].join('/');
127
+ const url = [END_POINT_URL, publisherId].join('/');
128
128
 
129
129
  return {
130
130
  url,
@@ -31,7 +31,6 @@ The Taboola Bidding adapter requires setup before beginning. Please contact us o
31
31
  bidfloor: 0.25, // Optional - default is null
32
32
  bcat: ['IAB1-1'], // Optional - default is []
33
33
  badv: ['example.com'], // Optional - default is []
34
- endpointUrl: ['https://example.com'] // Optional
35
34
  }
36
35
  }]
37
36
  }];
@@ -46,6 +45,5 @@ The Taboola Bidding adapter requires setup before beginning. Please contact us o
46
45
  | `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `Array` |
47
46
  | `badv` | optional | Blocked Advertiser Domains | `'example.com'` | `String Url` |
48
47
  | `bidfloor` | optional | CPM bid floor | `0.25` | `Float` |
49
- | `endpointUrl` | optional | Endpoint Url (only if provided by Taboola) | `https://example.com` | `String` |
50
48
 
51
49
 
@@ -11,7 +11,7 @@ const BIDDER_CODE = 'tappx';
11
11
  const GVLID_CODE = 628;
12
12
  const TTL = 360;
13
13
  const CUR = 'USD';
14
- const TAPPX_BIDDER_VERSION = '0.1.1005';
14
+ const TAPPX_BIDDER_VERSION = '0.1.2';
15
15
  const TYPE_CNN = 'prebidjs';
16
16
  const LOG_PREFIX = '[TAPPX]: ';
17
17
  const VIDEO_SUPPORT = ['instream', 'outstream'];
@@ -271,12 +271,28 @@ function buildOneRequest(validBidRequests, bidderRequest) {
271
271
  api[0] = deepAccess(validBidRequests, 'params.api') ? deepAccess(validBidRequests, 'params.api') : [3, 5];
272
272
  } else {
273
273
  let bundle = _extractPageUrl(validBidRequests, bidderRequest);
274
- let site = {};
274
+ let site = deepAccess(validBidRequests, 'params.site') || {};
275
275
  site.name = bundle;
276
+ site.page = bidderRequest?.refererInfo?.page || deepAccess(validBidRequests, 'params.site.page') || bidderRequest?.refererInfo?.topmostLocation || window.location.href || bundle;
276
277
  site.domain = bundle;
278
+ site.ref = bidderRequest?.refererInfo?.ref || window.top.document.referrer || '';
279
+ site.ext = {};
280
+ site.ext.is_amp = bidderRequest?.refererInfo?.isAmp || 0;
281
+ site.ext.page_da = deepAccess(validBidRequests, 'params.site.page') || '-';
282
+ site.ext.page_rip = bidderRequest?.refererInfo?.page || '-';
283
+ site.ext.page_rit = bidderRequest?.refererInfo?.topmostLocation || '-';
284
+ site.ext.page_wlh = window.location.href || '-';
277
285
  publisher.name = bundle;
278
286
  publisher.domain = bundle;
287
+ let sitename = document.getElementsByTagName('meta')['title'];
288
+ if (sitename && sitename.content) {
289
+ site.name = sitename.content;
290
+ }
279
291
  tagid = `${site.name}_typeAdBanVid_${getOs()}`;
292
+ let keywords = document.getElementsByTagName('meta')['keywords'];
293
+ if (keywords && keywords.content) {
294
+ site.keywords = keywords.content;
295
+ }
280
296
  payload.site = site;
281
297
  }
282
298
  // < App/Site object
@@ -295,9 +311,9 @@ function buildOneRequest(validBidRequests, bidderRequest) {
295
311
  if (
296
312
  ((bannerMediaType.sizes[0].indexOf(480) >= 0) && (bannerMediaType.sizes[0].indexOf(320) >= 0)) ||
297
313
  ((bannerMediaType.sizes[0].indexOf(768) >= 0) && (bannerMediaType.sizes[0].indexOf(1024) >= 0))) {
298
- banner.pos = 7;
314
+ banner.pos = 0;
299
315
  } else {
300
- banner.pos = 4;
316
+ banner.pos = 0;
301
317
  }
302
318
 
303
319
  banner.api = api;
@@ -565,8 +581,7 @@ export function _checkParamDataType(key, value, datatype) {
565
581
  }
566
582
 
567
583
  export function _extractPageUrl(validBidRequests, bidderRequest) {
568
- // TODO: does the fallback make sense?
569
- let url = bidderRequest?.refererInfo?.page || bidderRequest.refererInfo?.topmostLocation;
584
+ let url = bidderRequest?.refererInfo?.page || bidderRequest?.refererInfo?.topmostLocation;
570
585
  return parseDomain(url, {noLeadingWww: true});
571
586
  }
572
587
 
@@ -132,14 +132,15 @@ function getUser(bidderRequest) {
132
132
  }
133
133
 
134
134
  function getSite(bidderRequest, firstPartyData) {
135
- var site = {
135
+ var site = utils.mergeDeep({
136
136
  page: utils.deepAccess(bidderRequest, 'refererInfo.page'),
137
137
  ref: utils.deepAccess(bidderRequest, 'refererInfo.ref'),
138
138
  publisher: {
139
139
  id: utils.deepAccess(bidderRequest, 'bids.0.params.publisherId'),
140
140
  },
141
- ...firstPartyData.site
142
- };
141
+ },
142
+ firstPartyData.site
143
+ );
143
144
 
144
145
  var publisherDomain = bidderRequest.refererInfo.domain;
145
146
  if (publisherDomain) {
@@ -240,7 +240,7 @@ export function setStoredValue(submodule, value) {
240
240
  const valueStr = isPlainObject(value) ? JSON.stringify(value) : value;
241
241
  if (storage.type === COOKIE) {
242
242
  const setCookie = cookieSetter(submodule);
243
- setCookie(null, value, expiresStr);
243
+ setCookie(null, valueStr, expiresStr);
244
244
  if (typeof storage.refreshInSeconds === 'number') {
245
245
  setCookie('_last', new Date().toUTCString(), expiresStr);
246
246
  }
@@ -1,4 +1,4 @@
1
- import {_each, deepAccess, parseSizesInput, parseUrl, uniques} from '../src/utils.js';
1
+ import { _each, deepAccess, parseSizesInput, parseUrl, uniques, isFn } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
  import { BANNER } from '../src/mediaTypes.js';
4
4
  import { getStorageManager } from '../src/storageManager.js';
@@ -12,6 +12,7 @@ const TTL_SECONDS = 60 * 5;
12
12
  const DEAL_ID_EXPIRY = 1000 * 60 * 15;
13
13
  const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60;
14
14
  const SESSION_ID_KEY = 'vidSid';
15
+ const OPT_CACHE_KEY = 'vdzwopt';
15
16
  export const SUPPORTED_ID_SYSTEMS = {
16
17
  'britepoolid': 1,
17
18
  'criteoId': 1,
@@ -58,7 +59,8 @@ function isBidRequestValid(bid) {
58
59
 
59
60
  function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
60
61
  const { params, bidId, userId, adUnitCode, schain } = bid;
61
- const { bidFloor, ext } = params;
62
+ const { ext } = params;
63
+ let { bidFloor } = params;
62
64
  const hashUrl = hashCode(topWindowUrl);
63
65
  const dealId = getNextDealId(hashUrl);
64
66
  const uniqueDealId = getUniqueDealId(hashUrl);
@@ -66,6 +68,19 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
66
68
  const cId = extractCID(params);
67
69
  const pId = extractPID(params);
68
70
  const subDomain = extractSubDomain(params);
71
+ const ptrace = getCacheOpt();
72
+
73
+ if (isFn(bid.getFloor)) {
74
+ const floorInfo = bid.getFloor({
75
+ currency: 'USD',
76
+ mediaType: '*',
77
+ size: '*'
78
+ });
79
+
80
+ if (floorInfo.currency === 'USD') {
81
+ bidFloor = floorInfo.floor;
82
+ }
83
+ }
69
84
 
70
85
  let data = {
71
86
  url: encodeURIComponent(topWindowUrl),
@@ -83,7 +98,8 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
83
98
  bidderVersion: BIDDER_VERSION,
84
99
  prebidVersion: '$prebid.version$',
85
100
  res: `${screen.width}x${screen.height}`,
86
- schain: schain
101
+ schain: schain,
102
+ ptrace: ptrace
87
103
  };
88
104
 
89
105
  appendUserIdsToRequestPayload(data, userId);
@@ -258,6 +274,16 @@ export function getVidazooSessionId() {
258
274
  return getStorageItem(SESSION_ID_KEY) || '';
259
275
  }
260
276
 
277
+ export function getCacheOpt() {
278
+ let data = storage.getDataFromLocalStorage(OPT_CACHE_KEY);
279
+ if (!data) {
280
+ data = String(Date.now());
281
+ storage.setDataInLocalStorage(OPT_CACHE_KEY, data);
282
+ }
283
+
284
+ return data;
285
+ }
286
+
261
287
  export function getStorageItem(key) {
262
288
  try {
263
289
  return tryParseJSON(storage.getDataFromLocalStorage(key));