/conferences interface currently only handles basic voice ConfBridge rooms. In modern work environments, teams require video meetings with gallery/grid view, active speaker detection, and screen sharing..ics) attachments.video_mode=sfu) and Active Speaker mode (video_mode=follow_talker), but endpoints need max_audio_streams and max_video_streams expanded, and ConfBridge bridge profiles configured./meetings):
/meetings)./meet/{token}):
MailTemplateService sending meeting invitations with one-click “Join Meeting” button and standard .ics calendar file for Google Calendar, Outlook, and Apple Calendar.video_mode=sfu, video_update_discard=0, and remb_send_interval=1000.[endpoint-wss] configuration supporting max_audio_streams=10 and max_video_streams=10.pbx_meetings and pbx_meeting_invites tables.SyncConferences.php) writes CONFBRIDGE(bridge,video_mode)=sfu (or follow_talker), video_update_discard=0, and remb_send_interval=1000.SyncExtensions.php) defines max_audio_streams=10 and max_video_streams=10./meetings) allows scheduling, editing, cancelling, and viewing upcoming/past meetings with CSRF and RBAC protection./meet/{token}) provides pre-join camera/mic checks, lobby screen, and WebRTC room connection with clean fallback..ics calendar attachment via MailTemplateService.web/lang/*.php).CREATE TABLE `pbx_meetings` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`meeting_token` VARCHAR(64) NOT NULL UNIQUE,
`title` VARCHAR(191) NOT NULL,
`description` TEXT NULL,
`host_user_id` INT NULL,
`room_number` VARCHAR(32) NOT NULL,
`pin` VARCHAR(32) NULL,
`scheduled_start` DATETIME NOT NULL,
`scheduled_end` DATETIME NOT NULL,
`video_mode` ENUM('sfu', 'follow_talker', 'none') DEFAULT 'sfu',
`max_participants` INT DEFAULT 25,
`allow_guests` TINYINT(1) DEFAULT 1,
`status` ENUM('scheduled', 'in_progress', 'completed', 'cancelled') DEFAULT 'scheduled',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_meeting_token` (`meeting_token`),
INDEX `idx_scheduled_start` (`scheduled_start`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `pbx_meeting_invites` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`meeting_id` INT NOT NULL,
`email` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NULL,
`guest_token` VARCHAR(64) NOT NULL UNIQUE,
`status` ENUM('invited', 'accepted', 'joined', 'declined') DEFAULT 'invited',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`meeting_id`) REFERENCES `pbx_meetings`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
MeetingService.php: Core business logic, scheduling, validation, token generation, invite dispatching, and iCalendar .ics generation.MeetingController.php: Backoffice UI for /meetings (list, schedule, cancel, copy link, resend invite).MeetingLobbyController.php: Public guest endpoint /meet/{token} handling lobby entry, session verification, and guest SIP credentials.MeetingServiceTest.php covering meeting lifecycle, token validation, ICS generation, and guest access limits./meetings and /meet/{token}.