prebid.js 8.43.0 → 8.45.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 (501) hide show
  1. package/README.md +7 -1
  2. package/creative/constants.js +7 -7
  3. package/creative/renderers/display/constants.js +2 -2
  4. package/creative/renderers/native/constants.js +2 -2
  5. package/dist/33acrossAnalyticsAdapter.js +1 -1
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/33acrossIdSystem.js +1 -1
  8. package/dist/BTBidAdapter.js +1 -1
  9. package/dist/adWMGAnalyticsAdapter.js +1 -1
  10. package/dist/adagioAnalyticsAdapter.js +1 -1
  11. package/dist/adagioBidAdapter.js +1 -1
  12. package/dist/adbookpspBidAdapter.js +1 -1
  13. package/dist/adgenerationBidAdapter.js +1 -1
  14. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  15. package/dist/adkernelBidAdapter.js +1 -1
  16. package/dist/adlooxAdServerVideo.js +1 -1
  17. package/dist/adlooxAnalyticsAdapter.js +1 -1
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/adnuntiusBidAdapter.js +1 -1
  20. package/dist/adomikAnalyticsAdapter.js +1 -1
  21. package/dist/adpod.js +1 -1
  22. package/dist/adqueryBidAdapter.js +1 -1
  23. package/dist/adrelevantisBidAdapter.js +1 -1
  24. package/dist/adstirBidAdapter.js +1 -1
  25. package/dist/adtrgtmeBidAdapter.js +1 -1
  26. package/dist/adxcgAnalyticsAdapter.js +1 -1
  27. package/dist/adxcgBidAdapter.js +1 -1
  28. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  29. package/dist/adyoulikeBidAdapter.js +1 -1
  30. package/dist/agmaAnalyticsAdapter.js +1 -1
  31. package/dist/ajaBidAdapter.js +1 -1
  32. package/dist/amxBidAdapter.js +1 -1
  33. package/dist/amxIdSystem.js +1 -1
  34. package/dist/analyticsAdapter.js +1 -1
  35. package/dist/appierAnalyticsAdapter.js +1 -1
  36. package/dist/appnexusBidAdapter.js +1 -1
  37. package/dist/asoBidAdapter.js +1 -1
  38. package/dist/asteriobidAnalyticsAdapter.js +1 -1
  39. package/dist/atsAnalyticsAdapter.js +1 -1
  40. package/dist/automatadAnalyticsAdapter.js +1 -1
  41. package/dist/axonixBidAdapter.js +1 -1
  42. package/dist/bidViewability.js +1 -1
  43. package/dist/bidViewabilityIO.js +1 -1
  44. package/dist/bidglassBidAdapter.js +1 -1
  45. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  46. package/dist/big-richmediaBidAdapter.js +1 -1
  47. package/dist/brandmetricsRtdProvider.js +1 -1
  48. package/dist/bridBidAdapter.js +1 -1
  49. package/dist/bridgewellBidAdapter.js +1 -1
  50. package/dist/brightMountainMediaBidAdapter.js +1 -1
  51. package/dist/browsiRtdProvider.js +1 -1
  52. package/dist/byDataAnalyticsAdapter.js +1 -1
  53. package/dist/carodaBidAdapter.js +1 -1
  54. package/dist/chtnwBidAdapter.js +1 -1
  55. package/dist/chunk-core.js +1 -1
  56. package/dist/chunk-paapi.js +1 -1
  57. package/dist/cleanioRtdProvider.js +1 -1
  58. package/dist/concertAnalyticsAdapter.js +1 -1
  59. package/dist/concertBidAdapter.js +1 -1
  60. package/dist/confiantRtdProvider.js +1 -1
  61. package/dist/connectadBidAdapter.js +1 -1
  62. package/dist/consentManagementUsp.js +1 -1
  63. package/dist/consumableBidAdapter.js +1 -1
  64. package/dist/conversantAnalyticsAdapter.js +1 -1
  65. package/dist/conversantBidAdapter.js +1 -1
  66. package/dist/craftBidAdapter.js +1 -1
  67. package/dist/creative-renderer-native.js +1 -1
  68. package/dist/criteoBidAdapter.js +1 -1
  69. package/dist/currency.js +1 -1
  70. package/dist/cwireBidAdapter.js +1 -1
  71. package/dist/dailymotionBidAdapter.js +1 -0
  72. package/dist/datablocksAnalyticsAdapter.js +1 -1
  73. package/dist/datawrkzBidAdapter.js +1 -1
  74. package/dist/debugging-standalone.js +1 -1
  75. package/dist/debugging.js +1 -1
  76. package/dist/dependencies.json +3 -3
  77. package/dist/dfpAdServerVideo.js +1 -1
  78. package/dist/discoveryBidAdapter.js +1 -1
  79. package/dist/dsaControl.js +1 -1
  80. package/dist/dspxBidAdapter.js +1 -1
  81. package/dist/dxkultureBidAdapter.js +1 -1
  82. package/dist/eplanningAnalyticsAdapter.js +1 -1
  83. package/dist/eplanningBidAdapter.js +1 -1
  84. package/dist/euidIdSystem.js +1 -1
  85. package/dist/feedadBidAdapter.js +1 -1
  86. package/dist/finativeBidAdapter.js +1 -1
  87. package/dist/fintezaAnalyticsAdapter.js +1 -1
  88. package/dist/freewheel-sspBidAdapter.js +1 -1
  89. package/dist/gdprEnforcement.js +1 -1
  90. package/dist/genericAnalyticsAdapter.js +1 -1
  91. package/dist/geoedgeRtdProvider.js +1 -1
  92. package/dist/gmosspBidAdapter.js +1 -1
  93. package/dist/goldbachBidAdapter.js +1 -1
  94. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  95. package/dist/greenbidsRtdProvider.js +1 -1
  96. package/dist/gridBidAdapter.js +1 -1
  97. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  98. package/dist/gumgumBidAdapter.js +1 -1
  99. package/dist/h12mediaBidAdapter.js +1 -1
  100. package/dist/hadronAnalyticsAdapter.js +1 -1
  101. package/dist/holidBidAdapter.js +1 -1
  102. package/dist/hypelabBidAdapter.js +1 -1
  103. package/dist/id5AnalyticsAdapter.js +1 -1
  104. package/dist/id5IdSystem.js +1 -1
  105. package/dist/illuminBidAdapter.js +1 -1
  106. package/dist/imdsBidAdapter.js +1 -1
  107. package/dist/improvedigitalBidAdapter.js +1 -1
  108. package/dist/insticatorBidAdapter.js +1 -1
  109. package/dist/instreamTracking.js +1 -1
  110. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  111. package/dist/ixBidAdapter.js +1 -1
  112. package/dist/jixieBidAdapter.js +1 -1
  113. package/dist/justpremiumBidAdapter.js +1 -1
  114. package/dist/jwplayerRtdProvider.js +1 -1
  115. package/dist/kargoAnalyticsAdapter.js +1 -1
  116. package/dist/kargoBidAdapter.js +1 -1
  117. package/dist/kimberliteBidAdapter.js +1 -1
  118. package/dist/konduitAnalyticsAdapter.js +1 -1
  119. package/dist/kueezBidAdapter.js +1 -1
  120. package/dist/kueezRtbBidAdapter.js +1 -1
  121. package/dist/lassoBidAdapter.js +1 -1
  122. package/dist/lifestreetBidAdapter.js +1 -1
  123. package/dist/limelightDigitalBidAdapter.js +1 -1
  124. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  125. package/dist/liveIntentIdSystem.js +1 -1
  126. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  127. package/dist/logicadBidAdapter.js +1 -1
  128. package/dist/loglyliftBidAdapter.js +1 -1
  129. package/dist/loyalBidAdapter.js +1 -0
  130. package/dist/luceadBidAdapter.js +1 -1
  131. package/dist/magniteAnalyticsAdapter.js +1 -1
  132. package/dist/malltvAnalyticsAdapter.js +1 -1
  133. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  134. package/dist/marsmediaBidAdapter.js +1 -1
  135. package/dist/mediafilterRtdProvider.js +1 -1
  136. package/dist/mediafuseBidAdapter.js +1 -1
  137. package/dist/medianetAnalyticsAdapter.js +1 -1
  138. package/dist/medianetBidAdapter.js +1 -1
  139. package/dist/mediasquareBidAdapter.js +1 -1
  140. package/dist/mgidBidAdapter.js +1 -1
  141. package/dist/minutemediaBidAdapter.js +1 -1
  142. package/dist/minutemediaplusBidAdapter.js +1 -1
  143. package/dist/missenaBidAdapter.js +1 -1
  144. package/dist/multibid.js +1 -1
  145. package/dist/neuwoRtdProvider.js +1 -1
  146. package/dist/nextMillenniumBidAdapter.js +1 -1
  147. package/dist/nexx360BidAdapter.js +1 -1
  148. package/dist/nobidAnalyticsAdapter.js +1 -1
  149. package/dist/not-for-prod/prebid.js +242 -239
  150. package/dist/oguryBidAdapter.js +1 -1
  151. package/dist/onetagBidAdapter.js +1 -1
  152. package/dist/ooloAnalyticsAdapter.js +1 -1
  153. package/dist/openwebBidAdapter.js +1 -1
  154. package/dist/openxBidAdapter.js +1 -1
  155. package/dist/optidigitalBidAdapter.js +1 -1
  156. package/dist/optimonAnalyticsAdapter.js +1 -1
  157. package/dist/outbrainBidAdapter.js +1 -1
  158. package/dist/oxxionAnalyticsAdapter.js +1 -1
  159. package/dist/oxxionRtdProvider.js +1 -1
  160. package/dist/parrableIdSystem.js +1 -1
  161. package/dist/pbsExtensions.js +1 -1
  162. package/dist/permutiveRtdProvider.js +1 -1
  163. package/dist/pgamsspBidAdapter.js +1 -1
  164. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  165. package/dist/pirIdSystem.js +1 -0
  166. package/dist/pixfutureBidAdapter.js +1 -1
  167. package/dist/prebidServerBidAdapter.js +1 -1
  168. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  169. package/dist/priceFloors.js +1 -1
  170. package/dist/publinkIdSystem.js +1 -1
  171. package/dist/publirBidAdapter.js +1 -1
  172. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  173. package/dist/pubmaticBidAdapter.js +1 -1
  174. package/dist/pubperfAnalyticsAdapter.js +1 -1
  175. package/dist/pubstackAnalyticsAdapter.js +1 -1
  176. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  177. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  178. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  179. package/dist/pxyzBidAdapter.js +1 -1
  180. package/dist/qortexRtdProvider.js +1 -1
  181. package/dist/quantcastBidAdapter.js +1 -1
  182. package/dist/readpeakBidAdapter.js +1 -1
  183. package/dist/relaidoBidAdapter.js +1 -1
  184. package/dist/relevantAnalyticsAdapter.js +1 -1
  185. package/dist/retailspotBidAdapter.js +1 -1
  186. package/dist/rhythmoneBidAdapter.js +1 -1
  187. package/dist/riseBidAdapter.js +1 -1
  188. package/dist/rivrAnalyticsAdapter.js +1 -1
  189. package/dist/roxotAnalyticsAdapter.js +1 -1
  190. package/dist/rtdModule.js +1 -1
  191. package/dist/rubiconBidAdapter.js +1 -1
  192. package/dist/s2sTesting.js +1 -1
  193. package/dist/scaleableAnalyticsAdapter.js +1 -1
  194. package/dist/schain.js +1 -1
  195. package/dist/seedingAllianceBidAdapter.js +1 -1
  196. package/dist/seedtagBidAdapter.js +1 -1
  197. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  198. package/dist/sharethroughBidAdapter.js +1 -1
  199. package/dist/shinezBidAdapter.js +1 -1
  200. package/dist/shinezRtbBidAdapter.js +1 -1
  201. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  202. package/dist/sirdataRtdProvider.js +1 -1
  203. package/dist/sizeMapping.js +1 -1
  204. package/dist/smaatoBidAdapter.js +1 -1
  205. package/dist/smartadserverBidAdapter.js +1 -1
  206. package/dist/smartxBidAdapter.js +1 -1
  207. package/dist/smilewantedBidAdapter.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/stnBidAdapter.js +1 -1
  215. package/dist/stvBidAdapter.js +1 -1
  216. package/dist/sublimeBidAdapter.js +1 -1
  217. package/dist/taboolaBidAdapter.js +1 -1
  218. package/dist/tagorasBidAdapter.js +1 -1
  219. package/dist/targetVideoBidAdapter.js +1 -1
  220. package/dist/teadsBidAdapter.js +1 -1
  221. package/dist/terceptAnalyticsAdapter.js +1 -1
  222. package/dist/themoneytizerBidAdapter.js +1 -1
  223. package/dist/topicsFpdModule.js +1 -1
  224. package/dist/trionBidAdapter.js +1 -1
  225. package/dist/tripleliftBidAdapter.js +1 -1
  226. package/dist/ttdBidAdapter.js +1 -1
  227. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  228. package/dist/uid2IdSystem.js +1 -1
  229. package/dist/underdogmediaBidAdapter.js +1 -1
  230. package/dist/undertoneBidAdapter.js +1 -1
  231. package/dist/unrulyBidAdapter.js +1 -1
  232. package/dist/userId.js +1 -1
  233. package/dist/vidazooBidAdapter.js +1 -1
  234. package/dist/videoModule.js +1 -1
  235. package/dist/videobyteBidAdapter.js +1 -1
  236. package/dist/visxBidAdapter.js +1 -1
  237. package/dist/vuukleBidAdapter.js +1 -1
  238. package/dist/weboramaRtdProvider.js +1 -1
  239. package/dist/widespaceBidAdapter.js +1 -1
  240. package/dist/winrBidAdapter.js +1 -1
  241. package/dist/yahoosspBidAdapter.js +1 -1
  242. package/dist/yandexAnalyticsAdapter.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/gulpfile.js +9 -1
  249. package/integrationExamples/gpt/adnuntius_example.html +7 -1
  250. package/integrationExamples/gpt/azerionedgeRtdProvider_example.html +3 -3
  251. package/integrationExamples/gpt/top-level-paapi/decisionLogic.js +57 -0
  252. package/integrationExamples/gpt/top-level-paapi/tl_paapi_example.html +188 -0
  253. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  254. package/integrationExamples/{gpt → realTimeData}/jwplayerRtdProvider_example.html +28 -42
  255. package/libraries/analyticsAdapter/AnalyticsAdapter.js +4 -4
  256. package/libraries/creative-renderer-native/renderer.js +1 -1
  257. package/modules/33acrossAnalyticsAdapter.js +2 -4
  258. package/modules/33acrossIdSystem.js +1 -1
  259. package/modules/adWMGAnalyticsAdapter.js +9 -11
  260. package/modules/adagioAnalyticsAdapter.js +49 -46
  261. package/modules/adkernelAdnAnalyticsAdapter.js +8 -8
  262. package/modules/adkernelBidAdapter.js +23 -102
  263. package/modules/adlooxAdServerVideo.js +2 -2
  264. package/modules/adlooxAnalyticsAdapter.js +4 -4
  265. package/modules/adnuntiusBidAdapter.js +50 -32
  266. package/modules/adomikAnalyticsAdapter.js +7 -7
  267. package/modules/adpod.js +3 -3
  268. package/modules/adxcgAnalyticsAdapter.js +10 -10
  269. package/modules/adxpremiumAnalyticsAdapter.js +8 -10
  270. package/modules/agmaAnalyticsAdapter.js +6 -7
  271. package/modules/appierAnalyticsAdapter.js +5 -7
  272. package/modules/appnexusBidAdapter.js +1 -0
  273. package/modules/asteriobidAnalyticsAdapter.js +14 -14
  274. package/modules/atsAnalyticsAdapter.js +4 -4
  275. package/modules/automatadAnalyticsAdapter.js +20 -20
  276. package/modules/azerionedgeRtdProvider.md +4 -2
  277. package/modules/bidViewability.js +3 -3
  278. package/modules/bidViewabilityIO.js +3 -3
  279. package/modules/bidwatchAnalyticsAdapter.js +7 -9
  280. package/modules/brandmetricsRtdProvider.js +6 -6
  281. package/modules/browsiRtdProvider.js +3 -3
  282. package/modules/byDataAnalyticsAdapter.js +3 -3
  283. package/modules/cleanioRtdProvider.js +3 -3
  284. package/modules/concertAnalyticsAdapter.js +5 -7
  285. package/modules/confiantRtdProvider.js +2 -2
  286. package/modules/conversantAnalyticsAdapter.js +2 -4
  287. package/modules/criteoBidAdapter.js +53 -10
  288. package/modules/currency.js +7 -7
  289. package/modules/dailymotionBidAdapter.js +139 -0
  290. package/modules/dailymotionBidAdapter.md +140 -0
  291. package/modules/datawrkzBidAdapter.js +4 -4
  292. package/modules/debugging/pbsInterceptor.js +2 -2
  293. package/modules/dfpAdServerVideo.js +2 -2
  294. package/modules/discoveryBidAdapter.js +21 -0
  295. package/modules/dsaControl.js +5 -5
  296. package/modules/eplanningAnalyticsAdapter.js +8 -8
  297. package/modules/fintezaAnalyticsAdapter.js +5 -5
  298. package/modules/gdprEnforcement.js +3 -3
  299. package/modules/geoedgeRtdProvider.js +2 -2
  300. package/modules/greenbidsAnalyticsAdapter.js +13 -10
  301. package/modules/greenbidsRtdProvider.js +2 -2
  302. package/modules/gridBidAdapter.js +2 -2
  303. package/modules/growthCodeAnalyticsAdapter.js +14 -14
  304. package/modules/gumgumBidAdapter.js +4 -1
  305. package/modules/hadronAnalyticsAdapter.js +14 -14
  306. package/modules/holidBidAdapter.js +2 -2
  307. package/modules/id5AnalyticsAdapter.js +7 -9
  308. package/modules/improvedigitalBidAdapter.js +2 -1
  309. package/modules/insticatorBidAdapter.js +137 -27
  310. package/modules/instreamTracking.js +4 -4
  311. package/modules/invisiblyAnalyticsAdapter.js +15 -17
  312. package/modules/ixBidAdapter.js +3 -3
  313. package/modules/jwplayerRtdProvider.js +93 -26
  314. package/modules/jwplayerRtdProvider.md +23 -2
  315. package/modules/kargoAnalyticsAdapter.js +3 -3
  316. package/modules/kargoBidAdapter.js +26 -31
  317. package/modules/konduitAnalyticsAdapter.js +13 -13
  318. package/modules/lassoBidAdapter.js +11 -2
  319. package/modules/limelightDigitalBidAdapter.js +2 -1
  320. package/modules/liveIntentAnalyticsAdapter.js +2 -2
  321. package/modules/livewrappedAnalyticsAdapter.js +10 -10
  322. package/modules/loyalBidAdapter.js +190 -0
  323. package/modules/loyalBidAdapter.md +79 -0
  324. package/modules/magniteAnalyticsAdapter.js +25 -23
  325. package/modules/malltvAnalyticsAdapter.js +4 -6
  326. package/modules/mediafilterRtdProvider.js +2 -2
  327. package/modules/medianetAnalyticsAdapter.js +12 -12
  328. package/modules/medianetBidAdapter.js +1 -1
  329. package/modules/multibid/index.js +2 -2
  330. package/modules/neuwoRtdProvider.js +2 -2
  331. package/modules/nextMillenniumBidAdapter.js +4 -4
  332. package/modules/nobidAnalyticsAdapter.js +9 -11
  333. package/modules/ooloAnalyticsAdapter.js +2 -2
  334. package/modules/oxxionAnalyticsAdapter.js +7 -9
  335. package/modules/paapi.js +20 -6
  336. package/modules/permutiveRtdProvider.js +21 -2
  337. package/modules/pgamsspBidAdapter.js +26 -3
  338. package/modules/pirIdSystem.js +62 -0
  339. package/modules/pirIdSystem.md +27 -0
  340. package/modules/prebidServerBidAdapter/index.js +8 -8
  341. package/modules/prebidServerBidAdapter/ortbConverter.js +3 -3
  342. package/modules/prebidmanagerAnalyticsAdapter.js +14 -14
  343. package/modules/priceFloors.js +10 -5
  344. package/modules/pubmaticAnalyticsAdapter.js +32 -22
  345. package/modules/pubmaticBidAdapter.js +1 -17
  346. package/modules/pubwiseAnalyticsAdapter.js +11 -11
  347. package/modules/pubxaiAnalyticsAdapter.js +6 -6
  348. package/modules/qortexRtdProvider.js +2 -2
  349. package/modules/roxotAnalyticsAdapter.js +8 -10
  350. package/modules/rtdModule/index.js +7 -7
  351. package/modules/scaleableAnalyticsAdapter.js +5 -5
  352. package/modules/seedtagBidAdapter.js +12 -3
  353. package/modules/sigmoidAnalyticsAdapter.js +7 -7
  354. package/modules/sirdataRtdProvider.js +2 -0
  355. package/modules/smaatoBidAdapter.js +1 -2
  356. package/modules/sonobiAnalyticsAdapter.js +10 -12
  357. package/modules/sonobiBidAdapter.js +2 -5
  358. package/modules/sovrnAnalyticsAdapter.js +7 -9
  359. package/modules/sovrnBidAdapter.js +1 -1
  360. package/modules/staqAnalyticsAdapter.js +9 -9
  361. package/modules/teadsBidAdapter.js +2 -0
  362. package/modules/terceptAnalyticsAdapter.js +7 -7
  363. package/modules/topicsFpdModule.js +3 -0
  364. package/modules/topicsFpdModule.md +4 -0
  365. package/modules/ucfunnelAnalyticsAdapter.js +5 -7
  366. package/modules/userId/index.js +3 -3
  367. package/modules/videoModule/index.js +4 -4
  368. package/modules/yandexAnalyticsAdapter.js +2 -2
  369. package/modules/yieldoneAnalyticsAdapter.js +7 -7
  370. package/modules/yuktamediaAnalyticsAdapter.js +9 -9
  371. package/modules/zeta_global_sspAnalyticsAdapter.js +5 -5
  372. package/modules/zeta_global_sspBidAdapter.js +8 -1
  373. package/package.json +1 -1
  374. package/src/adRendering.js +15 -15
  375. package/src/adUnits.js +9 -21
  376. package/src/adapterManager.js +23 -13
  377. package/src/adapters/bidderFactory.js +8 -8
  378. package/src/auction.js +26 -28
  379. package/src/auctionManager.js +4 -4
  380. package/src/bidderSettings.js +2 -2
  381. package/src/config.js +2 -2
  382. package/src/constants.js +190 -0
  383. package/src/events.js +3 -3
  384. package/src/native.js +6 -8
  385. package/src/prebid.js +6 -10
  386. package/src/secureCreatives.js +5 -5
  387. package/src/targeting.js +13 -13
  388. package/src/utils.js +4 -4
  389. package/test/fixtures/fixtures.js +44 -44
  390. package/test/helpers/analytics.js +6 -6
  391. package/test/spec/AnalyticsAdapter_spec.js +3 -3
  392. package/test/spec/auctionmanager_spec.js +82 -82
  393. package/test/spec/modules/33acrossAnalyticsAdapter_spec.js +1 -2
  394. package/test/spec/modules/33acrossIdSystem_spec.js +3 -3
  395. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +14 -14
  396. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +79 -55
  397. package/test/spec/modules/adkernelAdnAnalytics_spec.js +6 -6
  398. package/test/spec/modules/adkernelBidAdapter_spec.js +63 -24
  399. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  400. package/test/spec/modules/adnuntiusBidAdapter_spec.js +10 -7
  401. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +7 -7
  402. package/test/spec/modules/adxcgAnalyticsAdapter_spec.js +7 -7
  403. package/test/spec/modules/adxpremiumAnalyticsAdapter_spec.js +7 -7
  404. package/test/spec/modules/agmaAnalyticsAdapter_spec.js +18 -14
  405. package/test/spec/modules/appierAnalyticsAdapter_spec.js +1 -1
  406. package/test/spec/modules/asteriobidAnalyticsAdapter_spec.js +2 -2
  407. package/test/spec/modules/atsAnalyticsAdapter_spec.js +8 -8
  408. package/test/spec/modules/automatadAnalyticsAdapter_spec.js +2 -2
  409. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  410. package/test/spec/modules/bidViewability_spec.js +4 -4
  411. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +7 -6
  412. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +5 -4
  413. package/test/spec/modules/cleanioRtdProvider_spec.js +6 -6
  414. package/test/spec/modules/concertAnalyticsAdapter_spec.js +7 -6
  415. package/test/spec/modules/confiantRtdProvider_spec.js +2 -2
  416. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +61 -61
  417. package/test/spec/modules/criteoBidAdapter_spec.js +112 -6
  418. package/test/spec/modules/currency_spec.js +6 -6
  419. package/test/spec/modules/dailymotionBidAdapter_spec.js +369 -0
  420. package/test/spec/modules/discoveryBidAdapter_spec.js +35 -1
  421. package/test/spec/modules/dsaControl_spec.js +4 -4
  422. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +20 -13
  423. package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +5 -5
  424. package/test/spec/modules/genericAnalyticsAdapter_spec.js +2 -2
  425. package/test/spec/modules/geoedgeRtdProvider_spec.js +37 -37
  426. package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +15 -2
  427. package/test/spec/modules/greenbidsRtdProvider_spec.js +2 -2
  428. package/test/spec/modules/gridBidAdapter_spec.js +3 -1
  429. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +2 -2
  430. package/test/spec/modules/gumgumBidAdapter_spec.js +23 -0
  431. package/test/spec/modules/hadronAnalyticsAdapter_spec.js +3 -3
  432. package/test/spec/modules/id5AnalyticsAdapter_spec.js +5 -5
  433. package/test/spec/modules/id5IdSystem_spec.js +2 -2
  434. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -3
  435. package/test/spec/modules/insticatorBidAdapter_spec.js +275 -22
  436. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +40 -40
  437. package/test/spec/modules/jwplayerRtdProvider_spec.js +672 -29
  438. package/test/spec/modules/kargoAnalyticsAdapter_spec.js +3 -3
  439. package/test/spec/modules/kargoBidAdapter_spec.js +36 -0
  440. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +13 -13
  441. package/test/spec/modules/lassoBidAdapter_spec.js +1 -0
  442. package/test/spec/modules/lemmaDigitalBidAdapter_spec.js +1 -1
  443. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +16 -1
  444. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -3
  445. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +15 -20
  446. package/test/spec/modules/loyalBidAdapter_spec .js +375 -0
  447. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +31 -15
  448. package/test/spec/modules/malltvAnalyticsAdapter_spec.js +3 -3
  449. package/test/spec/modules/mediafilterRtdProvider_spec.js +2 -2
  450. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +3 -3
  451. package/test/spec/modules/nobidAnalyticsAdapter_spec.js +23 -23
  452. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +33 -33
  453. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +0 -1
  454. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +7 -7
  455. package/test/spec/modules/paapi_spec.js +40 -14
  456. package/test/spec/modules/permutiveRtdProvider_spec.js +29 -1
  457. package/test/spec/modules/pgamsspBidAdapter_spec.js +50 -4
  458. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +9 -9
  459. package/test/spec/modules/pirIdSystem_spec.js +77 -0
  460. package/test/spec/modules/prebidServerBidAdapter_spec.js +7 -7
  461. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +2 -2
  462. package/test/spec/modules/priceFloors_spec.js +6 -5
  463. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +12 -14
  464. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  465. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +0 -1
  466. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +14 -14
  467. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +7 -7
  468. package/test/spec/modules/qortexRtdProvider_spec.js +2 -2
  469. package/test/spec/modules/realTimeDataModule_spec.js +9 -9
  470. package/test/spec/modules/relevantAnalyticsAdapter_spec.js +3 -3
  471. package/test/spec/modules/relevantdigitalBidAdapter_spec.js +2 -2
  472. package/test/spec/modules/rivrAnalyticsAdapter_spec.js +4 -4
  473. package/test/spec/modules/roxotAnalyticsAdapter_spec.js +25 -25
  474. package/test/spec/modules/scaleableAnalyticsAdapter_spec.js +5 -5
  475. package/test/spec/modules/seedtagBidAdapter_spec.js +56 -3
  476. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +0 -1
  477. package/test/spec/modules/sonobiAnalyticsAdapter_spec.js +8 -7
  478. package/test/spec/modules/sonobiBidAdapter_spec.js +4 -6
  479. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +2 -2
  480. package/test/spec/modules/sovrnBidAdapter_spec.js +5 -5
  481. package/test/spec/modules/staqAnalyticsAdapter_spec.js +7 -7
  482. package/test/spec/modules/teadsBidAdapter_spec.js +35 -0
  483. package/test/spec/modules/terceptAnalyticsAdapter_spec.js +7 -7
  484. package/test/spec/modules/trionBidAdapter_spec.js +1 -1
  485. package/test/spec/modules/ucfunnelAnalyticsAdapter_spec.js +1 -1
  486. package/test/spec/modules/userId_spec.js +4 -4
  487. package/test/spec/modules/videoModule/pbVideo_spec.js +3 -3
  488. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +22 -21
  489. package/test/spec/modules/yuktamediaAnalyticsAdapter_spec.js +33 -32
  490. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +8 -8
  491. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +1 -1
  492. package/test/spec/native_spec.js +19 -19
  493. package/test/spec/unit/adRendering_spec.js +14 -14
  494. package/test/spec/unit/adUnits_spec.js +1 -1
  495. package/test/spec/unit/core/adapterManager_spec.js +99 -59
  496. package/test/spec/unit/core/bidderFactory_spec.js +6 -6
  497. package/test/spec/unit/core/targeting_spec.js +47 -47
  498. package/test/spec/unit/pbjs_api_spec.js +81 -81
  499. package/test/spec/unit/secureCreatives_spec.js +27 -27
  500. package/test/spec/utils_spec.js +2 -2
  501. package/src/constants.json +0 -196
