Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit 6edbace

Browse files
committed
Optimize project structure
1 parent 046a98d commit 6edbace

15 files changed

Lines changed: 165 additions & 127 deletions

File tree

Cargo.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/cursor-core/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ chrono = "0.4"
1818
js-sys = "0.3"
1919
sha256 = "1"
2020
rand = "0.8"
21-
getrandom = { version = "0.2", features = ["js"] }
21+
getrandom = { version = "0.2", features = ["js"] }
22+
uuid = { version = "1", features = ["v4", "wasm-bindgen"] }

crates/cursor-core/src/auth/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
use node_bridge::prelude::*;
21
use rand::RngCore;
3-
use wasm_bindgen::prelude::*;
42

53
fn random_bytes() -> Vec<u8> {
64
let mut rng = rand::thread_rng();
75
let mut bytes = vec![0u8; 32];
8-
rng.try_fill_bytes(&mut bytes);
6+
let _ = rng.try_fill_bytes(&mut bytes);
97
bytes
108
}
File renamed without changes.

crates/cursor-core/src/chat/session.rs renamed to crates/cursor-core/src/conversation/chat/session.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use futures::StreamExt;
2-
use node_bridge::{bindings::uuid, prelude::*};
2+
use node_bridge::prelude::*;
3+
use uuid::Uuid;
34
use wasm_bindgen::JsValue;
45

56
use crate::{
6-
models::{user_message::UserMessage, BotMessage, MessageType, RequestBody, UserRequest},
7-
request::make_request,
7+
conversation::{
8+
make_conversation_request,
9+
models::{user_message::UserMessage, BotMessage, MessageType, RequestBody, UserRequest},
10+
},
811
GenerateInput,
912
};
1013

