rust version implemented
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
|
||||
## 1. Technical Contract Overview
|
||||
|
||||
This document defines the **technical contract** for NATSBridge - the cross-platform bi-directional data bridge that enables seamless communication between **Julia**, **JavaScript**, **Python**, **Dart**, and **MicroPython** applications using NATS as the message bus.
|
||||
This document defines the **technical contract** for NATSBridge - the cross-platform bi-directional data bridge that enables seamless communication between **Julia**, **JavaScript**, **Python**, **Dart**, **Rust**, and **MicroPython** applications using NATS as the message bus.
|
||||
|
||||
This specification serves as the single source of truth for:
|
||||
- **Inputs**: What data structures are accepted by `smartsend()`
|
||||
@@ -576,6 +576,67 @@ Future<[Map<String, dynamic>, String]> smartsend(
|
||||
}
|
||||
```
|
||||
|
||||
#### Rust
|
||||
|
||||
```rust
|
||||
pub async fn smartsend(
|
||||
subject: &str,
|
||||
data: &[(String, Payload, String)],
|
||||
options: &SmartsendOptions,
|
||||
) -> Result<(MsgEnvelopeV1, String), NatSBridgeError>
|
||||
|
||||
// SmartsendOptions struct
|
||||
pub struct SmartsendOptions {
|
||||
pub broker_url: String,
|
||||
pub fileserver_url: String,
|
||||
pub fileserver_upload_handler: Option<UploadHandler>,
|
||||
pub size_threshold: usize,
|
||||
pub correlation_id: String,
|
||||
pub msg_purpose: String,
|
||||
pub sender_name: String,
|
||||
pub receiver_name: String,
|
||||
pub receiver_id: String,
|
||||
pub reply_to: String,
|
||||
pub reply_to_msg_id: String,
|
||||
pub msg_id: String,
|
||||
pub sender_id: String,
|
||||
}
|
||||
|
||||
// Payload enum for type-safe data handling
|
||||
#[derive(Serialize, Deserialize, Clone)]
|
||||
pub enum Payload {
|
||||
Text(String),
|
||||
Dictionary(serde_json::Value),
|
||||
ArrowTable(Vec<u8>),
|
||||
JsonTable(serde_json::Value),
|
||||
Image(Vec<u8>),
|
||||
Audio(Vec<u8>),
|
||||
Video(Vec<u8>),
|
||||
Binary(Vec<u8>),
|
||||
}
|
||||
|
||||
// MsgEnvelopeV1 struct (serde-serializable)
|
||||
#[derive(Serialize, Deserialize, Clone)]
|
||||
pub struct MsgEnvelopeV1 {
|
||||
pub correlation_id: String,
|
||||
pub msg_id: String,
|
||||
pub timestamp: String,
|
||||
pub send_to: String,
|
||||
pub msg_purpose: String,
|
||||
pub sender_name: String,
|
||||
pub sender_id: String,
|
||||
pub receiver_name: String,
|
||||
pub receiver_id: String,
|
||||
pub reply_to: String,
|
||||
pub reply_to_msg_id: String,
|
||||
pub broker_url: String,
|
||||
pub metadata: serde_json::Value,
|
||||
pub payloads: Vec<MsgPayloadV1>,
|
||||
}
|
||||
```
|
||||
|
||||
**Note**: NATS publishing is the caller's responsibility. Returns `Result<(MsgEnvelopeV1, String), NatSBridgeError>`. Uses `serde` for JSON serialization.
|
||||
|
||||
### `smartreceive` Function Signature
|
||||
|
||||
#### Julia
|
||||
@@ -674,6 +735,25 @@ Future<Map<String, dynamic>> smartreceive(
|
||||
}
|
||||
```
|
||||
|
||||
#### Rust
|
||||
|
||||
```rust
|
||||
pub async fn smartreceive(
|
||||
msg_json_str: &str, // JSON string from NATS message payload
|
||||
options: &SmartreceiveOptions,
|
||||
) -> Result<MsgEnvelopeV1, NatSBridgeError>
|
||||
|
||||
// SmartreceiveOptions struct
|
||||
pub struct SmartreceiveOptions {
|
||||
pub fileserver_download_handler: Option<DownloadHandler>,
|
||||
pub max_retries: u32,
|
||||
pub base_delay: u64,
|
||||
pub max_delay: u64,
|
||||
}
|
||||
```
|
||||
|
||||
**Note**: Input is JSON string from NATS message payload. Returns `Result<MsgEnvelopeV1, NatSBridgeError>`.
|
||||
|
||||
---
|
||||
|
||||
## File Server Interface
|
||||
@@ -786,6 +866,18 @@ function fileserver_download_handler(
|
||||
| File server download | ✅ Supported | HTTP/HTTPS |
|
||||
| Size threshold | 500KB | Configurable |
|
||||
|
||||
### Rust
|
||||
|
||||
| Feature | Status | Notes |
|
||||
|---------|--------|-------|
|
||||
| Arrow IPC | ✅ Supported | Requires `arrow2` crate |
|
||||
| JSON table | ✅ Supported | Uses `serde_json` |
|
||||
| File server upload | ✅ Supported | HTTP/HTTPS via `reqwest` |
|
||||
| File server download | ✅ Supported | HTTP/HTTPS via `reqwest` with retry |
|
||||
| Size threshold | 500KB | Configurable |
|
||||
| Async runtime | ✅ Supported | Uses `tokio` for async I/O |
|
||||
| Type safety | ✅ Supported | Compile-time type checking via Rust enums |
|
||||
|
||||
### MicroPython
|
||||
|
||||
| Feature | Status | Notes |
|
||||
@@ -808,6 +900,7 @@ function fileserver_download_handler(
|
||||
| [`src/natsbridge_csr.js`](../src/natsbridge_csr.js) | Browser | JSON table only, WebSocket NATS | Client-side rendering |
|
||||
| [`src/natsbridge.py`](../src/natsbridge.py) | Python | Arrow IPC, async/await | Desktop Python |
|
||||
| [`src/natsbridge.dart`](../src/natsbridge.dart) | Dart | Full feature set, Arrow IPC, async/await | Desktop/Flutter/Web |
|
||||
| [`src/natsbridge.rs`](../src/natsbridge.rs) | Rust | Full feature set, Arrow IPC, async/await, type-safe | Uses tokio + serde + arrow2 |
|
||||
| [`src/natsbridge_mpy.py`](../src/natsbridge_mpy.py) | MicroPython | Limited to direct transport | Memory-constrained |
|
||||
|
||||
### Browser Implementation Notes
|
||||
@@ -822,16 +915,16 @@ The browser implementation ([`src/natsbridge_csr.js`](../src/natsbridge_csr.js))
|
||||
|
||||
### Payload Type Availability by Platform
|
||||
|
||||
| Payload Type | Julia | Node.js | Browser | Python | Dart | MicroPython |
|
||||
|--------------|-------|---------|---------|--------|------|-------------|
|
||||
| `text` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `dictionary` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `arrowtable` | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
|
||||
| `jsontable` | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ |
|
||||
| `image` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `audio` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `video` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `binary` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| Payload Type | Julia | Node.js | Browser | Python | Dart | Rust | MicroPython |
|
||||
|--------------|-------|---------|---------|--------|------|------|-------------|
|
||||
| `text` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `dictionary` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `arrowtable` | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
|
||||
| `jsontable` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ |
|
||||
| `image` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `audio` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `video` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `binary` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
|
||||
---
|
||||
|
||||
@@ -969,6 +1062,13 @@ flowchart TD
|
||||
| Dart | http | Latest | HTTP file server |
|
||||
| Dart | uuid | Latest | UUID generation |
|
||||
| Dart | dart-arrow | Latest | Arrow IPC support (Desktop/Flutter) |
|
||||
| Rust | nats | Latest | NATS client |
|
||||
| Rust | serde | Latest | JSON serialization |
|
||||
| Rust | serde_json | Latest | JSON handling |
|
||||
| Rust | tokio | Latest | Async runtime |
|
||||
| Rust | reqwest | Latest | HTTP file server |
|
||||
| Rust | uuid | Latest | UUID generation |
|
||||
| Rust | arrow2 | Latest | Arrow IPC support |
|
||||
| MicroPython | builtin | N/A | Limited implementation |
|
||||
|
||||
### Optional Dependencies
|
||||
@@ -1021,6 +1121,8 @@ flowchart TD
|
||||
| [`src/natsbridge_ssr.js`](../src/natsbridge_ssr.js) | Node.js | Arrow IPC, async/await | FR-001 through FR-014, NFR-101 through NFR-405 |
|
||||
| [`src/natsbridge_csr.js`](../src/natsbridge_csr.js) | Browser | JSON table only, WebSocket NATS | FR-001 through FR-014, NFR-101 through NFR-405 |
|
||||
| [`src/natsbridge.py`](../src/natsbridge.py) | Python | Arrow IPC, async/await | FR-001 through FR-014, NFR-101 through NFR-405 |
|
||||
| [`src/natsbridge.dart`](../src/natsbridge.dart) | Dart | Full feature set, Arrow IPC, async/await | FR-001 through FR-014, NFR-101 through NFR-405 |
|
||||
| [`src/natsbridge.rs`](../src/natsbridge.rs) | Rust | Full feature set, Arrow IPC, async/await, type-safe | FR-001 through FR-014, NFR-101 through NFR-405 |
|
||||
| [`src/natsbridge_mpy.py`](../src/natsbridge_mpy.py) | MicroPython | Limited to direct transport | FR-005, FR-006, FR-012 |
|
||||
|
||||
### 20.3 External Dependencies
|
||||
@@ -1039,6 +1141,17 @@ flowchart TD
|
||||
| Python | nats-py | Latest | NATS client | FR-013, FR-014 |
|
||||
| Python | aiohttp | Latest | HTTP file server | FR-008, FR-009 |
|
||||
| Python | pyarrow | Latest | Arrow IPC support | FR-002, FR-012 |
|
||||
| Dart | nats | Latest | NATS client | FR-013, FR-014 |
|
||||
| Dart | http | Latest | HTTP file server | FR-008, FR-009 |
|
||||
| Dart | uuid | Latest | UUID generation | FR-011, NFR-401 |
|
||||
| Dart | dart-arrow | Latest | Arrow IPC support | FR-002, FR-012 |
|
||||
| Rust | nats | Latest | NATS client | FR-013, FR-014 |
|
||||
| Rust | serde | Latest | JSON serialization | FR-012, NFR-101, NFR-102 |
|
||||
| Rust | serde_json | Latest | JSON handling | FR-012, NFR-101, NFR-102 |
|
||||
| Rust | tokio | Latest | Async runtime | FR-013, FR-014 |
|
||||
| Rust | reqwest | Latest | HTTP file server | FR-008, FR-009 |
|
||||
| Rust | uuid | Latest | UUID generation | FR-011, NFR-401 |
|
||||
| Rust | arrow2 | Latest | Arrow IPC support | FR-002, FR-012 |
|
||||
| MicroPython | builtin | N/A | Limited implementation | FR-005, FR-006 |
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user