diff --git a/lib/features/desktop/desktop_client.dart b/lib/features/desktop/desktop_client.dart index 6e3b5fbd..2dc63d86 100644 --- a/lib/features/desktop/desktop_client.dart +++ b/lib/features/desktop/desktop_client.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; import '../../app/app_controller.dart'; +import '../../runtime/gateway_runtime_helpers.dart'; String desktopConnectionStateName(RTCPeerConnectionState state) { final value = state.toString().split('.').last; @@ -31,6 +32,10 @@ Map desktopOfferParams({ }; } +String desktopSessionId() { + return 'remote-desktop-${randomIdInternal()}'; +} + Future desktopRemoteVideoStreamForTrack( RTCTrackEvent event, { required Future Function(String label) createFallbackStream, @@ -242,11 +247,8 @@ class DesktopClient { } }; - // Add transceivers for receiving video and audio - await _peerConnection!.addTransceiver( - kind: RTCRtpMediaType.RTCRtpMediaTypeAudio, - init: RTCRtpTransceiverInit(direction: TransceiverDirection.RecvOnly), - ); + // Bridge publishes a video-only desktop stream; keep SDP m-line mapping + // simple so reconnects do not depend on rejected audio sections. await _peerConnection!.addTransceiver( kind: RTCRtpMediaType.RTCRtpMediaTypeVideo, init: RTCRtpTransceiverInit(direction: TransceiverDirection.RecvOnly), diff --git a/lib/features/desktop/desktop_view.dart b/lib/features/desktop/desktop_view.dart index 9b39d3db..c349a177 100644 --- a/lib/features/desktop/desktop_view.dart +++ b/lib/features/desktop/desktop_view.dart @@ -76,7 +76,7 @@ class _DesktopViewState extends State { _initRenderer(); _client = DesktopClient( controller: widget.controller, - sessionId: 'remote-desktop-session', + sessionId: desktopSessionId(), ); _inputHandler = DesktopInputHandler( onSendInput: (event) { diff --git a/test/features/desktop/desktop_client_test.dart b/test/features/desktop/desktop_client_test.dart index 366fe220..34ebf6ee 100644 --- a/test/features/desktop/desktop_client_test.dart +++ b/test/features/desktop/desktop_client_test.dart @@ -143,6 +143,16 @@ void main() { expect(params['height'], 720); }); + test('generates distinct desktop session ids for parallel app instances', () { + final first = desktopSessionId(); + final second = desktopSessionId(); + + expect(first, startsWith('remote-desktop-')); + expect(second, startsWith('remote-desktop-')); + expect(first, isNot(second)); + expect(first, isNot('remote-desktop-session')); + }); + test('uses bridge-provided remote stream when present', () async { var fallbackCreated = false; final providedStream = FakeMediaStream('provided-stream');