Skip to content

Propuesta: Abstracción nativa/wrapper en Express para simplificar el manejo de respuestas SSE (Server-Sent Events) #7334

Description

@danelmott

actualmente estoy realizando un proyecto con express, no quiero usar websockets porque solo es un endpoint específico de mi app de express que necesita que se muestre la información en tiempo real, entonces una alternativa para ello es usar sse, que es también http pero da un funcionamiento parecido al de websocket, el problema es que implementarlo requiere un setup bastante riguroso en node, siento que se podría crear una abstracción en express para hacerlo mas facil asi como con las respuestas y esas cosas, porque actualmente para poder implementarlo tengo que configurar varios headers y el sistema de envió que siento que express puede simplificar mucho creando un wrapper para el envio de respuestas con sse, aqui adjunto un ejemplo del codigo que uso en mi app el cual es un wrapper para enviar respuestas por sse de manera facil

function handlePreStreamError(res, error) {
    if (res.headersSent) {
        sendSse(res, {
            type: "error",
            code: error.code || "SERVER_INTERNAL_ERROR",
            message: error.message || "Error interno del servidor",
        });
        return res.end();
    }

    return sendDomainError(res, error);
}

function sendSse(res, payload) {
    res.write(`data: ${JSON.stringify(payload)}\n\n`);
    res.flush?.();
}

function setupSse(res) {
    res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');
    res.setHeader('Cache-Control', 'no-cache, no-transform');
    res.setHeader('Connection', 'keep-alive');
    res.setHeader('X-Accel-Buffering', 'no');
    res.flushHeaders?.();
}

ejemplo de uso relativo:

async function streamResponseController(req, res) {
    try {
        setupSse(res);

        sendSse(res, { type: "start", message: "Iniciando proceso..." });

        const data = await mockDataFunction(req.body);

        for await (const chunk of data) {
            if (res.writableEnded || req.aborted) {
                break;
            }

            sendSse(res, {
                type: "chunk",
                data: chunk,
            });
        }

        sendSse(res, { type: "done" });
        res.end();

    } catch (error) {
        handlePreStreamError(res, error);
    }
}

Activity

  1. changed the title [-]agregar un setup facil para peticiones y respuestas enviadas con sse en express[/-] [+]Propuesta: Abstracción nativa/wrapper en Express para simplificar el manejo de respuestas SSE (Server-Sent Events)[/+] on Jun 27, 2026
  2. UlisesGascon commented on Jun 28, 2026

    @UlisesGascon
    Member

    Hola @danelmott!

    Creo que esto podría funcionar como middleware instalable por la comunidad usando npm. Tienes una propuesta que no se aleja mucho de lo que entendemos por middleware (ref) creo que solo tendrias que empaquetar el funcionamiento para que funcione en express como dependencia (ejemplo) y publicarlo en npm (ref).

    Asi el uso sería similar a esto:

    const express = require('express');
    const { handlePreStreamError } = require('new-package')
    const app = express();
    
    //...
    app.use(handlePreStreamError);
    //...

    Igual ya existe alguna cosa que puede ayduarte/inspirarte como express-sse, express-sse-middleware...

    Si quieres conectar más con la comunidad también estamos por Slack (invitaciones) (canal #express)

  3. danelmott commented on Jun 28, 2026

    @danelmott
    Author

    listo mi hermano, ya me uni al slack, intentare crear la libreria inspirandome de las que me mostraste, cuando la termine lo hare llegar en el slack, buen dia crack

  4. bjohansebas commented on Jun 28, 2026

    @bjohansebas
    Member

    Okay, I'll switch to English since I was thinking about this in Spanish. I was actually planning to propose something similar to the team because it's a feature that Hono already provides, and I think we should have it too: https://hono.dev/docs/helpers/streaming#streamsse. I originally wanted to expand on this for Express 5, but I'm taking it one step at a time and proposing changes incrementally.

    also ref: #6687

  5. danelmott commented on Jun 29, 2026

    @danelmott
    Author

    wow eso cambia bastante el panorama del asunto hare un fork en el proyecto he intentare implementar el modulo de sse, me gustaria que lo vieran para ver que tal les parece

  6. bjohansebas commented on Jun 29, 2026

    @bjohansebas
    Member

    genial, aunque te sugiero que empices primero con blob, luego con otra api de stream y asi, parecido a como lo tiene koa, asi es mas facil de fusionar las prs, y ayuda a que no se bloquee todo, estoy en ese slack por si quieres charlar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions