1 | var fs = require('graceful-fs')
|
2 | var http = require('http')
|
3 | var https = require('https')
|
4 | var path = require('path')
|
5 | var connect = require('connect')
|
6 | var Promise = require('bluebird')
|
7 |
|
8 | var common = require('./middleware/common')
|
9 | var runnerMiddleware = require('./middleware/runner')
|
10 | var stopperMiddleware = require('./middleware/stopper')
|
11 | var stripHostMiddleware = require('./middleware/strip_host')
|
12 | var karmaMiddleware = require('./middleware/karma')
|
13 | var sourceFilesMiddleware = require('./middleware/source_files')
|
14 | var proxyMiddleware = require('./middleware/proxy')
|
15 |
|
16 | var log = require('./logger').create('web-server')
|
17 |
|
18 | var createCustomHandler = function (customFileHandlers, /* config.basePath */ basePath) {
|
19 | return function (request, response, next) {
|
20 | for (var i = 0; i < customFileHandlers.length; i++) {
|
21 | if (customFileHandlers[i].urlRegex.test(request.url)) {
|
22 | return customFileHandlers[i].handler(request, response, 'fake/static', 'fake/adapter',
|
23 | basePath, 'fake/root')
|
24 | }
|
25 | }
|
26 |
|
27 | return next()
|
28 | }
|
29 | }
|
30 |
|
31 | createCustomHandler.$inject = ['customFileHandlers', 'config.basePath']
|
32 |
|
33 | var createWebServer = function (injector, emitter, fileList) {
|
34 | var config = injector.get('config')
|
35 | common.initializeMimeTypes(config)
|
36 | var serveStaticFile = common.createServeFile(fs, path.normalize(path.join(__dirname, '/../static')), config)
|
37 | var serveFile = common.createServeFile(fs, null, config)
|
38 | var filesPromise = new common.PromiseContainer()
|
39 |
|
40 |
|
41 |
|
42 | filesPromise.set(Promise.resolve(fileList.files))
|
43 |
|
44 | emitter.on('file_list_modified', function (files) {
|
45 | filesPromise.set(Promise.resolve(files))
|
46 | })
|
47 |
|
48 |
|
49 |
|
50 | injector = injector.createChild([{
|
51 | serveFile: ['value', serveFile],
|
52 | serveStaticFile: ['value', serveStaticFile],
|
53 | filesPromise: ['value', filesPromise]
|
54 | }])
|
55 |
|
56 | var proxyMiddlewareInstance = injector.invoke(proxyMiddleware.create)
|
57 |
|
58 | log.debug('Instantiating middleware')
|
59 | var handler = connect()
|
60 |
|
61 | if (config.beforeMiddleware) {
|
62 | config.beforeMiddleware.forEach(function (middleware) {
|
63 | handler.use(injector.get('middleware:' + middleware))
|
64 | })
|
65 | }
|
66 |
|
67 | handler.use(injector.invoke(runnerMiddleware.create))
|
68 | handler.use(injector.invoke(stopperMiddleware.create))
|
69 | handler.use(injector.invoke(stripHostMiddleware.create))
|
70 | handler.use(injector.invoke(karmaMiddleware.create))
|
71 | handler.use(injector.invoke(sourceFilesMiddleware.create))
|
72 |
|
73 | handler.use(proxyMiddlewareInstance)
|
74 |
|
75 |
|
76 | handler.use(injector.invoke(createCustomHandler))
|
77 |
|
78 | if (config.middleware) {
|
79 | config.middleware.forEach(function (middleware) {
|
80 | handler.use(injector.get('middleware:' + middleware))
|
81 | })
|
82 | }
|
83 |
|
84 | handler.use(function (request, response) {
|
85 | common.serve404(response, request.url)
|
86 | })
|
87 |
|
88 | var serverClass = http
|
89 | var serverArguments = [handler]
|
90 |
|
91 | if (config.protocol === 'https:') {
|
92 | serverClass = https
|
93 | serverArguments.unshift(config.httpsServerOptions || {})
|
94 | }
|
95 |
|
96 | if (config.httpModule) {
|
97 | serverClass = config.httpModule
|
98 | }
|
99 |
|
100 | var server = serverClass.createServer.apply(null, serverArguments)
|
101 |
|
102 | server.on('upgrade', function (req, socket, head) {
|
103 | log.debug('upgrade %s', req.url)
|
104 | proxyMiddlewareInstance.upgrade(req, socket, head)
|
105 | })
|
106 |
|
107 | return server
|
108 | }
|
109 |
|
110 |
|
111 | exports.create = createWebServer
|