final POC

This commit is contained in:
magdo
2025-11-24 23:28:57 +01:00
parent ce02f55a99
commit 6b3446e9b6
49 changed files with 4634 additions and 4620 deletions
@@ -307,7 +307,12 @@ export class RedisService {
// Generic Redis methods for game data
public async get(key: string): Promise<string | null> {
try {
return await this.client.get(key);
const value = await this.client.get(key);
// Refresh TTL on access for game-related keys
if (value && this.isGameRelatedKey(key)) {
await this.client.expire(key, 1800); // Reset to 30 minutes
}
return value;
} catch (error) {
logError(`Failed to get key ${key}`, error as Error);
return null;
@@ -317,6 +322,10 @@ export class RedisService {
public async set(key: string, value: string): Promise<void> {
try {
await this.client.set(key, value);
// Auto-expire game-related keys after 30 minutes
if (this.isGameRelatedKey(key)) {
await this.client.expire(key, 1800); // 30 minutes
}
} catch (error) {
logError(`Failed to set key ${key}`, error as Error);
}
@@ -341,6 +350,10 @@ export class RedisService {
public async setAdd(key: string, member: string): Promise<void> {
try {
await this.client.sAdd(key, member);
// Refresh TTL for game-related keys
if (this.isGameRelatedKey(key)) {
await this.client.expire(key, 1800); // Reset to 30 minutes
}
} catch (error) {
logError(`Failed to add member to set ${key}`, error as Error);
}
@@ -349,6 +362,10 @@ export class RedisService {
public async setRemove(key: string, member: string): Promise<void> {
try {
await this.client.sRem(key, member);
// Refresh TTL for game-related keys
if (this.isGameRelatedKey(key)) {
await this.client.expire(key, 1800); // Reset to 30 minutes
}
} catch (error) {
logError(`Failed to remove member from set ${key}`, error as Error);
}
@@ -356,7 +373,12 @@ export class RedisService {
public async setMembers(key: string): Promise<string[]> {
try {
return await this.client.sMembers(key);
const members = await this.client.sMembers(key);
// Refresh TTL on access for game-related keys
if (members.length > 0 && this.isGameRelatedKey(key)) {
await this.client.expire(key, 1800); // Reset to 30 minutes
}
return members;
} catch (error) {
logError(`Failed to get members of set ${key}`, error as Error);
return [];
@@ -366,10 +388,36 @@ export class RedisService {
public async exists(key: string): Promise<boolean> {
try {
const result = await this.client.exists(key);
// Refresh TTL on access for game-related keys
if (result === 1 && this.isGameRelatedKey(key)) {
await this.client.expire(key, 1800); // Reset to 30 minutes
}
return result === 1;
} catch (error) {
logError(`Failed to check existence of key ${key}`, error as Error);
return false;
}
}
/**
* Check if a key is game-related and should have auto-expiration
* Game-related patterns: gameplay:*, game:*, game_*, board:*, game_pending_card:*, etc.
*/
private isGameRelatedKey(key: string): boolean {
const gamePatterns = [
'gameplay:',
'game:',
'game_',
'board:',
'game_pending_card:',
'game_pending_decision:',
'game_player_extra_turns:',
'game_player_turns_to_lose:',
'game_positions:',
'game_ready:',
'game_room:',
'active_game:'
];
return gamePatterns.some(pattern => key.startsWith(pattern));
}
}