prebid.js 7.26.0 → 7.28.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 (334) hide show
  1. package/.github/workflows/issue_tracker.yml +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adWMGAnalyticsAdapter.js +1 -1
  5. package/dist/adagioAnalyticsAdapter.js +1 -1
  6. package/dist/adagioBidAdapter.js +1 -1
  7. package/dist/adbookpspBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.js +1 -1
  9. package/dist/adhashBidAdapter.js +1 -1
  10. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxAdServerVideo.js +1 -1
  12. package/dist/adlooxAnalyticsAdapter.js +1 -1
  13. package/dist/adlooxRtdProvider.js +1 -1
  14. package/dist/admaticBidAdapter.js +1 -1
  15. package/dist/admixerBidAdapter.js +1 -1
  16. package/dist/adomikAnalyticsAdapter.js +1 -1
  17. package/dist/adrelevantisBidAdapter.js +1 -1
  18. package/dist/adtrgtmeBidAdapter.js +1 -1
  19. package/dist/adxcgAnalyticsAdapter.js +1 -1
  20. package/dist/adxcgBidAdapter.js +1 -1
  21. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  22. package/dist/aidemBidAdapter.js +1 -0
  23. package/dist/ajaBidAdapter.js +1 -1
  24. package/dist/amxBidAdapter.js +1 -1
  25. package/dist/amxIdSystem.js +1 -1
  26. package/dist/analyticsAdapter.js +1 -1
  27. package/dist/appierAnalyticsAdapter.js +1 -1
  28. package/dist/appnexusBidAdapter.js +1 -1
  29. package/dist/asoBidAdapter.js +1 -1
  30. package/dist/atsAnalyticsAdapter.js +1 -1
  31. package/dist/axonixBidAdapter.js +1 -1
  32. package/dist/bidViewability.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bridgewellBidAdapter.js +1 -1
  37. package/dist/brightMountainMediaBidAdapter.js +1 -1
  38. package/dist/browsiRtdProvider.js +1 -1
  39. package/dist/bucksenseBidAdapter.js +1 -1
  40. package/dist/byDataAnalyticsAdapter.js +1 -1
  41. package/dist/carodaBidAdapter.js +1 -1
  42. package/dist/chtnwBidAdapter.js +1 -1
  43. package/dist/concertAnalyticsAdapter.js +1 -1
  44. package/dist/concertBidAdapter.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -1
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/datablocksAnalyticsAdapter.js +1 -1
  54. package/dist/dependencies.json +6 -0
  55. package/dist/dfpAdServerVideo.js +1 -1
  56. package/dist/discoveryBidAdapter.js +1 -1
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/eplanningAnalyticsAdapter.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/fintezaAnalyticsAdapter.js +1 -1
  62. package/dist/fluctBidAdapter.js +1 -1
  63. package/dist/ftrackIdSystem.js +1 -1
  64. package/dist/gdprEnforcement.js +1 -1
  65. package/dist/genericAnalyticsAdapter.js +1 -0
  66. package/dist/geoedgeRtdProvider.js +1 -1
  67. package/dist/glimpseBidAdapter.js +1 -1
  68. package/dist/glomexBidAdapter.js +1 -1
  69. package/dist/gmosspBidAdapter.js +1 -1
  70. package/dist/goldbachBidAdapter.js +1 -1
  71. package/dist/googleAnalyticsAdapter.js +1 -1
  72. package/dist/gravitoIdSystem.js +1 -1
  73. package/dist/gridBidAdapter.js +1 -1
  74. package/dist/gridNMBidAdapter.js +1 -1
  75. package/dist/growthCodeAnalyticsAdapter.js +1 -0
  76. package/dist/gumgumBidAdapter.js +1 -1
  77. package/dist/h12mediaBidAdapter.js +1 -1
  78. package/dist/hadronAnalyticsAdapter.js +1 -1
  79. package/dist/id5AnalyticsAdapter.js +1 -1
  80. package/dist/id5IdSystem.js +1 -1
  81. package/dist/impactifyBidAdapter.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/jwplayerRtdProvider.js +1 -1
  89. package/dist/kargoAnalyticsAdapter.js +1 -1
  90. package/dist/kargoBidAdapter.js +1 -1
  91. package/dist/kinessoIdSystem.js +1 -1
  92. package/dist/konduitAnalyticsAdapter.js +1 -1
  93. package/dist/kueezBidAdapter.js +1 -1
  94. package/dist/kueezRtbBidAdapter.js +1 -1
  95. package/dist/lassoBidAdapter.js +1 -1
  96. package/dist/lifestreetBidAdapter.js +1 -1
  97. package/dist/limelightDigitalBidAdapter.js +1 -1
  98. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  99. package/dist/liveIntentIdSystem.js +1 -1
  100. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  101. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  102. package/dist/logicadBidAdapter.js +1 -1
  103. package/dist/loglyliftBidAdapter.js +1 -1
  104. package/dist/lotamePanoramaIdSystem.js +1 -1
  105. package/dist/magniteAnalyticsAdapter.js +1 -1
  106. package/dist/malltvAnalyticsAdapter.js +1 -1
  107. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  108. package/dist/marsmediaBidAdapter.js +1 -1
  109. package/dist/mediafuseBidAdapter.js +1 -1
  110. package/dist/mediagoBidAdapter.js +1 -1
  111. package/dist/medianetAnalyticsAdapter.js +1 -1
  112. package/dist/mediasquareBidAdapter.js +1 -1
  113. package/dist/mgidBidAdapter.js +1 -1
  114. package/dist/minutemediaBidAdapter.js +1 -1
  115. package/dist/nexx360BidAdapter.js +1 -1
  116. package/dist/not-for-prod/prebid.js +206 -202
  117. package/dist/oguryBidAdapter.js +1 -1
  118. package/dist/onetagBidAdapter.js +1 -1
  119. package/dist/ooloAnalyticsAdapter.js +1 -1
  120. package/dist/openxAnalyticsAdapter.js +1 -1
  121. package/dist/optimonAnalyticsAdapter.js +1 -1
  122. package/dist/outbrainBidAdapter.js +1 -1
  123. package/dist/parrableIdSystem.js +1 -1
  124. package/dist/pbsExtensions.js +1 -1
  125. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  126. package/dist/pixfutureBidAdapter.js +1 -1
  127. package/dist/prebid-core.js +2 -2
  128. package/dist/prebidServerBidAdapter.js +1 -1
  129. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  130. package/dist/pubCommonId.js +1 -1
  131. package/dist/pubProvidedIdSystem.js +1 -1
  132. package/dist/publinkIdSystem.js +1 -1
  133. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  134. package/dist/pubmaticBidAdapter.js +1 -1
  135. package/dist/pubperfAnalyticsAdapter.js +1 -1
  136. package/dist/pubstackAnalyticsAdapter.js +1 -1
  137. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  138. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  139. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  140. package/dist/pxyzBidAdapter.js +1 -1
  141. package/dist/quantcastBidAdapter.js +1 -1
  142. package/dist/quantcastIdSystem.js +1 -1
  143. package/dist/rasBidAdapter.js +1 -1
  144. package/dist/readpeakBidAdapter.js +1 -1
  145. package/dist/realvuAnalyticsAdapter.js +1 -1
  146. package/dist/redtramBidAdapter.js +1 -0
  147. package/dist/relaidoBidAdapter.js +1 -1
  148. package/dist/relevantAnalyticsAdapter.js +1 -1
  149. package/dist/rhythmoneBidAdapter.js +1 -1
  150. package/dist/riseBidAdapter.js +1 -1
  151. package/dist/rivrAnalyticsAdapter.js +1 -1
  152. package/dist/roxotAnalyticsAdapter.js +1 -1
  153. package/dist/rtbhouseBidAdapter.js +1 -1
  154. package/dist/rtdModule.js +1 -1
  155. package/dist/rubiconAnalyticsAdapter.js +1 -1
  156. package/dist/rubiconBidAdapter.js +1 -1
  157. package/dist/s2sTesting.js +1 -1
  158. package/dist/scaleableAnalyticsAdapter.js +1 -1
  159. package/dist/schain.js +1 -1
  160. package/dist/seedingAllianceBidAdapter.js +1 -1
  161. package/dist/seedtagBidAdapter.js +1 -1
  162. package/dist/sharedIdSystem.js +1 -1
  163. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  164. package/dist/sharethroughBidAdapter.js +1 -1
  165. package/dist/shinezBidAdapter.js +1 -1
  166. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  167. package/dist/smaatoBidAdapter.js +1 -1
  168. package/dist/smartadserverBidAdapter.js +1 -1
  169. package/dist/smartxBidAdapter.js +1 -1
  170. package/dist/smilewantedBidAdapter.js +1 -1
  171. package/dist/sonobiAnalyticsAdapter.js +1 -1
  172. package/dist/sonobiBidAdapter.js +1 -1
  173. package/dist/sovrnAnalyticsAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/staqAnalyticsAdapter.js +1 -1
  177. package/dist/sublimeBidAdapter.js +1 -1
  178. package/dist/synacormediaBidAdapter.js +1 -1
  179. package/dist/taboolaBidAdapter.js +1 -1
  180. package/dist/tapadIdSystem.js +1 -1
  181. package/dist/targetVideoBidAdapter.js +1 -1
  182. package/dist/teadsBidAdapter.js +1 -1
  183. package/dist/teadsIdSystem.js +1 -1
  184. package/dist/terceptAnalyticsAdapter.js +1 -1
  185. package/dist/trionBidAdapter.js +1 -1
  186. package/dist/tripleliftBidAdapter.js +1 -1
  187. package/dist/ttdBidAdapter.js +1 -1
  188. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  189. package/dist/underdogmediaBidAdapter.js +1 -1
  190. package/dist/undertoneBidAdapter.js +1 -1
  191. package/dist/userId.js +1 -1
  192. package/dist/vidazooBidAdapter.js +1 -1
  193. package/dist/videobyteBidAdapter.js +1 -1
  194. package/dist/visxBidAdapter.js +1 -1
  195. package/dist/vuukleBidAdapter.js +1 -1
  196. package/dist/weboramaRtdProvider.js +1 -1
  197. package/dist/widespaceBidAdapter.js +1 -1
  198. package/dist/winrBidAdapter.js +1 -1
  199. package/dist/yahoosspBidAdapter.js +1 -1
  200. package/dist/yandexBidAdapter.js +1 -1
  201. package/dist/yieldlabBidAdapter.js +1 -1
  202. package/dist/yieldliftBidAdapter.js +1 -1
  203. package/dist/yieldmoBidAdapter.js +1 -1
  204. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  205. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  206. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/growthcode.html +134 -0
  208. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  209. package/libraries/ortb2.5StrictTranslator/dsl.js +54 -0
  210. package/libraries/ortb2.5StrictTranslator/spec.js +81 -0
  211. package/libraries/ortb2.5StrictTranslator/translator.js +37 -0
  212. package/libraries/ortb2.5Translator/translator.js +82 -0
  213. package/modules/33acrossIdSystem.js +3 -0
  214. package/modules/adhashBidAdapter.js +115 -30
  215. package/modules/adhashBidAdapter.md +1 -3
  216. package/modules/admaticBidAdapter.js +10 -1
  217. package/modules/admixerBidAdapter.js +1 -1
  218. package/modules/aidemBidAdapter.js +492 -0
  219. package/modules/aidemBidAdapter.md +187 -0
  220. package/modules/browsiRtdProvider.js +6 -4
  221. package/modules/bucksenseBidAdapter.js +1 -1
  222. package/modules/criteoBidAdapter.js +3 -3
  223. package/modules/discoveryBidAdapter.js +3 -0
  224. package/modules/eplanningBidAdapter.js +2 -6
  225. package/modules/fluctBidAdapter.js +5 -0
  226. package/modules/gdprEnforcement.js +26 -24
  227. package/modules/genericAnalyticsAdapter.js +157 -0
  228. package/modules/geoedgeRtdProvider.js +22 -0
  229. package/modules/glomexBidAdapter.js +2 -0
  230. package/modules/gravitoIdSystem.js +3 -4
  231. package/modules/gridBidAdapter.js +1 -1
  232. package/modules/gridNMBidAdapter.js +1 -1
  233. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  234. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  235. package/modules/impactifyBidAdapter.js +19 -1
  236. package/modules/jwplayerRtdProvider.js +1 -2
  237. package/modules/kargoBidAdapter.js +1 -1
  238. package/modules/lassoBidAdapter.js +8 -4
  239. package/modules/limelightDigitalBidAdapter.js +1 -1
  240. package/modules/liveIntentIdSystem.js +1 -2
  241. package/modules/mediagoBidAdapter.js +2 -1
  242. package/modules/minutemediaBidAdapter.md +3 -3
  243. package/modules/nexx360BidAdapter.js +264 -138
  244. package/modules/openxBidAdapter.md +15 -14
  245. package/modules/pubCommonId.js +2 -1
  246. package/modules/pubProvidedIdSystem.js +2 -0
  247. package/modules/rasBidAdapter.js +8 -3
  248. package/modules/rasBidAdapter.md +16 -15
  249. package/modules/redtramBidAdapter.js +155 -0
  250. package/modules/redtramBidAdapter.md +33 -0
  251. package/modules/riseBidAdapter.js +15 -0
  252. package/modules/riseBidAdapter.md +3 -3
  253. package/modules/rtbhouseBidAdapter.js +90 -29
  254. package/modules/rubiconBidAdapter.js +2 -1
  255. package/modules/seedtagBidAdapter.js +67 -56
  256. package/modules/seedtagBidAdapter.md +60 -0
  257. package/modules/sharedIdSystem.js +3 -1
  258. package/modules/smartxBidAdapter.js +1 -1
  259. package/modules/smnBidAdapter.md +52 -0
  260. package/modules/taboolaBidAdapter.js +20 -7
  261. package/modules/tripleliftBidAdapter.js +1 -1
  262. package/modules/ttdBidAdapter.js +4 -0
  263. package/modules/vidazooBidAdapter.js +31 -8
  264. package/modules/yandexBidAdapter.js +85 -19
  265. package/modules/yandexBidAdapter.md +7 -7
  266. package/modules/yieldlabBidAdapter.js +10 -4
  267. package/modules/yieldliftBidAdapter.js +3 -3
  268. package/package.json +2 -2
  269. package/src/auction.js +30 -4
  270. package/src/consentHandler.js +8 -0
  271. package/src/constants.json +2 -1
  272. package/src/events.js +4 -0
  273. package/src/native.js +31 -20
  274. package/src/refererDetection.js +6 -1
  275. package/src/storageManager.js +6 -3
  276. package/test/helpers/analytics.js +34 -0
  277. package/test/helpers/refererDetectionHelper.js +88 -0
  278. package/test/mocks/analyticsStub.js +3 -1
  279. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  280. package/test/spec/auctionmanager_spec.js +119 -1
  281. package/test/spec/modules/33acrossIdSystem_spec.js +4 -1
  282. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  283. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  284. package/test/spec/modules/adhashBidAdapter_spec.js +65 -11
  285. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  286. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  287. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  288. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  289. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  290. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  291. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  292. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  293. package/test/spec/modules/fpdModule_spec.js +1 -1
  294. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  295. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  296. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  297. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  298. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  299. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  300. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  301. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  302. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  303. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  304. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  305. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  306. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  307. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  308. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  309. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  310. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  311. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  312. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  313. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  314. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  315. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  316. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  317. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  318. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  319. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  320. package/test/spec/modules/taboolaBidAdapter_spec.js +39 -0
  321. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  322. package/test/spec/modules/ttdBidAdapter_spec.js +50 -9
  323. package/test/spec/modules/vidazooBidAdapter_spec.js +173 -27
  324. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  325. package/test/spec/modules/yieldlabBidAdapter_spec.js +49 -20
  326. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  327. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  328. package/test/spec/native_spec.js +68 -56
  329. package/test/spec/ortb2.5StrictTranslator/dsl_spec.js +137 -0
  330. package/test/spec/ortb2.5StrictTranslator/spec_spec.js +358 -0
  331. package/test/spec/ortb2.5StrictTranslator/translator_spec.js +16 -0
  332. package/test/spec/ortb2.5Translator/translator_spec.js +64 -0
  333. package/test/spec/refererDetection_spec.js +46 -95
  334. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -4,7 +4,7 @@ import { BANNER } from '../src/mediaTypes.js';
