Skip to content

Commit 9326b68

Browse files
Merge pull request #71 from InsForge/fix-refresh-error
Fix refresh error
2 parents 021b991 + fb7803d commit 9326b68

4 files changed

Lines changed: 44 additions & 5 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@insforge/sdk",
3-
"version": "1.2.9",
3+
"version": "1.2.10",
44
"description": "Official JavaScript/TypeScript client for InsForge Backend-as-a-Service platform",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

src/lib/__tests__/http-client.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,35 @@ describe('HttpClient', () => {
987987
expect(tokenManager.clearSession).toHaveBeenCalledOnce();
988988
});
989989

990+
it('should preserve session when refresh fails with a transient network error', async () => {
991+
const tokenManager = createMockTokenManager();
992+
const mockFetch = vi
993+
.fn()
994+
.mockResolvedValueOnce(
995+
createJsonResponse(
996+
401,
997+
{
998+
error: 'AUTH_UNAUTHORIZED',
999+
message: 'Invalid token',
1000+
statusCode: 401,
1001+
},
1002+
'Unauthorized',
1003+
),
1004+
)
1005+
.mockRejectedValueOnce(new TypeError('network down'));
1006+
1007+
const client = createClient(mockFetch, {}, tokenManager);
1008+
client.setAuthToken('old-token');
1009+
const error = (await client
1010+
.get('/api/protected')
1011+
.catch((e: unknown) => e)) as InsForgeError;
1012+
1013+
expect(error).toBeInstanceOf(InsForgeError);
1014+
expect(error.error).toBe('NETWORK_ERROR');
1015+
expect(tokenManager.clearSession).not.toHaveBeenCalled();
1016+
expect(client.getHeaders().Authorization).toBe('Bearer old-token');
1017+
});
1018+
9901019
it('refresh succeeds, retry fails without clearing auth state', async () => {
9911020
const tokenManager = createMockTokenManager();
9921021
const mockFetch = vi

src/lib/http-client.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,12 @@ export class HttpClient {
518518
try {
519519
await this.refreshAndSaveSession();
520520
} catch (error) {
521-
this.clearAuthSession();
521+
if (
522+
error instanceof InsForgeError &&
523+
(error.statusCode === 401 || error.statusCode === 403)
524+
) {
525+
this.clearAuthSession();
526+
}
522527
throw error;
523528
}
524529
return await this.handleRequest<T>(method, path, {
@@ -649,7 +654,12 @@ export class HttpClient {
649654
try {
650655
newTokenData = await this.refreshAndSaveSession();
651656
} catch (error) {
652-
this.clearAuthSession();
657+
if (
658+
error instanceof InsForgeError &&
659+
(error.statusCode === 401 || error.statusCode === 403)
660+
) {
661+
this.clearAuthSession();
662+
}
653663
throw error;
654664
}
655665

0 commit comments

Comments
 (0)