@ -272,6 +272,8 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static {
|
||||
self.batch().write().await.push((req, source_range));
|
||||
self.stats().commands_batched.fetch_add(1, Ordering::Relaxed);
|
||||
|
||||
self.flush_batch(false, source_range).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -324,36 +326,36 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static {
|
||||
source_range: SourceRange,
|
||||
cmd: &ModelingCmd,
|
||||
) -> Result<OkWebSocketResponseData, crate::errors::KclError> {
|
||||
self.batch_modeling_cmd(id, source_range, cmd).await?;
|
||||
let mut requests = self.take_batch().await.clone();
|
||||
|
||||
// Add the command to the batch.
|
||||
requests.push((
|
||||
WebSocketRequest::ModelingCmdReq(ModelingCmdReq {
|
||||
cmd: cmd.clone(),
|
||||
cmd_id: id.into(),
|
||||
}),
|
||||
source_range,
|
||||
));
|
||||
self.stats().commands_batched.fetch_add(1, Ordering::Relaxed);
|
||||
|
||||
// Flush the batch queue.
|
||||
self.flush_batch(false, source_range).await
|
||||
self.run_batch(requests, source_range).await
|
||||
}
|
||||
|
||||
/// Force flush the batch queue.
|
||||
async fn flush_batch(
|
||||
/// Run the batch for the specifc commands.
|
||||
async fn run_batch(
|
||||
&self,
|
||||
// Whether or not to flush the end commands as well.
|
||||
// We only do this at the very end of the file.
|
||||
batch_end: bool,
|
||||
orig_requests: Vec<(WebSocketRequest, SourceRange)>,
|
||||
source_range: SourceRange,
|
||||
) -> Result<OkWebSocketResponseData, crate::errors::KclError> {
|
||||
let all_requests = if batch_end {
|
||||
let mut requests = self.take_batch().await.clone();
|
||||
requests.extend(self.take_batch_end().await.values().cloned());
|
||||
requests
|
||||
} else {
|
||||
self.take_batch().await.clone()
|
||||
};
|
||||
|
||||
// Return early if we have no commands to send.
|
||||
if all_requests.is_empty() {
|
||||
if orig_requests.is_empty() {
|
||||
return Ok(OkWebSocketResponseData::Modeling {
|
||||
modeling_response: OkModelingCmdResponse::Empty {},
|
||||
});
|
||||
}
|
||||
|
||||
let requests: Vec<ModelingCmdReq> = all_requests
|
||||
let requests: Vec<ModelingCmdReq> = orig_requests
|
||||
.iter()
|
||||
.filter_map(|(val, _)| match val {
|
||||
WebSocketRequest::ModelingCmdReq(ModelingCmdReq { cmd, cmd_id }) => Some(ModelingCmdReq {
|
||||
@ -370,9 +372,9 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static {
|
||||
responses: true,
|
||||
});
|
||||
|
||||
let final_req = if all_requests.len() == 1 {
|
||||
let final_req = if orig_requests.len() == 1 {
|
||||
// We can unwrap here because we know the batch has only one element.
|
||||
all_requests.first().unwrap().0.clone()
|
||||
orig_requests.first().unwrap().0.clone()
|
||||
} else {
|
||||
batched_requests
|
||||
};
|
||||
@ -380,7 +382,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static {
|
||||
// Create the map of original command IDs to source range.
|
||||
// This is for the wasm side, kurt needs it for selections.
|
||||
let mut id_to_source_range = HashMap::new();
|
||||
for (req, range) in all_requests.iter() {
|
||||
for (req, range) in orig_requests.iter() {
|
||||
match req {
|
||||
WebSocketRequest::ModelingCmdReq(ModelingCmdReq { cmd: _, cmd_id }) => {
|
||||
id_to_source_range.insert(Uuid::from(*cmd_id), *range);
|
||||
@ -395,7 +397,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static {
|
||||
}
|
||||
|
||||
// Do the artifact commands.
|
||||
for (req, _) in all_requests.iter() {
|
||||
for (req, _) in orig_requests.iter() {
|
||||
match &req {
|
||||
WebSocketRequest::ModelingCmdBatchReq(ModelingBatch { requests, .. }) => {
|
||||
for request in requests {
|
||||
@ -466,6 +468,25 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static {
|
||||
}
|
||||
}
|
||||
|
||||
/// Force flush the batch queue.
|
||||
async fn flush_batch(
|
||||
&self,
|
||||
// Whether or not to flush the end commands as well.
|
||||
// We only do this at the very end of the file.
|
||||
batch_end: bool,
|
||||
source_range: SourceRange,
|
||||
) -> Result<OkWebSocketResponseData, crate::errors::KclError> {
|
||||
let all_requests = if batch_end {
|
||||
let mut requests = self.take_batch().await.clone();
|
||||
requests.extend(self.take_batch_end().await.values().cloned());
|
||||
requests
|
||||
} else {
|
||||
self.take_batch().await.clone()
|
||||
};
|
||||
|
||||
self.run_batch(all_requests, source_range).await
|
||||
}
|
||||
|
||||
async fn make_default_plane(
|
||||
&self,
|
||||
plane_id: uuid::Uuid,
|
||||
|
Reference in New Issue
Block a user