diff --git a/server/src/rpc.rs b/server/src/rpc.rs index bbc3f23822..2bd0eac625 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -499,7 +499,9 @@ impl Server { request: TypedEnvelope, ) -> tide::Result<()> { self.broadcast_in_worktree(request.payload.worktree_id, &request) - .await + .await?; + self.peer.respond(request.receipt(), proto::Ack {}).await?; + Ok(()) } async fn buffer_saved( diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index d290454f46..7b2fea9175 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -234,6 +234,7 @@ impl Worktree { .into_iter() .map(|p| (PeerId(p.peer_id), p.replica_id as ReplicaId)) .collect(), + queued_operations: Default::default(), languages, _subscriptions, }) @@ -656,6 +657,7 @@ pub struct LocalWorktree { shared_buffers: HashMap>>, peers: HashMap, languages: Arc, + queued_operations: Vec<(u64, Operation)>, fs: Arc, } @@ -711,6 +713,7 @@ impl LocalWorktree { poll_task: None, open_buffers: Default::default(), shared_buffers: Default::default(), + queued_operations: Default::default(), peers: Default::default(), languages, fs, @@ -1091,6 +1094,7 @@ pub struct RemoteWorktree { open_buffers: HashMap, peers: HashMap, languages: Arc, + queued_operations: Vec<(u64, Operation)>, _subscriptions: Vec, } @@ -1550,16 +1554,23 @@ impl File { .map(|share| (share.rpc.clone(), share.remote_id)), Worktree::Remote(worktree) => Some((worktree.rpc.clone(), worktree.remote_id)), } { - cx.spawn(|_, _| async move { + cx.spawn(|worktree, mut cx| async move { if let Err(error) = rpc - .send(proto::UpdateBuffer { + .request(proto::UpdateBuffer { worktree_id: remote_id, buffer_id, - operations: Some(operation).iter().map(Into::into).collect(), + operations: vec![(&operation).into()], }) .await { - log::error!("error sending buffer operation: {}", error); + worktree.update(&mut cx, |worktree, _| { + log::error!("error sending buffer operation: {}", error); + match worktree { + Worktree::Local(t) => &mut t.queued_operations, + Worktree::Remote(t) => &mut t.queued_operations, + } + .push((buffer_id, operation)); + }); } }) .detach(); diff --git a/zrpc/src/proto.rs b/zrpc/src/proto.rs index 6274c187e1..af9dbf3abc 100644 --- a/zrpc/src/proto.rs +++ b/zrpc/src/proto.rs @@ -159,6 +159,7 @@ request_messages!( (OpenWorktree, OpenWorktreeResponse), (Ping, Ack), (SaveBuffer, BufferSaved), + (UpdateBuffer, Ack), (ShareWorktree, ShareWorktreeResponse), (SendChannelMessage, SendChannelMessageResponse), (GetChannelMessages, GetChannelMessagesResponse),