prebid.js 8.7.0 → 8.9.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 (350) hide show
  1. package/dist/1plusXRtdProvider.js +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/a1MediaRtdProvider.js +1 -1
  5. package/dist/adWMGAnalyticsAdapter.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/adkernelAdnAnalyticsAdapter.js +1 -1
  10. package/dist/adlooxAdServerVideo.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/admaticBidAdapter.js +1 -1
  13. package/dist/admixerIdSystem.js +1 -1
  14. package/dist/adnuntiusRtdProvider.js +1 -1
  15. package/dist/adpartnerBidAdapter.js +1 -1
  16. package/dist/adqueryBidAdapter.js +1 -1
  17. package/dist/adqueryIdSystem.js +1 -1
  18. package/dist/adrelevantisBidAdapter.js +1 -1
  19. package/dist/adriverIdSystem.js +1 -1
  20. package/dist/adtelligentIdSystem.js +1 -1
  21. package/dist/adtrgtmeBidAdapter.js +1 -1
  22. package/dist/adxcgAnalyticsAdapter.js +1 -1
  23. package/dist/adxcgBidAdapter.js +1 -1
  24. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  25. package/dist/adyoulikeBidAdapter.js +1 -1
  26. package/dist/aidemBidAdapter.js +1 -1
  27. package/dist/ajaBidAdapter.js +1 -1
  28. package/dist/akamaiDapRtdProvider.js +1 -1
  29. package/dist/alkimiBidAdapter.js +1 -1
  30. package/dist/amxBidAdapter.js +1 -1
  31. package/dist/amxIdSystem.js +1 -1
  32. package/dist/analyticsAdapter.js +1 -1
  33. package/dist/appierAnalyticsAdapter.js +1 -1
  34. package/dist/appnexusBidAdapter.js +1 -1
  35. package/dist/asoBidAdapter.js +1 -1
  36. package/dist/atsAnalyticsAdapter.js +1 -1
  37. package/dist/automatadBidAdapter.js +1 -1
  38. package/dist/axonixBidAdapter.js +1 -1
  39. package/dist/bidViewability.js +1 -1
  40. package/dist/bidglassBidAdapter.js +1 -1
  41. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  42. package/dist/big-richmediaBidAdapter.js +1 -1
  43. package/dist/brandmetricsRtdProvider.js +1 -1
  44. package/dist/bridBidAdapter.js +1 -1
  45. package/dist/bridgewellBidAdapter.js +1 -1
  46. package/dist/brightMountainMediaBidAdapter.js +1 -1
  47. package/dist/brightcomSSPBidAdapter.js +1 -1
  48. package/dist/britepoolIdSystem.js +1 -1
  49. package/dist/browsiRtdProvider.js +1 -1
  50. package/dist/byDataAnalyticsAdapter.js +1 -1
  51. package/dist/carodaBidAdapter.js +1 -1
  52. package/dist/categoryTranslation.js +1 -1
  53. package/dist/chtnwBidAdapter.js +1 -1
  54. package/dist/colossussspBidAdapter.js +1 -1
  55. package/dist/concertAnalyticsAdapter.js +1 -1
  56. package/dist/concertBidAdapter.js +1 -1
  57. package/dist/connectIdSystem.js +1 -1
  58. package/dist/connectadBidAdapter.js +1 -1
  59. package/dist/consumableBidAdapter.js +1 -1
  60. package/dist/conversantAnalyticsAdapter.js +1 -1
  61. package/dist/conversantBidAdapter.js +1 -1
  62. package/dist/craftBidAdapter.js +1 -1
  63. package/dist/criteoBidAdapter.js +1 -1
  64. package/dist/criteoIdSystem.js +1 -1
  65. package/dist/currency.js +1 -1
  66. package/dist/cwireBidAdapter.js +1 -1
  67. package/dist/dacIdSystem.js +1 -1
  68. package/dist/dailyhuntBidAdapter.js +1 -1
  69. package/dist/datablocksBidAdapter.js +1 -1
  70. package/dist/dependencies.json +4 -1
  71. package/dist/dgkeywordRtdProvider.js +1 -1
  72. package/dist/dmdIdSystem.js +1 -1
  73. package/dist/dspxBidAdapter.js +1 -1
  74. package/dist/eplanningAnalyticsAdapter.js +1 -1
  75. package/dist/eplanningBidAdapter.js +1 -1
  76. package/dist/euidIdSystem.js +1 -1
  77. package/dist/fabrickIdSystem.js +1 -1
  78. package/dist/feedadBidAdapter.js +1 -1
  79. package/dist/finativeBidAdapter.js +1 -1
  80. package/dist/fintezaAnalyticsAdapter.js +1 -1
  81. package/dist/fledgeForGpt.js +1 -1
  82. package/dist/freewheel-sspBidAdapter.js +1 -1
  83. package/dist/genericAnalyticsAdapter.js +1 -1
  84. package/dist/geoedgeRtdProvider.js +1 -1
  85. package/dist/gmosspBidAdapter.js +1 -1
  86. package/dist/gnetBidAdapter.js +1 -1
  87. package/dist/goldbachBidAdapter.js +1 -1
  88. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  89. package/dist/greenbidsRtdProvider.js +1 -1
  90. package/dist/gridBidAdapter.js +1 -1
  91. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  92. package/dist/growthCodeIdSystem.js +1 -1
  93. package/dist/growthCodeRtdProvider.js +1 -1
  94. package/dist/gumgumBidAdapter.js +1 -1
  95. package/dist/h12mediaBidAdapter.js +1 -1
  96. package/dist/hadronAnalyticsAdapter.js +1 -1
  97. package/dist/hadronIdSystem.js +1 -1
  98. package/dist/hadronRtdProvider.js +1 -1
  99. package/dist/hypelabBidAdapter.js +1 -1
  100. package/dist/iasRtdProvider.js +1 -1
  101. package/dist/id5AnalyticsAdapter.js +1 -1
  102. package/dist/id5IdSystem.js +1 -1
  103. package/dist/idImportLibrary.js +1 -1
  104. package/dist/identityLinkIdSystem.js +1 -1
  105. package/dist/imRtdProvider.js +1 -1
  106. package/dist/imdsBidAdapter.js +1 -1
  107. package/dist/impactifyBidAdapter.js +1 -1
  108. package/dist/improvedigitalBidAdapter.js +1 -1
  109. package/dist/imuIdSystem.js +1 -1
  110. package/dist/insticatorBidAdapter.js +1 -1
  111. package/dist/intentIqIdSystem.js +1 -1
  112. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  113. package/dist/ixBidAdapter.js +1 -1
  114. package/dist/jixieBidAdapter.js +1 -1
  115. package/dist/justpremiumBidAdapter.js +1 -1
  116. package/dist/jwplayerRtdProvider.js +1 -1
  117. package/dist/kargoAnalyticsAdapter.js +1 -1
  118. package/dist/kargoBidAdapter.js +1 -1
  119. package/dist/kinessoIdSystem.js +1 -1
  120. package/dist/konduitAnalyticsAdapter.js +1 -1
  121. package/dist/konduitWrapper.js +1 -1
  122. package/dist/kueezBidAdapter.js +1 -1
  123. package/dist/kueezRtbBidAdapter.js +1 -1
  124. package/dist/kulturemediaBidAdapter.js +1 -1
  125. package/dist/lassoBidAdapter.js +1 -1
  126. package/dist/lifestreetBidAdapter.js +1 -1
  127. package/dist/limelightDigitalBidAdapter.js +1 -1
  128. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  129. package/dist/liveIntentIdSystem.js +1 -1
  130. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  131. package/dist/logicadBidAdapter.js +1 -1
  132. package/dist/loglyliftBidAdapter.js +1 -1
  133. package/dist/lotamePanoramaIdSystem.js +1 -1
  134. package/dist/luponmediaBidAdapter.js +1 -1
  135. package/dist/magniteAnalyticsAdapter.js +1 -1
  136. package/dist/malltvAnalyticsAdapter.js +1 -1
  137. package/dist/mantisBidAdapter.js +1 -1
  138. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  139. package/dist/marsmediaBidAdapter.js +1 -1
  140. package/dist/mediafuseBidAdapter.js +1 -1
  141. package/dist/medianetAnalyticsAdapter.js +1 -1
  142. package/dist/mediasquareBidAdapter.js +1 -1
  143. package/dist/merkleIdSystem.js +1 -1
  144. package/dist/mgidBidAdapter.js +1 -1
  145. package/dist/mgidRtdProvider.js +1 -1
  146. package/dist/minutemediaBidAdapter.js +1 -1
  147. package/dist/minutemediaplusBidAdapter.js +1 -1
  148. package/dist/mspa.js +1 -1
  149. package/dist/mwOpenLinkIdSystem.js +1 -1
  150. package/dist/nativoBidAdapter.js +1 -1
  151. package/dist/naveggIdSystem.js +1 -1
  152. package/dist/neuwoRtdProvider.js +1 -1
  153. package/dist/nexx360BidAdapter.js +1 -1
  154. package/dist/not-for-prod/prebid.js +248 -247
  155. package/dist/novatiqIdSystem.js +1 -1
  156. package/dist/oguryBidAdapter.js +1 -1
  157. package/dist/onetagBidAdapter.js +1 -1
  158. package/dist/ooloAnalyticsAdapter.js +1 -1
  159. package/dist/open8BidAdapter.js +1 -1
  160. package/dist/operaadsBidAdapter.js +1 -1
  161. package/dist/operaadsIdSystem.js +1 -0
  162. package/dist/optidigitalBidAdapter.js +1 -1
  163. package/dist/optimeraRtdProvider.js +1 -1
  164. package/dist/outbrainBidAdapter.js +1 -1
  165. package/dist/oxxionAnalyticsAdapter.js +1 -1
  166. package/dist/oxxionRtdProvider.js +1 -1
  167. package/dist/parrableIdSystem.js +1 -1
  168. package/dist/pixfutureBidAdapter.js +1 -1
  169. package/dist/prebid-core.js +2 -2
  170. package/dist/prebidServerBidAdapter.js +1 -1
  171. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  172. package/dist/priceFloors.js +1 -1
  173. package/dist/prismaBidAdapter.js +1 -1
  174. package/dist/pubgeniusBidAdapter.js +1 -1
  175. package/dist/publinkIdSystem.js +1 -1
  176. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  177. package/dist/pubmaticBidAdapter.js +1 -1
  178. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  179. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  180. package/dist/pxyzBidAdapter.js +1 -1
  181. package/dist/quantcastBidAdapter.js +1 -1
  182. package/dist/qwarryBidAdapter.js +1 -1
  183. package/dist/readpeakBidAdapter.js +1 -1
  184. package/dist/reconciliationRtdProvider.js +1 -1
  185. package/dist/relaidoBidAdapter.js +1 -1
  186. package/dist/relevadRtdProvider.js +1 -1
  187. package/dist/retailspotBidAdapter.js +1 -1
  188. package/dist/rhythmoneBidAdapter.js +1 -1
  189. package/dist/riseBidAdapter.js +1 -1
  190. package/dist/rivrAnalyticsAdapter.js +1 -1
  191. package/dist/roxotAnalyticsAdapter.js +1 -1
  192. package/dist/rubiconBidAdapter.js +1 -1
  193. package/dist/scaleableAnalyticsAdapter.js +1 -1
  194. package/dist/seedingAllianceBidAdapter.js +1 -1
  195. package/dist/seedtagBidAdapter.js +1 -1
  196. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  197. package/dist/sharethroughBidAdapter.js +1 -1
  198. package/dist/shinezBidAdapter.js +1 -1
  199. package/dist/silverpushBidAdapter.js +1 -1
  200. package/dist/sirdataRtdProvider.js +1 -1
  201. package/dist/slimcutBidAdapter.js +1 -1
  202. package/dist/smaatoBidAdapter.js +1 -1
  203. package/dist/smartadserverBidAdapter.js +1 -1
  204. package/dist/smartxBidAdapter.js +1 -1
  205. package/dist/smartyadsBidAdapter.js +1 -1
  206. package/dist/smilewantedBidAdapter.js +1 -1
  207. package/dist/snigelBidAdapter.js +1 -1
  208. package/dist/sonobiAnalyticsAdapter.js +1 -1
  209. package/dist/sonobiBidAdapter.js +1 -1
  210. package/dist/sovrnAnalyticsAdapter.js +1 -1
  211. package/dist/sovrnBidAdapter.js +1 -1
  212. package/dist/sspBCBidAdapter.js +1 -1
  213. package/dist/staqAnalyticsAdapter.js +1 -1
  214. package/dist/stvBidAdapter.js +1 -1
  215. package/dist/sublimeBidAdapter.js +1 -1
  216. package/dist/taboolaBidAdapter.js +1 -1
  217. package/dist/talkadsBidAdapter.js +1 -1
  218. package/dist/tapadIdSystem.js +1 -1
  219. package/dist/targetVideoBidAdapter.js +1 -1
  220. package/dist/teadsBidAdapter.js +1 -1
  221. package/dist/teadsIdSystem.js +1 -1
  222. package/dist/terceptAnalyticsAdapter.js +1 -1
  223. package/dist/timeoutRtdProvider.js +1 -1
  224. package/dist/topicsFpdModule.js +1 -1
  225. package/dist/trionBidAdapter.js +1 -1
  226. package/dist/tripleliftBidAdapter.js +1 -1
  227. package/dist/ttdBidAdapter.js +1 -1
  228. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  229. package/dist/uid2IdSystem.js +1 -1
  230. package/dist/underdogmediaBidAdapter.js +1 -1
  231. package/dist/undertoneBidAdapter.js +1 -1
  232. package/dist/unifiedIdSystem.js +1 -1
  233. package/dist/verizonMediaIdSystem.js +1 -1
  234. package/dist/vidazooBidAdapter.js +1 -1
  235. package/dist/videobyteBidAdapter.js +1 -1
  236. package/dist/visxBidAdapter.js +1 -1
  237. package/dist/vrtcalBidAdapter.js +1 -1
  238. package/dist/vuukleBidAdapter.js +1 -1
  239. package/dist/weboramaRtdProvider.js +1 -1
  240. package/dist/widespaceBidAdapter.js +1 -1
  241. package/dist/winrBidAdapter.js +1 -1
  242. package/dist/yahoosspBidAdapter.js +1 -1
  243. package/dist/yieldmoBidAdapter.js +1 -1
  244. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  245. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  246. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  247. package/dist/zeta_global_sspBidAdapter.js +1 -1
  248. package/integrationExamples/gpt/growthcode.html +3 -12
  249. package/integrationExamples/topics/topics-server.js +72 -0
  250. package/libraries/mspa/activityControls.js +3 -1
  251. package/modules/.submodules.json +2 -1
  252. package/modules/a1MediaRtdProvider.js +1 -1
  253. package/modules/adagioBidAdapter.js +11 -3
  254. package/modules/admaticBidAdapter.js +5 -0
  255. package/modules/adqueryBidAdapter.js +23 -21
  256. package/modules/adqueryIdSystem.js +45 -30
  257. package/modules/adrelevantisBidAdapter.js +2 -0
  258. package/modules/bidViewability.js +7 -0
  259. package/modules/bidViewability.md +9 -8
  260. package/modules/brandmetricsRtdProvider.js +30 -27
  261. package/modules/concertBidAdapter.js +1 -0
  262. package/modules/criteoBidAdapter.js +66 -43
  263. package/modules/fledgeForGpt.js +17 -4
  264. package/modules/fledgeForGpt.md +17 -10
  265. package/modules/geoedgeRtdProvider.js +44 -18
  266. package/modules/geoedgeRtdProvider.md +2 -1
  267. package/modules/growthCodeAnalyticsAdapter.js +7 -4
  268. package/modules/growthCodeAnalyticsAdapter.md +1 -7
  269. package/modules/liveIntentIdSystem.js +16 -1
  270. package/modules/nativoBidAdapter.js +21 -3
  271. package/modules/nexx360BidAdapter.js +7 -1
  272. package/modules/onetagBidAdapter.js +3 -0
  273. package/modules/operaadsBidAdapter.js +5 -0
  274. package/modules/operaadsBidAdapter.md +5 -5
  275. package/modules/operaadsIdSystem.js +106 -0
  276. package/modules/operaadsIdSystem.md +52 -0
  277. package/modules/oxxionAnalyticsAdapter.js +22 -5
  278. package/modules/prebidServerBidAdapter/index.js +8 -2
  279. package/modules/pubmaticAnalyticsAdapter.js +16 -3
  280. package/modules/rubiconBidAdapter.js +2 -2
  281. package/modules/smartyadsBidAdapter.js +18 -1
  282. package/modules/snigelBidAdapter.js +69 -16
  283. package/modules/snigelBidAdapter.md +9 -3
  284. package/modules/topicsFpdModule.js +35 -9
  285. package/modules/visxBidAdapter.js +51 -1
  286. package/package.json +2 -2
  287. package/src/adapters/bidderFactory.js +14 -5
  288. package/src/adloader.js +1 -0
  289. package/src/ajax.js +126 -87
  290. package/src/constants.json +8 -2
  291. package/src/native.js +14 -3
  292. package/test/mocks/xhr.js +256 -9
  293. package/test/spec/libraries/mspa/activityControls_spec.js +6 -0
  294. package/test/spec/modules/adagioBidAdapter_spec.js +15 -0
  295. package/test/spec/modules/adlooxAdServerVideo_spec.js +1 -5
  296. package/test/spec/modules/adlooxRtdProvider_spec.js +1 -5
  297. package/test/spec/modules/admaticBidAdapter_spec.js +5 -0
  298. package/test/spec/modules/adqueryIdSystem_spec.js +13 -24
  299. package/test/spec/modules/bidViewability_spec.js +32 -1
  300. package/test/spec/modules/brandmetricsRtdProvider_spec.js +6 -0
  301. package/test/spec/modules/categoryTranslation_spec.js +7 -9
  302. package/test/spec/modules/concertBidAdapter_spec.js +1 -1
  303. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +3 -5
  304. package/test/spec/modules/criteoBidAdapter_spec.js +228 -0
  305. package/test/spec/modules/currency_spec.js +2 -2
  306. package/test/spec/modules/dmdIdSystem_spec.js +2 -2
  307. package/test/spec/modules/eids_spec.js +48 -0
  308. package/test/spec/modules/euidIdSystem_spec.js +10 -9
  309. package/test/spec/modules/feedadBidAdapter_spec.js +1 -1
  310. package/test/spec/modules/fledge_spec.js +117 -43
  311. package/test/spec/modules/geoedgeRtdProvider_spec.js +52 -39
  312. package/test/spec/modules/greenbidsRtdProvider_spec.js +3 -12
  313. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +0 -1
  314. package/test/spec/modules/hadronIdSystem_spec.js +1 -1
  315. package/test/spec/modules/id5AnalyticsAdapter_spec.js +1 -7
  316. package/test/spec/modules/id5IdSystem_spec.js +25 -25
  317. package/test/spec/modules/identityLinkIdSystem_spec.js +0 -2
  318. package/test/spec/modules/intentIqIdSystem_spec.js +0 -2
  319. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +2 -6
  320. package/test/spec/modules/jwplayerRtdProvider_spec.js +26 -28
  321. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +5 -0
  322. package/test/spec/modules/liveIntentIdSystem_spec.js +5 -0
  323. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +2 -2
  324. package/test/spec/modules/mgidRtdProvider_spec.js +1 -5
  325. package/test/spec/modules/nativoBidAdapter_spec.js +6 -1
  326. package/test/spec/modules/nexx360BidAdapter_spec.js +48 -1
  327. package/test/spec/modules/oguryBidAdapter_spec.js +5 -19
  328. package/test/spec/modules/onetagBidAdapter_spec.js +69 -0
  329. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  330. package/test/spec/modules/operaadsIdSystem_spec.js +53 -0
  331. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +6 -1
  332. package/test/spec/modules/prebidServerBidAdapter_spec.js +33 -2
  333. package/test/spec/modules/priceFloors_spec.js +33 -37
  334. package/test/spec/modules/publinkIdSystem_spec.js +1 -1
  335. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +102 -18
  336. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +2 -8
  337. package/test/spec/modules/rubiconBidAdapter_spec.js +24 -0
  338. package/test/spec/modules/smartyadsBidAdapter_spec.js +49 -0
  339. package/test/spec/modules/snigelBidAdapter_spec.js +57 -6
  340. package/test/spec/modules/teadsIdSystem_spec.js +1 -1
  341. package/test/spec/modules/topicsFpdModule_spec.js +102 -1
  342. package/test/spec/modules/uid2IdSystem_helpers.js +5 -5
  343. package/test/spec/modules/uid2IdSystem_spec.js +24 -24
  344. package/test/spec/modules/userId_spec.js +1 -1
  345. package/test/spec/modules/visxBidAdapter_spec.js +151 -1
  346. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +2 -5
  347. package/test/spec/native_spec.js +20 -5
  348. package/test/spec/unit/core/ajax_spec.js +403 -0
  349. package/test/spec/unit/core/bidderFactory_spec.js +80 -8
  350. package/test/spec/videoCache_spec.js +4 -4
