@fanoutio/eventstream
Version:
Connect-compatible middleware that enables the easy creation of EventStream endpoints
41 lines (40 loc) • 1.28 kB
JavaScript
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);
}
}