prebid.js 8.0.0 → 8.2.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 (232) hide show
  1. package/.devcontainer/devcontainer.json +3 -1
  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/admanBidAdapter.js +1 -1
  8. package/dist/adqueryBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adtrgtmeBidAdapter.js +1 -1
  11. package/dist/adxcgBidAdapter.js +1 -1
  12. package/dist/adyoulikeBidAdapter.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/bedigitechBidAdapter.js +1 -1
  21. package/dist/beopBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bridBidAdapter.js +1 -0
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/categoryTranslation.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/cmp.js +1 -0
  32. package/dist/colossussspBidAdapter.js +1 -1
  33. package/dist/conceptxBidAdapter.js +1 -1
  34. package/dist/concertBidAdapter.js +1 -1
  35. package/dist/connectadBidAdapter.js +1 -1
  36. package/dist/consentManagement.js +1 -1
  37. package/dist/consentManagementGpp.js +1 -1
  38. package/dist/consentManagementUsp.js +1 -1
  39. package/dist/consumableBidAdapter.js +1 -1
  40. package/dist/conversantAnalyticsAdapter.js +1 -1
  41. package/dist/conversantBidAdapter.js +1 -1
  42. package/dist/craftBidAdapter.js +1 -1
  43. package/dist/criteoBidAdapter.js +1 -1
  44. package/dist/cwireBidAdapter.js +1 -1
  45. package/dist/dependencies.json +15 -0
  46. package/dist/dspxBidAdapter.js +1 -1
  47. package/dist/eplanningBidAdapter.js +1 -1
  48. package/dist/euidIdSystem.js +1 -1
  49. package/dist/feedadBidAdapter.js +1 -1
  50. package/dist/finativeBidAdapter.js +1 -1
  51. package/dist/freepassBidAdapter.js +1 -0
  52. package/dist/freewheel-sspBidAdapter.js +1 -1
  53. package/dist/gmosspBidAdapter.js +1 -1
  54. package/dist/goldbachBidAdapter.js +1 -1
  55. package/dist/gppControl_usnat.js +1 -0
  56. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  57. package/dist/greenbidsRtdProvider.js +1 -1
  58. package/dist/gridBidAdapter.js +1 -1
  59. package/dist/gumgumBidAdapter.js +1 -1
  60. package/dist/h12mediaBidAdapter.js +1 -1
  61. package/dist/hypelabBidAdapter.js +1 -1
  62. package/dist/id5IdSystem.js +1 -1
  63. package/dist/imdsBidAdapter.js +1 -1
  64. package/dist/improvedigitalBidAdapter.js +1 -1
  65. package/dist/insticatorBidAdapter.js +1 -1
  66. package/dist/intentIqIdSystem.js +1 -1
  67. package/dist/ixBidAdapter.js +1 -1
  68. package/dist/justpremiumBidAdapter.js +1 -1
  69. package/dist/kargoBidAdapter.js +1 -1
  70. package/dist/kiviadsBidAdapter.js +1 -0
  71. package/dist/konduitAnalyticsAdapter.js +1 -1
  72. package/dist/kueezBidAdapter.js +1 -1
  73. package/dist/kueezRtbBidAdapter.js +1 -1
  74. package/dist/kulturemediaBidAdapter.js +1 -1
  75. package/dist/lassoBidAdapter.js +1 -1
  76. package/dist/lifestreetBidAdapter.js +1 -1
  77. package/dist/liveIntentIdSystem.js +1 -1
  78. package/dist/logicadBidAdapter.js +1 -1
  79. package/dist/loglyliftBidAdapter.js +1 -1
  80. package/dist/magniteAnalyticsAdapter.js +1 -1
  81. package/dist/malltvAnalyticsAdapter.js +1 -1
  82. package/dist/marsmediaBidAdapter.js +1 -1
  83. package/dist/mediafuseBidAdapter.js +1 -1
  84. package/dist/mediasquareBidAdapter.js +1 -1
  85. package/dist/mgidBidAdapter.js +1 -1
  86. package/dist/mgidXBidAdapter.js +1 -0
  87. package/dist/minutemediaBidAdapter.js +1 -1
  88. package/dist/minutemediaplusBidAdapter.js +1 -1
  89. package/dist/mspa.js +1 -0
  90. package/dist/nexx360BidAdapter.js +1 -1
  91. package/dist/not-for-prod/prebid.js +146 -139
  92. package/dist/oguryBidAdapter.js +1 -1
  93. package/dist/onetagBidAdapter.js +1 -1
  94. package/dist/ooloAnalyticsAdapter.js +1 -1
  95. package/dist/optidigitalBidAdapter.js +1 -1
  96. package/dist/outbrainBidAdapter.js +1 -1
  97. package/dist/oxxionAnalyticsAdapter.js +1 -1
  98. package/dist/oxxionRtdProvider.js +1 -1
  99. package/dist/parrableIdSystem.js +1 -1
  100. package/dist/pixfutureBidAdapter.js +1 -1
  101. package/dist/prebid-core.js +1 -1
  102. package/dist/publinkIdSystem.js +1 -1
  103. package/dist/pubmaticBidAdapter.js +1 -1
  104. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  105. package/dist/pxyzBidAdapter.js +1 -1
  106. package/dist/quantcastBidAdapter.js +1 -1
  107. package/dist/readpeakBidAdapter.js +1 -1
  108. package/dist/relaidoBidAdapter.js +1 -1
  109. package/dist/retailspotBidAdapter.js +1 -1
  110. package/dist/rhythmoneBidAdapter.js +1 -1
  111. package/dist/riseBidAdapter.js +1 -1
  112. package/dist/rtbhouseBidAdapter.js +1 -1
  113. package/dist/rubiconBidAdapter.js +1 -1
  114. package/dist/seedingAllianceBidAdapter.js +1 -1
  115. package/dist/seedtagBidAdapter.js +1 -1
  116. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  117. package/dist/sharethroughBidAdapter.js +1 -1
  118. package/dist/shinezBidAdapter.js +1 -1
  119. package/dist/smaatoBidAdapter.js +1 -1
  120. package/dist/smartadserverBidAdapter.js +1 -1
  121. package/dist/smartxBidAdapter.js +1 -1
  122. package/dist/smilewantedBidAdapter.js +1 -1
  123. package/dist/sonobiBidAdapter.js +1 -1
  124. package/dist/sovrnAnalyticsAdapter.js +1 -1
  125. package/dist/sovrnBidAdapter.js +1 -1
  126. package/dist/sspBCBidAdapter.js +1 -1
  127. package/dist/stvBidAdapter.js +1 -1
  128. package/dist/sublimeBidAdapter.js +1 -1
  129. package/dist/targetVideoBidAdapter.js +1 -1
  130. package/dist/teadsBidAdapter.js +1 -1
  131. package/dist/trionBidAdapter.js +1 -1
  132. package/dist/tripleliftBidAdapter.js +1 -1
  133. package/dist/ttdBidAdapter.js +1 -1
  134. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  135. package/dist/uid2IdSystem.js +1 -1
  136. package/dist/underdogmediaBidAdapter.js +1 -1
  137. package/dist/undertoneBidAdapter.js +1 -1
  138. package/dist/userId.js +1 -1
  139. package/dist/vidazooBidAdapter.js +1 -1
  140. package/dist/videobyteBidAdapter.js +1 -1
  141. package/dist/visxBidAdapter.js +1 -1
  142. package/dist/vuukleBidAdapter.js +1 -1
  143. package/dist/widespaceBidAdapter.js +1 -1
  144. package/dist/winrBidAdapter.js +1 -1
  145. package/dist/yahoosspBidAdapter.js +1 -1
  146. package/dist/yieldmoBidAdapter.js +1 -1
  147. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  148. package/libraries/cmp/cmpClient.js +139 -0
  149. package/libraries/mspa/activityControls.js +91 -0
  150. package/modules/admanBidAdapter.js +5 -0
  151. package/modules/amxBidAdapter.js +11 -12
  152. package/modules/bedigitechBidAdapter.js +15 -12
  153. package/modules/bedigitechBidAdapter.md +2 -2
  154. package/modules/beopBidAdapter.js +0 -4
  155. package/modules/bidwatchAnalyticsAdapter.js +33 -5
  156. package/modules/bridBidAdapter.js +223 -0
  157. package/modules/categoryTranslation.js +3 -2
  158. package/modules/colossussspBidAdapter.js +9 -0
  159. package/modules/conceptxBidAdapter.js +6 -3
  160. package/modules/consentManagement.js +12 -86
  161. package/modules/consentManagementGpp.js +47 -126
  162. package/modules/consentManagementUsp.js +19 -97
  163. package/modules/freepassBidAdapter.js +98 -0
  164. package/modules/freepassBidAdapter.md +31 -0
  165. package/modules/freepassIdSystem.md +1 -1
  166. package/modules/gppControl_usnat.js +11 -0
  167. package/modules/greenbidsAnalyticsAdapter.js +7 -13
  168. package/modules/gridBidAdapter.js +3 -4
  169. package/modules/intentIqIdSystem.js +11 -9
  170. package/modules/ixBidAdapter.js +284 -55
  171. package/modules/kiviadsBidAdapter.js +212 -0
  172. package/modules/kiviadsBidAdapter.md +79 -0
  173. package/modules/liveIntentIdSystem.js +8 -3
  174. package/modules/mediasquareBidAdapter.js +19 -23
  175. package/modules/mgidXBidAdapter.js +263 -0
  176. package/modules/mgidXBidAdapter.md +79 -0
  177. package/modules/oxxionAnalyticsAdapter.js +33 -5
  178. package/modules/oxxionRtdProvider.js +124 -11
  179. package/modules/oxxionRtdProvider.md +19 -4
  180. package/modules/pubmaticBidAdapter.js +18 -2
  181. package/modules/rtbhouseBidAdapter.js +9 -2
  182. package/modules/rtbhouseBidAdapter.md +27 -8
  183. package/modules/rubiconBidAdapter.js +13 -1
  184. package/modules/sharethroughBidAdapter.js +14 -0
  185. package/modules/sonobiBidAdapter.js +4 -7
  186. package/modules/tripleliftBidAdapter.js +21 -1
  187. package/modules/userId/eids.js +29 -0
  188. package/modules/userId/eids.md +19 -2
  189. package/modules/userId/index.js +78 -29
  190. package/modules/userId/userId.md +3 -0
  191. package/package.json +1 -1
  192. package/src/activities/params.js +4 -1
  193. package/test/spec/libraries/cmp/cmpClient_spec.js +233 -0
  194. package/test/spec/libraries/mspa/activityControls_spec.js +315 -0
  195. package/test/spec/modules/admanBidAdapter_spec.js +8 -2
  196. package/test/spec/modules/adqueryBidAdapter_spec.js +5 -1
  197. package/test/spec/modules/amxBidAdapter_spec.js +6 -3
  198. package/test/spec/modules/bedigitechBidAdapter_spec.js +25 -36
  199. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +21 -1
  200. package/test/spec/modules/bridBidAdapter_spec.js +129 -0
  201. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +9 -7
  202. package/test/spec/modules/chtnwBidAdapter_spec.js +4 -1
  203. package/test/spec/modules/colossussspBidAdapter_spec.js +29 -0
  204. package/test/spec/modules/consentManagementGpp_spec.js +84 -7
  205. package/test/spec/modules/consentManagement_spec.js +8 -18
  206. package/test/spec/modules/datablocksBidAdapter_spec.js +7 -3
  207. package/test/spec/modules/eids_spec.js +87 -0
  208. package/test/spec/modules/freepassBidAdapter_spec.js +161 -0
  209. package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +0 -15
  210. package/test/spec/modules/gridBidAdapter_spec.js +29 -28
  211. package/test/spec/modules/insticatorBidAdapter_spec.js +6 -2
  212. package/test/spec/modules/intentIqIdSystem_spec.js +36 -2
  213. package/test/spec/modules/ixBidAdapter_spec.js +785 -15
  214. package/test/spec/modules/kiviadsBidAdapter_spec.js +404 -0
  215. package/test/spec/modules/lassoBidAdapter_spec.js +6 -4
  216. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +17 -2
  217. package/test/spec/modules/liveIntentIdSystem_spec.js +11 -6
  218. package/test/spec/modules/mediasquareBidAdapter_spec.js +3 -0
  219. package/test/spec/modules/mgidXBidAdapter_spec.js +426 -0
  220. package/test/spec/modules/onetagBidAdapter_spec.js +81 -75
  221. package/test/spec/modules/orbidderBidAdapter_spec.js +6 -3
  222. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +21 -2
  223. package/test/spec/modules/oxxionRtdProvider_spec.js +113 -1
  224. package/test/spec/modules/pubmaticBidAdapter_spec.js +25 -0
  225. package/test/spec/modules/relaidoBidAdapter_spec.js +4 -3
  226. package/test/spec/modules/rtbhouseBidAdapter_spec.js +35 -0
  227. package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
  228. package/test/spec/modules/sharethroughBidAdapter_spec.js +75 -0
  229. package/test/spec/modules/sonobiBidAdapter_spec.js +15 -15
  230. package/test/spec/modules/tripleliftBidAdapter_spec.js +20 -1
  231. package/test/spec/modules/ucfunnelBidAdapter_spec.js +37 -16
  232. package/test/spec/modules/userId_spec.js +393 -6