4
4
 
5
5
  const WHO = 'BKSHBID-005';
6
6
  const BIDDER_CODE = 'bucksense';
7
- const URL = 'https://prebid.bksn.se/prebidjs/';
7
+ const URL = 'https://directo.prebidserving.com/prebidjs/';
8
8
 
9
9
  export const spec = {
10
10
  code: BIDDER_CODE,
@@ -672,18 +672,18 @@ function enrichSlotWithFloors(slot, bidRequest) {
672
672
  if (bidRequest.mediaTypes?.banner) {
673
673
  slotFloors.banner = {};
674
674
  const bannerSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'))
675
- bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = getFloor({ size: bannerSize, mediaType: BANNER }));
675
+ bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = getFloor.call(bidRequest, { size: bannerSize, mediaType: BANNER }));
676
676
  }
677
677
 
678
678
  if (bidRequest.mediaTypes?.video) {
679
679
  slotFloors.video = {};
680
680
  const videoSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'))
681
- videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = getFloor({ size: videoSize, mediaType: VIDEO }));
681
+ videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = getFloor.call(bidRequest, { size: videoSize, mediaType: VIDEO }));
682
682
  }
683
683
 
684
684
  if (bidRequest.mediaTypes?.native) {
685
685
  slotFloors.native = {};
686
- slotFloors.native['*'] = getFloor({ size: '*', mediaType: NATIVE });
686
+ slotFloors.native['*'] = getFloor.call(bidRequest, { size: '*', mediaType: NATIVE });
687
687
  }
