0.0.10 • Published 6 months ago

backendium v0.0.10

Weekly downloads
-
License
-
Repository
-
Last release
6 months ago

Table of Contents

  1. Installation
  2. Basics
  3. Routing
  4. Request validation
  5. Authorization
  6. Dynamic routing
  7. Websocket

Installation

npm i backendium checkeasy

Basics

import Backendium from "backendium";

const app = new Backendium;

app.get("*", (request, response, app, next) => { response.end({backendium: "0.0.0"}); });

app.start();

request:
```bash
curl http://localhost:8080/

response:

{"backendium":"0.0.0"}

Routing

Router class

// main.ts
import Backendium from "backendium";
import handlers from "./handlers.js";

const app = new Backendium;

app.router(handlers);

app.start();
// handlers.ts
import {BackendiumRouter} from "backendium";

const router = new BackendiumRouter;

router.get("*", (request, response, app, next) => {
    response.end({backendium: "0.0.0"});
});

export default router;

Backendium class extends BackendiumRouter

Methods

router.get("/route", (request, response, app, next) => {
    // handler
});

router.post("/route", (request, response, app, next) => {
    // handler
});

Supported methods:

"get", "post", "put", "delete", "patch", "options", "head", "checkout", "connect", "copy", "lock", "merge", "mkactivity", "mkcol", "move", "m-search", "notify", "propfind", "proppatch", "purge", "report", "search", "subscribe", "unsubscribe", "trace", "unlock", "link", "unlink"

Request validation (checkeasy)

Checkeasy imports:

import {int, object, string, strToInt} from "checkeasy";
router.post<{n: number}>("/validated", (request, response) => {
    console.log(request.body);
    response.end(Math.sqrt(request.body.n));
}, {
    bodyValidator: object({
        n: int()
    })
});
curl http://localhost:8080/validated -d '{"n": 2}'

Query

router.get<Buffer /*default type for request body*/, {}, {n: number}>("/validated/query", (request, response) => {
    console.log(request.query);
    response.end(Math.sqrt(request.query.n));
}, {
    queryValidator: object({
        n: strToInt()
    })
});
curl "http://localhost:8080/validated/query?n=2"

Headers

router.get<Buffer, {}, {}, undefined, {n: number}>("/validated/headers", (request, response) => {
    console.log(request.headers);
    response.end(Math.sqrt(request.headers.n));
}, {
    headersValidator: object({
        n: strToInt()
    }, {ignoreUnknown: true})
});
curl http://localhost:8080/validated/headers -H "n:2" 

Authorization

const USERS: {[key: number]: string} = {
    54: "sizoff"
}

router.post<Buffer, {}, {}, string>("/auth", (request, response) => {
    console.log(request.auth); // type of request.auth is string
    response.end();
}, {
    authChecker(request, response) {
        if (typeof request.headers.auth !== "string" || !(Number(request.headers.auth) in USERS)) return null; // auth failed
        return USERS[Number(request.headers.auth)]; // return auth data
    }
});
curl http://localhost:8080/auth -H "auth:54" -d ""

Global (for router)

const router = new BackendiumRouter<string>;

const USERS: {[key: number]: string} = {
    54: "sizoff"
}

router.setAuth((request, response) => {
    if (typeof request.headers.auth !== "string" || !(Number(request.headers.auth) in USERS)) return null; // auth failed
    return USERS[Number(request.headers.auth)]; // return auth data
});

router.post("/auth", (request, response) => {
    console.log(request.globalAuth); // type of request.globalAuth is string
    response.end();
}, {
    auth: true
});

Dynamic routing

More info: https://expressjs.com/en/guide/routing.html#route-paths

router.get<Buffer, {n: number}>("/dynamic/:n", (request, response) => {
    console.log(request.params);
    response.end(Math.sqrt(request.params.n));
}, {
    paramsValidator: object({
        n: strToInt()
    })
});
curl http://localhost:8080/dynamic/2

Websocket

router.ws("/ws")
    .on("message", (data, socket) => {
        console.log(data.toString()); // data is Buffer
        socket.send(data);
    });

js build-in websockets:

const connection = new WebSocket("ws://localhost:8080/ws");
connection.send("test");
connection.onmessage = (message) => {
    console.log(message.data);
};

Backendium connect

import {websocketRequest} from "backendium-connect";

websocketRequest()
    .on("message", (data, socket) => {
        console.log(data); // data is Buffer
    })
    .send("ws://localhost:8080/ws")
    .then(socket => {
        socket.send("test");
    });

Events

router.ws("/ws")
    .event<number>("sqrt", (data, socket) => {
        console.log(data);
        socket.emit("response", Math.sqrt(data));
    }, int());

only Backendium connect

websocketRequest()
    .event<number>("response", data => console.log(data), float())
    .send("ws://localhost:8080/ws")
    .then(socket => {
        socket.emit("sqrt", 2);
    });

Init

router.ws<string>("/ws-init")
    .event("test", (data, socket) => {
        socket.send(socket.initData);
    })
    .requireInit<number>((socket, data) => {
        if (!(data in USERS)) return null; // auth failed
        return USERS[data]; // return auth data
    }, int());
websocketRequest<number>()
    .on("message", data => {
        console.log(data.toString());
    })
    .send("ws://localhost:8080/ws-init", 54)
    .then(socket => {
        socket.emit("test");
    });
0.0.10

6 months ago

0.0.9

6 months ago

0.0.8

6 months ago

0.0.7

6 months ago

0.0.3

7 months ago

0.0.2

7 months ago

0.0.5

7 months ago

0.0.4

7 months ago

0.0.6

7 months ago

0.0.1

7 months ago

0.0.0

7 months ago