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
JavaScript
"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