void.cat/VoidCat/Services/Abstractions/IFileStore.cs
2022-02-17 15:52:49 +00:00

44 lines
1.3 KiB
C#

using VoidCat.Model;
namespace VoidCat.Services.Abstractions;
public interface IFileStore
{
ValueTask<PublicVoidFile?> Get(Guid id);
ValueTask<PrivateVoidFile> Ingress(IngressPayload payload, CancellationToken cts);
ValueTask Egress(EgressRequest request, Stream outStream, CancellationToken cts);
IAsyncEnumerable<PublicVoidFile> ListFiles();
}
public sealed record IngressPayload(Stream InStream, VoidFileMeta Meta, string Hash)
{
public Guid? Id { get; init; }
public Guid? EditSecret { get; init; }
public bool IsAppend => Id.HasValue && EditSecret.HasValue;
}
public sealed record EgressRequest(Guid Id, IEnumerable<RangeRequest> Ranges)
{
}
public sealed record RangeRequest(long? TotalSize, long? Start, long? End)
{
private const long DefaultBufferSize = 1024L * 512L;
public long? Size
=> Start.HasValue ? (End ?? Math.Min(TotalSize!.Value, Start.Value + DefaultBufferSize)) - Start.Value : End;
public bool IsForFullFile
=> Start is 0 && !End.HasValue;
/// <summary>
/// Return Content-Range header content for this range
/// </summary>
/// <returns></returns>
public string ToContentRange()
=> $"bytes {Start}-{End ?? (Start + Size - 1L)}/{TotalSize?.ToString() ?? "*"}";
}