Simple HTTP Server in node.js
Translate incomin http request into data strcuture like ring in clojure
Provide basic funcitonal programming utility creating http server
npm i @zaeny/http
basic http server, with handler accept returning object {status, headers, body}
var { createServer, startServer, response } = require('@zaeny/http');
var mainHandler = (req, res) => ({ status: 200, headers: {}, body: 'hello world'});
var server = createServer({ port: 8081, handler: (req, res) => mainHandler(req, res)})
startServer(server);
basic response
with utility functions
var { createServer, startServer, response } = require('@zaeny/http');
var handler = (req, res) => response('hello world');
var server = startServer(createServer({ port: 8081, handler: (req, res) => mainHandler(req, res)}));
create simple routing
var responseIndex = (req, res) => findFile('./index.html');
var getUser = (req, res) => response('fetch all user');
var mainHandler = (req, res) => {
let routes = {
`GET /`: responseIndex,
`GET /api/user`: getUser
}
let resolve = routes[`${req.method} ${req.path}`];
if(resolve) return resolve(req, res);
return notFound();
}
var server = server || startSever(
createServer({ port: 8081, handler: (req, res) => mainHandler(req, res)})
);
usage with @zaeny/clojure.core
var {threadFirst, assoc} = require('@zaeny/clojure.core');
var info = (req, res) => response('hello world');
var server = threadFirst(
{ port: 8081, handler: info },
createServer,
startServer
);
basic routing
var routes = () => ({
'GET /api/audio/chapter/:id': 'handleGetAudioByChapter',
'GET /asset/:id': 'serveAudioAssets'
});
var resolve = {
serveAudioAssets,
handleGetAudioByChapter
}
var mainHandler = (req, res) => {
let found = findRoutes(routes(), req);
if(found && resolve[found]){
return resolve[found](req, res);
}
return notFound('404');
}
var server = threadFirst(
{ port: 8081, handler: mainHandler },
createServer,
startServer
);
testing from repl, createRequest to test the handler
await handler(createRequest('GET /api/search?query=Aziz'));
// create requst with headers
createRequest('GET /api/users', {headers: {'Authorization': 'Basic aziz=pass'}});
createServer,
startServer,
stopServer,
getServer,
response,
redirect,
created,
badRequest,
notFound,
status,
header,
headers,
contentType,
cors,
isContentType,
responseWrite,
clientRequest,
responseBuffer,
responseWith,
readFile,
findFile,
mimeType,
findRoutes,
createRequest,
notModified
- Composable - Collection of functions to solve programming problem
- [1.0.0] expose common api dealing with creating http server
- [1.0.1] add
findRoutes
utility basic routingGET /api/audio/:id
, params matching and stringify body request if json - [1.0.2] add support for
async
handler - [1.0.3] add support buffer non string request
- [1.0.4] fix
contentType
should return not headers - [1.0.5] add
createRequest
to mockup request call - [1.0.6] add
notModified
and fix request parser - [1.0.8] add fix
requst.body
parse if empty dont parse - [1.0.9] add
parsing request body
, add improvement processing response