@hashgraphonline/standards-sdk 0.1.160 → 0.1.161
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.
- package/dist/cjs/hcs-14/resolvers/registry.d.ts +18 -1
- package/dist/cjs/hcs-14/resolvers/registry.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/types.d.ts +17 -0
- package/dist/cjs/hcs-14/resolvers/types.d.ts.map +1 -1
- package/dist/cjs/hcs-14/sdk.d.ts +24 -13
- package/dist/cjs/hcs-14/sdk.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +3 -3
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/hcs-14/resolvers/registry.d.ts +18 -1
- package/dist/es/hcs-14/resolvers/registry.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/types.d.ts +17 -0
- package/dist/es/hcs-14/resolvers/types.d.ts.map +1 -1
- package/dist/es/hcs-14/sdk.d.ts +24 -13
- package/dist/es/hcs-14/sdk.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +94 -90
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es100.js +138 -42
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +43 -259
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +245 -82
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +50 -49
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +100 -29
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +27 -229
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +228 -109
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +94 -15
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +30 -80
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +80 -27
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +27 -248
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +246 -472
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +458 -85
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +96 -151
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +155 -29
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +26 -4
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +10 -140
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +140 -27
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +27 -20
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +18 -156
- package/dist/es/standards-sdk.es119.js.map +1 -1
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +148 -191
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +160 -747
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +786 -9
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +13 -567
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +541 -576
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +601 -12
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +13 -2
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +2 -87
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +84 -37
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +40 -2
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es130.js +2 -235
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +204 -1109
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +1059 -225
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +303 -419
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +418 -351
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +347 -1108
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +1088 -180
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +153 -1512
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +1567 -1255
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +1255 -17
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es140.js +15 -85
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +77 -71
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +79 -891
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +886 -53
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +53 -152
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +159 -7
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +7 -86
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +65 -44
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +65 -30
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +30 -34
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es15.js +1 -1
- package/dist/es/standards-sdk.es150.js +34 -41
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +45 -138
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +133 -37
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +34 -12474
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +12444 -134
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +13 -318
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +55 -345
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +68 -437
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +71 -321
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +63 -66
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +5 -5
- package/dist/es/standards-sdk.es160.js +168 -13
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +312 -232
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +345 -55
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +437 -68
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +321 -71
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +66 -63
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +220 -150
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +152 -202
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +206 -223
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +227 -107
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +98 -105
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +105 -140
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +140 -164
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +165 -119
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +111 -303
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +297 -225
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +253 -110
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +119 -0
- package/dist/es/standards-sdk.es177.js.map +1 -0
- package/dist/es/standards-sdk.es18.js +12 -12
- package/dist/es/standards-sdk.es19.js +9 -9
- package/dist/es/standards-sdk.es2.js +2 -2
- package/dist/es/standards-sdk.es20.js +1 -1
- package/dist/es/standards-sdk.es21.js +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es23.js +1 -1
- package/dist/es/standards-sdk.es24.js +1 -1
- package/dist/es/standards-sdk.es25.js +1 -1
- package/dist/es/standards-sdk.es26.js +1 -1
- package/dist/es/standards-sdk.es27.js +12 -12
- package/dist/es/standards-sdk.es30.js +2 -2
- package/dist/es/standards-sdk.es31.js +4 -4
- package/dist/es/standards-sdk.es32.js +1 -1
- package/dist/es/standards-sdk.es35.js +6 -6
- package/dist/es/standards-sdk.es36.js +4 -4
- package/dist/es/standards-sdk.es37.js +2 -2
- package/dist/es/standards-sdk.es38.js +2 -2
- package/dist/es/standards-sdk.es39.js +1 -1
- package/dist/es/standards-sdk.es4.js +2 -2
- package/dist/es/standards-sdk.es40.js +1 -1
- package/dist/es/standards-sdk.es41.js +2 -2
- package/dist/es/standards-sdk.es46.js +1 -1
- package/dist/es/standards-sdk.es5.js +2 -2
- package/dist/es/standards-sdk.es51.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +2 -2
- package/dist/es/standards-sdk.es58.js +11 -236
- package/dist/es/standards-sdk.es58.js.map +1 -1
- package/dist/es/standards-sdk.es59.js +321 -35
- package/dist/es/standards-sdk.es59.js.map +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es60.js +32 -101
- package/dist/es/standards-sdk.es60.js.map +1 -1
- package/dist/es/standards-sdk.es61.js +86 -156
- package/dist/es/standards-sdk.es61.js.map +1 -1
- package/dist/es/standards-sdk.es62.js +112 -153
- package/dist/es/standards-sdk.es62.js.map +1 -1
- package/dist/es/standards-sdk.es63.js +179 -87
- package/dist/es/standards-sdk.es63.js.map +1 -1
- package/dist/es/standards-sdk.es64.js +124 -40
- package/dist/es/standards-sdk.es64.js.map +1 -1
- package/dist/es/standards-sdk.es65.js +41 -251
- package/dist/es/standards-sdk.es65.js.map +1 -1
- package/dist/es/standards-sdk.es66.js +257 -24
- package/dist/es/standards-sdk.es66.js.map +1 -1
- package/dist/es/standards-sdk.es67.js +25 -87
- package/dist/es/standards-sdk.es67.js.map +1 -1
- package/dist/es/standards-sdk.es68.js +95 -3
- package/dist/es/standards-sdk.es68.js.map +1 -1
- package/dist/es/standards-sdk.es69.js +3 -100
- package/dist/es/standards-sdk.es69.js.map +1 -1
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es70.js +62 -61
- package/dist/es/standards-sdk.es70.js.map +1 -1
- package/dist/es/standards-sdk.es71.js +98 -17
- package/dist/es/standards-sdk.es71.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +19 -77
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es73.js +77 -458
- package/dist/es/standards-sdk.es73.js.map +1 -1
- package/dist/es/standards-sdk.es74.js +240 -106
- package/dist/es/standards-sdk.es74.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +286 -170
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es76.js +207 -71
- package/dist/es/standards-sdk.es76.js.map +1 -1
- package/dist/es/standards-sdk.es77.js +72 -71
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +71 -143
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +136 -62
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es80.js +45 -380
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +130 -222
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +444 -313
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +364 -88
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +89 -125
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +125 -8
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +6 -45
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +44 -98
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +84 -331
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +160 -93
- package/dist/es/standards-sdk.es89.js.map +1 -1
- package/dist/es/standards-sdk.es9.js +2 -2
- package/dist/es/standards-sdk.es90.js +275 -55
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +55 -43
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +44 -145
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +113 -30
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +59 -22
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +28 -23
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +23 -238
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +225 -267
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +220 -95
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +136 -124
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/package.json +4 -1
|
@@ -1,185 +1,115 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
details
|
|
9
|
-
};
|
|
10
|
-
return {
|
|
11
|
-
id: uaid,
|
|
12
|
-
error,
|
|
13
|
-
metadata: {
|
|
14
|
-
profile: AID_DNS_WEB_PROFILE_ID,
|
|
15
|
-
resolved: false
|
|
16
|
-
}
|
|
17
|
-
};
|
|
1
|
+
import { HCS11Client } from "./standards-sdk.es27.js";
|
|
2
|
+
import { parseHederaCaip10 } from "./standards-sdk.es57.js";
|
|
3
|
+
function toHcs11Network(network) {
|
|
4
|
+
if (network === "mainnet" || network === "testnet") {
|
|
5
|
+
return network;
|
|
6
|
+
}
|
|
7
|
+
return null;
|
|
18
8
|
}
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
9
|
+
function parseNativeIdNetworkAndAccount(nativeId) {
|
|
10
|
+
try {
|
|
11
|
+
const parsed = parseHederaCaip10(nativeId);
|
|
12
|
+
const network = toHcs11Network(parsed.network);
|
|
13
|
+
if (!network) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return { network, accountId: parsed.accountId };
|
|
17
|
+
} catch (_error) {
|
|
18
|
+
return null;
|
|
26
19
|
}
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
}
|
|
21
|
+
function getDidNetworkAndAccount(did, context) {
|
|
22
|
+
const nativeId = context?.parsedUaid?.params["nativeId"];
|
|
23
|
+
if (nativeId) {
|
|
24
|
+
const resolvedNativeId = parseNativeIdNetworkAndAccount(nativeId);
|
|
25
|
+
if (resolvedNativeId) {
|
|
26
|
+
return resolvedNativeId;
|
|
27
|
+
}
|
|
29
28
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
} catch {
|
|
34
|
-
return { code: "ERR_ENDPOINT_INVALID" };
|
|
29
|
+
const didMatch = did.match(/^did:hedera:(mainnet|testnet):(.+)$/);
|
|
30
|
+
if (!didMatch) {
|
|
31
|
+
return null;
|
|
35
32
|
}
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
38
|
-
return
|
|
33
|
+
const network = toHcs11Network(didMatch[1]);
|
|
34
|
+
if (!network) {
|
|
35
|
+
return null;
|
|
39
36
|
}
|
|
40
37
|
return {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
protocol,
|
|
44
|
-
endpoint: parsedUrl.toString(),
|
|
45
|
-
publicKey: fields["k"],
|
|
46
|
-
keyId: fields["i"]
|
|
47
|
-
}
|
|
38
|
+
network,
|
|
39
|
+
accountId: didMatch[2]
|
|
48
40
|
};
|
|
49
41
|
}
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
function verificationMethodForLevel(verificationLevel) {
|
|
54
|
-
if (verificationLevel === "cryptographic") {
|
|
55
|
-
return "aid-pka";
|
|
56
|
-
}
|
|
57
|
-
if (verificationLevel === "metadata") {
|
|
58
|
-
return "metadata-match";
|
|
42
|
+
function buildHcs10Service(id, network, accountId, topicInfo) {
|
|
43
|
+
if (!topicInfo) {
|
|
44
|
+
return null;
|
|
59
45
|
}
|
|
60
|
-
return
|
|
46
|
+
return {
|
|
47
|
+
id: `${id}#hcs10`,
|
|
48
|
+
type: "HCS10Service",
|
|
49
|
+
serviceEndpoint: {
|
|
50
|
+
network,
|
|
51
|
+
accountId,
|
|
52
|
+
inboundTopicId: topicInfo.inboundTopic || void 0,
|
|
53
|
+
outboundTopicId: topicInfo.outboundTopic || void 0,
|
|
54
|
+
profileTopicId: topicInfo.profileTopicId || void 0
|
|
55
|
+
}
|
|
56
|
+
};
|
|
61
57
|
}
|
|
62
|
-
class
|
|
63
|
-
constructor(
|
|
64
|
-
this.profile = AID_DNS_WEB_PROFILE_ID;
|
|
58
|
+
class HCS11ProfileResolver {
|
|
59
|
+
constructor() {
|
|
65
60
|
this.meta = {
|
|
66
|
-
id: "
|
|
67
|
-
didMethods: ["
|
|
68
|
-
|
|
69
|
-
|
|
61
|
+
id: "hedera/hcs11-profile-resolver",
|
|
62
|
+
didMethods: ["hedera"],
|
|
63
|
+
caip2Networks: ["hedera:mainnet", "hedera:testnet"],
|
|
64
|
+
caip10Namespaces: ["hedera"],
|
|
65
|
+
displayName: "Hedera (HCS-11 Profile Resolver)",
|
|
66
|
+
description: "Resolves HCS-11 protocol profiles and HCS-10 service metadata for did:hedera identifiers."
|
|
70
67
|
};
|
|
71
|
-
this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;
|
|
72
|
-
this.supportedSchemes = new Set(
|
|
73
|
-
(options.supportedUriSchemes ?? ["https", "http", "wss", "ws"]).map(
|
|
74
|
-
(scheme) => scheme.toLowerCase()
|
|
75
|
-
)
|
|
76
|
-
);
|
|
77
|
-
this.metadataVerifier = options.metadataVerifier;
|
|
78
|
-
this.cryptographicVerifier = options.cryptographicVerifier;
|
|
79
68
|
}
|
|
80
|
-
supports(
|
|
81
|
-
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
const nativeId = parsed.params["nativeId"];
|
|
85
|
-
return !!nativeId && isFqdn(nativeId);
|
|
69
|
+
supports(did) {
|
|
70
|
+
return /^did:hedera:(mainnet|testnet):/.test(did);
|
|
86
71
|
}
|
|
87
|
-
async resolveProfile(
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
const nativeId = parsed.params["nativeId"];
|
|
93
|
-
if (!nativeId || !isFqdn(nativeId)) {
|
|
72
|
+
async resolveProfile(did, context) {
|
|
73
|
+
const networkAndAccount = getDidNetworkAndAccount(did, context);
|
|
74
|
+
if (!networkAndAccount) {
|
|
94
75
|
return null;
|
|
95
76
|
}
|
|
96
|
-
const
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
77
|
+
const { network, accountId } = networkAndAccount;
|
|
78
|
+
const client = new HCS11Client({
|
|
79
|
+
network,
|
|
80
|
+
auth: { operatorId: accountId },
|
|
81
|
+
silent: true
|
|
82
|
+
});
|
|
83
|
+
const fetched = await client.fetchProfileByAccountId(accountId, network);
|
|
84
|
+
if (!fetched.success || !fetched.profile) {
|
|
100
85
|
return null;
|
|
101
86
|
}
|
|
102
|
-
const
|
|
103
|
-
|
|
87
|
+
const subjectId = context?.uaid ?? did;
|
|
88
|
+
const existingServices = context?.didDocument?.service ?? [];
|
|
89
|
+
const hcs10Service = buildHcs10Service(
|
|
90
|
+
subjectId,
|
|
91
|
+
network,
|
|
92
|
+
accountId,
|
|
93
|
+
fetched.topicInfo
|
|
104
94
|
);
|
|
105
|
-
const
|
|
106
|
-
(result) => "record" in result
|
|
107
|
-
).map((result) => result.record);
|
|
108
|
-
if (validRecords.length === 0) {
|
|
109
|
-
const endpointInvalid = parsedRecords.some(
|
|
110
|
-
(result) => !("record" in result) && result.code === "ERR_ENDPOINT_INVALID"
|
|
111
|
-
);
|
|
112
|
-
return buildErrorProfile(
|
|
113
|
-
uaid,
|
|
114
|
-
endpointInvalid ? "ERR_ENDPOINT_INVALID" : "ERR_INVALID_AID_RECORD",
|
|
115
|
-
endpointInvalid ? "AID DNS record endpoint URI is invalid or unsupported." : "AID DNS TXT payload is malformed or unsupported.",
|
|
116
|
-
{ dnsName }
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
const selectedRecord = [...validRecords].sort(
|
|
120
|
-
(a, b) => deterministicRecordKey(a).localeCompare(deterministicRecordKey(b))
|
|
121
|
-
)[0];
|
|
122
|
-
const verificationInput = {
|
|
123
|
-
uaid,
|
|
124
|
-
protocol: selectedRecord.protocol,
|
|
125
|
-
endpoint: selectedRecord.endpoint,
|
|
126
|
-
record: selectedRecord
|
|
127
|
-
};
|
|
128
|
-
let verificationLevel = "none";
|
|
129
|
-
if (this.metadataVerifier) {
|
|
130
|
-
const metadataVerified = await this.metadataVerifier(verificationInput);
|
|
131
|
-
if (!metadataVerified) {
|
|
132
|
-
return buildErrorProfile(
|
|
133
|
-
uaid,
|
|
134
|
-
"ERR_VERIFICATION_FAILED",
|
|
135
|
-
"AID metadata verification failed.",
|
|
136
|
-
{ dnsName }
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
verificationLevel = "metadata";
|
|
140
|
-
}
|
|
141
|
-
if (selectedRecord.publicKey && this.cryptographicVerifier) {
|
|
142
|
-
const cryptographicVerified = await this.cryptographicVerifier(verificationInput);
|
|
143
|
-
if (!cryptographicVerified) {
|
|
144
|
-
return buildErrorProfile(
|
|
145
|
-
uaid,
|
|
146
|
-
"ERR_VERIFICATION_FAILED",
|
|
147
|
-
"AID cryptographic verification failed.",
|
|
148
|
-
{ dnsName }
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
verificationLevel = "cryptographic";
|
|
152
|
-
}
|
|
153
|
-
const did = context.did ?? void 0;
|
|
154
|
-
const alsoKnownAs = did ? [did] : void 0;
|
|
95
|
+
const service = hcs10Service ? [...existingServices, hcs10Service] : existingServices;
|
|
155
96
|
return {
|
|
156
|
-
id:
|
|
97
|
+
id: subjectId,
|
|
157
98
|
did,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
{
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
99
|
+
service: service.length > 0 ? service : void 0,
|
|
100
|
+
profiles: {
|
|
101
|
+
hcs11: {
|
|
102
|
+
protocol: "hcs-11",
|
|
103
|
+
network,
|
|
104
|
+
accountId,
|
|
105
|
+
profile: fetched.profile,
|
|
106
|
+
topicInfo: fetched.topicInfo
|
|
164
107
|
}
|
|
165
|
-
],
|
|
166
|
-
metadata: {
|
|
167
|
-
profile: AID_DNS_WEB_PROFILE_ID,
|
|
168
|
-
resolved: true,
|
|
169
|
-
endpoint: selectedRecord.endpoint,
|
|
170
|
-
protocol: selectedRecord.protocol,
|
|
171
|
-
verification: {
|
|
172
|
-
level: verificationLevel,
|
|
173
|
-
method: verificationMethodForLevel(verificationLevel)
|
|
174
|
-
},
|
|
175
|
-
verificationLevel,
|
|
176
|
-
precedenceSource: "dns"
|
|
177
108
|
}
|
|
178
109
|
};
|
|
179
110
|
}
|
|
180
111
|
}
|
|
181
112
|
export {
|
|
182
|
-
|
|
183
|
-
AidDnsWebProfileResolver
|
|
113
|
+
HCS11ProfileResolver
|
|
184
114
|
};
|
|
185
115
|
//# sourceMappingURL=standards-sdk.es61.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es61.js","sources":["../../src/hcs-14/resolvers/aid-dns-web-profile.ts"],"sourcesContent":["import type {\n DidResolutionProfile,\n ProfileResolutionError,\n UaidProfileResolver,\n UaidProfileResolverContext,\n} from './types';\nimport type { AdapterMeta } from '../adapters/types';\nimport { nodeDnsTxtLookup, type DnsTxtLookup } from './dns';\nimport { isFqdn, normalizeDomain, parseSemicolonFields } from './profile-utils';\n\nexport const AID_DNS_WEB_PROFILE_ID = 'hcs-14.profile.aid-dns-web';\n\ninterface AidDnsRecord {\n version: string;\n protocol: string;\n endpoint: string;\n publicKey?: string;\n keyId?: string;\n}\n\ninterface AidDnsRecordParseError {\n code: 'ERR_INVALID_AID_RECORD' | 'ERR_ENDPOINT_INVALID';\n}\n\ninterface AidDnsRecordParseSuccess {\n record: AidDnsRecord;\n}\n\ntype AidDnsRecordParseResult =\n | AidDnsRecordParseError\n | AidDnsRecordParseSuccess;\n\ninterface AidDnsVerificationInput {\n uaid: string;\n protocol: string;\n endpoint: string;\n record: AidDnsRecord;\n}\n\ntype AidDnsVerification = (input: AidDnsVerificationInput) => Promise<boolean>;\n\nexport interface AidDnsWebResolverOptions {\n dnsLookup?: DnsTxtLookup;\n supportedUriSchemes?: string[];\n metadataVerifier?: AidDnsVerification;\n cryptographicVerifier?: AidDnsVerification;\n}\n\nfunction buildErrorProfile(\n uaid: string,\n code: string,\n message: string,\n details?: Record<string, unknown>,\n): DidResolutionProfile {\n const error: ProfileResolutionError = {\n code,\n message,\n details,\n };\n\n return {\n id: uaid,\n error,\n metadata: {\n profile: AID_DNS_WEB_PROFILE_ID,\n resolved: false,\n },\n };\n}\n\nfunction parseRecord(\n rawRecord: string,\n supportedSchemes: Set<string>,\n): AidDnsRecordParseResult {\n const fields = parseSemicolonFields(rawRecord);\n const version = fields['v'];\n const protocol = fields['p'] ?? fields['proto'];\n const endpoint = fields['u'];\n\n if (!version || !protocol || !endpoint) {\n return { code: 'ERR_INVALID_AID_RECORD' };\n }\n if (!version.toLowerCase().startsWith('aid')) {\n return { code: 'ERR_INVALID_AID_RECORD' };\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(endpoint);\n } catch {\n return { code: 'ERR_ENDPOINT_INVALID' };\n }\n\n const scheme = parsedUrl.protocol.replace(/:$/, '').toLowerCase();\n if (!supportedSchemes.has(scheme)) {\n return { code: 'ERR_ENDPOINT_INVALID' };\n }\n\n return {\n record: {\n version,\n protocol,\n endpoint: parsedUrl.toString(),\n publicKey: fields['k'],\n keyId: fields['i'],\n },\n };\n}\n\nfunction deterministicRecordKey(record: AidDnsRecord): string {\n return `${record.protocol}|${record.endpoint}|${record.publicKey ?? ''}|${record.keyId ?? ''}`;\n}\n\nfunction verificationMethodForLevel(\n verificationLevel: 'none' | 'metadata' | 'cryptographic',\n): 'aid-pka' | 'metadata-match' | undefined {\n if (verificationLevel === 'cryptographic') {\n return 'aid-pka';\n }\n if (verificationLevel === 'metadata') {\n return 'metadata-match';\n }\n return undefined;\n}\n\nexport class AidDnsWebProfileResolver implements UaidProfileResolver {\n readonly profile = AID_DNS_WEB_PROFILE_ID;\n\n readonly meta: AdapterMeta = {\n id: 'hcs-14/aid-dns-web',\n didMethods: ['*'],\n displayName: 'HCS-14 AID DNS/Web Profile',\n description:\n 'Resolves uaid:aid identifiers via _agent.<nativeId> DNS TXT records and protocol endpoint hints.',\n };\n\n private readonly dnsLookup: DnsTxtLookup;\n private readonly supportedSchemes: Set<string>;\n private readonly metadataVerifier?: AidDnsVerification;\n private readonly cryptographicVerifier?: AidDnsVerification;\n\n constructor(options: AidDnsWebResolverOptions = {}) {\n this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;\n this.supportedSchemes = new Set(\n (options.supportedUriSchemes ?? ['https', 'http', 'wss', 'ws']).map(\n scheme => scheme.toLowerCase(),\n ),\n );\n this.metadataVerifier = options.metadataVerifier;\n this.cryptographicVerifier = options.cryptographicVerifier;\n }\n\n supports(\n _uaid: string,\n parsed: UaidProfileResolverContext['parsedUaid'],\n ): boolean {\n if (parsed.method !== 'aid') {\n return false;\n }\n const nativeId = parsed.params['nativeId'];\n return !!nativeId && isFqdn(nativeId);\n }\n\n async resolveProfile(\n uaid: string,\n context: UaidProfileResolverContext,\n ): Promise<DidResolutionProfile | null> {\n const parsed = context.parsedUaid;\n if (parsed.method !== 'aid') {\n return null;\n }\n\n const nativeId = parsed.params['nativeId'];\n if (!nativeId || !isFqdn(nativeId)) {\n return null;\n }\n\n const normalizedNativeId = normalizeDomain(nativeId);\n const dnsName = `_agent.${normalizedNativeId}`;\n const txtRecords = await this.dnsLookup(dnsName);\n if (txtRecords.length === 0) {\n return null;\n }\n\n const parsedRecords = txtRecords.map(record =>\n parseRecord(record, this.supportedSchemes),\n );\n const validRecords = parsedRecords\n .filter(\n (result): result is AidDnsRecordParseSuccess => 'record' in result,\n )\n .map(result => result.record);\n\n if (validRecords.length === 0) {\n const endpointInvalid = parsedRecords.some(\n result =>\n !('record' in result) && result.code === 'ERR_ENDPOINT_INVALID',\n );\n return buildErrorProfile(\n uaid,\n endpointInvalid ? 'ERR_ENDPOINT_INVALID' : 'ERR_INVALID_AID_RECORD',\n endpointInvalid\n ? 'AID DNS record endpoint URI is invalid or unsupported.'\n : 'AID DNS TXT payload is malformed or unsupported.',\n { dnsName },\n );\n }\n\n const selectedRecord = [...validRecords].sort((a, b) =>\n deterministicRecordKey(a).localeCompare(deterministicRecordKey(b)),\n )[0];\n\n const verificationInput: AidDnsVerificationInput = {\n uaid,\n protocol: selectedRecord.protocol,\n endpoint: selectedRecord.endpoint,\n record: selectedRecord,\n };\n\n let verificationLevel: 'none' | 'metadata' | 'cryptographic' = 'none';\n\n if (this.metadataVerifier) {\n const metadataVerified = await this.metadataVerifier(verificationInput);\n if (!metadataVerified) {\n return buildErrorProfile(\n uaid,\n 'ERR_VERIFICATION_FAILED',\n 'AID metadata verification failed.',\n { dnsName },\n );\n }\n verificationLevel = 'metadata';\n }\n\n if (selectedRecord.publicKey && this.cryptographicVerifier) {\n const cryptographicVerified =\n await this.cryptographicVerifier(verificationInput);\n if (!cryptographicVerified) {\n return buildErrorProfile(\n uaid,\n 'ERR_VERIFICATION_FAILED',\n 'AID cryptographic verification failed.',\n { dnsName },\n );\n }\n verificationLevel = 'cryptographic';\n }\n\n const did = context.did ?? undefined;\n const alsoKnownAs = did ? [did] : undefined;\n\n return {\n id: uaid,\n did,\n alsoKnownAs,\n service: [\n {\n id: `${uaid}#aid-endpoint`,\n type: 'AIDService',\n serviceEndpoint: selectedRecord.endpoint,\n },\n ],\n metadata: {\n profile: AID_DNS_WEB_PROFILE_ID,\n resolved: true,\n endpoint: selectedRecord.endpoint,\n protocol: selectedRecord.protocol,\n verification: {\n level: verificationLevel,\n method: verificationMethodForLevel(verificationLevel),\n },\n verificationLevel,\n precedenceSource: 'dns',\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es61.js","sources":["../../src/hcs-14/resolvers/hcs-11-profile.ts"],"sourcesContent":["import { HCS11Client } from '../../hcs-11/client';\nimport { parseHederaCaip10 } from '../caip';\nimport type {\n DidProfileResolver,\n DidProfileResolverContext,\n DidResolutionProfile,\n DidService,\n} from './types';\nimport type { AdapterMeta } from '../adapters/types';\n\ntype Hcs11Network = 'mainnet' | 'testnet';\n\nfunction toHcs11Network(network: string): Hcs11Network | null {\n if (network === 'mainnet' || network === 'testnet') {\n return network;\n }\n return null;\n}\n\nfunction parseNativeIdNetworkAndAccount(\n nativeId: string,\n): { network: Hcs11Network; accountId: string } | null {\n try {\n const parsed = parseHederaCaip10(nativeId);\n const network = toHcs11Network(parsed.network);\n if (!network) {\n return null;\n }\n return { network, accountId: parsed.accountId };\n } catch (_error) {\n return null;\n }\n}\n\nfunction getDidNetworkAndAccount(\n did: string,\n context?: DidProfileResolverContext,\n): { network: Hcs11Network; accountId: string } | null {\n const nativeId = context?.parsedUaid?.params['nativeId'];\n if (nativeId) {\n const resolvedNativeId = parseNativeIdNetworkAndAccount(nativeId);\n if (resolvedNativeId) {\n return resolvedNativeId;\n }\n }\n\n const didMatch = did.match(/^did:hedera:(mainnet|testnet):(.+)$/);\n if (!didMatch) {\n return null;\n }\n\n const network = toHcs11Network(didMatch[1]);\n if (!network) {\n return null;\n }\n\n return {\n network,\n accountId: didMatch[2],\n };\n}\n\nfunction buildHcs10Service(\n id: string,\n network: Hcs11Network,\n accountId: string,\n topicInfo?: {\n inboundTopic: string;\n outboundTopic: string;\n profileTopicId: string;\n },\n): DidService | null {\n if (!topicInfo) {\n return null;\n }\n\n return {\n id: `${id}#hcs10`,\n type: 'HCS10Service',\n serviceEndpoint: {\n network,\n accountId,\n inboundTopicId: topicInfo.inboundTopic || undefined,\n outboundTopicId: topicInfo.outboundTopic || undefined,\n profileTopicId: topicInfo.profileTopicId || undefined,\n },\n };\n}\n\nexport class HCS11ProfileResolver implements DidProfileResolver {\n readonly meta: AdapterMeta = {\n id: 'hedera/hcs11-profile-resolver',\n didMethods: ['hedera'],\n caip2Networks: ['hedera:mainnet', 'hedera:testnet'],\n caip10Namespaces: ['hedera'],\n displayName: 'Hedera (HCS-11 Profile Resolver)',\n description:\n 'Resolves HCS-11 protocol profiles and HCS-10 service metadata for did:hedera identifiers.',\n };\n\n supports(did: string): boolean {\n return /^did:hedera:(mainnet|testnet):/.test(did);\n }\n\n async resolveProfile(\n did: string,\n context?: DidProfileResolverContext,\n ): Promise<DidResolutionProfile | null> {\n const networkAndAccount = getDidNetworkAndAccount(did, context);\n if (!networkAndAccount) {\n return null;\n }\n\n const { network, accountId } = networkAndAccount;\n const client = new HCS11Client({\n network,\n auth: { operatorId: accountId },\n silent: true,\n });\n const fetched = await client.fetchProfileByAccountId(accountId, network);\n if (!fetched.success || !fetched.profile) {\n return null;\n }\n\n const subjectId = context?.uaid ?? did;\n const existingServices = context?.didDocument?.service ?? [];\n const hcs10Service = buildHcs10Service(\n subjectId,\n network,\n accountId,\n fetched.topicInfo,\n );\n const service = hcs10Service\n ? [...existingServices, hcs10Service]\n : existingServices;\n\n return {\n id: subjectId,\n did,\n service: service.length > 0 ? service : undefined,\n profiles: {\n hcs11: {\n protocol: 'hcs-11',\n network,\n accountId,\n profile: fetched.profile,\n topicInfo: fetched.topicInfo,\n },\n },\n };\n }\n}\n"],"names":[],"mappings":";;AAYA,SAAS,eAAe,SAAsC;AAC5D,MAAI,YAAY,aAAa,YAAY,WAAW;AAClD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,+BACP,UACqD;AACrD,MAAI;AACF,UAAM,SAAS,kBAAkB,QAAQ;AACzC,UAAM,UAAU,eAAe,OAAO,OAAO;AAC7C,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO,EAAE,SAAS,WAAW,OAAO,UAAA;AAAA,EACtC,SAAS,QAAQ;AACf,WAAO;AAAA,EACT;AACF;AAEA,SAAS,wBACP,KACA,SACqD;AACrD,QAAM,WAAW,SAAS,YAAY,OAAO,UAAU;AACvD,MAAI,UAAU;AACZ,UAAM,mBAAmB,+BAA+B,QAAQ;AAChE,QAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,MAAM,qCAAqC;AAChE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe,SAAS,CAAC,CAAC;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW,SAAS,CAAC;AAAA,EAAA;AAEzB;AAEA,SAAS,kBACP,IACA,SACA,WACA,WAKmB;AACnB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,GAAG,EAAE;AAAA,IACT,MAAM;AAAA,IACN,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA,gBAAgB,UAAU,gBAAgB;AAAA,MAC1C,iBAAiB,UAAU,iBAAiB;AAAA,MAC5C,gBAAgB,UAAU,kBAAkB;AAAA,IAAA;AAAA,EAC9C;AAEJ;AAEO,MAAM,qBAAmD;AAAA,EAAzD,cAAA;AACL,SAAS,OAAoB;AAAA,MAC3B,IAAI;AAAA,MACJ,YAAY,CAAC,QAAQ;AAAA,MACrB,eAAe,CAAC,kBAAkB,gBAAgB;AAAA,MAClD,kBAAkB,CAAC,QAAQ;AAAA,MAC3B,aAAa;AAAA,MACb,aACE;AAAA,IAAA;AAAA,EACJ;AAAA,EAEA,SAAS,KAAsB;AAC7B,WAAO,iCAAiC,KAAK,GAAG;AAAA,EAClD;AAAA,EAEA,MAAM,eACJ,KACA,SACsC;AACtC,UAAM,oBAAoB,wBAAwB,KAAK,OAAO;AAC9D,QAAI,CAAC,mBAAmB;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,IAAI,YAAY;AAAA,MAC7B;AAAA,MACA,MAAM,EAAE,YAAY,UAAA;AAAA,MACpB,QAAQ;AAAA,IAAA,CACT;AACD,UAAM,UAAU,MAAM,OAAO,wBAAwB,WAAW,OAAO;AACvE,QAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,SAAS;AACxC,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,SAAS,QAAQ;AACnC,UAAM,mBAAmB,SAAS,aAAa,WAAW,CAAA;AAC1D,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IAAA;AAEV,UAAM,UAAU,eACZ,CAAC,GAAG,kBAAkB,YAAY,IAClC;AAEJ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,SAAS,QAAQ,SAAS,IAAI,UAAU;AAAA,MACxC,UAAU;AAAA,QACR,OAAO;AAAA,UACL,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,QAAA;AAAA,MACrB;AAAA,IACF;AAAA,EAEJ;AACF;"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { nodeDnsTxtLookup } from "./standards-sdk.
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { UAID_DID_RESOLUTION_PROFILE_ID } from "./standards-sdk.es63.js";
|
|
5
|
-
const UAID_DNS_WEB_PROFILE_ID = "hcs-14.profile.uaid-dns-web";
|
|
1
|
+
import { nodeDnsTxtLookup } from "./standards-sdk.es65.js";
|
|
2
|
+
import { isFqdn, normalizeDomain, parseSemicolonFields } from "./standards-sdk.es158.js";
|
|
3
|
+
const AID_DNS_WEB_PROFILE_ID = "hcs-14.profile.aid-dns-web";
|
|
6
4
|
function buildErrorProfile(uaid, code, message, details) {
|
|
7
5
|
const error = {
|
|
8
6
|
code,
|
|
@@ -13,100 +11,74 @@ function buildErrorProfile(uaid, code, message, details) {
|
|
|
13
11
|
id: uaid,
|
|
14
12
|
error,
|
|
15
13
|
metadata: {
|
|
16
|
-
profile:
|
|
14
|
+
profile: AID_DNS_WEB_PROFILE_ID,
|
|
17
15
|
resolved: false
|
|
18
16
|
}
|
|
19
17
|
};
|
|
20
18
|
}
|
|
21
|
-
function
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
function parseRecord(rawRecord, supportedSchemes) {
|
|
20
|
+
const fields = parseSemicolonFields(rawRecord);
|
|
21
|
+
const version = fields["v"];
|
|
22
|
+
const protocol = fields["p"] ?? fields["proto"];
|
|
23
|
+
const endpoint = fields["u"];
|
|
24
|
+
if (!version || !protocol || !endpoint) {
|
|
25
|
+
return { code: "ERR_INVALID_AID_RECORD" };
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
next["domain"] = normalizeDomain(domain);
|
|
27
|
+
if (!version.toLowerCase().startsWith("aid")) {
|
|
28
|
+
return { code: "ERR_INVALID_AID_RECORD" };
|
|
30
29
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const uid = fields["uid"];
|
|
37
|
-
const proto = fields["proto"];
|
|
38
|
-
const nativeId = fields["nativeId"];
|
|
39
|
-
if (target !== "aid" && target !== "did") {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
if (!id || !uid || !proto || !nativeId) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
if (normalizeDomain(nativeId) !== queriedNativeId) {
|
|
46
|
-
return null;
|
|
30
|
+
let parsedUrl;
|
|
31
|
+
try {
|
|
32
|
+
parsedUrl = new URL(endpoint);
|
|
33
|
+
} catch {
|
|
34
|
+
return { code: "ERR_ENDPOINT_INVALID" };
|
|
47
35
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const did = fields["did"];
|
|
52
|
-
if (did && (target !== "did" || !did.startsWith("did:"))) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
const params = {
|
|
56
|
-
uid,
|
|
57
|
-
proto,
|
|
58
|
-
nativeId
|
|
59
|
-
};
|
|
60
|
-
if (fields["registry"]) {
|
|
61
|
-
params["registry"] = fields["registry"];
|
|
62
|
-
}
|
|
63
|
-
if (fields["domain"]) {
|
|
64
|
-
params["domain"] = fields["domain"];
|
|
65
|
-
}
|
|
66
|
-
if (fields["src"]) {
|
|
67
|
-
params["src"] = fields["src"];
|
|
36
|
+
const scheme = parsedUrl.protocol.replace(/:$/, "").toLowerCase();
|
|
37
|
+
if (!supportedSchemes.has(scheme)) {
|
|
38
|
+
return { code: "ERR_ENDPOINT_INVALID" };
|
|
68
39
|
}
|
|
69
40
|
return {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
src: fields["src"],
|
|
78
|
-
did,
|
|
79
|
-
memo: fields["m"],
|
|
80
|
-
reconstructedUaid: buildCanonicalUaid(
|
|
81
|
-
target,
|
|
82
|
-
id,
|
|
83
|
-
canonicalizeNativeDomainParams(params)
|
|
84
|
-
)
|
|
41
|
+
record: {
|
|
42
|
+
version,
|
|
43
|
+
protocol,
|
|
44
|
+
endpoint: parsedUrl.toString(),
|
|
45
|
+
publicKey: fields["k"],
|
|
46
|
+
keyId: fields["i"]
|
|
47
|
+
}
|
|
85
48
|
};
|
|
86
49
|
}
|
|
87
|
-
function
|
|
88
|
-
|
|
89
|
-
|
|
50
|
+
function deterministicRecordKey(record) {
|
|
51
|
+
return `${record.protocol}|${record.endpoint}|${record.publicKey ?? ""}|${record.keyId ?? ""}`;
|
|
52
|
+
}
|
|
53
|
+
function verificationMethodForLevel(verificationLevel) {
|
|
54
|
+
if (verificationLevel === "cryptographic") {
|
|
55
|
+
return "aid-pka";
|
|
56
|
+
}
|
|
57
|
+
if (verificationLevel === "metadata") {
|
|
58
|
+
return "metadata-match";
|
|
90
59
|
}
|
|
91
|
-
return
|
|
60
|
+
return void 0;
|
|
92
61
|
}
|
|
93
|
-
class
|
|
62
|
+
class AidDnsWebProfileResolver {
|
|
94
63
|
constructor(options = {}) {
|
|
95
|
-
this.profile =
|
|
64
|
+
this.profile = AID_DNS_WEB_PROFILE_ID;
|
|
96
65
|
this.meta = {
|
|
97
|
-
id: "hcs-14/
|
|
66
|
+
id: "hcs-14/aid-dns-web",
|
|
98
67
|
didMethods: ["*"],
|
|
99
|
-
displayName: "HCS-14
|
|
100
|
-
description: "
|
|
68
|
+
displayName: "HCS-14 AID DNS/Web Profile",
|
|
69
|
+
description: "Resolves uaid:aid identifiers via _agent.<nativeId> DNS TXT records and protocol endpoint hints."
|
|
101
70
|
};
|
|
102
71
|
this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
72
|
+
this.supportedSchemes = new Set(
|
|
73
|
+
(options.supportedUriSchemes ?? ["https", "http", "wss", "ws"]).map(
|
|
74
|
+
(scheme) => scheme.toLowerCase()
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
this.metadataVerifier = options.metadataVerifier;
|
|
78
|
+
this.cryptographicVerifier = options.cryptographicVerifier;
|
|
106
79
|
}
|
|
107
80
|
supports(_uaid, parsed) {
|
|
108
|
-
|
|
109
|
-
if (target !== "aid" && target !== "did") {
|
|
81
|
+
if (parsed.method !== "aid") {
|
|
110
82
|
return false;
|
|
111
83
|
}
|
|
112
84
|
const nativeId = parsed.params["nativeId"];
|
|
@@ -114,113 +86,100 @@ class UaidDnsWebProfileResolver {
|
|
|
114
86
|
}
|
|
115
87
|
async resolveProfile(uaid, context) {
|
|
116
88
|
const parsed = context.parsedUaid;
|
|
89
|
+
if (parsed.method !== "aid") {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
117
92
|
const nativeId = parsed.params["nativeId"];
|
|
118
93
|
if (!nativeId || !isFqdn(nativeId)) {
|
|
119
94
|
return null;
|
|
120
95
|
}
|
|
121
96
|
const normalizedNativeId = normalizeDomain(nativeId);
|
|
122
|
-
const dnsName = `
|
|
123
|
-
const inputCanonical = buildCanonicalUaid(
|
|
124
|
-
uaidTargetFromParsed(parsed),
|
|
125
|
-
parsed.id,
|
|
126
|
-
canonicalizeNativeDomainParams(parsed.params)
|
|
127
|
-
);
|
|
97
|
+
const dnsName = `_agent.${normalizedNativeId}`;
|
|
128
98
|
const txtRecords = await this.dnsLookup(dnsName);
|
|
129
99
|
if (txtRecords.length === 0) {
|
|
130
100
|
return null;
|
|
131
101
|
}
|
|
132
|
-
const parsedRecords = txtRecords.map(
|
|
133
|
-
|
|
134
|
-
(record) => record !== null
|
|
102
|
+
const parsedRecords = txtRecords.map(
|
|
103
|
+
(record) => parseRecord(record, this.supportedSchemes)
|
|
135
104
|
);
|
|
105
|
+
const validRecords = parsedRecords.filter(
|
|
106
|
+
(result) => "record" in result
|
|
107
|
+
).map((result) => result.record);
|
|
136
108
|
if (validRecords.length === 0) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
"ERR_INVALID_UAID_DNS_RECORD",
|
|
140
|
-
"DNS TXT payload at _uaid record is invalid.",
|
|
141
|
-
{ dnsName }
|
|
109
|
+
const endpointInvalid = parsedRecords.some(
|
|
110
|
+
(result) => !("record" in result) && result.code === "ERR_ENDPOINT_INVALID"
|
|
142
111
|
);
|
|
143
|
-
}
|
|
144
|
-
const matchingRecords = validRecords.filter(
|
|
145
|
-
(record) => record.target === uaidTargetFromParsed(parsed) && record.id === parsed.id && record.reconstructedUaid === inputCanonical
|
|
146
|
-
);
|
|
147
|
-
if (matchingRecords.length === 0) {
|
|
148
112
|
return buildErrorProfile(
|
|
149
113
|
uaid,
|
|
150
|
-
"
|
|
151
|
-
"DNS
|
|
152
|
-
{
|
|
153
|
-
dnsName,
|
|
154
|
-
inputCanonical
|
|
155
|
-
}
|
|
114
|
+
endpointInvalid ? "ERR_ENDPOINT_INVALID" : "ERR_INVALID_AID_RECORD",
|
|
115
|
+
endpointInvalid ? "AID DNS record endpoint URI is invalid or unsupported." : "AID DNS TXT payload is malformed or unsupported.",
|
|
116
|
+
{ dnsName }
|
|
156
117
|
);
|
|
157
118
|
}
|
|
158
|
-
const
|
|
159
|
-
(a, b) => a.
|
|
119
|
+
const selectedRecord = [...validRecords].sort(
|
|
120
|
+
(a, b) => deterministicRecordKey(a).localeCompare(deterministicRecordKey(b))
|
|
160
121
|
)[0];
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
122
|
+
const verificationInput = {
|
|
123
|
+
uaid,
|
|
124
|
+
protocol: selectedRecord.protocol,
|
|
125
|
+
endpoint: selectedRecord.endpoint,
|
|
126
|
+
record: selectedRecord
|
|
127
|
+
};
|
|
128
|
+
let verificationLevel = "none";
|
|
129
|
+
if (this.metadataVerifier) {
|
|
130
|
+
const metadataVerified = await this.metadataVerifier(verificationInput);
|
|
131
|
+
if (!metadataVerified) {
|
|
132
|
+
return buildErrorProfile(
|
|
133
|
+
uaid,
|
|
134
|
+
"ERR_VERIFICATION_FAILED",
|
|
135
|
+
"AID metadata verification failed.",
|
|
136
|
+
{ dnsName }
|
|
169
137
|
);
|
|
170
|
-
if (!followup) {
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (followup.error || followup.metadata?.resolved === false) {
|
|
174
|
-
return buildErrorProfile(
|
|
175
|
-
uaid,
|
|
176
|
-
"ERR_FOLLOWUP_RESOLUTION_FAILED",
|
|
177
|
-
"Follow-up profile resolution failed after successful DNS binding.",
|
|
178
|
-
{
|
|
179
|
-
followupProfileId,
|
|
180
|
-
dnsName
|
|
181
|
-
}
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
return {
|
|
185
|
-
...followup,
|
|
186
|
-
metadata: {
|
|
187
|
-
...followup.metadata,
|
|
188
|
-
profile: UAID_DNS_WEB_PROFILE_ID,
|
|
189
|
-
resolved: true,
|
|
190
|
-
verificationLevel,
|
|
191
|
-
reconstructedUaid: selected.reconstructedUaid,
|
|
192
|
-
selectedFollowupProfile: followupProfileId,
|
|
193
|
-
resolutionMode: "full-resolution"
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
138
|
}
|
|
139
|
+
verificationLevel = "metadata";
|
|
197
140
|
}
|
|
198
|
-
if (this.
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
141
|
+
if (selectedRecord.publicKey && this.cryptographicVerifier) {
|
|
142
|
+
const cryptographicVerified = await this.cryptographicVerifier(verificationInput);
|
|
143
|
+
if (!cryptographicVerified) {
|
|
144
|
+
return buildErrorProfile(
|
|
145
|
+
uaid,
|
|
146
|
+
"ERR_VERIFICATION_FAILED",
|
|
147
|
+
"AID cryptographic verification failed.",
|
|
148
|
+
{ dnsName }
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
verificationLevel = "cryptographic";
|
|
205
152
|
}
|
|
206
|
-
const did =
|
|
153
|
+
const did = context.did ?? void 0;
|
|
207
154
|
const alsoKnownAs = did ? [did] : void 0;
|
|
208
155
|
return {
|
|
209
156
|
id: uaid,
|
|
210
157
|
did,
|
|
211
158
|
alsoKnownAs,
|
|
159
|
+
service: [
|
|
160
|
+
{
|
|
161
|
+
id: `${uaid}#aid-endpoint`,
|
|
162
|
+
type: "AIDService",
|
|
163
|
+
serviceEndpoint: selectedRecord.endpoint
|
|
164
|
+
}
|
|
165
|
+
],
|
|
212
166
|
metadata: {
|
|
213
|
-
profile:
|
|
167
|
+
profile: AID_DNS_WEB_PROFILE_ID,
|
|
214
168
|
resolved: true,
|
|
215
|
-
|
|
169
|
+
endpoint: selectedRecord.endpoint,
|
|
170
|
+
protocol: selectedRecord.protocol,
|
|
171
|
+
verification: {
|
|
172
|
+
level: verificationLevel,
|
|
173
|
+
method: verificationMethodForLevel(verificationLevel)
|
|
174
|
+
},
|
|
216
175
|
verificationLevel,
|
|
217
|
-
|
|
176
|
+
precedenceSource: "dns"
|
|
218
177
|
}
|
|
219
178
|
};
|
|
220
179
|
}
|
|
221
180
|
}
|
|
222
181
|
export {
|
|
223
|
-
|
|
224
|
-
|
|
182
|
+
AID_DNS_WEB_PROFILE_ID,
|
|
183
|
+
AidDnsWebProfileResolver
|
|
225
184
|
};
|
|
226
185
|
//# sourceMappingURL=standards-sdk.es62.js.map
|