diff --git a/src/backend/common/infrastructure/Atomic.ts b/src/backend/common/infrastructure/Atomic.ts index 9fbbbe0f..e9fbe0fc 100644 --- a/src/backend/common/infrastructure/Atomic.ts +++ b/src/backend/common/infrastructure/Atomic.ts @@ -343,6 +343,7 @@ export interface MusicbrainzApiConfigData { contact: string, ttl?: string apiKey?: string + requestTimeout?: number } export const MUSICBRAINZ_URL = 'https://musicbrainz.org'; diff --git a/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts b/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts index 2e176bf0..7d355096 100644 --- a/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts +++ b/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts @@ -76,7 +76,7 @@ export class MusicbrainzApiClient extends AbstractApiClient { } return [method, url, headers]; } : () => null, - requestTimeout: 6000, + requestTimeout: mbConfig.requestTimeout ?? 6000, retryLimit: 2 }); mbApis[u.url.hostname] = {api, ...mbConfig, hostname: u.url.hostname}; diff --git a/src/backend/tests/musicbrainz/musicbrainz.test.ts b/src/backend/tests/musicbrainz/musicbrainz.test.ts index 1a0e4e59..21bafb7b 100644 --- a/src/backend/tests/musicbrainz/musicbrainz.test.ts +++ b/src/backend/tests/musicbrainz/musicbrainz.test.ts @@ -34,7 +34,7 @@ const createMbTransformer = (apis: MusicbrainzApiConfigData[] = [defaultApiConfi ttl: '1ms' } }, { - logger: loggerDebug, + logger: loggerTest, clientCache: memorycache(), cache: memorycache() }); @@ -170,7 +170,7 @@ describe('Musicbrainz API', function () { it('psuedo-releases', async function () { - this.timeout(3500); + this.timeout(5500); const play: PlayObject = { data: { @@ -198,36 +198,67 @@ describe('Musicbrainz API', function () { }); describe('Multiple Endpoints', function () { - it('should fallback to another endpoint if current one fails', withRequestInterception([ - http.get(/mbtest\.local\/?\/ws/, async () => { - // - await delay(5000); - throw new MockNetworkError('EAI_AGAIN'); - }) - ],async function() { - //this.timeout(3500); + it('should fallback to another endpoint if current one fails', async function () { + this.timeout(5000); + await withRequestInterception([ + http.get(/mbtest\.local\/?\/ws/, async () => { + throw new MockNetworkError('EAI_AGAIN'); + }) + ], async function () { + + const multiMb = createMbTransformer([{ contact: 'test@foxxmd.dev', url: 'https://mbtest.local' }, defaultApiConfig]); + + const play: PlayObject = { + data: { + track: "Little Joe and Mary ii", + artists: ["Khruangbin"], + album: "The Universe Smiles Upon You ii" + }, + meta: {} + } + await multiMb.tryInitialize(); - const multiMb = createMbTransformer([{contact: 'test@foxxmd.dev', url: 'https://mbtest.local'}, defaultApiConfig]); + const res = await multiMb.getTransformerData(play, { + type: "musicbrainz", + searchWhenMissing: ["artists", "album", "title"] + }); + expect(res.recordings).to.exist; + expect(res.recordings).to.not.be.empty; - const play: PlayObject = { - data: { - track: "Little Joe and Mary ii", - artists: ["Khruangbin"], - album: "The Universe Smiles Upon You ii" - }, - meta: {} - } - await multiMb.tryInitialize(); + })(); + }); - const res = await multiMb.getTransformerData(play, { - type: "musicbrainz", - searchWhenMissing: ["artists", "album", "title"] - }); - expect(res.recordings).to.exist; - expect(res.recordings).to.not.be.empty; + it('should fallback to another endpoint if current one takes too long to respond', async function () { + this.timeout(10000); + await withRequestInterception([ + http.get(/mbtest\.local\/?\/ws/, async () => { + await delay(3000); + throw new MockNetworkError('EAI_AGAIN'); + }) + ], async function () { + + const multiMb = createMbTransformer([{ contact: 'test@foxxmd.dev', url: 'https://mbtest.local' }, { ...defaultApiConfig, requestTimeout: 1000 }]); + + const play: PlayObject = { + data: { + track: "Little Joe and Mary ii", + artists: ["Khruangbin"], + album: "The Universe Smiles Upon You ii" + }, + meta: {} + } + await multiMb.tryInitialize(); - })); + const res = await multiMb.getTransformerData(play, { + type: "musicbrainz", + searchWhenMissing: ["artists", "album", "title"] + }); + expect(res.recordings).to.exist; + expect(res.recordings).to.not.be.empty; + + })(); + }); }); }); \ No newline at end of file