prebid.js 7.50.0 → 7.52.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 (240) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adhashBidAdapter.js +1 -1
  7. package/dist/adkernelBidAdapter.js +1 -1
  8. package/dist/admanBidAdapter.js +1 -1
  9. package/dist/adnuntiusBidAdapter.js +1 -1
  10. package/dist/adqueryBidAdapter.js +1 -1
  11. package/dist/adrelevantisBidAdapter.js +1 -1
  12. package/dist/adrinoBidAdapter.js +1 -1
  13. package/dist/adriverIdSystem.js +1 -1
  14. package/dist/adtelligentBidAdapter.js +1 -1
  15. package/dist/adtrgtmeBidAdapter.js +1 -1
  16. package/dist/adxcgBidAdapter.js +1 -1
  17. package/dist/adyoulikeBidAdapter.js +1 -1
  18. package/dist/ajaBidAdapter.js +1 -1
  19. package/dist/allowActivities.js +1 -0
  20. package/dist/amxBidAdapter.js +1 -1
  21. package/dist/amxIdSystem.js +1 -1
  22. package/dist/appierAnalyticsAdapter.js +1 -1
  23. package/dist/appnexusBidAdapter.js +1 -1
  24. package/dist/asoBidAdapter.js +1 -1
  25. package/dist/axonixBidAdapter.js +1 -1
  26. package/dist/bidglassBidAdapter.js +1 -1
  27. package/dist/big-richmediaBidAdapter.js +1 -1
  28. package/dist/bridgewellBidAdapter.js +1 -1
  29. package/dist/brightMountainMediaBidAdapter.js +1 -1
  30. package/dist/carodaBidAdapter.js +1 -1
  31. package/dist/chtnwBidAdapter.js +1 -1
  32. package/dist/cleanioRtdProvider.js +1 -1
  33. package/dist/concertBidAdapter.js +1 -1
  34. package/dist/connectIdSystem.js +1 -1
  35. package/dist/connectadBidAdapter.js +1 -1
  36. package/dist/consumableBidAdapter.js +1 -1
  37. package/dist/conversantAnalyticsAdapter.js +1 -1
  38. package/dist/conversantBidAdapter.js +1 -1
  39. package/dist/craftBidAdapter.js +1 -1
  40. package/dist/criteoBidAdapter.js +1 -1
  41. package/dist/cwireBidAdapter.js +1 -1
  42. package/dist/dependencies.json +6 -0
  43. package/dist/dspxBidAdapter.js +1 -1
  44. package/dist/eplanningBidAdapter.js +1 -1
  45. package/dist/feedadBidAdapter.js +1 -1
  46. package/dist/finativeBidAdapter.js +1 -1
  47. package/dist/freewheel-sspBidAdapter.js +1 -1
  48. package/dist/gdprEnforcement.js +1 -1
  49. package/dist/glimpseBidAdapter.js +1 -1
  50. package/dist/gmosspBidAdapter.js +1 -1
  51. package/dist/goldbachBidAdapter.js +1 -1
  52. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  53. package/dist/greenbidsRtdProvider.js +1 -1
  54. package/dist/gridBidAdapter.js +1 -1
  55. package/dist/growthCodeRtdProvider.js +1 -0
  56. package/dist/gumgumBidAdapter.js +1 -1
  57. package/dist/h12mediaBidAdapter.js +1 -1
  58. package/dist/id5IdSystem.js +1 -1
  59. package/dist/improvedigitalBidAdapter.js +1 -1
  60. package/dist/inmarBidAdapter.js +1 -1
  61. package/dist/insticatorBidAdapter.js +1 -1
  62. package/dist/ixBidAdapter.js +1 -1
  63. package/dist/justpremiumBidAdapter.js +1 -1
  64. package/dist/kargoBidAdapter.js +1 -1
  65. package/dist/konduitAnalyticsAdapter.js +1 -1
  66. package/dist/kueezBidAdapter.js +1 -1
  67. package/dist/kueezRtbBidAdapter.js +1 -1
  68. package/dist/kulturemediaBidAdapter.js +1 -1
  69. package/dist/lassoBidAdapter.js +1 -1
  70. package/dist/lifestreetBidAdapter.js +1 -1
  71. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  72. package/dist/logicadBidAdapter.js +1 -1
  73. package/dist/loglyliftBidAdapter.js +1 -1
  74. package/dist/magniteAnalyticsAdapter.js +1 -1
  75. package/dist/malltvAnalyticsAdapter.js +1 -1
  76. package/dist/marsmediaBidAdapter.js +1 -1
  77. package/dist/mediafuseBidAdapter.js +1 -1
  78. package/dist/mediasquareBidAdapter.js +1 -1
  79. package/dist/mgidBidAdapter.js +1 -1
  80. package/dist/minutemediaBidAdapter.js +1 -1
  81. package/dist/minutemediaplusBidAdapter.js +1 -1
  82. package/dist/nexx360BidAdapter.js +1 -1
  83. package/dist/not-for-prod/prebid.js +144 -140
  84. package/dist/objectGuard.js +1 -0
  85. package/dist/oguryBidAdapter.js +1 -1
  86. package/dist/onetagBidAdapter.js +1 -1
  87. package/dist/ooloAnalyticsAdapter.js +1 -1
  88. package/dist/optidigitalBidAdapter.js +1 -1
  89. package/dist/outbrainBidAdapter.js +1 -1
  90. package/dist/oxxionAnalyticsAdapter.js +1 -0
  91. package/dist/pairIdSystem.js +1 -1
  92. package/dist/parrableIdSystem.js +1 -1
  93. package/dist/pixfutureBidAdapter.js +1 -1
  94. package/dist/prebid-core.js +1 -1
  95. package/dist/prebidServerBidAdapter.js +1 -1
  96. package/dist/publinkIdSystem.js +1 -1
  97. package/dist/pubmaticBidAdapter.js +1 -1
  98. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  99. package/dist/pxyzBidAdapter.js +1 -1
  100. package/dist/quantcastBidAdapter.js +1 -1
  101. package/dist/readpeakBidAdapter.js +1 -1
  102. package/dist/relaidoBidAdapter.js +1 -1
  103. package/dist/retailspotBidAdapter.js +1 -1
  104. package/dist/rhythmoneBidAdapter.js +1 -1
  105. package/dist/riseBidAdapter.js +1 -1
  106. package/dist/rtdModule.js +1 -1
  107. package/dist/rubiconAnalyticsAdapter.js +1 -1
  108. package/dist/rubiconBidAdapter.js +1 -1
  109. package/dist/seedingAllianceBidAdapter.js +1 -1
  110. package/dist/seedtagBidAdapter.js +1 -1
  111. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  112. package/dist/sharethroughBidAdapter.js +1 -1
  113. package/dist/shinezBidAdapter.js +1 -1
  114. package/dist/smaatoBidAdapter.js +1 -1
  115. package/dist/smartadserverBidAdapter.js +1 -1
  116. package/dist/smartxBidAdapter.js +1 -1
  117. package/dist/smilewantedBidAdapter.js +1 -1
  118. package/dist/sonobiBidAdapter.js +1 -1
  119. package/dist/sovrnAnalyticsAdapter.js +1 -1
  120. package/dist/sovrnBidAdapter.js +1 -1
  121. package/dist/sspBCBidAdapter.js +1 -1
  122. package/dist/stvBidAdapter.js +1 -1
  123. package/dist/sublimeBidAdapter.js +1 -1
  124. package/dist/synacormediaBidAdapter.js +1 -1
  125. package/dist/targetVideoBidAdapter.js +1 -1
  126. package/dist/teadsBidAdapter.js +1 -1
  127. package/dist/trionBidAdapter.js +1 -1
  128. package/dist/tripleliftBidAdapter.js +1 -1
  129. package/dist/ttdBidAdapter.js +1 -1
  130. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  131. package/dist/uid2IdSystem.js +1 -1
  132. package/dist/underdogmediaBidAdapter.js +1 -1
  133. package/dist/undertoneBidAdapter.js +1 -1
  134. package/dist/userId.js +1 -1
  135. package/dist/vidazooBidAdapter.js +1 -1
  136. package/dist/videobyteBidAdapter.js +1 -1
  137. package/dist/visxBidAdapter.js +1 -1
  138. package/dist/vuukleBidAdapter.js +1 -1
  139. package/dist/widespaceBidAdapter.js +1 -1
  140. package/dist/winrBidAdapter.js +1 -1
  141. package/dist/yahoosspBidAdapter.js +1 -1
  142. package/dist/yieldmoBidAdapter.js +1 -1
  143. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  144. package/dist/zeta_global_sspBidAdapter.js +1 -1
  145. package/integrationExamples/gpt/growthcode.html +20 -9
  146. package/libraries/objectGuard/objectGuard.js +108 -0
  147. package/libraries/objectGuard/ortbGuard.js +88 -0
  148. package/modules/adgenerationBidAdapter.js +14 -5
  149. package/modules/adhashBidAdapter.js +28 -17
  150. package/modules/adkernelBidAdapter.js +2 -1
  151. package/modules/admanBidAdapter.js +30 -22
  152. package/modules/adnuntiusBidAdapter.js +98 -79
  153. package/modules/adnuntiusBidAdapter.md +2 -1
  154. package/modules/adqueryBidAdapter.js +7 -1
  155. package/modules/adrinoBidAdapter.js +1 -0
  156. package/modules/adriverIdSystem.js +1 -1
  157. package/modules/adtelligentBidAdapter.js +4 -2
  158. package/modules/allowActivities.js +74 -0
  159. package/modules/appnexusBidAdapter.js +1 -0
  160. package/modules/cleanioRtdProvider.js +2 -4
  161. package/modules/connectIdSystem.js +89 -13
  162. package/modules/connectIdSystem.md +4 -7
  163. package/modules/criteoBidAdapter.js +50 -3
  164. package/modules/freewheel-sspBidAdapter.js +10 -2
  165. package/modules/gdprEnforcement.js +98 -169
  166. package/modules/growthCodeRtdProvider.js +131 -0
  167. package/modules/growthCodeRtdProvider.md +55 -0
  168. package/modules/gumgumBidAdapter.js +5 -0
  169. package/modules/ixBidAdapter.js +5 -2
  170. package/modules/minutemediaBidAdapter.js +13 -3
  171. package/modules/oxxionAnalyticsAdapter.js +212 -0
  172. package/modules/oxxionAnalyticsAdapter.md +33 -0
  173. package/modules/pairIdSystem.js +6 -6
  174. package/modules/prebidServerBidAdapter/index.js +7 -8
  175. package/modules/pubmaticBidAdapter.js +1 -0
  176. package/modules/riseBidAdapter.js +13 -3
  177. package/modules/rtbhouseBidAdapter.md +24 -0
  178. package/modules/rtdModule/index.js +12 -1
  179. package/modules/sharethroughBidAdapter.js +2 -2
  180. package/modules/smartadserverBidAdapter.js +5 -0
  181. package/modules/stvBidAdapter.js +34 -1
  182. package/modules/undertoneBidAdapter.js +9 -1
  183. package/modules/userId/index.js +69 -41
  184. package/modules/yahoosspBidAdapter.js +45 -3
  185. package/modules/yahoosspBidAdapter.md +1 -1
  186. package/modules/zeta_global_sspBidAdapter.js +1 -0
  187. package/package.json +1 -1
  188. package/src/activities/activities.js +47 -0
  189. package/src/activities/activityParams.js +8 -0
  190. package/src/activities/modules.js +1 -1
  191. package/src/activities/params.js +59 -0
  192. package/src/activities/redactor.js +157 -0
  193. package/src/activities/rules.js +95 -0
  194. package/src/adapterManager.js +45 -8
  195. package/src/adloader.js +2 -1
  196. package/src/fpd/rootDomain.js +1 -1
  197. package/src/native.js +20 -4
  198. package/src/prebid.js +1 -1
  199. package/src/storageManager.js +57 -44
  200. package/src/userSync.js +35 -18
  201. package/test/spec/activities/allowActivites_spec.js +138 -0
  202. package/test/spec/activities/objectGuard_spec.js +144 -0
  203. package/test/spec/activities/ortbGuard_spec.js +140 -0
  204. package/test/spec/activities/params_spec.js +25 -0
  205. package/test/spec/activities/redactor_spec.js +296 -0
  206. package/test/spec/activities/rules_spec.js +135 -0
  207. package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -12
  208. package/test/spec/modules/adhashBidAdapter_spec.js +51 -1
  209. package/test/spec/modules/admanBidAdapter_spec.js +1 -2
  210. package/test/spec/modules/adnuntiusBidAdapter_spec.js +535 -264
  211. package/test/spec/modules/adqueryBidAdapter_spec.js +9 -0
  212. package/test/spec/modules/adrinoBidAdapter_spec.js +4 -0
  213. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  214. package/test/spec/modules/cleanioRtdProvider_spec.js +7 -8
  215. package/test/spec/modules/connectIdSystem_spec.js +291 -23
  216. package/test/spec/modules/criteoBidAdapter_spec.js +134 -2
  217. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -2
  218. package/test/spec/modules/gdprEnforcement_spec.js +127 -414
  219. package/test/spec/modules/growthCodeRtdProvider_spec.js +127 -0
  220. package/test/spec/modules/gumgumBidAdapter_spec.js +14 -0
  221. package/test/spec/modules/ixBidAdapter_spec.js +2 -1
  222. package/test/spec/modules/minutemediaBidAdapter_spec.js +69 -1
  223. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +324 -0
  224. package/test/spec/modules/pairIdSystem_spec.js +16 -3
  225. package/test/spec/modules/prebidServerBidAdapter_spec.js +3 -1
  226. package/test/spec/modules/pubmaticBidAdapter_spec.js +7 -0
  227. package/test/spec/modules/realTimeDataModule_spec.js +1 -1
  228. package/test/spec/modules/riseBidAdapter_spec.js +69 -1
  229. package/test/spec/modules/sharethroughBidAdapter_spec.js +1 -1
  230. package/test/spec/modules/smartadserverBidAdapter_spec.js +42 -0
  231. package/test/spec/modules/stvBidAdapter_spec.js +13 -1
  232. package/test/spec/modules/undertoneBidAdapter_spec.js +57 -1
  233. package/test/spec/modules/userId_spec.js +80 -21
  234. package/test/spec/modules/yahoosspBidAdapter_spec.js +103 -51
  235. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +4 -0
  236. package/test/spec/native_spec.js +12 -12
  237. package/test/spec/unit/core/adapterManager_spec.js +181 -1
  238. package/test/spec/unit/core/storageManager_spec.js +76 -68
  239. package/test/spec/unit/pbjs_api_spec.js +15 -25
  240. package/test/spec/userSync_spec.js +45 -16
