Skip to content

schwarzkopfb/sse-broadcast

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

53 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

view on npm downloads per month node version build status test coverage license

sse-broadcast

Server-Sent Events through a Publish/Subscribe API for Node.js. This package is intended to simplify the use of SSE by providing a convenient way to organize ongoing streams into classes (or channels). You can bind an open response stream to one or more channels - specified by a string identifier - and in other parts of the codebase you can address messages (or events) by that channel. Let's take a look at the following example!

Usage

With Express:

const app = require('express')(),
      sse = require('sse-broadcast')()

app.get('/events', function (req, res) {
    sse.subscribe('channel', res)
})

app.post('/event/:type', function (req, res) {
    sse.publish('channel', req.params.type, 'whoo! something happened!')
    res.send()
})

app.listen(3333)

demo

If you're interested about the usage with Koa or a vanilla Node.js server, see the examples folder.

Send event directly to a specified client (instead of a channel):

app.get('/events', function (req, res) {
    var time = Date.now()
    
    setInterval(function () {
        sse.sendEvent(res, 'elapsed-since-connected', Date.now() - time)      
    }, 1000)
})

For more convenience, there are helpers to extend http.ServerResponse.prototype and to easily create middleware for Connect/Express:

const app = require('express')(),
      sse = require('sse-broadcast')

sse.proto(sse())

app.get('/events/:type', function (req, res) {
        res.subscribe(req.params.type)
    })
// or
app.get('/events/:type', sse.middleware({ param: 'type' }))

Compression

This package supports response compression. If you want to compress outgoing event streams then you have to provide the request object for subscriptions.

const app = require('express')(),
      sse = require('sse-broadcast')({ compression: true }) // !!!

app
    .get('/events', function (req, res) {
        sse.subscribe('channel', req, res) // !!!
    })
    .post('/event', function (req, res) {
        sse.publish('channel', 'event', 'data')
        res.end()
    })
    .listen(3333)

The compression option can be set to true or an object containing settings for the compression module.

Using multiple nodes

SSE is a long-polling solution, consequently if you want to broadcast events to every client subscribed to a given channel then you’ll need some way of passing messages between processes or computers.

You can implement your own mechanism to do this or simply use sse-broadcast-redis to distribute events on top of Redis:

const os      = require('os'),
      cluster = require('cluster')

if (cluster.isMaster)
    for (var i = os.cpus().length; i--;)
        cluster.fork()
else {
    const app = require('express')(),
          sse = require('sse-broadcast')()

    require('sse-broadcast-redis')(sse, { host: 'localhost', port: 6379 })

    app.get('/events', function (req, res) {
        sse.subscribe('channel', res)
    })

    app.post('/event', function (req, res) {
        sse.publish('channel', 'event', 'data')
        res.send()
    })

    app.listen(3333)
}

Note: options are passed to redis directly.

API

The overall API documentation is available here.

Compatibility

sse-broadcast is compatible with Node 0.8 and above but in versions lower than 1 you'll need to use a process.nextTick() polyfill.

Installation

With npm:

npm install sse-broadcast

License

MIT

About

Server-Sent Events through a Publish/Subscribe API

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published