From be94c6276017b101ad47a6ec801166e02c4ea01e Mon Sep 17 00:00:00 2001 From: narawat Date: Wed, 25 Feb 2026 12:24:02 +0700 Subject: [PATCH] update --- README.md | 87 ++++++++++++++++++++++++++++++++++++++----------------- etc.jl | 9 ++++++ 2 files changed, 69 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 6b81012..bca52f7 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ from nats_bridge import smartsend # Send a text message data = [("message", "Hello World", "text")] -env, env_json_str = smartsend("/chat/room1", data, nats_url="nats://localhost:4222") +env, env_json_str = smartsend("/chat/room1", data, broker_url="nats://localhost:4222") print("Message sent!") ``` @@ -185,7 +185,7 @@ const { smartsend } = require('./src/NATSBridge'); // Send a text message const { env, env_json_str } = await smartsend("/chat/room1", [ { dataname: "message", data: "Hello World", type: "text" } -], { natsUrl: "nats://localhost:4222" }); +], { broker_url: "nats://localhost:4222" }); console.log("Message sent!"); ``` @@ -197,7 +197,7 @@ using NATSBridge # Send a text message data = [("message", "Hello World", "text")] -env, env_json_str = NATSBridge.smartsend("/chat/room1", data; nats_url="nats://localhost:4222") +env, env_json_str = NATSBridge.smartsend("/chat/room1", data; broker_url="nats://localhost:4222") println("Message sent!") ``` @@ -313,7 +313,7 @@ from nats_bridge import smartsend env, env_json_str = smartsend( subject, # NATS subject to publish to data, # List of (dataname, data, type) tuples - nats_url="nats://localhost:4222", # NATS server URL + broker_url="nats://localhost:4222", # NATS server URL fileserver_url="http://localhost:8080", # File server URL fileserver_upload_handler=plik_oneshot_upload, # Upload handler function size_threshold=1_000_000, # Threshold in bytes (default: 1MB) @@ -337,18 +337,18 @@ const { env, env_json_str } = await smartsend( subject, // NATS subject data, // Array of {dataname, data, type} { - natsUrl: "nats://localhost:4222", - fileserverUrl: "http://localhost:8080", - fileserverUploadHandler: customUploadHandler, - sizeThreshold: 1_000_000, - correlationId: "custom-id", - msgPurpose: "chat", - senderName: "NATSBridge", - receiverName: "", - receiverId: "", - replyTo: "", - replyToMsgId: "", - isPublish: true // Whether to automatically publish to NATS + broker_url: "nats://localhost:4222", + fileserver_url: "http://localhost:8080", + fileserver_upload_handler: customUploadHandler, + size_threshold: 1_000_000, + correlation_id: "custom-id", + msg_purpose: "chat", + sender_name: "NATSBridge", + receiver_name: "", + receiver_id: "", + reply_to: "", + reply_to_msg_id: "", + is_publish: true // Whether to automatically publish to NATS } ); ``` @@ -361,9 +361,9 @@ using NATSBridge env, env_json_str = NATSBridge.smartsend( subject, # NATS subject data::AbstractArray{Tuple{String, Any, String}}; # List of (dataname, data, type) - nats_url::String = "nats://localhost:4222", + broker_url::String = "nats://localhost:4222", fileserver_url = "http://localhost:8080", - fileserverUploadHandler::Function = plik_oneshot_upload, + fileserver_upload_handler::Function = plik_oneshot_upload, size_threshold::Int = 1_000_000, correlation_id::Union{String, Nothing} = nothing, msg_purpose::String = "chat", @@ -372,7 +372,8 @@ env, env_json_str = NATSBridge.smartsend( receiver_id::String = "", reply_to::String = "", reply_to_msg_id::String = "", - is_publish::Bool = true # Whether to automatically publish to NATS + is_publish::Bool = true, # Whether to automatically publish to NATS + NATS_connection::Union{NATS.Connection, Nothing} = nothing # Pre-existing NATS connection (optional, saves connection overhead) ) # Returns: (msgEnvelope_v1, JSON string) # - env: msgEnvelope_v1 object with all envelope metadata and payloads @@ -423,9 +424,9 @@ const env = await smartreceive( using NATSBridge # Note: msg is a NATS.Msg object passed from the subscription callback -env, env_json_str = NATSBridge.smartreceive( +env = NATSBridge.smartreceive( msg::NATS.Msg; - fileserverDownloadHandler::Function = _fetch_with_backoff, + fileserver_download_handler::Function = _fetch_with_backoff, max_retries::Int = 5, base_delay::Int = 100, max_delay::Int = 5000 @@ -433,6 +434,35 @@ env, env_json_str = NATSBridge.smartreceive( # Returns: Dict with envelope metadata and payloads array ``` +### publish_message + +Publish a message to a NATS subject. This function is available in Julia with two overloads: + +#### Julia + +**Using broker URL (creates new connection):** +```julia +using NATSBridge, NATS + +# Publish with URL - creates a new connection +NATSBridge.publish_message( + "nats://localhost:4222", # broker_url + "/chat/room1", # subject + "{\"correlation_id\":\"abc123\"}", # message + "abc123" # correlation_id +) +``` + +**Using pre-existing connection (saves connection overhead):** +```julia +using NATSBridge, NATS + +# Create connection once and reuse +conn = NATS.connect("nats://localhost:4222") +NATSBridge.publish_message(conn, "/chat/room1", "{\"correlation_id\":\"abc123\"}", "abc123") +# Connection is automatically drained after publish +``` + --- ## Payload Types @@ -488,7 +518,7 @@ smartsend("/topic", data, fileserver_url="http://localhost:8080") ```javascript await smartsend("/topic", [ { dataname: "file", data: largeData, type: "binary" } -], { fileserverUrl: "http://localhost:8080" }); +], { fileserver_url: "http://localhost:8080" }); ``` #### Julia @@ -529,7 +559,7 @@ const { env, env_json_str } = await smartsend("/chat/room1", [ { dataname: "user_avatar", data: image_data, type: "image" }, { dataname: "large_document", data: large_file_data, type: "binary" } ], { - fileserverUrl: "http://localhost:8080" + fileserver_url: "http://localhost:8080" }); ``` @@ -653,9 +683,10 @@ from nats_bridge import smartsend env, env_json_str = smartsend( "/device/command", [("command", {"action": "read_sensor"}, "dictionary")], + broker_url="nats://localhost:4222", reply_to="/device/response" ) -# env: msgEnvelope_v1 object +# env: MessageEnvelope object # env_json_str: JSON string for publishing to NATS # The env_json_str can also be published directly using NATS request-reply pattern @@ -697,7 +728,8 @@ const { smartsend } = require('./src/NATSBridge'); const { env, env_json_str } = await smartsend("/device/command", [ { dataname: "command", data: { action: "read_sensor" }, type: "dictionary" } ], { - replyTo: "/device/response" + broker_url: "nats://localhost:4222", + reply_to: "/device/response" }); ``` @@ -739,6 +771,7 @@ using NATSBridge env, env_json_str = NATSBridge.smartsend( "/device/command", [("command", Dict("action" => "read_sensor"), "dictionary")]; + broker_url="nats://localhost:4222", reply_to="/device/response" ) ``` @@ -755,7 +788,7 @@ const NATS_URL = "nats://localhost:4222" function test_responder() conn = NATS.connect(NATS_URL) NATS.subscribe(conn, SUBJECT) do msg - env, env_json_str = NATSBridge.smartreceive(msg, fileserverDownloadHandler) + env = NATSBridge.smartreceive(msg, fileserver_download_handler=_fetch_with_backoff) for (dataname, data, type) in env["payloads"] if dataname == "command" && data["action"] == "read_sensor" response = Dict("sensor_id" => "sensor-001", "value" => 42.5) @@ -790,7 +823,7 @@ async def main(): # Send sensor data data = [("temperature", "25.5", "text"), ("humidity", 65, "dictionary")] - smartsend("/device/sensors", data, nats_url="nats://localhost:4222") + smartsend("/device/sensors", data, broker_url="nats://localhost:4222") # Receive commands - msg comes from the callback async def message_handler(msg): diff --git a/etc.jl b/etc.jl index e69de29..878e279 100644 --- a/etc.jl +++ b/etc.jl @@ -0,0 +1,9 @@ +Task: Update README.md to reflect recent changes in NATSbridge package. + +Context: the package has been updated with the NATS_connection keyword and the publish_message function. + +Requirements: + +Source of Truth: Treat the updated NATSbridge code as the definitive source. Update README.md to align exactly with these changes. +API Consistency: Ensure the Main Package API (e.g., smartsend(), publish_message()) uses consistent naming across all three supported languages. +Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read()) should follow the conventions of the specific language ecosystem and do not require cross-language consistency. \ No newline at end of file