/
nayvok
/
livecoding
Обзор
Документация
Войти
/
nayvok
/
livecoding
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
backend/src/sessionCreationGuard.ts
68 строк
2 KB
nayvok
fix: harden sessions and WebRTC recovery
17 июн 2026, 22:02
17 июн 2026, 22:02
37b9a92
Код
Авторство
О чём код?
export interface SessionCreationLimiterOptions { limit: number windowMs: number maxClients?: number } interface WindowState { startedAt: number count: number } export interface SessionCreationLimiter { tryAcquire: (clientKey: string, now?: number) => boolean } export function getRateLimitClientKey( forwardedHeader: string | string[] | undefined, remoteAddress: string | undefined, ): string { const forwarded = Array.isArray(forwardedHeader) ? forwardedHeader[0] : forwardedHeader const originalAddress = forwarded ?.split(',') .map((value) => value.trim()) .find(Boolean) return originalAddress ?? remoteAddress ?? 'unknown' } export function createSessionCreationLimiter({ limit, windowMs, maxClients = 10_000, }: SessionCreationLimiterOptions): SessionCreationLimiter { const normalizedLimit = Number.isSafeInteger(limit) && limit > 0 ? limit : 1 const normalizedWindowMs = Number.isFinite(windowMs) && windowMs > 0 ? windowMs : 60_000 const normalizedMaxClients = Number.isSafeInteger(maxClients) && maxClients > 0 ? maxClients : 10_000 const windows = new Map<string, WindowState>() return { tryAcquire(clientKey, now = Date.now()) { const current = windows.get(clientKey) if (current && now - current.startedAt < normalizedWindowMs) { if (current.count >= normalizedLimit) return false current.count += 1 return true } if (!current && windows.size >= normalizedMaxClients) { for (const [key, state] of windows) { if (now - state.startedAt >= normalizedWindowMs) { windows.delete(key) } } if (windows.size >= normalizedMaxClients) return false } if (!current || now - current.startedAt >= normalizedWindowMs) { windows.set(clientKey, { startedAt: now, count: 1 }) return true } return false }, } }