prebid.js 6.26.0 → 6.29.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 (261) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adWMGAnalyticsAdapter.js +1 -1
  3. package/dist/adagioAnalyticsAdapter.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adfBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  9. package/dist/adlooxAdServerVideo.js +1 -1
  10. package/dist/adlooxAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/adoceanBidAdapter.js +1 -1
  13. package/dist/adomikAnalyticsAdapter.js +1 -1
  14. package/dist/adrelevantisBidAdapter.js +1 -1
  15. package/dist/adxcgAnalyticsAdapter.js +1 -1
  16. package/dist/adxcgBidAdapter.js +1 -1
  17. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  18. package/dist/adyoulikeBidAdapter.js +1 -1
  19. package/dist/ajaBidAdapter.js +1 -1
  20. package/dist/akamaiDapRtdProvider.js +1 -1
  21. package/dist/amxBidAdapter.js +1 -1
  22. package/dist/amxIdSystem.js +1 -1
  23. package/dist/appierAnalyticsAdapter.js +1 -1
  24. package/dist/appnexusAnalyticsAdapter.js +1 -1
  25. package/dist/appnexusBidAdapter.js +1 -1
  26. package/dist/asoBidAdapter.js +1 -1
  27. package/dist/atsAnalyticsAdapter.js +1 -1
  28. package/dist/audiencerunBidAdapter.js +1 -1
  29. package/dist/automatadBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/bidglassBidAdapter.js +1 -1
  32. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  33. package/dist/big-richmediaBidAdapter.js +1 -1
  34. package/dist/bluebillywigBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/byDataAnalyticsAdapter.js +1 -1
  38. package/dist/colossussspBidAdapter.js +1 -1
  39. package/dist/concertAnalyticsAdapter.js +1 -1
  40. package/dist/concertBidAdapter.js +1 -1
  41. package/dist/connectadBidAdapter.js +1 -1
  42. package/dist/consumableBidAdapter.js +1 -1
  43. package/dist/conversantBidAdapter.js +1 -1
  44. package/dist/craftBidAdapter.js +1 -1
  45. package/dist/criteoBidAdapter.js +1 -1
  46. package/dist/datablocksAnalyticsAdapter.js +1 -1
  47. package/dist/dspxBidAdapter.js +1 -1
  48. package/dist/eplanningAnalyticsAdapter.js +1 -1
  49. package/dist/eplanningBidAdapter.js +1 -1
  50. package/dist/fintezaAnalyticsAdapter.js +1 -1
  51. package/dist/ftrackIdSystem.js +1 -1
  52. package/dist/gdprEnforcement.js +1 -1
  53. package/dist/glimpseBidAdapter.js +1 -1
  54. package/dist/gmosspBidAdapter.js +1 -1
  55. package/dist/goldbachBidAdapter.js +1 -1
  56. package/dist/gridBidAdapter.js +1 -1
  57. package/dist/gridNMBidAdapter.js +1 -1
  58. package/dist/gumgumBidAdapter.js +1 -1
  59. package/dist/h12mediaBidAdapter.js +1 -1
  60. package/dist/hadronAnalyticsAdapter.js +1 -1
  61. package/dist/hadronRtdProvider.js +1 -1
  62. package/dist/id5AnalyticsAdapter.js +1 -1
  63. package/dist/id5IdSystem.js +1 -1
  64. package/dist/impactifyBidAdapter.js +1 -1
  65. package/dist/improvedigitalBidAdapter.js +1 -1
  66. package/dist/incrxBidAdapter.js +1 -0
  67. package/dist/inmarBidAdapter.js +1 -1
  68. package/dist/inskinBidAdapter.js +1 -1
  69. package/dist/insticatorBidAdapter.js +1 -1
  70. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  71. package/dist/ixBidAdapter.js +1 -1
  72. package/dist/jixieBidAdapter.js +1 -1
  73. package/dist/justpremiumBidAdapter.js +1 -1
  74. package/dist/kargoAnalyticsAdapter.js +1 -1
  75. package/dist/kargoBidAdapter.js +1 -1
  76. package/dist/koblerBidAdapter.js +1 -1
  77. package/dist/konduitAnalyticsAdapter.js +1 -1
  78. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  79. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  80. package/dist/logicadBidAdapter.js +1 -1
  81. package/dist/loglyliftBidAdapter.js +1 -1
  82. package/dist/malltvAnalyticsAdapter.js +1 -1
  83. package/dist/mantisBidAdapter.js +1 -1
  84. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  85. package/dist/marsmediaBidAdapter.js +1 -1
  86. package/dist/mediafuseBidAdapter.js +1 -1
  87. package/dist/mediakeysBidAdapter.js +1 -1
  88. package/dist/medianetAnalyticsAdapter.js +1 -1
  89. package/dist/medianetBidAdapter.js +1 -1
  90. package/dist/medianetRtdProvider.js +1 -1
  91. package/dist/mediasquareBidAdapter.js +1 -1
  92. package/dist/merkleIdSystem.js +1 -1
  93. package/dist/mgidBidAdapter.js +1 -1
  94. package/dist/minutemediaBidAdapter.js +1 -1
  95. package/dist/naveggIdSystem.js +1 -1
  96. package/dist/not-for-prod/prebid.js +178 -176
  97. package/dist/novatiqIdSystem.js +1 -1
  98. package/dist/oguryBidAdapter.js +1 -1
  99. package/dist/oneVideoBidAdapter.js +1 -1
  100. package/dist/onetagBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxAnalyticsAdapter.js +1 -1
  103. package/dist/optimonAnalyticsAdapter.js +1 -1
  104. package/dist/outbrainBidAdapter.js +1 -1
  105. package/dist/parrableIdSystem.js +1 -1
  106. package/dist/pixfutureBidAdapter.js +1 -1
  107. package/dist/prebid-core.js +3 -3
  108. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  109. package/dist/pubCommonId.js +1 -1
  110. package/dist/publinkIdSystem.js +1 -1
  111. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  112. package/dist/pubmaticBidAdapter.js +1 -1
  113. package/dist/pubperfAnalyticsAdapter.js +1 -1
  114. package/dist/pubstackAnalyticsAdapter.js +1 -1
  115. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  116. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  117. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  118. package/dist/pxyzBidAdapter.js +1 -1
  119. package/dist/quantcastBidAdapter.js +1 -1
  120. package/dist/readpeakBidAdapter.js +1 -1
  121. package/dist/realvuAnalyticsAdapter.js +1 -1
  122. package/dist/relaidoBidAdapter.js +1 -1
  123. package/dist/relevantAnalyticsAdapter.js +1 -1
  124. package/dist/rhythmoneBidAdapter.js +1 -1
  125. package/dist/riseBidAdapter.js +1 -1
  126. package/dist/rivrAnalyticsAdapter.js +1 -1
  127. package/dist/roxotAnalyticsAdapter.js +1 -1
  128. package/dist/rubiconAnalyticsAdapter.js +1 -1
  129. package/dist/rubiconBidAdapter.js +1 -1
  130. package/dist/scaleableAnalyticsAdapter.js +1 -1
  131. package/dist/seedingAllianceBidAdapter.js +1 -1
  132. package/dist/seedtagBidAdapter.js +1 -1
  133. package/dist/sharedIdSystem.js +1 -1
  134. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  135. package/dist/sharethroughBidAdapter.js +1 -1
  136. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  137. package/dist/slimcutBidAdapter.js +1 -1
  138. package/dist/smaatoBidAdapter.js +1 -1
  139. package/dist/smartadserverBidAdapter.js +1 -1
  140. package/dist/smartxBidAdapter.js +1 -1
  141. package/dist/smilewantedBidAdapter.js +1 -1
  142. package/dist/sonobiAnalyticsAdapter.js +1 -1
  143. package/dist/sonobiBidAdapter.js +1 -1
  144. package/dist/sortableAnalyticsAdapter.js +1 -1
  145. package/dist/sortableBidAdapter.js +1 -1
  146. package/dist/sovrnAnalyticsAdapter.js +1 -1
  147. package/dist/sovrnBidAdapter.js +1 -1
  148. package/dist/spotxBidAdapter.js +1 -1
  149. package/dist/sspBCBidAdapter.js +1 -1
  150. package/dist/staqAnalyticsAdapter.js +1 -1
  151. package/dist/sublimeBidAdapter.js +1 -1
  152. package/dist/synacormediaBidAdapter.js +1 -1
  153. package/dist/taboolaBidAdapter.js +1 -0
  154. package/dist/targetVideoBidAdapter.js +1 -1
  155. package/dist/teadsBidAdapter.js +1 -1
  156. package/dist/telariaBidAdapter.js +1 -1
  157. package/dist/terceptAnalyticsAdapter.js +1 -1
  158. package/dist/trionBidAdapter.js +1 -1
  159. package/dist/tripleliftBidAdapter.js +1 -1
  160. package/dist/trustxBidAdapter.js +1 -1
  161. package/dist/ttdBidAdapter.js +1 -1
  162. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  163. package/dist/underdogmediaBidAdapter.js +1 -1
  164. package/dist/undertoneBidAdapter.js +1 -1
  165. package/dist/userId.js +1 -1
  166. package/dist/vidazooBidAdapter.js +1 -1
  167. package/dist/videobyteBidAdapter.js +1 -1
  168. package/dist/visxBidAdapter.js +1 -1
  169. package/dist/vuukleBidAdapter.js +1 -1
  170. package/dist/widespaceBidAdapter.js +1 -1
  171. package/dist/winrBidAdapter.js +1 -1
  172. package/dist/yahoosspBidAdapter.js +1 -1
  173. package/dist/yieldmoBidAdapter.js +1 -1
  174. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  175. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  176. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  177. package/dist/zeta_global_sspBidAdapter.js +1 -1
  178. package/integrationExamples/gpt/akamaidap_segments_example.html +5 -3
  179. package/modules/.submodules.json +1 -0
  180. package/modules/adfBidAdapter.js +0 -3
  181. package/modules/adlooxAnalyticsAdapter.js +9 -5
  182. package/modules/adlooxAnalyticsAdapter.md +3 -3
  183. package/modules/adlooxRtdProvider.js +3 -5
  184. package/modules/adlooxRtdProvider.md +2 -2
  185. package/modules/adoceanBidAdapter.js +29 -1
  186. package/modules/adyoulikeBidAdapter.js +3 -0
  187. package/modules/akamaiDapRtdProvider.js +469 -139
  188. package/modules/akamaiDapRtdProvider.md +5 -3
  189. package/modules/automatadBidAdapter.js +9 -5
  190. package/modules/colossussspBidAdapter.js +17 -17
  191. package/modules/conversantBidAdapter.js +2 -2
  192. package/modules/criteoBidAdapter.js +1 -1
  193. package/modules/ftrackIdSystem.js +5 -8
  194. package/modules/gdprEnforcement.js +15 -9
  195. package/modules/gridBidAdapter.js +4 -0
  196. package/modules/hadronAnalyticsAdapter.js +5 -1
  197. package/modules/hadronRtdProvider.js +15 -13
  198. package/modules/incrxBidAdapter.js +87 -0
  199. package/modules/{vertozBidAdapter.md → incrxBidAdapter.md} +6 -6
  200. package/modules/inskinBidAdapter.js +4 -3
  201. package/modules/insticatorBidAdapter.js +109 -42
  202. package/modules/ixBidAdapter.js +3 -2
  203. package/modules/ixBidAdapter.md +1 -1
  204. package/modules/kargoBidAdapter.js +32 -1
  205. package/modules/koblerBidAdapter.js +54 -45
  206. package/modules/koblerBidAdapter.md +12 -17
  207. package/modules/mantisBidAdapter.js +4 -8
  208. package/modules/medianetBidAdapter.js +2 -2
  209. package/modules/medianetRtdProvider.js +4 -6
  210. package/modules/merkleIdSystem.js +43 -31
  211. package/modules/naveggIdSystem.js +3 -2
  212. package/modules/novatiqIdSystem.js +6 -1
  213. package/modules/pubCommonId.js +2 -1
  214. package/modules/pubmaticAnalyticsAdapter.js +49 -33
  215. package/modules/relaidoBidAdapter.js +0 -3
  216. package/modules/sharedIdSystem.js +5 -11
  217. package/modules/slimcutBidAdapter.js +2 -2
  218. package/modules/spotxBidAdapter.js +1 -1
  219. package/modules/synacormediaBidAdapter.js +11 -2
  220. package/modules/taboolaBidAdapter.js +265 -0
  221. package/modules/taboolaBidAdapter.md +49 -0
  222. package/modules/telariaBidAdapter.js +3 -3
  223. package/modules/userId/eids.js +25 -5
  224. package/modules/zeta_global_sspBidAdapter.js +3 -2
  225. package/package.json +1 -1
  226. package/src/AnalyticsAdapter.js +5 -1
  227. package/src/adloader.js +6 -1
  228. package/src/storageManager.js +5 -4
  229. package/test/mocks/analyticsStub.js +13 -0
  230. package/test/mocks/xhr.js +22 -0
  231. package/test/spec/AnalyticsAdapter_spec.js +4 -0
  232. package/test/spec/modules/adfBidAdapter_spec.js +1 -1
  233. package/test/spec/modules/adoceanBidAdapter_spec.js +25 -1
  234. package/test/spec/modules/adriverIdSystem_spec.js +7 -3
  235. package/test/spec/modules/adyoulikeBidAdapter_spec.js +16 -1
  236. package/test/spec/modules/akamaiDapRtdProvider_spec.js +457 -109
  237. package/test/spec/modules/automatadBidAdapter_spec.js +4 -0
  238. package/test/spec/modules/conversantBidAdapter_spec.js +36 -5
  239. package/test/spec/modules/datablocksBidAdapter_spec.js +9 -8
  240. package/test/spec/modules/eids_spec.js +48 -3
  241. package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +4 -4
  242. package/test/spec/modules/ftrackIdSystem_spec.js +11 -22
  243. package/test/spec/modules/gdprEnforcement_spec.js +100 -53
  244. package/test/spec/modules/gridBidAdapter_spec.js +11 -0
  245. package/test/spec/modules/incrxBidAdapter_spec.js +100 -0
  246. package/test/spec/modules/insticatorBidAdapter_spec.js +46 -1
  247. package/test/spec/modules/ixBidAdapter_spec.js +1 -1
  248. package/test/spec/modules/kargoBidAdapter_spec.js +27 -0
  249. package/test/spec/modules/koblerBidAdapter_spec.js +160 -124
  250. package/test/spec/modules/medianetRtdProvider_spec.js +146 -0
  251. package/test/spec/modules/merkleIdSystem_spec.js +58 -37
  252. package/test/spec/modules/naveggIdSystem_spec.js +25 -1
  253. package/test/spec/modules/proxistoreBidAdapter_spec.js +0 -2
  254. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +117 -0
  255. package/test/spec/modules/sovrnBidAdapter_spec.js +253 -264
  256. package/test/spec/modules/synacormediaBidAdapter_spec.js +74 -0
  257. package/test/spec/modules/taboolaBidAdapter_spec.js +455 -0
  258. package/test/spec/modules/userId_spec.js +27 -1
  259. package/test/spec/modules/vidazooBidAdapter_spec.js +9 -4
  260. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +4 -2
  261. package/test/test_deps.js +1 -0
