@nelts/http
Version:
http for nelts worker
115 lines (114 loc) • 4.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const http = require("http");
const Router = require("find-my-way");
const context_1 = require("./context");
exports.Context = context_1.default;
const utils_1 = require("@nelts/utils");
const scope_1 = require("./scope");
exports.Scope = scope_1.default;
const controller_1 = require("./components/controller");
exports.Controller = controller_1.default;
const controller_2 = require("./compilers/controller");
const middleware_1 = require("./decorators/middleware");
exports.Interceptor = middleware_1.default;
const response_1 = require("./decorators/response");
exports.Response = response_1.default;
const prefix_1 = require("./decorators/router/prefix");
exports.Prefix = prefix_1.default;
const path_1 = require("./decorators/router/path");
exports.Path = path_1.default;
const method_1 = require("./decorators/router/method");
exports.Method = method_1.default;
const get_1 = require("./decorators/router/get");
exports.Get = get_1.default;
const post_1 = require("./decorators/router/post");
exports.Post = post_1.default;
const put_1 = require("./decorators/router/put");
exports.Put = put_1.default;
const delete_1 = require("./decorators/router/delete");
exports.Delete = delete_1.default;
const head_1 = require("./decorators/router/head");
exports.Head = head_1.default;
class Http {
constructor(app) {
this._middlewares = [];
this._app = app;
this.router = Router({
ignoreTrailingSlash: true,
defaultRoute(req, res) {
res.statusCode = 404;
res.end();
}
});
if (this.app.socket) {
process.on('message', (message, socket) => {
switch (message) {
case this.app.sticky:
this.resumeConnection(socket);
break;
}
});
}
}
get app() {
return this._app;
}
use(...args) {
this._middlewares.push(...args);
return this;
}
resumeConnection(socket) {
if (!this.server)
return socket.destroy();
this.server.emit('connection', socket);
socket.resume();
}
async componentWillCreate() {
this.app.compiler.addCompiler(controller_2.default);
this.server = http.createServer((req, res) => {
const ctx = new context_1.default(this._app, req, res, {
cookie: this.app.configs.cookie,
logger: this.app.logger,
});
let _composeCallbacks = this._middlewares.slice(0);
const result = this.router.lookup(ctx.req, ctx.res, ctx);
if (res.headersSent)
return;
if (Array.isArray(result) && result.length)
_composeCallbacks = _composeCallbacks.concat(result);
ctx.app.sync('ContextStart', ctx).then(() => utils_1.Compose(_composeCallbacks)(ctx)).catch((e) => {
if (ctx.listenerCount('ContextError'))
return ctx.sync('ContextError', e);
if (res.headersSent)
return ctx.rollback(e);
ctx.status = (e && e.status) || 500;
ctx.body = e.message;
return ctx.rollback(e);
}).then(() => ctx.commit()).then(() => ctx.app.sync('ContextStop', ctx)).catch((e) => {
if (res.headersSent)
return;
ctx.status = (e && e.status) || 500;
ctx.body = e.message;
}).then(() => ctx.responseBody());
});
}
async componentDidCreated() {
await new Promise((resolve, reject) => {
this.server.listen(this.app.port, (err) => {
if (err)
return reject(err);
resolve();
});
});
await this.app.sync('ServerStarted');
}
async componentWillDestroy() {
await this.app.sync('ServerStopping');
}
async componentDidDestroyed() {
this.server.close();
await this.app.sync('ServerStopped');
}
}
exports.default = Http;