UNPKG

@100mslive/hms-video-store

Version:

@100mslive Core SDK which abstracts the complexities of webRTC while providing a reactive store for data management with a unidirectional data flow

400 lines (356 loc) • 8.33 kB
import { VideoTrackLayerUpdate } from '../connection/channel-messages'; import { HMSPeerType } from '../interfaces/peer/hms-peer'; import { HMSRole } from '../interfaces/role'; import { HMSLocalTrack } from '../media/tracks'; import { HMSTrack, HMSTrackSource } from '../media/tracks/HMSTrack'; import { PollInfoParams, PollResult, Track } from '../signal/interfaces'; /** * Interfaces for message received from BIZ Signal through Websocket. * These messages are handled by NotificationManager * which will call the corresponding HMSUpdateListener callbacks. */ export interface ServerError { code: number; message?: string; } export interface TrackStateNotification { tracks: { [track_id: string]: TrackState; }; peer: PeerNotificationInfo; } export interface OnTrackLayerUpdateNotification { tracks: { [track_id: string]: VideoTrackLayerUpdate; }; } export interface PeerNotificationInfo { peer_id: string; role: string; groups: string[]; info: Info; } export interface Info { name: string; data: string; user_id: string; type: HMSPeerType; } export interface FindPeerByNameInfo { name: string; peer_id: string; role: string; type: HMSPeerType; } export enum HMSRecordingState { NONE = 'none', INITIALISED = 'initialised', STARTED = 'started', PAUSED = 'paused', RESUMED = 'resumed', STOPPED = 'stopped', FAILED = 'failed', } export enum HMSStreamingState { NONE = 'none', INITIALISED = 'initialised', STARTED = 'started', STOPPED = 'stopped', FAILED = 'failed', } export enum HMSTranscriptionState { INITIALISED = 'initialised', STARTED = 'started', STOPPED = 'stopped', FAILED = 'failed', } export enum HMSTranscriptionMode { CAPTION = 'caption', } export interface WhiteBoardPluginPermissions { permissions?: { // list of roles admin?: Array<string>; writer?: Array<string>; reader?: Array<string>; }; } export interface TranscriptionPluginPermissions { permissions?: { // list of roles admin?: Array<string>; }; mode: HMSTranscriptionMode; } export interface NoiseCancellationPlugin { enabled?: boolean; } export enum Plugins { WHITEBOARD = 'whiteboard', TRANSCRIPTIONS = 'transcriptions', NOISE_CANCELLATION = 'noiseCancellation', } export interface PolicyParams { name: string; known_roles: { [role: string]: HMSRole; }; plugins: { [Plugins.WHITEBOARD]?: WhiteBoardPluginPermissions; [Plugins.TRANSCRIPTIONS]?: TranscriptionPluginPermissions[]; [Plugins.NOISE_CANCELLATION]?: NoiseCancellationPlugin; }; template_id: string; app_data?: Record<string, string>; } /** * This is in a format biz sends/received the track metadata */ export class TrackState implements Track { mute: boolean; type: 'audio' | 'video'; source: HMSTrackSource; description: string; track_id: string; stream_id: string; constructor(track: HMSLocalTrack | Track) { this.type = track.type; this.source = track.source || 'regular'; this.description = ''; if (track instanceof HMSTrack) { this.mute = !track.enabled; this.track_id = track.publishedTrackId!; this.stream_id = track.stream.id; } else { this.mute = track.mute; this.track_id = track.track_id; this.stream_id = track.stream_id; } } } export interface PeerNotification { peer_id: string; info: Info; role: string; joined_at?: number; tracks: { [track_id: string]: TrackState; }; groups: string[]; realtime?: boolean; is_from_room_state?: boolean; } export interface TranscriptionNotification { state?: HMSTranscriptionState; mode?: HMSTranscriptionMode; initialised_at?: number; started_at?: number; updated_at?: number; stopped_at?: number; peer?: PeerNotificationInfo; error?: ServerError; } export interface RoomState { name: string; session_id?: string; started_at?: number; recording?: { sfu: { started_at?: number; enabled: boolean; state?: HMSRecordingState; }; browser: { started_at?: number; enabled: boolean; state?: HMSRecordingState; }; hls: { initialised_at?: number; started_at?: number; enabled: boolean; state?: HMSRecordingState; config?: { hls_vod: boolean; single_file_per_layer: boolean; }; }; }; streaming?: { enabled: boolean; rtmp: { enabled: boolean; started_at?: number; state?: HMSStreamingState }; hls: HLSNotification; }; transcriptions?: TranscriptionNotification[]; } export interface PeerListNotification { peers: { [peer_id: string]: PeerNotification; }; room: RoomState; } export interface PeriodicRoomState { peer_count: number; room: RoomState; peers?: { [peer_id: string]: PeerNotification; }; } interface Speaker { peer_id: string; track_id: string; level: number; } export interface SpeakerList { 'speaker-list': Speaker[]; } interface ConnectionQuality { peer_id: string; downlink_score: number; } export interface ConnectionQualityList { peers: ConnectionQuality[]; } /** * Represents the role change request received from the server */ export interface RoleChangeRequestParams { requested_by?: string; role: string; token: string; } export interface TrackUpdateRequestNotification { requested_by?: string; track_id: string; stream_id: string; mute: boolean; } export interface ChangeTrackMuteStateNotification { requested_by?: string; roles?: string[]; type?: 'audio' | 'video'; source?: HMSTrackSource; value: boolean; } export interface PeerLeaveRequestNotification { requested_by?: string; reason: string; room_end: boolean; } export interface MessageNotification { peer?: { peer_id: string; groups: string[]; role: string; info: { name: string; data: any; user_id: string; }; }; roles?: string[]; message_id: string; private: boolean; timestamp: number; info: MessageNotificationInfo; } export interface SendMessage { info: MessageNotificationInfo; roles?: string[]; peer_id?: string; } export interface MessageNotificationInfo { message: any; type: string; } export enum RecordingNotificationType { SFU = 'sfu', BROWSER = 'Browser', HLS = 'HLS', } export interface RecordingNotification { type: RecordingNotificationType; initialised_at?: number; // only used for type hls started_at?: number; peer?: PeerNotificationInfo; error?: ServerError; state?: HMSRecordingState; hls_recording?: HLSRecording; // only used for type hls } export interface RTMPNotification { peer?: PeerNotificationInfo; error?: ServerError; started_at?: number; state?: HMSStreamingState; } export interface HLSRecording { hls_vod: boolean; single_file_per_layer: boolean; } export interface HLSNotification { enabled: boolean; variants?: Array<HLSVariantInfo>; error?: ServerError; hls_recording?: HLSRecording; } export enum HLSPlaylistType { DVR = 'dvr', NO_DVR = 'no-dvr', } export enum HLSStreamType { REGULAR = 'regular', SCREEN = 'screen', COMPOSITE = 'composite', } export interface HLSVariantInfo { url: string; meeting_url?: string; playlist_type?: HLSPlaylistType; metadata?: string; started_at?: number; initialised_at?: number; state?: HMSStreamingState; stream_type?: HLSStreamType; } export interface MetadataChangeNotification { values: { change_version?: number; updated_by?: string; data: any; key: string; updated_at?: number; }[]; } export interface PollStartNotification { polls: PollInfoParams[]; } export type PollStopNotification = PollStartNotification; export interface PollStats extends PollResult { poll_id: string; } export interface PollStatsNotification { polls: PollStats[]; } export interface RoomInfo { room_id: string; name: string; description: string; max_size: number; large_room_optimization: boolean; } export interface SessionInfo { session_id: string; room_id: string; peer_count: number; track_count: number; } export interface WhiteboardInfo { id: string; title?: string; owner?: string; state?: string; attributes?: Array<{ name: string; value: unknown }>; } export interface NodeInfo { sfu_node_id: string; }