finished qm symbols / sessions

This commit is contained in:
Boki 2025-06-27 21:44:21 -04:00
parent 34671ea427
commit 52436c69b2
6 changed files with 77 additions and 29 deletions

View file

@ -32,8 +32,8 @@ export const QM_CONFIG = {
// Session management settings
export const SESSION_CONFIG = {
MIN_SESSIONS: 2,
MAX_SESSIONS: 5,
MIN_SESSIONS: 50,
MAX_SESSIONS: 100,
MAX_FAILED_CALLS: 3,
SESSION_TIMEOUT: 5000, // 10 seconds
API_TIMEOUT: 30000, // 15 seconds

View file

@ -69,23 +69,59 @@ export class QMSessionManager {
* Get a random session for the given session ID
*/
async getSession(sessionId: string): Promise<QMSession | null> {
// Always load fresh data from cache
await this.loadFromCache();
let retries = 3;
let session: QMSession | null = null;
const sessions = this.sessionCache[sessionId];
if (!sessions || sessions.length === 0) {
return null;
}
while (retries > 0 && !session) {
// Always load fresh data from cache
await this.loadFromCache();
const sessions = this.sessionCache[sessionId];
if (!sessions || sessions.length === 0) {
retries--;
if (retries > 0) {
this.logger?.debug(`No sessions found for ${sessionId}, retrying... (${retries} attempts left)`);
await new Promise(resolve => setTimeout(resolve, 500));
continue;
}
this.logger?.error(`No sessions found for sessionId: ${sessionId}`, {
availableSessionIds: Object.keys(this.sessionCache),
sessionCounts: Object.entries(this.sessionCache).map(([id, s]) => ({ id, count: s.length })),
});
return null;
}
// Filter out sessions with excessive failures
const validSessions = sessions.filter(
session => session.failedCalls <= SESSION_CONFIG.MAX_FAILED_CALLS
);
if (validSessions.length === 0) {
return null;
}
// Filter out sessions with excessive failures
const validSessions = sessions.filter(
session => session.failedCalls <= SESSION_CONFIG.MAX_FAILED_CALLS
);
if (validSessions.length === 0) {
retries--;
if (retries > 0) {
this.logger?.debug(`No valid sessions after filtering, retrying... (${retries} attempts left)`);
await new Promise(resolve => setTimeout(resolve, 500));
continue;
}
this.logger?.error(`No valid sessions after filtering for sessionId: ${sessionId}`, {
totalSessions: sessions.length,
maxFailedCalls: SESSION_CONFIG.MAX_FAILED_CALLS,
});
return null;
}
return validSessions[Math.floor(Math.random() * validSessions.length)];
session = validSessions[Math.floor(Math.random() * validSessions.length)];
this.logger?.trace(`Selected session`, {
uuid: session.uuid,
failedCalls: session.failedCalls,
successfulCalls: session.successfulCalls,
});
}
return session;
}
/**
@ -200,6 +236,7 @@ export class QMSessionManager {
return stats;
}
/**
* Mark manager as initialized (deprecated - we always load from cache now)
*/
@ -231,7 +268,12 @@ export class QMSessionManager {
const listKey = `qm:sessions:${sessionType.toLowerCase()}:list`;
const sessionIds = await this.cacheProvider.get<string[]>(listKey);
this.logger?.trace(`Loading ${sessionType} sessions`, { sessionIds });
this.logger?.trace(`Loading ${sessionType} sessions`, {
sessionType,
sessionId,
listKey,
sessionIds
});
if (sessionIds && Array.isArray(sessionIds)) {
const sessions: QMSession[] = [];