in-memory storage #32
7 changed files with 36 additions and 16 deletions
10
src/bayou.rs
10
src/bayou.rs
|
@ -58,12 +58,12 @@ pub struct Bayou<S: BayouState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: BayouState> Bayou<S> {
|
impl<S: BayouState> Bayou<S> {
|
||||||
pub fn new(creds: &Credentials, path: String) -> Result<Self> {
|
pub async fn new(creds: &Credentials, path: String) -> Result<Self> {
|
||||||
let storage = creds.storage.build()?;
|
let storage = creds.storage.build().await?;
|
||||||
|
|
||||||
//let target = k2v_client.row(&path, WATCH_SK);
|
//let target = k2v_client.row(&path, WATCH_SK);
|
||||||
let target = storage::RowRef::new(&path, WATCH_SK);
|
let target = storage::RowRef::new(&path, WATCH_SK);
|
||||||
let watch = K2vWatch::new(creds, target.clone())?;
|
let watch = K2vWatch::new(creds, target.clone()).await?;
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
path,
|
path,
|
||||||
|
@ -418,8 +418,8 @@ impl K2vWatch {
|
||||||
/// Creates a new watch and launches subordinate threads.
|
/// Creates a new watch and launches subordinate threads.
|
||||||
/// These threads hold Weak pointers to the struct;
|
/// These threads hold Weak pointers to the struct;
|
||||||
/// they exit when the Arc is dropped.
|
/// they exit when the Arc is dropped.
|
||||||
fn new(creds: &Credentials, target: storage::RowRef) -> Result<Arc<Self>> {
|
async fn new(creds: &Credentials, target: storage::RowRef) -> Result<Arc<Self>> {
|
||||||
let storage = creds.storage.build()?;
|
let storage = creds.storage.build().await?;
|
||||||
|
|
||||||
let (tx, rx) = watch::channel::<storage::RowRef>(target.clone());
|
let (tx, rx) = watch::channel::<storage::RowRef>(target.clone());
|
||||||
let notify = Notify::new();
|
let notify = Notify::new();
|
||||||
|
|
|
@ -51,8 +51,8 @@ async fn incoming_mail_watch_process_internal(
|
||||||
creds: Credentials,
|
creds: Credentials,
|
||||||
mut rx_inbox_id: watch::Receiver<Option<(UniqueIdent, ImapUidvalidity)>>,
|
mut rx_inbox_id: watch::Receiver<Option<(UniqueIdent, ImapUidvalidity)>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut lock_held = k2v_lock_loop(creds.storage.build()?, storage::RowRef::new(INCOMING_PK, INCOMING_LOCK_SK));
|
let mut lock_held = k2v_lock_loop(creds.storage.build().await?, storage::RowRef::new(INCOMING_PK, INCOMING_LOCK_SK));
|
||||||
let storage = creds.storage.build()?;
|
let storage = creds.storage.build().await?;
|
||||||
|
|
||||||
let mut inbox: Option<Arc<Mailbox>> = None;
|
let mut inbox: Option<Arc<Mailbox>> = None;
|
||||||
let mut incoming_key = storage::RowRef::new(INCOMING_PK, INCOMING_WATCH_SK);
|
let mut incoming_key = storage::RowRef::new(INCOMING_PK, INCOMING_WATCH_SK);
|
||||||
|
@ -411,7 +411,7 @@ impl EncryptedMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn deliver_to(self: Arc<Self>, creds: PublicCredentials) -> Result<()> {
|
pub async fn deliver_to(self: Arc<Self>, creds: PublicCredentials) -> Result<()> {
|
||||||
let storage = creds.storage.build()?;
|
let storage = creds.storage.build().await?;
|
||||||
|
|
||||||
// Get causality token of previous watch key
|
// Get causality token of previous watch key
|
||||||
let query = storage::RowRef::new(INCOMING_PK, INCOMING_WATCH_SK);
|
let query = storage::RowRef::new(INCOMING_PK, INCOMING_WATCH_SK);
|
||||||
|
|
|
@ -25,7 +25,7 @@ impl Mailbox {
|
||||||
let index_path = format!("index/{}", id);
|
let index_path = format!("index/{}", id);
|
||||||
let mail_path = format!("mail/{}", id);
|
let mail_path = format!("mail/{}", id);
|
||||||
|
|
||||||
let mut uid_index = Bayou::<UidIndex>::new(creds, index_path)?;
|
let mut uid_index = Bayou::<UidIndex>::new(creds, index_path).await?;
|
||||||
uid_index.sync().await?;
|
uid_index.sync().await?;
|
||||||
|
|
||||||
let uidvalidity = uid_index.state().uidvalidity;
|
let uidvalidity = uid_index.state().uidvalidity;
|
||||||
|
@ -44,7 +44,7 @@ impl Mailbox {
|
||||||
let mbox = RwLock::new(MailboxInternal {
|
let mbox = RwLock::new(MailboxInternal {
|
||||||
id,
|
id,
|
||||||
encryption_key: creds.keys.master.clone(),
|
encryption_key: creds.keys.master.clone(),
|
||||||
storage: creds.storage.build()?,
|
storage: creds.storage.build().await?,
|
||||||
uid_index,
|
uid_index,
|
||||||
mail_path,
|
mail_path,
|
||||||
});
|
});
|
||||||
|
|
|
@ -174,7 +174,7 @@ impl User {
|
||||||
// ---- Internal user & mailbox management ----
|
// ---- Internal user & mailbox management ----
|
||||||
|
|
||||||
async fn open(username: String, creds: Credentials) -> Result<Arc<Self>> {
|
async fn open(username: String, creds: Credentials) -> Result<Arc<Self>> {
|
||||||
let storage = creds.storage.build()?;
|
let storage = creds.storage.build().await?;
|
||||||
|
|
||||||
let (tx_inbox_id, rx_inbox_id) = watch::channel(None);
|
let (tx_inbox_id, rx_inbox_id) = watch::channel(None);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::storage::*;
|
use crate::storage::*;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use aws_sdk_s3 as s3;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize)]
|
#[derive(Clone, Debug, Serialize)]
|
||||||
pub struct GarageConf {
|
pub struct GarageConf {
|
||||||
|
@ -26,9 +27,26 @@ impl GarageBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
impl IBuilder for GarageBuilder {
|
impl IBuilder for GarageBuilder {
|
||||||
fn build(&self) -> Result<Store, StorageError> {
|
async fn build(&self) -> Result<Store, StorageError> {
|
||||||
unimplemented!();
|
let creds = s3::config::Credentials::new(
|
||||||
|
self.conf.aws_access_key_id.clone(),
|
||||||
|
self.conf.aws_secret_access_key.clone(),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
"aerogramme"
|
||||||
|
);
|
||||||
|
|
||||||
|
let config = aws_config::from_env()
|
||||||
|
.region(aws_config::Region::new(self.conf.region.clone()))
|
||||||
|
.credentials_provider(creds)
|
||||||
|
.endpoint_url(self.conf.s3_endpoint.clone())
|
||||||
|
.load()
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let s3_client = aws_sdk_s3::Client::new(&config);
|
||||||
|
Ok(Box::new(GarageStore { s3: s3_client }))
|
||||||
}
|
}
|
||||||
fn unique(&self) -> UnicityBuffer {
|
fn unique(&self) -> UnicityBuffer {
|
||||||
UnicityBuffer(self.unicity.clone())
|
UnicityBuffer(self.unicity.clone())
|
||||||
|
@ -36,7 +54,7 @@ impl IBuilder for GarageBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GarageStore {
|
pub struct GarageStore {
|
||||||
dummy: String,
|
s3: s3::Client,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
|
|
@ -106,8 +106,9 @@ impl MemBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
impl IBuilder for MemBuilder {
|
impl IBuilder for MemBuilder {
|
||||||
fn build(&self) -> Result<Store, StorageError> {
|
async fn build(&self) -> Result<Store, StorageError> {
|
||||||
Ok(Box::new(MemStore {
|
Ok(Box::new(MemStore {
|
||||||
row: self.row.clone(),
|
row: self.row.clone(),
|
||||||
blob: self.blob.clone(),
|
blob: self.blob.clone(),
|
||||||
|
|
|
@ -157,8 +157,9 @@ pub trait IStore {
|
||||||
#[derive(Clone,Debug,PartialEq,Eq,Hash)]
|
#[derive(Clone,Debug,PartialEq,Eq,Hash)]
|
||||||
pub struct UnicityBuffer(Vec<u8>);
|
pub struct UnicityBuffer(Vec<u8>);
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
pub trait IBuilder: std::fmt::Debug {
|
pub trait IBuilder: std::fmt::Debug {
|
||||||
fn build(&self) -> Result<Store, StorageError>;
|
async fn build(&self) -> Result<Store, StorageError>;
|
||||||
|
|
||||||
/// Returns an opaque buffer that uniquely identifies this builder
|
/// Returns an opaque buffer that uniquely identifies this builder
|
||||||
fn unique(&self) -> UnicityBuffer;
|
fn unique(&self) -> UnicityBuffer;
|
||||||
|
|
Loading…
Reference in a new issue