项目文件夹

文件
2026-07-13 12:20:06 +08:00

13 KiB

Events Reference

Complete reference for all events in the Zoom Video SDK for Web.

Event Registration

// Register
client.on('event-name', (payload) => { /* handle */ });

// Unregister
client.off('event-name', handler);

Session Events

connection-change

Fired when connection state changes.

client.on('connection-change', (payload: {
  state: 'Connected' | 'Connecting' | 'Reconnecting' | 'Closed' | 'Fail';
  reason?: string;
}) => {});
State Description
Connected Successfully connected to session
Connecting Attempting to connect
Reconnecting Lost connection, attempting reconnect
Closed Disconnected from session
Fail Connection failed

Participant Events

user-added

Fired when participant(s) join the session.

client.on('user-added', (payload: Participant[]) => {});

interface Participant {
  userId: number;
  displayName: string;
  avatar?: string;
  isHost: boolean;
  isManager: boolean;
  bVideoOn: boolean;
  muted: boolean;
  // ... more properties
}

user-removed

Fired when participant(s) leave the session.

client.on('user-removed', (payload: Participant[]) => {});

user-updated

Fired when participant properties change (name, mute, video, etc.).

client.on('user-updated', (payload: Participant[]) => {});

Video Events

peer-video-state-change

Fired when a remote participant starts or stops video.

client.on('peer-video-state-change', (payload: {
  action: 'Start' | 'Stop';
  userId: number;
}) => {});

Critical: Use this to render/remove remote videos.

video-capturing-change

Fired when local video capture state changes.

client.on('video-capturing-change', (payload: {
  state: 'Started' | 'Stopped' | 'Failed';
}) => {});

video-active-change

Fired when video becomes active/inactive.

client.on('video-active-change', (payload: {
  state: VideoActiveState;
  userId: number;
}) => {});

video-dimension-change

Fired when received video dimensions change.

client.on('video-dimension-change', (payload: {
  width: number;
  height: number;
  type: 'received';
}) => {});

video-detailed-data-change

Fired when video quality details change.

client.on('video-detailed-data-change', (payload: {
  userId: number;
  width?: number;
  height?: number;
  fps?: number;
  quality?: VideoQuality;
}) => {});

video-spotlight-change

Fired when spotlight list changes.

client.on('video-spotlight-change', (payload: {
  spotlightList: { userId: number }[];
}) => {});

Audio Events

current-audio-change

Fired when local audio state changes.

client.on('current-audio-change', (payload: {
  action: 'join' | 'leave' | 'muted' | 'unmuted';
  type?: 'computer' | 'phone';
  source?: MutedSource | LeaveAudioSource;
}) => {});
Action Description
join Joined audio (computer or phone)
leave Left audio
muted Audio muted
unmuted Audio unmuted
Source Description
active User action
passive(mute all) Host muted all
passive(mute one) Host muted you
passive Host unmuted you

host-ask-unmute-audio

Fired when host asks you to unmute.

client.on('host-ask-unmute-audio', (payload: {
  reason: 'Unmute' | 'Spotlight' | 'Allow to talk';
}) => {});

active-speaker

Fired when active speakers change.

client.on('active-speaker', (payload: {
  userId: number;
  displayName: string;
}[]) => {});

Array is sorted by volume (loudest first).

auto-play-audio-failed

Fired when browser blocks audio autoplay.

client.on('auto-play-audio-failed', () => {});

current-audio-level-change

Fired when local audio level changes.

client.on('current-audio-level-change', (payload: {
  level: number;
}) => {});

speaking-while-muted

Fired when speaking while muted is detected.

client.on('speaking-while-muted', () => {});

Screen Share Events

active-share-change

Fired when someone starts/stops sharing.

client.on('active-share-change', (payload: {
  state: 'Active' | 'Inactive';
  userId: number;
}) => {});

peer-share-state-change

Fired when peer share state changes.

client.on('peer-share-state-change', (payload: {
  action: 'Start' | 'Stop';
  userId: number;
}) => {});

passively-stop-share

Fired when you're forced to stop sharing.

client.on('passively-stop-share', (payload: PassiveStopShareReason) => {});

// Reasons: 'PrivilegeChange', 'AnotherShareStarted', etc.

share-content-change

Fired when sharer switches windows/tabs.

client.on('share-content-change', (payload: {
  userId: number;
}) => {});

share-content-dimension-change

Fired when share dimensions change.

client.on('share-content-dimension-change', (payload: {
  width: number;
  height: number;
  type: 'received' | 'sended';
}) => {});

share-privilege-change

Fired when share privilege changes.

client.on('share-privilege-change', (payload: {
  privilege: SharePrivilege;
}) => {});

share-audio-change

Fired when share audio state changes.

client.on('share-audio-change', (payload: {
  state: 'on' | 'off';
}) => {});

Chat Events

chat-on-message

Fired when a chat message is received.

client.on('chat-on-message', (payload: {
  id: string;
  message: string;
  sender: { userId: number; name: string; avatar?: string };
  receiver: { userId: number; name: string } | 'everyone';
  timestamp: number;
  isPrivate: boolean;
}) => {});

chat-privilege-change

Fired when chat privilege changes.

client.on('chat-privilege-change', (payload: {
  chatPrivilege: ChatPrivilege;
}) => {});

chat-file-upload-progress

Fired during file upload.

client.on('chat-file-upload-progress', (payload: {
  fileName: string;
  fileSize: number;
  progress: number;
  status: ChatFileUploadStatus;
  receiverId: number;
  retryToken?: string;
}) => {});