@@ -1,5 +1,5 @@
1
1
  import {config} from '../src/config.js';
2
- import {BANNER} from '../src/mediaTypes.js';
2
+ import {BANNER, VIDEO} from '../src/mediaTypes.js';
3
3
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
4
  import {deepAccess, generateUUID, logError, isArray} from '../src/utils.js';
5
5
  import {getStorageManager} from '../src/storageManager.js';
@@ -48,14 +48,9 @@ function setUserId(userId) {
48
48
  }
49
49
  }
50
50
 
51
- function buildImpression(bidRequest) {
51
+ function buildBanner(bidRequest) {
52
52
  const format = [];
53
- const ext = {
54
- insticator: {
55
- adUnitId: bidRequest.params.adUnitId,
56
- },
57
- }
58
-
53
+ const pos = deepAccess(bidRequest, 'mediaTypes.banner.pos');
59
54
  const sizes =
60
55
  deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes;
61
56
 
@@ -66,27 +61,47 @@ function buildImpression(bidRequest) {
66
61
  });
67
62
  }
68
63
 
69
- const gpid = deepAccess(bidRequest, 'ortb2Imp.ext.gpid');
70
-
71
- if (gpid) {
72
- ext.gpid = gpid;
64
+ return {
65
+ format,
66
+ pos,
73
67
  }
68
+ }
74
69
 
