UNPKG

ckn.backend

Version:

CKN Framework for Backend

133 lines (121 loc) 4.23 kB
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}