diff --git a/RelayClient/MainPage.xaml.cs b/RelayClient/MainPage.xaml.cs index ae238b0..69a03cd 100644 --- a/RelayClient/MainPage.xaml.cs +++ b/RelayClient/MainPage.xaml.cs @@ -106,7 +106,7 @@ public partial class MainPage : ContentPage return; } - SafeSendRawToWebView($"[{_username}] RAW WS DATA: {e.Data}"); + // SafeSendRawToWebView($"[{_username}] RAW WS DATA: {e.Data}"); Console.WriteLine($"[{_username}] RAW WS DATA: {e.Data}"); @@ -210,7 +210,7 @@ public partial class MainPage : ContentPage if (notificationChannelId != _currentChannelId) return; - SafeSendRawToWebView("RTC notification received: " + notificationType + " for " + notificationChannelId); + // SafeSendRawToWebView("RTC notification received: " + notificationType + " for " + notificationChannelId); MainThread.BeginInvokeOnMainThread(async () => { @@ -434,7 +434,7 @@ public partial class MainPage : ContentPage _wsc.Send($"RTC_JOIN_CHANNEL|{_username}|{_currentChannelId}"); - SafeSendRawToWebView($"Attempting to join RTC Channel {_currentChannelName} | {_currentChannelId} "); + // SafeSendRawToWebView($"Attempting to join RTC Channel {_currentChannelName} | {_currentChannelId} "); bool active = await ServerAPI.GetIsChannelActiveAsync(_currentChannelId); @@ -462,11 +462,12 @@ public partial class MainPage : ContentPage Username = _username, SessionDescription = description }; - await ServerAPI.PostOfferAsync(offer); + var response = await ServerAPI.PostOfferAsync(offer); + SafeSendRawToWebView(response.ToString()); } catch (Exception ex) { - SafeSendRawToWebView(ex.Message); + SafeSendRawToWebView($"WriteRtcOffer failed: {ex.Message}"); } } diff --git a/RelayClient/Resources/Raw/wwwroot/index.js b/RelayClient/Resources/Raw/wwwroot/index.js index dcdb70d..e153dd5 100644 --- a/RelayClient/Resources/Raw/wwwroot/index.js +++ b/RelayClient/Resources/Raw/wwwroot/index.js @@ -161,37 +161,81 @@ async function joinChannelCall() { LogMessage("Current username: " + currentUsername); LogMessage("Current channel: " + currentChannelId); - await window.HybridWebView.InvokeDotNet("JoinRtcChannel"); + const isActive = await window.HybridWebView.InvokeDotNet("JoinRtcChannel"); + const peerConnection = await ensurePeerConnectionForUser(currentUsername); await ensureLocalMedia(); - const rawParticipants = await window.HybridWebView.InvokeDotNet("GetRtcParticipants"); - const participants = typeof rawParticipants === "string" - ? JSON.parse(rawParticipants) - : rawParticipants; + if (isActive) { + + const rawJson = await window.HybridWebView.InvokeDotNet("GetRtcOffer"); + const offer = typeof rawJson === "string" ? JSON.parse(rawJson) : rawJson; + await peerConnection.setRemoteDescription(offer); + const answer = await peerConnection.createAnswer(); + await peerConnection.setRemoteDescription(answer); + await window.HybridWebView.InvokeDotNet("WriteRtcAnswer", [JSON.stringify(answer)]) - LogMessage("Participants: " + JSON.stringify(participants)); // TODO: Remove + const rawParticipants = await window.HybridWebView.InvokeDotNet("GetRtcParticipants"); + const participants = typeof rawParticipants === "string" ? JSON.parse(rawParticipants) : rawParticipants; - for (const username of participants) { - if (username === currentUsername) continue; + LogMessage("Participants: " + JSON.stringify(participants)); // TODO: Remove - const pc = await ensurePeerConnectionForUser(username); + for (const username of participants) { + if (username === currentUsername) continue; - const offer = await pc.createOffer(); - await pc.setLocalDescription(offer); + const pc = await ensurePeerConnectionForUser(username); - const payload = { - type: "rtc_offer", - from: currentUsername, - to: username, - channelId: currentChannelId, - sdp: offer.sdp - }; + const offer = await pc.createOffer(); + await pc.setLocalDescription(offer); - await window.HybridWebView.InvokeDotNet("SendRtcSignal", [JSON.stringify(payload)]); - LogMessage(`Sent offer to ${username}`); + const payload = { + type: "rtc_offer", + from: currentUsername, + to: username, + channelId: currentChannelId, + sdp: offer.sdp + }; + + await window.HybridWebView.InvokeDotNet("SendRtcSignal", [JSON.stringify(payload)]); + LogMessage(`Sent offer to ${username}`); + } + } + else + { + try { + LogMessage(currentUsername + " attempted to join inactive channel. Making new call.") + const offer = await peerConnection.createOffer(); + await peerConnection.setLocalDescription(offer); + await window.HybridWebView.InvokeDotNet("WriteRtcOffer", [JSON.stringify(offer)]); + LogMessage(`Joining call with media offer: ${JSON.stringify(offer)}`); + } + catch (error) { + LogMessage(error) + } } } +async function channelCallJoin(activeCall) +{ + // LogMessage("Active call: " + activeCall); + await ensurePeerConnectionForUser(currentUsername); + if (activeCall) + { + const rawJson = await window.HybridWebView.InvokeDotNet("GetRtcOffer"); + const offer = typeof rawJson === "string" ? JSON.parse(rawJson) : rawJson; + await peerConnection.setRemoteDescription(offer); + const answer = await peerConnection.createAnswer(); + await peerConnection.setLocalDescription(answer); + // LogMessage("Joining call with media answer: " + JSON.stringify(answer)); + // LogMessage("Calling C# WriteRtcAnswer with: " + JSON.stringify(answer)); + await window.HybridWebView.InvokeDotNet("WriteRtcAnswer", [JSON.stringify(answer)]); + } + else + { + const offer = await peerConnection.createOffer(); + await peerConnection.setLocalDescription(offer); + await window.HybridWebView.InvokeDotNet("WriteRtcOffer", [JSON.stringify(offer)]); + } +} async function ensurePeerConnectionForUser(username) { if (peerConnections[username]) return peerConnections[username]; diff --git a/start-all.ps1 b/start-all.ps1 index 2b864a0..5f6fee4 100644 --- a/start-all.ps1 +++ b/start-all.ps1 @@ -64,18 +64,18 @@ Start-Sleep -Seconds 5 & '$clientExe' --user Ru_Kira "@ -# $testScript = New-TabScript -Name "Test" -Content @" -# Set-Location '$root' -# Start-Sleep -Seconds 25 -# & '$clientExe' --user Test -# "@ +$testScript = New-TabScript -Name "Test" -Content @" +Set-Location '$root' +Start-Sleep -Seconds 25 +& '$clientExe' --user Test +"@ $wtArgs = @( "new-tab --title `"SurrealDB`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$dockerScript`"", "new-tab --title `"RelayCore`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$coreScript`"", "new-tab --title `"RelayServer`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$serverScript`"", "new-tab --title `"Keeper317`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$keeperScript`"", -# "new-tab --title `"Test`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$testScript`"", + "new-tab --title `"Test`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$testScript`"", "new-tab --title `"Ru_Kira`" `"$ps`" -NoExit -ExecutionPolicy Bypass -File `"$kiraScript`"" ) -join " ; "