From 9679fba9583afa0fc40ae283d67fe308f501d83a Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 2 Sep 2024 13:34:28 -0700 Subject: [PATCH] add fetch retries configuration --- src/common/fetch-common.ts | 8 +++++++- src/generator.ts | 13 +++++++++++++ src/providers/deno.ts | 1 - src/providers/nodemodules.ts | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/common/fetch-common.ts b/src/common/fetch-common.ts index 6115f8da..c3ac8a1b 100644 --- a/src/common/fetch-common.ts +++ b/src/common/fetch-common.ts @@ -11,6 +11,12 @@ export type FetchFn = ( ...args: any[] ) => Promise; +let retryCount = 3; + +export function setRetryCount(count: number) { + retryCount = count; +} + /** * Wraps a fetch request with retry logic on exceptions, which is useful for * spotty connections that may fail intermittently. @@ -22,7 +28,7 @@ export function wrapWithRetry(fetch: FetchFn): FetchFn { try { return await fetch(url, ...args); } catch (e) { - if (retries++ > 3) throw e; + if (retries++ >= retryCount) throw e; } } }; diff --git a/src/generator.ts b/src/generator.ts index 3dc028d2..40b971d5 100644 --- a/src/generator.ts +++ b/src/generator.ts @@ -44,6 +44,7 @@ import { getDefaultProviderStrings, type Provider } from "./providers/index.js"; import * as nodemodules from "./providers/nodemodules.js"; import { Resolver } from "./trace/resolver.js"; import { getMaybeWrapperUrl } from "./common/wrapper.js"; +import { setRetryCount } from "./common/fetch-common.js"; // Utility exports for users: export { analyzeHtml }; @@ -308,6 +309,12 @@ export interface GeneratorOptions { * Whether to include "integrity" field in the import map */ integrity?: boolean; + + /** + * The number of fetch retries to attempt for request failures. + * Defaults to 3. + */ + fetchRetries?: number; } export interface ModuleAnalysis { @@ -400,6 +407,7 @@ export class Generator { commonJS = false, typeScript = false, integrity = false, + fetchRetries, }: GeneratorOptions = {}) { // Initialise the debug logger: const { log, logStream } = createLogger(); @@ -512,6 +520,10 @@ export class Generator { this.map = new ImportMap({ mapUrl: this.mapUrl, rootUrl: this.rootUrl }); if (!integrity) this.map.integrity = {}; if (inputMap) this.addMappings(inputMap); + + // Set the fetch retry count + if (typeof fetchRetries === 'number') + setRetryCount(fetchRetries); } /** @@ -1411,3 +1423,4 @@ function detectDefaultProvider( return defaultProvider || winner || "jspm.io"; } + diff --git a/src/providers/deno.ts b/src/providers/deno.ts index 838c4334..808ecb3e 100644 --- a/src/providers/deno.ts +++ b/src/providers/deno.ts @@ -8,7 +8,6 @@ import { SemverRange } from "sver"; // @ts-ignore import { fetch } from "#fetch"; import { Install } from "../generator.js"; -import { IImportMap, ImportMap } from "@jspm/import-map"; const cdnUrl = "https://deno.land/x/"; const stdlibUrl = "https://deno.land/std"; diff --git a/src/providers/nodemodules.ts b/src/providers/nodemodules.ts index 3ba5e7bf..c66ffce9 100644 --- a/src/providers/nodemodules.ts +++ b/src/providers/nodemodules.ts @@ -1,4 +1,4 @@ -import { ExactModule, LatestPackageTarget } from "../install/package.js"; +import { LatestPackageTarget } from "../install/package.js"; import { ExactPackage } from "../install/package.js"; import { Resolver } from "../trace/resolver.js"; import { Provider } from "./index.js";