Skip to main content

ProviderOps

Trait ProviderOps 

Source
pub trait ProviderOps: Send + Sync {
Show 32 methods // Required methods fn config(&self) -> StorageConfig; fn single_request_limit(&self) -> u64; fn create<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, path: &'life2 ObjectPath, bytes: &'life3 [u8], sent: &'life4 ByteProgress, device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<Option<StoredObject>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait; fn replace<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, previous: &'life2 StoredObject, bytes: &'life3 [u8], device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait; fn status<'life0, 'life1, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, ) -> Pin<Box<dyn Future<Output = Result<Option<StoredObject>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn stream_object<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, range: Option<ByteRange>, received: &'life2 ByteProgress, ) -> Pin<Box<dyn Future<Output = Result<ObjectStream<'_>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn list<'life0, 'life1, 'async_trait>( &'life0 self, listing: &'life1 mut ObjectListing, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn delete<'life0, 'life1, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn grant_access<'life0, 'life1, 'async_trait>( &'life0 self, account: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<AccessGrant, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn revoke_access<'life0, 'life1, 'async_trait>( &'life0 self, account: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<RetainedAccess>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn begin_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, target: &'life2 UploadTarget, total: u64, device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<UploadSession, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn resume_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 mut UploadSession, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn upload_part<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 mut UploadSession, bytes: &'life3 [u8], end: u64, sent: &'life4 ByteProgress, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait; fn finish_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 mut UploadSession, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn abort_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 UploadSession, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn device_uploads<'life0, 'async_trait>( &'life0 self, store: StoreId, device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait; fn settled_claim_uploads<'life0, 'async_trait>( &'life0 self, store: StoreId, through: u64, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait; fn end_left_upload<'life0, 'life1, 'async_trait>( &'life0 self, upload: &'life1 LeftUpload, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; // Provided methods fn read_part_size(&self) -> Option<NonZeroU64> { ... } fn create_location_marker<'life0, 'async_trait>( &'life0 self, _store: StoreId, _device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn read_location_marker<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn folder_label<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<FolderLabel, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn account<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<String, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn set_oauth_tokens<'life0, 'async_trait>( &'life0 self, _tokens: OAuthTokens, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn set_s3_credentials<'life0, 'async_trait>( &'life0 self, _credentials: S3Credentials, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn read_object<'life0, 'life1, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, range: Option<ByteRange>, ) -> Pin<Box<dyn Future<Output = Result<ObjectRead, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn join<'life0, 'life1, 'async_trait>( &'life0 self, invitation: &'life1 StorageInvitation, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn leave<'life0, 'life1, 'async_trait>( &'life0 self, invitation: &'life1 StorageInvitation, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn send_independent_part<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, _publication: &'life1 PublicationRequest, _session: &'life2 UploadSession, _offset: u64, _bytes: &'life3 [u8], _sent: &'life4 ByteProgress, ) -> Pin<Box<dyn Future<Output = Result<ConfirmedPart, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait { ... } fn dates_floor_sessions(&self) -> bool { ... } fn superseded_floor_uploads<'life0, 'life1, 'async_trait>( &'life0 self, _floor: &'life1 StoredObject, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn detection_leftovers<'life0, 'async_trait>( &'life0 self, _store: StoreId, _run: Uuid, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... }
}
Expand description

Native calls used by StorageConnection. Consumers use Storage; implementations handle provider protocols after the connection checks paths, request sizes and recorded sessions. Construction receives validated settings.

Required Methods§

Source

fn config(&self) -> StorageConfig

This provider’s location.

Source

fn single_request_limit(&self) -> u64

Largest complete body accepted by create or replace.

Source

fn create<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, path: &'life2 ObjectPath, bytes: &'life3 [u8], sent: &'life4 ByteProgress, device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<Option<StoredObject>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Create in one request, telling sent the body’s bytes as the provider’s client hands them over. A temporary it stages sits in device’s reserved folder (D10). Returns the created object’s metadata when the reply carries it.

Source

fn replace<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, previous: &'life2 StoredObject, bytes: &'life3 [u8], device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Replace the observed object in one atomic conditional publication. A temporary it stages sits in device’s reserved folder (D10).

Source

fn status<'life0, 'life1, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, ) -> Pin<Box<dyn Future<Output = Result<Option<StoredObject>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Exact native lookup; only a confirmed missing object returns None.

Source

fn stream_object<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, range: Option<ByteRange>, received: &'life2 ByteProgress, ) -> Pin<Box<dyn Future<Output = Result<ObjectStream<'_>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Read complete bytes or a range, retaining metadata for those exact bytes. The connection hears the stream’s reads itself; a client that fetches bytes before the stream yields them tells received how far through the object they reach as they arrive, counted from the object’s start.

Source

fn list<'life0, 'life1, 'async_trait>( &'life0 self, listing: &'life1 mut ObjectListing, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Consume native pages into the connection’s checked listing.

Source

fn delete<'life0, 'life1, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Delete, accepting an already absent object.

Source

fn grant_access<'life0, 'life1, 'async_trait>( &'life0 self, account: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<AccessGrant, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Grant account access, or return S3’s console instructions.

Source

fn revoke_access<'life0, 'life1, 'async_trait>( &'life0 self, account: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<RetainedAccess>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Remove exclusive grants and return grants that still reach the account.

Source

