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
@@ -1,452 +1,28 @@
1
- import {
2
- _each,
3
- deepAccess,
4
- isFn,
5
- parseSizesInput,
6
- parseUrl,
7
- uniques,
8
- isArray,
9
- formatQS,
10
- triggerPixel
11
- } from '../src/utils.js';
12
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
13
2
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
14
3
  import {getStorageManager} from '../src/storageManager.js';
15
- import {bidderSettings} from '../src/bidderSettings.js';
16
- import {config} from '../src/config.js';
17
- import {chunk} from '../libraries/chunk/chunk.js';
4
+ import {
5
+ isBidRequestValid, createInterpretResponseFn, createUserSyncGetter, createBuildRequestsFn, onBidWon
6
+ } from '../libraries/vidazooUtils/bidderUtils.js';
18
7
 
19
8
  const GVLID = 1292;
20
9
  const DEFAULT_SUB_DOMAIN = 'exchange';
21
10
  const BIDDER_CODE = 'twistdigital';
22
11
  const BIDDER_VERSION = '1.0.0';
23
- const CURRENCY = 'USD';
24
- const TTL_SECONDS = 60 * 5;
25
- const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60;
26
12
 
27
- export const webSessionId = 'wsid_' + parseInt(Date.now() * Math.random());
28
- const storage = getStorageManager({bidderCode: BIDDER_CODE});
29
-
30
- function getTopWindowQueryParams() {
31
- try {
32
- const parsedUrl = parseUrl(window.top.document.URL, {decodeSearchAsString: true});
33
- return parsedUrl.search;
34
- } catch (e) {
35
- return '';
36
- }
37
- }
13
+ export const storage = getStorageManager({bidderCode: BIDDER_CODE});
38
14
 
39
15
  export function createDomain(subDomain = DEFAULT_SUB_DOMAIN) {
40
16
  return `https://${subDomain}.twist.win`;
41
17
  }
42
18
 
