prebid.js 7.4.0 → 7.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 (239) hide show
  1. package/.circleci/config.yml +11 -6
  2. package/dist/1plusXRtdProvider.js +1 -0
  3. package/dist/33acrossBidAdapter.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/adnuntiusBidAdapter.js +1 -1
  8. package/dist/adoceanBidAdapter.js +1 -1
  9. package/dist/adotBidAdapter.js +1 -1
  10. package/dist/adrelevantisBidAdapter.js +1 -1
  11. package/dist/adrinoBidAdapter.js +1 -1
  12. package/dist/adtelligentBidAdapter.js +1 -1
  13. package/dist/adxcgBidAdapter.js +1 -1
  14. package/dist/ajaBidAdapter.js +1 -1
  15. package/dist/amxBidAdapter.js +1 -1
  16. package/dist/amxIdSystem.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/atsAnalyticsAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bliinkBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/byDataAnalyticsAdapter.js +1 -1
  28. package/dist/concertBidAdapter.js +1 -1
  29. package/dist/connectadBidAdapter.js +1 -1
  30. package/dist/consumableBidAdapter.js +1 -1
  31. package/dist/conversantBidAdapter.js +1 -1
  32. package/dist/craftBidAdapter.js +1 -1
  33. package/dist/criteoBidAdapter.js +1 -1
  34. package/dist/currency.js +1 -1
  35. package/dist/dspxBidAdapter.js +1 -1
  36. package/dist/eplanningBidAdapter.js +1 -1
  37. package/dist/finativeBidAdapter.js +1 -1
  38. package/dist/gdprEnforcement.js +1 -1
  39. package/dist/glimpseBidAdapter.js +1 -1
  40. package/dist/gmosspBidAdapter.js +1 -1
  41. package/dist/goldbachBidAdapter.js +1 -1
  42. package/dist/gridBidAdapter.js +1 -1
  43. package/dist/gridNMBidAdapter.js +1 -1
  44. package/dist/gumgumBidAdapter.js +1 -1
  45. package/dist/h12mediaBidAdapter.js +1 -1
  46. package/dist/hadronIdSystem.js +1 -1
  47. package/dist/hadronRtdProvider.js +1 -1
  48. package/dist/id5IdSystem.js +1 -1
  49. package/dist/imRtdProvider.js +1 -1
  50. package/dist/impactifyBidAdapter.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/jixieBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoAnalyticsAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/lassoBidAdapter.js +1 -1
  61. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  62. package/dist/logicadBidAdapter.js +1 -1
  63. package/dist/loglyliftBidAdapter.js +1 -1
  64. package/dist/malltvAnalyticsAdapter.js +1 -1
  65. package/dist/marsmediaBidAdapter.js +1 -1
  66. package/dist/mediafuseBidAdapter.js +1 -1
  67. package/dist/mediasquareBidAdapter.js +1 -1
  68. package/dist/mgidBidAdapter.js +1 -1
  69. package/dist/minutemediaBidAdapter.js +1 -1
  70. package/dist/naveggIdSystem.js +1 -1
  71. package/dist/newspassidBidAdapter.js +1 -0
  72. package/dist/nextMillenniumBidAdapter.js +1 -1
  73. package/dist/not-for-prod/prebid.js +131 -128
  74. package/dist/oguryBidAdapter.js +1 -1
  75. package/dist/onetagBidAdapter.js +1 -1
  76. package/dist/ooloAnalyticsAdapter.js +1 -1
  77. package/dist/outbrainBidAdapter.js +1 -1
  78. package/dist/parrableIdSystem.js +1 -1
  79. package/dist/pixfutureBidAdapter.js +1 -1
  80. package/dist/prebid-core.js +1 -1
  81. package/dist/prebidServerBidAdapter.js +1 -1
  82. package/dist/priceFloors.js +1 -1
  83. package/dist/pubCommonId.js +1 -1
  84. package/dist/publinkIdSystem.js +1 -1
  85. package/dist/pubmaticBidAdapter.js +1 -1
  86. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  87. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  88. package/dist/pxyzBidAdapter.js +1 -1
  89. package/dist/quantcastBidAdapter.js +1 -1
  90. package/dist/rasBidAdapter.js +1 -0
  91. package/dist/readpeakBidAdapter.js +1 -1
  92. package/dist/relaidoBidAdapter.js +1 -1
  93. package/dist/rhythmoneBidAdapter.js +1 -1
  94. package/dist/riseBidAdapter.js +1 -1
  95. package/dist/rubiconAnalyticsAdapter.js +1 -1
  96. package/dist/rubiconBidAdapter.js +1 -1
  97. package/dist/seedingAllianceBidAdapter.js +1 -1
  98. package/dist/seedtagBidAdapter.js +1 -1
  99. package/dist/sharedIdSystem.js +1 -1
  100. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  101. package/dist/sharethroughBidAdapter.js +1 -1
  102. package/dist/shinezBidAdapter.js +1 -1
  103. package/dist/smaatoBidAdapter.js +1 -1
  104. package/dist/smartadserverBidAdapter.js +1 -1
  105. package/dist/smartxBidAdapter.js +1 -1
  106. package/dist/smilewantedBidAdapter.js +1 -1
  107. package/dist/sonobiBidAdapter.js +1 -1
  108. package/dist/sovrnAnalyticsAdapter.js +1 -1
  109. package/dist/sovrnBidAdapter.js +1 -1
  110. package/dist/sspBCBidAdapter.js +1 -1
  111. package/dist/sublimeBidAdapter.js +1 -1
  112. package/dist/synacormediaBidAdapter.js +1 -1
  113. package/dist/taboolaBidAdapter.js +1 -1
  114. package/dist/targetVideoBidAdapter.js +1 -1
  115. package/dist/teadsBidAdapter.js +1 -1
  116. package/dist/trionBidAdapter.js +1 -1
  117. package/dist/tripleliftBidAdapter.js +1 -1
  118. package/dist/ttdBidAdapter.js +1 -1
  119. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  120. package/dist/underdogmediaBidAdapter.js +1 -1
  121. package/dist/undertoneBidAdapter.js +1 -1
  122. package/dist/userId.js +1 -1
  123. package/dist/vidazooBidAdapter.js +1 -1
  124. package/dist/videobyteBidAdapter.js +1 -1
  125. package/dist/visxBidAdapter.js +1 -1
  126. package/dist/vuukleBidAdapter.js +1 -1
  127. package/dist/widespaceBidAdapter.js +1 -1
  128. package/dist/winrBidAdapter.js +1 -1
  129. package/dist/yahoosspBidAdapter.js +1 -1
  130. package/dist/yieldmoBidAdapter.js +1 -1
  131. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  132. package/integrationExamples/gpt/1plusXRtdProviderExample.html +112 -0
  133. package/karma.conf.maker.js +3 -1
  134. package/modules/.submodules.json +2 -1
  135. package/modules/1plusXRtdProvider.js +251 -0
  136. package/modules/1plusXRtdProvider.md +65 -0
  137. package/modules/adgenerationBidAdapter.js +24 -1
  138. package/modules/adnuntiusBidAdapter.js +26 -8
  139. package/modules/adoceanBidAdapter.js +10 -3
  140. package/modules/adotBidAdapter.js +13 -4
  141. package/modules/adrinoBidAdapter.js +10 -2
  142. package/modules/adrinoBidAdapter.md +6 -0
  143. package/modules/adtelligentBidAdapter.js +2 -1
  144. package/modules/appnexusBidAdapter.js +3 -3
  145. package/modules/atsAnalyticsAdapter.js +4 -5
  146. package/modules/big-richmediaBidAdapter.js +3 -3
  147. package/modules/bliinkBidAdapter.js +120 -193
  148. package/modules/bliinkBidAdapter.md +2 -5
  149. package/modules/byDataAnalyticsAdapter.js +172 -74
  150. package/modules/byDataAnalyticsAdapter.md +5 -6
  151. package/modules/consumableBidAdapter.js +21 -1
  152. package/modules/criteoBidAdapter.js +7 -1
  153. package/modules/currency.js +2 -2
  154. package/modules/cwireBidAdapter.md +1 -1
  155. package/modules/eplanningBidAdapter.js +82 -97
  156. package/modules/gdprEnforcement.js +8 -14
  157. package/modules/gridNMBidAdapter.js +45 -4
  158. package/modules/hadronAnalyticsAdapter.md +5 -5
  159. package/modules/hadronIdSystem.js +18 -5
  160. package/modules/hadronIdSystem.md +15 -11
  161. package/modules/hadronRtdProvider.js +14 -1
  162. package/modules/hadronRtdProvider.md +17 -13
  163. package/modules/imRtdProvider.js +0 -8
  164. package/modules/impactifyBidAdapter.js +6 -2
  165. package/modules/ixBidAdapter.js +133 -23
  166. package/modules/ixBidAdapter.md +2 -5
  167. package/modules/jixieBidAdapter.js +10 -10
  168. package/modules/kargoAnalyticsAdapter.js +88 -6
  169. package/modules/kargoAnalyticsAdapter.md +33 -0
  170. package/modules/minutemediaBidAdapter.js +1 -0
  171. package/modules/naveggIdSystem.js +1 -12
  172. package/modules/newspassidBidAdapter.js +649 -0
  173. package/modules/nextMillenniumBidAdapter.js +17 -1
  174. package/modules/nextMillenniumBidAdapter.md +1 -1
  175. package/modules/oguryBidAdapter.js +2 -0
  176. package/modules/onetagBidAdapter.js +44 -7
  177. package/modules/prebidServerBidAdapter/index.js +7 -0
  178. package/modules/priceFloors.js +1 -1
  179. package/modules/pubCommonId.js +1 -2
  180. package/modules/pubxaiAnalyticsAdapter.js +6 -1
  181. package/modules/rasBidAdapter.js +149 -0
  182. package/modules/rasBidAdapter.md +50 -0
  183. package/modules/rubiconBidAdapter.js +5 -0
  184. package/modules/seedingAllianceBidAdapter.js +3 -0
  185. package/modules/seedtagBidAdapter.js +37 -1
  186. package/modules/sharedIdSystem.js +11 -5
  187. package/modules/sharethroughBidAdapter.js +9 -24
  188. package/modules/taboolaBidAdapter.js +1 -1
  189. package/modules/taboolaBidAdapter.md +3 -3
  190. package/modules/targetVideoBidAdapter.js +18 -0
  191. package/modules/userId/index.js +39 -21
  192. package/package.json +1 -1
  193. package/src/auction.js +6 -5
  194. package/src/consentHandler.js +11 -11
  195. package/src/debugging.js +5 -3
  196. package/src/hook.js +2 -2
  197. package/src/storageManager.js +4 -5
  198. package/src/utils/promise.js +96 -21
  199. package/src/utils.js +3 -2
  200. package/test/helpers/consentData.js +2 -1
  201. package/test/spec/auctionmanager_spec.js +1 -6
  202. package/test/spec/debugging_spec.js +2 -2
  203. package/test/spec/modules/1plusXRtdProvider_spec.js +430 -0
  204. package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -4
  205. package/test/spec/modules/adnuntiusBidAdapter_spec.js +126 -14
  206. package/test/spec/modules/adoceanBidAdapter_spec.js +4 -1
  207. package/test/spec/modules/adotBidAdapter_spec.js +12 -9
  208. package/test/spec/modules/adrinoBidAdapter_spec.js +22 -0
  209. package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
  210. package/test/spec/modules/bliinkBidAdapter_spec.js +323 -136
  211. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +74 -24
  212. package/test/spec/modules/consumableBidAdapter_spec.js +122 -1
  213. package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
  214. package/test/spec/modules/eplanningBidAdapter_spec.js +58 -18
  215. package/test/spec/modules/gdprEnforcement_spec.js +53 -100
  216. package/test/spec/modules/gridNMBidAdapter_spec.js +32 -0
  217. package/test/spec/modules/hadronIdSystem_spec.js +2 -2
  218. package/test/spec/modules/idxIdSystem_spec.js +1 -1
  219. package/test/spec/modules/imRtdProvider_spec.js +0 -1
  220. package/test/spec/modules/ixBidAdapter_spec.js +212 -5
  221. package/test/spec/modules/jixieBidAdapter_spec.js +8 -8
  222. package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
  223. package/test/spec/modules/minutemediaBidAdapter_spec.js +3 -0
  224. package/test/spec/modules/newspassidBidAdapter_spec.js +1793 -0
  225. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +20 -0
  226. package/test/spec/modules/onetagBidAdapter_spec.js +53 -4
  227. package/test/spec/modules/parrableIdSystem_spec.js +2 -1
  228. package/test/spec/modules/prebidServerBidAdapter_spec.js +20 -0
  229. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +5 -0
  230. package/test/spec/modules/rasBidAdapter_spec.js +190 -0
  231. package/test/spec/modules/rubiconBidAdapter_spec.js +27 -0
  232. package/test/spec/modules/seedtagBidAdapter_spec.js +29 -0
  233. package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
  234. package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
  235. package/test/spec/modules/targetVideoBidAdapter_spec.js +43 -0
  236. package/test/spec/modules/userId_spec.js +15 -2
  237. package/test/spec/unit/pbjs_api_spec.js +1 -5
  238. package/test/spec/unit/utils/promise_spec.js +283 -38
  239. package/test/helpers/syncPromise.js +0 -71
