prebid.js 9.2.0 → 9.4.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 (279) hide show
  1. package/creative/constants.js +2 -1
  2. package/creative/crossDomain.js +16 -4
  3. package/dist/33acrossAnalyticsAdapter.js +1 -1
  4. package/dist/33acrossBidAdapter.js +1 -1
  5. package/dist/33acrossIdSystem.js +1 -1
  6. package/dist/BTBidAdapter.js +1 -1
  7. package/dist/adagioAnalyticsAdapter.js +1 -1
  8. package/dist/adagioBidAdapter.js +1 -1
  9. package/dist/adagioRtdProvider.js +1 -1
  10. package/dist/adagioUtils.js +1 -1
  11. package/dist/addefendBidAdapter.js +1 -1
  12. package/dist/adfBidAdapter.js +1 -1
  13. package/dist/adgenerationBidAdapter.js +1 -1
  14. package/dist/adlooxRtdProvider.js +1 -1
  15. package/dist/adnuntiusBidAdapter.js +1 -1
  16. package/dist/adqueryBidAdapter.js +1 -1
  17. package/dist/adrelevantisBidAdapter.js +1 -1
  18. package/dist/adstirBidAdapter.js +1 -1
  19. package/dist/adtrgtmeBidAdapter.js +1 -1
  20. package/dist/adxcgAnalyticsAdapter.js +1 -1
  21. package/dist/adxcgBidAdapter.js +1 -1
  22. package/dist/adyoulikeBidAdapter.js +1 -1
  23. package/dist/agmaAnalyticsAdapter.js +1 -1
  24. package/dist/ajaBidAdapter.js +1 -1
  25. package/dist/amxBidAdapter.js +1 -1
  26. package/dist/amxIdSystem.js +1 -1
  27. package/dist/appierAnalyticsAdapter.js +1 -1
  28. package/dist/appnexusBidAdapter.js +1 -1
  29. package/dist/asoBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/bidglassBidAdapter.js +1 -1
  32. package/dist/big-richmediaBidAdapter.js +1 -1
  33. package/dist/bridBidAdapter.js +1 -1
  34. package/dist/bridgewellBidAdapter.js +1 -1
  35. package/dist/brightMountainMediaBidAdapter.js +1 -1
  36. package/dist/carodaBidAdapter.js +1 -1
  37. package/dist/chtnwBidAdapter.js +1 -1
  38. package/dist/chunk-core.js +1 -1
  39. package/dist/codefuelBidAdapter.js +1 -1
  40. package/dist/concertBidAdapter.js +1 -1
  41. package/dist/connectadBidAdapter.js +1 -1
  42. package/dist/consentManagement.js +1 -0
  43. package/dist/consentManagementGpp.js +1 -1
  44. package/dist/consentManagementTcf.js +1 -1
  45. package/dist/consumableBidAdapter.js +1 -1
  46. package/dist/conversantAnalyticsAdapter.js +1 -1
  47. package/dist/conversantBidAdapter.js +1 -1
  48. package/dist/copper6sspBidAdapter.js +1 -0
  49. package/dist/cpmstarBidAdapter.js +1 -1
  50. package/dist/craftBidAdapter.js +1 -1
  51. package/dist/criteoBidAdapter.js +1 -1
  52. package/dist/cwireBidAdapter.js +1 -1
  53. package/dist/dailymotionBidAdapter.js +1 -1
  54. package/dist/deltaprojectsBidAdapter.js +1 -1
  55. package/dist/dependencies.json +51 -13
  56. package/dist/dianomiBidAdapter.js +1 -1
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/dxkultureBidAdapter.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/euidIdSystem.js +1 -1
  61. package/dist/exadsBidAdapter.js +1 -1
  62. package/dist/feedadBidAdapter.js +1 -1
  63. package/dist/finativeBidAdapter.js +1 -1
  64. package/dist/freewheel-sspBidAdapter.js +1 -1
  65. package/dist/gmosspBidAdapter.js +1 -1
  66. package/dist/goldbachBidAdapter.js +1 -1
  67. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  68. package/dist/greenbidsRtdProvider.js +1 -1
  69. package/dist/gridBidAdapter.js +1 -1
  70. package/dist/gumgumBidAdapter.js +1 -1
  71. package/dist/h12mediaBidAdapter.js +1 -1
  72. package/dist/hypelabBidAdapter.js +1 -1
  73. package/dist/id5AnalyticsAdapter.js +1 -1
  74. package/dist/id5IdSystem.js +1 -1
  75. package/dist/illuminBidAdapter.js +1 -1
  76. package/dist/imdsBidAdapter.js +1 -1
  77. package/dist/improvedigitalBidAdapter.js +1 -1
  78. package/dist/insticatorBidAdapter.js +1 -1
  79. package/dist/intentIqIdSystem.js +1 -1
  80. package/dist/ixBidAdapter.js +1 -1
  81. package/dist/jixieBidAdapter.js +1 -1
  82. package/dist/justpremiumBidAdapter.js +1 -1
  83. package/dist/kargoBidAdapter.js +1 -1
  84. package/dist/kimberliteBidAdapter.js +1 -1
  85. package/dist/konduitAnalyticsAdapter.js +1 -1
  86. package/dist/kueezBidAdapter.js +1 -1
  87. package/dist/kueezRtbBidAdapter.js +1 -1
  88. package/dist/lassoBidAdapter.js +1 -1
  89. package/dist/lifestreetBidAdapter.js +1 -1
  90. package/dist/liveIntentIdSystem.js +1 -1
  91. package/dist/logicadBidAdapter.js +1 -1
  92. package/dist/loglyliftBidAdapter.js +1 -1
  93. package/dist/luceadBidAdapter.js +1 -1
  94. package/dist/luponmediaBidAdapter.js +1 -1
  95. package/dist/mabidderBidAdapter.js +1 -1
  96. package/dist/magniteAnalyticsAdapter.js +1 -1
  97. package/dist/malltvAnalyticsAdapter.js +1 -1
  98. package/dist/marsmediaBidAdapter.js +1 -1
  99. package/dist/mediafuseBidAdapter.js +1 -1
  100. package/dist/medianetAnalyticsAdapter.js +1 -1
  101. package/dist/medianetBidAdapter.js +1 -1
  102. package/dist/mediasquareBidAdapter.js +1 -1
  103. package/dist/mgidBidAdapter.js +1 -1
  104. package/dist/minutemediaBidAdapter.js +1 -1
  105. package/dist/missenaBidAdapter.js +1 -1
  106. package/dist/nexx360BidAdapter.js +1 -1
  107. package/dist/nobidAnalyticsAdapter.js +1 -1
  108. package/dist/nobidBidAdapter.js +1 -1
  109. package/dist/not-for-prod/prebid.js +184 -178
  110. package/dist/oguryBidAdapter.js +1 -1
  111. package/dist/onetagBidAdapter.js +1 -1
  112. package/dist/ooloAnalyticsAdapter.js +1 -1
  113. package/dist/openwebBidAdapter.js +1 -1
  114. package/dist/openxBidAdapter.js +1 -1
  115. package/dist/optidigitalBidAdapter.js +1 -1
  116. package/dist/orakiBidAdapter.js +1 -0
  117. package/dist/orbidderBidAdapter.js +1 -1
  118. package/dist/outbrainBidAdapter.js +1 -1
  119. package/dist/ozoneBidAdapter.js +1 -1
  120. package/dist/pairIdSystem.js +1 -1
  121. package/dist/pixfutureBidAdapter.js +1 -1
  122. package/dist/prebidServerBidAdapter.js +1 -1
  123. package/dist/processResponse.js +1 -0
  124. package/dist/publinkIdSystem.js +1 -1
  125. package/dist/publirBidAdapter.js +1 -1
  126. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  127. package/dist/pubmaticBidAdapter.js +1 -1
  128. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  129. package/dist/pxyzBidAdapter.js +1 -1
  130. package/dist/quantcastBidAdapter.js +1 -1
  131. package/dist/readpeakBidAdapter.js +1 -1
  132. package/dist/relaidoBidAdapter.js +1 -1
  133. package/dist/retailspotBidAdapter.js +1 -1
  134. package/dist/rhythmoneBidAdapter.js +1 -1
  135. package/dist/riseBidAdapter.js +1 -1
  136. package/dist/rubiconBidAdapter.js +1 -1
  137. package/dist/seedingAllianceBidAdapter.js +1 -1
  138. package/dist/seedtagBidAdapter.js +1 -1
  139. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  140. package/dist/sharethroughBidAdapter.js +1 -1
  141. package/dist/shinezBidAdapter.js +1 -1
  142. package/dist/shinezRtbBidAdapter.js +1 -1
  143. package/dist/smaatoBidAdapter.js +1 -1
  144. package/dist/smartadserverBidAdapter.js +1 -1
  145. package/dist/smartxBidAdapter.js +1 -1
  146. package/dist/smartyadsBidAdapter.js +1 -1
  147. package/dist/smartyadsUtils.js +1 -0
  148. package/dist/smilewantedBidAdapter.js +1 -1
  149. package/dist/snigelBidAdapter.js +1 -1
  150. package/dist/sonobiBidAdapter.js +1 -1
  151. package/dist/sovrnBidAdapter.js +1 -1
  152. package/dist/sspBCBidAdapter.js +1 -1
  153. package/dist/stnBidAdapter.js +1 -1
  154. package/dist/stvBidAdapter.js +1 -1
  155. package/dist/sublimeBidAdapter.js +1 -1
  156. package/dist/taboolaBidAdapter.js +1 -1
  157. package/dist/tagorasBidAdapter.js +1 -1
  158. package/dist/tappxBidAdapter.js +1 -1
  159. package/dist/targetVideoBidAdapter.js +1 -1
  160. package/dist/teadsBidAdapter.js +1 -1
  161. package/dist/terceptAnalyticsAdapter.js +1 -1
  162. package/dist/themoneytizerBidAdapter.js +1 -1
  163. package/dist/trionBidAdapter.js +1 -1
  164. package/dist/tripleliftBidAdapter.js +1 -1
  165. package/dist/ttdBidAdapter.js +1 -1
  166. package/dist/twistDigitalBidAdapter.js +1 -1
  167. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  168. package/dist/uid2IdSystem.js +1 -1
  169. package/dist/underdogmediaBidAdapter.js +1 -1
  170. package/dist/undertoneBidAdapter.js +1 -1
  171. package/dist/unrulyBidAdapter.js +1 -1
  172. package/dist/userId.js +1 -1
  173. package/dist/viantOrtbBidAdapter.js +1 -1
  174. package/dist/vidazooBidAdapter.js +1 -1
  175. package/dist/vidazooUtils.js +1 -0
  176. package/dist/videobyteBidAdapter.js +1 -1
  177. package/dist/visxBidAdapter.js +1 -1
  178. package/dist/vuukleBidAdapter.js +1 -1
  179. package/dist/widespaceBidAdapter.js +1 -1
  180. package/dist/winrBidAdapter.js +1 -1
  181. package/dist/yahooAdsBidAdapter.js +1 -1
  182. package/dist/yieldmoBidAdapter.js +1 -1
  183. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  184. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  185. package/dist/zeta_global_sspBidAdapter.js +1 -1
  186. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  187. package/libraries/consentManagement/cmUtils.js +38 -0
  188. package/libraries/processResponse/index.js +12 -0
  189. package/libraries/smartyadsUtils/getAdUrlByRegion.js +32 -0
  190. package/libraries/vidazooUtils/bidderUtils.js +480 -0
  191. package/libraries/vidazooUtils/constants.js +7 -0
  192. package/modules/adagioRtdProvider.js +9 -7
  193. package/modules/addefendBidAdapter.js +1 -2
  194. package/modules/adfBidAdapter.js +1 -10
  195. package/modules/adlooxRtdProvider.js +1 -1
  196. package/modules/adnuntiusBidAdapter.js +1 -0
  197. package/modules/adxcgAnalyticsAdapter.js +1 -2
  198. package/modules/carodaBidAdapter.js +3 -8
  199. package/modules/codefuelBidAdapter.js +1 -10
  200. package/modules/consentManagementGpp.js +2 -38
  201. package/modules/consentManagementTcf.js +7 -38
  202. package/modules/conversantAnalyticsAdapter.js +1 -2
  203. package/modules/copper6sspBidAdapter.js +19 -0
  204. package/modules/copper6sspBidAdapter.md +79 -0
  205. package/modules/cpmstarBidAdapter.js +52 -36
  206. package/modules/cpmstarBidAdapter.md +1 -4
  207. package/modules/criteoBidAdapter.js +10 -3
  208. package/modules/dailymotionBidAdapter.js +1 -1
  209. package/modules/deltaprojectsBidAdapter.js +2 -11
  210. package/modules/dianomiBidAdapter.js +1 -9
  211. package/modules/finativeBidAdapter.js +1 -10
  212. package/modules/gridBidAdapter.js +2 -12
  213. package/modules/id5AnalyticsAdapter.js +1 -2
  214. package/modules/illuminBidAdapter.js +9 -304
  215. package/modules/intentIqIdSystem.js +408 -50
  216. package/modules/intentIqIdSystem.md +92 -0
  217. package/modules/kueezRtbBidAdapter.js +17 -312
  218. package/modules/liveIntentIdSystem.js +2 -2
  219. package/modules/luponmediaBidAdapter.js +4 -10
  220. package/modules/mabidderBidAdapter.js +1 -2
  221. package/modules/medianetAnalyticsAdapter.js +1 -2
  222. package/modules/medianetBidAdapter.js +1 -1
  223. package/modules/mgidBidAdapter.js +1 -10
  224. package/modules/orakiBidAdapter.js +19 -0
  225. package/modules/orakiBidAdapter.md +79 -0
  226. package/modules/orbidderBidAdapter.js +4 -2
  227. package/modules/outbrainBidAdapter.js +8 -43
  228. package/modules/ozoneBidAdapter.js +9 -7
  229. package/modules/pairIdSystem.js +27 -10
  230. package/modules/pixfutureBidAdapter.js +1 -2
  231. package/modules/prebidServerBidAdapter/index.js +1 -1
  232. package/modules/seedtagBidAdapter.js +4 -0
  233. package/modules/shinezRtbBidAdapter.js +12 -304
  234. package/modules/smartadserverBidAdapter.js +3 -0
  235. package/modules/smartyadsBidAdapter.js +6 -110
  236. package/modules/snigelBidAdapter.js +1 -2
  237. package/modules/tagorasBidAdapter.js +13 -316
  238. package/modules/tappxBidAdapter.js +1 -2
  239. package/modules/terceptAnalyticsAdapter.js +1 -2
  240. package/modules/twistDigitalBidAdapter.js +9 -433
  241. package/modules/userId/index.js +31 -21
  242. package/modules/viantOrtbBidAdapter.js +20 -0
  243. package/modules/vidazooBidAdapter.js +26 -468
  244. package/modules/visxBidAdapter.js +27 -29
  245. package/modules/yahooAdsBidAdapter.js +4 -1
  246. package/modules/yuktamediaAnalyticsAdapter.js +1 -2
  247. package/modules/zeta_global_sspBidAdapter.js +2 -2
  248. package/package.json +1 -1
  249. package/src/adRendering.js +25 -2
  250. package/src/constants.js +2 -0
  251. package/src/prebid.js +2 -1
  252. package/src/utils.js +19 -1
  253. package/test/spec/creative/crossDomainCreative_spec.js +38 -2
  254. package/test/spec/fpd/gdpr_spec.js +24 -2
  255. package/test/spec/libraries/processResponse_spec.js +60 -0
  256. package/test/spec/modules/adagioRtdProvider_spec.js +12 -0
  257. package/test/spec/modules/adnuntiusBidAdapter_spec.js +6 -3
  258. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +1 -1
  259. package/test/spec/modules/copper6sspBidAdapter_spec.js +514 -0
  260. package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
  261. package/test/spec/modules/dailymotionBidAdapter_spec.js +18 -14
  262. package/test/spec/modules/illuminBidAdapter_spec.js +26 -13
  263. package/test/spec/modules/intentIqIdSystem_spec.js +264 -36
  264. package/test/spec/modules/kueezRtbBidAdapter_spec.js +26 -15
  265. package/test/spec/modules/orakiBidAdapter_spec.js +510 -0
  266. package/test/spec/modules/outbrainBidAdapter_spec.js +32 -1
  267. package/test/spec/modules/seedtagBidAdapter_spec.js +27 -0
  268. package/test/spec/modules/shinezRtbBidAdapter_spec.js +26 -14
  269. package/test/spec/modules/smartadserverBidAdapter_spec.js +7 -0
  270. package/test/spec/modules/smartyadsBidAdapter_spec.js +6 -83
  271. package/test/spec/modules/tagorasBidAdapter_spec.js +26 -15
  272. package/test/spec/modules/twistDigitalBidAdapter_spec.js +19 -22
  273. package/test/spec/modules/userId_spec.js +86 -47
  274. package/test/spec/modules/viantOrtbBidAdapter_spec.js +87 -6
  275. package/test/spec/modules/vidazooBidAdapter_spec.js +21 -23
  276. package/test/spec/modules/visxBidAdapter_spec.js +180 -0
  277. package/test/spec/modules/yahooAdsBidAdapter_spec.js +1 -1
  278. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +11 -0
  279. package/test/spec/unit/pbjs_api_spec.js +6 -1
