{"record":{"id":"5872110b4a0e1500","repo":"chatboxai/chatbox","slug":"no-refresh-token-available-587211","errorCode":null,"errorMessage":"No refresh token available","messagePattern":"No refresh token available","errorType":"exception","errorClass":"ApiError","httpStatus":null,"severity":"error","filePath":"src/shared/request/request.ts","lineNumber":261,"sourceCode":"\n    let requestError: BaseError | null = null\n    const retry = options.retry || 0\n\n    for (let i = 0; i < retry + 1; i++) {\n      try {\n        const res = await fetch(url, init)\n\n        // 检查 401 Unauthorized\n        if (res.status === 401) {\n          console.debug('🔄 Access token expired, refreshing...')\n\n          // 防止并发刷新：如果已有刷新请求，等待它完成\n          if (!refreshPromise) {\n            refreshPromise = (async () => {\n              try {\n                const currentTokens = await getTokens()\n                if (!currentTokens) {\n                  throw new ApiError('No refresh token available')\n                }\n\n                console.debug('🔑 Refreshing access token with refresh token...')\n                const newTokens = await refreshTokens(currentTokens.refreshToken)\n                console.debug('✅ Token refreshed successfully')\n                return newTokens\n              } catch (error) {\n                console.error('❌ Failed to refresh token:', error)\n                // 刷新失败，清除所有 tokens\n                await clearTokens()\n                throw new ApiError('Token refresh failed, please login again')\n              } finally {\n                refreshPromise = null\n              }\n            })()\n          }\n\n          // 等待刷新完成","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/chatboxai/chatbox/blob/81571269addb6bafb589a920b2883f1e1e084fd1/src/shared/request/request.ts#L243-L279","documentation":"Error \"No refresh token available\" thrown in chatboxai/chatbox.","triggerScenarios":"Thrown at src/shared/request/request.ts:261 when the library encounters an invalid state.","commonSituations":"Occurs in src/shared/request/request.ts when a token refresh is attempted but no refresh token is stored; the user must log in again.","solutions":["Sign in again; tokens were cleared between the 401 response and the refresh attempt.","Investigate why getTokens() returned null mid-request (concurrent logout or storage failure)."],"exampleFix":"const currentTokens = await getTokens()\nif (!currentTokens) {\n  // Session was logged out concurrently; prompt re-login\n}","handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"81571269addb6bafb589a920b2883f1e1e084fd1","analyzedAt":"2026-08-12T21:51:44.981Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}