prebid.js 9.4.1 → 9.6.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 (397) hide show
  1. package/.eslintrc.js +31 -5
  2. package/.github/workflows/jscpd.yml +2 -2
  3. package/.github/workflows/linter.yml +107 -0
  4. package/creative/crossDomain.js +6 -3
  5. package/dist/33acrossAnalyticsAdapter.js +1 -1
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/33acrossIdSystem.js +1 -1
  8. package/dist/BTBidAdapter.js +1 -1
  9. package/dist/adagioAnalyticsAdapter.js +1 -1
  10. package/dist/adagioBidAdapter.js +1 -1
  11. package/dist/adagioRtdProvider.js +1 -1
  12. package/dist/adagioUtils.js +1 -1
  13. package/dist/addefendBidAdapter.js +1 -1
  14. package/dist/adgenerationBidAdapter.js +1 -1
  15. package/dist/adkernelAdnBidAdapter.js +1 -1
  16. package/dist/adkernelBidAdapter.js +1 -1
  17. package/dist/adkernelUtils.js +1 -0
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/admixerBidAdapter.js +1 -1
  20. package/dist/adqueryBidAdapter.js +1 -1
  21. package/dist/adrelevantisBidAdapter.js +1 -1
  22. package/dist/adstirBidAdapter.js +1 -1
  23. package/dist/adtrgtmeBidAdapter.js +1 -1
  24. package/dist/advRedAnalyticsAdapter.js +1 -0
  25. package/dist/adxcgAnalyticsAdapter.js +1 -1
  26. package/dist/adxcgBidAdapter.js +1 -1
  27. package/dist/adyoulikeBidAdapter.js +1 -1
  28. package/dist/agmaAnalyticsAdapter.js +1 -1
  29. package/dist/aidemBidAdapter.js +1 -1
  30. package/dist/ajaBidAdapter.js +1 -1
  31. package/dist/akamaiDapRtdProvider.js +1 -1
  32. package/dist/amxBidAdapter.js +1 -1
  33. package/dist/amxIdSystem.js +1 -1
  34. package/dist/anonymisedRtdProvider.js +1 -1
  35. package/dist/apacdexBidAdapter.js +1 -1
  36. package/dist/appierAnalyticsAdapter.js +1 -1
  37. package/dist/appnexusBidAdapter.js +1 -1
  38. package/dist/asoBidAdapter.js +1 -1
  39. package/dist/axonixBidAdapter.js +1 -1
  40. package/dist/azerionedgeRtdProvider.js +1 -1
  41. package/dist/bidglassBidAdapter.js +1 -1
  42. package/dist/big-richmediaBidAdapter.js +1 -1
  43. package/dist/bridBidAdapter.js +1 -1
  44. package/dist/bridgewellBidAdapter.js +1 -1
  45. package/dist/brightMountainMediaBidAdapter.js +1 -1
  46. package/dist/carodaBidAdapter.js +1 -1
  47. package/dist/chtnwBidAdapter.js +1 -1
  48. package/dist/chunk-core.js +1 -1
  49. package/dist/concertBidAdapter.js +1 -1
  50. package/dist/connatixBidAdapter.js +1 -1
  51. package/dist/connectIdSystem.js +1 -1
  52. package/dist/connectadBidAdapter.js +1 -1
  53. package/dist/consumableBidAdapter.js +1 -1
  54. package/dist/contxtfulRtdProvider.js +1 -1
  55. package/dist/conversantAnalyticsAdapter.js +1 -1
  56. package/dist/conversantBidAdapter.js +1 -1
  57. package/dist/craftBidAdapter.js +1 -1
  58. package/dist/criteoBidAdapter.js +1 -1
  59. package/dist/currencyUtils.js +1 -1
  60. package/dist/cwireBidAdapter.js +1 -1
  61. package/dist/dailymotionBidAdapter.js +1 -1
  62. package/dist/debugging-standalone.js +1 -1
  63. package/dist/dependencies.json +69 -8
  64. package/dist/dfpAdServerVideo.js +1 -1
  65. package/dist/dfpAdpod.js +1 -1
  66. package/dist/dfpUtils.js +1 -1
  67. package/dist/discoveryBidAdapter.js +1 -1
  68. package/dist/dspxBidAdapter.js +1 -1
  69. package/dist/dxkultureBidAdapter.js +1 -1
  70. package/dist/eightPodAnalyticsAdapter.js +1 -1
  71. package/dist/eightPodBidAdapter.js +1 -1
  72. package/dist/eplanningBidAdapter.js +1 -1
  73. package/dist/euidIdSystem.js +1 -1
  74. package/dist/exadsBidAdapter.js +1 -1
  75. package/dist/feedadBidAdapter.js +1 -1
  76. package/dist/finativeBidAdapter.js +1 -1
  77. package/dist/fintezaAnalyticsAdapter.js +1 -1
  78. package/dist/fpdUtils.js +1 -0
  79. package/dist/freewheel-sspBidAdapter.js +1 -1
  80. package/dist/gmosspBidAdapter.js +1 -1
  81. package/dist/goldbachBidAdapter.js +1 -1
  82. package/dist/gptPreAuction.js +1 -1
  83. package/dist/gptUtils.js +1 -1
  84. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  85. package/dist/greenbidsRtdProvider.js +1 -1
  86. package/dist/gridBidAdapter.js +1 -1
  87. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  88. package/dist/growthCodeRtdProvider.js +1 -1
  89. package/dist/gumgumBidAdapter.js +1 -1
  90. package/dist/h12mediaBidAdapter.js +1 -1
  91. package/dist/hypelabBidAdapter.js +1 -1
  92. package/dist/id5AnalyticsAdapter.js +1 -1
  93. package/dist/id5IdSystem.js +1 -1
  94. package/dist/imdsBidAdapter.js +1 -1
  95. package/dist/improvedigitalBidAdapter.js +1 -1
  96. package/dist/insticatorBidAdapter.js +1 -1
  97. package/dist/intentIqAnalyticsAdapter.js +1 -0
  98. package/dist/ixBidAdapter.js +1 -1
  99. package/dist/jixieBidAdapter.js +1 -1
  100. package/dist/justpremiumBidAdapter.js +1 -1
  101. package/dist/jwplayerBidAdapter.js +1 -1
  102. package/dist/jwplayerRtdProvider.js +1 -1
  103. package/dist/kargoBidAdapter.js +1 -1
  104. package/dist/kimberliteBidAdapter.js +1 -1
  105. package/dist/konduitAnalyticsAdapter.js +1 -1
  106. package/dist/kueezBidAdapter.js +1 -1
  107. package/dist/lassoBidAdapter.js +1 -1
  108. package/dist/lifestreetBidAdapter.js +1 -1
  109. package/dist/liveIntentIdSystem.js +1 -1
  110. package/dist/logicadBidAdapter.js +1 -1
  111. package/dist/loglyliftBidAdapter.js +1 -1
  112. package/dist/luceadBidAdapter.js +1 -1
  113. package/dist/mabidderBidAdapter.js +1 -1
  114. package/dist/magniteAnalyticsAdapter.js +1 -1
  115. package/dist/malltvAnalyticsAdapter.js +1 -1
  116. package/dist/marsmediaBidAdapter.js +1 -1
  117. package/dist/mediafuseBidAdapter.js +1 -1
  118. package/dist/mediagoBidAdapter.js +1 -1
  119. package/dist/medianetAnalyticsAdapter.js +1 -1
  120. package/dist/medianetBidAdapter.js +1 -1
  121. package/dist/mediasquareBidAdapter.js +1 -1
  122. package/dist/mgidBidAdapter.js +1 -1
  123. package/dist/minutemediaBidAdapter.js +1 -1
  124. package/dist/missenaBidAdapter.js +1 -1
  125. package/dist/mobianRtdProvider.js +1 -1
  126. package/dist/nextMillenniumBidAdapter.js +1 -1
  127. package/dist/nexx360BidAdapter.js +1 -1
  128. package/dist/nobidAnalyticsAdapter.js +1 -1
  129. package/dist/nobidBidAdapter.js +1 -1
  130. package/dist/not-for-prod/prebid.js +208 -199
  131. package/dist/oguryBidAdapter.js +1 -1
  132. package/dist/onetagBidAdapter.js +1 -1
  133. package/dist/ooloAnalyticsAdapter.js +1 -1
  134. package/dist/openwebBidAdapter.js +1 -1
  135. package/dist/openxBidAdapter.js +1 -1
  136. package/dist/optidigitalBidAdapter.js +1 -1
  137. package/dist/optoutBidAdapter.js +1 -1
  138. package/dist/orbidderBidAdapter.js +1 -1
  139. package/dist/outbrainBidAdapter.js +1 -1
  140. package/dist/paapi.js +1 -1
  141. package/dist/permutiveRtdProvider.js +1 -1
  142. package/dist/pixfutureBidAdapter.js +1 -1
  143. package/dist/playdigoBidAdapter.js +1 -1
  144. package/dist/prebidServerBidAdapter.js +1 -1
  145. package/dist/programmaticaBidAdapter.js +1 -1
  146. package/dist/publinkIdSystem.js +1 -1
  147. package/dist/publirBidAdapter.js +1 -1
  148. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  149. package/dist/pubmaticBidAdapter.js +1 -1
  150. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  151. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  152. package/dist/pxyzBidAdapter.js +1 -1
  153. package/dist/quantcastBidAdapter.js +1 -1
  154. package/dist/readpeakBidAdapter.js +1 -1
  155. package/dist/relaidoBidAdapter.js +1 -1
  156. package/dist/relevatehealthBidAdapter.js +1 -1
  157. package/dist/retailspotBidAdapter.js +1 -1
  158. package/dist/rhythmoneBidAdapter.js +1 -1
  159. package/dist/ringieraxelspringerBidAdapter.js +1 -1
  160. package/dist/riseBidAdapter.js +1 -1
  161. package/dist/riseUtils.js +1 -0
  162. package/dist/rubiconBidAdapter.js +1 -1
  163. package/dist/schainSerializer.js +1 -0
  164. package/dist/seedingAllianceBidAdapter.js +1 -1
  165. package/dist/seedtagBidAdapter.js +1 -1
  166. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  167. package/dist/sharethroughBidAdapter.js +1 -1
  168. package/dist/shinezBidAdapter.js +1 -1
  169. package/dist/sizeMapping.js +1 -1
  170. package/dist/sizeUtils.js +1 -1
  171. package/dist/smaatoBidAdapter.js +1 -1
  172. package/dist/smartadserverBidAdapter.js +1 -1
  173. package/dist/smarthubBidAdapter.js +1 -1
  174. package/dist/smartxBidAdapter.js +1 -1
  175. package/dist/smilewantedBidAdapter.js +1 -1
  176. package/dist/snigelBidAdapter.js +1 -1
  177. package/dist/sonobiBidAdapter.js +1 -1
  178. package/dist/sovrnBidAdapter.js +1 -1
  179. package/dist/sspBCBidAdapter.js +1 -1
  180. package/dist/stnBidAdapter.js +1 -1
  181. package/dist/stvBidAdapter.js +1 -1
  182. package/dist/sublimeBidAdapter.js +1 -1
  183. package/dist/symitriDapRtdProvider.js +1 -0
  184. package/dist/taboolaBidAdapter.js +1 -1
  185. package/dist/tappxBidAdapter.js +1 -1
  186. package/dist/targetVideoBidAdapter.js +1 -1
  187. package/dist/targetVideoUtils.js +1 -0
  188. package/dist/teadsBidAdapter.js +1 -1
  189. package/dist/telariaBidAdapter.js +1 -1
  190. package/dist/teqblazeUtils.js +1 -1
  191. package/dist/terceptAnalyticsAdapter.js +1 -1
  192. package/dist/themoneytizerBidAdapter.js +1 -1
  193. package/dist/trionBidAdapter.js +1 -1
  194. package/dist/tripleliftBidAdapter.js +1 -1
  195. package/dist/ttdBidAdapter.js +1 -1
  196. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  197. package/dist/uid2IdSystem.js +1 -1
  198. package/dist/uid2IdSystem_shared.js +1 -1
  199. package/dist/underdogmediaBidAdapter.js +1 -1
  200. package/dist/undertoneBidAdapter.js +1 -1
  201. package/dist/unrulyBidAdapter.js +1 -1
  202. package/dist/userAgentUtils.js +1 -0
  203. package/dist/utiqIdSystem.js +1 -1
  204. package/dist/vidazooUtils.js +1 -1
  205. package/dist/videobyteBidAdapter.js +1 -1
  206. package/dist/visxBidAdapter.js +1 -1
  207. package/dist/vuukleBidAdapter.js +1 -1
  208. package/dist/widespaceBidAdapter.js +1 -1
  209. package/dist/winrBidAdapter.js +1 -1
  210. package/dist/yahooAdsBidAdapter.js +1 -1
  211. package/dist/yandexIdSystem.js +1 -1
  212. package/dist/yieldmoBidAdapter.js +1 -1
  213. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  214. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  215. package/libraries/adkernelUtils/adkernelUtils.js +11 -0
  216. package/libraries/currencyUtils/floor.js +23 -0
  217. package/libraries/dfpUtils/dfpUtils.js +7 -0
  218. package/libraries/fpdUtils/deviceInfo.js +58 -0
  219. package/libraries/fpdUtils/pageInfo.js +73 -0
  220. package/libraries/gptUtils/gptUtils.js +23 -1
  221. package/libraries/riseUtils/index.js +330 -0
  222. package/libraries/schainSerializer/schainSerializer.js +24 -0
  223. package/libraries/sizeUtils/tranformSize.js +43 -0
  224. package/libraries/targetVideoUtils/bidderUtils.js +178 -0
  225. package/libraries/targetVideoUtils/constants.js +23 -0
  226. package/libraries/teqblazeUtils/bidderUtils.js +15 -11
  227. package/libraries/userAgentUtils/index.js +58 -0
  228. package/libraries/userAgentUtils/userAgentTypes.enums.js +22 -0
  229. package/modules/.submodules.json +1 -0
  230. package/modules/33acrossAnalyticsAdapter.js +2 -0
  231. package/modules/adagioAnalyticsAdapter.js +101 -84
  232. package/modules/adagioAnalyticsAdapter.md +4 -0
  233. package/modules/adagioBidAdapter.js +5 -17
  234. package/modules/adagioRtdProvider.js +18 -4
  235. package/modules/adkernelAdnBidAdapter.js +1 -12
  236. package/modules/adkernelBidAdapter.js +4 -13
  237. package/modules/adlooxAnalyticsAdapter.js +1 -0
  238. package/modules/admixerBidAdapter.js +10 -6
  239. package/modules/admixerBidAdapter.md +7 -10
  240. package/modules/adtrgtmeBidAdapter.js +1 -1
  241. package/modules/advRedAnalyticsAdapter.js +198 -0
  242. package/modules/advRedAnalyticsAdapter.md +30 -0
  243. package/modules/aidemBidAdapter.js +2 -0
  244. package/modules/akamaiDapRtdProvider.js +19 -798
  245. package/modules/anonymisedRtdProvider.js +5 -1
  246. package/modules/anonymisedRtdProvider.md +1 -1
  247. package/modules/apacdexBidAdapter.js +1 -1
  248. package/modules/appnexusBidAdapter.js +56 -2
  249. package/modules/automatadAnalyticsAdapter.js +2 -0
  250. package/modules/azerionedgeRtdProvider.js +13 -3
  251. package/modules/azerionedgeRtdProvider.md +0 -17
  252. package/modules/bridBidAdapter.js +47 -47
  253. package/modules/cleanioRtdProvider.js +1 -0
  254. package/modules/concertBidAdapter.js +1 -1
  255. package/modules/connatixBidAdapter.js +36 -8
  256. package/modules/connectIdSystem.js +6 -2
  257. package/modules/contxtfulRtdProvider.js +20 -2
  258. package/modules/contxtfulRtdProvider.md +1 -0
  259. package/modules/craftBidAdapter.js +1 -1
  260. package/modules/criteoBidAdapter.js +1 -1
  261. package/modules/cwireBidAdapter.js +5 -1
  262. package/modules/dailymotionBidAdapter.js +85 -65
  263. package/modules/debugging/debugging.js +3 -0
  264. package/modules/dfpAdServerVideo.js +15 -33
  265. package/modules/dfpAdpod.js +2 -6
  266. package/modules/dgkeywordRtdProvider.js +2 -0
  267. package/modules/discoveryBidAdapter.js +26 -210
  268. package/modules/dspxBidAdapter.js +176 -54
  269. package/modules/eightPodAnalyticsAdapter.js +28 -34
  270. package/modules/eightPodBidAdapter.js +113 -57
  271. package/modules/fintezaAnalyticsAdapter.js +9 -4
  272. package/modules/goldbachBidAdapter.js +1 -1
  273. package/modules/gptPreAuction.js +63 -4
  274. package/modules/growthCodeAnalyticsAdapter.js +1 -1
  275. package/modules/growthCodeRtdProvider.js +1 -1
  276. package/modules/gumgumBidAdapter.js +14 -10
  277. package/modules/improvedigitalBidAdapter.js +1 -1
  278. package/modules/insticatorBidAdapter.js +35 -31
  279. package/modules/intentIqAnalyticsAdapter.js +234 -0
  280. package/modules/intentIqAnalyticsAdapter.md +27 -0
  281. package/modules/intentIqIdSystem.md +0 -0
  282. package/modules/jwplayerBidAdapter.js +1 -1
  283. package/modules/jwplayerRtdProvider.js +26 -6
  284. package/modules/jwplayerVideoProvider.js +6 -0
  285. package/modules/kargoBidAdapter.js +11 -14
  286. package/modules/kimberliteBidAdapter.js +24 -7
  287. package/modules/kimberliteBidAdapter.md +30 -1
  288. package/modules/mediafuseBidAdapter.js +1 -1
  289. package/modules/mediagoBidAdapter.js +7 -176
  290. package/modules/medianetBidAdapter.js +101 -40
  291. package/modules/mgidBidAdapter.js +3 -1
  292. package/modules/minutemediaBidAdapter.js +21 -398
  293. package/modules/mobianRtdProvider.js +16 -2
  294. package/modules/nextMillenniumBidAdapter.js +1 -27
  295. package/modules/nexx360BidAdapter.js +3 -2
  296. package/modules/nobidBidAdapter.js +1 -1
  297. package/modules/openwebBidAdapter.js +18 -396
  298. package/modules/optoutBidAdapter.js +1 -1
  299. package/modules/paapi.js +48 -35
  300. package/modules/permutiveRtdProvider.js +72 -22
  301. package/modules/playdigoBidAdapter.js +4 -2
  302. package/modules/prebidServerBidAdapter/index.js +4 -2
  303. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
  304. package/modules/programmaticaBidAdapter.js +1 -1
  305. package/modules/publirBidAdapter.js +20 -273
  306. package/modules/pubmaticBidAdapter.js +12 -0
  307. package/modules/pubxaiAnalyticsAdapter.js +306 -164
  308. package/modules/relevatehealthBidAdapter.js +2 -1
  309. package/modules/resetdigitalBidAdapter.md +54 -45
  310. package/modules/richaudienceBidAdapter.js +1 -1
  311. package/modules/riseBidAdapter.js +19 -400
  312. package/modules/rtdModule/index.js +5 -3
  313. package/modules/shinezBidAdapter.js +17 -361
  314. package/modules/sirdataRtdProvider.js +2 -0
  315. package/modules/sizeMapping.js +2 -5
  316. package/modules/smaatoBidAdapter.js +18 -1
  317. package/modules/smarthubBidAdapter.js +45 -177
  318. package/modules/smilewantedBidAdapter.js +26 -22
  319. package/modules/snigelBidAdapter.js +1 -1
  320. package/modules/sonobiBidAdapter.js +5 -10
  321. package/modules/stnBidAdapter.js +22 -398
  322. package/modules/symitriDapRtdProvider.js +812 -0
  323. package/modules/symitriDapRtdProvider.md +49 -0
  324. package/modules/targetVideoBidAdapter.js +120 -152
  325. package/modules/targetVideoBidAdapter.md +20 -3
  326. package/modules/telariaBidAdapter.js +2 -32
  327. package/modules/uid2IdSystem_shared.js +51 -39
  328. package/modules/userId/eids.js +3 -0
  329. package/modules/utiqIdSystem.js +12 -10
  330. package/modules/validationFpdModule/index.js +22 -17
  331. package/modules/videojsVideoProvider.js +3 -0
  332. package/modules/visxBidAdapter.js +1 -1
  333. package/modules/winrBidAdapter.js +2 -27
  334. package/modules/yahooAdsBidAdapter.js +1 -1
  335. package/modules/yandexIdSystem.js +1 -1
  336. package/package.json +4 -4
  337. package/plugins/eslint/index.js +73 -45
  338. package/src/adloader.js +1 -0
  339. package/src/ajax.js +15 -0
  340. package/src/config.js +0 -4
  341. package/src/debugging.js +1 -0
  342. package/src/prebid.js +4 -0
  343. package/src/secureCreatives.js +1 -1
  344. package/src/storageManager.js +62 -73
  345. package/src/targeting.js +26 -20
  346. package/src/utils.js +9 -0
  347. package/test/pages/consent_mgt_gdpr.html +1 -1
  348. package/test/spec/ajax_spec.js +11 -0
  349. package/test/spec/creative/crossDomainCreative_spec.js +26 -9
  350. package/test/spec/fpd/gdpr_spec.js +1 -1
  351. package/test/spec/libraries/userAgentUtils_spec.js +109 -0
  352. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
  353. package/test/spec/modules/adagioBidAdapter_spec.js +32 -66
  354. package/test/spec/modules/adagioRtdProvider_spec.js +72 -0
  355. package/test/spec/modules/admixerBidAdapter_spec.js +21 -17
  356. package/test/spec/modules/advRedAnalyticsAdapter_spec.js +114 -0
  357. package/test/spec/modules/adxcgBidAdapter_spec.js +1 -1
  358. package/test/spec/modules/appnexusBidAdapter_spec.js +36 -0
  359. package/test/spec/modules/azerionedgeRtdProvider_spec.js +36 -21
  360. package/test/spec/modules/connatixBidAdapter_spec.js +55 -2
  361. package/test/spec/modules/connectIdSystem_spec.js +27 -28
  362. package/test/spec/modules/consentManagement_spec.js +1 -1
  363. package/test/spec/modules/contxtfulRtdProvider_spec.js +6 -0
  364. package/test/spec/modules/dailymotionBidAdapter_spec.js +497 -4
  365. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -6
  366. package/test/spec/modules/dspxBidAdapter_spec.js +188 -7
  367. package/test/spec/modules/eightPodAnalyticsAdapter_spec.js +22 -13
  368. package/test/spec/modules/gptPreAuction_spec.js +143 -1
  369. package/test/spec/modules/gumgumBidAdapter_spec.js +17 -0
  370. package/test/spec/modules/insticatorBidAdapter_spec.js +8 -1
  371. package/test/spec/modules/intentIqAnalyticsAdapter_spec.js +172 -0
  372. package/test/spec/modules/jwplayerRtdProvider_spec.js +61 -0
  373. package/test/spec/modules/kargoBidAdapter_spec.js +7 -8
  374. package/test/spec/modules/kimberliteBidAdapter_spec.js +137 -65
  375. package/test/spec/modules/mediagoBidAdapter_spec.js +34 -37
  376. package/test/spec/modules/medianetBidAdapter_spec.js +297 -16
  377. package/test/spec/modules/mgidBidAdapter_spec.js +15 -5
  378. package/test/spec/modules/mobianRtdProvider_spec.js +1 -3
  379. package/test/spec/modules/nexx360BidAdapter_spec.js +1 -1
  380. package/test/spec/modules/paapi_spec.js +177 -111
  381. package/test/spec/modules/permutiveRtdProvider_spec.js +42 -8
  382. package/test/spec/modules/prebidServerBidAdapter_spec.js +17 -3
  383. package/test/spec/modules/proxistoreBidAdapter_spec.js +1 -1
  384. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  385. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +970 -603
  386. package/test/spec/modules/pulsepointBidAdapter_spec.js +4 -4
  387. package/test/spec/modules/smaatoBidAdapter_spec.js +36 -1
  388. package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
  389. package/test/spec/modules/smilewantedBidAdapter_spec.js +57 -1
  390. package/test/spec/modules/symitriDapRtdProvider_spec.js +600 -0
  391. package/test/spec/modules/targetVideoBidAdapter_spec.js +112 -11
  392. package/test/spec/modules/yandexIdSystem_spec.js +6 -1
  393. package/test/spec/schainSerializer/schainSerializer_spec.js +138 -0
  394. package/test/spec/unit/core/storageManager_spec.js +68 -51
  395. package/test/spec/unit/pbjs_api_spec.js +11 -0
  396. package/test/spec/utils_spec.js +19 -0
  397. /package/src/utils/{gpdr.js → gdpr.js} +0 -0
