ckn.server
Version:
230 lines (220 loc) • 9.63 kB
JavaScript
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 }