mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-25 15:16:07 +00:00
Make MessageQueue generic, collapse Message into a single struct
This commit is contained in:
@@ -8,8 +8,6 @@ use std::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use rbx_tree::RbxId;
|
|
||||||
|
|
||||||
/// A unique identifier, not guaranteed to be generated in any order.
|
/// A unique identifier, not guaranteed to be generated in any order.
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
pub struct ListenerId(usize);
|
pub struct ListenerId(usize);
|
||||||
@@ -21,32 +19,21 @@ pub fn get_listener_id() -> ListenerId {
|
|||||||
ListenerId(LAST_ID.fetch_add(1, Ordering::SeqCst))
|
ListenerId(LAST_ID.fetch_add(1, Ordering::SeqCst))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
||||||
#[serde(tag = "type")]
|
|
||||||
pub enum Message {
|
|
||||||
InstancesRemoved {
|
|
||||||
ids: Vec<RbxId>,
|
|
||||||
},
|
|
||||||
InstancesUpdated {
|
|
||||||
ids: Vec<RbxId>,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct MessageQueue {
|
pub struct MessageQueue<T> {
|
||||||
messages: RwLock<Vec<Message>>,
|
messages: RwLock<Vec<T>>,
|
||||||
message_listeners: Mutex<HashMap<ListenerId, mpsc::Sender<()>>>,
|
message_listeners: Mutex<HashMap<ListenerId, mpsc::Sender<()>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MessageQueue {
|
impl<T: Clone> MessageQueue<T> {
|
||||||
pub fn new() -> MessageQueue {
|
pub fn new() -> MessageQueue<T> {
|
||||||
MessageQueue {
|
MessageQueue {
|
||||||
messages: RwLock::new(Vec::new()),
|
messages: RwLock::new(Vec::new()),
|
||||||
message_listeners: Mutex::new(HashMap::new()),
|
message_listeners: Mutex::new(HashMap::new()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_messages(&self, new_messages: &[Message]) {
|
pub fn push_messages(&self, new_messages: &[T]) {
|
||||||
let message_listeners = self.message_listeners.lock().unwrap();
|
let message_listeners = self.message_listeners.lock().unwrap();
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -77,7 +64,7 @@ impl MessageQueue {
|
|||||||
self.messages.read().unwrap().len() as u32
|
self.messages.read().unwrap().len() as u32
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_messages_since(&self, cursor: u32) -> (u32, Vec<Message>) {
|
pub fn get_messages_since(&self, cursor: u32) -> (u32, Vec<T>) {
|
||||||
let messages = self.messages.read().unwrap();
|
let messages = self.messages.read().unwrap();
|
||||||
|
|
||||||
let current_cursor = messages.len() as u32;
|
let current_cursor = messages.len() as u32;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::{
|
use std::{
|
||||||
borrow::Cow,
|
borrow::Cow,
|
||||||
collections::HashMap,
|
collections::{HashMap, HashSet},
|
||||||
path::Path,
|
path::Path,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
str,
|
str,
|
||||||
@@ -10,23 +10,34 @@ use rbx_tree::{RbxTree, RbxValue, RbxId};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
project::{Project, ProjectNode, InstanceProjectNode},
|
project::{Project, ProjectNode, InstanceProjectNode},
|
||||||
message_queue::{Message, MessageQueue},
|
message_queue::MessageQueue,
|
||||||
imfs::{Imfs, ImfsItem, ImfsFile},
|
imfs::{Imfs, ImfsItem, ImfsFile},
|
||||||
path_map::PathMap,
|
path_map::PathMap,
|
||||||
rbx_snapshot::{RbxSnapshotInstance, reify_root, reconcile_subtree},
|
rbx_snapshot::{RbxSnapshotInstance, reify_root, reconcile_subtree},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct InstanceChanges {
|
||||||
|
pub added: HashSet<RbxId>,
|
||||||
|
pub removed: HashSet<RbxId>,
|
||||||
|
pub updated: HashSet<RbxId>,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct RbxSession {
|
pub struct RbxSession {
|
||||||
tree: RbxTree,
|
tree: RbxTree,
|
||||||
paths_to_node_ids: PathMap<RbxId>,
|
paths_to_node_ids: PathMap<RbxId>,
|
||||||
ids_to_project_paths: HashMap<RbxId, String>,
|
ids_to_project_paths: HashMap<RbxId, String>,
|
||||||
message_queue: Arc<MessageQueue>,
|
message_queue: Arc<MessageQueue<InstanceChanges>>,
|
||||||
imfs: Arc<Mutex<Imfs>>,
|
imfs: Arc<Mutex<Imfs>>,
|
||||||
project: Arc<Project>,
|
project: Arc<Project>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RbxSession {
|
impl RbxSession {
|
||||||
pub fn new(project: Arc<Project>, imfs: Arc<Mutex<Imfs>>, message_queue: Arc<MessageQueue>) -> RbxSession {
|
pub fn new(
|
||||||
|
project: Arc<Project>,
|
||||||
|
imfs: Arc<Mutex<Imfs>>,
|
||||||
|
message_queue: Arc<MessageQueue<InstanceChanges>>,
|
||||||
|
) -> RbxSession {
|
||||||
let tree = {
|
let tree = {
|
||||||
let temp_imfs = imfs.lock().unwrap();
|
let temp_imfs = imfs.lock().unwrap();
|
||||||
construct_initial_tree(&project, &temp_imfs)
|
construct_initial_tree(&project, &temp_imfs)
|
||||||
@@ -97,12 +108,14 @@ impl RbxSession {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let removed_ids: Vec<RbxId> = removed_subtree.iter_all_ids().collect();
|
let removed_ids: HashSet<RbxId> = removed_subtree.iter_all_ids().collect();
|
||||||
|
|
||||||
self.message_queue.push_messages(&[
|
self.message_queue.push_messages(&[
|
||||||
Message::InstancesRemoved {
|
InstanceChanges {
|
||||||
ids: removed_ids,
|
added: HashSet::new(),
|
||||||
},
|
removed: removed_ids,
|
||||||
|
updated: HashSet::new(),
|
||||||
|
}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,14 +8,14 @@ use crate::{
|
|||||||
project::Project,
|
project::Project,
|
||||||
imfs::Imfs,
|
imfs::Imfs,
|
||||||
session_id::SessionId,
|
session_id::SessionId,
|
||||||
rbx_session::RbxSession,
|
rbx_session::{RbxSession, InstanceChanges},
|
||||||
fs_watcher::FsWatcher,
|
fs_watcher::FsWatcher,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Session {
|
pub struct Session {
|
||||||
pub project: Arc<Project>,
|
pub project: Arc<Project>,
|
||||||
pub session_id: SessionId,
|
pub session_id: SessionId,
|
||||||
pub message_queue: Arc<MessageQueue>,
|
pub message_queue: Arc<MessageQueue<InstanceChanges>>,
|
||||||
pub rbx_session: Arc<Mutex<RbxSession>>,
|
pub rbx_session: Arc<Mutex<RbxSession>>,
|
||||||
_fs_watcher: FsWatcher,
|
_fs_watcher: FsWatcher,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ use rouille::{
|
|||||||
use rbx_tree::{RbxId, RootedRbxInstance};
|
use rbx_tree::{RbxId, RootedRbxInstance};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
message_queue::Message,
|
|
||||||
session::Session,
|
session::Session,
|
||||||
session_id::SessionId,
|
session_id::SessionId,
|
||||||
project::Project,
|
project::Project,
|
||||||
|
rbx_session::{InstanceChanges},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
@@ -43,7 +43,7 @@ pub struct ReadResponse<'a> {
|
|||||||
pub struct SubscribeResponse<'a> {
|
pub struct SubscribeResponse<'a> {
|
||||||
pub session_id: SessionId,
|
pub session_id: SessionId,
|
||||||
pub message_cursor: u32,
|
pub message_cursor: u32,
|
||||||
pub messages: Cow<'a, [Message]>,
|
pub messages: Cow<'a, [InstanceChanges]>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Server {
|
pub struct Server {
|
||||||
|
|||||||
Reference in New Issue
Block a user