@@ -1,7 +1,7 @@
1
1
  import {config} from '../src/config.js';
2
2
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
3
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
- import {deepAccess, generateUUID, logError, isArray, isInteger, isArrayOfNums} from '../src/utils.js';
4
+ import {deepAccess, generateUUID, logError, isArray, isInteger, isArrayOfNums, deepSetValue} from '../src/utils.js';
5
5
  import {getStorageManager} from '../src/storageManager.js';
6
6
  import {find} from '../src/polyfill.js';
7
7
 
@@ -12,35 +12,37 @@ const USER_ID_COOKIE_EXP = 2592000000; // 30 days
12
12
  const BID_TTL = 300; // 5 minutes
13
13
  const GVLID = 910;
14
14
 
15
- const isSubarray = (arr, target) => {
16
- if (!isArrayOfNums(arr) || arr.length === 0) {
17
- return false;
18
- }
19
- const targetSet = new Set(target);
20
- return arr.every(el => targetSet.has(el));
21
- };
22
-
23
15
  export const OPTIONAL_VIDEO_PARAMS = {
24
16
  'minduration': (value) => isInteger(value),
25
17
  'maxduration': (value) => isInteger(value),
26
- 'protocols': (value) => isSubarray(value, [2, 3, 5, 6, 7, 8]), // protocols values supported by Inticator, according to the OpenRTB spec
18
+ 'protocols': (value) => isArrayOfNums(value), // protocols values supported by Inticator, according to the OpenRTB spec
27
19
  'startdelay': (value) => isInteger(value),
28
20
  'linearity': (value) => isInteger(value) && [1].includes(value),
29
21
  'skip': (value) => isInteger(value) && [1, 0].includes(value),
30
22
  'skipmin': (value) => isInteger(value),
31
23
  'skipafter': (value) => isInteger(value),
32
24
  'sequence': (value) => isInteger(value),
33
- 'battr': (value) => isSubarray(value, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]),
25
+ 'battr': (value) => isArrayOfNums(value),
34
26
  'maxextended': (value) => isInteger(value),
