UNPKG

3.43 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 createCustomHandler (customFileHandlers, config) {
20 return function (request, response, next) {
21 const handler = customFileHandlers.find((handler) => handler.urlRegex.test(request.url))
22 return handler
23 ? handler.handler(request, response, 'fake/static', 'fake/adapter', config.basePath, 'fake/root')
24 : next()
25 }
26}
27
28createCustomHandler.$inject = ['customFileHandlers', 'config']
29
30function createFilesPromise (emitter, fileList) {
31 // Set an empty list of files to avoid race issues with
32 // file_list_modified not having been emitted yet
33 let files = fileList.files
34 emitter.on('file_list_modified', (filesParam) => { files = filesParam })
35
36 return {
37 then (...args) {
38 return Promise.resolve(files).then(...args)
39 }
40 }
41}
42
43function createServeStaticFile (config) {
44 return common.createServeFile(fs, path.normalize(path.join(__dirname, '/../static')), config)
45}
46createServeStaticFile.$inject = ['config']
47
48function createServeFile (config) {
49 return common.createServeFile(fs, null, config)
50}
51createServeFile.$inject = ['config']
52
53function createWebServer (injector, config) {
54 const { mime = {} } = config
55 mimeType.define({ ...mime }, true)
56
57 const proxyMiddlewareInstance = injector.invoke(proxyMiddleware.create)
58
59 log.debug('Instantiating middleware')
60 const handler = connect()
61
62 if (config.beforeMiddleware) {
63 config.beforeMiddleware.forEach((middleware) => handler.use(injector.get('middleware:' + middleware)))
64 }
65
66 handler.use(injector.invoke(runnerMiddleware.create))
67 handler.use(injector.invoke(stopperMiddleware.create))
68 handler.use(injector.invoke(karmaMiddleware.create))
69 handler.use(injector.invoke(sourceFilesMiddleware.create))
70 // TODO(vojta): extract the proxy into a plugin
71 handler.use(proxyMiddlewareInstance)
72 // TODO(vojta): remove, this is only here because of karma-dart
73 // we need a better way of custom handlers
74 handler.use(injector.invoke(createCustomHandler))
75
76 if (config.middleware) {
77 config.middleware.forEach((middleware) => handler.use(injector.get('middleware:' + middleware)))
78 }
79
80 handler.use((request, response) => common.serve404(response, request.url))
81
82 let serverClass = http
83 const serverArguments = [handler]
84
85 if (config.protocol === 'https:') {
86 serverClass = https
87 serverArguments.unshift(config.httpsServerOptions || {})
88 }
89
90 if (config.httpModule) {
91 serverClass = config.httpModule
92 }
93
94 const server = serverClass.createServer.apply(null, serverArguments)
95
96 server.on('upgrade', function (req, socket, head) {
97 log.debug(`upgrade ${req.url}`)
98 proxyMiddlewareInstance.upgrade(req, socket, head)
99 })
100
101 return server
102}
103
104createWebServer.$inject = ['injector', 'config']
105
106module.exports = {
107 createWebServer,
108 createServeFile,
109 createServeStaticFile,
110 createFilesPromise
111}