UNPKG

@fanoutio/eventstream

Version:

Connect-compatible middleware that enables the easy creation of EventStream endpoints

41 lines (40 loc) 1.28 kB
import { Transform } from 'stream'; import { encodeEvent } from '../utils/textEventStream.js'; import { KEEP_ALIVE_TIMEOUT } from '../constants.js'; export default class ServerSentEventsSerializer extends Transform { keepAliveTimer; constructor() { super({ writableObjectMode: true }); this.keepAliveTimer = null; this.setupKeepAliveTimer(); } _transform(event, _encoding, callback) { try { this.setupKeepAliveTimer(); const encodedEvent = encodeEvent({ event: event.event, data: JSON.stringify(event.data), }); this.push(encodedEvent); } catch (ex) { const err = ex instanceof Error ? ex : new Error(String(ex)); callback(err); return; } callback(); } setupKeepAliveTimer() { if (this.keepAliveTimer != null) { clearInterval(this.keepAliveTimer); this.keepAliveTimer = null; } this.keepAliveTimer = setInterval(() => { const encodedEvent = encodeEvent({ event: 'keep-alive', data: '', }); this.push(encodedEvent); }, KEEP_ALIVE_TIMEOUT * 1000); } }