|
const EventEmitter = require("events") |
|
const Net = require("net") |
|
|
|
const CONFIG = { |
|
INTERVAL: 100, |
|
DURATION: 60000, |
|
PORT: 9050, |
|
} |
|
|
|
const dataPoint = () => [Math.random(), new Date()] |
|
|
|
const emitter = new EventEmitter() |
|
|
|
emitter.on('event', data => console.log(data)) |
|
.on('terminate', () => console.log('data source terminated')) |
|
.on('error', err => console.error('event emitter error')) |
|
|
|
const createServer = emitter => Net.createServer(socket => { |
|
const onData = data => socket.write(JSON.stringify(data) + "\n") |
|
const onTerminate = () => socket.end("Reached end of service. Disconnecting.\n") |
|
|
|
emitter.on('event', onData) |
|
.on('terminate', onTerminate) |
|
|
|
socket.on('close', () => emitter.removeListener('event', onData)) |
|
.on('error', () => console.error("socket error")) |
|
}) |
|
|
|
const server = createServer(emitter) |
|
|
|
server.listen(CONFIG.PORT, () => { |
|
console.log(`listening on ${server.address().address}/${server.address().port}`) |
|
}) |
|
|
|
const terminateInMsec = (duration = 1000, emitter, server, interval) => { |
|
return setTimeout(() => { |
|
emitter.emit('terminate') |
|
emitter.removeAllListeners() |
|
clearInterval(interval) |
|
server.close() |
|
}, duration) |
|
} |
|
|
|
const emitToDataSource = emitter => { |
|
emitter.emit('event', dataPoint()) |
|
} |
|
|
|
// start emitting events with a cadence |
|
let interval = setInterval(() => emitToDataSource(emitter), CONFIG.INTERVAL) |
|
|
|
// plan to kill the stream in a few seconds |
|
terminateInMsec(CONFIG.DURATION, emitter, interval) |