chore: refactor conversations

This commit is contained in:
kaichaosun 2026-02-03 12:39:10 +08:00
parent 74695877fa
commit 6c54bbd79d
No known key found for this signature in database
GPG Key ID: 223E0F992F4F03BF
6 changed files with 24 additions and 52 deletions

View File

@ -1,7 +1,8 @@
use std::{collections::HashMap, rc::Rc, sync::Arc}; use std::{collections::HashMap, rc::Rc, sync::Arc};
use crate::{ use crate::{
conversation::{ConversationStore, Convo, Id}, // conversation::{ConversationStore, Convo, Id},
conversation::common::{ConversationStore, Convo, HasConversationId},
errors::ChatError, errors::ChatError,
identity::Identity, identity::Identity,
inbox::Inbox, inbox::Inbox,
@ -99,7 +100,7 @@ impl Context {
Ok(Introduction::from(pkb).into()) Ok(Introduction::from(pkb).into())
} }
fn add_convo(&mut self, convo: impl Convo + Id + 'static) -> ConvoHandle { fn add_convo(&mut self, convo: impl Convo + HasConversationId + 'static) -> ConvoHandle {
let handle = self.next_convo_handle; let handle = self.next_convo_handle;
self.next_convo_handle += 1; self.next_convo_handle += 1;
let convo_id = self.store.insert_convo(convo); let convo_id = self.store.insert_convo(convo);
@ -125,14 +126,15 @@ impl Context {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::conversation::privatev1::PrivateV1Convo;
use super::*; use super::*;
use crate::conversation::GroupTestConvo;
#[test] #[test]
fn convo_store_get() { fn convo_store_get() {
let mut store: ConversationStore = ConversationStore::new(); let mut store: ConversationStore = ConversationStore::new();
let new_convo = GroupTestConvo::new(); let new_convo = PrivateV1Convo::new([0; 32].into());
let convo_id = store.insert_convo(new_convo); let convo_id = store.insert_convo(new_convo);
let convo = store.get_mut(&convo_id).ok_or_else(|| 0); let convo = store.get_mut(&convo_id).ok_or_else(|| 0);

View File

@ -8,18 +8,18 @@ use crate::types::{AddressedEncryptedPayload, ContentData};
pub type ConversationId<'a> = &'a str; pub type ConversationId<'a> = &'a str;
pub type ConversationIdOwned = Arc<str>; pub type ConversationIdOwned = Arc<str>;
pub trait Id: Debug { pub trait HasConversationId: Debug {
fn id(&self) -> ConversationId; fn id(&self) -> ConversationId;
} }
pub trait ConvoFactory: Id + Debug { pub trait ConvoFactory: HasConversationId + Debug {
fn handle_frame( fn handle_frame(
&mut self, &mut self,
encoded_payload: &[u8], encoded_payload: &[u8],
) -> Result<(Box<dyn Convo>, Vec<ContentData>), ChatError>; ) -> Result<(Box<dyn Convo>, Vec<ContentData>), ChatError>;
} }
pub trait Convo: Id + Debug { pub trait Convo: HasConversationId + Debug {
fn send_message(&mut self, content: &[u8]) fn send_message(&mut self, content: &[u8])
-> Result<Vec<AddressedEncryptedPayload>, ChatError>; -> Result<Vec<AddressedEncryptedPayload>, ChatError>;
@ -39,7 +39,10 @@ impl ConversationStore {
} }
} }
pub fn insert_convo(&mut self, conversation: impl Convo + Id + 'static) -> ConversationIdOwned { pub fn insert_convo(
&mut self,
conversation: impl Convo + HasConversationId + 'static,
) -> ConversationIdOwned {
let key: ConversationIdOwned = Arc::from(conversation.id()); let key: ConversationIdOwned = Arc::from(conversation.id());
self.conversations self.conversations
.insert(key.clone(), Box::new(conversation)); .insert(key.clone(), Box::new(conversation));
@ -48,7 +51,7 @@ impl ConversationStore {
pub fn register_factory( pub fn register_factory(
&mut self, &mut self,
handler: impl ConvoFactory + Id + 'static, handler: impl ConvoFactory + HasConversationId + 'static,
) -> ConversationIdOwned { ) -> ConversationIdOwned {
let key: ConversationIdOwned = Arc::from(handler.id()); let key: ConversationIdOwned = Arc::from(handler.id());
self.factories.insert(key.clone(), Box::new(handler)); self.factories.insert(key.clone(), Box::new(handler));
@ -75,9 +78,3 @@ impl ConversationStore {
self.factories.keys().cloned() self.factories.keys().cloned()
} }
} }
mod group_test;
mod privatev1;
pub use group_test::GroupTestConvo;
pub use privatev1::PrivateV1Convo;

View File

@ -1,33 +0,0 @@
use crate::{
conversation::{ChatError, ConversationId, Convo, Id},
types::AddressedEncryptedPayload,
};
#[derive(Debug)]
pub struct GroupTestConvo {}
impl GroupTestConvo {
pub fn new() -> Self {
Self {}
}
}
impl Id for GroupTestConvo {
fn id(&self) -> ConversationId {
// implementation
"grouptest"
}
}
impl Convo for GroupTestConvo {
fn send_message(
&mut self,
_content: &[u8],
) -> Result<Vec<AddressedEncryptedPayload>, ChatError> {
Ok(vec![])
}
fn remote_id(&self) -> String {
self.id().to_string()
}
}

View File

@ -0,0 +1,2 @@
pub mod common;
pub mod privatev1;

View File

@ -6,7 +6,8 @@ use crypto::SecretKey;
use prost::{Message, bytes::Bytes}; use prost::{Message, bytes::Bytes};
use crate::{ use crate::{
conversation::{ChatError, ConversationId, Convo, Id}, conversation::common::{ConversationId, Convo, HasConversationId},
errors::ChatError,
types::AddressedEncryptedPayload, types::AddressedEncryptedPayload,
utils::timestamp_millis, utils::timestamp_millis,
}; };
@ -34,7 +35,7 @@ impl PrivateV1Convo {
} }
} }
impl Id for PrivateV1Convo { impl HasConversationId for PrivateV1Convo {
fn id(&self) -> ConversationId { fn id(&self) -> ConversationId {
// TODO: implementation // TODO: implementation
"private_v1_convo_id" "private_v1_convo_id"

View File

@ -8,8 +8,11 @@ use std::rc::Rc;
use crypto::{PrekeyBundle, SecretKey}; use crypto::{PrekeyBundle, SecretKey};
use crate::context::Introduction; use crate::context::Introduction;
use crate::conversation::{ChatError, ConversationId, Convo, ConvoFactory, Id, PrivateV1Convo}; use crate::conversation::common::{ConversationId, Convo, ConvoFactory, HasConversationId};
use crate::conversation::privatev1::PrivateV1Convo;
// use crate::conversation::{ChatError, ConversationId, Convo, ConvoFactory, Id, PrivateV1Convo};
use crate::crypto::{Blake2b128, CopyBytes, Digest, PublicKey, StaticSecret}; use crate::crypto::{Blake2b128, CopyBytes, Digest, PublicKey, StaticSecret};
use crate::errors::ChatError;
use crate::identity::Identity; use crate::identity::Identity;
use crate::inbox::handshake::InboxHandshake; use crate::inbox::handshake::InboxHandshake;
use crate::proto; use crate::proto;
@ -200,7 +203,7 @@ impl Inbox {
} }
} }
impl Id for Inbox { impl HasConversationId for Inbox {
fn id(&self) -> ConversationId { fn id(&self) -> ConversationId {
&self.local_convo_id &self.local_convo_id
} }