prebid.js 7.11.0 → 7.12.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 (170) hide show
  1. package/.github/workflows/issue_tracker.yml +1 -1
  2. package/dist/33acrossBidAdapter.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/adkernelBidAdapter.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adriverBidAdapter.js +1 -1
  9. package/dist/adriverIdSystem.js +1 -1
  10. package/dist/adtelligentBidAdapter.js +1 -1
  11. package/dist/adtrgtmeBidAdapter.js +1 -1
  12. package/dist/adxcgBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/alkimiBidAdapter.js +1 -1
  15. package/dist/amxBidAdapter.js +1 -1
  16. package/dist/amxIdSystem.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/betweenBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/concertBidAdapter.js +1 -1
  28. package/dist/connectadBidAdapter.js +1 -1
  29. package/dist/consumableBidAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/dfpAdServerVideo.js +1 -1
  34. package/dist/dgkeywordRtdProvider.js +1 -1
  35. package/dist/displayioBidAdapter.js +1 -3
  36. package/dist/dspxBidAdapter.js +1 -1
  37. package/dist/eplanningBidAdapter.js +1 -1
  38. package/dist/finativeBidAdapter.js +1 -1
  39. package/dist/glimpseBidAdapter.js +1 -1
  40. package/dist/gmosspBidAdapter.js +1 -1
  41. package/dist/goldbachBidAdapter.js +1 -1
  42. package/dist/gridBidAdapter.js +1 -1
  43. package/dist/gridNMBidAdapter.js +1 -1
  44. package/dist/gumgumBidAdapter.js +1 -1
  45. package/dist/h12mediaBidAdapter.js +1 -1
  46. package/dist/id5IdSystem.js +1 -1
  47. package/dist/improvedigitalBidAdapter.js +1 -1
  48. package/dist/inmarBidAdapter.js +1 -1
  49. package/dist/insticatorBidAdapter.js +1 -1
  50. package/dist/ixBidAdapter.js +1 -1
  51. package/dist/justpremiumBidAdapter.js +1 -1
  52. package/dist/konduitAnalyticsAdapter.js +1 -1
  53. package/dist/kueezBidAdapter.js +1 -1
  54. package/dist/lassoBidAdapter.js +1 -1
  55. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  56. package/dist/logicadBidAdapter.js +1 -1
  57. package/dist/loglyliftBidAdapter.js +1 -1
  58. package/dist/malltvAnalyticsAdapter.js +1 -1
  59. package/dist/marsmediaBidAdapter.js +1 -1
  60. package/dist/mediafuseBidAdapter.js +1 -1
  61. package/dist/mediagoBidAdapter.js +1 -0
  62. package/dist/mediasquareBidAdapter.js +1 -1
  63. package/dist/mgidBidAdapter.js +1 -1
  64. package/dist/minutemediaBidAdapter.js +1 -1
  65. package/dist/nextMillenniumBidAdapter.js +1 -1
  66. package/dist/not-for-prod/prebid.js +120 -121
  67. package/dist/oguryBidAdapter.js +1 -1
  68. package/dist/onetagBidAdapter.js +1 -1
  69. package/dist/ooloAnalyticsAdapter.js +1 -1
  70. package/dist/outbrainBidAdapter.js +1 -1
  71. package/dist/parrableIdSystem.js +1 -1
  72. package/dist/pixfutureBidAdapter.js +1 -1
  73. package/dist/prebid-core.js +1 -1
  74. package/dist/publinkIdSystem.js +1 -1
  75. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  76. package/dist/pubmaticBidAdapter.js +1 -1
  77. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  78. package/dist/pxyzBidAdapter.js +1 -1
  79. package/dist/quantcastBidAdapter.js +1 -1
  80. package/dist/rasBidAdapter.js +1 -1
  81. package/dist/readpeakBidAdapter.js +1 -1
  82. package/dist/relaidoBidAdapter.js +1 -1
  83. package/dist/rhythmoneBidAdapter.js +1 -1
  84. package/dist/riseBidAdapter.js +1 -1
  85. package/dist/rubiconAnalyticsAdapter.js +1 -1
  86. package/dist/rubiconBidAdapter.js +1 -1
  87. package/dist/seedingAllianceBidAdapter.js +1 -1
  88. package/dist/seedtagBidAdapter.js +1 -1
  89. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  90. package/dist/sharethroughBidAdapter.js +1 -1
  91. package/dist/shinezBidAdapter.js +1 -1
  92. package/dist/smaatoBidAdapter.js +1 -1
  93. package/dist/smartadserverBidAdapter.js +1 -1
  94. package/dist/smartxBidAdapter.js +1 -1
  95. package/dist/smilewantedBidAdapter.js +1 -1
  96. package/dist/sonobiBidAdapter.js +1 -1
  97. package/dist/sovrnAnalyticsAdapter.js +1 -1
  98. package/dist/sovrnBidAdapter.js +1 -1
  99. package/dist/sspBCBidAdapter.js +1 -1
  100. package/dist/sublimeBidAdapter.js +1 -1
  101. package/dist/synacormediaBidAdapter.js +1 -1
  102. package/dist/tappxBidAdapter.js +1 -1
  103. package/dist/targetVideoBidAdapter.js +1 -1
  104. package/dist/teadsBidAdapter.js +1 -1
  105. package/dist/trionBidAdapter.js +1 -1
  106. package/dist/tripleliftBidAdapter.js +1 -1
  107. package/dist/ttdBidAdapter.js +1 -1
  108. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  109. package/dist/underdogmediaBidAdapter.js +1 -1
  110. package/dist/undertoneBidAdapter.js +1 -1
  111. package/dist/userId.js +1 -1
  112. package/dist/vidazooBidAdapter.js +1 -1
  113. package/dist/videobyteBidAdapter.js +1 -1
  114. package/dist/visxBidAdapter.js +1 -1
  115. package/dist/vuukleBidAdapter.js +1 -1
  116. package/dist/widespaceBidAdapter.js +1 -1
  117. package/dist/winrBidAdapter.js +1 -1
  118. package/dist/yahoosspBidAdapter.js +1 -1
  119. package/dist/yieldmoBidAdapter.js +1 -1
  120. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  121. package/modules/adkernelBidAdapter.js +28 -12
  122. package/modules/adriverBidAdapter.js +5 -12
  123. package/modules/adriverIdSystem.js +2 -1
  124. package/modules/adtelligentBidAdapter.js +2 -0
  125. package/modules/alkimiBidAdapter.js +2 -1
  126. package/modules/betweenBidAdapter.js +3 -3
  127. package/modules/bidwatchAnalyticsAdapter.js +112 -59
  128. package/modules/consumableBidAdapter.js +2 -2
  129. package/modules/criteoBidAdapter.js +19 -13
  130. package/modules/dgkeywordRtdProvider.js +9 -0
  131. package/modules/displayioBidAdapter.js +92 -97
  132. package/modules/id5IdSystem.js +160 -111
  133. package/modules/id5IdSystem.md +16 -14
  134. package/modules/improvedigitalBidAdapter.js +50 -28
  135. package/modules/ixBidAdapter.js +13 -306
  136. package/modules/mediagoBidAdapter.js +462 -0
  137. package/modules/mediagoBidAdapter.md +34 -0
  138. package/modules/nextMillenniumBidAdapter.js +25 -6
  139. package/modules/pubmaticAnalyticsAdapter.js +1 -1
  140. package/modules/rasBidAdapter.js +8 -0
  141. package/modules/rasBidAdapter.md +14 -13
  142. package/modules/sonobiBidAdapter.js +1 -0
  143. package/modules/tappxBidAdapter.js +9 -0
  144. package/package.json +1 -1
  145. package/src/adloader.js +2 -1
  146. package/src/adserver.js +0 -56
  147. package/src/auction.js +58 -15
  148. package/src/native.js +1 -0
  149. package/src/refererDetection.js +12 -1
  150. package/src/videoCache.js +8 -2
  151. package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
  152. package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
  153. package/test/spec/modules/adriverIdSystem_spec.js +3 -8
  154. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  155. package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
  156. package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
  157. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
  158. package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
  159. package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
  160. package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
  161. package/test/spec/modules/enrichmentFpdModule_spec.js +2 -1
  162. package/test/spec/modules/fpdModule_spec.js +2 -1
  163. package/test/spec/modules/id5IdSystem_spec.js +529 -172
  164. package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
  165. package/test/spec/modules/ixBidAdapter_spec.js +210 -104
  166. package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
  167. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
  168. package/test/spec/modules/rasBidAdapter_spec.js +2 -0
  169. package/test/spec/native_spec.js +144 -0
  170. package/test/spec/videoCache_spec.js +37 -7
