import { Readable } from "readable-stream" ; import bufferStream from "./buffer-stream" ; export interface Options { maxBuffer ? : number ; array ? : boolean ; encoding ? : string ; } export function getStream ( inputStream , opts = { } ) { if ( ! inputStream ) { return Promise . reject ( new Error ( "Expected a stream" ) ) ; } opts = Object . assign ( { maxBuffer : Infinity } , opts ) ; const maxBuffer = opts . maxBuffer || Infinity ; let stream ; let clean ; const p = new Promise ( ( resolve , reject ) => { const error = ( err ) => { if ( err ) { err . bufferedData = stream . getBufferedValue ( ) ; } reject ( err ) ; } ; stream = bufferStream ( opts ) ; inputStream . once ( "error" , error ) ; inputStream . pipe ( stream ) ; stream . on ( "data" , ( ) => { if ( stream . getBufferedLength ( ) > maxBuffer ) { reject ( new Error ( "maxBuffer exceeded" ) ) ; } } ) ; stream . once ( "error" , error ) ; stream . on ( "end" , resolve ) ; clean = ( ) => { if ( inputStream . unpipe ) { inputStream . unpipe ( stream ) ; } } ; } ) ; p . then ( clean , clean ) ; return p . then ( ( ) => stream . getBufferedValue ( ) ) ; } export function buffer ( stream , opts = { } ) { getStream ( stream , Object . assign ( { } , opts , { encoding : "buffer" } ) ) ; } export function array ( stream , opts = { } ) { getStream ( stream , Object . assign ( { } , opts , { array : true } ) ) ; }