@@ -0,0 +1,58 @@
1
+ import { deviceTypes, browserTypes, osTypes } from './userAgentTypes.enums.js';
2
+
3
+ /**
4
+ * Get the approximate device type enum from the user agent
5
+ * @returns {number}
6
+ */
7
+ export const getDeviceType = () => {
8
+ if (
9
+ /ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(
10
+ navigator.userAgent.toLowerCase()
11
+ )
12
+ ) return deviceTypes.TABLET;
13
+ if (
14
+ /iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(
15
+ navigator.userAgent.toLowerCase()
16
+ )
17
+ ) return deviceTypes.MOBILE;
18
+ return deviceTypes.DESKTOP;
19
+ };
20
+
21
+ /**
22
+ * Get the approximate browser type enum from the user agent (or vendor
23
+ * if available)
24
+ * @returns {number}
25
+ */
26
+ export const getBrowser = () => {
27
+ if (/Edg/.test(navigator.userAgent)) return browserTypes.EDGE;
28
+ else if (
29
+ /Chrome/.test(navigator.userAgent) &&
30
+ /Google Inc/.test(navigator.vendor)
31
+ ) return browserTypes.CHROME;
32
+ else if (navigator.userAgent.match('CriOS')) return browserTypes.CHROME;
33
+ else if (/Firefox/.test(navigator.userAgent)) return browserTypes.FIREFOX;
34
+ else if (
35
+ /Safari/.test(navigator.userAgent) &&
36
+ /Apple Computer/.test(navigator.vendor)
37
+ ) return browserTypes.SAFARI;
38
+ else if (
39
+ /Trident/.test(navigator.userAgent) ||
40
+ /MSIE/.test(navigator.userAgent)
41
+ ) return browserTypes.INTERNET_EXPLORER;
42
+ else return browserTypes.OTHER;
43
+ };
44
+
45
+ /**
46
+ * Get the approximate OS enum from the user agent (or app version,
47
+ * if available)
48
+ * @returns {number}
49
+ */
50
+ export const getOS = () => {
51
+ if (navigator.userAgent.indexOf('Android') != -1) return osTypes.ANDROID;
52
+ if (navigator.userAgent.indexOf('like Mac') != -1) return osTypes.IOS;
53
+ if (navigator.userAgent.indexOf('Win') != -1) return osTypes.WINDOWS;
54
+ if (navigator.userAgent.indexOf('Mac') != -1) return osTypes.MAC;
55
+ if (navigator.userAgent.indexOf('Linux') != -1) return osTypes.LINUX;
56
+ if (navigator.appVersion.indexOf('X11') != -1) return osTypes.UNIX;
57
+ return osTypes.OTHER;
58
+ };
@@ -0,0 +1,22 @@
1
+ export const deviceTypes = Object.freeze({
2
+ DESKTOP: 0,
3
+ MOBILE: 1,
4
+ TABLET: 2,
5
+ })
6
+ export const browserTypes = Object.freeze({
7
+ CHROME: 0,
8
+ FIREFOX: 1,
9
+ SAFARI: 2,
10
+ EDGE: 3,
11
+ INTERNET_EXPLORER: 4,
12
+ OTHER: 5
13
+ })
14
+ export const osTypes = Object.freeze({
15
+ WINDOWS: 0,
16
+ MAC: 1,
17
+ LINUX: 2,
18
+ UNIX: 3,
19
+ IOS: 4,
20
+ ANDROID: 5,
21
+ OTHER: 6
22
+ })
@@ -97,6 +97,7 @@
97
97
  "reconciliationRtdProvider",
