1
- import { decodeBase64 , decodeVarint } from '../vendor/deno-deps.js'
1
+ import { decodeBase64 , decodeVarint , pRetry , assertOkResponse } from '../vendor/deno-deps.js'
2
2
3
3
/**
4
4
*
@@ -10,22 +10,23 @@ import { decodeBase64, decodeVarint } from '../vendor/deno-deps.js'
10
10
* }> }
11
11
*/
12
12
export async function queryTheIndex ( cid , providerId ) {
13
- const url = `https://cid.contact/cid/${ encodeURIComponent ( cid ) } `
14
-
15
13
let providerResults
16
14
try {
17
- const res = await fetch ( url )
18
- if ( ! res . ok ) {
19
- console . error ( 'IPNI query failed, HTTP response: %s %s' , res . status , ( await res . text ( ) ) . trimEnd ( ) )
20
- return { indexerResult : `ERROR_${ res . status } ` }
21
- }
22
-
23
- const result = await res . json ( )
24
- providerResults = result . MultihashResults . flatMap ( r => r . ProviderResults )
15
+ providerResults = await pRetry ( ( ) => getRetrievalProviders ( cid ) , {
16
+ retries : 5 ,
17
+ shouldRetry : ( error ) => {
18
+ return error . statusCode && error . statusCode >= 500
19
+ } ,
20
+ onFailedAttempt : ( error ) => {
21
+ console . error ( 'IPNI query failed, retrying...\n' , error )
22
+ }
23
+ } )
25
24
console . log ( 'IPNI returned %s provider results' , providerResults . length )
26
25
} catch ( err ) {
27
26
console . error ( 'IPNI query failed.' , err )
28
- return { indexerResult : 'ERROR_FETCH' }
27
+ return {
28
+ indexerResult : typeof err . statusCode === 'number' ? `ERROR_${ err . statusCode } ` : 'ERROR_FETCH'
29
+ }
29
30
}
30
31
31
32
let graphsyncProvider
@@ -70,3 +71,12 @@ export async function queryTheIndex (cid, providerId) {
70
71
console . log ( 'All advertisements are from other miners or for unsupported protocols.' )
71
72
return { indexerResult : 'NO_VALID_ADVERTISEMENT' }
72
73
}
74
+
75
+ async function getRetrievalProviders ( cid ) {
76
+ const url = `https://cid.contact/cid/${ encodeURIComponent ( cid ) } `
77
+ const res = await fetch ( url )
78
+ await assertOkResponse ( res )
79
+
80
+ const result = await res . json ( )
81
+ return result . MultihashResults . flatMap ( ( r ) => r . ProviderResults )
82
+ }
0 commit comments