@caaalabash/node-sse
v0.0.9
Published
Server-sent events for NodeJS
Downloads
3
Readme
Server-sent Events
A NodeJS wrapper for Server-sent events
INSTALL
npm install @caaalabash/node-sse -S
const SSE = require('@caaalabash/node-sse')
new SSE(options)
API
new SSE(options)
This will create an SSE
instance.
- Properties:
uid
: used for defining an unique conversation.stream
: event stream, send to client directly.transformStream
: extra stream, process byprocessChunk
function then send tostream
.
- Options:
setHeaderFunc
- How to write response headers? This is relate to framework.[genId]
- How to generate sse conversation uuid? By default, it'suuid/v4
.[processChunk]
- How to transform chunkData to sse stream? By default, just.toString()
.[heartBeatInterval]
- Keep alive milliseconds, by default, it's 5000 ms.[retryTime]
- Reconnect SSE interval, by default, it's 5000 ms.[lastEventId]
- Set messageId init value, by default, it's 0.[connectEventName]
- Connect event name, by default, it's sse-connect.[transformEventName]
- Event name for transformStream.on('data').[withMessageId]
- send message with message id, by default, it's true, increase from 0.
- Methods:
send(event, payload)
: Send custom event to client, support string/object.sendFromStream(readableStream)
: Send stream to transformStream.static getInstance(uid)
: Get instance by uid.
EXAMPLE
server
const fs = require('fs')
const path = require('path')
const SSE = require('node-sse')
module.exports = {
/**
* Connect with client, client will receive `sse-connect` event with payload uid
*/
async startConnection(ctx) {
const sse = new SSE({
setHeaderFunc: ctx.set.bind(ctx),
processChunkFunc: chunk => JSON.stringify({ result: chunk.toString() })
})
ctx.body = sse.stream
},
/**
* Send file through SSE
*/
async getLogData(ctx) {
const { uid } = ctx.query
const sseInstance = SSE.getInstance(uid)
if (sseInstance) {
sseInstance.send('reset-log', '')
sseInstance.sendFromStream(fs.createReadStream('test.log', { highWaterMark: 1024 * 6, encoding: 'utf8' }))
}
return ctx.status = 200
}
}
client
startConnect() {
const eventSource = new EventSource('/api/sse/connect')
// receive uid
eventSource.addEventListener('sse-connect', e => {
this.uid = e.data
})
// receive log data
eventSource.addEventListener('sse-data', e => {
this.originData += JSON.parse(e.data).result
})
eventSource.addEventListener('reset-log', e => {
this.originData = ''
})
},