prebid.js 6.1.0 → 6.5.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 (184) hide show
  1. package/.circleci/config.yml +1 -1
  2. package/README.md +1 -1
  3. package/browsers.json +13 -29
  4. package/gulpfile.js +87 -82
  5. package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
  6. package/karma.conf.maker.js +2 -2
  7. package/modules/33acrossBidAdapter.js +189 -102
  8. package/modules/adagioBidAdapter.js +1 -1
  9. package/modules/addefendBidAdapter.js +1 -0
  10. package/modules/adkernelBidAdapter.js +146 -61
  11. package/modules/adlooxAdServerVideo.js +2 -2
  12. package/modules/adlooxAnalyticsAdapter.js +4 -4
  13. package/modules/admanBidAdapter.js +1 -0
  14. package/modules/admixerBidAdapter.js +3 -2
  15. package/modules/adnuntiusBidAdapter.js +5 -2
  16. package/modules/adomikAnalyticsAdapter.js +6 -0
  17. package/modules/adplusBidAdapter.js +203 -0
  18. package/modules/adplusBidAdapter.md +39 -0
  19. package/modules/adxcgBidAdapter.js +311 -359
  20. package/modules/adxcgBidAdapter.md +22 -21
  21. package/modules/adyoulikeBidAdapter.js +20 -11
  22. package/modules/aniviewBidAdapter.js +1 -1
  23. package/modules/appnexusBidAdapter.js +19 -3
  24. package/modules/beachfrontBidAdapter.js +14 -17
  25. package/modules/beopBidAdapter.js +6 -4
  26. package/modules/bidViewability.js +3 -3
  27. package/modules/bidViewabilityIO.js +3 -3
  28. package/modules/bliinkBidAdapter.js +1 -1
  29. package/modules/colossussspBidAdapter.js +7 -0
  30. package/modules/compassBidAdapter.js +201 -0
  31. package/modules/compassBidAdapter.md +79 -0
  32. package/modules/consentManagement.js +7 -1
  33. package/modules/craftBidAdapter.js +5 -3
  34. package/modules/criteoBidAdapter.js +1 -1
  35. package/modules/currency.js +2 -2
  36. package/modules/cwireBidAdapter.js +3 -0
  37. package/modules/dailyhuntBidAdapter.js +435 -0
  38. package/modules/dailyhuntBidAdapter.md +4 -0
  39. package/modules/dchain.js +149 -0
  40. package/modules/dchain.md +45 -0
  41. package/modules/docereeBidAdapter.js +10 -1
  42. package/modules/docereeBidAdapter.md +2 -0
  43. package/modules/dspxBidAdapter.js +1 -1
  44. package/modules/emx_digitalBidAdapter.js +9 -1
  45. package/modules/engageyaBidAdapter.js +1 -1
  46. package/modules/feedadBidAdapter.js +2 -2
  47. package/modules/feedadBidAdapter.md +4 -2
  48. package/modules/freewheel-sspBidAdapter.js +6 -0
  49. package/modules/futureads.md +48 -0
  50. package/modules/glimpseBidAdapter.js +16 -3
  51. package/modules/goldbachBidAdapter.js +1176 -0
  52. package/modules/goldbachBidAdapter.md +151 -0
  53. package/modules/gptPreAuction.js +55 -7
  54. package/modules/gridBidAdapter.js +4 -3
  55. package/modules/gumgumBidAdapter.js +7 -3
  56. package/modules/improvedigitalBidAdapter.js +19 -3
  57. package/modules/instreamTracking.js +4 -4
  58. package/modules/intersectionRtdProvider.js +114 -0
  59. package/modules/invibesBidAdapter.js +64 -14
  60. package/modules/invibesBidAdapter.md +2 -1
  61. package/modules/ipromBidAdapter.js +79 -0
  62. package/modules/ixBidAdapter.js +53 -18
  63. package/modules/kinessoIdSystem.js +1 -1
  64. package/modules/limelightDigitalBidAdapter.js +3 -1
  65. package/modules/livewrappedAnalyticsAdapter.js +3 -1
  66. package/modules/livewrappedBidAdapter.js +8 -2
  67. package/modules/loglyliftBidAdapter.js +79 -0
  68. package/modules/loglyliftBidAdapter.md +55 -0
  69. package/modules/lotamePanoramaIdSystem.js +80 -8
  70. package/modules/luponmediaBidAdapter.js +570 -0
  71. package/modules/mediasquareBidAdapter.js +1 -9
  72. package/modules/missenaBidAdapter.js +89 -0
  73. package/modules/nextMillenniumBidAdapter.js +37 -7
  74. package/modules/optimeraRtdProvider.js +8 -1
  75. package/modules/ozoneBidAdapter.js +21 -64
  76. package/modules/prebidServerBidAdapter/index.js +16 -12
  77. package/modules/pubgeniusBidAdapter.js +1 -1
  78. package/modules/pubmaticBidAdapter.js +3 -3
  79. package/modules/pubxaiAnalyticsAdapter.js +17 -0
  80. package/modules/relaidoBidAdapter.js +86 -65
  81. package/modules/richaudienceBidAdapter.js +2 -3
  82. package/modules/rtdModule/index.js +48 -18
  83. package/modules/rubiconBidAdapter.js +31 -19
  84. package/modules/sharedIdSystem.js +27 -1
  85. package/modules/smaatoBidAdapter.js +4 -1
  86. package/modules/smartxBidAdapter.js +17 -1
  87. package/modules/tappxBidAdapter.js +3 -1
  88. package/modules/targetVideoBidAdapter.js +187 -0
  89. package/modules/targetVideoBidAdapter.md +34 -0
  90. package/modules/telariaBidAdapter.js +2 -2
  91. package/modules/trustxBidAdapter.js +8 -16
  92. package/modules/undertoneBidAdapter.js +8 -1
  93. package/modules/userId/index.js +27 -2
  94. package/modules/ventes.md +71 -0
  95. package/modules/ventesBidAdapter.js +104 -64
  96. package/modules/ventesBidAdapter.md +0 -1
  97. package/modules/vidoomyBidAdapter.js +16 -10
  98. package/modules/visxBidAdapter.js +19 -2
  99. package/modules/visxBidAdapter.md +4 -6
  100. package/modules/weboramaRtdProvider.js +288 -73
  101. package/modules/weboramaRtdProvider.md +27 -10
  102. package/modules/yahoosspBidAdapter.js +5 -1
  103. package/modules/yahoosspBidAdapter.md +1 -1
  104. package/modules/yieldmoBidAdapter.js +23 -5
  105. package/modules/yieldoneBidAdapter.js +115 -11
  106. package/modules/zetaSspBidAdapter.md +33 -1
  107. package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
  108. package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
  109. package/modules/zeta_global_sspBidAdapter.js +22 -1
  110. package/package.json +1 -1
  111. package/plugins/pbjsGlobals.js +28 -1
  112. package/src/auction.js +5 -4
  113. package/src/config.js +27 -3
  114. package/src/prebid.js +3 -2
  115. package/src/targeting.js +24 -3
  116. package/src/utils.js +53 -8
  117. package/test/helpers/prebidGlobal.js +1 -0
  118. package/test/spec/config_spec.js +279 -0
  119. package/test/spec/integration/faker/googletag.js +6 -0
  120. package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
  121. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
  122. package/test/spec/modules/adnuntiusBidAdapter_spec.js +35 -0
  123. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +6 -0
  124. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  125. package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
  126. package/test/spec/modules/adyoulikeBidAdapter_spec.js +75 -0
  127. package/test/spec/modules/appnexusBidAdapter_spec.js +49 -1
  128. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  129. package/test/spec/modules/beopBidAdapter_spec.js +1 -1
  130. package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
  131. package/test/spec/modules/bidViewability_spec.js +4 -4
  132. package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
  133. package/test/spec/modules/compassBidAdapter_spec.js +397 -0
  134. package/test/spec/modules/consentManagement_spec.js +20 -0
  135. package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
  136. package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
  137. package/test/spec/modules/dchain_spec.js +329 -0
  138. package/test/spec/modules/docereeBidAdapter_spec.js +9 -1
  139. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  140. package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
  141. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  142. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  143. package/test/spec/modules/gptPreAuction_spec.js +177 -2
  144. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  145. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -1
  146. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  147. package/test/spec/modules/invibesBidAdapter_spec.js +148 -4
  148. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  149. package/test/spec/modules/ixBidAdapter_spec.js +112 -62
  150. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +84 -23
  151. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +22 -0
  152. package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
  153. package/test/spec/modules/loglyliftBidAdapter_spec.js +172 -0
  154. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
  155. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  156. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
  157. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  158. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
  159. package/test/spec/modules/optimeraRtdProvider_spec.js +14 -1
  160. package/test/spec/modules/ozoneBidAdapter_spec.js +43 -31
  161. package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -0
  162. package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
  163. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  164. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
  165. package/test/spec/modules/realTimeDataModule_spec.js +135 -49
  166. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  167. package/test/spec/modules/richaudienceBidAdapter_spec.js +2 -2
  168. package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
  169. package/test/spec/modules/sharedIdSystem_spec.js +52 -6
  170. package/test/spec/modules/smaatoBidAdapter_spec.js +31 -0
  171. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  172. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  173. package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
  174. package/test/spec/modules/userId_spec.js +51 -0
  175. package/test/spec/modules/visxBidAdapter_spec.js +120 -4
  176. package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
  177. package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
  178. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  179. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
  180. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
  181. package/test/spec/unit/core/targeting_spec.js +116 -0
  182. package/test/spec/utils_spec.js +38 -0
  183. package/test/test_deps.js +3 -0
  184. package/test/test_index.js +1 -3
