Files

137 lines
4.8 KiB
JavaScript

import WebSocket from 'ws';
import { performance } from 'perf_hooks';
export const command = 'test-web';
export const describe = 'Simulates the web app behavior: connects to WebSocket and fetches registers via REST.';
export const builder = (yargs) => yargs
.option('wsUrl', {
alias: 'w',
type: 'string',
description: 'WebSocket URL to connect to',
default: 'ws://192.168.1.250/ws',
})
.option('apiUrl', {
alias: 'a',
type: 'string',
description: 'Base API URL',
default: 'http://192.168.1.250/api',
})
.option('interval', {
alias: 'i',
type: 'number',
description: 'Interval between register fetches in ms',
default: 30,
})
.option('payloadTest', {
type: 'boolean',
description: 'Run WebSocket payload size test',
default: true,
})
.option('payloadSize', {
type: 'number',
description: 'Size of payload to request in bytes',
default: 1024,
})
.option('period', {
alias: 'p',
type: 'number',
description: 'Period between payload requests in ms',
default: 150,
});
export const handler = async (argv) => {
const { wsUrl, apiUrl, interval, payloadTest, payloadSize, period } = argv;
console.log(`Starting test-web...`);
console.log(`WebSocket URL: ${wsUrl}`);
console.log(`API URL: ${apiUrl}`);
// 1. Connect to WebSocket
const ws = new WebSocket(wsUrl);
ws.on('open', () => {
console.log('WebSocket connected.');
});
ws.on('message', (data) => {
// Just consume messages to keep the connection active and simulate traffic processing
// console.log('WS Message received:', data.toString().length, 'bytes');
if (payloadTest) {
try {
const msg = JSON.parse(data.toString());
if (msg.type === 'test_payload') {
console.log(`Received test payload: ${msg.data.size} bytes requested, payload length: ${msg.data.payload.length}`);
}
}
catch (e) {
// ignore
}
}
});
ws.on('close', (code, reason) => {
console.log(`WebSocket disconnected. Code: ${code}, Reason: ${reason.toString()}`);
process.exit(0);
});
ws.on('error', (error) => {
console.error('WebSocket error:', error.message);
console.error('WebSocket readyState:', ws.readyState);
});
ws.on('ping', (data) => {
console.log('WS received ping:', data.toString());
});
ws.on('pong', (data) => {
console.log('WS received pong:', data.toString());
});
// 2. Fetch Registers via REST (simulating modbusApiService.ts)
const fetchRegisters = async () => {
console.log('Starting register fetch...');
let currentPage = 0;
let totalPages = 1;
const pageSize = 10;
let totalRegisters = 0;
while (currentPage < totalPages) {
const startTime = performance.now();
try {
const response = await fetch(`${apiUrl}/v1/registers?page=${currentPage}&pageSize=${pageSize}`);
if (!response.ok) {
throw new Error(`HTTP error ${response.status}: ${response.statusText}`);
}
const data = await response.json();
if (data.registers) {
totalRegisters += data.registers.length;
}
if (data.meta) {
totalPages = data.meta.totalPages;
}
else {
break;
}
const duration = performance.now() - startTime;
console.log(`Fetched page ${currentPage}/${totalPages} in ${duration.toFixed(2)}ms`);
}
catch (error) {
console.error(`Failed to fetch page ${currentPage}:`, error);
}
currentPage++;
if (interval > 0) {
await new Promise(resolve => setTimeout(resolve, interval));
}
}
console.log(`Finished fetching ${totalRegisters} registers.`);
};
// await fetchRegisters();
if (payloadTest) {
ws.on('open', () => {
console.log(`Starting periodic payload test (size: ${payloadSize}, period: ${period}ms)...`);
setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
console.log('Sending payload test... ' + payloadSize + ' bytes');
ws.send(JSON.stringify({ command: 'test_payload', size: payloadSize }));
}
else {
console.log('WebSocket is not open. Payload test skipped.');
}
}, period);
});
}
else {
// Start fetching registers immediately
}
// Keep process alive
process.stdin.resume();
};
//# sourceMappingURL=test-web.js.map