UNPKG

3.22 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 stripHostMiddleware = require('./middleware/strip_host')
11var karmaMiddleware = require('./middleware/karma')
12var sourceFilesMiddleware = require('./middleware/source_files')
13var proxyMiddleware = require('./middleware/proxy')
14
15var log = require('./logger').create('web-server')
16
17var createCustomHandler = function (customFileHandlers, /* config.basePath */ basePath) {
18 return function (request, response, next) {
19 for (var i = 0; i < customFileHandlers.length; i++) {
20 if (customFileHandlers[i].urlRegex.test(request.url)) {
21 return customFileHandlers[i].handler(request, response, 'fake/static', 'fake/adapter',
22 basePath, 'fake/root')
23 }
24 }
25
26 return next()
27 }
28}
29
30createCustomHandler.$inject = ['customFileHandlers', 'config.basePath']
31
32var createWebServer = function (injector, emitter, fileList) {
33 var config = injector.get('config')
34 common.initializeMimeTypes(config)
35 var serveStaticFile = common.createServeFile(fs, path.normalize(__dirname + '/../static'), config)
36 var serveFile = common.createServeFile(fs, null, config)
37 var filesPromise = new common.PromiseContainer()
38
39 // Set an empty list of files to avoid race issues with
40 // file_list_modified not having been emitted yet
41 filesPromise.set(Promise.resolve(fileList.files))
42
43 emitter.on('file_list_modified', function (files) {
44 filesPromise.set(Promise.resolve(files))
45 })
46
47 // locals for webserver module
48 // NOTE(vojta): figure out how to do this with DI
49 injector = injector.createChild([{
50 serveFile: ['value', serveFile],
51 serveStaticFile: ['value', serveStaticFile],
52 filesPromise: ['value', filesPromise]
53 }])
54
55 var proxyMiddlewareInstance = injector.invoke(proxyMiddleware.create)
56
57 var handler = connect()
58 .use(injector.invoke(runnerMiddleware.create))
59 .use(injector.invoke(stripHostMiddleware.create))
60 .use(injector.invoke(karmaMiddleware.create))
61 .use(injector.invoke(sourceFilesMiddleware.create))
62 // TODO(vojta): extract the proxy into a plugin
63 .use(proxyMiddlewareInstance)
64 // TODO(vojta): remove, this is only here because of karma-dart
65 // we need a better way of custom handlers
66 .use(injector.invoke(createCustomHandler))
67
68 if (config.middleware) {
69 config.middleware.forEach(function (middleware) {
70 handler.use(injector.get('middleware:' + middleware))
71 })
72 }
73
74 handler.use(function (request, response) {
75 common.serve404(response, request.url)
76 })
77
78 var serverClass = http
79 var serverArguments = [handler]
80
81 if (config.protocol === 'https:') {
82 serverClass = https
83 serverArguments.unshift(config.httpsServerOptions || {})
84 }
85 var server = serverClass.createServer.apply(null, serverArguments)
86
87 server.on('upgrade', function (req, socket, head) {
88 log.debug('upgrade %s', req.url)
89 proxyMiddlewareInstance.upgrade(req, socket, head)
90 })
91
92 return server
93}
94
95// PUBLIC API
96exports.create = createWebServer