mirror of
https://github.com/hexedtech/codemp.git
synced 2024-12-23 05:14:54 +01:00
Merge pull request #38 from hexedtech/fix/op-clip
fix: warn when clipping, gen agent id once
This commit is contained in:
commit
306a687354
1 changed files with 17 additions and 8 deletions
|
@ -16,7 +16,7 @@ use codemp_proto::buffer::{BufferEvent, Operation};
|
|||
use super::controller::{BufferController, BufferControllerInner};
|
||||
|
||||
struct BufferWorker {
|
||||
user_id: Uuid,
|
||||
agent_id: u32,
|
||||
path: String,
|
||||
latest_version: watch::Sender<diamond_types::LocalVersion>,
|
||||
local_version: watch::Sender<diamond_types::LocalVersion>,
|
||||
|
@ -52,6 +52,8 @@ impl BufferController {
|
|||
let (cb_tx, cb_rx) = watch::channel(None);
|
||||
|
||||
let (poller_tx, poller_rx) = mpsc::unbounded_channel();
|
||||
let mut oplog = OpLog::new();
|
||||
let agent_id = oplog.get_or_create_agent_id(&user_id.to_string());
|
||||
|
||||
let controller = Arc::new(BufferControllerInner {
|
||||
name: path.to_string(),
|
||||
|
@ -68,7 +70,7 @@ impl BufferController {
|
|||
let weak = Arc::downgrade(&controller);
|
||||
|
||||
let worker = BufferWorker {
|
||||
user_id,
|
||||
agent_id,
|
||||
path: path.to_string(),
|
||||
latest_version: latest_version_tx,
|
||||
local_version: my_version_tx,
|
||||
|
@ -156,21 +158,25 @@ impl BufferController {
|
|||
|
||||
impl BufferWorker {
|
||||
async fn handle_editor_change(&mut self, change: TextChange, tx: &mpsc::Sender<Operation>) {
|
||||
let agent_id = self.oplog.get_or_create_agent_id(&self.user_id.to_string());
|
||||
let last_ver = self.oplog.local_version();
|
||||
// clip to buffer extents
|
||||
let clip_end = std::cmp::min(self.branch.len(), change.end as usize);
|
||||
let clip_start = std::cmp::max(0, change.start as usize);
|
||||
let clip_start = change.start as usize;
|
||||
let mut clip_end = change.end as usize;
|
||||
let b_len = self.branch.len();
|
||||
if clip_end > b_len {
|
||||
tracing::warn!("clipping TextChange end span from {clip_end} to {b_len}");
|
||||
clip_end = b_len;
|
||||
};
|
||||
|
||||
// in case we have a "replace" span
|
||||
if change.is_delete() {
|
||||
self.branch
|
||||
.delete_without_content(&mut self.oplog, agent_id, clip_start..clip_end);
|
||||
.delete_without_content(&mut self.oplog, self.agent_id, clip_start..clip_end);
|
||||
}
|
||||
|
||||
if change.is_insert() {
|
||||
self.branch
|
||||
.insert(&mut self.oplog, agent_id, clip_start, &change.content);
|
||||
.insert(&mut self.oplog, self.agent_id, clip_start, &change.content);
|
||||
}
|
||||
|
||||
if change.is_delete() || change.is_insert() {
|
||||
|
@ -239,7 +245,10 @@ impl BufferWorker {
|
|||
diamond_types::list::operation::OpKind::Ins => {
|
||||
if dtop.end() - dtop.start() != dtop.content_as_str().unwrap_or_default().len()
|
||||
{
|
||||
tracing::error!("[?!?!] Insert span differs from effective content len (TODO remove this error after a bit)");
|
||||
tracing::warn!(
|
||||
"Insert span ({}, {}) differs from effective content len ({})",
|
||||
dtop.start(), dtop.end(), dtop.content_as_str().unwrap_or_default().len()
|
||||
);
|
||||
}
|
||||
crate::api::BufferUpdate {
|
||||
hash,
|
||||
|
|
Loading…
Reference in a new issue