0.0.9 • Published 6 years ago
@caaalabash/node-sse v0.0.9
Server-sent Events
A NodeJS wrapper for Server-sent events
INSTALL
npm install @caaalabash/node-sse -Sconst 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 byprocessChunkfunction 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 = ''
})
},