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
@@ -0,0 +1,187 @@
1
+ import find from 'core-js-pure/features/array/find.js';
2
+ import { getBidRequest } from '../src/utils.js';
3
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
4
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
5
+
6
+ const SOURCE = 'pbjs';
7
+ const BIDDER_CODE = 'targetVideo';
8
+ const ENDPOINT_URL = 'https://ib.adnxs.com/ut/v3/prebid';
9
+ const MARGIN = 1.35;
10
+
11
+ export const spec = {
12
+
13
+ code: BIDDER_CODE,
14
+ supportedMediaTypes: [BANNER],
15
+
16
+ /**
17
+ * Determines whether or not the given bid request is valid.
18
+ *
19
+ * @param {object} bid The bid to validate.
20
+ * @return boolean True if this is a valid bid, and false otherwise.
21
+ */
22
+ isBidRequestValid: function(bid) {
23
+ return !!(bid && bid.params && bid.params.placementId);
24
+ },
25
+
26
+ /**
27
+ * Make a server request from the list of BidRequests.
28
+ *
29
+ * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
30
+ * @return ServerRequest Info describing the request to the server.
31
+ */
32
+ buildRequests: function(bidRequests, bidderRequest) {
33
+ const tags = bidRequests.map(createVideoTag);
34
+ const schain = bidRequests[0].schain;
35
+ const payload = {
36
+ tags: tags,
37
+ sdk: {
38
+ source: SOURCE,
39
+ version: '$prebid.version$'
40
+ },
41
+ schain: schain
42
+ };
43
+ return formatRequest(payload, bidderRequest);
44
+ },
45
+
46
+ /**
47
+ * Unpack the response from the server into a list of bids.
48
+ *
49
+ * @param {*} serverResponse A successful response from the server.
50
+ * @return {Bid[]} An array of bids which were nested inside the server.
51
+ */
52
+ interpretResponse: function(serverResponse, { bidderRequest }) {
53
+ serverResponse = serverResponse.body;
54
+ const bids = [];
55
+
56
+ if (serverResponse.tags) {
57
+ serverResponse.tags.forEach(serverBid => {
58
+ const rtbBid = getRtbBid(serverBid);
59
+ if (rtbBid && rtbBid.cpm !== 0 && rtbBid.ad_type == VIDEO) {
60
+ bids.push(newBid(serverBid, rtbBid, bidderRequest));
61
+ }
62
+ });
63
+ }
64
+
65
+ return bids;
66
+ }
67
+
68
+ }
69
+
70
+ function getSizes(request) {
71
+ let sizes = request.sizes;
72
+ if (!sizes && request.mediaTypes && request.mediaTypes.banner && request.mediaTypes.banner.sizes) {
73
+ sizes = request.mediaTypes.banner.sizes;
74
+ }
75
+ if (Array.isArray(sizes) && !Array.isArray(sizes[0])) {
76
+ sizes = [sizes[0], sizes[1]];
77
+ }
78
+ if (!Array.isArray(sizes) || !Array.isArray(sizes[0])) {
79
+ sizes = [[0, 0]];
80
+ }
81
+
82
+ return sizes;
83
+ }
84
+
85
+ function formatRequest(payload, bidderRequest) {
86
+ const options = {
87
+ withCredentials: true
88
+ };
89
+ const request = {
90
+ method: 'POST',
91
+ url: ENDPOINT_URL,
92
+ data: JSON.stringify(payload),
93
+ bidderRequest,
94
+ options
95
+ };
96
+
97
+ return request;
98
+ }
99
+
100
+ /**
101
+ * Create video auction.
102
+ *
103
+ * @param {*} serverResponse A successful response from the server.
104
+ * @return {Bid[]} An array of bids which were nested inside the server.
105
+ */
106
+ function createVideoTag(bid) {
107
+ const tag = {};
108
+ tag.id = parseInt(bid.params.placementId, 10);
109
+ tag.gpid = 'targetVideo';
110
+ tag.sizes = getSizes(bid);
111
+ tag.primary_size = tag.sizes[0];
112
+ tag.ad_types = [VIDEO];
113
+ tag.uuid = bid.bidId;
114
+ tag.allow_smaller_sizes = false;
115
+ tag.use_pmt_rule = false
116
+ tag.prebid = true;
117
+ tag.disable_psa = true;
118
+ tag.hb_source = 1;
119
+ tag.require_asset_url = true;
120
+ tag.video = {
121
+ playback_method: 2,
122
+ skippable: true
123
+ };
124
+
125
+ return tag;
126
+ }
127
+
128
+ /**
129
+ * Unpack the Server's Bid into a Prebid-compatible one.
130
+ * @param serverBid
131
+ * @param rtbBid
132
+ * @param bidderRequest
133
+ * @return Bid
134
+ */
135
+ function newBid(serverBid, rtbBid, bidderRequest) {
136
+ const bidRequest = getBidRequest(serverBid.uuid, [bidderRequest]);
137
+ const sizes = getSizes(bidRequest);
138
+ const bid = {
139
+ requestId: serverBid.uuid,
140
+ cpm: rtbBid.cpm * MARGIN,
141
+ creativeId: rtbBid.creative_id,
142
+ dealId: rtbBid.deal_id,
143
+ currency: 'USD',
144
+ netRevenue: true,
145
+ width: sizes[0][0],
146
+ height: sizes[0][1],
147
+ ttl: 300,
148
+ adUnitCode: bidRequest.adUnitCode,
149
+ appnexus: {
150
+ buyerMemberId: rtbBid.buyer_member_id,
151
+ dealPriority: rtbBid.deal_priority,
152
+ dealCode: rtbBid.deal_code
153
+ }
154
+ };
155
+
156
+ if (rtbBid.rtb.video) {
157
+ Object.assign(bid, {
158
+ vastImpUrl: rtbBid.notify_url,
159
+ ad: getBannerHtml(rtbBid.notify_url + '&redir=' + encodeURIComponent(rtbBid.rtb.video.asset_url)),
160
+ ttl: 3600
161
+ });
162
+ }
163
+
164
+ return bid;
165
+ }
166
+
167
+ function getRtbBid(tag) {
168
+ return tag && tag.ads && tag.ads.length && find(tag.ads, ad => ad.rtb);
169
+ }
170
+
171
+ function getBannerHtml(vastUrl) {
172
+ return `<!DOCTYPE html>
173
+ <html lang="en">
174
+ <head>
175
+ <meta charset="UTF-8">
176
+ <title></title>
177
+ <style>html, body {width: 100%; height: 100%; margin: 0;}</style>
178
+ </head>
179
+ <body>
180
+ <div id="targetVideoPlayer"></div>
181
+ <script src="https://player.target-video.com/custom/targetvideo-banner.js"></script>
182
+ <script>initPlayer("${vastUrl}");</script>
183
+ </body>
184
+ </html>`;
185
+ }
186
+
187
+ registerBidder(spec);
@@ -0,0 +1,34 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: Target Video Bid Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: grajzer@gmail.com
7
+ ```
8
+
9
+ # Description
10
+
11
+ Connects to Appnexus exchange for bids.
12
+
13
+ TargetVideo bid adapter supports Banner.
14
+
15
+ # Test Parameters
16
+ ```
17
+ var adUnits = [
18
+ // Banner adUnit
19
+ {
20
+ code: 'banner-div',
21
+ mediaTypes: {
22
+ banner: {
23
+ sizes: [[640, 480], [300, 250]],
24
+ }
25
+ },
26
+ bids: [{
27
+ bidder: 'targetVideo',
28
+ params: {
29
+ placementId: 13232361
30
+ }
31
+ }]
32
+ }
33
+ ];
34
+ ```
@@ -2,7 +2,7 @@ import { logError, isEmpty, deepAccess, triggerPixel, logWarn, isArray } from '.
2
2
  import {createBid as createBidFactory} from '../src/bidfactory.js';
3
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
4
  import {VIDEO} from '../src/mediaTypes.js';
5
- import {STATUS} from '../src/constants.json';
5
+ import CONSTANTS from '../src/constants.json';
6
6
 
7
7
  const BIDDER_CODE = 'telaria';
8
8
  const DOMAIN = 'tremorhub.com';
@@ -86,7 +86,7 @@ export const spec = {
86
86
  logError(errorMessage);
87
87
  } else if (!isEmpty(bidResult.seatbid)) {
88
88
  bidResult.seatbid[0].bid.forEach(tag => {
89
- bids.push(createBid(STATUS.GOOD, bidderRequest, tag, width, height, BIDDER_CODE));
89
+ bids.push(createBid(CONSTANTS.STATUS.GOOD, bidderRequest, tag, width, height, BIDDER_CODE));
90
90
  });
91
91
  }
92
92
 
@@ -6,9 +6,8 @@ import { config } from '../src/config.js';
6
6
 
7
7
  const BIDDER_CODE = 'trustx';
8
8
  const ENDPOINT_URL = 'https://grid.bidswitch.net/hbjson?sp=trustx';
9
- const ADDITIONAL_SYNC_URL = 'https://x.bidswitch.net/sync?ssp=themediagrid';
10
9
  const TIME_TO_LIVE = 360;
11
- const ADAPTER_SYNC_URL = 'https://sofia.trustx.org/push_sync';
10
+ const ADAPTER_SYNC_URL = 'https://x.bidswitch.net/sync?ssp=themediagrid';
12
11
  const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
13
12
 
14
13
  const LOG_ERROR_MESS = {
@@ -281,12 +280,12 @@ export const spec = {
281
280
  },
282
281
  getUserSyncs: function(syncOptions, responses, gdprConsent, uspConsent) {
283
282
  if (syncOptions.pixelEnabled) {
284
- const syncsPerBidder = config.getConfig('userSync.syncsPerBidder');
285
283
  let params = [];
286
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
284
+ if (gdprConsent) {
287
285
  if (typeof gdprConsent.gdprApplies === 'boolean') {
288
- params.push(`gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`);
289
- } else {
286
+ params.push(`gdpr=${Number(gdprConsent.gdprApplies)}`);
287
+ }
288
+ if (typeof gdprConsent.consentString === 'string') {
290
289
  params.push(`gdpr_consent=${gdprConsent.consentString}`);
291
290
  }
292
291
  }
@@ -294,17 +293,10 @@ export const spec = {
294
293
  params.push(`us_privacy=${uspConsent}`);
295
294
  }
296
295
  const stringParams = params.join('&');
297
- const syncs = [{
296
+ return {
298
297
  type: 'image',
299
- url: ADAPTER_SYNC_URL + (stringParams ? `?${stringParams}` : '')
300
- }];
301
- if (syncsPerBidder > 1) {
302
- syncs.push({
303
- type: 'image',
304
- url: ADDITIONAL_SYNC_URL + (stringParams ? `&${stringParams}` : '')
305
- });
306
- }
307
- return syncs;
298
+ url: ADAPTER_SYNC_URL + stringParams
299
+ };
308
300
  }
309
301
  }
310
302
  }
@@ -98,9 +98,16 @@ export const spec = {
98
98
  'commons': commons
99
99
  };
100
100
  const referer = bidderRequest.refererInfo.referer;
101
+ const canonicalUrl = getCanonicalUrl();
102
+ if (referer) {
103
+ commons.referrer = referer;
104
+ }
105
+ if (canonicalUrl) {
106
+ commons.canonicalUrl = canonicalUrl;
107
+ }
101
108
  const hostname = parseUrl(referer).hostname;
102
109
  let domain = extractDomainFromHost(hostname);
103
- const pageUrl = getCanonicalUrl() || referer;
110
+ const pageUrl = canonicalUrl || referer;
104
111
 
105
112
  const pubid = validBidRequests[0].params.publisherId;
106
113
  let reqUrl = `${URL}?pid=${pubid}&domain=${domain}`;
@@ -141,7 +141,7 @@ import { createEidsArray, buildEidPermissions } from './eids.js';
141
141
  import { getCoreStorageManager } from '../../src/storageManager.js';
142
142
  import {
143
143
  getPrebidInternal, isPlainObject, logError, isArray, cyrb53Hash, deepAccess, timestamp, delayExecution, logInfo, isFn,
144
- logWarn, isEmptyStr, isNumber
144
+ logWarn, isEmptyStr, isNumber, isGptPubadsDefined
145
145
  } from '../../src/utils.js';
146
146
  import includes from 'core-js-pure/features/array/includes.js';
147
147
 
@@ -184,6 +184,9 @@ export let syncDelay;
184
184
  /** @type {(number|undefined)} */
185
185
  export let auctionDelay;
186
186
 
187
+ /** @type {(string|undefined)} */
188
+ let ppidSource;
189
+
187
190
  /** @param {Submodule[]} submodules */
188
191
  export function setSubmoduleRegistry(submodules) {
189
192
  submoduleRegistry = submodules;
@@ -557,6 +560,26 @@ export function requestBidsHook(fn, reqBidsConfigObj) {
557
560
  initializeSubmodulesAndExecuteCallbacks(function () {
558
561
  // pass available user id data to bid adapters
559
562
  addIdDataToAdUnitBids(reqBidsConfigObj.adUnits || getGlobal().adUnits, initializedSubmodules);
563
+
564
+ // userSync.ppid should be one of the 'source' values in getUserIdsAsEids() eg pubcid.org or id5-sync.com
565
+ const matchingUserId = ppidSource && (getUserIdsAsEids() || []).find(userID => userID.source === ppidSource);
566
+ if (matchingUserId && typeof deepAccess(matchingUserId, 'uids.0.id') === 'string') {
567
+ const ppidValue = matchingUserId.uids[0].id.replace(/[\W_]/g, '');
568
+ if (ppidValue.length >= 32 && ppidValue.length <= 150) {
569
+ if (isGptPubadsDefined()) {
570
+ window.googletag.pubads().setPublisherProvidedId(ppidValue);
571
+ } else {
572
+ window.googletag = window.googletag || {};
573
+ window.googletag.cmd = window.googletag.cmd || [];
574
+ window.googletag.cmd.push(function() {
575
+ window.googletag.pubads().setPublisherProvidedId(ppidValue);
576
+ });
577
+ }
578
+ } else {
579
+ logWarn(`User ID - Googletag Publisher Provided ID for ${ppidSource} is not between 32 and 150 characters - ${ppidValue}`);
580
+ }
581
+ }
582
+
560
583
  // calling fn allows prebid to continue processing
561
584
  fn.call(this, reqBidsConfigObj);
562
585
  });
@@ -817,6 +840,7 @@ export function attachIdSystem(submodule) {
817
840
  * @param {{getConfig:function}} config
818
841
  */
819
842
  export function init(config) {
843
+ ppidSource = undefined;
820
844
  submodules = [];
821
845
  configRegistry = [];
822
846
  addedUserIdHook = false;
@@ -839,9 +863,10 @@ export function init(config) {
839
863
  }
840
864
 
841
865
  // listen for config userSyncs to be set
842
- config.getConfig(conf => {
866
+ config.getConfig('userSync', conf => {
843
867
  // Note: support for 'usersync' was dropped as part of Prebid.js 4.0
844
868
  const userSync = conf.userSync;
869
+ ppidSource = userSync.ppid;
845
870
  if (userSync && userSync.userIds) {
846
871
  configRegistry = userSync.userIds;
847
872
  syncDelay = isNumber(userSync.syncDelay) ? userSync.syncDelay : DEFAULT_SYNC_DELAY;
@@ -0,0 +1,71 @@
1
+ ---
2
+ layout: bidder
3
+ title: ventes
4
+ description: Prebid ventes Bidder Adapter
5
+ pbjs: false
6
+ biddercode: ventes
7
+ gdpr_supported: false
8
+ usp_supported: false
9
+ media_types: banner
10
+ coppa_supported: false
11
+ schain_supported: false
12
+ dchain_supported: false
13
+ prebid_member: false
14
+ ---
15
+
16
+ ### BidParams
17
+ {: .table .table-bordered .table-striped }
18
+ | Name | Scope | Description | Example | Type |
19
+ |-----------------|----------|-----------------------------------------------------------|----------------------------------------------|---------------|
20
+ | `placementId` | required | Placement ID from Ventes Avenues | `'VA-062-0013-0183'` | `string` |
21
+ | `publisherId` | required | Publisher ID from Ventes Avenues | `'VA-062'` | `string` |
22
+ | `user` | optional | Object that specifies information about an external user. | `user: { age: 25, gender: 0, dnt: true}` | `object` |
23
+ | `app` | optional | Object containing mobile app parameters. | `app : { id: 'app-id'}` | `object` |
24
+
25
+ #### User Object
26
+
27
+ {: .table .table-bordered .table-striped }
28
+ | Name | Description | Example | Type |
29
+ |-------------------|-------------------------------------------------------------------------------------------|-----------------------|-----------------------|
30
+ | `age` | The age of the user. | `35` | `integer` |
31
+ | `externalUid` | Specifies a string that corresponds to an external user ID for this user. | `'1234567890abcdefg'` | `string` |
32
+ | `segments` | Specifies the segments to which the user belongs. | `[1, 2]` | `Array<integer>` |
33
+ | `gender` | Specifies the gender of the user. Allowed values: Unknown: `0`; Male: `1`; Female: `2` | `1` | `integer` |
34
+ | `dnt` | Do not track flag. Indicates if tracking cookies should be disabled for this auction | `true` | `boolean` |
35
+ | `language` | Two-letter ANSI code for this user's language. | `EN` | `string` |
36
+
37
+
38
+ ### Ad Unit Setup for Banner
39
+ ```javascript
40
+ var adUnits = [
41
+ {
42
+ code: 'test-hb-ad-11111-1',
43
+ mediaTypes: {
44
+ banner: {
45
+ sizes: [
46
+ [300, 250]
47
+ ]
48
+ }
49
+ },
50
+ bids: [{
51
+ bidder: 'ventes',
52
+ params: {
53
+ placementId: 'VA-062-0013-0183',
54
+ publisherId: '5cebea3c9eea646c7b623d5e',
55
+ IABCategories: "['IAB1', 'IAB5']",
56
+ device:{
57
+ ip: '123.145.167.189',
58
+ ifa:"AEBE52E7-03EE-455A-B3C4-E57283966239",
59
+ },
60
+ app: {
61
+ id: "agltb3B1Yi1pbmNyDAsSA0FwcBiJkfIUDA",
62
+ name: "Yahoo Weather",
63
+ bundle: 'com.kiloo.subwaysurf',
64
+ storeurl: 'https://play.google.com/store/apps/details?id=com.kiloo.subwaysurf&hl=en',
65
+ domain: 'somoaudience.com',
66
+ }
67
+ }
68
+ }]
69
+ }
70
+ ]
71
+ ```