webserv
Version:
a quick, flexible, fully typed development server
112 lines • 4.39 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "./HttpError", "./log", "./processors/after/notFound.processor", "./route", "./servers/createHttpServer", "./servers/createHttpsServer", "./upgrade"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const HttpError_1 = require("./HttpError");
const log_1 = require("./log");
const notFound_processor_1 = require("./processors/after/notFound.processor");
const route_1 = require("./route");
const createHttpServer_1 = require("./servers/createHttpServer");
const createHttpsServer_1 = require("./servers/createHttpsServer");
const upgrade_1 = require("./upgrade");
exports.globalErrorHandler = (e, response) => {
let statusCode = 500 /* InternalServerError */;
if (HttpError_1.isHttpError(e)) {
log_1.log.info(`HTTPError: ${e.statusCode}${e.message ? `. Reason "${e.message}"` : ''}`);
statusCode = e.statusCode;
}
else {
log_1.log.info('General error. ' + e.message);
}
if (!response.finished) {
response.statusCode = statusCode;
response.end();
}
};
class App {
constructor() {
this.globalRoute = {
before: [],
guards: [],
middleware: [],
transforms: [],
after: []
};
this.upgrades = [];
}
add(services) {
if (Array.isArray(services)) {
for (let service of services) {
this.addService(service);
}
}
else {
this.addService(services);
}
}
addService({ route, upgrade, global }) {
if (route) {
this.globalRoute.middleware.push(route_1.route(route));
}
if (upgrade) {
this.upgrades.push(upgrade_1.upgrade(upgrade));
}
if (global) {
if (global.after) {
this.globalRoute.after.push(...global.after);
}
if (global.before) {
this.globalRoute.before.push(...global.before);
}
if (global.guards) {
this.globalRoute.guards.push(...global.guards);
}
if (global.transforms) {
this.globalRoute.transforms.push(...global.transforms);
}
}
}
start(type, config) {
if (this.controls) {
throw new Error('server already started');
}
const onRequest = route_1.multiroute([
{
middleware: [this.globalRoute],
after: [notFound_processor_1.notFound],
errorHandler: exports.globalErrorHandler
}
]);
const onUpgrade = upgrade_1.multiupgrade(this.upgrades);
if (type === 'http') {
this.controls = createHttpServer_1.startHttpServer(Object.assign(Object.assign({}, config), { onRequest,
onUpgrade }));
}
else if (type === 'https') {
this.controls = createHttpsServer_1.startHttpsServer(Object.assign(Object.assign({}, config), { onRequest,
onUpgrade }));
}
else {
log_1.log.error(`Unknown server type: ${type}`);
}
if (this.controls) {
this.controls.then((controls) => {
log_1.log.info(`Server started on ${config.port}`);
controls.closed.then(() => {
log_1.log.debug('Server stopped');
});
});
}
return this.controls;
}
}
exports.App = App;
});
//# sourceMappingURL=app.js.map