prebid.js 7.35.0 → 7.36.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 (188) hide show
  1. package/.devcontainer/Dockerfile +2 -0
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admaruBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/aidemBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/aolBidAdapter.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/audiencerunBidAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bluebillywigBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/brightcomBidAdapter.js +1 -1
  28. package/dist/brightcomSSPBidAdapter.js +1 -0
  29. package/dist/carodaBidAdapter.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectadBidAdapter.js +1 -1
  33. package/dist/consumableBidAdapter.js +1 -1
  34. package/dist/conversantBidAdapter.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/cwireBidAdapter.js +1 -1
  38. package/dist/dependencies.json +3 -0
  39. package/dist/dspxBidAdapter.js +1 -1
  40. package/dist/eplanningBidAdapter.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freewheel-sspBidAdapter.js +1 -1
  44. package/dist/glimpseBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/gridBidAdapter.js +1 -1
  48. package/dist/gridNMBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/impactifyBidAdapter.js +1 -1
  53. package/dist/improvedigitalBidAdapter.js +1 -1
  54. package/dist/inmarBidAdapter.js +1 -1
  55. package/dist/insticatorBidAdapter.js +1 -1
  56. package/dist/ixBidAdapter.js +1 -1
  57. package/dist/jixieBidAdapter.js +1 -1
  58. package/dist/justpremiumBidAdapter.js +1 -1
  59. package/dist/konduitAnalyticsAdapter.js +1 -1
  60. package/dist/kueezBidAdapter.js +1 -1
  61. package/dist/kueezRtbBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/limelightDigitalBidAdapter.js +1 -1
  65. package/dist/liveIntentIdSystem.js +1 -1
  66. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  67. package/dist/logicadBidAdapter.js +1 -1
  68. package/dist/loglyliftBidAdapter.js +1 -1
  69. package/dist/magniteAnalyticsAdapter.js +1 -1
  70. package/dist/malltvAnalyticsAdapter.js +1 -1
  71. package/dist/marsmediaBidAdapter.js +1 -1
  72. package/dist/mediafuseBidAdapter.js +1 -1
  73. package/dist/mediakeysBidAdapter.js +1 -1
  74. package/dist/mediasquareBidAdapter.js +1 -1
  75. package/dist/mgidBidAdapter.js +1 -1
  76. package/dist/minutemediaBidAdapter.js +1 -1
  77. package/dist/neuwoRtdProvider.js +1 -0
  78. package/dist/nexx360BidAdapter.js +1 -1
  79. package/dist/not-for-prod/prebid.js +132 -129
  80. package/dist/oguryBidAdapter.js +1 -1
  81. package/dist/onetagBidAdapter.js +1 -1
  82. package/dist/ooloAnalyticsAdapter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/pixfutureBidAdapter.js +1 -1
  86. package/dist/prebid-core.js +1 -1
  87. package/dist/publinkIdSystem.js +1 -1
  88. package/dist/pubmaticBidAdapter.js +1 -1
  89. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  90. package/dist/pxyzBidAdapter.js +1 -1
  91. package/dist/quantcastBidAdapter.js +1 -1
  92. package/dist/readpeakBidAdapter.js +1 -1
  93. package/dist/relaidoBidAdapter.js +1 -1
  94. package/dist/rhythmoneBidAdapter.js +1 -1
  95. package/dist/riseBidAdapter.js +1 -1
  96. package/dist/rubiconAnalyticsAdapter.js +1 -1
  97. package/dist/rubiconBidAdapter.js +1 -1
  98. package/dist/scatteredBidAdapter.js +1 -0
  99. package/dist/seedingAllianceBidAdapter.js +1 -1
  100. package/dist/seedtagBidAdapter.js +1 -1
  101. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  102. package/dist/sharethroughBidAdapter.js +1 -1
  103. package/dist/shinezBidAdapter.js +1 -1
  104. package/dist/sirdataRtdProvider.js +1 -1
  105. package/dist/smaatoBidAdapter.js +1 -1
  106. package/dist/smartadserverBidAdapter.js +1 -1
  107. package/dist/smartxBidAdapter.js +1 -1
  108. package/dist/smilewantedBidAdapter.js +1 -1
  109. package/dist/sonobiBidAdapter.js +1 -1
  110. package/dist/sovrnAnalyticsAdapter.js +1 -1
  111. package/dist/sovrnBidAdapter.js +1 -1
  112. package/dist/sspBCBidAdapter.js +1 -1
  113. package/dist/sublimeBidAdapter.js +1 -1
  114. package/dist/synacormediaBidAdapter.js +1 -1
  115. package/dist/targetVideoBidAdapter.js +1 -1
  116. package/dist/teadsBidAdapter.js +1 -1
  117. package/dist/trionBidAdapter.js +1 -1
  118. package/dist/tripleliftBidAdapter.js +1 -1
  119. package/dist/ttdBidAdapter.js +1 -1
  120. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  121. package/dist/uid2IdSystem.js +1 -1
  122. package/dist/underdogmediaBidAdapter.js +1 -1
  123. package/dist/undertoneBidAdapter.js +1 -1
  124. package/dist/userId.js +1 -1
  125. package/dist/vidazooBidAdapter.js +1 -1
  126. package/dist/videobyteBidAdapter.js +1 -1
  127. package/dist/visxBidAdapter.js +1 -1
  128. package/dist/vuukleBidAdapter.js +1 -1
  129. package/dist/widespaceBidAdapter.js +1 -1
  130. package/dist/winrBidAdapter.js +1 -1
  131. package/dist/yahoosspBidAdapter.js +1 -1
  132. package/dist/yieldmoBidAdapter.js +1 -1
  133. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  134. package/integrationExamples/gpt/neuwoRtdProvider_example.html +190 -0
  135. package/modules/33acrossBidAdapter.js +13 -4
  136. package/modules/admaruBidAdapter.js +19 -1
  137. package/modules/aidemBidAdapter.js +90 -65
  138. package/modules/aidemBidAdapter.md +10 -7
  139. package/modules/ajaBidAdapter.js +6 -1
  140. package/modules/amxIdSystem.md +2 -10
  141. package/modules/aolBidAdapter.js +1 -1
  142. package/modules/appnexusBidAdapter.js +45 -48
  143. package/modules/brightcomBidAdapter.js +1 -0
  144. package/modules/brightcomSSPBidAdapter.js +323 -0
  145. package/modules/brightcomSSPBidAdapter.md +46 -0
  146. package/modules/feedadBidAdapter.js +35 -15
  147. package/modules/fpdModule/index.md +5 -2
  148. package/modules/freewheel-sspBidAdapter.js +5 -1
  149. package/modules/gridBidAdapter.js +3 -1
  150. package/modules/ixBidAdapter.js +318 -175
  151. package/modules/limelightDigitalBidAdapter.js +6 -1
  152. package/modules/limelightDigitalBidAdapter.md +12 -2
  153. package/modules/liveIntentIdSystem.js +1 -1
  154. package/modules/neuwoRtdProvider.js +171 -0
  155. package/modules/neuwoRtdProvider.md +40 -0
  156. package/modules/nexx360BidAdapter.js +1 -1
  157. package/modules/pubmaticBidAdapter.js +4 -0
  158. package/modules/scatteredBidAdapter.js +72 -0
  159. package/modules/scatteredBidAdapter.md +36 -0
  160. package/modules/sirdataRtdProvider.js +262 -284
  161. package/modules/smartxBidAdapter.js +2 -0
  162. package/modules/smilewantedBidAdapter.js +5 -0
  163. package/modules/topicsFpdModule.md +62 -0
  164. package/modules/userId/eids.js +1 -1
  165. package/modules/vidazooBidAdapter.js +3 -1
  166. package/modules/yahoosspBidAdapter.js +1 -1
  167. package/package.json +2 -2
  168. package/test/spec/modules/33acrossBidAdapter_spec.js +51 -18
  169. package/test/spec/modules/admaruBidAdapter_spec.js +48 -0
  170. package/test/spec/modules/aidemBidAdapter_spec.js +77 -10
  171. package/test/spec/modules/ajaBidAdapter_spec.js +21 -1
  172. package/test/spec/modules/aolBidAdapter_spec.js +2 -2
  173. package/test/spec/modules/appnexusBidAdapter_spec.js +123 -16
  174. package/test/spec/modules/brightcomSSPBidAdapter_spec.js +411 -0
  175. package/test/spec/modules/eids_spec.js +1 -1
  176. package/test/spec/modules/feedadBidAdapter_spec.js +47 -77
  177. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +1 -1
  178. package/test/spec/modules/ixBidAdapter_spec.js +24 -54
  179. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +35 -5
  180. package/test/spec/modules/neuwoRtdProvider_spec.js +123 -0
  181. package/test/spec/modules/pubmaticBidAdapter_spec.js +15 -0
  182. package/test/spec/modules/scatteredBidAdapter_spec.js +210 -0
  183. package/test/spec/modules/sirdataRtdProvider_spec.js +116 -22
  184. package/test/spec/modules/smilewantedBidAdapter_spec.js +54 -3
  185. package/test/spec/modules/tripleliftBidAdapter_spec.js +2 -2
  186. package/test/spec/modules/userId_spec.js +1 -1
  187. package/test/spec/modules/vidazooBidAdapter_spec.js +4 -1
  188. package/test/spec/modules/yahoosspBidAdapter_spec.js +1 -1
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * This module adds Sirdata provider to the real time data module
3
+ * and now supports Seller Defined Audience
3
4
  * The {@link module:modules/realTimeData} module is required
