prebid.js 6.6.0 → 6.10.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 (271) hide show
  1. package/.eslintrc.js +8 -1
  2. package/allowedModules.js +4 -7
  3. package/integrationExamples/gpt/amp/creative.html +11 -33
  4. package/integrationExamples/gpt/{haloRtdProvider_example.html → hadronRtdProvider_example.html} +9 -9
  5. package/integrationExamples/gpt/idImportLibrary_example.html +2 -2
  6. package/integrationExamples/gpt/userId_example.html +2 -2
  7. package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
  8. package/integrationExamples/gpt/x-domain/creative.html +63 -29
  9. package/modules/.submodules.json +3 -0
  10. package/modules/adagioBidAdapter.js +1 -9
  11. package/modules/adagioBidAdapter.md +1 -1
  12. package/modules/adbookpspBidAdapter.js +29 -12
  13. package/modules/adhashBidAdapter.js +4 -4
  14. package/modules/adkernelBidAdapter.js +2 -2
  15. package/modules/adlooxAnalyticsAdapter.js +1 -1
  16. package/modules/adlooxRtdProvider.js +1 -1
  17. package/modules/adnowBidAdapter.js +1 -1
  18. package/modules/adnuntiusRtdProvider.js +96 -0
  19. package/modules/adnuntiusRtdProvider.md +41 -0
  20. package/modules/adomikAnalyticsAdapter.js +2 -2
  21. package/modules/adotBidAdapter.js +1 -1
  22. package/modules/adpod.js +14 -17
  23. package/modules/adrelevantisBidAdapter.js +2 -2
  24. package/modules/adtargetBidAdapter.js +1 -1
  25. package/modules/adtelligentBidAdapter.js +1 -1
  26. package/modules/advangelistsBidAdapter.js +2 -2
  27. package/modules/adxpremiumAnalyticsAdapter.js +1 -1
  28. package/modules/adyoulikeBidAdapter.js +1 -1
  29. package/modules/afpBidAdapter.js +1 -1
  30. package/modules/appnexusBidAdapter.js +16 -4
  31. package/modules/asealBidAdapter.js +58 -0
  32. package/modules/asealBidAdapter.md +52 -0
  33. package/modules/beachfrontBidAdapter.js +2 -2
  34. package/modules/betweenBidAdapter.js +1 -1
  35. package/modules/bidViewability.js +1 -1
  36. package/modules/bluebillywigBidAdapter.js +1 -1
  37. package/modules/brandmetricsRtdProvider.js +168 -0
  38. package/modules/brandmetricsRtdProvider.md +40 -0
  39. package/modules/bridgewellBidAdapter.js +1 -1
  40. package/modules/browsiRtdProvider.js +2 -2
  41. package/modules/cleanmedianetBidAdapter.js +1 -1
  42. package/modules/colossussspBidAdapter.js +12 -8
  43. package/modules/colossussspBidAdapter.md +15 -1
  44. package/modules/compassBidAdapter.js +1 -1
  45. package/modules/connectIdSystem.js +1 -1
  46. package/modules/consentManagement.js +2 -3
  47. package/modules/consumableBidAdapter.md +1 -1
  48. package/modules/conversantBidAdapter.js +7 -0
  49. package/modules/craftBidAdapter.js +2 -2
  50. package/modules/criteoBidAdapter.js +10 -1
  51. package/modules/currency.js +27 -5
  52. package/modules/cwireBidAdapter.js +1 -1
  53. package/modules/dailyhuntBidAdapter.js +1 -1
  54. package/modules/dchain.js +1 -1
  55. package/modules/displayioBidAdapter.js +157 -0
  56. package/modules/displayioBidAdapter.md +148 -0
  57. package/modules/dspxBidAdapter.js +69 -29
  58. package/modules/dspxBidAdapter.md +2 -1
  59. package/modules/e_volutionBidAdapter.js +158 -0
  60. package/modules/emx_digitalBidAdapter.js +2 -2
  61. package/modules/fluctBidAdapter.js +0 -1
  62. package/modules/gamoshiBidAdapter.js +1 -1
  63. package/modules/gdprEnforcement.js +2 -2
  64. package/modules/glomexBidAdapter.js +1 -1
  65. package/modules/gnetBidAdapter.js +3 -3
  66. package/modules/gnetBidAdapter.md +4 -4
  67. package/modules/goldbachBidAdapter.js +2 -2
  68. package/modules/gptPreAuction.js +1 -1
  69. package/modules/gridBidAdapter.js +15 -1
  70. package/modules/gumgumBidAdapter.js +57 -43
  71. package/modules/hadronIdSystem.js +96 -0
  72. package/modules/hadronIdSystem.md +35 -0
  73. package/modules/hadronRtdProvider.js +254 -0
  74. package/modules/hadronRtdProvider.md +126 -0
  75. package/modules/haloIdSystem.md +4 -35
  76. package/modules/haloRtdProvider.md +3 -126
  77. package/modules/hybridBidAdapter.js +1 -1
  78. package/modules/improvedigitalBidAdapter.js +6 -1
  79. package/modules/insticatorBidAdapter.js +1 -1
  80. package/modules/interactiveOffersBidAdapter.js +9 -6
  81. package/modules/intersectionRtdProvider.js +1 -1
  82. package/modules/ixBidAdapter.js +2 -2
  83. package/modules/jwplayerRtdProvider.js +72 -7
  84. package/modules/jwplayerRtdProvider.md +27 -11
  85. package/modules/kargoBidAdapter.js +2 -2
  86. package/modules/livewrappedBidAdapter.js +1 -1
  87. package/modules/lunamediahbBidAdapter.js +32 -4
  88. package/modules/malltvBidAdapter.js +7 -3
  89. package/modules/malltvBidAdapter.md +64 -51
  90. package/modules/mass.js +3 -5
  91. package/modules/mediakeysBidAdapter.js +2 -2
  92. package/modules/medianetAnalyticsAdapter.js +2 -2
  93. package/modules/medianetRtdProvider.js +1 -1
  94. package/modules/mediasquareBidAdapter.js +1 -0
  95. package/modules/nextMillenniumBidAdapter.js +1 -0
  96. package/modules/nextrollBidAdapter.js +1 -1
  97. package/modules/oguryBidAdapter.js +7 -14
  98. package/modules/onetagBidAdapter.js +1 -1
  99. package/modules/openwebBidAdapter.js +1 -1
  100. package/modules/openxAnalyticsAdapter.js +2 -2
  101. package/modules/openxBidAdapter.js +1 -1
  102. package/modules/parrableIdSystem.js +1 -1
  103. package/modules/permutiveRtdProvider.js +1 -1
  104. package/modules/pilotxBidAdapter.js +147 -0
  105. package/modules/pilotxBidAdapter.md +50 -0
  106. package/modules/pixfutureBidAdapter.js +2 -2
  107. package/modules/prebidServerBidAdapter/index.js +63 -41
  108. package/modules/priceFloors.js +15 -14
  109. package/modules/pubmaticBidAdapter.js +1 -1
  110. package/modules/quantcastBidAdapter.js +1 -1
  111. package/modules/reconciliationRtdProvider.js +1 -1
  112. package/modules/richaudienceBidAdapter.js +7 -2
  113. package/modules/riseBidAdapter.js +17 -6
  114. package/modules/roxotAnalyticsAdapter.js +1 -1
  115. package/modules/rtbhouseBidAdapter.js +1 -1
  116. package/modules/rtdModule/index.js +9 -11
  117. package/modules/rubiconAnalyticsAdapter.js +8 -2
  118. package/modules/rubiconBidAdapter.js +1 -1
  119. package/modules/saambaaBidAdapter.js +420 -420
  120. package/modules/seedingAllianceBidAdapter.js +3 -3
  121. package/modules/sharethroughBidAdapter.js +12 -17
  122. package/modules/sigmoidAnalyticsAdapter.js +1 -1
  123. package/modules/sirdataRtdProvider.js +1 -1
  124. package/modules/sizeMappingV2.js +2 -9
  125. package/modules/smarticoBidAdapter.js +1 -1
  126. package/modules/sortableAnalyticsAdapter.js +5 -4
  127. package/modules/sovrnAnalyticsAdapter.js +2 -2
  128. package/modules/sovrnBidAdapter.js +93 -18
  129. package/modules/sovrnBidAdapter.md +80 -2
  130. package/modules/sspBCBidAdapter.js +54 -21
  131. package/modules/synacormediaBidAdapter.js +32 -11
  132. package/modules/targetVideoBidAdapter.js +1 -1
  133. package/modules/telariaBidAdapter.js +22 -29
  134. package/modules/trustpidSystem.js +197 -0
  135. package/modules/trustpidSystem.md +45 -0
  136. package/modules/undertoneBidAdapter.js +17 -1
  137. package/modules/userId/eids.js +16 -1
  138. package/modules/userId/eids.md +10 -2
  139. package/modules/userId/index.js +2 -2
  140. package/modules/userId/userId.md +17 -2
  141. package/modules/ventesBidAdapter.js +1 -1
  142. package/modules/verizonMediaIdSystem.js +1 -1
  143. package/modules/vibrantmediaBidAdapter.js +220 -0
  144. package/modules/vibrantmediaBidAdapter.md +92 -0
  145. package/modules/viewability.js +177 -0
  146. package/modules/viewability.md +87 -0
  147. package/modules/viewdeosDXBidAdapter.js +1 -1
  148. package/modules/voxBidAdapter.js +1 -1
  149. package/modules/waardexBidAdapter.js +1 -1
  150. package/modules/weboramaRtdProvider.js +264 -34
  151. package/modules/weboramaRtdProvider.md +110 -40
  152. package/modules/widespaceBidAdapter.js +2 -2
  153. package/modules/winrBidAdapter.js +7 -7
  154. package/modules/yahoosspBidAdapter.js +3 -1
  155. package/modules/yieldlabBidAdapter.js +1 -1
  156. package/modules/yieldmoBidAdapter.js +2 -2
  157. package/modules/yieldoneBidAdapter.js +6 -0
  158. package/modules/yuktamediaAnalyticsAdapter.js +1 -1
  159. package/package.json +3 -1
  160. package/plugins/poly/arrayFrom.js +3 -0
  161. package/plugins/poly/find.js +3 -0
  162. package/plugins/poly/findIndex.js +3 -0
  163. package/plugins/poly/includes.js +3 -0
  164. package/plugins/poly/package.json +8 -0
  165. package/src/Renderer.js +1 -1
  166. package/src/adRendering.js +38 -0
  167. package/src/adapterManager.js +33 -28
  168. package/src/adapters/bidderFactory.js +13 -11
  169. package/src/adloader.js +3 -2
  170. package/src/auction.js +140 -117
  171. package/src/auctionIndex.js +85 -0
  172. package/src/auctionManager.js +4 -1
  173. package/src/bidderSettings.js +69 -0
  174. package/src/bidfactory.js +18 -6
  175. package/src/config.js +3 -4
  176. package/src/cpmBucketManager.js +1 -1
  177. package/src/native.js +30 -22
  178. package/src/prebid.js +4 -20
  179. package/src/secureCreatives.js +133 -49
  180. package/src/sizeMapping.js +1 -1
  181. package/src/storageManager.js +1 -1
  182. package/src/targeting.js +13 -4
  183. package/src/userSync.js +1 -1
  184. package/src/utils.js +16 -19
  185. package/src/video.js +11 -12
  186. package/src/videoCache.js +10 -9
  187. package/test/fixtures/fixtures.js +2 -1
  188. package/test/helpers/indexStub.js +28 -0
  189. package/test/helpers/syncPromise.js +71 -0
  190. package/test/spec/auctionmanager_spec.js +269 -90
  191. package/test/spec/config_spec.js +24 -1
  192. package/test/spec/e2e/longform/basic_w_bidderSettings.spec.js +1 -1
  193. package/test/spec/e2e/longform/basic_w_custom_adserver_translation.spec.js +1 -1
  194. package/test/spec/e2e/longform/basic_w_priceGran.spec.js +1 -1
  195. package/test/spec/e2e/longform/basic_w_requireExactDuration.spec.js +1 -1
  196. package/test/spec/e2e/longform/basic_wo_brandCategoryExclusion.spec.js +1 -1
  197. package/test/spec/e2e/longform/basic_wo_requireExactDuration.spec.js +1 -1
  198. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  199. package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
  200. package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
  201. package/test/spec/modules/adnuntiusRtdProvider_spec.js +145 -0
  202. package/test/spec/modules/adpod_spec.js +91 -156
  203. package/test/spec/modules/afpBidAdapter_spec.js +1 -1
  204. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  205. package/test/spec/modules/asealBidAdapter_spec.js +144 -0
  206. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  207. package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
  208. package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
  209. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  210. package/test/spec/modules/currency_spec.js +36 -15
  211. package/test/spec/modules/deepintentDpesIdsystem_spec.js +1 -1
  212. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  213. package/test/spec/modules/dspxBidAdapter_spec.js +20 -15
  214. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  215. package/test/spec/modules/eids_spec.js +2 -2
  216. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +1 -1
  217. package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +1 -1
  218. package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
  219. package/test/spec/modules/gridBidAdapter_spec.js +18 -0
  220. package/test/spec/modules/gumgumBidAdapter_spec.js +49 -3
  221. package/test/spec/modules/hadronIdSystem_spec.js +57 -0
  222. package/test/spec/modules/hadronRtdProvider_spec.js +762 -0
  223. package/test/spec/modules/idxIdSystem_spec.js +1 -1
  224. package/test/spec/modules/improvedigitalBidAdapter_spec.js +19 -0
  225. package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
  226. package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
  227. package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
  228. package/test/spec/modules/mass_spec.js +2 -14
  229. package/test/spec/modules/mediakeysBidAdapter_spec.js +1 -1
  230. package/test/spec/modules/multibid_spec.js +1 -1
  231. package/test/spec/modules/oguryBidAdapter_spec.js +63 -5
  232. package/test/spec/modules/onetagBidAdapter_spec.js +1 -1
  233. package/test/spec/modules/openxAnalyticsAdapter_spec.js +1 -1
  234. package/test/spec/modules/parrableIdSystem_spec.js +1 -1
  235. package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
  236. package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -6
  237. package/test/spec/modules/priceFloors_spec.js +37 -24
  238. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  239. package/test/spec/modules/realTimeDataModule_spec.js +51 -2
  240. package/test/spec/modules/riseBidAdapter_spec.js +30 -4
  241. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +61 -1
  242. package/test/spec/modules/rubiconBidAdapter_spec.js +1 -1
  243. package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
  244. package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
  245. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  246. package/test/spec/modules/sspBCBidAdapter_spec.js +7 -7
  247. package/test/spec/modules/stroeerCoreBidAdapter_spec.js +1 -1
  248. package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
  249. package/test/spec/modules/telariaBidAdapter_spec.js +1 -3
  250. package/test/spec/modules/trustpidSystem_spec.js +232 -0
  251. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  252. package/test/spec/modules/userId_spec.js +40 -40
  253. package/test/spec/modules/vibrantmediaBidAdapter_spec.js +1237 -0
  254. package/test/spec/modules/viewability_spec.js +280 -0
  255. package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
  256. package/test/spec/modules/widespaceBidAdapter_spec.js +1 -1
  257. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  258. package/test/spec/modules/yieldoneBidAdapter_spec.js +33 -0
  259. package/test/spec/modules/zeotapIdPlusIdSystem_spec.js +1 -1
  260. package/test/spec/native_spec.js +62 -40
  261. package/test/spec/sizeMapping_spec.js +1 -1
  262. package/test/spec/unit/core/adapterManager_spec.js +24 -2
  263. package/test/spec/unit/core/auctionIndex_spec.js +129 -0
  264. package/test/spec/unit/core/bidderFactory_spec.js +65 -12
  265. package/test/spec/unit/core/bidderSettings_spec.js +123 -0
  266. package/test/spec/unit/core/targeting_spec.js +93 -0
  267. package/test/spec/unit/pbjs_api_spec.js +81 -43
  268. package/test/spec/unit/secureCreatives_spec.js +143 -24
  269. package/test/spec/videoCache_spec.js +18 -19
  270. package/test/spec/video_spec.js +51 -61
  271. package/webpack.conf.js +1 -1
