@johngw/stream
Version:
Reactive programming tools using the WHATWG Streams API.
48 lines (42 loc) • 1.42 kB
text/typescript
import { all } from '@johngw/stream-common/Async'
import {
CancellableSource,
PullableSource,
StartableSource,
isCancellableSource,
isPullableSource,
isStartableSource,
} from '@johngw/stream-common/Stream'
/**
* A collection of `UnderlyingSource`s that implement the `UnderlyingSource`.
*
* @group Sources
* @example
* ```
* new ReadableStream(
* new SourceComposite([
* { start: (controller) => controller.enqueue('Hello') },
* { start: (controller) => controller.enqueue('World') },
* ])
* )
* ```
*/
export class SourceComposite<T> implements UnderlyingDefaultSource<T> {
readonly #cancellableSources: CancellableSource<T>[]
readonly #pullableSources: PullableSource<T>[]
readonly #startableSources: StartableSource<T>[]
constructor(sources: UnderlyingDefaultSource<T>[]) {
this.#cancellableSources = sources.filter(isCancellableSource)
this.#pullableSources = sources.filter(isPullableSource)
this.#startableSources = sources.filter(isStartableSource)
}
async cancel(reason: unknown) {
await all(this.#cancellableSources, (source) => source.cancel(reason))
}
async pull(controller: ReadableStreamDefaultController<T>) {
await all(this.#pullableSources, (source) => source.pull(controller))
}
async start(controller: ReadableStreamDefaultController<T>) {
await all(this.#startableSources, (source) => source.start(controller))
}
}