BotSharp/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/Session/AsyncWebsocketDataResultEnumerator.cs

53 lines
1.5 KiB
C#
Raw Normal View History

2025-04-14 06:25:16 +00:00
using System;
using System.Buffers;
using System.ClientModel;
using System.Net.WebSockets;
namespace BotSharp.Plugin.OpenAI.Providers.Realtime.Session;
public class AsyncWebsocketDataResultEnumerator : IAsyncEnumerator<ClientResult>
{
private readonly WebSocket _webSocket;
2025-04-14 15:13:05 +00:00
private readonly CancellationToken _cancellationToken;
2025-04-14 06:25:16 +00:00
private readonly byte[] _buffer;
public AsyncWebsocketDataResultEnumerator(
2025-04-14 15:13:05 +00:00
WebSocket webSocket,
CancellationToken cancellationToken)
2025-04-14 06:25:16 +00:00
{
_webSocket = webSocket;
2025-04-14 15:13:05 +00:00
_cancellationToken = cancellationToken;
2025-04-14 06:25:16 +00:00
_buffer = ArrayPool<byte>.Shared.Rent(1024 * 32);
}
public ClientResult Current { get; private set; }
public ValueTask DisposeAsync()
{
_webSocket?.Dispose();
return new ValueTask(Task.CompletedTask);
}
public async ValueTask<bool> MoveNextAsync()
{
var response = new AiWebsocketPipelineResponse();
while (!response.IsComplete)
{
2025-04-14 15:13:05 +00:00
var receivedResult = await _webSocket.ReceiveAsync(new(_buffer), _cancellationToken);
2025-04-14 06:25:16 +00:00
if (receivedResult.CloseStatus.HasValue)
{
Current = null;
return false;
}
var receivedBytes = _buffer.AsMemory(0, receivedResult.Count);
var receivedData = BinaryData.FromBytes(receivedBytes);
response.HandleReceivedResult(receivedResult, receivedData);
}
Current = ClientResult.FromResponse(response);
return true;
}
}