fn begin_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, target: &'life2 UploadTarget, total: u64, device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<UploadSession, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Begin a nonempty upload with its original publication condition, for device, whose reserved folder holds its temporaries (D10).

Source

fn resume_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 mut UploadSession, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Recover native progress of a validated, incomplete session.

Source

fn upload_part<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 mut UploadSession, bytes: &'life3 [u8], end: u64, sent: &'life4 ByteProgress, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Send a checked part ending at end. The connection validates its length, boundary and session; implementations enforce the native protocol. sent already counts from the part’s start in the object.

Source

fn finish_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 mut UploadSession, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Publish an incomplete session, checking native progress where required.

Source

fn abort_upload<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, publication: &'life1 PublicationRequest, session: &'life2 UploadSession, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Abandon an incomplete session without deleting published bytes.

Source

fn device_uploads<'life0, 'async_trait>( &'life0 self, store: StoreId, device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

The uploads device left in store that this sign-in can see: the sessions and temporaries in its reserved folder (D10), and, where the provider puts a session at its destination, those under the device’s file and snapshot folders. Every page of each listing is followed.

Source

fn settled_claim_uploads<'life0, 'async_trait>( &'life0 self, store: StoreId, through: u64, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

The unfinished sessions at slots 1 to through of store, whoever began them: where a claim’s session sits at its slot’s path, one at a slot this device has applied can never publish, since create-once refuses it there. A provider that puts no session at a slot’s path returns none.

Source

fn end_left_upload<'life0, 'life1, 'async_trait>( &'life0 self, upload: &'life1 LeftUpload, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

End one upload another device left, as this provider listed it: abort the session, or delete what it staged. One already ended succeeds, and a published object is never touched.

Provided Methods§

Source

fn read_part_size(&self) -> Option<NonZeroU64>

The size of the parts a ranged read moves whole (crate::Storage::read_part_size); None when a range moves only its own bytes.

Source

fn create_location_marker<'life0, 'async_trait>( &'life0 self, _store: StoreId, _device: DeviceId, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Create D10’s location marker at the location’s root with the provider’s create-once request. Only first setup at a location that holds one store calls this operation. Anything it stages sits in device’s reserved folder (D10).

Source

fn read_location_marker<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Read the complete location marker, bounded to D10’s UUID byte count. Only a location that holds one store calls this operation. A marker read that finds nothing confirms the location is still there first.

Source

fn folder_label<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<FolderLabel, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

The store’s folder’s name and web address as this connection’s account names them now (§20.2). Only a Dropbox shared folder or a OneDrive folder has them; nothing asks another location.

Source

fn account<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<String, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Signed-in account; coven shares nothing on S3, so it has none.

Source

fn set_oauth_tokens<'life0, 'async_trait>( &'life0 self, _tokens: OAuthTokens, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Replace tokens after credential custody commits them.

Source

fn set_s3_credentials<'life0, 'async_trait>( &'life0 self, _credentials: S3Credentials, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Replace the S3 signing key after credential custody commits it.

Source

fn read_object<'life0, 'life1, 'async_trait>( &'life0 self, path: &'life1 ObjectPath, range: Option<ByteRange>, ) -> Pin<Box<dyn Future<Output = Result<ObjectRead, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Collect a bounded response through the streaming implementation. Large writes and snapshots consume stream_object directly. This convenience reader holds at most 32 MiB, regardless of provider metadata.

Source

fn join<'life0, 'life1, 'async_trait>( &'life0 self, invitation: &'life1 StorageInvitation, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Accept native sharing material. The connection checks location and reads the exact floor status afterwards to verify readability.

Source

fn leave<'life0, 'life1, 'async_trait>( &'life0 self, invitation: &'life1 StorageInvitation, ) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Undo Self::join’s acceptance so the invite stays usable (crate::Storage::leave). Access an invite grants without native acceptance has nothing to undo.

Source

fn send_independent_part<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, _publication: &'life1 PublicationRequest, _session: &'life2 UploadSession, _offset: u64, _bytes: &'life3 [u8], _sent: &'life4 ByteProgress, ) -> Pin<Box<dyn Future<Output = Result<ConfirmedPart, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Send part offset.. of a session whose parts are independent (UploadSession::parts_independent), leaving the session as it is: the provider’s confirmation of the part comes back, for the caller to add. Several may be in flight at once. The connection checks the part is a whole one the session lacks; sent already counts from the part’s start in the object. A provider whose parts go in order has none to send this way.

Source

fn dates_floor_sessions(&self) -> bool

Whether this provider dates an unfinished floor session’s start so that one begun before the current floor’s publication can be told apart (Appendix E.10). Asking sends nothing.

Source

fn superseded_floor_uploads<'life0, 'life1, 'async_trait>( &'life0 self, _floor: &'life1 StoredObject, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

The unfinished sessions at the floor’s path begun before floor, the current floor, was published: each observed an older revision, so none can publish. Asked only where Self::dates_floor_sessions.

Source

fn detection_leftovers<'life0, 'async_trait>( &'life0 self, _store: StoreId, _run: Uuid, ) -> Pin<Box<dyn Future<Output = Result<Vec<LeftUpload>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

What S3 detection run run left in store’s .coven-check prefix (§20.7): its unfinished multipart uploads, then its probes. Only S3 detects, so elsewhere no run left anything.

Implementors§