prebid.js 5.16.0 → 5.20.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 (182) hide show
  1. package/.devcontainer/Dockerfile +11 -0
  2. package/.devcontainer/devcontainer.json +27 -0
  3. package/.devcontainer/postCreate.sh +6 -0
  4. package/browsers.json +1 -0
  5. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  6. package/modules/.submodules.json +1 -0
  7. package/modules/adfBidAdapter.js +21 -16
  8. package/modules/adgenerationBidAdapter.js +28 -4
  9. package/modules/adkernelBidAdapter.js +3 -1
  10. package/modules/admixerBidAdapter.js +11 -0
  11. package/modules/adnuntiusBidAdapter.js +1 -0
  12. package/modules/adtelligentBidAdapter.js +2 -1
  13. package/modules/airgridRtdProvider.js +1 -1
  14. package/modules/akamaiDapRtdProvider.js +474 -0
  15. package/modules/akamaiDapRtdProvider.md +47 -0
  16. package/modules/aolBidAdapter.js +2 -1
  17. package/modules/appnexusBidAdapter.js +5 -3
  18. package/modules/atsAnalyticsAdapter.js +89 -63
  19. package/modules/atsAnalyticsAdapter.md +1 -0
  20. package/modules/betweenBidAdapter.js +20 -3
  21. package/modules/bliinkBidAdapter.js +58 -32
  22. package/modules/bliinkBidAdapter.md +29 -6
  23. package/modules/browsiRtdProvider.js +106 -18
  24. package/modules/cleanioRtdProvider.js +192 -0
  25. package/modules/cleanioRtdProvider.md +59 -0
  26. package/modules/codefuelBidAdapter.js +183 -0
  27. package/modules/codefuelBidAdapter.md +111 -0
  28. package/modules/connectIdSystem.js +104 -0
  29. package/modules/connectIdSystem.md +33 -0
  30. package/modules/cwireBidAdapter.js +272 -0
  31. package/modules/cwireBidAdapter.md +43 -0
  32. package/modules/deepintentBidAdapter.js +106 -9
  33. package/modules/deepintentBidAdapter.md +36 -1
  34. package/modules/deltaprojectsBidAdapter.js +252 -0
  35. package/modules/deltaprojectsBidAdapter.md +32 -0
  36. package/modules/dgkeywordRtdProvider.js +0 -1
  37. package/modules/engageyaBidAdapter.js +157 -0
  38. package/modules/glimpseBidAdapter.js +160 -48
  39. package/modules/glimpseBidAdapter.md +11 -74
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gridNMBidAdapter.js +7 -6
  42. package/modules/gumgumBidAdapter.js +16 -2
  43. package/modules/iasRtdProvider.js +83 -67
  44. package/modules/inskinBidAdapter.js +7 -3
  45. package/modules/ixBidAdapter.js +8 -1
  46. package/modules/jixieBidAdapter.js +8 -2
  47. package/modules/justpremiumBidAdapter.js +6 -1
  48. package/modules/kargoBidAdapter.js +14 -7
  49. package/modules/kargoBidAdapter.md +20 -0
  50. package/modules/limelightDigitalBidAdapter.js +22 -2
  51. package/modules/livewrappedAnalyticsAdapter.js +53 -3
  52. package/modules/mediakeysBidAdapter.js +405 -14
  53. package/modules/mediakeysBidAdapter.md +108 -0
  54. package/modules/multibid/index.js +3 -3
  55. package/modules/mytargetBidAdapter.js +112 -0
  56. package/modules/nativoBidAdapter.js +48 -29
  57. package/modules/nativoBidAdapter.md +0 -1
  58. package/modules/nextMillenniumBidAdapter.js +12 -3
  59. package/modules/nextrollBidAdapter.js +375 -0
  60. package/modules/nobidBidAdapter.js +2 -1
  61. package/modules/oguryBidAdapter.js +36 -7
  62. package/modules/openxBidAdapter.js +34 -22
  63. package/modules/operaadsBidAdapter.js +21 -1
  64. package/modules/otmBidAdapter.js +146 -0
  65. package/modules/otmBidAdapter.md +27 -26
  66. package/modules/outbrainBidAdapter.js +5 -0
  67. package/modules/pixfutureBidAdapter.js +24 -4
  68. package/modules/pixfutureBidAdapter.md +127 -0
  69. package/modules/playwireBidAdapter.md +61 -0
  70. package/modules/prebidServerBidAdapter/index.js +1 -1
  71. package/modules/proxistoreBidAdapter.js +4 -6
  72. package/modules/publinkIdSystem.js +17 -7
  73. package/modules/publinkIdSystem.md +7 -2
  74. package/modules/pubmaticBidAdapter.js +22 -6
  75. package/modules/pubmaticBidAdapter.md +1 -1
  76. package/modules/relaidoBidAdapter.js +8 -2
  77. package/modules/rtdModule/index.js +2 -2
  78. package/modules/sharethroughBidAdapter.js +12 -19
  79. package/modules/slimcutBidAdapter.js +121 -0
  80. package/modules/sonobiBidAdapter.js +7 -0
  81. package/modules/sortableBidAdapter.js +1 -0
  82. package/modules/spotxBidAdapter.js +15 -1
  83. package/modules/sspBCBidAdapter.js +207 -12
  84. package/modules/sspBCBidAdapter.md +1 -1
  85. package/modules/talkadsBidAdapter.js +129 -0
  86. package/modules/talkadsBidAdapter.md +60 -0
  87. package/modules/tappxBidAdapter.js +6 -5
  88. package/modules/teadsBidAdapter.js +3 -0
  89. package/modules/tripleliftBidAdapter.js +22 -5
  90. package/modules/trustxBidAdapter.js +17 -11
  91. package/modules/undertoneBidAdapter.js +9 -5
  92. package/modules/undertoneBidAdapter.md +5 -1
  93. package/modules/unicornBidAdapter.js +3 -3
  94. package/modules/userId/eids.js +18 -0
  95. package/modules/userId/eids.md +7 -0
  96. package/modules/userId/userId.md +12 -0
  97. package/modules/ventesBidAdapter.js +370 -0
  98. package/modules/ventesBidAdapter.md +94 -0
  99. package/modules/videobyteBidAdapter.js +13 -6
  100. package/modules/videobyteBidAdapter.md +49 -0
  101. package/modules/vidoomyBidAdapter.js +20 -12
  102. package/modules/visxBidAdapter.js +15 -22
  103. package/modules/yahoosspBidAdapter.js +637 -0
  104. package/modules/yahoosspBidAdapter.md +795 -0
  105. package/modules/yieldlabBidAdapter.js +48 -3
  106. package/modules/yieldlabBidAdapter.md +16 -1
  107. package/modules/yieldmoBidAdapter.js +20 -6
  108. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  109. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  110. package/package.json +1 -1
  111. package/src/adapterManager.js +5 -0
  112. package/src/adapters/bidderFactory.js +4 -3
  113. package/src/auction.js +11 -11
  114. package/src/constants.json +1 -0
  115. package/src/secureCreatives.js +6 -7
  116. package/src/targeting.js +11 -9
  117. package/test/.eslintrc.js +2 -1
  118. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  119. package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
  120. package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
  121. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  122. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  123. package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
  124. package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
  125. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  126. package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
  127. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  128. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  129. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  130. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  131. package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
  132. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  133. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  134. package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
  135. package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
  136. package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
  137. package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
  138. package/test/spec/modules/iasRtdProvider_spec.js +71 -6
  139. package/test/spec/modules/ixBidAdapter_spec.js +13 -3
  140. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  141. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  142. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  143. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
  144. package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
  145. package/test/spec/modules/multibid_spec.js +31 -31
  146. package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
  147. package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
  148. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  149. package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
  150. package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
  151. package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
  152. package/test/spec/modules/openxBidAdapter_spec.js +85 -13
  153. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  154. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  155. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  156. package/test/spec/modules/publinkIdSystem_spec.js +34 -15
  157. package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
  158. package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
  159. package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
  160. package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
  161. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  162. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  163. package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
  164. package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
  165. package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
  166. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  167. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  168. package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
  169. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  170. package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
  171. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  172. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  173. package/test/spec/modules/visxBidAdapter_spec.js +48 -4
  174. package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
  175. package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
  176. package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
  177. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  178. package/test/spec/unit/core/adapterManager_spec.js +32 -0
  179. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  180. package/test/spec/unit/pbjs_api_spec.js +37 -2
  181. package/test/spec/unit/secureCreatives_spec.js +54 -25
  182. package/modules/turktelekomBidAdapter.md +0 -49
