feat: Add webcam basic support

This commit is contained in:
2026-03-30 03:10:44 +02:00
parent 727059fb52
commit b7d4bf20e3
40 changed files with 1042 additions and 296 deletions

View File

@@ -1,6 +1,8 @@
# Screen Share Domain
Manages screen sharing sessions, source selection (Electron), quality presets, and the viewer/workspace UI. Like `voice-connection`, the actual WebRTC track distribution lives in `infrastructure/realtime`; this domain provides the application-facing API and UI components.
Manages screen sharing sessions, source selection (Electron), quality presets, and screen-share-specific UI. Like `voice-connection`, the actual WebRTC track distribution lives in `infrastructure/realtime`; this domain provides the application-facing API for display-media capture and playback.
The mixed live-stream workspace is intentionally not part of this domain. It lives in `features/room/voice-workspace` because it composes screen share, voice-session, voice-connection, and camera state in one shell.
## Module map
@@ -14,12 +16,9 @@ screen-share/
│ └── screen-share.config.ts Quality presets and types (re-exported from shared-kernel)
├── feature/
│ ├── screen-share-viewer/ Single-stream video player with fullscreen + volume
── screen-share-workspace/ Multi-stream grid workspace
── screen-share-workspace.component.ts Grid layout, featured/thumbnail streams, mini-window mode
│ ├── screen-share-stream-tile.component.ts Individual stream tile with fullscreen/volume controls
│ ├── screen-share-playback.service.ts Per-user mute/volume state for screen share audio
│ └── screen-share-workspace.models.ts ScreenShareWorkspaceStreamItem
│ ├── screen-share-quality-dialog/ Quality preset picker before capture
── screen-share-source-picker/ Electron source selection dialog
── screen-share-viewer/ Single-stream video player with fullscreen + volume
└── index.ts Barrel exports
```
@@ -33,24 +32,18 @@ graph TD
RSF[RealtimeSessionFacade]
Config[screen-share.config]
Viewer[ScreenShareViewerComponent]
Workspace[ScreenShareWorkspaceComponent]
Tile[ScreenShareStreamTileComponent]
Playback[ScreenSharePlaybackService]
Workspace[VoiceWorkspaceComponent]
SSF --> RSF
Viewer --> SSF
Workspace --> SSF
Workspace --> Playback
Workspace --> Tile
Picker --> Config
click SSF "application/screen-share.facade.ts" "Proxy to RealtimeSessionFacade" _blank
click Picker "application/screen-share-source-picker.service.ts" "Electron source picker" _blank
click RSF "../../infrastructure/realtime/realtime-session.service.ts" "Low-level WebRTC composition root" _blank
click Viewer "feature/screen-share-viewer/screen-share-viewer.component.ts" "Single-stream player" _blank
click Workspace "feature/screen-share-workspace/screen-share-workspace.component.ts" "Multi-stream workspace" _blank
click Tile "feature/screen-share-workspace/screen-share-stream-tile.component.ts" "Stream tile" _blank
click Playback "feature/screen-share-workspace/screen-share-playback.service.ts" "Per-user volume state" _blank
click Workspace "../../features/room/voice-workspace/voice-workspace.component.ts" "Room-level live stream workspace" _blank
click Config "domain/screen-share.config.ts" "Quality presets" _blank
```
@@ -110,28 +103,6 @@ The quality dialog can be shown before each share (`askScreenShareQuality` setti
- Focus events from other components via a `viewer:focus` custom DOM event
- Auto-stop when the watched user stops sharing or the stream's video tracks end
## Workspace component
## Voice workspace integration
`ScreenShareWorkspaceComponent` is the multi-stream grid view inside the voice workspace panel. It handles:
- Listing all active screen shares (local + remote) sorted with remote first
- Featured/widescreen mode for a single focused stream with thumbnail sidebar
- Mini-window mode (draggable, position-clamped to viewport)
- Auto-hide header chrome in widescreen mode (2.2 s timeout, revealed on pointer move)
- On-demand remote stream requests via `syncRemoteScreenShareRequests`
- Per-stream volume and mute via `ScreenSharePlaybackService`
- Voice controls (mute, deafen, disconnect, share toggle) integrated into the workspace header
```mermaid
stateDiagram-v2
[*] --> Hidden
Hidden --> Expanded: open()
Expanded --> GridView: multiple shares, no focus
Expanded --> WidescreenView: single share or focused stream
WidescreenView --> GridView: showAllStreams()
GridView --> WidescreenView: focusShare(peerKey)
Expanded --> Minimized: minimize()
Minimized --> Expanded: restore()
Expanded --> Hidden: close()
Minimized --> Hidden: close()
```
`VoiceWorkspaceComponent` in `features/room/voice-workspace` is the multi-stream grid view inside the room shell. It consumes `ScreenShareFacade` for display-media capture and on-demand remote screen-share requests, but it is not part of this domain because it also owns camera presentation and voice-session controls.