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    FounderAcknowledgementsReserved(FounderAcknowledgementsReservation),
19    FounderNextAckReserved(FounderNextAckReservation),
20    FounderGraphReserved(FounderGraphReservation),
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
24#[serde(deny_unknown_fields)]
25pub struct StoreCreationProbeIds {
26    exact_slots: crate::provider::ProviderProbeId,
27}
28
29impl StoreCreationProbeIds {
30    pub fn new(exact_slots: crate::provider::ProviderProbeId) -> Self {
31        Self { exact_slots }
32    }
33
34    pub fn exact_slots(&self) -> crate::provider::ProviderProbeId {
35        self.exact_slots
36    }
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
40#[serde(deny_unknown_fields)]
41pub struct StoreCreationAuthority {
42    pub creation_id: StoreCreationId,
43    pub founder_grant: crate::membership::MembershipGrantId,
44    pub provider_admin_grant: crate::provider::ProviderAdminGrantId,
45    pub probes: StoreCreationProbeIds,
46    pub binding: crate::objects::ResolvedProviderBinding,
47    pub access: crate::provider::ProviderAccessLocator,
48    pub founder_pubkey: String,
49    pub founder_timestamp: String,
50    pub schema_version: u32,
51    pub sync_routing_hash: ObjectHash,
52}
53
54#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
55#[serde(deny_unknown_fields)]
56pub struct StoreRootReservation {
57    pub authority: StoreCreationAuthority,
58    pub root_slot: crate::objects::ObjectSlot,
59}
60
61#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
62#[serde(deny_unknown_fields)]
63pub struct FounderRegistrationReservation {
64    pub root: StoreRootReservation,
65    pub registration_slot: crate::objects::ObjectSlot,
66}
67
68#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
69#[serde(deny_unknown_fields)]
70pub struct MembershipReservation {
71    pub founder: FounderRegistrationReservation,
72    pub first_slot: crate::objects::ObjectSlot,
73}
74
75#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
76#[serde(deny_unknown_fields)]
77pub struct DescriptorReservation {
78    pub membership: MembershipReservation,
79    pub current_publication_slot: crate::objects::ObjectSlot,
80    pub recovery_slot: crate::objects::ObjectSlot,
81}
82
83#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
84#[serde(deny_unknown_fields)]
85pub struct CurrentPublicationReservation {
86    pub membership: MembershipReservation,
87    pub current_publication_slot: crate::objects::ObjectSlot,
88}
89
90#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
91#[serde(deny_unknown_fields)]
92pub struct FounderMembershipPublicationReservation {
93    pub next_head_slot: crate::objects::ObjectSlot,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
97#[serde(deny_unknown_fields)]
98pub struct FounderGraphReservation {
99    pub descriptor: DescriptorReservation,
100    pub acknowledgements: DeviceStreamAnchor,
101    pub next_ack_slot: crate::objects::ObjectSlot,
102    pub membership: FounderMembershipPublicationReservation,
103}
104
105#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
106#[serde(deny_unknown_fields)]
107pub struct FounderAcknowledgementsReservation {
108    pub descriptor: DescriptorReservation,
109    pub acknowledgements: DeviceStreamAnchor,
110}
111
112#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
113#[serde(deny_unknown_fields)]
114pub struct FounderNextAckReservation {
115    pub acknowledgements: FounderAcknowledgementsReservation,
116    pub next_ack_slot: crate::objects::ObjectSlot,
117}