35
27
  'minbitrate': (value) => isInteger(value),
36
28
  'maxbitrate': (value) => isInteger(value),
37
- 'playbackmethod': (value) => isSubarray(value, [1, 2, 3, 4]),
29
+ 'playbackmethod': (value) => isArrayOfNums(value),
38
30
  'playbackend': (value) => isInteger(value) && [1, 2, 3].includes(value),
39
- 'delivery': (value) => isSubarray(value, [1, 2, 3]),
31
+ 'delivery': (value) => isArrayOfNums(value),
40
32
  'pos': (value) => isInteger(value) && [0, 1, 2, 3, 4, 5, 6, 7].includes(value),
41
- 'api': (value) => isSubarray(value, [1, 2, 3, 4, 5, 6, 7]),
33
+ 'api': (value) => isArrayOfNums(value),
42
34
  };
43
35
 
36
+ const ORTB_SITE_FIRST_PARTY_DATA = {
37
+ 'cat': v => Array.isArray(v) && v.every(c => typeof c === 'string'),
38
+ 'sectioncat': v => Array.isArray(v) && v.every(c => typeof c === 'string'),
39
+ 'pagecat': v => Array.isArray(v) && v.every(c => typeof c === 'string'),
40
+ 'search': v => typeof v === 'string',
41
+ 'mobile': v => isInteger(),
42
+ 'content': v => typeof v === 'object',
43
+ 'keywords': v => typeof v === 'string',
44
+ }
45
+
44
46
  export const storage = getStorageManager({bidderCode: BIDDER_CODE});
