-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
71 lines (60 loc) · 2.09 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var spdy = require('spdy');
var keys = require('spdy-keys');
var ecstatic = require('ecstatic');
var morgan = require('morgan');
var mime = require('mime');
var fs = require('fs');
module.exports = function(options, cb) {
options = options || {};
cb = typeof options === 'function' ? options : cb;
// determine port, keys & root folder
var port = options.port || 5000;
var root = options.root || process.cwd() + '/';
if (root[root.length-1] !== '/') {
root += '/';
}
// add ssl keys
// TODO: Enable users to add their own keys
var spdyOpts = {
key: keys.key,
cert: keys.cert,
ca: keys.ca,
};
// dummy `logger` that prevents the script from outputting anything
var quietLogger = function(req, res, _cb) {
_cb();
};
// create logger "middleware"
var logger = options.quiet ? quietLogger : morgan('dev');
// create static server "middleware"
var es = ecstatic({root: root});
// default middleware (logging + static file server)
var middleware = function(req, res) {
var requestedFile = req.url.replace('/', '');
if (requestedFile === '') requestedFile = 'index.html';
// push resources
if (options.push && options.push[requestedFile] && options.push[requestedFile].length > 0) {
options.push[requestedFile].forEach(function(file) {
var stream = res.push(file, {
request: { accept: '*/*'},
response: {'content-type': mime.lookup(file)},
});
stream.on('error', console.error);
try {
var pushable = fs.readFileSync(root + file);
stream.end(pushable);
if (!options.quiet) console.log('PUSH', '/' + file, '-', pushable.length);
} catch (e) {
console.error('Error pushing file:', root + file, e);
}
});
}
logger(req, res, function(err) {
if (err) console.error(err);
es(req, res, typeof options.middleware === 'function' || function() {});
});
};
var server = spdy.createServer(spdyOpts, middleware);
server.listen(port, typeof cb === 'function' ? cb.bind(server, port) : function() {});
return server;
};