diff --git a/js/web/test/test-runner.ts b/js/web/test/test-runner.ts index 7c03e5b915..d8ee5ef953 100644 --- a/js/web/test/test-runner.ts +++ b/js/web/test/test-runner.ts @@ -159,7 +159,8 @@ async function initializeSession( if (preloadModelData) { session = await ort.InferenceSession.create(preloadModelData, sessionConfig); } else { - session = await ort.InferenceSession.create(modelFilePath, sessionConfig); + const modelData = await readFile(modelFilePath); + session = await ort.InferenceSession.create(modelData, sessionConfig); } } catch (e) { Logger.error( diff --git a/js/web/test/test-shared.ts b/js/web/test/test-shared.ts index 7c327e7c97..55beb66e37 100644 --- a/js/web/test/test-shared.ts +++ b/js/web/test/test-shared.ts @@ -15,14 +15,33 @@ export function bufferToBase64(buffer: Uint8Array): string { return base64.fromByteArray(buffer); } +async function retry(fn: () => Promise, maxRetries = 3, delay = 100): Promise { + let retries = maxRetries; + do { + try { + return await fn(); + } catch (err) { + if (retries-- === 0) { + throw err; + } + await new Promise(resolve => setTimeout(resolve, delay)); + } + // eslint-disable-next-line no-constant-condition + } while (true); +} + export async function readFile(file: string) { if (typeof process !== 'undefined' && process.versions && process.versions.node) { // node return fs.readFile(file); } else { // browser - const response = await fetch(file); - return new Uint8Array(await response.arrayBuffer()); + // + // use "retry" to workaround the error "TypeError: Failed to fetch" in some test environments + return retry(async () => { + const response = await fetch(file); + return new Uint8Array(await response.arrayBuffer()); + }); } }