UNPKG

sdk-node-apis-efi

Version:

Module for integration with Efi Bank API

105 lines (104 loc) 4.06 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SDK_IDENTIFIER = void 0; exports.buildHttpsAgent = buildHttpsAgent; exports.httpRequest = httpRequest; const axios_1 = __importDefault(require("axios")); const node_fs_1 = __importDefault(require("node:fs")); const node_https_1 = __importDefault(require("node:https")); const version_js_1 = require("./version.js"); exports.SDK_IDENTIFIER = `efi-node-${version_js_1.PACKAGE_VERSION}`; function buildHttpsAgent(options) { if (!options.certificate) return undefined; try { if (options.cert_base64) { if (options.pemKey) { return new node_https_1.default.Agent({ cert: Buffer.from(options.certificate, 'base64'), key: Buffer.from(options.pemKey, 'base64'), passphrase: '', }); } return new node_https_1.default.Agent({ pfx: Buffer.from(options.certificate, 'base64'), passphrase: '', }); } if (options.pemKey) { return new node_https_1.default.Agent({ cert: node_fs_1.default.readFileSync(options.certificate), key: node_fs_1.default.readFileSync(options.pemKey), passphrase: '', }); } return new node_https_1.default.Agent({ pfx: node_fs_1.default.readFileSync(options.certificate), passphrase: '', }); } catch (error) { throw new Error('Erro ao ler o certificado ou chave: ' + error.message); } } function resolveRoute(route, params = {}) { const queryParams = { ...params }; const resolvedRoute = route.replace(/:([a-zA-Z0-9_]+)/g, (_, key) => { const value = queryParams[key]; if (value === undefined || value === null) { throw new Error(`Parametro de rota ausente: ${key}`); } delete queryParams[key]; return encodeURIComponent(String(value)); }); return { route: resolvedRoute, queryParams }; } function hasQueryParams(params) { return Object.keys(params).some((key) => params[key] !== undefined); } function normalizeError(error) { let errorData = error.response?.data ?? error; const errorUrl = error.request?.res?.responseUrl || ''; if (errorUrl.includes('/v2/gn/pix/comprovantes')) { try { const decoder = new TextDecoder('utf-8'); const errorText = decoder.decode(errorData); errorData = JSON.parse(errorText); } catch { errorData = error.response?.data ?? error; } } return errorData; } async function httpRequest(options) { const { baseUrl, endpoint, body, params = {}, headers = {}, partner_token, skipMtlsChecking, authorization, idempotencyKey, } = options; const { route, queryParams } = resolveRoute(endpoint.route, params); const agent = buildHttpsAgent(options); const defaultHeaders = { 'api-sdk': exports.SDK_IDENTIFIER, ...(authorization ? { Authorization: authorization } : {}), ...(skipMtlsChecking ? { 'x-skip-mtls-checking': 'true' } : {}), ...(partner_token ? { 'partner-token': partner_token } : {}), ...(idempotencyKey ? { 'x-idempotency-key': idempotencyKey } : {}), }; const config = { url: baseUrl + route, method: endpoint.method.toLowerCase(), data: body, headers: { ...defaultHeaders, ...headers }, ...(endpoint.responseType ? { responseType: endpoint.responseType } : {}), ...(hasQueryParams(queryParams) ? { params: queryParams } : {}), ...(agent ? { httpsAgent: agent } : {}), }; try { const response = await (0, axios_1.default)(config); return response.data; } catch (error) { throw normalizeError(error); } }