4
5
  * The module will fetch segments (user-centric) and categories (page-centric) from Sirdata server
5
6
  * The module will automatically handle user's privacy and choice in California (IAB TL CCPA Framework) and in Europe (IAB EU TCF FOR GDPR)
6
7
  * @module modules/sirdataRtdProvider
7
8
  * @requires module:modules/realTimeData
8
9
  */
9
- import {deepAccess, deepEqual, deepSetValue, isEmpty, logError, mergeDeep} from '../src/utils.js';
10
+ import {deepAccess, deepSetValue, isEmpty, logError, mergeDeep} from '../src/utils.js';
10
11
  import {submodule} from '../src/hook.js';
11
12
  import {ajax} from '../src/ajax.js';
12
13
  import {findIndex} from '../src/polyfill.js';
@@ -16,6 +17,52 @@ import {config} from '../src/config.js';
16
17
  /** @type {string} */
17
18
  const MODULE_NAME = 'realTimeData';
18
19
  const SUBMODULE_NAME = 'SirdataRTDModule';
20
+ const ORTB2_NAME = 'sirdata.com';
21
+
22
+ const partnerIds = {
23
+ 'criteo': 27443,
24
+ 'openx': 30342,
25
+ 'pubmatic': 30345,
26
+ 'smaato': 27520,
27
+ 'triplelift': 27518,
28
+ 'yahoossp': 30339,
29
+ 'rubicon': 27452,
30
+ 'appnexus': 27446,
31
+ 'appnexusAst': 27446,
32
+ 'brealtime': 27446,
33
+ 'emxdigital': 27446,
34
+ 'pagescience': 27446,
35
+ 'gourmetads': 33394,
36
+ 'matomy': 27446,
37
+ 'featureforward': 27446,
38
+ 'oftmedia': 27446,
39
+ 'districtm': 27446,
40
+ 'adasta': 27446,
41
+ 'beintoo': 27446,
42
+ 'gravity': 27446,
43
+ 'msq_classic': 27878,
44
+ 'msq_max': 27878,
45
+ '366_apx': 27878,
46
+ 'mediasquare': 27878,
47
+ 'smartadserver': 27440,
48
+ 'smart': 27440,
49
+ 'proxistore': 27484,
50
+ 'ix': 27248,
51
+ 'sdRtdForGpt': 27449,
52
+ 'smilewanted': 28690,
53
+ 'taboola': 33379,
54
+ 'ttd': 33382,
55
+ 'zeta_global': 33385,
56
+ 'teads': 33388,
57
+ 'conversant': 33391,
58
+ 'improvedigital': 33397,
59
+ 'invibes': 33400,
60
+ 'sublime': 33403,
61
+ 'rtbhouse': 33406,
62
+ 'zeta_global_ssp': 33385,
63
+ };
64
+
65
+ let CONTEXT_ONLY = true;
19
66
 
