From f46700fd871d5419e75ecfb0b00fb01aedbe84c7 Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Mon, 20 May 2024 16:41:35 +0100 Subject: [PATCH] fix: check eviction filter for new providers (#542) When new providers are found, check the eviction filter in `isEvicted` rather than the current list of providers. Fixes #501 --- packages/utils/src/abstract-session.ts | 2 +- packages/utils/test/abstract-session.spec.ts | 21 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/abstract-session.ts b/packages/utils/src/abstract-session.ts index a8fcd048..41718411 100644 --- a/packages/utils/src/abstract-session.ts +++ b/packages/utils/src/abstract-session.ts @@ -188,7 +188,7 @@ export abstract class AbstractSession this.equals(prov, provider)) + return this.evictionFilter.has(this.toEvictionKey(provider)) } hasProvider (provider: Provider): boolean { diff --git a/packages/utils/test/abstract-session.spec.ts b/packages/utils/test/abstract-session.spec.ts index 43228ff2..025ca29a 100644 --- a/packages/utils/test/abstract-session.spec.ts +++ b/packages/utils/test/abstract-session.spec.ts @@ -233,4 +233,25 @@ describe('abstract-session', () => { })).to.eventually.be.rejected() .with.property('code', 'ABORT_ERR') }) + + it('should not make multiple requests to the only found provider', async function () { + const session = new Session() + const cid = CID.parse('bafybeifaymukvfkyw6xgh4th7tsctiifr4ea2btoznf46y6b2fnvikdczi') + const id = await createEd25519PeerId() // same provider + + session.findNewProviders.callsFake(async function * () { + yield { + id + } + }) + session.queryProvider.callsFake(async () => { + // always fails + throw new Error('Urk!') + }) + + await expect(session.retrieve(cid)).to.eventually.be.rejected() + + expect(session.findNewProviders).to.have.property('callCount', 2) + expect(session.queryProvider).to.have.property('callCount', 1) + }) })