update
This commit is contained in:
@@ -31,18 +31,18 @@ The implementation uses a **standardized list-of-tuples format** for all payload
|
||||
# Output format for smartreceive (returns envelope dictionary with payloads field)
|
||||
# Returns: Dict with envelope metadata and payloads field containing list of tuples
|
||||
# {
|
||||
# "correlationId": "...",
|
||||
# "msgId": "...",
|
||||
# "correlation_id": "...",
|
||||
# "msg_id": "...",
|
||||
# "timestamp": "...",
|
||||
# "sendTo": "...",
|
||||
# "msgPurpose": "...",
|
||||
# "senderName": "...",
|
||||
# "senderId": "...",
|
||||
# "receiverName": "...",
|
||||
# "receiverId": "...",
|
||||
# "replyTo": "...",
|
||||
# "replyToMsgId": "...",
|
||||
# "brokerURL": "...",
|
||||
# "send_to": "...",
|
||||
# "msg_purpose": "...",
|
||||
# "sender_name": "...",
|
||||
# "sender_id": "...",
|
||||
# "receiver_name": "...",
|
||||
# "receiver_id": "...",
|
||||
# "reply_to": "...",
|
||||
# "reply_to_msg_id": "...",
|
||||
# "broker_url": "...",
|
||||
# "metadata": {...},
|
||||
# "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...]
|
||||
# }
|
||||
@@ -53,15 +53,15 @@ Where `type` can be: `"text"`, `"dictionary"`, `"table"`, `"image"`, `"audio"`,
|
||||
**Examples:**
|
||||
```julia
|
||||
# Single payload - still wrapped in a list (type is required as third element)
|
||||
smartsend("/test", [(dataname1, data1, "text")], ...)
|
||||
smartsend("/test", [(dataname1, data1, "text")], broker_url="nats://localhost:4222")
|
||||
|
||||
# Multiple payloads in one message (each payload has its own type)
|
||||
smartsend("/test", [(dataname1, data1, "dictionary"), (dataname2, data2, "table")], ...)
|
||||
smartsend("/test", [(dataname1, data1, "dictionary"), (dataname2, data2, "table")], broker_url="nats://localhost:4222")
|
||||
|
||||
# Receive returns a dictionary envelope with all metadata and deserialized payloads
|
||||
env = smartreceive(msg, ...)
|
||||
env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff, max_retries=5, base_delay=100, max_delay=5000)
|
||||
# env["payloads"] = [(dataname1, data1, "text"), (dataname2, data2, "table"), ...]
|
||||
# env["correlationId"], env["msgId"], etc.
|
||||
# env["correlation_id"], env["msg_id"], etc.
|
||||
```
|
||||
|
||||
## Cross-Platform Interoperability
|
||||
@@ -98,7 +98,7 @@ NATSBridge is designed for seamless communication between Julia, JavaScript, and
|
||||
# Julia sender
|
||||
using NATSBridge
|
||||
data = [("message", "Hello from Julia!", "text")]
|
||||
smartsend("/cross_platform", data, nats_url="nats://localhost:4222")
|
||||
smartsend("/cross_platform", data, broker_url="nats://localhost:4222")
|
||||
```
|
||||
|
||||
```javascript
|
||||
@@ -152,8 +152,8 @@ The `smartsend` function now returns a tuple containing both the envelope object
|
||||
|
||||
```julia
|
||||
env, env_json_str = smartsend(...)
|
||||
# env::msgEnvelope_v1 - The envelope object with all metadata and payloads
|
||||
# env_json_str::String - JSON string for publishing to NATS
|
||||
# env::msg_envelope_v1 - The envelope object with all metadata and payloads
|
||||
# env_json_str::String - JSON string for publishing to NATS
|
||||
```
|
||||
|
||||
**Options:**
|
||||
@@ -167,9 +167,10 @@ This enables two use cases:
|
||||
|
||||
The Julia implementation provides:
|
||||
|
||||
- **[`MessageEnvelope`](src/NATSBridge.jl)**: Struct for the unified JSON envelope
|
||||
- **[`SmartSend()`](src/NATSBridge.jl)**: Handles transport selection based on payload size
|
||||
- **[`SmartReceive()`](src/NATSBridge.jl)**: Handles both direct and link transport
|
||||
- **[`msg_envelope_v1`](src/NATSBridge.jl)**: Struct for the unified JSON envelope
|
||||
- **[`msg_payload_v1`](src/NATSBridge.jl)**: Struct for individual payload representation
|
||||
- **[`smartsend()`](src/NATSBridge.jl)**: Handles transport selection based on payload size
|
||||
- **[`smartreceive()`](src/NATSBridge.jl)**: Handles both direct and link transport
|
||||
|
||||
### JavaScript Module: [`src/NATSBridge.js`](../src/NATSBridge.js)
|
||||
|
||||
@@ -277,16 +278,16 @@ smartsend(
|
||||
)
|
||||
|
||||
# Even single payload must be wrapped in a list with type
|
||||
smartsend("/test", [("single_data", mydata, "dictionary")])
|
||||
smartsend("/test", [("single_data", mydata, "dictionary")], nats_url="nats://localhost:4222")
|
||||
```
|
||||
|
||||
#### Python/Micropython (Receiver)
|
||||
```python
|
||||
from nats_bridge import smartreceive
|
||||
|
||||
# Receive returns a list of (dataname, data, type) tuples
|
||||
payloads = smartreceive(msg)
|
||||
# payloads = [(dataname1, data1, "dictionary"), (dataname2, data2, "table"), ...]
|
||||
# Receive returns a dictionary with envelope metadata and payloads field
|
||||
env = smartreceive(msg)
|
||||
# env["payloads"] = [(dataname1, data1, "dictionary"), (dataname2, data2, "table"), ...]
|
||||
```
|
||||
|
||||
#### JavaScript (Sender)
|
||||
@@ -340,8 +341,8 @@ for await (const msg of sub) {
|
||||
}
|
||||
|
||||
// Also access envelope metadata
|
||||
console.log(`Correlation ID: ${env.correlationId}`);
|
||||
console.log(`Message ID: ${env.msgId}`);
|
||||
console.log(`Correlation ID: ${env.correlation_id}`);
|
||||
console.log(`Message ID: ${env.msg_id}`);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -359,9 +360,9 @@ df = DataFrame(
|
||||
category = rand(["A", "B", "C"], 10_000_000)
|
||||
)
|
||||
|
||||
# Send via SmartSend - wrapped in a list (type is part of each tuple)
|
||||
env, env_json_str = SmartSend("analysis_results", [("table_data", df, "table")])
|
||||
# env: msgEnvelope_v1 object with all metadata and payloads
|
||||
# Send via smartsend - wrapped in a list (type is part of each tuple)
|
||||
env, env_json_str = smartsend("analysis_results", [("table_data", df, "table")], broker_url="nats://localhost:4222")
|
||||
# env: msg_envelope_v1 object with all metadata and payloads
|
||||
# env_json_str: JSON string representation of the envelope for publishing
|
||||
```
|
||||
|
||||
@@ -461,7 +462,7 @@ using NATSBridge
|
||||
function publish_health_status(nats_url)
|
||||
# Send status wrapped in a list (type is part of each tuple)
|
||||
status = Dict("cpu" => rand(), "memory" => rand())
|
||||
smartsend("health", [("status", status, "dictionary")], nats_url=nats_url)
|
||||
smartsend("health", [("status", status, "dictionary")], broker_url=nats_url)
|
||||
sleep(5) # Every 5 seconds
|
||||
end
|
||||
```
|
||||
@@ -523,7 +524,7 @@ def handle_device_config(msg):
|
||||
"device/response",
|
||||
[("config", config, "dictionary")],
|
||||
nats_url="nats://localhost:4222",
|
||||
reply_to=env.get("replyTo")
|
||||
reply_to=env.get("reply_to")
|
||||
)
|
||||
```
|
||||
|
||||
@@ -636,7 +637,7 @@ chat_message = [
|
||||
smartsend(
|
||||
"chat.room123",
|
||||
chat_message,
|
||||
nats_url="nats://localhost:4222",
|
||||
broker_url="nats://localhost:4222",
|
||||
msg_purpose="chat",
|
||||
reply_to="chat.room123.responses"
|
||||
)
|
||||
@@ -684,7 +685,7 @@ await smartsend("chat.room123", message);
|
||||
|
||||
**Use Case:** Full-featured chat system supporting rich media. User can send text, small images directly, or upload large files that get uploaded to HTTP server and referenced via URLs. Claim-check pattern ensures reliable delivery tracking for all message components.
|
||||
|
||||
**Implementation Note:** The `smartreceive` function iterates through all payloads in the envelope and processes each according to its transport type. See the standard API format in Section 1: `msgEnvelope_v1` supports `AbstractArray{msgPayload_v1}` for multiple payloads.
|
||||
**Implementation Note:** The `smartreceive` function iterates through all payloads in the envelope and processes each according to its transport type. See the standard API format in Section 1: `msg_envelope_v1` supports `Vector{msg_payload_v1}` for multiple payloads.
|
||||
|
||||
## Configuration
|
||||
|
||||
@@ -700,19 +701,19 @@ await smartsend("chat.room123", message);
|
||||
|
||||
```json
|
||||
{
|
||||
"correlationId": "uuid-v4-string",
|
||||
"msgId": "uuid-v4-string",
|
||||
"correlation_id": "uuid-v4-string",
|
||||
"msg_id": "uuid-v4-string",
|
||||
"timestamp": "2024-01-15T10:30:00Z",
|
||||
|
||||
"sendTo": "topic/subject",
|
||||
"msgPurpose": "ACK | NACK | updateStatus | shutdown | chat",
|
||||
"senderName": "agent-wine-web-frontend",
|
||||
"senderId": "uuid4",
|
||||
"receiverName": "agent-backend",
|
||||
"receiverId": "uuid4",
|
||||
"replyTo": "topic",
|
||||
"replyToMsgId": "uuid4",
|
||||
"BrokerURL": "nats://localhost:4222",
|
||||
"send_to": "topic/subject",
|
||||
"msg_purpose": "ACK | NACK | updateStatus | shutdown | chat",
|
||||
"sender_name": "agent-wine-web-frontend",
|
||||
"sender_id": "uuid4",
|
||||
"receiver_name": "agent-backend",
|
||||
"receiver_id": "uuid4",
|
||||
"reply_to": "topic",
|
||||
"reply_to_msg_id": "uuid4",
|
||||
"broker_url": "nats://localhost:4222",
|
||||
|
||||
"metadata": {
|
||||
"content_type": "application/octet-stream",
|
||||
@@ -723,7 +724,7 @@ await smartsend("chat.room123", message);
|
||||
{
|
||||
"id": "uuid4",
|
||||
"dataname": "login_image",
|
||||
"type": "image",
|
||||
"payload_type": "image",
|
||||
"transport": "direct",
|
||||
"encoding": "base64",
|
||||
"size": 15433,
|
||||
|
||||
Reference in New Issue
Block a user