prebid.js 7.10.0 → 7.13.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 (366) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +16 -10
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/workflows/codeql-analysis.yml +73 -0
  4. package/.github/workflows/issue_tracker.yml +1 -1
  5. package/README.md +0 -2
  6. package/babelConfig.js +10 -4
  7. package/dist/33acrossBidAdapter.js +1 -1
  8. package/dist/acuityAdsBidAdapter.js +1 -0
  9. package/dist/adagioBidAdapter.js +1 -1
  10. package/dist/adbookpspBidAdapter.js +1 -1
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/adkernelBidAdapter.js +1 -1
  13. package/dist/adrelevantisBidAdapter.js +1 -1
  14. package/dist/adriverBidAdapter.js +1 -1
  15. package/dist/adriverIdSystem.js +1 -1
  16. package/dist/adtelligentBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -0
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/alkimiBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aniviewBidAdapter.js +1 -1
  25. package/dist/aolBidAdapter.js +1 -1
  26. package/dist/appierAnalyticsAdapter.js +1 -1
  27. package/dist/appnexusBidAdapter.js +1 -1
  28. package/dist/asoBidAdapter.js +1 -1
  29. package/dist/audiencerunBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/beopBidAdapter.js +1 -1
  32. package/dist/betweenBidAdapter.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bluebillywigBidAdapter.js +1 -1
  37. package/dist/brandmetricsRtdProvider.js +1 -1
  38. package/dist/bridgewellBidAdapter.js +1 -1
  39. package/dist/brightMountainMediaBidAdapter.js +1 -1
  40. package/dist/browsiRtdProvider.js +1 -1
  41. package/dist/cleanioRtdProvider.js +1 -1
  42. package/dist/concertBidAdapter.js +1 -1
  43. package/dist/connectadBidAdapter.js +1 -1
  44. package/dist/consentManagement.js +1 -1
  45. package/dist/consentManagementUsp.js +1 -1
  46. package/dist/consumableBidAdapter.js +1 -1
  47. package/dist/conversantBidAdapter.js +1 -1
  48. package/dist/cpmstarBidAdapter.js +1 -1
  49. package/dist/craftBidAdapter.js +1 -1
  50. package/dist/criteoBidAdapter.js +1 -1
  51. package/dist/currency.js +1 -1
  52. package/dist/datawrkzBidAdapter.js +1 -0
  53. package/dist/debugging-standalone.js +1 -1
  54. package/dist/dfpAdServerVideo.js +1 -1
  55. package/dist/dgkeywordRtdProvider.js +1 -1
  56. package/dist/displayioBidAdapter.js +1 -3
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/enrichmentFpdModule.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/glimpseBidAdapter.js +1 -1
  62. package/dist/gmosspBidAdapter.js +1 -1
  63. package/dist/goldbachBidAdapter.js +1 -1
  64. package/dist/gridBidAdapter.js +1 -1
  65. package/dist/gridNMBidAdapter.js +1 -1
  66. package/dist/gumgumBidAdapter.js +1 -1
  67. package/dist/h12mediaBidAdapter.js +1 -1
  68. package/dist/id5IdSystem.js +1 -1
  69. package/dist/imRtdProvider.js +1 -1
  70. package/dist/impactifyBidAdapter.js +1 -1
  71. package/dist/improvedigitalBidAdapter.js +1 -1
  72. package/dist/inmarBidAdapter.js +1 -1
  73. package/dist/insticatorBidAdapter.js +1 -1
  74. package/dist/ixBidAdapter.js +1 -1
  75. package/dist/jixieBidAdapter.js +1 -1
  76. package/dist/justpremiumBidAdapter.js +1 -1
  77. package/dist/kargoBidAdapter.js +1 -1
  78. package/dist/konduitAnalyticsAdapter.js +1 -1
  79. package/dist/kueezBidAdapter.js +1 -1
  80. package/dist/lassoBidAdapter.js +1 -1
  81. package/dist/lifestreetBidAdapter.js +1 -0
  82. package/dist/limelightDigitalBidAdapter.js +1 -1
  83. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  84. package/dist/logicadBidAdapter.js +1 -1
  85. package/dist/loglyliftBidAdapter.js +1 -1
  86. package/dist/mabidderBidAdapter.js +1 -0
  87. package/dist/malltvAnalyticsAdapter.js +1 -1
  88. package/dist/marsmediaBidAdapter.js +1 -1
  89. package/dist/mediafuseBidAdapter.js +1 -1
  90. package/dist/mediagoBidAdapter.js +1 -0
  91. package/dist/mediakeysBidAdapter.js +1 -1
  92. package/dist/mediasquareBidAdapter.js +1 -1
  93. package/dist/mgidBidAdapter.js +1 -1
  94. package/dist/minutemediaBidAdapter.js +1 -1
  95. package/dist/nextMillenniumBidAdapter.js +1 -1
  96. package/dist/not-for-prod/prebid.js +153 -147
  97. package/dist/oguryBidAdapter.js +1 -1
  98. package/dist/oneKeyIdSystem.js +1 -0
  99. package/dist/oneKeyRtdProvider.js +1 -0
  100. package/dist/onetagBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxAnalyticsAdapter.js +1 -1
  103. package/dist/outbrainBidAdapter.js +1 -1
  104. package/dist/parrableIdSystem.js +1 -1
  105. package/dist/permutiveRtdProvider.js +1 -1
  106. package/dist/pixfutureBidAdapter.js +1 -1
  107. package/dist/prebid-core.js +2 -2
  108. package/dist/publinkIdSystem.js +1 -1
  109. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  110. package/dist/pubmaticBidAdapter.js +1 -1
  111. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  112. package/dist/pxyzBidAdapter.js +1 -1
  113. package/dist/quantcastBidAdapter.js +1 -1
  114. package/dist/rasBidAdapter.js +1 -1
  115. package/dist/readpeakBidAdapter.js +1 -1
  116. package/dist/relaidoBidAdapter.js +1 -1
  117. package/dist/rhythmoneBidAdapter.js +1 -1
  118. package/dist/riseBidAdapter.js +1 -1
  119. package/dist/rtbhouseBidAdapter.js +1 -1
  120. package/dist/rubiconAnalyticsAdapter.js +1 -1
  121. package/dist/rubiconBidAdapter.js +1 -1
  122. package/dist/seedingAllianceBidAdapter.js +1 -1
  123. package/dist/seedtagBidAdapter.js +1 -1
  124. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  125. package/dist/sharethroughBidAdapter.js +1 -1
  126. package/dist/shinezBidAdapter.js +1 -1
  127. package/dist/smaatoBidAdapter.js +1 -1
  128. package/dist/smartadserverBidAdapter.js +1 -1
  129. package/dist/smartxBidAdapter.js +1 -1
  130. package/dist/smilewantedBidAdapter.js +1 -1
  131. package/dist/sonobiBidAdapter.js +1 -1
  132. package/dist/sovrnAnalyticsAdapter.js +1 -1
  133. package/dist/sovrnBidAdapter.js +1 -1
  134. package/dist/sspBCBidAdapter.js +1 -1
  135. package/dist/sublimeBidAdapter.js +1 -1
  136. package/dist/synacormediaBidAdapter.js +1 -1
  137. package/dist/tappxBidAdapter.js +1 -1
  138. package/dist/targetVideoBidAdapter.js +1 -1
  139. package/dist/teadsBidAdapter.js +1 -1
  140. package/dist/trionBidAdapter.js +1 -1
  141. package/dist/tripleliftBidAdapter.js +1 -1
  142. package/dist/trustpidSystem.js +1 -1
  143. package/dist/ttdBidAdapter.js +1 -1
  144. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  145. package/dist/underdogmediaBidAdapter.js +1 -1
  146. package/dist/undertoneBidAdapter.js +1 -1
  147. package/dist/userId.js +1 -1
  148. package/dist/vidazooBidAdapter.js +1 -1
  149. package/dist/videobyteBidAdapter.js +1 -1
  150. package/dist/viewability.js +1 -1
  151. package/dist/visxBidAdapter.js +1 -1
  152. package/dist/vuukleBidAdapter.js +1 -1
  153. package/dist/widespaceBidAdapter.js +1 -1
  154. package/dist/winrBidAdapter.js +1 -1
  155. package/dist/yahoosspBidAdapter.js +1 -1
  156. package/dist/yieldmoBidAdapter.js +1 -1
  157. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  158. package/dist/zeta_global_sspBidAdapter.js +1 -1
  159. package/integrationExamples/gpt/permutiveRtdProvider_example.html +1 -1
  160. package/karma.conf.maker.js +2 -13
  161. package/modules/.submodules.json +2 -0
  162. package/modules/acuityAdsBidAdapter.js +207 -0
  163. package/modules/acuityAdsBidAdapter.md +79 -0
  164. package/modules/adagioBidAdapter.js +2 -3
  165. package/modules/adgenerationBidAdapter.js +2 -2
  166. package/modules/adkernelBidAdapter.js +28 -12
  167. package/modules/admixerBidAdapter.js +1 -1
  168. package/modules/adnowBidAdapter.js +1 -1
  169. package/modules/adpod.js +1 -1
  170. package/modules/adrelevantisBidAdapter.js +2 -2
  171. package/modules/adriverBidAdapter.js +5 -12
  172. package/modules/adriverIdSystem.js +2 -1
  173. package/modules/adtargetBidAdapter.js +1 -1
  174. package/modules/adtelligentBidAdapter.js +6 -2
  175. package/modules/adtrgtmeBidAdapter.js +333 -0
  176. package/modules/adtrgtmeBidAdapter.md +69 -0
  177. package/modules/adtrueBidAdapter.js +1 -1
  178. package/modules/adxpremiumAnalyticsAdapter.js +1 -1
  179. package/modules/adyoulikeBidAdapter.js +1 -1
  180. package/modules/alkimiBidAdapter.js +2 -1
  181. package/modules/aniviewBidAdapter.js +1 -1
  182. package/modules/appnexusBidAdapter.js +13 -93
  183. package/modules/apstreamBidAdapter.js +2 -2
  184. package/modules/beopBidAdapter.js +4 -4
  185. package/modules/betweenBidAdapter.js +4 -4
  186. package/modules/bidwatchAnalyticsAdapter.js +112 -59
  187. package/modules/bizzclickBidAdapter.js +1 -1
  188. package/modules/brightMountainMediaBidAdapter.js +1 -1
  189. package/modules/browsiRtdProvider.js +24 -10
  190. package/modules/cleanmedianetBidAdapter.js +1 -1
  191. package/modules/consentManagement.js +1 -1
  192. package/modules/consentManagementUsp.js +1 -1
  193. package/modules/consumableBidAdapter.js +43 -3
  194. package/modules/cpmstarBidAdapter.js +23 -13
  195. package/modules/criteoBidAdapter.js +19 -13
  196. package/modules/currency.js +1 -0
  197. package/modules/cwireBidAdapter.js +1 -1
  198. package/modules/datablocksBidAdapter.js +1 -1
  199. package/modules/datawrkzBidAdapter.js +633 -0
  200. package/modules/datawrkzBidAdapter.md +160 -0
  201. package/modules/dfpAdServerVideo.js +2 -2
  202. package/modules/dgkeywordRtdProvider.js +10 -1
  203. package/modules/displayioBidAdapter.js +92 -97
  204. package/modules/dspxBidAdapter.js +1 -1
  205. package/modules/e_volutionBidAdapter.js +3 -3
  206. package/modules/ebdrBidAdapter.js +1 -1
  207. package/modules/emx_digitalBidAdapter.js +1 -1
  208. package/modules/enrichmentFpdModule.js +11 -0
  209. package/modules/fabrickIdSystem.js +2 -2
  210. package/modules/gamoshiBidAdapter.js +1 -1
  211. package/modules/getintentBidAdapter.js +1 -1
  212. package/modules/gjirafaBidAdapter.js +2 -2
  213. package/modules/goldbachBidAdapter.js +8 -8
  214. package/modules/gothamadsBidAdapter.js +2 -2
  215. package/modules/gumgumBidAdapter.js +3 -3
  216. package/modules/h12mediaBidAdapter.js +1 -1
  217. package/modules/id5AnalyticsAdapter.js +1 -1
  218. package/modules/id5IdSystem.js +160 -111
  219. package/modules/id5IdSystem.md +16 -14
  220. package/modules/imRtdProvider.js +20 -7
  221. package/modules/imRtdProvider.md +3 -1
  222. package/modules/impactifyBidAdapter.js +1 -1
  223. package/modules/improvedigitalBidAdapter.js +50 -28
  224. package/modules/inskinBidAdapter.js +1 -1
  225. package/modules/insticatorBidAdapter.js +1 -1
  226. package/modules/integr8BidAdapter.js +2 -2
  227. package/modules/intentIqIdSystem.js +2 -2
  228. package/modules/interactiveOffersBidAdapter.js +1 -1
  229. package/modules/iqmBidAdapter.js +1 -1
  230. package/modules/ixBidAdapter.js +21 -328
  231. package/modules/ixBidAdapter.md +1 -19
  232. package/modules/kargoBidAdapter.js +4 -5
  233. package/modules/krushmediaBidAdapter.js +2 -2
  234. package/modules/lassoBidAdapter.js +3 -3
  235. package/modules/lifestreetBidAdapter.js +143 -0
  236. package/modules/limelightDigitalBidAdapter.js +2 -1
  237. package/modules/livewrappedAnalyticsAdapter.js +3 -3
  238. package/modules/lkqdBidAdapter.js +3 -3
  239. package/modules/loganBidAdapter.js +2 -2
  240. package/modules/luponmediaBidAdapter.js +3 -3
  241. package/modules/mabidderBidAdapter.js +60 -0
  242. package/modules/mabidderBidAdapter.md +31 -0
  243. package/modules/malltvBidAdapter.js +2 -2
  244. package/modules/mediagoBidAdapter.js +462 -0
  245. package/modules/mediagoBidAdapter.md +34 -0
  246. package/modules/mediakeysBidAdapter.js +2 -2
  247. package/modules/mgidBidAdapter.js +2 -2
  248. package/modules/nextMillenniumBidAdapter.js +25 -6
  249. package/modules/nobidBidAdapter.js +2 -2
  250. package/modules/novatiqIdSystem.js +1 -1
  251. package/modules/oneKeyIdSystem.js +78 -0
  252. package/modules/oneKeyIdSystem.md +109 -0
  253. package/modules/oneKeyRtdProvider.js +98 -0
  254. package/modules/oneKeyRtdProvider.md +127 -0
  255. package/modules/open8BidAdapter.js +1 -1
  256. package/modules/openwebBidAdapter.js +1 -1
  257. package/modules/openxAnalyticsAdapter.js +5 -744
  258. package/modules/openxAnalyticsAdapter.md +4 -0
  259. package/modules/openxBidAdapter.js +3 -3
  260. package/modules/permutiveRtdProvider.js +55 -8
  261. package/modules/pixfutureBidAdapter.js +1 -1
  262. package/modules/prebidmanagerAnalyticsAdapter.js +1 -1
  263. package/modules/priceFloors.js +1 -1
  264. package/modules/pubmaticAnalyticsAdapter.js +1 -1
  265. package/modules/pubmaticBidAdapter.js +19 -1
  266. package/modules/pubwiseAnalyticsAdapter.js +1 -1
  267. package/modules/pubwiseBidAdapter.js +3 -3
  268. package/modules/pubxBidAdapter.js +1 -1
  269. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  270. package/modules/quantcastIdSystem.js +1 -1
  271. package/modules/radsBidAdapter.js +1 -1
  272. package/modules/rasBidAdapter.js +8 -0
  273. package/modules/rasBidAdapter.md +14 -13
  274. package/modules/revcontentBidAdapter.js +1 -1
  275. package/modules/richaudienceBidAdapter.js +1 -1
  276. package/modules/rtbhouseBidAdapter.js +25 -1
  277. package/modules/schain.js +1 -1
  278. package/modules/seedtagBidAdapter.md +25 -56
  279. package/modules/showheroes-bsBidAdapter.js +1 -1
  280. package/modules/sizeMappingV2.js +1 -1
  281. package/modules/smaatoBidAdapter.js +2 -2
  282. package/modules/sonobiAnalyticsAdapter.js +1 -1
  283. package/modules/sonobiBidAdapter.js +4 -3
  284. package/modules/staqAnalyticsAdapter.js +1 -1
  285. package/modules/tappxBidAdapter.js +11 -2
  286. package/modules/targetVideoBidAdapter.js +1 -1
  287. package/modules/theAdxBidAdapter.js +2 -2
  288. package/modules/tpmnBidAdapter.js +1 -1
  289. package/modules/trionBidAdapter.js +2 -2
  290. package/modules/tripleliftBidAdapter.js +20 -1
  291. package/modules/trustpidSystem.js +6 -42
  292. package/modules/trustpidSystem.md +10 -10
  293. package/modules/underdogmediaBidAdapter.js +1 -1
  294. package/modules/userId/eids.js +26 -0
  295. package/modules/userId/userId.md +2 -2
  296. package/modules/vdoaiBidAdapter.js +1 -1
  297. package/modules/vidazooBidAdapter.js +7 -5
  298. package/modules/vidoomyBidAdapter.js +1 -1
  299. package/modules/viewability.js +14 -14
  300. package/modules/winrBidAdapter.js +1 -1
  301. package/modules/yahoosspBidAdapter.js +3 -3
  302. package/modules/yandexBidAdapter.js +1 -1
  303. package/modules/yieldmoBidAdapter.js +3 -3
  304. package/modules/yieldoneBidAdapter.js +2 -2
  305. package/modules/zeta_global_sspBidAdapter.js +24 -21
  306. package/package.json +3 -3
  307. package/src/Renderer.js +1 -1
  308. package/src/adloader.js +2 -1
  309. package/src/adserver.js +0 -56
  310. package/src/auction.js +60 -16
  311. package/src/bidfactory.js +1 -1
  312. package/src/native.js +75 -60
  313. package/src/refererDetection.js +12 -1
  314. package/src/sizeMapping.js +5 -7
  315. package/src/targeting.js +1 -1
  316. package/src/userSync.js +1 -1
  317. package/src/utils/promise.js +3 -1
  318. package/src/utils.js +27 -0
  319. package/src/video.js +5 -4
  320. package/src/videoCache.js +8 -2
  321. package/test/pages/instream.html +2 -2
  322. package/test/spec/modules/acuityAdsBidAdapter_spec.js +398 -0
  323. package/test/spec/modules/adagioBidAdapter_spec.js +2 -0
  324. package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
  325. package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
  326. package/test/spec/modules/adriverIdSystem_spec.js +3 -8
  327. package/test/spec/modules/adtelligentBidAdapter_spec.js +2 -0
  328. package/test/spec/modules/adtrgtmeBidAdapter_spec.js +802 -0
  329. package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
  330. package/test/spec/modules/appnexusBidAdapter_spec.js +1 -0
  331. package/test/spec/modules/beopBidAdapter_spec.js +11 -0
  332. package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
  333. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
  334. package/test/spec/modules/big-richmediaBidAdapter_spec.js +1 -0
  335. package/test/spec/modules/browsiRtdProvider_spec.js +40 -1
  336. package/test/spec/modules/consumableBidAdapter_spec.js +158 -0
  337. package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
  338. package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
  339. package/test/spec/modules/currency_spec.js +22 -0
  340. package/test/spec/modules/datawrkzBidAdapter_spec.js +656 -0
  341. package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
  342. package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
  343. package/test/spec/modules/enrichmentFpdModule_spec.js +16 -1
  344. package/test/spec/modules/fpdModule_spec.js +2 -1
  345. package/test/spec/modules/id5IdSystem_spec.js +529 -172
  346. package/test/spec/modules/imRtdProvider_spec.js +10 -5
  347. package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
  348. package/test/spec/modules/ixBidAdapter_spec.js +216 -123
  349. package/test/spec/modules/kargoBidAdapter_spec.js +11 -2
  350. package/test/spec/modules/lifestreetBidAdapter_spec.js +232 -0
  351. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +59 -7
  352. package/test/spec/modules/mabidderBidAdapter_spec.js +125 -0
  353. package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
  354. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
  355. package/test/spec/modules/oneKeyIdSystem_spec.js +107 -0
  356. package/test/spec/modules/oneKeyRtdProvider_spec.js +152 -0
  357. package/test/spec/modules/openxAnalyticsAdapter_spec.js +6 -638
  358. package/test/spec/modules/permutiveRtdProvider_spec.js +152 -2
  359. package/test/spec/modules/pubmaticBidAdapter_spec.js +69 -4
  360. package/test/spec/modules/rasBidAdapter_spec.js +2 -0
  361. package/test/spec/modules/tripleliftBidAdapter_spec.js +18 -0
  362. package/test/spec/modules/trustpidSystem_spec.js +27 -45
  363. package/test/spec/modules/vidazooBidAdapter_spec.js +36 -23
  364. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +59 -0
  365. package/test/spec/native_spec.js +257 -2
  366. package/test/spec/videoCache_spec.js +37 -7
