peer-emitter
Version:
acknowledgeable events
67 lines (48 loc) • 1.19 kB
JavaScript
var streams = require('stream');
var Readable = streams.Readable;
var PassThrough = streams.PassThrough;
module.exports = ReadStream;
function ReadStream(emitter, name) {
var stream = new Readable({
objectMode: true
});
var ackStream;
var handler;
var queue = [];
stream._read = listen;
var started;
function listen(n) {
if (started)
return;
started = true;
if (handler)
return;
handler = ackStream ? handlerWithAck : simpleHandler;
emitter.on(name, handler);
}
function simpleHandler(d) {
stream.push(d);
}
function handlerWithAck(d, ack) {6
queue.push({data:d, ack:ack});
stream.push(d);
}
stream.AckStream = createAckStream;
function createAckStream() {
if (ackStream)
throw Error('already created');
ackStream = new PassThrough({ objectMode: true });
ackStream.on('data', function(d) {
var pair = queue.shift();
pair.ack();
});
if (handler === simpleHandler) {
emitter.removeListener(name, simpleHandler);
handler = undefined;
}
if (! handler)
emitter.on(name, handlerWithAck);
return ackStream;
}
return stream;
}