UNPKG

@unstoppabledomains/resolution

Version:
364 lines (363 loc) 18 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var znsUtils_1 = require("./utils/znsUtils"); var resolutionError_1 = require("./errors/resolutionError"); var TwitterSignatureValidator_1 = require("./utils/TwitterSignatureValidator"); var publicTypes_1 = require("./types/publicTypes"); var Networking_1 = __importDefault(require("./utils/Networking")); var utils_1 = require("./utils"); var namehash_1 = require("./utils/namehash"); var NamingService_1 = require("./NamingService"); /** * @internal */ var UdApi = /** @class */ (function (_super) { __extends(UdApi, _super); function UdApi(api) { var _this = _super.call(this) || this; _this.url = (api === null || api === void 0 ? void 0 : api.url) || 'https://unstoppabledomains.com/api/v1'; // TODO: this is about to be deprecated var DefaultUserAgent = 'cross-fetch/4.0.0 (+https://github.com/lquixada/cross-fetch)'; var CustomUserAgent = "".concat(DefaultUserAgent, " Resolution"); _this.headers = { 'X-user-agent': CustomUserAgent }; return _this; } UdApi.prototype.isSupportedDomain = function (_domain) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { methodName: 'isSupportedDomain', }); }); }); }; UdApi.prototype.namehash = function (_domain) { throw new Error('Unsupported method when using UD Resolution API'); }; UdApi.prototype.childhash = function (_parentHash, _label) { throw new Error('Unsupported method when using UD Resolution API'); }; UdApi.prototype.record = function (domain, key) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.records(domain, [key])]; case 1: return [2 /*return*/, (_a.sent())[key]]; } }); }); }; UdApi.prototype.records = function (domain, keys) { return __awaiter(this, void 0, void 0, function () { var records; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.allRecords(domain)]; case 1: records = _a.sent(); return [2 /*return*/, (0, utils_1.constructRecords)(keys, records)]; } }); }); }; UdApi.prototype.owner = function (domain) { return __awaiter(this, void 0, void 0, function () { var response, _a, owner, blockchain; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.resolve(domain)]; case 1: response = _b.sent(); _a = response.meta, owner = _a.owner, blockchain = _a.blockchain; if (!owner) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnregisteredDomain, { domain: domain, }); } if (blockchain === publicTypes_1.BlockchainType.ZIL && !owner.startsWith('zil1')) { return [2 /*return*/, (0, znsUtils_1.toBech32Address)(owner)]; } return [2 /*return*/, owner]; } }); }); }; UdApi.prototype.twitter = function (domain) { return __awaiter(this, void 0, void 0, function () { var serviceName, domainMetaData, owner, records, validationSignature, twitterHandle; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, utils_1.findNamingServiceName)(domain)]; case 1: serviceName = _a.sent(); if (serviceName !== publicTypes_1.NamingServiceName.UNS) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { domain: domain, methodName: 'twitter', }); } return [4 /*yield*/, this.resolve(domain)]; case 2: domainMetaData = _a.sent(); if (!domainMetaData.meta.owner) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnregisteredDomain, { domain: domain, }); } owner = domainMetaData.meta.owner; records = domainMetaData.records || {}; validationSignature = records['validation.social.twitter.username']; twitterHandle = records['social.twitter.username']; if (!validationSignature) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.RecordNotFound, { recordName: 'validation.social.twitter.username', domain: domain, }); } if (!twitterHandle) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.RecordNotFound, { recordName: 'social.twitter.username', domain: domain, }); } if (!(0, TwitterSignatureValidator_1.isValidTwitterSignature)({ tokenId: domainMetaData.meta.namehash, owner: owner, twitterHandle: twitterHandle, validationSignature: validationSignature, })) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.InvalidTwitterVerification, { domain: domain, }); } return [2 /*return*/, twitterHandle]; } }); }); }; UdApi.prototype.getAddress = function (_domain, _network, _token) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { methodName: 'isSupportedDomain', }); }); }); }; UdApi.prototype.allRecords = function (domain) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.resolve(domain)]; case 1: return [2 /*return*/, (_a.sent()).records || {}]; } }); }); }; UdApi.prototype.getDomainFromTokenId = function (tokenId) { return __awaiter(this, void 0, void 0, function () { var metadata; return __generator(this, function (_a) { switch (_a.label) { case 0: tokenId = (0, namehash_1.fromDecStringToHex)(tokenId); return [4 /*yield*/, this.getMetadata(tokenId)]; case 1: metadata = _a.sent(); return [2 /*return*/, metadata.meta.domain]; } }); }); }; UdApi.prototype.getMetadata = function (tokenId) { return __awaiter(this, void 0, void 0, function () { var tokenUri, resp, metadata, namehash; return __generator(this, function (_a) { switch (_a.label) { case 0: tokenUri = "".concat(this.url, "/").concat(tokenId); return [4 /*yield*/, Networking_1.default.fetch(tokenUri).catch(function (err) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.MetadataEndpointError, { tokenUri: tokenUri || 'undefined', errorMessage: err.message, }); })]; case 1: resp = _a.sent(); return [4 /*yield*/, resp.json()]; case 2: metadata = _a.sent(); if (!metadata.meta || !metadata.meta.domain) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnregisteredDomain, { domain: "with tokenId ".concat(tokenId), }); } namehash = metadata.meta.blockchain === publicTypes_1.BlockchainType.ZIL ? (0, namehash_1.znsNamehash)(metadata.meta.domain) : (0, namehash_1.eip137Namehash)(metadata.meta.domain); if (namehash !== tokenId) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.ServiceProviderError, { methodName: 'unhash', domain: metadata.meta.domain, providerMessage: 'Service provider returned an invalid domain name', }); } return [2 /*return*/, metadata]; } }); }); }; UdApi.prototype.resolve = function (domain) { return __awaiter(this, void 0, void 0, function () { var response; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Networking_1.default.fetch("".concat(this.url, "/").concat(domain), { method: 'GET', headers: this.headers, })]; case 1: response = _a.sent(); return [2 /*return*/, response.json()]; } }); }); }; UdApi.prototype.resolver = function (domain) { return __awaiter(this, void 0, void 0, function () { var record; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.resolve(domain)]; case 1: record = _a.sent(); return [2 /*return*/, record.meta.resolver]; } }); }); }; UdApi.prototype.reverse = function (_address, _currencyTicker) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { methodName: 'reverse', }); }); }); }; UdApi.prototype.reverseOf = function (_address, _location) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { methodName: 'reverseOf', }); }); }); }; UdApi.prototype.isRegistered = function (domain) { return __awaiter(this, void 0, void 0, function () { var record; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.resolve(domain)]; case 1: record = _a.sent(); return [2 /*return*/, !(0, utils_1.isNullAddress)(record.meta.owner)]; } }); }); }; UdApi.prototype.getTokenUri = function (_tokenId) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { methodName: 'getTokenUri', }); }); }); }; UdApi.prototype.isAvailable = function (domain) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.isRegistered(domain)]; case 1: return [2 /*return*/, !(_a.sent())]; } }); }); }; UdApi.prototype.registryAddress = function (domain) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { domain: domain, methodName: 'registryAddress', }); }); }); }; UdApi.prototype.locations = function (_domains) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { throw new resolutionError_1.ResolutionError(resolutionError_1.ResolutionErrorCode.UnsupportedMethod, { methodName: 'locations', }); }); }); }; return UdApi; }(NamingService_1.NamingService)); exports.default = UdApi;