98
98
  "relevadRtdProvider",
99
99
  "sirdataRtdProvider",
100
+ "symitriDapRtdProvider",
100
101
  "timeoutRtdProvider",
101
102
  "weboramaRtdProvider"
102
103
  ],
@@ -629,6 +629,8 @@ function setCachedBidStatus(auctionId, bidId, status) {
629
629
  * @param {string} endpoint URL
630
630
  */
631
631
  function sendReport(report, endpoint) {
632
+ // TODO FIX THIS RULES VIOLATION
633
+ // eslint-disable-next-line
632
634
  if (navigator.sendBeacon(endpoint, JSON.stringify(report))) {
633
635
  log.info(`Analytics report sent to ${endpoint}`, report);
634
636
 
@@ -2,12 +2,13 @@
2
2
  * Analytics Adapter for Adagio
3
3
  */
4
4
 
5
+ import { _ADAGIO, getBestWindowForAdagio } from '../libraries/adagioUtils/adagioUtils.js';
6
+ import { deepAccess, logError, logInfo, logWarn } from '../src/utils.js';
7
+ import { BANNER } from '../src/mediaTypes.js';
8
+ import { EVENTS } from '../src/constants.js';
5
9
  import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
6
10
  import adapterManager from '../src/adapterManager.js';
7
- import { EVENTS } from '../src/constants.js';
8
11
  import { ajax } from '../src/ajax.js';
9
- import { BANNER } from '../src/mediaTypes.js';
10
- import { getWindowTop, getWindowSelf, deepAccess, logInfo, logError } from '../src/utils.js';
11
12
  import { getGlobal } from '../src/prebidGlobal.js';
12
13
 
13
14
  const emptyUrl = '';
@@ -19,6 +20,13 @@ const PREBID_VERSION = '$prebid.version$';
19
20
  const ENDPOINT = 'https://c.4dex.io/pba.gif';
20
21
  const CURRENCY_USD = 'USD';
21
22
  const ADAGIO_CODE = 'adagio';
23
+
24
+ export const _internal = {
25
+ getAdagioNs: function() {
26
+ return _ADAGIO;
27
+ }
28
+ };
29
+
22
30
  const cache = {
23
31
  auctions: {},
24
32
  getAuction: function(auctionId, adUnitCode) {
@@ -48,34 +56,6 @@ const cache = {
48
56
  };
49
57
  const enc = window.encodeURIComponent;
50
58
 
51
- /**
52
- /* BEGIN ADAGIO.JS CODE
53
- */
54
-
55
- function canAccessTopWindow() {
56
- try {
57
- if (getWindowTop().location.href) {
58
- return true;
59
- }
60
- } catch (error) {
61
- return false;
62
- }
63
- };
64
-
65
- function getCurrentWindow() {
66
- return currentWindow;
67
- };
68
-
69
- let currentWindow;
70
-
71
- const adagioEnqueue = function adagioEnqueue(action, data) {
72
- getCurrentWindow().ADAGIO.queue.push({ action, data, ts: Date.now() });
73
- };
74
-
75
- /**
76
- * END ADAGIO.JS CODE
77
- */
78
-
79
59
  /**
80
60
  * UTILS FUNCTIONS
81
61
  */
@@ -150,6 +130,10 @@ function getCurrencyData(bid) {
150
130
  * @param {Object} qp
151
131
  */
152
132
  function sendRequest(qp) {
133
+ if (!qp.org_id || !qp.site) {
134
+ logInfo('request is missing org_id or site, skipping beacon.');
135
+ return;
136
+ }
153
137
  // Removing null values
154
138
  qp = Object.keys(qp).reduce((acc, key) => {
155
139
  if (qp[key] !== null) {
@@ -194,37 +178,28 @@ function getTargetedAuctionId(bid) {
194
178
  */
195
179
 
196
180
  function handlerAuctionInit(event) {
197
- const w = getCurrentWindow();
181
+ const w = getBestWindowForAdagio();
198
182
 
199
183
  const prebidAuctionId = event.auctionId;
200
184
  const adUnitCodes = removeDuplicates(event.adUnitCodes, adUnitCode => adUnitCode);
201
185
 
202
186
  // Check if Adagio is on the bid requests.
203
- // If not, we don't need to track the auction.
204
187
  const adagioBidRequest = event.bidderRequests.find(bidRequest => isAdagio(bidRequest.bidderCode));
205
- if (!adagioBidRequest) {
206
- logInfo(`Adagio is not on the bid requests for auction '${prebidAuctionId}'`)
207
- return;
208
- }
188
+
189
+ const rtdUid = deepAccess(adagioBidRequest, 'ortb2.site.ext.data.adg_rtd.uid');
190
+ cache.addPrebidAuctionIdRef(prebidAuctionId, rtdUid);
209
191
 
210
192
  cache.auctions[prebidAuctionId] = {};
211
193
 
212
194
  adUnitCodes.forEach(adUnitCode => {
195
+ // event.adUnits are splitted by mediatypes
213
196
  const adUnits = event.adUnits.filter(adUnit => adUnit.code === adUnitCode);
214
197
 
215
- // Get all bidders configures for the ad unit.
216
- const bidders = removeDuplicates(
217
- adUnits.map(adUnit => adUnit.bids.map(bid => ({bidder: bid.bidder, params: bid.params}))).flat(),
218
- bidder => bidder.bidder
219
- );
220
-
221
- // Check if Adagio is configured for the ad unit.
222
- // If not, we don't need to track the ad unit.
223
- const adagioBidder = bidders.find(bidder => isAdagio(bidder.bidder));
224
- if (!adagioBidder) {
225
- logInfo(`Adagio is not configured for ad unit '${adUnitCode}'`);
226
- return;
227
- }
198
+ // Get all bidders configured for the ad unit.
199
+ // AdUnits with the same code can have a different bidder list, aggregate all of them.
200
+ const biddersAggregate = adUnits.reduce((bidders, adUnit) => bidders.concat(adUnit.bids.map(bid => bid.bidder)), [])
201
+ // remove duplicates
202
+ const bidders = [...new Set(biddersAggregate)];
228
203
 
229
204
  // Get all media types and banner sizes configured for the ad unit.
230
205
  const mediaTypes = adUnits.map(adUnit => adUnit.mediaTypes);
@@ -239,45 +214,56 @@ function handlerAuctionInit(event) {
239
214
  bannerSize => bannerSize
240
215
  ).sort();
241
216
 
242
- // Get all Adagio bids for the ad unit from the bidRequest.
243
- // If no bids, we don't need to track the ad unit.
244
- const adagioAdUnitBids = adagioBidRequest.bids.filter(bid => bid.adUnitCode === adUnitCode);
245
- if (deepAccess(adagioAdUnitBids, 'length', 0) <= 0) {
246
- logInfo(`Adagio is not on the bid requests for ad unit '${adUnitCode}' and auction '${prebidAuctionId}'`)
247
- return;
217
+ const sortedBidderCodes = bidders.sort()
218
+
219
+ const bidSrcMapper = (bidder) => {
220
+ const request = event.bidderRequests.find(br => br.bidderCode === bidder)
221
+ return request ? request.bids[0].src : null
248
222
  }
249
- // Get Adagio params from the first bid.
250
- // We assume that all Adagio bids for a same adunit have the same params.
251
- const params = adagioAdUnitBids[0].params;
223
+ const biddersSrc = sortedBidderCodes.map(bidSrcMapper).join(',');
252
224
 
253
- const adagioAuctionId = params.adagioAuctionId;
254
- cache.addPrebidAuctionIdRef(prebidAuctionId, adagioAuctionId);
225
+ // if adagio was involved in the auction we identified it with rtdUid, if not use the prebid auctionId
226
+ const auctionId = rtdUid || prebidAuctionId;
255
227
 
256
- // Get all media types requested for Adagio.
257
- const adagioMediaTypes = removeDuplicates(
258
- adagioAdUnitBids.map(bid => Object.keys(bid.mediaTypes)).flat(),
259
- mediaTypeKey => mediaTypeKey
260
- ).flat().map(mediaType => getMediaTypeAlias(mediaType)).sort();
228
+ const adgRtdSession = deepAccess(event.bidderRequests[0], 'ortb2.site.ext.data.adg_rtd.session', {});
261
229
 
262
230
  const qp = {
231
+ org_id: adagioAdapter.options.organizationId,
232
+ site: adagioAdapter.options.site,
263
233
  v: 0,
264
234
  pbjsv: PREBID_VERSION,
265
- org_id: params.organizationId,
266
- site: params.site,
267
- pv_id: params.pageviewId,
268
- auct_id: adagioAuctionId,
235
+ pv_id: _internal.getAdagioNs().pageviewId,
236
+ auct_id: auctionId,
269
237
  adu_code: adUnitCode,
270
238
  url_dmn: w.location.hostname,
271
- pgtyp: params.pagetype,
272
- plcmt: params.placement,
273
- t_n: params.testName || null,
274
- t_v: params.testVersion || null,
275
239
  mts: mediaTypesKeys.join(','),
276
240
  ban_szs: bannerSizes.join(','),
277
- bdrs: bidders.map(bidder => bidder.bidder).sort().join(','),
278
- adg_mts: adagioMediaTypes.join(',')
241
+ bdrs: sortedBidderCodes.join(','),
242
+ pgtyp: deepAccess(event.bidderRequests[0], 'ortb2.site.ext.data.pagetype', null),
243
+ plcmt: deepAccess(adUnits[0], 'ortb2Imp.ext.data.placement', null),
244
+ t_n: adgRtdSession.testName || null,
245
+ t_v: adgRtdSession.testVersion || null,
246
+ s_id: adgRtdSession.id || null,
247
+ s_new: adgRtdSession.new || null,
248
+ bdrs_src: biddersSrc,
279
249
  };
280
250
 
251
+ if (adagioBidRequest && adagioBidRequest.bids) {
252
+ const adagioAdUnitBids = adagioBidRequest.bids.filter(bid => bid.adUnitCode === adUnitCode);
253
+ if (adagioAdUnitBids.length > 0) {
254
+ // Get all media types requested for Adagio.
255
+ const adagioMediaTypes = removeDuplicates(
256
+ adagioAdUnitBids.map(bid => Object.keys(bid.mediaTypes)).flat(),
257
+ mediaTypeKey => mediaTypeKey
258
+ ).flat().map(mediaType => getMediaTypeAlias(mediaType)).sort();
259
+
260
+ qp.adg_mts = adagioMediaTypes.join(',');
261
+ // for backward compatibility: if we didn't find organizationId & site but we have a bid from adagio we might still find it in params
262
+ qp.org_id = qp.org_id || adagioAdUnitBids[0].params.organizationId;
263
+ qp.site = qp.site || adagioAdUnitBids[0].params.site;
264
+ }
265
+ }
266
+
281
267
  cache.auctions[prebidAuctionId][adUnitCode] = qp;
282
268
  sendNewBeacon(prebidAuctionId, adUnitCode);
283
269
  });
@@ -324,13 +310,21 @@ function handlerAuctionEnd(event) {
324
310
  return bid ? getCurrencyData(bid).netCpm : null
325
311
  }
326
312
 
313
+ const perfNavigation = performance.getEntriesByType('navigation')[0];
314
+
327
315
  cache.updateAuction(auctionId, adUnitCode, {
328
316
  bdrs_bid: cache.getBiddersFromAuction(auctionId, adUnitCode).map(bidResponseMapper).join(','),
329
- bdrs_cpm: cache.getBiddersFromAuction(auctionId, adUnitCode).map(bidCpmMapper).join(',')
317
+ bdrs_cpm: cache.getBiddersFromAuction(auctionId, adUnitCode).map(bidCpmMapper).join(','),
318
+ // check timings at the end of the auction to leave time to the browser to update it
319
+ dom_i: Math.round(perfNavigation['domInteractive']) || null,
320
+ dom_c: Math.round(perfNavigation['domComplete']) || null,
321
+ loa_e: Math.round(perfNavigation['loadEventEnd']) || null,
330
322
  });
323
+
331
324
  sendNewBeacon(auctionId, adUnitCode);
332
325
  });
333
326
  }
327
+
334
328
  function handlerBidWon(event) {
335
329
  let auctionId = getTargetedAuctionId(event);
336
330
 
@@ -345,6 +339,8 @@ function handlerBidWon(event) {
345
339
  ? cache.getAdagioAuctionId(event.auctionId)
346
340
  : null);
347
341
 
342
+ const perfNavigation = performance.getEntriesByType('navigation')[0];
343
+
348
344
  cache.updateAuction(auctionId, event.adUnitCode, {
349
345
  win_bdr: event.bidder,
350
346
  win_mt: getMediaTypeAlias(event.mediaType),
@@ -353,6 +349,11 @@ function handlerBidWon(event) {
353
349
  win_net_cpm: currencyData.netCpm,
354
350
  win_og_cpm: currencyData.orginalCpm,
355
351
 
352
+ // check timings at the end of the auction to leave time to the browser to update it
353
+ dom_i: Math.round(perfNavigation['domInteractive']) || null,
354
+ dom_c: Math.round(perfNavigation['domComplete']) || null,
355
+ loa_e: Math.round(perfNavigation['loadEventEnd']) || null,
356
+
356
357
  // cache bid id
357
358
  auct_id_c: adagioAuctionCacheId,
358
359
  });
@@ -407,7 +408,11 @@ let adagioAdapter = Object.assign(adapter({ emptyUrl, analyticsType }), {
407
408
 
408
409
  try {
409
410
  if (typeof args !== 'undefined' && events.indexOf(eventType) !== -1) {
410
- adagioEnqueue('pb-analytics-event', { eventName: eventType, args });
411
+ _internal.getAdagioNs().queue.push({
412
+ action: 'pb-analytics-event',
413
+ data: { eventName: eventType, args },
414
+ ts: Date.now()
415
+ });
411
416
  }
412
417
  } catch (error) {
413
418
  logError('Error on Adagio Analytics Adapter - adagio.js', error);
@@ -418,14 +423,26 @@ let adagioAdapter = Object.assign(adapter({ emptyUrl, analyticsType }), {
418
423
  adagioAdapter.originEnableAnalytics = adagioAdapter.enableAnalytics;
419
424
 
420
425
  adagioAdapter.enableAnalytics = config => {
421
- const w = (canAccessTopWindow()) ? getWindowTop() : getWindowSelf();
422
- currentWindow = w;
426
+ _internal.getAdagioNs().versions.adagioAnalyticsAdapter = VERSION;
423
427
 
424
- w.ADAGIO = w.ADAGIO || {};
425
- w.ADAGIO.queue = w.ADAGIO.queue || [];
426
- w.ADAGIO.versions = w.ADAGIO.versions || {};
427
- w.ADAGIO.versions.adagioAnalyticsAdapter = VERSION;
428
+ let modules = getGlobal().installedModules;
429
+ if (modules && (!modules.length || modules.indexOf('adagioRtdProvider') === -1 || modules.indexOf('rtdModule') === -1)) {
430
+ logError('Adagio Analytics Adapter requires rtdModule & adagioRtdProvider modules which are not installed. No beacon will be sent');
431
+ return;
432
+ }
428
433
 
434
+ adagioAdapter.options = config.options || {};
435
+ if (!adagioAdapter.options.organizationId) {
436
+ logWarn('Adagio Analytics Adapter: organizationId is required and is missing will try to fallback on params.');
437
+ } else {
438
+ adagioAdapter.options.organizationId = adagioAdapter.options.organizationId.toString(); // allows publisher to pass it as a number
439
+ }
440
+ if (!adagioAdapter.options.site) {
441
+ logWarn('Adagio Analytics Adapter: site is required and is missing will try to fallback on params.');
442
+ } else if (typeof adagioAdapter.options.site !== 'string') {
443
+ logWarn('Adagio Analytics Adapter: site should be a string will try to fallback on params.');
444
+ adagioAdapter.options.site = undefined;
445
+ }
429
446
  adagioAdapter.originEnableAnalytics(config);
430
447
  }
431
448
 
@@ -13,5 +13,9 @@ Analytics adapter for Adagio
13
13
  ```js
14
14
  pbjs.enableAnalytics({
15
15
  provider: 'adagio',
16
+ options: {
17
+ organizationId: '1000', // Required. Provided by Adagio
18
+ site: 'my-website', // Required. Provided by Adagio
19
+ }
16
20
  });
17
21
  ```
@@ -20,11 +20,11 @@ import {
20
20
  import { getRefererInfo, parseDomain } from '../src/refererDetection.js';
21
21
  import { OUTSTREAM } from '../src/video.js';
22
22
  import { Renderer } from '../src/Renderer.js';
23
+ import { _ADAGIO } from '../libraries/adagioUtils/adagioUtils.js';
23
24
  import { config } from '../src/config.js';
24
25
  import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
25
26
  import { find } from '../src/polyfill.js';
26
27
  import { getGptSlotInfoForAdUnitCode } from '../libraries/gptUtils/gptUtils.js';
27
- import { _ADAGIO } from '../libraries/adagioUtils/adagioUtils.js';
28
28
  import { registerBidder } from '../src/adapters/bidderFactory.js';
29
29
  import { userSync } from '../src/userSync.js';
30
30
 
@@ -176,17 +176,6 @@ function _getUspConsent(bidderRequest) {
176
176
  return (deepAccess(bidderRequest, 'uspConsent')) ? { uspConsent: bidderRequest.uspConsent } : false;
177
177
  }
178
178
 
179
- function _getGppConsent(bidderRequest) {
180
- let gpp = deepAccess(bidderRequest, 'gppConsent.gppString')
181
- let gppSid = deepAccess(bidderRequest, 'gppConsent.applicableSections')
182
-
183
- if (!gpp || !gppSid) {
184
- gpp = deepAccess(bidderRequest, 'ortb2.regs.gpp', '')
185
- gppSid = deepAccess(bidderRequest, 'ortb2.regs.gpp_sid', [])
186
- }
187
- return { gpp, gppSid }
188
- }
189
-
190
179
  function _getSchain(bidRequest) {
191
180
  return deepAccess(bidRequest, 'schain');
192
181
  }
@@ -559,7 +548,7 @@ export const spec = {
559
548
  const gdprConsent = _getGdprConsent(bidderRequest) || {};
560
549
  const uspConsent = _getUspConsent(bidderRequest) || {};
561
550
  const coppa = _getCoppa();
562
- const gppConsent = _getGppConsent(bidderRequest)
551
+ const { gpp, gpp_sid: gppSid } = deepAccess(bidderRequest, 'ortb2.regs', {});
563
552
  const schain = _getSchain(validBidRequests[0]);
564
553
  const eids = _getEids(validBidRequests[0]) || [];
565
554
  const syncEnabled = deepAccess(config.getConfig('userSync'), 'syncEnabled')
@@ -576,7 +565,7 @@ export const spec = {
576
565
  sessionData.rnd = Math.random()
577
566
  }
578
567
 
579
- const aucId = deepAccess('bidderRequest', 'ortb2.site.ext.data.adg_rtd.uid') || generateUUID()
568
+ const aucId = deepAccess(bidderRequest, 'ortb2.site.ext.data.adg_rtd.uid') || generateUUID()
580
569
 
581
570
  const adUnits = validBidRequests.map(rawBidRequest => {
582
571
  const bidRequest = deepClone(rawBidRequest);
@@ -724,7 +713,6 @@ export const spec = {
724
713
  // Those params are not sent to the server.
725
714
  // They are used for further operations on analytics adapter.
726
715
  validBidRequests.forEach(rawBidRequest => {
727
- rawBidRequest.params.adagioAuctionId = aucId
728
716
  rawBidRequest.params.pageviewId = pageviewId
729
717
  });
730
718
 
@@ -748,8 +736,8 @@ export const spec = {
748
736
  gdpr: gdprConsent,
749
737
  coppa: coppa,
750
738
  ccpa: uspConsent,
751
- gpp: gppConsent.gpp,
752
- gppSid: gppConsent.gppSid,
739
+ gpp: gpp || '',
740
+ gppSid: gppSid || [],
753
741
  dsa: dsa // populated if exists
754
742
  },
755
743
  schain: schain,
@@ -73,20 +73,34 @@ const _SESSION = (function() {
73
73
 
74
74
  storage.getDataFromLocalStorage('adagio', (storageValue) => {
75
75
  // session can be an empty object
76
- const { rnd, new: isNew, vwSmplg, vwSmplgNxt, lastActivityTime } = _internal.getSessionFromLocalStorage(storageValue);
76
+ const { rnd, new: isNew = false, vwSmplg, vwSmplgNxt, lastActivityTime, id, testName, testVersion, initiator } = _internal.getSessionFromLocalStorage(storageValue);
77
+
78
+ // isNew can be `true` if the session has been initialized by the A/B test snippet (external)
79
+ const isNewSess = (initiator === 'snippet') ? isNew : isNewSession(lastActivityTime);
77
80
 
78
81
  data.session = {
79
82
  rnd,
80
- new: isNew || false, // legacy: `new` was used but the choosen name is not good.
83
+ new: isNewSess, // legacy: `new` was used but the choosen name is not good.
81
84
  // Don't use values if they are not defined.
82
85
  ...(vwSmplg !== undefined && { vwSmplg }),
83
86
  ...(vwSmplgNxt !== undefined && { vwSmplgNxt }),
84
- ...(lastActivityTime !== undefined && { lastActivityTime })
87
+ ...(lastActivityTime !== undefined && { lastActivityTime }),
88
+ ...(id !== undefined && { id }),
89
+ ...(testName !== undefined && { testName }),
90
+ ...(testVersion !== undefined && { testVersion }),
91
+ ...(initiator !== undefined && { initiator }),
85
92
  };
86
93
 
87
- if (isNewSession(lastActivityTime)) {
94
+ // `initiator` is a pseudo flag used to know if the session has been initialized by the A/B test snippet (external).
95
+ // If the AB Test snippet has not been used, then `initiator` value is `adgjs` or `undefined`.
96
+ // The check on `testName` is used to ensure that the A/B test values are removed.
97
+ if (initiator !== 'snippet' && (isNewSess || testName)) {
88
98
  data.session.new = true;
99
+ data.session.id = generateUUID();
89
100
  data.session.rnd = Math.random();
101
+ // Ensure that the A/B test values are removed.
102
+ delete data.session.testName;
103
+ delete data.session.testVersion;
90
104
  }
91
105
 
92
106
  _internal.getAdagioNs().queue.push({
@@ -2,6 +2,7 @@ import {deepAccess, deepSetValue, isArray, isNumber, isStr, logInfo, parseSizesI
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
4
4
  import {config} from '../src/config.js';
5
+ import {getBidFloor} from '../libraries/adkernelUtils/adkernelUtils.js'
5
6
 
6
7
  const DEFAULT_ADKERNEL_DSP_DOMAIN = 'tag.adkernel.com';
7
8
  const DEFAULT_MIMES = ['video/mp4', 'video/webm', 'application/x-shockwave-flash', 'application/javascript'];
@@ -143,18 +144,6 @@ function fillBidMeta(bid, tag) {
143
144
  }
144
145
  }
145
146
 
146
- function getBidFloor(bid, mediaType, sizes) {
147
- var floor;
148
- var size = sizes.length === 1 ? sizes[0] : '*';
149
- if (typeof bid.getFloor === 'function') {
150
- const floorInfo = bid.getFloor({currency: 'USD', mediaType, size});
151
- if (typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) {
152
- floor = parseFloat(floorInfo.floor);
153
- }
154
- }
155
- return floor;
156
- }
157
-
158
147
  export const spec = {
159
148
  code: 'adkernelAdn',
160
149
  gvlid: GVLID,
@@ -20,6 +20,7 @@ import {registerBidder} from '../src/adapters/bidderFactory.js';
20
20
  import {find} from '../src/polyfill.js';
21
21
  import {config} from '../src/config.js';
22
22
  import {getAdUnitSizes} from '../libraries/sizeUtils/sizeUtils.js';
23
+ import {getBidFloor} from '../libraries/adkernelUtils/adkernelUtils.js'
23
24
 
24
25
  /**
25
26
  * In case you're AdKernel whitelable platform's client who needs branded adapter to
@@ -95,7 +96,9 @@ export const spec = {
95
96
  {code: 'headbidder'},
96
97
  {code: 'digiad'},
97
98
  {code: 'monetix'},
98
- {code: 'hyperbrainz'}
99
+ {code: 'hyperbrainz'},
100
+ {code: 'voisetech'},
101
+ {code: 'global_sun'}
99
102
  ],
100
103
  supportedMediaTypes: [BANNER, VIDEO, NATIVE],
101
104
 
@@ -246,18 +249,6 @@ function groupImpressionsByHostZone(bidRequests, refererInfo) {
246
249
  );
247
250
  }
248
251
 
249
- function getBidFloor(bid, mediaType, sizes) {
250
- var floor;
251
- var size = sizes.length === 1 ? sizes[0] : '*';
252
- if (typeof bid.getFloor === 'function') {
253
- const floorInfo = bid.getFloor({currency: 'USD', mediaType, size});
254
- if (typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) {
255
- floor = parseFloat(floorInfo.floor);
256
- }
257
- }
258
- return floor;
259
- }
260
-
261
252
  /**
262
253
  * Builds rtb imp object(s) for single adunit
263
254
  * @param bidRequest {BidRequest}
@@ -232,6 +232,7 @@ analyticsAdapter[`handle_${EVENTS.AUCTION_END}`] = function(auctionDetails) {
232
232
  link.setAttribute('href', `${uri.protocol}://${uri.host}${uri.pathname}`);
233
233
  link.setAttribute('rel', 'preload');
234
234
  link.setAttribute('as', 'script');
235
+ // TODO fix rules violation
235
236
  insertElement(link);
236
237
  }
237
238
 
@@ -13,7 +13,7 @@ const ALIASES = [
13
13
  {code: 'futureads', endpoint: 'https://ads.futureads.io/prebid.1.2.aspx'},
14
14
  {code: 'smn', endpoint: 'https://ads.smn.rs/prebid.1.2.aspx'},
15
15
  {code: 'admixeradx', endpoint: 'https://inv-nets.admixer.net/adxprebid.1.2.aspx'},
16
- {code: 'admixerwl', endpoint: 'https://inv-nets-adxwl.admixer.com/adxwlprebid.aspx'},
16
+ 'rtbstack'
17
17
  ];
18
18
  export const spec = {
19
19
  code: BIDDER_CODE,
@@ -23,8 +23,8 @@ export const spec = {
23
23
  * Determines whether or not the given bid request is valid.
24
24
  */
25
25
  isBidRequestValid: function (bid) {
26
- return bid.bidder === 'admixerwl'
27
- ? !!bid.params.clientId && !!bid.params.endpointId
26
+ return bid.bidder === 'rtbstack'
27
+ ? !!bid.params.tagId
28
28
  : !!bid.params.zone;
29
29
  },
30
30
  /**
@@ -51,8 +51,12 @@ export const spec = {
51
51
  };
52
52
  let endpointUrl;
53
53
  if (bidderRequest) {
54
- const {bidderCode} = bidderRequest;
55
- endpointUrl = config.getConfig(`${bidderCode}.endpoint_url`);
54
+ // checks if there is specified any endpointUrl in bidder config
55
+ endpointUrl = config.getConfig('bidderURL');
56
+ if (!endpointUrl && bidderRequest.bidderCode === 'rtbstack') {
57
+ logError('The bidderUrl config is required for RTB Stack bids. Please set it with setBidderConfig() for "rtbstack".');
58
+ return;
59
+ }
56
60
  // TODO: is 'page' the right value here?
57
61
  if (bidderRequest.refererInfo?.page) {
58
62
  payload.referrer = encodeURIComponent(bidderRequest.refererInfo.page);
@@ -82,7 +86,7 @@ export const spec = {
82
86
  let urlForRequest = endpointUrl || getEndpointUrl(bidderRequest.bidderCode)
83
87
  return {
84
88
  method: 'POST',
85
- url: bidderRequest.bidderCode === 'admixerwl' ? `${urlForRequest}?client=${payload.imps[0]?.params?.clientId}` : urlForRequest,
89
+ url: urlForRequest,
86
90
  data: payload,
87
91
  };
88
92
  },