prebid.js 7.49.0 → 7.51.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 (213) 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/adtelligentBidAdapter.js +1 -1
  14. package/dist/adtrgtmeBidAdapter.js +1 -1
  15. package/dist/adxcgBidAdapter.js +1 -1
  16. package/dist/adyoulikeBidAdapter.js +1 -1
  17. package/dist/ajaBidAdapter.js +1 -1
  18. package/dist/amxBidAdapter.js +1 -1
  19. package/dist/amxIdSystem.js +1 -1
  20. package/dist/appierAnalyticsAdapter.js +1 -1
  21. package/dist/appnexusBidAdapter.js +1 -1
  22. package/dist/asoBidAdapter.js +1 -1
  23. package/dist/axonixBidAdapter.js +1 -1
  24. package/dist/beopBidAdapter.js +1 -1
  25. package/dist/bidglassBidAdapter.js +1 -1
  26. package/dist/big-richmediaBidAdapter.js +1 -1
  27. package/dist/bridgewellBidAdapter.js +1 -1
  28. package/dist/brightMountainMediaBidAdapter.js +1 -1
  29. package/dist/carodaBidAdapter.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/cleanioRtdProvider.js +1 -1
  32. package/dist/concertBidAdapter.js +1 -1
  33. package/dist/confiantRtdProvider.js +1 -1
  34. package/dist/connectadBidAdapter.js +1 -1
  35. package/dist/consumableBidAdapter.js +1 -1
  36. package/dist/conversantAnalyticsAdapter.js +1 -1
  37. package/dist/conversantBidAdapter.js +1 -1
  38. package/dist/craftBidAdapter.js +1 -1
  39. package/dist/criteoBidAdapter.js +1 -1
  40. package/dist/cwireBidAdapter.js +1 -1
  41. package/dist/dependencies.json +3 -0
  42. package/dist/dspxBidAdapter.js +1 -1
  43. package/dist/eplanningBidAdapter.js +1 -1
  44. package/dist/feedadBidAdapter.js +1 -1
  45. package/dist/finativeBidAdapter.js +1 -1
  46. package/dist/freewheel-sspBidAdapter.js +1 -1
  47. package/dist/glimpseBidAdapter.js +1 -1
  48. package/dist/gmosspBidAdapter.js +1 -1
  49. package/dist/goldbachBidAdapter.js +1 -1
  50. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  51. package/dist/greenbidsRtdProvider.js +1 -1
  52. package/dist/gridBidAdapter.js +1 -1
  53. package/dist/gumgumBidAdapter.js +1 -1
  54. package/dist/h12mediaBidAdapter.js +1 -1
  55. package/dist/id5IdSystem.js +1 -1
  56. package/dist/improvedigitalBidAdapter.js +1 -1
  57. package/dist/inmarBidAdapter.js +1 -1
  58. package/dist/insticatorBidAdapter.js +1 -1
  59. package/dist/ixBidAdapter.js +1 -1
  60. package/dist/justpremiumBidAdapter.js +1 -1
  61. package/dist/kargoBidAdapter.js +1 -1
  62. package/dist/konduitAnalyticsAdapter.js +1 -1
  63. package/dist/kueezBidAdapter.js +1 -1
  64. package/dist/kueezRtbBidAdapter.js +1 -1
  65. package/dist/kulturemediaBidAdapter.js +1 -1
  66. package/dist/lassoBidAdapter.js +1 -1
  67. package/dist/lifestreetBidAdapter.js +1 -1
  68. package/dist/liveIntentIdSystem.js +1 -1
  69. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  70. package/dist/logicadBidAdapter.js +1 -1
  71. package/dist/loglyliftBidAdapter.js +1 -1
  72. package/dist/magniteAnalyticsAdapter.js +1 -1
  73. package/dist/malltvAnalyticsAdapter.js +1 -1
  74. package/dist/marsmediaBidAdapter.js +1 -1
  75. package/dist/mediafuseBidAdapter.js +1 -1
  76. package/dist/mediasquareBidAdapter.js +1 -1
  77. package/dist/mgidBidAdapter.js +1 -1
  78. package/dist/minutemediaBidAdapter.js +1 -1
  79. package/dist/minutemediaplusBidAdapter.js +1 -1
  80. package/dist/nexx360BidAdapter.js +1 -1
  81. package/dist/not-for-prod/prebid.js +140 -139
  82. package/dist/oguryBidAdapter.js +1 -1
  83. package/dist/onetagBidAdapter.js +1 -1
  84. package/dist/ooloAnalyticsAdapter.js +1 -1
  85. package/dist/optidigitalBidAdapter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/parrableIdSystem.js +1 -1
  88. package/dist/permutiveRtdProvider.js +1 -1
  89. package/dist/pixfutureBidAdapter.js +1 -1
  90. package/dist/prebid-core.js +1 -1
  91. package/dist/prebidServerBidAdapter.js +1 -1
  92. package/dist/publinkIdSystem.js +1 -1
  93. package/dist/pubmaticBidAdapter.js +1 -1
  94. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  95. package/dist/pxyzBidAdapter.js +1 -1
  96. package/dist/quantcastBidAdapter.js +1 -1
  97. package/dist/readpeakBidAdapter.js +1 -1
  98. package/dist/relaidoBidAdapter.js +1 -1
  99. package/dist/retailspotBidAdapter.js +1 -1
  100. package/dist/rhythmoneBidAdapter.js +1 -1
  101. package/dist/riseBidAdapter.js +1 -1
  102. package/dist/rubiconAnalyticsAdapter.js +1 -1
  103. package/dist/rubiconBidAdapter.js +1 -1
  104. package/dist/seedingAllianceBidAdapter.js +1 -1
  105. package/dist/seedtagBidAdapter.js +1 -1
  106. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  107. package/dist/sharethroughBidAdapter.js +1 -1
  108. package/dist/shinezBidAdapter.js +1 -1
  109. package/dist/silverpushBidAdapter.js +1 -0
  110. package/dist/smaatoBidAdapter.js +1 -1
  111. package/dist/smartadserverBidAdapter.js +1 -1
  112. package/dist/smartxBidAdapter.js +1 -1
  113. package/dist/smilewantedBidAdapter.js +1 -1
  114. package/dist/sonobiBidAdapter.js +1 -1
  115. package/dist/sovrnAnalyticsAdapter.js +1 -1
  116. package/dist/sovrnBidAdapter.js +1 -1
  117. package/dist/sspBCBidAdapter.js +1 -1
  118. package/dist/stvBidAdapter.js +1 -1
  119. package/dist/sublimeBidAdapter.js +1 -1
  120. package/dist/synacormediaBidAdapter.js +1 -1
  121. package/dist/targetVideoBidAdapter.js +1 -1
  122. package/dist/teadsBidAdapter.js +1 -1
  123. package/dist/trionBidAdapter.js +1 -1
  124. package/dist/tripleliftBidAdapter.js +1 -1
  125. package/dist/ttdBidAdapter.js +1 -1
  126. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  127. package/dist/uid2IdSystem.js +1 -1
  128. package/dist/underdogmediaBidAdapter.js +1 -1
  129. package/dist/undertoneBidAdapter.js +1 -1
  130. package/dist/vidazooBidAdapter.js +1 -1
  131. package/dist/video.js +1 -1
  132. package/dist/videoModule.js +1 -1
  133. package/dist/videobyteBidAdapter.js +1 -1
  134. package/dist/visxBidAdapter.js +1 -1
  135. package/dist/vuukleBidAdapter.js +1 -1
  136. package/dist/widespaceBidAdapter.js +1 -1
  137. package/dist/winrBidAdapter.js +1 -1
  138. package/dist/yahoosspBidAdapter.js +1 -1
  139. package/dist/yieldmoBidAdapter.js +1 -1
  140. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  141. package/integrationExamples/videoModule/eventsUI/eventsUI.css +205 -0
  142. package/integrationExamples/videoModule/eventsUI/eventsUI.js +181 -0
  143. package/integrationExamples/videoModule/jwplayer/eventsUI.html +295 -0
  144. package/integrationExamples/videoModule/videojs/eventsUI.html +319 -0
  145. package/libraries/video/shared/helpers.js +14 -0
  146. package/modules/33acrossBidAdapter.js +1 -1
  147. package/modules/adhashBidAdapter.js +28 -17
  148. package/modules/adkernelBidAdapter.js +2 -1
  149. package/modules/admanBidAdapter.js +30 -22
  150. package/modules/adnuntiusBidAdapter.js +98 -79
  151. package/modules/adnuntiusBidAdapter.md +2 -1
  152. package/modules/adqueryBidAdapter.js +7 -1
  153. package/modules/adrinoBidAdapter.js +1 -0
  154. package/modules/adtelligentBidAdapter.js +4 -2
  155. package/modules/appnexusBidAdapter.js +2 -0
  156. package/modules/beopBidAdapter.js +1 -0
  157. package/modules/cleanioRtdProvider.js +2 -4
  158. package/modules/confiantRtdProvider.js +15 -12
  159. package/modules/conversantAnalyticsAdapter.js +7 -5
  160. package/modules/conversantBidAdapter.js +1 -1
  161. package/modules/criteoBidAdapter.js +58 -4
  162. package/modules/freewheel-sspBidAdapter.js +10 -2
  163. package/modules/gridBidAdapter.js +3 -0
  164. package/modules/gumgumBidAdapter.js +5 -0
  165. package/modules/liveIntentIdSystem.js +8 -4
  166. package/modules/magniteAnalyticsAdapter.js +26 -3
  167. package/modules/minutemediaBidAdapter.js +13 -3
  168. package/modules/permutiveRtdProvider.js +9 -38
  169. package/modules/prebidServerBidAdapter/index.js +7 -8
  170. package/modules/pubmaticBidAdapter.js +1 -0
  171. package/modules/riseBidAdapter.js +13 -3
  172. package/modules/rtbhouseBidAdapter.md +24 -0
  173. package/modules/rubiconBidAdapter.js +6 -2
  174. package/modules/silverpushBidAdapter.js +326 -0
  175. package/modules/silverpushBidAdapter.md +107 -0
  176. package/modules/underdogmediaBidAdapter.js +2 -2
  177. package/modules/videoModule/adQueue.js +2 -2
  178. package/modules/videoModule/index.js +9 -5
  179. package/modules/yahoosspBidAdapter.js +6 -0
  180. package/modules/yahoosspBidAdapter.md +37 -0
  181. package/package.json +1 -1
  182. package/src/adloader.js +2 -1
  183. package/src/native.js +20 -4
  184. package/test/spec/modules/33acrossBidAdapter_spec.js +4 -3
  185. package/test/spec/modules/adhashBidAdapter_spec.js +51 -1
  186. package/test/spec/modules/admanBidAdapter_spec.js +1 -2
  187. package/test/spec/modules/adnuntiusBidAdapter_spec.js +535 -264
  188. package/test/spec/modules/adqueryBidAdapter_spec.js +9 -0
  189. package/test/spec/modules/adrinoBidAdapter_spec.js +4 -0
  190. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  191. package/test/spec/modules/beopBidAdapter_spec.js +4 -0
  192. package/test/spec/modules/cleanioRtdProvider_spec.js +7 -8
  193. package/test/spec/modules/confiantRtdProvider_spec.js +4 -1
  194. package/test/spec/modules/conversantBidAdapter_spec.js +2 -1
  195. package/test/spec/modules/criteoBidAdapter_spec.js +159 -2
  196. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -2
  197. package/test/spec/modules/gridBidAdapter_spec.js +3 -0
  198. package/test/spec/modules/gumgumBidAdapter_spec.js +14 -0
  199. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +28 -0
  200. package/test/spec/modules/liveIntentIdSystem_spec.js +45 -0
  201. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +16 -36
  202. package/test/spec/modules/mass_spec.js +2 -0
  203. package/test/spec/modules/minutemediaBidAdapter_spec.js +69 -1
  204. package/test/spec/modules/permutiveRtdProvider_spec.js +0 -20
  205. package/test/spec/modules/prebidServerBidAdapter_spec.js +3 -1
  206. package/test/spec/modules/pubmaticBidAdapter_spec.js +7 -0
  207. package/test/spec/modules/riseBidAdapter_spec.js +69 -1
  208. package/test/spec/modules/rubiconBidAdapter_spec.js +143 -67
  209. package/test/spec/modules/silverpushBidAdapter_spec.js +394 -0
  210. package/test/spec/modules/underdogmediaBidAdapter_spec.js +1 -1
  211. package/test/spec/modules/videoModule/shared/helpers_spec.js +22 -0
  212. package/test/spec/modules/yahoosspBidAdapter_spec.js +60 -1
  213. package/test/spec/native_spec.js +12 -12
