Files
NATSBridge/test/scenario_tests.md
2026-02-10 06:55:29 +07:00

3.4 KiB

Test Scenarios for Bi-Directional Data Bridge

Scenario 1: Command & Control (Small JSON)

Tests small JSON payloads (< 1MB) sent directly via NATS.

Julia (Receiver)

using NATS
using JSON3

# Subscribe to control subject
subscribe(nats, "control") do msg
    env = MessageEnvelope(String(msg.data))
    
    # Parse JSON payload
    config = JSON3.read(env.payload)
    
    # Execute simulation with parameters
    step_size = config.step_size
    iterations = config.iterations
    
    # Send acknowledgment
    response = Dict("status" => "Running", "correlation_id" => env.correlation_id)
    publish(nats, "control_response", JSON3.stringify(response))
end

JavaScript (Sender)

const { SmartSend } = require('./js_bridge');

// Create small JSON config
const config = {
    step_size: 0.01,
    iterations: 1000
};

// Send via SmartSend with type="json"
await SmartSend("control", config, "json");

Scenario 2: Deep Dive Analysis (Large Arrow Table)

Tests large Arrow tables (> 1MB) sent via HTTP fileserver.

Julia (Sender)

using Arrow
using DataFrames

# Create large DataFrame (500MB, 10 million rows)
df = DataFrame(
    id = 1:10_000_000,
    value = rand(10_000_000),
    category = rand(["A", "B", "C"], 10_000_000)
)

# Convert to Arrow IPC stream and send
await SmartSend("analysis_results", df, "table");

JavaScript (Receiver)

const { SmartReceive } = require('./js_bridge');

// Receive message with URL
const result = await SmartReceive(msg);

// Fetch data from HTTP server
const table = result.data;

// Load into Perspective.js or D3
// Use table data for visualization

Scenario 3: Live Binary Processing

Tests binary data (binary) sent from JS to Julia for FFT/transcription.

JavaScript (Sender)

const { SmartSend } = require('./js_bridge');

// Capture binary chunk (2 seconds, 44.1kHz, 1 channel)
const binaryData = await navigator.mediaDevices.getUserMedia({ binary: true });

// Send as binary with metadata headers
await SmartSend("binary_input", binaryData, "binary", {
    metadata: {
        sample_rate: 44100,
        channels: 1
    }
});

Julia (Receiver)

using WAV
using DSP

# Receive binary data
function process_binary(data)
    # Perform FFT or AI transcription
    spectrum = fft(data)
    
    # Send results back (JSON + Arrow table)
    results = Dict("transcription" => "sample text", "spectrum" => spectrum)
    await SmartSend("binary_output", results, "json")
end

Scenario 4: Catch-Up (JetStream)

Tests temporal decoupling with NATS JetStream.

Julia (Producer)

# Publish to JetStream
using NATS

function publish_health_status(nats)
    jetstream = JetStream(nats, "health_updates")
    
    while true
        status = Dict("cpu" => rand(), "memory" => rand())
        publish(jetstream, "health", status)
        sleep(5)  # Every 5 seconds
    end
end

JavaScript (Consumer)

const { connect } = require('nats');

const nc = await connect({ servers: ['nats://localhost:4222'] });
const js = nc.jetstream();

// Request replay from last 10 minutes
const consumer = await js.pullSubscribe("health", { 
    durable_name: "catchup",
    max_batch: 100,
    max_ack_wait: 30000
});

// Process historical and real-time messages
for await (const msg of consumer) {
    const result = await SmartReceive(msg);
    // Process the data
    msg.ack();
}