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.
@@ -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 marked = (_a = rates[exports.RATES_BASE]) !== null && _a !== void 0 ? _a : rates[exports.RATES_BASE_KEY];
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 raw = rates[key];
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 echoed = data && (data.base || data.source);
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 rates;
185
+ let handled;
142
186
  try {
143
- rates = provider.handler(data);
187
+ const handler = provider.handler;
188
+ handled = handler(data);
144
189
  }
145
190
  catch (e) {
146
191
  return [asError(e), {}];
147
192
  }
148
- if (!rates || typeof rates !== "object") {
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, rates = undefined) {
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, rates = undefined) => {
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
- if (typeof rates !== "object" || rates === null) {
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(rates).filter((key) => key !== exports.RATES_BASE_KEY);
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.toLowerCase() === to.toLowerCase());
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 = rates[rateKey];
312
- // Number(["0.9"]) === 0.9, so check the type before the value.
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.onError(lastError);
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.onError(failure);
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.onError(err.error);
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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
@@ -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
  }
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJ0cy9jaGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBMkJBLDBCQXNGQztBQWpIRCw0Q0FBcUQ7QUFnQnJEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixPQUFPLENBQUMsU0FBNkIsU0FBUztJQUM1RCxJQUFJLGNBQWMsR0FBdUIsTUFBTSxDQUFDO0lBQ2hELElBQUksWUFBWSxHQUF1QixTQUFTLENBQUM7SUFDakQsSUFBSSxVQUFVLEdBQXVCLFNBQVMsQ0FBQztJQUMvQyxJQUFJLGFBQWEsR0FBb0IsU0FBUyxDQUFDO0lBQy9DLG1EQUFtRDtJQUNuRCxJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBRS9DLGtCQUFrQjtJQUNsQixNQUFNLFVBQVUsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUVuQzs7T0FFRztJQUNILE1BQU0sU0FBUyxHQUF1QjtRQUNwQyxJQUFJLEVBQUUsS0FBSztRQUNYLEVBQUUsRUFBRSxHQUFHO1FBQ1AsS0FBSyxFQUFFLE1BQU07UUFDYixJQUFJLEtBQUs7WUFDUCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ0QsTUFBTSxFQUFFLE9BQU87S0FDaEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxTQUFlLE1BQU07O1lBQ25CLHVDQUF1QztZQUN2QyxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFTLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUUsVUFBVSxHQUFHLFlBQVksQ0FBQztZQUMxQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0tBQUE7SUFFRCxzQkFBc0I7SUFDdEIsT0FBTyxTQUFTLENBQUM7SUFFakI7Ozs7O09BS0c7SUFDSCxTQUFTLE9BQU8sQ0FBQyxHQUFXO1FBQzFCLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDckIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxLQUFLLENBQUMsSUFBWTtRQUN6Qix3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEQsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMxQixVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQWUsR0FBRyxDQUFDLEVBQVU7O1lBQzNCLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFFaEIsYUFBYTtZQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FDN0IsY0FBYyxFQUNkLFlBQVksRUFDWixVQUFVLEVBQ2xCLGFBQWEsQ0FDZCxDQUFDO1lBRUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUFBO0FBQ0gsQ0FBQyJ9
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJ0cy9jaGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBa0NBLDBCQXVGQztBQXpIRCw0Q0FBcUQ7QUF1QnJEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixPQUFPLENBQUMsU0FBNkIsU0FBUztJQUM1RCxJQUFJLGNBQWMsR0FBdUIsTUFBTSxDQUFDO0lBQ2hELElBQUksWUFBWSxHQUF1QixTQUFTLENBQUM7SUFDakQsSUFBSSxVQUFVLEdBQXVCLFNBQVMsQ0FBQztJQUMvQyxJQUFJLGFBQWEsR0FBMkIsU0FBUyxDQUFDO0lBQ3RELG1EQUFtRDtJQUNuRCxJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBRS9DLGtCQUFrQjtJQUNsQixNQUFNLFVBQVUsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUVuQzs7T0FFRztJQUNILE1BQU0sU0FBUyxHQUF1QjtRQUNwQyxJQUFJLEVBQUUsS0FBSztRQUNYLEVBQUUsRUFBRSxHQUFHO1FBQ1AsS0FBSyxFQUFFLE1BQU07UUFDYixJQUFJLEtBQUs7WUFDUCxvRUFBb0U7WUFDcEUsT0FBTyxhQUEyQixDQUFDO1FBQ3JDLENBQUM7UUFDRCxNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFNBQWUsTUFBTTs7WUFDbkIsdUNBQXVDO1lBQ3ZDLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQVMsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQzFCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVELHNCQUFzQjtJQUN0QixPQUFPLFNBQVMsQ0FBQztJQUVqQjs7Ozs7T0FLRztJQUNILFNBQVMsT0FBTyxDQUFDLEdBQVc7UUFDMUIsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLEtBQUssQ0FBQyxJQUFZO1FBQ3pCLHdFQUF3RTtRQUN4RSxtRUFBbUU7UUFDbkUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDekIsQ0FBQztRQUNELFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBZSxHQUFHLENBQUMsRUFBVTs7WUFDM0IsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUVoQixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUM3QixjQUFjLEVBQ2QsWUFBWSxFQUNwQixVQUFVLEVBQ1YsYUFBYSxDQUNkLENBQUM7WUFFRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQUE7QUFDSCxDQUFDIn0=
@@ -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;
@@ -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, _b;
33
- if ((err === null || err === void 0 ? void 0 : err.name) === "TimeoutError" || (err === null || err === void 0 ? void 0 : err.name) === "AbortError") {
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
- return (_b = (_a = err === null || err === void 0 ? void 0 : err.cause) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : err === null || err === void 0 ? void 0 : err.code;
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 error = new Error((err === null || err === void 0 ? void 0 : err.message) || "fetch failed");
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.json();
116
+ data = yield readBody(response, maxResponseSize);
60
117
  }
61
- catch (_a) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7O0FBbUNILG9DQXlDQztBQWpERCwyRUFBMkU7QUFDM0UsU0FBUyxTQUFTLENBQUMsR0FBUTs7SUFDekIsSUFBSSxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLE1BQUssY0FBYyxJQUFJLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQztRQUMvRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxNQUFBLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLEtBQUssMENBQUUsSUFBSSxtQ0FBSSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsSUFBSSxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsVUFBeUIsRUFBRTs7SUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBQSxPQUFPLENBQUMsT0FBTyxtQ0FBSSxLQUFLLENBQUM7SUFFekMsT0FBTztRQUNDLEdBQUcsQ0FBQyxHQUFXOztnQkFDbkIsSUFBSSxRQUFrQixDQUFDO2dCQUN2QixJQUFJLENBQUM7b0JBQ0gsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEUsQ0FBQztnQkFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO29CQUNsQiw2Q0FBNkM7b0JBQzdDLE1BQU0sS0FBSyxHQUFjLElBQUksS0FBSyxDQUFDLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE9BQU8sS0FBSSxjQUFjLENBQUMsQ0FBQztvQkFDbkUsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVCLE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7Z0JBRUQsMEVBQTBFO2dCQUMxRSx1RUFBdUU7Z0JBQ3ZFLDRCQUE0QjtnQkFDNUIsSUFBSSxJQUFTLENBQUM7Z0JBQ2QsSUFBSSxDQUFDO29CQUNILElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQztnQkFBQyxXQUFNLENBQUM7b0JBQ1AsSUFBSSxHQUFHLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQztnQkFFRCxNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO2dCQUMzQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxLQUFLLEdBQWMsSUFBSSxLQUFLLENBQ2hDLG1DQUFtQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQ3JELENBQUM7b0JBQ0YsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztvQkFDNUQsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3BELENBQUM7U0FBQTtLQUNGLENBQUM7QUFDSixDQUFDIn0=
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7O0FBeUdILG9DQXdEQztBQTVIRCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRW5ELGlHQUFpRztBQUNqRyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDckQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFTLFNBQVMsQ0FBQyxHQUFZOztJQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUM3RCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFELE1BQU0sSUFBSSxHQUFHLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksbUNBQUksR0FBRyxDQUFDLElBQUksQ0FBQztJQUNyQyxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDckQsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLHFCQUFzQixTQUFRLEtBQUs7Q0FBRztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILFNBQWUsUUFB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
@@ -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[]} providers - providers to be added
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
  */
