From 03434fb362deef06ee16e215f5ff606902b58612 Mon Sep 17 00:00:00 2001 From: Wolfgang Kulhanek Date: Fri, 24 Oct 2025 14:56:56 +0200 Subject: [PATCH] More token refresh fixes --- src/smapi.ts | 4 ++-- src/smapi_token_store.ts | 12 ++++++------ src/sqlite_smapi_token_store.ts | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/smapi.ts b/src/smapi.ts index c1a194a..8034530 100644 --- a/src/smapi.ts +++ b/src/smapi.ts @@ -547,7 +547,7 @@ function bindSmapiSoapServiceToExpress( logger.info("Token refresh successful, issuing new SMAPI token"); return smapiAuthTokens.issue(it.serviceToken); }), - TE.tap(swapToken(undefined)), // Don't pass old token to avoid circular reference issues + TE.tap(swapToken(authOrFail.expiredToken)), // Pass the expired token to ensure it gets deleted TE.map((newToken) => ({ Fault: { faultcode: "Client.TokenRefreshRequired", @@ -616,7 +616,7 @@ function bindSmapiSoapServiceToExpress( return pipe( musicService.refreshToken(serviceToken), TE.map((it) => smapiAuthTokens.issue(it.serviceToken)), - TE.tap(swapToken(undefined)), // Don't pass old token to avoid circular reference issues + TE.tap(swapToken(serviceToken)), // Pass the expired token to ensure it gets deleted TE.map((it) => ({ refreshAuthTokenResult: { authToken: it.token, diff --git a/src/smapi_token_store.ts b/src/smapi_token_store.ts index 49c88aa..a9409ef 100644 --- a/src/smapi_token_store.ts +++ b/src/smapi_token_store.ts @@ -45,9 +45,9 @@ export class InMemorySmapiTokenStore implements SmapiTokenStore { // Do NOT delete ExpiredTokenError as those can still be refreshed if (E.isLeft(verifyResult)) { const error = verifyResult.left; - // Only delete invalid tokens, not expired ones (which can be refreshed) - if (error._tag === 'InvalidTokenError') { - logger.debug(`Deleting invalid token from in-memory store`); + // Delete both invalid and expired tokens to prevent accumulation + if (error._tag === 'InvalidTokenError' || error._tag === 'ExpiredTokenError') { + logger.debug(`Deleting ${error._tag} token from in-memory store`); delete this.tokens[tokenKey]; deletedCount++; } @@ -146,9 +146,9 @@ export class FileSmapiTokenStore implements SmapiTokenStore { // Do NOT delete ExpiredTokenError as those can still be refreshed if (E.isLeft(verifyResult)) { const error = verifyResult.left; - // Only delete invalid tokens, not expired ones (which can be refreshed) - if (error._tag === 'InvalidTokenError') { - logger.debug(`Deleting invalid token from file store`); + // Delete both invalid and expired tokens to prevent accumulation + if (error._tag === 'InvalidTokenError' || error._tag === 'ExpiredTokenError') { + logger.debug(`Deleting ${error._tag} token from file store`); delete this.tokens[tokenKey]; deletedCount++; } diff --git a/src/sqlite_smapi_token_store.ts b/src/sqlite_smapi_token_store.ts index 8f3f21f..b00e895 100644 --- a/src/sqlite_smapi_token_store.ts +++ b/src/sqlite_smapi_token_store.ts @@ -126,9 +126,9 @@ export class SQLiteSmapiTokenStore implements SmapiTokenStore { // Do NOT delete ExpiredTokenError as those can still be refreshed if (E.isLeft(verifyResult)) { const error = verifyResult.left; - // Only delete invalid tokens, not expired ones (which can be refreshed) - if (error._tag === 'InvalidTokenError') { - logger.debug(`Deleting invalid token from SQLite store`); + // Delete both invalid and expired tokens to prevent accumulation + if (error._tag === 'InvalidTokenError' || error._tag === 'ExpiredTokenError') { + logger.debug(`Deleting ${error._tag} token from SQLite store`); this.delete(tokenKey); deletedCount++; }