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
@@ -1,10 +1,12 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
- import {includes} from '../src/polyfill.js';
3
- import {BANNER} from '../src/mediaTypes.js';
2
+ import { getStorageManager } from '../src/storageManager.js';
3
+ import { includes } from '../src/polyfill.js';
4
+ import { BANNER } from '../src/mediaTypes.js';
4
5
 
5
- const VERSION = '1.0';
6
+ const VERSION = '3.2';
6
7
  const BAD_WORD_STEP = 0.1;
7
8
  const BAD_WORD_MIN = 0.2;
9
+ const ADHASH_BIDDER_CODE = 'adhash';
8
10
 
9
11
  /**
10
12
  * Function that checks the page where the ads are being served for brand safety.
@@ -54,43 +56,92 @@ function brandSafety(badWords, maxScore) {
54
56
  return positive ? result : -result;
55
57
  };
56
58
 
59
+ /**
60
+ * Checks what rule will match in the given array with words
61
+ * @param {string} rule rule type (full, partial, starts, ends, regexp)
62
+ * @param {string} decodedWord decoded word
63
+ * @param {array} wordsToMatch array to find a match
64
+ * @returns {object|boolean} matched rule and occurances. If nothing is matched returns false
65
+ */
66
+ const wordsMatchedWithRule = function (rule, decodedWord, wordsToMatch) {
67
+ if (rule === 'full' && wordsToMatch && wordsToMatch.includes(decodedWord)) {
68
+ return { rule, occurances: wordsToMatch.filter(element => element === decodedWord).length };
69
+ } else if (rule === 'partial' && wordsToMatch && wordsToMatch.some(element => element.indexOf(decodedWord) > -1)) {
70
+ return { rule, occurances: wordsToMatch.filter(element => element.indexOf(decodedWord) > -1).length };
71
+ } else if (rule === 'starts' && wordsToMatch && wordsToMatch.some(word => word.startsWith(decodedWord))) {
72
+ return { rule, occurances: wordsToMatch.filter(element => element.startsWith(decodedWord)).length };
73
+ } else if (rule === 'ends' && wordsToMatch && wordsToMatch.some(word => word.endsWith(decodedWord))) {
74
+ return { rule, occurances: wordsToMatch.filter(element => element.endsWith(decodedWord)).length };
75
+ } else if (rule === 'regexp' && wordsToMatch && wordsToMatch.some(element => element.match(new RegExp(decodedWord, 'i')))) {
76
+ return { rule, occurances: wordsToMatch.filter(element => element.match(new RegExp(decodedWord, 'i'))).length };
77
+ }
78
+ return false;
79
+ };
80
+
57
81
  // Default parameters if the bidder is unable to send some of them
58
82
  badWords = badWords || [];
59
83
  maxScore = parseInt(maxScore) || 10;
60
84
 
