JSFiber is a JavaScript web framework designed to be a comprehensive web server utility like Express. It provides routing, middleware, and request handling features, all while being fast and efficient.
Caution
This project is under construction and is not fully tested and expected to be entirely working yet. Please use with caution.
To install JSFiber, use npm or the package manager of your choice.
npm install jsfiber
# or
pnpm add jsfiber
# or
yarn add jsfiber
# or
bun add jsfiberTo start the server, create a new instance of the server and call the start method with the desired port number:
import { Server } from "jsfiber/server";
const server = new Server({ infoBox: true, enableCORS: true });
server.start(3000);The server includes a feature to check port availability before starting. If the specified port is unavailable, the server will try subsequent ports until it finds an available one. Warnings are logged each time a new port is tried.
You can define routes using the router instance. Here is an example of defining GET and POST routes:
import { Server } from "jsfiber/server";
import { Router } from "jsfiber/router";
import { request, response } from "jsfiber/http";
const server = new Server({ infoBox: true });
const router = new Router();
router.get("/", async (_req, res) => {
const resInstance = response(res);
resInstance.status(200).json({
message: 'Hello, World!',
});
});
router.post("/create", async (req, res) => {
const reqInstance = request(req);
const body = await reqInstance.body;
console.log(`Body: ${body}`);
const resInstance = response(res);
resInstance.status(201).json({
message: 'Resource created',
});
});You can use the middleware router to setup middlewares to handle tasks such as logging, authentication, etc. Here is an example of using a middleware with the middleware router:
import { MiddlewareRouter } from "jsfiber/router";
const middleware = new MiddlewareRouter();
middleware.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});JSFiber supports additional HTTP methods such as PUT, DELETE, PATCH, HEAD, and OPTIONS. Here is an example of defining routes for these methods:
router.put('/update', async (req, res) => {
const reqInstance = request(req);
const body = await reqInstance.body;
const resInstance = response(res);
resInstance.json({ message: 'Resource updated', received: body });
});
router.delete('/delete', (req, res) => {
const resInstance = response(res);
resInstance.json({ message: 'Resource deleted' });
});
router.patch('/modify', async (req, res) => {
const reqInstance = request(req);
const body = await reqInstance.body;
const resInstance = response(res);
resInstance.json({ message: 'Resource modified', received: body });
});
router.head('/info', (req, res) => {
const resInstance = response(res);
resInstance.text('');
});
router.options('/options', (req, res) => {
const resInstance = response(res);
resInstance.json({ message: 'OPTIONS request received' });
});JSFiber includes a built-in cookie parser. You can use it to parse cookies from the request headers. Here is an example:
router.get("/cookies", async (req, res) => {
const reqInstance = request(req);
const cookies = reqInstance.parseCookies();
console.log(`Cookies: ${JSON.stringify(cookies)}`);
const resInstance = response(res);
resInstance.status(200).json({
message: 'Cookies parsed',
cookies: cookies
});
});JSFiber includes built-in CORS support. You can enable CORS by including the CorsModule in the modules array in the server options. Here is an example:
import { Server } from "jsfiber/server";
const server = new Server({ infoBox: true, enableCORS: true });
server.start(3000);Bellow we provide a complete full example code.
import { Server } from "jsfiber/server";
import { Router, MiddlewareRouter } from "jsfiber/router";
import { request, response } from "jsfiber/http";
const server = new Server({ infoBox: true, enableCORS: true });
const router = new Router();
const middleware = new MiddlewareRouter();
middleware.use(async (req, res, next) => {
console.log(`Middleware: ${req.method} ${req.url}`);
next();
});
router.get("/", async (_req, res) => {
const resInstance = response(res);
resInstance.status(200).json({
message: 'Hello, World!',
});
});
router.post("/create", async (req, res) => {
const reqInstance = request(req);
const body = await reqInstance.body;
console.log(`Body: ${body}`);
const resInstance = response(res);
resInstance.status(201).json({
message: 'Resource created',
});
});
router.put("/update", async (req, res) => {
const reqInstance = request(req);
const body = await reqInstance.body;
console.log(`Body: ${body}`);
const resInstance = response(res);
resInstance.status(200).json({
message: 'Resource updated',
});
});
router.delete("/delete", async (_req, res) => {
const resInstance = response(res);
resInstance.status(200).json({
message: 'Resource deleted',
});
});
router.patch("/modify", async (req, res) => {
const reqInstance = request(req);
const body = await reqInstance.body;
console.log(`Body: ${body}`);
const resInstance = response(res);
resInstance.status(200).json({
message: 'Resource modified',
});
});
router.head("/info", async (_req, res) => {
const resInstance = response(res);
resInstance.status(200).text('');
});
router.options("/options", async (_req, res) => {
const resInstance = response(res);
resInstance.status(200).json({
message: 'Options request received',
});
});
router.get("/cookies", async (req, res) => {
const reqInstance = request(req);
const cookies = reqInstance.parseCookies();
console.log(`Cookies: ${JSON.stringify(cookies)}`);
const resInstance = response(res);
resInstance.status(200).json({
message: 'Cookies parsed',
cookies: cookies
});
});
server.setPublicDirectory("public");
server.start(3000);This project is licensed under the BSD-3-Clause License - see the LICENSE file for details.