实例介绍
Strive是一款新兴的开源视频会议平台,旨在提供一个更加流畅和高效的在线沟通体验。该项目起源于作者在大学担任导师期间,对现有视频会议系统BigBlueButton的不满意,从而启动了Strive项目。
主要特点:
- 灵活的权限系统
- 分组讨论室
- 屏幕共享
- 多场景支持(网格视图、活跃发言人)
- 演讲者模式
- 房间聊天&全局聊天,匿名聊天消息
- 设备支持/使用智能手机作为摄像头通过扫描二维码
- 话筒控制/有序发言
- 使用WebRTC simulcast减少流量
- 响应式UI设计
- 公告/向所有参与者显示消息,包括分组讨论室内的
- 横向和纵向可扩展性
- 投票(单选、多选、数字、标签云)
- 白板
架构简介:项目采用微服务架构,包括前端WebSPA(React/TypeScript编写),身份认证微服务,选择性转发单元(SFU)以及会议管理等核心部分。
快速开始:本地部署可以通过Docker Compose和Traefik轻松完成,生产环境部署请参考安装说明。开发者可以专注于单个微服务的开发,首先需要设置基础设施,如RabbitMQ服务器和MongoDB数据库。
【实例截图】
【核心代码】
文件清单
└── Strive-56f40312740d47cba03bf722ea268a4a0fc32f86
├── advantages_over_bbb.md
├── codecov.yml
├── img
│ ├── architecture.drawio
│ ├── architecture.png
│ └── preview_breakout_room.jpg
├── installation.md
├── LICENSE
├── package.json
├── performance.md
├── README.md
├── src
│ ├── compose.ps1
│ ├── compose.sh
│ ├── docker-compose.dcproj
│ ├── docker-compose.dev.yml
│ ├── docker-compose.e2e.yml
│ ├── docker-compose.override.yml
│ ├── docker-compose.prod.yml
│ ├── docker-compose.traefik.yml
│ ├── docker-compose.yml
│ ├── language.props
│ ├── Libs
│ │ ├── JsonPatchGenerator
│ │ │ ├── Handlers
│ │ │ │ ├── ArrayPatchTypeHandler.cs
│ │ │ │ ├── ObjectPatchTypeHandler.cs
│ │ │ │ └── ReplaceValuePatchTypeHandler.cs
│ │ │ ├── IPatchContext.cs
│ │ │ ├── IPatchTypeHandler.cs
│ │ │ ├── JsonPatchFactory.cs
│ │ │ ├── JsonPatchGenerator.csproj
│ │ │ ├── JsonPatchOptions.cs
│ │ │ ├── JsonPatchPath.cs
│ │ │ └── RootPatcher.cs
│ │ └── JsonPatchGenerator.Tests
│ │ ├── Handlers
│ │ │ ├── ArrayPatchTypeHandlerTests.cs
│ │ │ ├── ObjectPatchTypeHandlerTests.cs
│ │ │ └── TypeHandlerTestBase.cs
│ │ ├── JsonPatchFactoryTests.cs
│ │ ├── JsonPatchGenerator.Tests.csproj
│ │ ├── Resources
│ │ │ └── tests.json
│ │ └── _Utils
│ │ ├── AssertHelper.cs
│ │ └── EmbeddedResourceUtils.cs
│ ├── run_prod.sh
│ ├── Services
│ │ ├── ConferenceManagement
│ │ │ ├── language.props
│ │ │ ├── Strive
│ │ │ │ ├── AppRoles.cs
│ │ │ │ ├── appsettings.Development.json
│ │ │ │ ├── appsettings.json
│ │ │ │ ├── appsettings.Production.json
│ │ │ │ ├── Auth
│ │ │ │ │ ├── Operations.cs
│ │ │ │ │ └── UserIsModeratorOfConferenceHandler.cs
│ │ │ │ ├── Config
│ │ │ │ │ ├── AuthOptions.cs
│ │ │ │ │ ├── KeyValueDatabaseConfig.cs
│ │ │ │ │ ├── RabbitMqOptions.cs
│ │ │ │ │ └── SfuOptions.cs
│ │ │ │ ├── Controllers
│ │ │ │ │ ├── ConferenceController.cs
│ │ │ │ │ ├── ConferenceLinkController.cs
│ │ │ │ │ └── SfuController.cs
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Extensions
│ │ │ │ │ ├── ApiBehaviorExtensions.cs
│ │ │ │ │ ├── ExceptionExtensions.cs
│ │ │ │ │ ├── JwtBearerExtensions.cs
│ │ │ │ │ ├── RabbitMqConfiguratorExtensions.cs
│ │ │ │ │ ├── RabbitMqExtensions.cs
│ │ │ │ │ └── ResponseExtensions.cs
│ │ │ │ ├── Hubs
│ │ │ │ │ ├── Core
│ │ │ │ │ │ ├── ClientControl
│ │ │ │ │ │ │ └── EnableParticipantMessagingRequestHandler.cs
│ │ │ │ │ │ ├── CoreHubClientProxyExtensions.cs
│ │ │ │ │ │ ├── CoreHubConnections.cs
│ │ │ │ │ │ ├── CoreHub.cs
│ │ │ │ │ │ ├── CoreHubGroups.cs
│ │ │ │ │ │ ├── CoreHubMessages.cs
│ │ │ │ │ │ ├── Dtos
│ │ │ │ │ │ │ ├── CreatePollDto.cs
│ │ │ │ │ │ │ ├── DeletePollAnswerDto.cs
│ │ │ │ │ │ │ ├── DeletePollDto.cs
│ │ │ │ │ │ │ ├── FetchChatMessagesDto.cs
│ │ │ │ │ │ │ ├── KickParticipantRequestDto.cs
│ │ │ │ │ │ │ ├── OpenBreakoutRoomsDto.cs
│ │ │ │ │ │ │ ├── SendChatMessageDto.cs
│ │ │ │ │ │ │ ├── SendEquipmentCommandDto.cs
│ │ │ │ │ │ │ ├── SetTemporaryPermissionDto.cs
│ │ │ │ │ │ │ ├── SetUserTypingDto.cs
│ │ │ │ │ │ │ ├── SubmitPollAnswerDto.cs
│ │ │ │ │ │ │ ├── SwitchRoomDto.cs
│ │ │ │ │ │ │ ├── UpdatePollStateDto.cs
│ │ │ │ │ │ │ ├── WhiteboardLiveActionDto.cs
│ │ │ │ │ │ │ ├── WhiteboardPushActionDto.cs
│ │ │ │ │ │ │ └── WhiteboardUpdateSettingsDto.cs
│ │ │ │ │ │ ├── ICoreHubConnections.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ChatMessageReceivedNotificationHandler.cs
│ │ │ │ │ │ │ ├── EquipmentErrorNotificationHandler.cs
│ │ │ │ │ │ │ ├── LiveActionPushedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantKickedNotificationHandler.cs
│ │ │ │ │ │ │ └── SynchronizedObjectUpdatedNotificationHandler.cs
│ │ │ │ │ │ ├── ParticipantConnection.cs
│ │ │ │ │ │ ├── Responses
│ │ │ │ │ │ │ ├── ChatMessageDto.cs
│ │ │ │ │ │ │ ├── EquipmentErrorDto.cs
│ │ │ │ │ │ │ ├── RequestDisconnectDto.cs
│ │ │ │ │ │ │ └── WhiteboardLiveUpdateDto.cs
│ │ │ │ │ │ ├── Services
│ │ │ │ │ │ │ ├── IServiceInvoker.cs
│ │ │ │ │ │ │ ├── IServiceRequestBuilder.cs
│ │ │ │ │ │ │ ├── Middlewares
│ │ │ │ │ │ │ │ ├── ServiceInvokerChatMiddleware.cs
│ │ │ │ │ │ │ │ ├── ServiceInvokerConferenceMiddleware.cs
│ │ │ │ │ │ │ │ ├── ServiceInvokerPermissionMiddleware.cs
│ │ │ │ │ │ │ │ └── ServiceInvokerValidationMiddleware.cs
│ │ │ │ │ │ │ ├── ServiceInvokerContext.cs
│ │ │ │ │ │ │ ├── ServiceInvoker.cs
│ │ │ │ │ │ │ ├── ServiceMiddleware.cs
│ │ │ │ │ │ │ ├── ServiceRequestBuilderBase.cs
│ │ │ │ │ │ │ ├── ServiceRequestBuilder.cs
│ │ │ │ │ │ │ └── ServiceRequestBuilderSuccessOrError.cs
│ │ │ │ │ │ ├── SyncObjPayload.cs
│ │ │ │ │ │ └── Validators
│ │ │ │ │ │ ├── CreatePollDtoValidator.cs
│ │ │ │ │ │ ├── DeletePollAnswerDtoValidator.cs
│ │ │ │ │ │ ├── DeletePollDtoValidator.cs
│ │ │ │ │ │ ├── Extensions
│ │ │ │ │ │ │ └── ChatValidationExtensions.cs
│ │ │ │ │ │ ├── KickParticipantRequestDtoValidator.cs
│ │ │ │ │ │ ├── OpenBreakoutRoomsDtoValidator.cs
│ │ │ │ │ │ ├── RoomCreationInfosValidator.cs
│ │ │ │ │ │ ├── SendChatMessageDtoValidator.cs
│ │ │ │ │ │ ├── SendEquipmentCommandDtoValidator.cs
│ │ │ │ │ │ ├── SetTemporaryPermissionDtoValidator.cs
│ │ │ │ │ │ ├── SubmitPollAnswerDtoValidator.cs
│ │ │ │ │ │ ├── SwitchRoomDtoValidator.cs
│ │ │ │ │ │ └── UpdatePollStateDtoValidator.cs
│ │ │ │ │ ├── Equipment
│ │ │ │ │ │ ├── Dtos
│ │ │ │ │ │ │ └── InitializeEquipmentDto.cs
│ │ │ │ │ │ ├── EquipmentGroups.cs
│ │ │ │ │ │ ├── EquipmentHubClientProxyExtensions.cs
│ │ │ │ │ │ ├── EquipmentHub.cs
│ │ │ │ │ │ ├── EquipmentHubMessages.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ │ └── SendEquipmentCommandNotificationHandler.cs
│ │ │ │ │ │ ├── Responses
│ │ │ │ │ │ │ ├── EquipmentCommandDto.cs
│ │ │ │ │ │ │ ├── EquipmentKickedReason.cs
│ │ │ │ │ │ │ └── RequestDisconnectDto.cs
│ │ │ │ │ │ └── Validators
│ │ │ │ │ │ └── InitializeEquipmentDtoValidator.cs
│ │ │ │ │ ├── HubExtensions.cs
│ │ │ │ │ ├── ISfuConnectionHub.cs
│ │ │ │ │ └── ScopedHub.cs
│ │ │ │ ├── Messaging
│ │ │ │ │ ├── Consumers
│ │ │ │ │ │ ├── NotifyConnectionConsumer.cs
│ │ │ │ │ │ ├── ParticipantKickedConsumer.cs
│ │ │ │ │ │ └── StreamsUpdatedConsumer.cs
│ │ │ │ │ ├── Contracts
│ │ │ │ │ │ └── ParticipantKicked.cs
│ │ │ │ │ └── SFU
│ │ │ │ │ ├── CachedSfuNotifier.cs
│ │ │ │ │ ├── Dto
│ │ │ │ │ │ ├── ChangeParticipantProducerDto.cs
│ │ │ │ │ │ ├── SendHubMessageDto.cs
│ │ │ │ │ │ ├── SfuConferenceInfo.cs
│ │ │ │ │ │ ├── SfuConferenceInfoUpdate.cs
│ │ │ │ │ │ └── SfuParticipantPermissions.cs
│ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ ├── ConferenceOpenedNotificationHandler.cs
│ │ │ │ │ │ ├── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ ├── ParticipantPermissionsUpdatedNotificationHandler.cs
│ │ │ │ │ │ └── ParticipantsRoomChangedNotificationHandler.cs
│ │ │ │ │ ├── ReceiveContracts
│ │ │ │ │ │ ├── SendMessageToConnection.cs
│ │ │ │ │ │ └── StreamsUpdated.cs
│ │ │ │ │ ├── SendContracts
│ │ │ │ │ │ ├── ChangeParticipantProducer.cs
│ │ │ │ │ │ ├── MediaStateChanged.cs
│ │ │ │ │ │ └── ParticipantLeft.cs
│ │ │ │ │ ├── SfuConferenceInfoRepo.cs
│ │ │ │ │ ├── SfuConferenceInfoUpdateAggregator.cs
│ │ │ │ │ ├── SfuMessage.cs
│ │ │ │ │ ├── SfuNotifier.cs
│ │ │ │ │ ├── UseCase
│ │ │ │ │ │ └── ChangeParticipantProducerUseCase.cs
│ │ │ │ │ └── Utils
│ │ │ │ │ └── SfuPermissionUtils.cs
│ │ │ │ ├── Models
│ │ │ │ │ ├── Request
│ │ │ │ │ │ ├── ChangeConferenceLinkStarDto.cs
│ │ │ │ │ │ └── CreateConferenceRequestDto.cs
│ │ │ │ │ ├── Response
│ │ │ │ │ │ ├── ConferenceCreatedResponseDto.cs
│ │ │ │ │ │ └── ConferenceLinkDto.cs
│ │ │ │ │ └── Validation
│ │ │ │ │ └── CreateConferenceRequestValidator.cs
│ │ │ │ ├── PerformanceModule.cs
│ │ │ │ ├── PresentationModule.cs
│ │ │ │ ├── Presenters
│ │ │ │ │ └── ConferenceLinkPresenter.cs
│ │ │ │ ├── Program.cs
│ │ │ │ ├── Properties
│ │ │ │ │ └── launchSettings.json
│ │ │ │ ├── Services
│ │ │ │ │ └── MongoDbBuilder.cs
│ │ │ │ ├── Startup.cs
│ │ │ │ ├── Strive.csproj
│ │ │ │ └── Utilities
│ │ │ │ └── LoggingBehavior.cs
│ │ │ ├── Strive.Core
│ │ │ │ ├── ConcurrencyOptions.cs
│ │ │ │ ├── ConferenceError.cs
│ │ │ │ ├── CoreModule.cs
│ │ │ │ ├── Domain
│ │ │ │ │ ├── Entities
│ │ │ │ │ │ ├── ConferenceConfiguration.cs
│ │ │ │ │ │ ├── Conference.cs
│ │ │ │ │ │ ├── ConferenceLink.cs
│ │ │ │ │ │ └── PermissionType.cs
│ │ │ │ │ ├── IScheduleInfo.cs
│ │ │ │ │ └── Roles.cs
│ │ │ │ ├── Dto
│ │ │ │ │ └── Error.cs
│ │ │ │ ├── Errors
│ │ │ │ │ ├── BadRequestError.cs
│ │ │ │ │ ├── ConflictError.cs
│ │ │ │ │ ├── DomainError.cs
│ │ │ │ │ ├── ErrorCode.cs
│ │ │ │ │ ├── ErrorsProvider.cs
│ │ │ │ │ ├── ErrorType.cs
│ │ │ │ │ ├── FieldValidationError.cs
│ │ │ │ │ ├── ForbiddenError.cs
│ │ │ │ │ ├── InternalServerError.cs
│ │ │ │ │ └── NotFound.cs
│ │ │ │ ├── Extensions
│ │ │ │ │ ├── EnumerableExtensions.cs
│ │ │ │ │ ├── ErrorExtensions.cs
│ │ │ │ │ ├── LoggerExtensions.cs
│ │ │ │ │ ├── ObjectExtensions.cs
│ │ │ │ │ └── PermissionDescriptorExtensions.cs
│ │ │ │ ├── Interfaces
│ │ │ │ │ ├── Gateways
│ │ │ │ │ │ ├── EntityPage.cs
│ │ │ │ │ │ ├── IAcquiredLock.cs
│ │ │ │ │ │ ├── IStateRepository.cs
│ │ │ │ │ │ ├── OptimisticUpdateResult.cs
│ │ │ │ │ │ └── Repositories
│ │ │ │ │ │ ├── ConcurrencyException.cs
│ │ │ │ │ │ └── IConferenceLinkRepo.cs
│ │ │ │ │ ├── IScheduledNotification.cs
│ │ │ │ │ ├── ISuccessOrError.cs
│ │ │ │ │ ├── Services
│ │ │ │ │ │ ├── IScheduledMediator.cs
│ │ │ │ │ │ └── ITokenFactory.cs
│ │ │ │ │ └── SuccessOrError{T}.cs
│ │ │ │ ├── Services
│ │ │ │ │ ├── BreakoutRooms
│ │ │ │ │ │ ├── BreakoutRoomError.cs
│ │ │ │ │ │ ├── BreakoutRoomInternalState.cs
│ │ │ │ │ │ ├── BreakoutRoomsConfig.cs
│ │ │ │ │ │ ├── BreakoutRoomsOptions.cs
│ │ │ │ │ │ ├── BreakoutRoomsPermissionLayerProvider.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── IBreakoutRoomRepository.cs
│ │ │ │ │ │ ├── Internal
│ │ │ │ │ │ │ ├── ApplyBreakoutRoomRequest.cs
│ │ │ │ │ │ │ └── ApplyBreakoutRoomUseCase.cs
│ │ │ │ │ │ ├── Naming
│ │ │ │ │ │ │ ├── IRoomNamingStrategy.cs
│ │ │ │ │ │ │ └── NatoRoomNamingStrategy.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── BreakoutRoomTimerElapsedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ConferenceClosedNotificationHandler.cs
│ │ │ │ │ │ │ └── ParticipantsRoomChangedNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ └── BreakoutRoomTimerElapsedNotification.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── ChangeBreakoutRoomsRequest.cs
│ │ │ │ │ │ │ ├── CloseBreakoutRoomsRequest.cs
│ │ │ │ │ │ │ └── OpenBreakoutRoomsRequest.cs
│ │ │ │ │ │ ├── SynchronizedBreakoutRooms.cs
│ │ │ │ │ │ ├── SynchronizedBreakoutRoomsProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── ChangeBreakoutRoomsUseCase.cs
│ │ │ │ │ │ ├── CloseBreakoutRoomsUseCase.cs
│ │ │ │ │ │ └── OpenBreakoutRoomsUseCase.cs
│ │ │ │ │ ├── Chat
│ │ │ │ │ │ ├── Channels
│ │ │ │ │ │ │ ├── ChannelSerializer.cs
│ │ │ │ │ │ │ ├── ChatChannel.cs
│ │ │ │ │ │ │ ├── ChatChannelType.cs
│ │ │ │ │ │ │ ├── GlobalChatChannel.cs
│ │ │ │ │ │ │ ├── PrivateChatChannel.cs
│ │ │ │ │ │ │ └── RoomChatChannel.cs
│ │ │ │ │ │ ├── ChatChannelSelector.cs
│ │ │ │ │ │ ├── ChatError.cs
│ │ │ │ │ │ ├── ChatMessage.cs
│ │ │ │ │ │ ├── ChatOptions.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── IChatRepository.cs
│ │ │ │ │ │ ├── IChatChannelSelector.cs
│ │ │ │ │ │ ├── IParticipantTypingTimer.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferenceClosedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantsRoomChangedNotificationHandler.cs
│ │ │ │ │ │ │ └── RoomsRemovedNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ └── ChatMessageReceivedNotification.cs
│ │ │ │ │ │ ├── ParticipantTypingTimer.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── FetchMessagesRequest.cs
│ │ │ │ │ │ │ ├── SendChatMessageRequest.cs
│ │ │ │ │ │ │ └── SetParticipantTypingRequest.cs
│ │ │ │ │ │ ├── SynchronizedChat.cs
│ │ │ │ │ │ ├── SynchronizedChatProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── FetchMessagesUseCase.cs
│ │ │ │ │ │ ├── SendChatMessageUseCase.cs
│ │ │ │ │ │ └── SetParticipantTypingUseCase.cs
│ │ │ │ │ ├── CommonError.cs
│ │ │ │ │ ├── ConferenceControl
│ │ │ │ │ │ ├── ClientControl
│ │ │ │ │ │ │ └── EnableParticipantMessagingRequest.cs
│ │ │ │ │ │ ├── ConferenceScheduler.cs
│ │ │ │ │ │ ├── ConferenceSchedulerOptions.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ ├── IJoinedParticipantsRepository.cs
│ │ │ │ │ │ │ ├── IOpenConferenceRepository.cs
│ │ │ │ │ │ │ └── PreviousParticipantState.cs
│ │ │ │ │ │ ├── IConferenceScheduler.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferenceClosedStateRepositoryCleanupHandler.cs
│ │ │ │ │ │ │ ├── ConferenceStateUpdatedNotificationHandler.cs
│ │ │ │ │ │ │ └── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ ├── ConferenceClosedNotification.cs
│ │ │ │ │ │ │ ├── ConferenceOpenedNotification.cs
│ │ │ │ │ │ │ ├── ConferenceStateUpdatedNotification.cs
│ │ │ │ │ │ │ ├── FinalizeConferenceCleanupNotification.cs
│ │ │ │ │ │ │ ├── ParticipantInitializedNotification.cs
│ │ │ │ │ │ │ ├── ParticipantJoinedNotification.cs
│ │ │ │ │ │ │ ├── ParticipantKickedNotification.cs
│ │ │ │ │ │ │ └── ParticipantLeftNotification.cs
│ │ │ │ │ │ ├── ParticipantMetadata.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── CheckIsParticipantJoinedRequest.cs
│ │ │ │ │ │ │ ├── CloseConferenceRequest.cs
│ │ │ │ │ │ │ ├── JoinConferenceRequest.cs
│ │ │ │ │ │ │ ├── KickParticipantRequest.cs
│ │ │ │ │ │ │ └── OpenConferenceRequest.cs
│ │ │ │ │ │ ├── ScheduleUtils.cs
│ │ │ │ │ │ ├── SynchronizedConferenceInfo.cs
│ │ │ │ │ │ ├── SynchronizedConferenceInfoProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── CheckIsParticipantJoinedUseCase.cs
│ │ │ │ │ │ ├── CloseConferenceHandler.cs
│ │ │ │ │ │ ├── JoinConferenceRequestHandler.cs
│ │ │ │ │ │ ├── KickParticipantHandler.cs
│ │ │ │ │ │ └── OpenConferenceHandler.cs
│ │ │ │ │ ├── ConferenceLink
│ │ │ │ │ │ └── NotificationHandlers
│ │ │ │ │ │ ├── ConferenceJoinedUpdateLinkHandler.cs
│ │ │ │ │ │ └── ConferenceUpdatedUpdateLinkHandler.cs
│ │ │ │ │ ├── ConferenceManagement
│ │ │ │ │ │ ├── ConferenceData.cs
│ │ │ │ │ │ ├── ConferenceDataValidator.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── IConferenceRepo.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ └── ConferencePatchedNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ └── ConferencePatchedNotification.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── CreateConferenceRequest.cs
│ │ │ │ │ │ │ ├── FindConferenceByIdRequest.cs
│ │ │ │ │ │ │ └── PatchConferenceRequest.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── CreateConferenceRequestHandler.cs
│ │ │ │ │ │ ├── FindConferenceByIdRequestHandler.cs
│ │ │ │ │ │ └── PatchConferenceRequestHandler.cs
│ │ │ │ │ ├── ConferenceNotFoundException.cs
│ │ │ │ │ ├── Equipment
│ │ │ │ │ │ ├── CurrentStreamInfo.cs
│ │ │ │ │ │ ├── DeviceType.cs
│ │ │ │ │ │ ├── EquipmentCommandType.cs
│ │ │ │ │ │ ├── EquipmentConnection.cs
│ │ │ │ │ │ ├── EquipmentDevice.cs
│ │ │ │ │ │ ├── EquipmentError.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ ├── IEquipmentConnectionRepository.cs
│ │ │ │ │ │ │ └── IEquipmentTokenRepository.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── EquipmentDisconnectedNotificationHandler.cs
│ │ │ │ │ │ │ └── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ ├── EquipmentDisconnectedNotification.cs
│ │ │ │ │ │ │ ├── EquipmentErrorNotification.cs
│ │ │ │ │ │ │ └── SendEquipmentCommandNotification.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── AuthenticateEquipmentRequest.cs
│ │ │ │ │ │ │ ├── FetchEquipmentTokenRequest.cs
│ │ │ │ │ │ │ ├── InitializeEquipmentRequest.cs
│ │ │ │ │ │ │ ├── SendEquipmentCommandRequest.cs
│ │ │ │ │ │ │ └── UpdateStatusRequest.cs
│ │ │ │ │ │ ├── SynchronizedEquipment.cs
│ │ │ │ │ │ ├── SynchronizedEquipmentProvider.cs
│ │ │ │ │ │ ├── UseCases
│ │ │ │ │ │ │ ├── AuthenticateEquipmentUseCase.cs
│ │ │ │ │ │ │ ├── FetchEquipmentTokenUseCase.cs
│ │ │ │ │ │ │ ├── InitializeEquipmentUseCase.cs
│ │ │ │ │ │ │ ├── SendEquipmentCommandUseCase.cs
│ │ │ │ │ │ │ └── UpdateStatusUseCase.cs
│ │ │ │ │ │ └── UseMediaStateInfo.cs
│ │ │ │ │ ├── IdErrorException.cs
│ │ │ │ │ ├── ITaskDelay.cs
│ │ │ │ │ ├── Media
│ │ │ │ │ │ ├── Dtos
│ │ │ │ │ │ │ ├── ConsumerInfo.cs
│ │ │ │ │ │ │ ├── MediaStreamAction.cs
│ │ │ │ │ │ │ ├── MediaStreamType.cs
│ │ │ │ │ │ │ ├── ParticipantStreams.cs
│ │ │ │ │ │ │ ├── ProducerInfo.cs
│ │ │ │ │ │ │ └── ProducerSource.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ ├── IMediaStateRepository.cs
│ │ │ │ │ │ │ └── ISfuAuthTokenFactory.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── ApplyMediaStateRequest.cs
│ │ │ │ │ │ │ ├── ChangeParticipantProducerRequest.cs
│ │ │ │ │ │ │ └── FetchSfuConnectionInfoRequest.cs
│ │ │ │ │ │ ├── SfuConnectionInfo.cs
│ │ │ │ │ │ ├── SfuConnectionOptions.cs
│ │ │ │ │ │ ├── SynchronizedMediaState.cs
│ │ │ │ │ │ ├── SynchronizedMediaStateProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── ApplyMediaStateUseCase.cs
│ │ │ │ │ │ └── FetchSfuConnectionInfoUseCase.cs
│ │ │ │ │ ├── Participant.cs
│ │ │ │ │ ├── ParticipantNotFoundException.cs
│ │ │ │ │ ├── ParticipantsList
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── IParticipantMetadataRepository.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferencePatchedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantJoinedNotificationHandler.cs
│ │ │ │ │ │ │ └── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ ├── ParticipantData.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ └── FetchParticipantsMetadataRequest.cs
│ │ │ │ │ │ ├── SynchronizedParticipants.cs
│ │ │ │ │ │ ├── SynchronizedParticipantsProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ └── FetchParticipantMetadataUseCase.cs
│ │ │ │ │ ├── Permissions
│ │ │ │ │ │ ├── CachedPermissionStack.cs
│ │ │ │ │ │ ├── CommonPermissionLayers.cs
│ │ │ │ │ │ ├── DefinedPermissions.cs
│ │ │ │ │ │ ├── DefinedPermissionsProvider.cs
│ │ │ │ │ │ ├── DefinedPermissionValidator.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ ├── IAggregatedPermissionRepository.cs
│ │ │ │ │ │ │ └── ITemporaryPermissionRepository.cs
│ │ │ │ │ │ ├── IParticipantPermissions.cs
│ │ │ │ │ │ ├── IPermissionLayerProvider.cs
│ │ │ │ │ │ ├── IPermissionLayersAggregator.cs
│ │ │ │ │ │ ├── IPermissionStack.cs
│ │ │ │ │ │ ├── IPermissionValidator.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferencePatchedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantInitializedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ │ └── ParticipantPermissionsUpdatedNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ └── ParticipantPermissionsUpdatedNotification.cs
│ │ │ │ │ │ ├── Options
│ │ │ │ │ │ │ └── DefaultPermissionOptions.cs
│ │ │ │ │ │ ├── ParticipantPermissions.cs
│ │ │ │ │ │ ├── PermissionDescriptor.cs
│ │ │ │ │ │ ├── PermissionDescriptor{T}.cs
│ │ │ │ │ │ ├── PermissionLayer.cs
│ │ │ │ │ │ ├── PermissionLayers
│ │ │ │ │ │ │ ├── ConferencePermissionLayerProvider.cs
│ │ │ │ │ │ │ ├── DefaultPermissionLayerProvider.cs
│ │ │ │ │ │ │ └── TemporaryPermissionLayerProvider.cs
│ │ │ │ │ │ ├── PermissionLayersAggregator.cs
│ │ │ │ │ │ ├── PermissionsError.cs
│ │ │ │ │ │ ├── PermissionValueType.cs
│ │ │ │ │ │ ├── RepositoryPermissionStack.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── FetchPermissionsRequest.cs
│ │ │ │ │ │ │ ├── SetTemporaryPermissionRequest.cs
│ │ │ │ │ │ │ └── UpdateParticipantsPermissionsRequest.cs
│ │ │ │ │ │ ├── Responses
│ │ │ │ │ │ │ └── ParticipantPermissionResponse.cs
│ │ │ │ │ │ ├── SynchronizedParticipantPermissions.cs
│ │ │ │ │ │ ├── SynchronizedParticipantPermissionsProvider.cs
│ │ │ │ │ │ ├── SynchronizedTemporaryPermissions.cs
│ │ │ │ │ │ ├── SynchronizedTemporaryPermissionsProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── FetchPermissionsHandler.cs
│ │ │ │ │ │ ├── SetTemporaryPermissionHandler.cs
│ │ │ │ │ │ └── UpdateParticipantsPermissionsHandler.cs
│ │ │ │ │ ├── Poll
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── IPollRepository.cs
│ │ │ │ │ │ ├── IPollAnswerAggregator.cs
│ │ │ │ │ │ ├── IPollAnswerValidator.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferenceClosedNotificationHandler.cs
│ │ │ │ │ │ │ └── RoomsRemovedNotificationHandler.cs
│ │ │ │ │ │ ├── PollAnswer.cs
│ │ │ │ │ │ ├── PollAnswerWithKey.cs
│ │ │ │ │ │ ├── PollConfig.cs
│ │ │ │ │ │ ├── Poll.cs
│ │ │ │ │ │ ├── PollError.cs
│ │ │ │ │ │ ├── PollInstruction.cs
│ │ │ │ │ │ ├── PollResults.cs
│ │ │ │ │ │ ├── PollState.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── CreatePollRequest.cs
│ │ │ │ │ │ │ ├── DeletePollRequest.cs
│ │ │ │ │ │ │ ├── FetchParticipantPollsRequest.cs
│ │ │ │ │ │ │ ├── FetchPollResultsRequest.cs
│ │ │ │ │ │ │ ├── FetchPollsOfRoomRequest.cs
│ │ │ │ │ │ │ ├── SubmitAnswerRequest.cs
│ │ │ │ │ │ │ ├── UpdateParticipantSubscriptionsOfPollRequest.cs
│ │ │ │ │ │ │ └── UpdatePollStateRequest.cs
│ │ │ │ │ │ ├── SanitizedPollResult.cs
│ │ │ │ │ │ ├── SynchronizedPollAnswers.cs
│ │ │ │ │ │ ├── SynchronizedPollAnswersProvider.cs
│ │ │ │ │ │ ├── SynchronizedPoll.cs
│ │ │ │ │ │ ├── SynchronizedPollProvider.cs
│ │ │ │ │ │ ├── SynchronizedPollResult.cs
│ │ │ │ │ │ ├── SynchronizedPollResultProvider.cs
│ │ │ │ │ │ ├── Types
│ │ │ │ │ │ │ ├── MultipleChoice
│ │ │ │ │ │ │ │ ├── MultipleChoiceAggregator.cs
│ │ │ │ │ │ │ │ ├── MultipleChoiceAnswer.cs
│ │ │ │ │ │ │ │ ├── MultipleChoiceAnswerValidator.cs
│ │ │ │ │ │ │ │ └── MultipleChoiceInstruction.cs
│ │ │ │ │ │ │ ├── Numeric
│ │ │ │ │ │ │ │ ├── NumericAggregator.cs
│ │ │ │ │ │ │ │ ├── NumericAnswer.cs
│ │ │ │ │ │ │ │ ├── NumericAnswerValidator.cs
│ │ │ │ │ │ │ │ ├── NumericInstruction.cs
│ │ │ │ │ │ │ │ └── NumericPollResults.cs
│ │ │ │ │ │ │ ├── SelectionPollAggregator.cs
│ │ │ │ │ │ │ ├── SelectionPollResults.cs
│ │ │ │ │ │ │ ├── SingleChoice
│ │ │ │ │ │ │ │ ├── SingleChoiceAggregator.cs
│ │ │ │ │ │ │ │ ├── SingleChoiceAnswer.cs
│ │ │ │ │ │ │ │ ├── SingleChoiceAnswerValidator.cs
│ │ │ │ │ │ │ │ └── SingleChoiceInstruction.cs
│ │ │ │ │ │ │ └── TagCloud
│ │ │ │ │ │ │ ├── Clustering
│ │ │ │ │ │ │ │ ├── ClusterBucket.cs
│ │ │ │ │ │ │ │ ├── IClusterAlgorithm.cs
│ │ │ │ │ │ │ │ ├── IDistanceAlgorithm.cs
│ │ │ │ │ │ │ │ ├── NaiveClusterAlgorithm.cs
│ │ │ │ │ │ │ │ └── NormalizedLevenshteinDistance.cs
│ │ │ │ │ │ │ ├── TagCloudAggregator.cs
│ │ │ │ │ │ │ ├── TagCloudAnswer.cs
│ │ │ │ │ │ │ ├── TagCloudAnswerValidator.cs
│ │ │ │ │ │ │ ├── TagCloudClusterMode.cs
│ │ │ │ │ │ │ ├── TagCloudGrouper.cs
│ │ │ │ │ │ │ ├── TagCloudInstruction.cs
│ │ │ │ │ │ │ ├── TagCloudPollResults.cs
│ │ │ │ │ │ │ └── TagCloudTag.cs
│ │ │ │ │ │ ├── UseCase
│ │ │ │ │ │ │ ├── CreatePollUseCase.cs
│ │ │ │ │ │ │ ├── DeletePollUseCase.cs
│ │ │ │ │ │ │ ├── FetchParticipantPollsUseCase.cs
│ │ │ │ │ │ │ ├── FetchPollResultsUseCase.cs
│ │ │ │ │ │ │ ├── FetchPollsOfRoomUseCase.cs
│ │ │ │ │ │ │ ├── SubmitAnswerUseCase.cs
│ │ │ │ │ │ │ ├── UpdateParticipantSubscriptionsOfPollUseCase.cs
│ │ │ │ │ │ │ └── UpdatePollStateUseCase.cs
│ │ │ │ │ │ └── Utilities
│ │ │ │ │ │ ├── PollAnswerAggregatorWrapper.cs
│ │ │ │ │ │ ├── PollAnswerValidatorWrapper.cs
│ │ │ │ │ │ └── SceneUpdater.cs
│ │ │ │ │ ├── Rooms
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── IRoomRepository.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferenceClosedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ConferenceOpenedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantJoinedNotificationHandler.cs
│ │ │ │ │ │ │ └── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ ├── Base
│ │ │ │ │ │ │ │ └── RoomsChangedNotificationBase.cs
│ │ │ │ │ │ │ ├── ParticipantsRoomChangedNotification.cs
│ │ │ │ │ │ │ ├── RoomsCreatedNotification.cs
│ │ │ │ │ │ │ └── RoomsRemovedNotification.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── CreateRoomsRequest.cs
│ │ │ │ │ │ │ ├── RemoveRoomsRequest.cs
│ │ │ │ │ │ │ └── SetParticipantRoomRequest.cs
│ │ │ │ │ │ ├── RoomCreationInfo.cs
│ │ │ │ │ │ ├── Room.cs
│ │ │ │ │ │ ├── RoomOptions.cs
│ │ │ │ │ │ ├── SynchronizedRooms.cs
│ │ │ │ │ │ ├── SynchronizedRoomsProvider.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── CreateRoomsUseCase.cs
│ │ │ │ │ │ ├── RemoveRoomsUseCase.cs
│ │ │ │ │ │ └── SetParticipantRoomUseCase.cs
│ │ │ │ │ ├── Scenes
│ │ │ │ │ │ ├── ActiveScene.cs
│ │ │ │ │ │ ├── ContentSceneProvider.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ └── ISceneRepository.cs
│ │ │ │ │ │ ├── IScene.cs
│ │ │ │ │ │ ├── ISceneProvider.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ConferenceConfigurationChangedNotificationHandler.cs
│ │ │ │ │ │ │ ├── RoomsAddedNotificationHandler.cs
│ │ │ │ │ │ │ ├── RoomsRemovedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ScenePermissionChangedNotificationHandler.cs
│ │ │ │ │ │ │ └── SynchronizedObjectUpdatedNotificationHandler.cs
│ │ │ │ │ │ ├── Providers
│ │ │ │ │ │ │ ├── AutonomousSceneProvider.cs
│ │ │ │ │ │ │ ├── BreakoutRoomSceneProvider.cs
│ │ │ │ │ │ │ ├── DefaultScenesProvider.cs
│ │ │ │ │ │ │ ├── PollSceneProvider.cs
│ │ │ │ │ │ │ ├── PresenterSceneProvider.cs
│ │ │ │ │ │ │ ├── ScreenShareSceneProvider.cs
│ │ │ │ │ │ │ ├── TalkingStick
│ │ │ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ │ │ └── ITalkingStickRepository.cs
│ │ │ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ │ │ ├── ParticipantRoomChangeNotificationHandler.cs
│ │ │ │ │ │ │ │ │ └── RoomsRemovedNotificationHandler.cs
│ │ │ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ │ │ ├── TalkingStickEnqueueRequest.cs
│ │ │ │ │ │ │ │ │ ├── TalkingStickPassRequest.cs
│ │ │ │ │ │ │ │ │ └── TalkingStickReturnRequest.cs
│ │ │ │ │ │ │ │ ├── SceneModeHandler.cs
│ │ │ │ │ │ │ │ ├── SynchronizedSceneTalkingStick.cs
│ │ │ │ │ │ │ │ ├── SynchronizedSceneTalkingStickProvider.cs
│ │ │ │ │ │ │ │ ├── TalkingStickSceneProvider.cs
│ │ │ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ │ │ ├── TalkingStickEnqueueUseCase.cs
│ │ │ │ │ │ │ │ ├── TalkingStickPassUseCase.cs
│ │ │ │ │ │ │ │ └── TalkingStickReturnUseCase.cs
│ │ │ │ │ │ │ └── WhiteboardSceneProvider.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── FetchAvailableScenesRequest.cs
│ │ │ │ │ │ │ ├── SetOverwrittenContentSceneRequest.cs
│ │ │ │ │ │ │ ├── SetSceneRequest.cs
│ │ │ │ │ │ │ └── UpdateScenesRequest.cs
│ │ │ │ │ │ ├── SceneBuilderContext.cs
│ │ │ │ │ │ ├── SceneError.cs
│ │ │ │ │ │ ├── SceneOptions.cs
│ │ │ │ │ │ ├── ScenePermissionLayer.cs
│ │ │ │ │ │ ├── Scenes
│ │ │ │ │ │ │ ├── ActiveSpeakerScene.cs
│ │ │ │ │ │ │ ├── AutonomousScene.cs
│ │ │ │ │ │ │ ├── BreakoutRoomScene.cs
│ │ │ │ │ │ │ ├── GridScene.cs
│ │ │ │ │ │ │ ├── PollScene.cs
│ │ │ │ │ │ │ ├── PresenterScene.cs
│ │ │ │ │ │ │ ├── ScreenShareScene.cs
│ │ │ │ │ │ │ ├── TalkingStickScene.cs
│ │ │ │ │ │ │ └── WhiteboardScene.cs
│ │ │ │ │ │ ├── SceneState.cs
│ │ │ │ │ │ ├── SynchronizedScene.cs
│ │ │ │ │ │ ├── SynchronizedSceneProvider.cs
│ │ │ │ │ │ ├── UseCases
│ │ │ │ │ │ │ ├── FetchAvailableScenesUseCase.cs
│ │ │ │ │ │ │ ├── SetOverwrittenContentSceneUseCase.cs
│ │ │ │ │ │ │ ├── SetSceneUseCase.cs
│ │ │ │ │ │ │ └── UpdateScenesUseCase.cs
│ │ │ │ │ │ └── Utilities
│ │ │ │ │ │ ├── PatchSceneTransaction.cs
│ │ │ │ │ │ └── SceneUtilities.cs
│ │ │ │ │ ├── ServiceErrorCode.cs
│ │ │ │ │ ├── Synchronization
│ │ │ │ │ │ ├── Extensions
│ │ │ │ │ │ │ └── MediatorSyncObjExtensions.cs
│ │ │ │ │ │ ├── Gateways
│ │ │ │ │ │ │ ├── ISynchronizedObjectRepository.cs
│ │ │ │ │ │ │ └── ISynchronizedObjectSubscriptionsRepository.cs
│ │ │ │ │ │ ├── ISynchronizedObjectProvider.cs
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ ├── ParticipantJoinedNotificationHandler.cs
│ │ │ │ │ │ │ ├── ParticipantLeftNotificationHandler.cs
│ │ │ │ │ │ │ ├── SynchronizedObjectGarbageCollector.cs
│ │ │ │ │ │ │ └── UpdateSynchronizedSubscriptionsHandler.cs
│ │ │ │ │ │ ├── Notifications
│ │ │ │ │ │ │ ├── ParticipantSubscriptionsUpdatedNotification.cs
│ │ │ │ │ │ │ └── SynchronizedObjectUpdatedNotification.cs
│ │ │ │ │ │ ├── Requests
│ │ │ │ │ │ │ ├── ClearCacheRequest.cs
│ │ │ │ │ │ │ ├── FetchParticipantSubscriptionsRequest.cs
│ │ │ │ │ │ │ ├── FetchSubscribedParticipantsRequest.cs
│ │ │ │ │ │ │ ├── FetchSynchronizedObjectRequest.cs
│ │ │ │ │ │ │ ├── UpdateSubscriptionsRequest.cs
│ │ │ │ │ │ │ └── UpdateSynchronizedObjectRequest.cs
│ │ │ │ │ │ ├── SynchronizedObjectId.cs
│ │ │ │ │ │ ├── SynchronizedObjectProvider.cs
│ │ │ │ │ │ ├── SynchronizedObjectProviderForAll.cs
│ │ │ │ │ │ ├── SynchronizedObjectProviderForRoom.cs
│ │ │ │ │ │ ├── SynchronizedSubscriptions.cs
│ │ │ │ │ │ ├── SynchronizedSubscriptionsProvider.cs
│ │ │ │ │ │ ├── UseCases
│ │ │ │ │ │ │ ├── ClearCacheRequestHandler.cs
│ │ │ │ │ │ │ ├── FetchParticipantSubscriptionsUseCase.cs
│ │ │ │ │ │ │ ├── FetchSubscribedParticipantsUseCase.cs
│ │ │ │ │ │ │ ├── FetchSynchronizedObjectUseCase.cs
│ │ │ │ │ │ │ ├── UpdateSubscriptionsUseCase.cs
│ │ │ │ │ │ │ └── UpdateSynchronizedObjectUseCase.cs
│ │ │ │ │ │ └── Utilities
│ │ │ │ │ │ └── ConferenceSubscriptionHelper.cs
│ │ │ │ │ ├── SynchronizedObjectIds.cs
│ │ │ │ │ └── WhiteboardService
│ │ │ │ │ ├── Actions
│ │ │ │ │ │ ├── AddCanvasAction.cs
│ │ │ │ │ │ ├── DeleteCanvasAction.cs
│ │ │ │ │ │ ├── PanCanvasAction.cs
│ │ │ │ │ │ └── UpateCanvasAction.cs
│ │ │ │ │ ├── CanvasAction.cs
│ │ │ │ │ ├── CanvasData
│ │ │ │ │ │ ├── CanvasLine.cs
│ │ │ │ │ │ ├── CanvasObject.cs
│ │ │ │ │ │ ├── CanvasPath.cs
│ │ │ │ │ │ └── CanvasText.cs
│ │ │ │ │ ├── CanvasLiveAction.cs
│ │ │ │ │ ├── CanvasObjectRef.cs
│ │ │ │ │ ├── CanvasPoint.cs
│ │ │ │ │ ├── CanvasPushAction.cs
│ │ │ │ │ ├── Gateways
│ │ │ │ │ │ └── IWhiteboardRepository.cs
│ │ │ │ │ ├── ICanvasActionUtils.cs
│ │ │ │ │ ├── LiveActions
│ │ │ │ │ │ ├── DrawingLineCanvasLiveAction.cs
│ │ │ │ │ │ ├── EndCanvasLiveAction.cs
│ │ │ │ │ │ ├── FreeDrawingCanvasLiveAction.cs
│ │ │ │ │ │ ├── ModifyingCanvasLiveAction.cs
│ │ │ │ │ │ └── PanningCanvasLiveAction.cs
│ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ └── RoomsRemovedNotificationHandler.cs
│ │ │ │ │ ├── Notifications
│ │ │ │ │ │ └── LiveActionPushedNotification.cs
│ │ │ │ │ ├── ParticipantWhiteboardState.cs
│ │ │ │ │ ├── PushActions
│ │ │ │ │ │ ├── AddCanvasPushAction.cs
│ │ │ │ │ │ ├── DeleteCanvasPushAction.cs
│ │ │ │ │ │ ├── PanCanvasPushAction.cs
│ │ │ │ │ │ └── UpdateCanvasPushAction.cs
│ │ │ │ │ ├── Requests
│ │ │ │ │ │ ├── CreateWhiteboardRequest.cs
│ │ │ │ │ │ ├── DeleteWhiteboardRequest.cs
│ │ │ │ │ │ ├── PushActionRequest.cs
│ │ │ │ │ │ ├── PushLiveActionRequest.cs
│ │ │ │ │ │ ├── RedoRequest.cs
│ │ │ │ │ │ ├── UndoRequest.cs
│ │ │ │ │ │ ├── UpdateWhiteboardRequest.cs
│ │ │ │ │ │ └── UpdateWhiteboardSettingsRequest.cs
│ │ │ │ │ ├── Responses
│ │ │ │ │ │ └── WhiteboardUpdatedResponse.cs
│ │ │ │ │ ├── StoredCanvasObject.cs
│ │ │ │ │ ├── SynchronizedParticipantState.cs
│ │ │ │ │ ├── SynchronizedWhiteboardInfo.cs
│ │ │ │ │ ├── SynchronizedWhiteboards.cs
│ │ │ │ │ ├── SynchronizedWhiteboardsProvider.cs
│ │ │ │ │ ├── UseCases
│ │ │ │ │ │ ├── CreateWhiteboardUseCase.cs
│ │ │ │ │ │ ├── DeleteWhiteboardUseCase.cs
│ │ │ │ │ │ ├── PushActionUseCase.cs
│ │ │ │ │ │ ├── PushLiveActionUseCase.cs
│ │ │ │ │ │ ├── RedoUseCase.cs
│ │ │ │ │ │ ├── UndoUseCase.cs
│ │ │ │ │ │ ├── UpdateWhiteboardSettingsUseCase.cs
│ │ │ │ │ │ └── UpdateWhiteboardUseCase.cs
│ │ │ │ │ ├── Utilities
│ │ │ │ │ │ ├── RoomUtils.cs
│ │ │ │ │ │ └── WhiteboardUtils.cs
│ │ │ │ │ ├── VersionedAction.cs
│ │ │ │ │ ├── VersionedCanvasObject.cs
│ │ │ │ │ ├── WhiteboardCanvas.cs
│ │ │ │ │ ├── WhiteboardCanvasUpdate.cs
│ │ │ │ │ ├── Whiteboard.cs
│ │ │ │ │ ├── WhiteboardError.cs
│ │ │ │ │ ├── WhiteboardOptions.cs
│ │ │ │ │ └── WhiteboardSettings.cs
│ │ │ │ ├── Specifications
│ │ │ │ │ ├── ConferenceLinkByConference.cs
│ │ │ │ │ └── ConferenceLinkByParticipant.cs
│ │ │ │ ├── Strive.Core.csproj
│ │ │ │ └── Utilities
│ │ │ │ ├── CronYearParser.cs
│ │ │ │ ├── IndexUtils.cs
│ │ │ │ └── Memorized.cs
│ │ │ ├── Strive.Core.IntegrationTests
│ │ │ │ ├── Services
│ │ │ │ │ ├── Base
│ │ │ │ │ │ ├── ServiceIntegrationTest.cs
│ │ │ │ │ │ ├── TestData.cs
│ │ │ │ │ │ └── TestParticipantConnection.cs
│ │ │ │ │ ├── ChatTests.cs
│ │ │ │ │ ├── ConferenceControlTests.cs
│ │ │ │ │ ├── MediaTests.cs
│ │ │ │ │ ├── ParticipantsListTests.cs
│ │ │ │ │ ├── PermissionTests.cs
│ │ │ │ │ ├── RoomTests.cs
│ │ │ │ │ ├── SceneTalkingStickTests.cs
│ │ │ │ │ ├── SceneTests.cs
│ │ │ │ │ └── SynchronizationTests.cs
│ │ │ │ ├── Strive.Core.IntegrationTests.csproj
│ │ │ │ └── _TestHelpers
│ │ │ │ ├── SynchronizedObjectListener.cs
│ │ │ │ └── TestEqualityHelper.cs
│ │ │ ├── Strive.Core.Tests
│ │ │ │ ├── Extensions
│ │ │ │ │ ├── EnumerableExtensionsTests.cs
│ │ │ │ │ └── ObjectExtensionsTests.cs
│ │ │ │ ├── Services
│ │ │ │ │ ├── BreakoutRooms
│ │ │ │ │ │ ├── BreakoutRoomsPermissionLayerProviderTests.cs
│ │ │ │ │ │ ├── Internal
│ │ │ │ │ │ │ └── ApplyBreakoutRoomUseCaseTests.cs
│ │ │ │ │ │ ├── Naming
│ │ │ │ │ │ │ └── NatoRoomNamingStrategyTest.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── ChangeBreakoutRoomsUseCaseTests.cs
│ │ │ │ │ │ ├── CloseBreakoutRoomsUseCaseTests.cs
│ │ │ │ │ │ └── OpenBreakoutRoomsUseCaseTests.cs
│ │ │ │ │ ├── Chat
│ │ │ │ │ │ ├── Channels
│ │ │ │ │ │ │ └── ChannelSerializerTests.cs
│ │ │ │ │ │ ├── ChatChannelSelectorTests.cs
│ │ │ │ │ │ └── ParticipantTypingTimerTests.cs
│ │ │ │ │ ├── ConferenceControl
│ │ │ │ │ │ ├── ConferenceSchedulerTests.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── CloseConferenceHandlerTests.cs
│ │ │ │ │ │ ├── JoinConferenceRequestHandlerTests.cs
│ │ │ │ │ │ ├── KickParticipantHandlerTests.cs
│ │ │ │ │ │ └── OpenConferenceHandlerTests.cs
│ │ │ │ │ ├── ConferenceManagement
│ │ │ │ │ │ ├── ConferenceDataValidatorTests.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ └── PatchConferenceRequestHandlerTests.cs
│ │ │ │ │ ├── Equipment
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── AuthenticateEquipmentUseCaseTests.cs
│ │ │ │ │ │ ├── FetchEquipmentTokenUseCaseTests.cs
│ │ │ │ │ │ ├── InitializeEquipmentUseCaseTests.cs
│ │ │ │ │ │ ├── SendEquipmentCommandUseCaseTests.cs
│ │ │ │ │ │ └── UpdateStatusUseCaseTests.cs
│ │ │ │ │ ├── Media
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── ApplyMediaStateUseCaseTests.cs
│ │ │ │ │ │ └── FetchSfuConnectionInfoUseCaseTests.cs
│ │ │ │ │ ├── Permissions
│ │ │ │ │ │ ├── CachedPermissionStackTests.cs
│ │ │ │ │ │ ├── PermissionLayersAggregatorTests.cs
│ │ │ │ │ │ ├── PermissionsListUtilTests.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── FetchPermissionsHandlerTests.cs
│ │ │ │ │ │ ├── SetTemporaryPermissionHandlerTests.cs
│ │ │ │ │ │ └── UpdateParticipantsPermissionsHandlerTests.cs
│ │ │ │ │ ├── Poll
│ │ │ │ │ │ ├── SynchronizedPollResultProviderTests.cs
│ │ │ │ │ │ ├── Types
│ │ │ │ │ │ │ ├── MultipleChoice
│ │ │ │ │ │ │ │ ├── MultipleChoiceAggregatorTests.cs
│ │ │ │ │ │ │ │ └── MultipleChoiceAnswerValidatorTests.cs
│ │ │ │ │ │ │ ├── Numeric
│ │ │ │ │ │ │ │ └── NumericAnswerValidatorTests.cs
│ │ │ │ │ │ │ ├── SingleChoice
│ │ │ │ │ │ │ │ ├── SingleChoiceAggregatorTests.cs
│ │ │ │ │ │ │ │ └── SingleChoiceAnswerValidatorTests.cs
│ │ │ │ │ │ │ └── TagCloud
│ │ │ │ │ │ │ ├── Clustering
│ │ │ │ │ │ │ │ ├── NaiveClusterAlgorithmTests.cs
│ │ │ │ │ │ │ │ └── NormalizedLevenshteinDistanceTests.cs
│ │ │ │ │ │ │ ├── TagCloudAggregatorTests.cs
│ │ │ │ │ │ │ └── TagCloudAnswerValidatorTests.cs
│ │ │ │ │ │ ├── UseCase
│ │ │ │ │ │ │ ├── FetchParticipantPollsUseCaseTests.cs
│ │ │ │ │ │ │ └── SubmitAnswerUseCaseTests.cs
│ │ │ │ │ │ └── Utilities
│ │ │ │ │ │ ├── PollAnswerAggregatorWrapperTests.cs
│ │ │ │ │ │ └── PollAnswerValidatorWrapperTests.cs
│ │ │ │ │ ├── Rooms
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ └── ConferenceOpenedNotificationHandlerTests.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── CreateRoomsUseCaseTests.cs
│ │ │ │ │ │ ├── RemoveRoomsUseCaseTests.cs
│ │ │ │ │ │ └── SetParticipantRoomUseCaseTests.cs
│ │ │ │ │ ├── Scenes
│ │ │ │ │ │ ├── NotificationHandlers
│ │ │ │ │ │ │ └── SynchronizedObjectUpdatedNotificationHandlerTests.cs
│ │ │ │ │ │ ├── Providers
│ │ │ │ │ │ │ ├── AutonomousSceneProviderTests.cs
│ │ │ │ │ │ │ ├── BreakoutRoomSceneProviderTests.cs
│ │ │ │ │ │ │ ├── PresenterSceneProviderTests.cs
│ │ │ │ │ │ │ └── ScreenShareSceneProviderTests.cs
│ │ │ │ │ │ ├── UseCases
│ │ │ │ │ │ │ ├── FetchAvailableScenesUseCaseTests.cs
│ │ │ │ │ │ │ ├── SetOverwrittenContentSceneUseCase.cs
│ │ │ │ │ │ │ ├── SetSceneUseCaseTests.cs
│ │ │ │ │ │ │ └── UpdateScenesUseCaseTests.cs
│ │ │ │ │ │ └── Utilities
│ │ │ │ │ │ └── SceneUtilitiesTests.cs
│ │ │ │ │ ├── Synchronization
│ │ │ │ │ │ ├── SynchronizedObjectIdTests.cs
│ │ │ │ │ │ └── UseCases
│ │ │ │ │ │ ├── FetchSynchronizedObjectUseCaseTests.cs
│ │ │ │ │ │ ├── UpdateSubscriptionsUseCaseTests.cs
│ │ │ │ │ │ └── UpdateSynchronizedObjectUseCaseTests.cs
│ │ │ │ │ └── WhiteboardService
│ │ │ │ │ ├── ActionRequestTestBase.cs
│ │ │ │ │ ├── Actions
│ │ │ │ │ │ ├── AddCanvasActionTests.cs
│ │ │ │ │ │ ├── DeleteCanvasActionTests.cs
│ │ │ │ │ │ ├── PanCanvasActionTests.cs
│ │ │ │ │ │ └── UpdateCanvasActionTests.cs
│ │ │ │ │ └── UseCases
│ │ │ │ │ ├── CreateWhiteboardUseCaseTests.cs
│ │ │ │ │ ├── PushActionUseCaseTests.cs
│ │ │ │ │ ├── RedoUseCaseTests.cs
│ │ │ │ │ ├── UndoUseCaseTests.cs
│ │ │ │ │ └── UpdateWhiteboardUseCaseTests.cs
│ │ │ │ ├── Strive.Core.Tests.csproj
│ │ │ │ ├── _TestHelpers
│ │ │ │ │ ├── ConferenceManagementHelper.cs
│ │ │ │ │ ├── JoinedParticipantsRepositoryMock.cs
│ │ │ │ │ └── SynchronizedObjectMediatorExtensions.cs
│ │ │ │ └── Utilities
│ │ │ │ ├── CronYearParserTests.cs
│ │ │ │ ├── IndexUtilsTests.cs
│ │ │ │ └── MemorizedTests.cs
│ │ │ ├── Strive.Infrastructure
│ │ │ │ ├── Auth
│ │ │ │ │ └── TokenFactory.cs
│ │ │ │ ├── Data
│ │ │ │ │ ├── IMongoIndexBuilder.cs
│ │ │ │ │ ├── MongoDbOptions.cs
│ │ │ │ │ ├── MongoRepo.cs
│ │ │ │ │ └── Repos
│ │ │ │ │ ├── CachedConferenceRepo.cs
│ │ │ │ │ ├── ConferenceLinkRepo.cs
│ │ │ │ │ └── ConferenceRepo.cs
│ │ │ │ ├── Extensions
│ │ │ │ │ ├── StringExtensions.cs
│ │ │ │ │ └── UserExtensions.cs
│ │ │ │ ├── InfrastructureModule.cs
│ │ │ │ ├── KeyValue
│ │ │ │ │ ├── Abstractions
│ │ │ │ │ │ ├── IKeyValueDatabaseActions.cs
│ │ │ │ │ │ ├── IKeyValueDatabase.cs
│ │ │ │ │ │ └── IKeyValueDatabaseTransaction.cs
│ │ │ │ │ ├── DatabaseKeyBuilder.cs
│ │ │ │ │ ├── Extensions
│ │ │ │ │ │ └── KeyValueDatabaseExtensions.cs
│ │ │ │ │ ├── IKeyValueRepo.cs
│ │ │ │ │ ├── InMemory
│ │ │ │ │ │ ├── IInMemoryKeyLock.cs
│ │ │ │ │ │ ├── InMemoryAcquiredLock.cs
│ │ │ │ │ │ ├── InMemoryDatabaseActions.cs
│ │ │ │ │ │ ├── InMemoryDatabaseTransaction.cs
│ │ │ │ │ │ ├── InMemoryKeyLock.cs
│ │ │ │ │ │ ├── InMemoryKeyValueDatabase.cs
│ │ │ │ │ │ ├── InMemoryKeyValueData.cs
│ │ │ │ │ │ └── NoLockInMemoryDatabaseActions.cs
│ │ │ │ │ ├── KeyValueDatabaseOptions.cs
│ │ │ │ │ ├── KeyValueSerializer.cs
│ │ │ │ │ ├── Redis
│ │ │ │ │ │ ├── RedisAcquiredLockWrapper.cs
│ │ │ │ │ │ ├── RedisActions.cs
│ │ │ │ │ │ ├── RedisKeyValueDatabase.cs
│ │ │ │ │ │ ├── RedisTransaction.cs
│ │ │ │ │ │ └── Scripts
│ │ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipant.lua
│ │ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipantSafe.lua
│ │ │ │ │ │ ├── RedisScriptLoader.cs
│ │ │ │ │ │ └── RoomRepository_SetParticipantRoom.lua
│ │ │ │ │ └── Repos
│ │ │ │ │ ├── AggregatedPermissionRepository.cs
│ │ │ │ │ ├── BreakoutRoomRepository.cs
│ │ │ │ │ ├── ChatRepository.cs
│ │ │ │ │ ├── EquipmentConnectionRepository.cs
│ │ │ │ │ ├── EquipmentTokenRepository.cs
│ │ │ │ │ ├── JoinedParticipantsRepository.cs
│ │ │ │ │ ├── MediaStateRepository.cs
│ │ │ │ │ ├── OpenConferenceRepository.cs
│ │ │ │ │ ├── ParticipantMetadataRepository.cs
│ │ │ │ │ ├── PollRepository.cs
│ │ │ │ │ ├── RoomRepository.cs
│ │ │ │ │ ├── SceneRepository.cs
│ │ │ │ │ ├── ScenesTalkingStickRepository.cs
│ │ │ │ │ ├── SynchronizedObjectRepository.cs
│ │ │ │ │ ├── SynchronizedObjectSubscriptionsRepository.cs
│ │ │ │ │ ├── TemporaryPermissionRepository.cs
│ │ │ │ │ └── WhiteboardRepository.cs
│ │ │ │ ├── Scheduler
│ │ │ │ │ ├── IScheduledNotificationWrapper.cs
│ │ │ │ │ ├── MediatrNotificationConsumer.cs
│ │ │ │ │ └── ScheduledMediator.cs
│ │ │ │ ├── Serialization
│ │ │ │ │ ├── DictionaryStringKeyPreserveCasingConverter.cs
│ │ │ │ │ ├── ErrorConverter.cs
│ │ │ │ │ ├── JsonConfig.cs
│ │ │ │ │ └── JTokenBsonSerializer.cs
│ │ │ │ ├── Sfu
│ │ │ │ │ ├── JwtSfuAuthTokenFactory.cs
│ │ │ │ │ ├── SfuClaimTypes.cs
│ │ │ │ │ └── SfuJwtOptions.cs
│ │ │ │ ├── Strive.Infrastructure.csproj
│ │ │ │ └── Utilities
│ │ │ │ ├── CanvasActionUtils.cs
│ │ │ │ ├── CopyUtils.cs
│ │ │ │ ├── EmbeddedResourceUtils.cs
│ │ │ │ └── MongoConcurrencyExtensions.cs
│ │ │ ├── Strive.Infrastructure.Redis.Tests
│ │ │ │ ├── Redis
│ │ │ │ │ ├── JoinedParticipantsRepositoryTests.cs
│ │ │ │ │ ├── KeyValueDatabaseFactory.cs
│ │ │ │ │ ├── RoomRepositoryTests.cs
│ │ │ │ │ └── Scripts
│ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipant_Redis.cs
│ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipantSafe_Redis.cs
│ │ │ │ │ └── RoomRepository_SetParticipantRoom_Redis.cs
│ │ │ │ ├── RedisDbConnector.cs
│ │ │ │ └── Strive.Infrastructure.Redis.Tests.csproj
│ │ │ ├── Strive.Infrastructure.Tests
│ │ │ │ ├── Auth
│ │ │ │ │ └── TokenFactoryTests.cs
│ │ │ │ ├── Extensions
│ │ │ │ │ └── StringExtensionsTests.cs
│ │ │ │ ├── KeyValue
│ │ │ │ │ ├── InMemory
│ │ │ │ │ │ ├── InMemoryAcquiredLockTests.cs
│ │ │ │ │ │ ├── InMemoryKeyLockTests.cs
│ │ │ │ │ │ ├── InMemoryKeyValueDatabaseTests.cs
│ │ │ │ │ │ └── InMemoryTransactionTests.cs
│ │ │ │ │ └── Scripts
│ │ │ │ │ ├── Base
│ │ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipantSafe_Tests.cs
│ │ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipant_Tests.cs
│ │ │ │ │ │ └── RoomRepository_SetParticipantRoom_Tests.cs
│ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipant_InMemoryTests.cs
│ │ │ │ │ ├── JoinedParticipantsRepository_RemoveParticipantSafe_InMemoryTests.cs
│ │ │ │ │ ├── RedisScriptLoaderTests.cs
│ │ │ │ │ └── RoomRepository_SetParticipantRoom_InMemory.cs
│ │ │ │ ├── Serialization
│ │ │ │ │ └── JsonConfigTests.cs
│ │ │ │ ├── Sfu
│ │ │ │ │ └── JwtSfuAuthTokenFactoryTests.cs
│ │ │ │ ├── Strive.Infrastructure.Tests.csproj
│ │ │ │ └── Utilities
│ │ │ │ └── CopyUtilsTests.cs
│ │ │ ├── Strive.IntegrationTests
│ │ │ │ ├── appsettings.IntegrationTest.json
│ │ │ │ ├── Controllers
│ │ │ │ │ ├── ConferenceLinkTest.cs
│ │ │ │ │ ├── CreateConferenceTest.cs
│ │ │ │ │ ├── PatchConferenceTest.cs
│ │ │ │ │ └── SfuTest.cs
│ │ │ │ ├── CustomWebApplicationFactory.cs
│ │ │ │ ├── Extensions
│ │ │ │ │ ├── ConfigurationExtensions.cs
│ │ │ │ │ └── TaskExtensions.cs
│ │ │ │ ├── _Helpers
│ │ │ │ │ ├── IntegrationTestBase.cs
│ │ │ │ │ ├── JsonNetContent.cs
│ │ │ │ │ ├── MockJwtTokens.cs
│ │ │ │ │ ├── ServiceIntegrationTest.cs
│ │ │ │ │ ├── SynchronizedObjectListener.cs
│ │ │ │ │ └── WaitTimeoutExtensions.cs
│ │ │ │ ├── IntegrationTestCollection.cs
│ │ │ │ ├── Messaging
│ │ │ │ │ └── SFU
│ │ │ │ │ ├── _Helpers
│ │ │ │ │ │ └── SfuConferenceInfoEndpoint.cs
│ │ │ │ │ └── SfuMessagesTest.cs
│ │ │ │ ├── MongoDbFixture.cs
│ │ │ │ ├── Services
│ │ │ │ │ ├── BreakoutRoomTests.cs
│ │ │ │ │ ├── ChatTests.cs
│ │ │ │ │ ├── ConferenceControlTests.cs
│ │ │ │ │ ├── EquipmentTests.cs
│ │ │ │ │ ├── MediaTests.cs
│ │ │ │ │ ├── ParticipantsListTests.cs
│ │ │ │ │ ├── PermissionTests.cs
│ │ │ │ │ ├── PollTests.cs
│ │ │ │ │ ├── RoomTests.cs
│ │ │ │ │ ├── SceneTests.cs
│ │ │ │ │ ├── SynchronizedObjectTests.cs
│ │ │ │ │ └── WhiteboardTests.cs
│ │ │ │ └── Strive.IntegrationTests.csproj
│ │ │ ├── Strive.Tests
│ │ │ │ ├── Hubs
│ │ │ │ │ └── Core
│ │ │ │ │ └── Services
│ │ │ │ │ ├── Middlewares
│ │ │ │ │ │ ├── MiddlewareTestBase.cs
│ │ │ │ │ │ ├── ServiceInvokerChatVerifyCanSendToChatChannelTests.cs
│ │ │ │ │ │ ├── ServiceInvokerConferenceMiddlewareTests.cs
│ │ │ │ │ │ ├── ServiceInvokerPermissionMiddlewareTests.cs
│ │ │ │ │ │ ├── ServiceInvokerValidationMiddlewareTests.cs
│ │ │ │ │ │ └── ServiceInvokerVerifyMessageConformsOptionsTests.cs
│ │ │ │ │ └── ServiceRequestBuilderTests.cs
│ │ │ │ ├── Messaging
│ │ │ │ │ └── SFU
│ │ │ │ │ └── SfuConferenceInfoUpdateAggregatorTests.cs
│ │ │ │ └── Strive.Tests.csproj
│ │ │ └── Strive.Tests.Utils
│ │ │ ├── AssertHelper.cs
│ │ │ ├── MediatorNotificationCollector.cs
│ │ │ ├── MediatorTestUtils.cs
│ │ │ ├── Strive.Tests.Utils.csproj
│ │ │ └── TestOutputHelperUtils.cs
│ │ ├── Identity
│ │ │ └── Identity.API
│ │ │ ├── appsettings.json
│ │ │ ├── Config.cs
│ │ │ ├── Controllers
│ │ │ │ └── UserController.cs
│ │ │ ├── DemoUserProvider.cs
│ │ │ ├── Dockerfile
│ │ │ ├── Identity.API.csproj
│ │ │ ├── ProfileService.cs
│ │ │ ├── Program.cs
│ │ │ ├── Properties
│ │ │ │ └── launchSettings.json
│ │ │ ├── Quickstart
│ │ │ │ ├── Account
│ │ │ │ │ ├── AccountController.cs
│ │ │ │ │ ├── AccountOptions.cs
│ │ │ │ │ ├── LoggedOutViewModel.cs
│ │ │ │ │ ├── LoginInputModel.cs
│ │ │ │ │ ├── LoginViewModel.cs
│ │ │ │ │ ├── LogoutInputModel.cs
│ │ │ │ │ ├── LogoutViewModel.cs
│ │ │ │ │ └── RedirectViewModel.cs
│ │ │ │ ├── Extensions.cs
│ │ │ │ ├── Home
│ │ │ │ │ ├── ErrorViewModel.cs
│ │ │ │ │ └── HomeController.cs
│ │ │ │ ├── IUserProvider.cs
│ │ │ │ └── SecurityHeadersAttribute.cs
│ │ │ ├── Startup.cs
│ │ │ ├── Views
│ │ │ │ ├── Account
│ │ │ │ │ ├── AccessDenied.cshtml
│ │ │ │ │ ├── LoggedOut.cshtml
│ │ │ │ │ ├── Login.cshtml
│ │ │ │ │ └── Logout.cshtml
│ │ │ │ ├── Home
│ │ │ │ │ └── Index.cshtml
│ │ │ │ ├── Shared
│ │ │ │ │ ├── Error.cshtml
│ │ │ │ │ ├── _Layout.cshtml
│ │ │ │ │ ├── _Nav.cshtml
│ │ │ │ │ ├── Redirect.cshtml
│ │ │ │ │ └── _ValidationSummary.cshtml
│ │ │ │ ├── _ViewImports.cshtml
│ │ │ │ └── _ViewStart.cshtml
│ │ │ └── wwwroot
│ │ │ ├── css
│ │ │ │ ├── site.css
│ │ │ │ ├── site.min.css
│ │ │ │ └── site.scss
│ │ │ ├── duende-logo.svg
│ │ │ ├── favicon.ico
│ │ │ ├── js
│ │ │ │ ├── signin-redirect.js
│ │ │ │ └── signout-redirect.js
│ │ │ └── lib
│ │ │ ├── bootstrap
│ │ │ │ ├── dist
│ │ │ │ │ ├── css
│ │ │ │ │ │ ├── bootstrap.css
│ │ │ │ │ │ ├── bootstrap.css.map
│ │ │ │ │ │ ├── bootstrap-grid.css
│ │ │ │ │ │ ├── bootstrap-grid.css.map
│ │ │ │ │ │ ├── bootstrap-grid.min.css
│ │ │ │ │ │ ├── bootstrap-grid.min.css.map
│ │ │ │ │ │ ├── bootstrap.min.css
│ │ │ │ │ │ ├── bootstrap.min.css.map
│ │ │ │ │ │ ├── bootstrap-reboot.css
│ │ │ │ │ │ ├── bootstrap-reboot.css.map
│ │ │ │ │ │ ├── bootstrap-reboot.min.css
│ │ │ │ │ │ └── bootstrap-reboot.min.css.map
│ │ │ │ │ └── js
│ │ │ │ │ ├── bootstrap.bundle.js
│ │ │ │ │ ├── bootstrap.bundle.js.map
│ │ │ │ │ ├── bootstrap.bundle.min.js
│ │ │ │ │ ├── bootstrap.bundle.min.js.map
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── bootstrap.js.map
│ │ │ │ │ ├── bootstrap.min.js
│ │ │ │ │ └── bootstrap.min.js.map
│ │ │ │ ├── LICENSE
│ │ │ │ └── README.md
│ │ │ └── jquery
│ │ │ ├── dist
│ │ │ │ ├── jquery.js
│ │ │ │ ├── jquery.min.js
│ │ │ │ ├── jquery.min.map
│ │ │ │ ├── jquery.slim.js
│ │ │ │ ├── jquery.slim.min.js
│ │ │ │ └── jquery.slim.min.map
│ │ │ ├── LICENSE.txt
│ │ │ └── README.md
│ │ └── SFU
│ │ ├── Dockerfile
│ │ ├── package.json
│ │ ├── README.md
│ │ ├── src
│ │ │ ├── common-types.ts
│ │ │ ├── config.ts
│ │ │ ├── controllers.ts
│ │ │ ├── errors.ts
│ │ │ ├── index.ts
│ │ │ ├── lib
│ │ │ │ ├── conference
│ │ │ │ │ ├── conference-factory.ts
│ │ │ │ │ ├── conference-manager.ts
│ │ │ │ │ ├── conference-messenger.ts
│ │ │ │ │ ├── conference.ts
│ │ │ │ │ ├── pub-types.ts
│ │ │ │ │ ├── request-types.ts
│ │ │ │ │ ├── stream-info-repo.ts
│ │ │ │ │ └── sub-types.ts
│ │ │ │ ├── connection.ts
│ │ │ │ ├── media-soup
│ │ │ │ │ └── mediasoup-mixer.ts
│ │ │ │ ├── participant-permissions.ts
│ │ │ │ ├── participant.ts
│ │ │ │ ├── permissions.ts
│ │ │ │ ├── rooms
│ │ │ │ │ ├── loopback-manager.ts
│ │ │ │ │ ├── room-manager.ts
│ │ │ │ │ └── room.ts
│ │ │ │ ├── synchronization
│ │ │ │ │ ├── conference-management-client.ts
│ │ │ │ │ ├── conference-repository.ts
│ │ │ │ │ ├── message-types.ts
│ │ │ │ │ ├── pub-sub-messenger.ts
│ │ │ │ │ ├── rabbit-pub.ts
│ │ │ │ │ └── synchronized-conference.ts
│ │ │ │ └── types.ts
│ │ │ ├── media-soup-workers.ts
│ │ │ ├── rabbitmq
│ │ │ │ └── rabbit-mq-conn.ts
│ │ │ └── utils
│ │ │ ├── logger.ts
│ │ │ ├── map-utils.ts
│ │ │ └── promise-utils.ts
│ │ ├── test
│ │ │ └── lib
│ │ │ ├── conference
│ │ │ │ └── stream-info-repo.test.ts
│ │ │ ├── rooms
│ │ │ │ ├── loopback-manager.test.ts
│ │ │ │ ├── room-manager.test.ts
│ │ │ │ └── room.test.ts
│ │ │ ├── synchronization
│ │ │ │ ├── conference-management-client.test.ts
│ │ │ │ ├── conference-repository.test.ts
│ │ │ │ └── synchronized-conference.test.ts
│ │ │ └── utils
│ │ │ └── map-utils.test.ts
│ │ ├── tsconfig.json
│ │ └── yarn.lock
│ ├── Strive.sln
│ ├── Strive.sln.DotSettings
│ ├── Tests
│ │ └── e2e
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── example.json
│ │ │ ├── integration
│ │ │ │ ├── common.js
│ │ │ │ └── features
│ │ │ │ ├── breakout-room.js
│ │ │ │ ├── chat.js
│ │ │ │ ├── create-conference.js
│ │ │ │ ├── poll.js
│ │ │ │ └── webrtc.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ ├── commands.js
│ │ │ └── index.js
│ │ ├── cypress.json
│ │ ├── Dockerfile
│ │ ├── package.json
│ │ └── yarn.lock
│ ├── traefik.yml
│ └── Web
│ └── WebSPA
│ ├── AppSettings.cs
│ ├── appsettings.json
│ ├── Client
│ │ ├── package.json
│ │ ├── public
│ │ │ ├── favicon.ico
│ │ │ ├── index.css
│ │ │ ├── index.html
│ │ │ └── manifest.json
│ │ ├── README.md
│ │ ├── src
│ │ │ ├── App.tsx
│ │ │ ├── assets
│ │ │ │ ├── animated-icons
│ │ │ │ │ ├── AnimatedCamIcon.tsx
│ │ │ │ │ ├── AnimatedIconBase.tsx
│ │ │ │ │ ├── AnimatedMicIcon.tsx
│ │ │ │ │ └── AnimatedScreenIcon.tsx
│ │ │ │ ├── audio
│ │ │ │ │ ├── strive_conference_opened.mp3
│ │ │ │ │ └── test_audio_file.mp3
│ │ │ │ ├── locales
│ │ │ │ │ ├── de
│ │ │ │ │ │ ├── common.json
│ │ │ │ │ │ ├── errors.json
│ │ │ │ │ │ ├── glossary.json
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── main.json
│ │ │ │ │ └── en
│ │ │ │ │ ├── common.json
│ │ │ │ │ ├── errors.json
│ │ │ │ │ ├── glossary.json
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── main.json
│ │ │ │ └── stop_words
│ │ │ │ ├── stop_words_de.json
│ │ │ │ └── stop_words_en.json
│ │ │ ├── communication-types.ts
│ │ │ ├── components
│ │ │ │ ├── CompactInput.tsx
│ │ │ │ ├── ConsumerDiagnosticInfo.tsx
│ │ │ │ ├── CountdownRenderer.tsx
│ │ │ │ ├── ErrorWrapper.tsx
│ │ │ │ ├── FullscreenError.tsx
│ │ │ │ ├── IconHide.tsx
│ │ │ │ ├── MobileAwareSelect.tsx
│ │ │ │ ├── NativeIsoDateInput.tsx
│ │ │ │ ├── PopperWrapper.tsx
│ │ │ │ ├── RenderConsumerVideo.tsx
│ │ │ │ └── TwoLineFab.tsx
│ │ │ ├── config.ts
│ │ │ ├── consts.ts
│ │ │ ├── core-hub.ts
│ │ │ ├── core-hub.types.ts
│ │ │ ├── equipment-hub.ts
│ │ │ ├── equipment-hub.types.ts
│ │ │ ├── errors.ts
│ │ │ ├── features
│ │ │ │ ├── auth
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AuthCallback.tsx
│ │ │ │ │ │ ├── AuthenticatingComponent.tsx
│ │ │ │ │ │ ├── BaseAuthComponent.tsx
│ │ │ │ │ │ ├── NotAuthenticated.tsx
│ │ │ │ │ │ └── SessionLostComponent.tsx
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ └── selectors.ts
│ │ │ │ ├── breakout-rooms
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── BreakoutRoomsAssignments.tsx
│ │ │ │ │ │ ├── BreakoutRoomsDialog.tsx
│ │ │ │ │ │ ├── BreakoutRoomsForm.tsx
│ │ │ │ │ │ ├── CreateBreakoutRoomsDialog.tsx
│ │ │ │ │ │ └── UpdateBreakoutRoomsDialog.tsx
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── chat
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── channel-serializer.ts
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AnnouncementCard.tsx
│ │ │ │ │ │ ├── AnnouncementOverlay.tsx
│ │ │ │ │ │ ├── ChatBar.tsx
│ │ │ │ │ │ ├── ChatChannelTabs.tsx
│ │ │ │ │ │ ├── ChatMessageInput.tsx
│ │ │ │ │ │ ├── ChatMessageList.tsx
│ │ │ │ │ │ ├── ChatMessage.tsx
│ │ │ │ │ │ ├── Chat.tsx
│ │ │ │ │ │ ├── EmojisPopper.tsx
│ │ │ │ │ │ ├── NewChat.tsx
│ │ │ │ │ │ ├── NewMessagesIndicator.tsx
│ │ │ │ │ │ ├── ParticipantsTypingText.tsx
│ │ │ │ │ │ ├── ParticipantsTyping.tsx
│ │ │ │ │ │ ├── SendMessageForm.tsx
│ │ │ │ │ │ └── SendMessageOptions.tsx
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useBooleanThrottle.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── conference
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── appbar
│ │ │ │ │ │ │ ├── AppBarLogo.tsx
│ │ │ │ │ │ │ ├── BreakoutRoomChip.tsx
│ │ │ │ │ │ │ └── WebRtcStatusChip.tsx
│ │ │ │ │ │ ├── ClassConference.tsx
│ │ │ │ │ │ ├── ConferenceAppBar.tsx
│ │ │ │ │ │ ├── ConferenceConnecting.tsx
│ │ │ │ │ │ ├── conference-not-open
│ │ │ │ │ │ │ ├── ConferenceNotOpenLayout.tsx
│ │ │ │ │ │ │ ├── ConferenceNotOpenModerator.tsx
│ │ │ │ │ │ │ ├── ConferenceNotOpen.tsx
│ │ │ │ │ │ │ └── ConferenceOpenSound.ts
│ │ │ │ │ │ ├── ConferenceSidebar.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── MyConferencesList.tsx
│ │ │ │ │ │ ├── ParticipantContextMenuPopper.tsx
│ │ │ │ │ │ ├── ParticipantContextMenuTempPermissions.tsx
│ │ │ │ │ │ ├── ParticipantContextMenu.tsx
│ │ │ │ │ │ ├── ParticipantItem.tsx
│ │ │ │ │ │ ├── PermissionDialog.tsx
│ │ │ │ │ │ ├── PermissionsView.tsx
│ │ │ │ │ │ ├── RequestUserInteractionView.tsx
│ │ │ │ │ │ └── troubleshoot
│ │ │ │ │ │ ├── StatusChip.tsx
│ │ │ │ │ │ ├── TroubleshootAccordion.tsx
│ │ │ │ │ │ ├── troubleshoot-connection
│ │ │ │ │ │ │ ├── DetailedErrorStatus.tsx
│ │ │ │ │ │ │ ├── status-utils.ts
│ │ │ │ │ │ │ ├── TransportStats.tsx
│ │ │ │ │ │ │ └── useWebRtcHealth.ts
│ │ │ │ │ │ ├── TroubleshootConnection.tsx
│ │ │ │ │ │ ├── TroubleshootDiagnostics.tsx
│ │ │ │ │ │ ├── Troubleshooting.tsx
│ │ │ │ │ │ ├── TroubleshootLogging.tsx
│ │ │ │ │ │ ├── troubleshoot-microphone
│ │ │ │ │ │ │ ├── ActiveMicrophoneChip.tsx
│ │ │ │ │ │ │ ├── DetailedStatus.tsx
│ │ │ │ │ │ │ └── utilts.ts
│ │ │ │ │ │ ├── TroubleshootMicrophone.tsx
│ │ │ │ │ │ ├── TroubleshootSpeakers.tsx
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── conference-layout-context.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── create-conference
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── ConferenceControls.tsx
│ │ │ │ │ │ ├── ConferenceCreatedView.tsx
│ │ │ │ │ │ ├── CreateConferenceDialog.tsx
│ │ │ │ │ │ ├── CreateConferenceFormSkeleton.tsx
│ │ │ │ │ │ ├── CreateConferenceForm.tsx
│ │ │ │ │ │ ├── PermissionList.tsx
│ │ │ │ │ │ ├── SceneLayoutSelect.tsx
│ │ │ │ │ │ ├── TabCommon.tsx
│ │ │ │ │ │ ├── TabModerators.tsx
│ │ │ │ │ │ └── TabPermissions.tsx
│ │ │ │ │ ├── form.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── diagnostics
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── DiagnosticsView.tsx
│ │ │ │ │ │ └── DiagnosticsWindow.tsx
│ │ │ │ │ └── reducer.ts
│ │ │ │ ├── equipment
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AvailableEquipmentTable.tsx
│ │ │ │ │ │ ├── CommandHistory.tsx
│ │ │ │ │ │ ├── Equipment.tsx
│ │ │ │ │ │ └── RequestPermissions.tsx
│ │ │ │ │ ├── reducer.tsx
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── ua-utils.ts
│ │ │ │ ├── media
│ │ │ │ │ ├── AudioManager.ts
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── MediaControls.tsx
│ │ │ │ │ │ ├── MediaFab.tsx
│ │ │ │ │ │ ├── ParticipantMicManager.tsx
│ │ │ │ │ │ └── UserInteractionListener.tsx
│ │ │ │ │ ├── media-controls-context.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useDeviceManagement.ts
│ │ │ │ ├── poll
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── CurrentPollsBar.tsx
│ │ │ │ │ │ ├── OpenPollDialogForm.tsx
│ │ │ │ │ │ ├── OpenPollDialog.tsx
│ │ │ │ │ │ ├── PollCardResultsPopup.tsx
│ │ │ │ │ │ ├── PollCardResultSummary.tsx
│ │ │ │ │ │ ├── PollCardSubmitButton.tsx
│ │ │ │ │ │ ├── PollCard.tsx
│ │ │ │ │ │ ├── PollContextMenu.tsx
│ │ │ │ │ │ └── PollResultsView.tsx
│ │ │ │ │ ├── poll-presets.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ ├── types
│ │ │ │ │ │ ├── multiple-choice
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── MultipleChoiceAnswerForm.tsx
│ │ │ │ │ │ │ └── MultipleChoiceInstructionForm.tsx
│ │ │ │ │ │ ├── NivoTooltip.tsx
│ │ │ │ │ │ ├── numeric
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── NumericAnswerForm.tsx
│ │ │ │ │ │ │ ├── NumericInstructionForm.tsx
│ │ │ │ │ │ │ └── NumericPollResults.tsx
│ │ │ │ │ │ ├── register.ts
│ │ │ │ │ │ ├── single-choice
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── SelectionPollResults.tsx
│ │ │ │ │ │ │ ├── SingleChoiceAnswerForm.tsx
│ │ │ │ │ │ │ └── SingleChoiceInstructionForm.tsx
│ │ │ │ │ │ ├── tag-cloud
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── TagCloudAnswerForm.tsx
│ │ │ │ │ │ │ ├── TagCloudForm.tsx
│ │ │ │ │ │ │ └── TagCloudResults.tsx
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── rooms
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── RoomHeader.tsx
│ │ │ │ │ │ └── RoomsList.tsx
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── scenes
│ │ │ │ │ ├── allow-overwrite-hoc.tsx
│ │ │ │ │ ├── calculations.ts
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── ActiveChipsLayout.tsx
│ │ │ │ │ │ ├── ActiveParticipantsChips.tsx
│ │ │ │ │ │ ├── activeSpeaker
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── RenderActiveSpeaker.tsx
│ │ │ │ │ │ ├── autonomous
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── RenderAutonomous.tsx
│ │ │ │ │ │ ├── AutoSceneLayout.tsx
│ │ │ │ │ │ ├── breakoutRoom
│ │ │ │ │ │ │ ├── BreakoutRoomListItem.tsx
│ │ │ │ │ │ │ ├── BreakoutRoomsPopper.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── OpenBreakoutRoomsItem.tsx
│ │ │ │ │ │ │ └── RenderBreakoutRoom.tsx
│ │ │ │ │ │ ├── grid
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── ParticipantsGrid.tsx
│ │ │ │ │ │ │ └── RenderGrid.tsx
│ │ │ │ │ │ ├── ParticipantChips.tsx
│ │ │ │ │ │ ├── ParticipantInfoChip.tsx
│ │ │ │ │ │ ├── ParticipantTileLabel.tsx
│ │ │ │ │ │ ├── ParticipantTile.tsx
│ │ │ │ │ │ ├── poll
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── PollActionItem.tsx
│ │ │ │ │ │ │ ├── PollListItem.tsx
│ │ │ │ │ │ │ ├── PollOptionsPopper.tsx
│ │ │ │ │ │ │ └── RenderPollScene.tsx
│ │ │ │ │ │ ├── presenter
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── RenderPresenter.tsx
│ │ │ │ │ │ ├── SceneLayout.tsx
│ │ │ │ │ │ ├── SceneListItem.tsx
│ │ │ │ │ │ ├── SceneListItemWithPopper.tsx
│ │ │ │ │ │ ├── SceneManagementModeSelectionDialog.tsx
│ │ │ │ │ │ ├── SceneManagement.tsx
│ │ │ │ │ │ ├── SceneSelector.tsx
│ │ │ │ │ │ ├── SceneView.tsx
│ │ │ │ │ │ ├── screenShare
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ └── ScreenShare.tsx
│ │ │ │ │ │ ├── talkingStick
│ │ │ │ │ │ │ ├── AddToListFab.tsx
│ │ │ │ │ │ │ ├── FrameWithPassFab.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── ModeSceneListItem.tsx
│ │ │ │ │ │ │ ├── PassStickFab.tsx
│ │ │ │ │ │ │ ├── PassStickList.tsx
│ │ │ │ │ │ │ ├── RenderTalkingStick.tsx
│ │ │ │ │ │ │ ├── TalkingStickFrame.tsx
│ │ │ │ │ │ │ ├── TalkingStickQueue.tsx
│ │ │ │ │ │ │ ├── TalkingStickRace.tsx
│ │ │ │ │ │ │ ├── TalkingStickScreen.tsx
│ │ │ │ │ │ │ └── TalkingStickSpeakerPassingStick.tsx
│ │ │ │ │ │ ├── TileFrameGridTop.tsx
│ │ │ │ │ │ ├── TilesBarLayoutRow.tsx
│ │ │ │ │ │ ├── TilesBarLayout.tsx
│ │ │ │ │ │ └── whiteboard
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── RenderWhiteboard.tsx
│ │ │ │ │ │ ├── WhiteboardActionItem.tsx
│ │ │ │ │ │ ├── WhiteboardListItem.tsx
│ │ │ │ │ │ └── WhiteboardOptionsPopper.tsx
│ │ │ │ │ ├── layout-child-size-context.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── scene-presenter-registry.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ ├── tile-frame-calculations.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useSomeParticipants.tsx
│ │ │ │ ├── settings
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── About.tsx
│ │ │ │ │ │ ├── AudioRecorderTest.tsx
│ │ │ │ │ │ ├── AudioSettingsTest.tsx
│ │ │ │ │ │ ├── AudioSettings.tsx
│ │ │ │ │ │ ├── CommonSettings.tsx
│ │ │ │ │ │ ├── DeviceSelector.tsx
│ │ │ │ │ │ ├── EquipmentSettings.tsx
│ │ │ │ │ │ ├── ScreenSettings.tsx
│ │ │ │ │ │ ├── SettingsDialog.tsx
│ │ │ │ │ │ ├── Settings.tsx
│ │ │ │ │ │ ├── WebcamSettingsTest.tsx
│ │ │ │ │ │ └── WebcamSettings.tsx
│ │ │ │ │ ├── reducer.tsx
│ │ │ │ │ ├── sagas.ts
│ │ │ │ │ ├── selectors.tsx
│ │ │ │ │ ├── thunks.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ └── whiteboard
│ │ │ │ ├── components
│ │ │ │ │ ├── ClearWhiteboardButton.tsx
│ │ │ │ │ ├── ColorIcon.tsx
│ │ │ │ │ ├── FontSizeTool.tsx
│ │ │ │ │ ├── LineWidthTool.tsx
│ │ │ │ │ ├── ToolColorPicker.tsx
│ │ │ │ │ ├── ToolIcon.tsx
│ │ │ │ │ ├── ToolPopper.tsx
│ │ │ │ │ ├── ToolsContainer.tsx
│ │ │ │ │ └── Whiteboard.tsx
│ │ │ │ ├── fabric-style.ts
│ │ │ │ ├── fabric-utils.ts
│ │ │ │ ├── live-update-handler.ts
│ │ │ │ ├── path-cache.ts
│ │ │ │ ├── path-compression.ts
│ │ │ │ ├── reducer.ts
│ │ │ │ ├── selectors.ts
│ │ │ │ ├── tools
│ │ │ │ │ ├── LineTool.ts
│ │ │ │ │ ├── NoTool.ts
│ │ │ │ │ ├── PanTool.ts
│ │ │ │ │ ├── PencilTool.ts
│ │ │ │ │ ├── SelectTool.ts
│ │ │ │ │ └── TextTool.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── whiteboard-controller.ts
│ │ │ │ └── whiteboard-tool.ts
│ │ │ ├── hooks
│ │ │ │ ├── useBottomScrollTrigger.ts
│ │ │ │ ├── useConsumerMediaStream.ts
│ │ │ │ ├── useMediaStreamMotionAudioLevel.ts
│ │ │ │ ├── useMyParticipantId.ts
│ │ │ │ ├── usePageTitle.ts
│ │ │ │ ├── usePermission.ts
│ │ │ │ ├── useSelectorFactory.ts
│ │ │ │ ├── useStriveSound.ts
│ │ │ │ ├── useThrottledResizeObserver.ts
│ │ │ │ └── useUpdateDeviceLabelsAutomatically.ts
│ │ │ ├── index.tsx
│ │ │ ├── permissions.ts
│ │ │ ├── react-app-env.d.ts
│ │ │ ├── RedirectToConference.tsx
│ │ │ ├── routes
│ │ │ │ ├── AuthenticatedRoutes.tsx
│ │ │ │ ├── ConferenceRoute.tsx
│ │ │ │ ├── EquipmentRoute.tsx
│ │ │ │ ├── MainRoute.tsx
│ │ │ │ └── types.ts
│ │ │ ├── services
│ │ │ │ ├── api
│ │ │ │ │ ├── conference-link.ts
│ │ │ │ │ ├── conference.ts
│ │ │ │ │ └── user.ts
│ │ │ │ ├── i18n.ts
│ │ │ │ └── types.d.ts
│ │ │ ├── serviceWorker.ts
│ │ │ ├── store
│ │ │ │ ├── index.ts
│ │ │ │ ├── notifier
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── create-middleware.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── root-reducer.ts
│ │ │ │ ├── root-saga.ts
│ │ │ │ ├── saga-utils.ts
│ │ │ │ ├── signal
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── app-hub-connection.ts
│ │ │ │ │ ├── create-middleware.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── synchronization
│ │ │ │ │ │ ├── synchronized-object-ids.ts
│ │ │ │ │ │ ├── synchronized-object-id.test.ts
│ │ │ │ │ │ ├── synchronized-object-id.ts
│ │ │ │ │ │ ├── synchronized-property.test.ts
│ │ │ │ │ │ └── synchronized-property.ts
│ │ │ │ │ ├── synchronized-object.test.ts
│ │ │ │ │ ├── synchronized-object.ts
│ │ │ │ │ ├── types.d.ts
│ │ │ │ │ └── useSignalRHub.ts
│ │ │ │ ├── webrtc
│ │ │ │ │ ├── consumer-manager.ts
│ │ │ │ │ ├── consumer-usage-control.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── useConsumerStatusInfo.ts
│ │ │ │ │ │ ├── useConsumer.ts
│ │ │ │ │ │ ├── useMedia.ts
│ │ │ │ │ │ ├── useMicrophone.ts
│ │ │ │ │ │ ├── useScreen.ts
│ │ │ │ │ │ ├── useWebcam.ts
│ │ │ │ │ │ ├── useWebRtcStatus.ts
│ │ │ │ │ │ └── useWebRtc.ts
│ │ │ │ │ ├── sfu-client.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── utils.ts
│ │ │ │ │ ├── WebRtcConnection.ts
│ │ │ │ │ ├── WebRtcContext.ts
│ │ │ │ │ └── WebRtcManager.ts
│ │ │ │ └── WebStore.ts
│ │ │ ├── types.ts
│ │ │ ├── ui-errors.ts
│ │ │ └── utils
│ │ │ ├── array-utils.ts
│ │ │ ├── browser-info.ts
│ │ │ ├── color-utils.ts
│ │ │ ├── error-result.ts
│ │ │ ├── error-utils.ts
│ │ │ ├── object-merge.test.ts
│ │ │ ├── object-merge.ts
│ │ │ ├── obj-utils.ts
│ │ │ ├── promise-utils.ts
│ │ │ ├── reat-hook-form-utils.ts
│ │ │ ├── reselect.ts
│ │ │ ├── signalr-utils.ts
│ │ │ ├── string-utils.ts
│ │ │ ├── token-helpers.ts
│ │ │ └── to.tsx
│ │ ├── tsconfig.json
│ │ └── yarn.lock
│ ├── Controllers
│ │ └── ConfigController.cs
│ ├── Dockerfile
│ ├── language.props
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── readme.md
│ ├── Startup.cs
│ ├── Utils
│ │ └── JavaScriptResult.cs
│ └── WebSPA.csproj
├── styleguide.md
└── yarn.lock
380 directories, 1404 files
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论