UNPKG

3.64 kBJavaScriptView Raw
1var fs = require('graceful-fs')
2var http = require('http')
3var https = require('https')
4var path = require('path')
5var connect = require('connect')
6var Promise = require('bluebird')
7
8var common = require('./middleware/common')
9var runnerMiddleware = require('./middleware/runner')
10var stopperMiddleware = require('./middleware/stopper')
11var stripHostMiddleware = require('./middleware/strip_host')
12var karmaMiddleware = require('./middleware/karma')
13var sourceFilesMiddleware = require('./middleware/source_files')
14var proxyMiddleware = require('./middleware/proxy')
15
16var log = require('./logger').create('web-server')
17
18var 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
31createCustomHandler.$inject = ['customFileHandlers', 'config.basePath']
32
33var 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 // Set an empty list of files to avoid race issues with
41 // file_list_modified not having been emitted yet
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 // locals for webserver module
49 // NOTE(vojta): figure out how to do this with DI
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 // TODO(vojta): extract the proxy into a plugin
73 handler.use(proxyMiddlewareInstance)
74 // TODO(vojta): remove, this is only here because of karma-dart
75 // we need a better way of custom handlers
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// PUBLIC API
111exports.create = createWebServer