diff --git a/AI_prompt.md b/AI_prompt.md index 318f4dc..4904b5e 100644 --- a/AI_prompt.md +++ b/AI_prompt.md @@ -143,7 +143,7 @@ Since I develop src folder before I adopt SDD_FRAMEWORK.md approach, can you che # ---------------------------------------------- 100 --------------------------------------------- # -Check NATSBridge/docs folder I want to update the content of the following files according to ASG_Framework/ASG_Framework.md: +I updated src/NATSBridge.jl. Check and NATSBridge/docs folder I want to update the content of the following files according to ASG_Framework/ASG_Framework.md: - NATSBridge/docs/requirements.md - NATSBridge/docs/specification.md - NATSBridge/docs/ui-specification.md (you'll need to create this one) @@ -170,3 +170,15 @@ Can you update the content of the following files according to ASG_Framework/ASG + + +I updated ./src/NATSBridge.jl. Specifically smartsend() and smartreceive(). Check ./docs folder I want to update the content of the following files according to /home/ton/docker-apps/sommpanion/ASG_Framework/ASG_Framework.md: +- ./docs/requirements.md +- ./docs/specification.md +- ./docs/walkthrough.md +- ./docs/architecture.md + + + + + diff --git a/src/NATSBridge.jl b/src/NATSBridge.jl index 4b38fec..88bf6db 100644 --- a/src/NATSBridge.jl +++ b/src/NATSBridge.jl @@ -43,7 +43,7 @@ module NATSBridge -using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64, PrettyPrinting, DataFrames +using JSON, Arrow, HTTP, UUIDs, Dates, Base64, PrettyPrinting, DataFrames # ---------------------------------------------- 100 --------------------------------------------- # # Constants @@ -346,13 +346,17 @@ Otherwise, it uploads the data to a fileserver (by default using `plik_oneshot_u The function accepts a list of (dataname, data, type) tuples as input and processes each payload individually. Each payload can have a different type, enabling mixed-content messages (e.g., chat with text, images, audio). +This function creates and returns the msg_envelope_v1 and its JSON string representation only. +NATS publishing must be performed by the caller. + # Function Workflow: 1. Iterates through the list of (dataname, data, type) tuples 2. For each payload: extracts the type from the tuple and serializes accordingly 3. Compares the serialized size against `size_threshold` 4. For small payloads: encodes as Base64, constructs a "direct" msg_payload_v1 5. For large payloads: uploads to the fileserver, constructs a "link" msg_payload_v1 with the URL -6. Converts envelope to JSON string and returns (NATS publishing is not performed by this function) +6. Constructs msg_envelope_v1 with all payloads and metadata +7. Converts envelope to JSON string and returns (NATS publishing is handled by the caller) # Arguments: - `subject::String` - NATS subject to publish the message to @@ -374,7 +378,6 @@ Each payload can have a different type, enabling mixed-content messages (e.g., c - `receiver_id::String = ""` - UUID of the receiver (empty string means broadcast) - `reply_to::String = ""` - Topic to reply to (empty string if no reply expected) - `reply_to_msg_id::String = ""` - Message ID this message is replying to - - `NATS_connection::Union{NATS.Connection, Nothing} = nothing` - Pre-existing NATS connection (reserved for future use) - `msg_id::String = string(uuid4())` - Message ID (auto-generated UUID if not provided) - `sender_id::String = string(uuid4())` - Sender ID (auto-generated UUID if not provided) @@ -438,7 +441,6 @@ function smartsend( receiver_id::String = "", reply_to::String = "", reply_to_msg_id::String = "", - NATS_connection::Union{NATS.Connection, Nothing} = nothing, # a provided connection saves establishing connection overhead. msg_id::String = string(uuid4()), # Message ID sender_id::String = string(uuid4()) # Sender ID )::Tuple{msg_envelope_v1, String} where {T1<:Any} @@ -701,73 +703,73 @@ function _serialize_data(data::Any, payload_type::String) end -""" publish_message - Publish message to NATS -This function publishes a message to a NATS subject with proper -connection management and logging. +# """ publish_message - Publish message to NATS +# This function publishes a message to a NATS subject with proper +# connection management and logging. -# Arguments: - - `broker_url::String` - NATS server URL (e.g., "nats://localhost:4222") - - `subject::String` - NATS subject to publish to (e.g., "/agent/wine/api/v1/prompt") - - `message::String` - JSON message to publish - - `correlation_id::String` - Correlation ID for tracing and logging +# # Arguments: +# - `broker_url::String` - NATS server URL (e.g., "nats://localhost:4222") +# - `subject::String` - NATS subject to publish to (e.g., "/agent/wine/api/v1/prompt") +# - `message::String` - JSON message to publish +# - `correlation_id::String` - Correlation ID for tracing and logging -# Return: - - `nothing` - This function performs publishing but returns nothing +# # Return: +# - `nothing` - This function performs publishing but returns nothing -# Example -```jldoctest -using NATS +# # Example +# ```jldoctest +# using NATS -# Prepare JSON message -message = "{\"correlation_id\":\"abc123\",\"payload\":\"test\"}" +# # Prepare JSON message +# message = "{\"correlation_id\":\"abc123\",\"payload\":\"test\"}" -# Publish to NATS -publish_message("nats://localhost:4222", "my.subject", message, "abc123") -``` -""" -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) # Create NATS connection - publish_message(conn, subject, message, correlation_id) -end +# # Publish to NATS +# publish_message("nats://localhost:4222", "my.subject", message, "abc123") +# ``` +# """ +# function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) +# conn = NATS.connect(broker_url) # Create NATS connection +# publish_message(conn, subject, message, correlation_id) +# end -""" publish_message - Publish message to NATS using pre-existing connection -This function publishes a message to a NATS subject using a pre-existing NATS connection, -avoiding the overhead of connection establishment. +# """ publish_message - Publish message to NATS using pre-existing connection +# This function publishes a message to a NATS subject using a pre-existing NATS connection, +# avoiding the overhead of connection establishment. -# Arguments: - - `conn::NATS.Connection` - Pre-existing NATS connection - - `subject::String` - NATS subject to publish to (e.g., "/agent/wine/api/v1/prompt") - - `message::String` - JSON message to publish - - `correlation_id::String` - Correlation ID for tracing and logging +# # Arguments: +# - `conn::NATS.Connection` - Pre-existing NATS connection +# - `subject::String` - NATS subject to publish to (e.g., "/agent/wine/api/v1/prompt") +# - `message::String` - JSON message to publish +# - `correlation_id::String` - Correlation ID for tracing and logging -# Return: - - `nothing` - This function performs publishing but returns nothing +# # Return: +# - `nothing` - This function performs publishing but returns nothing -# Example -```jldoctest -using NATS +# # Example +# ```jldoctest +# using NATS -# Prepare JSON message -message = "{\"correlation_id\":\"abc123\",\"payload\":\"test\"}" +# # Prepare JSON message +# message = "{\"correlation_id\":\"abc123\",\"payload\":\"test\"}" -# Create connection once and reuse for multiple publishes -conn = NATS.connect("nats://localhost:4222") -publish_message(conn, "my.subject", message, "abc123") -# Connection is automatically drained after publish -``` +# # Create connection once and reuse for multiple publishes +# conn = NATS.connect("nats://localhost:4222") +# publish_message(conn, "my.subject", message, "abc123") +# # Connection is automatically drained after publish +# ``` -# Use Case: -Use this version when you already have an established NATS connection and want to publish -multiple messages without the overhead of creating a new connection for each publish. -""" -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) # Publish message to NATS - log_trace(correlation_id, "Message published to $subject") # Log successful publish - finally - NATS.drain(conn) # Ensure connection is closed properly - end -end +# # Use Case: +# Use this version when you already have an established NATS connection and want to publish +# multiple messages without the overhead of creating a new connection for each publish. +# """ +# function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) +# try +# NATS.publish(conn, subject, message) # Publish message to NATS +# log_trace(correlation_id, "Message published to $subject") # Log successful publish +# finally +# NATS.drain(conn) # Ensure connection is closed properly +# end +# end """ smartreceive - Receive and process messages from NATS