2023-10-03 11:14:36 +08:00
|
|
|
'use strict'
|
|
|
|
|
|
|
|
const MinipassPipeline = require('minipass-pipeline')
|
|
|
|
|
|
|
|
class CachingMinipassPipeline extends MinipassPipeline {
|
|
|
|
#events = []
|
|
|
|
#data = new Map()
|
|
|
|
|
|
|
|
constructor (opts, ...streams) {
|
|
|
|
// CRITICAL: do NOT pass the streams to the call to super(), this will start
|
|
|
|
// the flow of data and potentially cause the events we need to catch to emit
|
|
|
|
// before we've finished our own setup. instead we call super() with no args,
|
|
|
|
// finish our setup, and then push the streams into ourselves to start the
|
|
|
|
// data flow
|
|
|
|
super()
|
|
|
|
this.#events = opts.events
|
|
|
|
|
|
|
|
/* istanbul ignore next - coverage disabled because this is pointless to test here */
|
|
|
|
if (streams.length) {
|
|
|
|
this.push(...streams)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
on (event, handler) {
|
|
|
|
if (this.#events.includes(event) && this.#data.has(event)) {
|
|
|
|
return handler(...this.#data.get(event))
|
|
|
|
}
|
|
|
|
|
|
|
|
return super.on(event, handler)
|
|
|
|
}
|
|
|
|
|
|
|
|
emit (event, ...data) {
|
|
|
|
if (this.#events.includes(event)) {
|
|
|
|
this.#data.set(event, data)
|
|
|
|
}
|
|
|
|
|
|
|
|
return super.emit(event, ...data)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = CachingMinipassPipeline
|