"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.StellarTomlResolver = exports.STELLAR_TOML_MAX_SIZE = void 0;
var _axios = _interopRequireDefault(require("axios"));
var _toml = _interopRequireDefault(require("toml"));
var _config = require("./config");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// STELLAR_TOML_MAX_SIZE is the maximum size of stellar.toml file
const STELLAR_TOML_MAX_SIZE = 100 * 1024;
// axios timeout doesn't catch missing urls, e.g. those with no response
// so we use the axios cancel token to ensure the timeout
exports.STELLAR_TOML_MAX_SIZE = STELLAR_TOML_MAX_SIZE;
const CancelToken = _axios.default.CancelToken;
/**
* StellarTomlResolver allows resolving `stellar.toml` files.
*/
class StellarTomlResolver {
/**
* Returns a parsed `stellar.toml` file for a given domain.
* ```js
* StellarSdk.StellarTomlResolver.resolve('acme.com')
* .then(stellarToml => {
* // stellarToml in an object representing domain stellar.toml file.
* })
* .catch(error => {
* // stellar.toml does not exist or is invalid
* });
* ```
* @see <a href="https://developers.stellar.org/docs/issuing-assets/publishing-asset-info/" target="_blank">Stellar.toml doc</a>
* @param {string} domain Domain to get stellar.toml file for
* @param {object} [opts] Options object
* @param {boolean} [opts.allowHttp] - Allow connecting to http servers, default: `false`. This must be set to false in production deployments!
* @param {number} [opts.timeout] - Allow a timeout, default: 0. Allows user to avoid nasty lag due to TOML resolve issue.
* @returns {Promise} A `Promise` that resolves to the parsed stellar.toml object
*/
static async resolve(domain) {
let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
const allowHttp = typeof opts.allowHttp === "undefined" ? _config.Config.isAllowHttp() : opts.allowHttp;
const timeout = typeof opts.timeout === "undefined" ? _config.Config.getTimeout() : opts.timeout;
const protocol = allowHttp ? "http" : "https";
return _axios.default.get(`${protocol}://${domain}/.well-known/stellar.toml`, {
maxContentLength: STELLAR_TOML_MAX_SIZE,
cancelToken: timeout ? new CancelToken(cancel => setTimeout(() => cancel(`timeout of ${timeout}ms exceeded`), timeout)) : undefined,
timeout
}).then(response => {
try {
const tomlObject = _toml.default.parse(response.data);
return Promise.resolve(tomlObject);
} catch (e) {
return Promise.reject(new Error(`stellar.toml is invalid - Parsing error on line ${e.line}, column ${e.column}: ${e.message}`));
}
}).catch(err => {
if (err.message.match(/^maxContentLength size/)) {
throw new Error(`stellar.toml file exceeds allowed size of ${STELLAR_TOML_MAX_SIZE}`);
} else {
throw err;
}
});
}
}
/* tslint:disable-next-line: no-namespace */
exports.StellarTomlResolver = StellarTomlResolver;
(function (_StellarTomlResolver) {})(StellarTomlResolver || (exports.StellarTomlResolver = StellarTomlResolver = {}));