Conference Moderation & Waiting Room

Designate a host (and optional co-hosts) for any group call. Host and co-host can mute and remove participants, transfer the host role, and gate joiners through a waiting room. If the host leaves without transferring, the platform auto-promotes the longest-joined remaining participant.

Role model

  • Host, the call initiator by default. Single host per call. Can transfer the role to another participant or appoint co-hosts.
  • Co-host, appointed by the host. Inherits mute / remove / waiting-room admit-reject authority. Cannot transfer host or appoint other co-hosts.
  • Participant, default. No moderation authority.

Enforcement

  • Mute, signaling hint. The platform forwards the signal to the target; the target's SDK applies the mute locally. WebRTC media tracks cannot be muted from outside the producing client, so reliable mute requires the target's cooperation.
  • Remove, server-enforced. The platform drops the target from the call session, emits GROUP_CALL_PARTICIPANT_REMOVED to the target, and emits PARTICIPANT_LEFT to remaining participants. Subsequent SDP/ICE/screen-share routing skips the removed user.
  • Host transfer, server-validated. Only the current host can transfer, and the new host must be a current participant. Atomic compare-and-swap so two concurrent transfer requests cannot leave the call host-less.
  • Host auto-promotion, automatic on host leave or disconnect. The longest-joined remaining participant is promoted; the platform broadcasts GROUP_CALL_ROLE_CHANGED so every client updates its UI in lockstep.

Waiting room flow

  1. A would-be joiner calls requestWaitingRoomEntry(callId, groupId).
  2. The platform adds them to the call's waiting room and pushes GROUP_CALL_WAITING_ROOM_JOINED to the host and every co-host.
  3. Host or co-host calls admitFromWaitingRoom(callId, groupId, userId) or rejectFromWaitingRoom(callId, groupId, userId).
  4. On admit, the target receives GROUP_CALL_WAITING_ROOM_ADMITTED and then issues a normal GROUP_CALL_JOIN. On reject, the target receives GROUP_CALL_WAITING_ROOM_REJECTED and is dropped from the waiting room.

Example

// Host actions
client.transferHost(callId, groupId, 'alice');
client.appointCoHost(callId, groupId, 'bob');
client.muteParticipant(callId, groupId, 'eve');       // signaling hint
client.removeParticipant(callId, groupId, 'mallory'); // server-enforced

// Waiting room
client.requestWaitingRoomEntry(callId, groupId);             // joiner side
client.admitFromWaitingRoom(callId, groupId, 'newbie');
client.rejectFromWaitingRoom(callId, groupId, 'troll');

client.onGroupCallEvent((evt) => {
  if (evt.type === 'GROUP_CALL_ROLE_CHANGED')          updateHostUi(evt.payload);
  if (evt.type === 'GROUP_CALL_WAITING_ROOM_JOINED')   showApprovalPrompt(evt.payload);
  if (evt.type === 'GROUP_CALL_WAITING_ROOM_ADMITTED') joinTheCall(evt.callId, evt.groupId);
  if (evt.type === 'GROUP_CALL_MUTE_PARTICIPANT')      muteMyMicLocally();
  if (evt.type === 'GROUP_CALL_PARTICIPANT_REMOVED')   exitCallUi();
});

Event reference

EventRecipientPayload
GROUP_CALL_ROLE_CHANGEDAll participants{"userId":"...","role":"HOST | CO_HOST | PARTICIPANT"}
GROUP_CALL_MUTE_PARTICIPANTTarget only{"by":"<moderator userId>"}
GROUP_CALL_PARTICIPANT_REMOVEDTarget only{"by":"<moderator userId>"}
GROUP_CALL_WAITING_ROOM_JOINEDHost + co-hostsWaiting user's userId
GROUP_CALL_WAITING_ROOM_ADMITTEDAdmitted userTheir own userId
GROUP_CALL_WAITING_ROOM_REJECTEDRejected userTheir own userId

Availability. Moderation and the waiting room are plan-controlled. See the pricing page for tiers, or your DropOnAir dashboard Subscription page to see what's enabled on your app.

Requires SDK 0.7.0+ on JavaScript, Android, and iOS.