chat-file-download-progress

Fired during file download.

client.on('chat-file-download-progress', (payload: {
  fileName: string;
  fileSize: number;
  progress: number;
  status: ChatFileDownloadStatus;
  fileUrl: string;
  fileBlob?: Blob;
  senderId: number;
}) => {});

Recording Events

recording-change

Fired when cloud recording state changes.

client.on('recording-change', (payload: {
  state: RecordingStatus;
}) => {});
Status Description
Recording Recording in progress
Paused Recording paused
Stopped Recording stopped

individual-recording-change

Fired for individual recording consent.

client.on('individual-recording-change', (payload: {
  state: RecordingStatus | 'Ask' | 'Accept' | 'Decline';
  userId?: number;
}) => {});

Live Transcription Events

caption-message

Fired when transcription text is received.

client.on('caption-message', (payload: {
  msgId: string;
  text: string;
  userId: number;
  displayName: string;
  source: 'caption' | 'translation';
  language: string;
  done: boolean;  // true = final, false = interim
  timestamp: number;
}) => {});

caption-status

Fired when caption status changes.

client.on('caption-status', (payload: {
  autoCaption: boolean;
  language?: string;
  lang?: number;
  sessionLanguage?: string;
  translationStarted?: boolean;
}) => {});

caption-enable

Fired when captions are enabled/disabled.

client.on('caption-enable', (isEnabled: boolean) => {});

caption-language-lock

Fired when language is locked/unlocked.

client.on('caption-language-lock', (isLocked: boolean) => {});

caption-host-disable

Fired when host disables captions.

client.on('caption-host-disable', (isDisabled: boolean) => {});

Device Events

device-change

Fired when devices are added/removed.

client.on('device-change', () => {});

device-permission-change

Fired when device permissions change.

client.on('device-permission-change', (payload: {
  name: 'microphone' | 'camera';
  state: 'granted' | 'denied' | 'prompt';
}) => {});

Network & Quality Events

network-quality-change

Fired when network quality changes.

client.on('network-quality-change', (payload: {
  userId: number;
  type: 'uplink' | 'downlink';
  level: number;  // 0-5 (0=unknown, 1=bad, 5=excellent)
}) => {});

video-statistic-data-change

Fired when video statistics change.

client.on('video-statistic-data-change', (payload: {
  type: 'VIDEO_QOS_DATA';
  data: {
    encoding: boolean;  // true=send, false=receive
    width: number;
    height: number;
    fps: number;
    bitrate: number;
    avg_loss: number;
    max_loss: number;
    jitter: number;
    rtt: number;
  };
}) => {});

audio-statistic-data-change

Fired when audio statistics change.

client.on('audio-statistic-data-change', (payload: {
  type: 'AUDIO_QOS_DATA';
  data: {
    encoding: boolean;
    bitrate: number;
    avg_loss: number;
    max_loss: number;
    jitter: number;
    rtt: number;
    sample_rate: number;
  };
}) => {});

Command Channel Events

command-channel-status

Fired when command channel status changes.

client.on('command-channel-status', (payload: ConnectionState) => {});

command-channel-message

Fired when command channel message is received.

client.on('command-channel-message', (payload: {
  msgid: string;
  senderId: string;
  senderName: string;
  text: string;
  timestamp: number;
}) => {});

Live Stream Events

live-stream-status

Fired when live stream status changes.

client.on('live-stream-status', (status: LiveStreamStatus) => {});

Far End Camera Control Events

far-end-camera-request-control

Fired when someone requests camera control.

client.on('far-end-camera-request-control', (payload: {
  userId: number;
  displayName: string;
  currentControllingUserId?: number;
  currentControllingDisplayName?: string;
}) => {});

far-end-camera-response-control

Fired with camera control response.

client.on('far-end-camera-response-control', (payload: {
  userId: number;
  displayName: string;
  isApproved: boolean;
  reason?: FarEndCameraControlDeclinedReason;
}) => {});

far-end-camera-capability-change

Fired when camera capabilities change.

client.on('far-end-camera-capability-change', (payload: {
  userId: number;
  ptz: PTZCameraCapability;
}) => {});

Subsession Events

subsession-invite-to-join

Fired when invited to join subsession.

client.on('subsession-invite-to-join', (payload: {
  subsessionId: string;
  subsessionName: string;
}) => {});

subsession-broadcast-message

Fired when broadcast message received.

client.on('subsession-broadcast-message', (payload: {
  message: string;
}) => {});

subsession-state-change

Fired when subsession state changes.

client.on('subsession-state-change', (payload: {
  status: SubsessionStatus;
}) => {});

Whiteboard Events

whiteboard-status-change

Fired when whiteboard status changes.

client.on('whiteboard-status-change', (status: WhiteboardStatus) => {});

peer-whiteboard-state-change

Fired when peer whiteboard state changes.

client.on('peer-whiteboard-state-change', (payload: {
  action: 'Start' | 'Stop';
  userId: number;
}) => {});

Event Categories Quick Reference

Category Events
Session connection-change
Participants user-added, user-removed, user-updated
Video peer-video-state-change, video-capturing-change, video-dimension-change, video-active-change
Audio current-audio-change, host-ask-unmute-audio, active-speaker, auto-play-audio-failed
Share active-share-change, passively-stop-share, share-privilege-change, share-content-change
Chat chat-on-message, chat-privilege-change, chat-file-*-progress
Recording recording-change, individual-recording-change
Transcription caption-message, caption-status, caption-enable
Device device-change, device-permission-change
Network network-quality-change, *-statistic-data-change