UNPKG

ckn.server

Version:

230 lines (220 loc) 9.63 kB
import express from "express"; import bodyParser from 'body-parser'; import * as cors from 'cors'; import { ckn } from "ckn"; import { CKNFile } from "ckn.file"; import { CKNModel } from "./ckn.server.model.js"; import { CKNController } from "./ckn.server.controller.js"; import { CKNApplication } from "./ckn.server.application.js"; import { CKNSession } from "./ckn.server.session.js"; import { CKNConfiguration } from "./ckn.server.configuration.js"; import { CKNTheme } from "./ckn.server.theme.js"; import { CKNView } from "./ckn.server.view.js"; import { CKNTest } from './ckn.server.test.js'; import fileUpload from 'express-fileupload'; /* import multer from 'multer'; const upload = multer({ dest: 'uploads/' }); const multerMid = multer({ storage: multer.memoryStorage(), limits: { fileSize: 10 * 1024 * 1024, }, }); */ class CKNServer { constructor(configuration = new CKNConfiguration()) { this.pathPrefix = process.env.MODE == "packagedev" ? "./" : '../../'; this.server = express(); this.configuration = configuration; this.server.disable('x-powered-by') // this.server.use(multerMid.single('file1')) this.server.use(fileUpload()); this.server.use(bodyParser.json({limit: '100mb'})) this.server.use(bodyParser.urlencoded({limit: '50mb', extended: false})) this.onBeforeProcess = null; this.middlewares = []; this.tester = null; } async setOnBeforeProcess(handler) { this.onBeforeProcess = handler; } use = async (mw) => { this.middlewares.push(mw); } get = async (url, handler = (session) => {}, _cors = null) => { if (_cors == null) { this.server.get(url,(req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } else { let corsOptionsDelegate = async function (req, callback) { let corsOptions = await _cors(req, req.header('Origin')); callback(null, corsOptions) }; this.server.get(url, cors.default(corsOptionsDelegate) ,(req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } } post = async (url, handler = (session) => {}, _cors = null, files = null) => { if (_cors == null) { this.server.post(url, async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } else { let corsOptionsDelegate = async function (req, callback) { let corsOptions = await _cors(req, req.header('Origin')); callback(null, corsOptions) }; this.server.post(url, cors.default(corsOptionsDelegate) ,async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } } put = async (url, handler = (session) => {}, _cors = null, files = null) => { if (_cors == null) { this.server.put(url, async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } else { let corsOptionsDelegate = async function (req, callback) { let corsOptions = await _cors(req, req.header('Origin')); callback(null, corsOptions) }; this.server.put(url, cors.default(corsOptionsDelegate) ,async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } } patch = async (url, handler = (session) => {}, _cors = null, files = null) => { if (_cors == null) { this.server.patch(url, async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } else { let corsOptionsDelegate = async function (req, callback) { let corsOptions = await _cors(req, req.header('Origin')); callback(null, corsOptions) }; this.server.patch(url, cors.default(corsOptionsDelegate) ,async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } } delete = async (url, handler = (session) => {}, _cors = null, files = null) => { if (_cors == null) { this.server.delete(url, async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } else { let corsOptionsDelegate = async function (req, callback) { let corsOptions = await _cors(req, req.header('Origin')); callback(null, corsOptions) }; this.server.delete(url, cors.default(corsOptionsDelegate) ,async (req, res) => { let session = new CKNSession(req, res); session.server = this; if (this.onBeforeProcess ? this.onBeforeProcess(session) : true) handler(session); }); } } useStaticFiles = (path = "/", publicFolder = "public") => { this.server.use(path, express.static(publicFolder)); } useApplications = async () => { this.server.set('view engine', 'ejs'); this.apps = []; this.views = []; let folders = await CKNFile.getFiles(this.configuration.appPath); let finalized = () => { this.apps.forEach(app => { this.views = this.views.concat(app.views); }); this.views = this.views.distinct(); this.server.set("views", this.views); } let n = folders.length; for (const file of folders) { let appClass = await import(this.pathPrefix + "apps/"+file.name+"/startup.js"); let app = new appClass.StartUp(file.name); await app.initial(this); this.apps.push(app); if (--n == 0) finalized(); } this.tester = new CKNTest(this); } useThemes = async () => { this.themes = []; let themes = await CKNFile.getDirectories(CKNServer.directoryPath + "/"+this.pathPrefix +"themes"); for (const theme of themes) { if (theme.name != "core") { this.views.push(CKNServer.directoryPath + "/"+this.pathPrefix +"themes/" + theme.name + "/views"); this.useStaticFiles("/" + theme.name + "/", "themes/"+theme.name+"/public"); this.themes[theme.name] = {}; let pageThemes = await CKNFile.getFiles(CKNServer.directoryPath + "/"+this.pathPrefix +"themes/" + theme.name); for (const page of pageThemes) { if (page.name.includes(".js")) { let pageClass = await import(""+this.pathPrefix +"themes/" + theme.name + "/" + page.name); let pageName = page.name.replace(".js", ""); this.themes[theme.name][pageName] = pageClass; } } } } this.views = this.views.distinct(); this.server.set("views", this.views); this.server.use("/", express.static("themes/core/node_modules")); this.server.use("/", express.static("themes/core/node_modules/ckn.ui")); } start = async () => { ckn.log.info("CKN Server is starting."); this.environment = ckn.CKN_ENVIRONMENT_PRODUCTION; process.argv.forEach(arg => { if (arg.toLocaleLowerCase() == "dev") { this.environment = ckn.CKN_ENVIRONMENT_DEVELOPMENT; } }); switch(this.environment) { case ckn.CKN_ENVIRONMENT_PRODUCTION: ckn.log.info("Environment is Production."); break; case ckn.CKN_ENVIRONMENT_DEVELOPMENT: ckn.log.info("Environment is Developement."); break; } // Start to listen await new Promise(resolve => { this.server.listen(this.configuration.port, () => { ckn.log.info("CKN Server has been listened on port = " + this.configuration.port); resolve(); }); }); ckn.log.info("CKN Server has been started."); } } CKNServer.directoryPath = CKNFile.getDirectoryPath(import.meta.url); export { CKNServer, CKNModel, CKNController, CKNApplication, CKNConfiguration, CKNTheme, CKNView }