Skip to content

A hapijs server sent event (SSE) example #4521

Open

Description

@wy193777

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();

Activity

  1. kanongil commented on Aug 3, 2024

    @kanongil
    Contributor

    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.

  2. wy193777 commented on Aug 5, 2024

    @wy193777
    Author

    Contributor

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

  3. Marsup commented on Aug 5, 2024

    @Marsup
    Contributor

    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.

  4. 8th-block commented on Oct 18, 2024

    @8th-block

    So is there a way to do "text/event-stream" in hapi?

  5. damusix commented on Nov 18, 2024

    @damusix
    Contributor

    @wy193777 @8th-block Check this out: https://matthewwid.github.io/better-sse/reference/recipes/#hapi

    I haven't tried it, but I ran into it and asked the maintainer to add a Hapi example and he did. Perhaps it can fit your needs?

  6. hashda04 commented on Aug 19, 2025

    @hashda04

    Hi everyone ,
    I noticed there’s some back-and-forth about adding a proper SSE example to the Hapi docs. I’d be happy to help put together a minimal, correct snippet (using text/event-stream, proper headers, and streams) if that would be useful. Could you confirm if a contribution like this would be welcome for the documentation?

    Thanks!

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions