177 lines
6.0 KiB
Julia
177 lines
6.0 KiB
Julia
#!/usr/bin/env julia
|
|
# Test script for large payload testing using binary transport
|
|
# Tests sending a large file (> 1MB) via smartsend with binary type
|
|
# Updated to match NATSBridge.jl API
|
|
|
|
using NATS, JSON, UUIDs, Dates
|
|
using HTTP
|
|
|
|
# Include the bridge module
|
|
include("./src/NATSBridge.jl")
|
|
using .NATSBridge
|
|
|
|
# Configuration
|
|
const SUBJECT = "/large_binary_test"
|
|
const NATS_URL = "nats.yiem.cc"
|
|
const FILESERVER_URL = "http://192.168.88.104:8080"
|
|
|
|
# Create correlation ID for tracing
|
|
correlation_id = string(uuid4())
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------ #
|
|
# test file transfer #
|
|
# ------------------------------------------------------------------------------------------------ #
|
|
|
|
# File path for large binary payload test
|
|
const FILE_PATH = "./testFile_small.zip"
|
|
const filename = basename(FILE_PATH)
|
|
|
|
# Helper: Log with correlation ID
|
|
function log_trace(message)
|
|
timestamp = Dates.now()
|
|
println("[$timestamp] [Correlation: $correlation_id] $message")
|
|
end
|
|
|
|
# File upload handler for plik server
|
|
function plik_upload_handler(fileserver_url::String, dataname::String, data::Vector{UInt8})::Dict{String, Any}
|
|
# Get upload ID
|
|
url_getUploadID = "$fileserver_url/upload"
|
|
headers = ["Content-Type" => "application/json"]
|
|
body = """{ "OneShot" : true }"""
|
|
httpResponse = HTTP.request("POST", url_getUploadID, headers, body; body_is_form=false)
|
|
responseJson = JSON.parse(String(httpResponse.body))
|
|
uploadid = responseJson["id"]
|
|
uploadtoken = responseJson["uploadToken"]
|
|
|
|
# Upload file
|
|
file_multipart = HTTP.Multipart(dataname, IOBuffer(data), "application/octet-stream")
|
|
url_upload = "$fileserver_url/file/$uploadid"
|
|
headers = ["X-UploadToken" => uploadtoken]
|
|
|
|
form = HTTP.Form(Dict("file" => file_multipart))
|
|
httpResponse = HTTP.post(url_upload, headers, form)
|
|
responseJson = JSON.parse(String(httpResponse.body))
|
|
|
|
fileid = responseJson["id"]
|
|
url = "$fileserver_url/file/$uploadid/$fileid/$dataname"
|
|
|
|
return Dict("status" => httpResponse.status, "uploadid" => uploadid, "fileid" => fileid, "url" => url)
|
|
end
|
|
|
|
# File download handler for plik server
|
|
function plik_download_handler(fileserver_url::String, url::String, max_retries::Int, base_delay::Int, max_delay::Int)::Vector{UInt8}
|
|
delay = base_delay
|
|
for attempt in 1:max_retries
|
|
try
|
|
response = HTTP.request("GET", url)
|
|
if response.status == 200
|
|
return response.body
|
|
else
|
|
error("Failed to fetch: $(response.status)")
|
|
end
|
|
catch e
|
|
if attempt < max_retries
|
|
sleep(delay / 1000.0)
|
|
delay = min(delay * 2, max_delay)
|
|
end
|
|
end
|
|
end
|
|
error("Failed to fetch data after $max_retries attempts")
|
|
end
|
|
|
|
# Sender: Send large binary file via smartsend
|
|
function test_large_binary_send()
|
|
# Read the large file as binary data
|
|
log_trace("Reading large file: $FILE_PATH")
|
|
file_data = read(FILE_PATH)
|
|
|
|
file_size = length(file_data)
|
|
log_trace("File size: $file_size bytes")
|
|
|
|
# Use smartsend with binary type - will automatically use link transport
|
|
# if file size exceeds the threshold (1MB by default)
|
|
# API: smartsend(subject, [(dataname, data, type), ...]; keywords...)
|
|
env = NATSBridge.smartsend(
|
|
SUBJECT,
|
|
[(filename, file_data, "binary")], # List of (dataname, data, type) tuples
|
|
nats_url = NATS_URL,
|
|
fileserverUploadHandler = plik_upload_handler,
|
|
size_threshold = 1_000_000,
|
|
correlation_id = correlation_id,
|
|
msg_purpose = "chat",
|
|
sender_name = "sender",
|
|
receiver_name = "",
|
|
receiver_id = "",
|
|
reply_to = "",
|
|
reply_to_msg_id = ""
|
|
)
|
|
|
|
log_trace("Sent message with transport: $(env.payloads[1].transport)")
|
|
log_trace("Envelope type: $(env.payloads[1].type)")
|
|
|
|
# Check if link transport was used
|
|
if env.payloads[1].transport == "link"
|
|
log_trace("Using link transport - file uploaded to HTTP server")
|
|
log_trace("URL: $(env.payloads[1].data)")
|
|
else
|
|
log_trace("Using direct transport - payload sent via NATS")
|
|
end
|
|
end
|
|
|
|
# Receiver: Listen for messages and verify large payload handling
|
|
function test_large_binary_receive()
|
|
conn = NATS.connect(NATS_URL)
|
|
NATS.subscribe(conn, SUBJECT) do msg
|
|
log_trace("Received message on $(msg.subject)")
|
|
|
|
# Use NATSBridge.smartreceive to handle the data
|
|
# API: smartreceive(msg, download_handler; max_retries, base_delay, max_delay)
|
|
result = NATSBridge.smartreceive(
|
|
msg,
|
|
plik_download_handler,
|
|
max_retries = 5,
|
|
base_delay = 100,
|
|
max_delay = 5000
|
|
)
|
|
|
|
# Result is a list of (dataname, data) tuples
|
|
for (dataname, data) in result
|
|
# Check transport type from the envelope
|
|
# For link transport, data is the URL string
|
|
# For direct transport, data is the actual payload bytes
|
|
|
|
if isa(data, Vector{UInt8})
|
|
file_size = length(data)
|
|
log_trace("Received $(file_size) bytes of binary data for '$dataname'")
|
|
|
|
# Save received data to a test file
|
|
output_path = "./new_$dataname"
|
|
write(output_path, data)
|
|
log_trace("Saved received data to $output_path")
|
|
else
|
|
log_trace("Received data for '$dataname' (type: $(typeof(data)))")
|
|
end
|
|
end
|
|
end
|
|
|
|
# Keep listening for 10 seconds
|
|
sleep(120)
|
|
NATS.drain(conn)
|
|
end
|
|
|
|
|
|
# Run the test
|
|
println("Starting large binary payload test...")
|
|
println("Correlation ID: $correlation_id")
|
|
println("File: $FILE_PATH")
|
|
|
|
# Run sender first
|
|
println("start smartsend")
|
|
test_large_binary_send()
|
|
|
|
# Run receiver
|
|
# println("testing smartreceive")
|
|
# test_large_binary_receive()
|
|
|
|
println("Test completed.") |