@@ -0,0 +1,480 @@
1
+ import {
2
+ _each,
3
+ deepAccess,
4
+ formatQS,
5
+ isArray,
6
+ isFn,
7
+ parseSizesInput,
8
+ parseUrl,
9
+ triggerPixel,
10
+ uniques
11
+ } from '../../src/utils.js';
12
+ import {chunk} from '../chunk/chunk.js';
13
+ import {CURRENCY, DEAL_ID_EXPIRY, SESSION_ID_KEY, TTL_SECONDS, UNIQUE_DEAL_ID_EXPIRY} from './constants.js';
14
+ import {bidderSettings} from '../../src/bidderSettings.js';
15
+ import {config} from '../../src/config.js';
16
+ import {BANNER, VIDEO} from '../../src/mediaTypes.js';
17
+
18
+ export function createSessionId() {
19
+ return 'wsid_' + parseInt(Date.now() * Math.random());
20
+ }
21
+
22
+ export function getTopWindowQueryParams() {
23
+ try {
24
+ const parsedUrl = parseUrl(window.top.document.URL, {decodeSearchAsString: true});
25
+ return parsedUrl.search;
26
+ } catch (e) {
27
+ return '';
28
+ }
29
+ }
30
+
31
+ export function extractCID(params) {
32
+ return params.cId || params.CID || params.cID || params.CId || params.cid || params.ciD || params.Cid || params.CiD;
33
+ }
34
+
35
+ export function extractPID(params) {
36
+ return params.pId || params.PID || params.pID || params.PId || params.pid || params.piD || params.Pid || params.PiD;
37
+ }
38
+
39
+ export function extractSubDomain(params) {
40
+ return params.subDomain || params.SubDomain || params.Subdomain || params.subdomain || params.SUBDOMAIN || params.subDOMAIN;
41
+ }
42
+
43
+ export function isBidRequestValid(bid) {
44
+ const params = bid.params || {};
45
+ return !!(extractCID(params) && extractPID(params));
46
+ }
47
+
48
+ export function tryParseJSON(value) {
49
+ try {
50
+ return JSON.parse(value);
51
+ } catch (e) {
52
+ return value;
53
+ }
54
+ }
55
+
56
+ export function setStorageItem(storage, key, value, timestamp) {
57
+ try {
58
+ const created = timestamp || Date.now();
59
+ const data = JSON.stringify({value, created});
60
+ storage.setDataInLocalStorage(key, data);
61
+ } catch (e) {
62
+ }
63
+ }
64
+
65
+ export function getStorageItem(storage, key) {
66
+ try {
67
+ return tryParseJSON(storage.getDataFromLocalStorage(key, null));
68
+ } catch (e) {
69
+ }
70
+
71
+ return null;
72
+ }
73
+
74
+ export function getCacheOpt(storage, useKey) {
75
+ let data = storage.getDataFromLocalStorage(useKey, null);
76
+ if (!data) {
77
+ data = String(Date.now());
78
+ storage.setDataInLocalStorage(useKey, data, null);
79
+ }
80
+
81
+ return data;
82
+ }
83
+
84
+ export function getUniqueDealId(storage, key, expiry = UNIQUE_DEAL_ID_EXPIRY) {
85
+ const storageKey = `u_${key}`;
86
+ const now = Date.now();
87
+ const data = getStorageItem(storage, storageKey);
88
+ let uniqueId;
89
+
90
+ if (!data || !data.value || now - data.created > expiry) {
91
+ uniqueId = `${key}_${now.toString()}`;
92
+ setStorageItem(storage, storageKey, uniqueId);
93
+ } else {
94
+ uniqueId = data.value;
95
+ }
96
+
97
+ return uniqueId;
98
+ }
99
+
100
+ export function getNextDealId(storage, key, expiry = DEAL_ID_EXPIRY) {
101
+ try {
102
+ const data = getStorageItem(storage, key);
103
+ let currentValue = 0;
104
+ let timestamp;
105
+
106
+ if (data && data.value && Date.now() - data.created < expiry) {
107
+ currentValue = data.value;
108
+ timestamp = data.created;
109
+ }
110
+
111
+ const nextValue = currentValue + 1;
112
+ setStorageItem(storage, key, nextValue, timestamp);
113
+ return nextValue;
114
+ } catch (e) {
115
+ return 0;
116
+ }
117
+ }
118
+
119
+ export function hashCode(s, prefix = '_') {
120
+ const l = s.length;
121
+ let h = 0
122
+ let i = 0;
123
+ if (l > 0) {
124
+ while (i < l) {
125
+ h = (h << 5) - h + s.charCodeAt(i++) | 0;
126
+ }
127
+ }
128
+ return prefix + h;
129
+ }
130
+
131
+ export function onBidWon(bid) {
132
+ if (!bid.nurl) {
133
+ return;
134
+ }
135
+ const wonBid = {
136
+ adId: bid.adId,
137
+ creativeId: bid.creativeId,
138
+ auctionId: bid.auctionId,
139
+ transactionId: bid.transactionId,
140
+ adUnitCode: bid.adUnitCode,
141
+ cpm: bid.cpm,
142
+ currency: bid.currency,
143
+ originalCpm: bid.originalCpm,
144
+ originalCurrency: bid.originalCurrency,
145
+ netRevenue: bid.netRevenue,
146
+ mediaType: bid.mediaType,
147
+ timeToRespond: bid.timeToRespond,
148
+ status: bid.status,
149
+ };
150
+ const qs = formatQS(wonBid);
151
+ const url = bid.nurl + (bid.nurl.indexOf('?') === -1 ? '?' : '&') + qs;
152
+ triggerPixel(url);
153
+ }
154
+
155
+ /**
156
+ * Create the spec function for getting user syncs
157
+ *
158
+ * The options object accepts the following fields:
159
+ *
160
+ * - iframeSyncUrl
161
+ * - imageSyncUrl
162
+ *
163
+ * @param options
164
+ */
165
+ export function createUserSyncGetter(options = {
166
+ iframeSyncUrl: '',
167
+ imageSyncUrl: ''
168
+ }) {
169
+ return function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '', gppConsent = {}) {
170
+ const syncs = [];
171
+ const {iframeEnabled, pixelEnabled} = syncOptions;
172
+ const {gdprApplies, consentString = ''} = gdprConsent;
173
+ const {gppString, applicableSections} = gppConsent;
174
+
175
+ const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
176
+ let params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`;
177
+
178
+ if (gppString && applicableSections?.length) {
179
+ params += '&gpp=' + encodeURIComponent(gppString);
180
+ params += '&gpp_sid=' + encodeURIComponent(applicableSections.join(','));
181
+ }
182
+
183
+ if (iframeEnabled && options.iframeSyncUrl) {
184
+ syncs.push({
185
+ type: 'iframe',
186
+ url: `${options.iframeSyncUrl}/${params}`
187
+ });
188
+ }
189
+ if (pixelEnabled && options.imageSyncUrl) {
190
+ syncs.push({
191
+ type: 'image',
192
+ url: `${options.imageSyncUrl}/${params}`
193
+ });
194
+ }
195
+ return syncs;
196
+ }
197
+ }
198
+
199
+ export function appendUserIdsToRequestPayload(payloadRef, userIds) {
200
+ let key;
201
+ _each(userIds, (userId, idSystemProviderName) => {
202
+ key = `uid.${idSystemProviderName}`;
203
+
204
+ switch (idSystemProviderName) {
205
+ case 'lipb':
206
+ payloadRef[key] = userId.lipbid;
207
+ break;
208
+ case 'id5id':
209
+ payloadRef[key] = userId.uid;
210
+ break;
211
+ default:
212
+ payloadRef[key] = userId;
213
+ }
214
+ });
215
+ }
216
+
217
+ export function getVidazooSessionId(storage) {
218
+ return getStorageItem(storage, SESSION_ID_KEY) || '';
219
+ }
220
+
221
+ export function buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, storage, bidderVersion, bidderCode, getUniqueRequestData) {
222
+ const {
223
+ params,
224
+ bidId,
225
+ userId,
226
+ adUnitCode,
227
+ schain,
228
+ mediaTypes,
229
+ ortb2Imp,
230
+ bidderRequestId,
231
+ bidRequestsCount,
232
+ bidderRequestsCount,
233
+ bidderWinsCount
234
+ } = bid;
235
+ const {ext} = params;
236
+ let {bidFloor} = params;
237
+ const hashUrl = hashCode(topWindowUrl);
238
+ const uniqueRequestData = isFn(getUniqueRequestData) ? getUniqueRequestData(hashUrl, bid) : {};
239
+ const uniqueDealId = getUniqueDealId(storage, hashUrl);
240
+ const pId = extractPID(params);
241
+ const isStorageAllowed = bidderSettings.get(bidderCode, 'storageAllowed');
242
+
243
+ const gpid = deepAccess(bid, 'ortb2Imp.ext.gpid') || deepAccess(bid, 'ortb2Imp.ext.data.pbadslot', '');
244
+ const cat = deepAccess(bidderRequest, 'ortb2.site.cat', []);
245
+ const pagecat = deepAccess(bidderRequest, 'ortb2.site.pagecat', []);
246
+ const contentData = deepAccess(bidderRequest, 'ortb2.site.content.data', []);
247
+ const userData = deepAccess(bidderRequest, 'ortb2.user.data', []);
248
+
249
+ if (isFn(bid.getFloor)) {
250
+ const floorInfo = bid.getFloor({
251
+ currency: 'USD',
252
+ mediaType: '*',
253
+ size: '*'
254
+ });
255
+
256
+ if (floorInfo.currency === 'USD') {
257
+ bidFloor = floorInfo.floor;
258
+ }
259
+ }
260
+
261
+ let data = {
262
+ url: encodeURIComponent(topWindowUrl),
263
+ uqs: getTopWindowQueryParams(),
264
+ cb: Date.now(),
265
+ bidFloor: bidFloor,
266
+ bidId: bidId,
267
+ referrer: bidderRequest.refererInfo.ref,
268
+ adUnitCode: adUnitCode,
269
+ publisherId: pId,
270
+ sizes: sizes,
271
+ uniqueDealId: uniqueDealId,
272
+ bidderVersion: bidderVersion,
273
+ prebidVersion: '$prebid.version$',
274
+ res: `${screen.width}x${screen.height}`,
275
+ schain: schain,
276
+ mediaTypes: mediaTypes,
277
+ isStorageAllowed: isStorageAllowed,
278
+ gpid: gpid,
279
+ cat: cat,
280
+ contentData,
281
+ userData: userData,
282
+ pagecat: pagecat,
283
+ transactionId: ortb2Imp?.ext?.tid,
284
+ bidderRequestId: bidderRequestId,
285
+ bidRequestsCount: bidRequestsCount,
286
+ bidderRequestsCount: bidderRequestsCount,
287
+ bidderWinsCount: bidderWinsCount,
288
+ bidderTimeout: bidderTimeout,
289
+ ...uniqueRequestData
290
+ };
291
+
292
+ appendUserIdsToRequestPayload(data, userId);
293
+
294
+ const sua = deepAccess(bidderRequest, 'ortb2.device.sua');
295
+
296
+ if (sua) {
297
+ data.sua = sua;
298
+ }
299
+
300
+ if (bidderRequest.gdprConsent) {
301
+ if (bidderRequest.gdprConsent.consentString) {
302
+ data.gdprConsent = bidderRequest.gdprConsent.consentString;
303
+ }
304
+ if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
305
+ data.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
306
+ }
307
+ }
308
+ if (bidderRequest.uspConsent) {
309
+ data.usPrivacy = bidderRequest.uspConsent;
310
+ }
311
+
312
+ if (bidderRequest.gppConsent) {
313
+ data.gppString = bidderRequest.gppConsent.gppString;
314
+ data.gppSid = bidderRequest.gppConsent.applicableSections;
315
+ } else if (bidderRequest.ortb2?.regs?.gpp) {
316
+ data.gppString = bidderRequest.ortb2.regs.gpp;
317
+ data.gppSid = bidderRequest.ortb2.regs.gpp_sid;
318
+ }
319
+
320
+ if (bidderRequest.paapi?.enabled) {
321
+ const fledge = deepAccess(bidderRequest, 'ortb2Imp.ext.ae');
322
+ if (fledge) {
323
+ data.fledge = fledge;
324
+ }
325
+ }
326
+
327
+ _each(ext, (value, key) => {
328
+ data['ext.' + key] = value;
329
+ });
330
+
331
+ return data;
332
+ }
333
+
334
+ export function createInterpretResponseFn(bidderCode, allowSingleRequest) {
335
+ return function interpretResponse(serverResponse, request) {
336
+ if (!serverResponse || !serverResponse.body) {
337
+ return [];
338
+ }
339
+
340
+ const singleRequestMode = allowSingleRequest && config.getConfig(`${bidderCode}.singleRequest`);
341
+ const reqBidId = deepAccess(request, 'data.bidId');
342
+ const {results} = serverResponse.body;
343
+
344
+ let output = [];
345
+
346
+ try {
347
+ results.forEach((result, i) => {
348
+ const {
349
+ creativeId,
350
+ ad,
351
+ price,
352
+ exp,
353
+ width,
354
+ height,
355
+ currency,
356
+ bidId,
357
+ nurl,
358
+ advertiserDomains,
359
+ metaData,
360
+ mediaType = BANNER
361
+ } = result;
362
+ if (!ad || !price) {
363
+ return;
364
+ }
365
+
366
+ const response = {
367
+ requestId: (singleRequestMode && bidId) ? bidId : reqBidId,
368
+ cpm: price,
369
+ width: width,
370
+ height: height,
371
+ creativeId: creativeId,
372
+ currency: currency || CURRENCY,
373
+ netRevenue: true,
374
+ ttl: exp || TTL_SECONDS,
375
+ };
376
+
377
+ if (nurl) {
378
+ response.nurl = nurl;
379
+ }
380
+
381
+ if (metaData) {
382
+ Object.assign(response, {
383
+ meta: metaData
384
+ })
385
+ } else {
386
+ Object.assign(response, {
387
+ meta: {
388
+ advertiserDomains: advertiserDomains || []
389
+ }
390
+ })
391
+ }
392
+
393
+ if (mediaType === BANNER) {
394
+ Object.assign(response, {
395
+ ad: ad,
396
+ });
397
+ } else {
398
+ Object.assign(response, {
399
+ vastXml: ad,
400
+ mediaType: VIDEO
401
+ });
402
+ }
403
+ output.push(response);
404
+ });
405
+
406
+ return output;
407
+ } catch (e) {
408
+ return [];
409
+ }
410
+ }
411
+ }
412
+
413
+ export function createBuildRequestsFn(createRequestDomain, createUniqueRequestData, storage, bidderCode, bidderVersion, allowSingleRequest) {
414
+ function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
415
+ const {params} = bid;
416
+ const cId = extractCID(params);
417
+ const subDomain = extractSubDomain(params);
418
+ const data = buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, storage, bidderVersion, bidderCode, createUniqueRequestData);
419
+ const dto = {
420
+ method: 'POST', url: `${createRequestDomain(subDomain)}/prebid/multi/${cId}`, data: data
421
+ };
422
+ return dto;
423
+ }
424
+
425
+ function buildSingleRequest(bidRequests, bidderRequest, topWindowUrl, bidderTimeout) {
426
+ const {params} = bidRequests[0];
427
+ const cId = extractCID(params);
428
+ const subDomain = extractSubDomain(params);
429
+ const data = bidRequests.map(bid => {
430
+ const sizes = parseSizesInput(bid.sizes);
431
+ return buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, storage, bidderVersion, bidderCode, createUniqueRequestData)
432
+ });
433
+ const chunkSize = Math.min(20, config.getConfig(`${bidderCode}.chunkSize`) || 10);
434
+
435
+ const chunkedData = chunk(data, chunkSize);
436
+ return chunkedData.map(chunk => {
437
+ return {
438
+ method: 'POST',
439
+ url: `${createRequestDomain(subDomain)}/prebid/multi/${cId}`,
440
+ data: {
441
+ bids: chunk
442
+ }
443
+ };
444
+ });
445
+ }
446
+
447
+ return function buildRequests(validBidRequests, bidderRequest) {
448
+ const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
449
+ const bidderTimeout = config.getConfig('bidderTimeout');
450
+
451
+ const singleRequestMode = allowSingleRequest && config.getConfig(`${bidderCode}.singleRequest`);
452
+
453
+ const requests = [];
454
+
455
+ if (singleRequestMode) {
456
+ // banner bids are sent as a single request
457
+ const bannerBidRequests = validBidRequests.filter(bid => isArray(bid.mediaTypes) ? bid.mediaTypes.includes(BANNER) : bid.mediaTypes[BANNER] !== undefined);
458
+ if (bannerBidRequests.length > 0) {
459
+ const singleRequests = buildSingleRequest(bannerBidRequests, bidderRequest, topWindowUrl, bidderTimeout);
460
+ requests.push(...singleRequests);
461
+ }
462
+
463
+ // video bids are sent as a single request for each bid
464
+
465
+ const videoBidRequests = validBidRequests.filter(bid => bid.mediaTypes[VIDEO] !== undefined);
466
+ videoBidRequests.forEach(validBidRequest => {
467
+ const sizes = parseSizesInput(validBidRequest.sizes);
468
+ const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
469
+ requests.push(request);
470
+ });
471
+ } else {
472
+ validBidRequests.forEach(validBidRequest => {
473
+ const sizes = parseSizesInput(validBidRequest.sizes);
474
+ const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
475
+ requests.push(request);
476
+ });
477
+ }
478
+ return requests;
479
+ }
480
+ }
@@ -0,0 +1,7 @@
1
+ export const CURRENCY = 'USD';
2
+ export const TTL_SECONDS = 60 * 5;
3
+ export const DEAL_ID_EXPIRY = 1000 * 60 * 15;
4
+ export const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60;
5
+ export const SESSION_ID_KEY = 'vidSid';
6
+ export const OPT_CACHE_KEY = 'vdzwopt';
7
+ export const OPT_TIME_KEY = 'vdzHum';
@@ -278,15 +278,18 @@ function onGetBidRequestData(bidReqConfig, callback, config) {
278
278
 
279
279
  const adUnits = bidReqConfig.adUnits || getGlobal().adUnits || [];
280
280
  adUnits.forEach(adUnit => {
281
+ adUnit.ortb2Imp = adUnit.ortb2Imp || {};
281
282
  const ortb2Imp = deepAccess(adUnit, 'ortb2Imp');
283
+
282
284
  // A divId is required to compute the slot position and later to track viewability.
283
285
  // If nothing has been explicitly set, we try to get the divId from the GPT slot and fallback to the adUnit code in last resort.
284
- if (!deepAccess(ortb2Imp, 'ext.data.divId')) {
285
- const divId = getGptSlotInfoForAdUnitCode(adUnit.code).divId;
286
+ let divId = deepAccess(ortb2Imp, 'ext.data.divId')
287
+ if (!divId) {
288
+ divId = getGptSlotInfoForAdUnitCode(adUnit.code).divId;
286
289
  deepSetValue(ortb2Imp, `ext.data.divId`, divId || adUnit.code);
287
290
  }
288
291
 
289
- const slotPosition = getSlotPosition(adUnit);
292
+ const slotPosition = getSlotPosition(divId);
290
293
  deepSetValue(ortb2Imp, `ext.data.adg_rtd.adunit_position`, slotPosition);
291
294
 
292
295
  // It is expected that the publisher set a `adUnits[].ortb2Imp.ext.data.placement` value.
@@ -430,7 +433,7 @@ function getElementFromTopWindow(element, currentWindow) {
430
433
  }
431
434
  };
432
435
 
433
- function getSlotPosition(adUnit) {
436
+ function getSlotPosition(divId) {
434
437
  if (!isSafeFrameWindow() && !canAccessWindowTop()) {
435
438
  return '';
436
439
  }
@@ -451,16 +454,15 @@ function getSlotPosition(adUnit) {
451
454
  // window.top based computing
452
455
  const wt = getWindowTop();
453
456
  const d = wt.document;
454
- const adUnitElementId = deepAccess(adUnit, 'ortb2Imp.ext.data.divId');
455
457
 
456
458
  let domElement;
457
459
 
458
460
  if (inIframe() === true) {
459
461
  const ws = getWindowSelf();
460
- const currentElement = ws.document.getElementById(adUnitElementId);
462
+ const currentElement = ws.document.getElementById(divId);
461
463
  domElement = getElementFromTopWindow(currentElement, ws);
462
464
  } else {
463
- domElement = wt.document.getElementById(adUnitElementId);
465
+ domElement = wt.document.getElementById(divId);
464
466
  }
465
467
 
466
468
  if (!domElement) {
@@ -1,5 +1,4 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
- import {getGlobal} from '../src/prebidGlobal.js';
3
2
 
4
3
  const BIDDER_CODE = 'addefend';
5
4
 
@@ -17,7 +16,7 @@ export const spec = {
17
16
  },
18
17
  buildRequests: function(validBidRequests, bidderRequest) {
19
18
  let bid = {
20
- v: getGlobal().version,
19
+ v: 'v' + '$prebid.version$',
21
20
  auctionId: false,
22
21
  pageId: false,
23
22
  gdpr_applies: bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? bidderRequest.gdprConsent.gdprApplies : 'true',
@@ -3,7 +3,7 @@
3
3
 
4
4
  import {registerBidder} from '../src/adapters/bidderFactory.js';
5
5
  import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
6
- import {deepAccess, deepClone, deepSetValue, mergeDeep, parseSizesInput} from '../src/utils.js';
6
+ import {deepAccess, deepClone, deepSetValue, mergeDeep, parseSizesInput, setOnAny} from '../src/utils.js';
7
7
  import {config} from '../src/config.js';
8
8
  import {Renderer} from '../src/Renderer.js';
9
9
 
@@ -255,15 +255,6 @@ export const spec = {
255
255
 
256
256
  registerBidder(spec);
257
257
 
258
- function setOnAny(collection, key) {
259
- for (let i = 0, result; i < collection.length; i++) {
260
- result = deepAccess(collection[i], key);
261
- if (result) {
262
- return result;
263
- }
264
- }
265
- }
266
-
267
258
  function flatten(arr) {
268
259
  return [].concat(...arr);
269
260
  }
@@ -106,7 +106,7 @@ function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) {
106
106
 
107
107
  // buildUrl creates PHP style multi-parameters and includes undefined... (╯°□°)╯ ┻━┻
108
108
  const url = buildUrl(mergeDeep(parseUrl(`${API_ORIGIN}/q`), { search: {
109
- 'v': `pbjs-${getGlobal().version}`,
109
+ 'v': 'pbjs-v' + '$prebid.version$',
110
110
  'c': config.params.clientid,
111
111
  'p': config.params.platformid,
112
112
  't': config.params.tagid,
@@ -252,6 +252,7 @@ export const spec = {
252
252
 
253
253
  const bidderConfig = config.getConfig();
254
254
  if (bidderConfig.useCookie === false) queryParamsAndValues.push('noCookies=true');
255
+ if (bidderConfig.advertiserTransparency === true) queryParamsAndValues.push('advertiserTransparency=true');
255
256
  if (bidderConfig.maxDeals > 0) queryParamsAndValues.push('ds=' + Math.min(bidderConfig.maxDeals, MAXIMUM_DEALS_LIMIT));
256
257
 
257
258
  const bidRequests = {};
@@ -3,7 +3,6 @@ import { ajax } from '../src/ajax.js';
3
3
  import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
4
4
  import adapterManager from '../src/adapterManager.js';
5
5
  import { EVENTS } from '../src/constants.js';
6
- import {getGlobal} from '../src/prebidGlobal.js';
7
6
 
8
7
  /**
9
8
  * Analytics adapter from adxcg.com
@@ -123,7 +122,7 @@ function send (data) {
123
122
  ats: adxcgAnalyticsAdapter.context.auctionTimestamp,
124
123
  aav: adxcgAnalyticsVersion,
125
124
  iob: intersectionObserverAvailable(window) ? '1' : '0',
126
- pbv: getGlobal().version,
125
+ pbv: '$prebid.version$',
127
126
  sz: window.screen.width + 'x' + window.screen.height
128
127
  }
129
128
  });
@@ -8,7 +8,8 @@ import {
8
8
  deepSetValue,
9
9
  logError,
10
10
  mergeDeep,
11
- parseSizesInput
11
+ sizeTupleToRtbSize,
12
+ sizesToSizeTuples
12
13
  } from '../src/utils.js';
13
14
  import { config } from '../src/config.js';
14
15
 
@@ -195,13 +196,7 @@ function getImps (validBidRequests, common) {
195
196
  };
196
197
  const bannerParams = deepAccess(bid, 'mediaTypes.banner');
197
198
  if (bannerParams && bannerParams.sizes) {
198
- const sizes = parseSizesInput(bannerParams.sizes);
199
- const format = sizes.map(size => {
200
- const [width, height] = size.split('x');
201
- const w = parseInt(width, 10);
202
- const h = parseInt(height, 10);
203
- return { w, h };
204
- });
199
+ const format = sizesToSizeTuples(bannerParams.sizes).map(sizeTupleToRtbSize);
205
200
  imp.banner = {
206
201
  format
207
202
  };
@@ -1,4 +1,4 @@
1
- import {deepAccess, isArray} from '../src/utils.js';
1
+ import {isArray, setOnAny} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER} from '../src/mediaTypes.js';
4
4
 
@@ -148,15 +148,6 @@ function getDeviceType() {
148
148
  return 2; // 'desktop'
149
149
  }
150
150
 
151
- function setOnAny(collection, key) {
152
- for (let i = 0, result; i < collection.length; i++) {
153
- result = deepAccess(collection[i], key);
154
- if (result) {
155
- return result;
156
- }
157
- }
158
- }
159
-
160
151
  function flatten(arr) {
161
152
  return [].concat(...arr);
162
153
  }