prebid.js 9.6.0 → 9.8.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 (274) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  2. package/.github/codeql/codeql-config.yml +3 -0
  3. package/.github/codeql/queries/deviceMemory.ql +14 -0
  4. package/.github/codeql/queries/hardwareConcurrency.ql +14 -0
  5. package/.github/codeql/queries/prebid.qll +36 -0
  6. package/.github/codeql/queries/qlpack.yml +8 -0
  7. package/.github/release-drafter.yml +4 -0
  8. package/.github/workflows/jscpd.yml +1 -1
  9. package/README.md +4 -4
  10. package/dist/33acrossAnalyticsAdapter.js +1 -1
  11. package/dist/33acrossBidAdapter.js +1 -1
  12. package/dist/33acrossIdSystem.js +1 -1
  13. package/dist/BTBidAdapter.js +1 -1
  14. package/dist/adagioAnalyticsAdapter.js +1 -1
  15. package/dist/adagioBidAdapter.js +1 -1
  16. package/dist/adagioUtils.js +1 -1
  17. package/dist/addefendBidAdapter.js +1 -1
  18. package/dist/adgenerationBidAdapter.js +1 -1
  19. package/dist/adlooxRtdProvider.js +1 -1
  20. package/dist/admixerBidAdapter.js +1 -1
  21. package/dist/adqueryBidAdapter.js +1 -1
  22. package/dist/adrelevantisBidAdapter.js +1 -1
  23. package/dist/adstirBidAdapter.js +1 -1
  24. package/dist/adtrgtmeBidAdapter.js +1 -1
  25. package/dist/adxcgAnalyticsAdapter.js +1 -1
  26. package/dist/adxcgBidAdapter.js +1 -1
  27. package/dist/adyoulikeBidAdapter.js +1 -1
  28. package/dist/agmaAnalyticsAdapter.js +1 -1
  29. package/dist/ajaBidAdapter.js +1 -1
  30. package/dist/amxBidAdapter.js +1 -1
  31. package/dist/amxIdSystem.js +1 -1
  32. package/dist/appierAnalyticsAdapter.js +1 -1
  33. package/dist/appnexusBidAdapter.js +1 -1
  34. package/dist/asoBidAdapter.js +1 -1
  35. package/dist/axonixBidAdapter.js +1 -1
  36. package/dist/bidglassBidAdapter.js +1 -1
  37. package/dist/big-richmediaBidAdapter.js +1 -1
  38. package/dist/bridBidAdapter.js +1 -1
  39. package/dist/bridgewellBidAdapter.js +1 -1
  40. package/dist/brightMountainMediaBidAdapter.js +1 -1
  41. package/dist/carodaBidAdapter.js +1 -1
  42. package/dist/ccxBidAdapter.js +1 -1
  43. package/dist/chtnwBidAdapter.js +1 -1
  44. package/dist/chunk-core.js +1 -1
  45. package/dist/cleanmedianetBidAdapter.js +1 -1
  46. package/dist/concertBidAdapter.js +1 -1
  47. package/dist/connectadBidAdapter.js +1 -1
  48. package/dist/connectionInfo.js +1 -0
  49. package/dist/consumableBidAdapter.js +1 -1
  50. package/dist/contxtfulRtdProvider.js +1 -1
  51. package/dist/conversantAnalyticsAdapter.js +1 -1
  52. package/dist/conversantBidAdapter.js +1 -1
  53. package/dist/craftBidAdapter.js +1 -1
  54. package/dist/criteoBidAdapter.js +1 -1
  55. package/dist/cwireBidAdapter.js +1 -1
  56. package/dist/dailymotionBidAdapter.js +1 -1
  57. package/dist/dependencies.json +16 -3
  58. package/dist/discoveryBidAdapter.js +1 -1
  59. package/dist/docereeAdManagerBidAdapter.js +1 -1
  60. package/dist/dspxBidAdapter.js +1 -1
  61. package/dist/dxkultureBidAdapter.js +1 -1
  62. package/dist/eightPodAnalyticsAdapter.js +1 -1
  63. package/dist/eplanningBidAdapter.js +1 -1
  64. package/dist/euidIdSystem.js +1 -1
  65. package/dist/exadsBidAdapter.js +1 -1
  66. package/dist/feedadBidAdapter.js +1 -1
  67. package/dist/finativeBidAdapter.js +1 -1
  68. package/dist/freewheel-sspBidAdapter.js +1 -1
  69. package/dist/gamoshiBidAdapter.js +1 -1
  70. package/dist/gmosspBidAdapter.js +1 -1
  71. package/dist/goldbachBidAdapter.js +1 -1
  72. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  73. package/dist/greenbidsRtdProvider.js +1 -1
  74. package/dist/gridBidAdapter.js +1 -1
  75. package/dist/gumgumBidAdapter.js +1 -1
  76. package/dist/h12mediaBidAdapter.js +1 -1
  77. package/dist/hypelabBidAdapter.js +1 -1
  78. package/dist/id5AnalyticsAdapter.js +1 -1
  79. package/dist/id5IdSystem.js +1 -1
  80. package/dist/idImportLibrary.js +1 -1
  81. package/dist/imdsBidAdapter.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/insticatorBidAdapter.js +1 -1
  84. package/dist/intentIqAnalyticsAdapter.js +1 -1
  85. package/dist/ixBidAdapter.js +1 -1
  86. package/dist/jixieBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/kargoBidAdapter.js +1 -1
  89. package/dist/kimberliteBidAdapter.js +1 -1
  90. package/dist/konduitAnalyticsAdapter.js +1 -1
  91. package/dist/kueezBidAdapter.js +1 -1
  92. package/dist/lassoBidAdapter.js +1 -1
  93. package/dist/lifestreetBidAdapter.js +1 -1
  94. package/dist/liveIntentIdSystem.js +1 -1
  95. package/dist/logicadBidAdapter.js +1 -1
  96. package/dist/loglyliftBidAdapter.js +1 -1
  97. package/dist/luceadBidAdapter.js +1 -1
  98. package/dist/mabidderBidAdapter.js +1 -1
  99. package/dist/magniteAnalyticsAdapter.js +1 -1
  100. package/dist/malltvAnalyticsAdapter.js +1 -1
  101. package/dist/marsmediaBidAdapter.js +1 -1
  102. package/dist/mediafuseBidAdapter.js +1 -1
  103. package/dist/mediagoBidAdapter.js +1 -1
  104. package/dist/medianetAnalyticsAdapter.js +1 -1
  105. package/dist/medianetBidAdapter.js +1 -1
  106. package/dist/mediasquareBidAdapter.js +1 -1
  107. package/dist/mgidBidAdapter.js +1 -1
  108. package/dist/mgidUtils.js +1 -0
  109. package/dist/mgidXBidAdapter.js +1 -1
  110. package/dist/missenaBidAdapter.js +1 -1
  111. package/dist/mobianRtdProvider.js +1 -1
  112. package/dist/navigatorData.js +1 -0
  113. package/dist/nexx360BidAdapter.js +1 -1
  114. package/dist/nobidAnalyticsAdapter.js +1 -1
  115. package/dist/nobidBidAdapter.js +1 -1
  116. package/dist/not-for-prod/prebid.js +176 -170
  117. package/dist/oguryBidAdapter.js +1 -1
  118. package/dist/omsBidAdapter.js +1 -1
  119. package/dist/onetagBidAdapter.js +1 -1
  120. package/dist/ooloAnalyticsAdapter.js +1 -1
  121. package/dist/openxBidAdapter.js +1 -1
  122. package/dist/optidigitalBidAdapter.js +1 -1
  123. package/dist/orbidderBidAdapter.js +1 -1
  124. package/dist/ortbConverter.js +1 -1
  125. package/dist/outbrainBidAdapter.js +1 -1
  126. package/dist/ownadxBidAdapter.js +1 -0
  127. package/dist/pixfutureBidAdapter.js +1 -1
  128. package/dist/prismaBidAdapter.js +1 -1
  129. package/dist/publinkIdSystem.js +1 -1
  130. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  131. package/dist/pubmaticBidAdapter.js +1 -1
  132. package/dist/pubriseBidAdapter.js +1 -0
  133. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  134. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  135. package/dist/pubxaiRtdProvider.js +1 -1
  136. package/dist/pxyzBidAdapter.js +1 -1
  137. package/dist/quantcastBidAdapter.js +1 -1
  138. package/dist/readpeakBidAdapter.js +1 -1
  139. package/dist/redtramBidAdapter.js +1 -1
  140. package/dist/relaidoBidAdapter.js +1 -1
  141. package/dist/retailspotBidAdapter.js +1 -1
  142. package/dist/rhythmoneBidAdapter.js +1 -1
  143. package/dist/riseUtils.js +1 -1
  144. package/dist/rubiconBidAdapter.js +1 -1
  145. package/dist/seedingAllianceBidAdapter.js +1 -1
  146. package/dist/seedtagBidAdapter.js +1 -1
  147. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  148. package/dist/sharethroughBidAdapter.js +1 -1
  149. package/dist/smaatoBidAdapter.js +1 -1
  150. package/dist/smartadserverBidAdapter.js +1 -1
  151. package/dist/smarthubBidAdapter.js +1 -1
  152. package/dist/smartxBidAdapter.js +1 -1
  153. package/dist/smilewantedBidAdapter.js +1 -1
  154. package/dist/snigelBidAdapter.js +1 -1
  155. package/dist/sonobiBidAdapter.js +1 -1
  156. package/dist/sovrnBidAdapter.js +1 -1
  157. package/dist/sspBCBidAdapter.js +1 -1
  158. package/dist/stvBidAdapter.js +1 -1
  159. package/dist/sublimeBidAdapter.js +1 -1
  160. package/dist/taboolaBidAdapter.js +1 -1
  161. package/dist/tappxBidAdapter.js +1 -1
  162. package/dist/targetVideoBidAdapter.js +1 -1
  163. package/dist/teadsBidAdapter.js +1 -1
  164. package/dist/terceptAnalyticsAdapter.js +1 -1
  165. package/dist/themoneytizerBidAdapter.js +1 -1
  166. package/dist/trionBidAdapter.js +1 -1
  167. package/dist/tripleliftBidAdapter.js +1 -1
  168. package/dist/ttdBidAdapter.js +1 -1
  169. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  170. package/dist/uid2IdSystem.js +1 -1
  171. package/dist/underdogmediaBidAdapter.js +1 -1
  172. package/dist/undertoneBidAdapter.js +1 -1
  173. package/dist/unrulyBidAdapter.js +1 -1
  174. package/dist/userId.js +1 -1
  175. package/dist/viantOrtbBidAdapter.js +1 -1
  176. package/dist/vidazooUtils.js +1 -1
  177. package/dist/videobyteBidAdapter.js +1 -1
  178. package/dist/visxBidAdapter.js +1 -1
  179. package/dist/vuukleBidAdapter.js +1 -1
  180. package/dist/widespaceBidAdapter.js +1 -1
  181. package/dist/winrBidAdapter.js +1 -1
  182. package/dist/wurflRtdProvider.js +1 -0
  183. package/dist/yahooAdsBidAdapter.js +1 -1
  184. package/dist/yieldmoBidAdapter.js +1 -1
  185. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  186. package/integrationExamples/gpt/wurflRtdProvider_example.html +106 -0
  187. package/libraries/connectionInfo/connectionUtils.js +33 -0
  188. package/libraries/mgidUtils/mgidUtils.js +73 -0
  189. package/{src/fpd/navigator.js → libraries/navigatorData/navigatorData.js} +1 -1
  190. package/libraries/ortbConverter/processors/video.js +2 -24
  191. package/libraries/riseUtils/index.js +2 -1
  192. package/libraries/vidazooUtils/bidderUtils.js +16 -0
  193. package/modules/.submodules.json +3 -1
  194. package/modules/51DegreesRtdProvider.md +11 -7
  195. package/modules/adagioBidAdapter.js +10 -50
  196. package/modules/admixerBidAdapter.js +12 -5
  197. package/modules/appnexusBidAdapter.js +1 -1
  198. package/modules/ccxBidAdapter.js +6 -2
  199. package/modules/cleanmedianetBidAdapter.js +1 -1
  200. package/modules/contxtfulRtdProvider.js +15 -12
  201. package/modules/cwireBidAdapter.js +13 -9
  202. package/modules/cwireBidAdapter.md +29 -10
  203. package/modules/dailymotionBidAdapter.js +20 -1
  204. package/modules/dailymotionBidAdapter.md +11 -7
  205. package/modules/discoveryBidAdapter.js +1 -1
  206. package/modules/docereeAdManagerBidAdapter.js +9 -12
  207. package/modules/eightPodAnalyticsAdapter.js +13 -1
  208. package/modules/gamoshiBidAdapter.js +1 -1
  209. package/modules/greenbidsAnalyticsAdapter.js +7 -4
  210. package/modules/greenbidsRtdProvider.js +15 -5
  211. package/modules/id5IdSystem.js +14 -93
  212. package/modules/idImportLibrary.js +14 -6
  213. package/modules/ixBidAdapter.js +0 -1
  214. package/modules/mediagoBidAdapter.js +4 -4
  215. package/modules/mgidBidAdapter.js +30 -109
  216. package/modules/mgidXBidAdapter.js +2 -66
  217. package/modules/mobianRtdProvider.js +28 -14
  218. package/modules/omsBidAdapter.js +1 -1
  219. package/modules/ownadxBidAdapter.js +99 -0
  220. package/modules/prismaBidAdapter.js +1 -27
  221. package/modules/pubmaticBidAdapter.js +2 -1
  222. package/modules/pubriseBidAdapter.js +19 -0
  223. package/modules/pubriseBidAdapter.md +79 -0
  224. package/modules/pubxaiAnalyticsAdapter.js +9 -4
  225. package/modules/pubxaiRtdProvider.js +38 -18
  226. package/modules/pubxaiRtdProvider.md +2 -2
  227. package/modules/redtramBidAdapter.js +2 -6
  228. package/modules/rubiconBidAdapter.js +3 -3
  229. package/modules/sharethroughBidAdapter.js +5 -0
  230. package/modules/smarthubBidAdapter.js +2 -0
  231. package/modules/teadsBidAdapter.js +4 -3
  232. package/modules/ttdBidAdapter.js +14 -32
  233. package/modules/undertoneBidAdapter.js +1 -19
  234. package/modules/userId/index.js +1 -1
  235. package/modules/viantOrtbBidAdapter.js +1 -1
  236. package/modules/wurflRtdProvider.js +213 -0
  237. package/modules/wurflRtdProvider.md +67 -0
  238. package/package.json +1 -1
  239. package/src/adloader.js +1 -0
  240. package/src/prebid.js +2 -1
  241. package/src/utils/focusTimeout.js +17 -6
  242. package/src/utils/ttlCollection.js +1 -1
  243. package/src/utils.js +28 -0
  244. package/src/video.js +78 -1
  245. package/test/spec/modules/adagioBidAdapter_spec.js +0 -1
  246. package/test/spec/modules/admixerBidAdapter_spec.js +2 -2
  247. package/test/spec/modules/appnexusBidAdapter_spec.js +0 -33
  248. package/test/spec/modules/ccxBidAdapter_spec.js +81 -0
  249. package/test/spec/modules/cleanmedianetBidAdapter_spec.js +1 -1
  250. package/test/spec/modules/contxtfulRtdProvider_spec.js +19 -19
  251. package/test/spec/modules/dailymotionBidAdapter_spec.js +62 -12
  252. package/test/spec/modules/discoveryBidAdapter_spec.js +1 -1
  253. package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +1 -0
  254. package/test/spec/modules/gamoshiBidAdapter_spec.js +1 -1
  255. package/test/spec/modules/id5IdSystem_spec.js +25 -98
  256. package/test/spec/modules/idImportLibrary_spec.js +14 -0
  257. package/test/spec/modules/ixBidAdapter_spec.js +8 -1
  258. package/test/spec/modules/mobianRtdProvider_spec.js +46 -43
  259. package/test/spec/modules/openxBidAdapter_spec.js +1 -1
  260. package/test/spec/modules/ownadxBidAdapter_spec.js +103 -0
  261. package/test/spec/modules/pubmaticBidAdapter_spec.js +18 -0
  262. package/test/spec/modules/pubriseBidAdapter_spec.js +514 -0
  263. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +9 -4
  264. package/test/spec/modules/pubxaiRtdProvider_spec.js +37 -5
  265. package/test/spec/modules/rubiconBidAdapter_spec.js +10 -0
  266. package/test/spec/modules/sharethroughBidAdapter_spec.js +35 -0
  267. package/test/spec/modules/trafficgateBidAdapter_spec.js +1 -1
  268. package/test/spec/modules/ttdBidAdapter_spec.js +10 -1
  269. package/test/spec/modules/viantOrtbBidAdapter_spec.js +1 -1
  270. package/test/spec/modules/vidazooBidAdapter_spec.js +12 -4
  271. package/test/spec/modules/wurflRtdProvider_spec.js +324 -0
  272. package/test/spec/ortbConverter/userId_spec.js +23 -2
  273. package/test/spec/unit/utils/focusTimeout_spec.js +33 -6
  274. package/test/spec/video_spec.js +103 -1