43
- export function extractCID(params) {
44
- return params.cId || params.CID || params.cID || params.CId || params.cid || params.ciD || params.Cid || params.CiD;
45
- }
46
-
47
- export function extractPID(params) {
48
- return params.pId || params.PID || params.pID || params.PId || params.pid || params.piD || params.Pid || params.PiD;
49
- }
50
-
51
- export function extractSubDomain(params) {
52
- return params.subDomain || params.SubDomain || params.Subdomain || params.subdomain || params.SUBDOMAIN || params.subDOMAIN;
53
- }
54
-
55
- function isBidRequestValid(bid) {
56
- const params = bid.params || {};
57
- return !!(extractCID(params) && extractPID(params));
58
- }
59
-
60
- function buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
61
- const {
62
- params,
63
- bidId,
64
- userId,
65
- adUnitCode,
66
- schain,
67
- mediaTypes,
68
- ortb2Imp,
69
- bidderRequestId,
70
- bidRequestsCount,
71
- bidderRequestsCount,
72
- bidderWinsCount
73
- } = bid;
74
- const {ext} = params;
75
- let {bidFloor} = params;
76
- const hashUrl = hashCode(topWindowUrl);
77
- const uniqueDealId = getUniqueDealId(hashUrl);
78
- const pId = extractPID(params);
79
- const isStorageAllowed = bidderSettings.get(BIDDER_CODE, 'storageAllowed');
80
-
81
- const gpid = deepAccess(bid, 'ortb2Imp.ext.gpid', deepAccess(bid, 'ortb2Imp.ext.data.pbadslot', ''));
82
- const cat = deepAccess(bidderRequest, 'ortb2.site.cat', []);
83
- const pagecat = deepAccess(bidderRequest, 'ortb2.site.pagecat', []);
84
- const contentData = deepAccess(bidderRequest, 'ortb2.site.content.data', []);
85
- const userData = deepAccess(bidderRequest, 'ortb2.user.data', []);
86
-
87
- if (isFn(bid.getFloor)) {
88
- const floorInfo = bid.getFloor({
89
- currency: 'USD',
90
- mediaType: '*',
91
- size: '*'
92
- });
93
-
94
- if (floorInfo.currency === 'USD') {
95
- bidFloor = floorInfo.floor;
96
- }
97
- }
98
-
99
- let data = {
100
- url: encodeURIComponent(topWindowUrl),
101
- uqs: getTopWindowQueryParams(),
102
- cb: Date.now(),
103
- bidFloor: bidFloor,
104
- bidId: bidId,
105
- referrer: bidderRequest.refererInfo.ref,
106
- adUnitCode: adUnitCode,
107
- publisherId: pId,
108
- sizes: sizes,
109
- uniqueDealId: uniqueDealId,
110
- bidderVersion: BIDDER_VERSION,
111
- prebidVersion: '$prebid.version$',
112
- res: `${screen.width}x${screen.height}`,
113
- schain: schain,
114
- mediaTypes: mediaTypes,
115
- isStorageAllowed: isStorageAllowed,
116
- gpid: gpid,
117
- cat: cat,
118
- contentData,
119
- userData: userData,
120
- pagecat: pagecat,
121
- transactionId: ortb2Imp?.ext?.tid,
122
- bidderRequestId: bidderRequestId,
123
- bidRequestsCount: bidRequestsCount,
124
- bidderRequestsCount: bidderRequestsCount,
125
- bidderWinsCount: bidderWinsCount,
126
- bidderTimeout: bidderTimeout,
127
- webSessionId: webSessionId
128
- };
129
-
130
- appendUserIdsToRequestPayload(data, userId);
131
-
132
- const sua = deepAccess(bidderRequest, 'ortb2.device.sua');
133
-
134
- if (sua) {
135
- data.sua = sua;
136
- }
137
-
138
- if (bidderRequest.gdprConsent) {
139
- if (bidderRequest.gdprConsent.consentString) {
140
- data.gdprConsent = bidderRequest.gdprConsent.consentString;
141
- }
142
- if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
143
- data.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
144
- }
145
- }
146
- if (bidderRequest.uspConsent) {
147
- data.usPrivacy = bidderRequest.uspConsent;
148
- }
149
-
150
- if (bidderRequest.gppConsent) {
151
- data.gppString = bidderRequest.gppConsent.gppString;
152
- data.gppSid = bidderRequest.gppConsent.applicableSections;
153
- } else if (bidderRequest.ortb2?.regs?.gpp) {
154
- data.gppString = bidderRequest.ortb2.regs.gpp;
155
- data.gppSid = bidderRequest.ortb2.regs.gpp_sid;
156
- }
157
-
158
- if (bidderRequest.paapi?.enabled) {
159
- const fledge = deepAccess(bidderRequest, 'ortb2Imp.ext.ae');
160
- if (fledge) {
161
- data.fledge = fledge;
162
- }
163
- }
164
-
165
- _each(ext, (value, key) => {
166
- data['ext.' + key] = value;
167
- });
168
-
169
- return data;
170
- }
171
-
172
- function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
173
- const {params} = bid;
174
- const cId = extractCID(params);
175
- const subDomain = extractSubDomain(params);
176
- const data = buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout);
177
- const dto = {
178
- method: 'POST',
179
- url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
180
- data: data
181
- };
182
- return dto;
183
- }
184
-
185
- function buildSingleRequest(bidRequests, bidderRequest, topWindowUrl, bidderTimeout) {
186
- const {params} = bidRequests[0];
187
- const cId = extractCID(params);
188
- const subDomain = extractSubDomain(params);
189
- const data = bidRequests.map(bid => {
190
- const sizes = parseSizesInput(bid.sizes);
191
- return buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout)
192
- });
193
- const chunkSize = Math.min(20, config.getConfig('twistdigital.chunkSize') || 10);
194
-
195
- const chunkedData = chunk(data, chunkSize);
196
- return chunkedData.map(chunk => {
197
- return {
198
- method: 'POST',
199
- url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
200
- data: {
201
- bids: chunk
202
- }
203
- };
204
- });
205
- }
206
-
207
- function appendUserIdsToRequestPayload(payloadRef, userIds) {
208
- let key;
209
- _each(userIds, (userId, idSystemProviderName) => {
210
- key = `uid.${idSystemProviderName}`;
211
- switch (idSystemProviderName) {
212
- case 'digitrustid':
213
- payloadRef[key] = deepAccess(userId, 'data.id');
214
- break;
215
- case 'lipb':
216
- payloadRef[key] = userId.lipbid;
217
- break;
218
- case 'parrableId':
219
- payloadRef[key] = userId.eid;
220
- break;
221
- case 'id5id':
222
- payloadRef[key] = userId.uid;
223
- break;
224
- default:
225
- payloadRef[key] = userId;
226
- }
227
- });
228
- }
229
-
230
- function buildRequests(validBidRequests, bidderRequest) {
231
- const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
232
- const bidderTimeout = config.getConfig('bidderTimeout');
233
-
234
- const singleRequestMode = config.getConfig('twistdigital.singleRequest');
19
+ const buildRequests = createBuildRequestsFn(createDomain, null, storage, BIDDER_CODE, BIDDER_VERSION, true);
235
20
 
236
- const requests = [];
21
+ const interpretResponse = createInterpretResponseFn(BIDDER_CODE, true);
237
22
 
238
- if (singleRequestMode) {
239
- // banner bids are sent as a single request
240
- const bannerBidRequests = validBidRequests.filter(bid => isArray(bid.mediaTypes) ? bid.mediaTypes.includes(BANNER) : bid.mediaTypes[BANNER] !== undefined);
241
- if (bannerBidRequests.length > 0) {
242
- const singleRequests = buildSingleRequest(bannerBidRequests, bidderRequest, topWindowUrl, bidderTimeout);
243
- requests.push(...singleRequests);
244
- }
245
-
246
- // video bids are sent as a single request for each bid
247
-
248
- const videoBidRequests = validBidRequests.filter(bid => bid.mediaTypes[VIDEO] !== undefined);
249
- videoBidRequests.forEach(validBidRequest => {
250
- const sizes = parseSizesInput(validBidRequest.sizes);
251
- const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
252
- requests.push(request);
253
- });
254
- } else {
255
- validBidRequests.forEach(validBidRequest => {
256
- const sizes = parseSizesInput(validBidRequest.sizes);
257
- const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
258
- requests.push(request);
259
- });
260
- }
261
- return requests;
262
- }
263
-
264
- function interpretResponse(serverResponse, request) {
265
- if (!serverResponse || !serverResponse.body) {
266
- return [];
267
- }
268
-
269
- const singleRequestMode = config.getConfig('twistdigital.singleRequest');
270
- const reqBidId = deepAccess(request, 'data.bidId');
271
- const {results} = serverResponse.body;
272
-
273
- let output = [];
274
-
275
- try {
276
- results.forEach((result, i) => {
277
- const {
278
- creativeId,
279
- ad,
280
- price,
281
- exp,
282
- width,
283
- height,
284
- currency,
285
- bidId,
286
- nurl,
287
- advertiserDomains,
288
- metaData,
289
- mediaType = BANNER
290
- } = result;
291
- if (!ad || !price) {
292
- return;
293
- }
294
-
295
- const response = {
296
- requestId: (singleRequestMode && bidId) ? bidId : reqBidId,
297
- cpm: price,
298
- width: width,
299
- height: height,
300
- creativeId: creativeId,
301
- currency: currency || CURRENCY,
302
- netRevenue: true,
303
- ttl: exp || TTL_SECONDS,
304
- };
305
-
306
- if (nurl) {
307
- response.nurl = nurl;
308
- }
309
-
310
- if (metaData) {
311
- Object.assign(response, {
312
- meta: metaData
313
- })
314
- } else {
315
- Object.assign(response, {
316
- meta: {
317
- advertiserDomains: advertiserDomains || []
318
- }
319
- })
320
- }
321
-
322
- if (mediaType === BANNER) {
323
- Object.assign(response, {
324
- ad: ad,
325
- });
326
- } else {
327
- Object.assign(response, {
328
- vastXml: ad,
329
- mediaType: VIDEO
330
- });
331
- }
332
- output.push(response);
333
- });
334
-
335
- return output;
336
- } catch (e) {
337
- return [];
338
- }
339
- }
340
-
341
- function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '', gppConsent = {}) {
342
- let syncs = [];
343
- const {iframeEnabled, pixelEnabled} = syncOptions;
344
- const {gdprApplies, consentString = ''} = gdprConsent;
345
- const {gppString, applicableSections} = gppConsent;
346
-
347
- const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
348
- let params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`;
349
-
350
- if (gppString && applicableSections?.length) {
351
- params += '&gpp=' + encodeURIComponent(gppString);
352
- params += '&gpp_sid=' + encodeURIComponent(applicableSections.join(','));
353
- }
354
-
355
- if (iframeEnabled) {
356
- syncs.push({
357
- type: 'iframe',
358
- url: `https://sync.twist.win/api/sync/iframe/${params}`
359
- });
360
- }
361
- if (pixelEnabled) {
362
- syncs.push({
363
- type: 'image',
364
- url: `https://sync.twist.win/api/sync/image/${params}`
365
- });
366
- }
367
- return syncs;
368
- }
369
-
370
- /**
371
- * @param {Bid} bid
372
- */
373
- function onBidWon(bid) {
374
- if (!bid.nurl) {
375
- return;
376
- }
377
- const wonBid = {
378
- adId: bid.adId,
379
- creativeId: bid.creativeId,
380
- auctionId: bid.auctionId,
381
- transactionId: bid.transactionId,
382
- adUnitCode: bid.adUnitCode,
383
- cpm: bid.cpm,
384
- currency: bid.currency,
385
- originalCpm: bid.originalCpm,
386
- originalCurrency: bid.originalCurrency,
387
- netRevenue: bid.netRevenue,
388
- mediaType: bid.mediaType,
389
- timeToRespond: bid.timeToRespond,
390
- status: bid.status,
391
- };
392
- const qs = formatQS(wonBid);
393
- const url = bid.nurl + (bid.nurl.indexOf('?') === -1 ? '?' : '&') + qs;
394
- triggerPixel(url);
395
- }
396
-
397
- export function hashCode(s, prefix = '_') {
398
- const l = s.length;
399
- let h = 0
400
- let i = 0;
401
- if (l > 0) {
402
- while (i < l) {
403
- h = (h << 5) - h + s.charCodeAt(i++) | 0;
404
- }
405
- }
406
- return prefix + h;
407
- }
408
-
409
- export function getUniqueDealId(key, expiry = UNIQUE_DEAL_ID_EXPIRY) {
410
- const storageKey = `u_${key}`;
411
- const now = Date.now();
412
- const data = getStorageItem(storageKey);
413
- let uniqueId;
414
-
415
- if (!data || !data.value || now - data.created > expiry) {
416
- uniqueId = `${key}_${now.toString()}`;
417
- setStorageItem(storageKey, uniqueId);
418
- } else {
419
- uniqueId = data.value;
420
- }
421
-
422
- return uniqueId;
423
- }
424
-
425
- export function getStorageItem(key) {
426
- try {
427
- return tryParseJSON(storage.getDataFromLocalStorage(key));
428
- } catch (e) {
429
- }
430
-
431
- return null;
432
- }
433
-
434
- export function setStorageItem(key, value, timestamp) {
435
- try {
436
- const created = timestamp || Date.now();
437
- const data = JSON.stringify({value, created});
438
- storage.setDataInLocalStorage(key, data);
439
- } catch (e) {
440
- }
441
- }
442
-
443
- export function tryParseJSON(value) {
444
- try {
445
- return JSON.parse(value);
446
- } catch (e) {
447
- return value;
448
- }
449
- }
23
+ const getUserSyncs = createUserSyncGetter({
24
+ iframeSyncUrl: 'https://sync.twist.win/api/sync/iframe', imageSyncUrl: 'https://sync.twist.win/api/sync/image'
25
+ });
450
26
 