@@ -256,27 +256,14 @@ function buildCommonQueryParamsFromBids(bids, bidderRequest) {
256
256
  nocache: new Date().getTime()
257
257
  };
258
258
 
259
- const firstPartyData = config.getConfig('ortb2.user.data')
260
- if (Array.isArray(firstPartyData) && firstPartyData.length > 0) {
261
- // extract and merge valid segments by provider/taxonomy
262
- const fpd = firstPartyData
263
- .filter(
264
- data => (Array.isArray(data.segment) &&
265
- data.segment.length > 0 &&
266
- data.name !== undefined &&
267
- data.name.length > 0)
268
- )
269
- .reduce((acc, data) => {
270
- const name = typeof data.ext === 'object' && data.ext.segtax ? `${data.name}/${data.ext.segtax}` : data.name;
271
- acc[name] = (acc[name] || []).concat(data.segment.map(seg => seg.id));
272
- return acc;
273
- }, {})
274
- const sm = Object.keys(fpd)
275
- .map((name, _) => name + ':' + fpd[name].join('|'))
276
- .join(',')
277
- if (sm.length > 0) {
278
- defaultParams.sm = encodeURIComponent(sm);
279
- }
259
+ const userDataSegments = buildFpdQueryParams('ortb2.user.data');
260
+ if (userDataSegments.length > 0) {
261
+ defaultParams.sm = userDataSegments;
262
+ }
263
+
264
+ const siteContentDataSegments = buildFpdQueryParams('ortb2.site.content.data');
265
+ if (siteContentDataSegments.length > 0) {
266
+ defaultParams.scsm = siteContentDataSegments;
280
267
  }
281
268
 
282
269
  if (bids[0].params.platform) {
@@ -317,12 +304,37 @@ function buildCommonQueryParamsFromBids(bids, bidderRequest) {
317
304
  return defaultParams;
318
305
  }
319
306
 
307
+ function buildFpdQueryParams(fpdPath) {
308
+ const firstPartyData = config.getConfig(fpdPath);
309
+ if (!Array.isArray(firstPartyData) || !firstPartyData.length) {
310
+ return '';
311
+ }
312
+ const fpd = firstPartyData
313
+ .filter(
314
+ data => (Array.isArray(data.segment) &&
315
+ data.segment.length > 0 &&
316
+ data.name !== undefined &&
317
+ data.name.length > 0)
318
+ )
319
+ .reduce((acc, data) => {
320
+ const name = typeof data.ext === 'object' && data.ext.segtax ? `${data.name}/${data.ext.segtax}` : data.name;
321
+ acc[name] = (acc[name] || []).concat(data.segment.map(seg => seg.id));
322
+ return acc;
323
+ }, {})
324
+ return Object.keys(fpd)
325
+ .map((name, _) => name + ':' + fpd[name].join('|'))
326
+ .join(',')
327
+ }
328
+
320
329
  function appendUserIdsToQueryParams(queryParams, userIds) {
321
330
  _each(userIds, (userIdObjectOrValue, userIdProviderKey) => {
322
331
  const key = USER_ID_CODE_TO_QUERY_ARG[userIdProviderKey];
323
332
 
324
333
  if (USER_ID_CODE_TO_QUERY_ARG.hasOwnProperty(userIdProviderKey)) {
325
334
  switch (userIdProviderKey) {
335
+ case 'merkleId':
336
+ queryParams[key] = userIdObjectOrValue.id;
337
+ break;
326
338
  case 'flocId':
327
339
  queryParams[key] = userIdObjectOrValue.id;
328
340
  break;
@@ -333,7 +345,7 @@ function appendUserIdsToQueryParams(queryParams, userIds) {
333
345
  queryParams[key] = userIdObjectOrValue.lipbid;
334
346
  if (Array.isArray(userIdObjectOrValue.segments) && userIdObjectOrValue.segments.length > 0) {
335
347
  const liveIntentSegments = 'liveintent:' + userIdObjectOrValue.segments.join('|')
336
- queryParams.sm = `${queryParams.sm ? queryParams.sm + encodeURIComponent(',') : ''}${encodeURIComponent(liveIntentSegments)}`;
348
+ queryParams.sm = `${queryParams.sm ? queryParams.sm + ',' : ''}${liveIntentSegments}`;
337
349
  }
338
350
  break;
339
351
  case 'parrableId':
@@ -8,6 +8,7 @@ import { OUTSTREAM } from '../src/video.js';
8
8
  const BIDDER_CODE = 'operaads';
9
9
 
10
10
  const ENDPOINT = 'https://s.adx.opera.com/ortb/v2/';
11
+ const USER_SYNC_ENDPOINT = 'https://s.adx.opera.com/usersync/page';
11
12
 
12
13
  const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
13
14
 
@@ -137,6 +138,25 @@ export const spec = {
137
138
  * @return {UserSync[]} The user syncs which should be dropped.
138
139
  */
139
140
  getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) {
141
+ if ('iframeEnabled' in syncOptions && syncOptions.iframeEnabled) {
142
+ return [{
143
+ type: 'iframe',
144
+ url: USER_SYNC_ENDPOINT
145
+ }];
146
+ }
147
+ if ('pixelEnabled' in syncOptions && syncOptions.pixelEnabled) {
148
+ const pixels = deepAccess(serverResponses, '0.body.pixels')
149
+ if (Array.isArray(pixels)) {
150
+ const userSyncPixels = []
151
+ for (const pixel of pixels) {
152
+ userSyncPixels.push({
153
+ type: 'image',
154
+ url: pixel
155
+ })
156
+ }
157
+ return userSyncPixels;
158
+ }
159
+ }
140
160
  return [];
141
161
  },
142
162
 
@@ -212,7 +232,7 @@ function buildOpenRtbBidRequest(bidRequest, bidderRequest) {
212
232
  ext: {}
213
233
  },
214
234
  user: {
215
- id: getUserId(bidRequest)
235
+ buyeruid: getUserId(bidRequest)
216
236
  }
217
237
  }
218
238
 
@@ -0,0 +1,146 @@
1
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
2
+ import {logInfo, logError, getBidIdParameter, _each, getValue, isFn, isPlainObject} from '../src/utils.js';
3
+ import { BANNER } from '../src/mediaTypes.js';
4
+
5
+ const BIDDER_CODE = 'otm';
6
+ const OTM_BID_URL = 'https://ssp.otm-r.com/adjson';
7
+ const DEF_CUR = 'RUB'
8
+
9
+ export const spec = {
10
+
11
+ code: BIDDER_CODE,
12
+ url: OTM_BID_URL,
13
+ supportedMediaTypes: [ BANNER ],
14
+
15
+ /**
16
+ * Determines whether or not the given bid request is valid.
17
+ *
18
+ * @param {object} bid The bid to validate.
19
+ * @return boolean True if this is a valid bid, and false otherwise.
20
+ */
21
+ isBidRequestValid: function (bid) {
22
+ return !!bid.params.tid;
23
+ },
24
+
25
+ /**
26
+ * Build bidder requests.
27
+ *
28
+ * @param validBidRequests
29
+ * @param bidderRequest
30
+ * @returns {[]}
31
+ */
32
+ buildRequests: function (validBidRequests, bidderRequest) {
33
+ logInfo('validBidRequests', validBidRequests);
34
+
35
+ const bidRequests = [];
36
+ let tz = new Date().getTimezoneOffset()
37
+ let referrer = '';
38
+ if (bidderRequest && bidderRequest.refererInfo) {
39
+ referrer = bidderRequest.refererInfo.referer;
40
+ }
41
+
42
+ _each(validBidRequests, (bid) => {
43
+ let domain = getValue(bid.params, 'domain') || ''
44
+ let tid = getValue(bid.params, 'tid')
45
+ let cur = getValue(bid.params, 'currency') || DEF_CUR
46
+ let bidid = getBidIdParameter('bidId', bid)
47
+ let transactionid = getBidIdParameter('transactionId', bid)
48
+ let auctionid = getBidIdParameter('auctionId', bid)
49
+ let bidfloor = _getBidFloor(bid)
50
+
51
+ _each(bid.sizes, size => {
52
+ let width = 0;
53
+ let height = 0;
54
+ if (size.length && typeof size[0] === 'number' && typeof size[1] === 'number') {
55
+ width = size[0];
56
+ height = size[1];
57
+ }
58
+ bidRequests.push({
59
+ method: 'GET',
60
+ url: OTM_BID_URL,
61
+ data: {
62
+ tz: tz,
63
+ w: width,
64
+ h: height,
65
+ domain: domain,
66
+ l: referrer,
67
+ s: tid,
68
+ cur: cur,
69
+ bidid: bidid,
70
+ transactionid: transactionid,
71
+ auctionid: auctionid,
72
+ bidfloor: bidfloor,
73
+ },
74
+ })
75
+ })
76
+ })
77
+ return bidRequests;
78
+ },
79
+
80
+ /**
81
+ * Generate response.
82
+ *
83
+ * @param serverResponse
84
+ * @param request
85
+ * @returns {[]|*[]}
86
+ */
87
+ interpretResponse: function (serverResponse, request) {
88
+ logInfo('serverResponse', serverResponse.body);
89
+
90
+ const responsesBody = serverResponse ? serverResponse.body : {};
91
+ const bidResponses = [];
92
+ try {
93
+ if (responsesBody.length === 0) {
94
+ return [];
95
+ }
96
+
97
+ _each(responsesBody, (bid) => {
98
+ if (bid.ad) {
99
+ bidResponses.push({
100
+ requestId: bid.bidid,
101
+ cpm: bid.cpm,
102
+ width: bid.w,
103
+ height: bid.h,
104
+ creativeId: bid.creativeid,
105
+ currency: bid.currency || 'RUB',
106
+ netRevenue: true,
107
+ ad: bid.ad,
108
+ ttl: bid.ttl,
109
+ transactionId: bid.transactionid,
110
+ meta: {
111
+ advertiserDomains: bid.adDomain ? [bid.adDomain] : []
112
+ }
113
+ });
114
+ }
115
+ });
116
+ } catch (error) {
117
+ logError(error);
118
+ }
119
+
120
+ return bidResponses;
121
+ }
122
+ };
123
+
124
+ /**
125
+ * Get floor value
126
+ * @param bid
127
+ * @returns {null|*}
128
+ * @private
129
+ */
130
+ function _getBidFloor(bid) {
131
+ if (!isFn(bid.getFloor)) {
132
+ return bid.params.bidfloor ? bid.params.bidfloor : 0;
133
+ }
134
+
135
+ let floor = bid.getFloor({
136
+ currency: DEF_CUR,
137
+ mediaType: '*',
138
+ size: '*'
139
+ });
140
+ if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEF_CUR) {
141
+ return floor.floor;
142
+ }
143
+ return 0;
144
+ }
145
+
146
+ registerBidder(spec);
@@ -1,36 +1,37 @@
1
1
  # Overview
2
2
 
3
- Module Name: OTM Bidder Adapter
4
- Module Type: Bidder Adapter
5
- Maintainer: ?
3
+ **Module Name**: OTM Bidder Adapter
4
+ **Module Type**: Bidder Adapter
5
+ **Maintainer**: e.kretsu@otm-r.com
6
6
 
7
7
  # Description
8
8
 
9
- You can use this adapter to get a bid from otm-r.com.
9
+ OTM Bidder Adapter for Prebid.js. About: https://otm-r.com
10
10
 
11
- About us : http://otm-r.com
11
+ Use `otm` as bidder:
12
12
 
13
+ # Params
14
+ - `tid` required, specific id AdUnit slot.
15
+ - `domain` optional, specific custom domain.
16
+ - `bidfloor` optional.
13
17
 
14
- # Test Parameters
15
- ```javascript
16
- var adUnits = [
17
- {
18
- code: 'div-otm-example',
19
- sizes: [[320, 480]],
20
- bids: [
21
- {
22
- bidder: "otm",
23
- params: {
24
- tid: "99",
25
- bidfloor: 20
26
- }
27
- }
28
- ]
29
- }
30
- ];
18
+ ## AdUnits configuration example
31
19
  ```
20
+ var adUnits = [{
21
+ code: 'your-slot', //use exactly the same code as your slot div id.
22
+ mediaTypes: {
23
+ banner: {
24
+ sizes: [[320, 480]]
25
+ }
26
+ },
27
+ bids: [{
28
+ bidder: 'otm',
29
+ params: {
30
+ tid: 'XXXXX',
31
+ domain: 'specific custom domain, if needed',
32
+ bidfloor: 20
33
+ }
34
+ }]
35
+ }];
32
36
 
33
- Where:
34
-
35
- * tid - A tag id (should have low cardinality)
36
- * bidfloor - Floor price
37
+ ```
@@ -40,6 +40,7 @@ export const spec = {
40
40
  const publisher = setOnAny(validBidRequests, 'params.publisher');
41
41
  const bcat = setOnAny(validBidRequests, 'params.bcat');
42
42
  const badv = setOnAny(validBidRequests, 'params.badv');
43
+ const eids = setOnAny(validBidRequests, 'userIdAsEids')
43
44
  const cur = CURRENCY;
44
45
  const endpointUrl = config.getConfig('outbrain.bidderUrl');
45
46
  const timeout = bidderRequest.timeout;
@@ -105,6 +106,10 @@ export const spec = {
105
106
  deepSetValue(request, 'regs.coppa', config.getConfig('coppa') & 1)
106
107
  }
107
108
 
109
+ if (eids) {
110
+ deepSetValue(request, 'user.ext.eids', eids);
111
+ }
112
+
108
113
  return {
109
114
  method: 'POST',
110
115
  url: endpointUrl,
@@ -1,9 +1,9 @@
1
- import { convertCamelToUnderscore, isArray, isNumber, isPlainObject, deepAccess, isEmpty, transformBidderParamKeywords, isFn } from '../src/utils.js';
2
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
3
2
  import { getStorageManager } from '../src/storageManager.js';
4
3
  import { BANNER } from '../src/mediaTypes.js';
5
4
  import { config } from '../src/config.js';
6
5
  import includes from 'core-js-pure/features/array/includes.js';
6
+ import { convertCamelToUnderscore, isArray, isNumber, isPlainObject, deepAccess, isEmpty, transformBidderParamKeywords, isFn } from '../src/utils.js';
7
7
  import { auctionManager } from '../src/auctionManager.js';
8
8
  import find from 'core-js-pure/features/array/find.js';
9
9
 
@@ -12,7 +12,7 @@ const storageManager = getStorageManager();
12
12
  const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
13
13
  export const spec = {
14
14
  code: 'pixfuture',
15
- hostname: 'https://prebid-js.pixfuture.com',
15
+ hostname: 'https://gosrv.pixfuture.com',
16
16
 
17
17
  getHostname() {
18
18
  let ret = this.hostname;
@@ -77,7 +77,7 @@ export const spec = {
77
77
  };
78
78
 
79
79
  if (bidderRequest && bidderRequest.uspConsent) {
80
- payload.us_privacy = bidderRequest.uspConsent
80
+ payload.us_privacy = bidderRequest.uspConsent;
81
81
  }
82
82
 
83
83
  if (bidderRequest && bidderRequest.refererInfo) {
@@ -112,7 +112,7 @@ export const spec = {
112
112
  }
113
113
 
114
114
  const ret = {
115
- url: `${hostname}/`,
115
+ url: `${hostname}/pixservices`,
116
116
  method: 'POST',
117
117
  options: {withCredentials: false},
118
118
  data: {
@@ -153,6 +153,16 @@ export const spec = {
153
153
 
154
154
  return bids;
155
155
  },
156
+ getUserSyncs: function (syncOptions, bid, gdprConsent) {
157
+ var pixid = '';
158
+ if (typeof bid[0] === 'undefined' || bid[0] === null) { pixid = '0'; } else { pixid = bid[0].body.pix_id; }
159
+ if (syncOptions.iframeEnabled && hasPurpose1Consent({gdprConsent})) {
160
+ return [{
161
+ type: 'iframe',
162
+ url: 'https://gosrv.pixfuture.com/cookiesync?adsync=' + gdprConsent.consentString + '&pixid=' + pixid + '&gdprconcent=' + gdprConsent.gdprApplies
163
+ }];
164
+ }
165
+ }
156
166
  };
157
167
 
158
168
  function newBid(serverBid, rtbBid, placementId, uuid) {
@@ -179,6 +189,16 @@ function newBid(serverBid, rtbBid, placementId, uuid) {
179
189
  return bid;
180
190
  }
181
191
 
192
+ function hasPurpose1Consent(bidderRequest) {
193
+ let result = true;
194
+ if (bidderRequest && bidderRequest.gdprConsent) {
195
+ if (bidderRequest.gdprConsent.gdprApplies && bidderRequest.gdprConsent.apiVersion === 2) {
196
+ result = !!(deepAccess(bidderRequest.gdprConsent, 'vendorData.purpose.consents.1') === true);
197
+ }
198
+ }
199
+ return result;
200
+ }
201
+
182
202
  // Functions related optional parameters
183
203
  function bidToTag(bid) {
184
204
  const tag = {};
@@ -25,3 +25,130 @@ var adUnits = [{
25
25
  "pix_id": "Abc123"
26
26
  }];
27
27
  ```
28
+
29
+ # Test Example
30
+ ...
31
+ <html>
32
+
33
+ <head>
34
+ <link rel="icon" type="image/png" href="/favicon.ico">
35
+ <script async src="//www.googletagservices.com/tag/js/gpt.js"></script>
36
+ <script async src="https://cdn.pixfuture.com/pixfuture_prebidjs/prebid.js"></script>
37
+ <script>
38
+ var div_1_sizes = [
39
+ [300, 250],
40
+ [300, 600]
41
+ ];
42
+ var div_2_sizes = [
43
+ [728, 90],
44
+ [970, 250]
45
+ ];
46
+ var PREBID_TIMEOUT = 1000;
47
+ var FAILSAFE_TIMEOUT = 3000;
48
+
49
+ var adUnits = [
50
+ {
51
+ code: '/19968336/header-bid-tag-0',
52
+ mediaTypes: {
53
+ banner: {
54
+ sizes: div_1_sizes
55
+ }
56
+ },
57
+ bids: [{
58
+ bidder: 'pixfuture',
59
+ params: {
60
+ "pix_id": "777"
61
+ }
62
+ }]
63
+ },
64
+ {
65
+ code: '/19968336/header-bid-tag-1',
66
+ mediaTypes: {
67
+ banner: {
68
+ sizes: div_2_sizes
69
+ }
70
+ },
71
+ bids: [{
72
+ bidder: 'appnexus',
73
+ params: {
74
+ placementId: 13144370
75
+ }
76
+ }]
77
+ }
78
+ ];
79
+
80
+ // ======== DO NOT EDIT BELOW THIS LINE =========== //
81
+ var googletag = googletag || {};
82
+ googletag.cmd = googletag.cmd || [];
83
+ googletag.cmd.push(function() {
84
+ googletag.pubads().disableInitialLoad();
85
+ });
86
+
87
+ var pbjs = pbjs || {};
88
+ pbjs.que = pbjs.que || [];
89
+
90
+ pbjs.que.push(function() {
91
+ pbjs.addAdUnits(adUnits);
92
+ pbjs.requestBids({
93
+ bidsBackHandler: initAdserver,
94
+ timeout: PREBID_TIMEOUT
95
+ });
96
+ });
97
+
98
+ function initAdserver() {
99
+ if (pbjs.initAdserverSet) return;
100
+ pbjs.initAdserverSet = true;
101
+ googletag.cmd.push(function() {
102
+ pbjs.que.push(function() {
103
+ pbjs.setTargetingForGPTAsync();
104
+ googletag.pubads().refresh();
105
+ });
106
+ });
107
+ }
108
+ // in case PBJS doesn't load
109
+ setTimeout(function() {
110
+ initAdserver();
111
+ }, FAILSAFE_TIMEOUT);
112
+
113
+ googletag.cmd.push(function() {
114
+ googletag.defineSlot('/19968336/header-bid-tag-0', div_1_sizes, 'div-1').addService(googletag.pubads());
115
+ googletag.pubads().enableSingleRequest();
116
+ googletag.enableServices();
117
+ });
118
+ googletag.cmd.push(function() {
119
+ googletag.defineSlot('/19968336/header-bid-tag-1', div_2_sizes, 'div-2').addService(googletag.pubads());
120
+ googletag.pubads().enableSingleRequest();
121
+ googletag.enableServices();
122
+ });
123
+
124
+ </script>
125
+
126
+ </head>
127
+
128
+ <body>
129
+ <h2>Basic Prebid.js Example</h2>
130
+ <h5>Div-1</h5>
131
+ <div id='div-1'>
132
+ <script type='text/javascript'>
133
+ googletag.cmd.push(function() {
134
+ googletag.display('div-1');
135
+ });
136
+
137
+ </script>
138
+ </div>
139
+
140
+ <br>
141
+
142
+ <h5>Div-2</h5>
143
+ <div id='div-2'>
144
+ <script type='text/javascript'>
145
+ googletag.cmd.push(function() {
146
+ googletag.display('div-2');
147
+ });
148
+
149
+ </script>
150
+ </div>
151
+
152
+ </body>
153
+
154
+ </html>
@@ -0,0 +1,61 @@
1
+ # Overview
2
+
3
+ Module Name: Playwire Bidder Adapter
4
+ Module Type: Bidder Adapter
5
+ Maintainer: grid-tech@themediagrid.com
6
+
7
+ # Description
8
+
9
+ Module that connects to Grid demand source to fetch bids.
10
+ The adapter is GDPR compliant and supports banner and video (instream and outstream).
11
+
12
+ # Test Parameters
13
+ ```
14
+ var adUnits = [
15
+ {
16
+ code: 'test-div',
17
+ sizes: [[300, 250]],
18
+ bids: [
19
+ {
20
+ bidder: "playwire",
21
+ params: {
22
+ uid: '1',
23
+ bidFloor: 0.5
24
+ }
25
+ }
26
+ ]
27
+ },{
28
+ code: 'test-div',
29
+ sizes: [[728, 90]],
30
+ bids: [
31
+ {
32
+ bidder: "playwire",
33
+ params: {
34
+ uid: 2,
35
+ keywords: {
36
+ brandsafety: ['disaster'],
37
+ topic: ['stress', 'fear']
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ code: 'test-div',
45
+ sizes: [[728, 90]],
46
+ mediaTypes: { video: {
47
+ context: 'instream',
48
+ playerSize: [728, 90],
49
+ mimes: ['video/mp4']
50
+ },
51
+ bids: [
52
+ {
53
+ bidder: "playwire",
54
+ params: {
55
+ uid: 11
56
+ }
57
+ }
58
+ ]
59
+ }
60
+ ];
61
+ ```
@@ -799,7 +799,7 @@ const OPEN_RTB_PROTOCOL = {
799
799
  if (requestedBidders && isArray(requestedBidders)) {
800
800
  eidPermissions.forEach(i => {
801
801
  if (i.bidders) {
802
- i.bidders = i.bidders.filter(bidder => requestedBidders.includes(bidder))
802
+ i.bidders = i.bidders.filter(bidder => includes(requestedBidders, bidder))
803
803
  }
804
804
  });
805
805
  }
@@ -4,7 +4,8 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  const BIDDER_CODE = 'proxistore';
5
5
  const PROXISTORE_VENDOR_ID = 418;
6
6
  const COOKIE_BASE_URL = 'https://abs.proxistore.com/v3/rtb/prebid/multi';
7
- const COOKIE_LESS_URL = 'https://abs.cookieless-proxistore.com/v3/rtb/prebid/multi';
7
+ const COOKIE_LESS_URL =
8
+ 'https://abs.cookieless-proxistore.com/v3/rtb/prebid/multi';
8
9
 
9
10
  function _createServerRequest(bidRequests, bidderRequest) {
10
11
  var sizeIds = [];
@@ -181,11 +182,7 @@ function _assignFloor(bid) {
181
182
  size: '*',
182
183
  });
183
184
 
184
- if (
185
- isPlainObject(floor) &&
186
- !isNaN(floor.floor) &&
187
- floor.currency === 'EUR'
188
- ) {
185
+ if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') {
189
186
  return floor.floor;
190
187
  }
191
188
  return null;
@@ -196,6 +193,7 @@ export const spec = {
196
193
  isBidRequestValid: isBidRequestValid,
197
194
  buildRequests: buildRequests,
198
195
  interpretResponse: interpretResponse,
196
+ gvlid: PROXISTORE_VENDOR_ID,
199
197
  };
200
198
 
201
199
  registerBidder(spec);