1 | 'use strict'
|
2 |
|
3 | const fs = require('graceful-fs')
|
4 | const http = require('http')
|
5 | const https = require('https')
|
6 | const path = require('path')
|
7 | const connect = require('connect')
|
8 | const mimeType = require('mime')
|
9 |
|
10 | const common = require('./middleware/common')
|
11 | const runnerMiddleware = require('./middleware/runner')
|
12 | const stopperMiddleware = require('./middleware/stopper')
|
13 | const karmaMiddleware = require('./middleware/karma')
|
14 | const sourceFilesMiddleware = require('./middleware/source_files')
|
15 | const proxyMiddleware = require('./middleware/proxy')
|
16 |
|
17 | const log = require('./logger').create('web-server')
|
18 |
|
19 | function 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 |
|
28 | createCustomHandler.$inject = ['customFileHandlers', 'config']
|
29 |
|
30 | function createFilesPromise (emitter, fileList) {
|
31 |
|
32 |
|
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 |
|
43 | function createServeStaticFile (config) {
|
44 | return common.createServeFile(fs, path.normalize(path.join(__dirname, '/../static')), config)
|
45 | }
|
46 | createServeStaticFile.$inject = ['config']
|
47 |
|
48 | function createServeFile (config) {
|
49 | return common.createServeFile(fs, null, config)
|
50 | }
|
51 | createServeFile.$inject = ['config']
|
52 |
|
53 | function 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 |
|
71 | handler.use(proxyMiddlewareInstance)
|
72 |
|
73 |
|
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 |
|
104 | createWebServer.$inject = ['injector', 'config']
|
105 |
|
106 | module.exports = {
|
107 | createWebServer,
|
108 | createServeFile,
|
109 | createServeStaticFile,
|
110 | createFilesPromise
|
111 | }
|