crude-server
Version:
79 lines (68 loc) • 1.88 kB
JavaScript
;
let http = require('http');
let url = require('url');
let log = console.log; // eslint-disable-line
/**
* TODO some default mids
*/
module.exports = (apier) => {
let server = null;
let sockets = [],
nextSocketId = 0;
let start = (port = 0) => {
if (server) return;
server = http.createServer((req, res) => {
let urlObject = url.parse(req.url, true);
// filter api
let api = apier(urlObject.pathname, req.url, req);
if (api) {
api(req, res, urlObject);
} else {
res.end('unsupported api');
}
});
server.on('connection', (socket) => {
let id = nextSocketId++;
sockets[id] = socket;
socket.on('error', (err) => {
log(err);
});
socket.on('close', () => {
delete sockets[id];
});
});
return new Promise((resolve, reject) => {
server.listen(port, (err) => {
if (err) reject(err);
else {
resolve({
address: server.address(),
port,
server
});
}
});
});
};
let stop = () => {
if (!server) return;
return new Promise((resolve, reject) => {
sockets.forEach((socket) => {
socket && socket.destroy();
});
server.close((err) => {
if (err) {
server = null;
reject(err);
} else {
server = null;
resolve();
}
});
});
};
return {
start,
stop
};
};