Skip to main content

BigBlueButton (BBB) – Video Conferencing

The dBildungscloud integrates BigBlueButton as its video conferencing solution. Teachers can start conferences within courses or board elements, students and external persons can join them. Communication with BBB runs exclusively through the server – the client only manages the lifecycle (create, join, check status) and ultimately redirects to the BBB URL.

Features​

  • muteOnStart – Moderator can mute all participants when they enter
  • everybodyJoinsAsModerator – Moderator can grant moderator rights to all participants
  • Waiting Room (moderatorMustApproveJoinRequests) – Participants must be approved by a moderator before joining the conference
  • External Persons – Can participate in conferences, but only when the waiting room is enabled (see Access Logic for External Persons)

Where is BBB integrated?​

BBB can be used in different contexts ("scopes"):

ScopeDescriptionEntry Point
courseVideo conference within a course roomRoomVideoConferenceSection.vue
video-conference-elementVideo conference as a board element (column board)VideoConferenceContentElement.vue
roomRoom (available in API)–
eventCalendar event (available in API)–

For extensions: If BBB needs to be integrated in a new context, the existing composable useVideoConference(scope, scopeId) can be reused – it is scope-agnostic.

Board-Element Integration​

The board element (VideoConferenceContentElement.vue) is the primary integration point. Key behaviors:

  • Opens BBB in a new tab (_blank)
  • Prefetches the join URL on mount when a conference is already running – for faster join experience
  • Start permission is controlled via allowedOperations.manageVideoConference (board-specific)
  • Join permission is role-based: Student, Teacher, or External Person with waiting room active
  • Requires both FEATURE_VIDEOCONFERENCE_ENABLED and FEATURE_COLUMN_BOARD_VIDEOCONFERENCE_ENABLED, plus the server-side board feature flag

Note: BBB is also still used in the legacy course-room context (RoomVideoConferenceSection.vue), which opens BBB in the same tab and uses Permission.START_MEETING / Permission.JOIN_MEETING directly.

Access Logic for External Persons​

External persons may only join a BBB conference under certain conditions. The client-side logic:

canJoin = canJoinMeeting && (!isExternalPerson || userRoles.length > 1 || isWaitingRoomActive)

This means: An external person can only join if:

  • the waiting room is enabled (so the moderator can manually approve them), or
  • the person has additional roles (i.e. is not solely EXTERNAL_PERSON)

Architecture Overview​

Overview​

BBB Architecture

Sequence Flow​

BBB Flow

Communication Flow​

Client Server BBB Server (ext.)
────── ────── ─────────────────
GET .../info ───────────────► checks BBB status ─── GET /api/getMeetingInfo ──► XML response
PUT .../start {options} ─────► permission check → save to DB → POST /api/create ──► creates room
GET .../join ───────────────► determines role + guest → builds signed URL (no BBB call)
◄── { url } ──
window.open(url) ──────────────────────────────────────────────────────────────────► BBB Web UI

Key Server Internals​

  • meetingID = scopeId + salt (salt is a random 16-byte hex, regenerated on each start)

  • Checksum: SHA-512 of callName + queryParams + VIDEOCONFERENCE_SALT (env variable)

  • BBB communication: HTTP GET/POST, responses are XML (parsed with xml2json)

  • join() does NOT call BBB – it only constructs a signed URL that the browser opens directly

  • Role mapping:

    dBildungscloud RoleBBB Roleguest flag
    Teacher / RoomAdmin / BoardAdminMODERATORfalse
    Student / RoomViewer / BoardReader/EditorVIEWERfalse
    ExternalPerson / TeamExpertVIEWERtrue
  • Guest blocking: guest + no waiting room → 403 GUESTS_CANNOT_JOIN_CONFERENCE

  • GuestPolicy: waiting room enabled → guestPolicy=ASK_MODERATOR sent to BBB create

  • everybodyJoinsAsModerator: on join, if enabled AND user is not guest → role overridden to MODERATOR

  • allowModsToUnmuteUsers: always true in the create config

Local Setup​

Prerequisites​

  • BBB credentials HOST and SALT (from the password vault)
  • Role permissions: START_MEETING, JOIN_MEETING
  • School feature videoconference in the features array of the school (DB: table schools)

Server Env​

FEATURE_VIDEOCONFERENCE_ENABLED=true
VIDEOCONFERENCE_HOST=https://bbb.staging.messenger.schule/bigbluebutton
VIDEOCONFERENCE_SALT=<from password vault>
FEATURE_COLUMN_BOARD_VIDEOCONFERENCE_ENABLED=true

Client Env​

FEATURE_VIDEOCONFERENCE_ENABLED=true

Database Structure​

When a video conference is created (e.g. a teacher activates the feature for a course), an object is created in the videoconferences table:

{
"_id": "ObjectId(...)",
"target": "<COURSE_ID>",
"targetModel": "courses",
"options": {
"everyAttendeJoinsMuted": true,
"everybodyJoinsAsModerator": false,
"moderatorMustApproveJoinRequests": false
},
"salt": "<SALT_VALUE>"
}

For board elements, target refers to the board element and targetModel is "video-conference-elements".