UNPKG

zents

Version:

ZenTS is a Node.js & TypeScript MVC-Framework for building rich web applications, released as free and open-source software under the MIT License. It is designed for building web applications with modern tools and design patterns.

154 lines 5.38 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Response = void 0; const enums_1 = require("../types/enums"); const ResponseHeader_1 = require("./ResponseHeader"); const config_1 = require("../config/config"); const encodeUrl_1 = require("../utils/encodeUrl"); const escapeHtml_1 = require("../utils/escapeHtml"); const logger_1 = require("../log/logger"); const statuses_1 = __importDefault(require("statuses")); class Response { constructor(nodeRes, req, cookie) { this.nodeRes = nodeRes; this.req = req; this.cookie = cookie; this.isSend = false; this.isStatuscodeSetManual = false; this.header = new ResponseHeader_1.ResponseHeader(nodeRes); this.nodeRes.statusCode = 200; } send() { var _a, _b; if (this.isSend) { return; } this.isSend = true; if ((_b = (_a = config_1.config.web) === null || _a === void 0 ? void 0 : _a.cookie) === null || _b === void 0 ? void 0 : _b.enable) { this.setCookies(); } if (this.bodyType === enums_1.RESPONSE_BODY_TYPE.JSON) { this.sendJsonResponse(); return; } else if (this.bodyType === enums_1.RESPONSE_BODY_TYPE.BUFFER || this.bodyType === enums_1.RESPONSE_BODY_TYPE.STREAM) { this.sendBufferOrStreamResponse(); return; } this.sendDefaultResponse(); } json(data) { this._body = data; this.header.setContentType('application/json'); this.bodyType = enums_1.RESPONSE_BODY_TYPE.JSON; return this; } html(html) { this._body = html; this.header.setContentType('html'); this.bodyType = enums_1.RESPONSE_BODY_TYPE.HTML; return this; } text(text) { this._body = text; this.header.setContentType('text'); this.bodyType = enums_1.RESPONSE_BODY_TYPE.TEXT; return this; } buffer(buffer) { this._body = buffer; this.bodyType = enums_1.RESPONSE_BODY_TYPE.BUFFER; return this; } stream(stream) { this._body = stream; this.bodyType = enums_1.RESPONSE_BODY_TYPE.STREAM; return this; } redirect(url, statusCode = 302) { var _a, _b; const encodedUrl = encodeUrl_1.encodeUrl(url); if (statusCode < 300 || statusCode > 308) { logger_1.log.warn(`Failed to redirect to ${encodedUrl}. Status code has to be between 300 and 308. ${statusCode} given`); return; } const escapedUrl = escapeHtml_1.escapeHtml(url); this.header.set('Location', encodedUrl); this.setStatusCode(statusCode); if (((_a = config_1.config.web) === null || _a === void 0 ? void 0 : _a.redirectBodyType) === 'html') { this.html(`<div>${this.getStatusMessage()} - Redirecting to <a href="${escapedUrl}">${escapedUrl}</a></div>`); } else if (((_b = config_1.config.web) === null || _b === void 0 ? void 0 : _b.redirectBodyType) === 'text') { this.text(`${this.getStatusMessage()} - Redirecting to ${url}`); } return this.send(); } getStatusCode() { return this.nodeRes.statusCode; } setStatusCode(statusCode) { if (this.header.isSend() || (statusCode <= 100 && statusCode >= 999)) { return this; } this.nodeRes.statusCode = statusCode; this.isStatuscodeSetManual = true; if (this.req.httpVersionMajor < 2) { const message = this.getStatusMessageFromStatusCode(statusCode); this.setStatusMessage(message); } return this; } getStatusMessage() { if (!this.nodeRes.statusMessage.length) { return this.getStatusMessageFromStatusCode(this.getStatusCode()); } return this.nodeRes.statusMessage; } setStatusMessage(message) { if (this.header.isSend()) { return this; } this.nodeRes.statusMessage = message; return this; } setCookies() { const cookies = this.cookie.serialize(); if (cookies && cookies.length) { this.header.set('Set-Cookie', cookies); } } getStatusMessageFromStatusCode(statusCode) { let message = statuses_1.default(statusCode); if (typeof message === 'number') { message = message.toString(); } return message; } sendJsonResponse() { const body = JSON.stringify(this._body); this.setContentLengthByByteLength(body); this.nodeRes.end(body); } sendBufferOrStreamResponse() { this.nodeRes.end(this._body); } sendDefaultResponse() { if (!this._body) { return this.nodeRes.end(); } this.setContentLengthByByteLength(this._body); this.nodeRes.end(this._body); } setContentLengthByByteLength(body) { if (!this.header.isSend()) { const length = Buffer.byteLength(body); this.header.set('Content-Length', length); } } } exports.Response = Response; //# sourceMappingURL=Response.js.map