688
688
 
689
689
  if (Object.keys(slotFloors).length > 0) {
@@ -277,6 +277,8 @@ function getItems(validBidRequests, bidderRequest) {
277
277
  function getParam(validBidRequests, bidderRequest) {
278
278
  const pubcid = utils.deepAccess(validBidRequests[0], 'crumbs.pubcid');
279
279
  let isMobile = getDevice() ? 1 : 0;
280
+ // input test status by Publisher. more frequently for test true req
281
+ let isTest = validBidRequests[0].params.test || 0;
280
282
  let auctionId = getKv(bidderRequest, 'auctionId');
281
283
  let items = getItems(validBidRequests, bidderRequest);
282
284
 
@@ -290,6 +292,7 @@ function getParam(validBidRequests, bidderRequest) {
290
292
  if (items && items.length) {
291
293
  let c = {
292
294
  id: 'pp_hbjs_' + auctionId,
295
+ test: +isTest,
293
296
  at: 1,
294
297
  bcat: globals['bcat'],
295
298
  badv: globals['adv'],
@@ -128,9 +128,9 @@ export const spec = {
128
128
  advertiserDomains: ad.adom
129
129
  };
130
130
  }
131
- if (isVastResponse(ad)) {
131
+ if (request && request.data && request.data.vv) {
132
132
  bidResponse.vastXml = ad.adm;
133
- bidResponse.mediaTypes = VIDEO;
133
+ bidResponse.mediaType = VIDEO;
134
134
  } else {
135
135
  bidResponse.ad = ad.adm;
136
136
  }
@@ -504,8 +504,4 @@ function registerAuction(storageID) {
504
504
  return true;
505
505
  }
506
506
 
507
- function isVastResponse(bid) {
508
- return bid.adm.match(/^(<VAST)|(<VideoAdServingTemplate)/gmi);
509
- }
510
-
511
507
  registerBidder(spec);
@@ -62,6 +62,11 @@ export const spec = {
62
62
  });
63
63
 
64
64
  data.params = request.params;
65
+
66
+ if (request.schain) {
67
+ data.schain = request.schain;
68
+ }
69
+
65
70
  const searchParams = new URLSearchParams({
66
71
  dfpUnitCode: request.params.dfpUnitCode,
67
72
  tagId: request.params.tagId,
@@ -2,7 +2,7 @@
2
2
  * This module gives publishers extra set of features to enforce individual purposes of TCF v2
3
3
  */
4
4
 
5
- import {deepAccess, hasDeviceAccess, isArray, logWarn} from '../src/utils.js';
5
+ import {deepAccess, hasDeviceAccess, isArray, logError, logWarn} from '../src/utils.js';
6
6
  import {config} from '../src/config.js';
7
7
  import adapterManager, {gdprDataHandler} from '../src/adapterManager.js';
8
8
  import {find, includes} from '../src/polyfill.js';
@@ -11,13 +11,7 @@ import {getHook} from '../src/hook.js';
11
11
  import {validateStorageEnforcement} from '../src/storageManager.js';
12
12
  import * as events from '../src/events.js';
13
13
  import CONSTANTS from '../src/constants.json';
14
-
15
- // modules for which vendor consent is not needed (see https://github.com/prebid/Prebid.js/issues/8161)
16
- const VENDORLESS_MODULES = new Set([
17
- 'sharedId',
18
- 'pubCommonId',
19
- 'pubProvidedId',
20
- ]);
14
+ import {VENDORLESS_GVLID} from '../src/consentHandler.js';
21
15
 
22
16
  export const STRICT_STORAGE_ENFORCEMENT = 'strictStorageEnforcement';
23
17
 
@@ -71,7 +65,7 @@ export const internal = {
71
65
  * @param {{string|Object}} - module
72
66
  * @return {number} - GVL ID
73
67
  */
74
- export function getGvlid(module) {
68
+ export function getGvlid(module, ...args) {
75
69
  let gvlid = null;
76
70
  if (module) {
77
71
  // Check user defined GVL Mapping in pbjs.setConfig()
@@ -86,7 +80,7 @@ export function getGvlid(module) {
86
80
  return gvlid;
87
81
  }
88
82
 
89
- gvlid = internal.getGvlidForBidAdapter(moduleCode) || internal.getGvlidForUserIdModule(module) || internal.getGvlidForAnalyticsAdapter(moduleCode);
83
+ gvlid = internal.getGvlidForBidAdapter(moduleCode) || internal.getGvlidForUserIdModule(module) || internal.getGvlidForAnalyticsAdapter(moduleCode, ...args);
90
84
  }
91
85
  return gvlid;
92
86
  }
@@ -120,10 +114,19 @@ function getGvlidForUserIdModule(userIdModule) {
120
114
  /**
121
115
  * Returns GVL ID for an analytics adapter. If an analytics adapter does not have an associated GVL ID, it returns 'null'.
122
116
  * @param {string} code - 'provider' property on the analytics adapter config
117
+ * @param {{}} config - analytics configuration object
123
118
  * @return {number} GVL ID
124
119
  */
125
- function getGvlidForAnalyticsAdapter(code) {
126
- return adapterManager.getAnalyticsAdapter(code) && (adapterManager.getAnalyticsAdapter(code).gvlid || null);
120
+ function getGvlidForAnalyticsAdapter(code, config) {
121
+ const adapter = adapterManager.getAnalyticsAdapter(code);
122
+ return adapter?.gvlid || ((gvlid) => {
123
+ if (typeof gvlid !== 'function') return gvlid;
124
+ try {
125
+ return gvlid.call(adapter.adapter, config);
126
+ } catch (e) {
127
+ logError(`Error invoking ${code} adapter.gvlid()`, e)
128
+ }
129
+ })(adapter?.adapter?.gvlid)
127
130
  }
128
131
 
129
132
  export function shouldEnforce(consentData, purpose, name) {
@@ -145,20 +148,20 @@ export function shouldEnforce(consentData, purpose, name) {
145
148
  * @param {Object} consentData - gdpr consent data
146
149
  * @param {string=} currentModule - Bidder code of the current module
147
150
  * @param {number=} gvlId - GVL ID for the module
148
- * @param vendorlessModule a predicate function that takes a module name, and returns true if the module does not need vendor consent
149
151
  * @returns {boolean}
150
152
  */
151
- export function validateRules(rule, consentData, currentModule, gvlId, vendorlessModule = VENDORLESS_MODULES.has.bind(VENDORLESS_MODULES)) {
153
+ export function validateRules(rule, consentData, currentModule, gvlId) {
152
154
  const purposeId = TCF2[Object.keys(TCF2).filter(purposeName => TCF2[purposeName].name === rule.purpose)[0]].id;
153
155
 
154
156
  // return 'true' if vendor present in 'vendorExceptions'
155
- if (includes(rule.vendorExceptions || [], currentModule)) {
157
+ if ((rule.vendorExceptions || []).includes(currentModule)) {
156
158
  return true;
157
159
  }
160
+ const vendorConsentRequred = !((gvlId === VENDORLESS_GVLID || (rule.softVendorExceptions || []).includes(currentModule)))
158
161
 
159
162
  // get data from the consent string
160
163
  const purposeConsent = deepAccess(consentData, `vendorData.purpose.consents.${purposeId}`);
161
- const vendorConsent = deepAccess(consentData, `vendorData.vendor.consents.${gvlId}`);
164
+ const vendorConsent = vendorConsentRequred ? deepAccess(consentData, `vendorData.vendor.consents.${gvlId}`) : true;
162
165
  const liTransparency = deepAccess(consentData, `vendorData.purpose.legitimateInterests.${purposeId}`);
163
166
 
164
167
  /*
@@ -166,7 +169,7 @@ export function validateRules(rule, consentData, currentModule, gvlId, vendorles
166
169
  or the user has consented. Similar with vendors.
167
170
  */
168
171
  const purposeAllowed = rule.enforcePurpose === false || purposeConsent === true;
169
- const vendorAllowed = vendorlessModule(currentModule) || rule.enforceVendor === false || vendorConsent === true;
172
+ const vendorAllowed = rule.enforceVendor === false || vendorConsent === true;
170
173
 
171
174
  /*
172
175
  Few if any vendors should be declaring Legitimate Interest for Device Access (Purpose 1), but some are claiming
@@ -183,19 +186,18 @@ export function validateRules(rule, consentData, currentModule, gvlId, vendorles
183
186
  /**
184
187
  * This hook checks whether module has permission to access device or not. Device access include cookie and local storage
185
188
  * @param {Function} fn reference to original function (used by hook logic)
186
- * @param isVendorless if true, do not require vendor consent (for e.g. core modules)
187
189
  * @param {Number=} gvlid gvlid of the module
188
190
  * @param {string=} moduleName name of the module
189
191
  * @param result
190
192
  */
191
- export function deviceAccessHook(fn, isVendorless, gvlid, moduleName, result, {validate = validateRules} = {}) {
193
+ export function deviceAccessHook(fn, gvlid, moduleName, result, {validate = validateRules} = {}) {
192
194
  result = Object.assign({}, {
193
195
  hasEnforcementHook: true
194
196
  });
195
197
  if (!hasDeviceAccess()) {
196
198
  logWarn('Device access is disabled by Publisher');
197
199
  result.valid = false;
198
- } else if (isVendorless && !strictStorageEnforcement) {
200
+ } else if (gvlid === VENDORLESS_GVLID && !strictStorageEnforcement) {
199
201
  // for vendorless (core) storage, do not enforce rules unless strictStorageEnforcement is set
200
202
  result.valid = true;
201
203
  } else {
@@ -203,13 +205,13 @@ export function deviceAccessHook(fn, isVendorless, gvlid, moduleName, result, {v
203
205
  if (shouldEnforce(consentData, 1, moduleName)) {
204
206
  const curBidder = config.getCurrentBidder();
205
207
  // Bidders have a copy of storage object with bidder code binded. Aliases will also pass the same bidder code when invoking storage functions and hence if alias tries to access device we will try to grab the gvl id for alias instead of original bidder
206
- if (curBidder && (curBidder != moduleName) && adapterManager.aliasRegistry[curBidder] === moduleName) {
208
+ if (curBidder && (curBidder !== moduleName) && adapterManager.aliasRegistry[curBidder] === moduleName) {
207
209
  gvlid = getGvlid(curBidder);
208
210
  } else {
209
211
  gvlid = getGvlid(moduleName) || gvlid;
210
212
  }
211
213
  const curModule = moduleName || curBidder;
212
- let isAllowed = validate(purpose1Rule, consentData, curModule, gvlid, isVendorless ? () => true : undefined);
214
+ let isAllowed = validate(purpose1Rule, consentData, curModule, gvlid,);
213
215
  if (isAllowed) {
214
216
  result.valid = true;
215
217
  } else {
@@ -221,7 +223,7 @@ export function deviceAccessHook(fn, isVendorless, gvlid, moduleName, result, {v
221
223
  result.valid = true;
222
224
  }
223
225
  }
224
- fn.call(this, isVendorless, gvlid, moduleName, result);
226
+ fn.call(this, gvlid, moduleName, result);
225
227
  }
226
228
 
227
229
  /**
@@ -314,7 +316,7 @@ export function enableAnalyticsHook(fn, config) {
314
316
  }
315
317
  config = config.filter(conf => {
316
318
  const analyticsAdapterCode = conf.provider;
317
- const gvlid = getGvlid(analyticsAdapterCode);
319
+ const gvlid = getGvlid(analyticsAdapterCode, conf);
318
320
  const isAllowed = !!validateRules(purpose7Rule, consentData, analyticsAdapterCode, gvlid);
319
321
  if (!isAllowed) {
320
322
  analyticsBlocked.push(analyticsAdapterCode);
@@ -0,0 +1,157 @@
1
+ import AnalyticsAdapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
2
+ import {prefixLog, isPlainObject} from '../src/utils.js';
3
+ import * as CONSTANTS from '../src/constants.json';
4
+ import adapterManager from '../src/adapterManager.js';
5
+ import {ajaxBuilder} from '../src/ajax.js';
6
+
7
+ const DEFAULTS = {
8
+ batchSize: 1,
9
+ batchDelay: 100,
10
+ method: 'POST'
11
+ }
12
+
13
+ const TYPES = {
14
+ handler: 'function',
15
+ batchSize: 'number',
16
+ batchDelay: 'number',
17
+ gvlid: 'number',
18
+ }
19
+
20
+ const MAX_CALL_DEPTH = 20;
21
+
22
+ export function GenericAnalytics() {
23
+ const parent = AnalyticsAdapter({analyticsType: 'endpoint'});
24
+ const {logError, logWarn} = prefixLog('Generic analytics:');
25
+ let batch = [];
26
+ let callDepth = 0;
27
+ let options, handler, timer, translate;
28
+
29
+ function optionsAreValid(options) {
30
+ if (!options.url && !options.handler) {
31
+ logError('options must specify either `url` or `handler`')
32
+ return false;
33
+ }
34
+ if (options.hasOwnProperty('method') && !['GET', 'POST'].includes(options.method)) {
35
+ logError('options.method must be GET or POST');
36
+ return false;
37
+ }
38
+ for (const [field, type] of Object.entries(TYPES)) {
39
+ // eslint-disable-next-line valid-typeof
40
+ if (options.hasOwnProperty(field) && typeof options[field] !== type) {
41
+ logError(`options.${field} must be a ${type}`);
42
+ return false;
43
+ }
44
+ }
45
+ if (options.hasOwnProperty('events')) {
46
+ if (!isPlainObject(options.events)) {
47
+ logError('options.events must be an object');
48
+ return false;
49
+ }
50
+ for (const [event, handler] of Object.entries(options.events)) {
51
+ if (!CONSTANTS.EVENTS.hasOwnProperty(event)) {
52
+ logWarn(`options.events.${event} does not match any known Prebid event`);
53
+ if (typeof handler !== 'function') {
54
+ logError(`options.events.${event} must be a function`);
55
+ return false;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+
63
+ function processBatch() {
64
+ const currentBatch = batch;
65
+ batch = [];
66
+ callDepth++;
67
+ try {
68
+ // the pub-provided handler may inadvertently cause an infinite chain of events;
69
+ // even just logging an exception from it may cause an AUCTION_DEBUG event, that
70
+ // gets back to the handler, that throws another exception etc.
71
+ // to avoid the issue, put a cap on recursion
72
+ if (callDepth === MAX_CALL_DEPTH) {
73
+ logError('detected probable infinite recursion, discarding events', currentBatch);
74
+ }
75
+ if (callDepth >= MAX_CALL_DEPTH) {
76
+ return;
77
+ }
78
+ try {
79
+ handler(currentBatch);
80
+ } catch (e) {
81
+ logError('error executing options.handler', e);
82
+ }
83
+ } finally {
84
+ callDepth--;
85
+ }
86
+ }
87
+
88
+ function translator(eventHandlers) {
89
+ if (!eventHandlers) {
90
+ return (data) => data;
91
+ }
92
+ return function ({eventType, args}) {
93
+ if (eventHandlers.hasOwnProperty(eventType)) {
94
+ try {
95
+ return eventHandlers[eventType](args);
96
+ } catch (e) {
97
+ logError(`error executing options.events.${eventType}`, e);
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ return Object.assign(
104
+ Object.create(parent),
105
+ {
106
+ gvlid(config) {
107
+ return config?.options?.gvlid
108
+ },
109
+ enableAnalytics(config) {
110
+ if (optionsAreValid(config?.options || {})) {
111
+ options = Object.assign({}, DEFAULTS, config.options);
112
+ handler = options.handler || defaultHandler(options);
113
+ translate = translator(options.events);
114
+ parent.enableAnalytics.call(this, config);
115
+ }
116
+ },
117
+ track(event) {
118
+ if (event.eventType === CONSTANTS.EVENTS.AUCTION_INIT && event.args.hasOwnProperty('config')) {
119
+ // clean up auctionInit event
120
+ // TODO: remove this special case in v8
121
+ delete event.args.config;
122
+ }
123
+ const datum = translate(event);
124
+ if (datum != null) {
125
+ batch.push(datum);
126
+ if (timer != null) {
127
+ clearTimeout(timer);
128
+ timer = null;
129
+ }
130
+ if (batch.length >= options.batchSize) {
131
+ processBatch();
132
+ } else {
133
+ timer = setTimeout(processBatch, options.batchDelay);
134
+ }
135
+ }
136
+ }
137
+ }
138
+ )
139
+ }
140
+
141
+ export function defaultHandler({url, method, batchSize, ajax = ajaxBuilder()}) {
142
+ const callbacks = {
143
+ success() {},
144
+ error() {}
145
+ }
146
+ const extract = batchSize > 1 ? (events) => events : (events) => events[0];
147
+ const serialize = method === 'GET' ? (data) => ({data: JSON.stringify(data)}) : (data) => JSON.stringify(data);
148
+
149
+ return function (events) {
150
+ ajax(url, callbacks, serialize(extract(events)), {method})
151
+ }
152
+ }
153
+
154
+ adapterManager.registerAnalyticsAdapter({
155
+ adapter: GenericAnalytics(),
156
+ code: 'generic',
157
+ });
@@ -18,6 +18,8 @@
18
18
  import { submodule } from '../src/hook.js';
19
19
  import { ajax } from '../src/ajax.js';
20
20
  import { generateUUID, insertElement, isEmpty, logError } from '../src/utils.js';
21
+ import * as events from '../src/events.js';
22
+ import CONSTANTS from '../src/constants.json';
21
23
 
22
24
  /** @type {string} */
23
25
  const SUBMODULE_NAME = 'geoedge';
@@ -105,6 +107,7 @@ function getMacros(bid, key) {
105
107
  '%%PATTERN:hb_bidder%%': bid.bidderCode,
106
108
  '%_isHb!': true,
107
109
  '%_hbcid!': bid.creativeId || '',
110
+ '%_hbadomains': bid.meta && bid.meta.advertiserDomains,
108
111
  '%%PATTERN:hb_pb%%': bid.pbHg,
109
112
  '%%SITE%%': location.hostname,
110
113
  '%_pimp%': PV_ID
@@ -184,6 +187,24 @@ function conditionallyWrap(bidResponse, config, userConsent) {
184
187
  }
185
188
  }
186
189
 
190
+ /**
191
+ * Fire billable events for applicable bids
192
+ */
193
+ function fireBillableEventsForApplicableBids(params) {
194
+ events.on(CONSTANTS.EVENTS.BID_WON, function (winningBid) {
195
+ if (shouldWrap(winningBid, params)) {
196
+ events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, {
197
+ vendor: SUBMODULE_NAME,
198
+ billingId: generateUUID(),
199
+ type: 'impression',
200
+ transactionId: winningBid.transactionId,
201
+ auctionId: winningBid.auctionId,
202
+ bidId: winningBid.requestId
203
+ });
204
+ }
205
+ });
206
+ }
207
+
187
208
  function init(config, userConsent) {
188
209
  let params = config.params;
189
210
  if (!params || !params.key) {
@@ -191,6 +212,7 @@ function init(config, userConsent) {
191
212
  return false;
192
213
  }
193
214
  preloadClient(params.key);
215
+ fireBillableEventsForApplicableBids(params);
194
216
  return true;
195
217
  }
196
218
 
@@ -4,9 +4,11 @@ import {BANNER} from '../src/mediaTypes.js';
4
4
 
5
5
  const ENDPOINT = 'https://prebid.mes.glomex.cloud/request-bid'
6
6
  const BIDDER_CODE = 'glomex'
7
+ const GVLID = 967
7
8
 
8
9
  export const spec = {
9
10
  code: BIDDER_CODE,
11
+ gvlid: GVLID,
10
12
  supportedMediaTypes: [BANNER],
11
13
 
12
14
  isBidRequestValid: function (bid) {
@@ -39,19 +39,18 @@ export const gravitoIdSystemSubmodule = {
39
39
  * decode the stored id value for passing to bid requests
40
40
  * @function
41
41
  * @param { {gravitompId: string} } value
42
- * @returns { {gravitompId: {id: string} } | undefined }
42
+ * @returns { {gravitompId: {string} } | undefined }
43
43
  */
44
44
  decode: function(value) {
45
45
  if (value && typeof value === 'object') {
46
- const result = {};
46
+ var result = {};
47
47
  if (value.gravitompId) {
48
- result.id = value.gravitompId
48
+ result = value.gravitompId
49
49
  }
50
50
  return {gravitompId: result};
51
51
  }
52
52
  return undefined;
53
53
  },
54
-
55
54
  }
56
55
 
57
56
  submodule('userId', gravitoIdSystemSubmodule);
@@ -652,7 +652,7 @@ function getUserIdFromFPDStorage() {
652
652
  function segmentProcessing(segment, forceSegName) {
653
653
  return segment
654
654
  .map((seg) => {
655
- const value = seg && (seg.value || seg.id || seg);
655
+ const value = seg && (seg.id || seg);
656
656
  if (typeof value === 'string' || typeof value === 'number') {
657
657
  return {
658
658
  value: value.toString(),
@@ -432,7 +432,7 @@ export function getSyncUrl() {
432
432
  function segmentProcessing(segment, forceSegName) {
433
433
  return segment
434
434
  .map((seg) => {
435
- const value = seg && (seg.value || seg.id || seg);
435
+ const value = seg && (seg.id || seg);
436
436
  if (typeof value === 'string' || typeof value === 'number') {
437
437
  return {
438
438
  value: value.toString(),
@@ -0,0 +1,176 @@
1
+ /**
2
+ * growthCodeAnalyticsAdapter.js - GrowthCode Analytics Adapter
3
+ */
4
+ import { ajax } from '../src/ajax.js';
5
+ import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
6
+ import adapterManager from '../src/adapterManager.js';
7
+ import * as utils from '../src/utils.js';
8
+ import CONSTANTS from '../src/constants.json';
9
+ import { getStorageManager } from '../src/storageManager.js';
10
+ import {getRefererInfo} from '../src/refererDetection.js';
11
+ import {logError, logInfo} from '../src/utils.js';
12
+
13
+ const MODULE_NAME = 'growthCodeAnalytics';
14
+ const DEFAULT_PID = 'INVALID_PID'
15
+ const ENDPOINT_URL = 'https://p2.gcprivacy.com/v1/pb/analytics'
16
+
17
+ export const storage = getStorageManager();
18
+
19
+ let sessionId = utils.generateUUID();
20
+
21
+ let trackEvents = [];
22
+ let pid = DEFAULT_PID;
23
+ let url = ENDPOINT_URL;
24
+
25
+ let eventQueue = [];
26
+
27
+ let startAuction = 0;
28
+ let bidRequestTimeout = 0;
29
+ let analyticsType = 'endpoint';
30
+
31
+ let growthCodeAnalyticsAdapter = Object.assign(adapter({url: url, analyticsType}), {
32
+ track({eventType, eventData}) {
33
+ eventData = eventData ? JSON.parse(JSON.stringify(eventData)) : {};
34
+ let data = {};
35
+ if (!trackEvents.includes(eventType)) return;
36
+ switch (eventType) {
37
+ case CONSTANTS.EVENTS.AUCTION_INIT: {
38
+ data = eventData;
39
+ startAuction = data.timestamp;
40
+ bidRequestTimeout = data.timeout;
41
+ break;
42
+ }
43
+
44
+ case CONSTANTS.EVENTS.AUCTION_END: {
45
+ data = eventData;
46
+ data.start = startAuction;
47
+ data.end = Date.now();
48
+ break;
49
+ }
50
+
51
+ case CONSTANTS.EVENTS.BID_ADJUSTMENT: {
52
+ data.bidders = eventData;
53
+ break;
54
+ }
55
+
56
+ case CONSTANTS.EVENTS.BID_TIMEOUT: {
57
+ data.bidders = eventData;
58
+ data.duration = bidRequestTimeout;
59
+ break;
60
+ }
61
+
62
+ case CONSTANTS.EVENTS.BID_REQUESTED: {
63
+ data = eventData;
64
+ break;
65
+ }
66
+
67
+ case CONSTANTS.EVENTS.BID_RESPONSE: {
68
+ data = eventData;
69
+ delete data.ad;
70
+ break;
71
+ }
72
+
73
+ case CONSTANTS.EVENTS.BID_WON: {
74
+ data = eventData;
75
+ delete data.ad;
76
+ delete data.adUrl;
77
+ break;
78
+ }
79
+
80
+ case CONSTANTS.EVENTS.BIDDER_DONE: {
81
+ data = eventData;
82
+ break;
83
+ }
84
+
85
+ case CONSTANTS.EVENTS.SET_TARGETING: {
86
+ data.targetings = eventData;
87
+ break;
88
+ }
89
+
90
+ case CONSTANTS.EVENTS.REQUEST_BIDS: {
91
+ data = eventData;
92
+ break;
93
+ }
94
+
95
+ case CONSTANTS.EVENTS.ADD_AD_UNITS: {
96
+ data = eventData;
97
+ break;
98
+ }
99
+
100
+ default:
101
+ return;
102
+ }
103
+
104
+ data.eventType = eventType;
105
+ data.timestamp = data.timestamp || Date.now();
106
+
107
+ sendEvent(data);
108
+ }
109
+ });
110
+
111
+ growthCodeAnalyticsAdapter.originEnableAnalytics = growthCodeAnalyticsAdapter.enableAnalytics;
112
+
113
+ growthCodeAnalyticsAdapter.enableAnalytics = function(conf = {}) {
114
+ if (typeof conf.options === 'object') {
115
+ if (conf.options.pid) {
116
+ pid = conf.options.pid;
117
+ url = conf.options.url ? conf.options.url : ENDPOINT_URL;
118
+ } else {
119
+ logError(MODULE_NAME + ' Not a valid PartnerID')
120
+ return
121
+ }
122
+ if (conf.options.trackEvents) {
123
+ trackEvents = conf.options.trackEvents;
124
+ }
125
+ } else {
126
+ logError(MODULE_NAME + ' Invalid configuration');
127
+ return;
128
+ }
129
+
130
+ growthCodeAnalyticsAdapter.originEnableAnalytics(conf);
131
+ };
132
+
133
+ function logToServer() {
134
+ if (pid === DEFAULT_PID) return;
135
+ if (eventQueue.length > 1) {
136
+ let data = {
137
+ session: sessionId,
138
+ pid: pid,
139
+ timestamp: Date.now(),
140
+ timezoneoffset: new Date().getTimezoneOffset(),
141
+ url: getRefererInfo().page,
142
+ referer: document.referrer,
143
+ events: eventQueue
144
+ };
145
+
146
+ ajax(url, {
147
+ success: response => {
148
+ logInfo(MODULE_NAME + ' Send Data to Server')
149
+ },
150
+ error: error => {
151
+ logInfo(MODULE_NAME + ' Problem Send Data to Server: ' + error)
152
+ }
153
+ }, JSON.stringify(data), {method: 'POST', withCredentials: true})
154
+
155
+ eventQueue = [
156
+ ];
157
+ }
158
+ }
159
+
160
+ function sendEvent(event) {
161
+ eventQueue.push(event);
162
+ logInfo(MODULE_NAME + 'Analytics Event: ' + event);
163
+
164
+ if (event.eventType === CONSTANTS.EVENTS.AUCTION_END) {
165
+ logToServer();
166
+ }
167
+ }
168
+
169
+ adapterManager.registerAnalyticsAdapter({
170
+ adapter: growthCodeAnalyticsAdapter,
171
+ code: 'growthCodeAnalytics'
172
+ });
173
+
174
+ growthCodeAnalyticsAdapter.logToServer = logToServer;
175
+
176
+ export default growthCodeAnalyticsAdapter;