@@ -50,11 +50,11 @@ export default function createDnslinkResolver (getState) {
5050 ! sameGateway ( requestUrl , state . gwURL )
5151 } ,
5252
53- dnslinkAtGateway ( url , dnslink ) {
53+ async dnslinkAtGateway ( url , dnslink ) {
5454 if ( typeof url === 'string' ) {
5555 url = new URL ( url )
5656 }
57- if ( dnslinkResolver . canRedirectToIpns ( url , dnslink ) ) {
57+ if ( await dnslinkResolver . canRedirectToIpns ( url , dnslink ) ) {
5858 const state = getState ( )
5959 // redirect to IPNS and leave it up to the gateway
6060 // to load the correct path from IPFS
@@ -65,12 +65,12 @@ export default function createDnslinkResolver (getState) {
6565 }
6666 } ,
6767
68- readAndCacheDnslink ( fqdn ) {
68+ async readAndCacheDnslink ( fqdn ) {
6969 let dnslink = dnslinkResolver . cachedDnslink ( fqdn )
7070 if ( typeof dnslink === 'undefined' ) {
7171 try {
7272 log ( `dnslink cache miss for '${ fqdn } ', running DNS TXT lookup` )
73- dnslink = dnslinkResolver . readDnslinkFromTxtRecord ( fqdn )
73+ dnslink = await dnslinkResolver . readDnslinkFromTxtRecord ( fqdn )
7474 if ( dnslink ) {
7575 // TODO: set TTL as maxAge: setDnslink(fqdn, dnslink, maxAge)
7676 dnslinkResolver . setDnslink ( fqdn , dnslink )
@@ -96,6 +96,7 @@ export default function createDnslinkResolver (getState) {
9696 const cachedResult = dnslinkResolver . cachedDnslink ( fqdn )
9797 if ( cachedResult ) return cachedResult
9898 return lookupQueue . add ( ( ) => {
99+ // this will resolve eventually.
99100 return dnslinkResolver . readAndCacheDnslink ( fqdn )
100101 } )
101102 } ,
@@ -120,7 +121,7 @@ export default function createDnslinkResolver (getState) {
120121 } ,
121122
122123 // low level lookup without cache
123- readDnslinkFromTxtRecord ( fqdn ) {
124+ async readDnslinkFromTxtRecord ( fqdn ) {
124125 const state = getState ( )
125126 let apiProvider
126127 if ( ! state . ipfsNodeType . startsWith ( 'embedded' ) && state . peerCount !== offlinePeerCount ) {
@@ -139,29 +140,29 @@ export default function createDnslinkResolver (getState) {
139140 // TODO: revisit after https://github.com/ipfs/js-ipfs-api/issues/501 is addressed
140141 // TODO: consider worst-case-scenario fallback to https://developers.google.com/speed/public-dns/docs/dns-over-https
141142 const apiCall = `${ apiProvider } api/v0/name/resolve/${ fqdn } ?r=false`
142- const xhr = new XMLHttpRequest ( ) // older XHR API us used because window.fetch appends Origin which causes error 403 in go-ipfs
143- // synchronous mode with small timeout
144- // (it is okay, because we do it only once, then it is cached and read via readAndCacheDnslink)
145- xhr . open ( 'GET' , apiCall , false )
146- xhr . setRequestHeader ( 'Accept' , 'application/json' )
147- xhr . send ( null )
148- if ( xhr . status === 200 ) {
149- const dnslink = JSON . parse ( xhr . responseText ) . Path
150- // console.log('readDnslinkFromTxtRecord', readDnslinkFromTxtRecord )
143+ const response = await fetch ( apiCall , {
144+ method : 'GET' ,
145+ headers : {
146+ Accept : 'application/json'
147+ }
148+ } )
149+
150+ if ( response . ok ) {
151+ const { Path : dnslink } = await response . json ( )
151152 if ( ! IsIpfs . path ( dnslink ) ) {
152153 throw new Error ( `dnslink for '${ fqdn } ' is not a valid IPFS path: '${ dnslink } '` )
153154 }
154155 return dnslink
155- } else if ( xhr . status === 500 ) {
156+ } else if ( response . status === 500 ) {
156157 // go-ipfs returns 500 if host has no dnslink or an error occurred
157158 // TODO: find/fill an upstream bug to make this more intuitive
158159 return false
159160 } else {
160- throw new Error ( xhr . statusText )
161+ throw new Error ( response . statusText )
161162 }
162163 } ,
163164
164- canRedirectToIpns ( url , dnslink ) {
165+ async canRedirectToIpns ( url , dnslink ) {
165166 if ( typeof url === 'string' ) {
166167 url = new URL ( url )
167168 }
@@ -185,7 +186,7 @@ export default function createDnslinkResolver (getState) {
185186 // is found in initial response.
186187 // More: https://github.com/ipfs-shipyard/ipfs-companion/blob/master/docs/dnslink.md
187188 const foundDnslink = dnslink ||
188- ( getState ( ) . dnslinkPolicy === 'enabled'
189+ await ( getState ( ) . dnslinkPolicy === 'enabled'
189190 ? dnslinkResolver . readAndCacheDnslink ( fqdn )
190191 : dnslinkResolver . cachedDnslink ( fqdn ) )
191192 if ( foundDnslink ) {
@@ -205,7 +206,7 @@ export default function createDnslinkResolver (getState) {
205206 // Test if URL contains a valid DNSLink FQDN
206207 // in url.hostname OR in url.pathname (/ipns/<fqdn>)
207208 // and return matching FQDN if present
208- findDNSLinkHostname ( url ) {
209+ async findDNSLinkHostname ( url ) {
209210 if ( ! url ) return
210211 // Normalize subdomain and path gateways to to /ipns/<fqdn>
211212 const contentPath = ipfsContentPath ( url )
@@ -214,14 +215,14 @@ export default function createDnslinkResolver (getState) {
214215 const ipnsRoot = contentPath . match ( / ^ \/ i p n s \/ ( [ ^ / ] + ) / ) [ 1 ]
215216 // console.log('findDNSLinkHostname ==> inspecting IPNS root', ipnsRoot)
216217 // Ignore PeerIDs, match DNSLink only
217- if ( ! IsIpfs . cid ( ipnsRoot ) && dnslinkResolver . readAndCacheDnslink ( ipnsRoot ) ) {
218+ if ( ! IsIpfs . cid ( ipnsRoot ) && await dnslinkResolver . readAndCacheDnslink ( ipnsRoot ) ) {
218219 // console.log('findDNSLinkHostname ==> found DNSLink for FQDN in url.pathname: ', ipnsRoot)
219220 return ipnsRoot
220221 }
221222 }
222223 // Check main hostname
223224 const { hostname } = new URL ( url )
224- if ( dnslinkResolver . readAndCacheDnslink ( hostname ) ) {
225+ if ( await dnslinkResolver . readAndCacheDnslink ( hostname ) ) {
225226 // console.log('findDNSLinkHostname ==> found DNSLink for url.hostname', hostname)
226227 return hostname
227228 }
0 commit comments