p-fifo
Version:
Promised First-In-First-Out buffer. Await on push to be told when a value is consumed and await on shift for a value to consume when the buffer is empty.
37 lines (31 loc) • 810 B
JavaScript
const Fifo = require('fast-fifo')
const defer = require('p-defer')
module.exports = class PFifo {
constructor () {
this._buffer = new Fifo()
this._waitingConsumers = new Fifo()
}
push (chunk) {
const { promise, resolve } = defer()
this._buffer.push({ chunk, resolve })
this._consume()
return promise
}
_consume () {
while (!this._waitingConsumers.isEmpty() && !this._buffer.isEmpty()) {
const nextConsumer = this._waitingConsumers.shift()
const nextChunk = this._buffer.shift()
nextConsumer.resolve(nextChunk.chunk)
nextChunk.resolve()
}
}
shift () {
const { promise, resolve } = defer()
this._waitingConsumers.push({ resolve })
this._consume()
return promise
}
isEmpty () {
return this._buffer.isEmpty()
}
}