You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.1 KiB
41 lines
1.1 KiB
'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
|
|
|