// Copyright (C) 2025, The Duplicati Team // https://duplicati.com, hello@duplicati.com // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. using Duplicati.Library.Interface; namespace Duplicati.Library.Backend { public interface IS3Client : IDisposable { /// /// List all objects in a bucket /// /// The bucket name /// The prefix to filter the objects /// Whether to list recursively /// The cancellation token /// The list of objects IAsyncEnumerable ListBucketAsync(string bucketName, string prefix, bool recursive, CancellationToken cancellationToken); /// /// Add a new bucket /// /// The name of the bucket to create /// The cancellation token /// A task representing the asynchronous operation Task AddBucketAsync(string bucketName, CancellationToken cancelToken); /// /// Delete an object from a bucket /// /// The name of the bucket /// The name of the object to delete /// The cancellation token /// >A task representing the asynchronous operation Task DeleteObjectAsync(string bucketName, string keyName, CancellationToken cancelToken); /// /// Rename an object in a bucket /// /// The name of the bucket /// The source object name /// The target object name /// The cancellation token /// >A task representing the asynchronous operation Task RenameFileAsync(string bucketName, string source, string target, CancellationToken cancelToken); /// /// Copies the object contents into the target stream /// /// The name of the bucket /// The name of the object to copy /// The target stream to copy the object contents into /// The cancellation token /// >A task representing the asynchronous operation Task GetFileStreamAsync(string bucketName, string keyName, Stream target, CancellationToken cancelToken); /// /// Gets the DNS hostnames used for the S3 client /// /// The DNS hostnames used for the S3 client string? GetDnsHost(); /// /// Adds a file stream to the bucket /// /// The name of the bucket /// The name of the object to create /// The source stream to upload /// The cancellation token /// >A task representing the asynchronous operation Task AddFileStreamAsync(string bucketName, string keyName, Stream source, CancellationToken cancelToken); /// /// Gets the current object lock expiration timestamp for a remote file, if available. /// /// The bucket containing the object. /// The full object key. /// The cancellation token. /// The UTC expiration timestamp if present, otherwise null. Task GetObjectLockUntilAsync(string bucketName, string keyName, CancellationToken cancelToken); /// /// Applies or updates the object lock expiration for a remote file. /// /// The bucket containing the object. /// The full object key. /// The UTC timestamp until which the object should remain locked. /// The cancellation token. Task SetObjectLockUntilAsync(string bucketName, string keyName, DateTime lockUntilUtc, CancellationToken cancelToken); /// /// Gets the metadata for a single object /// /// The bucket name /// The object key /// The cancellation token /// The file entry, or null if not found Task GetFileEntryAsync(string bucketName, string keyName, CancellationToken cancellationToken); } }