45
47
 
46
48
  config.setDefaults({
@@ -103,6 +105,7 @@ function buildVideo(bidRequest) {
103
105
  const placement = deepAccess(bidRequest, 'mediaTypes.video.placement') || 3;
104
106
  const plcmt = deepAccess(bidRequest, 'mediaTypes.video.plcmt') || undefined;
105
107
  const playerSize = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
108
+ const context = deepAccess(bidRequest, 'mediaTypes.video.context');
106
109
 
107
110
  if (!w && playerSize) {
108
111
  if (Array.isArray(playerSize[0])) {
@@ -121,17 +124,26 @@ function buildVideo(bidRequest) {
121
124
 
122
125
  const bidRequestVideo = deepAccess(bidRequest, 'mediaTypes.video');
123
126
  const videoBidderParams = deepAccess(bidRequest, 'params.video', {});
127
+
124
128
  let optionalParams = {};
125
129
  for (const param in OPTIONAL_VIDEO_PARAMS) {
126
- if (bidRequestVideo[param]) {
130
+ if (bidRequestVideo[param] && OPTIONAL_VIDEO_PARAMS[param](bidRequestVideo[param])) {
127
131
  optionalParams[param] = bidRequestVideo[param];
128
132
  }
133
+ // remove invalid optional params from bidder specific overrides
134
+ if (videoBidderParams[param] && !OPTIONAL_VIDEO_PARAMS[param](videoBidderParams[param])) {
135
+ delete videoBidderParams[param];
136
+ }
129
137
  }
130
138
 
131
139
  if (plcmt) {
132
140
  optionalParams['plcmt'] = plcmt;
133
141
  }
134
142
 
143
+ if (context !== undefined) {
144
+ optionalParams['context'] = context;
145
+ }
146
+
135
147
  let videoObj = {
136
148
  placement,
137
149
  mimes,
@@ -190,31 +202,102 @@ function buildDevice(bidRequest) {
190
202
  return device;
191
203
  }
192
204
 
205
+ function _getCoppa(bidderRequest) {
206
+ const coppa = deepAccess(bidderRequest, 'ortb2.regs.coppa');
207
+
208
+ // If coppa is defined in the request, use it
209
+ if (coppa !== undefined) {
210
+ return coppa;
211
+ }
212
+ return config.getConfig('coppa') === true ? 1 : 0;
213
+ }
214
+
215
+ function _getGppConsent(bidderRequest) {
216
+ let gpp = deepAccess(bidderRequest, 'gppConsent.gppString')
217
+ let gppSid = deepAccess(bidderRequest, 'gppConsent.applicableSections')
218
+
219
+ if (!gpp || !gppSid) {
220
+ gpp = deepAccess(bidderRequest, 'ortb2.regs.gpp', '')
221
+ gppSid = deepAccess(bidderRequest, 'ortb2.regs.gpp_sid', [])
222
+ }
223
+ return { gpp, gppSid }
224
+ }
225
+
226
+ function _getUspConsent(bidderRequest) {
227
+ return (deepAccess(bidderRequest, 'uspConsent')) ? { uspConsent: bidderRequest.uspConsent } : false;
228
+ }
229
+
193
230
  function buildRegs(bidderRequest) {
231
+ let regs = {
232
+ ext: {},
233
+ };
194
234
  if (bidderRequest.gdprConsent) {
195
- return {
196
- ext: {
197
- gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0,
198
- gdprConsentString: bidderRequest.gdprConsent.consentString,
199
- },
200
- };
235
+ regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
236
+ regs.ext.gdprConsentString = bidderRequest.gdprConsent.consentString;
237
+ }
238
+
239
+ regs.coppa = _getCoppa(bidderRequest);
240
+
241
+ const { gpp, gppSid } = _getGppConsent(bidderRequest);
242
+
243
+ if (gpp) {
244
+ regs.ext.gpp = gpp;
245
+ }
246
+
247
+ if (gppSid) {
248
+ regs.ext.gppSid = gppSid;
249
+ }
250
+
251
+ const usp = _getUspConsent(bidderRequest);
252
+
253
+ if (usp) {
254
+ regs.ext.us_privacy = usp.uspConsent;
255
+ regs.ext.ccpa = usp.uspConsent
256
+ }
257
+
258
+ const dsa = deepAccess(bidderRequest, 'ortb2.regs.ext.dsa');
259
+ if (dsa) {
260
+ regs.ext.dsa = dsa;
201
261
  }
202
262
 
203
- return {};
263
+ return regs;
204
264
  }
205
265
 
206
266
  function buildUser(bid) {
207
267
  const userId = getUserId() || generateUUID();
208
268
  const yob = deepAccess(bid, 'params.user.yob')
209
269
  const gender = deepAccess(bid, 'params.user.gender')
270
+ const keywords = deepAccess(bid, 'params.user.keywords')
271
+ const data = deepAccess(bid, 'params.user.data')
272
+ const ext = deepAccess(bid, 'params.user.ext')
210
273
 
211
274
  setUserId(userId);
212
275
 
213
- return {
276
+ const userData = {
214
277
  id: userId,
215
- yob,
216
- gender,
217
- };
278
+ }
279
+
280
+ if (yob) {
281
+ userData.yob = yob;
282
+ }
283
+
284
+ if (gender) {
285
+ userData.gender = gender;
286
+ }
287
+
288
+ if (keywords) {
289
+ userData.keywords = keywords;
290
+ }
291
+
292
+ if (data) {
293
+ userData.data = data;
294
+ }
295
+
296
+ if (ext) {
297
+ userData.ext = ext;
298
+ }
299
+
300
+ return userData
218
301
  }
219
302
 
220
303
  function extractSchain(bids, requestId) {
@@ -283,6 +366,20 @@ function buildRequest(validBidRequests, bidderRequest) {
283
366
  req.user.ext = { eids };
284
367
  }
285
368
 
369
+ const ortb2SiteData = deepAccess(bidderRequest, 'ortb2.site');
370
+ if (ortb2SiteData) {
371
+ for (const key in ORTB_SITE_FIRST_PARTY_DATA) {
372
+ const value = ortb2SiteData[key];
373
+ if (value && ORTB_SITE_FIRST_PARTY_DATA[key](value)) {
374
+ req.site[key] = value;
375
+ }
376
+ }
377
+ }
378
+
379
+ if (bidderRequest.gdprConsent) {
380
+ deepSetValue(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
381
+ }
382
+
286
383
  return req;
287
384
  }
288
385
 
@@ -326,6 +423,13 @@ function buildBid(bid, bidderRequest) {
326
423
  bidResponse.vastUrl = 'data:text/xml;charset=utf-8;base64,' + window.btoa(bidResponse.vastXml.replace(/\\"/g, '"'));
327
424
  }
328
425
 
426
+ if (bid.ext && bid.ext.dsa) {
427
+ bidResponse.ext = {
428
+ ...bidResponse.ext,
429
+ dsa: bid.ext.dsa,
430
+ }
431
+ }
432
+
329
433
  return bidResponse;
330
434
  }
331
435
 
@@ -453,7 +557,6 @@ function validateVideo(bid) {
453
557
  if (video[param]) {
454
558
  if (!OPTIONAL_VIDEO_PARAMS[param](video[param])) {
455
559
  logError(`insticator: video ${param} is invalid or not supported by insticator`);
456
- return false
457
560
  }
458
561
  }
459
562
  }
@@ -485,6 +588,13 @@ export const spec = {
485
588
  let endpointUrl = config.getConfig('insticator.endpointUrl') || ENDPOINT;
486
589
  endpointUrl = endpointUrl.replace(/^http:/, 'https:');
487
590
 
591
+ // Use the first bid request's bid_request_url if it exists ( for updating server url)
592
+ if (validBidRequests.length > 0) {
593
+ if (deepAccess(validBidRequests[0], 'params.bid_endpoint_request_url')) {
594
+ endpointUrl = deepAccess(validBidRequests[0], 'params.bid_endpoint_request_url').replace(/^http:/, 'https:');
595
+ }
596
+ }
597
+
488
598
  if (validBidRequests.length > 0) {
489
599
  requests.push({
490
600
  method: 'POST',
@@ -3,7 +3,7 @@ import { config } from '../src/config.js';
3
3
  import { auctionManager } from '../src/auctionManager.js';
4
4
  import { INSTREAM } from '../src/video.js';
5
5
  import * as events from '../src/events.js';
6
- import CONSTANTS from '../src/constants.json'
6
+ import { EVENTS, TARGETING_KEYS, BID_STATUS } from '../src/constants.js'
7
7
 
8
8
  /**
9
9
  * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
@@ -11,9 +11,9 @@ import CONSTANTS from '../src/constants.json'
11
11
  * @typedef {import('../src/adapters/bidderFactory.js').AdUnit} AdUnit
12
12
  */
13
13
 
14
- const {CACHE_ID, UUID} = CONSTANTS.TARGETING_KEYS;
15
- const {BID_WON, AUCTION_END} = CONSTANTS.EVENTS;
16
- const {RENDERED} = CONSTANTS.BID_STATUS;
14
+ const { CACHE_ID, UUID } = TARGETING_KEYS;
15
+ const { BID_WON, AUCTION_END } = EVENTS;
16
+ const { RENDERED } = BID_STATUS;
17
17
 
18
18
  const INSTREAM_TRACKING_DEFAULT_CONFIG = {
19
19
  enabled: false,
@@ -6,7 +6,7 @@ import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
6
6
  import adapterManager from '../src/adapterManager.js';
7
7
 
8
8
  import { generateUUID, logInfo } from '../src/utils.js';
9
- import CONSTANTS from '../src/constants.json';
9
+ import { EVENTS } from '../src/constants.js';
10
10
 
11
11
  const DEFAULT_EVENT_URL = 'https://api.pymx5.com/v1/' + 'sites/events';
12
12
  const analyticsType = 'endpoint';
@@ -15,22 +15,20 @@ const ajax = ajaxBuilder(0);
15
15
 
16
16
  // Events needed
17
17
  const {
18
- EVENTS: {
19
- AUCTION_INIT,
20
- AUCTION_END,
21
- BID_ADJUSTMENT,
22
- BID_TIMEOUT,
23
- BID_REQUESTED,
24
- BID_RESPONSE,
25
- NO_BID,
26
- BID_WON,
27
- BIDDER_DONE,
28
- SET_TARGETING,
29
- REQUEST_BIDS,
30
- ADD_AD_UNITS,
31
- AD_RENDER_FAILED,
32
- },
33
- } = CONSTANTS;
18
+ AUCTION_INIT,
19
+ AUCTION_END,
20
+ BID_ADJUSTMENT,
21
+ BID_TIMEOUT,
22
+ BID_REQUESTED,
23
+ BID_RESPONSE,
24
+ NO_BID,
25
+ BID_WON,
26
+ BIDDER_DONE,
27
+ SET_TARGETING,
28
+ REQUEST_BIDS,
29
+ ADD_AD_UNITS,
30
+ AD_RENDER_FAILED,
31
+ } = EVENTS;
34
32
 
35
33
  const _VERSION = 1;
36
34
  const _pageViewId = generateUUID();
@@ -18,7 +18,7 @@ import {
18
18
  } from '../src/utils.js';
19
19
  import { BANNER, VIDEO, NATIVE } from '../src/mediaTypes.js';
20
20
  import { config } from '../src/config.js';
21
- import CONSTANTS from '../src/constants.json';
21
+ import { EVENTS } from '../src/constants.js';
22
22
  import { getStorageManager } from '../src/storageManager.js';
23
23
  import * as events from '../src/events.js';
24
24
  import { find } from '../src/polyfill.js';
@@ -1739,8 +1739,8 @@ export const spec = {
1739
1739
  */
1740
1740
  isBidRequestValid: function (bid) {
1741
1741
  if (!hasRegisteredHandler) {
1742
- events.on(CONSTANTS.EVENTS.AUCTION_DEBUG, localStorageHandler);
1743
- events.on(CONSTANTS.EVENTS.AD_RENDER_FAILED, localStorageHandler);
1742
+ events.on(EVENTS.AUCTION_DEBUG, localStorageHandler);
1743
+ events.on(EVENTS.AD_RENDER_FAILED, localStorageHandler);
1744
1744
  hasRegisteredHandler = true;
1745
1745
  }
1746
1746
 
@@ -23,10 +23,20 @@ import {getGlobal} from '../src/prebidGlobal.js';
23
23
 
24
24
  const SUBMODULE_NAME = 'jwplayer';
25
25
  const JWPLAYER_DOMAIN = SUBMODULE_NAME + '.com';
26
- const segCache = {};
26
+ const ENRICH_ALWAYS = 'always';
27
+ const ENRICH_WHEN_EMPTY = 'whenEmpty';
28
+ const ENRICH_NEVER = 'never';
29
+ const overrideValidationRegex = /^(always|never|whenEmpty)$/;
30
+ const playlistItemCache = {};
27
31
  const pendingRequests = {};
28
32
  let activeRequestCount = 0;
29
33
  let resumeBidRequest;
34
+ // defaults to 'always' for backwards compatibility
35
+ // TODO: Prebid 9 - replace with ENRICH_WHEN_EMPTY
36
+ let overrideContentId = ENRICH_ALWAYS;
37
+ let overrideContentUrl = ENRICH_WHEN_EMPTY;
38
+ let overrideContentTitle = ENRICH_WHEN_EMPTY;
39
+ let overrideContentDescription = ENRICH_WHEN_EMPTY;
30
40
 
31
41
  /** @type {RtdSubmodule} */
32
42
  export const jwplayerSubmodule = {
@@ -38,7 +48,7 @@ export const jwplayerSubmodule = {
38
48
  /**
39
49
  * add targeting data to bids and signal completion to realTimeData module
40
50
  * @function
41
- * @param {Obj} bidReqConfig
51
+ * @param {object} bidReqConfig
42
52
  * @param {function} onDone
43
53
  */
44
54
  getBidRequestData: enrichBidRequest,
@@ -53,6 +63,7 @@ config.getConfig('realTimeData', ({realTimeData}) => {
53
63
  return;
54
64
  }
55
65
  fetchTargetingInformation(params);
66
+ setOverrides(params);
56
67
  });
57
68
 
58
69
  submodule('realTimeData', jwplayerSubmodule);
@@ -71,15 +82,32 @@ export function fetchTargetingInformation(jwTargeting) {
71
82
  });
72
83
  }
73
84
 
85
+ export function setOverrides(params) {
86
+ // For backwards compatibility, default to always unless overridden by Publisher.
87
+ // TODO: Prebid 9 - replace with ENRICH_WHEN_EMPTY
88
+ overrideContentId = sanitizeOverrideParam(params.overrideContentId, ENRICH_ALWAYS);
89
+ overrideContentUrl = sanitizeOverrideParam(params.overrideContentUrl, ENRICH_WHEN_EMPTY);
90
+ overrideContentTitle = sanitizeOverrideParam(params.overrideContentTitle, ENRICH_WHEN_EMPTY);
91
+ overrideContentDescription = sanitizeOverrideParam(params.overrideContentDescription, ENRICH_WHEN_EMPTY);
92
+ }
93
+
94
+ function sanitizeOverrideParam(overrideParam, defaultValue) {
95
+ if (overrideValidationRegex.test(overrideParam)) {
96
+ return overrideParam;
97
+ }
98
+
99
+ return defaultValue;
100
+ }
101
+
74
102
  export function fetchTargetingForMediaId(mediaId) {
75
103
  const ajax = ajaxBuilder();
76
104
  // TODO: Avoid checking undefined vs null by setting a callback to pendingRequests.
77
105
  pendingRequests[mediaId] = null;
78
106
  ajax(`https://cdn.${JWPLAYER_DOMAIN}/v2/media/${mediaId}`, {
79
107
  success: function (response) {
80
- const segment = parseSegment(response);
81
- cacheSegments(segment, mediaId);
82
- onRequestCompleted(mediaId, !!segment);
108
+ const item = parsePlaylistItem(response);
109
+ cachePlaylistItem(item, mediaId);
110
+ onRequestCompleted(mediaId, !!item);
83
111
  },
84
112
  error: function () {
85
113
  logError('failed to retrieve targeting information');
@@ -88,8 +116,8 @@ export function fetchTargetingForMediaId(mediaId) {
88
116
  });
89
117
  }
90
118
 
91
- function parseSegment(response) {
92
- let segment;
119
+ function parsePlaylistItem(response) {
120
+ let item;
93
121
  try {
94
122
  const data = JSON.parse(response);
95
123
  if (!data) {
@@ -101,16 +129,16 @@ function parseSegment(response) {
101
129
  throw ('Empty playlist');
102
130
  }
103
131
 
104
- segment = playlist[0].jwpseg;
132
+ item = playlist[0];
105
133
  } catch (err) {
106
134
  logError(err);
107
135
  }
108
- return segment;
136
+ return item;
109
137
  }
110
138
 
111
- function cacheSegments(jwpseg, mediaId) {
112
- if (jwpseg && mediaId) {
113
- segCache[mediaId] = jwpseg;
139
+ function cachePlaylistItem(playlistItem, mediaId) {
140
+ if (playlistItem && mediaId) {
141
+ playlistItemCache[mediaId] = playlistItem;
114
142
  }
115
143
  }
116
144
 
@@ -167,7 +195,7 @@ export function enrichAdUnits(adUnits, ortb2Fragments = {}) {
167
195
  const contentData = getContentData(mediaId, contentSegments);
168
196
  const targeting = formatTargetingResponse(vat);
169
197
  enrichBids(adUnit.bids, targeting, contentId, contentData);
170
- addOrtbSiteContent(ortb2Fragments.global, contentId, contentData);
198
+ addOrtbSiteContent(ortb2Fragments.global, contentId, contentData, vat.title, vat.description, vat.mediaUrl);
171
199
  };
172
200
  loadVat(jwTargeting, onVatResponse);
173
201
  });
@@ -217,18 +245,27 @@ function loadVatForPendingRequest(playerDivId, mediaID, callback) {
217
245
  }
218
246
 
219
247
  export function getVatFromCache(mediaID) {
220
- const segments = segCache[mediaID];
248
+ const item = playlistItemCache[mediaID];
221
249
 
222
- if (!segments) {
250
+ if (!item) {
223
251
  return null;
224
252
  }
225
253
 
254
+ const mediaUrl = item.file ?? getFileFromSources(item);
255
+
226
256
  return {
227
- segments,
257
+ segments: item.jwpseg,
258
+ title: item.title,
259
+ description: item.description,
260
+ mediaUrl,
228
261
  mediaID
229
262
  };
230
263
  }
231
264
 
265
+ function getFileFromSources(playlistItem) {
266
+ return playlistItem.sources?.find?.(source => !!source.file)?.file;
267
+ }
268
+
232
269
  export function getVatFromPlayer(playerDivId, mediaID) {
233
270
  const player = getPlayer(playerDivId);
234
271
  if (!player) {
@@ -241,12 +278,18 @@ export function getVatFromPlayer(playerDivId, mediaID) {
241
278
  }
242
279
 
243
280
  mediaID = mediaID || item.mediaid;
281
+ const title = item.title;
282
+ const description = item.description;
283
+ const mediaUrl = item.file;
244
284
  const segments = item.jwpseg;
245
- cacheSegments(segments, mediaID)
285
+ cachePlaylistItem(item, mediaID)
246
286
 
247
287
  return {
248
288
  segments,
249
- mediaID
289
+ mediaID,
290
+ title,
291
+ mediaUrl,
292
+ description
250
293
  };
251
294
  }
252
295
 
@@ -313,11 +356,7 @@ export function getContentData(mediaId, segments) {
313
356
  return contentData;
314
357
  }
315
358
 
316
- export function addOrtbSiteContent(ortb2, contentId, contentData) {
317
- if (!contentId && !contentData) {
318
- return;
319
- }
320
-
359
+ export function addOrtbSiteContent(ortb2, contentId, contentData, contentTitle, contentDescription, contentUrl) {
321
360
  if (ortb2 == null) {
322
361
  ortb2 = {};
323
362
  }
@@ -325,11 +364,24 @@ export function addOrtbSiteContent(ortb2, contentId, contentData) {
325
364
  let site = ortb2.site = ortb2.site || {};
326
365
  let content = site.content = site.content || {};
327
366
 
328
- if (contentId) {
367
+ if (shouldOverride(content.id, contentId, overrideContentId)) {
329
368
  content.id = contentId;
330
369
  }
331
370
 
332
- const currentData = content.data = content.data || [];
371
+ if (shouldOverride(content.url, contentUrl, overrideContentUrl)) {
372
+ content.url = contentUrl;
373
+ }
374
+
375
+ if (shouldOverride(content.title, contentTitle, overrideContentTitle)) {
376
+ content.title = contentTitle;
377
+ }
378
+
379
+ if (shouldOverride(content.ext && content.ext.description, contentDescription, overrideContentDescription)) {
380
+ content.ext = content.ext || {};
381
+ content.ext.description = contentDescription;
382
+ }
383
+
384
+ const currentData = content.data || [];
333
385
  // remove old jwplayer data
334
386
  const data = currentData.filter(datum => datum.name !== JWPLAYER_DOMAIN);
335
387
 
@@ -337,11 +389,26 @@ export function addOrtbSiteContent(ortb2, contentId, contentData) {
337
389
  data.push(contentData);
338
390
  }
339
391
 
340
- content.data = data;
392
+ if (data.length) {
393
+ content.data = data;
394
+ }
341
395
 
342
396
  return ortb2;
343
397
  }
344
398
 
399
+ function shouldOverride(currentValue, newValue, configValue) {
400
+ switch (configValue) {
401
+ case ENRICH_ALWAYS:
402
+ return !!newValue;
403
+ case ENRICH_NEVER:
404
+ return false;
405
+ case ENRICH_WHEN_EMPTY:
406
+ return !!newValue && currentValue === undefined;
407
+ default:
408
+ return false;
409
+ }
410
+ }
411
+
345
412
  function enrichBids(bids, targeting, contentId, contentData) {
346
413
  if (!bids) {
347
414
  return;
@@ -78,6 +78,19 @@ realTimeData = {
78
78
  };
79
79
  ```
80
80
 
81
+ ## Configuration syntax
82
+
83
+ | Name |Type | Description | Notes |
84
+ | :------------ | :------------ | :------------ |:------------ |
85
+ | name | String | Real time data module name | Always 'jwplayer' |
86
+ | waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
87
+ | params | Object | | |
88
+ | params.mediaIDs | Array of Strings | Media Ids for prefetching | Optional |
89
+ | params.overrideContentId | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.id | Defaults to 'always' |
90
+ | params.overrideContentUrl | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.url | Defaults to 'whenEmpty' |
91
+ | params.overrideContentTitle | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.title | Defaults to 'whenEmpty' |
92
+ | params.overrideContentDescription | String enum: 'always', 'whenEmpty' or 'never' | Determines when the module should update the oRTB site.content.ext.description | Defaults to 'whenEmpty' |
93
+
81
94
  # Usage for Bid Adapters:
82
95
 
83
96
  Implement the `buildRequests` function. When it is called, the `bidRequests` param will be an array of bids.
@@ -94,6 +107,8 @@ Example:
94
107
  site: {
95
108
  content: {
96
109
  id: 'jw_abc123',
110
+ title: 'media title',
111
+ url: 'https:www.cdn.com/media.mp4',
97
112
  data: [{
98
113
  name: 'jwplayer.com',
99
114
  ext: {
@@ -105,7 +120,10 @@ Example:
105
120
  }, {
106
121
  id: '456'
107
122
  }]
108
- }]
123
+ }],
124
+ ext: {
125
+ description: 'media description'
126
+ }
109
127
  }
110
128
  }
111
129
  }
@@ -116,7 +134,10 @@ where:
116
134
  - `ortb2` is an object containing first party data
117
135
  - `site` is an object containing page specific information
118
136
  - `content` is an object containing metadata for the media. It may contain the following information:
119
- - `id` is a unique identifier for the specific media asset
137
+ - `id` is a unique identifier for the specific media asset,
138
+ - `title` is the title of the media content
139
+ - `url` is the url of the media asset
140
+ - `ext.description` is the description of the media content
120
141
  - `data` is an array containing segment taxonomy objects that have the following parameters:
121
142
  - `name` is the `jwplayer.com` string indicating the provider name
122
143
  - `ext.segtax` whose `502` value is the unique identifier for JW Player's proprietary taxonomy
@@ -2,7 +2,7 @@ import { logError } from '../src/utils.js';
2
2
  import { ajax } from '../src/ajax.js';
3
3
  import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
4
4
  import adapterManager from '../src/adapterManager.js';
5
- import CONSTANTS from '../src/constants.json';
5
+ import { EVENTS } from '../src/constants.js';
6
6
 
7
7
  const EVENT_URL = 'https://krk.kargo.com/api/v1/event';
8
8
  const KARGO_BIDDER_CODE = 'kargo';
@@ -23,11 +23,11 @@ var kargoAnalyticsAdapter = Object.assign(
23
23
  adapter({ analyticsType }), {
24
24
  track({ eventType, args }) {
25
25
  switch (eventType) {
26
- case CONSTANTS.EVENTS.AUCTION_INIT: {
26
+ case EVENTS.AUCTION_INIT: {
27
27
  _logBidResponseData.auctionTimeout = args.timeout;
28
28
  break;
29
29
  }
30
- case CONSTANTS.EVENTS.BID_RESPONSE: {
30
+ case EVENTS.BID_RESPONSE: {
31
31
  handleBidResponseData(args);
32
32
  break;
33
33
  }