20
67
  export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig, userConsent) {
21
68
  moduleConfig.params = moduleConfig.params || {};
@@ -46,9 +93,10 @@ export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig,
46
93
  if (!sirdataDomain || !gdprApplies || (deepAccess(userConsent, 'gdpr.vendorData.vendor.consents') && userConsent.gdpr.vendorData.vendor.consents[53] && userConsent.gdpr.vendorData.purpose.consents[1] && userConsent.gdpr.vendorData.purpose.consents[4])) {
47
94
  sirdataDomain = 'sddan.com';
48
95
  sendWithCredentials = true;
96
+ CONTEXT_ONLY = false;
49
97
  }
50
- // TODO: is 'page' the right value here?
51
- var actualUrl = moduleConfig.params.actualUrl || getRefererInfo().page;
98
+
99
+ var actualUrl = moduleConfig.params.actualUrl || getRefererInfo().stack.pop() || getRefererInfo().page;
52
100
 
53
101
  const url = 'https://kvt.' + sirdataDomain + '/api/v1/public/p/' + moduleConfig.params.partnerId + '/d/' + moduleConfig.params.key + '/s?callback=&gdpr=' + gdprApplies + '&gdpr_consent=' + tcString + (actualUrl ? '&url=' + encodeURIComponent(actualUrl) : '');
54
102
 
@@ -86,39 +134,74 @@ export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig,
86
134
  });
87
135
  }
88
136
 