@@ -1,420 +1,420 @@
1
- import { deepAccess, isFn, generateUUID, parseUrl, isEmpty, parseSizesInput } from '../src/utils.js';
2
- import { config } from '../src/config.js';
3
- import { registerBidder } from '../src/adapters/bidderFactory.js';
4
- import { VIDEO, BANNER } from '../src/mediaTypes.js';
5
- import find from 'core-js-pure/features/array/find.js';
6
- import includes from 'core-js-pure/features/array/includes.js';
7
-
8
- const ADAPTER_VERSION = '1.0';
9
- const BIDDER_CODE = 'saambaa';
10
-
11
- export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
12
- export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
13
- export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js';
14
- export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip', 'playerSize', 'context'];
15
- export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
16
-
17
- let pubid = '';
18
-
19
- export const spec = {
20
- code: BIDDER_CODE,
21
- supportedMediaTypes: [BANNER, VIDEO],
22
-
23
- isBidRequestValid(bidRequest) {
24
- if (typeof bidRequest != 'undefined') {
25
- if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { return false; }
26
- if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { return false; }
27
- return true;
28
- } else { return false; }
29
- },
30
-
31
- buildRequests(bids, bidderRequest) {
32
- let requests = [];
33
- let videoBids = bids.filter(bid => isVideoBidValid(bid));
34
- let bannerBids = bids.filter(bid => isBannerBidValid(bid));
35
- videoBids.forEach(bid => {
36
- pubid = getVideoBidParam(bid, 'pubid');
37
- requests.push({
38
- method: 'POST',
39
- url: VIDEO_ENDPOINT + pubid,
40
- data: createVideoRequestData(bid, bidderRequest),
41
- bidRequest: bid
42
- });
43
- });
44
-
45
- bannerBids.forEach(bid => {
46
- pubid = getBannerBidParam(bid, 'pubid');
47
-
48
- requests.push({
49
- method: 'POST',
50
- url: BANNER_ENDPOINT + pubid,
51
- data: createBannerRequestData(bid, bidderRequest),
52
- bidRequest: bid
53
- });
54
- });
55
- return requests;
56
- },
57
-
58
- interpretResponse(serverResponse, {bidRequest}) {
59
- let response = serverResponse.body;
60
- if (response !== null && isEmpty(response) == false) {
61
- if (isVideoBid(bidRequest)) {
62
- let bidResponse = {
63
- requestId: response.id,
64
- bidderCode: BIDDER_CODE,
65
- cpm: response.seatbid[0].bid[0].price,
66
- width: response.seatbid[0].bid[0].w,
67
- height: response.seatbid[0].bid[0].h,
68
- ttl: response.seatbid[0].bid[0].ttl || 60,
69
- creativeId: response.seatbid[0].bid[0].crid,
70
- currency: response.cur,
71
- meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
72
- mediaType: VIDEO,
73
- netRevenue: true
74
- }
75
-
76
- if (response.seatbid[0].bid[0].adm) {
77
- bidResponse.vastXml = response.seatbid[0].bid[0].adm;
78
- bidResponse.adResponse = {
79
- content: response.seatbid[0].bid[0].adm
80
- };
81
- } else {
82
- bidResponse.vastUrl = response.seatbid[0].bid[0].nurl;
83
- }
84
-
85
- return bidResponse;
86
- } else {
87
- return {
88
- requestId: response.id,
89
- bidderCode: BIDDER_CODE,
90
- cpm: response.seatbid[0].bid[0].price,
91
- width: response.seatbid[0].bid[0].w,
92
- height: response.seatbid[0].bid[0].h,
93
- ad: response.seatbid[0].bid[0].adm,
94
- ttl: response.seatbid[0].bid[0].ttl || 60,
95
- creativeId: response.seatbid[0].bid[0].crid,
96
- currency: response.cur,
97
- meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
98
- mediaType: BANNER,
99
- netRevenue: true
100
- }
101
- }
102
- }
103
- }
104
- };
105
-
106
- function isBannerBid(bid) {
107
- return deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
108
- }
109
-
110
- function isVideoBid(bid) {
111
- return deepAccess(bid, 'mediaTypes.video');
112
- }
113
-
114
- function getBannerBidFloor(bid) {
115
- let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'banner', size: '*' }) : {};
116
- return floorInfo.floor || getBannerBidParam(bid, 'bidfloor');
117
- }
118
-
119
- function getVideoBidFloor(bid) {
120
- let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'video', size: '*' }) : {};
121
- return floorInfo.floor || getVideoBidParam(bid, 'bidfloor');
122
- }
123
-
124
- function isVideoBidValid(bid) {
125
- return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement');
126
- }
127
-
128
- function isBannerBidValid(bid) {
129
- return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement');
130
- }
131
-
132
- function getVideoBidParam(bid, key) {
133
- return deepAccess(bid, 'params.video.' + key) || deepAccess(bid, 'params.' + key);
134
- }
135
-
136
- function getBannerBidParam(bid, key) {
137
- return deepAccess(bid, 'params.banner.' + key) || deepAccess(bid, 'params.' + key);
138
- }
139
-
140
- function isMobile() {
141
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
142
- }
143
-
144
- function isConnectedTV() {
145
- return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
146
- }
147
-
148
- function getDoNotTrack() {
149
- return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes';
150
- }
151
-
152
- function findAndFillParam(o, key, value) {
153
- try {
154
- if (typeof value === 'function') {
155
- o[key] = value();
156
- } else {
157
- o[key] = value;
158
- }
159
- } catch (ex) {}
160
- }
161
-
162
- function getOsVersion() {
163
- let clientStrings = [
164
- { s: 'Android', r: /Android/ },
165
- { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
166
- { s: 'Mac OS X', r: /Mac OS X/ },
167
- { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
168
- { s: 'Linux', r: /(Linux|X11)/ },
169
- { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
170
- { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
171
- { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
172
- { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
173
- { s: 'Windows Vista', r: /Windows NT 6.0/ },
174
- { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
175
- { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
176
- { s: 'UNIX', r: /UNIX/ },
177
- { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
178
- ];
179
- let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent));
180
- return cs ? cs.s : 'unknown';
181
- }
182
-
183
- function getFirstSize(sizes) {
184
- return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined };
185
- }
186
-
187
- function parseSizes(sizes) {
188
- return parseSizesInput(sizes).map(size => {
189
- let [ width, height ] = size.split('x');
190
- return {
191
- w: parseInt(width, 10) || undefined,
192
- h: parseInt(height, 10) || undefined
193
- };
194
- });
195
- }
196
-
197
- function getVideoSizes(bid) {
198
- return parseSizes(deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
199
- }
200
-
201
- function getBannerSizes(bid) {
202
- return parseSizes(deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
203
- }
204
-
205
- function getTopWindowReferrer() {
206
- try {
207
- return window.top.document.referrer;
208
- } catch (e) {
209
- return '';
210
- }
211
- }
212
-
213
- function getVideoTargetingParams(bid) {
214
- const result = {};
215
- const excludeProps = ['playerSize', 'context', 'w', 'h'];
216
- Object.keys(Object(bid.mediaTypes.video))
217
- .filter(key => !includes(excludeProps, key))
218
- .forEach(key => {
219
- result[ key ] = bid.mediaTypes.video[ key ];
220
- });
221
- Object.keys(Object(bid.params.video))
222
- .filter(key => includes(VIDEO_TARGETING, key))
223
- .forEach(key => {
224
- result[ key ] = bid.params.video[ key ];
225
- });
226
- return result;
227
- }
228
-
229
- function createVideoRequestData(bid, bidderRequest) {
230
- let topLocation = getTopWindowLocation(bidderRequest);
231
- let topReferrer = getTopWindowReferrer();
232
-
233
- // if size is explicitly given via adapter params
234
- let paramSize = getVideoBidParam(bid, 'size');
235
- let sizes = [];
236
- let coppa = config.getConfig('coppa');
237
-
238
- if (typeof paramSize !== 'undefined' && paramSize != '') {
239
- sizes = parseSizes(paramSize);
240
- } else {
241
- sizes = getVideoSizes(bid);
242
- }
243
- const firstSize = getFirstSize(sizes);
244
- let floor = (getVideoBidFloor(bid) == null || typeof getVideoBidFloor(bid) == 'undefined') ? 0.5 : getVideoBidFloor(bid);
245
- let video = getVideoTargetingParams(bid);
246
- const o = {
247
- 'device': {
248
- 'langauge': (global.navigator.language).split('-')[0],
249
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
250
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
251
- 'js': 1,
252
- 'os': getOsVersion()
253
- },
254
- 'at': 2,
255
- 'site': {},
256
- 'tmax': 3000,
257
- 'cur': ['USD'],
258
- 'id': bid.bidId,
259
- 'imp': [],
260
- 'regs': {
261
- 'ext': {
262
- }
263
- },
264
- 'user': {
265
- 'ext': {
266
- }
267
- }
268
- };
269
-
270
- o.site['page'] = topLocation.href;
271
- o.site['domain'] = topLocation.hostname;
272
- o.site['search'] = topLocation.search;
273
- o.site['domain'] = topLocation.hostname;
274
- o.site['ref'] = topReferrer;
275
- o.site['mobile'] = isMobile() ? 1 : 0;
276
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
277
-
278
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
279
-
280
- findAndFillParam(o.site, 'name', function() {
281
- return global.top.document.title;
282
- });
283
-
284
- findAndFillParam(o.device, 'h', function() {
285
- return global.screen.height;
286
- });
287
- findAndFillParam(o.device, 'w', function() {
288
- return global.screen.width;
289
- });
290
-
291
- let placement = getVideoBidParam(bid, 'placement');
292
-
293
- for (let j = 0; j < sizes.length; j++) {
294
- o.imp.push({
295
- 'id': '' + j,
296
- 'displaymanager': '' + BIDDER_CODE,
297
- 'displaymanagerver': '' + ADAPTER_VERSION,
298
- 'tagId': placement,
299
- 'bidfloor': floor,
300
- 'bidfloorcur': 'USD',
301
- 'secure': secure,
302
- 'video': Object.assign({
303
- 'id': generateUUID(),
304
- 'pos': 0,
305
- 'w': firstSize.w,
306
- 'h': firstSize.h,
307
- 'mimes': DEFAULT_MIMES
308
- }, video)
309
-
310
- });
311
- }
312
- if (coppa) {
313
- o.regs.ext = {'coppa': 1};
314
- }
315
- if (bidderRequest && bidderRequest.gdprConsent) {
316
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
317
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
318
- o.user.ext = {'consent': consentString};
319
- }
320
-
321
- return o;
322
- }
323
-
324
- function getTopWindowLocation(bidderRequest) {
325
- let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer;
326
- return parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true });
327
- }
328
-
329
- function createBannerRequestData(bid, bidderRequest) {
330
- let topLocation = getTopWindowLocation(bidderRequest);
331
- let topReferrer = getTopWindowReferrer();
332
-
333
- // if size is explicitly given via adapter params
334
-
335
- let paramSize = getBannerBidParam(bid, 'size');
336
- let sizes = [];
337
- let coppa = config.getConfig('coppa');
338
- if (typeof paramSize !== 'undefined' && paramSize != '') {
339
- sizes = parseSizes(paramSize);
340
- } else {
341
- sizes = getBannerSizes(bid);
342
- }
343
-
344
- let floor = (getBannerBidFloor(bid) == null || typeof getBannerBidFloor(bid) == 'undefined') ? 0.1 : getBannerBidFloor(bid);
345
- const o = {
346
- 'device': {
347
- 'langauge': (global.navigator.language).split('-')[0],
348
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
349
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
350
- 'js': 1
351
- },
352
- 'at': 2,
353
- 'site': {},
354
- 'tmax': 3000,
355
- 'cur': ['USD'],
356
- 'id': bid.bidId,
357
- 'imp': [],
358
- 'regs': {
359
- 'ext': {
360
- }
361
- },
362
- 'user': {
363
- 'ext': {
364
- }
365
- }
366
- };
367
-
368
- o.site['page'] = topLocation.href;
369
- o.site['domain'] = topLocation.hostname;
370
- o.site['search'] = topLocation.search;
371
- o.site['domain'] = topLocation.hostname;
372
- o.site['ref'] = topReferrer;
373
- o.site['mobile'] = isMobile() ? 1 : 0;
374
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
375
-
376
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
377
-
378
- findAndFillParam(o.site, 'name', function() {
379
- return global.top.document.title;
380
- });
381
-
382
- findAndFillParam(o.device, 'h', function() {
383
- return global.screen.height;
384
- });
385
- findAndFillParam(o.device, 'w', function() {
386
- return global.screen.width;
387
- });
388
-
389
- let placement = getBannerBidParam(bid, 'placement');
390
- for (let j = 0; j < sizes.length; j++) {
391
- let size = sizes[j];
392
-
393
- o.imp.push({
394
- 'id': '' + j,
395
- 'displaymanager': '' + BIDDER_CODE,
396
- 'displaymanagerver': '' + ADAPTER_VERSION,
397
- 'tagId': placement,
398
- 'bidfloor': floor,
399
- 'bidfloorcur': 'USD',
400
- 'secure': secure,
401
- 'banner': {
402
- 'id': generateUUID(),
403
- 'pos': 0,
404
- 'w': size['w'],
405
- 'h': size['h']
406
- }
407
- });
408
- }
409
- if (coppa) {
410
- o.regs.ext = {'coppa': 1};
411
- }
412
- if (bidderRequest && bidderRequest.gdprConsent) {
413
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
414
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
415
- o.user.ext = {'consent': consentString};
416
- }
417
-
418
- return o;
419
- }
420
- registerBidder(spec);
1
+ import { deepAccess, isFn, generateUUID, parseUrl, isEmpty, parseSizesInput } from '../src/utils.js';
2
+ import { config } from '../src/config.js';
3
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
4
+ import { VIDEO, BANNER } from '../src/mediaTypes.js';
5
+ import find from 'prebidjs-polyfill/find.js';
6
+ import includes from 'prebidjs-polyfill/includes.js';
7
+
8
+ const ADAPTER_VERSION = '1.0';
9
+ const BIDDER_CODE = 'saambaa';
10
+
11
+ export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
12
+ export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
13
+ export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js';
14
+ export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip', 'playerSize', 'context'];
15
+ export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
16
+
17
+ let pubid = '';
18
+
19
+ export const spec = {
20
+ code: BIDDER_CODE,
21
+ supportedMediaTypes: [BANNER, VIDEO],
22
+
23
+ isBidRequestValid(bidRequest) {
24
+ if (typeof bidRequest != 'undefined') {
25
+ if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { return false; }
26
+ if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { return false; }
27
+ return true;
28
+ } else { return false; }
29
+ },
30
+
31
+ buildRequests(bids, bidderRequest) {
32
+ let requests = [];
33
+ let videoBids = bids.filter(bid => isVideoBidValid(bid));
34
+ let bannerBids = bids.filter(bid => isBannerBidValid(bid));
35
+ videoBids.forEach(bid => {
36
+ pubid = getVideoBidParam(bid, 'pubid');
37
+ requests.push({
38
+ method: 'POST',
39
+ url: VIDEO_ENDPOINT + pubid,
40
+ data: createVideoRequestData(bid, bidderRequest),
41
+ bidRequest: bid
42
+ });
43
+ });
44
+
45
+ bannerBids.forEach(bid => {
46
+ pubid = getBannerBidParam(bid, 'pubid');
47
+
48
+ requests.push({
49
+ method: 'POST',
50
+ url: BANNER_ENDPOINT + pubid,
51
+ data: createBannerRequestData(bid, bidderRequest),
52
+ bidRequest: bid
53
+ });
54
+ });
55
+ return requests;
56
+ },
57
+
58
+ interpretResponse(serverResponse, {bidRequest}) {
59
+ let response = serverResponse.body;
60
+ if (response !== null && isEmpty(response) == false) {
61
+ if (isVideoBid(bidRequest)) {
62
+ let bidResponse = {
63
+ requestId: response.id,
64
+ bidderCode: BIDDER_CODE,
65
+ cpm: response.seatbid[0].bid[0].price,
66
+ width: response.seatbid[0].bid[0].w,
67
+ height: response.seatbid[0].bid[0].h,
68
+ ttl: response.seatbid[0].bid[0].ttl || 60,
69
+ creativeId: response.seatbid[0].bid[0].crid,
70
+ currency: response.cur,
71
+ meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
72
+ mediaType: VIDEO,
73
+ netRevenue: true
74
+ }
75
+
76
+ if (response.seatbid[0].bid[0].adm) {
77
+ bidResponse.vastXml = response.seatbid[0].bid[0].adm;
78
+ bidResponse.adResponse = {
79
+ content: response.seatbid[0].bid[0].adm
80
+ };
81
+ } else {
82
+ bidResponse.vastUrl = response.seatbid[0].bid[0].nurl;
83
+ }
84
+
85
+ return bidResponse;
86
+ } else {
87
+ return {
88
+ requestId: response.id,
89
+ bidderCode: BIDDER_CODE,
90
+ cpm: response.seatbid[0].bid[0].price,
91
+ width: response.seatbid[0].bid[0].w,
92
+ height: response.seatbid[0].bid[0].h,
93
+ ad: response.seatbid[0].bid[0].adm,
94
+ ttl: response.seatbid[0].bid[0].ttl || 60,
95
+ creativeId: response.seatbid[0].bid[0].crid,
96
+ currency: response.cur,
97
+ meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
98
+ mediaType: BANNER,
99
+ netRevenue: true
100
+ }
101
+ }
102
+ }
103
+ }
104
+ };
105
+
106
+ function isBannerBid(bid) {
107
+ return deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
108
+ }
109
+
110
+ function isVideoBid(bid) {
111
+ return deepAccess(bid, 'mediaTypes.video');
112
+ }
113
+
114
+ function getBannerBidFloor(bid) {
115
+ let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'banner', size: '*' }) : {};
116
+ return floorInfo.floor || getBannerBidParam(bid, 'bidfloor');
117
+ }
118
+
119
+ function getVideoBidFloor(bid) {
120
+ let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'video', size: '*' }) : {};
121
+ return floorInfo.floor || getVideoBidParam(bid, 'bidfloor');
122
+ }
123
+
124
+ function isVideoBidValid(bid) {
125
+ return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement');
126
+ }
127
+
128
+ function isBannerBidValid(bid) {
129
+ return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement');
130
+ }
131
+
132
+ function getVideoBidParam(bid, key) {
133
+ return deepAccess(bid, 'params.video.' + key) || deepAccess(bid, 'params.' + key);
134
+ }
135
+
136
+ function getBannerBidParam(bid, key) {
137
+ return deepAccess(bid, 'params.banner.' + key) || deepAccess(bid, 'params.' + key);
138
+ }
139
+
140
+ function isMobile() {
141
+ return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
142
+ }
143
+
144
+ function isConnectedTV() {
145
+ return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
146
+ }
147
+
148
+ function getDoNotTrack() {
149
+ return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes';
150
+ }
151
+
152
+ function findAndFillParam(o, key, value) {
153
+ try {
154
+ if (typeof value === 'function') {
155
+ o[key] = value();
156
+ } else {
157
+ o[key] = value;
158
+ }
159
+ } catch (ex) {}
160
+ }
161
+
162
+ function getOsVersion() {
163
+ let clientStrings = [
164
+ { s: 'Android', r: /Android/ },
165
+ { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
166
+ { s: 'Mac OS X', r: /Mac OS X/ },
167
+ { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
168
+ { s: 'Linux', r: /(Linux|X11)/ },
169
+ { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
170
+ { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
171
+ { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
172
+ { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
173
+ { s: 'Windows Vista', r: /Windows NT 6.0/ },
174
+ { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
175
+ { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
176
+ { s: 'UNIX', r: /UNIX/ },
177
+ { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
178
+ ];
179
+ let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent));
180
+ return cs ? cs.s : 'unknown';
181
+ }
182
+
183
+ function getFirstSize(sizes) {
184
+ return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined };
185
+ }
186
+
187
+ function parseSizes(sizes) {
188
+ return parseSizesInput(sizes).map(size => {
189
+ let [ width, height ] = size.split('x');
190
+ return {
191
+ w: parseInt(width, 10) || undefined,
192
+ h: parseInt(height, 10) || undefined
193
+ };
194
+ });
195
+ }
196
+
197
+ function getVideoSizes(bid) {
198
+ return parseSizes(deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
199
+ }
200
+
201
+ function getBannerSizes(bid) {
202
+ return parseSizes(deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
203
+ }
204
+
205
+ function getTopWindowReferrer() {
206
+ try {
207
+ return window.top.document.referrer;
208
+ } catch (e) {
209
+ return '';
210
+ }
211
+ }
212
+
213
+ function getVideoTargetingParams(bid) {
214
+ const result = {};
215
+ const excludeProps = ['playerSize', 'context', 'w', 'h'];
216
+ Object.keys(Object(bid.mediaTypes.video))
217
+ .filter(key => !includes(excludeProps, key))
218
+ .forEach(key => {
219
+ result[ key ] = bid.mediaTypes.video[ key ];
220
+ });
221
+ Object.keys(Object(bid.params.video))
222
+ .filter(key => includes(VIDEO_TARGETING, key))
223
+ .forEach(key => {
224
+ result[ key ] = bid.params.video[ key ];
225
+ });
226
+ return result;
227
+ }
228
+
229
+ function createVideoRequestData(bid, bidderRequest) {
230
+ let topLocation = getTopWindowLocation(bidderRequest);
231
+ let topReferrer = getTopWindowReferrer();
232
+
233
+ // if size is explicitly given via adapter params
234
+ let paramSize = getVideoBidParam(bid, 'size');
235
+ let sizes = [];
236
+ let coppa = config.getConfig('coppa');
237
+
238
+ if (typeof paramSize !== 'undefined' && paramSize != '') {
239
+ sizes = parseSizes(paramSize);
240
+ } else {
241
+ sizes = getVideoSizes(bid);
242
+ }
243
+ const firstSize = getFirstSize(sizes);
244
+ let floor = (getVideoBidFloor(bid) == null || typeof getVideoBidFloor(bid) == 'undefined') ? 0.5 : getVideoBidFloor(bid);
245
+ let video = getVideoTargetingParams(bid);
246
+ const o = {
247
+ 'device': {
248
+ 'langauge': (global.navigator.language).split('-')[0],
249
+ 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
250
+ 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
251
+ 'js': 1,
252
+ 'os': getOsVersion()
253
+ },
254
+ 'at': 2,
255
+ 'site': {},
256
+ 'tmax': 3000,
257
+ 'cur': ['USD'],
258
+ 'id': bid.bidId,
259
+ 'imp': [],
260
+ 'regs': {
261
+ 'ext': {
262
+ }
263
+ },
264
+ 'user': {
265
+ 'ext': {
266
+ }
267
+ }
268
+ };
269
+
270
+ o.site['page'] = topLocation.href;
271
+ o.site['domain'] = topLocation.hostname;
272
+ o.site['search'] = topLocation.search;
273
+ o.site['domain'] = topLocation.hostname;
274
+ o.site['ref'] = topReferrer;
275
+ o.site['mobile'] = isMobile() ? 1 : 0;
276
+ const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
277
+
278
+ o.device['dnt'] = getDoNotTrack() ? 1 : 0;
279
+
280
+ findAndFillParam(o.site, 'name', function() {
281
+ return global.top.document.title;
282
+ });
283
+
284
+ findAndFillParam(o.device, 'h', function() {
285
+ return global.screen.height;
286
+ });
287
+ findAndFillParam(o.device, 'w', function() {
288
+ return global.screen.width;
289
+ });
290
+
291
+ let placement = getVideoBidParam(bid, 'placement');
292
+
293
+ for (let j = 0; j < sizes.length; j++) {
294
+ o.imp.push({
295
+ 'id': '' + j,
296
+ 'displaymanager': '' + BIDDER_CODE,
297
+ 'displaymanagerver': '' + ADAPTER_VERSION,
298
+ 'tagId': placement,
299
+ 'bidfloor': floor,
300
+ 'bidfloorcur': 'USD',
301
+ 'secure': secure,
302
+ 'video': Object.assign({
303
+ 'id': generateUUID(),
304
+ 'pos': 0,
305
+ 'w': firstSize.w,
306
+ 'h': firstSize.h,
307
+ 'mimes': DEFAULT_MIMES
308
+ }, video)
309
+
310
+ });
311
+ }
312
+ if (coppa) {
313
+ o.regs.ext = {'coppa': 1};
314
+ }
315
+ if (bidderRequest && bidderRequest.gdprConsent) {
316
+ let { gdprApplies, consentString } = bidderRequest.gdprConsent;
317
+ o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
318
+ o.user.ext = {'consent': consentString};
319
+ }
320
+
321
+ return o;
322
+ }
323
+
324
+ function getTopWindowLocation(bidderRequest) {
325
+ let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer;
326
+ return parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true });
327
+ }
328
+
329
+ function createBannerRequestData(bid, bidderRequest) {
330
+ let topLocation = getTopWindowLocation(bidderRequest);
331
+ let topReferrer = getTopWindowReferrer();
332
+
333
+ // if size is explicitly given via adapter params
334
+
335
+ let paramSize = getBannerBidParam(bid, 'size');
336
+ let sizes = [];
337
+ let coppa = config.getConfig('coppa');
338
+ if (typeof paramSize !== 'undefined' && paramSize != '') {
339
+ sizes = parseSizes(paramSize);
340
+ } else {
341
+ sizes = getBannerSizes(bid);
342
+ }
343
+
344
+ let floor = (getBannerBidFloor(bid) == null || typeof getBannerBidFloor(bid) == 'undefined') ? 0.1 : getBannerBidFloor(bid);
345
+ const o = {
346
+ 'device': {
347
+ 'langauge': (global.navigator.language).split('-')[0],
348
+ 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
349
+ 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
350
+ 'js': 1
351
+ },
352
+ 'at': 2,
353
+ 'site': {},
354
+ 'tmax': 3000,
355
+ 'cur': ['USD'],
356
+ 'id': bid.bidId,
357
+ 'imp': [],
358
+ 'regs': {
359
+ 'ext': {
360
+ }
361
+ },
362
+ 'user': {
363
+ 'ext': {
364
+ }
365
+ }
366
+ };
367
+
368
+ o.site['page'] = topLocation.href;
369
+ o.site['domain'] = topLocation.hostname;
370
+ o.site['search'] = topLocation.search;
371
+ o.site['domain'] = topLocation.hostname;
372
+ o.site['ref'] = topReferrer;
373
+ o.site['mobile'] = isMobile() ? 1 : 0;
374
+ const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
375
+
376
+ o.device['dnt'] = getDoNotTrack() ? 1 : 0;
377
+
378
+ findAndFillParam(o.site, 'name', function() {
379
+ return global.top.document.title;
380
+ });
381
+
382
+ findAndFillParam(o.device, 'h', function() {
383
+ return global.screen.height;
384
+ });
385
+ findAndFillParam(o.device, 'w', function() {
386
+ return global.screen.width;
387
+ });
388
+
389
+ let placement = getBannerBidParam(bid, 'placement');
390
+ for (let j = 0; j < sizes.length; j++) {
391
+ let size = sizes[j];
392
+
393
+ o.imp.push({
394
+ 'id': '' + j,
395
+ 'displaymanager': '' + BIDDER_CODE,
396
+ 'displaymanagerver': '' + ADAPTER_VERSION,
397
+ 'tagId': placement,
398
+ 'bidfloor': floor,
399
+ 'bidfloorcur': 'USD',
400
+ 'secure': secure,
401
+ 'banner': {
402
+ 'id': generateUUID(),
403
+ 'pos': 0,
404
+ 'w': size['w'],
405
+ 'h': size['h']
406
+ }
407
+ });
408
+ }
409
+ if (coppa) {
410
+ o.regs.ext = {'coppa': 1};
411
+ }
412
+ if (bidderRequest && bidderRequest.gdprConsent) {
413
+ let { gdprApplies, consentString } = bidderRequest.gdprConsent;
414
+ o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
415
+ o.user.ext = {'consent': consentString};
416
+ }
417
+
418
+ return o;
419
+ }
420
+ registerBidder(spec);