hapijs / hapi

The Simple, Secure Framework Developers Trust
https://hapi.dev
Other
14.58k stars 1.34k forks source link

A hapijs server sent event (SSE) example #4521

Open wy193777 opened 1 month ago

wy193777 commented 1 month ago

Module version

21.3.10

What documentation problem did you notice?

There is no hapijs SSE example. I recently figured it out but don't know where to put it. So I have it here:

'use strict';

const Hapi = require('@hapi/hapi');

const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Route using raw.res for direct response handling
    server.route({
        method: 'GET',
        path: '/sse',
        handler: async (request, h) => {
            const res = request.raw.res;
            res.writeHead(200, { "Content-Type": "application/json" });

            const intervalId = setInterval(() => {
                res.write('this is a server sent event message');
            }, 1000);  // send a message every 1 second 
            const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
            await sleep(10000);  // mock a long running request handling

            res.end('This is a raw response using raw.res');
            return h.abandon; // Abandon Hapi's normal response flow because we used raw response
        }
    });

    await server.start();
    console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

init();
kanongil commented 1 month ago

That is not really a SSE, as it needs to have Content-Type: text/event-stream.

Anyway, you should probably not use raw.res, but rather return a Passthrough stream that you can keep and later write the event data to. The response won’t end until the stream is closed.

Also, a Cache-Control: no-cache header is probably appropriate.

wy193777 commented 1 month ago

Contributor

what's the difference between explicitly using res.end() compare to return a PassThrough?

Marsup commented 1 month ago

I just went through the code of susie, it seems pretty close to what kanongil has in mind. It's pretty old but I think it should be mostly functional even on today's hapi, you can always fork it if you find bugs.