059807b9ef
---
- Substituída consulta individual por stream (supervisorctl status {p}-{id} × 5) por uma única chamada supervisorctl status que retorna todos os programas de uma vez, com cache de 3s em fetchAllStatuses();
- Adicionado endpoint GET /api/streams/statuses que retorna os statuses de todos os streams em uma resposta batch;
- Frontend alterado para usar o endpoint batch em vez de N requests paralelos por ciclo de polling;
- Token de sessão HMAC-SHA256 em auth.ts agora é computado uma vez e cacheado no módulo, eliminando operações de crypto a cada requisição;
- Rolling session no middleware limitado a rotas de página, removendo overhead de Set-Cookie em respostas de API e HLS;
---
22 lines
1007 B
TypeScript
22 lines
1007 B
TypeScript
// Edge-compatible — no Node.js imports here (used in middleware)
|
|
|
|
export const AUTH_ENABLED = !!(process.env.AUTH_USER && process.env.AUTH_PASS)
|
|
export const COOKIE_NAME = "ds_session"
|
|
|
|
// Cached promise — token is deterministic (env vars never change at runtime)
|
|
let _tokenCache: Promise<string> | null = null
|
|
|
|
// HMAC-SHA256(user, key=pass) — deterministic, no in-memory state, survives restarts
|
|
// Works in both Edge (SubtleCrypto) and Node.js runtime
|
|
export function computeSessionToken(): Promise<string> {
|
|
if (_tokenCache) return _tokenCache
|
|
const user = process.env.AUTH_USER ?? ""
|
|
const pass = process.env.AUTH_PASS ?? ""
|
|
const enc = new TextEncoder()
|
|
_tokenCache = globalThis.crypto.subtle
|
|
.importKey("raw", enc.encode(pass), { name: "HMAC", hash: "SHA-256" }, false, ["sign"])
|
|
.then(key => globalThis.crypto.subtle.sign("HMAC", key, enc.encode(user)))
|
|
.then(sig => Array.from(new Uint8Array(sig), b => b.toString(16).padStart(2, "0")).join(""))
|
|
return _tokenCache
|
|
}
|