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,14 +1,14 @@
1
1
  # Overview
2
2
 
3
3
  ```
4
- Module Name: Gnet Bidder Adapter
4
+ Module Name: Gnet RTB Bidder Adapter
5
5
  Module Type: Bidder Adapter
6
- Maintainer: roberto.wu@grumft.com
6
+ Maintainer: bruno.bonanho@grumft.com
7
7
  ```
8
8
 
9
9
  # Description
10
10
 
11
- Connect to Gnet Project exchange for bids.
11
+ Connect to Gnet RTB exchange for bids.
12
12
 
13
13
  # Test Parameters
14
14
  ```
@@ -24,7 +24,7 @@ Connect to Gnet Project exchange for bids.
24
24
  {
25
25
  bidder: 'gnet',
26
26
  params: {
27
- websiteId: '4'
27
+ websiteId: '1', adunitId: '1'
28
28
  }
29
29
  }
30
30
  ]
@@ -27,8 +27,8 @@ import { config } from '../src/config.js';
27
27
  import { registerBidder, getIabSubCategory } from '../src/adapters/bidderFactory.js';
28
28
  import { BANNER, NATIVE, VIDEO, ADPOD } from '../src/mediaTypes.js';
29
29
  import { auctionManager } from '../src/auctionManager.js';
30
- import find from 'core-js-pure/features/array/find.js';
31
- import includes from 'core-js-pure/features/array/includes.js';
30
+ import find from 'prebidjs-polyfill/find.js';
31
+ import includes from 'prebidjs-polyfill/includes.js';
32
32
  import { OUTSTREAM, INSTREAM } from '../src/video.js';
33
33
 
34
34
  const BIDDER_CODE = 'goldbach';
@@ -1,7 +1,7 @@
1
1
  import { isGptPubadsDefined, isAdUnitCodeMatchingSlot, deepAccess, pick, logInfo } from '../src/utils.js';
2
2
  import { config } from '../src/config.js';
3
3
  import { getHook } from '../src/hook.js';
4
- import find from 'core-js-pure/features/array/find.js';
4
+ import find from 'prebidjs-polyfill/find.js';
5
5
 
6
6
  const MODULE_NAME = 'GPT Pre-Auction';
7
7
  export let _currentConfig = {};
@@ -1,4 +1,4 @@
1
- import { isEmpty, deepAccess, logError, parseGPTSingleSizeArrayToRtbSize, generateUUID, logWarn } from '../src/utils.js';
1
+ import { isEmpty, deepAccess, logError, parseGPTSingleSizeArrayToRtbSize, generateUUID, mergeDeep, logWarn } from '../src/utils.js';
2
2
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
  import { Renderer } from '../src/Renderer.js';
4
4
  import { VIDEO, BANNER } from '../src/mediaTypes.js';
@@ -173,10 +173,24 @@ export const spec = {
173
173
  };
174
174
  }
175
175
 
176
+ const ortb2UserData = config.getConfig('ortb2.user.data');
177
+ if (ortb2UserData && ortb2UserData.length) {
178
+ if (!user) {
179
+ user = { data: [] };
180
+ }
181
+ user = mergeDeep(user, { data: ortb2UserData });
182
+ }
183
+
176
184
  if (gdprConsent && gdprConsent.consentString) {
177
185
  userExt = {consent: gdprConsent.consentString};
178
186
  }
179
187
 
188
+ const ortb2UserExtDevice = config.getConfig('ortb2.user.ext.device');
189
+ if (ortb2UserExtDevice) {
190
+ userExt = userExt || {};
191
+ userExt.device = { ...ortb2UserExtDevice };
192
+ }
193
+
180
194
  if (userIdAsEids && userIdAsEids.length) {
181
195
  userExt = userExt || {};
182
196
  userExt.eids = [...userIdAsEids];
@@ -3,7 +3,7 @@ import { _each, deepAccess, logError, logWarn, parseSizesInput } from '../src/ut
3
3
 
4
4
  import { config } from '../src/config.js'
5
5
  import { getStorageManager } from '../src/storageManager.js';
6
- import includes from 'core-js-pure/features/array/includes';
6
+ import includes from 'prebidjs-polyfill/includes.js';
7
7
  import { registerBidder } from '../src/adapters/bidderFactory.js'
8
8
 
9
9
  const storage = getStorageManager();
@@ -17,32 +17,48 @@ const TIME_TO_LIVE = 60
17
17
  const DELAY_REQUEST_TIME = 1800000; // setting to 30 mins
18
18
 
19
19
  let invalidRequestIds = {};
20
- let browserParams = {};
21
20
  let pageViewId = null;
22
21
 
23
22
  // TODO: potential 0 values for browserParams sent to ad server
24
23
  function _getBrowserParams(topWindowUrl) {
25
- let topWindow
26
- let topScreen
27
- let topUrl
28
- let ggad
29
- let ns
30
- function getNetworkSpeed() {
31
- const connection = window.navigator && (window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection)
32
- const Mbps = connection && (connection.downlink || connection.bandwidth)
33
- return Mbps ? Math.round(Mbps * 1024) : null
24
+ const paramRegex = paramName => new RegExp(`[?#&](${paramName}=(.*?))($|&)`, 'i');
25
+
26
+ let browserParams = {};
27
+ let topWindow;
28
+ let topScreen;
29
+ let topUrl;
30
+ let ggad;
31
+ let ggdeal;
32
+ let ns;
33
+
34
+ function getNetworkSpeed () {
35
+ const connection = window.navigator && (window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection);
36
+ const Mbps = connection && (connection.downlink || connection.bandwidth);
37
+ return Mbps ? Math.round(Mbps * 1024) : null;
34
38
  }
35
- function getOgURL() {
36
- let ogURL = ''
37
- const ogURLSelector = "meta[property='og:url']"
38
- const head = document && document.getElementsByTagName('head')[0]
39
- const ogURLElement = head.querySelector(ogURLSelector)
40
- ogURL = ogURLElement ? ogURLElement.content : null
41
- return ogURL
39
+
40
+ function getOgURL () {
41
+ let ogURL = '';
42
+ const ogURLSelector = "meta[property='og:url']";
43
+ const head = document && document.getElementsByTagName('head')[0];
44
+ const ogURLElement = head.querySelector(ogURLSelector);
45
+ ogURL = ogURLElement ? ogURLElement.content : null;
46
+ return ogURL;
42
47
  }
43
- if (browserParams.vw) {
44
- // we've already initialized browserParams, just return it.
45
- return browserParams
48
+
49
+ function stripGGParams (url) {
50
+ const params = [
51
+ 'ggad',
52
+ 'ggdeal'
53
+ ];
54
+
55
+ return params.reduce((result, param) => {
56
+ const matches = url.match(paramRegex(param));
57
+ if (!matches) return result;
58
+ matches[1] && (result = result.replace(matches[1], ''));
59
+ matches[3] && (result = result.replace(matches[3], ''));
60
+ return result;
61
+ }, url);
46
62
  }
47
63
 
48
64
  try {
@@ -51,7 +67,7 @@ function _getBrowserParams(topWindowUrl) {
51
67
  topUrl = topWindowUrl || '';
52
68
  } catch (error) {
53
69
  logError(error);
54
- return browserParams
70
+ return browserParams;
55
71
  }
56
72
 
57
73
  browserParams = {
@@ -59,23 +75,25 @@ function _getBrowserParams(topWindowUrl) {
59
75
  vh: topWindow.innerHeight,
60
76
  sw: topScreen.width,
61
77
  sh: topScreen.height,
62
- pu: topUrl,
78
+ pu: stripGGParams(topUrl),
63
79
  ce: storage.cookiesAreEnabled(),
64
80
  dpr: topWindow.devicePixelRatio || 1,
65
81
  jcsi: JSON.stringify(JCSI),
66
82
  ogu: getOgURL()
67
- }
83
+ };
68
84
 
69
- ns = getNetworkSpeed()
85
+ ns = getNetworkSpeed();
70
86
  if (ns) {
71
- browserParams.ns = ns
87
+ browserParams.ns = ns;
72
88
  }
73
89
 
74
- ggad = (topUrl.match(/#ggad=(\w+)$/) || [0, 0])[1]
75
- if (ggad) {
76
- browserParams[isNaN(ggad) ? 'eAdBuyId' : 'adBuyId'] = ggad
77
- }
78
- return browserParams
90
+ ggad = (topUrl.match(paramRegex('ggad')) || [0, 0, 0])[2];
91
+ if (ggad) browserParams[isNaN(ggad) ? 'eAdBuyId' : 'adBuyId'] = ggad;
92
+
93
+ ggdeal = (topUrl.match(paramRegex('ggdeal')) || [0, 0, 0])[2];
94
+ if (ggdeal) browserParams.ggdeal = ggdeal;
95
+
96
+ return browserParams;
79
97
  }
80
98
 
81
99
  function getWrapperCode(wrapper, data) {
@@ -291,17 +309,17 @@ function buildRequests(validBidRequests, bidderRequest) {
291
309
  } = bidRequest;
292
310
  const { currency, floor } = _getFloor(mediaTypes, params.bidfloor, bidRequest);
293
311
  const eids = getEids(userId);
312
+ const gpid = deepAccess(ortb2Imp, 'ext.data.pbadslot') || deepAccess(ortb2Imp, 'ext.data.adserver.adslot');
294
313
  let sizes = [1, 1];
295
314
  let data = {};
296
- let gpid = '';
297
315
 
298
316
  const date = new Date();
299
317
  const lt = date.getTime();
300
318
  const to = date.getTimezoneOffset();
301
- if (to) {
302
- lt && (data.lt = lt);
303
- data.to = to;
304
- }
319
+
320
+ // ADTS-174 Removed unnecessary checks to fix failing test
321
+ data.lt = lt;
322
+ data.to = to;
305
323
 
306
324
  // ADTS-169 add adUnitCode to requests
307
325
  if (adUnitCode) data.aun = adUnitCode
@@ -309,12 +327,8 @@ function buildRequests(validBidRequests, bidderRequest) {
309
327
  // ADTS-134 Retrieve ID envelopes
310
328
  for (const eid in eids) data[eid] = eids[eid];
311
329
 
312
- // ADJS-1024 & ADSS-1297
313
- if (deepAccess(ortb2Imp, 'ext.data.pbadslot')) {
314
- gpid = deepAccess(ortb2Imp, 'ext.data.pbadslot')
315
- } else if (deepAccess(ortb2Imp, 'ext.data.adserver.name')) {
316
- gpid = ortb2Imp.ext.data.adserver.adslot
317
- }
330
+ // ADJS-1024 & ADSS-1297 & ADTS-175
331
+ gpid && (data.gpid = gpid);
318
332
 
319
333
  if (mediaTypes.banner) {
320
334
  sizes = mediaTypes.banner.sizes;
@@ -384,7 +398,7 @@ function buildRequests(validBidRequests, bidderRequest) {
384
398
  sizes,
385
399
  url: BID_ENDPOINT,
386
400
  method: 'GET',
387
- data: Object.assign(data, _getBrowserParams(topWindowUrl), _getDigiTrustQueryParams(userId), { gpid })
401
+ data: Object.assign(data, _getBrowserParams(topWindowUrl), _getDigiTrustQueryParams(userId))
388
402
  })
389
403
  });
390
404
  return bids;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * This module adds HadronID to the User ID module
3
+ * The {@link module:modules/userId} module is required
4
+ * @module modules/hadronIdSystem
5
+ * @requires module:modules/userId
6
+ */
7
+
8
+ import {ajax} from '../src/ajax.js';
9
+ import {getStorageManager} from '../src/storageManager.js';
10
+ import {submodule} from '../src/hook.js';
11
+ import { isFn, isStr, isPlainObject, logError } from '../src/utils.js';
12
+
13
+ const MODULE_NAME = 'hadronId';
14
+ const AU_GVLID = 561;
15
+
16
+ export const storage = getStorageManager(AU_GVLID, 'hadron');
17
+
18
+ /**
19
+ * Param or default.
20
+ * @param {String} param
21
+ * @param {String} defaultVal
22
+ */
23
+ function paramOrDefault(param, defaultVal, arg) {
24
+ if (isFn(param)) {
25
+ return param(arg);
26
+ } else if (isStr(param)) {
27
+ return param;
28
+ }
29
+ return defaultVal;
30
+ }
31
+
32
+ /** @type {Submodule} */
33
+ export const hadronIdSubmodule = {
34
+ /**
35
+ * used to link submodule with config
36
+ * @type {string}
37
+ */
38
+ name: MODULE_NAME,
39
+ /**
40
+ * decode the stored id value for passing to bid requests
41
+ * @function
42
+ * @param {{value:string}} value
43
+ * @returns {{hadronId:Object}}
44
+ */
45
+ decode(value) {
46
+ let hadronId = storage.getDataFromLocalStorage('auHadronId');
47
+ if (isStr(hadronId)) {
48
+ return {hadronId: hadronId};
49
+ }
50
+ return (value && typeof value['hadronId'] === 'string') ? { 'hadronId': value['hadronId'] } : undefined;
51
+ },
52
+ /**
53
+ * performs action to obtain id and return a value in the callback's response argument
54
+ * @function
55
+ * @param {SubmoduleConfig} [config]
56
+ * @returns {IdResponse|undefined}
57
+ */
58
+ getId(config) {
59
+ if (!isPlainObject(config.params)) {
60
+ config.params = {};
61
+ }
62
+ const url = paramOrDefault(config.params.url,
63
+ `https://id.hadron.ad.gt/api/v1/pbhid`,
64
+ config.params.urlArg);
65
+
66
+ const resp = function (callback) {
67
+ let hadronId = storage.getDataFromLocalStorage('auHadronId');
68
+ if (isStr(hadronId)) {
69
+ const responseObj = {hadronId: hadronId};
70
+ callback(responseObj);
71
+ } else {
72
+ const callbacks = {
73
+ success: response => {
74
+ let responseObj;
75
+ if (response) {
76
+ try {
77
+ responseObj = JSON.parse(response);
78
+ } catch (error) {
79
+ logError(error);
80
+ }
81
+ }
82
+ callback(responseObj);
83
+ },
84
+ error: error => {
85
+ logError(`${MODULE_NAME}: ID fetch encountered an error`, error);
86
+ callback();
87
+ }
88
+ };
89
+ ajax(url, callbacks, undefined, {method: 'GET'});
90
+ }
91
+ };
92
+ return {callback: resp};
93
+ }
94
+ };
95
+
96
+ submodule('userId', hadronIdSubmodule);
@@ -0,0 +1,35 @@
1
+ ## Audigent Hadron User ID Submodule
2
+
3
+ Audigent Hadron ID Module. For assistance setting up your module please contact us at [prebid@audigent.com](prebid@audigent.com).
4
+
5
+ ### Prebid Params
6
+
7
+ Individual params may be set for the Audigent Hadron ID Submodule. At least one identifier must be set in the params.
8
+
9
+ ```
10
+ pbjs.setConfig({
11
+ usersync: {
12
+ userIds: [{
13
+ name: 'hadronId',
14
+ storage: {
15
+ name: 'hadronId',
16
+ type: 'html5'
17
+ }
18
+ }]
19
+ }
20
+ });
21
+ ```
22
+ ## Parameter Descriptions for the `usersync` Configuration Section
23
+ The below parameters apply only to the HadronID User ID Module integration.
24
+
25
+ | Param under usersync.userIds[] | Scope | Type | Description | Example |
26
+ | --- | --- | --- | --- | --- |
27
+ | name | Required | String | ID value for the HadronID module - `"hadronId"` | `"hadronId"` |
28
+ | storage | Required | Object | The publisher must specify the local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. | |
29
+ | storage.type | Required | String | This is where the results of the user ID will be stored. The recommended method is `localStorage` by specifying `html5`. | `"html5"` |
30
+ | storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | `"hadronid"` |
31
+ | storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `365` |
32
+ | value | Optional | Object | Used only if the page has a separate mechanism for storing the Hadron ID. The value is an object containing the values to be sent to the adapters. In this scenario, no URL is called and nothing is added to local storage | `{"hadronId": "eb33b0cb-8d35-4722-b9c0-1a31d4064888"}` |
33
+ | params | Optional | Object | Used to store params for the id system |
34
+ | params.url | Optional | String | Set an alternate GET url for HadronId with this parameter |
35
+ | params.urlArg | Optional | Object | Optional url parameter for params.url |
@@ -0,0 +1,254 @@
1
+ /**
2
+ * This module adds the Audigent Hadron provider to the real time data module
3
+ * The {@link module:modules/realTimeData} module is required
4
+ * The module will fetch real-time data from Audigent
5
+ * @module modules/hadronRtdProvider
6
+ * @requires module:modules/realTimeData
7
+ */
8
+ import {ajax} from '../src/ajax.js';
9
+ import {config} from '../src/config.js';
10
+ import {getGlobal} from '../src/prebidGlobal.js';
11
+ import {getStorageManager} from '../src/storageManager.js';
12
+ import {submodule} from '../src/hook.js';
13
+ import {isFn, isStr, isArray, deepEqual, isPlainObject, logError} from '../src/utils.js';
14
+
15
+ const MODULE_NAME = 'realTimeData';
16
+ const SUBMODULE_NAME = 'hadron';
17
+ const AU_GVLID = 561;
18
+
19
+ export const HALOID_LOCAL_NAME = 'auHadronId';
20
+ export const RTD_LOCAL_NAME = 'auHadronRtd';
21
+ export const storage = getStorageManager(AU_GVLID, SUBMODULE_NAME);
22
+
23
+ /**
24
+ * Deep set an object unless value present.
25
+ * @param {Object} obj
26
+ * @param {String} path
27
+ * @param {Object} val
28
+ */
29
+ function set(obj, path, val) {
30
+ const keys = path.split('.');
31
+ const lastKey = keys.pop();
32
+ const lastObj = keys.reduce((obj, key) => obj[key] = obj[key] || {}, obj);
33
+ lastObj[lastKey] = lastObj[lastKey] || val;
34
+ }
35
+
36
+ /**
37
+ * Deep object merging with array deduplication.
38
+ * @param {Object} target
39
+ * @param {Object} sources
40
+ */
41
+ function mergeDeep(target, ...sources) {
42
+ if (!sources.length) return target;
43
+ const source = sources.shift();
44
+
45
+ if (isPlainObject(target) && isPlainObject(source)) {
46
+ for (const key in source) {
47
+ if (isPlainObject(source[key])) {
48
+ if (!target[key]) Object.assign(target, { [key]: {} });
49
+ mergeDeep(target[key], source[key]);
50
+ } else if (isArray(source[key])) {
51
+ if (!target[key]) {
52
+ Object.assign(target, { [key]: source[key] });
53
+ } else if (isArray(target[key])) {
54
+ source[key].forEach(obj => {
55
+ let e = 1;
56
+ for (let i = 0; i < target[key].length; i++) {
57
+ if (deepEqual(target[key][i], obj)) {
58
+ e = 0;
59
+ break;
60
+ }
61
+ }
62
+ if (e) {
63
+ target[key].push(obj);
64
+ }
65
+ });
66
+ }
67
+ } else {
68
+ Object.assign(target, { [key]: source[key] });
69
+ }
70
+ }
71
+ }
72
+
73
+ return mergeDeep(target, ...sources);
74
+ }
75
+
76
+ /**
77
+ * Lazy merge objects.
78
+ * @param {Object} target
79
+ * @param {Object} source
80
+ */
81
+ function mergeLazy(target, source) {
82
+ if (!isPlainObject(target)) {
83
+ target = {};
84
+ }
85
+
86
+ if (!isPlainObject(source)) {
87
+ source = {};
88
+ }
89
+
90
+ return mergeDeep(target, source);
91
+ }
92
+
93
+ /**
94
+ * Param or default.
95
+ * @param {String} param
96
+ * @param {String} defaultVal
97
+ */
98
+ function paramOrDefault(param, defaultVal, arg) {
99
+ if (isFn(param)) {
100
+ return param(arg);
101
+ } else if (isStr(param)) {
102
+ return param;
103
+ }
104
+ return defaultVal;
105
+ }
106
+
107
+ /**
108
+ * Add real-time data & merge segments.
109
+ * @param {Object} bidConfig
110
+ * @param {Object} rtd
111
+ * @param {Object} rtdConfig
112
+ */
113
+ export function addRealTimeData(bidConfig, rtd, rtdConfig) {
114
+ if (rtdConfig.params && rtdConfig.params.handleRtd) {
115
+ rtdConfig.params.handleRtd(bidConfig, rtd, rtdConfig, config);
116
+ } else {
117
+ if (isPlainObject(rtd.ortb2)) {
118
+ let ortb2 = config.getConfig('ortb2') || {};
119
+ config.setConfig({ortb2: mergeLazy(ortb2, rtd.ortb2)});
120
+ }
121
+
122
+ if (isPlainObject(rtd.ortb2b)) {
123
+ let bidderConfig = config.getBidderConfig();
124
+
125
+ Object.keys(rtd.ortb2b).forEach(bidder => {
126
+ let rtdOptions = rtd.ortb2b[bidder] || {};
127
+
128
+ let bidderOptions = {};
129
+ if (isPlainObject(bidderConfig[bidder])) {
130
+ bidderOptions = bidderConfig[bidder];
131
+ }
132
+
133
+ config.setBidderConfig({
134
+ bidders: [bidder],
135
+ config: mergeLazy(bidderOptions, rtdOptions)
136
+ });
137
+ });
138
+ }
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Real-time data retrieval from Audigent
144
+ * @param {Object} reqBidsConfigObj
145
+ * @param {function} onDone
146
+ * @param {Object} rtdConfig
147
+ * @param {Object} userConsent
148
+ */
149
+ export function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) {
150
+ if (rtdConfig && isPlainObject(rtdConfig.params) && rtdConfig.params.segmentCache) {
151
+ let jsonData = storage.getDataFromLocalStorage(RTD_LOCAL_NAME);
152
+
153
+ if (jsonData) {
154
+ let data = JSON.parse(jsonData);
155
+
156
+ if (data.rtd) {
157
+ addRealTimeData(bidConfig, data.rtd, rtdConfig);
158
+ onDone();
159
+ return;
160
+ }
161
+ }
162
+ }
163
+
164
+ const userIds = (getGlobal()).getUserIds();
165
+
166
+ let hadronId = storage.getDataFromLocalStorage(HALOID_LOCAL_NAME);
167
+ if (isStr(hadronId)) {
168
+ (getGlobal()).refreshUserIds({submoduleNames: 'hadronId'});
169
+ userIds.hadronId = hadronId;
170
+ getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, userIds);
171
+ } else {
172
+ var script = document.createElement('script');
173
+ script.type = 'text/javascript';
174
+
175
+ window.pubHadronCb = (hadronId) => {
176
+ userIds.hadronId = hadronId;
177
+ getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, userIds);
178
+ }
179
+
180
+ const hadronIdUrl = rtdConfig.params && rtdConfig.params.hadronIdUrl;
181
+ script.src = paramOrDefault(hadronIdUrl, 'https://id.hadron.ad.gt/api/v1/hadronid', userIds);
182
+ document.getElementsByTagName('head')[0].appendChild(script);
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Async rtd retrieval from Audigent
188
+ * @param {function} onDone
189
+ * @param {Object} rtdConfig
190
+ * @param {Object} userConsent
191
+ * @param {Object} userIds
192
+ */
193
+ export function getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, userIds) {
194
+ let reqParams = {};
195
+
196
+ if (isPlainObject(rtdConfig)) {
197
+ set(rtdConfig, 'params.requestParams.ortb2', config.getConfig('ortb2'));
198
+ reqParams = rtdConfig.params.requestParams;
199
+ }
200
+
201
+ if (isPlainObject(window.pubHadronPm)) {
202
+ reqParams.pubHadronPm = window.pubHadronPm;
203
+ }
204
+
205
+ const url = `https://seg.hadron.ad.gt/api/v1/rtd`;
206
+ ajax(url, {
207
+ success: function (response, req) {
208
+ if (req.status === 200) {
209
+ try {
210
+ const data = JSON.parse(response);
211
+ if (data && data.rtd) {
212
+ addRealTimeData(bidConfig, data.rtd, rtdConfig);
213
+ onDone();
214
+ storage.setDataInLocalStorage(RTD_LOCAL_NAME, JSON.stringify(data));
215
+ } else {
216
+ onDone();
217
+ }
218
+ } catch (err) {
219
+ logError('unable to parse audigent segment data');
220
+ onDone();
221
+ }
222
+ } else if (req.status === 204) {
223
+ // unrecognized partner config
224
+ onDone();
225
+ }
226
+ },
227
+ error: function () {
228
+ onDone();
229
+ logError('unable to get audigent segment data');
230
+ }
231
+ },
232
+ JSON.stringify({'userIds': userIds, 'config': reqParams}),
233
+ {contentType: 'application/json'}
234
+ );
235
+ }
236
+
237
+ /**
238
+ * Module init
239
+ * @param {Object} provider
240
+ * @param {Objkect} userConsent
241
+ * @return {boolean}
242
+ */
243
+ function init(provider, userConsent) {
244
+ return true;
245
+ }
246
+
247
+ /** @type {RtdSubmodule} */
248
+ export const hadronSubmodule = {
249
+ name: SUBMODULE_NAME,
250
+ getBidRequestData: getRealTimeData,
251
+ init: init
252
+ };
253
+
254
+ submodule(MODULE_NAME, hadronSubmodule);