mnb-exchange-rate
Version:
TypeScript client for Hungarian National Bank (MNB) exchange rate API
108 lines • 15.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Client = exports.getClient = exports.WSDL_URL = void 0;
const soap_1 = require("soap");
const fast_xml_parser_1 = require("fast-xml-parser");
const util_1 = require("./util");
exports.WSDL_URL = 'https://www.mnb.hu/arfolyamok.asmx?wsdl';
let _client = null;
async function getClient() {
if (!_client) {
const soapClient = await (0, soap_1.createClientAsync)(exports.WSDL_URL);
_client = new Client(soapClient);
}
return _client;
}
exports.getClient = getClient;
class Client {
constructor(soap) {
this.soap = soap;
}
async fetch(name, root, input = {}) {
const [res] = await this.soap[`${name}Async`](input);
const parser = new fast_xml_parser_1.XMLParser({
ignoreAttributes: false,
attributeNamePrefix: '@',
isArray: (_tagName, _jPath, _isLeafNode, isAttribute) => !isAttribute,
});
const xml = parser.parse(res[`${name}Result`]);
return xml[root];
}
async GetInfo(input = {}) {
const [raw] = await this.fetch('GetInfo', 'MNBExchangeRatesQueryValues', input);
return {
FirstDate: raw?.FirstDate[0],
LastDate: raw?.LastDate[0],
Currencies: raw?.Currencies[0]?.Curr ?? [],
};
}
async GetCurrencies(input = {}) {
const raw = await this.fetch('GetCurrencies', 'MNBCurrencies', input);
return {
Currencies: raw?.[0]?.Currencies?.[0]?.Curr ?? [],
};
}
async GetCurrencyUnits(input = { currencies: [] }) {
const raw = await this.fetch('GetCurrencyUnits', 'MNBCurrencyUnits', {
currencyNames: input.currencies.join(','),
});
const entries = raw?.[0]?.Units?.[0]?.Unit?.map((e) => [
e['@curr'],
(0, util_1.parseCommaFloat)(e['#text']),
]);
return Object.fromEntries(entries);
}
async GetDateInterval(input = {}) {
const raw = await this.fetch('GetDateInterval', 'MNBStoredInterval', input);
const el = raw?.[0]?.DateInterval?.[0];
if (!el) {
throw new Error('Invalid response');
}
return {
FirstDate: el['@startdate'],
LastDate: el['@enddate'],
};
}
async GetCurrentExchangeRates(input = {}) {
const raw = await this.fetch('GetCurrentExchangeRates', 'MNBCurrentExchangeRates', input);
const el = raw?.[0]?.Day?.[0];
if (!el) {
throw new Error('Invalid response');
}
return Object.fromEntries(el.Rate?.map((e) => [
e['@curr'],
(0, util_1.parseCommaFloat)(e['#text']) / (0, util_1.parseCommaFloat)(e['@unit']),
]));
}
async GetExchangeRates(input) {
if (input.startDate === input.endDate) {
throw new Error('Invalid logic: startDate and doneDate cannot be the same');
}
const raw = await this.fetch('GetExchangeRates', 'MNBExchangeRates', {
startDate: input.startDate,
endDate: input.endDate,
currencyNames: input.currencies.join(','),
});
const r = {};
if (raw) {
raw.forEach((n) => {
if (!n.Day) {
return;
}
n.Day.forEach((dn) => {
r[dn['@date']] = {};
if (!dn.Rate) {
return;
}
dn.Rate.forEach((rn) => {
r[dn['@date']][rn['@curr']] =
(0, util_1.parseCommaFloat)(rn['#text']) / (0, util_1.parseCommaFloat)(rn['@unit']);
});
});
});
}
return r;
}
}
exports.Client = Client;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBNkQ7QUFDN0QscURBQTBDO0FBTTFDLGlDQUF1QztBQVUxQixRQUFBLFFBQVEsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxJQUFJLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0FBRTNCLEtBQUssVUFBVSxTQUFTO0lBQzdCLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDWixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsd0JBQWlCLEVBQUMsZ0JBQVEsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNsQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFORCw4QkFNQztBQUVELE1BQWEsTUFBTTtJQUNqQixZQUE0QixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUcsQ0FBQztJQUV0QyxLQUFLLENBQUMsS0FBSyxDQUNuQixJQUFZLEVBQ1osSUFBWSxFQUNaLFFBQWlCLEVBQUU7UUFFbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBUyxDQUFDO1lBQzNCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsbUJBQW1CLEVBQUUsR0FBRztZQUN4QixPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVztTQUN0RSxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFP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LE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUN6QixJQUFBLHNCQUFlLEVBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBQSxzQkFBZSxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNoRSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRjtBQTVIRCx3QkE0SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NsaWVudCBhcyBTb2FwQ2xpZW50LCBjcmVhdGVDbGllbnRBc3luY30gZnJvbSAnc29hcCc7XG5pbXBvcnQge1hNTFBhcnNlcn0gZnJvbSAnZmFzdC14bWwtcGFyc2VyJztcbmltcG9ydCB7R2V0SW5mb1Jlc3BvbnNlfSBmcm9tICcuL3Jlc3BvbnNlL2luZm8nO1xuaW1wb3J0IHtHZXRJbmZvUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2luZm8nO1xuaW1wb3J0IHtHZXRDdXJyZW5jaWVzUmVxdWVzdH0gZnJvbSAnLi9yZXF1ZXN0L2N1cnJlbmNpZXMnO1xuaW1wb3J0IHtHZXRDdXJyZW5jaWVzUmVzcG9uc2V9IGZyb20gJy4vcmVzcG9uc2UvY3VycmVuY2llcyc7XG5pbXBvcnQge1JlcXVlc3R9IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQge3BhcnNlQ29tbWFGbG9hdH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7R2V0Q3VycmVuY3lVbml0c1JlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9jdXJyZW5jeV91bml0cyc7XG5pbXBvcnQge0dldEN1cnJlbmN5VW5pdHNSZXNwb25zZX0gZnJvbSAnLi9yZXNwb25zZS9jdXJyZW5jeV91bml0cyc7XG5pbXBvcnQge0dldERhdGVJbnRlcnZhbFJlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9kYXRlX2ludGVydmFsJztcbmltcG9ydCB7R2V0RGF0ZUludGVydmFsUmVzcG9uc2V9IGZyb20gJy4vcmVzcG9uc2UvZGF0ZV9pbnRlcnZhbCc7XG5pbXBvcnQge0dldEV4Y2hhbmdlUmF0ZXNSZXF1ZXN0fSBmcm9tICcuL3JlcXVlc3QvZXhjaGFuZ2VfcmF0ZXMnO1xuaW1wb3J0IHtHZXRFeGNoYW5nZVJhdGVzUmVzcG9uc2V9IGZyb20gJy4vcmVzcG9uc2UvZXhjaGFuZ2VfcmF0ZXMnO1xuaW1wb3J0IHtHZXRDdXJyZW50RXhjaGFuZ2VSYXRlc1JlcXVlc3R9IGZyb20gJy4vcmVxdWVzdC9jdXJyZW50X2V4Y2hhbmdlX3JhdGVzJztcbmltcG9ydCB7R2V0Q3VycmVudEV4Y2hhbmdlUmF0ZXNSZXNwb25zZX0gZnJvbSAnLi9yZXNwb25zZS9jdXJyZW50X2V4Y2hhbmdlX3JhdGVzJztcblxuZXhwb3J0IGNvbnN0IFdTRExfVVJMID0gJ2h0dHBzOi8vd3d3Lm1uYi5odS9hcmZvbHlhbW9rLmFzbXg/d3NkbCc7XG5cbmxldCBfY2xpZW50OiBDbGllbnQgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENsaWVudCgpOiBQcm9taXNlPENsaWVudD4ge1xuICBpZiAoIV9jbGllbnQpIHtcbiAgICBjb25zdCBzb2FwQ2xpZW50ID0gYXdhaXQgY3JlYXRlQ2xpZW50QXN5bmMoV1NETF9VUkwpO1xuICAgIF9jbGllbnQgPSBuZXcgQ2xpZW50KHNvYXBDbGllbnQpO1xuICB9XG4gIHJldHVybiBfY2xpZW50O1xufVxuXG5leHBvcnQgY2xhc3MgQ2xpZW50IHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHNvYXA6IFNvYXBDbGllbnQpIHt9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGZldGNoPFQ+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByb290OiBzdHJpbmcsXG4gICAgaW5wdXQ6IFJlcXVlc3QgPSB7fVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0IHRoaXMuc29hcFtgJHtuYW1lfUFzeW5jYF0oaW5wdXQpO1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoe1xuICAgICAgaWdub3JlQXR0cmlidXRlczogZmFsc2UsXG4gICAgICBhdHRyaWJ1dGVOYW1lUHJlZml4OiAnQCcsXG4gICAgICBpc0FycmF5OiAoX3RhZ05hbWUsIF9qUGF0aCwgX2lzTGVhZk5vZGUsIGlzQXR0cmlidXRlKSA9PiAhaXNBdHRyaWJ1dGUsXG4gICAgfSk7XG4gICAgY29uc3QgeG1sID0gcGFyc2VyLnBhcnNlKHJlc1tgJHtuYW1lfVJlc3VsdGBdKTtcbiAgICByZXR1cm4geG1sW3Jvb3RdIGFzIFQ7XG4gIH1cblxuICBhc3luYyBHZXRJbmZvKGlucHV0OiBHZXRJbmZvUmVxdWVzdCA9IHt9KTogUHJvbWlzZTxHZXRJbmZvUmVzcG9uc2U+IHtcbiAgICBjb25zdCBbcmF3XSA9IGF3YWl0IHRoaXMuZmV0Y2g8YW55PihcbiAgICAgICdHZXRJbmZvJyxcbiAgICAgICdNTkJFeGNoYW5nZVJhdGVzUXVlcnlWYWx1ZXMnLFxuICAgICAgaW5wdXRcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBGaXJzdERhdGU6IHJhdz8uRmlyc3REYXRlWzBdLFxuICAgICAgTGFzdERhdGU6IHJhdz8uTGFzdERhdGVbMF0sXG4gICAgICBDdXJyZW5jaWVzOiByYXc/LkN1cnJlbmNpZXNbMF0/LkN1cnIgPz8gW10sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIEdldEN1cnJlbmNpZXMoXG4gICAgaW5wdXQ6IEdldEN1cnJlbmNpZXNSZXF1ZXN0ID0ge31cbiAgKTogUHJvbWlzZTxHZXRDdXJyZW5jaWVzUmVzcG9uc2U+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmZldGNoPGFueT4oJ0dldEN1cnJlbmNpZXMnLCAnTU5CQ3VycmVuY2llcycsIGlucHV0KTtcbiAgICByZXR1cm4ge1xuICAgICAgQ3VycmVuY2llczogcmF3Py5bMF0/LkN1cnJlbmNpZXM/LlswXT8uQ3VyciA/PyBbXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgR2V0Q3VycmVuY3lVbml0cyhcbiAgICBpbnB1dDogR2V0Q3VycmVuY3lVbml0c1JlcXVlc3QgPSB7Y3VycmVuY2llczogW119XG4gICk6IFByb21pc2U8R2V0Q3VycmVuY3lVbml0c1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5mZXRjaDxhbnk+KCdHZXRDdXJyZW5jeVVuaXRzJywgJ01OQkN1cnJlbmN5VW5pdHMnLCB7XG4gICAgICBjdXJyZW5jeU5hbWVzOiBpbnB1dC5jdXJyZW5jaWVzLmpvaW4oJywnKSxcbiAgICB9KTtcbiAgICBjb25zdCBlbnRyaWVzID0gcmF3Py5bMF0/LlVuaXRzPy5bMF0/LlVuaXQ/Lm1hcCgoZTogYW55KSA9PiBbXG4gICAgICBlWydAY3VyciddLFxuICAgICAgcGFyc2VDb21tYUZsb2F0KGVbJyN0ZXh0J10pLFxuICAgIF0pO1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG4gIH1cblxuICBhc3luYyBHZXREYXRlSW50ZXJ2YWwoXG4gICAgaW5wdXQ6IEdldERhdGVJbnRlcnZhbFJlcXVlc3QgPSB7fVxuICApOiBQcm9taXNlPEdldERhdGVJbnRlcnZhbFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5mZXRjaDxhbnk+KFxuICAgICAgJ0dldERhdGVJbnRlcnZhbCcsXG4gICAgICAnTU5CU3RvcmVkSW50ZXJ2YWwnLFxuICAgICAgaW5wdXRcbiAgICApO1xuICAgIGNvbnN0IGVsID0gcmF3Py5bMF0/LkRhdGVJbnRlcnZhbD8uWzBdO1xuICAgIGlmICghZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXNwb25zZScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgRmlyc3REYXRlOiBlbFsnQHN0YXJ0ZGF0ZSddLFxuICAgICAgTGFzdERhdGU6IGVsWydAZW5kZGF0ZSddLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBHZXRDdXJyZW50RXhjaGFuZ2VSYXRlcyhcbiAgICBpbnB1dDogR2V0Q3VycmVudEV4Y2hhbmdlUmF0ZXNSZXF1ZXN0ID0ge31cbiAgKTogUHJvbWlzZTxHZXRDdXJyZW50RXhjaGFuZ2VSYXRlc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5mZXRjaDxhbnk+KFxuICAgICAgJ0dldEN1cnJlbnRFeGNoYW5nZVJhdGVzJyxcbiAgICAgICdNTkJDdXJyZW50RXhjaGFuZ2VSYXRlcycsXG4gICAgICBpbnB1dFxuICAgICk7XG4gICAgY29uc3QgZWwgPSByYXc/LlswXT8uRGF5Py5bMF07XG4gICAgaWYgKCFlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBlbC5SYXRlPy5tYXAoKGU6IGFueSkgPT4gW1xuICAgICAgICBlWydAY3VyciddLFxuICAgICAgICBwYXJzZUNvbW1hRmxvYXQoZVsnI3RleHQnXSkgLyBwYXJzZUNvbW1hRmxvYXQoZVsnQHVuaXQnXSksXG4gICAgICBdKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBHZXRFeGNoYW5nZVJhdGVzKFxuICAgIGlucHV0OiBHZXRFeGNoYW5nZVJhdGVzUmVxdWVzdFxuICApOiBQcm9taXNlPEdldEV4Y2hhbmdlUmF0ZXNSZXNwb25zZT4ge1xuICAgIGlmIChpbnB1dC5zdGFydERhdGUgPT09IGlucHV0LmVuZERhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgbG9naWM6IHN0YXJ0RGF0ZSBhbmQgZG9uZURhdGUgY2Fubm90IGJlIHRoZSBzYW1lJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5mZXRjaDxhbnk+KCdHZXRFeGNoYW5nZVJhdGVzJywgJ01OQkV4Y2hhbmdlUmF0ZXMnLCB7XG4gICAgICBzdGFydERhdGU6IGlucHV0LnN0YXJ0RGF0ZSxcbiAgICAgIGVuZERhdGU6IGlucHV0LmVuZERhdGUsXG4gICAgICBjdXJyZW5jeU5hbWVzOiBpbnB1dC5jdXJyZW5jaWVzLmpvaW4oJywnKSxcbiAgICB9KTtcbiAgICBjb25zdCByOiBHZXRFeGNoYW5nZVJhdGVzUmVzcG9uc2UgPSB7fTtcbiAgICBpZiAocmF3KSB7XG4gICAgICByYXcuZm9yRWFjaCgobjogYW55KSA9PiB7XG4gICAgICAgIGlmICghbi5EYXkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbi5EYXkuZm9yRWFjaCgoZG46IGFueSkgPT4ge1xuICAgICAgICAgIHJbZG5bJ0BkYXRlJ11dID0ge307XG4gICAgICAgICAgaWYgKCFkbi5SYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRuLlJhdGUuZm9yRWFjaCgocm46IGFueSkgPT4ge1xuICAgICAgICAgICAgcltkblsnQGRhdGUnXV1bcm5bJ0BjdXJyJ11dID1cbiAgICAgICAgICAgICAgcGFyc2VDb21tYUZsb2F0KHJuWycjdGV4dCddKSAvIHBhcnNlQ29tbWFGbG9hdChyblsnQHVuaXQnXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG59XG4iXX0=