@@ -1,7 +1,7 @@
1
1
  import {config} from '../src/config.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER} from '../src/mediaTypes.js';
4
- import {deepAccess, isArray, isFn, isPlainObject} from '../src/utils.js';
4
+ import {deepAccess, isArray, isFn, isPlainObject, inIframe, getDNT} from '../src/utils.js';
5
5
  import {hasPurpose1Consent} from '../src/utils/gpdr.js';
6
6
  import {getGlobal} from '../src/prebidGlobal.js';
7
7
 
@@ -13,6 +13,7 @@ const DEFAULT_CURRENCIES = ['USD'];
13
13
  const FLOOR_MATCH_ALL_SIZES = '*';
14
14
 
15
15
  const getConfig = config.getConfig;
16
+ const refreshes = {};
16
17
 
17
18
  export const spec = {
18
19
  code: BIDDER_CODE,
@@ -29,12 +30,15 @@ export const spec = {
29
30
  method: 'POST',
30
31
  url: getEndpoint(),
31
32
  data: JSON.stringify({
32
- id: bidderRequest.bidderRequestId,
33
+ id: bidderRequest.auctionId,
34
+ accountId: deepAccess(bidRequests, '0.params.accountId'),
35
+ site: deepAccess(bidRequests, '0.params.site'),
33
36
  cur: getCurrencies(),
34
37
  test: getTestFlag(),
35
- devw: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
36
- devh: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
37
38
  version: getGlobal().version,
39
+ gpp: deepAccess(bidderRequest, 'gppConsent.gppString') || deepAccess(bidderRequest, 'ortb2.regs.gpp'),
40
+ gpp_sid:
41
+ deepAccess(bidderRequest, 'gppConsent.applicableSections') || deepAccess(bidderRequest, 'ortb2.regs.gpp_sid'),
38
42
  gdprApplies: gdprApplies,
39
43
  gdprConsentString: gdprApplies === true ? deepAccess(bidderRequest, 'gdprConsent.consentString') : undefined,
40
44
  gdprConsentProv: gdprApplies === true ? deepAccess(bidderRequest, 'gdprConsent.addtlConsent') : undefined,
@@ -43,12 +47,24 @@ export const spec = {
43
47
  eids: deepAccess(bidRequests, '0.userIdAsEids'),
44
48
  schain: deepAccess(bidRequests, '0.schain'),
45
49
  page: getPage(bidderRequest),
50
+ topframe: inIframe() === true ? 0 : 1,
51
+ device: {
52
+ w: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
53
+ h: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
54
+ dnt: getDNT() ? 1 : 0,
55
+ language: getLanguage(),
56
+ },
46
57
  placements: bidRequests.map((r) => {
47
58
  return {
48
- uuid: r.bidId,
59
+ id: r.adUnitCode,
60
+ tid: r.transactionId,
61
+ gpid: deepAccess(r, 'ortb2Imp.ext.gpid'),
62
+ pbadslot: deepAccess(r, 'ortb2Imp.ext.data.pbadslot') || deepAccess(r, 'ortb2Imp.ext.gpid'),
49
63
  name: r.params.placement,
50
64
  sizes: r.sizes,
51
65
  floor: getPriceFloor(r, BANNER, FLOOR_MATCH_ALL_SIZES),
66
+ refresh: getRefreshInformation(r.adUnitCode),
67
+ params: r.params.additionalParams,
52
68
  };
53
69
  }),
54
70
  }),
@@ -56,14 +72,14 @@ export const spec = {
56
72
  };
57
73
  },
58
74
 
59
- interpretResponse: function (serverResponse) {
75
+ interpretResponse: function (serverResponse, bidRequest) {
60
76
  if (!serverResponse.body || !serverResponse.body.bids) {
61
77
  return [];
62
78
  }
63
79
 
64
80
  return serverResponse.body.bids.map((bid) => {
65
81
  return {
66
- requestId: bid.uuid,
82
+ requestId: mapIdToRequestId(bid.id, bidRequest),
67
83
  cpm: bid.price,
68
84
  creativeId: bid.crid,
69
85
  currency: serverResponse.body.cur,
@@ -77,9 +93,9 @@ export const spec = {
77
93
  });
78
94
  },
79
95
 
80
- getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
96
+ getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) {
81
97
  const syncUrl = getSyncUrl(responses || []);
82
- if (syncUrl && syncOptions.iframeEnabled && hasSyncConsent(gdprConsent, uspConsent)) {
98
+ if (syncUrl && syncOptions.iframeEnabled && hasSyncConsent(gdprConsent, uspConsent, gppConsent)) {
83
99
  return [{type: 'iframe', url: getSyncEndpoint(syncUrl, gdprConsent)}];
84
100
  }
85
101
  },
@@ -101,6 +117,14 @@ function getTestFlag() {
101
117
  return getConfig(`${BIDDER_CODE}.test`) === true;
102
118
  }
103
119
 
120
+ function getLanguage() {
121
+ return navigator && navigator.language
122
+ ? navigator.language.indexOf('-') != -1
123
+ ? navigator.language.split('-')[0]
124
+ : navigator.language
125
+ : undefined;
126
+ }
127
+
104
128
  function getCurrencies() {
105
129
  const currencyOverrides = getConfig(`${BIDDER_CODE}.cur`);
106
130
  if (currencyOverrides !== undefined && (!isArray(currencyOverrides) || currencyOverrides.length === 0)) {
@@ -130,14 +154,43 @@ function getPriceFloor(bidRequest, mediaType, size) {
130
154
  }
131
155
  }
132
156
 
133
- function hasSyncConsent(gdprConsent, uspConsent) {
134
- if (gdprConsent?.gdprApplies && !hasPurpose1Consent(gdprConsent)) {
135
- return false;
136
- } else if (uspConsent && uspConsent[1] === 'Y' && uspConsent[2] === 'Y') {
137
- return false;
138
- } else {
139
- return true;
157
+ function getRefreshInformation(adUnitCode) {
158
+ const refresh = refreshes[adUnitCode];
159
+ if (!refresh) {
160
+ refreshes[adUnitCode] = {
161
+ count: 0,
162
+ previousTime: new Date(),
163
+ };
164
+ return undefined;
140
165
  }
166
+
167
+ const currentTime = new Date();
168
+ const timeDifferenceSeconds = Math.floor((currentTime - refresh.previousTime) / 1000);
169
+ refresh.count += 1;
170
+ refresh.previousTime = currentTime;
171
+ return {
172
+ count: refresh.count,
173
+ time: timeDifferenceSeconds,
174
+ };
175
+ }
176
+
177
+ function mapIdToRequestId(id, bidRequest) {
178
+ return bidRequest.bidderRequest.bids.filter((bid) => bid.adUnitCode === id)[0].bidId;
179
+ }
180
+
181
+ function hasUspConsent(uspConsent) {
182
+ return typeof uspConsent !== 'string' || !(uspConsent[0] === '1' && uspConsent[2] === 'Y');
183
+ }
184
+
185
+ function hasGppConsent(gppConsent) {
186
+ return (
187
+ !(gppConsent && Array.isArray(gppConsent.applicableSections)) ||
188
+ gppConsent.applicableSections.every((section) => typeof section === 'number' && section <= 5)
189
+ );
190
+ }
191
+
192
+ function hasSyncConsent(gdprConsent, uspConsent, gppConsent) {
193
+ return hasPurpose1Consent(gdprConsent) && hasUspConsent(uspConsent) && hasGppConsent(gppConsent);
141
194
  }
142
195
 
143
196
  function getSyncUrl(responses) {
@@ -15,9 +15,13 @@ Please reach out to us [through our contact form](https://snigel.com/get-in-touc
15
15
 
16
16
  # Parameters
17
17
 
18
- | Name | Required | Description | Example |
19
- | :--- | :-------- | :---------- | :------ |
20
- | placement | Yes | Placement identifier | top_leaderboard |
18
+ | Name | Required | Description |
19
+ | :-------- | :------- | :------------------- |
20
+ | accountId | Yes | Account identifier |
21
+ | site | Yes | Site identifier |
22
+ | placement | Yes | Placement identifier |
23
+
24
+ Snigel will provide all of these parameters to you.
21
25
 
22
26
  # Test
23
27
 
@@ -37,6 +41,8 @@ var adUnits = [
37
41
  {
38
42
  bidder: "snigel",
39
43
  params: {
44
+ accountId: "1000",
45
+ site: "test.com",
40
46
  placement: "prebid_test_placement",
41
47
  },
42
48
  },
@@ -12,6 +12,7 @@ import {MODULE_TYPE_BIDDER} from '../src/activities/modules.js';
12
12
 
13
13
  const MODULE_NAME = 'topicsFpd';
14
14
  const DEFAULT_EXPIRATION_DAYS = 21;
15
+ const DEFAULT_FETCH_RATE_IN_DAYS = 1;
15
16
  let LOAD_TOPICS_INITIALISE = false;
16
17
 
17
18
  export function reset() {
@@ -85,6 +86,7 @@ export function getTopicsData(name, topics, taxonomies = TAXONOMIES) {
85
86
  if (name != null) {
86
87
  datum.name = name;
87
88
  }
89
+
88
90
  return datum;
89
91
  })
90
92
  );
@@ -96,6 +98,7 @@ function isTopicsSupported(doc = document) {
96
98
 
97
99
  export function getTopics(doc = document) {
98
100
  let topics = null;
101
+
99
102
  try {
100
103
  if (isTopicsSupported(doc)) {
101
104
  topics = GreedyPromise.resolve(doc.browsingTopics());
@@ -106,6 +109,7 @@ export function getTopics(doc = document) {
106
109
  if (topics == null) {
107
110
  topics = GreedyPromise.resolve([]);
108
111
  }
112
+
109
113
  return topics;
110
114
  }
111
115
 
@@ -165,7 +169,7 @@ export function receiveMessage(evt) {
165
169
  let data = safeJSONParse(evt.data);
166
170
  if (includes(getLoadedIframeURL(), evt.origin) && data && data.segment && !isEmpty(data.segment.topics)) {
167
171
  const {domain, topics, bidder} = data.segment;
168
- const iframeTopicsData = getTopicsData(domain, topics)[0];
172
+ const iframeTopicsData = getTopicsData(domain, topics);
169
173
  iframeTopicsData && storeInLocalStorage(bidder, iframeTopicsData);
170
174
  }
171
175
  } catch (err) { }
@@ -178,13 +182,15 @@ Function to store Topics data recieved from iframe in storage(name: "prebid:topi
178
182
  */
179
183
  export function storeInLocalStorage(bidder, topics) {
180
184
  const storedSegments = new Map(safeJSONParse(coreStorage.getDataFromLocalStorage(topicStorageName)));
181
- if (storedSegments.has(bidder)) {
182
- storedSegments.get(bidder)[topics['ext']['segclass']] = topics;
183
- storedSegments.get(bidder)[lastUpdated] = new Date().getTime();
184
- storedSegments.set(bidder, storedSegments.get(bidder));
185
- } else {
186
- storedSegments.set(bidder, {[topics.ext.segclass]: topics, [lastUpdated]: new Date().getTime()})
187
- }
185
+ const topicsObj = {
186
+ [lastUpdated]: new Date().getTime()
187
+ };
188
+
189
+ topics.forEach((topic) => {
190
+ topicsObj[topic.ext.segclass] = topic;
191
+ });
192
+
193
+ storedSegments.set(bidder, topicsObj);
188
194
  coreStorage.setDataInLocalStorage(topicStorageName, JSON.stringify([...storedSegments]));
189
195
  }
190
196
 
@@ -215,10 +221,11 @@ function listenMessagesFromTopicIframe() {
215
221
  export function loadTopicsForBidders(doc = document) {
216
222
  if (!isTopicsSupported(doc)) return;
217
223
  const topics = config.getConfig('userSync.topics') || bidderIframeList;
224
+
218
225
  if (topics) {
219
226
  listenMessagesFromTopicIframe();
220
227
  const randomBidders = getRandomBidders(topics.bidders || [], topics.maxTopicCaller || 1)
221
- randomBidders && randomBidders.forEach(({ bidder, iframeURL }) => {
228
+ randomBidders && randomBidders.forEach(({ bidder, iframeURL, fetchUrl, fetchRate }) => {
222
229
  if (bidder && iframeURL) {
223
230
  let ifrm = doc.createElement('iframe');
224
231
  ifrm.name = 'ifrm_'.concat(bidder);
@@ -227,6 +234,25 @@ export function loadTopicsForBidders(doc = document) {
227
234
  setLoadedIframeURL(new URL(iframeURL).origin);
228
235
  iframeURL && doc.documentElement.appendChild(ifrm);
229
236
  }
237
+
238
+ if (bidder && fetchUrl) {
239
+ let storedSegments = new Map(safeJSONParse(coreStorage.getDataFromLocalStorage(topicStorageName)));
240
+ const bidderLsEntry = storedSegments.get(bidder);
241
+
242
+ if (!bidderLsEntry || (bidderLsEntry && isCachedDataExpired(bidderLsEntry[lastUpdated], fetchRate || DEFAULT_FETCH_RATE_IN_DAYS))) {
243
+ window.fetch(`${fetchUrl}?bidder=${bidder}`, {browsingTopics: true})
244
+ .then(response => {
245
+ return response.json();
246
+ })
247
+ .then(data => {
248
+ if (data && data.segment && !isEmpty(data.segment.topics)) {
249
+ const {domain, topics, bidder} = data.segment;
250
+ const fetchTopicsData = getTopicsData(domain, topics);
251
+ fetchTopicsData && storeInLocalStorage(bidder, fetchTopicsData);
252
+ }
253
+ });
254
+ }
255
+ }
230
256
  })
231
257
  } else {
232
258
  logWarn(`Topics config not defined under userSync Object`);
@@ -3,6 +3,7 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
3
3
  import { config } from '../src/config.js';
4
4
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
5
5
  import { INSTREAM as VIDEO_INSTREAM } from '../src/video.js';
6
+ import {getStorageManager} from '../src/storageManager.js';
6
7
  const BIDDER_CODE = 'visx';
7
8
  const GVLID = 154;
8
9
  const BASE_URL = 'https://t.visx.net';
@@ -29,6 +30,7 @@ const LOG_ERROR_MESS = {
29
30
  videoMissing: 'Bid request videoType property is missing - '
30
31
  };
31
32
  const currencyWhiteList = ['EUR', 'USD', 'GBP', 'PLN'];
33
+ export const storage = getStorageManager({bidderCode: BIDDER_CODE});
32
34
  export const spec = {
33
35
  code: BIDDER_CODE,
34
36
  gvlid: GVLID,
@@ -117,10 +119,13 @@ export const spec = {
117
119
  ...(payloadSchain && { schain: payloadSchain })
118
120
  }
119
121
  };
122
+
123
+ const vads = _getUserId();
120
124
  const user = {
121
125
  ext: {
122
126
  ...(payloadUserEids && { eids: payloadUserEids }),
123
- ...(payload.gdpr_consent && { consent: payload.gdpr_consent })
127
+ ...(payload.gdpr_consent && { consent: payload.gdpr_consent }),
128
+ ...(vads && { vads })
124
129
  }
125
130
  };
126
131
  const regs = ('gdpr_applies' in payload) && {
@@ -382,4 +387,49 @@ function _isAdSlotExists(adUnitCode) {
382
387
  return false;
383
388
  }
384
389
 
390
+ // Generate user id (25 chars) with NanoID
391
+ // https://github.com/ai/nanoid/
392
+ function _generateUserId() {
393
+ for (
394
+ var t = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict',
395
+ e = new Date().getTime() % 1073741824,
396
+ i = '',
397
+ o = 0;
398
+ o < 5;
399
+ o++
400
+ ) {
401
+ i += t[e % 64];
402
+ e = Math.floor(e / 64);
403
+ }
404
+ for (o = 20; o--;) i += t[(64 * Math.random()) | 0];
405
+ return i;
406
+ }
407
+
408
+ function _getUserId() {
409
+ const USER_ID_KEY = '__vads';
410
+ let vads;
411
+
412
+ if (storage.cookiesAreEnabled()) {
413
+ vads = storage.getCookie(USER_ID_KEY);
414
+ } else if (storage.localStorageIsEnabled()) {
415
+ vads = storage.getDataFromLocalStorage(USER_ID_KEY);
416
+ }
417
+
418
+ if (vads && vads.length) {
419
+ return vads;
420
+ }
421
+
422
+ vads = _generateUserId();
423
+ if (storage.cookiesAreEnabled()) {
424
+ const expires = new Date(Date.now() + 2592e6).toUTCString();
425
+ storage.setCookie(USER_ID_KEY, vads, expires);
426
+ return vads;
427
+ } else if (storage.localStorageIsEnabled()) {
428
+ storage.setDataInLocalStorage(USER_ID_KEY, vads);
429
+ return vads;
430
+ }
431
+
432
+ return null;
433
+ }
434
+
385
435
  registerBidder(spec);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "8.7.0",
3
+ "version": "8.9.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
@@ -132,7 +132,7 @@
132
132
  "express": "^4.15.4",
133
133
  "fun-hooks": "^0.9.9",
134
134
  "just-clone": "^1.0.2",
135
- "live-connect-js": "^5.0.0"
135
+ "live-connect-js": "^6.0.0"
136
136
  },
137
137
  "optionalDependencies": {
138
138
  "fsevents": "^2.3.2"
@@ -25,7 +25,7 @@ import {useMetrics} from '../utils/perfMetrics.js';
25
25
  import {isActivityAllowed} from '../activities/rules.js';
26
26
  import {activityParams} from '../activities/activityParams.js';
27
27
  import {MODULE_TYPE_BIDDER} from '../activities/modules.js';
28
- import {ACTIVITY_TRANSMIT_TID} from '../activities/activities.js';
28
+ import {ACTIVITY_TRANSMIT_TID, ACTIVITY_TRANSMIT_UFPD} from '../activities/activities.js';
29
29
 
30
30
  /**
31
31
  * This file aims to support Adapters during the Prebid 0.x -> 1.x transition.
@@ -454,6 +454,15 @@ export const processBidderRequests = hook('sync', function (spec, bids, bidderRe
454
454
  onRequest(request);
455
455
 
456
456
  const networkDone = requestMetrics.startTiming('net');
457
+
458
+ function getOptions(defaults) {
459
+ const ro = request.options;
460
+ return Object.assign(defaults, ro, {
461
+ browsingTopics: ro?.hasOwnProperty('browsingTopics') && !ro.browsingTopics
462
+ ? false
463
+ : isActivityAllowed(ACTIVITY_TRANSMIT_UFPD, activityParams(MODULE_TYPE_BIDDER, spec.code))
464
+ })
465
+ }
457
466
  switch (request.method) {
458
467
  case 'GET':
459
468
  ajax(
@@ -463,10 +472,10 @@ export const processBidderRequests = hook('sync', function (spec, bids, bidderRe
463
472
  error: onFailure
464
473
  },
465
474
  undefined,
466
- Object.assign({
475
+ getOptions({
467
476
  method: 'GET',
468
477
  withCredentials: true
469
- }, request.options)
478
+ })
470
479
  );
471
480
  break;
472
481
  case 'POST':
@@ -477,11 +486,11 @@ export const processBidderRequests = hook('sync', function (spec, bids, bidderRe
477
486
  error: onFailure
478
487
  },
479
488
  typeof request.data === 'string' ? request.data : JSON.stringify(request.data),
480
- Object.assign({
489
+ getOptions({
481
490
  method: 'POST',
482
491
  contentType: 'text/plain',
483
492
  withCredentials: true
484
- }, request.options)
493
+ })
485
494
  );
486
495
  break;
487
496
  default:
package/src/adloader.js CHANGED
@@ -26,6 +26,7 @@ const _approvedLoadExternalJSList = [
26
26
  'airgrid',
27
27
  'clean.io',
28
28
  'a1Media',
29
+ 'geoedge',
29
30
  ]
30
31
 
31
32
  /**
package/src/ajax.js CHANGED
@@ -1,99 +1,138 @@
1
- import { config } from './config.js';
2
- import { logMessage, logError, parseUrl, buildUrl, _each } from './utils.js';
1
+ import {config} from './config.js';
2
+ import {buildUrl, logError, parseUrl} from './utils.js';
3
3
 
4
- const XHR_DONE = 4;
4
+ export const dep = {
5
+ fetch: window.fetch.bind(window),
6
+ makeRequest: (r, o) => new Request(r, o),
7
+ timeout(timeout, resource) {
8
+ const ctl = new AbortController();
9
+ let cancelTimer = setTimeout(() => {
10
+ ctl.abort();
11
+ logError(`Request timeout after ${timeout}ms`, resource);
12
+ cancelTimer = null;
13
+ }, timeout);
14
+ return {
15
+ signal: ctl.signal,
16
+ done() {
17
+ cancelTimer && clearTimeout(cancelTimer)
18
+ }
19
+ }
20
+ }
21
+ }
22
+
23
+ const GET = 'GET';
24
+ const POST = 'POST';
25
+ const CTYPE = 'Content-Type';
5
26
 
6
27
  /**
7
- * Simple IE9+ and cross-browser ajax request function
8
- * Note: x-domain requests in IE9 do not support the use of cookies
9
- *
10
- * @param url string url
11
- * @param callback {object | function} callback
12
- * @param data mixed data
13
- * @param options object
28
+ * transform legacy `ajax` parameters into a fetch request.
29
+ * @returns {Request}
14
30
  */
15
- export const ajax = ajaxBuilder();
16
-
17
- export function ajaxBuilder(timeout = 3000, {request, done} = {}) {
18
- return function(url, callback, data, options = {}) {
19
- try {
20
- let x;
21
- let method = options.method || (data ? 'POST' : 'GET');
22
- let parser = document.createElement('a');
23
- parser.href = url;
24
-
25
- let callbacks = typeof callback === 'object' && callback !== null ? callback : {
26
- success: function() {
27
- logMessage('xhr success');
28
- },
29
- error: function(e) {
30
- logError('xhr error', null, e);
31
- }
32
- };
31
+ export function toFetchRequest(url, data, options = {}) {
32
+ const method = options.method || (data ? POST : GET);
33
+ if (method === GET && data) {
34
+ const urlInfo = parseUrl(url, options);
35
+ Object.assign(urlInfo.search, data);
36
+ url = buildUrl(urlInfo);
37
+ }
38
+ const headers = new Headers(options.customHeaders);
39
+ headers.set(CTYPE, options.contentType || 'text/plain');
40
+ const rqOpts = {
41
+ method,
42
+ headers
43
+ }
44
+ if (method !== GET && data) {
45
+ rqOpts.body = data;
46
+ }
47
+ if (options.withCredentials) {
48
+ rqOpts.credentials = 'include';
49
+ }
50
+ if (options.browsingTopics && isSecureContext) {
51
+ // the Request constructor will throw an exception if the browser supports topics
52
+ // but we're not in a secure context
53
+ rqOpts.browsingTopics = true;
54
+ }
55
+ return dep.makeRequest(url, rqOpts);
56
+ }
33
57
 
34
- if (typeof callback === 'function') {
35
- callbacks.success = callback;
36
- }
58
+ /**
59
+ * Return a version of `fetch` that automatically cancels requests after `timeout` milliseconds.
60
+ *
61
+ * If provided, `request` and `done` should be functions accepting a single argument.
62
+ * `request` is invoked at the beginning of each request, and `done` at the end; both are passed its origin.
63
+ *
64
+ * @returns {function(*, {}?): Promise<Response>}
65
+ */
66
+ export function fetcherFactory(timeout = 3000, {request, done} = {}) {
67
+ let fetcher = (resource, options) => {
68
+ let to;
69
+ if (timeout != null && options?.signal == null && !config.getConfig('disableAjaxTimeout')) {
70
+ to = dep.timeout(timeout, resource);
71
+ options = Object.assign({signal: to.signal}, options);
72
+ }
73
+ let pm = dep.fetch(resource, options);
74
+ if (to?.done != null) pm = pm.finally(to.done);
75
+ return pm;
76
+ };
37
77
 
38
- x = new window.XMLHttpRequest();
78
+ if (request != null || done != null) {
79
+ fetcher = ((fetch) => function (resource, options) {
80
+ const origin = new URL(resource?.url == null ? resource : resource.url, document.location).origin;
81
+ let req = fetch(resource, options);
82
+ request && request(origin);
83
+ if (done) req = req.finally(() => done(origin));
84
+ return req;
85
+ })(fetcher);
86
+ }
87
+ return fetcher;
88
+ }
39
89
 
40
- x.onreadystatechange = function () {
41
- if (x.readyState === XHR_DONE) {
42
- if (typeof done === 'function') {
43
- done(parser.origin);
44
- }
45
- let status = x.status;
46
- if ((status >= 200 && status < 300) || status === 304) {
47
- callbacks.success(x.responseText, x);
48
- } else {
49
- callbacks.error(x.statusText, x);
50
- }
90
+ function toXHR({status, statusText = '', headers, url}, responseText) {
91
+ let xml = 0;
92
+ return {
93
+ readyState: XMLHttpRequest.DONE,
94
+ status,
95
+ statusText,
96
+ responseText,
97
+ response: responseText,
98
+ responseType: '',
99
+ responseURL: url,
100
+ get responseXML() {
101
+ if (xml === 0) {
102
+ try {
103
+ xml = new DOMParser().parseFromString(responseText, headers?.get(CTYPE)?.split(';')?.[0])
104
+ } catch (e) {
105
+ xml = null;
106
+ logError(e);
51
107
  }
52
- };
53
-
54
- // Disabled timeout temporarily to avoid xhr failed requests. https://github.com/prebid/Prebid.js/issues/2648
55
- if (!config.getConfig('disableAjaxTimeout')) {
56
- x.ontimeout = function () {
57
- logError(' xhr timeout after ', x.timeout, 'ms');
58
- };
59
108
  }
109
+ return xml;
110
+ },
111
+ getResponseHeader: (header) => headers?.has(header) ? headers.get(header) : null,
112
+ }
113
+ }
60
114
 
61
- if (method === 'GET' && data) {
62
- let urlInfo = parseUrl(url, options);
63
- Object.assign(urlInfo.search, data);
64
- url = buildUrl(urlInfo);
65
- }
66
-
67
- x.open(method, url, true);
68
- // IE needs timeout to be set after open - see #1410
69
- // Disabled timeout temporarily to avoid xhr failed requests. https://github.com/prebid/Prebid.js/issues/2648
70
- if (!config.getConfig('disableAjaxTimeout')) {
71
- x.timeout = timeout;
72
- }
73
-
74
- if (options.withCredentials) {
75
- x.withCredentials = true;
76
- }
77
- _each(options.customHeaders, (value, header) => {
78
- x.setRequestHeader(header, value);
79
- });
80
- if (options.preflight) {
81
- x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
82
- }
83
- x.setRequestHeader('Content-Type', options.contentType || 'text/plain');
84
-
85
- if (typeof request === 'function') {
86
- request(parser.origin);
87
- }
115
+ /**
116
+ * attach legacy `ajax` callbacks to a fetch promise.
117
+ */
118
+ export function attachCallbacks(fetchPm, callback) {
119
+ const {success, error} = typeof callback === 'object' && callback != null ? callback : {
120
+ success: typeof callback === 'function' ? callback : () => null,
121
+ error: (e, x) => logError('Network error', e, x)
122
+ };
123
+ fetchPm.then(response => response.text().then((responseText) => [response, responseText]))
124
+ .then(([response, responseText]) => {
125
+ const xhr = toXHR(response, responseText);
126
+ response.ok || response.status === 304 ? success(responseText, xhr) : error(response.statusText, xhr);
127
+ }, () => error('', toXHR({status: 0}, '')));
128
+ }
88
129
 
89
- if (method === 'POST' && data) {
90
- x.send(data);
91
- } else {
92
- x.send();
93
- }
94
- } catch (error) {
95
- logError('xhr construction', error);
96
- typeof callback === 'object' && callback !== null && callback.error(error);
97
- }
98
- }
130
+ export function ajaxBuilder(timeout = 3000, {request, done} = {}) {
131
+ const fetcher = fetcherFactory(timeout, {request, done});
132
+ return function (url, callback, data, options = {}) {
133
+ attachCallbacks(fetcher(toFetchRequest(url, data, options)), callback);
134
+ };
99
135
  }
136
+
137
+ export const ajax = ajaxBuilder();
138
+ export const fetch = fetcherFactory();