@@ -12,6 +12,7 @@ const {
12
12
  BID_WON,
13
13
  BID_RESPONSE,
14
14
  BID_REQUESTED,
15
+ BID_TIMEOUT,
15
16
  }
16
17
  } = CONSTANTS;
17
18
 
@@ -20,80 +21,125 @@ let allEvents = {}
20
21
  let auctionEnd = {}
21
22
  let initOptions = {}
22
23
  let endpoint = 'https://default'
23
- let objectToSearchForBidderCode = ['bidderRequests', 'bidsReceived', 'noBids']
24
+ let requestsAttributes = ['adUnitCode', 'auctionId', 'bidder', 'bidderCode', 'bidId', 'cpm', 'creativeId', 'currency', 'width', 'height', 'mediaType', 'netRevenue', 'originalCpm', 'originalCurrency', 'requestId', 'size', 'source', 'status', 'timeToRespond', 'transactionId', 'ttl', 'sizes', 'mediaTypes', 'src', 'params', 'userId', 'labelAny', 'bids'];
24
25
 
25
26
  function getAdapterNameForAlias(aliasName) {
26
27
  return adapterManager.aliasRegistry[aliasName] || aliasName;
27
28
  }
28
29
 
29
- function cleanArgObject(arg, removead) {
30
- if (typeof arg['bidderCode'] == 'string') { arg['originalBidder'] = getAdapterNameForAlias(arg['bidderCode']); }
31
- if (typeof arg['creativeId'] == 'number') {
32
- arg['creativeId'] = arg['creativeId'].toString();
33
- }
34
- if (removead && typeof arg['ad'] != 'undefined') {
35
- arg['ad'] = 'emptied';
36
- }
37
- if (typeof arg['gdprConsent'] != 'undefined' && typeof arg['gdprConsent']['vendorData'] != 'undefined') {
38
- arg['gdprConsent']['vendorData'] = 'emptied';
30
+ function filterAttributes(arg, removead) {
31
+ let response = {};
32
+ if (typeof arg == 'object') {
33
+ if (typeof arg['bidderCode'] == 'string') {
34
+ response['originalBidder'] = getAdapterNameForAlias(arg['bidderCode']);
35
+ } else if (typeof arg['bidder'] == 'string') {
36
+ response['originalBidder'] = getAdapterNameForAlias(arg['bidder']);
37
+ }
38
+ if (!removead && typeof arg['ad'] != 'undefined') {
39
+ response['ad'] = arg['ad'];
40
+ }
41
+ if (typeof arg['gdprConsent'] != 'undefined') {
42
+ response['gdprConsent'] = {};
43
+ if (typeof arg['gdprConsent']['consentString'] != 'undefined') { response['gdprConsent']['consentString'] = arg['gdprConsent']['consentString']; }
44
+ }
45
+ requestsAttributes.forEach((attr) => {
46
+ if (typeof arg[attr] != 'undefined') { response[attr] = arg[attr]; }
47
+ });
48
+ if (typeof response['creativeId'] == 'number') { response['creativeId'] = response['creativeId'].toString(); }
39
49
  }
40
- return arg;
50
+ return response;
41
51
  }
42
52
 
43
- function cleanArgs(arg, removead) {
44
- Object.keys(arg).forEach(key => {
45
- arg[key] = cleanArgObject(arg[key], removead);
53
+ function cleanAuctionEnd(args) {
54
+ let response = {};
55
+ let filteredObj;
56
+ let objects = ['bidderRequests', 'bidsReceived', 'noBids'];
57
+ objects.forEach((attr) => {
58
+ if (Array.isArray(args[attr])) {
59
+ response[attr] = [];
60
+ args[attr].forEach((obj) => {
61
+ filteredObj = filterAttributes(obj, true);
62
+ if (typeof obj['bids'] == 'object') {
63
+ filteredObj['bids'] = [];
64
+ obj['bids'].forEach((bid) => {
65
+ filteredObj['bids'].push(filterAttributes(bid, true));
66
+ });
67
+ }
68
+ response[attr].push(filteredObj);
69
+ });
70
+ }
46
71
  });
47
- return arg
72
+ return response;
73
+ }
74
+
75
+ function cleanCreatives(args) {
76
+ return filterAttributes(args, false);
48
77
  }
49
78
 
50
- function checkBidderCode(args, removead) {
51
- if (typeof args == 'object') {
52
- for (let i = 0; i < objectToSearchForBidderCode.length; i++) {
53
- if (typeof args[objectToSearchForBidderCode[i]] == 'object') { args[objectToSearchForBidderCode[i]] = cleanArgs(args[objectToSearchForBidderCode[i]], removead) }
79
+ function enhanceMediaType(arg) {
80
+ saveEvents['bidRequested'].forEach((bidRequested) => {
81
+ if (bidRequested['auctionId'] == arg['auctionId'] && Array.isArray(bidRequested['bids'])) {
82
+ bidRequested['bids'].forEach((bid) => {
83
+ if (bid['transactionId'] == arg['transactionId'] && bid['bidId'] == arg['requestId']) { arg['mediaTypes'] = bid['mediaTypes']; }
84
+ });
54
85
  }
55
- }
56
- if (typeof args['bidderCode'] == 'string') { args['originalBidder'] = getAdapterNameForAlias(args['bidderCode']); } else if (typeof args['bidder'] == 'string') { args['originalBidder'] = getAdapterNameForAlias(args['bidder']); }
57
- if (typeof args['creativeId'] == 'number') { args['creativeId'] = args['creativeId'].toString(); }
86
+ });
87
+ return arg;
88
+ }
58
89
 
59
- return args
90
+ function addBidResponse(args) {
91
+ let eventType = BID_RESPONSE;
92
+ let argsCleaned = cleanCreatives(JSON.parse(JSON.stringify(args))); ;
93
+ if (allEvents[eventType] == undefined) { allEvents[eventType] = [] }
94
+ allEvents[eventType].push(argsCleaned);
60
95
  }
61
96
 
62
- function addEvent(eventType, args) {
63
- let argsCleaned;
64
- if (eventType && args) {
65
- if (allEvents[eventType] == undefined) { allEvents[eventType] = [] }
66
- if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
67
- argsCleaned = checkBidderCode(JSON.parse(JSON.stringify(args)), false);
68
- allEvents[eventType].push(argsCleaned);
69
- saveEvents[eventType].push(argsCleaned);
70
- argsCleaned = checkBidderCode(JSON.parse(JSON.stringify(args)), true);
71
- if (['auctionend', 'bidtimeout'].includes(eventType.toLowerCase())) {
72
- if (auctionEnd[eventType] == undefined) { auctionEnd[eventType] = [] }
73
- auctionEnd[eventType].push(argsCleaned);
74
- }
75
- }
97
+ function addBidRequested(args) {
98
+ let eventType = BID_REQUESTED;
99
+ let argsCleaned = filterAttributes(args, true);
100
+ if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
101
+ saveEvents[eventType].push(argsCleaned);
102
+ }
103
+
104
+ function addTimeout(args) {
105
+ let eventType = BID_TIMEOUT;
106
+ if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
107
+ saveEvents[eventType].push(args);
108
+ let argsCleaned = [];
109
+ let argsDereferenced = JSON.parse(JSON.stringify(args));
110
+ argsDereferenced.forEach((attr) => {
111
+ argsCleaned.push(filterAttributes(JSON.parse(JSON.stringify(attr)), false));
112
+ });
113
+ if (auctionEnd[eventType] == undefined) { auctionEnd[eventType] = [] }
114
+ auctionEnd[eventType].push(argsCleaned);
115
+ }
116
+
117
+ function addAuctionEnd(args) {
118
+ let eventType = AUCTION_END;
119
+ if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
120
+ saveEvents[eventType].push(args);
121
+ let argsCleaned = cleanAuctionEnd(JSON.parse(JSON.stringify(args)));
122
+ if (auctionEnd[eventType] == undefined) { auctionEnd[eventType] = [] }
123
+ auctionEnd[eventType].push(argsCleaned);
76
124
  }
77
125
 
78
126
  function handleBidWon(args) {
79
- args = cleanArgObject(JSON.parse(JSON.stringify(args)), true);
127
+ args = enhanceMediaType(filterAttributes(JSON.parse(JSON.stringify(args)), true));
80
128
  let increment = args['cpm'];
81
129
  if (typeof saveEvents['auctionEnd'] == 'object') {
82
- for (let i = 0; i < saveEvents['auctionEnd'].length; i++) {
83
- let tmpAuction = saveEvents['auctionEnd'][i];
84
- if (tmpAuction['auctionId'] == args['auctionId'] && typeof tmpAuction['bidsReceived'] == 'object') {
85
- for (let j = 0; j < tmpAuction['bidsReceived'].length; j++) {
86
- let tmpBid = tmpAuction['bidsReceived'][j];
87
- if (tmpBid['transactionId'] == args['transactionId'] && tmpBid['adId'] != args['adId']) {
88
- if (args['cpm'] < tmpBid['cpm']) {
130
+ saveEvents['auctionEnd'].forEach((auction) => {
131
+ if (auction['auctionId'] == args['auctionId'] && typeof auction['bidsReceived'] == 'object') {
132
+ auction['bidsReceived'].forEach((bid) => {
133
+ if (bid['transactionId'] == args['transactionId'] && bid['adId'] != args['adId']) {
134
+ if (args['cpm'] < bid['cpm']) {
89
135
  increment = 0;
90
- } else if (increment > args['cpm'] - tmpBid['cpm']) {
91
- increment = args['cpm'] - tmpBid['cpm'];
136
+ } else if (increment > args['cpm'] - bid['cpm']) {
137
+ increment = args['cpm'] - bid['cpm'];
92
138
  }
93
139
  }
94
- }
140
+ });
95
141
  }
96
- }
142
+ });
97
143
  }
98
144
  args['cpmIncrement'] = increment;
99
145
  if (typeof saveEvents.bidRequested == 'object' && saveEvents.bidRequested.length > 0 && saveEvents.bidRequested[0].gdprConsent) { args.gdpr = saveEvents.bidRequested[0].gdprConsent; }
@@ -101,12 +147,16 @@ function handleBidWon(args) {
101
147
  }
102
148
 
103
149
  function handleAuctionEnd() {
104
- ajax(endpoint + '.bidwatch.io/analytics/auctions', null, JSON.stringify(auctionEnd), {method: 'POST', withCredentials: true});
105
- auctionEnd = {}
106
- if (typeof allEvents['bidResponse'] != 'undefined') {
107
- for (let i = 0; i < allEvents['bidResponse'].length; i++) { ajax(endpoint + '.bidwatch.io/analytics/creatives', null, JSON.stringify(allEvents['bidResponse'][i]), {method: 'POST', withCredentials: true}); }
108
- }
109
- allEvents = {}
150
+ ajax(endpoint + '.bidwatch.io/analytics/auctions', function (data) {
151
+ let list = JSON.parse(data);
152
+ if (Array.isArray(list) && typeof allEvents['bidResponse'] != 'undefined') {
153
+ allEvents['bidResponse'].forEach((bidResponse) => {
154
+ if (list.includes(bidResponse['originalBidder'] + '_' + bidResponse['creativeId'])) { ajax(endpoint + '.bidwatch.io/analytics/creatives', null, JSON.stringify(bidResponse), {method: 'POST', withCredentials: true}); }
155
+ });
156
+ }
157
+ allEvents = {};
158
+ }, JSON.stringify(auctionEnd), {method: 'POST', withCredentials: true});
159
+ auctionEnd = {};
110
160
  }
111
161
 
112
162
  let bidwatchAnalytics = Object.assign(adapter({url, analyticsType}), {
@@ -116,17 +166,20 @@ let bidwatchAnalytics = Object.assign(adapter({url, analyticsType}), {
116
166
  }) {
117
167
  switch (eventType) {
118
168
  case AUCTION_END:
119
- addEvent(eventType, args);
169
+ addAuctionEnd(args);
120
170
  handleAuctionEnd();
121
171
  break;
122
172
  case BID_WON:
123
173
  handleBidWon(args);
124
174
  break;
125
175
  case BID_RESPONSE:
126
- addEvent(eventType, args);
176
+ addBidResponse(args);
127
177
  break;
128
178
  case BID_REQUESTED:
129
- addEvent(eventType, args);
179
+ addBidRequested(args);
180
+ break;
181
+ case BID_TIMEOUT:
182
+ addTimeout(args);
130
183
  break;
131
184
  }
132
185
  }});
@@ -1,4 +1,4 @@
1
- import { logWarn, createTrackPixelHtml, deepAccess, isArray, deepSetValue } from '../src/utils.js';
1
+ import { logWarn, deepAccess, isArray, deepSetValue } from '../src/utils.js';
2
2
  import {config} from '../src/config.js';
3
3
  import { registerBidder } from '../src/adapters/bidderFactory.js';
4
4
  import { BANNER, VIDEO } from '../src/mediaTypes.js';
@@ -255,7 +255,7 @@ function getSize(sizes) {
255
255
  function retrieveAd(decision, unitId, unitName) {
256
256
  let ad;
257
257
  if (decision.contents && decision.contents[0]) {
258
- ad = decision.contents[0].body + createTrackPixelHtml(decision.impressionUrl);
258
+ ad = decision.contents[0].body;
259
259
  }
260
260
  if (decision.vastXml) {
261
261
  ad = decision.vastXml;
@@ -469,15 +469,20 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
469
469
  if (bidRequest.params.publisherSubId) {
470
470
  slot.publishersubid = bidRequest.params.publisherSubId;
471
471
  }
472
- if (bidRequest.params.nativeCallback || deepAccess(bidRequest, `mediaTypes.${NATIVE}`)) {
472
+
473
+ if (bidRequest.params.nativeCallback || hasNativeMediaType(bidRequest)) {
473
474
  slot.native = true;
474
475
  if (!checkNativeSendId(bidRequest)) {
475
476
  logWarn(LOG_PREFIX + 'all native assets containing URL should be sent as placeholders with sendId(icon, image, clickUrl, displayUrl, privacyLink, privacyIcon)');
476
477
  }
477
- slot.sizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'), parseNativeSize);
478
- } else {
478
+ }
479
+
480
+ if (hasBannerMediaType(bidRequest)) {
479
481
  slot.sizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'), parseSize);
482
+ } else {
483
+ slot.sizes = [];
480
484
  }
485
+
481
486
  if (hasVideoMediaType(bidRequest)) {
482
487
  const video = {
483
488
  playersizes: parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'), parseSize),
@@ -554,17 +559,18 @@ function parseSize(size) {
554
559
  return size[0] + 'x' + size[1];
555
560
  }
556
561
 
557
- function parseNativeSize(size) {
558
- if (size[0] === undefined && size[1] === undefined) {
559
- return '2x2';
560
- }
561
- return size[0] + 'x' + size[1];
562
- }
563
-
564
562
  function hasVideoMediaType(bidRequest) {
565
563
  return deepAccess(bidRequest, 'mediaTypes.video') !== undefined;
566
564
  }
567
565
 
566
+ function hasBannerMediaType(bidRequest) {
567
+ return deepAccess(bidRequest, 'mediaTypes.banner') !== undefined;
568
+ }
569
+
570
+ function hasNativeMediaType(bidRequest) {
571
+ return deepAccess(bidRequest, 'mediaTypes.native') !== undefined;
572
+ }
573
+
568
574
  function hasValidVideoMediaType(bidRequest) {
569
575
  let isValid = true;
570
576
 
@@ -646,18 +652,18 @@ function enrichSlotWithFloors(slot, bidRequest) {
646
652
  if (bidRequest.mediaTypes?.banner) {
647
653
  slotFloors.banner = {};
648
654
  const bannerSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'))
649
- bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = bidRequest.getFloor({size: bannerSize, mediaType: BANNER}));
655
+ bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = bidRequest.getFloor({ size: bannerSize, mediaType: BANNER }));
650
656
  }
651
657
 
652
658
  if (bidRequest.mediaTypes?.video) {
653
659
  slotFloors.video = {};
654
660
  const videoSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'))
655
- videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = bidRequest.getFloor({size: videoSize, mediaType: VIDEO}));
661
+ videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = bidRequest.getFloor({ size: videoSize, mediaType: VIDEO }));
656
662
  }
657
663
 
658
664
  if (bidRequest.mediaTypes?.native) {
659
665
  slotFloors.native = {};
660
- slotFloors.native['*'] = bidRequest.getFloor({size: '*', mediaType: NATIVE});
666
+ slotFloors.native['*'] = bidRequest.getFloor({ size: '*', mediaType: NATIVE });
661
667
  }
662
668
 
663
669
  if (Object.keys(slotFloors).length > 0) {
@@ -25,6 +25,15 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us
25
25
  const timeout = (moduleConfig && moduleConfig.params && moduleConfig.params.timeout && Number(moduleConfig.params.timeout) > 0) ? Number(moduleConfig.params.timeout) : PROFILE_TIMEOUT_MS;
26
26
  const url = (moduleConfig && moduleConfig.params && moduleConfig.params.url) ? moduleConfig.params.url : URL + encodeURIComponent(window.location.href);
27
27
  const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
28
+ callback = (function(cb) {
29
+ let done = false;
30
+ return function () {
31
+ if (!done) {
32
+ done = true;
33
+ return cb.apply(this, arguments);
34
+ }
35
+ }
36
+ })(callback);
28
37
  let isFinish = false;
29
38
  logMessage('[dgkeyword sub module]', adUnits, timeout);
30
39
  let setKeywordTargetBidders = getTargetBidderOfDgKeywords(adUnits);
@@ -1,16 +1,16 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
2
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
3
+ import {Renderer} from '../src/Renderer.js';
4
+ import {getWindowFromDocument, logWarn} from '../src/utils.js';
3
5
 
4
- const BIDDER_VERSION = '1.0.0';
6
+ const ADAPTER_VERSION = '1.1.0';
5
7
  const BIDDER_CODE = 'displayio';
6
- const GVLID = 999;
7
8
  const BID_TTL = 300;
8
9
  const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
9
10
  const DEFAULT_CURRENCY = 'USD';
10
11
 
11
12
  export const spec = {
12
13
  code: BIDDER_CODE,
13
- gvlid: GVLID,
14
14
  supportedMediaTypes: SUPPORTED_AD_TYPES,
15
15
  isBidRequestValid: function(bid) {
16
16
  return !!(bid.params && bid.params.placementId && bid.params.siteId &&
@@ -20,7 +20,7 @@ export const spec = {
20
20
  return bidRequests.map(bid => {
21
21
  let url = '//' + bid.params.adsSrvDomain + '/srv?method=getPlacement&app=' +
22
22
  bid.params.siteId + '&placement=' + bid.params.placementId;
23
- const data = this._getPayload(bid, bidderRequest);
23
+ const data = getPayload(bid, bidderRequest);
24
24
  return {
25
25
  method: 'POST',
26
26
  headers: {'Content-Type': 'application/json;charset=utf-8'},
@@ -42,117 +42,112 @@ export const spec = {
42
42
  height: adData.h,
43
43
  netRevenue: true,
44
44
  ttl: BID_TTL,
45
- creativeId: adData.adId || 0,
46
- currency: DEFAULT_CURRENCY,
45
+ creativeId: adData.adId || 1,
46
+ currency: adData.cur || DEFAULT_CURRENCY,
47
47
  referrer: data.data.ref,
48
- mediaType: ads[0].ad.subtype,
48
+ mediaType: ads[0].ad.subtype === 'videoVast' ? VIDEO : BANNER,
49
49
  ad: adData.markup,
50
- placement: data.placement,
50
+ adUnitCode: data.adUnitCode,
51
+ renderURL: data.renderURL,
51
52
  adData: adData
52
53
  };
53
- if (bidResponse.vastUrl === 'videoVast') {
54
- bidResponse.vastUrl = adData.videos[0].url
54
+
55
+ if (bidResponse.mediaType === VIDEO) {
56
+ bidResponse.vastUrl = adData.videos[0] && adData.videos[0].url
57
+ }
58
+
59
+ if (bidResponse.renderURL) {
60
+ bidResponse.renderer = newRenderer(bidResponse);
55
61
  }
56
62
  bidResponses.push(bidResponse);
57
63
  }
58
64
  return bidResponses;
59
- },
60
- _getPayload: function (bid, bidderRequest) {
61
- const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
62
- const userSession = 'us_web_xxxxxxxxxxxx'.replace(/[x]/g, c => {
63
- let r = Math.random() * 16 | 0;
64
- let v = c === 'x' ? r : (r & 0x3 | 0x8);
65
- return v.toString(16);
66
- });
67
- const { params } = bid;
68
- const { siteId, placementId } = params;
69
- const { refererInfo, uspConsent, gdprConsent } = bidderRequest;
70
- const mediation = {consent: '-1', gdpr: '-1'};
71
- if (gdprConsent) {
72
- if (gdprConsent.consentString !== undefined) {
73
- mediation.consent = gdprConsent.consentString;
74
- }
75
- if (gdprConsent.gdprApplies !== undefined) {
76
- mediation.gdpr = gdprConsent.gdprApplies ? '1' : '0';
77
- }
65
+ }
66
+ };
67
+
68
+ function getPayload (bid, bidderRequest) {
69
+ const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
70
+ const userSession = 'us_web_xxxxxxxxxxxx'.replace(/[x]/g, c => {
71
+ let r = Math.random() * 16 | 0;
72
+ let v = c === 'x' ? r : (r & 0x3 | 0x8);
73
+ return v.toString(16);
74
+ });
75
+ const { params, adUnitCode, bidId } = bid;
76
+ const { siteId, placementId, renderURL, pageCategory, keywords } = params;
77
+ const { refererInfo, uspConsent, gdprConsent } = bidderRequest;
78
+ const mediation = {consent: '-1', gdpr: '-1'};
79
+ if (gdprConsent && 'gdprApplies' in gdprConsent) {
80
+ if (gdprConsent.consentString !== undefined) {
81
+ mediation.consent = gdprConsent.consentString;
78
82
  }
79
- const payload = {
80
- userSession,
83
+ if (gdprConsent.gdprApplies !== undefined) {
84
+ mediation.gdpr = gdprConsent.gdprApplies ? '1' : '0';
85
+ }
86
+ }
87
+ return {
88
+ userSession,
89
+ data: {
90
+ id: bidId,
91
+ action: 'getPlacement',
92
+ app: siteId,
93
+ placement: placementId,
94
+ adUnitCode,
95
+ renderURL,
81
96
  data: {
82
- id: bid.bidId,
83
- action: 'getPlacement',
84
- app: siteId,
85
- placement: placementId,
86
- data: {
87
- pagecat: params.pageCategory ? params.pageCategory.split(',').map(k => k.trim()) : [],
88
- keywords: params.keywords ? params.keywords.split(',').map(k => k.trim()) : [],
89
- lang_content: document.documentElement.lang,
90
- lang: window.navigator.language,
91
- // TODO: are these the correct refererInfo values?
92
- domain: refererInfo.domain,
93
- page: refererInfo.page,
94
- ref: refererInfo.ref,
95
- userids: _getUserIDs(),
96
- geo: '',
97
- },
98
- complianceData: {
99
- child: '-1',
100
- us_privacy: uspConsent,
101
- dnt: window.navigator.doNotTrack,
102
- iabConsent: {},
103
- mediation: {
104
- consent: mediation.consent,
105
- gdpr: mediation.gdpr,
106
- }
107
- },
108
- integration: 'JS',
109
- omidpn: 'Displayio',
110
- mediationPlatform: 0,
111
- prebidVersion: BIDDER_VERSION,
112
- device: {
113
- w: window.screen.width,
114
- h: window.screen.height,
115
- connection_type: connection ? connection.effectiveType : '',
97
+ pagecat: pageCategory ? pageCategory.split(',').map(k => k.trim()) : [],
98
+ keywords: keywords ? keywords.split(',').map(k => k.trim()) : [],
99
+ lang_content: document.documentElement.lang,
100
+ lang: window.navigator.language,
101
+ domain: refererInfo.domain,
102
+ page: refererInfo.page,
103
+ ref: refererInfo.referer,
104
+ userids: bid.userIdAsEids || {},
105
+ geo: '',
106
+ },
107
+ complianceData: {
108
+ child: '-1',
109
+ us_privacy: uspConsent,
110
+ dnt: window.doNotTrack === '1' || window.navigator.doNotTrack === '1' || false,
111
+ iabConsent: {},
112
+ mediation: {
113
+ consent: mediation.consent,
114
+ gdpr: mediation.gdpr,
116
115
  }
116
+ },
117
+ integration: 'JS',
118
+ omidpn: 'Displayio',
119
+ mediationPlatform: 0,
120
+ prebidVersion: ADAPTER_VERSION,
121
+ device: {
122
+ w: window.screen.width,
123
+ h: window.screen.height,
124
+ connection_type: connection ? connection.effectiveType : '',
117
125
  }
118
126
  }
119
- if (navigator.permissions) {
120
- navigator.permissions.query({ name: 'geolocation' })
121
- .then((result) => {
122
- if (result.state === 'granted') {
123
- payload.data.data.geo = _getGeoData();
124
- }
125
- });
126
- }
127
- return payload
128
127
  }
129
- };
128
+ }
129
+
130
+ function newRenderer(bid) {
131
+ const renderer = Renderer.install({
132
+ id: bid.requestId,
133
+ url: bid.renderURL,
134
+ adUnitCode: bid.adUnitCode
135
+ });
130
136
 
131
- function _getUserIDs () {
132
- let ids = {};
133
137
  try {
134
- ids = window.owpbjs.getUserIdsAsEids();
135
- } catch (e) {}
136
- return ids;
138
+ renderer.setRender(webisRender);
139
+ } catch (err) {
140
+ logWarn('Prebid Error calling setRender on renderer', err);
141
+ }
142
+
143
+ return renderer;
137
144
  }
138
145
 
139
- async function _getGeoData () {
140
- let geoData = null;
141
- const getCurrentPosition = () => {
142
- return new Promise((resolve, reject) =>
143
- navigator.geolocation.getCurrentPosition(resolve, reject)
144
- );
145
- }
146
- try {
147
- const position = await getCurrentPosition();
148
- let {latitude, longitude, accuracy} = position.coords;
149
- geoData = {
150
- 'lat': latitude,
151
- 'lng': longitude,
152
- 'precision': accuracy
153
- };
154
- } catch (e) {}
155
- return geoData
146
+ function webisRender(bid, doc) {
147
+ bid.renderer.push(() => {
148
+ const win = getWindowFromDocument(doc) || window;
149
+ win.webis.init(bid.adData, bid.adUnitCode, bid.params);
150
+ })
156
151
  }
157
152
 
158
153
  registerBidder(spec);