完善节目平台与直播监控体验

This commit is contained in:
admin committed 2026-08-18 09:26:41 +08:00
1 parent 229a8d0791
commit e50b8b480b
11 files changed
+642 -37

No files matched your search

+64
View File
@@ -74,6 +74,37 @@ export interface QualityInfo {
height: number
}
export interface ViewerSessionInfo {
session_id: string
node_id?: string
node_name?: string
quality?: string
playback_state: string
buffered_seconds?: number
error?: string
remote_adjusted: boolean
last_heartbeat: string
}
export interface ControlAuditInfo {
id: number
operator: string
target_session_id: string
action: string
value?: string
status: string
result?: string
created_at: string
claimed_at?: string
}
export interface RemoteCommandInfo {
id: number
action: 'switch_node' | 'switch_quality' | 'restore_auto'
value?: string
created_at: string
}
export async function fetchStreams(admin = false): Promise<StreamInfo[]> {
const { data } = await api.get('/streams', { params: admin ? { admin: true } : undefined })
return data
@@ -120,3 +151,36 @@ export async function getWatchUrls(streamId: number): Promise<WatchInfo> {
export function getStreamStatusUrl(streamId: number): string {
return `/api/streams/${streamId}/events`
}
export async function sendViewerHeartbeat(streamId: number, payload: Record<string, unknown>): Promise<{ remote_adjusted: boolean }> {
const { data } = await api.post(`/streams/${streamId}/viewer-heartbeat`, payload)
return data
}
export async function pollRemoteCommand(streamId: number, sessionId: string): Promise<RemoteCommandInfo | null> {
const { data } = await api.get(`/streams/${streamId}/remote-command`, { params: { session_id: sessionId } })
return data
}
export async function reportRemoteCommandResult(streamId: number, commandId: number, sessionId: string, result: string): Promise<void> {
await api.post(`/streams/${streamId}/remote-command/${commandId}/result`, { result }, { params: { session_id: sessionId } })
}
export async function fetchViewerSessions(streamId: number): Promise<ViewerSessionInfo[]> {
const { data } = await api.get(`/streams/${streamId}/viewer-sessions`)
return data
}
export async function fetchControlAudit(streamId: number): Promise<ControlAuditInfo[]> {
const { data } = await api.get(`/streams/${streamId}/control-audit`)
return data
}
export async function createRemoteSession(streamId: number, expiresIn = 300): Promise<{ token: string; expires_in: number }> {
const { data } = await api.post(`/streams/${streamId}/remote-session`, { expires_in: expiresIn })
return data
}
export async function sendRemoteCommand(streamId: number, token: string, action: string, targets: string[], value?: string): Promise<void> {
await api.post(`/streams/${streamId}/remote-command`, { token, action, targets, value })
}