easy-currencies 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/converter.d.ts +8 -0
- package/dist/converter.js +102 -19
- package/dist/parts/chainer.d.ts +8 -0
- package/dist/parts/chainer.js +2 -1
- package/dist/parts/client.d.ts +7 -0
- package/dist/parts/client.js +78 -8
- package/dist/parts/config.d.ts +1 -1
- package/dist/parts/config.js +8 -5
- package/dist/parts/providers.d.ts +2 -1
- package/dist/parts/providers.js +78 -26
- package/dist/parts/requester.d.ts +16 -7
- package/dist/parts/requester.js +104 -33
- package/dist/parts/utils.d.ts +23 -2
- package/dist/parts/utils.js +58 -15
- package/package.json +7 -3
- package/readme.md +6 -0
package/dist/converter.d.ts
CHANGED
|
@@ -61,6 +61,14 @@ export declare class Converter {
|
|
|
61
61
|
* @memberof Converter
|
|
62
62
|
*/
|
|
63
63
|
onError: (error: unknown) => void;
|
|
64
|
+
/**
|
|
65
|
+
* Reports a provider failure without letting the report become the failure.
|
|
66
|
+
*
|
|
67
|
+
* `onError` is consumer code, and the default is `console.error`, which
|
|
68
|
+
* throws on a closed stdout: a CLI piped into `head` would abort the whole
|
|
69
|
+
* chain on EPIPE and never reach the healthy provider behind it.
|
|
70
|
+
*/
|
|
71
|
+
private report;
|
|
64
72
|
/**
|
|
65
73
|
* Creates an instance of Converter.
|
|
66
74
|
* @param {(...ProviderReference[] | undefined[] | string[])} config
|
package/dist/converter.js
CHANGED
|
@@ -34,10 +34,26 @@ exports.RATES_BASE = Symbol.for("easy-currencies.ratesBase");
|
|
|
34
34
|
* `CURRENCY_CODE`, so this can never collide with a rate.
|
|
35
35
|
*/
|
|
36
36
|
exports.RATES_BASE_KEY = "__base";
|
|
37
|
+
/**
|
|
38
|
+
* An untrusted value as something with readable properties, or undefined.
|
|
39
|
+
*
|
|
40
|
+
* Vendor bodies and caller-supplied rate tables arrive as `unknown`. Reading a
|
|
41
|
+
* property off one without narrowing first is how a malformed 200 used to
|
|
42
|
+
* become a TypeError instead of a fallback.
|
|
43
|
+
*/
|
|
44
|
+
function asRecord(value) {
|
|
45
|
+
return typeof value === "object" && value !== null
|
|
46
|
+
? value
|
|
47
|
+
: undefined;
|
|
48
|
+
}
|
|
37
49
|
/** The base a table was fetched for, or undefined for one built by hand. */
|
|
38
50
|
function baseOf(rates) {
|
|
39
51
|
var _a;
|
|
40
|
-
const
|
|
52
|
+
const record = asRecord(rates);
|
|
53
|
+
if (!record) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const marked = (_a = record[exports.RATES_BASE]) !== null && _a !== void 0 ? _a : record[exports.RATES_BASE_KEY];
|
|
41
57
|
return typeof marked === "string" ? marked : undefined;
|
|
42
58
|
}
|
|
43
59
|
/** A rejection that is not contract-shaped is a bug, not a provider failure, and must not trigger fallback. */
|
|
@@ -108,6 +124,33 @@ function requireCurrency(currency, label) {
|
|
|
108
124
|
}
|
|
109
125
|
return currency;
|
|
110
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Lower-cases A-Z only.
|
|
129
|
+
*
|
|
130
|
+
* `String.prototype.toLowerCase` folds the Kelvin sign U+212A onto "k", so a
|
|
131
|
+
* table carrying that key answered a request for "K". Currency codes are
|
|
132
|
+
* ASCII, so the fold should be too.
|
|
133
|
+
*/
|
|
134
|
+
function asciiLower(value) {
|
|
135
|
+
return value.replace(/[A-Z]/g, (c) => String.fromCharCode(c.charCodeAt(0) + 32));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A rate as a number, or NaN if the value is not one.
|
|
139
|
+
*
|
|
140
|
+
* FloatRates and AlphaVantage send rates as strings, so strings are accepted,
|
|
141
|
+
* but only in decimal. `Number()` on its own also parses `0x`, `0b` and `0o`,
|
|
142
|
+
* which turned a table carrying `"0x10"` into a rate of 16.
|
|
143
|
+
*/
|
|
144
|
+
const DECIMAL = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;
|
|
145
|
+
function asRate(raw) {
|
|
146
|
+
if (typeof raw === "number") {
|
|
147
|
+
return raw;
|
|
148
|
+
}
|
|
149
|
+
if (typeof raw === "string" && DECIMAL.test(raw.trim())) {
|
|
150
|
+
return Number(raw);
|
|
151
|
+
}
|
|
152
|
+
return NaN;
|
|
153
|
+
}
|
|
111
154
|
/**
|
|
112
155
|
* Whether a table holds at least one entry that will actually convert.
|
|
113
156
|
*
|
|
@@ -116,8 +159,7 @@ function requireCurrency(currency, label) {
|
|
|
116
159
|
*/
|
|
117
160
|
function hasUsableRate(rates) {
|
|
118
161
|
return Object.keys(rates).some((key) => {
|
|
119
|
-
const
|
|
120
|
-
const value = typeof raw === "number" || typeof raw === "string" ? Number(raw) : NaN;
|
|
162
|
+
const value = asRate(rates[key]);
|
|
121
163
|
return Number.isFinite(value) && value > 0;
|
|
122
164
|
});
|
|
123
165
|
}
|
|
@@ -129,23 +171,27 @@ function hasUsableRate(rates) {
|
|
|
129
171
|
* an unexpected shape, says nothing about the providers behind it.
|
|
130
172
|
*/
|
|
131
173
|
function readRates(provider, data, from) {
|
|
174
|
+
var _a;
|
|
132
175
|
// Some vendors truncate an unrecognised code to a valid prefix and answer for
|
|
133
176
|
// that instead: exchangerate-api turns "CNYqqqwwC" into "CNY".
|
|
134
|
-
const
|
|
177
|
+
const body = asRecord(data);
|
|
178
|
+
const echoed = (_a = body === null || body === void 0 ? void 0 : body.base) !== null && _a !== void 0 ? _a : body === null || body === void 0 ? void 0 : body.source;
|
|
135
179
|
if (typeof echoed === "string" && echoed.toLowerCase() !== from.toLowerCase()) {
|
|
136
180
|
return [
|
|
137
181
|
new Error(`Provider answered for base '${echoed}', not the requested '${from}'.`),
|
|
138
182
|
{}
|
|
139
183
|
];
|
|
140
184
|
}
|
|
141
|
-
let
|
|
185
|
+
let handled;
|
|
142
186
|
try {
|
|
143
|
-
|
|
187
|
+
const handler = provider.handler;
|
|
188
|
+
handled = handler(data);
|
|
144
189
|
}
|
|
145
190
|
catch (e) {
|
|
146
191
|
return [asError(e), {}];
|
|
147
192
|
}
|
|
148
|
-
|
|
193
|
+
const rates = asRecord(handled);
|
|
194
|
+
if (!rates) {
|
|
149
195
|
return [new Error("Provider returned no usable rates."), {}];
|
|
150
196
|
}
|
|
151
197
|
// Three of the built-in handlers return {} by design when the body is not the
|
|
@@ -158,6 +204,9 @@ function readRates(provider, data, from) {
|
|
|
158
204
|
// Stamp a copy, not the handler's own object. A handler may return a frozen
|
|
159
205
|
// table, where writing throws, or a memoised one, where a later fetch for a
|
|
160
206
|
// different base rewrites the marker under a caller still holding it.
|
|
207
|
+
// The cast is the one place the base marker is smuggled into a table typed
|
|
208
|
+
// as currency-to-number. RATES_BASE_KEY cannot be a currency code, so no
|
|
209
|
+
// caller reading a rate can collide with it.
|
|
161
210
|
const marked = Object.assign(Object.assign({}, rates), { [exports.RATES_BASE_KEY]: from });
|
|
162
211
|
Object.defineProperty(marked, exports.RATES_BASE, {
|
|
163
212
|
value: from,
|
|
@@ -173,6 +222,21 @@ function readRates(provider, data, from) {
|
|
|
173
222
|
* @class Converter
|
|
174
223
|
*/
|
|
175
224
|
class Converter {
|
|
225
|
+
/**
|
|
226
|
+
* Reports a provider failure without letting the report become the failure.
|
|
227
|
+
*
|
|
228
|
+
* `onError` is consumer code, and the default is `console.error`, which
|
|
229
|
+
* throws on a closed stdout: a CLI piped into `head` would abort the whole
|
|
230
|
+
* chain on EPIPE and never reach the healthy provider behind it.
|
|
231
|
+
*/
|
|
232
|
+
report(error) {
|
|
233
|
+
try {
|
|
234
|
+
this.onError(error);
|
|
235
|
+
}
|
|
236
|
+
catch (_a) {
|
|
237
|
+
/* a broken reporter is not a reason to abandon the conversion */
|
|
238
|
+
}
|
|
239
|
+
}
|
|
176
240
|
/**
|
|
177
241
|
* Creates an instance of Converter.
|
|
178
242
|
* @param {(...ProviderReference[] | undefined[] | string[])} config
|
|
@@ -251,7 +315,14 @@ class Converter {
|
|
|
251
315
|
* @throws {Error} - if the amount is not finite, or a currency is missing
|
|
252
316
|
* @returns {Promise<number>} - converted amount
|
|
253
317
|
*/
|
|
254
|
-
this.convert = (amount_1, from_1, to_1, ...args_1) => __awaiter(this, [amount_1, from_1, to_1, ...args_1], void 0, function* (amount, from, to,
|
|
318
|
+
this.convert = (amount_1, from_1, to_1, ...args_1) => __awaiter(this, [amount_1, from_1, to_1, ...args_1], void 0, function* (amount, from, to,
|
|
319
|
+
// Public signature, and `any` is load-bearing here rather than laziness.
|
|
320
|
+
// Rates may legitimately arrive with string values, which FloatRates and
|
|
321
|
+
// AlphaVantage really send, and a caller's own interface has no index
|
|
322
|
+
// signature so it would not satisfy Record<string, unknown>. Narrowing
|
|
323
|
+
// happens immediately below instead.
|
|
324
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
325
|
+
rates = undefined) {
|
|
255
326
|
// Validating before anything is requested: an unset amount used to come
|
|
256
327
|
// back as NaN, and an unset currency reached the vendor as "undefined".
|
|
257
328
|
requireAmount(amount);
|
|
@@ -290,27 +361,37 @@ class Converter {
|
|
|
290
361
|
* @throws {Error} - if the amount, the currency, the rates or the rate is invalid
|
|
291
362
|
* @returns {number} - converted amount
|
|
292
363
|
*/
|
|
293
|
-
this.convertRate = (amount, to,
|
|
364
|
+
this.convertRate = (amount, to,
|
|
365
|
+
// Public signature, and `any` is load-bearing here rather than laziness.
|
|
366
|
+
// Rates may legitimately arrive with string values, which FloatRates and
|
|
367
|
+
// AlphaVantage really send, and a caller's own interface has no index
|
|
368
|
+
// signature so it would not satisfy Record<string, unknown>. Narrowing
|
|
369
|
+
// happens immediately below instead.
|
|
370
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
371
|
+
rates = undefined) => {
|
|
294
372
|
var _a;
|
|
295
373
|
requireAmount(amount);
|
|
296
374
|
requireCurrency(to, "to");
|
|
297
|
-
|
|
375
|
+
// Array.isArray as well as the record check: an array IS an object, and
|
|
376
|
+
// Object.keys([0.9]) is ["0"], so a table read from an array offered
|
|
377
|
+
// index-keyed currencies rather than being rejected.
|
|
378
|
+
const table = Array.isArray(rates) ? undefined : asRecord(rates);
|
|
379
|
+
if (!table) {
|
|
298
380
|
throw new Error(`Rates must be an object mapping currency to rate, received ${describeRate(rates)}.`);
|
|
299
381
|
}
|
|
300
382
|
// The base marker rides along as an ordinary key; it is not a rate, so it
|
|
301
383
|
// is neither a lookup candidate nor part of the "N rates available" count.
|
|
302
|
-
const keys = Object.keys(
|
|
384
|
+
const keys = Object.keys(table).filter((key) => key !== exports.RATES_BASE_KEY);
|
|
303
385
|
// Exact match wins, so a response carrying both "EUR" and "eur" does not
|
|
304
386
|
// resolve differently depending on JSON key order.
|
|
305
|
-
const rateKey = (_a = keys.find((key) => key === to)) !== null && _a !== void 0 ? _a : keys.find((key) => key
|
|
387
|
+
const rateKey = (_a = keys.find((key) => key === to)) !== null && _a !== void 0 ? _a : keys.find((key) => asciiLower(key) === asciiLower(to));
|
|
306
388
|
// Truthiness would report a present-but-zero rate as missing.
|
|
307
389
|
if (rateKey === undefined) {
|
|
308
390
|
// The full table is ~4KB in production.
|
|
309
391
|
throw new Error(`No '${to}' present in rates (${keys.length} rate${keys.length === 1 ? "" : "s"} available).`);
|
|
310
392
|
}
|
|
311
|
-
const raw =
|
|
312
|
-
|
|
313
|
-
const numericRate = typeof raw === "number" || typeof raw === "string" ? Number(raw) : NaN;
|
|
393
|
+
const raw = table[rateKey];
|
|
394
|
+
const numericRate = asRate(raw);
|
|
314
395
|
if (!Number.isFinite(numericRate) || numericRate <= 0) {
|
|
315
396
|
throw new Error(`Invalid rate value for '${to}': expected a finite number greater than zero, received ${describeRate(raw)}.`);
|
|
316
397
|
}
|
|
@@ -364,9 +445,11 @@ class Converter {
|
|
|
364
445
|
// symbol list. That is this provider's limitation, so move to the next.
|
|
365
446
|
if (multiple && provider.endpoint.single.includes("%TO%")) {
|
|
366
447
|
lastError = new Error("Provider cannot fetch a whole rate table; it requires a target currency.");
|
|
367
|
-
this.
|
|
448
|
+
this.report(lastError);
|
|
368
449
|
continue;
|
|
369
450
|
}
|
|
451
|
+
// The rejection is a FetchRatesError, not an Error, so name both sides
|
|
452
|
+
// rather than casting the pair to any and losing the shape entirely.
|
|
370
453
|
const [err, data] = yield (0, utils_1._to)((0, requester_1.fetchRates)(client, provider, { FROM: from, TO: to, multiple: multiple }, Object.assign(Object.assign({}, retry), { deadline })));
|
|
371
454
|
if (!err) {
|
|
372
455
|
// A provider answering wrongly, or a handler throwing on a shape it did
|
|
@@ -376,7 +459,7 @@ class Converter {
|
|
|
376
459
|
if (!failure) {
|
|
377
460
|
return rates;
|
|
378
461
|
}
|
|
379
|
-
this.
|
|
462
|
+
this.report(failure);
|
|
380
463
|
lastError = failure;
|
|
381
464
|
continue;
|
|
382
465
|
}
|
|
@@ -385,7 +468,7 @@ class Converter {
|
|
|
385
468
|
if (!isProviderFailure(err) || !err.handled) {
|
|
386
469
|
throw asError(isProviderFailure(err) ? err.error : err);
|
|
387
470
|
}
|
|
388
|
-
this.
|
|
471
|
+
this.report(err.error);
|
|
389
472
|
lastError = asError(err.error);
|
|
390
473
|
}
|
|
391
474
|
// Every provider in the snapshot failed.
|
|
@@ -413,4 +496,4 @@ class Converter {
|
|
|
413
496
|
}
|
|
414
497
|
}
|
|
415
498
|
exports.Converter = Converter;
|
|
416
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxpREFBMkU7QUFFM0UsMkNBQXdDO0FBQ3hDLDJDQUFxRDtBQUE1QyxrR0FBQSxPQUFPLE9BQVc7QUFDM0IseUNBQW9DO0FBYXBDOzs7Ozs7R0FNRztBQUNVLFFBQUEsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUVsRTs7Ozs7Ozs7O0dBU0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxRQUFRLENBQUM7QUFFdkMsNEVBQTRFO0FBQzVFLFNBQVMsTUFBTSxDQUFDLEtBQVU7O0lBQ3hCLE1BQU0sTUFBTSxHQUFHLE1BQUEsS0FBSyxDQUFDLGtCQUFVLENBQUMsbUNBQUksS0FBSyxDQUFDLHNCQUFjLENBQUMsQ0FBQztJQUMxRCxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDekQsQ0FBQztBQVlELCtHQUErRztBQUMvRyxTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDdkMsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFRLEtBQXlCLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FDeEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxPQUFPLENBQUMsS0FBYztJQUM3QixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FDWCxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxLQUFLO1FBQ1AsQ0FBQyxDQUFDLHlCQUF5QixNQUFNLENB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
|
|
499
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxpREFBMkU7QUFFM0UsMkNBQXdDO0FBQ3hDLDJDQUFxRDtBQUE1QyxrR0FBQSxPQUFPLE9BQVc7QUFDM0IseUNBQW9DO0FBYXBDOzs7Ozs7R0FNRztBQUNVLFFBQUEsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUVsRTs7Ozs7Ozs7O0dBU0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxRQUFRLENBQUM7QUFFdkM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUNoRCxDQUFDLENBQUUsS0FBaUM7UUFDcEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQVMsTUFBTSxDQUFDLEtBQWM7O0lBQzVCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQ1YsTUFBQyxNQUEyQyxDQUFDLGtCQUFVLENBQUMsbUNBQ3hELE1BQU0sQ0FBQyxzQkFBYyxDQUFDLENBQUM7SUFDekIsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pELENBQUM7QUFZRCwrR0FBK0c7QUFDL0csU0FBUyxpQkFBaUIsQ0FBQyxLQUFjO0lBQ3ZDLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsT0FBUSxLQUF5QixDQUFDLE9B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
|
package/dist/parts/chainer.d.ts
CHANGED
|
@@ -8,6 +8,14 @@ export interface chainableConverter {
|
|
|
8
8
|
from: (from: string) => chainableConverter;
|
|
9
9
|
to: (to: string) => Promise<number>;
|
|
10
10
|
fetch: () => Promise<chainableConverter>;
|
|
11
|
+
/**
|
|
12
|
+
* The fetched rate table.
|
|
13
|
+
*
|
|
14
|
+
* This type is optimistic: the value is undefined until `fetch()` has
|
|
15
|
+
* resolved. Saying so would break any consumer reading `convert.rates`
|
|
16
|
+
* without a guard, so the honest `rateObject | undefined` waits for the next
|
|
17
|
+
* major rather than arriving in a minor.
|
|
18
|
+
*/
|
|
11
19
|
rates: rateObject;
|
|
12
20
|
amount: (val: number) => chainableConverter;
|
|
13
21
|
}
|
package/dist/parts/chainer.js
CHANGED
|
@@ -39,6 +39,7 @@ function Chainer(amount = undefined) {
|
|
|
39
39
|
to: _to,
|
|
40
40
|
fetch: _fetch,
|
|
41
41
|
get rates() {
|
|
42
|
+
// Cast, not a lie the compiler made: see the note on the interface.
|
|
42
43
|
return _currentRates;
|
|
43
44
|
},
|
|
44
45
|
amount: _amount
|
|
@@ -99,4 +100,4 @@ function Chainer(amount = undefined) {
|
|
|
99
100
|
});
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJ0cy9jaGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBa0NBLDBCQXVGQztBQXpIRCw0Q0FBcUQ7QUF1QnJEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixPQUFPLENBQUMsU0FBNkIsU0FBUztJQUM1RCxJQUFJLGNBQWMsR0FBdUIsTUFBTSxDQUFDO0lBQ2hELElBQUksWUFBWSxHQUF1QixTQUFTLENBQUM7SUFDakQsSUFBSSxVQUFVLEdBQXVCLFNBQVMsQ0FBQztJQUMvQyxJQUFJLGFBQWEsR0FBMkIsU0FBUyxDQUFDO0lBQ3RELG1EQUFtRDtJQUNuRCxJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBRS9DLGtCQUFrQjtJQUNsQixNQUFNLFVBQVUsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUVuQzs7T0FFRztJQUNILE1BQU0sU0FBUyxHQUF1QjtRQUNwQyxJQUFJLEVBQUUsS0FBSztRQUNYLEVBQUUsRUFBRSxHQUFHO1FBQ1AsS0FBSyxFQUFFLE1BQU07UUFDYixJQUFJLEtBQUs7WUFDUCxvRUFBb0U7WUFDcEUsT0FBTyxhQUEyQixDQUFDO1FBQ3JDLENBQUM7UUFDRCxNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFNBQWUsTUFBTTs7WUFDbkIsdUNBQXVDO1lBQ3ZDLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQVMsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQzFCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVELHNCQUFzQjtJQUN0QixPQUFPLFNBQVMsQ0FBQztJQUVqQjs7Ozs7T0FLRztJQUNILFNBQVMsT0FBTyxDQUFDLEdBQVc7UUFDMUIsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLEtBQUssQ0FBQyxJQUFZO1FBQ3pCLHdFQUF3RTtRQUN4RSxtRUFBbUU7UUFDbkUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDekIsQ0FBQztRQUNELFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBZSxHQUFHLENBQUMsRUFBVTs7WUFDM0IsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUVoQixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUM3QixjQUFjLEVBQ2QsWUFBWSxFQUNwQixVQUFVLEVBQ1YsYUFBYSxDQUNkLENBQUM7WUFFRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQUE7QUFDSCxDQUFDIn0=
|
package/dist/parts/client.d.ts
CHANGED
|
@@ -35,5 +35,12 @@ export interface HttpClient {
|
|
|
35
35
|
export interface ClientOptions {
|
|
36
36
|
/** Milliseconds before a request is aborted. Defaults to 10000. */
|
|
37
37
|
timeout?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Bytes of response body the client will buffer before giving up. Defaults
|
|
40
|
+
* to 10MB. An unterminated stream otherwise buffers whole until the timeout
|
|
41
|
+
* fires, so this is what stands between a broken upstream and an OOM; the
|
|
42
|
+
* largest real rate table is ~4KB, so 10MB is pure headroom, not a real ceiling.
|
|
43
|
+
*/
|
|
44
|
+
maxResponseSize?: number;
|
|
38
45
|
}
|
|
39
46
|
export declare function createClient(options?: ClientOptions): HttpClient;
|
package/dist/parts/client.js
CHANGED
|
@@ -27,17 +27,73 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.createClient = createClient;
|
|
30
|
+
const DEFAULT_MAX_RESPONSE_SIZE = 10 * 1024 * 1024;
|
|
31
|
+
/** True for a non-null object, so a property read off it is not a member access on `unknown`. */
|
|
32
|
+
function isObject(value) {
|
|
33
|
+
return typeof value === "object" && value !== null;
|
|
34
|
+
}
|
|
30
35
|
/** Node's fetch reports the reason under `cause`; surface it as a code. */
|
|
31
36
|
function errorCode(err) {
|
|
32
|
-
var _a
|
|
33
|
-
if ((err
|
|
37
|
+
var _a;
|
|
38
|
+
if (!isObject(err)) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (err.name === "TimeoutError" || err.name === "AbortError") {
|
|
34
42
|
return "ETIMEDOUT";
|
|
35
43
|
}
|
|
36
|
-
|
|
44
|
+
const cause = isObject(err.cause) ? err.cause : undefined;
|
|
45
|
+
const code = (_a = cause === null || cause === void 0 ? void 0 : cause.code) !== null && _a !== void 0 ? _a : err.code;
|
|
46
|
+
return typeof code === "string" ? code : undefined;
|
|
47
|
+
}
|
|
48
|
+
/** Distinguishes a body that grew past the cap from any other parse failure. */
|
|
49
|
+
class ResponseTooLargeError extends Error {
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reads the body up to `limit` bytes and parses it as JSON.
|
|
53
|
+
*
|
|
54
|
+
* Reading via the stream instead of response.json() is what lets a call bail
|
|
55
|
+
* out mid-download: an unterminated chunked stream measured at 8898MB pushed
|
|
56
|
+
* and 9078MB RSS before the 10s abort ever landed, since response.json()
|
|
57
|
+
* buffers the whole thing first. TextDecoder, not Buffer#toString, so a
|
|
58
|
+
* leading UTF-8 BOM is stripped the same way response.json() strips it.
|
|
59
|
+
*/
|
|
60
|
+
function readBody(response, limit) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
if (!response.body) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const reader = response.body.getReader();
|
|
66
|
+
const chunks = [];
|
|
67
|
+
let total = 0;
|
|
68
|
+
while (true) {
|
|
69
|
+
const { done, value } = yield reader.read();
|
|
70
|
+
if (done) {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
total += value.byteLength;
|
|
74
|
+
if (total > limit) {
|
|
75
|
+
yield reader.cancel();
|
|
76
|
+
throw new ResponseTooLargeError(`Response body exceeded ${limit} bytes`);
|
|
77
|
+
}
|
|
78
|
+
chunks.push(value);
|
|
79
|
+
}
|
|
80
|
+
const text = new TextDecoder().decode(concat(chunks, total));
|
|
81
|
+
return JSON.parse(text);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function concat(chunks, total) {
|
|
85
|
+
const out = new Uint8Array(total);
|
|
86
|
+
let offset = 0;
|
|
87
|
+
for (const chunk of chunks) {
|
|
88
|
+
out.set(chunk, offset);
|
|
89
|
+
offset += chunk.byteLength;
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
37
92
|
}
|
|
38
93
|
function createClient(options = {}) {
|
|
39
|
-
var _a;
|
|
94
|
+
var _a, _b;
|
|
40
95
|
const timeout = (_a = options.timeout) !== null && _a !== void 0 ? _a : 10000;
|
|
96
|
+
const maxResponseSize = (_b = options.maxResponseSize) !== null && _b !== void 0 ? _b : DEFAULT_MAX_RESPONSE_SIZE;
|
|
41
97
|
return {
|
|
42
98
|
get(url) {
|
|
43
99
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -47,7 +103,8 @@ function createClient(options = {}) {
|
|
|
47
103
|
}
|
|
48
104
|
catch (err) {
|
|
49
105
|
// No response: DNS, refused, timeout, abort.
|
|
50
|
-
const
|
|
106
|
+
const message = isObject(err) && typeof err.message === "string" ? err.message : undefined;
|
|
107
|
+
const error = new Error(message || "fetch failed");
|
|
51
108
|
error.code = errorCode(err);
|
|
52
109
|
throw error;
|
|
53
110
|
}
|
|
@@ -56,9 +113,22 @@ function createClient(options = {}) {
|
|
|
56
113
|
// rather than failing here.
|
|
57
114
|
let data;
|
|
58
115
|
try {
|
|
59
|
-
data = yield response
|
|
116
|
+
data = yield readBody(response, maxResponseSize);
|
|
60
117
|
}
|
|
61
|
-
catch (
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (err instanceof ResponseTooLargeError) {
|
|
120
|
+
// Same shape as the transport failure above: no usable response
|
|
121
|
+
// came back, so the fallback chain has to treat this provider the
|
|
122
|
+
// same way it treats a dropped connection, not a parsed answer.
|
|
123
|
+
//
|
|
124
|
+
// Carried on `code`, not in the message. The requester will not echo
|
|
125
|
+
// a client's message, because that is where a URL and its API key
|
|
126
|
+
// end up, so a message-only failure surfaces as "Error (message
|
|
127
|
+
// withheld)" and says nothing about what went wrong.
|
|
128
|
+
const tooLarge = new Error(err.message);
|
|
129
|
+
tooLarge.code = "E_RESPONSE_TOO_LARGE";
|
|
130
|
+
throw tooLarge;
|
|
131
|
+
}
|
|
62
132
|
data = undefined;
|
|
63
133
|
}
|
|
64
134
|
const headers = {};
|
|
@@ -75,4 +145,4 @@ function createClient(options = {}) {
|
|
|
75
145
|
}
|
|
76
146
|
};
|
|
77
147
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7O0FBeUdILG9DQXdEQztBQTVIRCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRW5ELGlHQUFpRztBQUNqRyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDckQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFTLFNBQVMsQ0FBQyxHQUFZOztJQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUM3RCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFELE1BQU0sSUFBSSxHQUFHLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksbUNBQUksR0FBRyxDQUFDLElBQUksQ0FBQztJQUNyQyxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDckQsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLHFCQUFzQixTQUFRLEtBQUs7Q0FBRztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILFNBQWUsUUFB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
|
package/dist/parts/config.d.ts
CHANGED
|
@@ -70,7 +70,7 @@ export declare class Config {
|
|
|
70
70
|
/**
|
|
71
71
|
* Adds multiple new, user-defined provider to the list of providers.
|
|
72
72
|
*
|
|
73
|
-
* @param {UserDefinedProvider[]}
|
|
73
|
+
* @param {UserDefinedProvider[]} newProviders - providers to be added
|
|
74
74
|
* @param {boolean} [setActive=false] - should the new provider(s) be prioritized
|
|
75
75
|
* @memberof Config
|
|
76
76
|
*/
|
package/dist/parts/config.js
CHANGED
|
@@ -20,7 +20,9 @@ class Config {
|
|
|
20
20
|
* @memberof Config
|
|
21
21
|
*/
|
|
22
22
|
get providers() {
|
|
23
|
-
|
|
23
|
+
// A copy: handing back the live array lets `providers.length = 0` empty
|
|
24
|
+
// the chain, the same bypass `converter.providers` already guards against.
|
|
25
|
+
return [...this._active];
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Provider setter (adder).
|
|
@@ -106,7 +108,7 @@ class Config {
|
|
|
106
108
|
/**
|
|
107
109
|
* Adds multiple new, user-defined provider to the list of providers.
|
|
108
110
|
*
|
|
109
|
-
* @param {UserDefinedProvider[]}
|
|
111
|
+
* @param {UserDefinedProvider[]} newProviders - providers to be added
|
|
110
112
|
* @param {boolean} [setActive=false] - should the new provider(s) be prioritized
|
|
111
113
|
* @memberof Config
|
|
112
114
|
*/
|
|
@@ -117,8 +119,9 @@ class Config {
|
|
|
117
119
|
// Validate the whole batch before adding any of it, so a bad entry cannot
|
|
118
120
|
// leave earlier ones half-added and unusable on retry.
|
|
119
121
|
newProviders.forEach((p) => {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
+
const issue = (0, utils_1.userDefinedProviderIssue)(p);
|
|
123
|
+
if (issue) {
|
|
124
|
+
throw new Error(`Invalid provider format! ${issue}.`);
|
|
122
125
|
}
|
|
123
126
|
if (Object.prototype.hasOwnProperty.call(providers_1.providers, p.name)) {
|
|
124
127
|
throw new Error(`'${p.name}' is the name of a built-in provider; choose another.`);
|
|
@@ -182,4 +185,4 @@ function resolveProviders(...configuration) {
|
|
|
182
185
|
// resolving all providers
|
|
183
186
|
return initializationConfig.map((provider) => (0, providers_1.resolveProvider)(provider));
|
|
184
187
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErTUEsNENBcUNDO0FBcFBELHFDQUFvRDtBQUVwRCwyQ0FNcUI7QUFFckIsbUNBQW1EO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQWEsTUFBTTtJQVNqQjs7Ozs7T0FLRztJQUNILElBQUksU0FBUztRQUNYLHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUEwQ0Q7Ozs7Ozs7T0FPRztJQUNLLFlBQVksQ0FBQyxTQUFxQixFQUFFLFNBQWtCO1FBQzVELFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakMsc0VBQXNFO1lBQ3RFLDZDQUE2QztZQUM3QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3ZCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDaEMsT0FBTztJQUNULENBQUM7SUFvRUQ7Ozs7O09BS0c7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxHQUFHLE1BQW9EO1FBbEpuRTs7V0FFRztRQUNLLFlBQU8sR0FBZSxJQUFBLHFCQUFZLEdBQUUsQ0FBQztRQUU3Qzs7O1dBR0c7UUFDSCxjQUFTLEdBQUcsQ0FBQyxNQUFrQixFQUFRLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQyxDQUFDO1FBRUY7O1dBRUc7UUFDSCxjQUFTLEdBQUcsR0FBRyxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ0ssV0FBTSxHQUFpQixFQUFFLENBQUM7UUFFbEM7OztXQUdHO1FBQ0gsb0JBQWUsR0FBRyxDQUFDLE9BQXFCLEVBQVEsRUFBRTtZQUNoRCxJQUFJLENBQUMsTUFBTSxtQ0FBUSxJQUFJLENBQUMsTUFBTSxHQUFLLE9BQU8sQ0FBRSxDQUFDO1FBQy9DLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ0gsb0JBQWUsR0FBRyxHQUFpQixFQUFFO1lBQ25DLHlCQUFZLElBQUksQ0FBQyxNQUFNLEVBQUc7UUFDNUIsQ0FBQyxDQUFDO1FBMkJGOzs7Ozs7O1dBT0c7UUFDSCxRQUFHLEdBQUcsQ0FDSixJQUFZLEVBQ1osUUFBa0IsRUFDbEIsWUFBcUIsS0FBSyxFQUNwQixFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDO1FBRUY7Ozs7OztXQU1HO1FBQ0gsZ0JBQVcsR0FBRyxDQUNaLFlBQW1DLEVBQ25DLFlBQXFCLEtBQUssRUFDcEIsRUFBRTtZQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsMEVBQTBFO1lBQzFFLHVEQUF1RDtZQUN2RCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0NBQXdCLEVBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxxQkFBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM1RCxNQUFNLElBQUksS0FBSyxDQUNiLElBQUksQ0FBQyxDQUFDLElBQUksdURBQXVELENBQ2xFLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsMkVBQTJFO1lBQzNFLHVFQUF1RTtZQUN2RSwyRUFBMkU7WUFDM0UsMkVBQTJFO1lBRTNFLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsWUFBWSxDQUNmLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFDbkMsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDLENBQUM7UUFFRjs7OztXQUlHO1FBQ0gsV0FBTSxHQUFHLENBQUMsUUFBa0IsRUFBUSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUM7UUFrQkEsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUNmLENBQUMscUJBQVMsQ0FBQyxlQUFlLEVBQUUscUJBQVMsQ0FBQyxVQUFVLEVBQUUscUJBQVMsQ0FBQyxXQUFXLENBQUMsRUFDeEUsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuTEQsd0JBbUxDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLEdBQUcsYUFBMkQ7SUFFOUQsb0NBQW9DO0lBQ3BDLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxxQkFBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFDRSxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO1FBQ3BDLE9BQU8sYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVc7UUFDdkMsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUNwQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYix5SEFBeUgsQ0FDMUgsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsc0RBQXNEO0lBQ3RELElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEUsT0FBTyxDQUFDLHFCQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLGlFQUFpRTtRQUNqRSxPQUFPLENBQUMsSUFBQSwyQkFBZSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsVUFBVTtJQUNWLE1BQU0sb0JBQW9CLEdBQXdCLGFBQWEsQ0FBQztJQUVoRSwwQkFBMEI7SUFDMUIsT0FBTyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUEsMkJBQWUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzNFLENBQUMifQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { rateObject } from "../converter";
|
|
1
2
|
/**
|
|
2
3
|
* A map for provider information
|
|
3
4
|
*
|
|
@@ -61,7 +62,7 @@ export interface Provider {
|
|
|
61
62
|
* @type {Function}
|
|
62
63
|
* @memberof Provider
|
|
63
64
|
*/
|
|
64
|
-
handler:
|
|
65
|
+
handler: (data: any) => rateObject;
|
|
65
66
|
/**
|
|
66
67
|
* A map of possible errors and their respective messages
|
|
67
68
|
*
|