89
- export function setGlobalOrtb2(ortb2, segments, categories) {
137
+ export function setGlobalOrtb2Sda(ortb2Fragments, data, segtaxid, cattaxid) {
90
138
  try {
91
- let addOrtb2 = {};
92
- let testGlobal = ortb2 || {}
93
- if (!deepAccess(testGlobal, 'user.ext.data.sd_rtd') || !deepEqual(testGlobal.user.ext.data.sd_rtd, segments)) {
94
- deepSetValue(addOrtb2, 'user.ext.data.sd_rtd', segments || {});
139
+ if (!isEmpty(data.segments)) {
140
+ applyGlobalOrtb2Sda(ortb2Fragments, 'user', data.segments, segtaxid);
95
141
  }
96
- if (!deepAccess(testGlobal, 'site.ext.data.sd_rtd') || !deepEqual(testGlobal.site.ext.data.sd_rtd, categories)) {
97
- deepSetValue(addOrtb2, 'site.ext.data.sd_rtd', categories || {});
98
- }
99
- if (!isEmpty(addOrtb2)) {
100
- mergeDeep(ortb2, addOrtb2);
142
+ if (!isEmpty(data.categories)) {
143
+ applyGlobalOrtb2Sda(ortb2Fragments, 'site', data.categories, cattaxid);
101
144
  }
102
145
  } catch (e) {
103
146
  logError(e)
104
147
  }
148
+ return true;
149
+ }
105
150
 
151
+ export function applyGlobalOrtb2Sda(ortb2Fragments, type, segments, segtaxValue) {
152
+ try {
153
+ let ortb2Data = [{
154
+ name: ORTB2_NAME,
155
+ segment: segments.map((segmentId) => ({ id: segmentId })),
156
+ }];
157
+ if (segtaxValue) {
158
+ ortb2Data[0].ext = { segtax: segtaxValue };
159
+ }
160
+ let ortb2Conf = (type == 'site' ? {site: {content: {data: ortb2Data}}} : {user: {data: ortb2Data}});
161
+ mergeDeep(ortb2Fragments, ortb2Conf);
162
+ } catch (e) {
163
+ logError(e)
164
+ }
106
165
  return true;
107
166
  }
108
167
 
109
- export function setBidderOrtb2(bidderOrtb2, bidder, segments, categories) {
168
+ export function setBidderOrtb2Sda(ortb2Fragments, bidder, data, segtaxid, cattaxid) {
110
169
  try {
111
- let addOrtb2 = {};
112
- let testBidder = bidderOrtb2[bidder];
113
- if (!deepAccess(testBidder, 'user.ext.data.sd_rtd') || !deepEqual(testBidder.user.ext.data.sd_rtd, segments)) {
114
- deepSetValue(addOrtb2, 'user.ext.data.sd_rtd', segments || {});
170
+ if (!isEmpty(data.segments)) {
171
+ applyBidderOrtb2Sda(ortb2Fragments, bidder, 'user', data.segments, segtaxid);
115
172
  }
116
- if (!deepAccess(testBidder, 'site.ext.data.sd_rtd') || !deepEqual(testBidder.site.ext.data.sd_rtd, categories)) {
117
- deepSetValue(addOrtb2, 'site.ext.data.sd_rtd', categories || {});
173
+ if (!isEmpty(data.categories)) {
174
+ applyBidderOrtb2Sda(ortb2Fragments, bidder, 'site', data.categories, cattaxid);
118
175
  }
119
- if (!isEmpty(addOrtb2)) {
120
- mergeDeep(bidderOrtb2[bidder], addOrtb2)
176
+ } catch (e) {
177
+ logError(e)
178
+ }
179
+ return true;
180
+ }
181
+
182
+ export function applyBidderOrtb2Sda(ortb2Fragments, bidder, type, segments, segtaxValue) {
183
+ try {
184
+ let ortb2Data = [{
185
+ name: ORTB2_NAME,
186
+ segment: segments.map((segmentId) => ({ id: segmentId })),
187
+ }];
188
+ if (segtaxValue) {
189
+ ortb2Data[0].ext = { segtax: segtaxValue };
121
190
  }
191
+ let ortb2Conf = (type == 'site' ? {site: {content: {data: ortb2Data}}} : {user: {data: ortb2Data}});
192
+ mergeDeep(ortb2Fragments, {[bidder]: ortb2Conf});
193
+ } catch (e) {
194
+ logError(e)
195
+ }
196
+ return true;
197
+ }
198
+
199
+ export function setBidderOrtb2(bidderOrtb2Fragments, bidder, path, segments) {
200
+ try {
201
+ if (isEmpty(segments)) { return; }
202
+ let ortb2Conf = {};
203
+ deepSetValue(ortb2Conf, path, segments || {});
204
+ mergeDeep(bidderOrtb2Fragments, {[bidder]: ortb2Conf});
122
205
  } catch (e) {
123
206
  logError(e)
124
207
  }
@@ -137,16 +220,16 @@ export function loadCustomFunction(todo, adUnit, list, data, bid) {
137
220
  return true;
138
221
  }
139
222
 
140
- export function getSegAndCatsArray(data, minScore) {
141
- var sirdataData = {'segments': [], 'categories': []};
223
+ export function getSegAndCatsArray(data, minScore, pid) {
224
+ let sirdataData = {'segments': [], 'categories': []};
142
225
  minScore = minScore && typeof minScore == 'number' ? minScore : 30;
143
226
  try {
144
227
  if (data && data.contextual_categories) {
145
228
  for (let catId in data.contextual_categories) {
146
- if (data.contextual_categories.hasOwnProperty(catId)) {
229
+ if (data.contextual_categories.hasOwnProperty(catId) && data.contextual_categories[catId]) {
147
230
  let value = data.contextual_categories[catId];
148
231
  if (value >= minScore && sirdataData.categories.indexOf(catId) === -1) {
149
- sirdataData.categories.push(catId.toString());
232
+ sirdataData.categories.push((pid ? pid.toString() + 'cc' : '') + catId.toString());
150
233
  }
151
234
  }
152
235
  }
@@ -157,8 +240,11 @@ export function getSegAndCatsArray(data, minScore) {
157
240
  try {
158
241
  if (data && data.segments) {
159
242
  for (let segId in data.segments) {
160
- if (data.segments.hasOwnProperty(segId)) {
161
- sirdataData.segments.push(data.segments[segId].toString());
243
+ if (data.segments.hasOwnProperty(segId) && data.segments[segId]) {
244
+ sirdataData.segments.push((pid ? pid.toString() + 'us' : '') + data.segments[segId].toString());
245
+ if (pid && CONTEXT_ONLY) {
246
+ sirdataData.categories.push(pid.toString() + 'uc' + data.segments[segId].toString());
247
+ }
162
248
  }
163
249
  }
164
250
  }
@@ -168,34 +254,77 @@ export function getSegAndCatsArray(data, minScore) {
168
254
  return sirdataData;
169
255
  }
170
256
 
257
+ export function applySdaGetSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit) {
258
+ // only share SDA data if whitelisted
259
+ if (!biddersParamsExist || indexFound) {
260
+ // SDA Publisher
261
+ let sirdataDataForSDA = getSegAndCatsArray(data, minScore, moduleConfig.params.partnerId);
262
+ setBidderOrtb2Sda(reqBids.ortb2Fragments?.bidder, bid.bidder, sirdataDataForSDA, data.segtaxid, data.cattaxid);
263
+ }
264
+
265
+ // always share SDA for curation
266
+ let curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : (partnerIds[bid.bidder] ? partnerIds[bid.bidder] : null));
267
+ if (curationId) {
268
+ // seller defined audience & bidder specific data
269
+ if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
270
+ // Get Bidder Specific Data
271
+ let curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore, null);
272
+ sirdataList = sirdataList.concat(curationData.segments).concat(curationData.categories);
273
+
274
+ // SDA Partners
275
+ let curationDataForSDA = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore, curationId);
276
+ setBidderOrtb2Sda(reqBids.ortb2Fragments?.bidder, bid.bidder, curationDataForSDA, data.shared_taxonomy[curationId].segtaxid, data.shared_taxonomy[curationId].cattaxid);
277
+ }
278
+ }
279
+
280
+ // Apply custom function or return Bidder Specific Data if publisher is ok
281
+ if (sirdataList && sirdataList.length > 0 && (!biddersParamsExist || indexFound)) {
282
+ if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
283
+ return loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataList, data, bid);
284
+ } else {
285
+ return sirdataList;
286
+ }
287
+ }
288
+ }
289
+
290
+ export function applySdaAndDefaultSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit) {
291
+ let specificData = applySdaGetSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
292
+ if (specificData && specificData.length > 0) {
293
+ setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, 'user.ext.data', {sd_rtd: specificData});
294
+ }
295
+ }
296
+
171
297
  export function addSegmentData(reqBids, data, moduleConfig, onDone) {
172
298
  const adUnits = reqBids.adUnits;
173
299
  moduleConfig = moduleConfig || {};
174
300
  moduleConfig.params = moduleConfig.params || {};
175
301
  const globalMinScore = moduleConfig.params.hasOwnProperty('contextualMinRelevancyScore') ? moduleConfig.params.contextualMinRelevancyScore : 30;
176
- var sirdataData = getSegAndCatsArray(data, globalMinScore);
302
+ var sirdataData = getSegAndCatsArray(data, globalMinScore, null);
177
303
 
178
304
  const sirdataList = sirdataData.segments.concat(sirdataData.categories);
179
- var sirdataMergedList = [];
180
305
 
181
- var curationData = {'segments': [], 'categories': []};
182
- var curationId = '1';
183
306
  const biddersParamsExist = (!!(moduleConfig.params && moduleConfig.params.bidders));
184
307
 
185
- // Global ortb2
186
- if (!biddersParamsExist) {
187
- setGlobalOrtb2(reqBids.ortb2Fragments?.global, sirdataData.segments, sirdataData.categories);
308
+ // Global ortb2 SDA
309
+ if (data.global_taxonomy && !isEmpty(data.global_taxonomy)) {
310
+ let globalData = {'segments': [], 'categories': []};
311
+ for (let i in data.global_taxonomy) {
312
+ if (!isEmpty(data.global_taxonomy[i])) {
313
+ globalData = getSegAndCatsArray(data.global_taxonomy[i], globalMinScore, null);
314
+ setGlobalOrtb2Sda(reqBids.ortb2Fragments?.global, globalData, data.global_taxonomy[i].segtaxid, data.global_taxonomy[i].cattaxid);
315
+ }
316
+ }
188
317
  }
189
318
 
190
319
  // Google targeting
191
320
  if (typeof window.googletag !== 'undefined' && (moduleConfig.params.setGptKeyValues || !moduleConfig.params.hasOwnProperty('setGptKeyValues'))) {
192
321
  try {
193
- // For curation Google is pid 27449
194
- curationId = (moduleConfig.params.gptCurationId ? moduleConfig.params.gptCurationId : '27449');
195
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
196
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], globalMinScore);
322
+ let gptCurationId = (moduleConfig.params.gptCurationId ? moduleConfig.params.gptCurationId : (partnerIds['sdRtdForGpt'] ? partnerIds['sdRtdForGpt'] : null));
323
+ let sirdataMergedList = sirdataList;
324
+ if (gptCurationId && data.shared_taxonomy && data.shared_taxonomy[gptCurationId]) {
325
+ let gamCurationData = getSegAndCatsArray(data.shared_taxonomy[gptCurationId], globalMinScore, null);
326
+ sirdataMergedList = sirdataMergedList.concat(gamCurationData.segments).concat(gamCurationData.categories);
197
327
  }
198
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
199
328
  window.googletag.pubads().getSlots().forEach(function (n) {
200
329
  if (typeof n.setTargeting !== 'undefined' && sirdataMergedList && sirdataMergedList.length > 0) {
201
330
  n.setTargeting('sd_rtd', sirdataMergedList);
@@ -221,259 +350,108 @@ export function addSegmentData(reqBids, data, moduleConfig, onDone) {
221
350
  }) : false);
222
351
  indexFound = (!!(typeof bidderIndex == 'number' && bidderIndex >= 0));
223
352
  try {
224
- curationData = {'segments': [], 'categories': []};
225
- sirdataMergedList = [];
226
-
227
353
  let minScore = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('contextualMinRelevancyScore') ? moduleConfig.params.bidders[bidderIndex].contextualMinRelevancyScore : globalMinScore);
354
+ let specificData = null;
355
+
356
+ switch (bid.bidder) {
357
+ case 'appnexus':
358
+ case 'appnexusAst':
359
+ case 'brealtime':
360
+ case 'emxdigital':
361
+ case 'pagescience':
362
+ case 'gourmetads':
363
+ case 'matomy':
364
+ case 'featureforward':
365
+ case 'oftmedia':
366
+ case 'districtm':
367
+ case 'adasta':
368
+ case 'beintoo':
369
+ case 'gravity':
370
+ case 'msq_classic':
371
+ case 'msq_max':
372
+ case '366_apx':
373
+ specificData = applySdaGetSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
374
+ if (specificData && specificData.length > 0) {
375
+ deepSetValue(bid, 'params.keywords.sd_rtd', specificData);
376
+ }
377
+ break;
228
378
 
229
- if (!biddersParamsExist || (indexFound && (!moduleConfig.params.bidders[bidderIndex].hasOwnProperty('adUnitCodes') || moduleConfig.params.bidders[bidderIndex].adUnitCodes.indexOf(adUnit.code) !== -1))) {
230
- switch (bid.bidder) {
231
- case 'appnexus':
232
- case 'appnexusAst':
233
- case 'brealtime':
234
- case 'emxdigital':
235
- case 'pagescience':
236
- case 'gourmetads':
237
- case 'matomy':
238
- case 'featureforward':
239
- case 'oftmedia':
240
- case 'districtm':
241
- case 'adasta':
242
- case 'beintoo':
243
- case 'gravity':
244
- case 'msq_classic':
245
- case 'msq_max':
246
- case '366_apx':
247
- // For curation Xandr is pid 27446
248
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27446');
249
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
250
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
251
- }
252
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
253
- if (sirdataMergedList && sirdataMergedList.length > 0) {
254
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
255
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
256
- } else {
257
- deepSetValue(bid, 'params.keywords.sd_rtd', sirdataMergedList);
258
- }
259
- }
260
- break;
261
-
262
- case 'smartadserver':
263
- case 'smart':
379
+ case 'smartadserver':
380
+ case 'smart':
381
+ specificData = applySdaGetSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
382
+ if (specificData && specificData.length > 0) {
264
383
  var target = [];
265
384
  if (bid.hasOwnProperty('params') && bid.params.hasOwnProperty('target')) {
266
385
  target.push(bid.params.target);
267
386
  }
268
- // For curation Smart is pid 27440
269
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27440');
270
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
271
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
272
- }
273
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
274
- if (sirdataMergedList && sirdataMergedList.length > 0) {
275
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
276
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
277
- } else {
278
- sirdataMergedList.forEach(function (entry) {
279
- if (target.indexOf('sd_rtd=' + entry) === -1) {
280
- target.push('sd_rtd=' + entry);
281
- }
282
- });
283
- deepSetValue(bid, 'params.target', target.join(';'));
284
- }
285
- }
286
- break;
287
-
288
- case 'rubicon':
289
- // For curation Magnite is pid 27518
290
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27452');
291
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
292
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
293
- }
294
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
295
- if (sirdataMergedList && sirdataMergedList.length > 0) {
296
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
297
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
298
- } else {
299
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
300
- }
301
- }
302
- break;
303
-
304
- case 'ix':
305
- var ixConfig = config.getConfig('ix.firstPartyData.sd_rtd');
306
- if (!ixConfig) {
307
- // For curation index is pid 27248
308
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27248');
309
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
310
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
311
- }
312
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
313
- if (sirdataMergedList && sirdataMergedList.length > 0) {
314
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
315
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
316
- } else {
317
- var cappIxCategories = [];
318
- var ixLength = 0;
319
- var ixLimit = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('sizeLimit') ? moduleConfig.params.bidders[bidderIndex].sizeLimit : 1000);
320
- // Push ids For publisher use and for curation if exists but limit size because the bidder uses GET parameters
321
- sirdataMergedList.forEach(function (entry) {
322
- if (ixLength < ixLimit) {
323
- cappIxCategories.push(entry);
324
- ixLength += entry.toString().length;
325
- }
326
- });
327
- config.setConfig({ix: {firstPartyData: {sd_rtd: cappIxCategories}}});
328
- }
329
- }
330
- }
331
- break;
332
-
333
- case 'proxistore':
334
- // For curation Proxistore is pid 27484
335
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27484');
336
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
337
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
338
- } else {
339
- data.shared_taxonomy[curationId] = {contextual_categories: {}};
340
- }
341
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
342
- if (sirdataMergedList && sirdataMergedList.length > 0) {
343
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
344
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
345
- } else {
346
- deepSetValue(bid, 'ortb2.user.ext.data', {
347
- segments: sirdataData.segments.concat(curationData.segments),
348
- contextual_categories: {...data.contextual_categories, ...data.shared_taxonomy[curationId].contextual_categories}
349
- });
350
- }
351
- }
352
- break;
353
-
354
- case 'criteo':
355
- // For curation Smart is pid 27443
356
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27443');
357
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
358
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
359
- }
360
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
361
- if (sirdataMergedList && sirdataMergedList.length > 0) {
362
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
363
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
364
- } else {
365
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
366
- }
367
- }
368
- break;
369
-
370
- case 'triplelift':
371
- // For curation Triplelift is pid 27518
372
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27518');
373
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
374
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
375
- }
376
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
377
- if (sirdataMergedList && sirdataMergedList.length > 0) {
378
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
379
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
380
- } else {
381
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
382
- }
383
- }
384
- break;
385
-
386
- case 'avct':
387
- case 'avocet':
388
- // For curation Avocet is pid 27522
389
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27522');
390
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
391
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
392
- }
393
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
394
- if (sirdataMergedList && sirdataMergedList.length > 0) {
395
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
396
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
397
- } else {
398
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
399
- }
400
- }
401
- break;
402
-
403
- case 'smaato':
404
- // For curation Smaato is pid 27520
405
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '27520');
406
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
407
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
408
- }
409
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
410
- if (sirdataMergedList && sirdataMergedList.length > 0) {
411
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
412
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
413
- } else {
414
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
415
- }
416
- }
417
- break;
418
-
419
- case 'yahoossp':
420
- // For curation Yahoo is pid 30339
421
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '30339');
422
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
423
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
424
- }
425
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
426
- if (sirdataMergedList && sirdataMergedList.length > 0) {
427
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
428
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
429
- } else {
430
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
431
- }
432
- }
433
- break;
434
-
435
- case 'openx':
436
- // For curation OpenX is pid 30342
437
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '30342');
438
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
439
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
440
- }
441
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
442
- if (sirdataMergedList && sirdataMergedList.length > 0) {
443
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
444
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
445
- } else {
446
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
387
+ specificData.forEach(function (entry) {
388
+ if (target.indexOf('sd_rtd=' + entry) === -1) {
389
+ target.push('sd_rtd=' + entry);
447
390
  }
448
- }
449
- break;
450
-
451
- case 'pubmatic':
452
- // For curation Pubmatic is pid 30345
453
- curationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : '30345');
454
- if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
455
- curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore);
456
- }
457
- sirdataMergedList = sirdataList.concat(curationData.segments).concat(curationData.categories);
458
- if (sirdataMergedList && sirdataMergedList.length > 0) {
459
- if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) {
460
- loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataMergedList, data, bid);
461
- } else {
462
- setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataMergedList);
463
- }
464
- }
465
- break;
466
-
467
- default:
468
- if (!biddersParamsExist || indexFound) {
469
- if (!deepAccess(bid, 'ortb2.site.ext.data.sd_rtd')) {
470
- deepSetValue(bid, 'ortb2.site.ext.data.sd_rtd', sirdataData.categories);
471
- }
472
- if (!deepAccess(bid, 'ortb2.user.ext.data.sd_rtd')) {
473
- deepSetValue(bid, 'ortb2.user.ext.data.sd_rtd', sirdataData.segments);
391
+ });
392
+ deepSetValue(bid, 'params.target', target.join(';'));
393
+ }
394
+ break;
395
+
396
+ case 'ix':
397
+ specificData = applySdaGetSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
398
+ let ixConfig = config.getConfig('ix.firstPartyData.sd_rtd');
399
+ if (!ixConfig && specificData && specificData.length > 0) {
400
+ let cappIxCategories = [];
401
+ let ixLength = 0;
402
+ let ixLimit = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('sizeLimit') ? moduleConfig.params.bidders[bidderIndex].sizeLimit : 1000);
403
+ // Push ids For publisher use and for curation if exists but limit size because the bidder uses GET parameters
404
+ specificData.forEach(function (entry) {
405
+ if (ixLength < ixLimit) {
406
+ cappIxCategories.push(entry);
407
+ ixLength += entry.toString().length;
474
408
  }
409
+ });
410
+ config.setConfig({ix: {firstPartyData: {sd_rtd: cappIxCategories}}});
411
+ }
412
+ break;
413
+
414
+ case 'proxistore':
415
+ specificData = applySdaGetSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
416
+ if (specificData && specificData.length > 0) {
417
+ let psCurationId = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('curationId') ? moduleConfig.params.bidders[bidderIndex].curationId : (partnerIds[bid.bidder] ? partnerIds[bid.bidder] : null));
418
+ if (!data.shared_taxonomy || !data.shared_taxonomy[psCurationId]) {
419
+ data.shared_taxonomy[psCurationId] = {segments: [], contextual_categories: {}, segtaxid: null, cattaxid: null};
475
420
  }