@@ -0,0 +1,99 @@
1
+ import { parseSizesInput, isEmpty } from '../src/utils.js';
2
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
3
+ import { BANNER } from '../src/mediaTypes.js'
4
+
5
+ /**
6
+ * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
7
+ * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid
8
+ * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse
9
+ */
10
+
11
+ const BIDDER_CODE = 'ownadx';
12
+ const CUR = 'USD';
13
+ const CREATIVE_TTL = 300;
14
+
15
+ export const spec = {
16
+ code: BIDDER_CODE,
17
+ supportedMediaTypes: [BANNER],
18
+
19
+ /**
20
+ * Determines whether or not the given bid request is valid.
21
+ *
22
+ * @param {BidRequest} bid The bid params to validate.
23
+ * @return boolean True if this is a valid bid, and false otherwise.
24
+ */
25
+ isBidRequestValid: function (bid) {
26
+ return !!(bid.params.tokenId && bid.params.sspId && bid.params.seatId);
27
+ },
28
+
29
+ /**
30
+ * Make a server request from the list of BidRequests.
31
+ *
32
+ * @param validBidRequests
33
+ * @param bidderRequest
34
+ * @return Array Info describing the request to the server.
35
+ */
36
+ buildRequests: function (validBidRequests, bidderRequest) {
37
+ return validBidRequests.map(bidRequest => {
38
+ const sizes = parseSizesInput(bidRequest.params.size || bidRequest.sizes);
39
+ let mtype = 0;
40
+ if (bidRequest.mediaTypes[BANNER]) {
41
+ mtype = 1;
42
+ } else {
43
+ mtype = 2;
44
+ }
45
+
46
+ let tkn = bidRequest.params.tokenId;
47
+ let seatid = bidRequest.params.seatId;
48
+ let sspid = bidRequest.params.sspId;
49
+
50
+ const payload = {
51
+ sizes: sizes,
52
+ slotBidId: bidRequest.bidId,
53
+ PageUrl: bidderRequest.refererInfo.page,
54
+ mediaChannel: mtype
55
+ };
56
+ return {
57
+ method: 'POST',
58
+ url: `https://pbs-js.prebid-ownadx.com/publisher/prebid/${seatid}/${sspid}?token=${tkn}`,
59
+ data: payload
60
+ };
61
+ });
62
+ },
63
+
64
+ /**
65
+ * Unpack the response from the server into a list of bids.
66
+ *
67
+ * @param {ServerResponse} serverResponse A successful response from the server.
68
+ * @return {Bid[]} An array of bids which were nested inside the server.
69
+ */
70
+ interpretResponse: function (serverResponse) {
71
+ const response = serverResponse.body;
72
+ const bids = [];
73
+ if (isEmpty(response)) {
74
+ return bids;
75
+ }
76
+ const responseBid = {
77
+ width: response.width,
78
+ height: response.height,
79
+ token: response.tokenId,
80
+ ttl: CREATIVE_TTL,
81
+ requestId: response.slotBidId,
82
+ aType: response.adType || '1',
83
+ cpm: response.cpm,
84
+ creativeId: response.creativeId || 0,
85
+ netRevenue: response.netRevenue || false,
86
+ currency: response.currency || CUR,
87
+ meta: {
88
+ mediaType: response.mediaType || BANNER,
89
+ advertiserDomains: response.advertiserDomains || []
90
+ },
91
+ ad: response.adm
92
+ };
93
+ bids.push(responseBid);
94
+ return bids;
95
+ }
96
+
97
+ };
98
+
99
+ registerBidder(spec);
@@ -3,6 +3,7 @@ import {config} from '../src/config.js';
3
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
4
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
5
5
  import {getANKeywordParam} from '../libraries/appnexusUtils/anKeywords.js';