@@ -6,7 +6,7 @@ import { getStorageManager } from '../src/storageManager.js';
6
6
 
7
7
  const BIDDER_CODE = 'relaido';
8
8
  const BIDDER_DOMAIN = 'api.relaido.jp';
9
- const ADAPTER_VERSION = '1.0.6';
9
+ const ADAPTER_VERSION = '1.0.7';
10
10
  const DEFAULT_TTL = 300;
11
11
  const UUID_KEY = 'relaido_uuid';
12
12
 
@@ -31,14 +31,14 @@ function isBidRequestValid(bid) {
31
31
  }
32
32
 
33
33
  function buildRequests(validBidRequests, bidderRequest) {
34
- let bidRequests = [];
34
+ const bids = [];
35
+ let imuid = null;
36
+ let bidDomain = null;
37
+ let bidder = null;
38
+ let count = null;
35
39
 
36
40
  for (let i = 0; i < validBidRequests.length; i++) {
37
41
  const bidRequest = validBidRequests[i];
38
- const placementId = getBidIdParameter('placementId', bidRequest.params);
39
- const bidDomain = bidRequest.params.domain || BIDDER_DOMAIN;
40
- const bidUrl = `https://${bidDomain}/bid/v1/prebid/${placementId}`;
41
- const uuid = getUuid();
42
42
  let mediaType = '';
43
43
  let width = 0;
44
44
  let height = 0;
@@ -55,46 +55,63 @@ function buildRequests(validBidRequests, bidderRequest) {
55
55
  mediaType = BANNER;
56
56
  }
57
57
 
58
- let payload = {
59
- version: ADAPTER_VERSION,
60
- timeout_ms: bidderRequest.timeout,
61
- ad_unit_code: bidRequest.adUnitCode,
62
- auction_id: bidRequest.auctionId,
63
- bidder: bidRequest.bidder,
64
- bidder_request_id: bidRequest.bidderRequestId,
65
- bid_requests_count: bidRequest.bidRequestsCount,
66
- bid_id: bidRequest.bidId,
67
- transaction_id: bidRequest.transactionId,
68
- media_type: mediaType,
69
- uuid: uuid,
70
- width: width,
71
- height: height,
72
- pv: '$prebid.version$'
73
- };
58
+ if (!imuid) {
59
+ const pickImuid = deepAccess(bidRequest, 'userId.imuid');
60
+ if (pickImuid) {
61
+ imuid = pickImuid;
62
+ }
63
+ }
64
+
65
+ if (!bidDomain) {
66
+ bidDomain = bidRequest.params.domain;
67
+ }
68
+
69
+ if (!bidder) {
70
+ bidder = bidRequest.bidder
71
+ }
72
+
73
+ if (!bidder) {
74
+ bidder = bidRequest.bidder
75
+ }
74
76
 
75
- const imuid = deepAccess(bidRequest, 'userId.imuid');
76
- if (imuid) {
77
- payload.imuid = imuid;
77
+ if (!count) {
78
+ count = bidRequest.bidRequestsCount;
78
79
  }
79
80
 
80
- // It may not be encoded, so add it at the end of the payload
81
- payload.ref = bidderRequest.refererInfo.referer;
82
-
83
- bidRequests.push({
84
- method: 'GET',
85
- url: bidUrl,
86
- data: payload,
87
- options: {
88
- withCredentials: true
89
- },
90
- bidId: bidRequest.bidId,
81
+ bids.push({
82
+ bid_id: bidRequest.bidId,
83
+ placement_id: getBidIdParameter('placementId', bidRequest.params),
84
+ transaction_id: bidRequest.transactionId,
85
+ bidder_request_id: bidRequest.bidderRequestId,
86
+ ad_unit_code: bidRequest.adUnitCode,
87
+ auction_id: bidRequest.auctionId,
91
88
  player: bidRequest.params.player,
92
- width: payload.width,
93
- height: payload.height,
94
- mediaType: payload.media_type
89
+ width: width,
90
+ height: height,
91
+ media_type: mediaType
95
92
  });
96
93
  }
97
- return bidRequests;
94
+
95
+ const data = JSON.stringify({
96
+ version: ADAPTER_VERSION,
97
+ bids: bids,
98
+ timeout_ms: bidderRequest.timeout,
99
+ bidder: bidder,
100
+ bid_requests_count: count,
101
+ uuid: getUuid(),
102
+ pv: '$prebid.version$',
103
+ imuid: imuid,
104
+ ref: bidderRequest.refererInfo.referer
105
+ })
106
+
107
+ return {
108
+ method: 'POST',
109
+ url: `https://${bidDomain || BIDDER_DOMAIN}/bid/v1/sprebid`,
110
+ options: {
111
+ withCredentials: true
112
+ },
113
+ data: data
114
+ };
98
115
  }
99
116
 
100
117
  function interpretResponse(serverResponse, bidRequest) {
@@ -105,34 +122,38 @@ function interpretResponse(serverResponse, bidRequest) {
105
122
  }
106
123
 
107
124
  const playerUrl = bidRequest.player || body.playerUrl;
108
- const mediaType = bidRequest.mediaType || VIDEO;
109
-
110
- let bidResponse = {
111
- requestId: bidRequest.bidId,
112
- width: bidRequest.width,
113
- height: bidRequest.height,
114
- cpm: body.price,
115
- currency: body.currency,
116
- creativeId: body.creativeId,
117
- dealId: body.dealId || '',
118
- ttl: body.ttl || DEFAULT_TTL,
119
- netRevenue: true,
120
- mediaType: mediaType,
121
- meta: {
122
- advertiserDomains: body.adomain || [],
123
- mediaType: VIDEO
125
+
126
+ for (const res of body.ads) {
127
+ let bidResponse = {
128
+ requestId: res.bidId,
129
+ width: res.width,
130
+ height: res.height,
131
+ cpm: res.price,
132
+ currency: res.currency,
133
+ creativeId: res.creativeId,
134
+ dealId: body.dealId || '',
135
+ ttl: body.ttl || DEFAULT_TTL,
136
+ netRevenue: true,
137
+ mediaType: res.mediaType || VIDEO,
138
+ meta: {
139
+ advertiserDomains: res.adomain || [],
140
+ mediaType: VIDEO
141
+ }
142
+ };
143
+
144
+ if (bidResponse.mediaType === VIDEO) {
145
+ bidResponse.vastXml = res.vast;
146
+ bidResponse.renderer = newRenderer(res.bidId, playerUrl);
147
+ } else {
148
+ const playerTag = createPlayerTag(playerUrl);
149
+ const renderTag = createRenderTag(res.width, res.height, res.vast);
150
+ bidResponse.ad = `<div id="rop-prebid">${playerTag}${renderTag}</div>`;
124
151
  }
125
- };
126
- if (mediaType === VIDEO) {
127
- bidResponse.vastXml = body.vast;
128
- bidResponse.renderer = newRenderer(bidRequest.bidId, playerUrl);
129
- } else {
130
- const playerTag = createPlayerTag(playerUrl);
131
- const renderTag = createRenderTag(bidRequest.width, bidRequest.height, body.vast);
132
- bidResponse.ad = `<div id="rop-prebid">${playerTag}${renderTag}</div>`;
152
+ bidResponses.push(bidResponse);
133
153
  }
134
- bidResponses.push(bidResponse);
135
154
 
155
+ // eslint-disable-next-line no-console
156
+ console.log(JSON.stringify(bidResponses));
136
157
  return bidResponses;
137
158
  }
138
159
 
@@ -58,11 +58,10 @@ export const spec = {
58
58
  REFERER = (typeof bidderRequest.refererInfo.referer != 'undefined' ? encodeURIComponent(bidderRequest.refererInfo.referer) : null)
59
59
 
60
60
  payload.gdpr_consent = '';
61
- payload.gdpr = null;
61
+ payload.gdpr = bidderRequest.gdprConsent.gdprApplies;
62
62
 
63
63
  if (bidderRequest && bidderRequest.gdprConsent) {
64
64
  payload.gdpr_consent = bidderRequest.gdprConsent.consentString;
65
- payload.gdpr = bidderRequest.gdprConsent.gdprApplies;
66
65
  }
67
66
 
68
67
  var payloadString = JSON.stringify(payload);
@@ -296,7 +295,7 @@ function raiGetFloor(bid, config) {
296
295
  } else if (typeof bid.getFloor == 'function') {
297
296
  let floorSpec = bid.getFloor({
298
297
  currency: config.getConfig('currency.adServerCurrency'),
299
- mediaType: bid.mediaType.banner ? 'banner' : 'video',
298
+ mediaType: typeof bid.mediaTypes['banner'] == 'object' ? 'banner' : 'video',
300
299
  size: '*'
301
300
  })
302
301
 
@@ -98,6 +98,15 @@
98
98
  * @param {UserConsentData} userConsent
99
99
  */
100
100
 
101
+ /**
102
+ * @function?
103
+ * @summary on bid requested event
104
+ * @name RtdSubmodule#onBidRequestEvent
105
+ * @param {Object} data
106
+ * @param {SubmoduleConfig} config
107
+ * @param {UserConsentData} userConsent
108
+ */
109
+
101
110
  /**
102
111
  * @interface ModuleConfig
103
112
  */
@@ -143,7 +152,7 @@
143
152
 
144
153
  import {config} from '../../src/config.js';
145
154
  import {module} from '../../src/hook.js';
146
- import { logError, logWarn } from '../../src/utils.js';
155
+ import {logError, logWarn} from '../../src/utils.js';
147
156
  import events from '../../src/events.js';
148
157
  import CONSTANTS from '../../src/constants.json';
149
158
  import {gdprDataHandler, uspDataHandler} from '../../src/adapterManager.js';
@@ -164,13 +173,50 @@ let _dataProviders = [];
164
173
  let _userConsent;
165
174
 
166
175
  /**
167
- * enable submodule in User ID
176
+ * Register a RTD submodule.
177
+ *
168
178
  * @param {RtdSubmodule} submodule
179
+ * @returns {function()} a de-registration function that will unregister the module when called.
169
180
  */
170
181
  export function attachRealTimeDataProvider(submodule) {
171
182
  registeredSubModules.push(submodule);
183
+ return function detach() {
184
+ const idx = registeredSubModules.indexOf(submodule)
185
+ if (idx >= 0) {
186
+ registeredSubModules.splice(idx, 1);
187
+ initSubModules();
188
+ }
189
+ }
172
190
  }
173
191
 
192
+ /**
193
+ * call each sub module event function by config order
194
+ */
195
+ const setEventsListeners = (function () {
196
+ let registered = false;
197
+ return function setEventsListeners() {
198
+ if (!registered) {
199
+ Object.entries({
200
+ [CONSTANTS.EVENTS.AUCTION_INIT]: 'onAuctionInitEvent',
201
+ [CONSTANTS.EVENTS.AUCTION_END]: 'onAuctionEndEvent',
202
+ [CONSTANTS.EVENTS.BID_RESPONSE]: 'onBidResponseEvent',
203
+ [CONSTANTS.EVENTS.BID_REQUESTED]: 'onBidRequestEvent'
204
+ }).forEach(([ev, handler]) => {
205
+ events.on(ev, (args) => {
206
+ subModules.forEach(sm => {
207
+ try {
208
+ sm[handler] && sm[handler](args, sm.config, _userConsent)
209
+ } catch (e) {
210
+ logError(`RTD provider '${sm.name}': error in '${handler}':`, e);
211
+ }
212
+ });
213
+ })
214
+ });
215
+ registered = true;
216
+ }
217
+ }
218
+ })();
219
+
174
220
  export function init(config) {
175
221
  const confListener = config.getConfig(MODULE_NAME, ({realTimeData}) => {
176
222
  if (!realTimeData.dataProviders) {
@@ -211,22 +257,6 @@ function initSubModules() {
211
257
  subModules = subModulesByOrder;
212
258
  }
213
259
 
214
- /**
215
- * call each sub module event function by config order
216
- */
217
- function setEventsListeners() {
218
- events.on(CONSTANTS.EVENTS.AUCTION_INIT, (args) => {
219
- subModules.forEach(sm => { sm.onAuctionInitEvent && sm.onAuctionInitEvent(args, sm.config, _userConsent) })
220
- });
221
- events.on(CONSTANTS.EVENTS.AUCTION_END, (args) => {
222
- getAdUnitTargeting(args);
223
- subModules.forEach(sm => { sm.onAuctionEndEvent && sm.onAuctionEndEvent(args, sm.config, _userConsent) })
224
- });
225
- events.on(CONSTANTS.EVENTS.BID_RESPONSE, (args) => {
226
- subModules.forEach(sm => { sm.onBidResponseEvent && sm.onBidResponseEvent(args, sm.config, _userConsent) })
227
- });
228
- }
229
-
230
260
  /**
231
261
  * loop through configured data providers If the data provider has registered getBidRequestData,
232
262
  * call it, providing reqBidsConfigObj, consent data and module params
@@ -1,4 +1,4 @@
1
- import { mergeDeep, _each, logError, deepAccess, deepSetValue, isStr, isNumber, logWarn, convertTypes, isArray, parseSizesInput, logMessage } from '../src/utils.js';
1
+ import { mergeDeep, _each, logError, deepAccess, deepSetValue, isStr, isNumber, logWarn, convertTypes, isArray, parseSizesInput, logMessage, formatQS } from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {config} from '../src/config.js';
4
4
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
@@ -765,21 +765,23 @@ export const spec = {
765
765
  getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
766
766
  if (!hasSynced && syncOptions.iframeEnabled) {
767
767
  // data is only assigned if params are available to pass to syncEndpoint
768
- let params = '';
768
+ let params = {};
769
769
 
770
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
771
- // add 'gdpr' only if 'gdprApplies' is defined
770
+ if (gdprConsent) {
772
771
  if (typeof gdprConsent.gdprApplies === 'boolean') {
773
- params += `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
774
- } else {
775
- params += `?gdpr_consent=${gdprConsent.consentString}`;
772
+ params['gdpr'] = Number(gdprConsent.gdprApplies);
773
+ }
774
+ if (typeof gdprConsent.consentString === 'string') {
775
+ params['gdpr_consent'] = gdprConsent.consentString;
776
776
  }
777
777
  }
778
778
 
779
779
  if (uspConsent) {
780
- params += `${params ? '&' : '?'}us_privacy=${encodeURIComponent(uspConsent)}`;
780
+ params['us_privacy'] = encodeURIComponent(uspConsent);
781
781
  }
782
782
 
783
+ params = Object.keys(params).length ? `?${formatQS(params)}` : '';
784
+
783
785
  hasSynced = true;
784
786
  return {
785
787
  type: 'iframe',
@@ -992,6 +994,8 @@ function applyFPD(bidRequest, mediaType, data) {
992
994
 
993
995
  let fpd = mergeDeep({}, config.getConfig('ortb2') || {}, BID_FPD);
994
996
  let impData = deepAccess(bidRequest.ortb2Imp, 'ext.data') || {};
997
+
998
+ const gpid = deepAccess(bidRequest, 'ortb2Imp.ext.gpid');
995
999
  const SEGTAX = {user: [4], site: [1, 2, 5, 6]};
996
1000
  const MAP = {user: 'tg_v.', site: 'tg_i.', adserver: 'tg_i.dfp_ad_unit_code', pbadslot: 'tg_i.pbadslot', keywords: 'kw'};
997
1001
  const validate = function(prop, key, parentName) {
@@ -1020,16 +1024,6 @@ function applyFPD(bidRequest, mediaType, data) {
1020
1024
  data[loc] = (data[loc]) ? data[loc].concat(',', val) : val;
1021
1025
  }
1022
1026
 
1023
- Object.keys(impData).forEach((key) => {
1024
- if (key === 'adserver') {
1025
- ['name', 'adslot'].forEach(prop => {
1026
- if (impData[key][prop]) impData[key][prop] = impData[key][prop].toString().replace(/^\/+/, '');
1027
- });
1028
- } else if (key === 'pbadslot') {
1029
- impData[key] = impData[key].toString().replace(/^\/+/, '');
1030
- }
1031
- });
1032
-
1033
1027
  if (mediaType === BANNER) {
1034
1028
  ['site', 'user'].forEach(name => {
1035
1029
  Object.keys(fpd[name]).forEach((key) => {
@@ -1045,12 +1039,30 @@ function applyFPD(bidRequest, mediaType, data) {
1045
1039
  });
1046
1040
  });
1047
1041
  Object.keys(impData).forEach((key) => {
1048
- (key === 'adserver') ? addBannerData(impData[key].adslot, name, key) : addBannerData(impData[key], 'site', key);
1042
+ if (key !== 'adserver') {
1043
+ addBannerData(impData[key], 'site', key);
1044
+ } else if (impData[key].name === 'gam') {
1045
+ addBannerData(impData[key].adslot, name, key)
1046
+ }
1049
1047
  });
1048
+
1049
+ // add in gpid
1050
+ if (gpid) {
1051
+ data['p_gpid'] = gpid;
1052
+ }
1053
+
1054
+ // only send one of pbadslot or dfp adunit code (prefer pbadslot)
1055
+ if (data['tg_i.pbadslot']) {
1056
+ delete data['tg_i.dfp_ad_unit_code'];
1057
+ }
1050
1058
  } else {
1051
1059
  if (Object.keys(impData).length) {
1052
1060
  mergeDeep(data.imp[0].ext, {data: impData});
1053
1061
  }
1062
+ // add in gpid
1063
+ if (gpid) {
1064
+ data.imp[0].ext.gpid = gpid;
1065
+ }
1054
1066
 
1055
1067
  mergeDeep(data, fpd);
1056
1068
  }
@@ -11,7 +11,7 @@ import { coppaDataHandler } from '../src/adapterManager.js';
11
11
  import {getStorageManager} from '../src/storageManager.js';
12
12
 
13
13
  const GVLID = 887;
14
- const storage = getStorageManager(GVLID, 'pubCommonId');
14
+ export const storage = getStorageManager(GVLID, 'pubCommonId');
15
15
  const COOKIE = 'cookie';
16
16
  const LOCAL_STORAGE = 'html5';
17
17
  const OPTOUT_NAME = '_pubcid_optout';
@@ -171,7 +171,33 @@ export const sharedIdSystemSubmodule = {
171
171
  return {id: storedId};
172
172
  }
173
173
  }
174
+ },
175
+
176
+ domainOverride: function () {
177
+ const domainElements = document.domain.split('.');
178
+ const cookieName = `_gd${Date.now()}`;
179
+ for (let i = 0, topDomain, testCookie; i < domainElements.length; i++) {
180
+ const nextDomain = domainElements.slice(i).join('.');
181
+
182
+ // write test cookie
183
+ storage.setCookie(cookieName, '1', undefined, undefined, nextDomain);
184
+
185
+ // read test cookie to verify domain was valid
186
+ testCookie = storage.getCookie(cookieName);
187
+
188
+ // delete test cookie
189
+ storage.setCookie(cookieName, '', 'Thu, 01 Jan 1970 00:00:01 GMT', undefined, nextDomain);
190
+
191
+ if (testCookie === '1') {
192
+ // cookie was written successfully using test domain so the topDomain is updated
193
+ topDomain = nextDomain;
194
+ } else {
195
+ // cookie failed to write using test domain so exit by returning the topDomain
196
+ return topDomain;
197
+ }
198
+ }
174
199
  }
200
+
175
201
  };
176
202
 
177
203
  submodule('userId', sharedIdSystemSubmodule);
@@ -5,7 +5,7 @@ import {ADPOD, BANNER, VIDEO} from '../src/mediaTypes.js';
5
5
 
6
6
  const BIDDER_CODE = 'smaato';
7
7
  const SMAATO_ENDPOINT = 'https://prebid.ad.smaato.net/oapi/prebid';
8
- const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.5'
8
+ const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.6'
9
9
  const CURRENCY = 'USD';
10
10
 
11
11
  const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => {
@@ -304,6 +304,7 @@ function createBannerImp(bidRequest) {
304
304
  id: bidRequest.bidId,
305
305
  tagid: deepAccess(bidRequest, 'params.adspaceId'),
306
306
  bidfloor: getBidFloor(bidRequest, BANNER, adUnitSizes),
307
+ instl: deepAccess(bidRequest.ortb2Imp, 'instl'),
307
308
  banner: {
308
309
  w: sizes[0].w,
309
310
  h: sizes[0].h,
@@ -319,6 +320,7 @@ function createVideoImp(bidRequest, videoMediaType) {
319
320
  id: bidRequest.bidId,
320
321
  tagid: deepAccess(bidRequest, 'params.adspaceId'),
321
322
  bidfloor: getBidFloor(bidRequest, VIDEO, videoMediaType.playerSize),
323
+ instl: deepAccess(bidRequest.ortb2Imp, 'instl'),
322
324
  video: {
323
325
  mimes: videoMediaType.mimes,
324
326
  minduration: videoMediaType.minduration,
@@ -346,6 +348,7 @@ function createAdPodImp(bidRequest, videoMediaType) {
346
348
  id: bidRequest.bidId,
347
349
  tagid: tagid,
348
350
  bidfloor: getBidFloor(bidRequest, VIDEO, videoMediaType.playerSize),
351
+ instl: deepAccess(bidRequest.ortb2Imp, 'instl'),
349
352
  video: {
350
353
  w: videoMediaType.playerSize[0][0],
351
354
  h: videoMediaType.playerSize[0][1],
@@ -161,11 +161,20 @@ export const spec = {
161
161
  domain: domain,
162
162
  publisher: {
163
163
  id: publisherId
164
+ },
165
+ content: {
166
+ ext: {
167
+ prebid: {
168
+ name: 'pbjs',
169
+ version: '$prebid.version$'
170
+ }
171
+ }
164
172
  }
165
173
  },
166
174
  device: device,
167
175
  at: at,
168
- cur: cur
176
+ cur: cur,
177
+ ext: {}
169
178
  };
170
179
 
171
180
  const userExt = {};
@@ -194,6 +203,8 @@ export const spec = {
194
203
  };
195
204
  }
196
205
 
206
+ // requestPayload.user.ext.ver = pbjs.version;
207
+
197
208
  // Targeting
198
209
  if (getBidIdParameter('data', bid.params.user)) {
199
210
  var targetingarr = [];
@@ -336,6 +347,7 @@ function createOutstreamConfig(bid) {
336
347
  let confTitle = getBidIdParameter('title', bid.renderer.config.outstream_options);
337
348
  let confSkipOffset = getBidIdParameter('skipOffset', bid.renderer.config.outstream_options);
338
349
  let confDesiredBitrate = getBidIdParameter('desiredBitrate', bid.renderer.config.outstream_options);
350
+ let confVisibilityThreshold = getBidIdParameter('visibilityThreshold', bid.renderer.config.outstream_options);
339
351
  let elementId = getBidIdParameter('slot', bid.renderer.config.outstream_options) || bid.adUnitCode;
340
352
 
341
353
  logMessage('[SMARTX][renderer] Handle SmartX outstream renderer');
@@ -384,6 +396,10 @@ function createOutstreamConfig(bid) {
384
396
  smartPlayObj.desiredBitrate = confDesiredBitrate;
385
397
  }
386
398
 
399
+ if (confVisibilityThreshold) {
400
+ smartPlayObj.visibilityThreshold = confVisibilityThreshold;
401
+ }
402
+
387
403
  smartPlayObj.adResponse = bid.vastContent;
388
404
 
389
405
  const divID = '[id="' + elementId + '"]';
@@ -7,9 +7,10 @@ import { config } from '../src/config.js';
7
7
  import { Renderer } from '../src/Renderer.js';
8
8
 
9
9
  const BIDDER_CODE = 'tappx';
10
+ const GVLID_CODE = 628;
10
11
  const TTL = 360;
11
12
  const CUR = 'USD';
12
- const TAPPX_BIDDER_VERSION = '0.1.1004';
13
+ const TAPPX_BIDDER_VERSION = '0.1.1005';
13
14
  const TYPE_CNN = 'prebidjs';
14
15
  const LOG_PREFIX = '[TAPPX]: ';
15
16
  const VIDEO_SUPPORT = ['instream', 'outstream'];
@@ -42,6 +43,7 @@ var hostDomain;
42
43
 
43
44
  export const spec = {
44
45
  code: BIDDER_CODE,
46
+ gvlid: GVLID_CODE,
45
47
  supportedMediaTypes: [BANNER, VIDEO],
46
48
 
47
49
  /**