using System; using System.Threading.Tasks; using Grpc.Core; using FrostFS.Object; using FrostFS.SDK.ModelsV2; namespace FrostFS.SDK.ClientV2; public class ObjectReader(AsyncServerStreamingCall call) : IObjectReader { private bool disposed = false; public AsyncServerStreamingCall Call { get; private set; } = call; internal async Task ReadHeader() { if (!await Call.ResponseStream.MoveNext()) throw new InvalidOperationException("unexpected end of stream"); var response = Call.ResponseStream.Current; Verifier.CheckResponse(response); if (response.Body.ObjectPartCase != GetResponse.Types.Body.ObjectPartOneofCase.Init) throw new InvalidOperationException("unexpected message type"); return new Object.Object { ObjectId = response.Body.Init.ObjectId, Header = response.Body.Init.Header, }; } public async Task ReadChunk() { if (!await Call.ResponseStream.MoveNext()) return null; var response = Call.ResponseStream.Current; Verifier.CheckResponse(response); if (response.Body.ObjectPartCase != GetResponse.Types.Body.ObjectPartOneofCase.Chunk) throw new InvalidOperationException("unexpected message type"); return response.Body.Chunk.ToByteArray(); } public void Dispose() { if (!disposed) { Call.Dispose(); GC.SuppressFinalize(this); disposed = true; } } }