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
@@ -0,0 +1,492 @@
1
+ import {_each, contains, deepAccess, deepSetValue, getDNT, isBoolean, isStr, logError, logInfo} from '../src/utils.js';
2
+ import {config} from '../src/config.js';
3
+ import {BANNER, VIDEO} from '../src/mediaTypes.js';
4
+ import {registerBidder} from '../src/adapters/bidderFactory.js';
5
+ import {getRefererInfo} from '../src/refererDetection.js';
6
+ import {ajax} from '../src/ajax.js';
7
+
8
+ const BIDDER_CODE = 'aidem';
9
+ const BASE_URL = 'https://zero.aidemsrv.com';
10
+ const LOCAL_BASE_URL = 'http://127.0.0.1:8787';
11
+
12
+ const AVAILABLE_CURRENCIES = ['USD'];
13
+ const DEFAULT_CURRENCY = ['USD']; // NOTE - USD is the only supported currency right now; Hardcoded for bids
14
+ const SUPPORTED_MEDIA_TYPES = [BANNER, VIDEO];
15
+ const REQUIRED_VIDEO_PARAMS = [ 'mimes', 'protocols', 'context' ];
16
+
17
+ export const ERROR_CODES = {
18
+ BID_SIZE_INVALID_FORMAT: 1,
19
+ BID_SIZE_NOT_INCLUDED: 2,
20
+ PROPERTY_NOT_INCLUDED: 3,
21
+ SITE_ID_INVALID_VALUE: 4,
22
+ MEDIA_TYPE_NOT_SUPPORTED: 5,
23
+ PUBLISHER_ID_INVALID_VALUE: 6,
24
+ };
25
+
26
+ const endpoints = {
27
+ request: `${BASE_URL}/bid/request`,
28
+ notice: {
29
+ win: `${BASE_URL}/notice/win`,
30
+ timeout: `${BASE_URL}/notice/timeout`,
31
+ error: `${BASE_URL}/notice/error`,
32
+ }
33
+ }
34
+
35
+ export function setEndPoints(env = null, path = '', mediaType = BANNER) {
36
+ switch (env) {
37
+ case 'local':
38
+ endpoints.request = mediaType === BANNER ? `${LOCAL_BASE_URL}${path}/bid/request` : `${LOCAL_BASE_URL}${path}/bid/videorequest`
39
+ endpoints.notice.win = `${LOCAL_BASE_URL}${path}/notice/win`
40
+ endpoints.notice.error = `${LOCAL_BASE_URL}${path}/notice/error`
41
+ endpoints.notice.timeout = `${LOCAL_BASE_URL}${path}/notice/timeout`
42
+ break;
43
+ case 'main':
44
+ endpoints.request = mediaType === BANNER ? `${BASE_URL}${path}/bid/request` : `${BASE_URL}${path}/bid/videorequest`
45
+ endpoints.notice.win = `${BASE_URL}${path}/notice/win`
46
+ endpoints.notice.error = `${BASE_URL}${path}/notice/error`
47
+ endpoints.notice.timeout = `${BASE_URL}${path}/notice/timeout`
48
+ break;
49
+ }
50
+ return endpoints
51
+ }
52
+
53
+ config.getConfig('aidem', function (config) {
54
+ if (config.aidem.env) { setEndPoints(config.aidem.env, config.aidem.path, config.aidem.mediaType) }
55
+ })
56
+
57
+ // AIDEM Custom FN
58
+ function recur(obj) {
59
+ var result = {}; var _tmp;
60
+ for (var i in obj) {
61
+ // enabledPlugin is too nested, also skip functions
62
+ if (!(i === 'enabledPlugin' || typeof obj[i] === 'function')) {
63
+ if (typeof obj[i] === 'object' && obj[i] !== null) {
64
+ // get props recursively
65
+ _tmp = recur(obj[i]);
66
+ // if object is not {}
67
+ if (Object.keys(_tmp).length) {
68
+ result[i] = _tmp;
69
+ }
70
+ } else {
71
+ // string, number or boolean
72
+ result[i] = obj[i];
73
+ }
74
+ }
75
+ }
76
+ return result;
77
+ }
78
+
79
+ // =================================================================================
80
+ function getConnectionType() {
81
+ const connection = navigator.connection || navigator.webkitConnection;
82
+ if (!connection) {
83
+ return 0;
84
+ }
85
+ switch (connection.type) {
86
+ case 'ethernet':
87
+ return 1;
88
+ case 'wifi':
89
+ return 2;
90
+ case 'cellular':
91
+ switch (connection.effectiveType) {
92
+ case 'slow-2g':
93
+ return 4;
94
+ case '2g':
95
+ return 4;
96
+ case '3g':
97
+ return 5;
98
+ case '4g':
99
+ return 6;
100
+ case '5g':
101
+ return 7;
102
+ default:
103
+ return 3;
104
+ }
105
+ default:
106
+ return 0;
107
+ }
108
+ }
109
+
110
+ function getDevice() {
111
+ const language = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
112
+ return {
113
+ ua: navigator.userAgent,
114
+ dnt: !!getDNT(),
115
+ language: language,
116
+ connectiontype: getConnectionType(),
117
+ screen_width: screen.width,
118
+ screen_height: screen.height
119
+ };
120
+ }
121
+
122
+ function getRegs() {
123
+ let regs = {};
124
+ const consentManagement = config.getConfig('consentManagement')
125
+ const coppa = config.getConfig('coppa')
126
+ if (consentManagement && !!(consentManagement.gdpr)) {
127
+ deepSetValue(regs, 'gdpr_applies', !!consentManagement.gdpr);
128
+ } else {
129
+ deepSetValue(regs, 'gdpr_applies', false);
130
+ }
131
+ if (consentManagement && deepAccess(consentManagement, 'usp.cmpApi') === 'static') {
132
+ deepSetValue(regs, 'usp_applies', !!deepAccess(consentManagement, 'usp'));
133
+ deepSetValue(regs, 'us_privacy', deepAccess(consentManagement, 'usp.consentData.getUSPData.uspString'));
134
+ } else {
135
+ deepSetValue(regs, 'usp_applies', false);
136
+ }
137
+
138
+ if (isBoolean(coppa)) {
139
+ deepSetValue(regs, 'coppa_applies', !!coppa);
140
+ } else {
141
+ deepSetValue(regs, 'coppa_applies', false);
142
+ }
143
+
144
+ return regs;
145
+ }
146
+
147
+ function getPageUrl(bidderRequest) {
148
+ return bidderRequest?.refererInfo?.page
149
+ }
150
+
151
+ function buildWinNotice(bid) {
152
+ return {
153
+ burl: deepAccess(bid, 'meta.burl'),
154
+ cpm: bid.cpm,
155
+ currency: bid.currency,
156
+ impid: deepAccess(bid, 'meta.impid'),
157
+ dsp_id: deepAccess(bid, 'meta.dsp_id'),
158
+ adUnitCode: bid.adUnitCode,
159
+ auctionId: bid.auctionId,
160
+ transactionId: bid.transactionId,
161
+ ttl: bid.ttl,
162
+ requestTimestamp: bid.requestTimestamp,
163
+ responseTimestamp: bid.responseTimestamp,
164
+ }
165
+ }
166
+
167
+ function buildErrorNotice(prebidErrorResponse) {
168
+ return {
169
+ message: `Prebid.js: Server call for ${prebidErrorResponse.bidderCode} failed.`,
170
+ url: encodeURIComponent(getPageUrl(prebidErrorResponse)),
171
+ auctionId: prebidErrorResponse.auctionId,
172
+ bidderRequestId: prebidErrorResponse.bidderRequestId,
173
+ metrics: {}
174
+ }
175
+ }
176
+
177
+ function hasValidFloor(obj) {
178
+ if (!obj) return false
179
+ const hasValue = !isNaN(Number(obj.value))
180
+ const hasCurrency = contains(AVAILABLE_CURRENCIES, obj.currency)
181
+ return hasValue && hasCurrency
182
+ }
183
+
184
+ function getMediaType(bidRequest) {
185
+ if ((bidRequest.mediaTypes && bidRequest.mediaTypes.hasOwnProperty('video')) || bidRequest.params.hasOwnProperty('video')) { return VIDEO }
186
+ return BANNER
187
+ }
188
+
189
+ function getPrebidRequestFields(bidderRequest, bidRequests) {
190
+ const payload = {}
191
+ // Base Payload Data
192
+ deepSetValue(payload, 'id', bidderRequest.auctionId);
193
+ // Impressions
194
+ setPrebidImpressionObject(bidRequests, payload)
195
+ // Device
196
+ deepSetValue(payload, 'device', getDevice())
197
+ // Timeout
198
+ deepSetValue(payload, 'tmax', bidderRequest.timeout);
199
+ // Currency
200
+ deepSetValue(payload, 'cur', DEFAULT_CURRENCY);
201
+ // Timezone
202
+ deepSetValue(payload, 'tz', new Date().getTimezoneOffset());
203
+ // Privacy Regs
204
+ deepSetValue(payload, 'regs', getRegs());
205
+ // Site
206
+ setPrebidSiteObject(bidderRequest, payload)
207
+ // Environment
208
+ setPrebidRequestEnvironment(payload)
209
+ // AT auction type
210
+ deepSetValue(payload, 'at', 1);
211
+
212
+ return payload
213
+ }
214
+
215
+ function setPrebidImpressionObject(bidRequests, payload) {
216
+ payload.imp = [];
217
+ _each(bidRequests, function (bidRequest) {
218
+ const impressionObject = {};
219
+ // Placement or ad tag used to initiate the auction
220
+ deepSetValue(impressionObject, 'id', bidRequest.bidId);
221
+ // Transaction id
222
+ deepSetValue(impressionObject, 'tid', deepAccess(bidRequest, 'transactionId'));
223
+ // Publisher id
224
+ deepSetValue(payload, 'site.publisher.id', deepAccess(bidRequest, 'params.publisherId'));
225
+ // Site id
226
+ deepSetValue(payload, 'site.id', deepAccess(bidRequest, 'params.siteId'));
227
+ const mediaType = getMediaType(bidRequest)
228
+ switch (mediaType) {
229
+ case 'banner':
230
+ setPrebidImpressionObjectBanner(bidRequest, impressionObject)
231
+ break;
232
+ case 'video':
233
+ setPrebidImpressionObjectVideo(bidRequest, impressionObject)
234
+ break;
235
+ }
236
+
237
+ // Floor (optional)
238
+ setPrebidImpressionObjectFloor(bidRequest, impressionObject)
239
+
240
+ impressionObject.imp_ext = {};
241
+
242
+ payload.imp.push(impressionObject);
243
+ });
244
+ }
245
+
246
+ function setPrebidSiteObject(bidderRequest, payload) {
247
+ deepSetValue(payload, 'site.domain', deepAccess(bidderRequest, 'refererInfo.domain'));
248
+ deepSetValue(payload, 'site.page', deepAccess(bidderRequest, 'refererInfo.page'));
249
+ deepSetValue(payload, 'site.referer', deepAccess(bidderRequest, 'refererInfo.ref'));
250
+ deepSetValue(payload, 'site.cat', deepAccess(bidderRequest, 'ortb2.site.cat'));
251
+ deepSetValue(payload, 'site.sectioncat', deepAccess(bidderRequest, 'ortb2.site.sectioncat'));
252
+ deepSetValue(payload, 'site.keywords', deepAccess(bidderRequest, 'ortb2.site.keywords'));
253
+ deepSetValue(payload, 'site.site_ext', deepAccess(bidderRequest, 'ortb2.site.ext')); // see https://docs.prebid.org/features/firstPartyData.html
254
+ }
255
+
256
+ function setPrebidRequestEnvironment(payload) {
257
+ const __navigator = JSON.parse(JSON.stringify(recur(navigator)));
258
+ delete __navigator.plugins;
259
+ deepSetValue(payload, 'environment.ri', getRefererInfo());
260
+ deepSetValue(payload, 'environment.hl', window.history.length);
261
+ deepSetValue(payload, 'environment.nav', __navigator);
262
+ deepSetValue(payload, 'environment.inp.euc', window.encodeURIComponent.name === 'encodeURIComponent' && typeof window.encodeURIComponent.prototype === 'undefined');
263
+ deepSetValue(payload, 'environment.inp.eu', window.encodeURI.name === 'encodeURI' && typeof window.encodeURI.prototype === 'undefined');
264
+ deepSetValue(payload, 'environment.inp.js', window.JSON.stringify.name === 'stringify' && typeof window.JSON.stringify.prototype === 'undefined');
265
+ deepSetValue(payload, 'environment.inp.jp', window.JSON.parse.name === 'parse' && typeof window.JSON.parse.prototype === 'undefined');
266
+ deepSetValue(payload, 'environment.inp.ofe', window.Object.fromEntries.name === 'fromEntries' && typeof window.Object.fromEntries.prototype === 'undefined');
267
+ deepSetValue(payload, 'environment.inp.oa', window.Object.assign.name === 'assign' && typeof window.Object.assign.prototype === 'undefined');
268
+ }
269
+
270
+ function setPrebidImpressionObjectFloor(bidRequest, impressionObject) {
271
+ const floor = deepAccess(bidRequest, 'params.floor')
272
+ if (hasValidFloor(floor)) {
273
+ deepSetValue(impressionObject, 'floor.value', floor.value)
274
+ deepSetValue(impressionObject, 'floor.currency', floor.currency)
275
+ }
276
+ }
277
+
278
+ function setPrebidImpressionObjectBanner(bidRequest, impressionObject) {
279
+ deepSetValue(impressionObject, 'mediatype', BANNER);
280
+ deepSetValue(impressionObject, 'banner.topframe', 1);
281
+ deepSetValue(impressionObject, 'banner.format', []);
282
+ _each(bidRequest.mediaTypes.banner.sizes, function (bannerFormat) {
283
+ const format = {};
284
+ deepSetValue(format, 'w', bannerFormat[0]);
285
+ deepSetValue(format, 'h', bannerFormat[1]);
286
+ deepSetValue(format, 'format_ext', {});
287
+ impressionObject.banner.format.push(format);
288
+ });
289
+ }
290
+
291
+ function setPrebidImpressionObjectVideo(bidRequest, impressionObject) {
292
+ deepSetValue(impressionObject, 'mediatype', VIDEO);
293
+ deepSetValue(impressionObject, 'video.format', []);
294
+ deepSetValue(impressionObject, 'video.mimes', bidRequest.mediaTypes.video.mimes);
295
+ deepSetValue(impressionObject, 'video.minDuration', bidRequest.mediaTypes.video.minduration);
296
+ deepSetValue(impressionObject, 'video.maxDuration', bidRequest.mediaTypes.video.maxduration);
297
+ deepSetValue(impressionObject, 'video.protocols', bidRequest.mediaTypes.video.protocols);
298
+ deepSetValue(impressionObject, 'video.context', bidRequest.mediaTypes.video.context);
299
+ deepSetValue(impressionObject, 'video.playbackmethod', bidRequest.mediaTypes.video.playbackmethod);
300
+ deepSetValue(impressionObject, 'skip', bidRequest.mediaTypes.video.skip);
301
+ deepSetValue(impressionObject, 'skipafter', bidRequest.mediaTypes.video.skipafter);
302
+ deepSetValue(impressionObject, 'video.pos', bidRequest.mediaTypes.video.pos);
303
+ _each(bidRequest.mediaTypes.video.playerSize, function (videoPlayerSize) {
304
+ const format = {};
305
+ deepSetValue(format, 'w', videoPlayerSize[0]);
306
+ deepSetValue(format, 'h', videoPlayerSize[1]);
307
+ deepSetValue(format, 'format_ext', {});
308
+ impressionObject.video.format.push(format);
309
+ });
310
+ }
311
+
312
+ function getPrebidResponseBidObject(openRTBResponseBidObject) {
313
+ const prebidResponseBidObject = {};
314
+ // Common properties
315
+ deepSetValue(prebidResponseBidObject, 'requestId', openRTBResponseBidObject.impid);
316
+ deepSetValue(prebidResponseBidObject, 'cpm', parseFloat(openRTBResponseBidObject.price));
317
+ deepSetValue(prebidResponseBidObject, 'creativeId', openRTBResponseBidObject.crid);
318
+ deepSetValue(prebidResponseBidObject, 'currency', openRTBResponseBidObject.cur ? openRTBResponseBidObject.cur.toUpperCase() : DEFAULT_CURRENCY);
319
+ deepSetValue(prebidResponseBidObject, 'width', openRTBResponseBidObject.w);
320
+ deepSetValue(prebidResponseBidObject, 'height', openRTBResponseBidObject.h);
321
+ deepSetValue(prebidResponseBidObject, 'dealId', openRTBResponseBidObject.dealid)
322
+ deepSetValue(prebidResponseBidObject, 'netRevenue', true);
323
+ deepSetValue(prebidResponseBidObject, 'ttl', 60000);
324
+
325
+ if (openRTBResponseBidObject.mediatype === VIDEO) {
326
+ logInfo('bidObject.mediatype == VIDEO');
327
+ deepSetValue(prebidResponseBidObject, 'mediaType', VIDEO);
328
+ deepSetValue(prebidResponseBidObject, 'vastUrl', openRTBResponseBidObject.adm);
329
+ } else {
330
+ logInfo('bidObject.mediatype == BANNER');
331
+ deepSetValue(prebidResponseBidObject, 'mediaType', BANNER);
332
+ deepSetValue(prebidResponseBidObject, 'ad', openRTBResponseBidObject.adm);
333
+ }
334
+ setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject)
335
+ return prebidResponseBidObject
336
+ }
337
+
338
+ function setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject) {
339
+ logInfo('AIDEM Bid Adapter meta', openRTBResponseBidObject);
340
+ deepSetValue(prebidResponseBidObject, 'meta.advertiserDomains', openRTBResponseBidObject.adomain);
341
+ if (openRTBResponseBidObject.cat && Array.isArray(openRTBResponseBidObject.cat)) {
342
+ const primaryCatId = openRTBResponseBidObject.cat.shift();
343
+ deepSetValue(prebidResponseBidObject, 'meta.primaryCatId', primaryCatId);
344
+ deepSetValue(prebidResponseBidObject, 'meta.secondaryCatIds', openRTBResponseBidObject.cat);
345
+ }
346
+ deepSetValue(prebidResponseBidObject, 'meta.id', openRTBResponseBidObject.id);
347
+ deepSetValue(prebidResponseBidObject, 'meta.dsp_id', openRTBResponseBidObject.dsp_id);
348
+ deepSetValue(prebidResponseBidObject, 'meta.adid', openRTBResponseBidObject.adid);
349
+ deepSetValue(prebidResponseBidObject, 'meta.burl', openRTBResponseBidObject.burl);
350
+ deepSetValue(prebidResponseBidObject, 'meta.impid', openRTBResponseBidObject.impid);
351
+ deepSetValue(prebidResponseBidObject, 'meta.cat', openRTBResponseBidObject.cat);
352
+ deepSetValue(prebidResponseBidObject, 'meta.cid', openRTBResponseBidObject.cid);
353
+ }
354
+
355
+ function hasValidMediaType(bidRequest) {
356
+ const supported = hasBannerMediaType(bidRequest) || hasVideoMediaType(bidRequest)
357
+ if (!supported) {
358
+ logError('AIDEM Bid Adapter: media type not supported', { bidder: BIDDER_CODE, code: ERROR_CODES.MEDIA_TYPE_NOT_SUPPORTED });
359
+ }
360
+ return supported
361
+ }
362
+
363
+ function hasBannerMediaType(bidRequest) {
364
+ return !!deepAccess(bidRequest, 'mediaTypes.banner')
365
+ }
366
+
367
+ function hasVideoMediaType(bidRequest) {
368
+ return !!deepAccess(bidRequest, 'mediaTypes.video')
369
+ }
370
+
371
+ function hasValidBannerMediaType(bidRequest) {
372
+ const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes')
373
+ if (!sizes) {
374
+ logError('AIDEM Bid Adapter: media type sizes missing', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
375
+ return false;
376
+ }
377
+ return true
378
+ }
379
+
380
+ function hasValidVideoMediaType(bidRequest) {
381
+ const sizes = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
382
+ if (!sizes) {
383
+ logError('AIDEM Bid Adapter: media type playerSize missing', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
384
+ return false;
385
+ }
386
+ return true
387
+ }
388
+
389
+ function hasValidVideoParameters(bidRequest) {
390
+ let valid = true
391
+ const adUnitsParameters = deepAccess(bidRequest, 'mediaTypes.video');
392
+ const bidderParameter = deepAccess(bidRequest, 'params.video');
393
+ for (let property of REQUIRED_VIDEO_PARAMS) {
394
+ const hasAdUnitParameter = adUnitsParameters.hasOwnProperty(property)
395
+ const hasBidderParameter = bidderParameter && bidderParameter.hasOwnProperty(property)
396
+ if (!hasAdUnitParameter && !hasBidderParameter) {
397
+ logError(`AIDEM Bid Adapter: ${property} is not included in either the adunit or params level`, { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
398
+ valid = false
399
+ }
400
+ }
401
+
402
+ return valid
403
+ }
404
+
405
+ function hasValidParameters(bidRequest) {
406
+ // Assigned from AIDEM to a publisher website
407
+ const siteId = deepAccess(bidRequest, 'params.siteId');
408
+ const publisherId = deepAccess(bidRequest, 'params.publisherId');
409
+
410
+ if (!isStr(siteId)) {
411
+ logError('AIDEM Bid Adapter: siteId must valid string', { bidder: BIDDER_CODE, code: ERROR_CODES.SITE_ID_INVALID_VALUE });
412
+ return false;
413
+ }
414
+
415
+ if (!isStr(publisherId)) {
416
+ logError('AIDEM Bid Adapter: publisherId must valid string', { bidder: BIDDER_CODE, code: ERROR_CODES.PUBLISHER_ID_INVALID_VALUE });
417
+ return false;
418
+ }
419
+
420
+ return true
421
+ }
422
+
423
+ export const spec = {
424
+ code: BIDDER_CODE,
425
+ supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
426
+ isBidRequestValid: function(bidRequest) {
427
+ logInfo('bid: ', bidRequest);
428
+
429
+ // check if request has valid mediaTypes
430
+ if (!hasValidMediaType(bidRequest)) return false
431
+
432
+ // check if request has valid media type parameters at adUnit level
433
+ if (hasBannerMediaType(bidRequest) && !hasValidBannerMediaType(bidRequest)) {
434
+ return false
435
+ }
436
+
437
+ if (hasVideoMediaType(bidRequest) && !hasValidVideoMediaType(bidRequest)) {
438
+ return false
439
+ }
440
+
441
+ if (hasVideoMediaType(bidRequest) && !hasValidVideoParameters(bidRequest)) {
442
+ return false
443
+ }
444
+
445
+ return hasValidParameters(bidRequest)
446
+ },
447
+
448
+ buildRequests: function(validBidRequests, bidderRequest) {
449
+ logInfo('validBidRequests: ', validBidRequests);
450
+ logInfo('bidderRequest: ', bidderRequest);
451
+ const prebidRequest = getPrebidRequestFields(bidderRequest, validBidRequests)
452
+ const payloadString = JSON.stringify(prebidRequest);
453
+
454
+ return {
455
+ method: 'POST',
456
+ url: endpoints.request,
457
+ data: payloadString,
458
+ options: {
459
+ withCredentials: true
460
+ }
461
+ };
462
+ },
463
+
464
+ interpretResponse: function (serverResponse) {
465
+ const bids = [];
466
+ logInfo('serverResponse: ', serverResponse);
467
+ _each(serverResponse.body.bid, function (bidObject) {
468
+ logInfo('bidObject: ', bidObject);
469
+ if (!bidObject.price || !bidObject.adm) {
470
+ return;
471
+ }
472
+ logInfo('CPM OK');
473
+ const bid = getPrebidResponseBidObject(bidObject)
474
+ bids.push(bid);
475
+ });
476
+ return bids;
477
+ },
478
+
479
+ onBidWon: function(bid) {
480
+ // Bidder specific code
481
+ logInfo('onBidWon bid: ', bid);
482
+ const notice = buildWinNotice(bid)
483
+ ajax(endpoints.notice.win, null, JSON.stringify(notice), { method: 'POST', withCredentials: true });
484
+ },
485
+
486
+ onBidderError: function({ bidderRequest }) {
487
+ // Bidder specific code
488
+ const notice = buildErrorNotice(bidderRequest)
489
+ ajax(endpoints.notice.error, null, JSON.stringify(notice), { method: 'POST', withCredentials: true });
490
+ },
491
+ }
492
+ registerBidder(spec);
@@ -0,0 +1,187 @@
1
+ # Overview
2
+
3
+ ```
4
+ name: AIDEM Adapter
5
+ type: Bidder Adapter
6
+ support: prebid@aidem.com
7
+ biddercode: aidem
8
+ ```
9
+
10
+ # Description
11
+ This module connects publishers to AIDEM demand.
12
+
13
+ This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed.
14
+
15
+
16
+ ## Global Bid Params
17
+ | Name | Scope | Description | Example | Type |
18
+ |---------------|----------|---------------------|---------------|----------|
19
+ | `siteId` | required | Unique site ID | `'ABCDEF'` | `String` |
20
+ | `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `String` |
21
+
22
+
23
+ ### Banner Bid Params
24
+ | Name | Scope | Description | Example | Type |
25
+ |------------|----------|--------------------------|---------------------------|---------|
26
+ | `sizes` | required | List of the sizes wanted | `[[300, 250], [300,600]]` | `Array` |
27
+
28
+
29
+ ### Video Bid Params
30
+ | Name | Scope | Description | Example | Type |
31
+ |---------------|----------|-----------------------------------------|-----------------|-----------|
32
+ | `context` | required | One of instream, outstream, adpod | `'instream'` | `String` |
33
+ | `playerSize` | required | Width and height of the player | `'[640, 480]'` | `Array` |
34
+ | `maxduration` | required | Maximum video ad duration, in seconds | `30` | `Integer` |
35
+ | `minduration` | required | Minimum video ad duration, in seconds | `5` | `Integer` |
36
+ | `mimes` | required | List of the content MIME types supported by the player | `["video/mp4"]` | `Array` |
37
+ | `protocols` | required | An array of supported video protocols. At least one supported protocol must be specified, where: `2` = VAST 2.0 `3` = VAST 3.0 `5` = VAST 2.0 wrapper `6` = VAST 3.0 wrapper | `2` | `Array` |
38
+
39
+
40
+ ### Additional Config
41
+ | Name | Scope | Description | Example | Type |
42
+ |---------------------|----------|---------------------------------------------------------|---------|-----------|
43
+ | `coppa` | optional | Child Online Privacy Protection Act | `true` | `Boolean` |
44
+ | `consentManagement` | optional | [Consent Management Object](#consent-management-object) | `{}` | `Object` |
45
+
46
+
47
+ ### Consent Management Object
48
+ | Name | Scope | Description | Example | Type |
49
+ |--------|----------|--------------------------------------------------------------------------------------------------|---------|----------|
50
+ | `gdpr` | optional | GDPR Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagement.html) | `{}` | `Object` |
51
+ | `usp` | optional | USP Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagementUsp.html) | `{}` | `Object` |
52
+
53
+
54
+ ### Example Banner ad unit
55
+ ```javascript
56
+ var adUnits = [{
57
+ code: 'banner-prebid-test-site',
58
+ mediaTypes: {
59
+ banner: {
60
+ sizes: [
61
+ [300, 600],
62
+ [300, 250]
63
+ ]
64
+ }
65
+ },
66
+ bids: [{
67
+ bidder: 'aidem',
68
+ params: {
69
+ siteId: 'prebid-test-site',
70
+ },
71
+ }]
72
+ }];
73
+ ```
74
+
75
+ ### Example Video ad unit
76
+ ```javascript
77
+ var adUnits = [{
78
+ code: 'video-prebid-test-site',
79
+ mediaTypes: {
80
+ video: {
81
+ context: 'instream',
82
+ playerSize: [640, 480],
83
+ maxduration: 30,
84
+ minduration: 5,
85
+ mimes: ["video/mp4"],
86
+ protocols: 2
87
+ }
88
+ },
89
+ bids: [{
90
+ bidder: 'aidem',
91
+ params: {
92
+ siteId: 'prebid-test-site',
93
+ },
94
+ }]
95
+ }];
96
+ ```
97
+
98
+ ### Example GDPR Consent Management
99
+ ```javascript
100
+ var pbjs = pbjs || {};
101
+ pbjs.que = pbjs.que || [];
102
+
103
+ pbjs.que.push(function (){
104
+ pbjs.setConfig({
105
+ consentManagement: {
106
+ gdpr:{
107
+ cmpApi: 'iab'
108
+ }
109
+ }
110
+ });
111
+ })
112
+ ```
113
+
114
+
115
+ ### Example USP Consent Management
116
+ ```javascript
117
+ var pbjs = pbjs || {};
118
+ pbjs.que = pbjs.que || [];
119
+
120
+ pbjs.que.push(function (){
121
+ pbjs.setConfig({
122
+ consentManagement: {
123
+ usp:{
124
+ cmpApi: 'static',
125
+ consentData:{
126
+ getUSPData:{
127
+ uspString: '1YYY'
128
+ }
129
+ }
130
+ }
131
+ }
132
+ });
133
+ })
134
+ ```
135
+
136
+
137
+ ### Setting First Party Data (FPD)
138
+ ```javascript
139
+ var pbjs = pbjs || {};
140
+ pbjs.que = pbjs.que || [];
141
+
142
+ pbjs.que.push(function (){
143
+ pbjs.setConfig({
144
+ ortb2: {
145
+ site: {
146
+ cat: ['IAB2'],
147
+ sectioncat: ['IAB2-2'],
148
+ keywords: 'power tools, drills'
149
+ },
150
+ }
151
+ });
152
+ })
153
+ ```
154
+
155
+ ### Supported Media Types
156
+ | Type | Support |
157
+ |--------|--------------------------------------------------------------------|
158
+ | Banner | Support all [AIDEM Sizes](https://kb.aidem.com/ssp/lists/adsizes/) |
159
+ | Video | Support all [AIDEM Sizes](https://kb.aidem.com/ssp/lists/adsizes/) |
160
+
161
+
162
+ # Setup / Dev Guide
163
+ ```shell
164
+ nvm use
165
+
166
+ npm install
167
+
168
+ gulp build --modules=aidemBidAdapter
169
+
170
+ gulp serve --modules=aidemBidAdapter
171
+
172
+ # Open a chrome browser with no ad blockers enabled, and paste in this URL. The `pbjs_debug=true` is needed if you want to enable `loggerInfo` output on the `console` tab of Chrome Developer Tools.
173
+ http://localhost:9999/integrationExamples/gpt/hello_world.html?pbjs_debug=true
174
+ ```
175
+
176
+ If you need to run the tests suite but do *not* want to have to build the full adapter and serve it, simply run:
177
+ ```shell
178
+ gulp test --file "test/spec/modules/aidemBidAdapter_spec.js"
179
+ ```
180
+
181
+
182
+ For video: gulp serve --modules=aidemBidAdapter,dfpAdServerVideo
183
+
184
+ # FAQs
185
+ ### How do I view AIDEM bid request?
186
+ Navigate to a page where AIDEM is setup to bid. In the network tab,
187
+ search for requests to `zero.aidemsrv.com/bid/request`.
@@ -59,10 +59,12 @@ export function addBrowsiTag(data) {
59
59
 
60
60
  export function sendPageviewEvent(eventType) {
61
61
  if (eventType === 'PAGEVIEW') {
62
- events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, {
63
- vendor: 'browsi',
64
- type: 'pageview',
65
- billingId: generateUUID()
62
+ window.addEventListener('browsi_pageview', () => {
63
+ events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, {
64
+ vendor: 'browsi',
65
+ type: 'pageview',
66
+ billingId: generateUUID()
67
+ })
66
68
  })
67
69
  }
68
70
  }