export type McuLayout = 'grid-2x2' | 'grid-3x3' | 'focus-speaker' | 'pip-bottom-right' | 'vertical-strip' | 'single' | 'program'; export type McuResolution = '720p' | '1080p'; export interface CreateMcuOptions { listenIps: Array<{ ip: string; announcedIp?: string; }>; minPort: number; maxPort: number; /** Path FS pour les segments HLS générés. */ outputDir: string; /** Extension/format(s) de sortie du programme : 'webm' (enregistrement, défaut), * 'm3u8' (HLS live, vue publique « C ») ou 'mp4'. Plusieurs formats SIMULTANÉS * acceptés via une liste séparée par virgules (ex: 'm3u8,mp4' = HLS live + archive * MP4 dans la même passe ffmpeg). Le HLS, s'il est présent, sert de playlist primaire. */ outputExt?: string; /** Path ffmpeg binary (default '/usr/bin/ffmpeg'). */ ffmpegPath?: string; /** Bucket @mostajs/storage si backend storage (default 'mcu-outputs'). */ storageBucket?: string; /** B10 : nombre de workers mediasoup (pool round-robin). Défaut min(cpus, 4). */ workers?: number; onEvent?: (event: McuEvent) => void | Promise; } export interface McuEvent { type: 'session.created' | 'session.closed' | 'input.added' | 'input.removed' | 'output.ready' | 'output.failed' | 'layout.switched'; sessionId?: string; inputId?: string; details?: Record; timestamp: number; } export interface McuInput { id: string; sessionId: string; producerId: string; rtpPort: number; ssrc: number; addedAt: number; } export interface McuSession { readonly id: string; readonly layout: McuLayout; /** Source actuellement diffusée par le bus PROGRAMME (null = layout normal). */ readonly programInputId: string | null; readonly resolution: McuResolution; readonly inputs: McuInput[]; readonly outputPlaylistPath: string; readonly createdAt: number; addInput(producerId: string): Promise; removeInput(inputId: string): Promise; switchLayout(layout: McuLayout): Promise; /** Bus PROGRAMME : commute la source diffusée (vidéo plein écran + audio solo). * `inputId` = appData.inputId d'une source, ou `null` pour revenir au layout. */ setProgram(inputId: string | null): Promise; /** * Stoppe ffmpeg proprement et ferme transports/producers. * Retourne `{path,size,mimeType}` si un fichier a été finalisé (utile au * hook storage post-finalize) ou `null` si aucun recording n'a démarré. */ close(): Promise<{ path: string; size: number; mimeType: string; } | null>; } export interface McuSessionInfo { id: string; layout: McuLayout; resolution: McuResolution; inputsCount: number; createdAt: number; } export interface McuServer { createSession(opts: { layout: McuLayout; resolution?: McuResolution; sessionId?: string; }): Promise; getSession(sessionId: string): McuSession | undefined; closeSession(sessionId: string): Promise; listSessions(): McuSessionInfo[]; close(): Promise; } export interface ApiPrincipal { user: string; meta?: Record; } export type PermissionChecker = (req: Request) => Promise | ApiPrincipal | null; export interface CreateMcuApiOptions { mcu: McuServer; permissionChecker: PermissionChecker; auditLog?: (event: { route: string; status: number; user?: string; }) => void; /** B11 : base URL publique pour servir les sorties (ex. 'https://host/mcu-outputs'). * Si défini, outputUrl renvoie `${publicBaseUrl}/${sessionId}/recording.webm`. */ publicBaseUrl?: string; } export interface McuApiHandlers { /** POST /mcu/sessions — { layout, resolution? } */ sessionCreate: (req: Request) => Promise; /** GET /mcu/sessions */ sessionList: (req: Request) => Promise; /** DELETE /mcu/sessions/[sessionId] */ sessionClose: (req: Request, ctx: { sessionId: string; }) => Promise; /** POST /mcu/sessions/[sessionId]/inputs — body SDP offer (WHIP-like) */ inputAdd: (req: Request, ctx: { sessionId: string; }) => Promise; /** DELETE /mcu/sessions/[sessionId]/inputs/[inputId] */ inputRemove: (req: Request, ctx: { sessionId: string; inputId: string; }) => Promise; /** GET /mcu/sessions/[sessionId]/output — returns signed HLS playlist URL */ outputUrl: (req: Request, ctx: { sessionId: string; }) => Promise; /** POST /mcu/sessions/[sessionId]/layout — { layout } */ layoutSwitch: (req: Request, ctx: { sessionId: string; }) => Promise; programSet: (req: Request, ctx: { sessionId: string; }) => Promise; } //# sourceMappingURL=index.d.ts.map