diff --git a/patches/lastfm-ts-api+2.3.0.patch b/patches/lastfm-ts-api+2.3.0.patch new file mode 100644 index 00000000..09964be5 --- /dev/null +++ b/patches/lastfm-ts-api+2.3.0.patch @@ -0,0 +1,116 @@ +diff --git a/node_modules/lastfm-ts-api/dist/api-request.d.ts b/node_modules/lastfm-ts-api/dist/api-request.d.ts +index 81229b1..237c488 100644 +--- a/node_modules/lastfm-ts-api/dist/api-request.d.ts ++++ b/node_modules/lastfm-ts-api/dist/api-request.d.ts +@@ -1,4 +1,5 @@ + import { LastFMParams, LastFMUnknownFunction, OptionalConfig } from './types.js'; ++import { IncomingMessage } from 'node:http'; + export declare class LastFMApiRequest { + config: OptionalConfig; + private readonly params; +@@ -11,4 +12,12 @@ export declare class LastFMApiRequest { + private getMethod; + private getOptions; + } ++export declare class LastFMResponseError extends Error { ++ response?: IncomingMessage; ++ content?: string; ++ constructor(message: string, options?: ErrorOptions & { ++ response?: IncomingMessage; ++ content?: string; ++ }); ++} + export default LastFMApiRequest; +diff --git a/node_modules/lastfm-ts-api/dist/api-request.js b/node_modules/lastfm-ts-api/dist/api-request.js +index b65e770..8e708cb 100644 +--- a/node_modules/lastfm-ts-api/dist/api-request.js ++++ b/node_modules/lastfm-ts-api/dist/api-request.js +@@ -55,7 +55,7 @@ export class LastFMApiRequest { + let data = ''; + httpResponse.setEncoding('utf8'); + httpResponse.on('data', chunk => (data += chunk)); +- httpResponse.on('end', () => resolve(data)); ++ httpResponse.on('end', () => resolve([httpResponse, data])); + httpResponse.on('error', err => reject(err)); + }); + httpRequest.on('error', err => reject(err)); +@@ -63,13 +63,16 @@ export class LastFMApiRequest { + httpRequest.write(paramsStr); + } + httpRequest.end(); +- }).then((response) => { ++ }).then(([response, content]) => { ++ if (response.headers['content-type'] !== 'application/json') { ++ throw new LastFMResponseError(`lastfm-ts-api: Expected JSON response but received '${response.headers['content-type']}'`, { response, content }); ++ } + let data; + try { +- data = JSON.parse(response); ++ data = JSON.parse(content); + } + catch (err) { +- throw new Error(`lastfm-ts-api: Unable to parse LastFM API response to JSON. API response is ${err}`); ++ throw new LastFMResponseError(`lastfm-ts-api: Unable to parse LastFM API response to JSON.`, { cause: err, response, content }); + } + if (data?.error) { + let msg = 'LastFM API returned an error.'; +@@ -80,7 +83,7 @@ export class LastFMApiRequest { + else if (data?.message !== undefined) { + msg = data.message; + } +- throw new Error(`lastfm-ts-api: ${msg}`); ++ throw new LastFMResponseError(`lastfm-ts-api: ${msg}`, { response, content }); + } + return data; + }); +@@ -115,6 +118,9 @@ export class LastFMApiRequest { + hostname: this.config.hostname ?? 'ws.audioscrobbler.com', + path: this.config.path ?? '/2.0' + }; ++ if (this.config.timeout !== undefined) { ++ options.signal = AbortSignal.timeout(this.config.timeout); ++ } + if (method === 'POST') { + options.method = 'POST'; + options.headers = { +@@ -128,5 +134,16 @@ export class LastFMApiRequest { + return options; + } + } ++export class LastFMResponseError extends Error { ++ response; ++ content; ++ constructor(message, options) { ++ super(message, options); ++ this.name = 'LastFMResponseError'; ++ const { content, response } = options ?? {}; ++ this.response = response; ++ this.content = content; ++ } ++} + export default LastFMApiRequest; + //# sourceMappingURL=api-request.js.map +\ No newline at end of file +diff --git a/node_modules/lastfm-ts-api/dist/api-request.js.map b/node_modules/lastfm-ts-api/dist/api-request.js.map +index 389f888..d5cf276 100644 +--- a/node_modules/lastfm-ts-api/dist/api-request.js.map ++++ b/node_modules/lastfm-ts-api/dist/api-request.js.map +@@ -1 +1 @@ +-{"version":3,"file":"api-request.js","sourceRoot":"","sources":["../src/api-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAIrD,MAAM,OAAO,gBAAgB;IACrB,MAAM,CAAiB;IAEb,MAAM,GAAqB,IAAI,GAAG,EAAE,CAAC;IAEtD,YAAY,MAAsB;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAEM,GAAG,CAAI,MAA8B;QAC3C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/C,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,IAAI,CAAC,MAAe;QAC1B,MAAM,SAAS,GAAyB,IAAI,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;aAC3D,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,UAAU,CAAC;aACzD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvC,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,CAAC,CAAC;gBACX,CAAC;gBAED,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,CAAC;gBACV,CAAC;YACF,CAAC;YAED,OAAO,CAAC,CAAC;QACV,CAAC,CAAC;aACD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC5B,IAAI,CAAC,EAAE,CAAC,CAAC;QAEX,IAAI,CAAC,MAAM,CAAC,GAAG,CACd,SAAS,EACT,UAAU,CAAC,KAAK,CAAC;aACf,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;aAC1B,MAAM,CAAC,KAAK,CAAC,CACf,CAAC;QAEF,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,IAAI,CAAC,MAAuC,EAAE,QAAgC;QACpF,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE9C,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,SAAS,GAAyB,IAAI,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEnD,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE;gBACnD,IAAI,IAAI,GAAG,EAAE,CAAC;gBAEd,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACjC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;gBAClD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAE5C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvB,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;YAED,WAAW,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAgB,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC;YAET,IAAI,CAAC;gBACJ,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,+EAA+E,GAAG,EAAE,CAAC,CAAC;YACvG,CAAC;YAED,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;gBACjB,IAAI,GAAG,GAAG,+BAA+B,CAAC;gBAE1C,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAEjF,GAAG,GAAG,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC1C,CAAC;qBAAM,IAAI,IAAI,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;oBACxC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;gBACpB,CAAC;gBAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;YAC1C,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YAChD,OAAO,gBAAgB,CAAC,IAAI,CAC3B,IAAI,CAAC,EAAE,CAAC,QAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAC7B,GAAG,CAAC,EAAE,CAAC,QAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CACA,CAAC;QAC9B,CAAC;QAED,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAEO,SAAS;QAChB,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAClC,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,WAAW,CAClB,MAAuC,EACvC,QAAgC;QAEhC,OAAO,QAAQ,KAAK,SAAS;YAC5B,CAAC,CAAC,OAAO,MAAM,KAAK,UAAU;gBAC7B,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,SAAS;YACZ,CAAC,CAAC,OAAO,QAAQ,KAAK,UAAU;gBAChC,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,SAAS,CAAC;IACd,CAAC;IAEO,SAAS,CAAC,MAAuC;QACxD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAEO,UAAU,CAAC,MAAkD,EAAE,MAAc;QACpF,MAAM,OAAO,GAAmB;YAC/B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,uBAAuB;YACzD,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM;SAChC,CAAC;QAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,OAAO,GAAG;gBACjB,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC3C,cAAc,EAAE,mCAAmC;aACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QAC9B,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AAED,eAAe,gBAAgB,CAAC"} +\ No newline at end of file ++{"version":3,"file":"api-request.js","sourceRoot":"","sources":["../src/api-request.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/node_modules/lastfm-ts-api/dist/types.d.ts b/node_modules/lastfm-ts-api/dist/types.d.ts +index e79dd90..1394497 100644 +--- a/node_modules/lastfm-ts-api/dist/types.d.ts ++++ b/node_modules/lastfm-ts-api/dist/types.d.ts +@@ -1292,6 +1292,7 @@ export type LastFMUserGetWeeklyTrackChartResponse = Readonly<{ + }; + }>; + export type OptionalConfig = { +- hostname: string; +- path: string; ++ hostname?: string; ++ path?: string; ++ timeout?: number; + }; diff --git a/src/backend/common/vendor/LastfmApiClient.ts b/src/backend/common/vendor/LastfmApiClient.ts index c4faa6f0..3172061d 100644 --- a/src/backend/common/vendor/LastfmApiClient.ts +++ b/src/backend/common/vendor/LastfmApiClient.ts @@ -13,6 +13,7 @@ import AbstractApiClient from "./AbstractApiClient.js"; import { parseArtistCredits } from "../../utils/StringUtils.js"; import { LastFMUser, LastFMAuth, LastFMTrack, LastFMUserGetRecentTracksResponse, LastFMBooleanNumber, LastFMUpdateNowPlayingResponse, LastFMUserGetInfoResponse } from 'lastfm-ts-api'; import clone from 'clone'; +import { IncomingMessage } from "http"; const badErrors = [ 'api key suspended', @@ -98,6 +99,13 @@ export default class LastfmApiClient extends AbstractApiClient { const { message, } = e; + if('content' in e) { + let msg = 'Raw Response'; + if('response' in e) { + msg = `(${(e.response as IncomingMessage).statusCode}) ${msg}`; + } + this.logger.error(`${msg}:\n${e.content}`); + } // for now check for exceptional errors by matching error code text const retryError = retryErrors.find(x => message.toLocaleLowerCase().includes(x)); let networkError = undefined; diff --git a/src/backend/tests/lastfm/lastfm.test.ts b/src/backend/tests/lastfm/lastfm.test.ts index 83304af7..83530727 100644 --- a/src/backend/tests/lastfm/lastfm.test.ts +++ b/src/backend/tests/lastfm/lastfm.test.ts @@ -3,7 +3,12 @@ import asPromised from 'chai-as-promised'; import { after, before, describe, it } from 'mocha'; import { generateLastfmTrackObject, generateMbid, generatePlay } from "../utils/PlayTestUtils.js"; -import { playToClientPayload, formatPlayObj } from '../../common/vendor/LastfmApiClient.js'; +import LastfmApiClient, { playToClientPayload, formatPlayObj } from '../../common/vendor/LastfmApiClient.js'; +import { MockNetworkError, withRequestInterception } from '../utils/networking.js'; +import { http, HttpResponse, delay } from "msw"; +import { loggerDebug } from '@foxxmd/logging'; +import { configDir, projectDir } from '../../common/index.js'; +import { LastFMGeo } from 'lastfm-ts-api'; chai.use(asPromised); @@ -63,4 +68,28 @@ describe('#LFM Track to Play', function() { expect(formatPlayObj(toArtName).data.artists[0]).to.eq(toArtName.artist.name); }); -}); \ No newline at end of file +}); + +// it('should catch error and log contents on api failure', async function () { +// this.timeout(50000); +// await withRequestInterception([ +// http.post('ws.audioscrobbler.com/2.0', async () => { +// return HttpResponse.html('This is a test', {status: 200}); +// }) +// ], async function () { + +// const lfm = new LastfmApiClient('mylfm-client-test', { +// apiKey: '', +// secret: '' +// }, { +// logger: loggerDebug, +// localUrl: new URL('http://localhost:9078'), +// configDir: configDir, +// version: 'test' +// }); + +// await lfm.initialize(); + +// await lfm.testAuth(); +// })(); +// }); \ No newline at end of file