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()
|
|
|
|
|
{
|
2025-04-17 22:03:25 +00:00
|
|
|
ArrayPool<byte>.Shared.Return(_buffer, clearArray: true);
|
2025-04-14 06:25:16 +00:00
|
|
|
_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);
|
2025-04-14 16:15:14 +00:00
|
|
|
response.CollectReceivedResult(receivedResult, receivedData);
|
2025-04-14 06:25:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Current = ClientResult.FromResponse(response);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|