@hashgraphonline/standards-sdk 0.1.161 → 0.1.162
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/index.d.ts +1 -0
- package/dist/cjs/hcs-14/index.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts +1 -0
- package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts +23 -0
- package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile.d.ts +32 -0
- package/dist/cjs/hcs-14/resolvers/ans-dns-web-profile.d.ts.map +1 -0
- package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts +1 -0
- package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/hiero.d.ts +1 -0
- package/dist/cjs/hcs-14/resolvers/hiero.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/registry.d.ts +21 -0
- package/dist/cjs/hcs-14/resolvers/registry.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/types.d.ts +40 -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 +1 -0
- package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -1
- package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts +1 -0
- package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -1
- package/dist/cjs/hcs-14/sdk.d.ts +23 -1
- package/dist/cjs/hcs-14/sdk.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-14/index.d.ts +1 -0
- package/dist/es/hcs-14/index.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts +1 -0
- package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts +23 -0
- package/dist/es/hcs-14/resolvers/ans-dns-web-profile-utils.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/ans-dns-web-profile.d.ts +32 -0
- package/dist/es/hcs-14/resolvers/ans-dns-web-profile.d.ts.map +1 -0
- package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts +1 -0
- package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/hiero.d.ts +1 -0
- package/dist/es/hcs-14/resolvers/hiero.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/registry.d.ts +21 -0
- package/dist/es/hcs-14/resolvers/registry.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/types.d.ts +40 -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 +1 -0
- package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -1
- package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts +1 -0
- package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -1
- package/dist/es/hcs-14/sdk.d.ts +23 -1
- package/dist/es/hcs-14/sdk.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +89 -86
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es100.js +136 -124
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +138 -42
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +43 -259
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +245 -82
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +50 -49
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +100 -29
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +27 -229
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +228 -109
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +94 -15
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +30 -80
- 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 +80 -27
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +27 -248
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +246 -472
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +458 -85
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +96 -151
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +155 -29
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +26 -4
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +10 -140
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +140 -27
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +27 -20
- 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 +18 -156
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +148 -191
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +160 -747
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +786 -9
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +13 -567
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +541 -576
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +601 -12
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +13 -2
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +2 -87
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +84 -37
- 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 +40 -2
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +2 -235
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +204 -1109
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +1059 -225
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +303 -419
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +418 -351
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +347 -1108
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +1088 -180
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +153 -1512
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +1567 -1255
- 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 +1255 -17
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +15 -85
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +77 -71
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +79 -891
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +886 -53
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +53 -152
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +159 -7
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +7 -86
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +65 -44
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +65 -30
- 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 +30 -34
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +34 -45
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +48 -138
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +133 -37
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +34 -12474
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +12477 -12
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +15 -54
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +48 -76
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +69 -66
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +71 -63
- 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 +188 -160
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +65 -314
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +232 -336
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +129 -410
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +200 -209
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +334 -64
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +442 -231
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +317 -158
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +61 -207
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +155 -222
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +178 -75
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +226 -113
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +77 -119
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +103 -162
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +141 -119
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +152 -298
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +120 -240
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +298 -83
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +262 -0
- package/dist/es/standards-sdk.es178.js.map +1 -0
- package/dist/es/standards-sdk.es179.js +119 -0
- package/dist/es/standards-sdk.es179.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 +37 -4
- package/dist/es/standards-sdk.es58.js.map +1 -1
- package/dist/es/standards-sdk.es59.js +17 -10
- 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 +2 -1
- package/dist/es/standards-sdk.es60.js.map +1 -1
- package/dist/es/standards-sdk.es61.js +1 -0
- package/dist/es/standards-sdk.es61.js.map +1 -1
- package/dist/es/standards-sdk.es62.js +19 -5
- package/dist/es/standards-sdk.es62.js.map +1 -1
- package/dist/es/standards-sdk.es63.js +214 -153
- package/dist/es/standards-sdk.es63.js.map +1 -1
- package/dist/es/standards-sdk.es64.js +205 -84
- package/dist/es/standards-sdk.es64.js.map +1 -1
- package/dist/es/standards-sdk.es65.js +125 -40
- package/dist/es/standards-sdk.es65.js.map +1 -1
- package/dist/es/standards-sdk.es66.js +41 -261
- package/dist/es/standards-sdk.es66.js.map +1 -1
- package/dist/es/standards-sdk.es67.js +262 -24
- package/dist/es/standards-sdk.es67.js.map +1 -1
- package/dist/es/standards-sdk.es68.js +25 -87
- package/dist/es/standards-sdk.es68.js.map +1 -1
- package/dist/es/standards-sdk.es69.js +95 -3
- 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 +3 -100
- package/dist/es/standards-sdk.es70.js.map +1 -1
- package/dist/es/standards-sdk.es71.js +62 -61
- package/dist/es/standards-sdk.es71.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +98 -17
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es73.js +19 -77
- package/dist/es/standards-sdk.es73.js.map +1 -1
- package/dist/es/standards-sdk.es74.js +77 -458
- package/dist/es/standards-sdk.es74.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +240 -106
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es76.js +286 -170
- package/dist/es/standards-sdk.es76.js.map +1 -1
- package/dist/es/standards-sdk.es77.js +207 -71
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +72 -71
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +71 -143
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es80.js +136 -62
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +45 -380
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +130 -222
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +444 -313
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +364 -88
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +89 -125
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +125 -8
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +6 -45
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +44 -98
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +84 -331
- 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 +160 -93
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +275 -55
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +55 -43
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +44 -145
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +113 -30
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +59 -22
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +28 -23
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +23 -238
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +225 -267
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +220 -95
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es62.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.es62.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 adapterKind: 'uaid-profile-resolver' = 'uaid-profile-resolver';\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 buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'AID DNS/Web profile only applies to uaid:aid identifiers.',\n );\n }\n\n const nativeId = parsed.params['nativeId'];\n if (!nativeId || !isFqdn(nativeId)) {\n return buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'AID DNS/Web profile requires an FQDN nativeId.',\n );\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 buildErrorProfile(\n uaid,\n 'ERR_NO_DNS_RECORD',\n 'No AID DNS TXT record was found for the requested nativeId.',\n { dnsName },\n );\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,8 +1,8 @@
|
|
|
1
|
-
import { nodeDnsTxtLookup } from "./standards-sdk.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const
|
|
1
|
+
import { nodeDnsTxtLookup } from "./standards-sdk.es66.js";
|
|
2
|
+
import { isFqdn, normalizeDomain } from "./standards-sdk.es159.js";
|
|
3
|
+
import { normalizeAnsVersion, isValidAnsProfileVersion, parseAnsDnsTxtRecord, toErrorMessage, parseAnsAgentCard, extractEndpointCandidates, selectPreferredEndpoint } from "./standards-sdk.es160.js";
|
|
4
|
+
const ANS_DNS_WEB_PROFILE_ID = "hcs-14.profile.ans-dns-web";
|
|
5
|
+
const UAID_UNSPECIFIED_PARAM_VALUE = "0";
|
|
6
6
|
function buildErrorProfile(uaid, code, message, details) {
|
|
7
7
|
const error = {
|
|
8
8
|
code,
|
|
@@ -13,100 +13,58 @@ function buildErrorProfile(uaid, code, message, details) {
|
|
|
13
13
|
id: uaid,
|
|
14
14
|
error,
|
|
15
15
|
metadata: {
|
|
16
|
-
profile:
|
|
16
|
+
profile: ANS_DNS_WEB_PROFILE_ID,
|
|
17
17
|
resolved: false
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (nativeId && isFqdn(nativeId)) {
|
|
25
|
-
next["nativeId"] = normalizeDomain(nativeId);
|
|
21
|
+
async function defaultFetchJson(url) {
|
|
22
|
+
if (typeof globalThis.fetch !== "function") {
|
|
23
|
+
throw new Error("Fetch API is unavailable in this runtime.");
|
|
26
24
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
const response = await globalThis.fetch(url, {
|
|
26
|
+
method: "GET",
|
|
27
|
+
headers: {
|
|
28
|
+
accept: "application/json"
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Agent Card request failed with status ${response.status}.`
|
|
34
|
+
);
|
|
30
35
|
}
|
|
31
|
-
return
|
|
36
|
+
return response.json();
|
|
32
37
|
}
|
|
33
|
-
function
|
|
34
|
-
|
|
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
|
-
}
|
|
69
|
-
return {
|
|
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
|
-
)
|
|
85
|
-
};
|
|
38
|
+
function isUnspecifiedUaidParamValue(value) {
|
|
39
|
+
return !value || value === UAID_UNSPECIFIED_PARAM_VALUE;
|
|
86
40
|
}
|
|
87
|
-
function
|
|
88
|
-
|
|
89
|
-
return [AID_DNS_WEB_PROFILE_ID];
|
|
90
|
-
}
|
|
91
|
-
return [UAID_DID_RESOLUTION_PROFILE_ID];
|
|
41
|
+
function selectDeterministicAnsDnsRecord(records) {
|
|
42
|
+
return [...records].sort((a, b) => a.url.localeCompare(b.url))[0];
|
|
92
43
|
}
|
|
93
|
-
class
|
|
44
|
+
class AnsDnsWebProfileResolver {
|
|
94
45
|
constructor(options = {}) {
|
|
95
|
-
this.
|
|
46
|
+
this.adapterKind = "uaid-profile-resolver";
|
|
47
|
+
this.profile = ANS_DNS_WEB_PROFILE_ID;
|
|
96
48
|
this.meta = {
|
|
97
|
-
id: "hcs-14/
|
|
49
|
+
id: "hcs-14/ans-dns-web",
|
|
98
50
|
didMethods: ["*"],
|
|
99
|
-
displayName: "HCS-14
|
|
100
|
-
description: "
|
|
51
|
+
displayName: "HCS-14 ANS DNS/Web Profile",
|
|
52
|
+
description: "Resolves ANS uaid:aid identifiers via _ans.<nativeId> TXT records and Agent Card endpoint selection."
|
|
101
53
|
};
|
|
102
54
|
this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;
|
|
103
|
-
this.
|
|
104
|
-
this.
|
|
105
|
-
|
|
55
|
+
this.fetchJson = options.fetchJson ?? defaultFetchJson;
|
|
56
|
+
this.supportedSchemes = new Set(
|
|
57
|
+
(options.supportedUriSchemes ?? ["https", "wss"]).map(
|
|
58
|
+
(scheme) => scheme.toLowerCase()
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
this.transparencyVerifier = options.transparencyVerifier;
|
|
106
62
|
}
|
|
107
63
|
supports(_uaid, parsed) {
|
|
108
|
-
|
|
109
|
-
|
|
64
|
+
if (parsed.method !== "aid") {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (parsed.params["registry"] !== "ans") {
|
|
110
68
|
return false;
|
|
111
69
|
}
|
|
112
70
|
const nativeId = parsed.params["nativeId"];
|
|
@@ -114,113 +72,216 @@ class UaidDnsWebProfileResolver {
|
|
|
114
72
|
}
|
|
115
73
|
async resolveProfile(uaid, context) {
|
|
116
74
|
const parsed = context.parsedUaid;
|
|
75
|
+
if (parsed.method !== "aid") {
|
|
76
|
+
return buildErrorProfile(
|
|
77
|
+
uaid,
|
|
78
|
+
"ERR_NOT_APPLICABLE",
|
|
79
|
+
"ANS profile only applies to uaid:aid identifiers."
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
if (parsed.params["registry"] !== "ans") {
|
|
83
|
+
return buildErrorProfile(
|
|
84
|
+
uaid,
|
|
85
|
+
"ERR_NOT_APPLICABLE",
|
|
86
|
+
"ANS profile requires registry=ans."
|
|
87
|
+
);
|
|
88
|
+
}
|
|
117
89
|
const nativeId = parsed.params["nativeId"];
|
|
118
90
|
if (!nativeId || !isFqdn(nativeId)) {
|
|
119
|
-
return
|
|
91
|
+
return buildErrorProfile(
|
|
92
|
+
uaid,
|
|
93
|
+
"ERR_NOT_APPLICABLE",
|
|
94
|
+
"ANS profile requires an FQDN nativeId."
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
const uid = parsed.params["uid"];
|
|
98
|
+
if (isUnspecifiedUaidParamValue(uid)) {
|
|
99
|
+
return buildErrorProfile(
|
|
100
|
+
uaid,
|
|
101
|
+
"ERR_NOT_APPLICABLE",
|
|
102
|
+
"ANS profile requires a non-zero uid parameter."
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
const protocol = parsed.params["proto"];
|
|
106
|
+
if (isUnspecifiedUaidParamValue(protocol)) {
|
|
107
|
+
return buildErrorProfile(
|
|
108
|
+
uaid,
|
|
109
|
+
"ERR_PROTOCOL_UNSPECIFIED",
|
|
110
|
+
"ANS profile requires a usable proto parameter."
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const uaidVersion = parsed.params["version"];
|
|
114
|
+
const normalizedUaidVersion = uaidVersion === void 0 ? void 0 : normalizeAnsVersion(uaidVersion);
|
|
115
|
+
if (uaidVersion !== void 0 && !isValidAnsProfileVersion(uaidVersion)) {
|
|
116
|
+
return buildErrorProfile(
|
|
117
|
+
uaid,
|
|
118
|
+
"ERR_NOT_APPLICABLE",
|
|
119
|
+
"ANS profile requires a valid semver version parameter when provided."
|
|
120
|
+
);
|
|
120
121
|
}
|
|
121
122
|
const normalizedNativeId = normalizeDomain(nativeId);
|
|
122
|
-
const dnsName = `
|
|
123
|
-
const inputCanonical = buildCanonicalUaid(
|
|
124
|
-
uaidTargetFromParsed(parsed),
|
|
125
|
-
parsed.id,
|
|
126
|
-
canonicalizeNativeDomainParams(parsed.params)
|
|
127
|
-
);
|
|
123
|
+
const dnsName = `_ans.${normalizedNativeId}`;
|
|
128
124
|
const txtRecords = await this.dnsLookup(dnsName);
|
|
129
125
|
if (txtRecords.length === 0) {
|
|
130
|
-
return
|
|
126
|
+
return buildErrorProfile(
|
|
127
|
+
uaid,
|
|
128
|
+
"ERR_NO_DNS_RECORD",
|
|
129
|
+
"No ANS DNS TXT record was found for the requested nativeId.",
|
|
130
|
+
{ dnsName }
|
|
131
|
+
);
|
|
131
132
|
}
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
(record) => record !== null
|
|
135
|
-
);
|
|
136
|
-
if (validRecords.length === 0) {
|
|
133
|
+
const validTxtRecords = txtRecords.map((record) => parseAnsDnsTxtRecord(record)).filter((record) => record !== null);
|
|
134
|
+
if (validTxtRecords.length === 0) {
|
|
137
135
|
return buildErrorProfile(
|
|
138
136
|
uaid,
|
|
139
|
-
"
|
|
140
|
-
"DNS TXT payload
|
|
137
|
+
"ERR_INVALID_ANS_RECORD",
|
|
138
|
+
"ANS DNS TXT payload is malformed or unsupported.",
|
|
141
139
|
{ dnsName }
|
|
142
140
|
);
|
|
143
141
|
}
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
let matchingVersionRecords = validTxtRecords;
|
|
143
|
+
if (normalizedUaidVersion) {
|
|
144
|
+
const recordsWithVersion = validTxtRecords.filter((record) => {
|
|
145
|
+
return record.version !== void 0;
|
|
146
|
+
});
|
|
147
|
+
if (recordsWithVersion.length === 0) {
|
|
148
|
+
return buildErrorProfile(
|
|
149
|
+
uaid,
|
|
150
|
+
"ERR_VERSION_MISMATCH",
|
|
151
|
+
"UAID specifies a version but no ANS DNS TXT record carries a version field.",
|
|
152
|
+
{ dnsName, uaidVersion: normalizedUaidVersion }
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
matchingVersionRecords = recordsWithVersion.filter((record) => {
|
|
156
|
+
return record.version === normalizedUaidVersion;
|
|
157
|
+
});
|
|
158
|
+
if (matchingVersionRecords.length === 0) {
|
|
159
|
+
return buildErrorProfile(
|
|
160
|
+
uaid,
|
|
161
|
+
"ERR_VERSION_MISMATCH",
|
|
162
|
+
"UAID version does not match ANS DNS TXT record version.",
|
|
163
|
+
{ dnsName, uaidVersion: normalizedUaidVersion }
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const selectedRecord = selectDeterministicAnsDnsRecord(
|
|
168
|
+
matchingVersionRecords
|
|
146
169
|
);
|
|
147
|
-
|
|
170
|
+
let agentCardPayload;
|
|
171
|
+
try {
|
|
172
|
+
agentCardPayload = await this.fetchJson(selectedRecord.url);
|
|
173
|
+
} catch (error) {
|
|
148
174
|
return buildErrorProfile(
|
|
149
175
|
uaid,
|
|
150
|
-
"
|
|
151
|
-
"
|
|
176
|
+
"ERR_AGENT_CARD_INVALID",
|
|
177
|
+
"Agent Card retrieval failed.",
|
|
152
178
|
{
|
|
153
|
-
|
|
154
|
-
|
|
179
|
+
stage: "fetch",
|
|
180
|
+
agentCardUrl: selectedRecord.url,
|
|
181
|
+
reason: toErrorMessage(error)
|
|
155
182
|
}
|
|
156
183
|
);
|
|
157
184
|
}
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
"ERR_FOLLOWUP_RESOLUTION_FAILED",
|
|
177
|
-
"Follow-up profile resolution failed after successful DNS binding.",
|
|
178
|
-
{
|
|
179
|
-
followupProfileId,
|
|
180
|
-
dnsName
|
|
181
|
-
}
|
|
182
|
-
);
|
|
185
|
+
const agentCard = parseAnsAgentCard(agentCardPayload);
|
|
186
|
+
if (!agentCard) {
|
|
187
|
+
return buildErrorProfile(
|
|
188
|
+
uaid,
|
|
189
|
+
"ERR_AGENT_CARD_INVALID",
|
|
190
|
+
"Agent Card is missing required fields.",
|
|
191
|
+
{ stage: "validate", agentCardUrl: selectedRecord.url }
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
if (agentCard.ansName !== uid) {
|
|
195
|
+
return buildErrorProfile(
|
|
196
|
+
uaid,
|
|
197
|
+
"ERR_AGENT_CARD_INVALID",
|
|
198
|
+
"Agent Card ansName does not match UAID uid.",
|
|
199
|
+
{
|
|
200
|
+
stage: "validate",
|
|
201
|
+
expectedUid: uid,
|
|
202
|
+
actualAnsName: agentCard.ansName
|
|
183
203
|
}
|
|
184
|
-
|
|
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
|
-
}
|
|
204
|
+
);
|
|
197
205
|
}
|
|
198
|
-
|
|
206
|
+
const endpointCandidates = extractEndpointCandidates(
|
|
207
|
+
agentCard.endpoints,
|
|
208
|
+
this.supportedSchemes
|
|
209
|
+
);
|
|
210
|
+
const anchoredCandidates = endpointCandidates.filter((candidate) => {
|
|
211
|
+
return normalizeDomain(candidate.parsedUrl.hostname) === normalizedNativeId;
|
|
212
|
+
});
|
|
213
|
+
if (anchoredCandidates.length === 0) {
|
|
199
214
|
return buildErrorProfile(
|
|
200
215
|
uaid,
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
{
|
|
216
|
+
"ERR_ENDPOINT_NOT_ANCHORED",
|
|
217
|
+
"No endpoint URL is anchored to the UAID nativeId host.",
|
|
218
|
+
{
|
|
219
|
+
nativeId: normalizedNativeId
|
|
220
|
+
}
|
|
204
221
|
);
|
|
205
222
|
}
|
|
206
|
-
const
|
|
223
|
+
const selectedEndpoint = selectPreferredEndpoint(anchoredCandidates, protocol) ?? anchoredCandidates[0];
|
|
224
|
+
let transparencyAttempted = false;
|
|
225
|
+
let transparencySucceeded = false;
|
|
226
|
+
if (this.transparencyVerifier) {
|
|
227
|
+
transparencyAttempted = true;
|
|
228
|
+
transparencySucceeded = await this.transparencyVerifier({
|
|
229
|
+
uaid,
|
|
230
|
+
protocol,
|
|
231
|
+
endpoint: selectedEndpoint.endpointUrl,
|
|
232
|
+
agentCardUrl: selectedRecord.url,
|
|
233
|
+
transparencyHints: agentCard.transparencyHints
|
|
234
|
+
});
|
|
235
|
+
if (!transparencySucceeded) {
|
|
236
|
+
return buildErrorProfile(
|
|
237
|
+
uaid,
|
|
238
|
+
"ERR_TRANSPARENCY_VERIFICATION_FAILED",
|
|
239
|
+
"Transparency verification failed.",
|
|
240
|
+
{
|
|
241
|
+
agentCardUrl: selectedRecord.url
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const did = context.did ?? void 0;
|
|
207
247
|
const alsoKnownAs = did ? [did] : void 0;
|
|
248
|
+
const verificationLevel = transparencySucceeded ? "cryptographic" : "metadata";
|
|
249
|
+
const verificationMethod = transparencySucceeded ? "ans-transparency" : "metadata-match";
|
|
208
250
|
return {
|
|
209
251
|
id: uaid,
|
|
210
252
|
did,
|
|
211
253
|
alsoKnownAs,
|
|
254
|
+
service: [
|
|
255
|
+
{
|
|
256
|
+
id: `${uaid}#ans-endpoint`,
|
|
257
|
+
type: "ANSService",
|
|
258
|
+
serviceEndpoint: selectedEndpoint.endpointUrl
|
|
259
|
+
}
|
|
260
|
+
],
|
|
212
261
|
metadata: {
|
|
213
|
-
profile:
|
|
262
|
+
profile: ANS_DNS_WEB_PROFILE_ID,
|
|
214
263
|
resolved: true,
|
|
215
|
-
|
|
264
|
+
endpoint: selectedEndpoint.endpointUrl,
|
|
265
|
+
protocol,
|
|
266
|
+
precedenceSource: "dns",
|
|
267
|
+
verification: {
|
|
268
|
+
level: verificationLevel,
|
|
269
|
+
method: verificationMethod
|
|
270
|
+
},
|
|
216
271
|
verificationLevel,
|
|
217
|
-
|
|
272
|
+
agentCardUrl: selectedRecord.url,
|
|
273
|
+
dnsRecordSelection: "lexicographically-smallest-url",
|
|
274
|
+
transparencyHints: agentCard.transparencyHints,
|
|
275
|
+
transparencyVerification: {
|
|
276
|
+
attempted: transparencyAttempted,
|
|
277
|
+
succeeded: transparencySucceeded
|
|
278
|
+
}
|
|
218
279
|
}
|
|
219
280
|
};
|
|
220
281
|
}
|
|
221
282
|
}
|
|
222
283
|
export {
|
|
223
|
-
|
|
224
|
-
|
|
284
|
+
ANS_DNS_WEB_PROFILE_ID,
|
|
285
|
+
AnsDnsWebProfileResolver
|
|
225
286
|
};
|
|
226
287
|
//# sourceMappingURL=standards-sdk.es63.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es63.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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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es63.js","sources":["../../src/hcs-14/resolvers/ans-dns-web-profile.ts"],"sourcesContent":["import type {\n DidResolutionProfile,\n ProfileResolutionError,\n ProfileResolutionTransparencyHints,\n UaidProfileResolver,\n UaidProfileResolverContext,\n} from './types';\nimport type { AdapterMeta } from '../adapters/types';\nimport { nodeDnsTxtLookup, type DnsTxtLookup } from './dns';\nimport { isFqdn, normalizeDomain } from './profile-utils';\nimport {\n parseAnsDnsTxtRecord,\n type AnsDnsTxtRecord,\n parseAnsAgentCard,\n extractEndpointCandidates,\n selectPreferredEndpoint,\n isValidAnsProfileVersion,\n normalizeAnsVersion,\n toErrorMessage,\n} from './ans-dns-web-profile-utils';\n\nexport const ANS_DNS_WEB_PROFILE_ID = 'hcs-14.profile.ans-dns-web';\n\nexport interface AnsTransparencyVerificationInput {\n uaid: string;\n protocol: string;\n endpoint: string;\n agentCardUrl: string;\n transparencyHints?: ProfileResolutionTransparencyHints;\n}\n\ntype AnsTransparencyVerifier = (\n input: AnsTransparencyVerificationInput,\n) => Promise<boolean>;\n\nexport interface AnsDnsWebResolverOptions {\n dnsLookup?: DnsTxtLookup;\n fetchJson?: (url: string) => Promise<unknown>;\n supportedUriSchemes?: string[];\n transparencyVerifier?: AnsTransparencyVerifier;\n}\n\nconst UAID_UNSPECIFIED_PARAM_VALUE = '0';\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: ANS_DNS_WEB_PROFILE_ID,\n resolved: false,\n },\n };\n}\n\nasync function defaultFetchJson(url: string): Promise<unknown> {\n if (typeof globalThis.fetch !== 'function') {\n throw new Error('Fetch API is unavailable in this runtime.');\n }\n\n const response = await globalThis.fetch(url, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n if (!response.ok) {\n throw new Error(\n `Agent Card request failed with status ${response.status}.`,\n );\n }\n return response.json();\n}\n\nfunction isUnspecifiedUaidParamValue(value: string | undefined): boolean {\n return !value || value === UAID_UNSPECIFIED_PARAM_VALUE;\n}\n\nfunction selectDeterministicAnsDnsRecord(\n records: AnsDnsTxtRecord[],\n): AnsDnsTxtRecord {\n return [...records].sort((a, b) => a.url.localeCompare(b.url))[0];\n}\n\nexport class AnsDnsWebProfileResolver implements UaidProfileResolver {\n readonly adapterKind: 'uaid-profile-resolver' = 'uaid-profile-resolver';\n readonly profile = ANS_DNS_WEB_PROFILE_ID;\n\n readonly meta: AdapterMeta = {\n id: 'hcs-14/ans-dns-web',\n didMethods: ['*'],\n displayName: 'HCS-14 ANS DNS/Web Profile',\n description:\n 'Resolves ANS uaid:aid identifiers via _ans.<nativeId> TXT records and Agent Card endpoint selection.',\n };\n\n private readonly dnsLookup: DnsTxtLookup;\n private readonly fetchJson: (url: string) => Promise<unknown>;\n private readonly supportedSchemes: Set<string>;\n private readonly transparencyVerifier?: AnsTransparencyVerifier;\n\n constructor(options: AnsDnsWebResolverOptions = {}) {\n this.dnsLookup = options.dnsLookup ?? nodeDnsTxtLookup;\n this.fetchJson = options.fetchJson ?? defaultFetchJson;\n this.supportedSchemes = new Set(\n (options.supportedUriSchemes ?? ['https', 'wss']).map(scheme =>\n scheme.toLowerCase(),\n ),\n );\n this.transparencyVerifier = options.transparencyVerifier;\n }\n\n supports(\n _uaid: string,\n parsed: UaidProfileResolverContext['parsedUaid'],\n ): boolean {\n if (parsed.method !== 'aid') {\n return false;\n }\n if (parsed.params['registry'] !== 'ans') {\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 buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'ANS profile only applies to uaid:aid identifiers.',\n );\n }\n if (parsed.params['registry'] !== 'ans') {\n return buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'ANS profile requires registry=ans.',\n );\n }\n\n const nativeId = parsed.params['nativeId'];\n if (!nativeId || !isFqdn(nativeId)) {\n return buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'ANS profile requires an FQDN nativeId.',\n );\n }\n\n const uid = parsed.params['uid'];\n if (isUnspecifiedUaidParamValue(uid)) {\n return buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'ANS profile requires a non-zero uid parameter.',\n );\n }\n\n const protocol = parsed.params['proto'];\n if (isUnspecifiedUaidParamValue(protocol)) {\n return buildErrorProfile(\n uaid,\n 'ERR_PROTOCOL_UNSPECIFIED',\n 'ANS profile requires a usable proto parameter.',\n );\n }\n const uaidVersion = parsed.params['version'];\n const normalizedUaidVersion =\n uaidVersion === undefined ? undefined : normalizeAnsVersion(uaidVersion);\n if (uaidVersion !== undefined && !isValidAnsProfileVersion(uaidVersion)) {\n return buildErrorProfile(\n uaid,\n 'ERR_NOT_APPLICABLE',\n 'ANS profile requires a valid semver version parameter when provided.',\n );\n }\n\n const normalizedNativeId = normalizeDomain(nativeId);\n const dnsName = `_ans.${normalizedNativeId}`;\n const txtRecords = await this.dnsLookup(dnsName);\n if (txtRecords.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_NO_DNS_RECORD',\n 'No ANS DNS TXT record was found for the requested nativeId.',\n { dnsName },\n );\n }\n\n const validTxtRecords = txtRecords\n .map(record => parseAnsDnsTxtRecord(record))\n .filter((record): record is AnsDnsTxtRecord => record !== null);\n if (validTxtRecords.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_INVALID_ANS_RECORD',\n 'ANS DNS TXT payload is malformed or unsupported.',\n { dnsName },\n );\n }\n\n let matchingVersionRecords = validTxtRecords;\n if (normalizedUaidVersion) {\n const recordsWithVersion = validTxtRecords.filter(record => {\n return record.version !== undefined;\n });\n if (recordsWithVersion.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_VERSION_MISMATCH',\n 'UAID specifies a version but no ANS DNS TXT record carries a version field.',\n { dnsName, uaidVersion: normalizedUaidVersion },\n );\n }\n matchingVersionRecords = recordsWithVersion.filter(record => {\n return record.version === normalizedUaidVersion;\n });\n if (matchingVersionRecords.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_VERSION_MISMATCH',\n 'UAID version does not match ANS DNS TXT record version.',\n { dnsName, uaidVersion: normalizedUaidVersion },\n );\n }\n }\n\n const selectedRecord = selectDeterministicAnsDnsRecord(\n matchingVersionRecords,\n );\n\n let agentCardPayload: unknown;\n try {\n agentCardPayload = await this.fetchJson(selectedRecord.url);\n } catch (error) {\n return buildErrorProfile(\n uaid,\n 'ERR_AGENT_CARD_INVALID',\n 'Agent Card retrieval failed.',\n {\n stage: 'fetch',\n agentCardUrl: selectedRecord.url,\n reason: toErrorMessage(error),\n },\n );\n }\n\n const agentCard = parseAnsAgentCard(agentCardPayload);\n if (!agentCard) {\n return buildErrorProfile(\n uaid,\n 'ERR_AGENT_CARD_INVALID',\n 'Agent Card is missing required fields.',\n { stage: 'validate', agentCardUrl: selectedRecord.url },\n );\n }\n if (agentCard.ansName !== uid) {\n return buildErrorProfile(\n uaid,\n 'ERR_AGENT_CARD_INVALID',\n 'Agent Card ansName does not match UAID uid.',\n {\n stage: 'validate',\n expectedUid: uid,\n actualAnsName: agentCard.ansName,\n },\n );\n }\n\n const endpointCandidates = extractEndpointCandidates(\n agentCard.endpoints,\n this.supportedSchemes,\n );\n const anchoredCandidates = endpointCandidates.filter(candidate => {\n return (\n normalizeDomain(candidate.parsedUrl.hostname) === normalizedNativeId\n );\n });\n if (anchoredCandidates.length === 0) {\n return buildErrorProfile(\n uaid,\n 'ERR_ENDPOINT_NOT_ANCHORED',\n 'No endpoint URL is anchored to the UAID nativeId host.',\n {\n nativeId: normalizedNativeId,\n },\n );\n }\n\n const selectedEndpoint =\n selectPreferredEndpoint(anchoredCandidates, protocol) ??\n anchoredCandidates[0]!;\n\n let transparencyAttempted = false;\n let transparencySucceeded = false;\n if (this.transparencyVerifier) {\n transparencyAttempted = true;\n transparencySucceeded = await this.transparencyVerifier({\n uaid,\n protocol,\n endpoint: selectedEndpoint.endpointUrl,\n agentCardUrl: selectedRecord.url,\n transparencyHints: agentCard.transparencyHints,\n });\n if (!transparencySucceeded) {\n return buildErrorProfile(\n uaid,\n 'ERR_TRANSPARENCY_VERIFICATION_FAILED',\n 'Transparency verification failed.',\n {\n agentCardUrl: selectedRecord.url,\n },\n );\n }\n }\n\n const did = context.did ?? undefined;\n const alsoKnownAs = did ? [did] : undefined;\n const verificationLevel: 'metadata' | 'cryptographic' =\n transparencySucceeded ? 'cryptographic' : 'metadata';\n const verificationMethod = transparencySucceeded\n ? 'ans-transparency'\n : 'metadata-match';\n\n return {\n id: uaid,\n did,\n alsoKnownAs,\n service: [\n {\n id: `${uaid}#ans-endpoint`,\n type: 'ANSService',\n serviceEndpoint: selectedEndpoint.endpointUrl,\n },\n ],\n metadata: {\n profile: ANS_DNS_WEB_PROFILE_ID,\n resolved: true,\n endpoint: selectedEndpoint.endpointUrl,\n protocol,\n precedenceSource: 'dns',\n verification: {\n level: verificationLevel,\n method: verificationMethod,\n },\n verificationLevel,\n agentCardUrl: selectedRecord.url,\n dnsRecordSelection: 'lexicographically-smallest-url',\n transparencyHints: agentCard.transparencyHints,\n transparencyVerification: {\n attempted: transparencyAttempted,\n succeeded: transparencySucceeded,\n },\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
|