@@ -1 +1 @@
1
- (self.pbjsChunk=self.pbjsChunk||[]).push([[54572],{83519:function(e,t,n){var a=n(78640),i=n(64358),o=n(48928),r=n(64563),d=n(5644),s=n(86104),c=n(18621),u=n(78653),v={},g={},f={},l={};l[d.FP.BID_ADJUSTMENT]=!0,l[d.FP.BIDDER_DONE]=!0,l[d.FP.AUCTION_END]=!0;var p="",b="https://pool.tsukiji.iponweb.net/hba",I="";function S(e,t){e.adUnitCode&&t[e.adUnitCode]&&(e.adUnitName=t[e.adUnitCode]),(0,i.isArray)(e.adUnits)&&e.adUnits.forEach((function(e){e.code&&t[e.code]&&(e.name=t[e.code])})),(0,i.isArray)(e.adUnitCodes)&&(e.adUnitNames=e.adUnitCodes.map((function(e){return t[e]}))),["bids","bidderRequests","bidsReceived","noBids"].forEach((function(n){!function(e,t){(0,i.isArray)(e)&&e.forEach((function(e){S(e,t)}))}(e[n],t)}))}var h=Object.assign((0,r.ZP)({analyticsType:"endpoint"}),{getUrl:function(){return b},track:function(e){var t=e.eventType,n=e.args,a=void 0===n?{}:n;if(t===d.FP.BID_REQUESTED){var o="".concat(a.bidderCode,"_").concat(a.auctionId);v[o]=(0,i.deepClone)(a),v[o].bids=[],a.bids.forEach((function(e){g["".concat(e.bidId,"_").concat(e.auctionId)]=e}))}if(t===d.FP.BID_TIMEOUT&&(0,i.isArray)(a)){var r=h.eventsStorage,s={};a.forEach((function(e){var n="".concat(e.bidId,"_").concat(e.auctionId),a="".concat(e.bidder,"_").concat(e.auctionId);r[e.auctionId]||(r[e.auctionId]={events:[]}),(v[a]||s[e.bidder])&&g[n]&&(s[e.bidder]||(s[e.bidder]=v[a],r[e.auctionId].events.push({eventType:t,params:s[e.bidder]}),delete v[a]),s[e.bidder].bids.push(g[n]),delete g[n])}))}else if(p=a.auctionId||p){var b=h.eventsStorage;b[p]||(b[p]={events:[]});var y=a.refererInfo&&a.refererInfo.page;y&&f[p]!==y&&(f[p]=y);var E=Object.assign({},a);if(delete E.ad,E.bidsReceived&&(E.bidsReceived=E.bidsReceived.map((function(e){var t=Object.assign({},e);return delete t.ad,t}))),l[t]||b[p].events.push({eventType:t,params:E}),t===d.FP.AUCTION_END||t===d.FP.BID_WON){if(E.adServerTargeting=c.q0.getAllTargeting(u.K.getAdUnitCodes(),u.K.getBidsReceived()),h.eventsStorage[p]&&h.eventsStorage[p].events.length){h.eventsStorage[p].page={url:f[p]},h.eventsStorage[p].pubId=I,h.eventsStorage[p].wrapper_version="8.0.0";var A=function(){if(window.googletag&&window.googletag.pubads){var e=googletag.pubads();if(e&&e.getSlots){var t=e.getSlots();if(t&&t.length){var n={};return t.forEach((function(e){var t=e.getSlotElementId(),a=(e.getAdUnitPath()||"").split("/").pop();n[t]=a})),n}}}}();A&&h.eventsStorage[p].events.forEach((function(e){S(e.params,A)}))}h.sendStat(h.eventsStorage[p],p)}}},sendStat:function(e,t){e&&e.events&&e.events.length&&(delete h.eventsStorage[t],(0,o.h)(b,{success:function(){},error:function(){}},JSON.stringify(e),{method:"POST"}))}});h.eventsStorage={},h.originEnableAnalytics=h.enableAnalytics,h.enableAnalytics=function(e){var t=e&&e.options;t&&("string"==typeof t.url&&(b=t.url),t.pubId&&(I=t.pubId.toString())),h.originEnableAnalytics(e)},s.ZP.registerAnalyticsAdapter({adapter:h,code:"yieldone"});(0,a.z)("yieldoneAnalyticsAdapter")}},function(e){e.O(0,[14861],(function(){return t=83519,e(e.s=t);var t}));e.O()}]);
1
+ (self.pbjsChunk=self.pbjsChunk||[]).push([[54572],{83519:function(e,t,n){var a=n(78640),i=n(64358),o=n(48928),r=n(64563),d=n(5644),s=n(86104),c=n(18621),u=n(78653),v={},g={},f={},l={};l[d.FP.BID_ADJUSTMENT]=!0,l[d.FP.BIDDER_DONE]=!0,l[d.FP.AUCTION_END]=!0;var p="",b="https://pool.tsukiji.iponweb.net/hba",I="";function S(e,t){e.adUnitCode&&t[e.adUnitCode]&&(e.adUnitName=t[e.adUnitCode]),(0,i.isArray)(e.adUnits)&&e.adUnits.forEach((function(e){e.code&&t[e.code]&&(e.name=t[e.code])})),(0,i.isArray)(e.adUnitCodes)&&(e.adUnitNames=e.adUnitCodes.map((function(e){return t[e]}))),["bids","bidderRequests","bidsReceived","noBids"].forEach((function(n){!function(e,t){(0,i.isArray)(e)&&e.forEach((function(e){S(e,t)}))}(e[n],t)}))}var h=Object.assign((0,r.ZP)({analyticsType:"endpoint"}),{getUrl:function(){return b},track:function(e){var t=e.eventType,n=e.args,a=void 0===n?{}:n;if(t===d.FP.BID_REQUESTED){var o="".concat(a.bidderCode,"_").concat(a.auctionId);v[o]=(0,i.deepClone)(a),v[o].bids=[],a.bids.forEach((function(e){g["".concat(e.bidId,"_").concat(e.auctionId)]=e}))}if(t===d.FP.BID_TIMEOUT&&(0,i.isArray)(a)){var r=h.eventsStorage,s={};a.forEach((function(e){var n="".concat(e.bidId,"_").concat(e.auctionId),a="".concat(e.bidder,"_").concat(e.auctionId);r[e.auctionId]||(r[e.auctionId]={events:[]}),(v[a]||s[e.bidder])&&g[n]&&(s[e.bidder]||(s[e.bidder]=v[a],r[e.auctionId].events.push({eventType:t,params:s[e.bidder]}),delete v[a]),s[e.bidder].bids.push(g[n]),delete g[n])}))}else if(p=a.auctionId||p){var b=h.eventsStorage;b[p]||(b[p]={events:[]});var y=a.refererInfo&&a.refererInfo.page;y&&f[p]!==y&&(f[p]=y);var E=Object.assign({},a);if(delete E.ad,E.bidsReceived&&(E.bidsReceived=E.bidsReceived.map((function(e){var t=Object.assign({},e);return delete t.ad,t}))),l[t]||b[p].events.push({eventType:t,params:E}),t===d.FP.AUCTION_END||t===d.FP.BID_WON){if(E.adServerTargeting=c.q0.getAllTargeting(u.K.getAdUnitCodes(),u.K.getBidsReceived()),h.eventsStorage[p]&&h.eventsStorage[p].events.length){h.eventsStorage[p].page={url:f[p]},h.eventsStorage[p].pubId=I,h.eventsStorage[p].wrapper_version="8.2.0";var A=function(){if(window.googletag&&window.googletag.pubads){var e=googletag.pubads();if(e&&e.getSlots){var t=e.getSlots();if(t&&t.length){var n={};return t.forEach((function(e){var t=e.getSlotElementId(),a=(e.getAdUnitPath()||"").split("/").pop();n[t]=a})),n}}}}();A&&h.eventsStorage[p].events.forEach((function(e){S(e.params,A)}))}h.sendStat(h.eventsStorage[p],p)}}},sendStat:function(e,t){e&&e.events&&e.events.length&&(delete h.eventsStorage[t],(0,o.h)(b,{success:function(){},error:function(){}},JSON.stringify(e),{method:"POST"}))}});h.eventsStorage={},h.originEnableAnalytics=h.enableAnalytics,h.enableAnalytics=function(e){var t=e&&e.options;t&&("string"==typeof t.url&&(b=t.url),t.pubId&&(I=t.pubId.toString())),h.originEnableAnalytics(e)},s.ZP.registerAnalyticsAdapter({adapter:h,code:"yieldone"});(0,a.z)("yieldoneAnalyticsAdapter")}},function(e){e.O(0,[14861],(function(){return t=83519,e(e.s=t);var t}));e.O()}]);
@@ -0,0 +1,139 @@
1
+ import {GreedyPromise} from '../../src/utils/promise.js';
2
+
3
+ /**
4
+ * @typedef {function} CMPClient
5
+ *
6
+ * @param {{}} params CMP parameters. Currently this is a subset of {command, callback, parameter, version}.
7
+ * @returns {Promise<*>} a promise that:
8
+ * - if a `callback` param was provided, resolves (with no result) just before the first time it's run;
9
+ * - if `callback` was *not* provided, resolves to the return value of the CMP command
10
+ * @property {boolean} isDirect true if the CMP is directly accessible (no postMessage required)
11
+ */
12
+
13
+ /**
14
+ * Returns a function that can interface with a CMP regardless of where it's located.
15
+ *
16
+ * @param apiName name of the CMP api, e.g. "__gpp"
17
+ * @param apiVersion? CMP API version
18
+ * @param apiArgs? names of the arguments taken by the api function, in order.
19
+ * @param callbackArgs? names of the cross-frame response payload properties that should be passed as callback arguments, in order
20
+ * @param win
21
+ * @returns {CMPClient} CMP invocation function (or null if no CMP was found).
22
+ */
23
+ export function cmpClient(
24
+ {
25
+ apiName,
26
+ apiVersion,
27
+ apiArgs = ['command', 'callback', 'parameter', 'version'],
28
+ callbackArgs = ['returnValue', 'success'],
29
+ },
30
+ win = window
31
+ ) {
32
+ const cmpCallbacks = {};
33
+ const callName = `${apiName}Call`;
34
+ const cmpDataPkgName = `${apiName}Return`;
35
+
36
+ function handleMessage(event) {
37
+ const json = (typeof event.data === 'string' && event.data.includes(cmpDataPkgName)) ? JSON.parse(event.data) : event.data;
38
+ if (json?.[cmpDataPkgName]?.callId) {
39
+ const payload = json[cmpDataPkgName];
40
+
41
+ if (cmpCallbacks.hasOwnProperty(payload.callId)) {
42
+ cmpCallbacks[payload.callId](...callbackArgs.map(name => payload[name]));
43
+ }
44
+ }
45
+ }
46
+
47
+ function findCMP() {
48
+ let f = win;
49
+ let cmpFrame;
50
+ let isDirect = false;
51
+ while (f != null) {
52
+ try {
53
+ if (typeof f[apiName] === 'function') {
54
+ cmpFrame = f;
55
+ isDirect = true;
56
+ break;
57
+ }
58
+ } catch (e) {
59
+ }
60
+
61
+ // need separate try/catch blocks due to the exception errors thrown when trying to check for a frame that doesn't exist in 3rd party env
62
+ try {
63
+ if (f.frames[`${apiName}Locator`]) {
64
+ cmpFrame = f;
65
+ break;
66
+ }
67
+ } catch (e) {
68
+ }
69
+
70
+ if (f === win.top) break;
71
+ f = f.parent;
72
+ }
73
+
74
+ return [
75
+ cmpFrame,
76
+ isDirect
77
+ ];
78
+ }
79
+
80
+ const [cmpFrame, isDirect] = findCMP();
81
+
82
+ if (!cmpFrame) {
83
+ return;
84
+ }
85
+
86
+ function resolveParams(params) {
87
+ params = Object.assign({version: apiVersion}, params);
88
+ return apiArgs.map(arg => [arg, params[arg]])
89
+ }
90
+
91
+ function wrapCallback(callback, resolve, reject, preamble) {
92
+ return function (result, success) {
93
+ preamble && preamble();
94
+ const resolver = success == null || success ? resolve : reject;
95
+ if (typeof callback === 'function') {
96
+ resolver();
97
+ return callback.apply(this, arguments);
98
+ } else {
99
+ resolver(result);
100
+ }
101
+ }
102
+ }
103
+
104
+ let client;
105
+
106
+ if (isDirect) {
107
+ client = function invokeCMPDirect(params = {}) {
108
+ return new GreedyPromise((resolve, reject) => {
109
+ const ret = cmpFrame[apiName](...resolveParams({
110
+ ...params,
111
+ callback: params.callback && wrapCallback(params.callback, resolve, reject)
112
+ }).map(([_, val]) => val));
113
+ if (params.callback == null) {
114
+ resolve(ret);
115
+ }
116
+ });
117
+ };
118
+ } else {
119
+ win.addEventListener('message', handleMessage, false);
120
+
121
+ client = function invokeCMPFrame(params) {
122
+ return new GreedyPromise((resolve, reject) => {
123
+ // call CMP via postMessage
124
+ const callId = Math.random().toString();
125
+ const msg = {
126
+ [callName]: {
127
+ ...Object.fromEntries(resolveParams(params).filter(([param]) => param !== 'callback')),
128
+ callId: callId
129
+ }
130
+ };
131
+
132
+ cmpCallbacks[callId] = wrapCallback(params?.callback, resolve, reject, params?.callback == null && (() => { delete cmpCallbacks[callId] }));
133
+ cmpFrame.postMessage(msg, '*');
134
+ });
135
+ };
136
+ }
137
+ client.isDirect = isDirect;
138
+ return client;
139
+ }
@@ -0,0 +1,91 @@
1
+ import {registerActivityControl} from '../../src/activities/rules.js';
2
+ import {
3
+ ACTIVITY_ENRICH_EIDS,
4
+ ACTIVITY_ENRICH_UFPD,
5
+ ACTIVITY_SYNC_USER,
6
+ ACTIVITY_TRANSMIT_PRECISE_GEO
7
+ } from '../../src/activities/activities.js';
8
+ import {gppDataHandler} from '../../src/adapterManager.js';
9
+
10
+ // default interpretation for MSPA consent(s):
11
+ // https://docs.google.com/document/d/1yPEVx3bBdSkIw-QNkQR5qi1ztmn9zoXk-LaGQB6iw7Q
12
+
13
+ export function isBasicConsentDenied(cd) {
14
+ // service provider mode is always consent denied
15
+ return ['MspaServiceProviderMode', 'Gpc'].some(prop => cd[prop] === 1) ||
16
+ // you cannot consent to what you were not notified of
17
+ cd.PersonalDataConsents === 2 ||
18
+ // minors 13+ who have not given consent
19
+ cd.KnownChildSensitiveDataConsents[0] === 1 ||
20
+ // minors under 13 cannot consent
21
+ cd.KnownChildSensitiveDataConsents[1] !== 0 ||
22
+ // sensitive category consent impossible without notice
23
+ (cd.SensitiveDataProcessing.some(element => element === 2) && (cd.SensitiveDataLimitUseNotice !== 1 || cd.SensitiveDataProcessingOptOutNotice !== 1));
24
+ }
25
+
26
+ export function isSensitiveNoticeMissing(cd) {
27
+ return ['SensitiveDataProcessingOptOutNotice', 'SensitiveDataLimitUseNotice'].some(prop => cd[prop] === 2)
28
+ }
29
+
30
+ export function isConsentDenied(cd) {
31
+ return isBasicConsentDenied(cd) ||
32
+ // user opts out
33
+ (['SaleOptOut', 'SharingOptOut', 'TargetedAdvertisingOptOut'].some(prop => cd[prop] === 1)) ||
34
+ // notice not given
35
+ (['SaleOptOutNotice', 'SharingNotice', 'SharingOptOutNotice', 'TargetedAdvertisingOptOutNotice'].some(prop => cd[prop] === 2)) ||
36
+ // sale opted in but notice does not apply
37
+ ((cd.SaleOptOut === 2 && cd.SaleOptOutNotice === 0)) ||
38
+ // targeted opted in but notice does not apply
39
+ ((cd.TargetedAdvertisingOptOut === 2 && cd.TargetedAdvertisingOptOutNotice === 0)) ||
40
+ // sharing opted in but notices do not apply
41
+ ((cd.SharingOptOut === 2 && (cd.SharingNotice === 0 || cd.SharingOptOutNotice === 0)));
42
+ }
43
+
44
+ export function isTransmitUfpdConsentDenied(cd) {
45
+ // SensitiveDataProcessing[1-5,11]=1 OR SensitiveDataProcessing[6,7,9,10,12]<>0 OR
46
+ const mustBeZero = [6, 7, 9, 10, 12];
47
+ const mustBeZeroSubtractedVector = mustBeZero.map((number) => number - 1);
48
+ const SensitiveDataProcessingMustBeZero = cd.SensitiveDataProcessing.filter(index => mustBeZeroSubtractedVector.includes(index));
49
+ const cannotBeOne = [1, 2, 3, 4, 5, 11];
50
+ const cannotBeOneSubtractedVector = cannotBeOne.map((number) => number - 1);
51
+ const SensitiveDataProcessingCannotBeOne = cd.SensitiveDataProcessing.filter(index => cannotBeOneSubtractedVector.includes(index));
52
+ return isConsentDenied(cd) ||
53
+ isSensitiveNoticeMissing(cd) ||
54
+ SensitiveDataProcessingCannotBeOne.some(val => val === 1) ||
55
+ SensitiveDataProcessingMustBeZero.some(val => val !== 0);
56
+ }
57
+
58
+ export function isTransmitGeoConsentDenied(cd) {
59
+ return isBasicConsentDenied(cd) ||
60
+ isSensitiveNoticeMissing(cd) ||
61
+ cd.SensitiveDataProcessing[7] === 1
62
+ }
63
+
64
+ const CONSENT_RULES = {
65
+ [ACTIVITY_SYNC_USER]: isConsentDenied,
66
+ [ACTIVITY_ENRICH_EIDS]: isConsentDenied,
67
+ [ACTIVITY_ENRICH_UFPD]: isTransmitUfpdConsentDenied,
68
+ [ACTIVITY_TRANSMIT_PRECISE_GEO]: isTransmitGeoConsentDenied
69
+ }
70
+
71
+ export function mspaRule(sids, getConsent, denies, applicableSids = () => gppDataHandler.getConsentData()?.applicableSections) {
72
+ return function() {
73
+ if (applicableSids().some(sid => sids.includes(sid))) {
74
+ const consent = getConsent();
75
+ if (consent == null) {
76
+ return {allow: false, reason: 'consent data not available'};
77
+ }
78
+ if (denies(consent)) {
79
+ return {allow: false}
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ export function setupRules(api, sids, normalizeConsent = (c) => c, rules = CONSENT_RULES, registerRule = registerActivityControl, getConsentData = () => gppDataHandler.getConsentData()) {
86
+ const unreg = [];
87
+ Object.entries(rules).forEach(([activity, denies]) => {
88
+ unreg.push(registerRule(activity, `MSPA (${api})`, mspaRule(sids, () => normalizeConsent(getConsentData()?.sectionData?.[api]), denies, () => getConsentData()?.applicableSections || [])))
89
+ })
90
+ return () => unreg.forEach(ur => ur())
91
+ }
@@ -109,6 +109,11 @@ export const spec = {
109
109
  bidFloor: getBidFloor(bid)
110
110
  }
111
111
 
112
+ if (bid.transactionId) {
113
+ placement.ext = placement.ext || {};
114
+ placement.ext.tid = bid.transactionId;
115
+ }
116
+
112
117
  if (bid.schain) {
113
118
  placement.schain = bid.schain;
114
119
  }
@@ -1,5 +1,5 @@
1
- import {registerBidder} from '../src/adapters/bidderFactory.js';
2
- import {BANNER, VIDEO} from '../src/mediaTypes.js';
1
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
2
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
3
3
  import {
4
4
  _each,
5
5
  deepAccess,
@@ -10,15 +10,16 @@ import {
10
10
  logError,
11
11
  parseUrl,
12
12
  triggerPixel,
13
+ generateUUID,
13
14
  } from '../src/utils.js';
14
- import {config} from '../src/config.js';
15
- import {getStorageManager} from '../src/storageManager.js';
15
+ import { config } from '../src/config.js';
16
+ import { getStorageManager } from '../src/storageManager.js';
16
17
 
17
18
  const BIDDER_CODE = 'amx';
18
19
  const storage = getStorageManager({ bidderCode: BIDDER_CODE });
19
20
  const SIMPLE_TLD_TEST = /\.com?\.\w{2,4}$/;
20
21
  const DEFAULT_ENDPOINT = 'https://prebid.a-mo.net/a/c';
21
- const VERSION = 'pba1.3.2';
22
+ const VERSION = 'pba1.3.3';
22
23
  const VAST_RXP = /^\s*<\??(?:vast|xml)/i;
23
24
  const TRACKING_ENDPOINT = 'https://1x1.a-mo.net/hbx/';
24
25
  const AMUID_KEY = '__amuidpb';
@@ -255,12 +256,12 @@ function getGpp(bidderRequest) {
255
256
  return bidderRequest.gppConsent;
256
257
  }
257
258
 
258
- return bidderRequest?.ortb2?.regs?.gpp ?? {gppString: '', applicableSections: ''};
259
+ return bidderRequest?.ortb2?.regs?.gpp ?? { gppString: '', applicableSections: '' };
259
260
  }
260
261
 
261
262
  function buildReferrerInfo(bidderRequest) {
262
263
  if (bidderRequest.refererInfo == null) {
263
- return {r: '', t: false, c: '', l: 0, s: []}
264
+ return { r: '', t: false, c: '', l: 0, s: [] }
264
265
  }
265
266
 
266
267
  const re = bidderRequest.refererInfo;
@@ -303,8 +304,7 @@ export const spec = {
303
304
  };
304
305
 
305
306
  const payload = {
306
- // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781
307
- a: bidderRequest.auctionId,
307
+ a: generateUUID(),
308
308
  B: 0,
309
309
  b: loc.host,
310
310
  brc: fbid.bidderRequestsCount || 0,
@@ -388,9 +388,9 @@ export const spec = {
388
388
  const output = [];
389
389
  let hasFrame = false;
390
390
 
391
- _each(serverResponses, function ({ body: response }) {
391
+ _each(serverResponses, function({ body: response }) {
392
392
  if (response != null && response.p != null && response.p.hreq) {
393
- _each(response.p.hreq, function (syncPixel) {
393
+ _each(response.p.hreq, function(syncPixel) {
394
394
  const pixelType =
395
395
  syncPixel.indexOf('__st=iframe') !== -1 ? 'iframe' : 'image';
396
396
  if (syncOptions.iframeEnabled || pixelType === 'image') {
@@ -483,7 +483,6 @@ export const spec = {
483
483
  bid: timeoutData.bidId,
484
484
  a: timeoutData.adUnitCode,
485
485
  cn: timeoutData.timeout,
486
- aud: timeoutData.auctionId,
487
486
  });
488
487
  },
489
488
 
@@ -1,23 +1,27 @@
1
1
  import {BANNER, NATIVE} from '../src/mediaTypes.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
- import { _each, isArray } from '../src/utils.js';
3
+ import {_each, isArray} from '../src/utils.js';
4
4
 
5
5
  const BEDIGITECH_CODE = 'bedigitech';
6
- const BEDIGITECH_ENDPOINT = 'https://bedigitalhb.s3.amazonaws.com/hb.js';
6
+ const BEDIGITECH_ENDPOINT = 'https://bid.bedigitech.com/bid/pub_bid.php';
7
7
  const BEDIGITECH_REQUEST_METHOD = 'GET';
8
8
  const BEDIGITECH_CURRENCY = 'USD';
9
-
10
- function interpretResponse(placementResponse, bidRequest, bids) {
9
+ let requestId = '';
10
+ function interpretResponse(placementResponse, bids) {
11
11
  const bid = {
12
12
  id: placementResponse.id,
13
- requestId: placementResponse.requestId,
13
+ requestId: requestId || placementResponse.id,
14
+ bidderCode: 'bedigitech',
14
15
  cpm: placementResponse.cpm,
15
16
  ad: decodeURIComponent(placementResponse.ad),
16
17
  width: placementResponse.width || 0,
17
18
  height: placementResponse.height || 0,
18
19
  currency: placementResponse.currency || BEDIGITECH_CURRENCY,
19
20
  ttl: placementResponse.ttl || 300,
20
- creativeId: placementResponse.creativeId || 0,
21
+ creativeId: placementResponse.crid,
22
+ requestTimestamp: placementResponse.requestTime,
23
+ timeToRespond: placementResponse.timeToRespond || 300,
24
+ netRevenue: placementResponse.netRevenue,
21
25
  meta: {
22
26
  mediaType: BANNER,
23
27
  },
@@ -29,14 +33,15 @@ export const spec = {
29
33
  code: BEDIGITECH_CODE,
30
34
  supportedMediaTypes: [BANNER, NATIVE],
31
35
  isBidRequestValid: bid => {
36
+ requestId = '';
37
+ requestId = bid.bidId
32
38
  return !!bid.params.placementId && !!bid.bidId && bid.bidder === 'bedigitech'
33
39
  },
34
40
 
35
- buildRequests: (bidRequests, bidderRequest) => {
41
+ buildRequests: (bidRequests) => {
36
42
  return bidRequests.map(bid => {
37
43
  let url = BEDIGITECH_ENDPOINT;
38
44
  const data = {'pid': bid.params.placementId};
39
-
40
45
  return {
41
46
  method: BEDIGITECH_REQUEST_METHOD,
42
47
  url,
@@ -50,15 +55,13 @@ export const spec = {
50
55
  });
51
56
  },
52
57
 
53
- interpretResponse: function(serverResponse, bidRequest) {
58
+ interpretResponse: function(serverResponse) {
54
59
  let bids = [];
55
-
56
60
  if (isArray(serverResponse.body)) {
57
61
  _each(serverResponse.body, function(placementResponse) {
58
- interpretResponse(placementResponse, bidRequest, bids);
62
+ interpretResponse(placementResponse, bids);
59
63
  });
60
64
  }
61
-
62
65
  return bids;
63
66
  },
64
67
 
@@ -4,7 +4,7 @@ Module Name: Bedigitech Bidder Adapter
4
4
 
5
5
  Module Type: Bidder Adapter
6
6
 
7
- Maintainer: yogesh@thebeglobal.com
7
+ Maintainer: prebid@bedigitech.com
8
8
 
9
9
  # Description
10
10
 
@@ -23,7 +23,7 @@ About us : https://www.bedigitech.com/
23
23
  {
24
24
  bidder: "bedigitech",
25
25
  params: {
26
- placementId: "1234"
26
+ placementId: 309
27
27
  }
28
28
  }
29
29
  ]
@@ -129,8 +129,6 @@ function buildTrackingParams(data, info, value) {
129
129
  nptnid: params.networkPartnerId,
130
130
  bid: data.bidId || data.requestId,
131
131
  sl_n: data.adUnitCode,
132
- // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781
133
- aid: data.auctionId,
134
132
  se_ca: 'bid',
135
133
  se_ac: info,
136
134
  se_va: value,
@@ -158,8 +156,6 @@ function beOpRequestSlotsMaker(bid) {
158
156
  bid: getBidIdParameter('bidId', bid),
159
157
  brid: getBidIdParameter('bidderRequestId', bid),
160
158
  name: getBidIdParameter('adUnitCode', bid),
161
- // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781
162
- aid: getBidIdParameter('auctionId', bid),
163
159
  tid: bid.ortb2Imp?.ext?.tid || '',
164
160
  brc: getBidIdParameter('bidRequestsCount', bid),
165
161
  bdrc: getBidIdParameter('bidderRequestCount', bid),
@@ -77,7 +77,8 @@ function cleanAuctionEnd(args) {
77
77
  }
78
78
 
79
79
  function cleanCreatives(args) {
80
- return filterAttributes(args, false);
80
+ let stringArgs = JSON.parse(dereferenceWithoutRenderer(args));
81
+ return filterAttributes(stringArgs, false);
81
82
  }
82
83
 
83
84
  function enhanceMediaType(arg) {
@@ -93,7 +94,7 @@ function enhanceMediaType(arg) {
93
94
 
94
95
  function addBidResponse(args) {
95
96
  let eventType = BID_RESPONSE;
96
- let argsCleaned = cleanCreatives(JSON.parse(JSON.stringify(args))); ;
97
+ let argsCleaned = cleanCreatives(args); ;
97
98
  if (allEvents[eventType] == undefined) { allEvents[eventType] = [] }
98
99
  allEvents[eventType].push(argsCleaned);
99
100
  }
@@ -110,7 +111,9 @@ function addTimeout(args) {
110
111
  if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
111
112
  saveEvents[eventType].push(args);
112
113
  let argsCleaned = [];
113
- let argsDereferenced = JSON.parse(JSON.stringify(args));
114
+ let argsDereferenced = {}
115
+ let stringArgs = JSON.parse(dereferenceWithoutRenderer(args));
116
+ argsDereferenced = stringArgs;
114
117
  argsDereferenced.forEach((attr) => {
115
118
  argsCleaned.push(filterAttributes(JSON.parse(JSON.stringify(attr)), false));
116
119
  });
@@ -118,17 +121,42 @@ function addTimeout(args) {
118
121
  auctionEnd[eventType].push(argsCleaned);
119
122
  }
120
123
 
124
+ export const dereferenceWithoutRenderer = function(args) {
125
+ if (args.renderer) {
126
+ let tmp = args.renderer;
127
+ delete args.renderer;
128
+ let stringified = JSON.stringify(args);
129
+ args['renderer'] = tmp;
130
+ return stringified;
131
+ }
132
+ if (args.bidsReceived) {
133
+ let tmp = {}
134
+ for (let key in args.bidsReceived) {
135
+ if (args.bidsReceived[key].renderer) {
136
+ tmp[key] = args.bidsReceived[key].renderer;
137
+ delete args.bidsReceived[key].renderer;
138
+ }
139
+ }
140
+ let stringified = JSON.stringify(args);
141
+ for (let key in tmp) {
142
+ args.bidsReceived[key].renderer = tmp[key];
143
+ }
144
+ return stringified;
145
+ }
146
+ return JSON.stringify(args);
147
+ }
148
+
121
149
  function addAuctionEnd(args) {
122
150
  let eventType = AUCTION_END;
123
151
  if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
124
152
  saveEvents[eventType].push(args);
125
- let argsCleaned = cleanAuctionEnd(JSON.parse(JSON.stringify(args)));
153
+ let argsCleaned = cleanAuctionEnd(JSON.parse(dereferenceWithoutRenderer(args)));
126
154
  if (auctionEnd[eventType] == undefined) { auctionEnd[eventType] = [] }
127
155
  auctionEnd[eventType].push(argsCleaned);
128
156
  }
129
157
 
130
158
  function handleBidWon(args) {
131
- args = enhanceMediaType(filterAttributes(JSON.parse(JSON.stringify(args)), true));
159
+ args = enhanceMediaType(filterAttributes(JSON.parse(dereferenceWithoutRenderer(args)), true));
132
160
  let increment = args['cpm'];
133
161
  if (typeof saveEvents['auctionEnd'] == 'object') {
134
162
  saveEvents['auctionEnd'].forEach((auction) => {