diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index b6b3d03..cccb274 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -84,7 +84,16 @@ export class RequestClient implements HttpClient { this.clearLocalStorageTokens() } if (typeof document !== 'undefined') { - document.cookie = 'XSRF-TOKEN=; Max-Age=0; Path=/;' + this.clearAllCookies() + } + } + + private clearAllCookies() { + const cookies = document.cookie.split(';') + for (const cookie of cookies) { + const name = cookie.split('=')[0].trim() + if (!name) continue + document.cookie = `${name}=; Max-Age=0; Path=/;` } } @@ -711,6 +720,10 @@ ${resHeaders}${parsedResBody ? `\n\n${parsedResBody}` : ''} this.isRecoveringFromNetworkError = true try { return await callback() + } catch { + // Retry also failed — session is dead, surface LoginRequiredError + // so the app can prompt re-authentication. + throw new LoginRequiredError() } finally { this.isRecoveringFromNetworkError = false } diff --git a/src/test/RequestClient.spec.ts b/src/test/RequestClient.spec.ts index 0f7606d..2d40d18 100644 --- a/src/test/RequestClient.spec.ts +++ b/src/test/RequestClient.spec.ts @@ -607,7 +607,7 @@ ${resHeaders[0]}: ${resHeaders[1]}${ expect(requestClient['csrfToken']).toEqual({ headerName: '', value: '' }) }) - it('should not loop if retry also fails with ERR_NETWORK', async () => { + it('should throw LoginRequiredError if retry also fails with ERR_NETWORK', async () => { const networkError = { isAxiosError: true, code: 'ERR_NETWORK', @@ -621,7 +621,7 @@ ${resHeaders[0]}: ${resHeaders[1]}${ await expect( requestClient['handleError'](networkError, innerHandle) - ).rejects.toEqual(networkError) + ).rejects.toThrow(LoginRequiredError) expect(innerHandle).toHaveBeenCalledTimes(1) })