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 stripHostMiddleware = require('./middleware/strip_host')
|
11 | var karmaMiddleware = require('./middleware/karma')
|
12 | var sourceFilesMiddleware = require('./middleware/source_files')
|
13 | var proxyMiddleware = require('./middleware/proxy')
|
14 |
|
15 | var log = require('./logger').create('web-server')
|
16 |
|
17 | var 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 |
|
30 | createCustomHandler.$inject = ['customFileHandlers', 'config.basePath']
|
31 |
|
32 | var 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 |
|
40 |
|
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 |
|
48 |
|
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 |
|
63 | .use(proxyMiddlewareInstance)
|
64 |
|
65 |
|
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 |
|
96 | exports.create = createWebServer
|