world-wide-node/ws-client.js
2024-12-06 23:20:19 +03:00

108 lines
2.7 KiB
JavaScript

const readline = require('readline');
const WebSocket = require('ws');
// Configure readline for user input
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
/**
* Prompt the user for the WebSocket server host.
* @param {string} question - The question to display.
* @returns {Promise<string>} - The user input.
*/
function askQuestion(question) {
return new Promise((resolve) => {
rl.question(question, resolve);
});
}
/**
* Connect to the WebSocket server and handle communication.
* @param {string} host - The WebSocket server host.
*/
async function connectToWebSocket(host) {
const ws = new WebSocket(`ws://${host}:64999`);
ws.on('open', () => {
console.log('Connected to the WebSocket server.');
showMenu(ws);
});
ws.on('message', (data) => {
console.log('Server response:', data.toString());
});
ws.on('error', (err) => {
console.error('WebSocket error:', err.message);
rl.close();
});
ws.on('close', () => {
console.log('Connection closed.');
rl.close();
});
}
/**
* Display a menu of actions for the user.
* @param {WebSocket} ws - The WebSocket connection.
*/
function showMenu(ws) {
console.log(`
Available commands:
1. prevconf - Get the previous configuration.
2. currconf - Get the current configuration.
3. Update - Send a new configuration.
4. Exit - Close the client.
`);
rl.question('Enter your choice: ', async (choice) => {
switch (choice.trim()) {
case '1':
ws.send(JSON.stringify({ command: 'prevconf' }));
break;
case '2':
ws.send(JSON.stringify({ command: 'currconf' }));
break;
case '3':
const newConfig = await askForNewConfig();
ws.send(JSON.stringify(newConfig));
break;
case '4':
console.log('Closing the client...');
ws.close();
rl.close();
return;
default:
console.log('Invalid choice.');
}
showMenu(ws); // Show the menu again after the action
});
}
/**
* Prompt the user for a new configuration.
* @returns {Promise<object>} - The new configuration object.
*/
async function askForNewConfig() {
const numMappings = await askQuestion('How many mappings do you want to add? ');
const mappings = [];
for (let i = 0; i < parseInt(numMappings, 10); i++) {
const host = await askQuestion(`Enter host for mapping ${i + 1}: `);
const port = await askQuestion(`Enter port for mapping ${i + 1}: `);
mappings.push({ host, port: parseInt(port, 10) });
}
return { mappings };
}
/**
* Entry point for the client.
*/
(async function main() {
const host = await askQuestion('Enter the WebSocket server host (e.g., localhost): ');
connectToWebSocket(host);
})();