137 lines
4.8 KiB
JavaScript
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
|