whoisens-lib
Version:
Whois for ENS (Ethereum Name Service) lookup service
248 lines • 8.78 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const config_js_1 = __importDefault(require("../config.js"));
const types_js_1 = require("./types.js");
const ENSRoot_js_1 = __importDefault(require("./ENSRoot.js"));
const Registrar_js_1 = __importDefault(require("./Registrar.js"));
const Resolver_js_1 = __importDefault(require("./Resolver.js"));
const ReverseResolver_js_1 = __importDefault(require("./ReverseResolver.js"));
const index_js_1 = __importDefault(require("../utils/index.js"));
const BaseClass_js_1 = __importDefault(require("./BaseClass.js"));
const Config_js_1 = __importDefault(require("./Config.js"));
const debug_1 = __importDefault(require("debug"));
class ENS extends BaseClass_js_1.default {
constructor(params = {}) {
super();
Config_js_1.default.getInstance().currentNetworkURL = params.networkURL || config_js_1.default.networkURL;
Config_js_1.default.getInstance().contractAddress = params.contractAddress;
this.ENSRoot = new ENSRoot_js_1.default();
}
getEthAddressType() {
return this.ethAddressType;
}
/**
* Init with eth address
*
* @fires ENS.EVENT_ETH_NAME
* @fires ENS.EVENT_ETH_NAME_TYPE
*/
init(ethAddress) {
this.ethAddressOriginal = ethAddress;
this.ethAddress = ethAddress;
this.emit(ENS.EVENT_ETH_ADDRESS, this.ethAddress);
this.ethAddressType = index_js_1.default.getAddressType(this.ethAddress);
this.emit(ENS.EVENT_ETH_ADDRESS_TYPE, this.ethAddressType);
if (this.ethAddressType === types_js_1.EthAddressType.error)
throw new types_js_1.InvalidEthNameError(this.ethAddress);
this.ethAddress = index_js_1.default.reverseAddressToHex(this.ethAddress);
}
async getInfo() {
if (!this.ethAddress || !this.ethAddressType)
throw new Error('Please call init before');
let controllerResult;
let ownerResult;
let resolverAddress;
if (this.ethAddressType === types_js_1.EthAddressType.error)
return;
if (this.ethAddressType === types_js_1.EthAddressType.name) {
controllerResult = await this.getController();
if (!index_js_1.default.isResult(controllerResult.result))
return;
ownerResult = await this.getOwner();
if (!ownerResult.result)
return;
await this.getExpirationDate();
resolverAddress = await this.getAddress();
await this.getContentHash();
if (!index_js_1.default.isResult(resolverAddress.result))
return;
this.resolveAddress = resolverAddress.result;
}
await this.getReverseRecord();
}
/**
* Get controller address.
*
* @fires ENS.EVENT_SET_RESPONSE
* @type {object}
* @property resultName {string} controllerResult
*
* @return Promise<Response>
*/
async getController() {
const EVENT_PROPERTY = 'controllerResult';
try {
const controllerResult = await this.ENSRoot.getController(this.ethAddress);
return this.sendResponse(EVENT_PROPERTY, controllerResult);
}
catch (error) {
this.sendError(EVENT_PROPERTY, error);
}
}
/**
* Get Registrar owner.
*
* @fires ENS.EVENT_SET_RESPONSE
* @type {object}
* @property resultName {string} registrarOwnerResult
*
* @return Promise<Response>
*/
async getOwner() {
const EVENT_PROPERTY = 'ownerResult';
try {
await this.initRegistrar();
const registrarOwnerResult = await this.Registrar.getOwner();
return this.sendResponse(EVENT_PROPERTY, registrarOwnerResult);
}
catch (error) {
this.sendError(EVENT_PROPERTY, error);
}
}
/**
* Get name expiration date.
*
* @fires ENS.EVENT_SET_RESPONSE
* @type {object}
* @property resultName {string} nameExpires
*
* @return Promise<Response>
*/
async getExpirationDate() {
const EVENT_PROPERTY = 'expirationDateResult';
try {
await this.initRegistrar();
const nameExpires = await this.Registrar.getExpirationDate();
return this.sendResponse(EVENT_PROPERTY, nameExpires);
}
catch (error) {
this.sendError(EVENT_PROPERTY, error);
}
}
/**
* Get address
*
* @fires ENS.EVENT_SET_RESPONSE
* @type {object}
* @property resultName {string} resolverAddress
*
* @return Promise<Response>
*/
async getAddress() {
const EVENT_PROPERTY = 'addressResult';
try {
if (await this.isNameRegistered()) {
await this.initResolver();
const resolverAddress = await this.Resolver.getAddress();
return this.sendResponse(EVENT_PROPERTY, resolverAddress);
}
else {
this.sendError(EVENT_PROPERTY, new types_js_1.NameIsNotRegisteredError());
}
}
catch (error) {
this.sendError(EVENT_PROPERTY, error);
}
}
/**
* Get content hash
*
* @fires ENS.EVENT_SET_RESPONSE
* @type {object}
* @property resultName {string} resolverContentHash
*
* @return Promise<Response>
*/
async getContentHash() {
const EVENT_PROPERTY = 'contentHashResult';
try {
await this.initResolver();
const resolverContentHash = await this.Resolver.getContentHash();
return this.sendResponse(EVENT_PROPERTY, resolverContentHash);
}
catch (error) {
this.sendError(EVENT_PROPERTY, error);
}
}
/**
* Get reverse record, e.g. name from address
*
* @fires ENS.EVENT_SET_RESPONSE
* @type {object}
* @property resultName {string} revertResolverResult
*
* @return Promise<Response>
*/
async getReverseRecord() {
const EVENT_PROPERTY = 'reverseRecordResult';
try {
const address = this.resolveAddress || this.ethAddress;
this.ReverseResolver = new ReverseResolver_js_1.default(address);
const revertResolverResult = await this.ReverseResolver.getName();
return this.sendResponse(EVENT_PROPERTY, revertResolverResult);
}
catch (error) {
this.sendError(EVENT_PROPERTY, error);
}
}
async resolve() {
if (this.ethAddressType === types_js_1.EthAddressType.name)
return this.getAddress();
if (this.ethAddressType === types_js_1.EthAddressType.address)
return this.getReverseRecord();
}
async initRegistrar() {
if (!this.Registrar)
this.Registrar = new Registrar_js_1.default(this.ethAddress);
}
async initResolver() {
if (!this.Resolver)
this.Resolver = new Resolver_js_1.default(this.ethAddress);
}
async isNameRegistered() {
await this.initRegistrar();
const owner = await this.Registrar.getOwner();
return index_js_1.default.isResult(owner.result);
}
sendResponse(resultName, result) {
result = this.extendResultWithAdditionalInfo(result);
this.emit(ENS.EVENT_SET_RESPONSE, {
resultName,
result
});
return result;
}
sendError(resultName, result) {
debug_1.default('error')(`${resultName}: ${result}`);
this.sendResponse(resultName, result);
throw result;
}
extendResultWithAdditionalInfo(result) {
const outputResult = Object.assign({}, result, { data: Object.assign({}, result.data, { address: this.ethAddress, addressType: this.ethAddressType }) });
const nameMain = this.ethAddressType === types_js_1.EthAddressType.name && index_js_1.default.getNameMain(this.ethAddress);
const address = result.data && result.data.reverseAddress || outputResult.data.address;
const addressParent = address && index_js_1.default.getAddressParent(address);
if (nameMain)
outputResult.data.nameMain = nameMain;
if (addressParent)
outputResult.data.addressParent = addressParent;
return outputResult;
}
}
/**
* @event
*/
ENS.EVENT_ETH_ADDRESS = 'ethAddress';
/**
* @event
*/
ENS.EVENT_ETH_ADDRESS_TYPE = 'ethAddressType';
/**
* @event
*/
ENS.EVENT_SET_RESPONSE = 'setResponse';
exports.default = ENS;
//# sourceMappingURL=ENS.js.map