@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
JavaScript
;
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