const fs = require('fs')
const http = require('http')
const path = require('path')
const mime = require('mime-types')
const errorHandler = (error, response) => {
response.statusCode = 500
response.setHeader('Content-Type', 'text/html')
response.end(`<h1>${error.message}</h1>`)
}
const render = (file, status = 200) => (request, response) => {
const filePath = path.resolve(__dirname, `../static/${file}`)
response.statusCode = status
response.setHeader('Content-Type', 'text/html')
fs.readFile(filePath, 'utf8', (error, content) => {
if (error) return errorHandler(error, response)
return response.end(content)
})
}
const stream = file => (request, response) => {
const filePath = path.resolve(__dirname, `../static/${file}`)
const readStream = fs.createReadStream(filePath)
response.statusCode = 200
response.setHeader('Content-Type', mime.lookup(file))
readStream.on('error', error => errorHandler(error, response))
readStream.pipe(response)
}
const routes = {
'/': render('index.html'),
'/not-found': render('not-found.html', 404),
'/big-file.xlsx': stream('very-big-file.xlsx')
}
const server = http.createServer((request, response) =>
(routes[request.url] || routes['/not-found'])(request, response))
server.listen(3000, () => console.log('Server up at http://localhost:3000'))