UNPKG

@sambruca/xe-client

Version:

Node client for interactive with XE API

66 lines 2.34 kB
import axios from "axios"; import { InvalidCCYError, XERequestError, } from "./types"; import { isValidCCY } from "./currencyCode"; export const xeClient = (xeApiId, xeApiKey) => { const options = { auth: { username: xeApiId, password: xeApiKey, }, baseURL: "https://xecdapi.xe.com/v1/", }; const getRateForDate = async (fromCurrency, toCurrencies, currencyDate) => { if (!isValidCCY(fromCurrency)) { return Promise.reject(new InvalidCCYError(fromCurrency)); } const invalidCCYs = toCurrencies.filter((ccy) => !isValidCCY(ccy)); if (invalidCCYs.length > 0) { return Promise.reject(new InvalidCCYError(invalidCCYs.join(","))); } const path = "historic_rate"; const toParam = toCurrencies.join(","); const query = { from: fromCurrency, to: toParam, amount: 1, }; query.date = currencyDate.toISOString().split("T")[0]; try { const response = await handleXERequest(path, query); let requestsRemaining = 0; if (response.headers) { requestsRemaining = response.headers["x-raterequest-remaining"]; } const rates = response.data.to.map((t) => { return { from: response.data.from, to: t.quotecurrency, timestamp: response.data.timestamp, rate: t.mid, }; }); return { rates, requestsRemaining, }; } catch (e) { console.error(e); throw new XERequestError(query, path, e); } }; const handleXERequest = async (path, query) => { console.debug(`Performing request to XE ${path} endpoint with query params: ${JSON.stringify(query)}`); const response = await axios.get(path, { params: query, ...options, }); console.debug(`Request complete with status: ${response.status}|${response.statusText}`); console.debug(`Response data: ${JSON.stringify(response.data)}`); return response; }; return { getRateForDate, }; }; //# sourceMappingURL=client.js.map