Skip to main content

coven_protocol/
store_creation.rs

1//! Durable record of an in-flight Store creation: the probe identities and
2//! outcome states persisted in `protocol_state` so an interrupted creation is
3//! resumed or abandoned exactly.
4
5use crate::store_commit::{DeviceStreamAnchor, ObjectHash, StoreCreationId};
6
7pub const STORE_CREATION_ATTEMPT_STATE_KEY: &str = "store_creation_attempt_v1";
8
9#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
10#[serde(rename_all = "snake_case", deny_unknown_fields)]
11pub enum StoreCreationAttempt {
12    Initialized(StoreCreationAuthority),
13    RootReserved(StoreRootReservation),
14    FounderRegistrationReserved(FounderRegistrationReservation),
15    MembershipReserved(MembershipReservation),
16    CurrentPublicationReserved(CurrentPublicationReservation),
17    DescriptorReserved(DescriptorReservation),
18    FounderStoreCommitsReserved(FounderStoreCommitsReservation),
19    FounderAcknowledgementsReserved(FounderAcknowledgementsReservation),
20    FounderSnapshotsReserved(FounderSnapshotsReservation),
21    FounderNextAckReserved(FounderNextAckReservation),
22    FounderGraphReserved(FounderGraphReservation),
23}
24
25#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
26#[serde(deny_unknown_fields)]
27pub struct StoreCreationProbeIds {
28    exact_slots: crate::provider::ProviderProbeId,
29}
30
31impl StoreCreationProbeIds {
32    pub fn new(exact_slots: crate::provider::ProviderProbeId) -> Self {
33        Self { exact_slots }
34    }
35
36    pub fn exact_slots(&self) -> crate::provider::ProviderProbeId {
37        self.exact_slots
38    }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
42#[serde(deny_unknown_fields)]
43pub struct StoreCreationAuthority {
44    pub creation_id: StoreCreationId,
45    pub founder_grant: crate::membership::MembershipGrantId,
46    pub provider_admin_grant: crate::provider::ProviderAdminGrantId,
47    pub probes: StoreCreationProbeIds,
48    pub binding: crate::objects::ResolvedProviderBinding,
49    pub access: crate::provider::ProviderAccessLocator,
50    pub founder_pubkey: String,
51    pub founder_timestamp: String,
52    pub schema_version: u32,
53    pub sync_routing_hash: ObjectHash,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
57#[serde(deny_unknown_fields)]
58pub struct StoreRootReservation {
59    pub authority: StoreCreationAuthority,
60    pub root_slot: crate::objects::ObjectSlot,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
64#[serde(deny_unknown_fields)]
65pub struct FounderRegistrationReservation {
66    pub root: StoreRootReservation,
67    pub registration_slot: crate::objects::ObjectSlot,
68}
69
70#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
71#[serde(deny_unknown_fields)]
72pub struct MembershipReservation {
73    pub founder: FounderRegistrationReservation,
74    pub first_slot: crate::objects::ObjectSlot,
75}
76
77#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
78#[serde(deny_unknown_fields)]
79pub struct DescriptorReservation {
80    pub membership: MembershipReservation,
81    pub current_publication_slot: crate::objects::ObjectSlot,
82    pub recovery_slot: crate::objects::ObjectSlot,
83}
84
85#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
86#[serde(deny_unknown_fields)]
87pub struct CurrentPublicationReservation {
88    pub membership: MembershipReservation,
89    pub current_publication_slot: crate::objects::ObjectSlot,
90}
91
92#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
93#[serde(deny_unknown_fields)]
94pub struct FounderMembershipPublicationReservation {
95    pub next_head_slot: crate::objects::ObjectSlot,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
99#[serde(deny_unknown_fields)]
100pub struct FounderGraphReservation {
101    pub descriptor: DescriptorReservation,
102    pub store_commits: DeviceStreamAnchor,
103    pub acknowledgements: DeviceStreamAnchor,
104    pub snapshots: DeviceStreamAnchor,
105    pub next_ack_slot: crate::objects::ObjectSlot,
106    pub membership: FounderMembershipPublicationReservation,
107}
108
109#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
110#[serde(deny_unknown_fields)]
111pub struct FounderStoreCommitsReservation {
112    pub descriptor: DescriptorReservation,
113    pub store_commits: DeviceStreamAnchor,
114}
115
116#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
117#[serde(deny_unknown_fields)]
118pub struct FounderAcknowledgementsReservation {
119    pub store_commits: FounderStoreCommitsReservation,
120    pub acknowledgements: DeviceStreamAnchor,
121}
122
123#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
124#[serde(deny_unknown_fields)]
125pub struct FounderSnapshotsReservation {
126    pub acknowledgements: FounderAcknowledgementsReservation,
127    pub snapshots: DeviceStreamAnchor,
128}
129
130#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
131#[serde(deny_unknown_fields)]
132pub struct FounderNextAckReservation {
133    pub snapshots: FounderSnapshotsReservation,
134    pub next_ack_slot: crate::objects::ObjectSlot,
135}