Skip to content

Commit a667080

Browse files
committed
Address Rust SDK review comments
1 parent bb4e0e5 commit a667080

2 files changed

Lines changed: 75 additions & 2 deletions

File tree

packages/sdk-rust/src/lib.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,53 @@
6464
//! Ok(())
6565
//! }
6666
//! ```
67+
//!
68+
//! ## Raw Events and Normalization
69+
//!
70+
//! ```rust,no_run
71+
//! use relaycast::{normalize_inbound_event, WsClient, WsClientOptions};
72+
//!
73+
//! #[tokio::main]
74+
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
75+
//! let mut ws = WsClient::new(WsClientOptions::new("at_live_agent_token"));
76+
//! let mut raw_events = ws.subscribe_raw_events();
77+
//! ws.connect().await?;
78+
//!
79+
//! while let Ok(raw) = raw_events.recv().await {
80+
//! if let Some(event) = normalize_inbound_event(&raw) {
81+
//! println!("{} -> {}: {}", event.from, event.target, event.text);
82+
//! }
83+
//! }
84+
//!
85+
//! Ok(())
86+
//! }
87+
//! ```
88+
//!
89+
//! ## Registration and Channel Startup
90+
//!
91+
//! ```rust,no_run
92+
//! use relaycast::{
93+
//! AgentRegistrationClient, CreateChannelRequest, RelayCast, RelayCastOptions,
94+
//! };
95+
//!
96+
//! #[tokio::main]
97+
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
98+
//! let relay = RelayCast::new(RelayCastOptions::new("rk_live_your_api_key"))?;
99+
//! let registration = AgentRegistrationClient::new(relay, "codex");
100+
//! let agent = registration
101+
//! .registered_agent_client("worker-a", Some("codex"))
102+
//! .await?;
103+
//!
104+
//! agent.ensure_joined_channel(CreateChannelRequest {
105+
//! name: "general".to_string(),
106+
//! topic: Some("General discussion".to_string()),
107+
//! metadata: None,
108+
//! }).await?;
109+
//! agent.send("#general", "ready", None, None, None).await?;
110+
//!
111+
//! Ok(())
112+
//! }
113+
//! ```
67114
68115
pub mod agent;
69116
pub mod client;

packages/sdk-rust/src/ws.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,14 +344,14 @@ impl WsClient {
344344
}
345345
Err(err) => {
346346
if debug {
347-
warn!("[relaycast] Dropped typed WebSocket event: {}: {}", err, &text[..text.len().min(200)]);
347+
warn!("[relaycast] Dropped typed WebSocket event: {}: {}", err, truncate_str(&text, 200));
348348
}
349349
}
350350
}
351351
}
352352
Err(err) => {
353353
if debug {
354-
warn!("[relaycast] Dropped non-JSON WebSocket message: {}: {}", err, &text[..text.len().min(200)]);
354+
warn!("[relaycast] Dropped non-JSON WebSocket message: {}: {}", err, truncate_str(&text, 200));
355355
}
356356
}
357357
}
@@ -506,3 +506,29 @@ fn reconnect_delay_ms(attempt: u32, max_delay_ms: u64) -> u64 {
506506
let delay = 1_000u64.saturating_mul(2u64.saturating_pow(exp));
507507
delay.min(max_delay_ms.max(1_000))
508508
}
509+
510+
fn truncate_str(s: &str, max_chars: usize) -> &str {
511+
match s.char_indices().nth(max_chars) {
512+
Some((idx, _)) => &s[..idx],
513+
None => s,
514+
}
515+
}
516+
517+
#[cfg(test)]
518+
mod tests {
519+
use super::truncate_str;
520+
521+
#[test]
522+
fn truncate_str_respects_utf8_boundaries() {
523+
let text = "😀".repeat(201);
524+
let truncated = truncate_str(&text, 200);
525+
526+
assert_eq!(truncated.chars().count(), 200);
527+
assert!(truncated.is_char_boundary(truncated.len()));
528+
}
529+
530+
#[test]
531+
fn truncate_str_returns_short_strings_unchanged() {
532+
assert_eq!(truncate_str("hello", 200), "hello");
533+
}
534+
}

0 commit comments

Comments
 (0)