domingo, 23 de marzo de 2025

Top 5 de la semana

Artículos relacionados

Node.js 22: Novedades y una Kata Inspirada en Talent Arena

La reciente versión de Node.js 22 introduce mejoras significativas en rendimiento, seguridad y compatibilidad con las últimas características de JavaScript. A continuación, repasamos algunos de los cambios más relevantes y proponemos una kata inspirada en el Talent Arena que se celebra en Barcelona.

Novedades Principales de Node.js 22

  1. Actualización del Motor V8 a la versión 12.4
    Se han incorporado mejoras en el rendimiento y nuevas funciones como Array.fromAsync, métodos para Set y optimización en la recolección de basura en WebAssembly.
  2. Activación del Compilador Maglev
    Ahora Maglev está habilitado por defecto en sistemas compatibles, mejorando la ejecución de programas de corta duración.
  3. Soporte Experimental para require() en Módulos ES
    Se ha añadido la opción --experimental-require-module para permitir la carga sincrónica de módulos ES, facilitando su integración en proyectos existentes.
  4. Mejoras en Seguridad
    Node.js 22 incorpora actualizaciones en TLS y en la validación de certificados, reforzando la protección frente a ataques.
  5. Optimización del Sistema de Módulos
    Se ha mejorado la compatibilidad y el rendimiento de los módulos ES, lo que facilita el uso de la sintaxis moderna de JavaScript en Node.js.

Kata: Gestión de Sesiones en Talent Arena

Para ilustrar algunas de estas mejoras, esta kata propone simular la gestión de participantes en un evento como Talent Arena, utilizando algunas de las nuevas características de Node.js 22.

Objetivo

Desarrollar una aplicación en Node.js 22 que realice las siguientes funciones:

  1. Registrar Participantes
    Utilizar Array.fromAsync para procesar de manera asíncrona una lista de registros.
  2. Asignar Sesiones
    Implementar un sistema que distribuya participantes en sesiones sin duplicaciones, aprovechando las mejoras en Set.
  3. Notificaciones en Tiempo Real
    Integrar WebSockets para enviar avisos sobre cambios en las sesiones.
  4. Generar Reportes
    Usar iteradores para recorrer la lista de participantes y generar informes.

Consideraciones Técnicas

  • Optimizar la ejecución con el compilador Maglev.
  • Aplicar mejoras de seguridad con TLS actualizado.
  • Utilizar módulos ES para una mejor organización del código.

Esta kata es una oportunidad para explorar las novedades de Node.js 22 en un contexto práctico.

Pasos para Resolver la Kata

1. Configurar el Proyecto

Antes de comenzar, es necesario crear un nuevo proyecto en Node.js. Para ello, se ejecuta el siguiente comando en la terminal:

mkdir talent-arena
cd talent-arena
npm init -y

Es recomendable asegurarse de que la versión instalada de Node.js sea la 22. Se puede verificar con node -v. Si no está actualizada, se puede descargar la última versión desde la página oficial de Node.js.

2. Registrar Participantes

Para procesar los participantes de manera asíncrona, se usa Array.fromAsync(), una función introducida en Node.js 22. El siguiente código simula la obtención de una lista de participantes desde una fuente externa y los convierte en objetos con un campo de fecha de registro.

// participants.js
export async function fetchParticipants() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(["Alice", "Bob", "Charlie", "David"]);
        }, 1000);
    });
}

export async function registerParticipants() {
    const participants = await fetchParticipants();
    const processed = await Array.fromAsync(participants, async (participant) => {
        return { name: participant, registeredAt: new Date() };
    });
    return processed;
}

El método fetchParticipants() simula la carga de datos desde un servidor, mientras que Array.fromAsync() permite transformar cada entrada de la lista sin bloquear la ejecución del código.

3. Asignar Sesiones sin Duplicaciones

Para distribuir a los participantes en diferentes sesiones sin riesgo de duplicaciones, se emplea la estructura Set, la cual ha recibido optimizaciones en esta versión de Node.js. A continuación, se muestra cómo organizar a los asistentes en dos sesiones:

// sessions.js
export function assignSessions(participants) {
    const session1 = new Set();
    const session2 = new Set();
    participants.forEach((participant, index) => {
        if (index % 2 === 0) {
            session1.add(participant.name);
        } else {
            session2.add(participant.name);
        }
    });
    return { session1: [...session1], session2: [...session2] };
}

Los participantes se asignan de forma alterna entre las dos sesiones, asegurando que cada uno solo aparezca una vez, sin importar cuántas veces se intente registrarlo.

4. Notificaciones en Tiempo Real con WebSockets

Para informar a los participantes sobre cambios en las sesiones en tiempo real, se implementa un servidor WebSocket utilizando la librería ws. Para ello, primero se instala la dependencia con:

npm install ws

Luego, se configura el servidor WebSocket, permitiendo conexiones de clientes y enviando un mensaje de bienvenida:

// server.js
import { WebSocketServer } from 'ws';

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', (ws) => {
    console.log('Cliente conectado');
    ws.send(JSON.stringify({ message: "Bienvenido a Talent Arena!" }));

    ws.on('message', (data) => {
        console.log(`Mensaje recibido: ${data}`);
    });

    ws.on('close', () => {
        console.log('Cliente desconectado');
    });
});

console.log("Servidor WebSocket corriendo en ws://localhost:8080");

Este código permite a los clientes recibir notificaciones en tiempo real cuando haya cambios en las sesiones, facilitando la interacción dinámica entre el servidor y los participantes.

5. Generar Reportes Usando Iteradores

Para recorrer la lista de participantes y generar reportes de manera eficiente, se emplean funciones generadoras. A continuación, se presenta una implementación que itera sobre los participantes y devuelve un informe detallado.

// reports.js
export function generateReport(participants) {
    function* reportGenerator() {
        for (const participant of participants) {
            yield `Participante: ${participant.name}, Registrado el: ${participant.registeredAt}`;
        }
    }

    const report = [];
    for (const entry of reportGenerator()) {
        report.push(entry);
    }
    return report;
}

Esta solución permite recorrer la lista de manera controlada, generando los reportes sin necesidad de cargar todos los datos en memoria de una sola vez.

6. Ejecutar Todo el Proyecto

Para poner en funcionamiento todas las funcionalidades desarrolladas, se integra el código en un solo archivo que ejecuta el flujo completo del programa.

import { registerParticipants } from './participants.js';
import { assignSessions } from './sessions.js';
import { generateReport } from './reports.js';

async function main() {
    const participants = await registerParticipants();
    console.log("Participantes Registrados:", participants);

    const sessions = assignSessions(participants);
    console.log("Sesiones Asignadas:", sessions);

    const report = generateReport(participants);
    console.log("Reporte de Participantes:\n", report.join("\n"));
}

main();

Para ejecutar el programa, se debe correr el siguiente comando en la terminal:

node index.js

Para obtener más información sobre ejercicios similares y continuar explorando nuevas soluciones, visita nuestra web.

Jordi Morillo
Jordi Morillohttps://www.programador-web.com
Soy un programador PHP Senior con más de 20 años de experiencia en desarrollo web y administración de sistemas Linux, especializado en Symfony y metodologías ágiles como Scrum. He trabajado con tecnologías como MySQL, MongoDB y WordPress, y siempre busco nuevas oportunidades para seguir aprendiendo y aplicando mis conocimientos.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Artículos populares