@@ -0,0 +1,326 @@
1
+ import { config } from '../src/config.js';
2
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
3
+ import * as utils from '../src/utils.js';
4
+ import { mergeDeep } from '../src/utils.js';
5
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
6
+ import { ortbConverter } from '../libraries/ortbConverter/converter.js';
7
+ import { Renderer } from '../src/Renderer.js';
8
+ import { ajax } from '../src/ajax.js';
9
+
10
+ const BIDDER_CODE = 'silverpush';
11
+ const bidderConfig = 'sp_pb_ortb';
12
+ const bidderVersion = '1.0.0';
13
+ const DEFAULT_CURRENCY = 'USD';
14
+
15
+ export const REQUEST_URL = 'https://apac.chocolateplatform.com/bidder/?identifier=prebidchoc';
16
+ export const SP_OUTSTREAM_PLAYER_URL = 'https://xaido.sgp1.cdn.digitaloceanspaces.com/prebid/spoutstream.min.js';
17
+
18
+ const VIDEO_ORTB_PARAMS = [
19
+ 'mimes',
20
+ 'minduration',
21
+ 'maxduration',
22
+ 'placement',
23
+ 'protocols',
24
+ 'startdelay',
25
+ 'skip',
26
+ 'skipafter',
27
+ 'minbitrate',
28
+ 'maxbitrate',
29
+ 'delivery',
30
+ 'playbackmethod',
31
+ 'api',
32
+ 'linearity'
33
+ ];
34
+
35
+ export const VIDEO_ORTB_REQUIRED = ['api', 'mimes', 'placement', 'protocols', 'minduration', 'maxduration', 'startdelay'];
36
+
37
+ export const spec = {
38
+ code: BIDDER_CODE,
39
+ supportedMediaTypes: [BANNER, VIDEO],
40
+ isBidRequestValid,
41
+ buildRequests,
42
+ interpretResponse,
43
+ onBidWon,
44
+ getRequest: function(endpoint) {
45
+ ajax(endpoint, null, undefined, {method: 'GET'});
46
+ },
47
+ getOS: function(ua) {
48
+ if (ua.indexOf('Windows') != -1) { return 'Windows'; } else if (ua.match(/(iPhone|iPod|iPad)/)) { return 'iOS'; } else if (ua.indexOf('Mac OS X') != -1) { return 'macOS'; } else if (ua.match(/Android/)) { return 'Android'; } else if (ua.indexOf('Linux') != -1) { return 'Linux'; } else { return 'Unknown'; }
49
+ }
50
+ };
51
+
52
+ registerBidder(spec);
53
+
54
+ export const CONVERTER = ortbConverter({
55
+ context: {
56
+ netRevenue: true,
57
+ ttl: 300
58
+ },
59
+ imp(buildImp, bidRequest, context) {
60
+ let imp = buildImp(bidRequest, context);
61
+
62
+ if (bidRequest.mediaTypes[VIDEO]) {
63
+ imp = buildVideoImp(bidRequest, imp);
64
+ } else if (bidRequest.mediaTypes[BANNER]) {
65
+ imp = buildBannerImp(bidRequest, imp);
66
+ }
67
+
68
+ const bidFloor = getBidFloor(bidRequest);
69
+
70
+ utils.deepSetValue(imp, 'bidfloor', bidFloor);
71
+
72
+ if (bidRequest.params.deals && bidRequest.params.deals.length > 0) {
73
+ utils.deepSetValue(imp, 'pmp', { deals: bidRequest.params.deals });
74
+ }
75
+
76
+ return imp;
77
+ },
78
+ request(buildRequest, imps, bidderRequest, context) {
79
+ const req = buildRequest(imps, bidderRequest, context);
80
+ mergeDeep(req, {
81
+ at: 1,
82
+ ext: {
83
+ bc: `${bidderConfig}_${bidderVersion}`
84
+ }
85
+ })
86
+
87
+ let userAgent = navigator.userAgent;
88
+ utils.deepSetValue(req, 'device.os', spec.getOS(userAgent));
89
+ utils.deepSetValue(req, 'device.devicetype', _isMobile() ? 1 : _isConnectedTV() ? 3 : 2);
90
+
91
+ const bid = context.bidRequests[0];
92
+ if (bid.params.publisherId) {
93
+ utils.deepSetValue(req, 'site.publisher.id', bid.params.publisherId);
94
+ }
95
+
96
+ return req;
97
+ },
98
+
99
+ bidResponse(buildBidResponse, bid, context) {
100
+ let bidResponse = buildBidResponse(bid, context);
101
+
102
+ if (bid.ext) {
103
+ bidResponse.meta.networkId = bid.ext.dsp_id;
104
+ bidResponse.meta.advertiserId = bid.ext.buyer_id;
105
+ bidResponse.meta.brandId = bid.ext.brand_id;
106
+ }
107
+
108
+ if (context.ortbResponse.ext && context.ortbResponse.ext.paf) {
109
+ bidResponse.meta.paf = Object.assign({}, context.ortbResponse.ext.paf);
110
+ bidResponse.meta.paf.content_id = utils.deepAccess(bid, 'ext.paf.content_id');
111
+ }
112
+
113
+ bidResponse = buildVideoVastResponse(bidResponse)
114
+ bidResponse = buildVideoOutstreamResponse(bidResponse, context)
115
+
116
+ return bidResponse;
117
+ },
118
+ response(buildResponse, bidResponses, ortbResponse, context) {
119
+ const response = buildResponse(bidResponses, ortbResponse, context);
120
+
121
+ let fledgeAuctionConfigs = utils.deepAccess(ortbResponse, 'ext.fledge_auction_configs');
122
+ if (fledgeAuctionConfigs) {
123
+ fledgeAuctionConfigs = Object.entries(fledgeAuctionConfigs).map(([bidId, cfg]) => {
124
+ return Object.assign({
125
+ bidId,
126
+ auctionSignals: {}
127
+ }, cfg);
128
+ });
129
+ return {
130
+ bids: response.bids,
131
+ fledgeAuctionConfigs,
132
+ }
133
+ } else {
134
+ return response.bids
135
+ }
136
+ }
137
+ });
138
+
139
+ function isBidRequestValid(bidRequest) {
140
+ return (isPublisherIdValid(bidRequest) && (isValidBannerRequest(bidRequest) || isValidVideoRequest(bidRequest)));
141
+ }
142
+
143
+ function isPublisherIdValid(bidRequest) {
144
+ let pubId = utils.deepAccess(bidRequest, 'params.publisherId');
145
+ return (pubId != null && utils.isStr(pubId) && pubId != '');
146
+ }
147
+
148
+ function isValidBannerRequest(bidRequest) {
149
+ const bannerSizes = utils.deepAccess(bidRequest, `mediaTypes.${BANNER}.sizes`);
150
+
151
+ return utils.isArray(bannerSizes) && bannerSizes.length > 0 && bannerSizes.every(size => utils.isNumber(size[0]) && utils.isNumber(size[1]));
152
+ }
153
+
154
+ function isValidVideoRequest(bidRequest) {
155
+ const videoSizes = utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}.playerSize`);
156
+ const PARAM_EXISTS = VIDEO_ORTB_REQUIRED.every(param => utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}.${param}`) != null);
157
+
158
+ return PARAM_EXISTS && utils.isArray(videoSizes) && videoSizes.length > 0 && videoSizes.every(size => utils.isNumber(size[0]) && utils.isNumber(size[1]));
159
+ }
160
+
161
+ function buildRequests(validBids, bidderRequest) {
162
+ let videoBids = validBids.filter(bid => isVideoBid(bid));
163
+ let bannerBids = validBids.filter(bid => isBannerBid(bid));
164
+ let requests = [];
165
+
166
+ bannerBids.forEach(bid => {
167
+ requests.push(createRequest([bid], bidderRequest, BANNER));
168
+ });
169
+
170
+ videoBids.forEach(bid => {
171
+ requests.push(createRequest([bid], bidderRequest, VIDEO));
172
+ });
173
+
174
+ return requests;
175
+ }
176
+
177
+ function buildVideoImp(bidRequest, imp) {
178
+ if (bidRequest.mediaTypes[VIDEO]?.context === 'outstream') {
179
+ imp.video.placement = imp.video.placement || 4;
180
+ }
181
+
182
+ const videoMediaType = utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}`);
183
+ const videoSizes = (videoMediaType && videoMediaType.playerSize) || [];
184
+
185
+ if (videoSizes && videoSizes.length > 0) {
186
+ utils.deepSetValue(imp, 'video.w', videoSizes[0][0]);
187
+ utils.deepSetValue(imp, 'video.h', videoSizes[0][1]);
188
+ }
189
+
190
+ const videoAdUnitParams = utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}`, {});
191
+ const videoBidderParams = utils.deepAccess(bidRequest, `params.${VIDEO}`, {});
192
+
193
+ const videoParams = { ...videoAdUnitParams, ...videoBidderParams };
194
+
195
+ VIDEO_ORTB_PARAMS.forEach((param) => {
196
+ if (videoParams.hasOwnProperty(param)) {
197
+ utils.deepSetValue(imp, `video.${param}`, videoParams[param]);
198
+ }
199
+ });
200
+
201
+ return { ...imp };
202
+ }
203
+
204
+ function buildBannerImp(bidRequest, imp) {
205
+ const bannerSizes = utils.deepAccess(bidRequest, `mediaTypes.${BANNER}.sizes`, []);
206
+
207
+ if (bannerSizes && bannerSizes.length > 0) {
208
+ utils.deepSetValue(imp, 'banner.w', bannerSizes[0][0]);
209
+ utils.deepSetValue(imp, 'banner.h', bannerSizes[0][1]);
210
+ }
211
+
212
+ return {...imp};
213
+ }
214
+
215
+ function createRequest(bidRequests, bidderRequest, mediaType) {
216
+ return {
217
+ method: 'POST',
218
+ url: REQUEST_URL,
219
+ data: CONVERTER.toORTB({ bidRequests, bidderRequest, context: { mediaType } })
220
+ }
221
+ }
222
+
223
+ function buildVideoVastResponse(bidResponse) {
224
+ if (bidResponse.mediaType == VIDEO && bidResponse.vastXml) {
225
+ bidResponse.vastUrl = bidResponse.vastXml;
226
+ }
227
+
228
+ return { ...bidResponse }
229
+ }
230
+
231
+ function buildVideoOutstreamResponse(bidResponse, context) {
232
+ if (context.bidRequest.mediaTypes[VIDEO]?.context === 'outstream') {
233
+ bidResponse.rendererUrl = SP_OUTSTREAM_PLAYER_URL;
234
+ bidResponse.adUnitCode = context.bidRequest.adUnitCode;
235
+
236
+ bidResponse.renderer = Renderer.install({
237
+ id: bidResponse.requestId,
238
+ adUnitCode: context.bidRequest.adUnitCode,
239
+ url: bidResponse.rendererUrl
240
+ });
241
+
242
+ bidResponse.renderer.setRender(_renderer(bidResponse));
243
+
244
+ bidResponse.renderer.render(bidResponse);
245
+ }
246
+
247
+ return {...bidResponse};
248
+ }
249
+
250
+ function getBidFloor(bid) {
251
+ const currency = config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY;
252
+
253
+ if (typeof bid.getFloor !== 'function') {
254
+ return utils.deepAccess(bid, 'params.bidFloor', 0.05);
255
+ }
256
+
257
+ const bidFloor = bid.getFloor({
258
+ currency: currency,
259
+ mediaType: '*',
260
+ size: '*',
261
+ });
262
+ return bidFloor.floor;
263
+ }
264
+
265
+ function _renderer(bid) {
266
+ bid.renderer.push(() => {
267
+ if (typeof window.SPOutStreamPlayer === 'function') {
268
+ const spoplayer = new window.SPOutStreamPlayer(bid);
269
+
270
+ spoplayer.on('ready', () => {
271
+ spoplayer.startAd();
272
+ });
273
+
274
+ try {
275
+ let vastUrlbt = 'data:text/xml;charset=utf-8;base64,' + btoa(bid.vastUrl.replace(/\\"/g, '"'));
276
+ spoplayer.load(vastUrlbt).then(function() {
277
+ window.spoplayer = spoplayer;
278
+ }).catch(function(reason) {
279
+ setTimeout(function() { throw reason; }, 0);
280
+ });
281
+ } catch (err) {
282
+ utils.logMessage(err);
283
+ }
284
+ } else {
285
+ utils.logMessage(`Silverpush outstream player is not defined`);
286
+ }
287
+ });
288
+ }
289
+
290
+ function isVideoBid(bid) {
291
+ return utils.deepAccess(bid, 'mediaTypes.video');
292
+ }
293
+
294
+ function isBannerBid(bid) {
295
+ return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
296
+ }
297
+
298
+ function interpretResponse(resp, req) {
299
+ if (!resp.body) {
300
+ resp.body = { nbr: 0 };
301
+ }
302
+
303
+ return CONVERTER.fromORTB({ request: req.data, response: resp.body });
304
+ }
305
+
306
+ function onBidWon(bid) {
307
+ if (bid == null) { return; }
308
+ if (bid['burl'] == null) { return; }
309
+
310
+ let burlMac = bid['burl'];
311
+ burlMac = burlMac.replace('$' + '{AUCTION_PRICE}', bid['cpm']);
312
+ burlMac = burlMac.replace('$' + '{AUCTION_ID}', bid['auctionId']);
313
+ burlMac = burlMac.replace('$' + '{AUCTION_IMP_ID}', bid['requestId']);
314
+ burlMac = burlMac.replace('$' + '{AUCTION_AD_ID}', bid['adId']);
315
+ burlMac = burlMac.replace('$' + '{AUCTION_SEAT_ID}', bid['seatBidId']);
316
+
317
+ spec.getRequest(burlMac);
318
+ }
319
+
320
+ function _isMobile() {
321
+ return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
322
+ }
323
+
324
+ function _isConnectedTV() {
325
+ return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
326
+ }
@@ -0,0 +1,107 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: Silverpush OpenRTB Bidder Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: prebid@silverpush.co
7
+ ```
8
+
9
+ # Description
10
+
11
+ Prebid.JS adapter that connects to the Chocolate Ad Exchange.
12
+
13
+ *NOTE*: The Silverpush Bidder Adapter requires setup and approval before use. Please reach out to prebid@silverpush.co representative for more details.
14
+
15
+ # Bid Parameters
16
+
17
+ ## Banner/Video
18
+
19
+ {: .table .table-bordered .table-striped }
20
+ | Name | Scope | Description | Example | Type |
21
+ | -------------- | ----------- | ------------------------------------------ | ------------- | ------------ |
22
+ | `publisherId` | required | Publisher id provided by silverpush | "123456" | String |
23
+ | `bidFloor` | optional | Minimum price in USD. bidFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50. <br/> | 1.50 | Number |
24
+
25
+
26
+
27
+
28
+ # mediaTypes Parameters
29
+
30
+ ## mediaTypes.banner
31
+
32
+ The following banner parameters are supported here so publishers may fully declare their banner inventory:
33
+
34
+ {: .table .table-bordered .table-striped }
35
+ | Name | Scope | Description | Example | Type |
36
+ | --------- | ------------| ----------------------------------------------------------------- | --------- | --------- |
37
+ | sizes | required | Avalaible sizes supported for banner ad unit | [ [300, 250], [300, 600] ] | [[Integer, Integer], [Integer, Integer]] |
38
+
39
+ ## mediaTypes.video
40
+
41
+
42
+ The following video parameters are supported here so publishers may fully declare their video inventory:
43
+
44
+ {: .table .table-bordered .table-striped }
45
+ | Name | Scope | Description | Example | Type |
46
+ | --------- | ------------| ----------------------------------------------------------------- | --------- | --------- |
47
+ | context | required | instream or outstream |"outstream" | string |
48
+ | playerSize | required | Avalaible sizes supported for video ad unit. | [300, 250] | [Integer, Integer] |
49
+ | mimes | required | List of content MIME types supported by the player. | ["video/mp4"]| [String]|
50
+ | protocols | required | Supported video bid response protocol values. | [2,3,5,6] | [integers]|
51
+ | api | required | Supported API framework values. | [2] | [integers] |
52
+ | maxduration | required | Maximum video ad duration in seconds. | 30 | Integer |
53
+ | minduration | required | Minimum video ad duration in seconds. | 6 | Integer |
54
+ | startdelay | required | Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements. | 0 | Integer |
55
+ | placement | required | Placement type for the impression. | 1 | Integer |
56
+ | minbitrate | optional | Minimum bit rate in Kbps. | 300 | Integer |
57
+ | maxbitrate | optional | Maximum bit rate in Kbps. | 9600 | Integer |
58
+ | playbackmethod | optional | Playback methods that may be in use. Only one method is typically used in practice. | [2]| [Integers] |
59
+ | linearity | optional | OpenRTB2 linearity. in-strea,overlay... | 1 | Integer |
60
+ | skip | optional | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes . | 1 | Integer |
61
+ | skipafter | optional | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable. | 5 | Integer |
62
+ | delivery | optional | OpenRTB2 delivery. Supported delivery methods (e.g., streaming, progressive). If none specified, assume all are supported. | 1 | [Integer] |
63
+
64
+
65
+ # Example
66
+ ```javascript
67
+ var adUnits = [{
68
+ code: 'div-1',
69
+ mediaTypes: {
70
+ banner: {
71
+ sizes: [ [300, 250], [300,600] ]
72
+ }
73
+ },
74
+ bids: [{
75
+ bidder: 'silverpush',
76
+ params: {
77
+ publisherId: "123456",
78
+ bidFloor: 1.2
79
+ }
80
+ }]
81
+ },{
82
+ code: 'video-1',
83
+ mediaTypes: {
84
+ video: {
85
+ api: [1, 2, 4, 6],
86
+ mimes: ['video/mp4'],
87
+ context: 'instream', // or 'outstream'
88
+ playerSize: [ 640, 480 ],
89
+ protocols: [4,5,6,7],
90
+ placement: 1,
91
+ minduration: 0,
92
+ maxduration: 60,
93
+ startdelay: 0
94
+ }
95
+ },
96
+ bids: [
97
+ {
98
+ bidder: 'silverpush',
99
+ params: {
100
+ publisherId: "123456",
101
+ bidfloor: 2.5
102
+ }
103
+ }
104
+ ]
105
+ }
106
+ ];
107
+ ```
@@ -74,7 +74,7 @@ export const spec = {
74
74
  pbTimeout: config.getConfig('bidderTimeout'),
75
75
  pbjsVersion: prebidVersion,
76
76
  placements: [],
77
- ref: deepAccess(bidderRequest, 'refererInfo.ref') ? bidderRequest.refererInfo.ref : undefined,
77
+ ref: deepAccess(bidderRequest, 'refererInfo.page') ? bidderRequest.refererInfo.page : undefined,
78
78
  usp: {},
79
79
  userIds: {
80
80
  '33acrossId': deepAccess(validBidRequests[0], 'userId.33acrossId.envelope') ? validBidRequests[0].userId['33acrossId'].envelope : undefined,
@@ -193,7 +193,7 @@ export const spec = {
193
193
  creativeId: mid.mid,
194
194
  currency: 'USD',
195
195
  netRevenue: false,
196
- ttl: mid.ttl || 60,
196
+ ttl: mid.ttl || 300,
197
197
  meta: {
198
198
  advertiserDomains: mid.advertiser_domains || []
199
199
  }
@@ -1,5 +1,5 @@
1
1
  import { AD_BREAK_END, AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, SETUP_COMPLETE } from '../../libraries/video/constants/events.js'
2
- import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
2
+ import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
3
3
 
4
4
  export function AdQueueCoordinator(videoCore, pbEvents) {
5
5
  const storage = {};
@@ -58,6 +58,6 @@ export function AdQueueCoordinator(videoCore, pbEvents) {
58
58
 
59
59
  function triggerEvent(eventName, adTagUrl, options) {
60
60
  const payload = Object.assign({ adTagUrl }, options);
61
- pbEvents.emit(getExternalVideoEventName(eventName), payload);
61
+ pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, payload));
62
62
  }
63
63
  }
@@ -1,7 +1,7 @@
1
1
  import { config } from '../../src/config.js';
2
2
  import { find } from '../../src/polyfill.js';
3
3
  import * as events from '../../src/events.js';
4
- import { mergeDeep } from '../../src/utils.js';
4
+ import { mergeDeep, logWarn } from '../../src/utils.js';
5
5
  import { getGlobal } from '../../src/prebidGlobal.js';
6
6
  import CONSTANTS from '../../src/constants.json';
7
7
  import {
@@ -20,7 +20,7 @@ import { videoCoreFactory } from './coreVideo.js';
20
20
  import { gamSubmoduleFactory } from './gamAdServerSubmodule.js';
21
21
  import { videoImpressionVerifierFactory } from './videoImpressionVerifier.js';
22
22
  import { AdQueueCoordinator } from './adQueue.js';
23
- import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
23
+ import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
24
24
 
25
25
  const allVideoEvents = Object.keys(videoEvents).map(eventKey => videoEvents[eventKey]);
26
26
  events.addEvents(allVideoEvents.concat([AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, AUCTION_AD_LOAD_ABORT, BID_IMPRESSION, BID_ERROR]).map(getExternalVideoEventName));
@@ -54,7 +54,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
54
54
  adQueueCoordinator.registerProvider(divId);
55
55
  videoCore.initProvider(divId);
56
56
  videoCore.onEvents(videoEvents, (type, payload) => {
57
- pbEvents.emit(getExternalVideoEventName(type), payload);
57
+ pbEvents.emit(getExternalVideoEventName(type), getExternalVideoEventPayload(type, payload));
58
58
  }, divId);
59
59
 
60
60
  const adServerConfig = provider.adServer;
@@ -145,6 +145,10 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
145
145
  video.context = ortbVideo.placement === PLACEMENT.INSTREAM ? 'instream' : 'outstream';
146
146
  }
147
147
 
148
+ if (!video.plcmt) {
149
+ logWarn('Video.plcmt has not been set. Failure to set a value may result in loss of bids');
150
+ }
151
+
148
152
  const width = ortbVideo.w;
149
153
  const height = ortbVideo.h;
150
154
  if (!video.playerSize && width && height) {
@@ -199,7 +203,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
199
203
 
200
204
  const highestCpmBids = pbGlobal.getHighestCpmBids(adUnitCode);
201
205
  if (!highestCpmBids.length) {
202
- pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), options);
206
+ pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), getExternalVideoEventPayload(AUCTION_AD_LOAD_ABORT, options));
203
207
  return;
204
208
  }
205
209
 
@@ -223,7 +227,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
223
227
  }
224
228
 
225
229
  pbGlobal.markWinningBidAsUsed(bid);
226
- pbEvents.emit(getExternalVideoEventName(eventName), { bid, adEvent: adEventPayload });
230
+ pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, { bid, adEvent: adEventPayload }));
227
231
  }
228
232
 
229
233
  function getBid(adPayload) {
@@ -380,6 +380,7 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
380
380
  const ortb2Object = bid.ortb2;
381
381
  const siteObject = deepAccess(ortb2Object, 'site') || undefined;
382
382
  const siteContentObject = deepAccess(siteObject, 'content') || undefined;
383
+ const sitePublisherObject = deepAccess(siteObject, 'publisher') || undefined;
383
384
  const siteContentDataArray = deepAccess(siteObject, 'content.data') || undefined;
384
385
  const appContentObject = deepAccess(ortb2Object, 'app.content') || undefined;
385
386
  const appContentDataArray = deepAccess(ortb2Object, 'app.content.data') || undefined;
@@ -394,6 +395,11 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
394
395
  outBoundBidRequest.site = validateAppendObject('object', allowedSiteObjectKeys, siteObject, outBoundBidRequest.site);
395
396
  };
396
397
 
398
+ if (sitePublisherObject && isPlainObject(sitePublisherObject)) {
399
+ const allowedPublisherObjectKeys = ['ext'];
400
+ outBoundBidRequest.site.publisher = validateAppendObject('object', allowedPublisherObjectKeys, sitePublisherObject, outBoundBidRequest.site.publisher);
401
+ }
402
+
397
403
  if (siteContentObject && isPlainObject(siteContentObject)) {
398
404
  const allowedContentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language'];
399
405
  const allowedContentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len'];
@@ -435,6 +435,43 @@ pbjs.setConfig({
435
435
  }
436
436
  });
437
437
  ```
438
+
439
+ Notes: The first party site info is filtered and only the following specific keys are allowed in the bidRequests:
440
+
441
+ | Field | Type |
442
+ |-----------------------------|--------|
443
+ | site.name | String |
444
+ | site.domain | String |
445
+ | site.page | String |
446
+ | site.ref | String |
447
+ | site.keywords | String |
448
+ | site.search | String |
449
+ | site.cat | Array |
450
+ | site.sectioncat | Array |
451
+ | site.pagecat | Array |
452
+ | site.ext | Object |
453
+ | site.publisher.ext | Object |
454
+ | site.content.id | String |
455
+ | site.content.title | String |
456
+ | site.content.series | String |
457
+ | site.content.season | String |
458
+ | site.content.genre | String |
459
+ | site.content.contentrating | String |
460
+ | site.content.language | String |
461
+ | site.content.episode | Number |
462
+ | site.content.prodq | Number |
463
+ | site.content.context | Number |
464
+ | site.content.livestream | Number |
465
+ | site.content.len | Number |
466
+ | site.content.cat | Array |
467
+ | site.content.ext | Object |
468
+ | site.content.data | Array |
469
+ | site.content.data[].id | String |
470
+ | site.content.data[].name | String |
471
+ | site.content.data[].segment | Array |
472
+ | site.content.data[].ext | Object |
473
+
474
+
438
475
  ### Passing First Party "user" data:
439
476
  ```javascript
440
477
  pbjs.setConfig({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.49.0",
3
+ "version": "7.51.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
package/src/adloader.js CHANGED
@@ -22,7 +22,8 @@ const _approvedLoadExternalJSList = [
22
22
  'improvedigital',
23
23
  'aaxBlockmeter',
24
24
  'confiant',
25
- 'arcspan'
25
+ 'arcspan',
26
+ 'clean.io'
26
27
  ]
27
28
 
28
29
  /**
package/src/native.js CHANGED
@@ -556,6 +556,21 @@ export function toOrtbNativeRequest(legacyNativeAssets) {
556
556
  return ortb;
557
557
  }
558
558
 
559
+ /**
560
+ * Greatest common divisor between two positive integers
561
+ * https://en.wikipedia.org/wiki/Euclidean_algorithm
562
+ */
563
+ function gcd(a, b) {
564
+ while (a && b && a !== b) {
565
+ if (a > b) {
566
+ a = a - b;
567
+ } else {
568
+ b = b - a;
569
+ }
570
+ }
571
+ return a || b;
572
+ }
573
+
559
574
  /**
560
575
  * This function converts an OpenRTB native request object to Prebid proprietary
561
576
  * format. The purpose of this function is to help adapters to handle the
@@ -584,12 +599,13 @@ export function fromOrtbNativeRequest(openRTBRequest) {
584
599
  if (asset.img.w && asset.img.h) {
585
600
  image.sizes = [asset.img.w, asset.img.h];
586
601
  } else if (asset.img.wmin && asset.img.hmin) {
587
- image.aspect_ratios = {
602
+ const scale = gcd(asset.img.wmin, asset.img.hmin)
603
+ image.aspect_ratios = [{
588
604
  min_width: asset.img.wmin,
589
605
  min_height: asset.img.hmin,
590
- ratio_width: asset.img.wmin,
591
- ratio_height: asset.img.hmin
592
- }
606
+ ratio_width: asset.img.wmin / scale,
607
+ ratio_height: asset.img.hmin / scale
608
+ }]
593
609
  }
594
610
 
595
611
  if (asset.img.type === NATIVE_IMAGE_TYPES.MAIN) {
@@ -53,7 +53,8 @@ describe('33acrossBidAdapter:', function () {
53
53
  brand: 'macOS',
54
54
  version: ['11', '6', '8']
55
55
  },
56
- model: ''
56
+ model: '',
57
+ mobile: 0
57
58
  }
58
59
  },
59
60
  id: 'r1',
@@ -337,7 +338,7 @@ describe('33acrossBidAdapter:', function () {
337
338
  version: ['11', '6', '8']
338
339
  },
339
340
  model: '',
340
- mobile: false
341
+ mobile: 0
341
342
  }
342
343
  }
343
344
  }
@@ -369,7 +370,7 @@ describe('33acrossBidAdapter:', function () {
369
370
  version: ['11', '6', '8']
370
371
  },
371
372
  model: '',
372
- mobile: false
373
+ mobile: 0
373
374
  }
374
375
  }
375
376
  },