| #!/usr/bin/env node |
|
|
| |
| |
| |
| |
|
|
| const redis = require('../src/models/redis') |
| const logger = require('../src/utils/logger') |
|
|
| async function debugRedisKeys() { |
| try { |
| logger.info('🔄 Connecting to Redis...') |
| await redis.connect() |
| logger.success('✅ Connected to Redis') |
|
|
| |
| const allKeys = await redis.client.keys('*') |
| logger.info(`\n📊 Total keys in Redis: ${allKeys.length}\n`) |
|
|
| |
| const keysByType = { |
| apiKeys: [], |
| claudeAccounts: [], |
| geminiAccounts: [], |
| admins: [], |
| sessions: [], |
| usage: [], |
| other: [] |
| } |
|
|
| |
| for (const key of allKeys) { |
| if (key.startsWith('apikey:')) { |
| keysByType.apiKeys.push(key) |
| } else if (key.startsWith('claude_account:')) { |
| keysByType.claudeAccounts.push(key) |
| } else if (key.startsWith('gemini_account:')) { |
| keysByType.geminiAccounts.push(key) |
| } else if (key.startsWith('admin:') || key.startsWith('admin_username:')) { |
| keysByType.admins.push(key) |
| } else if (key.startsWith('session:')) { |
| keysByType.sessions.push(key) |
| } else if ( |
| key.includes('usage') || |
| key.includes('rate_limit') || |
| key.includes('concurrency') |
| ) { |
| keysByType.usage.push(key) |
| } else { |
| keysByType.other.push(key) |
| } |
| } |
|
|
| |
| console.log('='.repeat(60)) |
| console.log('📂 Keys by Category:') |
| console.log('='.repeat(60)) |
| console.log(`API Keys: ${keysByType.apiKeys.length}`) |
| console.log(`Claude Accounts: ${keysByType.claudeAccounts.length}`) |
| console.log(`Gemini Accounts: ${keysByType.geminiAccounts.length}`) |
| console.log(`Admins: ${keysByType.admins.length}`) |
| console.log(`Sessions: ${keysByType.sessions.length}`) |
| console.log(`Usage/Rate Limit: ${keysByType.usage.length}`) |
| console.log(`Other: ${keysByType.other.length}`) |
| console.log('='.repeat(60)) |
|
|
| |
| if (keysByType.apiKeys.length > 0) { |
| console.log('\n🔑 API Keys:') |
| for (const key of keysByType.apiKeys.slice(0, 5)) { |
| console.log(` - ${key}`) |
| } |
| if (keysByType.apiKeys.length > 5) { |
| console.log(` ... and ${keysByType.apiKeys.length - 5} more`) |
| } |
| } |
|
|
| if (keysByType.claudeAccounts.length > 0) { |
| console.log('\n🤖 Claude Accounts:') |
| for (const key of keysByType.claudeAccounts) { |
| console.log(` - ${key}`) |
| } |
| } |
|
|
| if (keysByType.geminiAccounts.length > 0) { |
| console.log('\n💎 Gemini Accounts:') |
| for (const key of keysByType.geminiAccounts) { |
| console.log(` - ${key}`) |
| } |
| } |
|
|
| if (keysByType.other.length > 0) { |
| console.log('\n❓ Other Keys:') |
| for (const key of keysByType.other.slice(0, 10)) { |
| console.log(` - ${key}`) |
| } |
| if (keysByType.other.length > 10) { |
| console.log(` ... and ${keysByType.other.length - 10} more`) |
| } |
| } |
|
|
| |
| console.log(`\n${'='.repeat(60)}`) |
| console.log('🔍 Checking Data Types:') |
| console.log('='.repeat(60)) |
|
|
| |
| const sampleKeys = allKeys.slice(0, Math.min(10, allKeys.length)) |
| for (const key of sampleKeys) { |
| const type = await redis.client.type(key) |
| console.log(`${key} => ${type}`) |
| } |
| } catch (error) { |
| logger.error('💥 Debug failed:', error) |
| } finally { |
| await redis.disconnect() |
| logger.info('👋 Disconnected from Redis') |
| } |
| } |
|
|
| |
| debugRedisKeys().catch((error) => { |
| logger.error('💥 Unexpected error:', error) |
| process.exit(1) |
| }) |
|
|