diff --git a/package-lock.json b/package-lock.json index 91520a494..c8af9458f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "glob": "^13.0.0", "jsroot": "^7.10.3", "keycloak-js": "^26.2.1", - "ky": "^1.12.0", + "ky": "^2.2.0", "material-ui-popup-state": "^5.3.6", "notistack": "^3.0.2", "object-hash": "^3.0.0", @@ -16009,12 +16009,12 @@ } }, "node_modules/ky": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.12.0.tgz", - "integrity": "sha512-YRLmSUHCwOJRBMArtqMRLOmO7fewn3yOoui6aB8ERkRVXupa0UiaQaKbIXteMt4jUElhbdqTMsLFHs8APxxUoQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ky/-/ky-2.2.0.tgz", + "integrity": "sha512-4+B63kyZt+Y8snQiUGydK1vgY9xYQJZEh9K/nIAIEts+gYJzy1EiAw3BbK8xpWRuWUpN70SNCMjqRGTm75xxIA==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=22" }, "funding": { "url": "https://github.com/sindresorhus/ky?sponsor=1" diff --git a/package.json b/package.json index 84ab6e4a8..27ae5fb22 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "glob": "^13.0.0", "jsroot": "^7.10.3", "keycloak-js": "^26.2.1", - "ky": "^1.12.0", + "ky": "^2.2.0", "material-ui-popup-state": "^5.3.6", "notistack": "^3.0.2", "object-hash": "^3.0.0", diff --git a/src/services/AuthService.tsx b/src/services/AuthService.tsx index ccc4b7966..7d3114444 100644 --- a/src/services/AuthService.tsx +++ b/src/services/AuthService.tsx @@ -100,9 +100,9 @@ const Auth = ({ children }: GenericContextProviderProps) => { () => ky.create({ credentials: 'include', - prefixUrl: backendUrl, - //overwrite default json parser to convert snake_case to camelCase - parseJson: (text: string) => { + prefix: backendUrl, + parseJson: (text: string, { response }) => { + if (text === '' && response.ok) return text; const json = JSON.parse(text); if (typeof json === 'object' && json) return snakeToCamelCase(json, true); @@ -112,22 +112,34 @@ const Auth = ({ children }: GenericContextProviderProps) => { }, hooks: { afterResponse: [ - async (_request, _options, response) => { - if (response?.status in [401, 403]) setUser(null); - if (response?.status === 403) - enqueueSnackbar('Please log in again.', { variant: 'warning' }); - - if (response?.status > 300) { - const message = await response - .json() - .then(parseYaptideResponseMessage); - - if (!ignored_messages.includes(message)) - enqueueSnackbar(message, { - variant: 'error' - }); - - return Promise.reject(response); + async ({ request, options, response, retryCount }) => { + try { + if (response?.status in [401, 403]) setUser(null); + if (response?.status === 403) + enqueueSnackbar('Please log in again.', { variant: 'warning' }); + + if (response?.status > 300) { + const message = await response + .json() + .then(parseYaptideResponseMessage); + + if (!ignored_messages.includes(message)) + enqueueSnackbar(message, { + variant: 'error' + }); + + return await Promise.reject(response); + } + } catch (error) { + const { limit, methods } = options.retry; + + if ( + retryCount < limit && + methods.some(method => method.toUpperCase() === request.method) + ) + return ky.retry(); + + throw error; } } ]