forked from vercel/micro-dev
/
serve.js
66 lines (51 loc) · 1.57 KB
/
serve.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
// Ensure that the loaded files and packages have the correct env
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
// Packages
const getPort = require('get-port');
const serve = require('micro/lib');
const getModule = require('micro/lib/handler');
// Utilities
const listening = require('./listening');
const log = require('./log');
module.exports = async (file, flags, restarting) => {
if (restarting) {
process.emit('SIGUSR2');
}
const handler = await getModule(file);
// And then load the files
const module = flags.silent ? handler : log(handler, flags.limit);
const server = serve(module);
const {isNaN} = Number;
let port = Number(flags.port);
if (isNaN(port) || (!isNaN(port) && (port < 1 || port >= 2 ** 16))) {
console.error(`Port option must be a number. Supplied: ${flags.port}`);
process.exit(1);
}
// Check if the specified port is already in use (if none
// is specified, the default one will be checked)
const open = await getPort(port);
const old = port;
// Define if the port is already in use
let inUse = open !== port;
// Only overwrite the port when restarting
if (inUse && !restarting) {
port = open;
inUse = {old, open};
}
const sockets = [];
server.listen(port, flags.host, err => {
if (err) {
console.error('micro:', err.stack);
process.exit(1);
}
if (restarting) {
flags.restarted = true;
}
flags._[0] = file;
return listening(server, inUse, flags, sockets);
});
server.on('connection', socket => {
const index = sockets.push(socket);
socket.once('close', () => sockets.splice(index, 1));
});
};