UNPKG

@piggly/fastify-chassis

Version:

An ESM/CommonJS toolkit to help you to do common operations in your back-end applications with Fastify and NodeJS.

211 lines 6.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.evaluateHeaders = exports.getHeaderValues = exports.getHeaderValue = exports.getBasicToken = exports.getBearerToken = exports.getIp = exports.getOrigin = exports.getQuery = exports.getQueries = exports.getParam = exports.getBody = exports.replyError = void 0; const ddd_toolkit_1 = require("@piggly/ddd-toolkit"); /** * Return a response with error. * * @param {FastifyReply} reply * @param {Result<never, DomainError>} result * @param {{ debug: boolean }} env * @returns {FastifyReply} * @since 5.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const replyError = (reply, result, env = { debug: false }) => { if (env.debug === true) { return reply.status(result.error.status).send(result.error.toObject()); } if (result.error instanceof ddd_toolkit_1.BusinessRuleViolationError || result.error.is('BusinessRuleViolationError') === true) { return reply.status(result.error.status).send(result.error.toJSON()); } return reply .status(result.error.status) .send(result.error.toJSON(['extra'])); }; exports.replyError = replyError; /** * Get request body. * * @param {FastifyRequest} request * @returns {string} * @since 5.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getBody = (request) => request.body; exports.getBody = getBody; /** * Get a request param. * * @param {FastifyRequest} request * @param {string} key * @returns {string} * @since 5.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getParam = (request, key) => request.params[key]; exports.getParam = getParam; /** * Get all queries from request. * * @param {FastifyRequest} request * @returns {string} * @since 5.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getQueries = (request) => request.query; exports.getQueries = getQueries; /** * Get a query parameter from request. * * @param {FastifyRequest} request * @param {string} key * @param {TOrUndefined<T>} defaultValue * @returns {string} * @since 5.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getQuery = (request, key, defaultValue) => request.query[key] ?? defaultValue; exports.getQuery = getQuery; /** * Try to get origin from request headers. * * @param {FastifyRequest} request * @param {Array<string>} [headers] Headers to check in order. By default: 'x-forwarded-host', 'host' * @returns {string} * @since 1.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getOrigin = (request, headers) => { const h = headers ?? ['x-forwarded-host', 'host']; for (let i = 0; i < h.length; i += 1) { const header = request.headers[h[i]]; if (header !== null && header !== undefined && header.length !== 0) { return (0, ddd_toolkit_1.lastAvailableString)(header, request.hostname ?? 'localhost'); } } return request.hostname ?? 'localhost'; }; exports.getOrigin = getOrigin; /** * Try to get IP from request headers. * * @param {FastifyRequest} request * @param {Array<string>} [headers] Headers to check in order. By default: 'cf-connecting-ip', 'x-real-ip', 'x-forwarded-for' * @returns {string} * @since 1.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getIp = (request, headers) => { const h = headers ?? ['cf-connecting-ip', 'x-real-ip', 'x-forwarded-for']; for (let i = 0; i < h.length; i += 1) { const header = request.headers[h[i]]; if (header !== null && header !== undefined && header.length !== 0) { return (0, ddd_toolkit_1.lastAvailableString)(header, request.ip ?? '127.0.0.1'); } } return request.ip ?? '127.0.0.1'; }; exports.getIp = getIp; /** * Get bearer token from headers. * * @param {IncomingHttpHeaders} headers * @returns {string} * @since 1.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getBearerToken = (headers) => { const header = /Bearer (.*)/gi.exec(headers.authorization || ''); if (!header || !header[1]) { return undefined; } return header[1]; }; exports.getBearerToken = getBearerToken; /** * Get basic token from headers. * * @param {IncomingHttpHeaders} headers * @returns {string} * @since 4.0.0 * @author Caique Araujo <caique@piggly.com.br> */ const getBasicToken = (headers) => { const header = /Basic (.*)/gi.exec(headers.authorization || ''); if (!header || !header[1]) { return undefined; } const [username, password] = Buffer.from(header[1], 'base64') .toString('utf-8') .split(':'); return { password, username, }; }; exports.getBasicToken = getBasicToken; /** * Get a header from request. If not found, return a default value or an empty string. * * @param {FastifyRequest} request * @param {string} header * @param {string} [default_value] * @returns {string} * @since 5.4.0 * @author Caique Araujo <caique@piggly.com.br> */ const getHeaderValue = (request, header, default_value) => { const found = request.headers[header.toLowerCase()]; if (found !== null && found !== undefined && found.length !== 0) { return (0, ddd_toolkit_1.lastAvailableString)(found, default_value ?? ''); } return default_value ?? ''; }; exports.getHeaderValue = getHeaderValue; /** * Get all values for a header from request. If not found, return a default value or an empty array. * * @param {FastifyRequest} request * @param {string} header * @param {Array<string>} [default_value] * @returns {Array<string>} * @since 5.4.0 * @author Caique Araujo <caique@piggly.com.br> */ const getHeaderValues = (request, header, default_value) => { const found = request.headers[header.toLowerCase()]; if (found !== null && found !== undefined && found.length !== 0) { if (Array.isArray(found)) { return found; } return found.split(',').map(value => value.trim()); } return default_value ?? []; }; exports.getHeaderValues = getHeaderValues; /** * Evaluate if the request headers match the expected headers. * Will return an array with the headers that do not match the expected headers. * * @param {FastifyRequest} request * @param {Record<string, string>} expected_headers * @returns {Array<string>} * @since 5.4.0 * @author Caique Araujo <caique@piggly.com.br> */ const evaluateHeaders = (request, expected_headers) => { const headers = Object.keys(expected_headers); for (let i = 0; i < headers.length; i += 1) { const header = headers[i]; const values = (0, exports.getHeaderValues)(request, header); if (values.length !== 0 && values.some(value => value !== expected_headers[header])) { return [header]; } } return []; }; exports.evaluateHeaders = evaluateHeaders; //# sourceMappingURL=request.js.map