Skip to main content

coven/
lib.rs

1//! End-to-end encrypted, multi-writer SQLite sync over host-selected storage.
2//!
3//! The host owns its SQLite schema and domain. Coven owns the connection,
4//! captures host writes, stores protocol state, and synchronizes rows and blobs.
5//! Hosts use the crate-root API; implementation modules remain private.
6//!
7//! ```compile_fail
8//! let _ = coven::store_sync::StoreSync::connect;
9//! ```
10
11pub(crate) mod circles;
12mod cloud_home_setup;
13mod cloud_outbox_live_query;
14pub(crate) mod coven;
15mod device_pairing;
16mod handle;
17#[cfg(test)]
18mod host_callback_error_tests;
19mod live_query;
20#[cfg(test)]
21mod live_query_tests;
22mod read;
23mod read_handle;
24pub(crate) mod store_blobs;
25pub(crate) mod store_circles;
26pub(crate) mod store_cloud_storage;
27pub(crate) mod store_joining;
28pub(crate) mod store_membership;
29pub(crate) mod store_recovery;
30pub(crate) mod store_rows;
31pub(crate) mod store_security;
32pub(crate) mod store_sync;
33#[cfg(test)]
34mod test_support;
35
36#[cfg(test)]
37mod blob_facade_tests;
38#[cfg(test)]
39mod prepared_external_blob_tests;
40#[cfg(test)]
41mod store_key_ownership_tests;
42
43pub use coven_database::rusqlite;
44
45pub use circles::{CircleError, Circles};
46pub use cloud_home_setup::{
47    CloudHomeRollbackError, CloudHomeSetupError, CloudHomeSetupFailure, CloudHomeUnlockError,
48    ConnectedCloudHome,
49};
50pub use cloud_outbox_live_query::CloudOutboxLiveQuery;
51pub use coven::{Coven, CovenBuilder, CovenConfig, CovenError, CovenResult};
52pub use coven_database::prepare_external_blob;
53pub use coven_database::{
54    BlobFileFailure, BlobFileFailures, CloudOutboxSnapshot, DbError, ExternalBlob,
55    MakeRemoteProgress, OutboxFailure, OutboxFailureKind, PreparedExternalBlob, QueuedDelete,
56    QueuedMakeRemote, QueuedUpload, QueuedUploadPhase, SqlContext, SqlReadContext,
57    StuckReclaimOperation, WriteBatch,
58};
59pub use coven_database::{CovenMigrationError, CovenMigrationPolicy};
60pub use coven_database::{Migration, MigrationContext, MigrationError, MigrationStep};
61pub use coven_domain::joining::{join_with_device_pairing, DeviceJoinTransportOutcome};
62pub use coven_domain::joining::{
63    BootstrapError, DevicePairingError, DevicePairingHost, DevicePairingOffer, DevicePairingPhase,
64    DevicePairingRequest, DevicePairingTransportError, PreparedDevicePairing,
65    SealedDevicePairingRequest,
66};
67pub use coven_domain::restoration::{
68    decode_restore_code_info, restore_from_cloud, restore_from_code, ActivatedContinuation,
69    OwnerRecoveryAuthority, RestoreAuthority, RestoreCodeError, RestoreCodeInfo, RestoreSource,
70};
71pub use coven_foundation::atomic_file::{write_atomic, WriteError};
72pub use coven_foundation::changeset::{ChangeOp, RowChange};
73#[cfg(any(test, feature = "test-utils"))]
74pub use coven_foundation::clock::FixedClock;
75pub use coven_foundation::clock::{Clock, ClockRef, SystemClock};
76pub use coven_foundation::config::{
77    CloudHomeConfig, CloudProvider, Config, ConfigError, ExactUploadVerification, HomeStorage,
78};
79#[cfg(any(test, feature = "test-utils"))]
80pub use coven_foundation::id_provider::SequentialIdProvider;
81pub use coven_foundation::id_provider::{IdProvider, IdRef, UuidProvider};
82pub use coven_foundation::store_dir::{StoreDir, StoreLayout};
83pub use coven_keys::custody::{KeyCustody, Passphrase};
84#[cfg(any(test, feature = "test-utils"))]
85pub use coven_keys::encryption::EncryptionService;
86pub use coven_keys::encryption::{
87    EncryptionError, KeyFingerprint, MasterKeyring, SealError, CHUNK_SIZE,
88};
89pub use coven_keys::identity_custody::IdentityCustody;
90#[cfg(any(test, feature = "test-utils", debug_assertions))]
91pub use coven_keys::keys::test_keyring::install_for_service as install_test_keyring_service;
92#[cfg(all(
93    any(test, feature = "test-utils"),
94    any(target_os = "macos", target_os = "ios")
95))]
96pub use coven_keys::keys::{apple_keyring_entry_facts_for_test, AppleKeyringEntryFacts};
97pub use coven_keys::keys::{
98    keyring_service, set_keyring_service, CloudHomeCredentials, DeviceIdentityCustody,
99    IdentityError, KeyError, MasterKeyCustody, MasterKeyError, StoreKeys, UserKeypair,
100};
101pub use coven_protocol::blob::{
102    content_hash, BlobRef, BlobReplacement, BlobScope, BlobTransitionObserver, CacheFill,
103    Provenance, RowBlobAuthority, RowBlobRef, TransferLimits,
104};
105pub use coven_protocol::hlc::Timestamp;
106pub use coven_protocol::objects::{
107    ExactObjectRef, ObjectSlot, PhysicalObjectLocator, StorageError,
108};
109pub use coven_protocol::reclaim::ReclaimTarget;
110pub use coven_protocol::synced_schema::{BlobDecl, RowIdentity, SyncedTable};
111pub use coven_protocol::write::{
112    AffectedRow, PendingWrite, PublishedPosition, WriteBlock, WriteId, WriteReceipt,
113    WriteResolution, WriteRetractionWitness, WriteStatus,
114};
115pub use coven_protocol::{
116    Audience, Circle, CircleCloseParticipant, CircleCloseSettlement, CircleCloseStatus,
117    CircleControlCoord, CircleEpochCloseId, CircleId, CircleMemberInfo, CircleOperationBlock,
118    CircleOperationId, CircleOperationInfo, CircleOperationKind, CircleOperationState, CircleRole,
119    CircleState, CommitFrontier, CrossPrincipalProbeReceipt, DeviceJoinAttemptId,
120    ExactSlotProbeReceipt, MemberInfo, MemberRole, MembershipConflictChoice,
121    MembershipConflictInfo, ObjectHash, ProviderAccessLocator, ProviderAccessWithdrawal,
122    ProviderAdminGrantId, ProviderAdminGrantRecord, ProviderCapabilityProof, StoreBatchCommitRef,
123    StoreCommitCoord, StoreDeviceId, StoreMemberProviderAccessGrantRef,
124};
125pub use coven_protocol::{
126    AwsPrincipal, CloudKitEnvironment, GoogleDriveCorpus, ProviderDeviceBinding,
127    ProviderPrincipalId, ResolvedProviderBinding, S3EndpointBinding, StoreProviderBinding,
128};
129pub use coven_replication::blob::{
130    DrainOutcome, UploadFailure, UploadFailureCause, UploadFailures,
131};
132pub use coven_replication::blob::{MakeLocalError, MakeRemoteError, MakeRemoteRoot};
133pub use coven_replication::sync::{
134    AdmittingDeviceJoinProgress, BlobCacheError, BlobStream, BlockedOperation, BlockedOperationId,
135    DeviceActivity, DeviceJoinAbandonment, DeviceJoinAction, DeviceJoinActivation,
136    DeviceJoinApproval, DeviceJoinApprovalPolicy, DeviceJoinDriveOutcome, DeviceJoinError,
137    DeviceJoinJournalDatabase, DeviceJoinJournalRecord, DeviceJoinOffer, DeviceJoinOfferBundle,
138    DeviceJoinReadiness, DeviceJoinRole, DeviceJoinStatus, DeviceJoinTransportError,
139    DeviceJoinTransportKind, DeviceJoinTransportParams, DeviceJoinTransportTiming,
140    DeviceProviderAccessAdministrator, DeviceProviderAccessRequest,
141    DeviceProviderAdmissionApproval, DeviceProviderAdmissionCompletion, DeviceProviderReadiness,
142    DeviceRegistrationRequest, EagerCacheFillError, EagerCacheFillProgress, EagerCacheFillStatus,
143    HeldStoreCoordinate, HeldStorePosition, HeldStorePositionReason, JoinedStore,
144    JoiningDeviceJoinProgress, JoiningDeviceJoinProgressObserver, ProviderReadyDeviceBootstrap,
145    ProvisionalDeviceBootstrap, RetryStuckReclaimError, SyncError, SyncLoopAlerts, SyncLoopFailure,
146    SyncLoopStatus, SyncLoopSuccess,
147};
148#[cfg(feature = "oauth-providers")]
149pub use coven_storage::fetch_account_email;
150pub use coven_storage::no_progress;
151#[cfg(feature = "oauth-providers")]
152pub use coven_storage::oauth::OAuthError;
153#[cfg(feature = "oauth-providers")]
154pub use coven_storage::oauth::{AuthorizeRequest, OAuthClientCreds, OAuthClientCredsError};
155pub use coven_storage::oauth::{OAuthClients, OAuthTokens};
156#[cfg(feature = "test-utils")]
157pub use coven_storage::CloudCipher;
158#[cfg(any(test, feature = "test-utils"))]
159pub use coven_storage::InMemoryCloudHome;
160pub use coven_storage::{
161    write_cloud_object_stream, BlobBody, BoxPartSink, CloudAccessOutcome, CloudAccessState,
162    CloudFileReadError, CloudHome, CloudHomeError, CloudHomeJoinInfo, CloudKitAcceptedShareRecord,
163    CloudKitAtomicCreateBatch, CloudKitOps, CloudKitProviderIdentity, CloudKitRecordCreate,
164    CloudKitRecordVersion, CloudKitScope, CloudKitShare, CloudKitShareAcceptance,
165    CloudKitSharePermission, CloudObjectStream, CloudObjectVersion, CloudVersionedObject,
166    ConditionalWriteOutcome, DownloadProgress, ExactCloudHome, ExactCreateOutcome,
167    ExactSlotStorage, ExactUpload, ExactUploadSource, PartSink, S3CloudHome, UploadControl,
168    UploadProgress,
169};
170pub use device_pairing::{ApproveDevicePairingError, StartDevicePairingError};
171pub use handle::{CovenHandle, RetryBlockedOperationError};
172pub use live_query::{
173    LiveQuery, LiveQueryClosed, LiveQueryRequests, LiveQueryRevision, ReconfigurableLiveQuery,
174    ReconfigurableLiveQueryCause, ReconfigurableLiveQueryEvent,
175};
176pub use read::Read;
177pub use read_handle::CovenReadHandle;
178pub use store_joining::DeviceAdmissionError;
179pub use store_security::CloudHomeKeyState;