/**
* Módulos requeridos.
*/
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const path = require('path');
const bodyParser = require('body-parser');
const say = require('say');
/**
* Inicializa la aplicación Express.
* @type {Object}
*/
const app = express();
/**
* Crea un servidor HTTP.
* @type {Object}
*/
const server = http.createServer(app);
/**
* Inicializa un servidor WebSocket asociado al servidor HTTP.
* @type {WebSocket.Server}
*/
const wss = new WebSocket.Server({ server });
// Servir archivos estáticos desde el directorio 'public'
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.urlencoded({ extended: true }));
/**
* Ruta para manejar la solicitud de texto a voz.
* @name post/speak
* @function
* @inner
* @param {string} path - Ruta para la solicitud.
* @param {callback} middleware - Función middleware que maneja la solicitud.
*/
app.post('/speak', (req, res) => {
/**
* Texto recibido del cliente.
* @type {string}
*/
const text = req.body.text;
// Usar la biblioteca `say` para hablar el texto
say.speak(text, 'Microsoft Helena Desktop', 1.0, (err) => {
if (err) {
console.error(err);
res.status(500).send('Error al reproducir el texto.');
} else {
res.send('Texto reproducido con éxito.');
}
});
});
/**
* Evento de conexión del WebSocket.
* @event WebSocket.Server#connection
* @param {WebSocket} ws - La instancia del WebSocket.
*/
wss.on('connection', function connection(ws) {
/**
* Evento de mensaje del WebSocket.
* @event WebSocket#message
* @param {string} message - El mensaje recibido.
*/
ws.on('message', function incoming(message) {
// Convertir el mensaje a texto
const textMessage = message.toString();
/**
* Mensaje separado en ID del cliente y contenido real.
* @type {Array<string>}
*/
const mensaje = textMessage.split('##');
// Usar la biblioteca `say` para hablar el mensaje
say.speak(mensaje[1], 'Microsoft Helena Desktop', 1.0, (err) => {
if (err) {
console.error('Error al reproducir el texto:', err);
}
});
// Enviar el mensaje a todos los clientes conectados excepto el remitente
wss.clients.forEach(function each(client) {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(textMessage);
}
});
});
});
/**
* Inicia el servidor en el puerto 3000.
* @function
*/
server.listen(3000, function() {
console.log('Server listening on http://localhost:3000');
});