75
- const instl = deepAccess(bidRequest, 'ortb2Imp.instl')
76
- const secure = location.protocol === 'https:' ? 1 : 0;
77
- const pos = deepAccess(bidRequest, 'mediaTypes.banner.pos');
70
+ function buildVideo(bidRequest) {
71
+ const w = deepAccess(bidRequest, 'mediaTypes.video.w');
72
+ const h = deepAccess(bidRequest, 'mediaTypes.video.h');
73
+ const mimes = deepAccess(bidRequest, 'mediaTypes.video.mimes');
78
74
 
79
75
  return {
76
+ mimes,
77
+ w,
78
+ h,
79
+ }
80
+ }
81
+
82
+ function buildImpression(bidRequest) {
83
+ const imp = {
80
84
  id: bidRequest.bidId,
81
85
  tagid: bidRequest.adUnitCode,
82
- instl,
83
- secure,
84
- banner: {
85
- format,
86
- pos,
86
+ instl: deepAccess(bidRequest, 'ortb2Imp.instl'),
87
+ secure: location.protocol === 'https:' ? 1 : 0,
88
+ ext: {
89
+ gpid: deepAccess(bidRequest, 'ortb2Imp.ext.gpid'),
90
+ insticator: {
91
+ adUnitId: bidRequest.params.adUnitId,
92
+ },
87
93
  },
88
- ext,
89
- };
94
+ }
95
+
96
+ if (deepAccess(bidRequest, 'mediaTypes.banner')) {
97
+ imp.banner = buildBanner(bidRequest);
98
+ }
99
+
100
+ if (deepAccess(bidRequest, 'mediaTypes.video')) {
101
+ imp.video = buildVideo(bidRequest);
102
+ }
103
+
104
+ return imp;
90
105
  }
