@tamtamchik/exchanger
Version:
Simple and free npm library to get realtime currency exchange rates.
124 lines (120 loc) • 4.23 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
DataError: () => DataError,
NetworkError: () => NetworkError,
ServerError: () => ServerError,
getExchangeRate: () => getExchangeRate
});
module.exports = __toCommonJS(src_exports);
// src/errors.ts
var ApplicationError = class extends Error {
constructor(errorType, errorMessage) {
super(errorMessage);
this.name = errorType;
this.captureStackTrace();
}
captureStackTrace() {
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
}
};
var NetworkError = class extends ApplicationError {
constructor(message) {
super("NetworkError", message);
}
};
var ServerError = class extends ApplicationError {
constructor(message) {
super("ServerError", message);
}
};
var DataError = class extends ApplicationError {
constructor(message) {
super("DataError", message);
}
};
// src/index.ts
var YAHOO_FINANCE_BASE_URL = "https://query1.finance.yahoo.com/v8/finance/chart/";
var YAHOO_FINANCE_QUERY_PARAMS = "=X?region=US&lang=en-US&includePrePost=false&interval=2m&useYfid=true&range=1d&corsDomain=finance.yahoo.com&.tsrc=finance";
var rateCache = /* @__PURE__ */ new Map();
function buildRateUrl(fromCurrency, toCurrency) {
return `${YAHOO_FINANCE_BASE_URL}${fromCurrency.toUpperCase()}${toCurrency.toUpperCase()}${YAHOO_FINANCE_QUERY_PARAMS}`;
}
function isCacheValid(cachedRate, cacheDurationMs) {
return Date.now() - cachedRate.timestamp < cacheDurationMs;
}
function getCachedRate(fromCurrency, toCurrency, cacheDurationMs) {
if (!cacheDurationMs) return null;
const cacheKey = `${fromCurrency}-${toCurrency}`;
const cachedRate = rateCache.get(cacheKey);
return cachedRate && isCacheValid(cachedRate, cacheDurationMs) ? cachedRate.value : null;
}
async function fetchExchangeRateResponse(rateUrl) {
const response = await fetch(rateUrl);
if (!response.ok) {
throw new ServerError(`HTTP ${response.status}: ${response.statusText}`);
}
return response;
}
function extractRateFromResponse(response) {
const rate = response.chart?.result[0]?.meta?.regularMarketPrice;
if (typeof rate !== "number" || isNaN(rate)) {
throw new DataError('Invalid or missing "regularMarketPrice" in response.');
}
return rate;
}
async function fetchExchangeRate(rateUrl) {
try {
const response = await fetchExchangeRateResponse(rateUrl);
const responseData = await response.json();
return extractRateFromResponse(responseData);
} catch (error) {
if (error instanceof ServerError || error instanceof DataError) {
throw error;
}
throw new NetworkError(
`Failed to fetch exchange rate: ${error instanceof Error ? error.message : String(error)}`
);
}
}
async function getExchangeRate(fromCurrency, toCurrency, options = {}) {
const { cacheDurationMs } = options;
const cachedRate = getCachedRate(fromCurrency, toCurrency, cacheDurationMs);
if (cachedRate !== null) {
return cachedRate;
}
const rateUrl = buildRateUrl(fromCurrency, toCurrency);
const rate = await fetchExchangeRate(rateUrl);
if (cacheDurationMs) {
const cacheKey = `${fromCurrency}-${toCurrency}`;
rateCache.set(cacheKey, { value: rate, timestamp: Date.now() });
}
return rate;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
DataError,
NetworkError,
ServerError,
getExchangeRate
});
;