1use 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}