1
1
import * as utils from '../src/utils' ;
2
2
import { config } from '../src/config' ;
3
+ import { Renderer } from '../src/Renderer' ;
3
4
import { registerBidder } from '../src/adapters/bidderFactory' ;
4
5
import { VIDEO , BANNER } from '../src/mediaTypes' ;
5
6
@@ -12,6 +13,13 @@ const STAGE_VL = 'https://video-library.stage.showheroes.com';
12
13
const BIDDER_CODE = 'showheroes-bs' ;
13
14
const TTL = 300 ;
14
15
16
+ function getEnvURLs ( isStage ) {
17
+ return {
18
+ pubTag : isStage ? STAGE_PUBLISHER_TAG : PROD_PUBLISHER_TAG ,
19
+ vlHost : isStage ? STAGE_VL : PROD_VL
20
+ }
21
+ }
22
+
15
23
export const spec = {
16
24
code : BIDDER_CODE ,
17
25
aliases : [ 'showheroesBs' ] ,
@@ -23,6 +31,9 @@ export const spec = {
23
31
const pageURL = validBidRequests [ 0 ] . params . contentPageUrl || bidderRequest . refererInfo . referer ;
24
32
const isStage = ! ! validBidRequests [ 0 ] . params . stage ;
25
33
const isBanner = ! ! validBidRequests [ 0 ] . mediaTypes . banner ;
34
+ const isOutstream = utils . deepAccess ( validBidRequests [ 0 ] , 'mediaTypes.video.context' ) ;
35
+ const isCustomRender = utils . deepAccess ( validBidRequests [ 0 ] , 'params.outstreamOptions.customRender' ) ;
36
+ const outstreamOptions = utils . deepAccess ( validBidRequests [ 0 ] , 'params.outstreamOptions' ) ;
26
37
27
38
let adUnits = validBidRequests . map ( ( bid ) => {
28
39
const vpaidMode = utils . getBidIdParameter ( 'vpaidMode' , bid . params ) ;
@@ -57,6 +68,7 @@ export const spec = {
57
68
type : streamType ,
58
69
bidId : bid . bidId ,
59
70
mediaType : isBanner ? BANNER : VIDEO ,
71
+ context : context ,
60
72
playerId : utils . getBidIdParameter ( 'playerId' , bid . params ) ,
61
73
auctionId : bidderRequest . auctionId ,
62
74
bidderCode : BIDDER_CODE ,
@@ -67,6 +79,7 @@ export const spec = {
67
79
width : sizes [ 0 ] ,
68
80
height : sizes [ 1 ]
69
81
} ,
82
+ bidRequest : bidderRequest ,
70
83
} ;
71
84
} ) ;
72
85
@@ -78,8 +91,9 @@ export const spec = {
78
91
'user' : [ ] ,
79
92
'meta' : {
80
93
'pageURL' : encodeURIComponent ( pageURL ) ,
81
- 'vastCacheEnabled' : ( ! ! config . getConfig ( 'cache' ) && ! isBanner ) || false ,
94
+ 'vastCacheEnabled' : ( ! ! config . getConfig ( 'cache' ) && ! isBanner && ! outstreamOptions ) || false ,
82
95
'isDesktop' : utils . getWindowTop ( ) . document . documentElement . clientWidth > 700 ,
96
+ 'xmlAndTag' : ( isOutstream && isCustomRender ) || false ,
83
97
'stage' : isStage || undefined
84
98
} ,
85
99
'requests' : adUnits ,
@@ -133,6 +147,14 @@ function createBids(bidRes, reqData) {
133
147
134
148
bidRes . bids . forEach ( function ( bid ) {
135
149
const reqBid = bidMap [ bid . bidId ] ;
150
+ let currentBidRequest ;
151
+ for ( let i in reqBid . bidRequest . bids ) {
152
+ if ( bid . bidId === reqBid . bidRequest . bids [ i ] . bidId ) {
153
+ currentBidRequest = reqBid . bidRequest . bids [ i ] ;
154
+ break ;
155
+ }
156
+ }
157
+
136
158
let bidUnit = { } ;
137
159
bidUnit . cpm = bid . cpm ;
138
160
bidUnit . requestId = bid . bidId ;
@@ -154,25 +176,95 @@ function createBids(bidRes, reqData) {
154
176
}
155
177
if ( reqBid . mediaType === BANNER ) {
156
178
bidUnit . ad = getBannerHtml ( bid , reqBid , reqData ) ;
179
+ } else if ( reqBid . context === 'outstream' ) {
180
+ const renderer = Renderer . install ( {
181
+ id : bid . bidId ,
182
+ url : '//' ,
183
+ config : {
184
+ playerId : reqBid . playerId ,
185
+ width : bid . video . width ,
186
+ height : bid . video . height ,
187
+ vastUrl : bid . vastTag ,
188
+ vastXml : bid . vastXml ,
189
+ debug : reqData . debug ,
190
+ isStage : ! ! reqData . meta . stage ,
191
+ customRender : utils . getBidIdParameter ( 'customRender' , currentBidRequest . params . outstreamOptions ) ,
192
+ slot : utils . getBidIdParameter ( 'slot' , currentBidRequest . params . outstreamOptions ) ,
193
+ iframe : utils . getBidIdParameter ( 'iframe' , currentBidRequest . params . outstreamOptions ) ,
194
+ }
195
+ } ) ;
196
+ renderer . setRender ( outstreamRender ) ;
197
+ bidUnit . renderer = renderer ;
157
198
}
158
199
bids . push ( bidUnit ) ;
159
200
} ) ;
160
201
161
202
return bids ;
162
203
}
163
204
205
+ function outstreamRender ( bid ) {
206
+ const embedCode = createOutstreamEmbedCode ( bid ) ;
207
+ if ( typeof bid . renderer . config . customRender === 'function' ) {
208
+ bid . renderer . config . customRender ( bid , embedCode ) ;
209
+ } else {
210
+ try {
211
+ const inIframe = utils . getBidIdParameter ( 'iframe' , bid . renderer . config ) ;
212
+ if ( inIframe && window . document . getElementById ( inIframe ) . nodeName === 'IFRAME' ) {
213
+ const iframe = window . document . getElementById ( inIframe ) ;
214
+ let framedoc = iframe . contentDocument || ( iframe . contentWindow && iframe . contentWindow . document ) ;
215
+ framedoc . body . appendChild ( embedCode ) ;
216
+ return ;
217
+ }
218
+
219
+ const slot = utils . getBidIdParameter ( 'slot' , bid . renderer . config ) ;
220
+ if ( slot && window . document . getElementById ( slot ) ) {
221
+ window . document . getElementById ( slot ) . appendChild ( embedCode ) ;
222
+ } else if ( slot ) {
223
+ utils . logError ( '[ShowHeroes][renderer] Error: spot not found' ) ;
224
+ }
225
+ } catch ( err ) {
226
+ utils . logError ( '[ShowHeroes][renderer] Error:' + err . message )
227
+ }
228
+ }
229
+ }
230
+
231
+ function createOutstreamEmbedCode ( bid ) {
232
+ const isStage = utils . getBidIdParameter ( 'isStage' , bid . renderer . config ) ;
233
+ const urls = getEnvURLs ( isStage ) ;
234
+
235
+ const fragment = window . document . createDocumentFragment ( ) ;
236
+
237
+ const script = window . document . createElement ( 'script' ) ;
238
+ script . type = 'text/javascript' ;
239
+ script . src = urls . pubTag ;
240
+ script . onload = function ( ) {
241
+ window . ShowheroesTag = this ;
242
+ } ;
243
+ script . setAttribute ( 'data-player-host' , urls . vlHost ) ;
244
+
245
+ const spot = window . document . createElement ( 'div' ) ;
246
+ spot . setAttribute ( 'class' , 'showheroes-spot' ) ;
247
+ spot . setAttribute ( 'data-player' , utils . getBidIdParameter ( 'playerId' , bid . renderer . config ) ) ;
248
+ spot . setAttribute ( 'data-debug' , utils . getBidIdParameter ( 'debug' , bid . renderer . config ) ) ;
249
+ spot . setAttribute ( 'data-ad-vast-tag' , utils . getBidIdParameter ( 'vastUrl' , bid . renderer . config ) ) ;
250
+ spot . setAttribute ( 'data-stream-type' , 'outstream' ) ;
251
+
252
+ fragment . appendChild ( spot ) ;
253
+ fragment . appendChild ( script ) ;
254
+ return fragment ;
255
+ }
256
+
164
257
function getBannerHtml ( bid , reqBid , reqData ) {
165
258
const isStage = ! ! reqData . meta . stage ;
166
- const pubTag = isStage ? STAGE_PUBLISHER_TAG : PROD_PUBLISHER_TAG ;
167
- const vlHost = isStage ? STAGE_VL : PROD_VL ;
259
+ const urls = getEnvURLs ( isStage ) ;
168
260
return `<html>
169
261
<head></head>
170
262
<body>
171
- <script async src="${ pubTag } "
263
+ <script async src="${ urls . pubTag } "
172
264
data-canvas=""
173
265
data-noad-passback-listener=""
174
266
onload="window.ShowheroesTag=this"
175
- data-player-host="${ vlHost } "></script>
267
+ data-player-host="${ urls . vlHost } "></script>
176
268
<div class="showheroes-spot"
177
269
data-debug="${ reqData . debug ? '1' : '' } "
178
270
data-player="${ reqBid . playerId } "
0 commit comments