@hashgraphonline/standards-sdk 0.1.158 → 0.1.160
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-12/validation/schemas.d.ts +4 -4
- package/dist/cjs/hcs-14/index.d.ts +5 -0
- package/dist/cjs/hcs-14/index.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts +37 -0
- package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/dns.d.ts +3 -0
- package/dist/cjs/hcs-14/resolvers/dns.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts +8 -0
- package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/profile-utils.d.ts +9 -0
- package/dist/cjs/hcs-14/resolvers/profile-utils.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/registry.d.ts +21 -1
- package/dist/cjs/hcs-14/resolvers/registry.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/types.d.ts +106 -5
- package/dist/cjs/hcs-14/resolvers/types.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts +10 -0
- package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts +22 -0
- package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -0
- package/dist/cjs/hcs-14/sdk.d.ts +16 -1
- package/dist/cjs/hcs-14/sdk.d.ts.map +1 -1
- package/dist/cjs/inscribe/inscriber.d.ts +1 -1
- package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
- package/dist/cjs/inscribe/inscription-cost.d.ts +12 -0
- package/dist/cjs/inscribe/inscription-cost.d.ts.map +1 -0
- package/dist/cjs/inscribe/types.d.ts +5 -1
- package/dist/cjs/inscribe/types.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +1548 -0
- package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +2 -2
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/hcs-12/validation/schemas.d.ts +4 -4
- package/dist/es/hcs-14/index.d.ts +5 -0
- package/dist/es/hcs-14/index.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts +37 -0
- package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/dns.d.ts +3 -0
- package/dist/es/hcs-14/resolvers/dns.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts +8 -0
- package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/profile-utils.d.ts +9 -0
- package/dist/es/hcs-14/resolvers/profile-utils.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/registry.d.ts +21 -1
- package/dist/es/hcs-14/resolvers/registry.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/types.d.ts +106 -5
- package/dist/es/hcs-14/resolvers/types.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts +10 -0
- package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts +22 -0
- package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -0
- package/dist/es/hcs-14/sdk.d.ts +16 -1
- package/dist/es/hcs-14/sdk.d.ts.map +1 -1
- package/dist/es/inscribe/inscriber.d.ts +1 -1
- package/dist/es/inscribe/inscriber.d.ts.map +1 -1
- package/dist/es/inscribe/inscription-cost.d.ts +12 -0
- package/dist/es/inscribe/inscription-cost.d.ts.map +1 -0
- package/dist/es/inscribe/types.d.ts +5 -1
- package/dist/es/inscribe/types.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +1548 -0
- package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +96 -83
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es100.js +41 -224
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +249 -97
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +95 -27
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +97 -80
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +29 -30
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +229 -249
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +103 -468
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +32 -103
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +79 -155
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +28 -31
- 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 +250 -10
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +451 -115
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +101 -25
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +155 -17
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +29 -155
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +9 -200
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +109 -757
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +27 -11
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +19 -564
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +140 -582
- 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 +202 -12
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +790 -2
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +10 -84
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +567 -40
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +602 -2
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +12 -234
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +2 -1140
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +73 -292
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +36 -418
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +2 -355
- 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 +197 -1090
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +1107 -175
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +218 -1479
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +422 -1236
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +351 -13
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +1102 -73
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +203 -76
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +1459 -785
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +1254 -59
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +14 -156
- 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 +87 -7
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +74 -79
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +889 -61
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +60 -30
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +159 -34
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +7 -28
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +70 -122
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +58 -35
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +30 -12320
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +34 -56
- 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 +41 -84
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +134 -13
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +36 -236
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +12444 -134
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +139 -289
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +274 -298
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +262 -369
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +316 -194
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +319 -64
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +61 -157
- 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 +14 -219
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +226 -223
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +49 -112
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +72 -114
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +67 -147
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +61 -173
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +153 -120
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +178 -287
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +218 -238
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +75 -72
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +129 -0
- package/dist/es/standards-sdk.es170.js.map +1 -0
- package/dist/es/standards-sdk.es171.js +164 -0
- package/dist/es/standards-sdk.es171.js.map +1 -0
- package/dist/es/standards-sdk.es172.js +188 -0
- package/dist/es/standards-sdk.es172.js.map +1 -0
- package/dist/es/standards-sdk.es173.js +142 -0
- package/dist/es/standards-sdk.es173.js.map +1 -0
- package/dist/es/standards-sdk.es174.js +334 -0
- package/dist/es/standards-sdk.es174.js.map +1 -0
- package/dist/es/standards-sdk.es175.js +262 -0
- package/dist/es/standards-sdk.es175.js.map +1 -0
- package/dist/es/standards-sdk.es176.js +119 -0
- package/dist/es/standards-sdk.es176.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 +194 -13
- package/dist/es/standards-sdk.es58.js.map +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es60.js +100 -192
- package/dist/es/standards-sdk.es60.js.map +1 -1
- package/dist/es/standards-sdk.es61.js +172 -24
- package/dist/es/standards-sdk.es61.js.map +1 -1
- package/dist/es/standards-sdk.es62.js +204 -77
- package/dist/es/standards-sdk.es62.js.map +1 -1
- package/dist/es/standards-sdk.es63.js +130 -3
- package/dist/es/standards-sdk.es63.js.map +1 -1
- package/dist/es/standards-sdk.es64.js +41 -95
- package/dist/es/standards-sdk.es64.js.map +1 -1
- package/dist/es/standards-sdk.es65.js +245 -88
- package/dist/es/standards-sdk.es65.js.map +1 -1
- package/dist/es/standards-sdk.es66.js +32 -17
- package/dist/es/standards-sdk.es66.js.map +1 -1
- package/dist/es/standards-sdk.es67.js +96 -77
- package/dist/es/standards-sdk.es67.js.map +1 -1
- package/dist/es/standards-sdk.es68.js +4 -458
- package/dist/es/standards-sdk.es68.js.map +1 -1
- package/dist/es/standards-sdk.es69.js +72 -295
- 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 +86 -194
- package/dist/es/standards-sdk.es70.js.map +1 -1
- package/dist/es/standards-sdk.es71.js +16 -69
- package/dist/es/standards-sdk.es71.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +69 -63
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es73.js +458 -143
- package/dist/es/standards-sdk.es73.js.map +1 -1
- package/dist/es/standards-sdk.es74.js +298 -43
- package/dist/es/standards-sdk.es74.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +174 -370
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es76.js +71 -495
- package/dist/es/standards-sdk.es76.js.map +1 -1
- package/dist/es/standards-sdk.es77.js +71 -365
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +137 -83
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +69 -125
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es80.js +402 -6
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +492 -43
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +350 -86
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +88 -347
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +125 -281
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +6 -59
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +43 -45
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +86 -135
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +333 -52
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +277 -26
- 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 +59 -23
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +26 -217
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +104 -236
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +51 -141
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +22 -137
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +20 -44
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +227 -252
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +248 -68
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +108 -52
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +144 -29
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/package.json +14 -4
|
@@ -1,37 +1,185 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { nodeDnsTxtLookup } from "./standards-sdk.es64.js";
|
|
2
|
+
import { isFqdn, normalizeDomain, parseSemicolonFields } from "./standards-sdk.es164.js";
|
|
3
|
+
const AID_DNS_WEB_PROFILE_ID = "hcs-14.profile.aid-dns-web";
|
|
4
|
+
function buildErrorProfile(uaid, code, message, details) {
|
|
5
|
+
const error = {
|
|
6
|
+
code,
|
|
7
|
+
message,
|
|
8
|
+
details
|
|
9
|
+
};
|
|
10
|
+
return {
|
|
11
|
+
id: uaid,
|
|
12
|
+
error,
|
|
13
|
+
metadata: {
|
|
14
|
+
profile: AID_DNS_WEB_PROFILE_ID,
|
|
15
|
+
resolved: false
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
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
|
+
}
|
|
27
|
+
if (!version.toLowerCase().startsWith("aid")) {
|
|
28
|
+
return { code: "ERR_INVALID_AID_RECORD" };
|
|
29
|
+
}
|
|
30
|
+
let parsedUrl;
|
|
31
|
+
try {
|
|
32
|
+
parsedUrl = new URL(endpoint);
|
|
33
|
+
} catch {
|
|
34
|
+
return { code: "ERR_ENDPOINT_INVALID" };
|
|
4
35
|
}
|
|
5
|
-
|
|
6
|
-
|
|
36
|
+
const scheme = parsedUrl.protocol.replace(/:$/, "").toLowerCase();
|
|
37
|
+
if (!supportedSchemes.has(scheme)) {
|
|
38
|
+
return { code: "ERR_ENDPOINT_INVALID" };
|
|
7
39
|
}
|
|
8
|
-
|
|
9
|
-
|
|
40
|
+
return {
|
|
41
|
+
record: {
|
|
42
|
+
version,
|
|
43
|
+
protocol,
|
|
44
|
+
endpoint: parsedUrl.toString(),
|
|
45
|
+
publicKey: fields["k"],
|
|
46
|
+
keyId: fields["i"]
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
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";
|
|
10
56
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return this.issuers.filter((i) => i.meta.didMethods.includes(method));
|
|
57
|
+
if (verificationLevel === "metadata") {
|
|
58
|
+
return "metadata-match";
|
|
14
59
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
60
|
+
return void 0;
|
|
61
|
+
}
|
|
62
|
+
class AidDnsWebProfileResolver {
|
|
63
|
+
constructor(options = {}) {
|
|
64
|
+
this.profile = AID_DNS_WEB_PROFILE_ID;
|
|
65
|
+
this.meta = {
|
|
66
|
+
id: "hcs-14/aid-dns-web",
|
|
67
|
+
didMethods: ["*"],
|
|
68
|
+
displayName: "HCS-14 AID DNS/Web Profile",
|
|
69
|
+
description: "Resolves uaid:aid identifiers via _agent.<nativeId> DNS TXT records and protocol endpoint hints."
|
|
70
|
+
};
|
|
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;
|
|
18
79
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
80
|
+
supports(_uaid, parsed) {
|
|
81
|
+
if (parsed.method !== "aid") {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const nativeId = parsed.params["nativeId"];
|
|
85
|
+
return !!nativeId && isFqdn(nativeId);
|
|
22
86
|
}
|
|
23
|
-
async
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
87
|
+
async resolveProfile(uaid, context) {
|
|
88
|
+
const parsed = context.parsedUaid;
|
|
89
|
+
if (parsed.method !== "aid") {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const nativeId = parsed.params["nativeId"];
|
|
93
|
+
if (!nativeId || !isFqdn(nativeId)) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const normalizedNativeId = normalizeDomain(nativeId);
|
|
97
|
+
const dnsName = `_agent.${normalizedNativeId}`;
|
|
98
|
+
const txtRecords = await this.dnsLookup(dnsName);
|
|
99
|
+
if (txtRecords.length === 0) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const parsedRecords = txtRecords.map(
|
|
103
|
+
(record) => parseRecord(record, this.supportedSchemes)
|
|
104
|
+
);
|
|
105
|
+
const validRecords = parsedRecords.filter(
|
|
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
|
+
);
|
|
27
150
|
}
|
|
151
|
+
verificationLevel = "cryptographic";
|
|
28
152
|
}
|
|
29
|
-
|
|
153
|
+
const did = context.did ?? void 0;
|
|
154
|
+
const alsoKnownAs = did ? [did] : void 0;
|
|
155
|
+
return {
|
|
156
|
+
id: uaid,
|
|
157
|
+
did,
|
|
158
|
+
alsoKnownAs,
|
|
159
|
+
service: [
|
|
160
|
+
{
|
|
161
|
+
id: `${uaid}#aid-endpoint`,
|
|
162
|
+
type: "AIDService",
|
|
163
|
+
serviceEndpoint: selectedRecord.endpoint
|
|
164
|
+
}
|
|
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
|
+
}
|
|
178
|
+
};
|
|
30
179
|
}
|
|
31
180
|
}
|
|
32
|
-
const defaultIssuerRegistry = new IssuerRegistry();
|
|
33
181
|
export {
|
|
34
|
-
|
|
35
|
-
|
|
182
|
+
AID_DNS_WEB_PROFILE_ID,
|
|
183
|
+
AidDnsWebProfileResolver
|
|
36
184
|
};
|
|
37
185
|
//# sourceMappingURL=standards-sdk.es61.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es61.js","sources":["../../src/hcs-14/issuers/registry.ts"],"sourcesContent":["/**\n * Issuer registry for HCS-14 DID adapters.\n */\n\nimport { DidIssueRequest, DidIssuer, IssuerRegistryApi } from './types';\n\nexport class IssuerRegistry implements IssuerRegistryApi {\n private issuers: DidIssuer[] = [];\n\n register(issuer: DidIssuer): void {\n this.issuers.push(issuer);\n }\n\n list(): DidIssuer[] {\n return [...this.issuers];\n }\n\n /** Return issuers that support a given DID method. */\n filterByDidMethod(method: string): DidIssuer[] {\n return this.issuers.filter(i => i.meta.didMethods.includes(method));\n }\n\n /** Return issuers that advertise a specific CAIP-2 network. */\n filterByCaip2(network: string): DidIssuer[] {\n return this.issuers.filter(i => i.meta.caip2Networks?.includes(network));\n }\n\n /** Generic predicate-based filter. */\n filter(predicate: (issuer: DidIssuer) => boolean): DidIssuer[] {\n return this.issuers.filter(predicate);\n }\n\n async issue(request: DidIssueRequest): Promise<string> {\n for (const issuer of this.issuers) {\n if (issuer.supports(request.method)) {\n return issuer.issue(request);\n }\n }\n throw new Error(`No issuer registered for method: ${request.method}`);\n }\n}\n\nexport const defaultIssuerRegistry = new IssuerRegistry();\n"],"names":[],"mappings":"AAMO,MAAM,eAA4C;AAAA,EAAlD,cAAA;AACL,SAAQ,UAAuB,CAAA;AAAA,EAAC;AAAA,EAEhC,SAAS,QAAyB;AAChC,SAAK,QAAQ,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,OAAoB;AAClB,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA;AAAA,EAGA,kBAAkB,QAA6B;AAC7C,WAAO,KAAK,QAAQ,OAAO,CAAA,MAAK,EAAE,KAAK,WAAW,SAAS,MAAM,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,cAAc,SAA8B;AAC1C,WAAO,KAAK,QAAQ,OAAO,CAAA,MAAK,EAAE,KAAK,eAAe,SAAS,OAAO,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,OAAO,WAAwD;AAC7D,WAAO,KAAK,QAAQ,OAAO,SAAS;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,SAA2C;AACrD,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,SAAS,QAAQ,MAAM,GAAG;AACnC,eAAO,OAAO,MAAM,OAAO;AAAA,MAC7B;AAAA,IACF;AACA,UAAM,IAAI,MAAM,oCAAoC,QAAQ,MAAM,EAAE;AAAA,EACtE;AACF;AAEO,MAAM,wBAAwB,IAAI,eAAA;"}
|
|
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,99 +1,226 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { nodeDnsTxtLookup } from "./standards-sdk.es64.js";
|
|
2
|
+
import { uaidTargetFromParsed, isFqdn, normalizeDomain, buildCanonicalUaid, parseSemicolonFields } from "./standards-sdk.es164.js";
|
|
3
|
+
import { AID_DNS_WEB_PROFILE_ID } from "./standards-sdk.es61.js";
|
|
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";
|
|
6
|
+
function buildErrorProfile(uaid, code, message, details) {
|
|
7
|
+
const error = {
|
|
8
|
+
code,
|
|
9
|
+
message,
|
|
10
|
+
details
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
id: uaid,
|
|
14
|
+
error,
|
|
15
|
+
metadata: {
|
|
16
|
+
profile: UAID_DNS_WEB_PROFILE_ID,
|
|
17
|
+
resolved: false
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function canonicalizeNativeDomainParams(params) {
|
|
22
|
+
const next = { ...params };
|
|
23
|
+
const nativeId = next["nativeId"];
|
|
24
|
+
if (nativeId && isFqdn(nativeId)) {
|
|
25
|
+
next["nativeId"] = normalizeDomain(nativeId);
|
|
7
26
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
27
|
+
const domain = next["domain"];
|
|
28
|
+
if (domain && isFqdn(domain)) {
|
|
29
|
+
next["domain"] = normalizeDomain(domain);
|
|
11
30
|
}
|
|
12
|
-
return
|
|
31
|
+
return next;
|
|
13
32
|
}
|
|
14
|
-
function
|
|
33
|
+
function validateRecordFields(fields, queriedNativeId) {
|
|
34
|
+
const target = fields["target"];
|
|
35
|
+
const id = fields["id"];
|
|
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;
|
|
47
|
+
}
|
|
48
|
+
if ("registry" in fields && !fields["registry"]) {
|
|
49
|
+
return null;
|
|
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"];
|
|
68
|
+
}
|
|
15
69
|
return {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
return client.operatorPublicKey;
|
|
34
|
-
},
|
|
35
|
-
publish: async (transaction) => {
|
|
36
|
-
const current = typeof transaction.getAutoRenewAccountId === "function" ? transaction.getAutoRenewAccountId() : null;
|
|
37
|
-
const autoRenewAccountId = toAccountIdString(client.operatorAccountId);
|
|
38
|
-
if (!current && autoRenewAccountId && typeof transaction.setAutoRenewAccountId === "function") {
|
|
39
|
-
transaction.setAutoRenewAccountId(autoRenewAccountId);
|
|
40
|
-
}
|
|
41
|
-
const response = await transaction.freezeWith(client).execute(client);
|
|
42
|
-
return response.getReceipt(client);
|
|
43
|
-
}
|
|
70
|
+
target,
|
|
71
|
+
id,
|
|
72
|
+
uid,
|
|
73
|
+
proto,
|
|
74
|
+
nativeId,
|
|
75
|
+
registry: fields["registry"],
|
|
76
|
+
domain: fields["domain"],
|
|
77
|
+
src: fields["src"],
|
|
78
|
+
did,
|
|
79
|
+
memo: fields["m"],
|
|
80
|
+
reconstructedUaid: buildCanonicalUaid(
|
|
81
|
+
target,
|
|
82
|
+
id,
|
|
83
|
+
canonicalizeNativeDomainParams(params)
|
|
84
|
+
)
|
|
44
85
|
};
|
|
45
86
|
}
|
|
46
|
-
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
hieroRegistrarModuleId,
|
|
50
|
-
{ preferImport: true }
|
|
51
|
-
).then((mod) => mod?.createDID ?? null);
|
|
87
|
+
function selectFollowupProfiles(target) {
|
|
88
|
+
if (target === "aid") {
|
|
89
|
+
return [AID_DNS_WEB_PROFILE_ID];
|
|
52
90
|
}
|
|
53
|
-
return
|
|
91
|
+
return [UAID_DID_RESOLUTION_PROFILE_ID];
|
|
54
92
|
}
|
|
55
|
-
class
|
|
56
|
-
constructor() {
|
|
93
|
+
class UaidDnsWebProfileResolver {
|
|
94
|
+
constructor(options = {}) {
|
|
95
|
+
this.profile = UAID_DNS_WEB_PROFILE_ID;
|
|
57
96
|
this.meta = {
|
|
58
|
-
id: "
|
|
59
|
-
didMethods: ["
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
"hedera:testnet",
|
|
63
|
-
"hedera:previewnet",
|
|
64
|
-
"hedera:devnet"
|
|
65
|
-
],
|
|
66
|
-
caip10Namespaces: ["hedera"],
|
|
67
|
-
displayName: "Hedera (Hiero Registrar)",
|
|
68
|
-
description: "Issues did:hedera identifiers using the Hiero DID registrar.",
|
|
69
|
-
homepage: "https://github.com/hiero-ledger/hiero-did-sdk-js"
|
|
97
|
+
id: "hcs-14/uaid-dns-web",
|
|
98
|
+
didMethods: ["*"],
|
|
99
|
+
displayName: "HCS-14 UAID DNS TXT Profile",
|
|
100
|
+
description: "Binds UAIDs to DNS TXT records at _uaid.<nativeId> and can continue to follow-up profile resolution."
|
|
70
101
|
};
|
|
102
|
+
this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;
|
|
103
|
+
this.dnssecValidation = options.dnssecValidation;
|
|
104
|
+
this.requireFullResolution = options.requireFullResolution ?? false;
|
|
105
|
+
this.enableFollowupResolution = options.enableFollowupResolution ?? true;
|
|
71
106
|
}
|
|
72
|
-
supports(
|
|
73
|
-
|
|
107
|
+
supports(_uaid, parsed) {
|
|
108
|
+
const target = uaidTargetFromParsed(parsed);
|
|
109
|
+
if (target !== "aid" && target !== "did") {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const nativeId = parsed.params["nativeId"];
|
|
113
|
+
return !!nativeId && isFqdn(nativeId);
|
|
74
114
|
}
|
|
75
|
-
async
|
|
76
|
-
|
|
77
|
-
|
|
115
|
+
async resolveProfile(uaid, context) {
|
|
116
|
+
const parsed = context.parsedUaid;
|
|
117
|
+
const nativeId = parsed.params["nativeId"];
|
|
118
|
+
if (!nativeId || !isFqdn(nativeId)) {
|
|
119
|
+
return null;
|
|
78
120
|
}
|
|
79
|
-
|
|
80
|
-
|
|
121
|
+
const normalizedNativeId = normalizeDomain(nativeId);
|
|
122
|
+
const dnsName = `_uaid.${normalizedNativeId}`;
|
|
123
|
+
const inputCanonical = buildCanonicalUaid(
|
|
124
|
+
uaidTargetFromParsed(parsed),
|
|
125
|
+
parsed.id,
|
|
126
|
+
canonicalizeNativeDomainParams(parsed.params)
|
|
127
|
+
);
|
|
128
|
+
const txtRecords = await this.dnsLookup(dnsName);
|
|
129
|
+
if (txtRecords.length === 0) {
|
|
130
|
+
return null;
|
|
81
131
|
}
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
132
|
+
const parsedRecords = txtRecords.map((record) => parseSemicolonFields(record)).map((fields) => validateRecordFields(fields, normalizedNativeId));
|
|
133
|
+
const validRecords = parsedRecords.filter(
|
|
134
|
+
(record) => record !== null
|
|
135
|
+
);
|
|
136
|
+
if (validRecords.length === 0) {
|
|
137
|
+
return buildErrorProfile(
|
|
138
|
+
uaid,
|
|
139
|
+
"ERR_INVALID_UAID_DNS_RECORD",
|
|
140
|
+
"DNS TXT payload at _uaid record is invalid.",
|
|
141
|
+
{ dnsName }
|
|
86
142
|
);
|
|
87
143
|
}
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
{},
|
|
91
|
-
{ publisher: createHieroPublisher(client) }
|
|
144
|
+
const matchingRecords = validRecords.filter(
|
|
145
|
+
(record) => record.target === uaidTargetFromParsed(parsed) && record.id === parsed.id && record.reconstructedUaid === inputCanonical
|
|
92
146
|
);
|
|
93
|
-
|
|
147
|
+
if (matchingRecords.length === 0) {
|
|
148
|
+
return buildErrorProfile(
|
|
149
|
+
uaid,
|
|
150
|
+
"ERR_UAID_MISMATCH",
|
|
151
|
+
"DNS TXT payload does not match the input UAID after canonical reconstruction.",
|
|
152
|
+
{
|
|
153
|
+
dnsName,
|
|
154
|
+
inputCanonical
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
const selected = [...matchingRecords].sort(
|
|
159
|
+
(a, b) => a.reconstructedUaid.localeCompare(b.reconstructedUaid)
|
|
160
|
+
)[0];
|
|
161
|
+
const dnssecValidated = this.dnssecValidation ? await this.dnssecValidation(dnsName) : false;
|
|
162
|
+
const verificationLevel = dnssecValidated ? "dns-binding-dnssec" : "dns-binding";
|
|
163
|
+
if (this.enableFollowupResolution) {
|
|
164
|
+
const followupProfiles = selectFollowupProfiles(selected.target);
|
|
165
|
+
for (const followupProfileId of followupProfiles) {
|
|
166
|
+
const followup = await context.resolveUaidProfileById(
|
|
167
|
+
followupProfileId,
|
|
168
|
+
uaid
|
|
169
|
+
);
|
|
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
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (this.requireFullResolution) {
|
|
199
|
+
return buildErrorProfile(
|
|
200
|
+
uaid,
|
|
201
|
+
"ERR_NO_FOLLOWUP_PROFILE",
|
|
202
|
+
"Resolver policy requires full resolution, but no supported follow-up profile was available.",
|
|
203
|
+
{ dnsName }
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
const did = selected.did ?? context.did ?? void 0;
|
|
207
|
+
const alsoKnownAs = did ? [did] : void 0;
|
|
208
|
+
return {
|
|
209
|
+
id: uaid,
|
|
210
|
+
did,
|
|
211
|
+
alsoKnownAs,
|
|
212
|
+
metadata: {
|
|
213
|
+
profile: UAID_DNS_WEB_PROFILE_ID,
|
|
214
|
+
resolved: true,
|
|
215
|
+
reconstructedUaid: selected.reconstructedUaid,
|
|
216
|
+
verificationLevel,
|
|
217
|
+
resolutionMode: "dns-binding-only"
|
|
218
|
+
}
|
|
219
|
+
};
|
|
94
220
|
}
|
|
95
221
|
}
|
|
96
222
|
export {
|
|
97
|
-
|
|
223
|
+
UAID_DNS_WEB_PROFILE_ID,
|
|
224
|
+
UaidDnsWebProfileResolver
|
|
98
225
|
};
|
|
99
226
|
//# sourceMappingURL=standards-sdk.es62.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es62.js","sources":["../../src/hcs-14/issuers/hiero.ts"],"sourcesContent":["import { DidIssueRequest, DidIssueRequestHedera, DidIssuer } from './types';\nimport type { AdapterMeta } from '../adapters/types';\nimport { optionalImport } from '../../utils/dynamic-import';\nimport type { PublicKey, TransactionReceipt } from '@hashgraph/sdk';\n\ntype CreateDID = typeof import('@hiero-did-sdk/registrar').createDID;\ntype HieroRegistrarModule = typeof import('@hiero-did-sdk/registrar');\n\nconst hieroRegistrarModuleId = ['@hiero-did-sdk', 'registrar'].join('/');\n\nlet registrarPromise: Promise<CreateDID | null> | null = null;\n\ntype PublisherClientLike = {\n ledgerId?: {\n isMainnet: () => boolean;\n isTestnet: () => boolean;\n isPreviewnet: () => boolean;\n isLocalNode: () => boolean;\n toString: () => string;\n };\n operatorPublicKey?: PublicKey;\n operatorAccountId?: { toString: () => string };\n};\n\ntype AutoRenewTransactionLike = {\n getAutoRenewAccountId?: () => unknown;\n setAutoRenewAccountId?: (value: string) => void;\n freezeWith: (client: PublisherClientLike) => {\n execute: (client: PublisherClientLike) => Promise<{\n getReceipt: (client: PublisherClientLike) => Promise<TransactionReceipt>;\n }>;\n };\n};\n\nfunction toAccountIdString(value: unknown): string | null {\n if (typeof value === 'string' && value.trim()) {\n return value;\n }\n\n if (\n value &&\n typeof (value as { toString?: () => string }).toString === 'function'\n ) {\n const result = (value as { toString: () => string }).toString();\n return typeof result === 'string' && result.trim() ? result : null;\n }\n\n return null;\n}\n\nfunction createHieroPublisher(client: PublisherClientLike) {\n return {\n network: () => {\n const ledgerId = client.ledgerId;\n if (!ledgerId) {\n throw new Error('Hedera SDK Client must be configured with a network');\n }\n if (ledgerId.isMainnet()) return 'mainnet';\n if (ledgerId.isTestnet()) return 'testnet';\n if (ledgerId.isPreviewnet()) return 'previewnet';\n if (ledgerId.isLocalNode()) return 'local-node';\n throw new Error(`Unknown network, ledger ID: ${ledgerId.toString()}`);\n },\n publicKey: () => {\n if (!client.operatorPublicKey) {\n throw new Error(\n 'Hedera SDK Client must be configured with an operator account',\n );\n }\n return client.operatorPublicKey;\n },\n publish: async (transaction: AutoRenewTransactionLike) => {\n const current =\n typeof transaction.getAutoRenewAccountId === 'function'\n ? transaction.getAutoRenewAccountId()\n : null;\n const autoRenewAccountId = toAccountIdString(client.operatorAccountId);\n\n if (\n !current &&\n autoRenewAccountId &&\n typeof transaction.setAutoRenewAccountId === 'function'\n ) {\n transaction.setAutoRenewAccountId(autoRenewAccountId);\n }\n\n const response = await transaction.freezeWith(client).execute(client);\n return response.getReceipt(client);\n },\n };\n}\n\nasync function loadCreateDID(): Promise<CreateDID | null> {\n if (!registrarPromise) {\n // Prefer ESM to keep @hashgraph/sdk classes consistent across caller + registrar.\n registrarPromise = optionalImport<HieroRegistrarModule>(\n hieroRegistrarModuleId,\n { preferImport: true },\n ).then(mod => mod?.createDID ?? null);\n }\n return registrarPromise;\n}\n\nexport class HederaHieroIssuer implements DidIssuer {\n readonly meta: AdapterMeta = {\n id: 'hedera/hiero',\n didMethods: ['hedera'],\n caip2Networks: [\n 'hedera:mainnet',\n 'hedera:testnet',\n 'hedera:previewnet',\n 'hedera:devnet',\n ],\n caip10Namespaces: ['hedera'],\n displayName: 'Hedera (Hiero Registrar)',\n description: 'Issues did:hedera identifiers using the Hiero DID registrar.',\n homepage: 'https://github.com/hiero-ledger/hiero-did-sdk-js',\n };\n\n supports(method: string): boolean {\n return method === 'hedera';\n }\n\n async issue(request: DidIssueRequest): Promise<string> {\n if (request.method !== 'hedera') {\n throw new Error('HederaHieroIssuer only handles method \"hedera\"');\n }\n if (!('client' in request)) {\n throw new Error('Hedera client is required to issue did:hedera');\n }\n const createDID = await loadCreateDID();\n if (!createDID) {\n throw new Error(\n 'Hiero registrar unavailable. Ensure @hiero-did-sdk/registrar is installed.',\n );\n }\n const client = (request as DidIssueRequestHedera).client;\n const did = await createDID(\n {},\n { publisher: createHieroPublisher(client) },\n );\n return did.did;\n }\n}\n"],"names":[],"mappings":";AAQA,MAAM,yBAAyB,CAAC,kBAAkB,WAAW,EAAE,KAAK,GAAG;AAEvE,IAAI,mBAAqD;AAwBzD,SAAS,kBAAkB,OAA+B;AACxD,MAAI,OAAO,UAAU,YAAY,MAAM,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,MACE,SACA,OAAQ,MAAsC,aAAa,YAC3D;AACA,UAAM,SAAU,MAAqC,SAAA;AACrD,WAAO,OAAO,WAAW,YAAY,OAAO,KAAA,IAAS,SAAS;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAA6B;AACzD,SAAO;AAAA,IACL,SAAS,MAAM;AACb,YAAM,WAAW,OAAO;AACxB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AACA,UAAI,SAAS,UAAA,EAAa,QAAO;AACjC,UAAI,SAAS,UAAA,EAAa,QAAO;AACjC,UAAI,SAAS,aAAA,EAAgB,QAAO;AACpC,UAAI,SAAS,YAAA,EAAe,QAAO;AACnC,YAAM,IAAI,MAAM,+BAA+B,SAAS,SAAA,CAAU,EAAE;AAAA,IACtE;AAAA,IACA,WAAW,MAAM;AACf,UAAI,CAAC,OAAO,mBAAmB;AAC7B,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACA,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,SAAS,OAAO,gBAA0C;AACxD,YAAM,UACJ,OAAO,YAAY,0BAA0B,aACzC,YAAY,0BACZ;AACN,YAAM,qBAAqB,kBAAkB,OAAO,iBAAiB;AAErE,UACE,CAAC,WACD,sBACA,OAAO,YAAY,0BAA0B,YAC7C;AACA,oBAAY,sBAAsB,kBAAkB;AAAA,MACtD;AAEA,YAAM,WAAW,MAAM,YAAY,WAAW,MAAM,EAAE,QAAQ,MAAM;AACpE,aAAO,SAAS,WAAW,MAAM;AAAA,IACnC;AAAA,EAAA;AAEJ;AAEA,eAAe,gBAA2C;AACxD,MAAI,CAAC,kBAAkB;AAErB,uBAAmB;AAAA,MACjB;AAAA,MACA,EAAE,cAAc,KAAA;AAAA,IAAK,EACrB,KAAK,CAAA,QAAO,KAAK,aAAa,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEO,MAAM,kBAAuC;AAAA,EAA7C,cAAA;AACL,SAAS,OAAoB;AAAA,MAC3B,IAAI;AAAA,MACJ,YAAY,CAAC,QAAQ;AAAA,MACrB,eAAe;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,kBAAkB,CAAC,QAAQ;AAAA,MAC3B,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEA,SAAS,QAAyB;AAChC,WAAO,WAAW;AAAA,EACpB;AAAA,EAEA,MAAM,MAAM,SAA2C;AACrD,QAAI,QAAQ,WAAW,UAAU;AAC/B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,QAAI,EAAE,YAAY,UAAU;AAC1B,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,UAAM,YAAY,MAAM,cAAA;AACxB,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACA,UAAM,SAAU,QAAkC;AAClD,UAAM,MAAM,MAAM;AAAA,MAChB,CAAA;AAAA,MACA,EAAE,WAAW,qBAAqB,MAAM,EAAA;AAAA,IAAE;AAE5C,WAAO,IAAI;AAAA,EACb;AACF;"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es62.js","sources":["../../src/hcs-14/resolvers/uaid-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 {\n buildCanonicalUaid,\n isFqdn,\n normalizeDomain,\n parseSemicolonFields,\n uaidTargetFromParsed,\n} from './profile-utils';\nimport { AID_DNS_WEB_PROFILE_ID } from './aid-dns-web-profile';\nimport { UAID_DID_RESOLUTION_PROFILE_ID } from './uaid-did-resolution-profile';\n\nexport const UAID_DNS_WEB_PROFILE_ID = 'hcs-14.profile.uaid-dns-web';\n\ninterface UaidDnsWebRecord {\n target: 'aid' | 'did';\n id: string;\n uid: string;\n proto: string;\n nativeId: string;\n registry?: string;\n domain?: string;\n src?: string;\n did?: string;\n memo?: string;\n reconstructedUaid: string;\n}\n\nexport interface UaidDnsWebResolverOptions {\n dnsLookup?: DnsTxtLookup;\n dnssecValidation?: (hostname: string) => Promise<boolean>;\n requireFullResolution?: boolean;\n enableFollowupResolution?: boolean;\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: UAID_DNS_WEB_PROFILE_ID,\n resolved: false,\n },\n };\n}\n\nfunction canonicalizeNativeDomainParams(\n params: Record<string, string>,\n): Record<string, string> {\n const next = { ...params };\n const nativeId = next['nativeId'];\n if (nativeId && isFqdn(nativeId)) {\n next['nativeId'] = normalizeDomain(nativeId);\n }\n const domain = next['domain'];\n if (domain && isFqdn(domain)) {\n next['domain'] = normalizeDomain(domain);\n }\n return next;\n}\n\nfunction validateRecordFields(\n fields: Record<string, string>,\n queriedNativeId: string,\n): UaidDnsWebRecord | null {\n const target = fields['target'];\n const id = fields['id'];\n const uid = fields['uid'];\n const proto = fields['proto'];\n const nativeId = fields['nativeId'];\n\n if (target !== 'aid' && target !== 'did') {\n return null;\n }\n if (!id || !uid || !proto || !nativeId) {\n return null;\n }\n if (normalizeDomain(nativeId) !== queriedNativeId) {\n return null;\n }\n if ('registry' in fields && !fields['registry']) {\n return null;\n }\n const did = fields['did'];\n if (did && (target !== 'did' || !did.startsWith('did:'))) {\n return null;\n }\n\n const params: Record<string, string> = {\n uid,\n proto,\n nativeId,\n };\n if (fields['registry']) {\n params['registry'] = fields['registry'];\n }\n if (fields['domain']) {\n params['domain'] = fields['domain'];\n }\n if (fields['src']) {\n params['src'] = fields['src'];\n }\n\n return {\n target,\n id,\n uid,\n proto,\n nativeId,\n registry: fields['registry'],\n domain: fields['domain'],\n src: fields['src'],\n did,\n memo: fields['m'],\n reconstructedUaid: buildCanonicalUaid(\n target,\n id,\n canonicalizeNativeDomainParams(params),\n ),\n };\n}\n\nfunction selectFollowupProfiles(target: 'aid' | 'did'): string[] {\n if (target === 'aid') {\n return [AID_DNS_WEB_PROFILE_ID];\n }\n return [UAID_DID_RESOLUTION_PROFILE_ID];\n}\n\nexport class UaidDnsWebProfileResolver implements UaidProfileResolver {\n readonly profile = UAID_DNS_WEB_PROFILE_ID;\n\n readonly meta: AdapterMeta = {\n id: 'hcs-14/uaid-dns-web',\n didMethods: ['*'],\n displayName: 'HCS-14 UAID DNS TXT Profile',\n description:\n 'Binds UAIDs to DNS TXT records at _uaid.<nativeId> and can continue to follow-up profile resolution.',\n };\n\n private readonly dnsLookup: DnsTxtLookup;\n private readonly dnssecValidation?: (hostname: string) => Promise<boolean>;\n private readonly requireFullResolution: boolean;\n private readonly enableFollowupResolution: boolean;\n\n constructor(options: UaidDnsWebResolverOptions = {}) {\n this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;\n this.dnssecValidation = options.dnssecValidation;\n this.requireFullResolution = options.requireFullResolution ?? false;\n this.enableFollowupResolution = options.enableFollowupResolution ?? true;\n }\n\n supports(\n _uaid: string,\n parsed: UaidProfileResolverContext['parsedUaid'],\n ): boolean {\n const target = uaidTargetFromParsed(parsed);\n if (target !== 'aid' && target !== 'did') {\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 const nativeId = parsed.params['nativeId'];\n if (!nativeId || !isFqdn(nativeId)) {\n return null;\n }\n\n const normalizedNativeId = normalizeDomain(nativeId);\n const dnsName = `_uaid.${normalizedNativeId}`;\n const inputCanonical = buildCanonicalUaid(\n uaidTargetFromParsed(parsed),\n parsed.id,\n canonicalizeNativeDomainParams(parsed.params),\n );\n\n const txtRecords = await this.dnsLookup(dnsName);\n if (txtRecords.length === 0) {\n return null;\n }\n\n const parsedRecords = txtRecords\n .map(record => parseSemicolonFields(record))\n .map(fields => validateRecordFields(fields, normalizedNativeId));\n const validRecords = parsedRecords.filter(\n (record): record is UaidDnsWebRecord => record !== null,\n );\n\n if (validRecords.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_INVALID_UAID_DNS_RECORD',\n 'DNS TXT payload at _uaid record is invalid.',\n { dnsName },\n );\n }\n\n const matchingRecords = validRecords.filter(\n record =>\n record.target === uaidTargetFromParsed(parsed) &&\n record.id === parsed.id &&\n record.reconstructedUaid === inputCanonical,\n );\n\n if (matchingRecords.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_UAID_MISMATCH',\n 'DNS TXT payload does not match the input UAID after canonical reconstruction.',\n {\n dnsName,\n inputCanonical,\n },\n );\n }\n\n const selected = [...matchingRecords].sort((a, b) =>\n a.reconstructedUaid.localeCompare(b.reconstructedUaid),\n )[0];\n\n const dnssecValidated = this.dnssecValidation\n ? await this.dnssecValidation(dnsName)\n : false;\n const verificationLevel = dnssecValidated\n ? 'dns-binding-dnssec'\n : 'dns-binding';\n\n if (this.enableFollowupResolution) {\n const followupProfiles = selectFollowupProfiles(selected.target);\n for (const followupProfileId of followupProfiles) {\n const followup = await context.resolveUaidProfileById(\n followupProfileId,\n uaid,\n );\n if (!followup) {\n continue;\n }\n if (followup.error || followup.metadata?.resolved === false) {\n return buildErrorProfile(\n uaid,\n 'ERR_FOLLOWUP_RESOLUTION_FAILED',\n 'Follow-up profile resolution failed after successful DNS binding.',\n {\n followupProfileId,\n dnsName,\n },\n );\n }\n return {\n ...followup,\n metadata: {\n ...followup.metadata,\n profile: UAID_DNS_WEB_PROFILE_ID,\n resolved: true,\n verificationLevel,\n reconstructedUaid: selected.reconstructedUaid,\n selectedFollowupProfile: followupProfileId,\n resolutionMode: 'full-resolution',\n },\n };\n }\n }\n\n if (this.requireFullResolution) {\n return buildErrorProfile(\n uaid,\n 'ERR_NO_FOLLOWUP_PROFILE',\n 'Resolver policy requires full resolution, but no supported follow-up profile was available.',\n { dnsName },\n );\n }\n\n const did = selected.did ?? context.did ?? undefined;\n const alsoKnownAs = did ? [did] : undefined;\n\n return {\n id: uaid,\n did,\n alsoKnownAs,\n metadata: {\n profile: UAID_DNS_WEB_PROFILE_ID,\n resolved: true,\n reconstructedUaid: selected.reconstructedUaid,\n verificationLevel,\n resolutionMode: 'dns-binding-only',\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
|