From 7a0664b3c4e3776792b07449cf4fbddef086adb2 Mon Sep 17 00:00:00 2001 From: Myx Date: Sat, 11 Apr 2026 15:08:04 +0200 Subject: [PATCH] refactor: stricter domain: voice-connection --- .../screen-share-viewer.component.ts | 2 +- .../app/domains/voice-connection/README.md | 23 +++++++++++-------- .../{ => facades}/voice-connection.facade.ts | 6 ++--- .../{ => services}/voice-activity.service.ts | 4 ++-- .../{ => services}/voice-playback.service.ts | 10 ++++---- .../domain/models/voice-connection.model.ts | 3 +++ .../domain/voice-connection.models.ts | 3 --- .../src/app/domains/voice-connection/index.ts | 8 +++---- .../floating-voice-controls.component.ts | 2 +- .../voice-controls.component.ts | 2 +- .../rooms-side-panel.component.ts | 2 +- .../voice-settings.component.ts | 2 +- .../user-volume-menu.component.ts | 2 +- 13 files changed, 36 insertions(+), 33 deletions(-) rename toju-app/src/app/domains/voice-connection/application/{ => facades}/voice-connection.facade.ts (94%) rename toju-app/src/app/domains/voice-connection/application/{ => services}/voice-activity.service.ts (97%) rename toju-app/src/app/domains/voice-connection/application/{ => services}/voice-playback.service.ts (97%) create mode 100644 toju-app/src/app/domains/voice-connection/domain/models/voice-connection.model.ts delete mode 100644 toju-app/src/app/domains/voice-connection/domain/voice-connection.models.ts diff --git a/toju-app/src/app/domains/screen-share/feature/screen-share-viewer/screen-share-viewer.component.ts b/toju-app/src/app/domains/screen-share/feature/screen-share-viewer/screen-share-viewer.component.ts index b9e3e6a..f45ff96 100644 --- a/toju-app/src/app/domains/screen-share/feature/screen-share-viewer/screen-share-viewer.component.ts +++ b/toju-app/src/app/domains/screen-share/feature/screen-share-viewer/screen-share-viewer.component.ts @@ -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', diff --git a/toju-app/src/app/domains/voice-connection/README.md b/toju-app/src/app/domains/voice-connection/README.md index 5a3197a..cb970b7 100644 --- a/toju-app/src/app/domains/voice-connection/README.md +++ b/toju-app/src/app/domains/voice-connection/README.md @@ -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 -│ ├── 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 +│ ├── 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 | diff --git a/toju-app/src/app/domains/voice-connection/application/voice-connection.facade.ts b/toju-app/src/app/domains/voice-connection/application/facades/voice-connection.facade.ts similarity index 94% rename from toju-app/src/app/domains/voice-connection/application/voice-connection.facade.ts rename to toju-app/src/app/domains/voice-connection/application/facades/voice-connection.facade.ts index 23ff9de..e1e9703 100644 --- a/toju-app/src/app/domains/voice-connection/application/voice-connection.facade.ts +++ b/toju-app/src/app/domains/voice-connection/application/facades/voice-connection.facade.ts @@ -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 { diff --git a/toju-app/src/app/domains/voice-connection/application/voice-activity.service.ts b/toju-app/src/app/domains/voice-connection/application/services/voice-activity.service.ts similarity index 97% rename from toju-app/src/app/domains/voice-connection/application/voice-activity.service.ts rename to toju-app/src/app/domains/voice-connection/application/services/voice-activity.service.ts index c2574fb..38b81a4 100644 --- a/toju-app/src/app/domains/voice-connection/application/voice-activity.service.ts +++ b/toju-app/src/app/domains/voice-connection/application/services/voice-activity.service.ts @@ -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; diff --git a/toju-app/src/app/domains/voice-connection/application/voice-playback.service.ts b/toju-app/src/app/domains/voice-connection/application/services/voice-playback.service.ts similarity index 97% rename from toju-app/src/app/domains/voice-connection/application/voice-playback.service.ts rename to toju-app/src/app/domains/voice-connection/application/services/voice-playback.service.ts index da3de7b..8ee19dd 100644 --- a/toju-app/src/app/domains/voice-connection/application/voice-playback.service.ts +++ b/toju-app/src/app/domains/voice-connection/application/services/voice-playback.service.ts @@ -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; diff --git a/toju-app/src/app/domains/voice-connection/domain/models/voice-connection.model.ts b/toju-app/src/app/domains/voice-connection/domain/models/voice-connection.model.ts new file mode 100644 index 0000000..779d8da --- /dev/null +++ b/toju-app/src/app/domains/voice-connection/domain/models/voice-connection.model.ts @@ -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'; diff --git a/toju-app/src/app/domains/voice-connection/domain/voice-connection.models.ts b/toju-app/src/app/domains/voice-connection/domain/voice-connection.models.ts deleted file mode 100644 index d17dee9..0000000 --- a/toju-app/src/app/domains/voice-connection/domain/voice-connection.models.ts +++ /dev/null @@ -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'; diff --git a/toju-app/src/app/domains/voice-connection/index.ts b/toju-app/src/app/domains/voice-connection/index.ts index 14ad90a..5ac06e9 100644 --- a/toju-app/src/app/domains/voice-connection/index.ts +++ b/toju-app/src/app/domains/voice-connection/index.ts @@ -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'; diff --git a/toju-app/src/app/domains/voice-session/feature/floating-voice-controls/floating-voice-controls.component.ts b/toju-app/src/app/domains/voice-session/feature/floating-voice-controls/floating-voice-controls.component.ts index c7f768b..06a2768 100644 --- a/toju-app/src/app/domains/voice-session/feature/floating-voice-controls/floating-voice-controls.component.ts +++ b/toju-app/src/app/domains/voice-session/feature/floating-voice-controls/floating-voice-controls.component.ts @@ -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'; diff --git a/toju-app/src/app/domains/voice-session/feature/voice-controls/voice-controls.component.ts b/toju-app/src/app/domains/voice-session/feature/voice-controls/voice-controls.component.ts index 5d96fb5..11ca9c2 100644 --- a/toju-app/src/app/domains/voice-session/feature/voice-controls/voice-controls.component.ts +++ b/toju-app/src/app/domains/voice-session/feature/voice-controls/voice-controls.component.ts @@ -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'; diff --git a/toju-app/src/app/features/room/rooms-side-panel/rooms-side-panel.component.ts b/toju-app/src/app/features/room/rooms-side-panel/rooms-side-panel.component.ts index 7926069..5b02326 100644 --- a/toju-app/src/app/features/room/rooms-side-panel/rooms-side-panel.component.ts +++ b/toju-app/src/app/features/room/rooms-side-panel/rooms-side-panel.component.ts @@ -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 { diff --git a/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.ts b/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.ts index f77b358..7c96fab 100644 --- a/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.ts +++ b/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.ts @@ -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'; diff --git a/toju-app/src/app/shared/components/user-volume-menu/user-volume-menu.component.ts b/toju-app/src/app/shared/components/user-volume-menu/user-volume-menu.component.ts index b514224..92a51ce 100644 --- a/toju-app/src/app/shared/components/user-volume-menu/user-volume-menu.component.ts +++ b/toju-app/src/app/shared/components/user-volume-menu/user-volume-menu.component.ts @@ -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({