From a8accfd0900bd6101db6cbd1a5ef7fa02af93641 Mon Sep 17 00:00:00 2001 From: Eric Guan Date: Thu, 12 Oct 2023 10:40:30 -0700 Subject: [PATCH] Abort on error (#19) * feat: use controller from options if exists. abort fetch if error occurs. * test: check if external abort controller is used --- src/index.js | 8 +++++--- test/index.spec.js | 13 +++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 8b7c252..8355848 100644 --- a/src/index.js +++ b/src/index.js @@ -64,7 +64,7 @@ class Saturn { startTime: new Date() } - const controller = new AbortController() + const controller = options.controller ?? new AbortController() const connectTimeout = setTimeout(() => { controller.abort() }, options.connectTimeout) @@ -105,7 +105,7 @@ class Saturn { throw err } - return { res, log } + return { res, controller, log } } /** @@ -118,7 +118,7 @@ class Saturn { * @returns {Promise>} */ async * fetchContent (cidPath, opts = {}) { - const { res, log } = await this.fetchCID(cidPath, opts) + const { res, controller, log } = await this.fetchCID(cidPath, opts) async function * metricsIterable (itr) { log.numBytesSent = 0 @@ -134,6 +134,8 @@ class Saturn { yield * extractVerifiedContent(cidPath, itr) } catch (err) { log.error = err.message + controller.abort() + throw err } finally { this._finalizeLog(log) diff --git a/test/index.spec.js b/test/index.spec.js index 66b537e..c432e32 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -53,6 +53,19 @@ describe('Saturn client', () => { await assert.rejects(client.fetchCID(TEST_CID, { connectTimeout: 1 })) }) + it('should use external abort controller', async () => { + const controller = new AbortController() + setTimeout(() => controller.abort(), 5) + + await assert.rejects( + client.fetchCID(TEST_CID, { controller }), + { + name: 'AbortError', + message: 'This operation was aborted' + } + ) + }) + it.skip('should fail when exceeding download timeout', async () => { await assert.rejects(client.fetchCID(`${TEST_CID}/blah`, { downloadTimeout: 1 })) })