UNPKG

2.85 kBJavaScriptView Raw
1'use strict'
2
3const fs = require('graceful-fs')
4const http = require('http')
5const https = require('https')
6const path = require('path')
7const connect = require('connect')
8const mimeType = require('mime')
9
10const common = require('./middleware/common')
11const runnerMiddleware = require('./middleware/runner')
12const stopperMiddleware = require('./middleware/stopper')
13const karmaMiddleware = require('./middleware/karma')
14const sourceFilesMiddleware = require('./middleware/source_files')
15const proxyMiddleware = require('./middleware/proxy')
16
17const log = require('./logger').create('web-server')
18
19function createFilesPromise (emitter, fileList) {
20 // Set an empty list of files to avoid race issues with
21 // file_list_modified not having been emitted yet
22 let files = fileList.files
23 emitter.on('file_list_modified', (filesParam) => { files = filesParam })
24
25 return {
26 then (...args) {
27 return Promise.resolve(files).then(...args)
28 }
29 }
30}
31
32function createServeStaticFile (config) {
33 return common.createServeFile(fs, path.normalize(path.join(__dirname, '/../static')), config)
34}
35createServeStaticFile.$inject = ['config']
36
37function createServeFile (config) {
38 return common.createServeFile(fs, null, config)
39}
40createServeFile.$inject = ['config']
41
42function createWebServer (injector, config) {
43 const { mime = {} } = config
44 mimeType.define({ ...mime }, true)
45
46 const proxyMiddlewareInstance = injector.invoke(proxyMiddleware.create)
47
48 log.debug('Instantiating middleware')
49 const handler = connect()
50
51 if (config.beforeMiddleware) {
52 config.beforeMiddleware.forEach((middleware) => handler.use(injector.get('middleware:' + middleware)))
53 }
54
55 handler.use(injector.invoke(runnerMiddleware.create))
56 handler.use(injector.invoke(stopperMiddleware.create))
57 handler.use(injector.invoke(karmaMiddleware.create))
58 handler.use(injector.invoke(sourceFilesMiddleware.create))
59 // TODO(vojta): extract the proxy into a plugin
60 handler.use(proxyMiddlewareInstance)
61
62 if (config.middleware) {
63 config.middleware.forEach((middleware) => handler.use(injector.get('middleware:' + middleware)))
64 }
65
66 handler.use((request, response) => common.serve404(response, request.url))
67
68 let serverClass = http
69 const serverArguments = [handler]
70
71 if (config.protocol === 'https:') {
72 serverClass = https
73 serverArguments.unshift(config.httpsServerOptions || {})
74 }
75
76 if (config.httpModule) {
77 serverClass = config.httpModule
78 }
79
80 const server = serverClass.createServer.apply(null, serverArguments)
81
82 server.on('upgrade', function (req, socket, head) {
83 log.debug(`upgrade ${req.url}`)
84 proxyMiddlewareInstance.upgrade(req, socket, head)
85 })
86
87 return server
88}
89
90createWebServer.$inject = ['injector', 'config']
91
92module.exports = {
93 createWebServer,
94 createServeFile,
95 createServeStaticFile,
96 createFilesPromise
97}