@@ -1,8 +1,8 @@
1
- import {tryAppendQueryString, getBidIdParameter, escapeUnsafeChars} from '../src/utils.js';
1
+ import {tryAppendQueryString, getBidIdParameter, escapeUnsafeChars, deepAccess} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER, NATIVE} from '../src/mediaTypes.js';
4
4
  import {config} from '../src/config.js';
5
- import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
5
+ import {convertOrtbRequestToProprietaryNative} from '../src/native.js';
6
6
 
7
7
  const ADG_BIDDER_CODE = 'adgeneration';
8
8
 
@@ -21,14 +21,14 @@ export const spec = {
21
21
  },
22
22
  /**
23
23
  * Make a server request from the list of BidRequests.
24
- *
25
- * @param {validBidRequests[]} - an array of bids
24
+ * @param validBidRequests
25
+ * @param bidderRequest
26
26
  * @return ServerRequest Info describing the request to the server.
27
27
  */
28
28
  buildRequests: function (validBidRequests, bidderRequest) {
29
29
  // convert Native ORTB definition to old-style prebid native definition
30
30
  validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
31
- const ADGENE_PREBID_VERSION = '1.5.0';
31
+ const ADGENE_PREBID_VERSION = '1.6.0';
32
32
  let serverRequests = [];
33
33
  for (let i = 0, len = validBidRequests.length; i < len; i++) {
34
34
  const validReq = validBidRequests[i];
@@ -38,6 +38,9 @@ export const spec = {
38
38
  const criteoId = getCriteoId(validReq);
39
39
  const id5id = getId5Id(validReq);
40
40
  const id5LinkType = getId5LinkType(validReq);
41
+ const imuid = deepAccess(validReq, 'userId.imuid');
42
+ const gpid = deepAccess(validReq, 'ortb2Imp.ext.gpid');
43
+ const sua = deepAccess(validReq, 'ortb2.device.sua');
41
44
  let data = ``;
42
45
  data = tryAppendQueryString(data, 'posall', 'SSPLOC');
43
46
  const id = getBidIdParameter('id', validReq.params);
@@ -54,6 +57,12 @@ export const spec = {
54
57
  data = tryAppendQueryString(data, 'adgext_criteo_id', criteoId);
55
58
  data = tryAppendQueryString(data, 'adgext_id5_id', id5id);
56
59
  data = tryAppendQueryString(data, 'adgext_id5_id_link_type', id5LinkType);
60
+ data = tryAppendQueryString(data, 'adgext_imuid', imuid);
61
+ data = tryAppendQueryString(data, 'adgext_uid2', validReq.userId ? validReq.userId.uid2 : null);
62
+ data = tryAppendQueryString(data, 'gpid', gpid ? encodeURIComponent(gpid) : null);
63
+ data = tryAppendQueryString(data, 'uach', sua ? JSON.stringify(sua) : null);
64
+ data = tryAppendQueryString(data, 'schain', validReq.schain ? encodeURIComponent(JSON.stringify(validReq.schain)) : null);
65
+
57
66
  // native以外にvideo等の対応が入った場合は要修正
58
67
  if (!validReq.mediaTypes || !validReq.mediaTypes.native) {
59
68
  data = tryAppendQueryString(data, 'imark', '1');
@@ -1,7 +1,7 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
2
  import { getStorageManager } from '../src/storageManager.js';
3
3
  import { includes } from '../src/polyfill.js';
4
- import { BANNER } from '../src/mediaTypes.js';
4
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
5
5
 
6
6
  const VERSION = '3.2';
7
7
  const BAD_WORD_STEP = 0.1;
@@ -130,13 +130,13 @@ function brandSafety(badWords, maxScore) {
130
130
 
131
131
  export const spec = {
132
132
  code: ADHASH_BIDDER_CODE,
133
- supportedMediaTypes: [ BANNER ],
133
+ supportedMediaTypes: [ BANNER, VIDEO ],
134
134
 
135
135
  isBidRequestValid: (bid) => {
136
136
  try {
137
137
  const { publisherId, platformURL, bidderURL } = bid.params;
138
138
  return (
139
- includes(Object.keys(bid.mediaTypes), BANNER) &&
139
+ (includes(Object.keys(bid.mediaTypes), BANNER) || includes(Object.keys(bid.mediaTypes), VIDEO)) &&
140
140
  typeof publisherId === 'string' &&
141
141
  publisherId.length === 42 &&
142
142
  typeof platformURL === 'string' &&
@@ -168,7 +168,14 @@ export const spec = {
168
168
  const url = `${bidderURL}/rtb?version=${VERSION}&prebid=true`;
169
169
  const index = Math.floor(Math.random() * validBidRequests[i].sizes.length);
170
170
  const size = validBidRequests[i].sizes[index].join('x');
171
-
171
+ const creativeData = includes(Object.keys(validBidRequests[i].mediaTypes), VIDEO) ? {
172
+ size: 'preroll',
173
+ position: validBidRequests[i].adUnitCode,
174
+ playerSize: size
175
+ } : {
176
+ size: size,
177
+ position: validBidRequests[i].adUnitCode
178
+ };
172
179
  let recentAds = [];
173
180
  if (storage.localStorageIsEnabled()) {
174
181
  const prefix = validBidRequests[i].params.prefix || 'adHash';
@@ -204,10 +211,7 @@ export const spec = {
204
211
  language: window.navigator.language,
205
212
  userAgent: window.navigator.userAgent
206
213
  },
207
- creatives: [{
208
- size: size,
209
- position: validBidRequests[i].adUnitCode
210
- }],
214
+ creatives: [creativeData],
211
215
  blockedCreatives: [],
212
216
  currentTimestamp: (new Date().getTime() / 1000) | 0,
213
217
  recentAds: recentAds,
@@ -229,7 +233,6 @@ export const spec = {
229
233
 
230
234
  interpretResponse: (serverResponse, request) => {
231
235
  const responseBody = serverResponse ? serverResponse.body : {};
232
-
233
236
  if (
234
237
  !responseBody.creatives ||
235
238
  responseBody.creatives.length === 0 ||
@@ -241,18 +244,12 @@ export const spec = {
241
244
  const publisherURL = JSON.stringify(request.bidRequest.params.platformURL);
242
245
  const bidderURL = request.bidRequest.params.bidderURL || 'https://bidder.adhash.com';
243
246
  const oneTimeId = request.bidRequest.adUnitCode + Math.random().toFixed(16).replace('0.', '.');
244
- const globalScript = !request.bidRequest.params.globalScript
245
- ? `<script src="${bidderURL}/static/scripts/creative.min.js"></script>`
246
- : '';
247
247
  const bidderResponse = JSON.stringify({ responseText: JSON.stringify(responseBody) });
248
248
  const requestData = JSON.stringify(request.data);
249
249
 
250
- return [{
250
+ var response = {
251
251
  requestId: request.bidRequest.bidId,
252
252
  cpm: responseBody.creatives[0].costEUR,
253
- ad:
254
- `<div id="${oneTimeId}"></div>${globalScript}
255
- <script>callAdvertiser(${bidderResponse},['${oneTimeId}'],${requestData},${publisherURL})</script>`,
256
253
  width: request.bidRequest.sizes[0][0],
257
254
  height: request.bidRequest.sizes[0][1],
258
255
  creativeId: request.bidRequest.adUnitCode,
@@ -262,7 +259,21 @@ export const spec = {
262
259
  meta: {
263
260
  advertiserDomains: responseBody.advertiserDomains ? [responseBody.advertiserDomains] : []
264
261
  }
265
- }];
262
+ };
263
+ if (typeof request == 'object' && typeof request.bidRequest == 'object' && typeof request.bidRequest.mediaTypes == 'object' && includes(Object.keys(request.bidRequest.mediaTypes), BANNER)) {
264
+ response = Object.assign({
265
+ ad:
266
+ `<div id="${oneTimeId}"></div>
267
+ <script src="${bidderURL}/static/scripts/creative.min.js"></script>
268
+ <script>callAdvertiser(${bidderResponse},['${oneTimeId}'],${requestData},${publisherURL})</script>`
269
+ }, response);
270
+ } else if (includes(Object.keys(request.bidRequest.mediaTypes), VIDEO)) {
271
+ response = Object.assign({
272
+ vastUrl: responseBody.creatives[0].vastURL,
273
+ mediaType: VIDEO
274
+ }, response);
275
+ }
276
+ return [response];
266
277
  }
267
278
  };
268
279
 
@@ -99,7 +99,8 @@ export const spec = {
99
99
  {code: 'displayioads'},
100
100
  {code: 'rtbdemand_com'},
101
101
  {code: 'bidbuddy'},
102
- {code: 'adliveconnect'}
102
+ {code: 'adliveconnect'},
103
+ {code: 'didnadisplay'}
103
104
  ],
104
105
  supportedMediaTypes: [BANNER, VIDEO, NATIVE],
105
106
 
@@ -99,43 +99,51 @@ export const spec = {
99
99
  const len = validBidRequests.length;
100
100
 
101
101
  for (let i = 0; i < len; i++) {
102
- let bid = validBidRequests[i];
103
- let traff = bid.params.traffic || BANNER
102
+ const bid = validBidRequests[i];
103
+ const { params, bidId, mediaTypes } = bid;
104
+
104
105
  const placement = {
105
- placementId: bid.params.placementId,
106
- bidId: bid.bidId,
107
- sizes: bid.mediaTypes && bid.mediaTypes[traff] && bid.mediaTypes[traff].sizes ? bid.mediaTypes[traff].sizes : [],
108
- traffic: traff,
106
+ placementId: params.placementId,
107
+ bidId,
109
108
  eids: [],
110
109
  bidFloor: getBidFloor(bid)
111
110
  }
111
+
112
112
  if (bid.schain) {
113
113
  placement.schain = bid.schain;
114
114
  }
115
+
115
116
  if (bid.userId) {
116
117
  getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com');
117
118
  getUserId(placement.eids, bid.userId.lotamePanoramaId, 'lotame.com');
118
119
  getUserId(placement.eids, bid.userId.idx, 'idx.lat');
119
120
  }
120
- if (traff === VIDEO) {
121
- placement.playerSize = bid.mediaTypes[VIDEO].playerSize;
122
- placement.minduration = bid.mediaTypes[VIDEO].minduration;
123
- placement.maxduration = bid.mediaTypes[VIDEO].maxduration;
124
- placement.mimes = bid.mediaTypes[VIDEO].mimes;
125
- placement.protocols = bid.mediaTypes[VIDEO].protocols;
126
- placement.startdelay = bid.mediaTypes[VIDEO].startdelay;
127
- placement.placement = bid.mediaTypes[VIDEO].placement;
128
- placement.skip = bid.mediaTypes[VIDEO].skip;
129
- placement.skipafter = bid.mediaTypes[VIDEO].skipafter;
130
- placement.minbitrate = bid.mediaTypes[VIDEO].minbitrate;
131
- placement.maxbitrate = bid.mediaTypes[VIDEO].maxbitrate;
132
- placement.delivery = bid.mediaTypes[VIDEO].delivery;
133
- placement.playbackmethod = bid.mediaTypes[VIDEO].playbackmethod;
134
- placement.api = bid.mediaTypes[VIDEO].api;
135
- placement.linearity = bid.mediaTypes[VIDEO].linearity;
121
+
122
+ if (mediaTypes?.[BANNER]) {
123
+ placement.traffic = BANNER;
124
+ placement.sizes = mediaTypes[BANNER].sizes;
125
+ } else if (mediaTypes?.[VIDEO]) {
126
+ placement.traffic = VIDEO;
127
+ placement.playerSize = mediaTypes[VIDEO].playerSize;
128
+ placement.minduration = mediaTypes[VIDEO].minduration;
129
+ placement.maxduration = mediaTypes[VIDEO].maxduration;
130
+ placement.mimes = mediaTypes[VIDEO].mimes;
131
+ placement.protocols = mediaTypes[VIDEO].protocols;
132
+ placement.startdelay = mediaTypes[VIDEO].startdelay;
133
+ placement.placement = mediaTypes[VIDEO].placement;
134
+ placement.skip = mediaTypes[VIDEO].skip;
135
+ placement.skipafter = mediaTypes[VIDEO].skipafter;
136
+ placement.minbitrate = mediaTypes[VIDEO].minbitrate;
137
+ placement.maxbitrate = mediaTypes[VIDEO].maxbitrate;
138
+ placement.delivery = mediaTypes[VIDEO].delivery;
139
+ placement.playbackmethod = mediaTypes[VIDEO].playbackmethod;
140
+ placement.api = mediaTypes[VIDEO].api;
141
+ placement.linearity = mediaTypes[VIDEO].linearity;
136
142
  }
143
+
137
144
  placements.push(placement);
138
145
  }
146
+
139
147
  return {
140
148
  method: 'POST',
141
149
  url: AD_URL,
@@ -5,11 +5,17 @@ import { config } from '../src/config.js';
5
5
  import { getStorageManager } from '../src/storageManager.js';
6
6
 
7
7
  const BIDDER_CODE = 'adnuntius';
8
+ const BIDDER_CODE_DEAL_ALIAS_BASE = 'adndeal';
9
+ const BIDDER_CODE_DEAL_ALIAS_1 = BIDDER_CODE_DEAL_ALIAS_BASE + '1';
10
+ const BIDDER_CODE_DEAL_ALIAS_2 = BIDDER_CODE_DEAL_ALIAS_BASE + '2';
11
+ const BIDDER_CODE_DEAL_ALIAS_3 = BIDDER_CODE_DEAL_ALIAS_BASE + '3';
12
+ const BIDDER_CODE_DEAL_ALIAS_4 = BIDDER_CODE_DEAL_ALIAS_BASE + '4';
13
+ const BIDDER_CODE_DEAL_ALIAS_5 = BIDDER_CODE_DEAL_ALIAS_BASE + '5';
8
14
  const ENDPOINT_URL = 'https://ads.adnuntius.delivery/i';
9
15
  const ENDPOINT_URL_EUROPE = 'https://europe.delivery.adnuntius.com/i';
10
16
  const GVLID = 855;
11
17
  const DEFAULT_VAST_VERSION = 'vast4'
12
- // const DEFAULT_NATIVE = 'native'
18
+ const MAXIMUM_DEALS_LIMIT = 5;
13
19
 
14
20
  const checkSegment = function (segment) {
15
21
  if (isStr(segment)) return segment;
@@ -29,40 +35,13 @@ const getSegmentsFromOrtb = function (ortb2) {
29
35
  return segments
30
36
  }
31
37
 
32
- // function createNative(ad) {
33
- // const native = {};
34
- // const assets = ad.assets
35
- // native.title = ad.text.title.content;
36
- // native.image = {
37
- // url: assets.image.cdnId,
38
- // height: assets.image.height,
39
- // width: assets.image.width,
40
- // };
41
- // if (assets.icon) {
42
- // native.icon = {
43
- // url: assets.icon.cdnId,
44
- // height: assets.icon.height,
45
- // width: assets.icon.width,
46
- // };
47
- // }
48
-
49
- // native.sponsoredBy = ad.text.sponsoredBy?.content || '';
50
- // native.body = ad.text.body?.content || '';
51
- // native.cta = ad.text.cta?.content || '';
52
- // native.clickUrl = ad.destinationUrls.destination || '';
53
- // native.impressionTrackers = ad.impressionTrackingUrls || [ad.renderedPixel];
54
-
55
- // return native;
56
- // }
57
-
58
38
  const handleMeta = function () {
59
39
  const storage = getStorageManager({ bidderCode: BIDDER_CODE })
60
40
  let adnMeta = null
61
41
  if (storage.localStorageIsEnabled()) {
62
42
  adnMeta = JSON.parse(storage.getDataFromLocalStorage('adn.metaData'))
63
43
  }
64
- const meta = (adnMeta !== null) ? adnMeta.reduce((acc, cur) => { return { ...acc, [cur.key]: cur.value } }, {}) : {}
65
- return meta
44
+ return (adnMeta !== null) ? adnMeta.reduce((acc, cur) => { return { ...acc, [cur.key]: cur.value } }, {}) : {}
66
45
  }
67
46
 
68
47
  const getUsi = function (meta, ortb2, bidderRequest) {
@@ -71,12 +50,23 @@ const getUsi = function (meta, ortb2, bidderRequest) {
71
50
  return usi
72
51
  }
73
52
 
53
+ const AU_ID_REGEX = new RegExp('^[0-9A-Fa-f]{1,20}$');
54
+
74
55
  export const spec = {
75
56
  code: BIDDER_CODE,
57
+ aliases: [
58
+ BIDDER_CODE_DEAL_ALIAS_1,
59
+ BIDDER_CODE_DEAL_ALIAS_2,
60
+ BIDDER_CODE_DEAL_ALIAS_3,
61
+ BIDDER_CODE_DEAL_ALIAS_4,
62
+ BIDDER_CODE_DEAL_ALIAS_5
63
+ ],
76
64
  gvlid: GVLID,
77
65
  supportedMediaTypes: [BANNER, VIDEO],
78
66
  isBidRequestValid: function (bid) {
79
- return !!(bid.bidId || (bid.params.member && bid.params.invCode));
67
+ // The auId MUST be a hexadecimal string
68
+ const validAuId = AU_ID_REGEX.test(bid.params.auId);
69
+ return !!(validAuId && (bid.bidId || (bid.params.member && bid.params.invCode)));
80
70
  },
81
71
 
82
72
  buildRequests: function (validBidRequests, bidderRequest) {
@@ -100,20 +90,18 @@ export const spec = {
100
90
  if (gdprApplies !== undefined) request.push('consentString=' + consentString);
101
91
  if (segments.length > 0) request.push('segments=' + segments.join(','));
102
92
  if (usi) request.push('userId=' + usi);
103
- if (bidderConfig.useCookie === false) request.push('noCookies=true')
104
- for (var i = 0; i < validBidRequests.length; i++) {
93
+ if (bidderConfig.useCookie === false) request.push('noCookies=true');
94
+ if (bidderConfig.maxDeals > 0) request.push('ds=' + Math.min(bidderConfig.maxDeals, MAXIMUM_DEALS_LIMIT));
95
+ for (let i = 0; i < validBidRequests.length; i++) {
105
96
  const bid = validBidRequests[i]
106
97
  let network = bid.params.network || 'network';
98
+ const maxDeals = Math.max(0, Math.min(bid.params.maxDeals || 0, MAXIMUM_DEALS_LIMIT));
107
99
  const targeting = bid.params.targeting || {};
108
100
 
109
101
  if (bid.mediaTypes && bid.mediaTypes.video && bid.mediaTypes.video.context !== 'outstream') {
110
102
  network += '_video'
111
103
  }
112
104
 
113
- // if (bid.mediaTypes && bid.mediaTypes.native) {
114
- // network += '_native'
115
- // }
116
-
117
105
  bidRequests[network] = bidRequests[network] || [];
118
106
  bidRequests[network].push(bid);
119
107
 
@@ -121,18 +109,17 @@ export const spec = {
121
109
  networks[network].adUnits = networks[network].adUnits || [];
122
110
  if (bidderRequest && bidderRequest.refererInfo) networks[network].context = bidderRequest.refererInfo.page;
123
111
  if (adnMeta) networks[network].metaData = adnMeta;
124
- const adUnit = { ...targeting, auId: bid.params.auId, targetId: bid.bidId }
112
+ const adUnit = { ...targeting, auId: bid.params.auId, targetId: bid.bidId, maxDeals: maxDeals }
125
113
  if (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) adUnit.dimensions = bid.mediaTypes.banner.sizes
126
114
  networks[network].adUnits.push(adUnit);
127
115
  }
128
116
 
129
117
  const networkKeys = Object.keys(networks)
130
- for (var j = 0; j < networkKeys.length; j++) {
118
+ for (let j = 0; j < networkKeys.length; j++) {
131
119
  const network = networkKeys[j];
132
120
  const networkRequest = [...request]
133
121
  if (network.indexOf('_video') > -1) { networkRequest.push('tt=' + DEFAULT_VAST_VERSION) }
134
122
  const requestURL = gdprApplies ? ENDPOINT_URL_EUROPE : ENDPOINT_URL
135
- // if (network.indexOf('_native') > -1) { networkRequest.push('tt=' + DEFAULT_NATIVE) }
136
123
  requests.push({
137
124
  method: 'POST',
138
125
  url: requestURL + '?' + networkRequest.join('&'),
@@ -146,50 +133,82 @@ export const spec = {
146
133
 
147
134
  interpretResponse: function (serverResponse, bidRequest) {
148
135
  const adUnits = serverResponse.body.adUnits;
149
- const bidResponsesById = adUnits.reduce((response, adUnit) => {
150
- if (adUnit.matchedAdCount >= 1) {
151
- const ad = adUnit.ads[0];
152
- const effectiveCpm = (ad.bid) ? ad.bid.amount * 1000 : 0;
153
- const adResponse = {
154
- ...response,
155
- [adUnit.targetId]: {
156
- requestId: adUnit.targetId,
157
- cpm: effectiveCpm,
158
- width: Number(ad.creativeWidth),
159
- height: Number(ad.creativeHeight),
160
- creativeId: ad.creativeId,
161
- currency: (ad.bid) ? ad.bid.currency : 'EUR',
162
- dealId: ad.dealId || '',
163
- meta: {
164
- advertiserDomains: (ad.destinationUrls.destination) ? [ad.destinationUrls.destination.split('/')[2]] : []
165
-
166
- },
167
- netRevenue: false,
168
- ttl: 360,
169
- }
170
- }
171
-
172
- if (adUnit.vastXml) {
173
- adResponse[adUnit.targetId].vastXml = adUnit.vastXml
174
- adResponse[adUnit.targetId].mediaType = VIDEO
175
- // } else if (ad.assets && ad.assets.image && ad.text && ad.text.title && ad.text.body && ad.destinationUrls && ad.destinationUrls.destination) {
176
- // adResponse[adUnit.targetId].native = createNative(ad);
177
- // adResponse[adUnit.targetId].mediaType = NATIVE;
178
- } else {
179
- adResponse[adUnit.targetId].ad = adUnit.html
180
- }
181
-
182
- return adResponse
183
- } else return response
136
+
137
+ function buildAdResponse(bidderCode, ad, adUnit, dealCount) {
138
+ const destinationUrls = ad.destinationUrls || {};
139
+ const advertiserDomains = [];
140
+ for (const value of Object.values(destinationUrls)) {
141
+ advertiserDomains.push(value.split('/')[2])
142
+ }
143
+ const adResponse = {
144
+ bidderCode: bidderCode,
145
+ requestId: adUnit.targetId,
146
+ cpm: (ad.bid) ? ad.bid.amount * 1000 : 0,
147
+ width: Number(ad.creativeWidth),
148
+ height: Number(ad.creativeHeight),
149
+ creativeId: ad.creativeId,
150
+ currency: (ad.bid) ? ad.bid.currency : 'EUR',
151
+ dealId: ad.dealId || '',
152
+ dealCount: dealCount,
153
+ meta: {
154
+ advertiserDomains: advertiserDomains
155
+ },
156
+ netRevenue: false,
157
+ ttl: 360,
158
+ };
159
+ // Deal bids provide the rendered ad content along with the
160
+ // bid; whereas regular bids have it stored on the ad-unit.
161
+ const isDeal = dealCount > 0;
162
+ const renderSource = isDeal ? ad : adUnit;
163
+ if (renderSource.vastXml) {
164
+ adResponse.vastXml = renderSource.vastXml
165
+ adResponse.mediaType = VIDEO
166
+ } else {
167
+ adResponse.ad = renderSource.html
168
+ }
169
+ return adResponse;
170
+ }
171
+
172
+ const bidsById = bidRequest.bid.reduce((response, bid) => {
173
+ return {
174
+ ...response,
175
+ [bid.bidId]: bid
176
+ };
184
177
  }, {});
185
178
 
186
- const bidResponse = bidRequest.bid.map(bid => bid.bidId).reduce((request, adunitId) => {
187
- if (bidResponsesById[adunitId]) { request.push(bidResponsesById[adunitId]) }
188
- return request
179
+ const hasBidAdUnits = adUnits.filter((au) => {
180
+ const bid = bidsById[au.targetId];
181
+ if (bid && bid.bidder === BIDDER_CODE) {
182
+ return au.matchedAdCount > 0;
183
+ } else {
184
+ // We do NOT accept bids when using this adaptor via one of the
185
+ // "deals" aliases; those requests are for ONLY getting deals from Adnuntius
186
+ return false;
187
+ }
188
+ });
189
+ const hasDealsAdUnits = adUnits.filter((au) => {
190
+ return au.deals && au.deals.length > 0;
191
+ });
192
+
193
+ const dealAdResponses = hasDealsAdUnits.reduce((response, au) => {
194
+ const bid = bidsById[au.targetId];
195
+ if (bid) {
196
+ (au.deals || []).forEach((deal, i) => {
197
+ response.push(buildAdResponse(bid.bidder, deal, au, i + 1));
198
+ });
199
+ }
200
+ return response;
189
201
  }, []);
190
202
 
191
- return bidResponse
192
- },
203
+ const bidAdResponses = hasBidAdUnits.reduce((response, au) => {
204
+ const bid = bidsById[au.targetId];
205
+ if (bid) {
206
+ response.push(buildAdResponse(bid.bidder, au.ads[0], au, 0));
207
+ }
208
+ return response;
209
+ }, []);
193
210
 
211
+ return [...dealAdResponses, ...bidAdResponses];
212
+ }
194
213
  }
195
214
  registerBidder(spec);
@@ -9,7 +9,7 @@ Maintainer: info@adnuntius.com
9
9
  # Description
10
10
 
11
11
  Adnuntius Bidder Adapter for Prebid.js.
12
- Only Banner format is supported.
12
+ Banner and Video formats are supported.
13
13
 
14
14
  # Test Parameters
15
15
  ```
@@ -27,6 +27,7 @@ Only Banner format is supported.
27
27
  params: {
28
28
  auId: "8b6bc",
29
29
  network: "adnuntius",
30
+ maxDeals: 0
30
31
  }
31
32
  },
32
33
  ]
@@ -191,7 +191,13 @@ export const spec = {
191
191
  };
192
192
  function buildRequest(validBidRequests, bidderRequest) {
193
193
  let bid = validBidRequests;
194
+ let pageUrl = '';
195
+ if (bidderRequest && bidderRequest.refererInfo) {
196
+ pageUrl = bidderRequest.refererInfo.page || '';
197
+ }
198
+
194
199
  return {
200
+ v: '$prebid.version$',
195
201
  placementCode: bid.params.placementId,
196
202
  auctionId: bid.auctionId,
197
203
  type: bid.params.type,
@@ -199,11 +205,11 @@ function buildRequest(validBidRequests, bidderRequest) {
199
205
  bidQid: storage.getDataFromLocalStorage('qid') || null,
200
206
  bidId: bid.bidId,
201
207
  bidder: bid.bidder,
208
+ bidPageUrl: pageUrl,
202
209
  bidderRequestId: bid.bidderRequestId,
203
210
  bidRequestsCount: bid.bidRequestsCount,
204
211
  bidderRequestsCount: bid.bidderRequestsCount,
205
212
  sizes: parseSizesInput(bid.mediaTypes.banner.sizes).toString(),
206
-
207
213
  };
208
214
  }
209
215
 
@@ -35,6 +35,7 @@ export const spec = {
35
35
  let bids = [];
36
36
  for (let i = 0; i < validBidRequests.length; i++) {
37
37
  let requestData = {
38
+ adUnitCode: validBidRequests[i].adUnitCode,
38
39
  bidId: validBidRequests[i].bidId,
39
40
  placementHash: validBidRequests[i].params.hash,
40
41
  userId: validBidRequests[i].userId,
@@ -42,7 +42,7 @@ export const adriverIdSubmodule = {
42
42
  if (!isPlainObject(config.params)) {
43
43
  config.params = {};
44
44
  }
45
- const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1';
45
+ const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1&cfa=1';
46
46
  const resp = function (callback) {
47
47
  let creationDate = storage.getDataFromLocalStorage('adrcid_cd') || storage.getCookie('adrcid_cd');
48
48
  let cookie = storage.getDataFromLocalStorage('adrcid') || storage.getCookie('adrcid');
@@ -24,7 +24,8 @@ const HOST_GETTERS = {
24
24
  pgam: () => 'ghb.pgamssp.com',
25
25
  ocm: () => 'ghb.cenarius.orangeclickmedia.com',
26
26
  vidcrunchllc: () => 'ghb.platform.vidcrunch.com',
27
- '9dotsmedia': () => 'ghb.platform.audiodots.com'
27
+ '9dotsmedia': () => 'ghb.platform.audiodots.com',
28
+ copper6: () => 'ghb.app.copper6.com'
28
29
  }
29
30
  const getUri = function (bidderCode) {
30
31
  let bidderWithoutSuffix = bidderCode.split('_')[0];
@@ -51,7 +52,8 @@ export const spec = {
51
52
  'pgam',
52
53
  { code: 'ocm', gvlid: 1148 },
53
54
  { code: 'vidcrunchllc', gvlid: 1145 },
54
- '9dotsmedia'
55
+ '9dotsmedia',
56
+ 'copper6',
55
57
  ],
56
58
  supportedMediaTypes: [VIDEO, BANNER],
57
59
  isBidRequestValid: function (bid) {
@@ -0,0 +1,74 @@
1
+ import {config} from '../src/config.js';
2
+ import {registerActivityControl} from '../src/activities/rules.js';
3
+
4
+ const CFG_NAME = 'allowActivities';
5
+ const RULE_NAME = `${CFG_NAME} config`;
6
+ const DEFAULT_PRIORITY = 1;
7
+
8
+ export function updateRulesFromConfig(registerRule) {
9
+ const activeRuleHandles = new Map();
10
+ const defaultRuleHandles = new Map();
11
+ const rulesByActivity = new Map();
12
+
13
+ function clearAllRules() {
14
+ rulesByActivity.clear();
15
+ Array.from(activeRuleHandles.values())
16
+ .flatMap(ruleset => Array.from(ruleset.values()))
17
+ .forEach(fn => fn());
18
+ activeRuleHandles.clear();
19
+ Array.from(defaultRuleHandles.values()).forEach(fn => fn());
20
+ defaultRuleHandles.clear();
21
+ }
22
+
23
+ function cleanParams(params) {
24
+ // remove private parameters for publisher condition checks
25
+ return Object.fromEntries(Object.entries(params).filter(([k]) => !k.startsWith('_')))
26
+ }
27
+
28
+ function setupRule(activity, priority) {
29
+ if (!activeRuleHandles.has(activity)) {
30
+ activeRuleHandles.set(activity, new Map())
31
+ }
32
+ const handles = activeRuleHandles.get(activity);
33
+ if (!handles.has(priority)) {
34
+ handles.set(priority, registerRule(activity, RULE_NAME, function (params) {
35
+ for (const rule of rulesByActivity.get(activity).get(priority)) {
36
+ if (!rule.condition || rule.condition(cleanParams(params))) {
37
+ return {allow: rule.allow, reason: rule}
38
+ }
39
+ }
40
+ }, priority));
41
+ }
42
+ }
43
+
44
+ function setupDefaultRule(activity) {
45
+ if (!defaultRuleHandles.has(activity)) {
46
+ defaultRuleHandles.set(activity, registerRule(activity, RULE_NAME, function () {
47
+ return {allow: false, reason: 'activity denied by default'}
48
+ }, Number.POSITIVE_INFINITY))
49
+ }
50
+ }
51
+
52
+ config.getConfig(CFG_NAME, (cfg) => {
53
+ clearAllRules();
54
+ Object.entries(cfg[CFG_NAME]).forEach(([activity, activityCfg]) => {
55
+ if (activityCfg.default === false) {
56
+ setupDefaultRule(activity);
57
+ }
58
+ const rules = new Map();
59
+ rulesByActivity.set(activity, rules);
60
+
61
+ (activityCfg.rules || []).forEach(rule => {
62
+ const priority = rule.priority == null ? DEFAULT_PRIORITY : rule.priority;
63
+ if (!rules.has(priority)) {
64
+ rules.set(priority, [])
65
+ }
66
+ rules.get(priority).push(rule);
67
+ });
68
+
69
+ Array.from(rules.keys()).forEach(priority => setupRule(activity, priority));
70
+ });
71
+ })
72
+ }
73
+
74
+ updateRulesFromConfig(registerActivityControl);
@@ -111,6 +111,7 @@ export const spec = {
111
111
  { code: 'adasta', gvlid: 32 },
112
112
  { code: 'beintoo', gvlid: 618 },
113
113
  { code: 'projectagora', gvlid: 1032 },
114
+ { code: 'uol', gvlid: 32 },
114
115
  ],
115
116
  supportedMediaTypes: [BANNER, VIDEO, NATIVE],
116
117