@@ -20,7 +20,9 @@ class Config {
20
20
  * @memberof Config
21
21
  */
22
22
  get providers() {
23
- return this._active;
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[]} providers - providers to be added
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
- if (!(0, utils_1.checkIfUserDefinedProvider)(p)) {
121
- throw new Error("Invalid provider format!");
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0TUEsNENBcUNDO0FBalBELHFDQUFvRDtBQUVwRCwyQ0FNcUI7QUFFckIsbUNBQXFEO0FBRXJEOzs7Ozs7R0FNRztBQUNILE1BQWEsTUFBTTtJQVNqQjs7Ozs7T0FLRztJQUNILElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBMENEOzs7Ozs7O09BT0c7SUFDSyxZQUFZLENBQUMsU0FBcUIsRUFBRSxTQUFrQjtRQUM1RCxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2pDLHNFQUFzRTtZQUN0RSw2Q0FBNkM7WUFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN2QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDdEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU87SUFDVCxDQUFDO0lBbUVEOzs7OztPQUtHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksR0FBRyxNQUFvRDtRQWpKbkU7O1dBRUc7UUFDSyxZQUFPLEdBQWUsSUFB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
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErTUEsNENBcUNDO0FBcFBELHFDQUFvRDtBQUVwRCwyQ0FNcUI7QUFFckIsbUNBQW1EO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQWEsTUFBTTtJQVNqQjs7Ozs7T0FLRztJQUNILElBQUksU0FBUztRQUNYLHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUEwQ0Q7Ozs7Ozs7T0FPRztJQUNLLFlBQVksQ0FBQyxTQUFxQixFQUFFLFNBQWtCO1FBQzVELFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakMsc0VBQXNFO1lBQ3RFLDZDQUE2QztZQUM3QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3ZCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDaEMsT0FBTztJQUNULENBQUM7SUFvRUQ7Ozs7O09BS0c7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxH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
@@ -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: Function;
65
+ handler: (data: any) => rateObject;
65
66
  /**
66
67
  * A map of possible errors and their respective messages
67
68
  *