mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage-server
synced 2026-04-11 18:08:16 +00:00
- SessionService: Redis-backed session lock/unlock/refresh with 1hr TTL - AgentConfigService: queries Agent entity, caches per-member config - Auth login: resolves agent config, locks Redis session, returns SIP credentials - Auth logout: unlocks Redis session, Ozonetel logout, clears cache - Auth heartbeat: refreshes Redis TTL every 5 minutes - Added ioredis dependency Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import Redis from 'ioredis';
|
|
|
|
const SESSION_TTL = 3600; // 1 hour
|
|
|
|
@Injectable()
|
|
export class SessionService implements OnModuleInit {
|
|
private readonly logger = new Logger(SessionService.name);
|
|
private redis: Redis;
|
|
|
|
constructor(private config: ConfigService) {}
|
|
|
|
onModuleInit() {
|
|
const url = this.config.get<string>('redis.url', 'redis://localhost:6379');
|
|
this.redis = new Redis(url);
|
|
this.redis.on('connect', () => this.logger.log('Redis connected'));
|
|
this.redis.on('error', (err) => this.logger.error(`Redis error: ${err.message}`));
|
|
}
|
|
|
|
private key(agentId: string): string {
|
|
return `agent:session:${agentId}`;
|
|
}
|
|
|
|
async lockSession(agentId: string, memberId: string): Promise<void> {
|
|
await this.redis.set(this.key(agentId), memberId, 'EX', SESSION_TTL);
|
|
}
|
|
|
|
async isSessionLocked(agentId: string): Promise<string | null> {
|
|
return this.redis.get(this.key(agentId));
|
|
}
|
|
|
|
async refreshSession(agentId: string): Promise<void> {
|
|
await this.redis.expire(this.key(agentId), SESSION_TTL);
|
|
}
|
|
|
|
async unlockSession(agentId: string): Promise<void> {
|
|
await this.redis.del(this.key(agentId));
|
|
}
|
|
}
|