ckn.backend
Version:
CKN Framework for Backend
133 lines (121 loc) • 4.23 kB
JavaScript
import {Log} from "ckn.core";
import express from "express";
import fileUpload from "express-fileupload";
import bodyParser from "body-parser";
import {Session} from "./Session.js";
class Backend {
constructor() {
this.rootPhysicalPath = process.cwd();
this.log = new Log("CKN", "BACKEND");
this.port = 5900;
this.server = express();
this.server.disable('x-powered-by');
this.server.use(fileUpload());
this.server.use(bodyParser.json({limit: '100mb'}));
this.server.use(bodyParser.urlencoded({limit: '50mb', extended: false}));
this.server.set('view engine', 'ejs');
this.modules = [];
this.themes = [];
}
async start() {
this.log.info("Server has been starting.");
this.middlewares = this.middlewares.sort((a, b) => a.priority - b.priority);
await this.#executeMiddlewareOnStartingServerState(() => {
let result = new Promise(resolve => {
try {
this.server.listen(this.port, () => {
this.log.info("Server has been listened on port = " + this.port);
resolve();
});
} catch (err) {
this.log.error(err);
}
});
result.then(() => {
this.log.info("Server is started.");
});
});
}
async get(url, handler) {
url = url.replaceAll("\\","/");
this.server.get(url, async (req, res) => {
this.log.info("GET:", url);
let session = new Session(req, res);
session.backend = this;
await this.#executeMiddlewareOnInitialSession(session, () => {
handler(session);
});
});
}
async post(url, handler) {
url = url.replaceAll("\\","/");
this.server.post(url, async (req, res) => {
this.log.info("POST:", url);
let session = new Session(req, res);
await this.#executeMiddlewareOnInitialSession(session, () => {
handler(session);
});
});
}
async put(url, handler) {
url = url.replaceAll("\\","/");
this.server.put(url, async (req, res) => {
this.log.info("PUT:", url);
let session = new Session(req, res);
await this.#executeMiddlewareOnInitialSession(session, () => {
handler(session);
});
});
}
async patch(url, handler) {
url = url.replaceAll("\\","/");
this.server.patch(url, async (req, res) => {
this.log.info("PATCH:", url);
let session = new Session(req, res);
await this.#executeMiddlewareOnInitialSession(session, () => {
handler(session);
});
});
}
async delete(url, handler) {
this.server.delete(url, async (req, res) => {
url = url.replaceAll("\\","/");
this.log.info("DELETE:", url);
let session = new Session(req, res);
await this.#executeMiddlewareOnInitialSession(session, () => {
handler(session);
});
});
}
middlewares = [];
use(middleware) {
if (this.middlewares.where(s => s.constructor.name === middleware.constructor.name).length == 0) {
this.middlewares.push(middleware);
}
}
async #executeMiddlewareOnStartingServerState(next) {
let run = () => {
if (run.index == this.middlewares.length) {
next();
} else {
run.index++;
this.middlewares[run.index - 1].onStartingServer(this, run);
}
}
run.index = 0;
run();
}
async #executeMiddlewareOnInitialSession(session, next) {
let run = () => {
if (run.index == this.middlewares.length) {
next();
} else {
run.index++;
this.middlewares[run.index - 1].onInitialSession(this, session, run);
}
}
run.index = 0;
run();
}
}
export {Backend}