tspace-spear
Version:
tspace-spear is a lightweight, high-performance API framework for Node.js that leverages the native HTTP server and supports uWebSockets.js (C++) for maximum speed and efficiency.
188 lines • 6.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Response = void 0;
const const_1 = require("../const");
const utils_1 = require("../utils");
const Response = (req, res, { formatResponse, isUwebSocket }) => {
const response = res;
response.serveMedia = (filePath) => {
return (0, utils_1.pipeStream)({ req, res, filePath, isUwebSocket });
};
//@ts-ignore
response.status = (code) => {
return {
json: (data) => {
if (!res.headersSent)
res.writeHead(code, const_1.HEADER_CONTENT_TYPES['json']);
return response.json(data);
},
send: (message) => {
if (!res.headersSent)
res.writeHead(code, const_1.HEADER_CONTENT_TYPES['text']);
return response.send(message);
},
end: (message) => {
if (!res.headersSent)
res.writeHead(code, const_1.HEADER_CONTENT_TYPES['text']);
return response.end(message);
},
};
};
//@ts-ignore
response.json = (results) => {
if (res.writableEnded)
return;
if (typeof results === 'string') {
if (!res.headersSent) {
res.writeHead(200, const_1.HEADER_CONTENT_TYPES['text']);
}
return res.end(results);
}
if (!res.headersSent) {
res.writeHead(200, const_1.HEADER_CONTENT_TYPES['json']);
}
if (results == null) {
if (formatResponse != null) {
return res.end(JSON.stringify(formatResponse(null, res.statusCode)));
}
return res.end();
}
if (formatResponse != null) {
return res.end(JSON.stringify(formatResponse({
...results
}, res.statusCode)));
}
return res.end(JSON.stringify(results));
};
response.send = (results) => {
if (res.writableEnded) {
return;
}
if (formatResponse != null) {
return res.end(formatResponse(results, res.statusCode));
}
return res.end(results);
};
response.html = (results) => {
if (res.writableEnded)
return;
res.writeHead(res.statusCode, const_1.HEADER_CONTENT_TYPES['html']);
return res.end(results);
};
response.error = (err) => {
const statusCandidates = [
err?.response?.data?.code,
err?.code,
err?.status,
err?.statusCode,
err?.response?.data?.statusCode
];
let code = statusCandidates
.map(v => Number(v))
.find(v => Number.isFinite(v) && v >= 400) ?? 500;
const message = err?.response?.data?.errorMessage ??
err?.response?.data?.message ??
err?.message ??
`The request '${req.url}' resulted in a server error.`;
response.status(code);
const payload = { message };
if (formatResponse) {
return res.end(JSON.stringify(formatResponse(payload, code)));
}
return res.end(JSON.stringify(payload));
};
//@ts-ignore
response.ok = (results) => {
return response.status(200).json(results);
};
//@ts-ignore
response.created = (results) => {
return response.status(201).json(results);
};
//@ts-ignore
response.accepted = (results) => {
return response.status(202).json(results);
};
//@ts-ignore
response.noContent = () => {
return response.status(204).end();
};
//@ts-ignore
response.badRequest = (message) => {
message = message ?? `The request '${req.url}' resulted in a bad request. Please review the data and try again.`;
return response.status(400).json({ message });
};
//@ts-ignore
response.unauthorized = (message) => {
message = message ?? `The request '${req.url}' is unauthorized. Please verify.`;
return response.status(401).json({ message });
};
//@ts-ignore
response.paymentRequired = (message) => {
message = message ?? `The request '${req.url}' requires payment. Please proceed with payment.`;
return response.status(402).json({ message });
};
//@ts-ignore
response.forbidden = (message) => {
message = message ?? `The request '${req.url}' is forbidden. Please check the permissions or access rights.`;
return response.status(403).json({ message });
};
//@ts-ignore
response.notFound = (message) => {
message = message ?? `The request '${req.url}' was not found. Please re-check the your url again.`;
return response.status(404).json({ message });
};
//@ts-ignore
response.unprocessable = (message) => {
message = message ?? `The request to '${req.url}' failed validation.`;
return response.status(422).json({ message });
};
//@ts-ignore
response.tooManyRequests = (message) => {
message = message ?? `The request '${req.url}' is too many request. Please wait and try agian.`;
return response.status(429).json({ message });
};
//@ts-ignore
response.serverError = (message) => {
message = message ?? `The request '${req.url}' resulted in a server error. Please investigate.`;
return response.status(500).json({ message });
};
response.setCookies = (cookies) => {
const cookieLists = [];
for (const [key, v] of Object.entries(cookies)) {
let str = `${key}=${typeof v === 'string' ? v : v.value}`;
if (typeof v !== 'string') {
if (v.sameSite)
str += `; SameSite=${v.sameSite}`;
str += `; Path=${v.path ?? '/'}`;
if (v.domain)
str += `; Domain=${v.domain}`;
if (v.httpOnly)
str += `; HttpOnly`;
if (v.secure)
str += `; Secure`;
if (v.expires) {
const maxAge = Math.floor((v.expires.getTime() - Date.now()) / 1000);
str += `; Max-Age=${maxAge}`;
}
}
cookieLists.push(str);
}
if (isUwebSocket) {
for (const cookie of cookieLists) {
res.setHeader('Set-Cookie', cookie);
}
return;
}
res.setHeader('Set-Cookie', cookieLists);
};
response.setStatusCode = (code) => {
if (!response.headersSent) {
response.writeHead(code, const_1.HEADER_CONTENT_TYPES['json']);
}
return;
};
return response;
};
exports.Response = Response;
//# sourceMappingURL=response.js.map