91
106
 
92
107
  function buildDevice() {
@@ -252,31 +267,83 @@ function validateSizes(sizes) {
252
267
  );
253
268
  }
254
269
 
255
- export const spec = {
256
- code: BIDDER_CODE,
257
- gvlid: GVLID,
258
- supportedMediaTypes: [BANNER],
270
+ function validateAdUnitId(bid) {
271
+ if (!bid.params.adUnitId) {
272
+ logError('insticator: missing adUnitId bid parameter');
273
+ return false;
274
+ }
259
275
 
260
- isBidRequestValid: function (bid) {
261
- if (!bid.params.adUnitId) {
262
- logError('insticator: missing adUnitId bid parameter');
263
- return false;
264
- }
276
+ return true;
277
+ }
265
278
 
266
- if (!(BANNER in bid.mediaTypes)) {
267
- logError('insticator: expected banner in mediaTypes');
268
- return false;
269
- }
279
+ function validateMediaType(bid) {
280
+ if (!(BANNER in bid.mediaTypes || VIDEO in bid.mediaTypes)) {
281
+ logError('insticator: expected banner or video in mediaTypes');
282
+ return false;
283
+ }
270
284
 
271
- if (
272
- !validateSizes(bid.sizes) &&
273
- !validateSizes(bid.mediaTypes.banner.sizes)
274
- ) {
275
- logError('insticator: banner sizes not specified or invalid');
276
- return false;
277
- }
285
+ return true;
286
+ }
278
287
 
288
+ function validateBanner(bid) {
289
+ const banner = deepAccess(bid, 'mediaTypes.banner');
290
+
291
+ if (banner === undefined) {
279
292
  return true;
293
+ }
294
+
295
+ if (
296
+ !validateSizes(bid.sizes) &&
297
+ !validateSizes(bid.mediaTypes.banner.sizes)
298
+ ) {
299
+ logError('insticator: banner sizes not specified or invalid');
300
+ return false;
301
+ }
302
+
303
+ return true;
304
+ }
305
+
306
+ function validateVideo(bid) {
307
+ const video = deepAccess(bid, 'mediaTypes.video');
308
+
309
+ if (video === undefined) {
310
+ return true;
311
+ }
312
+
313
+ const videoSize = [
314
+ deepAccess(bid, 'mediaTypes.video.w'),
315
+ deepAccess(bid, 'mediaTypes.video.h'),
316
+ ];
317
+
318
+ if (
319
+ !validateSize(videoSize)
320
+ ) {
321
+ logError('insticator: video size not specified or invalid');
322
+ return false;
323
+ }
324
+
325
+ const mimes = deepAccess(bid, 'mediaTypes.video.mimes');
326
+
327
+ if (!Array.isArray(mimes) || mimes.length === 0) {
328
+ logError('insticator: mimes not specified');
329
+ return false;
330
+ }
331
+
332
+ return true;
333
+ }
334
+
335
+ export const spec = {
336
+ code: BIDDER_CODE,
337
+ gvlid: GVLID,
338
+ supportedMediaTypes: [ BANNER, VIDEO ],
339
+
340
+ isBidRequestValid: function (bid) {
341
+ return (
342
+ validateAdUnitId(bid) &&
343
+ validateMediaType(bid) &&
344
+ validateBanner(bid) &&
345
+ validateVideo(bid)
346
+ );
280
347
  },
281
348
 
282
349
  buildRequests: function (validBidRequests, bidderRequest) {
@@ -30,7 +30,8 @@ import {Renderer} from '../src/Renderer.js';
30
30
  const BIDDER_CODE = 'ix';
31
31
  const ALIAS_BIDDER_CODE = 'roundel';
32
32
  const GLOBAL_VENDOR_ID = 10;
33
- const SECURE_BID_URL = 'https://htlb.casalemedia.com/cygnus';
33
+ const MODULE_TYPE = 'bid-adapter';
34
+ const SECURE_BID_URL = 'https://htlb.casalemedia.com/openrtb/pbjs';
34
35
  const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
35
36
  const BANNER_ENDPOINT_VERSION = 7.2;
36
37
  const VIDEO_ENDPOINT_VERSION = 8.1;
@@ -1086,7 +1087,7 @@ function localStorageHandler(data) {
1086
1087
  hasEnforcementHook: false,
1087
1088
  valid: hasDeviceAccess()
1088
1089
  };
1089
- validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
1090
+ validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, MODULE_TYPE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => {
1090
1091
  if (permissions.valid) {
1091
1092
  storeErrorEventData(data);
1092
1093
  }
@@ -423,4 +423,4 @@ The `size` parameter is no longer a required field, the `siteId` will now be ass
423
423
  In your browser of choice, create a new tab and open the developer tools. In
424
424
  developer tools, select the network tab. Then, navigate to a page where IX is
425
425
  setup to bid. Now, in the network tab, search for requests to
426
- `casalemedia.com/cygnus`. These are the bid requests.
426
+ `casalemedia.com/openrtb/pbjs`. These are the bid requests.
@@ -1,4 +1,4 @@
1
- import { _each } from '../src/utils.js';
1
+ import { _each, buildUrl, triggerPixel } from '../src/utils.js';
2
2
  import { config } from '../src/config.js';
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { getStorageManager } from '../src/storageManager.js';
@@ -55,6 +55,10 @@ export const spec = {
55
55
  },
56
56
  bidIDs,
57
57
  bidSizes,
58
+ device: {
59
+ width: window.screen.width,
60
+ height: window.screen.height
61
+ },
58
62
  prebidRawBidRequests: validBidRequests
59
63
  }, spec._getAllMetadata(tdid, bidderRequest.uspConsent, bidderRequest.gdprConsent));
60
64
  const encodedParams = encodeURIComponent(JSON.stringify(transformedParams));
@@ -133,6 +137,15 @@ export const spec = {
133
137
  return syncs;
134
138
  },
135
139
  supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
140
+ onTimeout: function(timeoutData) {
141
+ if (timeoutData == null) {
142
+ return;
143
+ }
144
+
145
+ timeoutData.forEach((bid) => {
146
+ this._sendTimeoutData(bid.auctionId, bid.timeout);
147
+ });
148
+ },
136
149
 
137
150
  // PRIVATE
138
151
  _readCookie(name) {
@@ -263,6 +276,24 @@ export const spec = {
263
276
  } catch (e) {
264
277
  return '';
265
278
  }
279
+ },
280
+
281
+ _sendTimeoutData(auctionId, auctionTimeout) {
282
+ let params = {
283
+ aid: auctionId,
284
+ ato: auctionTimeout,
285
+ };
286
+
287
+ try {
288
+ let timeoutRequestUrl = buildUrl({
289
+ protocol: 'https',
290
+ hostname: 'krk.kargo.com',
291
+ pathname: '/api/v1/event/timeout',
292
+ search: params
293
+ });
294
+
295
+ triggerPixel(timeoutRequestUrl);
296
+ } catch (e) {}
266
297
  }
267
298
  };
268
299
  registerBidder(spec);
@@ -1,4 +1,12 @@
1
- import { deepAccess, isStr, replaceAuctionPrice, triggerPixel, isArray, parseQueryStringParameters, getWindowSelf } from '../src/utils.js';
1
+ import {
2
+ deepAccess,
3
+ getWindowSelf,
4
+ isArray,
5
+ isStr,
6
+ parseQueryStringParameters,
7
+ replaceAuctionPrice,
8
+ triggerPixel
9
+ } from '../src/utils.js';
2
10
  import {config} from '../src/config.js';
3
11
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
12
  import {BANNER} from '../src/mediaTypes.js';
@@ -6,19 +14,26 @@ import {getRefererInfo} from '../src/refererDetection.js';
6
14
 
7
15
  const BIDDER_CODE = 'kobler';
8
16
  const BIDDER_ENDPOINT = 'https://bid.essrtb.com/bid/prebid_rtb_call';
17
+ const DEV_BIDDER_ENDPOINT = 'https://bid-service.dev.essrtb.com/bid/prebid_rtb_call';
9
18
  const TIMEOUT_NOTIFICATION_ENDPOINT = 'https://bid.essrtb.com/notify/prebid_timeout';
10
19
  const SUPPORTED_CURRENCY = 'USD';
11
20
  const DEFAULT_TIMEOUT = 1000;
12
21
  const TIME_TO_LIVE_IN_SECONDS = 10 * 60;
13
22
 
14
23
  export const isBidRequestValid = function (bid) {
15
- return !!(bid && bid.bidId && bid.params && bid.params.placementId);
24
+ if (!bid || !bid.bidId) {
25
+ return false;
26
+ }
27
+
28
+ const sizes = deepAccess(bid, 'mediaTypes.banner.sizes', bid.sizes);
29
+ return isArray(sizes) && sizes.length > 0;
16
30
  };
17
31
 
18
32
  export const buildRequests = function (validBidRequests, bidderRequest) {
33
+ const bidderEndpoint = isTest(validBidRequests[0]) ? DEV_BIDDER_ENDPOINT : BIDDER_ENDPOINT;
19
34
  return {
20
35
  method: 'POST',
21
- url: BIDDER_ENDPOINT,
36
+ url: bidderEndpoint,
22
37
  data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest),
23
38
  options: {
24
39
  contentType: 'application/json'
@@ -27,14 +42,11 @@ export const buildRequests = function (validBidRequests, bidderRequest) {
27
42
  };
28
43
 
29
44
  export const interpretResponse = function (serverResponse) {
30
- const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
31
45
  const res = serverResponse.body;
32
46
  const bids = []
33
47
  if (res) {
34
48
  res.seatbid.forEach(sb => {
35
49
  sb.bid.forEach(b => {
36
- const adWithCorrectCurrency = b.adm
37
- .replace(/\${AUCTION_PRICE_CURRENCY}/g, adServerPriceCurrency);
38
50
  bids.push({
39
51
  requestId: b.impid,
40
52
  cpm: b.price,
@@ -45,7 +57,7 @@ export const interpretResponse = function (serverResponse) {
45
57
  dealId: b.dealid,
46
58
  netRevenue: true,
47
59
  ttl: TIME_TO_LIVE_IN_SECONDS,
48
- ad: adWithCorrectCurrency,
60
+ ad: b.adm,
49
61
  nurl: b.nurl,
50
62
  meta: {
51
63
  advertiserDomains: b.adomain
@@ -58,13 +70,15 @@ export const interpretResponse = function (serverResponse) {
58
70
  };
59
71
 
60
72
  export const onBidWon = function (bid) {
61
- const cpm = bid.cpm || 0;
62
- const cpmCurrency = bid.currency || SUPPORTED_CURRENCY;
73
+ // We intentionally use the price set by the publisher to replace the ${AUCTION_PRICE} macro
74
+ // instead of the `originalCpm` here. This notification is not used for billing, only for extra logging.
75
+ const publisherPrice = bid.cpm || 0;
76
+ const publisherCurrency = bid.currency || config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
63
77
  const adServerPrice = deepAccess(bid, 'adserverTargeting.hb_pb', 0);
64
78
  const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY;
65
79
  if (isStr(bid.nurl) && bid.nurl !== '') {
66
- const winNotificationUrl = replaceAuctionPrice(bid.nurl, bid.originalCpm || cpm)
67
- .replace(/\${AUCTION_PRICE_CURRENCY}/g, cpmCurrency)
80
+ const winNotificationUrl = replaceAuctionPrice(bid.nurl, publisherPrice)
81
+ .replace(/\${AUCTION_PRICE_CURRENCY}/g, publisherCurrency)
68
82
  .replace(/\${AD_SERVER_PRICE}/g, adServerPrice)
69
83
  .replace(/\${AD_SERVER_PRICE_CURRENCY}/g, adServerPriceCurrency);
70
84
  triggerPixel(winNotificationUrl);
@@ -73,17 +87,13 @@ export const onBidWon = function (bid) {
73
87
 
74
88
  export const onTimeout = function (timeoutDataArray) {
75
89
  if (isArray(timeoutDataArray)) {
76
- const refererInfo = getRefererInfo();
77
- const pageUrl = (refererInfo && refererInfo.referer)
78
- ? refererInfo.referer
79
- : window.location.href;
90
+ const pageUrl = getPageUrlFromRefererInfo();
80
91
  timeoutDataArray.forEach(timeoutData => {
81
92
  const query = parseQueryStringParameters({
82
93
  ad_unit_code: timeoutData.adUnitCode,
83
94
  auction_id: timeoutData.auctionId,
84
95
  bid_id: timeoutData.bidId,
85
96
  timeout: timeoutData.timeout,
86
- placement_id: deepAccess(timeoutData, 'params.0.placementId'),
87
97
  page_url: pageUrl,
88
98
  });
89
99
  const timeoutNotificationUrl = `${TIMEOUT_NOTIFICATION_ENDPOINT}?${query}`;
@@ -92,13 +102,28 @@ export const onTimeout = function (timeoutDataArray) {
92
102
  }
93
103
  };
94
104
 
95
- function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
96
- const imps = validBidRequests.map(buildOpenRtbImpObject);
97
- const timeout = bidderRequest.timeout || config.getConfig('bidderTimeout') || DEFAULT_TIMEOUT;
98
- const pageUrl = (bidderRequest.refererInfo && bidderRequest.refererInfo.referer)
105
+ function getPageUrlFromRefererInfo() {
106
+ const refererInfo = getRefererInfo();
107
+ return (refererInfo && refererInfo.referer)
108
+ ? refererInfo.referer
109
+ : window.location.href;
110
+ }
111
+
112
+ function getPageUrlFromRequest(validBidRequest, bidderRequest) {
113
+ // pageUrl is considered only when testing to ensure that non-test requests always contain the correct URL
114
+ if (isTest(validBidRequest) && config.getConfig('pageUrl')) {
115
+ return config.getConfig('pageUrl');
116
+ }
117
+
118
+ return (bidderRequest.refererInfo && bidderRequest.refererInfo.referer)
99
119
  ? bidderRequest.refererInfo.referer
100
120
  : window.location.href;
121
+ }
101
122
 
123
+ function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
124
+ const imps = validBidRequests.map(buildOpenRtbImpObject);
125
+ const timeout = bidderRequest.timeout || config.getConfig('bidderTimeout') || DEFAULT_TIMEOUT;
126
+ const pageUrl = getPageUrlFromRequest(validBidRequests[0], bidderRequest)
102
127
  const request = {
103
128
  id: bidderRequest.auctionId,
104
129
  at: 1,
@@ -106,13 +131,12 @@ function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
106
131
  cur: [SUPPORTED_CURRENCY],
107
132
  imp: imps,
108
133
  device: {
109
- devicetype: getDevice(),
110
- geo: getGeo(validBidRequests[0])
134
+ devicetype: getDevice()
111
135
  },
112
136
  site: {
113
137
  page: pageUrl,
114
138
  },
115
- test: getTest(validBidRequests[0])
139
+ test: getTestAsNumber(validBidRequests[0])
116
140
  };
117
141
 
118
142
  return JSON.stringify(request);
@@ -128,14 +152,8 @@ function buildOpenRtbImpObject(validBidRequest) {
128
152
  banner: {
129
153
  format: buildFormatArray(sizes),
130
154
  w: mainSize[0],
131
- h: mainSize[1],
132
- ext: {
133
- kobler: {
134
- pos: getPosition(validBidRequest)
135
- }
136
- }
155
+ h: mainSize[1]
137
156
  },
138
- tagid: validBidRequest.params.placementId,
139
157
  bidfloor: floorInfo.floor,
140
158
  bidfloorcur: floorInfo.currency,
141
159
  pmp: buildPmpObject(validBidRequest)
@@ -157,17 +175,12 @@ function getDevice() {
157
175
  return 2; // personal computers
158
176
  }
159
177
 
160
- function getGeo(validBidRequest) {
161
- if (validBidRequest.params.zip) {
162
- return {
163
- zip: validBidRequest.params.zip
164
- };
165
- }
166
- return {};
178
+ function getTestAsNumber(validBidRequest) {
179
+ return isTest(validBidRequest) ? 1 : 0;
167
180
  }
168
181
 
169
- function getTest(validBidRequest) {
170
- return validBidRequest.params.test ? 1 : 0;
182
+ function isTest(validBidRequest) {
183
+ return validBidRequest.params && validBidRequest.params.test === true;
171
184
  }
172
185
 
173
186
  function getSizes(validBidRequest) {
@@ -188,10 +201,6 @@ function buildFormatArray(sizes) {
188
201
  });
189
202
  }
190
203
 
191
- function getPosition(validBidRequest) {
192
- return parseInt(validBidRequest.params.position) || 0;
193
- }
194
-
195
204
  function getFloorInfo(validBidRequest, mainSize) {
196
205
  if (typeof validBidRequest.getFloor === 'function') {
197
206
  const sizeParam = mainSize[0] === 0 && mainSize[1] === 0 ? '*' : mainSize;
@@ -209,11 +218,11 @@ function getFloorInfo(validBidRequest, mainSize) {
209
218
  }
210
219
 
211
220
  function getFloorPrice(validBidRequest) {
212
- return parseFloat(validBidRequest.params.floorPrice) || 0.0;
221
+ return parseFloat(deepAccess(validBidRequest, 'params.floorPrice', 0.0));
213
222
  }
214
223
 
215
224
  function buildPmpObject(validBidRequest) {
216
- if (validBidRequest.params.dealIds) {
225
+ if (validBidRequest.params && validBidRequest.params.dealIds && isArray(validBidRequest.params.dealIds)) {
217
226
  return {
218
227
  deals: validBidRequest.params.dealIds.map(dealId => {
219
228
  return {
@@ -12,14 +12,15 @@ This adapter currently only supports Banner Ads.
12
12
 
13
13
  # Parameters
14
14
 
15
- | Parameter (in `params`) | Scope | Type | Description | Example |
16
- | --- | --- | --- | --- | --- |
17
- | placementId | Required | String | The identifier of the placement, it has to be issued by Kobler. | `'xjer0ch8'` |
18
- | zip | Optional | String | Zip code of the user or the medium. When multiple ad units are submitted together, it is enough to set this parameter on the first one. | `'102 22'` |
19
- | test | Optional | Boolean | Whether the request is for testing only. When multiple ad units are submitted together, it is enough to set this parameter on the first one. Defaults to false. | `true` |
20
- | floorPrice | Optional | Float | Floor price in CPM and USD. Can be used as an alternative to the [Floors module](https://docs.prebid.org/dev-docs/modules/floors.html), which is also supported by this adapter. Defaults to 0. | `5.0` |
21
- | position | Optional | Integer | The position of the ad unit. Can be used to differentiate between ad units if the same placement ID is used across multiple ad units. The first ad unit should have a `position` of 0, the second one should have a `position` of 1 and so on. Defaults to 0. | `1` |
22
- | dealIds | Optional | Array of Strings | Array of deal IDs. | `['abc328745', 'mxw243253']` |
15
+ | Parameter (in `params`) | Scope | Type | Description | Example |
16
+ |-------------------------|----------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|
17
+ | test | Optional | Boolean | Whether the request is for testing only. When multiple ad units are submitted together, it is enough to set this parameter on the first one. Enables providing a custom URL through config.pageUrl. Defaults to false. | `true` |
18
+ | floorPrice | Optional | Float | Floor price in CPM and USD. Can be used as an alternative to the [Floors module](https://docs.prebid.org/dev-docs/modules/floors.html), which is also supported by this adapter. Defaults to 0. | `5.0` |
19
+ | dealIds | Optional | Array of Strings | Array of deal IDs. | `['abc328745', 'mxw243253']` |
20
+
21
+ ## Implicit parameters
22
+
23
+ Kobler identifies the placement using the combination of the page URL and the allowed sizes. As a result, it's important that the correct sizes are provided in `banner.sizes` in order for Kobler to correctly identify the placement. The main, desired format should be the first element of this array.
23
24
 
24
25
  # Test Parameters
25
26
  ```javascript
@@ -31,17 +32,14 @@ This adapter currently only supports Banner Ads.
31
32
  }
32
33
  },
33
34
  bids: [{
34
- bidder: 'kobler',
35
- params: {
36
- placementId: 'k5H7et3R0'
37
- }
35
+ bidder: 'kobler'
38
36
  }]
39
37
  }];
40
38
  ```
41
39
 
42
40
  In order to see a sample bid from Kobler (without a proper setup), you have to also do the following:
43
- - Change the [`refererInfo` function](https://github.com/prebid/Prebid.js/blob/master/src/refererDetection.js) to return `'https://www.tv2.no/a/11734615'` as a [`referer`](https://github.com/prebid/Prebid.js/blob/caead3ccccc448e4cd09d074fd9f8833f56fe9b3/src/refererDetection.js#L169). This is necessary because Kobler only bids on recognized articles.
44
- - Change the adapter's [`BIDDER_ENDPOINT`](https://github.com/prebid/Prebid.js/blob/master/modules/koblerBidAdapter.js#L8) to `'https://bid-service.dev.essrtb.com/bid/prebid_rtb_call'`. This endpoint belongs to the development server that is set up to always return a bid for the correct `placementId` and page URL combination.
41
+ - Set the `test` parameter to `true`.
42
+ - Set `config.pageUrl` to `'https://www.tv2.no/mening-og-analyse/14555348/'`. This is necessary because Kobler only bids on recognized articles. Kobler runs its own test campaign to make sure there is always a bid for this specific page URL.
45
43
 
46
44
  # Test Optional Parameters
47
45
  ```javascript
@@ -55,11 +53,8 @@ In order to see a sample bid from Kobler (without a proper setup), you have to a
55
53
  bids: [{
56
54
  bidder: 'kobler',
57
55
  params: {
58
- placementId: 'k5H7et3R0',
59
- zip: '102 22',
60
56
  test: true,
61
57
  floorPrice: 5.0,
62
- position: 1,
63
58
  dealIds: ['abc328745', 'mxw243253']
64
59
  }
65
60
  }]
@@ -1,5 +1,6 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
2
  import { getStorageManager } from '../src/storageManager.js';
3
+ import { ajax } from '../src/ajax.js';
3
4
 
4
5
  export const storage = getStorageManager({bidderCode: 'mantis'});
5
6
 
@@ -10,12 +11,7 @@ function inIframe() {
10
11
  return true;
11
12
  }
12
13
  }
13
- function pixel(url, parent) {
14
- var img = document.createElement('img');
15
- img.src = url;
16
- img.style.cssText = 'display:none !important;';
17
- (parent || document.body).appendChild(img);
18
- }
14
+
19
15
  export function onVisible(win, element, doOnVisible, time, pct) {
20
16
  var started = null;
21
17
  var notified = false;
@@ -301,9 +297,9 @@ export function iframePostMessage (win, name, callback) {
301
297
 
302
298
  onMessage('iframe', function (data) {
303
299
  if (window.$sf) {
304
- sfPostMessage(window.$sf, data.width, data.height, () => pixel(data.pixel));
300
+ sfPostMessage(window.$sf, data.width, data.height, () => ajax(data.pixel));
305
301
  } else {
306
- iframePostMessage(window, data.frame, () => pixel(data.pixel));
302
+ iframePostMessage(window, data.frame, () => ajax(data.pixel));
307
303
  }
308
304
  });
309
305
 
@@ -27,10 +27,10 @@ window.mnet = window.mnet || {};
27
27
  window.mnet.queue = window.mnet.queue || [];
28
28
 
29
29
  mnData.urlData = {
30
- domain: parseUrl(refererInfo.referer).hostname,
30
+ domain: parseUrl(refererInfo.referer, {noDecodeWholeURL: true}).hostname,
31
31
  page: refererInfo.referer,
32
32
  isTop: refererInfo.reachedTop
33
- }
33
+ };
34
34
 
35
35
  $$PREBID_GLOBAL$$.medianetGlobals = $$PREBID_GLOBAL$$.medianetGlobals || {};
36
36
 
@@ -1,4 +1,5 @@
1
- import {insertElement, isEmptyStr, isFn, isStr, logError, mergeDeep} from '../src/utils.js';
1
+ import {isEmptyStr, isFn, isStr, logError, mergeDeep} from '../src/utils.js';
2
+ import {loadExternalScript} from '../src/adloader.js';
2
3
  import {submodule} from '../src/hook.js';
3
4
  import {getGlobal} from '../src/prebidGlobal.js';
4
5
  import {includes} from '../src/polyfill.js';
@@ -82,11 +83,8 @@ function executeCommand(command) {
82
83
  }
83
84
 
84
85
  function loadRtdScript(customerId) {
85
- const script = document.createElement('script');
86
- script.type = 'text/javascript';
87
- script.async = true;
88
- script.src = getClientUrl(customerId, window.location.hostname);
89
- insertElement(script, window.document, 'head');
86
+ const url = getClientUrl(customerId, window.location.hostname);
87
+ loadExternalScript(url, MODULE_NAME)
90
88
  }
91
89
 
92
90
  function getAdUnits(adUnits, adUnitCodes) {