6
+ import {getConnectionType} from '../libraries/connectionInfo/connectionUtils.js'
6
7
 
7
8
  /**
8
9
  * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
@@ -20,33 +21,6 @@ const METRICS_TRACKER_URL = 'https://prisma.nexx360.io/track-imp';
20
21
 
21
22
  const GVLID = 965;
22
23
 
23
- function getConnectionType() {
24
- const connection = navigator.connection || navigator.webkitConnection;
25
- if (!connection) {
26
- return 0;
27
- }
28
- switch (connection.type) {
29
- case 'ethernet':
30
- return 1;
31
- case 'wifi':
32
- return 2;
33
- case 'cellular':
34
- switch (connection.effectiveType) {
35
- case 'slow-2g':
36
- case '2g':
37
- return 4;
38
- case '3g':
39
- return 5;
40
- case '4g':
41
- return 6;
42
- default:
43
- return 3;
44
- }
45
- default:
46
- return 0;
47
- }
48
- }
49
-
50
24
  export const spec = {
51
25
  code: BIDDER_CODE,
52
26
  gvlid: GVLID,
@@ -687,7 +687,8 @@ function _createImpressionObject(bid, bidderRequest) {
687
687
  },
688
688
  bidfloorcur: bid.params.currency ? _parseSlotParam('currency', bid.params.currency) : DEFAULT_CURRENCY,
689
689
  displaymanager: 'Prebid.js',
690
- displaymanagerver: '$prebid.version$' // prebid version
690
+ displaymanagerver: '$prebid.version$', // prebid version
691
+ pmp: bid.ortb2Imp?.pmp || undefined
691
692
  };
692
693
 
693
694
  _addPMPDealsInImpression(impObj, bid);
@@ -0,0 +1,19 @@
1
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
2
+ import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
3
+ import { isBidRequestValid, buildRequests, interpretResponse, getUserSyncs } from '../libraries/teqblazeUtils/bidderUtils.js';
4
+
5
+ const BIDDER_CODE = 'pubrise';
6
+ const AD_URL = 'https://backend.pubrise.ai/pbjs';
7
+ const SYNC_URL = 'https://sync.pubrise.ai';
8
+
9
+ export const spec = {
10
+ code: BIDDER_CODE,
11
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
12
+
13
+ isBidRequestValid: isBidRequestValid(),
14
+ buildRequests: buildRequests(AD_URL),
15
+ interpretResponse,
16
+ getUserSyncs: getUserSyncs(SYNC_URL)
17
+ };
18
+
19
+ registerBidder(spec);
@@ -0,0 +1,79 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: Pubrise Bidder Adapter
5
+ Module Type: Pubrise Bidder Adapter
6
+ Maintainer: prebid@pubrise.ai
7
+ ```
8
+
9
+ # Description
10
+
11
+ Connects to Pubrise exchange for bids.
12
+ Pubrise bid adapter supports Banner, Video (instream and outstream) and Native.
13
+
14
+ # Test Parameters
15
+ ```
16
+ var adUnits = [
17
+ // Will return static test banner
18
+ {
19
+ code: 'adunit1',
20
+ mediaTypes: {
21
+ banner: {
22
+ sizes: [ [300, 250], [320, 50] ],
23
+ }
24
+ },
25
+ bids: [
26
+ {
27
+ bidder: 'pubrise',
28
+ params: {
29
+ placementId: 'testBanner',
30
+ }
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ code: 'addunit2',
36
+ mediaTypes: {
37
+ video: {
38
+ playerSize: [ [640, 480] ],
39
+ context: 'instream',
40
+ minduration: 5,
41
+ maxduration: 60,
42
+ }
43
+ },
44
+ bids: [
45
+ {
46
+ bidder: 'pubrise',
47
+ params: {
48
+ placementId: 'testVideo',
49
+ }
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ code: 'addunit3',
55
+ mediaTypes: {
56
+ native: {
57
+ title: {
58
+ required: true
59
+ },
60
+ body: {
61
+ required: true
62
+ },
63
+ icon: {
64
+ required: true,
65
+ size: [64, 64]
66
+ }
67
+ }
68
+ },
69
+ bids: [
70
+ {
71
+ bidder: 'pubrise',
72
+ params: {
73
+ placementId: 'testNative',
74
+ }
75
+ }
76
+ ]
77
+ }
78
+ ];
79
+ ```
@@ -157,15 +157,19 @@ const track = ({ eventType, args }) => {
157
157
  // handle invalid bids, and remove them from the adUnit cache
158
158
  case EVENTS.BID_TIMEOUT:
159
159
  args.map(extractBid).forEach((bid) => {
160
- bid.renderStatus = 3;
160
+ bid.bidType = 3;
161
161
  auctionCache[bid.auctionId].bids.push(bid);
162
162
  });
163
163
  break;
164
164
  // handle valid bid responses and record them as part of an auction
165
165
  case EVENTS.BID_RESPONSE:
166
- const bid = Object.assign(extractBid(args), { renderStatus: 2 });
166
+ const bid = Object.assign(extractBid(args), { bidType: 2 });
167
167
  auctionCache[bid.auctionId].bids.push(bid);
168
168
  break;
169
+ case EVENTS.BID_REJECTED:
170
+ const rejectedBid = Object.assign(extractBid(args), { bidType: 1 });
171
+ auctionCache[rejectedBid.auctionId].bids.push(rejectedBid);
172
+ break;
169
173
  // capture extra information from the auction, and if there were no bids
170
174
  // (and so no chance of a win) send the auction
171
175
  case EVENTS.AUCTION_END:
@@ -183,7 +187,7 @@ const track = ({ eventType, args }) => {
183
187
  timestamp: args.timestamp,
184
188
  });
185
189
  if (
186
- auctionCache[args.auctionId].bids.every((bid) => bid.renderStatus === 3)
190
+ auctionCache[args.auctionId].bids.every((bid) => bid.bidType === 3)
187
191
  ) {
188
192
  prepareSend(args.auctionId);
189
193
  }
@@ -201,7 +205,7 @@ const track = ({ eventType, args }) => {
201
205
  isFloorSkipped: floorDetail?.skipped || false,
202
206
  isWinningBid: true,
203
207
  renderedSize: args.size,
204
- renderStatus: 4,
208
+ bidType: 4,
205
209
  });
206
210
  winningBid.adServerData = getAdServerDataForBid(winningBid);
207
211
  auctionCache[winningBid.auctionId].winningBid = winningBid;
@@ -283,6 +287,7 @@ const prepareSend = (auctionId) => {
283
287
  auctionTimestamp: auctionData.auctionDetail.timestamp,
284
288
  pubxaiAnalyticsVersion: pubxaiAnalyticsVersion,
285
289
  prebidVersion: '$prebid.version$',
290
+ pubxId: initOptions.pubxId,
286
291
  },
287
292
  });
288
293
  sendCache[pubxaiAnalyticsRequestUrl].push(data);
@@ -2,6 +2,8 @@ import { ajax } from '../src/ajax.js';
2
2
  import { config } from '../src/config.js';
3
3
  import { submodule } from '../src/hook.js';
4
4
  import { deepAccess } from '../src/utils.js';
5
+ import { MODULE_TYPE_RTD } from '../src/activities/modules.js';
6
+ import { getStorageManager } from '../src/storageManager.js';
5
7
  /**
6
8
  * This RTD module has a dependency on the priceFloors module.
7
9
  * We utilize the createFloorsDataForAuction function from the priceFloors module to incorporate price floors data into the current auction.
@@ -16,6 +18,7 @@ export const FloorsApiStatus = Object.freeze({
16
18
  SUCCESS: 'SUCCESS',
17
19
  ERROR: 'ERROR',
18
20
  });
21
+ export const storage = getStorageManager({ moduleType: MODULE_TYPE_RTD, moduleName: SUBMODULE_NAME });
19
22
  export const FLOORS_EVENT_HANDLE = 'floorsApi';
20
23
  export const FLOORS_END_POINT = 'https://floor.pbxai.com/';
21
24
  export const FLOOR_PROVIDER = 'PubxFloorProvider';
@@ -80,31 +83,48 @@ export const setFloorsApiStatus = (status) => {
80
83
 
81
84
  export const getUrl = (provider) => {
82
85
  const { pubxId, endpoint } = deepAccess(provider, 'params');
83
- return `${endpoint || FLOORS_END_POINT}?pubxId=${pubxId}&page=${
84
- window.location.href
85
- }`;
86
+ if (!endpoint) {
87
+ return null; // Indicate that no endpoint is provided
88
+ }
89
+ return `${endpoint || FLOORS_END_POINT}?pubxId=${pubxId}&page=${window.location.href}`;
86
90
  };
87
91
 
88
92
  export const fetchFloorRules = async (provider) => {
89
93
  return new Promise((resolve, reject) => {
90
94
  setFloorsApiStatus(FloorsApiStatus.IN_PROGRESS);
91
- ajax(getUrl(provider), {
92
- success: (responseText, response) => {
93
- try {
94
- if (response && response.response) {
95
- const floorsResponse = JSON.parse(response.response);
96
- resolve(floorsResponse);
97
- } else {
98
- resolve(null);
95
+ const url = getUrl(provider);
96
+ if (url) {
97
+ // Fetch from remote endpoint
98
+ ajax(url, {
99
+ success: (responseText, response) => {
100
+ try {
101
+ if (response && response.response) {
102
+ const floorsResponse = JSON.parse(response.response);
103
+ resolve(floorsResponse);
104
+ } else {
105
+ resolve(null);
106
+ }
107
+ } catch (error) {
108
+ reject(error);
99
109
  }
100
- } catch (error) {
101
- reject(error);
110
+ },
111
+ error: (responseText, response) => {
112
+ reject(response);
113
+ },
114
+ });
115
+ } else {
116
+ // Fetch from local storage
117
+ try {
118
+ const localData = storage.getDataFromSessionStorage('pubx:dynamicFloors') || window.__pubxDynamicFloors__;
119
+ if (localData) {
120
+ resolve(JSON.parse(localData));
121
+ } else {
122
+ resolve(null);
102
123
  }
103
- },
104
- error: (responseText, response) => {
105
- reject(response);
106
- },
107
- });
124
+ } catch (error) {
125
+ reject(error);
126
+ }
127
+ }
108
128
  });
109
129
  };
110
130
 
@@ -32,7 +32,7 @@ pbjs.setConfig({
32
32
  ...,
33
33
  realTimeData: {
34
34
  auctionDelay: AUCTION_DELAY,
35
- dataProviders: {
35
+ dataProviders: [{
36
36
  name: "pubxai",
37
37
  waitForIt: true,
38
38
  params: {
@@ -42,7 +42,7 @@ pbjs.setConfig({
42
42
  enforcement: `<enforcement>`, // (optional)
43
43
  data: `<defaultConfig>` // (optional)
44
44
  }
45
- }
45
+ }]
46
46
  }
47
47
  // rest of the config
48
48
  ...,
@@ -1,9 +1,8 @@
1
1
  import {
2
2
  isFn,
3
- isStr,
4
3
  deepAccess,
5
4
  getWindowTop,
6
- triggerPixel
5
+ triggerNurlWithCpm
7
6
  } from '../src/utils.js';
8
7
  import { registerBidder } from '../src/adapters/bidderFactory.js';
9
8
  import { BANNER } from '../src/mediaTypes.js';
@@ -145,10 +144,7 @@ export const spec = {
145
144
 
146
145
  onBidWon: (bid) => {
147
146
  const cpm = deepAccess(bid, 'adserverTargeting.hb_pb') || '';
148
- if (isStr(bid.nurl) && bid.nurl !== '') {
149
- bid.nurl = bid.nurl.replace(/\${AUCTION_PRICE}/, cpm);
150
- triggerPixel(bid.nurl);
151
- }
147
+ triggerNurlWithCpm(bid, cpm)
152
148
  }
153
149
  };
154
150
 
@@ -219,9 +219,9 @@ export const converter = ortbConverter({
219
219
  const {bidRequest} = context;
220
220
 
221
221
  let [parseSizeWidth, parseSizeHeight] = bidRequest.mediaTypes.video?.context === 'outstream' ? parseSizes(bidRequest, VIDEO) : [undefined, undefined];
222
-
223
- bidResponse.width = bid.w || parseSizeWidth || bidResponse.playerWidth;
224
- bidResponse.height = bid.h || parseSizeHeight || bidResponse.playerHeight;
222
+ // 0 by default to avoid undefined size
223
+ bidResponse.width = bid.w || parseSizeWidth || bidResponse.playerWidth || 0;
224
+ bidResponse.height = bid.h || parseSizeHeight || bidResponse.playerHeight || 0;
225
225
 
226
226
  if (bidResponse.mediaType === VIDEO && bidRequest.mediaTypes.video.context === 'outstream') {
227
227
  bidResponse.renderer = outstreamRenderer(bidResponse);
@@ -68,6 +68,11 @@ export const sharethroughAdapterSpec = {
68
68
  req.device.ext['cdep'] = bidderRequest.ortb2.device.ext.cdep;
69
69
  }
70
70
 
71
+ // if present, merge device object from ortb2 into `req.device`
72
+ if (bidderRequest?.ortb2?.device) {
73
+ mergeDeep(req.device, bidderRequest.ortb2.device);
74
+ }
75
+
71
76
  req.user = nullish(firstPartyData.user, {});
72
77
  if (!req.user.ext) req.user.ext = {};
73
78
  req.user.ext.eids = bidRequests[0].userIdAsEids || [];
@@ -12,6 +12,7 @@ const ALIASES = [
12
12
  {code: 'markapp', skipPbsAliasing: true},
13
13
  {code: 'jdpmedia', skipPbsAliasing: true},
14
14
  {code: 'tredio', skipPbsAliasing: true},
15
+ {code: 'felixads', skipPbsAliasing: true},
15
16
  {code: 'vimayx', skipPbsAliasing: true},
16
17
  ];
17
18
  const BASE_URLS = {
@@ -19,6 +20,7 @@ const BASE_URLS = {
19
20
  markapp: 'https://markapp-prebid.smart-hub.io/pbjs',
20
21
  jdpmedia: 'https://jdpmedia-prebid.smart-hub.io/pbjs',
21
22
  tredio: 'https://tredio-prebid.smart-hub.io/pbjs',
23
+ felixads: 'https://felixads-prebid.smart-hub.io/pbjs',
22
24
  vimayx: 'https://vimayx-prebid.smart-hub.io/pbjs',
23
25
  };
24
26
 
@@ -2,6 +2,7 @@ import {getValue, logError, deepAccess, parseSizesInput, isArray, getBidIdParame
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {getStorageManager} from '../src/storageManager.js';
4
4
  import {isAutoplayEnabled} from '../libraries/autoplayDetection/autoplay.js';
5
+ import {getDM, getHC, getHLen} from '../libraries/navigatorData/navigatorData.js';
5
6
 
6
7
  /**
7
8
  * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
@@ -65,11 +66,11 @@ export const spec = {
65
66
  deviceHeight: screen.height,
66
67
  devicePixelRatio: topWindow.devicePixelRatio,
67
68
  screenOrientation: screen.orientation?.type,
68
- historyLength: topWindow.history?.length,
69
+ historyLength: getHLen(),
69
70
  viewportHeight: topWindow.visualViewport?.height,
70
71
  viewportWidth: topWindow.visualViewport?.width,
71
- hardwareConcurrency: topWindow.navigator?.hardwareConcurrency,
72
- deviceMemory: topWindow.navigator?.deviceMemory,
72
+ hardwareConcurrency: getHC(),
73
+ deviceMemory: getDM(),
73
74
  hb_version: '$prebid.version$',
74
75
  ...getSharedViewerIdParameters(validBidRequests),
75
76
  ...getFirstPartyTeadsIdParameter(validBidRequests)
@@ -2,7 +2,8 @@ import * as utils from '../src/utils.js';
2
2
  import { config } from '../src/config.js';
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
5
- import {isNumber} from '../src/utils.js';
5
+ import { isNumber } from '../src/utils.js';
6
+ import { getConnectionType } from '../libraries/connectionInfo/connectionUtils.js'
6
7
 
7
8
  /**
8
9
  * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
@@ -13,10 +14,11 @@ import {isNumber} from '../src/utils.js';
13
14
  * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync
14
15
  */
