// Type definitions for daily-js // Project: https://github.com/daily-co/daily-js // Definitions by: Paul Kompfner /** * --- BROWSER-SPECIFIC TYPES --- */ /// /** * --- DAILY-JS API --- */ export type DailyLanguage = | 'de' | 'en' | 'es' | 'fi' | 'fr' | 'it' | 'jp' | 'ka' | 'nl' | 'no' | 'pl' | 'pt' | 'ru' | 'sv' | 'tr'; export type DailyLanguageSetting = DailyLanguage | 'user'; export type DailyEvent = | 'loading' | 'load-attempt-failed' | 'loaded' | 'started-camera' | 'camera-error' | 'joining-meeting' | 'joined-meeting' | 'left-meeting' | 'participant-joined' | 'participant-updated' | 'participant-left' | 'track-started' | 'track-stopped' | 'recording-started' | 'recording-stopped' | 'recording-stats' | 'recording-error' | 'recording-upload-completed' | 'recording-data' | 'transcription-started' | 'transcription-stopped' | 'transcription-error' | 'app-message' | 'local-screen-share-started' | 'local-screen-share-stopped' | 'active-speaker-change' | 'active-speaker-mode-change' | 'network-quality-change' | 'network-connection' | 'fullscreen' | 'exited-fullscreen' | 'error' | 'click' | 'mousedown' | 'mouseup' | 'mouseover' | 'mousemove' | 'touchstart' | 'touchmove' | 'touchend' | 'live-streaming-started' | 'live-streaming-stopped' | 'live-streaming-error' | 'lang-updated' | 'access-state-updated' | 'meeting-session-updated' | 'waiting-participant-added' | 'waiting-participant-updated' | 'waiting-participant-removed' | 'theme-updated' | 'receive-settings-updated' | 'input-settings-updated' | 'show-local-video-changed'; export type DailyMeetingState = | 'new' | 'loading' | 'loaded' | 'joining-meeting' | 'joined-meeting' | 'left-meeting' | 'error'; export type DailyCameraErrorType = | 'cam-in-use' | 'mic-in-use' | 'cam-mic-in-use'; export type DailyFatalErrorType = | 'ejected' | 'nbf-room' | 'nbf-token' | 'exp-room' | 'exp-token'; export type DailyNetworkTopology = 'sfu' | 'peer'; export interface DailyParticipantsObject { local: DailyParticipant; [id: string]: DailyParticipant; } export interface DailyBrowserInfo { supported: boolean; mobile: boolean; name: string; version: string; supportsScreenShare: boolean; supportsSfu: boolean; supportsVideoProcessing: boolean; } export interface DailyThemeColors { /** * Main theme color. Used for primary actions and keyboard focus. */ accent?: string; /** * Text color rendered on `accent`. */ accentText?: string; /** * Background color. */ background?: string; /** * Background color for highlighted elements. */ backgroundAccent?: string; /** * Default text color, as rendered on `background` or `backgroundAccent`. */ baseText?: string; /** * Default border color for bordered elements. */ border?: string; /** * Background color for the call main area. */ mainAreaBg?: string; /** * Background color for video tiles. */ mainAreaBgAccent?: string; /** * Text color for text rendered inside the call main area, e.g. names. */ mainAreaText?: string; /** * Text color for supportive, less emphasized, text. */ supportiveText?: string; } export type DailyTheme = { colors: DailyThemeColors; }; export type DailyThemeConfig = | DailyTheme | { light: DailyTheme; dark: DailyTheme; }; export interface DailyGridLayoutConfig { maxTilesPerPage?: number; minTilesPerPage?: number; } export interface DailyLayoutConfig { grid?: DailyGridLayoutConfig; } export interface DailyCallOptions { url?: string; token?: string; lang?: DailyLanguageSetting; activeSpeakerMode?: boolean; showLeaveButton?: boolean; showParticipantsBar?: boolean; showLocalVideo?: boolean; showFullscreenButton?: boolean; iframeStyle?: Partial; customLayout?: boolean; bodyClass?: string; cssFile?: string; cssText?: string; dailyConfig?: DailyAdvancedConfig; subscribeToTracksAutomatically?: boolean; videoSource?: string | MediaStreamTrack | boolean; audioSource?: string | MediaStreamTrack | boolean; theme?: DailyThemeConfig; layoutConfig?: DailyLayoutConfig; receiveSettings?: DailyReceiveSettings; inputSettings?: DailyInputSettings; userName?: string; } export interface DailyLoadOptions extends DailyCallOptions { baseUrl?: string; } export interface DailyAdvancedConfig { experimentalChromeVideoMuteLightOff?: boolean; experimentalGetUserMediaConstraintsModify?: ( constraints: MediaStreamConstraints ) => void; fastConnect?: boolean; preferH264ForCam?: boolean; preferH264ForScreenSharing?: boolean; preferH264?: boolean; disableSimulcast?: boolean; h264Profile?: string; camSimulcastEncodings?: any[]; screenSimulcastEncodings?: any[]; useDevicePreferenceCookies?: boolean; } export interface DailyTrackState { subscribed: DailyTrackSubscriptionState; state: | 'blocked' | 'off' | 'sendable' | 'loading' | 'interrupted' | 'playable'; blocked?: { byDeviceMissing?: boolean; byDeviceInUse?: boolean; byPermissions?: boolean; }; off?: { byUser?: boolean; byRemoteRequest?: boolean; byBandwidth?: boolean; }; track?: MediaStreamTrack; } export interface DailyParticipant { // tracks audioTrack?: MediaStreamTrack; videoTrack?: MediaStreamTrack; screenVideoTrack?: MediaStreamTrack; screenAudioTrack?: MediaStreamTrack; // legacy track state audio: boolean; video: boolean; screen: boolean; // new track state tracks: { audio: DailyTrackState; video: DailyTrackState; screenAudio: DailyTrackState; screenVideo: DailyTrackState; }; // user/session info user_id: string; user_name: string; session_id: string; joined_at: Date; will_eject_at: Date; local: boolean; owner: boolean; record: boolean; // video element info (iframe-based calls using standard UI only) cam_info: {} | DailyVideoElementInfo; screen_info: {} | DailyVideoElementInfo; } export interface DailyWaitingParticipant { id: string; name: string; awaitingAccess: SpecifiedDailyAccess; } export type DailyTrackSubscriptionState = 'staged' | boolean; export type DailyTrackSubscriptionOptions = | DailyTrackSubscriptionState | 'avatar' | { audio?: DailyTrackSubscriptionState; video?: DailyTrackSubscriptionState; screenVideo?: DailyTrackSubscriptionState; screenAudio?: DailyTrackSubscriptionState; }; export interface DailyParticipantUpdateOptions { setAudio?: boolean; setVideo?: boolean; setSubscribedTracks?: DailyTrackSubscriptionOptions; eject?: true; styles?: DailyParticipantCss; } export interface DailyWaitingParticipantUpdateOptions { grantRequestedAccess?: boolean; } export interface DailyParticipantCss { cam?: DailyParticipantStreamCss; screen?: DailyParticipantStreamCss; } export interface DailyParticipantStreamCss { div?: Partial; overlay?: Partial; video?: Partial; } export interface DailyVideoElementInfo { width: number; height: number; left: number; top: number; video_width: number; video_height: number; } export interface DailyDeviceInfos { camera: {} | MediaDeviceInfo; mic: {} | MediaDeviceInfo; speaker: {} | MediaDeviceInfo; } export interface DailyScreenCaptureOptions { audio?: boolean; maxWidth?: number; maxHeight?: number; chromeMediaSourceId?: string; mediaStream?: MediaStream; } export interface DailyNetworkStats { quality: number; stats: { latest: { recvBitsPerSecond: number; sendBitsPerSecond: number; timestamp: number; videoRecvBitsPerSecond: number; videoRecvPacketLoss: number; videoSendBitsPerSecond: number; videoSendPacketLoss: number; }; worstVideoRecvPacketLoss: number; worstVideoSendPacketLoss: number; }; threshold: 'good' | 'low' | 'very-low'; } export interface DailyPendingRoomInfo { roomUrlPendingJoin: string; } export interface DailyRoomInfo { id: string; name: string; config: { nbf?: number; exp?: number; max_participants?: number; enable_screenshare?: boolean; enable_chat?: boolean; enable_knocking?: boolean; enable_network_ui?: boolean; enable_prejoin_ui?: boolean; enable_video_processing_ui?: boolean; start_video_off?: boolean; start_audio_off?: boolean; owner_only_broadcast?: boolean; audio_only?: boolean; enable_recording?: string; enable_dialin?: boolean; autojoin?: boolean; eject_at_room_exp?: boolean; eject_after_elapsed?: number; lang?: '' | DailyLanguageSetting; sfu_switchover?: number; signaling_impl?: string; geo?: string; }; domainConfig: { hide_daily_branding?: boolean; redirect_on_meeting_exit?: string; hipaa?: boolean; sfu_impl?: string; signaling_impl?: string; sfu_switchover?: number; lang?: '' | DailyLanguageSetting; max_api_rooms?: number; webhook_meeting_end?: any; max_live_streams?: number; enable_network_ui?: boolean; enable_prejoin_ui?: boolean; enable_video_processing_ui?: boolean; }; tokenConfig: { eject_at_token_exp?: boolean; eject_after_elapsed?: boolean; nbf?: number; exp?: number; is_owner?: boolean; user_name?: string; user_id?: string; enable_screenshare?: boolean; start_video_off?: boolean; start_audio_off?: boolean; enable_recording?: string; start_cloud_recording?: boolean; close_tab_on_exit?: boolean; redirect_on_meeting_exit?: string; lang?: '' | DailyLanguageSetting; }; dialInPIN?: string; } export interface DailyMeetingSession { id: string; } export interface DailyVideoReceiveSettings { layer?: number; } export interface DailySingleParticipantReceiveSettings { video?: DailyVideoReceiveSettings; screenVideo?: DailyVideoReceiveSettings; } export interface DailyReceiveSettings { [participantIdOrBase: string]: DailySingleParticipantReceiveSettings; } export interface DailyVideoReceiveSettingsUpdates { layer?: number | 'inherit'; } export interface DailySingleParticipantReceiveSettingsUpdates { video?: DailyVideoReceiveSettingsUpdates | 'inherit'; screenVideo?: DailyVideoReceiveSettingsUpdates | 'inherit'; } export interface DailyReceiveSettingsUpdates { [participantIdOrBaseOrStar: string]: | DailySingleParticipantReceiveSettingsUpdates | 'inherit'; } export interface DailyInputSettings { video?: DailyInputVideoSettings; } export interface DailyInputVideoSettings { processor?: DailyInputVideoProcessorSettings; } export interface DailyInputVideoProcessorSettings { type: 'none' | 'background-blur'; config?: {}; } export interface DailyEventObjectNoPayload { action: Extract< DailyEvent, | 'loading' | 'loaded' | 'joining-meeting' | 'left-meeting' | 'recording-stopped' | 'recording-stats' | 'recording-error' | 'recording-upload-completed' | 'fullscreen' | 'exited-fullscreen' | 'live-streaming-started' | 'live-streaming-stopped' >; } export interface DailyEventObjectCameraError { action: Extract; errorMsg: { errorMsg: string; audioOk?: boolean; videoOk?: boolean; }; error?: { type: DailyCameraErrorType; localizedMsg?: string; }; } export interface DailyEventObjectFatalError { action: Extract; errorMsg: string; error?: { type: DailyFatalErrorType; localizedMsg?: string; }; } export interface DailyEventObjectGenericError { action: Extract; errorMsg: string; } export interface DailyEventObjectParticipants { action: Extract; participants: DailyParticipantsObject; } export interface DailyEventObjectParticipant { action: Extract< DailyEvent, 'participant-joined' | 'participant-updated' | 'participant-left' >; participant: DailyParticipant; } export interface DailyEventObjectWaitingParticipant { action: Extract< DailyEvent, | 'waiting-participant-added' | 'waiting-participant-updated' | 'waiting-participant-removed' >; participant: DailyWaitingParticipant; } export interface DailyEventObjectAccessState extends DailyAccessState { action: Extract; } export interface DailyEventObjectMeetingSessionUpdated { action: Extract; meetingSession: DailyMeetingSession; } export interface DailyEventObjectTrack { action: Extract; participant: DailyParticipant | null; // null if participant left meeting track: MediaStreamTrack; } export interface DailyEventObjectRecordingStarted { action: Extract; local?: boolean; recordingId?: string; startedBy?: string; type?: string; layout?: DailyStreamingLayoutConfig; } export interface DailyEventObjectMouseEvent { action: Extract< DailyEvent, 'click' | 'mousedown' | 'mouseup' | 'mouseover' | 'mousemove' >; event: { type: string; button: number; x: number; y: number; pageX: number; pageY: number; screenX: number; screenY: number; offsetX: number; offsetY: number; altKey: boolean; ctrlKey: boolean; metaKey: boolean; shiftKey: boolean; }; participant: DailyParticipant; } export interface DailyEventObjectTouchEvent { action: Extract; event: { type: string; altKey: boolean; ctrlKey: boolean; metaKey: boolean; shiftKey: boolean; }; participant: DailyParticipant; } export interface DailyEventObjectNetworkQualityEvent { action: Extract; threshold: 'good' | 'low' | 'very-low'; quality: number; } export type NetworkConnectionType = 'signaling' | 'peer-to-peer' | 'sfu'; export interface DailyEventObjectNetworkConnectionEvent { action: Extract; type: NetworkConnectionType; event: string; session_id?: string; sfu_id?: string; } export interface DailyEventObjectActiveSpeakerChange { action: Extract; activeSpeaker: { peerId: string; }; } export interface DailyEventObjectActiveSpeakerModeChange { action: Extract; enabled: boolean; } export interface DailyEventObjectAppMessage { action: Extract; data: any; fromId: string; } export interface DailyEventObjectLangUpdated { action: Extract; lang: DailyLanguage; langSetting: DailyLanguageSetting; } export interface DailyEventObjectThemeUpdated { action: Extract; theme: DailyThemeConfig; } export interface DailyEventObjectReceiveSettingsUpdated { action: Extract; receiveSettings: DailyReceiveSettings; } export interface DailyEventObjectShowLocalVideoChanged { action: Extract; show: boolean; } export interface DailyEventObjectInputSettingsUpdated { action: Extract; inputSettings: DailyInputSettings; } export interface DailyEventObjectLiveStreamingStarted { action: Extract; layout?: DailyStreamingLayoutConfig; } export type DailyEventObject< T extends DailyEvent = any > = T extends DailyEventObjectAppMessage['action'] ? DailyEventObjectAppMessage : T extends DailyEventObjectNoPayload['action'] ? DailyEventObjectNoPayload : T extends DailyEventObjectCameraError['action'] ? DailyEventObjectCameraError : T extends DailyEventObjectFatalError['action'] ? DailyEventObjectFatalError : T extends DailyEventObjectGenericError['action'] ? DailyEventObjectGenericError : T extends DailyEventObjectParticipants['action'] ? DailyEventObjectParticipants : T extends DailyEventObjectParticipant['action'] ? DailyEventObjectParticipant : T extends DailyEventObjectWaitingParticipant['action'] ? DailyEventObjectWaitingParticipant : T extends DailyEventObjectAccessState['action'] ? DailyEventObjectAccessState : T extends DailyEventObjectMeetingSessionUpdated['action'] ? DailyEventObjectMeetingSessionUpdated : T extends DailyEventObjectTrack['action'] ? DailyEventObjectTrack : T extends DailyEventObjectRecordingStarted['action'] ? DailyEventObjectRecordingStarted : T extends DailyEventObjectMouseEvent['action'] ? DailyEventObjectMouseEvent : T extends DailyEventObjectTouchEvent['action'] ? DailyEventObjectTouchEvent : T extends DailyEventObjectNetworkQualityEvent['action'] ? DailyEventObjectNetworkQualityEvent : T extends DailyEventObjectNetworkConnectionEvent['action'] ? DailyEventObjectNetworkConnectionEvent : T extends DailyEventObjectActiveSpeakerChange['action'] ? DailyEventObjectActiveSpeakerChange : T extends DailyEventObjectActiveSpeakerModeChange['action'] ? DailyEventObjectActiveSpeakerModeChange : T extends DailyEventObjectLangUpdated['action'] ? DailyEventObjectLangUpdated : T extends DailyEventObjectThemeUpdated['action'] ? DailyEventObjectThemeUpdated : T extends DailyEventObjectReceiveSettingsUpdated['action'] ? DailyEventObjectReceiveSettingsUpdated : T extends DailyEventObjectShowLocalVideoChanged['action'] ? DailyEventObjectShowLocalVideoChanged : T extends DailyEventObjectInputSettingsUpdated['action'] ? DailyEventObjectInputSettingsUpdated : any; export interface DailyFaceInfo { score: number; viewportBox: { width: number; height: number; left: number; top: number; right: number; bottom: number; }; } export interface DailyCallFactory { createCallObject(properties?: DailyCallOptions): DailyCall; wrap(iframe: HTMLIFrameElement, properties?: DailyCallOptions): DailyCall; createFrame( parentElement: HTMLElement, properties?: DailyCallOptions ): DailyCall; createFrame(properties?: DailyCallOptions): DailyCall; createTransparentFrame(properties?: DailyCallOptions): DailyCall; } export interface DailyCallStaticUtils { supportedBrowser(): DailyBrowserInfo; version(): string; } export interface DailyStreamingDefaultLayoutConfig { preset: 'default'; max_cam_streams?: number; } export interface DailyStreamingSingleParticipantLayoutConfig { preset: 'single-participant'; session_id: string; } export interface DailyStreamingActiveParticipantLayoutConfig { preset: 'active-participant'; } export type DailyStreamingPortraitLayoutVariant = 'vertical' | 'inset'; export interface DailyStreamingPortraitLayoutConfig { preset: 'portrait'; variant?: DailyStreamingPortraitLayoutVariant; max_cam_streams?: number; } export type DailyStreamingLayoutConfig = | DailyStreamingDefaultLayoutConfig | DailyStreamingSingleParticipantLayoutConfig | DailyStreamingActiveParticipantLayoutConfig | DailyStreamingPortraitLayoutConfig; export type DailyAccess = 'unknown' | SpecifiedDailyAccess; export type SpecifiedDailyAccess = { level: 'none' | 'lobby' | 'full' }; export type DailyAccessState = { access: DailyAccess; awaitingAccess?: SpecifiedDailyAccess; }; export type DailyAccessRequest = { access?: { level: 'full' }; name: string; }; export interface DailyStreamingOptions { width?: number; height?: number; backgroundColor?: string; layout?: DailyStreamingLayoutConfig; } export interface DailyLiveStreamingOptions extends DailyStreamingOptions { rtmpUrl: string; } export interface DailyCall { iframe(): HTMLIFrameElement | null; join(properties?: DailyCallOptions): Promise; leave(): Promise; destroy(): Promise; loadCss(properties: { bodyClass?: string; cssFile?: string; cssText?: string; }): DailyCall; meetingState(): DailyMeetingState; accessState(): DailyAccessState; participants(): DailyParticipantsObject; updateParticipant( sessionId: string, updates: DailyParticipantUpdateOptions ): DailyCall; updateParticipants(updates: { [sessionId: string]: DailyParticipantUpdateOptions; }): DailyCall; waitingParticipants(): { [id: string]: DailyWaitingParticipant }; updateWaitingParticipant( id: string, updates: DailyWaitingParticipantUpdateOptions ): Promise<{ id: string }>; updateWaitingParticipants(updates: { [id: string]: DailyWaitingParticipantUpdateOptions; }): Promise<{ ids: string[] }>; requestAccess( access: DailyAccessRequest ): Promise<{ access: DailyAccess; granted: boolean }>; localAudio(): boolean; localVideo(): boolean; setLocalAudio(enabled: boolean): DailyCall; setLocalVideo(enabled: boolean): DailyCall; getReceiveSettings( id: string, options?: { showInheritedValues: boolean } ): Promise; getReceiveSettings(): Promise; updateReceiveSettings( receiveSettings: DailyReceiveSettingsUpdates ): Promise; updateInputSettings( inputSettings: DailyInputSettings ): Promise; getInputSettings(): Promise; setBandwidth(bw: { kbs?: number | 'NO_CAP' | null; trackConstraints?: MediaTrackConstraints; }): DailyCall; getDailyLang(): Promise<{ lang: DailyLanguage; langSetting: DailyLanguageSetting; }>; setDailyLang(lang: DailyLanguageSetting): DailyCall; getMeetingSession(): Promise<{ meetingSession: DailyMeetingSession; }>; setUserName( name: string, options?: { thisMeetingOnly?: boolean } ): Promise<{ userName: string }>; startCamera(properties?: DailyCallOptions): Promise; cycleCamera(): Promise<{ device?: MediaDeviceInfo | null }>; cycleMic(): Promise<{ device?: MediaDeviceInfo | null }>; setInputDevices(devices: { audioDeviceId?: string | false; audioSource?: MediaStreamTrack | false; videoDeviceId?: string | false; videoSource?: MediaStreamTrack | false; }): DailyCall; setInputDevicesAsync(devices: { audioDeviceId?: string | false; audioSource?: MediaStreamTrack | false; videoDeviceId?: string | false; videoSource?: MediaStreamTrack | false; }): Promise; setOutputDevice(audioDevice: { outputDeviceId?: string }): DailyCall; getInputDevices(): Promise; preAuth(properties?: DailyCallOptions): Promise<{ access: DailyAccess }>; load(properties?: DailyLoadOptions): Promise; startScreenShare(captureOptions?: DailyScreenCaptureOptions): void; stopScreenShare(): void; startRecording(options?: DailyStreamingOptions): void; updateRecording(options: { layout?: DailyStreamingLayoutConfig }): void; stopRecording(): void; startLiveStreaming(options: DailyLiveStreamingOptions): void; updateLiveStreaming(options: { layout?: DailyStreamingLayoutConfig }): void; stopLiveStreaming(): void; startTranscription(): void; stopTranscription(): void; getNetworkStats(): Promise; getActiveSpeaker(): { peerId?: string }; setActiveSpeakerMode(enabled: boolean): DailyCall; activeSpeakerMode(): boolean; subscribeToTracksAutomatically(): boolean; setSubscribeToTracksAutomatically(enabled: boolean): DailyCall; enumerateDevices(): Promise<{ devices: MediaDeviceInfo[] }>; sendAppMessage(data: any, to?: string): DailyCall; addFakeParticipant(details?: { aspectRatio: number }): DailyCall; setShowNamesMode(mode: false | 'always' | 'never'): DailyCall; setShowLocalVideo(show: boolean): DailyCall; setShowParticipantsBar(show: boolean): DailyCall; theme(): DailyThemeConfig; setTheme(theme: DailyThemeConfig): Promise; showLocalVideo(): boolean; showParticipantsBar(): boolean; detectAllFaces(): Promise<{ faces?: { [id: string]: DailyFaceInfo[] }; }>; requestFullscreen(): Promise; exitFullscreen(): void; room(options?: { includeRoomConfigDefaults: boolean; }): Promise; geo(): Promise<{ current: string }>; getNetworkTopology(): Promise<{ topology: DailyNetworkTopology | 'none'; error?: string; }>; setNetworkTopology(options: { topology: DailyNetworkTopology; }): Promise<{ workerId?: string; error?: string }>; setPlayNewParticipantSound(sound: boolean | number): void; on( event: T, handler: (event?: DailyEventObject) => void ): DailyCall; once( event: T, handler: (event?: DailyEventObject) => void ): DailyCall; off( event: T, handler: (event?: DailyEventObject) => void ): DailyCall; properties: { dailyConfig?: DailyAdvancedConfig; userName?: string; }; } declare const DailyIframe: DailyCallFactory & DailyCallStaticUtils; export default DailyIframe;