-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathresolver.js
84 lines (77 loc) · 2.91 KB
/
resolver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const {
getJSONResponse,
getTargetSpec,
getTLDSpec,
getTLD,
connector
} = require("../util");
/**
* Resolves blockchain domains and assets using a root network's chain specification.
*/
class DNSResolver {
/**
* @param {string} rootNetworkSpecUrl - URL of the root network's chain specification.
*/
constructor(rootNetworkSpecUrl) {
this.rootNetworkSpecUrl = rootNetworkSpecUrl;
this.rootSpec = null; // Holds the fetched root network's chain specification
}
/**
* Initializes the resolver by loading the root network's chain specification.
* @returns {Promise<void>}
* @throws {Error} If the root specification cannot be fetched.
*/
async init() {
this.rootSpec = await getJSONResponse(this.rootNetworkSpecUrl);
}
/**
* Resolves details of an asset on a blockchain.
* @param {object} chainSpec - The chain specification of the target network.
* @param {string} assetId - Unique identifier of the asset.
* @returns {Promise<object>} Human-readable asset details.
* @throws {Error} If the asset query or network connection fails.
*/
async resolveAsset(chainSpec, assetId) {
let api = await connector.connectToNetwork(chainSpec);
let asset = await api.query.assetsModule.asset(assetId);
return asset.toHuman();
}
/**
* Resolves a domain to its blockchain network or asset details.
* @param {string} domain - The domain to resolve, optionally including an asset ID.
* @returns {Promise<object>} Resolution result containing asset or target network details.
* @throws {Error} If domain parsing or resolution fails.
*/
async resolve(domain) {
let parsedDomain = this.#parseAssetDomain(domain);
let tld = getTLD(parsedDomain.domain);
let tldSpec = await getTLDSpec(tld, this.rootSpec);
let targetSpec = await getTargetSpec(parsedDomain.domain, tldSpec);
if (parsedDomain.assetId) {
let asset = await this.resolveAsset(targetSpec, parsedDomain.assetId);
return { asset };
} else {
return { targetSpec };
}
}
/**
* Parses a domain string to extract the base domain and optional asset ID.
* @param {string} domain - Domain string in the format "domain.tld/asset/assetId".
* @returns {object} Parsed domain and asset ID (if present).
*/
#parseAssetDomain(domain) {
let domainArr = domain.split('/');
return {
domain: domainArr[0],
assetId: domainArr.length < 3 || domainArr[1] !== 'asset' ? null : domainArr[2]
};
}
}
/**
* Factory function to create a new DNSResolver instance.
* @param {string} rootSpecAddr - URL of the root network's chain specification.
* @returns {DNSResolver} A new DNSResolver instance.
*/
exports.createResolver = (rootSpecAddr) => {
return new DNSResolver(rootSpecAddr);
};