476
- }
421
+ let psCurationData = getSegAndCatsArray(data.shared_taxonomy[psCurationId], minScore, null);
422
+ setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, 'user.ext.data', {
423
+ segments: sirdataData.segments.concat(psCurationData.segments),
424
+ contextual_categories: {...data.contextual_categories, ...data.shared_taxonomy[psCurationId].contextual_categories}
425
+ });
426
+ }
427
+ break;
428
+
429
+ case 'rubicon':
430
+ case 'criteo':
431
+ case 'triplelift':
432
+ case 'smaato':
433
+ case 'yahoossp':
434
+ case 'openx':
435
+ case 'pubmatic':
436
+ case 'smilewanted':
437
+ case 'taboola':
438
+ case 'ttd':
439
+ case 'zeta_global':
440
+ case 'zeta_global_ssp':
441
+ case 'teads':
442
+ case 'conversant':
443
+ case 'improvedigital':
444
+ case 'invibes':
445
+ case 'sublime':
446
+ case 'rtbhouse':
447
+ case 'mediasquare':
448
+ applySdaAndDefaultSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
449
+ break;
450
+
451
+ default:
452
+ if (!biddersParamsExist || (indexFound && (!moduleConfig.params.bidders[bidderIndex].hasOwnProperty('adUnitCodes') || moduleConfig.params.bidders[bidderIndex].adUnitCodes.indexOf(adUnit.code) !== -1))) {
453
+ applySdaAndDefaultSpecificData(data, sirdataList, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
454
+ }
477
455
  }
478
456
  } catch (e) {
479
457
  logError(e);
@@ -10,8 +10,10 @@ import {
10
10
  } from '../src/mediaTypes.js';
11
11
  const BIDDER_CODE = 'smartx';
12
12
  const URL = 'https://bid.sxp.smartclip.net/bid/1000';
13
+ const GVLID = 115;
13
14
  export const spec = {
14
15
  code: BIDDER_CODE,
16
+ gvlid: GVLID,
15
17
  supportedMediaTypes: [VIDEO],
16
18
  /**
17
19
  * Determines whether or not the given bid request is valid.