using System; using System.Threading.Tasks; using Grpc.Core; using FrostFS.Object; namespace FrostFS.SDK.ClientV2; internal class ObjectReader(AsyncServerStreamingCall call) : IDisposable { public AsyncServerStreamingCall Call { get; private set; } = call; public 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() { Call.Dispose(); } }