59 lines
1.6 KiB
C#
59 lines
1.6 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
|
|
using Grpc.Core;
|
|
|
|
using FrostFS.Object;
|
|
using FrostFS.SDK.ModelsV2;
|
|
|
|
namespace FrostFS.SDK.ClientV2;
|
|
|
|
public class ObjectReader(AsyncServerStreamingCall<GetResponse> call) : IObjectReader
|
|
{
|
|
private bool disposed = false;
|
|
|
|
public AsyncServerStreamingCall<GetResponse> Call { get; private set; } = call;
|
|
|
|
internal async Task<Object.Object> 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<byte[]?> 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;
|
|
}
|
|
}
|
|
}
|