@@ -60,13 +63,13 @@ impl Session {
6063
pub fn new() -> Self {
6164
Self {
6265
request_body: None,
63-
conversation_id: uuid::uuid_v4(),
66+
conversation_id: Uuid::new_v4().to_string(),
6467
}
6568
}
6669

6770
pub async fn send_message(&mut self, input: &GenerateInput) -> Result<(), JsValue> {
6871
let request_body = self.body_with_input(input);
69-
let mut state = make_request("/conversation", request_body, true).await?;
72+
let mut state = make_conversation_request("/conversation", request_body, true).await?;
7073

7174
let mut message: String = "".to_owned();
7275

crates/cursor-core/src/generate/mod.rs renamed to crates/cursor-core/src/conversation/generate/mod.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
use std::future::IntoFuture;
22

3-
use crate::{models::*, request::make_request, GenerateInput};
43
use futures::{
54
future::{select, Either},
65
StreamExt,
76
};
87
use node_bridge::futures::Defer;
98
use node_bridge::prelude::*;
9+
use uuid::Uuid;
1010
use wasm_bindgen::prelude::*;
1111

12+
use crate::GenerateInput;
13+
14+
use super::{
15+
make_conversation_request,
16+
models::{BotMessage, MessageType, RequestBody},
17+
};
18+
1219
async fn generate_code_inner(input: &GenerateInput) -> Result<(), JsValue> {
1320
let file_path = input.file_path();
1421
let selection = input.selection_range();
@@ -34,7 +41,7 @@ async fn generate_code_inner(input: &GenerateInput) -> Result<(), JsValue> {
3441
#[cfg(debug_assertions)]
3542
console::log_str(&serde_json::to_string(&request_body).unwrap());
3643

37-
let mut state = make_request(
44+
let mut state = make_conversation_request(
3845
if interrupted {
3946
"/continue/"
4047
} else {
@@ -78,7 +85,7 @@ async fn generate_code_inner(input: &GenerateInput) -> Result<(), JsValue> {
7885

7986
// Generate an UUID as conversation ID.
8087
if conversation_id.is_none() {
81-
conversation_id = Some(node_bridge::bindings::uuid::uuid_v4());
88+
conversation_id = Some(Uuid::new_v4().to_string());
8289
}
8390
let bot_message = BotMessage::new(
8491
conversation_id.clone().unwrap(),
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
pub mod chat;
2+
pub mod generate;
3+
pub mod models;
4+
5+
use std::cell::Cell;
6+
7+
use futures::{stream, Stream, StreamExt};
8+
use node_bridge::{
9+
http_client::{HttpMethod, HttpResponse},
10+
prelude::console,
11+
};
12+
use wasm_bindgen::JsValue;
13+
14+
use crate::request::make_request;
15+
16+
use self::models::RequestBody;
17+
18+
struct ResponseState {
19+
response: HttpResponse,
20+
started: Cell<bool>,
21+
ended: Cell<bool>,
22+
first_newline_dropped: Cell<bool>,
23+
expect_begin_message: bool,
24+
}
25+
26+
impl ResponseState {
27+
fn new(response: HttpResponse, expect_begin_message: bool) -> Self {
28+
Self {
29+
response,
30+
started: Cell::new(false),
31+
ended: Cell::new(false),
32+
first_newline_dropped: Cell::new(false),
33+
expect_begin_message,
34+
}
35+
}
36+
37+
pub fn data_stream(&mut self) -> impl Stream<Item = String> + '_ {
38+
#[cfg(debug_assertions)]
39+
if !self.expect_begin_message {
40+
console::log_str(&format!("ignore begin message"));
41+
}
42+
self.started.set(!self.expect_begin_message);
43+
44+
self.response.body().flat_map(|chunk| {
45+
let chunk = chunk.to_string("utf-8");
46+
#[cfg(debug_assertions)]
47+
console::log_str(&chunk);
48+
49+
let lines: Vec<_> = chunk
50+
.split("\n")
51+
.filter_map(|l| {
52+
if l.len() > 0 && l.starts_with("data: \"") {
53+
serde_json::from_str::<String>(&l["data: ".len()..]).ok()
54+
} else {
55+
None
56+
}
57+
})
58+
.filter(|s| {
59+
if self.ended.get() {
60+
return false;
61+
}
62+
if s == "<|BEGIN_message|>" {
63+
self.started.set(true);
64+
return false;
65+
}
66+
if s == "<|END_message|>" {
67+
self.ended.set(true);
68+
return false;
69+
}
70+
if !self.started.get() {
71+
return false;
72+
}
73+
// Server may produce newlines at the head of response, we need
74+
// to do this trick to ignore them in the final edit.
75+
if !self.first_newline_dropped.get()
76+
&& s.trim().is_empty()
77+
&& self.expect_begin_message
78+
{
79+
self.first_newline_dropped.set(true);
80+
return false;
81+
}
82+
true
83+
})
84+
.collect();
85+
stream::iter(lines)
86+
})
87+
}
88+
89+
pub async fn complete(self) -> Result<(), JsValue> {
90+
self.response.await
91+
}
92+
}
93+
94+
async fn make_conversation_request(
95+
path: &str,
96+
body: &RequestBody,
97+
expect_begin_message: bool,
98+
) -> Result<ResponseState, JsValue> {
99+
let response = make_request(path, body, HttpMethod::Post).await?;
100+
if response.status_code() != 200 {
101+
return Err(js_sys::Error::new(&format!(
102+
"Server returned status code {}",
103+
response.status_code()
104+
))
105+
.into());
106+
}
107+
Ok(ResponseState::new(response, expect_begin_message))
108+
}

crates/cursor-core/src/models/bot_message.rs renamed to crates/cursor-core/src/conversation/models/bot_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use serde::Serialize;
22

3-
use super::{random, request_body::MessageType};
3+
use super::{request_body::MessageType, random};
44

55
#[derive(Debug, Serialize, Clone)]
66
pub struct BotMessage {
File renamed without changes.

crates/cursor-core/src/models/mod.rs renamed to crates/cursor-core/src/conversation/models/mod.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
pub(crate) mod bot_message;
1+
mod bot_message;
22
mod code_area;
3-
pub(crate) mod request_body;
4-
pub(crate) mod user_message;
5-
pub(crate) mod user_request;
3+
pub(super) mod request_body;
4+
pub(super) mod user_message;
5+
pub(super) mod user_request;
66

7-
pub(crate) use bot_message::*;
8-
pub(crate) use request_body::*;
9-
pub(crate) use user_request::*;
7+
pub(super) use bot_message::*;
8+
use rand::Rng;
9+
pub(super) use request_body::*;
10+
pub(super) use user_request::*;
1011

1112
fn random() -> i32 {
12-
js_sys::Math::floor(js_sys::Math::random() * 1000.0) as i32
13+
rand::thread_rng().gen_range(0..=1000)
1314
}
1415

1516
// Split the code into chunks of 20 line blocks.

0 commit comments

Comments
 (0)