Feat : added and tweaked state machine
All checks were successful
release / build (push) Successful in 39s
release / verify-windows (push) Successful in 1m17s

This commit is contained in:
jeanotx32
2026-08-11 23:21:35 +02:00
parent a5777ad920
commit 2380196169
14 changed files with 469 additions and 53 deletions

View File

@@ -346,6 +346,21 @@ export interface WatchSettings {
confirmations: number;
pauseOnPrivate: boolean;
resumeOnPublic: boolean;
/**
* Clore l'enregistrement quand le flux passe hors-ligne (statut brut « off »,
* « idle »…), une fois le délai ci-dessous écoulé.
*
* Le passage hors-ligne met de toute façon l'enregistrement en pause : l'écran
* d'attente n'a rien à faire dans le fichier. Ce réglage ne décide que de la
* clôture définitive.
*/
stopOnOffline: boolean;
/**
* Temps hors-ligne toléré avant de clore. Une coupure brève ne doit pas
* découper le fichier en deux ; une vraie fin de diffusion, si. Le compte à
* rebours est annulé dès que le flux revient, public ou privé.
*/
offlineStopDelayMs: number;
fullscreen: FullscreenSettings;
}
@@ -406,6 +421,8 @@ export const DEFAULT_WATCH_SETTINGS: WatchSettings = {
confirmations: 2,
pauseOnPrivate: true,
resumeOnPublic: true,
stopOnOffline: true,
offlineStopDelayMs: 3_600_000,
fullscreen: {
enabled: true,
key: 'f',
@@ -428,6 +445,10 @@ export interface WatchState {
lastError?: string;
/** Vrai si c'est la surveillance — et non l'opérateur — qui a mis en pause. */
autoPaused: boolean;
/** Depuis quand le flux est hors-ligne, absent s'il ne l'est pas. */
offlineSince?: number;
/** Échéance de la clôture automatique, absente si aucun compte à rebours ne court. */
stopScheduledAt?: number;
/** Lectures « privé » accumulées, en attente du seuil de confirmation. */
pendingConfirmations: number;
}
@@ -702,6 +723,12 @@ export interface WatchTarget {
/** Agent qui enregistrera ce streamer, s'il est assigné. */
agentId: string | null;
notify: boolean;
/**
* Lancer l'enregistrement sans intervention dès que ce profil est en direct
* depuis assez longtemps. Exige un agent assigné, et un seul profil en
* automatisme par agent : une VM n'enregistre qu'un flux à la fois.
*/
autoRecord: boolean;
state: StreamState;
rawStatus: string | null;
/** Depuis quand l'état est stable, selon nos propres observations. */
@@ -782,6 +809,9 @@ export function normalizeWatchSettings(raw: unknown): WatchSettings {
confirmations: clamp(input.confirmations, base.confirmations, 1, 10),
pauseOnPrivate: input.pauseOnPrivate !== false,
resumeOnPublic: input.resumeOnPublic !== false,
stopOnOffline: input.stopOnOffline !== false,
// Plafond à 24 h : au-delà, l'enregistrement mobiliserait une VM pour rien.
offlineStopDelayMs: clamp(input.offlineStopDelayMs, base.offlineStopDelayMs, 0, 86_400_000),
fullscreen: {
enabled: fullscreen.enabled !== false,
key: