-
-
Notifications
You must be signed in to change notification settings - Fork 57
/
index.js
103 lines (88 loc) · 3.11 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const sirv = require('sirv');
const colors = require('kleur');
const semiver = require('semiver');
const { resolve } = require('path');
const { readFileSync } = require('fs');
const laccess = require('local-access');
const clear = require('console-clear');
const tinydate = require('tinydate');
const toPort = require('get-port');
const PAD = ' ';
const { HOST, PORT } = process.env;
const stamp = tinydate('{HH}:{mm}:{ss}');
function toTime() {
return '[' + colors.magenta(stamp()) + '] ';
}
function toMS(arr) {
return colors.white().bold(`${(arr[1] / 1e6).toFixed(2)}ms`);
}
function toCode(code) {
let fn = code >= 400 ? 'red' : code > 300 ? 'yellow' : 'green';
return colors[fn](code);
}
function exit(msg) {
process.stderr.write('\n' + PAD + colors.red().bold('ERROR: ') + msg + '\n\n');
process.exit(1);
}
module.exports = function (dir, opts) {
dir = resolve(dir || '.');
opts.maxAge = opts.m;
if (opts.no_color) {
colors.enabled = false
}
if (opts.cors) {
opts.setHeaders = res => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Range');
}
}
let server;
let fn = sirv(dir, opts);
let { hrtime, stdout } = process;
let isLog = opts.logs !== false;
if (opts.http2) {
if (semiver(process.version.substring(1), '8.4.0') < 0) {
return exit('HTTP/2 requires Node v8.4.0 or greater');
}
if (!opts.key || !opts.cert) {
return exit('HTTP/2 requires "key" and "cert" values');
}
opts.allowHTTP1 = true; // grace
opts.key = readFileSync(opts.key);
opts.cert = readFileSync(opts.cert);
if (opts.cacert) opts.cacert = readFileSync(opts.cacert);
if (opts.pass) opts.passphrase = opts.pass;
server = require('http2').createSecureServer(opts, fn);
} else {
server = require('http').createServer(fn);
}
if (isLog && !opts.quiet) {
let uri, dur, start, dash=colors.gray(' ─ ');
server.on('request', (req, res) => {
start = hrtime();
req.once('end', _ => {
dur = hrtime(start);
uri = req.originalUrl || req.url;
stdout.write(PAD + toTime() + toCode(res.statusCode) + dash + toMS(dur) + dash + uri + '\n');
});
});
}
opts.port = PORT || opts.port;
let hostname = HOST || opts.host || '0.0.0.0';
toPort({ host: hostname, port: opts.port }).then(port => {
let isOther = port != opts.port;
let https = opts.http2 || !!opts.ssl; // TODO
server.listen(port, hostname, err => {
if (err) throw err;
if (opts.quiet) return;
if (opts.clear !== false) clear(true);
let { local, network } = laccess({ port, hostname, https });
stdout.write('\n' + PAD + colors.green('Your application is ready~! 🚀\n\n'));
isOther && stdout.write(PAD + colors.italic().dim(`➡ Port ${opts.port} is taken; using ${port} instead\n\n`));
stdout.write(PAD + `${colors.bold('- Local:')} ${local}\n`);
stdout.write(PAD + `${colors.bold('- Network:')} ${/localhost/i.test(hostname) ? colors.dim('Add `--host` to expose') : network}\n\n`);
let border = '─'.repeat(Math.min(stdout.columns, 36) / 2);
if (isLog) stdout.write(border + colors.inverse(' LOGS ') + border + '\n\n');
});
});
}