diff --git a/packages/metro-cache/src/stores/HttpStore.js b/packages/metro-cache/src/stores/HttpStore.js index 951671b30b..97c90645b5 100644 --- a/packages/metro-cache/src/stores/HttpStore.js +++ b/packages/metro-cache/src/stores/HttpStore.js @@ -396,14 +396,12 @@ export default class HttpStore { return backOff(fn, { jitter: 'full', maxDelay: 30000, - numOfAttempts: this.#getEndpoint.maxAttempts || Number.POSITIVE_INFINITY, + numOfAttempts: endpoint.maxAttempts || Number.POSITIVE_INFINITY, retry: (e: Error) => { if (e instanceof HttpError) { - return this.#getEndpoint.retryStatuses.has(e.code); + return endpoint.retryStatuses.has(e.code); } - return ( - e instanceof NetworkError && this.#getEndpoint.retryNetworkErrors - ); + return e instanceof NetworkError && endpoint.retryNetworkErrors; }, }); } diff --git a/packages/metro-cache/src/stores/__tests__/HttpStore-test.js b/packages/metro-cache/src/stores/__tests__/HttpStore-test.js index e8496ab2b9..6802648844 100644 --- a/packages/metro-cache/src/stores/__tests__/HttpStore-test.js +++ b/packages/metro-cache/src/stores/__tests__/HttpStore-test.js @@ -290,6 +290,39 @@ describe('HttpStore', () => { }); }); + test('set() retries use the set endpoint config, not the get endpoint', async () => { + jest.useRealTimers(); + // Distinct read/write retry config: reads do not retry, writes retry 503s. + const store = new HttpStore({ + getOptions: {endpoint: 'http://example.com', maxAttempts: 1}, + setOptions: { + endpoint: 'http://example.com', + maxAttempts: 2, + retryStatuses: [503], + }, + }); + const {request} = require('http'); + + request.mockImplementation((opts, callback) => { + if (request.mock.calls.length === 1) { + callback(responseHttpError(503)); + } else { + callback(responseHttpOk('')); + } + return new PassThrough(); + }); + + let error; + try { + await store.set(Buffer.from('key-set'), {foo: 42}); + } catch (e) { + error = e; + } + + expect(error).toBeUndefined(); + expect(request).toHaveBeenCalledTimes(2); + }); + test('sets using the network via PUT method', done => { const store = new HttpStore({endpoint: 'http://www.example.com/endpoint'}); const promise = store.set(Buffer.from('key-set'), {foo: 42});