@@ -30,7 +30,6 @@ import {Renderer} from '../src/Renderer.js';
30
30
  const BIDDER_CODE = 'ix';
31
31
  const ALIAS_BIDDER_CODE = 'roundel';
32
32
  const GLOBAL_VENDOR_ID = 10;
33
- const MODULE_TYPE = 'bid-adapter';
34
33
  const SECURE_BID_URL = 'https://htlb.casalemedia.com/openrtb/pbjs';
35
34
  const SUPPORTED_AD_TYPES = [BANNER, VIDEO, NATIVE];
36
35
  const BANNER_ENDPOINT_VERSION = 7.2;
@@ -46,9 +45,9 @@ const OUTSTREAM_MINIMUM_PLAYER_SIZE = [144, 144];
46
45
  const PRICE_TO_DOLLAR_FACTOR = {
47
46
  JPY: 1
48
47
  };
49
- const USER_SYNC_URL = 'https://js-sec.indexww.com/um/ixmatch.html';
50
-
48
+ const IFRAME_USER_SYNC_URL = 'https://js-sec.indexww.com/um/ixmatch.html';
51
49
  const FLOOR_SOURCE = { PBJS: 'p', IX: 'x' };
50
+ const IMG_USER_SYNC_URL = 'https://dsum.casalemedia.com/pbusermatch?origin=prebid'
52
51
  export const ERROR_CODES = {
53
52
  BID_SIZE_INVALID_FORMAT: 1,
54
53
  BID_SIZE_NOT_INCLUDED: 2,
@@ -191,6 +190,9 @@ const NATIVE_EVENT_TRACKING_METHOD = {
191
190
  const LOCAL_STORAGE_KEY = 'ixdiag';
192
191
  let hasRegisteredHandler = false;
193
192
  export const storage = getStorageManager({gvlid: GLOBAL_VENDOR_ID, bidderCode: BIDDER_CODE});
193
+ let siteID = 0;
194
+ let gdprConsent = '';
195
+ let usPrivacy = '';
194
196
 
195
197
  // Possible values for bidResponse.seatBid[].bid[].mtype which indicates the type of the creative markup so that it can properly be associated with the right sub-object of the BidRequest.Imp.
196
198
  const MEDIA_TYPES = {
@@ -242,6 +244,8 @@ function bidToVideoImp(bid) {
242
244
  }
243
245
 
244
246
  imp.video = videoParamRef ? deepClone(bid.params.video) : {};
247
+ // populate imp level transactionId
248
+ imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid');
245
249
 
246
250
  // copy all video properties to imp object
247
251
  for (const adUnitProperty in videoAdUnitRef) {
@@ -353,6 +357,9 @@ function bidToNativeImp(bid) {
353
357
  ver: '1.2'
354
358
  };
355
359
 
360
+ // populate imp level transactionId
361
+ imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid');
362
+
356
363
  _applyFloor(bid, imp, NATIVE);
357
364
 
358
365
  return imp;
@@ -882,6 +889,11 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
882
889
  if (tmax) {
883
890
  r.ext.ixdiag.tmax = tmax
884
891
  }
892
+
893
+ if (config.getConfig('userSync')) {
894
+ r.ext.ixdiag.syncsPerBidder = config.getConfig('userSync').syncsPerBidder;
895
+ }
896
+
885
897
  // Get cached errors stored in LocalStorage
886
898
  const cachedErrors = getCachedErrors();
887
899
 
@@ -910,7 +922,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
910
922
  // Apply GDPR information to the request if GDPR is enabled.
911
923
  if (bidderRequest) {
912
924
  if (bidderRequest.gdprConsent) {
913
- const gdprConsent = bidderRequest.gdprConsent;
925
+ gdprConsent = bidderRequest.gdprConsent;
914
926
 
915
927
  if (gdprConsent.hasOwnProperty('gdprApplies')) {
916
928
  r.regs = {
@@ -936,6 +948,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
936
948
 
937
949
  if (bidderRequest.uspConsent) {
938
950
  deepSetValue(r, 'regs.ext.us_privacy', bidderRequest.uspConsent);
951
+ usPrivacy = bidderRequest.uspConsent;
939
952
  }
940
953
 
941
954
  if (pageUrl) {
@@ -949,7 +962,9 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
949
962
 
950
963
  const payload = {};
951
964
  // Use the siteId in the first bid request as the main siteId.
952
- payload.s = validBidRequests[0].params.siteId;
965
+ siteID = validBidRequests[0].params.siteId;
966
+ payload.s = siteID;
967
+ payload.v = version;
953
968
  if (version) {
954
969
  payload.v = version;
955
970
  }
@@ -1038,8 +1053,14 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
1038
1053
  currentImpressionSize = encodeURIComponent(JSON.stringify({ impressionObjects })).length;
1039
1054
  }
1040
1055
 
1041
- const gpid = impressions[transactionIds[adUnitIndex]].gpid;
1056
+ let gpid = impressions[transactionIds[adUnitIndex]].gpid;
1042
1057
  const dfpAdUnitCode = impressions[transactionIds[adUnitIndex]].dfp_ad_unit_code;
1058
+ const tid = impressions[transactionIds[adUnitIndex]].tid;
1059
+ const divId = impressions[transactionIds[adUnitIndex]].divId;
1060
+
1061
+ if (!gpid && dfpAdUnitCode && divId) {
1062
+ gpid = `${dfpAdUnitCode}#${divId}`
1063
+ }
1043
1064
  if (impressionObjects.length && BANNER in impressionObjects[0]) {
1044
1065
  const { id, banner: { topframe } } = impressionObjects[0];
1045
1066
  const _bannerImpression = {
@@ -1050,10 +1071,11 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
1050
1071
  },
1051
1072
  }
1052
1073
 
1053
- if (dfpAdUnitCode || gpid) {
1074
+ if (dfpAdUnitCode || gpid || tid) {
1054
1075
  _bannerImpression.ext = {};
1055
1076
  _bannerImpression.ext.dfp_ad_unit_code = dfpAdUnitCode;
1056
1077
  _bannerImpression.ext.gpid = gpid;
1078
+ _bannerImpression.ext.tid = tid;
1057
1079
  }
1058
1080
 
1059
1081
  if ('bidfloor' in impressionObjects[0]) {
@@ -1114,6 +1136,21 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
1114
1136
  }
1115
1137
  }
1116
1138
 
1139
+ // add identifiers info to ixDiag
1140
+ const pbaAdSlot = impressions[transactionIds[adUnitIndex]].pbadslot
1141
+ const tagId = impressions[transactionIds[adUnitIndex]].tagId
1142
+ const adUnitCode = impressions[transactionIds[adUnitIndex]].adUnitCode
1143
+ if (pbaAdSlot || tagId || adUnitCode || divId) {
1144
+ const clonedRObject = deepClone(r);
1145
+ const requestSize = `${baseUrl}${parseQueryStringParameters({ ...payload, r: JSON.stringify(clonedRObject) })}`.length;
1146
+ if (requestSize < MAX_REQUEST_SIZE) {
1147
+ r.ext.ixdiag.pbadslot = pbaAdSlot;
1148
+ r.ext.ixdiag.tagid = tagId;
1149
+ r.ext.ixdiag.adunitcode = adUnitCode;
1150
+ r.ext.ixdiag.divId = divId;
1151
+ }
1152
+ }
1153
+
1117
1154
  const isLastAdUnit = adUnitIndex === transactionIds.length - 1;
1118
1155
 
1119
1156
  if (wasAdUnitImpressionsTrimmed || isLastAdUnit) {
@@ -1246,7 +1283,15 @@ function createNativeImps(validBidRequest, nativeImps) {
1246
1283
  nativeImps[validBidRequest.transactionId] = {};
1247
1284
  nativeImps[validBidRequest.transactionId].ixImps = [];
1248
1285
  nativeImps[validBidRequest.transactionId].ixImps.push(imp);
1249
- nativeImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid')
1286
+ nativeImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid');
1287
+ nativeImps[validBidRequest.transactionId].dfp_ad_unit_code = deepAccess(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot');
1288
+ nativeImps[validBidRequest.transactionId].pbadslot = deepAccess(validBidRequest, 'ortb2Imp.ext.data.pbadslot');
1289
+ nativeImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
1290
+
1291
+ const adUnitCode = validBidRequest.adUnitCode;
1292
+ const divId = document.getElementById(adUnitCode) ? adUnitCode : getGptSlotInfoForAdUnitCode(adUnitCode).divId;
1293
+ nativeImps[validBidRequest.transactionId].adUnitCode = adUnitCode;
1294
+ nativeImps[validBidRequest.transactionId].divId = divId;
1250
1295
  }
1251
1296
  }
1252
1297
 
@@ -1262,6 +1307,14 @@ function createVideoImps(validBidRequest, videoImps) {
1262
1307
  videoImps[validBidRequest.transactionId].ixImps = [];
1263
1308
  videoImps[validBidRequest.transactionId].ixImps.push(imp);
1264
1309
  videoImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid');
1310
+ videoImps[validBidRequest.transactionId].dfp_ad_unit_code = deepAccess(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot');
1311
+ videoImps[validBidRequest.transactionId].pbadslot = deepAccess(validBidRequest, 'ortb2Imp.ext.data.pbadslot');
1312
+ videoImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
1313
+
1314
+ const adUnitCode = validBidRequest.adUnitCode;
1315
+ const divId = document.getElementById(adUnitCode) ? adUnitCode : getGptSlotInfoForAdUnitCode(adUnitCode).divId;
1316
+ videoImps[validBidRequest.transactionId].adUnitCode = adUnitCode;
1317
+ videoImps[validBidRequest.transactionId].divId = divId;
1265
1318
  }
1266
1319
  }
1267
1320
 
@@ -1288,6 +1341,14 @@ function createBannerImps(validBidRequest, missingBannerSizes, bannerImps) {
1288
1341
 
1289
1342
  bannerImps[validBidRequest.transactionId].gpid = deepAccess(validBidRequest, 'ortb2Imp.ext.gpid');
1290
1343
  bannerImps[validBidRequest.transactionId].dfp_ad_unit_code = deepAccess(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot');
1344
+ bannerImps[validBidRequest.transactionId].tid = deepAccess(validBidRequest, 'ortb2Imp.ext.tid');
1345
+ bannerImps[validBidRequest.transactionId].pbadslot = deepAccess(validBidRequest, 'ortb2Imp.ext.data.pbadslot');
1346
+ bannerImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId');
1347
+
1348
+ const adUnitCode = validBidRequest.adUnitCode;
1349
+ const divId = document.getElementById(adUnitCode) ? adUnitCode : getGptSlotInfoForAdUnitCode(adUnitCode).divId;
1350
+ bannerImps[validBidRequest.transactionId].adUnitCode = adUnitCode;
1351
+ bannerImps[validBidRequest.transactionId].divId = divId;
1291
1352
 
1292
1353
  // Create IX imps from params.size
1293
1354
  if (bannerSizeDefined) {
@@ -1414,7 +1475,7 @@ function localStorageHandler(data) {
1414
1475
  hasEnforcementHook: false,
1415
1476
  valid: hasDeviceAccess()
1416
1477
  };
1417
- validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, MODULE_TYPE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
1478
+ validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
1418
1479
  if (permissions.valid) {
1419
1480
  storeErrorEventData(data);
1420
1481
  }
@@ -1596,7 +1657,17 @@ export const spec = {
1596
1657
  }
1597
1658
 
1598
1659
  if (mediaTypeVideoRef && paramsVideoRef) {
1660
+ const videoImp = bidToVideoImp(bid).video;
1599
1661
  const errorList = checkVideoParams(mediaTypeVideoRef, paramsVideoRef);
1662
+ if (deepAccess(bid, 'mediaTypes.video.context') === OUTSTREAM && isIndexRendererPreferred(bid) && videoImp) {
1663
+ const outstreamPlayerSize = [deepAccess(videoImp, 'w'), deepAccess(videoImp, 'h')];
1664
+ const isValidSize = outstreamPlayerSize[0] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[0] && outstreamPlayerSize[1] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[1];
1665
+ if (!isValidSize) {
1666
+ logError(`IX Bid Adapter: ${outstreamPlayerSize} is an invalid size for IX outstream renderer`);
1667
+ return false;
1668
+ }
1669
+ }
1670
+
1600
1671
  if (errorList.length) {
1601
1672
  errorList.forEach((err) => {
1602
1673
  logError(err, { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
@@ -1605,16 +1676,6 @@ export const spec = {
1605
1676
  }
1606
1677
  }
1607
1678
 
1608
- const videoImp = bidToVideoImp(bid).video;
1609
- if (deepAccess(bid, 'mediaTypes.video.context') === OUTSTREAM && isIndexRendererPreferred(bid) && videoImp) {
1610
- const outstreamPlayerSize = [deepAccess(videoImp, 'w'), deepAccess(videoImp, 'h')];
1611
- const isValidSize = outstreamPlayerSize[0] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[0] && outstreamPlayerSize[1] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[1];
1612
- if (!isValidSize) {
1613
- logError(`IX Bid Adapter: ${outstreamPlayerSize} is an invalid size for IX outstream renderer`);
1614
- return false;
1615
- }
1616
- }
1617
-
1618
1679
  return nativeMediaTypeValid(mediaTypeNativeRef);
1619
1680
  },
1620
1681
 
@@ -1763,11 +1824,60 @@ export const spec = {
1763
1824
  * @returns {array} User sync pixels
1764
1825
  */
1765
1826
  getUserSyncs: function (syncOptions, serverResponses) {
1766
- return (syncOptions.iframeEnabled) ? [{
1767
- type: 'iframe',
1768
- url: USER_SYNC_URL
1769
- }] : [];
1827
+ const syncs = [];
1828
+ let publisherSyncsPerBidderOverride = null;
1829
+ if (serverResponses.length > 0) {
1830
+ publisherSyncsPerBidderOverride = deepAccess(serverResponses[0], 'body.ext.publishersyncsperbidderoverride');
1831
+ }
1832
+ if (publisherSyncsPerBidderOverride !== undefined && publisherSyncsPerBidderOverride == 0) {
1833
+ return [];
1834
+ }
1835
+ if (syncOptions.iframeEnabled) {
1836
+ syncs.push({
1837
+ type: 'iframe',
1838
+ url: IFRAME_USER_SYNC_URL
1839
+ })
1840
+ } else {
1841
+ let publisherSyncsPerBidder = null;
1842
+ if (config.getConfig('userSync')) {
1843
+ publisherSyncsPerBidder = config.getConfig('userSync').syncsPerBidder
1844
+ }
1845
+ if (publisherSyncsPerBidder === 0) {
1846
+ publisherSyncsPerBidder = publisherSyncsPerBidderOverride
1847
+ }
1848
+ if (publisherSyncsPerBidderOverride && (publisherSyncsPerBidder === 0 || publisherSyncsPerBidder)) {
1849
+ publisherSyncsPerBidder = publisherSyncsPerBidderOverride > publisherSyncsPerBidder ? publisherSyncsPerBidder : publisherSyncsPerBidderOverride
1850
+ } else {
1851
+ publisherSyncsPerBidder = 1
1852
+ }
1853
+ for (let i = 0; i < publisherSyncsPerBidder; i++) {
1854
+ syncs.push({
1855
+ type: 'image',
1856
+ url: buildImgSyncUrl(publisherSyncsPerBidder, i)
1857
+ })
1858
+ }
1859
+ }
1860
+ return syncs;
1770
1861
  }
1771
1862
  };
1772
1863
 
1864
+ /**
1865
+ * Build img user sync url
1866
+ * @param {int} syncsPerBidder number of syncs Per Bidder
1867
+ * @param {int} index index to pass
1868
+ * @returns {string} img user sync url
1869
+ */
1870
+ function buildImgSyncUrl(syncsPerBidder, index) {
1871
+ let consentString = '';
1872
+ let gdprApplies = '0';
1873
+ if (gdprConsent && gdprConsent.hasOwnProperty('gdprApplies')) {
1874
+ gdprApplies = gdprConsent.gdprApplies ? '1' : '0';
1875
+ }
1876
+ if (gdprConsent && gdprConsent.hasOwnProperty('consentString')) {
1877
+ consentString = gdprConsent.consentString || '';
1878
+ }
1879
+
1880
+ return IMG_USER_SYNC_URL + '&site_id=' + siteID.toString() + '&p=' + syncsPerBidder.toString() + '&i=' + index.toString() + '&gdpr=' + gdprApplies + '&gdpr_consent=' + consentString + '&us_privacy=' + (usPrivacy || '');
1881
+ }
1882
+
1773
1883
  registerBidder(spec);
@@ -502,11 +502,8 @@ to `'ix'` across all ad units that bids are being requested for does not exceed
502
502
 
503
503
  ### Time-To-Live (TTL)
504
504
 
505
- Banner bids from IX have a TTL of 300 seconds while video bids have a TTL of 1 hour, after which time they become
506
- invalid.
507
-
508
- If an invalid bid wins, and its associated ad is rendered, it will not count
509
- towards total impressions on IX's side.
505
+ Banner bids from Index have a TTL of 600 seconds while video bids have a TTL of three hours, after which time they become invalid.
506
+ **Note:** Index supports the `bid.exp` attribute in the bid response which allows our adapter to specify the maximum number of seconds allowed between the auction and billing notice. In the absence of the `bid.exp` attribute, the TTL provided above applies.
510
507
 
511
508
  FAQs
512
509
  ====
@@ -28,14 +28,14 @@ function setIds_(clientId, sessionId) {
28
28
  let expC = (new Date(new Date().setFullYear(new Date().getFullYear() + 1))).toUTCString();
29
29
  let expS = (new Date(new Date().setMinutes(new Date().getMinutes() + sidTTLMins_))).toUTCString();
30
30
 
31
- storage.setCookie('_jx', clientId, expC, 'None', null);
32
- storage.setCookie('_jx', clientId, expC, 'None', dd);
31
+ storage.setCookie('_jxx', clientId, expC, 'None', null);
32
+ storage.setCookie('_jxx', clientId, expC, 'None', dd);
33
33
 
34
- storage.setCookie('_jxs', sessionId, expS, 'None', null);
35
- storage.setCookie('_jxs', sessionId, expS, 'None', dd);
34
+ storage.setCookie('_jxxs', sessionId, expS, 'None', null);
35
+ storage.setCookie('_jxxs', sessionId, expS, 'None', dd);
36
36
 
37
- storage.setDataInLocalStorage('_jx', clientId);
38
- storage.setDataInLocalStorage('_jxs', sessionId);
37
+ storage.setDataInLocalStorage('_jxx', clientId);
38
+ storage.setDataInLocalStorage('_jxxs', sessionId);
39
39
  } catch (error) {}
40
40
  }
41
41
 
@@ -47,14 +47,14 @@ function fetchIds_() {
47
47
  session_id_ls: ''
48
48
  };
49
49
  try {
50
- let tmp = storage.getCookie('_jx');
50
+ let tmp = storage.getCookie('_jxx');
51
51
  if (tmp) ret.client_id_c = tmp;
52
- tmp = storage.getCookie('_jxs');
52
+ tmp = storage.getCookie('_jxxs');
53
53
  if (tmp) ret.session_id_c = tmp;
54
54
 
55
- tmp = storage.getDataFromLocalStorage('_jx');
55
+ tmp = storage.getDataFromLocalStorage('_jxx');
56
56
  if (tmp) ret.client_id_ls = tmp;
57
- tmp = storage.getDataFromLocalStorage('_jxs');
57
+ tmp = storage.getDataFromLocalStorage('_jxxs');
58
58
  if (tmp) ret.session_id_ls = tmp;
59
59
  } catch (error) {}
60
60
  return ret;
@@ -1,14 +1,96 @@
1
+ import { logError } from '../src/utils.js';
2
+ import { ajax } from '../src/ajax.js';
1
3
  import adapter from '../src/AnalyticsAdapter.js';
2
4
  import adapterManager from '../src/adapterManager.js';
5
+ import CONSTANTS from '../src/constants.json';
3
6
 
4
- var kargoAdapter = adapter({
5
- analyticsType: 'endpoint',
6
- url: 'https://krk.kargo.com/api/v1/event/prebid'
7
- });
7
+ const EVENT_URL = 'https://krk.kargo.com/api/v1/event';
8
+ const KARGO_BIDDER_CODE = 'kargo';
9
+
10
+ const analyticsType = 'endpoint';
11
+
12
+ let _initOptions = {};
13
+
14
+ let _logBidResponseData = {
15
+ auctionId: '',
16
+ auctionTimeout: 0,
17
+ responseTime: 0,
18
+ };
19
+
20
+ let _bidResponseDataLogged = [];
21
+
22
+ var kargoAnalyticsAdapter = Object.assign(
23
+ adapter({ analyticsType }), {
24
+ track({ eventType, args }) {
25
+ switch (eventType) {
26
+ case CONSTANTS.EVENTS.AUCTION_INIT: {
27
+ _logBidResponseData.auctionTimeout = args.timeout;
28
+ break;
29
+ }
30
+ case CONSTANTS.EVENTS.BID_RESPONSE: {
31
+ handleBidResponseData(args);
32
+ break;
33
+ }
34
+ }
35
+ }
36
+ }
37
+ );
38
+
39
+ // handleBidResponseData: Get auction data for Kargo bids and send to server
40
+ function handleBidResponseData (bidResponse) {
41
+ // Verify this is Kargo and we haven't seen this auction data yet
42
+ if (bidResponse.bidder !== KARGO_BIDDER_CODE || _bidResponseDataLogged.includes(bidResponse.auctionId) !== false) {
43
+ return
44
+ }
45
+
46
+ _logBidResponseData.auctionId = bidResponse.auctionId;
47
+ _logBidResponseData.responseTime = bidResponse.timeToRespond;
48
+ sendAuctionData(_logBidResponseData);
49
+ }
50
+
51
+ // sendAuctionData: Send auction data to the server
52
+ function sendAuctionData (data) {
53
+ try {
54
+ _bidResponseDataLogged.push(data.auctionId);
55
+
56
+ if (!shouldFireEventRequest()) {
57
+ return;
58
+ }
59
+
60
+ ajax(
61
+ `${EVENT_URL}/auction-data`,
62
+ null,
63
+ {
64
+ aid: data.auctionId,
65
+ ato: data.auctionTimeout,
66
+ rt: data.responseTime,
67
+ it: 0,
68
+ },
69
+ {
70
+ method: 'GET',
71
+ }
72
+ );
73
+ } catch (err) {
74
+ logError('Error sending auction data: ', err);
75
+ }
76
+ }
77
+
78
+ // Sampling rate out of 100
79
+ function shouldFireEventRequest () {
80
+ const samplingRate = (_initOptions && _initOptions.sampling) || 100;
81
+ return ((Math.floor(Math.random() * 100) + 1) <= parseInt(samplingRate));
82
+ }
83
+
84
+ kargoAnalyticsAdapter.originEnableAnalytics = kargoAnalyticsAdapter.enableAnalytics;
85
+
86
+ kargoAnalyticsAdapter.enableAnalytics = function (config) {
87
+ _initOptions = config.options;
88
+ kargoAnalyticsAdapter.originEnableAnalytics(config);
89
+ };
8
90
 
9
91
  adapterManager.registerAnalyticsAdapter({
10
- adapter: kargoAdapter,
92
+ adapter: kargoAnalyticsAdapter,
11
93
  code: 'kargo'
12
94
  });
13
95
 
14
- export default kargoAdapter;
96
+ export default kargoAnalyticsAdapter;
@@ -0,0 +1,33 @@
1
+ # Overview
2
+
3
+ Module Name: Kargo Analytics Adapter
4
+ Module Type: Analytics Adapter
5
+ Maintainer: support@kargo.com
6
+
7
+ # Description
8
+
9
+ Analytics adapter for Kargo. Contact support@kargo.com for information.
10
+
11
+ # Usage
12
+
13
+ The simplest way to enable the analytics adapter is this
14
+
15
+ ```javascript
16
+ pbjs.enableAnalytics([{
17
+ provider: 'kargo',
18
+ options: {
19
+ sampling: 100 // value out of 100
20
+ }
21
+ }]);
22
+ ```
23
+
24
+ # Test Parameters
25
+
26
+ ```
27
+ {
28
+ provider: 'kargo',
29
+ options: {
30
+ sampling: 100
31
+ }
32
+ }
33
+ ```
@@ -286,6 +286,7 @@ function generateBidParameters(bid, bidderRequest) {
286
286
  sizes: sizesArray,
287
287
  floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
288
288
  bidId: getBidIdParameter('bidId', bid),
289
+ loop: getBidIdParameter('bidderRequestsCount', bid),
289
290
  bidderRequestId: getBidIdParameter('bidderRequestId', bid),
290
291
  transactionId: getBidIdParameter('transactionId', bid),
291
292
  };
@@ -34,17 +34,6 @@ function readnavIDFromCookie() {
34
34
  return storage.cookiesAreEnabled ? (storage.findSimilarCookies('nav') ? storage.findSimilarCookies('nav')[0] : null) : null;
35
35
  }
36
36
 
37
- function readnvgnavFromLocalStorage() {
38
- var i;
39
- const query = /[nvga]{3}\d+/;
40
- for (i in window.localStorage) {
41
- if (i.match(query) || (!query && typeof i === 'string')) {
42
- const naveggId = storage.getDataFromLocalStorage(i.match(query).input).split('|')[0]
43
- return naveggId.split('_')[0];
44
- }
45
- }
46
- }
47
-
48
37
  /** @type {Submodule} */
49
38
  export const naveggIdSubmodule = {
50
39
  /**
@@ -73,7 +62,7 @@ export const naveggIdSubmodule = {
73
62
  getId() {
74
63
  let naveggIdStringFromLocalStorage = null;
75
64
  if (storage.localStorageIsEnabled) {
76
- naveggIdStringFromLocalStorage = readnaveggIdFromLocalStorage() || readnvgnavFromLocalStorage();
65
+ naveggIdStringFromLocalStorage = readnaveggIdFromLocalStorage();
77
66
  }
78
67
 
79
68
  const naveggIdString = naveggIdStringFromLocalStorage || readnaveggIDFromCookie() || readoldnaveggIDFromCookie() || readnvgIDFromCookie() || readnavIDFromCookie();