Skip to content

Commit 4428a00

Browse files
committed
fix: retry IPNI requests on 5xx errors
Signed-off-by: Miroslav Bajtoš <oss@bajtos.net>
1 parent 7bfba6f commit 4428a00

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

lib/ipni-client.js

+22-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { decodeBase64, decodeVarint } from '../vendor/deno-deps.js'
1+
import { decodeBase64, decodeVarint, pRetry, assertOkResponse } from '../vendor/deno-deps.js'
22

33
/**
44
*
@@ -10,22 +10,23 @@ import { decodeBase64, decodeVarint } from '../vendor/deno-deps.js'
1010
* }>}
1111
*/
1212
export async function queryTheIndex (cid, providerId) {
13-
const url = `https://cid.contact/cid/${encodeURIComponent(cid)}`
14-
1513
let providerResults
1614
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+
})
2524
console.log('IPNI returned %s provider results', providerResults.length)
2625
} catch (err) {
2726
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+
}
2930
}
3031

3132
let graphsyncProvider
@@ -70,3 +71,12 @@ export async function queryTheIndex (cid, providerId) {
7071
console.log('All advertisements are from other miners or for unsupported protocols.')
7172
return { indexerResult: 'NO_VALID_ADVERTISEMENT' }
7273
}
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

Comments
 (0)