Synap Rust SDK
Official Rust client library for Synap - High-Performance In-Memory Key-Value Store & Message Broker.
Features
- 💾 Key-Value Store: Fast async KV operations with TTL support
- 📨 Message Queues: RabbitMQ-style queues with ACK/NACK + reactive consumption
- 📡 Event Streams: Kafka-style event streams reactive by default 🔥
- 🔔 Pub/Sub: Topic-based messaging reactive by default 🔥
- 🔄 Reactive Patterns:
futures::Streamfor event-driven consumption - ⚡ StreamableHTTP Protocol: Single unified endpoint for all operations
- 🛡️ Type-Safe: Leverages Rust's type system for correctness
- 📦 Async/Await: Built on Tokio for high-performance async I/O
Installation
Add this to your Cargo.toml:
[]
= "0.1"
= { = "1", = ["full"] }
Quick Start
use ;
use json;
async
API Reference
Key-Value Store
// Set a value
client.kv.set.await?;
client.kv.set.await?; // with TTL
// Get a value
let value: = client.kv.get.await?;
let number: = client.kv.get.await?;
// Delete a key
client.kv.delete.await?;
// Check existence
let exists = client.kv.exists.await?;
// Atomic operations
let new_value = client.kv.incr.await?;
let new_value = client.kv.decr.await?;
// Get statistics
let stats = client.kv.stats.await?;
println!;
Message Queues
// Create a queue
client.queue.create_queue.await?;
// Publish a message
let msg_id = client.queue.publish.await?;
// Consume a message
let message = client.queue.consume.await?;
if let Some = message
// Get queue stats
let stats = client.queue.stats.await?;
println!;
// List all queues
let queues = client.queue.list.await?;
// Delete a queue
client.queue.delete_queue.await?;
Event Streams (Reactive by Default)
Event streams are reactive by default - use observe_events() or observe_event() for continuous event consumption.
use StreamExt;
use Duration;
// Create a stream room
client.stream.create_room.await?;
// Publish an event
let offset = client.stream.publish.await?;
// ✨ Reactive: Observe ALL events
let = client.stream
.observe_events;
spawn;
// ✨ Reactive: Observe SPECIFIC event type
let = client.stream
.observe_event;
while let Some = messages.next.await
// Stop observing
handle.unsubscribe;
handle2.unsubscribe;
// Get room stats
let stats = client.stream.stats.await?;
// List all rooms
let rooms = client.stream.list.await?;
// Delete a room
client.stream.delete_room.await?;
Pub/Sub (Reactive by Default)
Pub/Sub is reactive by default - use subscribe() for event-driven message consumption.
use HashMap;
// Publish to a topic
let delivered_count = client.pubsub.publish.await?;
// ✨ Subscribe to topics (with wildcards)
let sub_id = client.pubsub.subscribe_topics.await?;
// TODO: Reactive subscription (coming soon)
// let (mut messages, handle) = client.pubsub()
// .observe("user-123", vec!["events.*"]);
// Unsubscribe
client.pubsub.unsubscribe.await?;
// List active topics
let topics = client.pubsub.list_topics.await?;
Configuration
use SynapConfig;
use Duration;
let config = new
.with_timeout
.with_auth_token
.with_max_retries;
let client = new?;
Error Handling
use SynapError;
match client.kv..await
Reactive Programming (RxJS-style)
The SDK now includes RxJS-style reactive patterns via the rx module:
use ;
// Observable with operators (like RxJS pipe)
let obs = from_stream;
obs.filter
.map
.take
.subscribe_next;
// Subject for multicasting
let subject = new;
subject.subscribe;
subject.subscribe;
subject.next; // Both subscribers receive it
See src/rx/README.md for complete guide.
Examples
See the examples/ directory for more examples:
basic.rs- Basic KV operationsqueue.rs- Task queue pattern (traditional)reactive_queue.rs- Reactive queue consumption 🔥stream.rs- Event stream (traditional)reactive_stream.rs- Reactive event consumption 🔥pubsub.rs- Pub/Sub messagingrxjs_style.rs- RxJS-style patterns ⭐ NEW
Run an example:
Testing
# Run tests (requires Synap server running on localhost:15500)
# Or use a custom server URL
SYNAP_URL=http://localhost:15500
License
MIT License - See LICENSE for details.