165 lines
5.4 KiB
JavaScript
165 lines
5.4 KiB
JavaScript
#!/usr/bin/env node
|
|
// Test script for Table transport testing
|
|
// Tests sending 1 large and 1 small Tables via direct and link transport
|
|
// Uses NATSBridge.js smartsend with "table" type
|
|
//
|
|
// Note: This test requires the apache-arrow library to serialize/deserialize table data.
|
|
// The JavaScript implementation uses apache-arrow for Arrow IPC serialization.
|
|
|
|
const { smartsend, uuid4, log_trace } = require('./src/NATSBridge');
|
|
|
|
// Configuration
|
|
const SUBJECT = "/NATSBridge_table_test";
|
|
const NATS_URL = "nats.yiem.cc";
|
|
const FILESERVER_URL = "http://192.168.88.104:8080";
|
|
|
|
// Create correlation ID for tracing
|
|
const correlation_id = uuid4();
|
|
|
|
// Helper: Log with correlation ID
|
|
function log_trace(message) {
|
|
const timestamp = new Date().toISOString();
|
|
console.log(`[${timestamp}] [Correlation: ${correlation_id}] ${message}`);
|
|
}
|
|
|
|
// File upload handler for plik server
|
|
async function plik_upload_handler(fileserver_url, dataname, data, correlation_id) {
|
|
log_trace(correlation_id, `Uploading ${dataname} to fileserver: ${fileserver_url}`);
|
|
|
|
// Step 1: Get upload ID and token
|
|
const url_getUploadID = `${fileserver_url}/upload`;
|
|
const headers = {
|
|
"Content-Type": "application/json"
|
|
};
|
|
const body = JSON.stringify({ OneShot: true });
|
|
|
|
let response = await fetch(url_getUploadID, {
|
|
method: "POST",
|
|
headers: headers,
|
|
body: body
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to get upload ID: ${response.status} ${response.statusText}`);
|
|
}
|
|
|
|
const responseJson = await response.json();
|
|
const uploadid = responseJson.id;
|
|
const uploadtoken = responseJson.uploadToken;
|
|
|
|
// Step 2: Upload file data
|
|
const url_upload = `${fileserver_url}/file/${uploadid}`;
|
|
|
|
// Create multipart form data
|
|
const formData = new FormData();
|
|
const blob = new Blob([data], { type: "application/octet-stream" });
|
|
formData.append("file", blob, dataname);
|
|
|
|
response = await fetch(url_upload, {
|
|
method: "POST",
|
|
headers: {
|
|
"X-UploadToken": uploadtoken
|
|
},
|
|
body: formData
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to upload file: ${response.status} ${response.statusText}`);
|
|
}
|
|
|
|
const fileResponseJson = await response.json();
|
|
const fileid = fileResponseJson.id;
|
|
|
|
// Build the download URL
|
|
const url = `${fileserver_url}/file/${uploadid}/${fileid}/${encodeURIComponent(dataname)}`;
|
|
|
|
log_trace(correlation_id, `Uploaded to URL: ${url}`);
|
|
|
|
return {
|
|
status: response.status,
|
|
uploadid: uploadid,
|
|
fileid: fileid,
|
|
url: url
|
|
};
|
|
}
|
|
|
|
// Sender: Send Tables via smartsend
|
|
async function test_table_send() {
|
|
// Note: This test requires apache-arrow library to create Arrow IPC data.
|
|
// For now, we'll use a simple array of objects as table data.
|
|
// In production, you would use the apache-arrow library to create Arrow IPC data.
|
|
|
|
// Create a small Table (will use direct transport)
|
|
const small_table = [
|
|
{ id: 1, name: "Alice", score: 95 },
|
|
{ id: 2, name: "Bob", score: 88 },
|
|
{ id: 3, name: "Charlie", score: 92 }
|
|
];
|
|
|
|
// Create a large Table (will use link transport if > 1MB)
|
|
// Generate a larger dataset (~2MB to ensure link transport)
|
|
const large_table = [];
|
|
for (let i = 0; i < 50000; i++) {
|
|
large_table.push({
|
|
id: i,
|
|
message: `msg_${i}`,
|
|
sender: `sender_${i}`,
|
|
timestamp: new Date().toISOString(),
|
|
priority: Math.floor(Math.random() * 3) + 1
|
|
});
|
|
}
|
|
|
|
// Test data 1: small Table
|
|
const data1 = { dataname: "small_table", data: small_table, type: "table" };
|
|
|
|
// Test data 2: large Table
|
|
const data2 = { dataname: "large_table", data: large_table, type: "table" };
|
|
|
|
// Use smartsend with table type
|
|
// For small Table: will use direct transport (Arrow IPC encoded)
|
|
// For large Table: will use link transport (uploaded to fileserver)
|
|
const { env, msg_json_str } = await smartsend(
|
|
SUBJECT,
|
|
[data1, data2],
|
|
{
|
|
natsUrl: NATS_URL,
|
|
fileserverUrl: FILESERVER_URL,
|
|
fileserverUploadHandler: plik_upload_handler,
|
|
sizeThreshold: 1_000_000,
|
|
correlationId: correlation_id,
|
|
msgPurpose: "chat",
|
|
senderName: "table_sender",
|
|
receiverName: "",
|
|
receiverId: "",
|
|
replyTo: "",
|
|
replyToMsgId: "",
|
|
isPublish: true // Publish the message to NATS
|
|
}
|
|
);
|
|
|
|
log_trace(`Sent message with ${env.payloads.length} payloads`);
|
|
|
|
// Log transport type for each payload
|
|
for (let i = 0; i < env.payloads.length; i++) {
|
|
const payload = env.payloads[i];
|
|
log_trace(`Payload ${i + 1} ('${payload.dataname}'):`);
|
|
log_trace(` Transport: ${payload.transport}`);
|
|
log_trace(` Type: ${payload.type}`);
|
|
log_trace(` Size: ${payload.size} bytes`);
|
|
log_trace(` Encoding: ${payload.encoding}`);
|
|
|
|
if (payload.transport === "link") {
|
|
log_trace(` URL: ${payload.data}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Run the test
|
|
console.log("Starting Table transport test...");
|
|
console.log(`Correlation ID: ${correlation_id}`);
|
|
|
|
// Run sender
|
|
console.log("start smartsend for tables");
|
|
test_table_send();
|
|
|
|
console.log("Test completed."); |