package/src/adserver.js CHANGED
@@ -1,61 +1,5 @@
1
- import { formatQS } from './utils.js';
2
- import { targeting } from './targeting.js';
3
1
  import {hook} from './hook.js';
4
2
 
5
- // Adserver parent class
6
- const AdServer = function(attr) {
7
- this.name = attr.adserver;
8
- this.code = attr.code;
9
- this.getWinningBidByCode = function() {
10
- return targeting.getWinningBids(this.code)[0];
11
- };
12
- };
13
-
14
- // DFP ad server
15
- // TODO: this seems to be unused?
16
- export function dfpAdserver(options, urlComponents) {
17
- var adserver = new AdServer(options);
18
- adserver.urlComponents = urlComponents;
19
-
20
- var dfpReqParams = {
21
- 'env': 'vp',
22
- 'gdfp_req': '1',
23
- 'impl': 's',
24
- 'unviewed_position_start': '1'
25
- };
26
-
27
- var dfpParamsWithVariableValue = ['output', 'iu', 'sz', 'url', 'correlator', 'description_url', 'hl'];
28
-
29
- var getCustomParams = function(targeting) {
30
- return encodeURIComponent(formatQS(targeting));
31
- };
32
-
33
- adserver.appendQueryParams = function() {
34
- var bid = adserver.getWinningBidByCode();
35
- if (bid) {
36
- this.urlComponents.search.description_url = encodeURIComponent(bid.vastUrl);
37
- this.urlComponents.search.cust_params = getCustomParams(bid.adserverTargeting);
38
- this.urlComponents.search.correlator = Date.now();
39
- }
40
- };
41
-
42
- adserver.verifyAdserverTag = function() {
43
- for (var key in dfpReqParams) {
44
- if (!this.urlComponents.search.hasOwnProperty(key) || this.urlComponents.search[key] !== dfpReqParams[key]) {
45
- return false;
46
- }
47
- }
48
- for (var i in dfpParamsWithVariableValue) {
49
- if (!this.urlComponents.search.hasOwnProperty(dfpParamsWithVariableValue[i])) {
50
- return false;
51
- }
52
- }
53
- return true;
54
- };
55
-
56
- return adserver;
57
- };
58
-
59
3
  /**
60
4
  * return the GAM PPID, if available (eid for the userID configured with `userSync.ppidSource`)
61
5
  */
