diff --git a/package-lock.json b/package-lock.json index 53c5435..06dc0fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@filecoin-saturn/js-client", - "version": "0.3.3", + "version": "0.3.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@filecoin-saturn/js-client", - "version": "0.3.3", + "version": "0.3.4", "license": "(MIT OR Apache-2.0)", "dependencies": { "@ipld/car": "^4.1.5", diff --git a/package.json b/package.json index e668c17..edb7f47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@filecoin-saturn/js-client", - "version": "0.3.3", + "version": "0.3.4", "description": "Filecoin Saturn Client", "homepage": "https://github.com/filecoin-saturn/js-client", "main": "src/index.js", @@ -61,4 +61,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/src/client.js b/src/client.js index ab49a10..b90b4da 100644 --- a/src/client.js +++ b/src/client.js @@ -242,6 +242,9 @@ export class Saturn { * @returns {Promise>} */ async * fetchContentWithFallback (cidPath, opts = {}) { + const upstreamController = opts.controller + delete opts.controller + let lastError = null let skipNodes = false // we use this to checkpoint at which chunk a request failed. @@ -253,6 +256,13 @@ export class Saturn { } const fetchContent = async function * (options) { + const controller = new AbortController() + opts.controller = controller + if (upstreamController) { + upstreamController.signal.addEventListener('abort', () => { + controller.abort() + }) + } let byteCount = 0 const fetchOptions = Object.assign(opts, { format: 'car' }, options) const byteChunks = await this.fetchContent(cidPath, fetchOptions) @@ -293,7 +303,7 @@ export class Saturn { let fallbackCount = 0 const nodes = this.nodes for (let i = 0; i < nodes.length; i++) { - if (fallbackCount > this.config.fallbackLimit || skipNodes) { + if (fallbackCount > this.config.fallbackLimit || skipNodes || upstreamController?.signal.aborted) { break } if (opts.raceNodes) { diff --git a/src/types.js b/src/types.js index f450098..26d3a78 100644 --- a/src/types.js +++ b/src/types.js @@ -23,6 +23,7 @@ * @property {string} [customerFallbackURL] - Customer Origin that is a fallback. * @property {number} [connectTimeout=5000] - Connection timeout in milliseconds. * @property {number} [downloadTimeout=0] - Download timeout in milliseconds. + * @property {AbortController} [controller] */ export {}