stream-chain
Version:
Chain functions, generators, Node streams, and Web streams into a pipeline with backpressure support.
80 lines (73 loc) • 3.62 kB
TypeScript
import type {Arg0, Ret} from '../defs.js';
/**
* Options for `chain(fns, options)` in the `/web` subpath. Uses Web Streams'
* standard `QueuingStrategy` shape. Forwarded to every `asWebStream` stage the
* chain creates; existing stream items in `fns` keep their own settings.
*/
export interface ChainWebStreamOptions {
/** Queuing strategy applied to both sides of each new stage if no side-specific given. */
strategy?: QueuingStrategy;
/** Queuing strategy for the readable side of each new stage. */
readableStrategy?: QueuingStrategy;
/** Queuing strategy for the writable side of each new stage. */
writableStrategy?: QueuingStrategy;
}
/**
* A single stage in a /web chain: has a readable side, a writable side, or both.
* Source stages have `writable: null`; sink stages have `readable: null`.
*/
export interface ChainWebStage {
readonly readable: ReadableStream | null;
readonly writable: WritableStream | null;
}
/**
* The /web chain output: a Web Streams duplex pair plus parity statics.
*
* Property surface parity with /node's `ChainOutput` and /core's `CoreChainOutput`:
* - `streams`: the array of internal stages
* - `input`: the first stage
* - `output`: the last stage
*
* Pipe through other Web Streams via `chain([...]).readable.pipeThrough(other)`.
* NOT structurally a `TransformStream` — chains are many-in/many-out with
* independent backpressure profiles that `TransformStream`'s per-chunk
* `transform()` model doesn't fit cleanly.
*/
export interface ChainWebStream<W, R> {
readonly readable: ReadableStream<R> | null;
readonly writable: WritableStream<W> | null;
readonly streams: ReadonlyArray<ChainWebStage>;
readonly input: ChainWebStage;
readonly output: ChainWebStage;
__streamTypeW(): W;
__streamTypeR(): R;
}
/**
* `/web` chain factory. Composes functions and Web Streams objects into a
* native Web Streams duplex pair (no `node:stream` interop). Browser-safe.
* @param fns array of functions, `gen(...)`/`fun(...)` wrappers, Web Streams objects (`ReadableStream`, `WritableStream`, `{readable, writable}` pairs), or nested arrays (flattened). Falsy items are ignored. Source-only and sink-only streams are allowed at first and last positions respectively.
* @param options optional `{strategy?, readableStrategy?, writableStrategy?}` Web Streams' `QueuingStrategy` shape. Forwarded to every newly-wrapped `asWebStream` stage; existing stream items keep their own settings.
* @returns a {@link ChainWebStream} — a `{readable, writable, streams, input, output}` object suitable for piping into / from other Web Streams.
*/
declare function chain<const L extends readonly unknown[]>(
fns: L,
options?: ChainWebStreamOptions
): ChainWebStream<Arg0<L>, Ret<L>>;
/**
* Same as {@link chain} but bypasses TypeScript type checking on `fns`.
* @param fns array of functions and stream objects. Type checking is intentionally not applied.
* @param options optional `Web Streams` queuing-strategy options — see {@link ChainWebStreamOptions}.
* @returns a {@link ChainWebStream} typed as `ChainWebStream<W, R>` (caller-supplied type parameters).
*/
declare function chainUnchecked<W = any, R = any>(
fns: readonly any[],
options?: ChainWebStreamOptions
): ChainWebStream<W, R>;
export default chain;
export {chain, chainUnchecked};
export {gen} from '../gen.js';
export {fun} from '../fun.js';
export {dataSource} from '../dataSource.js';
export {asWebStream} from '../asWebStream.js';
export {isReadableWebStream, isWritableWebStream, isDuplexWebStream} from '../asWebStream.js';
export * from '../defs.js';