1876 lines
50 KiB
TypeScript
1876 lines
50 KiB
TypeScript
/**
|
|
* Jitsi Meet External API TypeScript Definitions
|
|
* Based on: https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-iframe
|
|
*/
|
|
|
|
declare module '@jitsi/iframe-api' {
|
|
export = JitsiMeetExternalAPI;
|
|
}
|
|
|
|
export declare class JitsiMeetExternalAPI {
|
|
constructor(domain: string, options?: JitsiMeetExternalAPIOptions);
|
|
|
|
// ============================================================================
|
|
// FUNCTIONS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Captures a high quality picture using the device's camera. Mobile browsers only.
|
|
* @param cameraFacingMode - The facing mode: 'environment' or 'user'. Defaults to 'environment'.
|
|
* @param descriptionText - Custom description text for the consent dialog.
|
|
* @param titleText - Custom title for the consent dialog.
|
|
*/
|
|
captureCameraPicture(
|
|
cameraFacingMode?: CameraFacingMode,
|
|
descriptionText?: string,
|
|
titleText?: string
|
|
): Promise<CaptureCameraPictureResult>;
|
|
|
|
/**
|
|
* Captures a screenshot for the participant in the large video view (on stage).
|
|
*/
|
|
captureLargeVideoScreenshot(): Promise<CaptureScreenshotResult>;
|
|
|
|
/**
|
|
* Retrieves a list of available devices.
|
|
*/
|
|
getAvailableDevices(): Promise<AvailableDevices>;
|
|
|
|
/**
|
|
* Returns a promise which resolves with an array of currently sharing participants IDs.
|
|
*/
|
|
getContentSharingParticipants(): Promise<ContentSharingParticipants>;
|
|
|
|
/**
|
|
* Retrieves a list of currently selected devices.
|
|
*/
|
|
getCurrentDevices(): Promise<CurrentDevices>;
|
|
|
|
/**
|
|
* Retrieves an object containing information about the deployment.
|
|
*/
|
|
getDeploymentInfo(): Promise<DeploymentInfo>;
|
|
|
|
/**
|
|
* Retrieves an object containing information about livestreamUrl of the current live stream.
|
|
*/
|
|
getLivestreamUrl(): Promise<LivestreamData>;
|
|
|
|
/**
|
|
* @deprecated Use getRoomsInfo instead.
|
|
* Returns an array containing participant information.
|
|
*/
|
|
getParticipantsInfo(): ParticipantInfo[];
|
|
|
|
/**
|
|
* Returns an array of available rooms and details.
|
|
*/
|
|
getRoomsInfo(): Promise<RoomsInfo>;
|
|
|
|
/**
|
|
* Returns the meeting's unique session ID.
|
|
*/
|
|
getSessionId(): Promise<string>;
|
|
|
|
/**
|
|
* Returns the meeting's unique etherpad shared document URL.
|
|
*/
|
|
getSharedDocumentUrl(): Promise<string>;
|
|
|
|
/**
|
|
* Returns the current video quality setting.
|
|
*/
|
|
getVideoQuality(): number;
|
|
|
|
/**
|
|
* Returns array of commands supported by executeCommand.
|
|
*/
|
|
getSupportedCommands(): string[];
|
|
|
|
/**
|
|
* Returns array of events supported by addListener.
|
|
*/
|
|
getSupportedEvents(): string[];
|
|
|
|
/**
|
|
* Resolves to true if the device change is available and to false if not.
|
|
* @param deviceType - The device type: 'output', 'input', or undefined.
|
|
*/
|
|
isDeviceChangeAvailable(deviceType?: DeviceType): Promise<boolean>;
|
|
|
|
/**
|
|
* Resolves to true if the device list is available and to false if not.
|
|
*/
|
|
isDeviceListAvailable(): Promise<boolean>;
|
|
|
|
/**
|
|
* Resolves to true if multiple audio input is supported and to false if not.
|
|
*/
|
|
isMultipleAudioInputSupported(): Promise<boolean>;
|
|
|
|
/**
|
|
* Selects the participant ID to be the pinned participant.
|
|
* @param participantId - The participant ID to pin.
|
|
* @param videoType - Optional. 'camera' or 'desktop'. Default is 'camera'.
|
|
*/
|
|
pinParticipant(participantId: string | null, videoType?: VideoType): void;
|
|
|
|
/**
|
|
* Resizes the large video container per the provided dimensions.
|
|
*/
|
|
resizeLargeVideo(width: number, height: number): void;
|
|
|
|
/**
|
|
* Sets the audio input device to the one with the passed label or ID.
|
|
*/
|
|
setAudioInputDevice(deviceLabel: string, deviceId?: string): void;
|
|
|
|
/**
|
|
* Sets the audio output device to the one with the passed label or ID.
|
|
*/
|
|
setAudioOutputDevice(deviceLabel: string, deviceId?: string): void;
|
|
|
|
/**
|
|
* Displays the participant with the given participant ID on the large video.
|
|
* @param participantId - The participant ID to display, or undefined for auto-selection.
|
|
*/
|
|
setLargeVideoParticipant(participantId?: string): void;
|
|
|
|
/**
|
|
* Sets the video input device to the one with the passed label or ID.
|
|
*/
|
|
setVideoInputDevice(deviceLabel: string, deviceId?: string): void;
|
|
|
|
/**
|
|
* Set your virtual background with a base64 image.
|
|
* @param enabled - Enable or disable the virtual background.
|
|
* @param backgroundImage - Base64 image string, e.g., "data:image/png;base64,iVBOR...".
|
|
*/
|
|
setVirtualBackground(enabled: boolean, backgroundImage?: string): void;
|
|
|
|
/**
|
|
* Starts a file recording or streaming session.
|
|
*/
|
|
startRecording(options: RecordingOptions): void;
|
|
|
|
/**
|
|
* Stops an ongoing file recording, streaming session, or transcription.
|
|
* @param mode - Recording mode: 'local', 'stream', or 'file'.
|
|
* @param transcription - Whether to stop transcription.
|
|
*/
|
|
stopRecording(mode: RecordingMode, transcription?: boolean): void;
|
|
|
|
/**
|
|
* Returns the number of conference participants.
|
|
*/
|
|
getNumberOfParticipants(): number;
|
|
|
|
/**
|
|
* @deprecated Use getRoomsInfo instead.
|
|
* Returns a participant's avatar URL.
|
|
*/
|
|
getAvatarURL(participantId: string): string;
|
|
|
|
/**
|
|
* Returns a participant's display name.
|
|
*/
|
|
getDisplayName(participantId: string): string;
|
|
|
|
/**
|
|
* Returns a participant's email.
|
|
*/
|
|
getEmail(participantId: string): string;
|
|
|
|
/**
|
|
* Returns the IFrame HTML element which is used to load the Jitsi Meet conference.
|
|
*/
|
|
getIFrame(): HTMLIFrameElement;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current audio disabled state.
|
|
*/
|
|
isAudioDisabled(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current audio muted state.
|
|
*/
|
|
isAudioMuted(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current video muted state.
|
|
*/
|
|
isVideoMuted(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current audio availability state.
|
|
*/
|
|
isAudioAvailable(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current video availability state.
|
|
*/
|
|
isVideoAvailable(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns whether the current user is a visitor or not.
|
|
*/
|
|
isVisitor(): boolean;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current moderation state of the given media type.
|
|
* @param mediaType - 'audio' (default) or 'video'.
|
|
*/
|
|
isModerationOn(mediaType?: MediaType): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to a Boolean or null when there is no conference.
|
|
*/
|
|
isP2pActive(): Promise<boolean | null>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves to the current force mute state of the given participant.
|
|
* @param participantId - The participant ID.
|
|
* @param mediaType - 'audio' (default) or 'video'.
|
|
*/
|
|
isParticipantForceMuted(participantId: string, mediaType?: MediaType): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves with the current participants pane state.
|
|
*/
|
|
isParticipantsPaneOpen(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves with whether meeting was started in view only.
|
|
*/
|
|
isStartSilent(): Promise<boolean>;
|
|
|
|
/**
|
|
* Returns a Promise which resolves with the map of breakout rooms.
|
|
*/
|
|
listBreakoutRooms(): Promise<BreakoutRoomsMap>;
|
|
|
|
/**
|
|
* Invite the given array of participants to the meeting.
|
|
*/
|
|
invite(invitees: Invitee[]): Promise<void>;
|
|
|
|
/**
|
|
* Removes the embedded Jitsi Meet conference.
|
|
*/
|
|
dispose(): void;
|
|
|
|
// ============================================================================
|
|
// COMMANDS - executeCommand
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Execute a single command.
|
|
*/
|
|
executeCommand(command: 'displayName', name: string): void;
|
|
executeCommand(command: 'password', password: string): void;
|
|
executeCommand(command: 'toggleLobby', enabled: boolean): void;
|
|
executeCommand(command: 'sendTones', options: SendTonesOptions): void;
|
|
executeCommand(command: 'startShareVideo', url: string): void;
|
|
executeCommand(command: 'stopShareVideo'): void;
|
|
executeCommand(command: 'subject', subject: string): void;
|
|
executeCommand(command: 'localSubject', subject: string): void;
|
|
executeCommand(command: 'toggleAudio'): void;
|
|
executeCommand(command: 'toggleVideo'): void;
|
|
executeCommand(command: 'toggleFilmStrip'): void;
|
|
executeCommand(command: 'toggleChat'): void;
|
|
executeCommand(command: 'toggleRaiseHand'): void;
|
|
executeCommand(command: 'toggleShareScreen'): void;
|
|
executeCommand(command: 'setNoiseSuppressionEnabled', options: NoiseSuppressionOptions): void;
|
|
executeCommand(command: 'toggleSubtitles'): void;
|
|
executeCommand(command: 'toggleTileView'): void;
|
|
executeCommand(command: 'hangup'): void;
|
|
executeCommand(command: 'endConference'): void;
|
|
executeCommand(command: 'email', email: string): void;
|
|
executeCommand(
|
|
command: 'sendCameraFacingMode',
|
|
receiverParticipantId: string,
|
|
facingMode?: CameraFacingMode
|
|
): void;
|
|
executeCommand(
|
|
command: 'sendEndpointTextMessage',
|
|
receiverParticipantId: string,
|
|
text: string
|
|
): void;
|
|
executeCommand(
|
|
command: 'setLargeVideoParticipant',
|
|
participantId?: string,
|
|
videoType?: VideoType
|
|
): void;
|
|
executeCommand(command: 'setVideoQuality', height: number): void;
|
|
executeCommand(command: 'muteEveryone', mediaType?: MediaType): void;
|
|
executeCommand(
|
|
command: 'muteRemoteParticipant',
|
|
participantId: string,
|
|
mediaType?: MediaType
|
|
): void;
|
|
executeCommand(command: 'startRecording', options: RecordingOptions): void;
|
|
executeCommand(command: 'stopRecording', mode: RecordingMode, transcription?: boolean): void;
|
|
executeCommand(command: 'initiatePrivateChat', participantId: string): void;
|
|
executeCommand(command: 'cancelPrivateChat'): void;
|
|
executeCommand(command: 'kickParticipant', participantId: string): void;
|
|
executeCommand(command: 'grantModerator', participantId: string): void;
|
|
executeCommand(command: 'overwriteConfig', config: Record<string, unknown>): void;
|
|
executeCommand(
|
|
command: 'sendChatMessage',
|
|
message: string,
|
|
to?: string,
|
|
ignorePrivacy?: boolean
|
|
): void;
|
|
executeCommand(command: 'setFollowMe', value: boolean, recorderOnly?: boolean): void;
|
|
executeCommand(
|
|
command: 'setSubtitles',
|
|
enabled: boolean,
|
|
displaySubtitles?: boolean,
|
|
language?: string | null
|
|
): void;
|
|
executeCommand(command: 'setTileView', enabled: boolean): void;
|
|
executeCommand(command: 'answerKnockingParticipant', id: string, approved: boolean): void;
|
|
executeCommand(command: 'toggleCamera', facingMode?: CameraFacingMode): void;
|
|
executeCommand(command: 'toggleCameraMirror'): void;
|
|
executeCommand(command: 'toggleVirtualBackgroundDialog'): void;
|
|
executeCommand(command: 'pinParticipant', participantId?: string | null): void;
|
|
executeCommand(command: 'setParticipantVolume', participantId: string, volume: number): void;
|
|
executeCommand(command: 'toggleParticipantsPane', enabled: boolean): void;
|
|
executeCommand(command: 'toggleModeration', enable: boolean, mediaType?: MediaType): void;
|
|
executeCommand(command: 'askToUnmute', participantId: string): void;
|
|
executeCommand(command: 'approveVideo', participantId: string): void;
|
|
executeCommand(command: 'rejectParticipant', participantId: string, mediaType?: MediaType): void;
|
|
executeCommand(command: 'addBreakoutRoom', name?: string): void;
|
|
executeCommand(command: 'autoAssignToBreakoutRooms'): void;
|
|
executeCommand(command: 'closeBreakoutRoom', roomId: string): void;
|
|
executeCommand(command: 'joinBreakoutRoom', roomId?: string): void;
|
|
executeCommand(command: 'removeBreakoutRoom', breakoutRoomJid: string): void;
|
|
executeCommand(command: 'resizeFilmStrip', options: ResizeFilmStripOptions): void;
|
|
executeCommand(command: 'resizeLargeVideo', width: number, height: number): void;
|
|
executeCommand(command: 'sendParticipantToRoom', participantId: string, roomId: string): void;
|
|
executeCommand(command: 'overwriteNames', names: OverwriteNameEntry[]): void;
|
|
executeCommand(command: 'showNotification', options: ShowNotificationOptions): void;
|
|
executeCommand(command: 'hideNotification', uid: string): void;
|
|
executeCommand(command: 'toggleWhiteboard'): void;
|
|
executeCommand(command: 'setAssumedBandwidthBps', assumedBandwidthBps: number): void;
|
|
executeCommand(command: 'setBlurredBackground', blurType: BlurType): void;
|
|
executeCommand(command: 'setAudioOnly', enable: boolean): void;
|
|
executeCommand(command: 'setVirtualBackground', enabled: boolean, backgroundImage: string): void;
|
|
executeCommand(command: string, ...args: unknown[]): void;
|
|
|
|
/**
|
|
* Execute multiple commands.
|
|
*/
|
|
executeCommands(commands: ExecuteCommands): void;
|
|
|
|
// ============================================================================
|
|
// EVENTS - addListener / removeListener / on
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Add an event listener.
|
|
*/
|
|
addListener<E extends keyof JitsiMeetEventMap>(
|
|
event: E,
|
|
listener: (data: JitsiMeetEventMap[E]) => void
|
|
): void;
|
|
addListener(event: string, listener: (data: unknown) => void): void;
|
|
|
|
/**
|
|
* Remove an event listener.
|
|
*/
|
|
removeListener<E extends keyof JitsiMeetEventMap>(
|
|
event: E,
|
|
listener: (data: JitsiMeetEventMap[E]) => void
|
|
): void;
|
|
removeListener(event: string, listener: (data: unknown) => void): void;
|
|
|
|
/**
|
|
* Alias for addListener.
|
|
*/
|
|
on<E extends keyof JitsiMeetEventMap>(
|
|
event: E,
|
|
listener: (data: JitsiMeetEventMap[E]) => void
|
|
): void;
|
|
on(event: string, listener: (data: unknown) => void): void;
|
|
|
|
/**
|
|
* Add an event listener that only triggers once.
|
|
*/
|
|
once<E extends keyof JitsiMeetEventMap>(
|
|
event: E,
|
|
listener: (data: JitsiMeetEventMap[E]) => void
|
|
): void;
|
|
once(event: string, listener: (data: unknown) => void): void;
|
|
}
|
|
|
|
// ============================================================================
|
|
// CONSTRUCTOR OPTIONS
|
|
// ============================================================================
|
|
|
|
export interface JitsiMeetExternalAPIOptions {
|
|
/** The name of the room to join. */
|
|
roomName?: string;
|
|
/** The created IFrame width. */
|
|
width?: number | string;
|
|
/** The created IFrame height. */
|
|
height?: number | string;
|
|
/** The HTML DOM Element where the IFrame is added as a child. */
|
|
parentNode?: HTMLElement;
|
|
/** JS object with overrides for options defined in config.js. */
|
|
configOverwrite?: ConfigOverwrite;
|
|
/** JS object with overrides for options defined in interface_config.js. */
|
|
interfaceConfigOverwrite?: InterfaceConfigOverwrite;
|
|
/** The JWT token. */
|
|
jwt?: string;
|
|
/** The IFrame onload event handler. */
|
|
onload?: () => void;
|
|
/** Object arrays that contain information about participants invited to a call. */
|
|
invitees?: Invitee[];
|
|
/** Information map about the devices used in a call. */
|
|
devices?: DevicesConfig;
|
|
/** JS object that contains information about the participant. */
|
|
userInfo?: UserInfo;
|
|
/** The default meeting language. */
|
|
lang?: string;
|
|
/** Object with rules to modify/remove existing ice server configuration. */
|
|
iceServers?: IceServersConfig;
|
|
}
|
|
|
|
interface ConfigOverwrite {
|
|
// Audio settings
|
|
startWithAudioMuted?: boolean;
|
|
startAudioMuted?: number;
|
|
startAudioOnly?: boolean;
|
|
startSilent?: boolean;
|
|
enableNoisyMicDetection?: boolean;
|
|
enableOpusRed?: boolean;
|
|
audioQuality?: {
|
|
stereo?: boolean;
|
|
opusMaxAverageBitrate?: number | null;
|
|
enableOpusDtx?: boolean;
|
|
};
|
|
noiseSuppression?: {
|
|
krisp?: {
|
|
enabled?: boolean;
|
|
logProcessStats?: boolean;
|
|
debugLogs?: boolean;
|
|
useBVC?: boolean;
|
|
bufferOverflowMS?: number;
|
|
};
|
|
};
|
|
disableAEC?: boolean;
|
|
disableAGC?: boolean;
|
|
disableAP?: boolean;
|
|
disableNS?: boolean;
|
|
|
|
// Video settings
|
|
startWithVideoMuted?: boolean;
|
|
startVideoMuted?: number;
|
|
maxFullResolutionParticipants?: number;
|
|
disableSimulcast?: boolean;
|
|
disableResponsiveTiles?: boolean;
|
|
constraints?: {
|
|
video?: {
|
|
height?: {
|
|
ideal?: number;
|
|
max?: number;
|
|
min?: number;
|
|
};
|
|
};
|
|
};
|
|
desktopSharingFrameRate?: {
|
|
min?: number;
|
|
max?: number;
|
|
};
|
|
screenShareSettings?: {
|
|
desktopPreferCurrentTab?: boolean;
|
|
desktopSystemAudio?: 'include' | 'exclude';
|
|
desktopSurfaceSwitching?: 'include' | 'exclude';
|
|
desktopDisplaySurface?: string;
|
|
desktopSelfBrowserSurface?: 'include' | 'exclude';
|
|
};
|
|
videoQuality?: {
|
|
codecPreferenceOrder?: ('AV1' | 'VP9' | 'VP8' | 'H264')[];
|
|
mobileCodecPreferenceOrder?: ('AV1' | 'VP9' | 'VP8' | 'H264')[];
|
|
screenshareCodec?: string;
|
|
mobileScreenshareCodec?: string;
|
|
enableAdaptiveMode?: boolean;
|
|
minHeightForQualityLvl?: Record<number, 'low' | 'standard' | 'high'>;
|
|
};
|
|
|
|
// Prejoin configuration (replaces prejoinPageEnabled)
|
|
prejoinConfig?: {
|
|
enabled?: boolean;
|
|
hideDisplayName?: boolean;
|
|
hideExtraJoinButtons?: ('no-audio' | 'by-phone')[];
|
|
preCallTestEnabled?: boolean;
|
|
preCallTestICEUrl?: string;
|
|
showHangUp?: boolean;
|
|
};
|
|
/** @deprecated Use prejoinConfig.enabled instead */
|
|
prejoinPageEnabled?: boolean;
|
|
|
|
// Lobby configuration
|
|
lobby?: {
|
|
autoKnock?: boolean;
|
|
enableChat?: boolean;
|
|
showHangUp?: boolean;
|
|
};
|
|
/** @deprecated Use lobby.autoKnock instead */
|
|
autoKnockLobby?: boolean;
|
|
/** @deprecated Use lobby.enableChat instead */
|
|
enableLobbyChat?: boolean;
|
|
|
|
// Security UI configuration
|
|
securityUi?: {
|
|
hideLobbyButton?: boolean;
|
|
disableLobbyPassword?: boolean;
|
|
};
|
|
/** @deprecated Use securityUi.hideLobbyButton instead */
|
|
hideLobbyButton?: boolean;
|
|
|
|
// Deep linking configuration
|
|
deeplinking?: {
|
|
disabled?: boolean;
|
|
hideLogo?: boolean;
|
|
desktop?: {
|
|
appName?: string;
|
|
appScheme?: string;
|
|
download?: {
|
|
linux?: string;
|
|
macos?: string;
|
|
windows?: string;
|
|
};
|
|
enabled?: boolean;
|
|
};
|
|
ios?: {
|
|
appName?: string;
|
|
appScheme?: string;
|
|
downloadLink?: string;
|
|
};
|
|
android?: {
|
|
appName?: string;
|
|
appScheme?: string;
|
|
downloadLink?: string;
|
|
appPackage?: string;
|
|
fDroidUrl?: string;
|
|
};
|
|
};
|
|
/** @deprecated Use deeplinking.disabled instead */
|
|
disableDeepLinking?: boolean;
|
|
|
|
// Welcome page configuration
|
|
welcomePage?: {
|
|
disabled?: boolean;
|
|
customUrl?: string;
|
|
};
|
|
|
|
// Recording configuration
|
|
recordings?: {
|
|
recordAudioAndVideo?: boolean;
|
|
suggestRecording?: boolean;
|
|
showPrejoinWarning?: boolean;
|
|
showRecordingLink?: boolean;
|
|
requireConsent?: boolean;
|
|
skipConsentInMeeting?: boolean;
|
|
consentLearnMoreLink?: string;
|
|
};
|
|
recordingService?: {
|
|
enabled?: boolean;
|
|
sharingEnabled?: boolean;
|
|
hideStorageWarning?: boolean;
|
|
};
|
|
localRecording?: {
|
|
disable?: boolean;
|
|
notifyAllParticipants?: boolean;
|
|
disableSelfRecording?: boolean;
|
|
};
|
|
|
|
// Live streaming configuration
|
|
liveStreaming?: {
|
|
enabled?: boolean;
|
|
termsLink?: string;
|
|
dataPrivacyLink?: string;
|
|
validatorRegExpString?: string;
|
|
helpLink?: string;
|
|
};
|
|
|
|
// Transcription configuration
|
|
transcription?: {
|
|
enabled?: boolean;
|
|
useAppLanguage?: boolean;
|
|
preferredLanguage?: string;
|
|
customLanguages?: Record<string, string>;
|
|
autoTranscribeOnRecord?: boolean;
|
|
autoCaptionOnTranscribe?: boolean;
|
|
disableClosedCaptions?: boolean;
|
|
};
|
|
|
|
// Toolbar configuration
|
|
toolbarButtons?: ToolbarButton[];
|
|
mainToolbarButtons?: ToolbarButton[][];
|
|
reducedUImainToolbarButtons?: ToolbarButton[];
|
|
reducedUIEnabled?: boolean;
|
|
buttonsWithNotifyClick?: (ToolbarButton | ButtonWithNotifyClick)[];
|
|
participantMenuButtonsWithNotifyClick?: (string | ButtonWithNotifyClick)[];
|
|
hiddenPremeetingButtons?: (
|
|
| 'microphone'
|
|
| 'camera'
|
|
| 'select-background'
|
|
| 'invite'
|
|
| 'settings'
|
|
)[];
|
|
customToolbarButtons?: Array<{
|
|
icon: string;
|
|
id: string;
|
|
text: string;
|
|
backgroundColor?: string;
|
|
}>;
|
|
customParticipantMenuButtons?: Array<{ icon: string; id: string; text: string }>;
|
|
toolbar?: {
|
|
initialTimeout?: number;
|
|
timeout?: number;
|
|
alwaysVisible?: boolean;
|
|
autoHideWhileChatIsOpen?: boolean;
|
|
};
|
|
|
|
// UI settings
|
|
enableClosePage?: boolean;
|
|
disableInviteFunctions?: boolean;
|
|
disableModeratorIndicator?: boolean;
|
|
enableInsecureRoomNameWarning?: boolean;
|
|
disableReactions?: boolean;
|
|
disableReactionsModeration?: boolean;
|
|
disableReactionsInChat?: boolean;
|
|
disablePolls?: boolean;
|
|
disableChat?: boolean;
|
|
disableSelfDemote?: boolean;
|
|
disableSelfView?: boolean;
|
|
disableSelfViewSettings?: boolean;
|
|
showChatPermissionsModeratorSetting?: boolean;
|
|
disableShortcuts?: boolean;
|
|
disableInitialGUM?: boolean;
|
|
disable1On1Mode?: boolean | null;
|
|
defaultLocalDisplayName?: string;
|
|
defaultRemoteDisplayName?: string;
|
|
hideDisplayName?: boolean;
|
|
hideDominantSpeakerBadge?: boolean;
|
|
defaultLanguage?: string;
|
|
disableProfile?: boolean;
|
|
hideEmailInSettings?: boolean;
|
|
requireDisplayName?: boolean;
|
|
readOnlyName?: boolean;
|
|
enableWebHIDFeature?: boolean;
|
|
doNotStoreRoom?: boolean;
|
|
disableLocalVideoFlip?: boolean;
|
|
doNotFlipLocalVideo?: boolean;
|
|
disableVirtualBackground?: boolean;
|
|
disableAddingBackgroundImages?: boolean;
|
|
backgroundAlpha?: number;
|
|
disableTileView?: boolean;
|
|
disableTileEnlargement?: boolean;
|
|
hideConferenceSubject?: boolean;
|
|
hideConferenceTimer?: boolean;
|
|
hideRecordingLabel?: boolean;
|
|
hideParticipantsStats?: boolean;
|
|
subject?: string;
|
|
localSubject?: string;
|
|
disableChatSmileys?: boolean;
|
|
disableFilmstripAutohiding?: boolean;
|
|
disableCameraTintForeground?: boolean;
|
|
|
|
// Filmstrip configuration
|
|
filmstrip?: {
|
|
disabled?: boolean;
|
|
disableResizable?: boolean;
|
|
disableStageFilmstrip?: boolean;
|
|
stageFilmstripParticipants?: number;
|
|
disableTopPanel?: boolean;
|
|
minParticipantCountForTopPanel?: number;
|
|
initialWidth?: number;
|
|
alwaysShowResizeBar?: boolean;
|
|
};
|
|
|
|
// Tile view configuration
|
|
tileView?: {
|
|
disabled?: boolean;
|
|
numberOfVisibleTiles?: number;
|
|
};
|
|
|
|
// Participants pane configuration
|
|
participantsPane?: {
|
|
enabled?: boolean;
|
|
hideModeratorSettingsTab?: boolean;
|
|
hideMoreActionsButton?: boolean;
|
|
hideMuteAllButton?: boolean;
|
|
};
|
|
|
|
// Breakout rooms configuration
|
|
breakoutRooms?: {
|
|
hideAddRoomButton?: boolean;
|
|
hideAutoAssignButton?: boolean;
|
|
hideJoinRoomButton?: boolean;
|
|
};
|
|
|
|
// Raised hands configuration
|
|
raisedHands?: {
|
|
disableLowerHandByModerator?: boolean;
|
|
disableLowerHandNotification?: boolean;
|
|
disableNextSpeakerNotification?: boolean;
|
|
disableRemoveRaisedHandOnFocus?: boolean;
|
|
};
|
|
disableRemoveRaisedHandOnFocus?: boolean;
|
|
|
|
// Speaker stats configuration
|
|
speakerStats?: {
|
|
disabled?: boolean;
|
|
disableSearch?: boolean;
|
|
order?: ('role' | 'name' | 'hasLeft')[];
|
|
};
|
|
|
|
// Connection indicators configuration
|
|
connectionIndicators?: {
|
|
autoHide?: boolean;
|
|
autoHideTimeout?: number;
|
|
disabled?: boolean;
|
|
disableDetails?: boolean;
|
|
inactiveDisabled?: boolean;
|
|
};
|
|
|
|
// Remote video menu configuration
|
|
remoteVideoMenu?: {
|
|
disabled?: boolean;
|
|
disableDemote?: boolean;
|
|
disableKick?: boolean;
|
|
disableGrantModerator?: boolean;
|
|
disablePrivateChat?: 'all' | 'allow-moderator-chat' | 'disable-visitor-chat';
|
|
};
|
|
disableRemoteMute?: boolean;
|
|
|
|
// Face landmarks configuration
|
|
faceLandmarks?: {
|
|
enableFaceCentering?: boolean;
|
|
enableFaceExpressionsDetection?: boolean;
|
|
enableDisplayFaceExpressions?: boolean;
|
|
enableRTCStats?: boolean;
|
|
faceCenteringThreshold?: number;
|
|
captureInterval?: number;
|
|
};
|
|
|
|
// Notification settings
|
|
notificationTimeouts?: {
|
|
short?: number;
|
|
medium?: number;
|
|
long?: number;
|
|
extraLong?: number;
|
|
sticky?: number;
|
|
};
|
|
notifications?: string[];
|
|
disabledNotifications?: string[];
|
|
|
|
// Conference info configuration
|
|
conferenceInfo?: {
|
|
alwaysVisible?: string[];
|
|
autoHide?: string[];
|
|
};
|
|
|
|
// Giphy configuration
|
|
giphy?: {
|
|
enabled?: boolean;
|
|
sdkKey?: string;
|
|
displayMode?: 'tile' | 'chat' | 'all';
|
|
tileTime?: number;
|
|
rating?: 'g' | 'pg' | 'pg-13' | 'r';
|
|
};
|
|
|
|
// Whiteboard configuration
|
|
whiteboard?: {
|
|
enabled?: boolean;
|
|
collabServerBaseUrl?: string;
|
|
userLimit?: number;
|
|
limitUrl?: string;
|
|
};
|
|
|
|
// E2EE configuration
|
|
e2ee?: {
|
|
labels?: {
|
|
description?: string;
|
|
label?: string;
|
|
tooltip?: string;
|
|
warning?: string;
|
|
};
|
|
externallyManagedKey?: boolean;
|
|
};
|
|
|
|
// Visitors configuration
|
|
visitors?: {
|
|
enableMediaOnPromote?: {
|
|
audio?: boolean;
|
|
video?: boolean;
|
|
};
|
|
hideVisitorCountForVisitors?: boolean;
|
|
showJoinMeetingDialog?: boolean;
|
|
};
|
|
|
|
// P2P configuration
|
|
p2p?: {
|
|
enabled?: boolean;
|
|
iceTransportPolicy?: 'all' | 'relay';
|
|
codecPreferenceOrder?: ('AV1' | 'VP9' | 'VP8' | 'H264')[];
|
|
mobileCodecPreferenceOrder?: ('AV1' | 'VP9' | 'VP8' | 'H264')[];
|
|
screenshareCodec?: string;
|
|
mobileScreenshareCodec?: string;
|
|
backToP2PDelay?: number;
|
|
stunServers?: Array<{ urls: string }>;
|
|
};
|
|
|
|
// Testing/experimental features
|
|
testing?: {
|
|
assumeBandwidth?: boolean;
|
|
enableAV1ForFF?: boolean;
|
|
enableCodecSelectionAPI?: boolean;
|
|
p2pTestMode?: boolean;
|
|
testMode?: boolean;
|
|
noAutoPlayVideo?: boolean;
|
|
skipInterimTranscriptions?: boolean;
|
|
dumpTranscript?: boolean;
|
|
debugAudioLevels?: boolean;
|
|
failICE?: boolean;
|
|
showSpotConsentDialog?: boolean;
|
|
};
|
|
|
|
// Analytics configuration
|
|
analytics?: {
|
|
disabled?: boolean;
|
|
rtcstatsEnabled?: boolean;
|
|
rtcstatsStoreLogs?: boolean;
|
|
rtcstatsEndpoint?: string;
|
|
rtcstatsPollInterval?: number;
|
|
rtcstatsSendSdp?: boolean;
|
|
watchRTCEnabled?: boolean;
|
|
};
|
|
|
|
// Gravatar configuration
|
|
gravatar?: {
|
|
baseUrl?: string;
|
|
disabled?: boolean;
|
|
};
|
|
|
|
// Legal URLs
|
|
legalUrls?: {
|
|
helpCentre?: string;
|
|
privacy?: string;
|
|
terms?: string;
|
|
};
|
|
|
|
// Other settings
|
|
apiLogLevels?: LogLevel[];
|
|
mouseMoveCallbackInterval?: number;
|
|
channelLastN?: number;
|
|
startLastN?: number;
|
|
useHostPageLocalStorage?: boolean;
|
|
disableRtx?: boolean;
|
|
enableTcc?: boolean;
|
|
enableRemb?: boolean;
|
|
enableForcedReload?: boolean;
|
|
useTurnUdp?: boolean;
|
|
enableEncodedTransformSupport?: boolean;
|
|
disableThirdPartyRequests?: boolean;
|
|
enableCalendarIntegration?: boolean;
|
|
notifyOnConferenceDestruction?: boolean;
|
|
feedbackPercentage?: number;
|
|
roomPasswordNumberOfDigits?: number | false;
|
|
noticeMessage?: string;
|
|
enableTalkWhileMuted?: boolean;
|
|
forceTurnRelay?: boolean;
|
|
hideLoginButton?: boolean;
|
|
disableWebrtcStats?: boolean;
|
|
disableShowMoreStats?: boolean;
|
|
etherpad_base?: string;
|
|
openSharedDocumentOnJoin?: boolean;
|
|
screenshotCapture?: {
|
|
enabled?: boolean;
|
|
mode?: 'recording' | 'always';
|
|
};
|
|
webrtcIceUdpDisable?: boolean;
|
|
webrtcIceTcpDisable?: boolean;
|
|
disableBeforeUnloadHandlers?: boolean;
|
|
|
|
// Logging configuration
|
|
logging?: {
|
|
defaultLogLevel?: 'trace' | 'debug' | 'info' | 'log' | 'warn' | 'error';
|
|
disableLogCollector?: boolean;
|
|
loggers?: Record<string, string>;
|
|
};
|
|
|
|
// File sharing configuration
|
|
fileSharing?: {
|
|
apiUrl?: string;
|
|
enabled?: boolean;
|
|
maxFileSize?: number;
|
|
};
|
|
|
|
// Dropbox integration
|
|
dropbox?: {
|
|
appKey?: string;
|
|
redirectURI?: string;
|
|
};
|
|
|
|
// Dynamic branding
|
|
dynamicBrandingUrl?: string;
|
|
|
|
// Shared video allowed domains
|
|
sharedVideoAllowedURLDomains?: string[];
|
|
|
|
// CORS avatar URLs
|
|
corsAvatarURLs?: string[];
|
|
|
|
// Recording limit
|
|
recordingLimit?: {
|
|
limit?: number;
|
|
appName?: string;
|
|
appURL?: string;
|
|
};
|
|
|
|
// Chrome extension banner
|
|
chromeExtensionBanner?: {
|
|
url?: string;
|
|
edgeUrl?: string;
|
|
chromeExtensionsInfo?: Array<{
|
|
id: string;
|
|
path: string;
|
|
}>;
|
|
};
|
|
|
|
// Allow any additional config options
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
/**
|
|
* @deprecated Most interfaceConfig options are being migrated to config.js.
|
|
* Use configOverwrite instead where possible.
|
|
*/
|
|
interface InterfaceConfigOverwrite {
|
|
/** @deprecated Use config.disableModeratorIndicator instead */
|
|
DISABLE_DOMINANT_SPEAKER_INDICATOR?: boolean;
|
|
TILE_VIEW_MAX_COLUMNS?: number;
|
|
SHOW_JITSI_WATERMARK?: boolean;
|
|
SHOW_WATERMARK_FOR_GUESTS?: boolean;
|
|
SHOW_BRAND_WATERMARK?: boolean;
|
|
SHOW_POWERED_BY?: boolean;
|
|
SHOW_PROMOTIONAL_CLOSE_PAGE?: boolean;
|
|
/** @deprecated Use config.toolbarButtons instead */
|
|
TOOLBAR_BUTTONS?: ToolbarButton[];
|
|
SETTINGS_SECTIONS?: SettingsSection[];
|
|
VIDEO_LAYOUT_FIT?: 'both' | 'width' | 'height';
|
|
VERTICAL_FILMSTRIP?: boolean;
|
|
FILM_STRIP_MAX_HEIGHT?: number;
|
|
MOBILE_APP_PROMO?: boolean;
|
|
HIDE_INVITE_MORE_HEADER?: boolean;
|
|
/** @deprecated Use config.disabledSounds instead */
|
|
DISABLE_JOIN_LEAVE_NOTIFICATIONS?: boolean;
|
|
DISABLE_VIDEO_BACKGROUND?: boolean;
|
|
DEFAULT_BACKGROUND?: string;
|
|
DEFAULT_WELCOME_PAGE_LOGO_URL?: string;
|
|
DEFAULT_LOGO_URL?: string;
|
|
JITSI_WATERMARK_LINK?: string;
|
|
BRAND_WATERMARK_LINK?: string;
|
|
APP_NAME?: string;
|
|
NATIVE_APP_NAME?: string;
|
|
PROVIDER_NAME?: string;
|
|
LANG_DETECTION?: boolean;
|
|
ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT?: number;
|
|
MAXIMUM_ZOOMING_COEFFICIENT?: number;
|
|
SUPPORT_URL?: string;
|
|
CONNECTION_INDICATOR_AUTO_HIDE_ENABLED?: boolean;
|
|
CONNECTION_INDICATOR_AUTO_HIDE_TIMEOUT?: number;
|
|
CONNECTION_INDICATOR_DISABLED?: boolean;
|
|
AUTO_PIN_LATEST_SCREEN_SHARE?: string;
|
|
DISABLE_FOCUS_INDICATOR?: boolean;
|
|
DISABLE_PRESENCE_STATUS?: boolean;
|
|
DISABLE_TRANSCRIPTION_SUBTITLES?: boolean;
|
|
DISABLE_RINGING?: boolean;
|
|
AUDIO_LEVEL_PRIMARY_COLOR?: string;
|
|
AUDIO_LEVEL_SECONDARY_COLOR?: string;
|
|
FILMSTRIP_MAX_HEIGHT?: number;
|
|
GENERATE_ROOMNAMES_ON_WELCOME_PAGE?: boolean;
|
|
HIDE_DEEP_LINKING_LOGO?: boolean;
|
|
INITIAL_TOOLBAR_TIMEOUT?: number;
|
|
TOOLBAR_TIMEOUT?: number;
|
|
TOOLBAR_ALWAYS_VISIBLE?: boolean;
|
|
LOCAL_THUMBNAIL_RATIO?: number;
|
|
REMOTE_THUMBNAIL_RATIO?: number;
|
|
LIVE_STREAMING_HELP_LINK?: string;
|
|
POLICY_LOGO?: string;
|
|
RECENT_LIST_ENABLED?: boolean;
|
|
SHOW_CHROME_EXTENSION_BANNER?: boolean;
|
|
VIDEO_QUALITY_LABEL_DISABLED?: boolean;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
interface DevicesConfig {
|
|
audioInput?: string;
|
|
audioOutput?: string;
|
|
videoInput?: string;
|
|
}
|
|
|
|
interface UserInfo {
|
|
email?: string;
|
|
displayName?: string;
|
|
}
|
|
|
|
interface IceServersConfig {
|
|
replace?: IceServerReplacement[];
|
|
}
|
|
|
|
interface IceServerReplacement {
|
|
targetType: 'turn' | 'turns' | 'stun';
|
|
urls: string | null;
|
|
}
|
|
|
|
// ============================================================================
|
|
// FUNCTION RETURN TYPES
|
|
// ============================================================================
|
|
|
|
interface CaptureCameraPictureResult {
|
|
dataURL?: string;
|
|
error?: string;
|
|
}
|
|
|
|
interface CaptureScreenshotResult {
|
|
dataURL: string;
|
|
}
|
|
|
|
interface DeviceInfo {
|
|
deviceId: string;
|
|
groupId: string;
|
|
kind: string;
|
|
label: string;
|
|
}
|
|
|
|
interface AvailableDevices {
|
|
audioInput: DeviceInfo[];
|
|
audioOutput: DeviceInfo[];
|
|
videoInput: DeviceInfo[];
|
|
}
|
|
|
|
interface CurrentDevices {
|
|
audioInput?: DeviceInfo;
|
|
audioOutput?: DeviceInfo;
|
|
videoInput?: DeviceInfo;
|
|
}
|
|
|
|
interface ContentSharingParticipants {
|
|
sharingParticipantIds: string[];
|
|
}
|
|
|
|
interface DeploymentInfo {
|
|
region?: string;
|
|
shard?: string;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
interface LivestreamData {
|
|
livestreamUrl: string;
|
|
}
|
|
|
|
interface ParticipantInfo {
|
|
participantId: string;
|
|
displayName: string;
|
|
avatarURL?: string;
|
|
email?: string;
|
|
}
|
|
|
|
interface RoomParticipant {
|
|
id: string;
|
|
jid: string;
|
|
role: string;
|
|
displayName: string;
|
|
avatarUrl?: string;
|
|
}
|
|
|
|
interface RoomInfo {
|
|
isMainRoom: boolean;
|
|
id: string;
|
|
jid: string;
|
|
participants: RoomParticipant[];
|
|
}
|
|
|
|
interface RoomsInfo {
|
|
rooms: RoomInfo[];
|
|
}
|
|
|
|
interface BreakoutRoom {
|
|
id: string;
|
|
jid: string;
|
|
name: string;
|
|
isMainRoom?: boolean;
|
|
participants: Record<string, BreakoutRoomParticipant>;
|
|
}
|
|
|
|
interface BreakoutRoomParticipant {
|
|
displayName: string;
|
|
jid: string;
|
|
role: string;
|
|
}
|
|
|
|
type BreakoutRoomsMap = Record<string, BreakoutRoom>;
|
|
|
|
// ============================================================================
|
|
// COMMAND TYPES
|
|
// ============================================================================
|
|
|
|
interface SendTonesOptions {
|
|
/** The dial pad touch tones to play. For example, '12345#'. */
|
|
tones: string;
|
|
/** The number of milliseconds each tone should play. Default is 200. */
|
|
duration?: number;
|
|
/** The number of milliseconds between each tone. Default is 200. */
|
|
pause?: number;
|
|
}
|
|
|
|
interface NoiseSuppressionOptions {
|
|
/** Enable or disable noise suppression. */
|
|
enabled: boolean;
|
|
}
|
|
|
|
interface RecordingOptions {
|
|
/** Recording mode: 'local', 'file', or 'stream'. */
|
|
mode: RecordingMode;
|
|
/** Dropbox OAuth2 token. */
|
|
dropboxToken?: string;
|
|
/** Whether to only record the local streams. Only applies to 'local' mode. */
|
|
onlySelf?: boolean;
|
|
/** Whether the recording should be shared with the participants. */
|
|
shouldShare?: boolean;
|
|
/** The RTMP stream key. */
|
|
rtmpStreamKey?: string;
|
|
/** The RTMP broadcast ID. */
|
|
rtmpBroadcastID?: string;
|
|
/** The YouTube stream key. */
|
|
youtubeStreamKey?: string;
|
|
/** The YouTube broadcast ID. */
|
|
youtubeBroadcastID?: string;
|
|
/** Any extra metadata for file recording. */
|
|
extraMetadata?: Record<string, unknown>;
|
|
/** Whether a transcription should be started. */
|
|
transcription?: boolean;
|
|
}
|
|
|
|
interface ResizeFilmStripOptions {
|
|
/** The desired filmstrip width. */
|
|
width: number;
|
|
}
|
|
|
|
interface OverwriteNameEntry {
|
|
/** The ID of the participant. */
|
|
id: string;
|
|
/** The new name. */
|
|
name: string;
|
|
}
|
|
|
|
interface CustomNotificationAction {
|
|
/** The label for the action button. */
|
|
label: string;
|
|
/** The unique identifier for the action. */
|
|
uuid: string;
|
|
}
|
|
|
|
interface ShowNotificationOptions {
|
|
/** Title of the notification. */
|
|
title: string;
|
|
/** Content of the notification. */
|
|
description: string;
|
|
/** Custom actions to be displayed on the notification. */
|
|
customActions?: CustomNotificationAction[];
|
|
/** Unique identifier for the notification. */
|
|
uid?: string;
|
|
/** Notification type. */
|
|
type?: NotificationType;
|
|
/** Notification timeout. */
|
|
timeout?: NotificationTimeout;
|
|
}
|
|
|
|
interface ExecuteCommands {
|
|
displayName?: [string];
|
|
password?: [string];
|
|
toggleLobby?: [boolean];
|
|
sendTones?: [SendTonesOptions];
|
|
startShareVideo?: [string];
|
|
stopShareVideo?: [];
|
|
subject?: [string];
|
|
localSubject?: [string];
|
|
toggleAudio?: [];
|
|
toggleVideo?: [];
|
|
toggleFilmStrip?: [];
|
|
toggleChat?: [];
|
|
toggleRaiseHand?: [];
|
|
toggleShareScreen?: [];
|
|
setNoiseSuppressionEnabled?: [NoiseSuppressionOptions];
|
|
toggleSubtitles?: [];
|
|
toggleTileView?: [];
|
|
hangup?: [];
|
|
endConference?: [];
|
|
email?: [string];
|
|
sendCameraFacingMode?: [string, CameraFacingMode?];
|
|
sendEndpointTextMessage?: [string, string];
|
|
setLargeVideoParticipant?: [string?, VideoType?];
|
|
setVideoQuality?: [number];
|
|
muteEveryone?: [MediaType?];
|
|
muteRemoteParticipant?: [string, MediaType?];
|
|
startRecording?: [RecordingOptions];
|
|
stopRecording?: [RecordingMode, boolean?];
|
|
initiatePrivateChat?: [string];
|
|
cancelPrivateChat?: [];
|
|
kickParticipant?: [string];
|
|
grantModerator?: [string];
|
|
overwriteConfig?: [Record<string, unknown>];
|
|
sendChatMessage?: [string, string?, boolean?];
|
|
setFollowMe?: [boolean, boolean?];
|
|
setSubtitles?: [boolean, boolean?, string?];
|
|
setTileView?: [boolean];
|
|
answerKnockingParticipant?: [string, boolean];
|
|
toggleCamera?: [CameraFacingMode?];
|
|
toggleCameraMirror?: [];
|
|
toggleVirtualBackgroundDialog?: [];
|
|
pinParticipant?: [string?];
|
|
setParticipantVolume?: [string, number];
|
|
toggleParticipantsPane?: [boolean];
|
|
toggleModeration?: [boolean, MediaType?];
|
|
askToUnmute?: [string];
|
|
approveVideo?: [string];
|
|
rejectParticipant?: [string, MediaType?];
|
|
addBreakoutRoom?: [string?];
|
|
autoAssignToBreakoutRooms?: [];
|
|
closeBreakoutRoom?: [string];
|
|
joinBreakoutRoom?: [string?];
|
|
removeBreakoutRoom?: [string];
|
|
resizeFilmStrip?: [ResizeFilmStripOptions];
|
|
resizeLargeVideo?: [number, number];
|
|
sendParticipantToRoom?: [string, string];
|
|
overwriteNames?: [OverwriteNameEntry[]];
|
|
showNotification?: [ShowNotificationOptions];
|
|
hideNotification?: [string];
|
|
toggleWhiteboard?: [];
|
|
setAssumedBandwidthBps?: [number];
|
|
setBlurredBackground?: [BlurType];
|
|
setAudioOnly?: [boolean];
|
|
setVirtualBackground?: [boolean, string];
|
|
[key: string]: unknown[] | undefined;
|
|
}
|
|
|
|
// ============================================================================
|
|
// EVENT TYPES
|
|
// ============================================================================
|
|
|
|
interface JitsiMeetEventMap {
|
|
cameraError: CameraErrorEvent;
|
|
micError: MicErrorEvent;
|
|
avatarChanged: AvatarChangedEvent;
|
|
audioAvailabilityChanged: AudioAvailabilityChangedEvent;
|
|
audioMuteStatusChanged: AudioMuteStatusChangedEvent;
|
|
breakoutRoomsUpdated: BreakoutRoomsUpdatedEvent;
|
|
browserSupport: BrowserSupportEvent;
|
|
contentSharingParticipantsChanged: ContentSharingParticipantsChangedEvent;
|
|
customNotificationActionTriggered: CustomNotificationActionTriggeredEvent;
|
|
dataChannelOpened: DataChannelOpenedEvent;
|
|
endpointTextMessageReceived: EndpointTextMessageReceivedEvent;
|
|
nonParticipantMessageReceived: NonParticipantMessageReceivedEvent;
|
|
faceLandmarkDetected: FaceLandmarkDetectedEvent;
|
|
errorOccurred: ErrorOccurredEvent;
|
|
knockingParticipant: KnockingParticipantEvent;
|
|
largeVideoChanged: LargeVideoChangedEvent;
|
|
log: LogEvent;
|
|
screenSharingStatusChanged: ScreenSharingStatusChangedEvent;
|
|
dominantSpeakerChanged: DominantSpeakerChangedEvent;
|
|
raiseHandUpdated: RaiseHandUpdatedEvent;
|
|
tileViewChanged: TileViewChangedEvent;
|
|
chatUpdated: ChatUpdatedEvent;
|
|
incomingMessage: IncomingMessageEvent;
|
|
mouseEnter: MouseEventData;
|
|
mouseLeave: MouseEventData;
|
|
mouseMove: MouseEventData;
|
|
participantMenuButtonClick: ParticipantMenuButtonClickEvent;
|
|
toolbarButtonClicked: ToolbarButtonClickedEvent;
|
|
outgoingMessage: OutgoingMessageEvent;
|
|
displayNameChange: DisplayNameChangeEvent;
|
|
deviceListChanged: DeviceListChangedEvent;
|
|
emailChange: EmailChangeEvent;
|
|
feedbackSubmitted: FeedbackSubmittedEvent;
|
|
filmstripDisplayChanged: FilmstripDisplayChangedEvent;
|
|
toolbarVisibilityChanged: ToolbarVisibilityChangedEvent;
|
|
moderationStatusChanged: ModerationStatusChangedEvent;
|
|
moderationParticipantApproved: ModerationParticipantApprovedEvent;
|
|
moderationParticipantRejected: ModerationParticipantRejectedEvent;
|
|
notificationTriggered: NotificationTriggeredEvent;
|
|
participantJoined: ParticipantJoinedEvent;
|
|
participantKickedOut: ParticipantKickedOutEvent;
|
|
participantLeft: ParticipantLeftEvent;
|
|
participantRoleChanged: ParticipantRoleChangedEvent;
|
|
participantsPaneToggled: ParticipantsPaneToggledEvent;
|
|
passwordRequired: PasswordRequiredEvent;
|
|
videoConferenceJoined: VideoConferenceJoinedEvent;
|
|
videoConferenceLeft: VideoConferenceLeftEvent;
|
|
conferenceCreatedTimestamp: ConferenceCreatedTimestampEvent;
|
|
videoAvailabilityChanged: VideoAvailabilityChangedEvent;
|
|
videoMuteStatusChanged: VideoMuteStatusChangedEvent;
|
|
videoQualityChanged: VideoQualityChangedEvent;
|
|
readyToClose: ReadyToCloseEvent;
|
|
recordingLinkAvailable: RecordingLinkAvailableEvent;
|
|
recordingStatusChanged: RecordingStatusChangedEvent;
|
|
subjectChange: SubjectChangeEvent;
|
|
suspendDetected: SuspendDetectedEvent;
|
|
peerConnectionFailure: PeerConnectionFailureEvent;
|
|
transcribingStatusChanged: TranscribingStatusChangedEvent;
|
|
transcriptionChunkReceived: TranscriptionChunkReceivedEvent;
|
|
whiteboardStatusChanged: WhiteboardStatusChangedEvent;
|
|
p2pStatusChanged: P2pStatusChangedEvent;
|
|
audioOnlyChanged: AudioOnlyChangedEvent;
|
|
}
|
|
|
|
interface CameraErrorEvent {
|
|
/** A constant representing the overall type of the error. */
|
|
type: string;
|
|
/** Additional information about the error. */
|
|
message: string;
|
|
}
|
|
|
|
interface MicErrorEvent {
|
|
/** A constant representing the overall type of the error. */
|
|
type: string;
|
|
/** Additional information about the error. */
|
|
message: string;
|
|
}
|
|
|
|
interface AvatarChangedEvent {
|
|
/** The ID of the participant that changed their avatar. */
|
|
id: string;
|
|
/** The new avatar URL. */
|
|
avatarURL: string;
|
|
}
|
|
|
|
interface AudioAvailabilityChangedEvent {
|
|
/** New available status. */
|
|
available: boolean;
|
|
}
|
|
|
|
interface AudioMuteStatusChangedEvent {
|
|
/** New muted status. */
|
|
muted: boolean;
|
|
}
|
|
|
|
interface BreakoutRoomsUpdatedEvent {
|
|
[roomId: string]: {
|
|
id: string;
|
|
jid: string;
|
|
name: string;
|
|
isMainRoom?: true;
|
|
participants: {
|
|
[participantJid: string]: {
|
|
displayName: string;
|
|
jid: string;
|
|
role: string;
|
|
};
|
|
};
|
|
};
|
|
}
|
|
|
|
interface BrowserSupportEvent {
|
|
supported: boolean;
|
|
}
|
|
|
|
interface ContentSharingParticipantsChangedEvent {
|
|
data: string[];
|
|
}
|
|
|
|
interface CustomNotificationActionTriggeredEvent {
|
|
data: {
|
|
/** UUID of the triggered action. */
|
|
id: string;
|
|
};
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
interface DataChannelOpenedEvent {}
|
|
|
|
interface EndpointTextMessageReceivedEvent {
|
|
senderInfo: {
|
|
/** The JID of the sender. */
|
|
jid: string;
|
|
/** The participant ID of the sender. */
|
|
id: string;
|
|
};
|
|
eventData: {
|
|
/** The name of the datachannel event. */
|
|
name: string;
|
|
/** The received text from the sender. */
|
|
text: string;
|
|
};
|
|
}
|
|
|
|
interface NonParticipantMessageReceivedEvent {
|
|
/** The ID of the message, may be null. */
|
|
id: string | null;
|
|
/** The message received. */
|
|
message: string;
|
|
}
|
|
|
|
interface FaceLandmarkDetectedEvent {
|
|
faceBox?: {
|
|
/** Face bounding box distance as percentage from the left video edge. */
|
|
left: number;
|
|
/** Face bounding box distance as percentage from the right video edge. */
|
|
right: number;
|
|
/** Face bounding box width as percentage of the total video width. */
|
|
width: number;
|
|
};
|
|
/** Face expression detected. */
|
|
faceExpression: string;
|
|
}
|
|
|
|
interface ErrorOccurredEvent {
|
|
error: {
|
|
/** Additional error details. */
|
|
details?: Record<string, unknown>;
|
|
/** The error message. */
|
|
message?: string;
|
|
/** The coded name of the error. */
|
|
name: string;
|
|
/** Error type/source: 'CONFIG', 'CONNECTION', 'CONFERENCE'. */
|
|
type: ErrorType;
|
|
/** Whether this is a fatal error which triggered a reconnect overlay. */
|
|
isFatal: boolean;
|
|
};
|
|
}
|
|
|
|
interface KnockingParticipantEvent {
|
|
participant: {
|
|
/** The ID of the participant knocking. */
|
|
id: string;
|
|
/** The name of the participant knocking. */
|
|
name: string;
|
|
};
|
|
}
|
|
|
|
interface LargeVideoChangedEvent {
|
|
/** ID of the participant that is now on large video. */
|
|
id: string;
|
|
}
|
|
|
|
interface LogEvent {
|
|
/** A constant representing the log type. */
|
|
logLevel: LogLevel;
|
|
/** Additional log information. */
|
|
args: string;
|
|
}
|
|
|
|
interface ScreenSharingStatusChangedEvent {
|
|
/** Whether screen sharing is on. */
|
|
on: boolean;
|
|
details: {
|
|
/** Source type: 'window', 'screen', 'proxy', 'device', or undefined. */
|
|
sourceType?: ScreenShareSourceType;
|
|
};
|
|
}
|
|
|
|
interface DominantSpeakerChangedEvent {
|
|
/** Participant ID of the new dominant speaker. */
|
|
id: string;
|
|
}
|
|
|
|
interface RaiseHandUpdatedEvent {
|
|
/** Participant ID of the user who raises/lowers the hand. */
|
|
id: string;
|
|
/** 0 when hand is lowered, timestamp when raised. */
|
|
handRaised: number;
|
|
}
|
|
|
|
interface TileViewChangedEvent {
|
|
/** Whether tile view is displayed or not. */
|
|
enabled: boolean;
|
|
}
|
|
|
|
interface ChatUpdatedEvent {
|
|
/** Whether the chat panel is open or not. */
|
|
isOpen: boolean;
|
|
/** The unread messages counter. */
|
|
unreadCount: number;
|
|
}
|
|
|
|
interface IncomingMessageEvent {
|
|
/** The ID of the user that sent the message. */
|
|
from: string;
|
|
/** The nickname of the user that sent the message. */
|
|
nick: string;
|
|
/** Whether this is a private or group message. */
|
|
privateMessage: boolean;
|
|
/** The text of the message. */
|
|
message: string;
|
|
/** The message timestamp as string (ISO-8601). */
|
|
stamp: string;
|
|
}
|
|
|
|
interface MouseEventData {
|
|
event: {
|
|
clientX: number;
|
|
clientY: number;
|
|
movementX: number;
|
|
movementY: number;
|
|
offsetX: number;
|
|
offsetY: number;
|
|
pageX: number;
|
|
pageY: number;
|
|
x: number;
|
|
y: number;
|
|
screenX: number;
|
|
screenY: number;
|
|
};
|
|
}
|
|
|
|
interface ParticipantMenuButtonClickEvent {
|
|
/** The pressed button's key. */
|
|
key: string;
|
|
/** The ID of the participant for which the button was clicked. */
|
|
participantId: string;
|
|
/** Whether the execution of the button click was prevented. */
|
|
preventExecution: boolean;
|
|
}
|
|
|
|
interface ToolbarButtonClickedEvent {
|
|
/** The pressed button's key. */
|
|
key: string;
|
|
/** Whether the click routine execution was prevented. */
|
|
preventExecution: boolean;
|
|
}
|
|
|
|
interface OutgoingMessageEvent {
|
|
/** The text of the message. */
|
|
message: string;
|
|
/** Whether this is a private or group message. */
|
|
privateMessage: boolean;
|
|
}
|
|
|
|
interface DisplayNameChangeEvent {
|
|
/** The ID of the participant that changed their display name. */
|
|
id: string;
|
|
/** The new display name. */
|
|
displayname: string;
|
|
}
|
|
|
|
interface DeviceListChangedEvent {
|
|
/** The new list of available devices. */
|
|
devices: AvailableDevices;
|
|
}
|
|
|
|
interface EmailChangeEvent {
|
|
/** The ID of the participant that changed their email. */
|
|
id: string;
|
|
/** The new email. */
|
|
email: string;
|
|
}
|
|
|
|
interface FeedbackSubmittedEvent {
|
|
/** The error which occurred during submission, if any. */
|
|
error?: string;
|
|
}
|
|
|
|
interface FilmstripDisplayChangedEvent {
|
|
/** Whether the filmstrip is displayed or hidden. */
|
|
visible: boolean;
|
|
}
|
|
|
|
interface ToolbarVisibilityChangedEvent {
|
|
/** Whether the toolbar is currently visible. */
|
|
visible: boolean;
|
|
}
|
|
|
|
interface ModerationStatusChangedEvent {
|
|
/** The media type for which moderation changed. */
|
|
mediaType: MediaType;
|
|
/** Whether moderation is enabled. */
|
|
enabled: boolean;
|
|
}
|
|
|
|
interface ModerationParticipantApprovedEvent {
|
|
/** The ID of the participant that got approved. */
|
|
id: string;
|
|
/** The media type for which the participant was approved. */
|
|
mediaType: MediaType;
|
|
}
|
|
|
|
interface ModerationParticipantRejectedEvent {
|
|
/** The ID of the participant that got rejected. */
|
|
id: string;
|
|
/** The media type for which the participant was rejected. */
|
|
mediaType: MediaType;
|
|
}
|
|
|
|
interface NotificationTriggeredEvent {
|
|
/** The notification title. */
|
|
title: string;
|
|
/** The notification description. */
|
|
description: string;
|
|
}
|
|
|
|
interface ParticipantJoinedEvent {
|
|
/** The ID of the participant. */
|
|
id: string;
|
|
/** The display name of the participant. */
|
|
displayName: string;
|
|
}
|
|
|
|
interface ParticipantKickedOutEvent {
|
|
kicked: {
|
|
/** The ID of the participant removed from the room. */
|
|
id: string;
|
|
/** Whether the participant is the local participant. */
|
|
local: boolean;
|
|
};
|
|
kicker: {
|
|
/** The ID of the participant who kicked out the other participant. */
|
|
id: string;
|
|
};
|
|
}
|
|
|
|
interface ParticipantLeftEvent {
|
|
/** The ID of the participant. */
|
|
id: string;
|
|
}
|
|
|
|
interface ParticipantRoleChangedEvent {
|
|
/** The ID of the participant. */
|
|
id: string;
|
|
/** The new role of the participant. */
|
|
role: ParticipantRole;
|
|
}
|
|
|
|
interface ParticipantsPaneToggledEvent {
|
|
/** Whether the pane is open or not. */
|
|
open: boolean;
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
interface PasswordRequiredEvent {}
|
|
|
|
interface VideoConferenceJoinedEvent {
|
|
/** The room name of the conference. */
|
|
roomName: string;
|
|
/** The ID of the local participant. */
|
|
id: string;
|
|
/** The display name of the local participant. */
|
|
displayName: string;
|
|
/** The avatar URL of the local participant. */
|
|
avatarURL: string;
|
|
/** Whether the current room is a breakout room. */
|
|
breakoutRoom: boolean;
|
|
/** Whether the current user is a visitor. */
|
|
visitor: boolean;
|
|
}
|
|
|
|
interface VideoConferenceLeftEvent {
|
|
/** The room name of the conference. */
|
|
roomName: string;
|
|
}
|
|
|
|
interface ConferenceCreatedTimestampEvent {
|
|
/** Time the conference started. */
|
|
timestamp: number;
|
|
}
|
|
|
|
interface VideoAvailabilityChangedEvent {
|
|
/** New available status. */
|
|
available: boolean;
|
|
}
|
|
|
|
interface VideoMuteStatusChangedEvent {
|
|
/** New muted status. */
|
|
muted: boolean;
|
|
}
|
|
|
|
interface VideoQualityChangedEvent {
|
|
/** The height of the resolution related to the new video quality setting. */
|
|
videoQuality: number;
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
interface ReadyToCloseEvent {}
|
|
|
|
interface RecordingLinkAvailableEvent {
|
|
/** The recording link. */
|
|
link: string;
|
|
/** The time to live of the recording link. */
|
|
ttl: number;
|
|
}
|
|
|
|
interface RecordingStatusChangedEvent {
|
|
/** New recording status. */
|
|
on: boolean;
|
|
/** Recording mode: 'local', 'stream', or 'file'. */
|
|
mode: RecordingMode;
|
|
/** Error type if recording fails. */
|
|
error?: string;
|
|
/** Whether a transcription is active. */
|
|
transcription: boolean;
|
|
}
|
|
|
|
interface SubjectChangeEvent {
|
|
/** The new subject. */
|
|
subject: string;
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
interface SuspendDetectedEvent {}
|
|
|
|
interface PeerConnectionFailureEvent {
|
|
/** Type of PC, Peer2Peer or JVB connection. */
|
|
isP2P: boolean;
|
|
/** Was this connection previously connected. */
|
|
wasConnected: boolean;
|
|
}
|
|
|
|
interface TranscribingStatusChangedEvent {
|
|
on: boolean;
|
|
}
|
|
|
|
interface TranscriptionChunkReceivedEvent {
|
|
/** Transcription language. */
|
|
language: string;
|
|
/** ID for this chunk. */
|
|
messageID: string;
|
|
/** Participant info. */
|
|
participant: {
|
|
avatarUrl: string;
|
|
id: string;
|
|
name: string;
|
|
};
|
|
/** Final transcription text. */
|
|
final?: string;
|
|
/** High accuracy transcription text. */
|
|
stable?: string;
|
|
/** Low accuracy transcription text. */
|
|
unstable?: string;
|
|
}
|
|
|
|
interface WhiteboardStatusChangedEvent {
|
|
/** New whiteboard status. */
|
|
status: string;
|
|
}
|
|
|
|
interface P2pStatusChangedEvent {
|
|
/** Whether the new connection type is P2P. */
|
|
isP2p: boolean | null;
|
|
}
|
|
|
|
interface AudioOnlyChangedEvent {
|
|
/** Whether audio only is enabled or disabled. */
|
|
audioOnlyChanged: boolean;
|
|
}
|
|
|
|
// ============================================================================
|
|
// INVITEE TYPES
|
|
// ============================================================================
|
|
|
|
interface PhoneInvitee {
|
|
type: 'phone';
|
|
/** The phone number in E.164 format (e.g., +31201234567). */
|
|
number: string;
|
|
}
|
|
|
|
interface SipInvitee {
|
|
type: 'sip';
|
|
/** The SIP address. */
|
|
address: string;
|
|
}
|
|
|
|
type Invitee = PhoneInvitee | SipInvitee | Record<string, unknown>;
|
|
|
|
// ============================================================================
|
|
// UTILITY TYPES
|
|
// ============================================================================
|
|
|
|
type CameraFacingMode = 'user' | 'environment';
|
|
type DeviceType = 'input' | 'output';
|
|
type VideoType = 'camera' | 'desktop';
|
|
type MediaType = 'audio' | 'video';
|
|
type RecordingMode = 'local' | 'file' | 'stream';
|
|
type NotificationType = 'normal' | 'success' | 'warning' | 'error';
|
|
type NotificationTimeout = 'short' | 'medium' | 'long' | 'sticky';
|
|
type BlurType = 'slight-blur' | 'blur' | 'none';
|
|
type ErrorType = 'CONFIG' | 'CONNECTION' | 'CONFERENCE';
|
|
type LogLevel = 'info' | 'error' | 'debug' | 'warn';
|
|
type ScreenShareSourceType = 'window' | 'screen' | 'proxy' | 'device';
|
|
type ParticipantRole = 'none' | 'moderator' | 'participant';
|
|
|
|
type ToolbarButton =
|
|
| 'camera'
|
|
| 'chat'
|
|
| 'closedcaptions'
|
|
| 'desktop'
|
|
| 'dock-iframe'
|
|
| 'download'
|
|
| 'embedmeeting'
|
|
| 'end-meeting'
|
|
| 'etherpad'
|
|
| 'feedback'
|
|
| 'filmstrip'
|
|
| 'fullscreen'
|
|
| 'hangup'
|
|
| 'hangup-menu'
|
|
| 'help'
|
|
| 'highlight'
|
|
| 'invite'
|
|
| 'linktosalesforce'
|
|
| 'livestreaming'
|
|
| 'microphone'
|
|
| 'mute-everyone'
|
|
| 'mute-video-everyone'
|
|
| 'noisesuppression'
|
|
| 'participants-pane'
|
|
| 'profile'
|
|
| 'raisehand'
|
|
| 'reactions'
|
|
| 'recording'
|
|
| 'security'
|
|
| 'select-background'
|
|
| 'settings'
|
|
| 'shareaudio'
|
|
| 'sharedvideo'
|
|
| 'shortcuts'
|
|
| 'stats'
|
|
| 'tileview'
|
|
| 'toggle-camera'
|
|
| 'undock-iframe'
|
|
| 'videoquality'
|
|
| 'whiteboard'
|
|
| '__end';
|
|
|
|
interface ButtonWithNotifyClick {
|
|
key: ToolbarButton;
|
|
preventExecution: boolean;
|
|
}
|
|
|
|
type SettingsSection =
|
|
| 'devices'
|
|
| 'language'
|
|
| 'moderator'
|
|
| 'profile'
|
|
| 'calendar'
|
|
| 'sounds'
|
|
| 'more';
|
|
|
|
// ============================================================================
|
|
// GLOBAL DECLARATION
|
|
// ============================================================================
|
|
|
|
declare global {
|
|
interface Window {
|
|
JitsiMeetExternalAPI: typeof JitsiMeetExternalAPI;
|
|
}
|
|
|
|
const JitsiMeetExternalAPI: typeof import('@jitsi/iframe-api');
|
|
}
|
|
|
|
// export = JitsiMeetExternalAPI;
|
|
export as namespace JitsiMeetExternalAPI;
|