refactor: stricter domain: voice-connection
This commit is contained in:
@@ -23,7 +23,7 @@ import { ScreenShareFacade } from '../../application/facades/screen-share.facade
|
||||
import { selectOnlineUsers } from '../../../../store/users/users.selectors';
|
||||
import { User } from '../../../../shared-kernel';
|
||||
import { DEFAULT_VOLUME } from '../../../../core/constants';
|
||||
import { VoicePlaybackService } from '../../../../domains/voice-connection/application/voice-playback.service';
|
||||
import { VoicePlaybackService } from '../../../../domains/voice-connection';
|
||||
|
||||
@Component({
|
||||
selector: 'app-screen-share-viewer',
|
||||
|
||||
@@ -7,12 +7,15 @@ Bridges the application layer to the low-level realtime infrastructure for voice
|
||||
```
|
||||
voice-connection/
|
||||
├── application/
|
||||
│ ├── voice-connection.facade.ts Proxy to RealtimeSessionFacade for voice and camera signals/methods
|
||||
│ ├── facades/
|
||||
│ │ └── voice-connection.facade.ts Proxy to RealtimeSessionFacade for voice and camera signals/methods
|
||||
│ └── services/
|
||||
│ ├── voice-activity.service.ts RMS-based speaking detection via AnalyserNode (per-user signals)
|
||||
│ └── voice-playback.service.ts Per-peer GainNode chain, 0-200% volume, deafen support
|
||||
│
|
||||
├── domain/
|
||||
│ └── voice-connection.models.ts Re-exports LatencyProfile, VoiceStateSnapshot from shared-kernel / realtime
|
||||
│ └── models/
|
||||
│ └── voice-connection.model.ts Re-exports LatencyProfile, VoiceStateSnapshot from shared-kernel / realtime
|
||||
│
|
||||
└── index.ts Barrel exports
|
||||
```
|
||||
@@ -31,11 +34,11 @@ graph TD
|
||||
VAS --> VCF
|
||||
VPS --> VCF
|
||||
|
||||
click VCF "application/voice-connection.facade.ts" "Proxy to RealtimeSessionFacade" _blank
|
||||
click VAS "application/voice-activity.service.ts" "RMS-based speaking detection" _blank
|
||||
click VPS "application/voice-playback.service.ts" "Per-peer GainNode volume chain" _blank
|
||||
click VCF "application/facades/voice-connection.facade.ts" "Proxy to RealtimeSessionFacade" _blank
|
||||
click VAS "application/services/voice-activity.service.ts" "RMS-based speaking detection" _blank
|
||||
click VPS "application/services/voice-playback.service.ts" "Per-peer GainNode volume chain" _blank
|
||||
click RSF "../../infrastructure/realtime/realtime-session.service.ts" "Low-level WebRTC composition root" _blank
|
||||
click Models "domain/voice-connection.models.ts" "Re-exported types" _blank
|
||||
click Models "domain/models/voice-connection.model.ts" "Re-exported types" _blank
|
||||
```
|
||||
|
||||
## Voice connection facade
|
||||
@@ -67,8 +70,8 @@ graph LR
|
||||
RMS -- yes --> Speaking[speakingSignal = true]
|
||||
RMS -- no, 8 frames --> Silent[speakingSignal = false]
|
||||
|
||||
click Stream "application/voice-activity.service.ts" "VoiceActivityService.trackStream()" _blank
|
||||
click Poll "application/voice-activity.service.ts" "VoiceActivityService.poll()" _blank
|
||||
click Stream "application/services/voice-activity.service.ts" "VoiceActivityService.trackStream()" _blank
|
||||
click Poll "application/services/voice-activity.service.ts" "VoiceActivityService.poll()" _blank
|
||||
```
|
||||
|
||||
| Parameter | Value |
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Injectable, inject } from '@angular/core';
|
||||
import { ChatEvent } from '../../../shared-kernel';
|
||||
import { RealtimeSessionFacade } from '../../../core/realtime';
|
||||
import { LatencyProfile } from '../domain/voice-connection.models';
|
||||
import { ChatEvent } from '../../../../shared-kernel';
|
||||
import { RealtimeSessionFacade } from '../../../../core/realtime';
|
||||
import { LatencyProfile } from '../../domain/models/voice-connection.model';
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class VoiceConnectionFacade {
|
||||
@@ -25,8 +25,8 @@ import {
|
||||
Signal
|
||||
} from '@angular/core';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { VoiceConnectionFacade } from './voice-connection.facade';
|
||||
import { DebuggingService } from '../../../core/services/debugging.service';
|
||||
import { VoiceConnectionFacade } from '../facades/voice-connection.facade';
|
||||
import { DebuggingService } from '../../../../core/services/debugging.service';
|
||||
/* eslint-disable @typescript-eslint/member-ordering, @typescript-eslint/prefer-for-of, max-statements-per-line */
|
||||
|
||||
const SPEAKING_THRESHOLD = 0.015;
|
||||
@@ -4,11 +4,11 @@ import {
|
||||
inject
|
||||
} from '@angular/core';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { STORAGE_KEY_USER_VOLUMES } from '../../../core/constants';
|
||||
import { ScreenShareFacade } from '../../../domains/screen-share';
|
||||
import { User } from '../../../shared-kernel';
|
||||
import { selectAllUsers, selectCurrentUser } from '../../../store/users/users.selectors';
|
||||
import { VoiceConnectionFacade } from './voice-connection.facade';
|
||||
import { STORAGE_KEY_USER_VOLUMES } from '../../../../core/constants';
|
||||
import { ScreenShareFacade } from '../../../../domains/screen-share';
|
||||
import { User } from '../../../../shared-kernel';
|
||||
import { selectAllUsers, selectCurrentUser } from '../../../../store/users/users.selectors';
|
||||
import { VoiceConnectionFacade } from '../facades/voice-connection.facade';
|
||||
|
||||
export interface PlaybackOptions {
|
||||
isConnected: boolean;
|
||||
@@ -0,0 +1,3 @@
|
||||
export { LATENCY_PROFILE_BITRATES } from '../../../../infrastructure/realtime/realtime.constants';
|
||||
export type { LatencyProfile } from '../../../../shared-kernel';
|
||||
export type { VoiceStateSnapshot } from '../../../../infrastructure/realtime/realtime.types';
|
||||
@@ -1,3 +0,0 @@
|
||||
export { LATENCY_PROFILE_BITRATES } from '../../../infrastructure/realtime/realtime.constants';
|
||||
export type { LatencyProfile } from '../../../shared-kernel';
|
||||
export type { VoiceStateSnapshot } from '../../../infrastructure/realtime/realtime.types';
|
||||
@@ -1,4 +1,4 @@
|
||||
export * from './application/voice-connection.facade';
|
||||
export * from './application/voice-activity.service';
|
||||
export * from './application/voice-playback.service';
|
||||
export * from './domain/voice-connection.models';
|
||||
export * from './application/facades/voice-connection.facade';
|
||||
export * from './application/services/voice-activity.service';
|
||||
export * from './application/services/voice-playback.service';
|
||||
export * from './domain/models/voice-connection.model';
|
||||
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
import { VoiceSessionFacade } from '../../application/voice-session.facade';
|
||||
import { loadVoiceSettingsFromStorage, saveVoiceSettingsToStorage } from '../../infrastructure/voice-settings.storage';
|
||||
import { VoiceConnectionFacade } from '../../../../domains/voice-connection';
|
||||
import { VoicePlaybackService } from '../../../../domains/voice-connection/application/voice-playback.service';
|
||||
import { VoicePlaybackService } from '../../../../domains/voice-connection';
|
||||
import { ScreenShareFacade, ScreenShareQuality } from '../../../../domains/screen-share';
|
||||
import { UsersActions } from '../../../../store/users/users.actions';
|
||||
import { selectCurrentUser } from '../../../../store/users/users.selectors';
|
||||
|
||||
@@ -25,7 +25,7 @@ import {
|
||||
import { VoiceSessionFacade } from '../../application/voice-session.facade';
|
||||
import { loadVoiceSettingsFromStorage, saveVoiceSettingsToStorage } from '../../infrastructure/voice-settings.storage';
|
||||
import { VoiceActivityService, VoiceConnectionFacade } from '../../../../domains/voice-connection';
|
||||
import { PlaybackOptions, VoicePlaybackService } from '../../../../domains/voice-connection/application/voice-playback.service';
|
||||
import { PlaybackOptions, VoicePlaybackService } from '../../../../domains/voice-connection';
|
||||
import { ScreenShareFacade, ScreenShareQuality } from '../../../../domains/screen-share';
|
||||
import { UsersActions } from '../../../../store/users/users.actions';
|
||||
import { selectCurrentUser } from '../../../../store/users/users.selectors';
|
||||
|
||||
@@ -37,7 +37,7 @@ import { ScreenShareFacade } from '../../../domains/screen-share';
|
||||
import { NotificationsFacade } from '../../../domains/notifications';
|
||||
import { VoiceActivityService, VoiceConnectionFacade } from '../../../domains/voice-connection';
|
||||
import { VoiceSessionFacade, VoiceWorkspaceService } from '../../../domains/voice-session';
|
||||
import { VoicePlaybackService } from '../../../domains/voice-connection/application/voice-playback.service';
|
||||
import { VoicePlaybackService } from '../../../domains/voice-connection';
|
||||
import { VoiceControlsComponent } from '../../../domains/voice-session/feature/voice-controls/voice-controls.component';
|
||||
import { isChannelNameTaken, normalizeChannelName } from '../../../store/rooms/room-channels.rules';
|
||||
import {
|
||||
|
||||
@@ -21,7 +21,7 @@ import { ElectronBridgeService } from '../../../../core/platform/electron/electr
|
||||
import { VoiceConnectionFacade } from '../../../../domains/voice-connection';
|
||||
import { SCREEN_SHARE_QUALITY_OPTIONS, ScreenShareQuality } from '../../../../domains/screen-share';
|
||||
import { loadVoiceSettingsFromStorage, saveVoiceSettingsToStorage } from '../../../../domains/voice-session';
|
||||
import { VoicePlaybackService } from '../../../../domains/voice-connection/application/voice-playback.service';
|
||||
import { VoicePlaybackService } from '../../../../domains/voice-connection';
|
||||
import { NotificationAudioService, AppSound } from '../../../../core/services/notification-audio.service';
|
||||
import { PlatformService } from '../../../../core/platform';
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import {
|
||||
} from '@angular/core';
|
||||
import { NgIcon, provideIcons } from '@ng-icons/core';
|
||||
import { lucideVolume2, lucideVolumeX } from '@ng-icons/lucide';
|
||||
import { VoicePlaybackService } from '../../../domains/voice-connection/application/voice-playback.service';
|
||||
import { VoicePlaybackService } from '../../../domains/voice-connection';
|
||||
import { ContextMenuComponent } from '../context-menu/context-menu.component';
|
||||
|
||||
@Component({
|
||||
|
||||
Reference in New Issue
Block a user