61
85
  try {
62
86
  let score = 0;
87
+ const decodedUrl = decodeURI(window.top.location.href.substring(window.top.location.origin.length));
88
+ const wordsAndNumbersInUrl = decodedUrl
89
+ .replaceAll(/[-,\._/\?=&#%]/g, ' ')
90
+ .replaceAll(/\s\s+/g, ' ')
91
+ .toLowerCase()
92
+ .trim();
63
93
  const content = window.top.document.body.innerText.toLowerCase();
64
- const words = content.trim().split(/\s+/).length;
94
+ const contentWords = content.trim().split(/\s+/).length;
95
+ // \p{L} matches a single unicode code point in the category 'letter'. Matches any kind of letter from any language.
96
+ const regexp = new RegExp('[\\p{L}]+', 'gu');
97
+ const words = content.match(regexp);
98
+ const wordsInUrl = wordsAndNumbersInUrl.match(regexp);
99
+
65
100
  for (const [word, rule, points] of badWords) {
66
- if (rule === 'full' && new RegExp('\\b' + rot13(word) + '\\b', 'i').test(content)) {
67
- const occurances = content.match(new RegExp('\\b' + rot13(word) + '\\b', 'g')).length;
68
- score += scoreCalculator(points, occurances);
69
- } else if (rule === 'partial' && content.indexOf(rot13(word.toLowerCase())) > -1) {
70
- const occurances = content.match(new RegExp(rot13(word), 'g')).length;
71
- score += scoreCalculator(points, occurances);
101
+ const decodedWord = rot13(word.toLowerCase());
102
+
103
+ // Checks the words in the url of the page only for negative words. Don't serve any ad when at least one match is found
104
+ if (points > 0) {
105
+ const matchedRuleInUrl = wordsMatchedWithRule(rule, decodedWord, wordsInUrl);
106
+ if (matchedRuleInUrl.rule) {
107
+ return false;
108
+ }
109
+ }
110
+
111
+ // Check if site content's words match any of our brand safety rules
112
+ const matchedRule = wordsMatchedWithRule(rule, decodedWord, words);
113
+ if (matchedRule.rule === 'full') {
114
+ score += scoreCalculator(points, matchedRule.occurances);
115
+ } else if (matchedRule.rule === 'partial') {
116
+ score += scoreCalculator(points, matchedRule.occurances);
117
+ } else if (matchedRule.rule === 'starts') {
118
+ score += scoreCalculator(points, matchedRule.occurances);
119
+ } else if (matchedRule.rule === 'ends') {
120
+ score += scoreCalculator(points, matchedRule.occurances);
121
+ } else if (matchedRule.rule === 'regexp') {
122
+ score += scoreCalculator(points, matchedRule.occurances);
72
123
  }
73
124
  }
74
- return score < maxScore * words / 500;
125
+ return score < (maxScore * contentWords) / 1000;
75
126
  } catch (e) {
76
127
  return true;
77
128
  }
78
129
  }
79
130
 
80
131
  export const spec = {
81
- code: 'adhash',
82
- url: 'https://bidder.adhash.com/rtb?version=' + VERSION + '&prebid=true',
132
+ code: ADHASH_BIDDER_CODE,
83
133
  supportedMediaTypes: [ BANNER ],
84
134
 
85
135
  isBidRequestValid: (bid) => {
86
136
  try {
87
- const { publisherId, platformURL } = bid.params;
137
+ const { publisherId, platformURL, bidderURL } = bid.params;
88
138
  return (
89
139
  includes(Object.keys(bid.mediaTypes), BANNER) &&
90
140
  typeof publisherId === 'string' &&
91
141
  publisherId.length === 42 &&
92
142
  typeof platformURL === 'string' &&
93
- platformURL.length >= 13
143
+ platformURL.length >= 13 &&
144
+ (!bidderURL || bidderURL.indexOf('https://') === 0)
94
145
  );
95
146
  } catch (error) {
96
147
  return false;
@@ -98,24 +149,51 @@ export const spec = {
98
149
  },
99
150
 
100
151
  buildRequests: (validBidRequests, bidderRequest) => {
152
+ const storage = getStorageManager({ bidderCode: ADHASH_BIDDER_CODE });
101
153
  const { gdprConsent } = bidderRequest;
102
- const { url } = spec;
103
154
  const bidRequests = [];
104
- let referrer = '';
105
- if (bidderRequest && bidderRequest.refererInfo) {
106
- // TODO: is 'page' the right value here?
107
- referrer = bidderRequest.refererInfo.page;
108
- }
109
- for (var i = 0; i < validBidRequests.length; i++) {
110
- var index = Math.floor(Math.random() * validBidRequests[i].sizes.length);
111
- var size = validBidRequests[i].sizes[index].join('x');
155
+ const body = document.body;
156
+ const html = document.documentElement;
157
+ const pageHeight = Math.max(
158
+ body.scrollHeight,
159
+ body.offsetHeight,
160
+ html.clientHeight,
161
+ html.scrollHeight,
162
+ html.offsetHeight
163
+ );
164
+ const pageWidth = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth);
165
+
166
+ for (let i = 0; i < validBidRequests.length; i++) {
167
+ const bidderURL = validBidRequests[i].params.bidderURL || 'https://bidder.adhash.com';
168
+ const url = `${bidderURL}/rtb?version=${VERSION}&prebid=true`;
169
+ const index = Math.floor(Math.random() * validBidRequests[i].sizes.length);
170
+ const size = validBidRequests[i].sizes[index].join('x');
171
+
172
+ let recentAds = [];
173
+ if (storage.localStorageIsEnabled()) {
174
+ const prefix = validBidRequests[i].params.prefix || 'adHash';
175
+ recentAds = JSON.parse(storage.getDataFromLocalStorage(prefix + 'recentAds') || '[]');
176
+ }
177
+
178
+ // Needed for the ad density calculation
179
+ var adHeight = validBidRequests[i].sizes[index][1];
180
+ var adWidth = validBidRequests[i].sizes[index][0];
181
+ if (!window.adsCount) {
182
+ window.adsCount = 0;
183
+ }
184
+ if (!window.adsTotalSurface) {
185
+ window.adsTotalSurface = 0;
186
+ }
187
+ window.adsTotalSurface += adHeight * adWidth;
188
+ window.adsCount++;
189
+
112
190
  bidRequests.push({
113
191
  method: 'POST',
114
192
  url: url + '&publisher=' + validBidRequests[i].params.publisherId,
115
193
  bidRequest: validBidRequests[i],
116
194
  data: {
117
195
  timezone: new Date().getTimezoneOffset() / 60,
118
- location: referrer,
196
+ location: bidderRequest.refererInfo ? bidderRequest.refererInfo.topmostLocation : '',
119
197
  publisherId: validBidRequests[i].params.publisherId,
120
198
  size: {
121
199
  screenWidth: window.screen.width,
@@ -131,10 +209,14 @@ export const spec = {
131
209
  position: validBidRequests[i].adUnitCode
132
210
  }],
133
211
  blockedCreatives: [],
134
- currentTimestamp: new Date().getTime(),
135
- recentAds: [],
212
+ currentTimestamp: (new Date().getTime() / 1000) | 0,
213
+ recentAds: recentAds,
136
214
  GDPRApplies: gdprConsent ? gdprConsent.gdprApplies : null,
137
- GDPR: gdprConsent ? gdprConsent.consentString : null
215
+ GDPR: gdprConsent ? gdprConsent.consentString : null,
216
+ servedAdsCount: window.adsCount,
217
+ adsTotalSurface: window.adsTotalSurface,
218
+ pageHeight: pageHeight,
219
+ pageWidth: pageWidth
138
220
  },
139
221
  options: {
140
222
  withCredentials: false,
@@ -157,7 +239,11 @@ export const spec = {
157
239
  }
158
240
 
159
241
  const publisherURL = JSON.stringify(request.bidRequest.params.platformURL);
242
+ const bidderURL = request.bidRequest.params.bidderURL || 'https://bidder.adhash.com';
160
243
  const oneTimeId = request.bidRequest.adUnitCode + Math.random().toFixed(16).replace('0.', '.');
244
+ const globalScript = !request.bidRequest.params.globalScript
245
+ ? `<script src="${bidderURL}/static/scripts/creative.min.js"></script>`
246
+ : '';
161
247
  const bidderResponse = JSON.stringify({ responseText: JSON.stringify(responseBody) });
162
248
  const requestData = JSON.stringify(request.data);
163
249
 
@@ -165,8 +251,7 @@ export const spec = {
165
251
  requestId: request.bidRequest.bidId,
166
252
  cpm: responseBody.creatives[0].costEUR,
167
253
  ad:
168
- `<div id="${oneTimeId}"></div>
169
- <script src="https://bidder.adhash.com/static/scripts/creative.min.js"></script>
254
+ `<div id="${oneTimeId}"></div>${globalScript}
170
255
  <script>callAdvertiser(${bidderResponse},['${oneTimeId}'],${requestData},${publisherURL})</script>`,
171
256
  width: request.bidRequest.sizes[0][0],
172
257
  height: request.bidRequest.sizes[0][1],
@@ -3,7 +3,7 @@
3
3
  ```
4
4
  Module Name: AdHash Bidder Adapter
5
5
  Module Type: Bidder Adapter
6
- Maintainer: damyan@adhash.org
6
+ Maintainer: damyan@adhash.com
7
7
  ```
8
8
 
9
9
  # Description
@@ -14,8 +14,6 @@ Here is what you need for Prebid integration with AdHash:
14
14
  3. Use the Publisher ID and Platform URL as parameters in params.
15
15
 
16
16
  Please note that a number of AdHash functionalities are not supported in the Prebid.js integration:
17
- * Cookie-less frequency and recency capping;
18
- * Audience segments;
19
17
  * Price floors and passback tags, as they are not needed in the Prebid.js setup;
20
18
  * Reservation for direct deals only, as bids are evaluated based on their price.
21
19
 
@@ -1,7 +1,7 @@
1
1
  import { getValue, logError, deepAccess, getBidIdParameter, isArray } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
4
- const SYNC_URL = 'https://cdn.serve.admatic.com.tr/showad/sync.html';
4
+ let SYNC_URL = '';
5
5
  const BIDDER_CODE = 'admatic';
6
6
  export const spec = {
7
7
  code: BIDDER_CODE,
@@ -59,6 +59,15 @@ export const spec = {
59
59
  };
60
60
 
61
61
  if (payload) {
62
+ switch (bidderName) {
63
+ case 'pixad':
64
+ SYNC_URL = 'https://static.pixad.com.tr/sync.html';
65
+ break;
66
+ default:
67
+ SYNC_URL = 'https://cdn.serve.admatic.com.tr/showad/sync.html';
68
+ break;
69
+ }
70
+
62
71
  return { method: 'POST', url: `https://${host}/pb?bidder=${bidderName}`, data: payload, options: { contentType: 'application/json' } };
63
72
  }
64
73
  },
@@ -5,7 +5,7 @@ import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
5
5
  import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
6
6
 
7
7
  const BIDDER_CODE = 'admixer';
8
- const ALIASES = ['go2net', 'adblender', 'adsyield', 'futureads'];
8
+ const ALIASES = ['go2net', 'adblender', 'adsyield', 'futureads', 'smn'];
9
9
  const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
10
10
  export const spec = {
11
11
  code: BIDDER_CODE,