package/src/auction.js CHANGED
@@ -498,8 +498,9 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
498
498
  transactionId: bidResponse.transactionId
499
499
  }), 'video');
500
500
  const context = videoMediaType && deepAccess(videoMediaType, 'context');
501
+ const useCacheKey = videoMediaType && deepAccess(videoMediaType, 'useCacheKey');
501
502
 
502
- if (config.getConfig('cache.url') && context !== OUTSTREAM) {
503
+ if (config.getConfig('cache.url') && (useCacheKey || context !== OUTSTREAM)) {
503
504
  if (!bidResponse.videoCacheKey || config.getConfig('cache.ignoreBidderCacheKey')) {
504
505
  addBid = false;
505
506
  callPrebidCache(auctionInstance, bidResponse, afterBidAdded, videoMediaType);
@@ -514,28 +515,71 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
514
515
  }
515
516
  }
516
517
 
517
- export const callPrebidCache = hook('async', function(auctionInstance, bidResponse, afterBidAdded, videoMediaType) {
518
- store([bidResponse], function (error, cacheIds) {
519
- if (error) {
520
- logWarn(`Failed to save to the video cache: ${error}. Video bid must be discarded.`);
521
-
522
- doCallbacksIfTimedout(auctionInstance, bidResponse);
523
- } else {
524
- if (cacheIds[0].uuid === '') {
525
- logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
518
+ const storeInCache = (batch) => {
519
+ store(batch.map(entry => entry.bidResponse), function (error, cacheIds) {
520
+ cacheIds.forEach((cacheId, i) => {
521
+ const { auctionInstance, bidResponse, afterBidAdded } = batch[i];
522
+ if (error) {
523
+ logWarn(`Failed to save to the video cache: ${error}. Video bid must be discarded.`);
526
524
 
527
525
  doCallbacksIfTimedout(auctionInstance, bidResponse);
528
526
  } else {
529
- bidResponse.videoCacheKey = cacheIds[0].uuid;
527
+ if (cacheId.uuid === '') {
528
+ logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
530
529
 
531
- if (!bidResponse.vastUrl) {
532
- bidResponse.vastUrl = getCacheUrl(bidResponse.videoCacheKey);
530
+ doCallbacksIfTimedout(auctionInstance, bidResponse);
531
+ } else {
532
+ bidResponse.videoCacheKey = cacheId.uuid;
533
+
534
+ if (!bidResponse.vastUrl) {
535
+ bidResponse.vastUrl = getCacheUrl(bidResponse.videoCacheKey);
536
+ }
537
+ addBidToAuction(auctionInstance, bidResponse);
538
+ afterBidAdded();
533
539
  }
534
- addBidToAuction(auctionInstance, bidResponse);
535
- afterBidAdded();
536
540
  }
537
- }
541
+ });
538
542
  });
543
+ };
544
+
545
+ let batchSize, batchTimeout;
546
+ config.getConfig('cache', (cacheConfig) => {
547
+ batchSize = typeof cacheConfig.cache.batchSize === 'number' && cacheConfig.cache.batchSize > 0
548
+ ? cacheConfig.cache.batchSize
549
+ : 1;
550
+ batchTimeout = typeof cacheConfig.cache.batchTimeout === 'number' && cacheConfig.cache.batchTimeout > 0
551
+ ? cacheConfig.cache.batchTimeout
552
+ : 0;
553
+ });
554
+
555
+ export const batchingCache = (timeout = setTimeout, cache = storeInCache) => {
556
+ let batches = [[]];
557
+ let debouncing = false;
558
+ const noTimeout = cb => cb();
559
+
560
+ return function(auctionInstance, bidResponse, afterBidAdded) {
561
+ const batchFunc = batchTimeout > 0 ? timeout : noTimeout;
562
+ if (batches[batches.length - 1].length >= batchSize) {
563
+ batches.push([]);
564
+ }
565
+
566
+ batches[batches.length - 1].push({auctionInstance, bidResponse, afterBidAdded});
567
+
568
+ if (!debouncing) {
569
+ debouncing = true;
570
+ batchFunc(() => {
571
+ batches.forEach(cache);
572
+ batches = [[]];
573
+ debouncing = false;
574
+ }, batchTimeout);
575
+ }
576
+ }
577
+ };
578
+
579
+ const batchAndStore = batchingCache();
580
+
581
+ export const callPrebidCache = hook('async', function(auctionInstance, bidResponse, afterBidAdded, videoMediaType) {
582
+ batchAndStore(auctionInstance, bidResponse, afterBidAdded);
539
583
  }, 'callPrebidCache');
540
584
 
541
585
  // Postprocess the bids so that all the universal properties exist, no matter which bidder they came from.
package/src/bidfactory.js CHANGED
@@ -59,7 +59,7 @@ function Bid(statusCode, {src = 'client', bidder = '', bidId, transactionId, auc
59
59
  transactionId: this.transactionId,
60
60
  auctionId: this.auctionId
61
61
  }
62
- }
62
+ };
63
63
  }
64
64
 
65
65
  // Bid factory function.
package/src/native.js CHANGED
@@ -272,7 +272,7 @@ export function fireNativeTrackers(message, bidResponse) {
272
272
  const nativeResponse = bidResponse.native.ortb || legacyPropertiesToOrtbNative(bidResponse.native);
273
273
 
274
274
  if (message.action === 'click') {
275
- fireClickTrackers(nativeResponse);
275
+ fireClickTrackers(nativeResponse, message?.assetId);
276
276
  } else {
277
277
  fireImpressionTrackers(nativeResponse);
278
278
  }
@@ -305,8 +305,27 @@ export function fireImpressionTrackers(nativeResponse, {runMarkup = (mkup) => in
305
305
  }
306
306
  }
307
307
 
308
- export function fireClickTrackers(nativeResponse, {fetchURL = triggerPixel} = {}) {
309
- (nativeResponse.link?.clicktrackers || []).forEach(url => fetchURL(url));
308
+ export function fireClickTrackers(nativeResponse, assetId = null, {fetchURL = triggerPixel} = {}) {
309
+ // legacy click tracker
310
+ if (!assetId) {
311
+ (nativeResponse.link?.clicktrackers || []).forEach(url => fetchURL(url));
312
+ } else {
313
+ // ortb click tracker. This will try to call the clicktracker associated with the asset;
314
+ // will fallback to the link if none is found.
315
+ const assetIdLinkMap = (nativeResponse.assets || [])
316
+ .filter(a => a.link)
317
+ .reduce((map, asset) => {
318
+ map[asset.id] = asset.link;
319
+ return map
320
+ }, {});
321
+ const masterClickTrackers = nativeResponse.link?.clicktrackers || [];
322
+ let assetLink = assetIdLinkMap[assetId];
323
+ let clickTrackers = masterClickTrackers;
324
+ if (assetLink) {
325
+ clickTrackers = assetLink.clicktrackers || [];
326
+ }
327
+ clickTrackers.forEach(url => fetchURL(url));
328
+ }
310
329
  }
311
330
 
312
331
  /**
@@ -366,34 +385,9 @@ export function getNativeTargeting(bid, {index = auctionManager.index} = {}) {
366
385
  return keyValues;
367
386
  }
368
387
 
369
- /**
370
- * Constructs a message object containing asset values for each of the
371
- * requested data keys.
372
- */
373
- export function getAssetMessage(data, adObject) {
374
- const message = {
375
- message: 'assetResponse',
376
- adId: data.adId,
377
- assets: [],
378
- };
379
-
380
- if (adObject.native.hasOwnProperty('adTemplate')) {
381
- message.adTemplate = getAssetValue(adObject.native['adTemplate']);
382
- } if (adObject.native.hasOwnProperty('rendererUrl')) {
383
- message.rendererUrl = getAssetValue(adObject.native['rendererUrl']);
384
- }
385
-
386
- data.assets.forEach(asset => {
387
- const key = getKeyByValue(CONSTANTS.NATIVE_KEYS, asset);
388
- const value = getAssetValue(adObject.native[key]);
388
+ const getNativeRequest = (bidResponse) => auctionManager.index.getAdUnit(bidResponse)?.nativeOrtbRequest;
389
389
 
390
- message.assets.push({ key, value });
391
- });
392
-
393
- return message;
394
- }
395
-
396
- export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse) => auctionManager.index.getAdUnit(bidResponse).nativeOrtbRequest} = {}) {
390
+ function assetsMessage(data, adObject, keys, {getNativeReq = getNativeRequest} = {}) {
397
391
  const message = {
398
392
  message: 'assetResponse',
399
393
  adId: data.adId,
@@ -401,12 +395,12 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse
401
395
 
402
396
  // Pass to Prebid Universal Creative all assets, the legacy ones + the ortb ones (under ortb property)
403
397
  const ortbRequest = getNativeReq(adObject);
404
- let nativeReq = adObject.native;
398
+ let nativeResp = adObject.native;
405
399
  const ortbResponse = adObject.native?.ortb;
406
400
  let legacyResponse = {};
407
401
  if (ortbRequest && ortbResponse) {
408
402
  legacyResponse = toLegacyResponse(ortbResponse, ortbRequest);
409
- nativeReq = {
403
+ nativeResp = {
410
404
  ...adObject.native,
411
405
  ...legacyResponse
412
406
  };
@@ -416,20 +410,20 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse
416
410
  }
417
411
  message.assets = [];
418
412
 
419
- Object.keys(nativeReq).forEach(function(key) {
420
- if (key === 'adTemplate' && nativeReq[key]) {
421
- message.adTemplate = getAssetValue(nativeReq[key]);
422
- } else if (key === 'rendererUrl' && nativeReq[key]) {
423
- message.rendererUrl = getAssetValue(nativeReq[key]);
413
+ (keys == null ? Object.keys(nativeResp) : keys).forEach(function(key) {
414
+ if (key === 'adTemplate' && nativeResp[key]) {
415
+ message.adTemplate = getAssetValue(nativeResp[key]);
416
+ } else if (key === 'rendererUrl' && nativeResp[key]) {
417
+ message.rendererUrl = getAssetValue(nativeResp[key]);
424
418
  } else if (key === 'ext') {
425
- Object.keys(nativeReq[key]).forEach(extKey => {
426
- if (nativeReq[key][extKey]) {
427
- const value = getAssetValue(nativeReq[key][extKey]);
419
+ Object.keys(nativeResp[key]).forEach(extKey => {
420
+ if (nativeResp[key][extKey]) {
421
+ const value = getAssetValue(nativeResp[key][extKey]);
428
422
  message.assets.push({ key: extKey, value });
429
423
  }
430
424
  })
431
- } else if (nativeReq[key] && CONSTANTS.NATIVE_KEYS.hasOwnProperty(key)) {
432
- const value = getAssetValue(nativeReq[key]);
425
+ } else if (nativeResp[key] && CONSTANTS.NATIVE_KEYS.hasOwnProperty(key)) {
426
+ const value = getAssetValue(nativeResp[key]);
433
427
 
434
428
  message.assets.push({ key, value });
435
429
  }
@@ -437,6 +431,19 @@ export function getAllAssetsMessage(data, adObject, {getNativeReq = (bidResponse
437
431
  return message;
438
432
  }
439
433
 
434
+ /**
435
+ * Constructs a message object containing asset values for each of the
436
+ * requested data keys.
437
+ */
438
+ export function getAssetMessage(data, adObject, {getNativeReq = getNativeRequest} = {}) {
439
+ const keys = data.assets.map((k) => getKeyByValue(CONSTANTS.NATIVE_KEYS, k));
440
+ return assetsMessage(data, adObject, keys, {getNativeReq});
441
+ }
442
+
443
+ export function getAllAssetsMessage(data, adObject, {getNativeReq = getNativeRequest} = {}) {
444
+ return assetsMessage(data, adObject, null, {getNativeReq});
445
+ }
446
+
440
447
  /**
441
448
  * Native assets can be a string or an object with a url prop. Returns the value
442
449
  * appropriate for sending in adserver targeting or placeholder replacement.
@@ -689,40 +696,47 @@ export function legacyPropertiesToOrtbNative(legacyNative) {
689
696
  }
690
697
 
691
698
  export function toOrtbNativeResponse(legacyResponse, ortbRequest) {
692
- // copy the request, so we don't pollute it with response data below
693
- ortbRequest = deepClone(ortbRequest);
694
-
695
699
  const ortbResponse = {
696
700
  ...legacyPropertiesToOrtbNative(legacyResponse),
697
701
  assets: []
698
702
  };
703
+
704
+ function useRequestAsset(predicate, fn) {
705
+ let asset = ortbRequest.assets.find(predicate);
706
+ if (asset != null) {
707
+ asset = deepClone(asset);
708
+ fn(asset);
709
+ ortbResponse.assets.push(asset);
710
+ }
711
+ }
712
+
699
713
  Object.keys(legacyResponse).filter(key => !!legacyResponse[key]).forEach(key => {
700
714
  const value = legacyResponse[key];
701
715
  switch (key) {
702
716
  // process titles
703
717
  case 'title':
704
- const titleAsset = ortbRequest.assets.find(asset => asset.title != null);
705
- titleAsset.title = {
706
- text: value
707
- };
708
- ortbResponse.assets.push(titleAsset);
718
+ useRequestAsset(asset => asset.title != null, titleAsset => {
719
+ titleAsset.title = {
720
+ text: value
721
+ };
722
+ })
709
723
  break;
710
724
  case 'image':
711
725
  case 'icon':
712
726
  const imageType = key === 'image' ? NATIVE_IMAGE_TYPES.MAIN : NATIVE_IMAGE_TYPES.ICON;
713
- const imageAsset = ortbRequest.assets.find(asset => asset.img != null && asset.img.type == imageType);
714
- imageAsset.img = {
715
- url: value
716
- };
717
- ortbResponse.assets.push(imageAsset);
727
+ useRequestAsset(asset => asset.img != null && asset.img.type === imageType, imageAsset => {
728
+ imageAsset.img = {
729
+ url: value
730
+ };
731
+ })
718
732
  break;
719
733
  default:
720
734
  if (key in PREBID_NATIVE_DATA_KEYS_TO_ORTB) {
721
- const dataAsset = ortbRequest.assets.find(asset => asset.data != null && asset.data.type === NATIVE_ASSET_TYPES[PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]]);
722
- dataAsset.data = {
723
- value
724
- };
725
- ortbResponse.assets.push(dataAsset);
735
+ useRequestAsset(asset => asset.data != null && asset.data.type === NATIVE_ASSET_TYPES[PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]], dataAsset => {
736
+ dataAsset.data = {
737
+ value
738
+ };
739
+ })
726
740
  }
727
741
  break;
728
742
  }
@@ -740,6 +754,7 @@ function toLegacyResponse(ortbResponse, ortbRequest) {
740
754
  const legacyResponse = {};
741
755
  const requestAssets = ortbRequest?.assets || [];
742
756
  legacyResponse.clickUrl = ortbResponse.link.url;
757
+ legacyResponse.privacyLink = ortbResponse.privacy;
743
758
  for (const asset of ortbResponse?.assets || []) {
744
759
  const requestAsset = requestAssets.find(reqAsset => asset.id === reqAsset.id);
745
760
  if (asset.title) {
@@ -11,6 +11,8 @@
11
11
  import { config } from './config.js';
12
12
  import {logWarn} from './utils.js';
13
13
 
14
+ let RI = new WeakMap();
15
+
14
16
  /**
15
17
  * Prepend a URL with the page's protocol (http/https), if necessary.
16
18
  */
@@ -252,10 +254,19 @@ export function detectReferer(win) {
252
254
  };
253
255
  }
254
256
 
255
- return refererInfo;
257
+ return function() {
258
+ if (!RI.has(win)) {
259
+ RI.set(win, Object.freeze(refererInfo()));
260
+ }
261
+ return RI.get(win);
262
+ }
256
263
  }
257
264
 
258
265
  /**
259
266
  * @type {function(): refererInfo}
260
267
  */
261
268
  export const getRefererInfo = detectReferer(window);
269
+
270
+ export function resetRefererInfo() {
271
+ RI = new WeakMap();
272
+ }
@@ -1,6 +1,7 @@
1
1
  import { config } from './config.js';
2
2
  import {logWarn, logInfo, isPlainObject, deepAccess, deepClone, getWindowTop} from './utils.js';
3
3
  import {includes} from './polyfill.js';
4
+ import {BANNER} from './mediaTypes.js';
4
5
 
5
6
  let sizeConfig = [];
6
7
 
@@ -75,22 +76,19 @@ export function resolveStatus({labels = [], labelAll = false, activeLabels = []}
75
76
  } else {
76
77
  mediaTypes = {};
77
78
  }
78
- } else {
79
- mediaTypes = deepClone(mediaTypes);
80
79
  }
81
80
 
82
81
  let oldSizes = deepAccess(mediaTypes, 'banner.sizes');
83
82
  if (maps.shouldFilter && oldSizes) {
83
+ mediaTypes = deepClone(mediaTypes);
84
84
  mediaTypes.banner.sizes = oldSizes.filter(size => maps.sizesSupported[size]);
85
85
  }
86
86
 
87
- let allMediaTypes = Object.keys(mediaTypes);
88
-
89
87
  let results = {
90
88
  active: (
91
- allMediaTypes.every(type => type !== 'banner')
89
+ !mediaTypes.hasOwnProperty(BANNER)
92
90
  ) || (
93
- allMediaTypes.some(type => type === 'banner') && deepAccess(mediaTypes, 'banner.sizes.length') > 0 && (
91
+ deepAccess(mediaTypes, 'banner.sizes.length') > 0 && (
94
92
  labels.length === 0 || (
95
93
  (!labelAll && (
96
94
  labels.some(label => maps.labels[label]) ||
@@ -111,7 +109,7 @@ export function resolveStatus({labels = [], labelAll = false, activeLabels = []}
111
109
  results.filterResults = {
112
110
  before: oldSizes,
113
111
  after: mediaTypes.banner.sizes
114
- }
112
+ };
115
113
  }
116
114
 
117
115
  return results;
package/src/targeting.js CHANGED
@@ -63,7 +63,7 @@ export const getHighestCpmBidsFromBidPool = hook('sync', function(bidsReceived,
63
63
  }
64
64
 
65
65
  return bidsReceived;
66
- })
66
+ });
67
67
 
68
68
  /**
69
69
  * A descending sort function that will sort the list of objects based on the following two dimensions:
package/src/userSync.js CHANGED
@@ -311,7 +311,7 @@ export function newUserSync(userSyncDependencies) {
311
311
  }
312
312
  }
313
313
  return true;
314
- }
314
+ };
315
315
  return publicApi;
316
316
  }
317
317
 
@@ -1,10 +1,12 @@
1
+ import {getGlobal} from '../prebidGlobal.js';
2
+
1
3
  const SUCCESS = 0;
2
4
  const FAIL = 1;
3
5
 
4
6
  /**
5
7
  * A version of Promise that runs callbacks synchronously when it can (i.e. after it's been fulfilled or rejected).
6
8
  */
7
- export class GreedyPromise extends Promise {
9
+ export class GreedyPromise extends (getGlobal().Promise || Promise) {
8
10
  #result;
9
11
  #callbacks;
10
12
  #parent = null;
package/src/utils.js CHANGED
@@ -1381,3 +1381,30 @@ export function setScriptAttributes(script, attributes) {
1381
1381
  }
1382
1382
  }
1383
1383
  }
1384
+
1385
+ /**
1386
+ * Encode a string for inclusion in HTML.
1387
+ * See https://pragmaticwebsecurity.com/articles/spasecurity/json-stringify-xss.html and
1388
+ * https://codeql.github.com/codeql-query-help/javascript/js-bad-code-sanitization/
1389
+ * @return {string}
1390
+ */
1391
+ export const escapeUnsafeChars = (() => {
1392
+ const escapes = {
1393
+ '<': '\\u003C',
1394
+ '>': '\\u003E',
1395
+ '/': '\\u002F',
1396
+ '\\': '\\\\',
1397
+ '\b': '\\b',
1398
+ '\f': '\\f',
1399
+ '\n': '\\n',
1400
+ '\r': '\\r',
1401
+ '\t': '\\t',
1402
+ '\0': '\\0',
1403
+ '\u2028': '\\u2028',
1404
+ '\u2029': '\\u2029'
1405
+ };
1406
+
1407
+ return function(str) {
1408
+ return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g, x => escapes[x])
1409
+ }
1410
+ })();
package/src/video.js CHANGED
@@ -35,15 +35,16 @@ export const hasNonVideoBidder = adUnit =>
35
35
  export function isValidVideoBid(bid, {index = auctionManager.index} = {}) {
36
36
  const videoMediaType = deepAccess(index.getMediaTypes(bid), 'video');
37
37
  const context = videoMediaType && deepAccess(videoMediaType, 'context');
38
+ const useCacheKey = videoMediaType && deepAccess(videoMediaType, 'useCacheKey');
38
39
  const adUnit = index.getAdUnit(bid);
39
40
 
40
41
  // if context not defined assume default 'instream' for video bids
41
42
  // instream bids require a vast url or vast xml content
42
- return checkVideoBidSetup(bid, adUnit, videoMediaType, context);
43
+ return checkVideoBidSetup(bid, adUnit, videoMediaType, context, useCacheKey);
43
44
  }
44
45
 
45
- export const checkVideoBidSetup = hook('sync', function(bid, adUnit, videoMediaType, context) {
46
- if (videoMediaType && context !== OUTSTREAM) {
46
+ export const checkVideoBidSetup = hook('sync', function(bid, adUnit, videoMediaType, context, useCacheKey) {
47
+ if (videoMediaType && (useCacheKey || context !== OUTSTREAM)) {
47
48
  // xml-only video bids require a prebid cache url
48
49
  if (!config.getConfig('cache.url') && bid.vastXml && !bid.vastUrl) {
49
50
  logError(`
@@ -57,7 +58,7 @@ export const checkVideoBidSetup = hook('sync', function(bid, adUnit, videoMediaT
57
58
  }
58
59
 
59
60
  // outstream bids require a renderer on the bid or pub-defined on adunit
60
- if (context === OUTSTREAM) {
61
+ if (context === OUTSTREAM && !useCacheKey) {
61
62
  return !!(bid.renderer || (adUnit && adUnit.renderer) || videoMediaType.renderer);
62
63
  }
63
64
 
package/src/videoCache.js CHANGED
@@ -13,6 +13,12 @@ import { ajax } from './ajax.js';
13
13
  import { config } from './config.js';
14
14
  import {auctionManager} from './auctionManager.js';
15
15
 
16
+ /**
17
+ * Might be useful to be configurable in the future
18
+ * Depending on publisher needs
19
+ */
20
+ const ttlBufferInSeconds = 15;
21
+
16
22
  /**
17
23
  * @typedef {object} CacheableUrlBid
18
24
  * @property {string} vastUrl A URL which loads some valid VAST XML.
@@ -63,11 +69,11 @@ function wrapURI(uri, impUrl) {
63
69
  function toStorageRequest(bid, {index = auctionManager.index} = {}) {
64
70
  const vastValue = bid.vastXml ? bid.vastXml : wrapURI(bid.vastUrl, bid.vastImpUrl);
65
71
  const auction = index.getAuction(bid);
66
-
72
+ const ttlWithBuffer = Number(bid.ttl) + ttlBufferInSeconds;
67
73
  let payload = {
68
74
  type: 'xml',
69
75
  value: vastValue,
70
- ttlseconds: Number(bid.ttl)
76
+ ttlseconds: ttlWithBuffer
71
77
  };
72
78
 
73
79
  if (config.getConfig('cache.vasttrack')) {
@@ -8,8 +8,8 @@
8
8
  <title>Prebid.js video adUnit example</title>
9
9
 
10
10
  <!-- videojs -->
11
- <link rel="stylesheet" href="http://vjs.zencdn.net/5.9.2/video-js.css">
12
- <script type="text/javascript" src="http://vjs.zencdn.net/5.9.2/video.js"></script>
11
+ <link rel="stylesheet" href="https://vjs.zencdn.net/5.9.2/video-js.css">
12
+ <script type="text/javascript" src="https://vjs.zencdn.net/5.9.2/video.js"></script>
13
13
 
14
14
  <!-- videojs-vast-vpaid -->
15
15
  <link href="https://cdnjs.cloudflare.com/ajax/libs/videojs-vast-vpaid/2.0.2/videojs.vast.vpaid.min.css" rel="stylesheet">