451
27
  export const spec = {
452
28
  code: BIDDER_CODE,
@@ -131,7 +131,7 @@ import {config} from '../../src/config.js';
131
131
  import * as events from '../../src/events.js';
132
132
  import {getGlobal} from '../../src/prebidGlobal.js';
133
133
  import adapterManager, {gdprDataHandler} from '../../src/adapterManager.js';
134
- import { EVENTS } from '../../src/constants.js';
134
+ import {EVENTS} from '../../src/constants.js';
135
135
  import {module, ready as hooksReady} from '../../src/hook.js';
136
136
  import {buildEidPermissions, createEidsArray, EID_CONFIG} from './eids.js';
137
137
  import {
@@ -147,7 +147,6 @@ import {
147
147
  getPrebidInternal,
148
148
  isArray,
149
149
  isEmpty,
150
- isEmptyStr,
151
150
  isFn,
152
151
  isGptPubadsDefined,
153
152
  isNumber,
@@ -951,29 +950,40 @@ function hasValidStorageTypes(config) {
951
950
  * @param {SubmoduleConfig[]} configRegistry
952
951
  * @returns {SubmoduleConfig[]}
953
952
  */
954
- function getValidSubmoduleConfigs(configRegistry) {
953
+ export function getValidSubmoduleConfigs(configRegistry) {
954
+ function err(msg, ...args) {
955
+ logWarn(`Invalid userSync.userId config: ${msg}`, ...args)
956
+ }
955
957
  if (!Array.isArray(configRegistry)) {
958
+ if (configRegistry != null) {
959
+ err('must be an array', configRegistry);
960
+ }
956
961
  return [];
957
962
  }
958
- return configRegistry.reduce((carry, config) => {
959
- // every submodule config obj must contain a valid 'name'
960
- if (!config || isEmptyStr(config.name)) {
961
- return carry;
962
- }
963
- // Validate storage config contains 'type' and 'name' properties with non-empty string values
964
- // 'type' must be one of html5, cookies
965
- if (config.storage &&
966
- !isEmptyStr(config.storage.type) &&
967
- !isEmptyStr(config.storage.name) &&
968
- hasValidStorageTypes(config)) {
969
- carry.push(config);
970
- } else if (isPlainObject(config.value)) {
971
- carry.push(config);
972
- } else if (!config.storage && !config.value) {
973
- carry.push(config);
963
+ return configRegistry.filter(config => {
964
+ if (!config?.name) {
965
+ return err('must specify "name"', config);
966
+ } else if (config.storage) {
967
+ if (!config.storage.name || !config.storage.type) {
968
+ return err('must specify "storage.name" and "storage.type"', config);
969
+ } else if (!hasValidStorageTypes(config)) {
970
+ return err('invalid "storage.type"', config)
971
+ }
972
+ ['expires', 'refreshInSeconds'].forEach(param => {
973
+ let value = config.storage[param];
974
+ if (value != null && typeof value !== 'number') {
975
+ value = Number(value)
976
+ if (isNaN(value)) {
977
+ err(`storage.${param} must be a number and will be ignored`, config);
978
+ delete config.storage[param];
979
+ } else {
980
+ config.storage[param] = value;
981
+ }
982
+ }
983
+ });
974
984
  }
975
- return carry;
976
- }, []);
985
+ return true;
986
+ })
977
987
  }
978
988
 
979
989
  const ALL_STORAGE_TYPES = new Set([LOCAL_STORAGE, COOKIE]);
@@ -6,6 +6,7 @@ import {deepAccess, getBidIdParameter, logError} from '../src/utils.js';
6
6
 
7
7
  const BIDDER_CODE = 'viant';
8
8
  const ENDPOINT = 'https://bidders-us-east-1.adelphic.net/d/rtb/v25/prebid/bidder'
9
+ const ADAPTER_VERSION = '2.0.0';
9
10
 
10
11
  const DEFAULT_BID_TTL = 300;
11
12
  const DEFAULT_CURRENCY = 'USD';
@@ -85,6 +86,25 @@ function createRequest(bidRequests, bidderRequest, mediaType) {
85
86
  if (!data.regs.ext) data.regs.ext = {};
86
87
  data.regs.ext.us_privacy = bidderRequest.uspConsent;
87
88
  }
89
+ let imp = data.imp || [];
90
+ let dealsMap = new Map();
91
+ if (bidderRequest.bids) {
92
+ bidderRequest.bids.forEach(bid => {
93
+ if (bid.ortb2Imp && bid.ortb2Imp.pmp) {
94
+ dealsMap.set(bid.bidId, bid.ortb2Imp.pmp);
95
+ }
96
+ });
97
+ }
98
+ imp.forEach((element) => {
99
+ let deals = dealsMap.get(element.id);
100
+ if (deals) {
101
+ element.pmp = deals;
102
+ }
103
+ });
104
+ data.ext = data.ext || {};
105
+ data.ext.viant = {
106
+ adapterVersion: ADAPTER_VERSION
107
+ };
88
108
  return {
89
109
  method: 'POST',
90
110
  url: ENDPOINT,