15
16
 
16
- const BIDADAPTERVERSION = 'TTD-PREBID-2023.09.05';
17
+ const BIDADAPTERVERSION = 'TTD-PREBID-2024.07.26';
17
18
  const BIDDER_CODE = 'ttd';
18
19
  const BIDDER_CODE_LONG = 'thetradedesk';
19
20
  const BIDDER_ENDPOINT = 'https://direct.adsrvr.org/bid/bidder/';
21
+ const BIDDER_ENDPOINT_HTTP2 = 'https://d2.adsrvr.org/bid/bidder/';
20
22
  const USER_SYNC_ENDPOINT = 'https://match.adsrvr.org';
21
23
 
22
24
  const MEDIA_TYPE = {
@@ -99,33 +101,6 @@ function getDevice(firstPartyData) {
99
101
  return device;
100
102
  };
101
103
 
102
- function getConnectionType() {
103
- const connection = navigator.connection || navigator.webkitConnection;
104
- if (!connection) {
105
- return 0;
106
- }
107
- switch (connection.type) {
108
- case 'ethernet':
109
- return 1;
110
- case 'wifi':
111
- return 2;
112
- case 'cellular':
113
- switch (connection.effectiveType) {
114
- case 'slow-2g':
115
- case '2g':
116
- return 4;
117
- case '3g':
118
- return 5;
119
- case '4g':
120
- return 6;
121
- default:
122
- return 3;
123
- }
124
- default:
125
- return 0;
126
- }
127
- }
128
-
129
104
  function getUser(bidderRequest, firstPartyData) {
130
105
  let user = {};
131
106
  if (bidderRequest.gdprConsent) {
@@ -241,7 +216,7 @@ function banner(bid) {
241
216
  },
242
217
  optionalParams);
243
218
 
244
- const battr = utils.deepAccess(bid, 'ortb2Imp.battr');
219
+ const battr = utils.deepAccess(bid, 'ortb2Imp.banner.battr');
245
220
  if (battr) {
246
221
  banner.battr = battr;
247
222
  }
@@ -318,7 +293,7 @@ function video(bid) {
318
293
  video.maxbitrate = maxbitrate;
319
294
  }
320
295
 
321
- const battr = utils.deepAccess(bid, 'ortb2Imp.battr');
296
+ const battr = utils.deepAccess(bid, 'ortb2Imp.video.battr');
322
297
  if (battr) {
323
298
  video.battr = battr;
324
299
  }
@@ -327,6 +302,13 @@ function video(bid) {
327
302
  }
328
303
  }
329
304
 
305
+ function selectEndpoint(params) {
306
+ if (params.useHttp2) {
307
+ return BIDDER_ENDPOINT_HTTP2;
308
+ }
309
+ return BIDDER_ENDPOINT;
310
+ }
311
+
330
312
  export const spec = {
331
313
  code: BIDDER_CODE,
332
314
  gvlid: 21,
@@ -443,7 +425,7 @@ export const spec = {
443
425
  topLevel.pmp = firstPartyData.pmp
444
426
  }
445
427
 
446
- let url = BIDDER_ENDPOINT + bidderRequest.bids[0].params.supplySourceId;
428
+ let url = selectEndpoint(bidderRequest.bids[0].params) + bidderRequest.bids[0].params.supplySourceId;
447
429
 
448
430
  let serverRequest = {
449
431
  method: 'POST',
@@ -2,7 +2,7 @@
2
2
  * Adapter to send bids to Undertone
3
3
  */
4
4
 
5
- import {deepAccess, parseUrl} from '../src/utils.js';
5
+ import {deepAccess, parseUrl, extractDomainFromHost} from '../src/utils.js';
6
6
  import {registerBidder} from '../src/adapters/bidderFactory.js';
7
7
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
8
8
 
@@ -26,24 +26,6 @@ function getBidFloor(bidRequest, mediaType) {
26
26
  return (floor && floor.currency === 'USD' && floor.floor) || 0;
27
27
  }
28
28
 
29
- function extractDomainFromHost(pageHost) {
30
- let domain = null;
31
- try {
32
- let domains = /[-\w]+\.([-\w]+|[-\w]{3,}|[-\w]{1,3}\.[-\w]{2})$/i.exec(pageHost);
33
- if (domains != null && domains.length > 0) {
34
- domain = domains[0];
35
- for (let i = 1; i < domains.length; i++) {
36
- if (domains[i].length > domain.length) {
37
- domain = domains[i];
38
- }
39
- }
40
- }
41
- } catch (e) {
42
- domain = null;
43
- }
44
- return domain;
45
- }
46
-
47
29
  function getGdprQueryParams(gdprConsent) {
48
30
  if (!gdprConsent) {
49
31
  return null;
@@ -1196,7 +1196,7 @@ module('userId', attachIdSystem, { postInstallAllowed: true });
1196
1196
  export function setOrtbUserExtEids(ortbRequest, bidderRequest, context) {
1197
1197
  const eids = deepAccess(context, 'bidRequests.0.userIdAsEids');
1198
1198
  if (eids && Object.keys(eids).length > 0) {
1199
- deepSetValue(ortbRequest, 'user.ext.eids', eids);
1199
+ deepSetValue(ortbRequest, 'user.ext.eids', eids.concat(ortbRequest.user?.ext?.eids || []));
1200
1200
  }
1201
1201
  }
1202
1202
  registerOrtbProcessor({type: REQUEST, name: 'userExtEids', fn: setOrtbUserExtEids});
@@ -5,7 +5,7 @@ import {ortbConverter} from '../libraries/ortbConverter/converter.js'
5
5
  import {deepAccess, getBidIdParameter, logError} from '../src/utils.js';
6
6
 
7
7
  const BIDDER_CODE = 'viant';
8
- const ENDPOINT = 'https://bidders-us-east-1.adelphic.net/d/rtb/v25/prebid/bidder'
8
+ const ENDPOINT = 'https://bidders-us.adelphic.net/d/rtb/v25/prebid/bidder'
9
9
  const ADAPTER_VERSION = '2.0.0';
10
10
 
11
11
  const DEFAULT_BID_TTL = 300;