@using System.Text @using System.Net.WebSockets @inject HttpClient http @code { private bool ready = false; private string msg = "← Click it"; private string num = ""; private List logs = new(); private ClientWebSocket sck; }

Simple Web Chat(Voice)

@if (!ready) {
@msg
} else {
@foreach (var s in logs) {
@s
}
} @code { private WebSocket socket; private async Task Init() { try { ready = await AudioCaptureModule.Init(); } catch (Exception e) { msg = e.Message; } if (ready) { AudioCaptureModule.ChunkArrive += SendChunk; } } private void SendChunk(byte[] obj) { socket?.SendAsync(obj, WebSocketMessageType.Binary, true, default); } private async Task Go() { if (socket != null) { try { await socket.CloseAsync(WebSocketCloseStatus.Empty, "Brrrrrr", default); } catch { //FUCK ERR } try { socket.Dispose(); } catch { //FUCK ERR } logs.Insert(0, "Disconnected"); StateHasChanged(); socket = null; } sck = new ClientWebSocket(); sck.Options.AddSubProtocol("svcp"); var b = http.BaseAddress; try { await sck.ConnectAsync(new Uri($"{(b.Scheme == "https" ? "wss" : "ws")}://{b.Host}:{b.Port}/connect/voice"), default); await sck.SendAsync(Encoding.UTF8.GetBytes(num), WebSocketMessageType.Text, true, default); logs.Insert(0, "Connected"); socket = sck; await AudioCaptureModule.Start(); while (true) { var buf = new Byte[15384]; var r = await sck.ReceiveAsync(buf, default); if (r.Count == 0) { logs.Insert(0, "Disconnected"); StateHasChanged(); break; } if (r.MessageType == WebSocketMessageType.Text) { logs.Insert(0, Encoding.UTF8.GetString(buf, 0, r.Count)); StateHasChanged(); } else { var chunk = new byte[r.Count]; Array.Copy(buf, 0, chunk, 0, chunk.Length); await AudioPlaybackModule.PlayChunk(chunk); } } } catch (Exception e) { logs.Insert(0, e.ToString()); StateHasChanged(); } } }