export interface IStreamToolsRead<TInput, TOutput> {
    done: () => void;
    write: (writeArg: TInput) => void;
}
/**
 * the read function is called anytime
 *   -> the WebDuplexStream is being read from
 *      and at the same time if nothing is enqueued
 */
export interface IStreamReadFunction<TInput, TOutput> {
    (toolsArg: IStreamToolsRead<TInput, TOutput>): Promise<void>;
}
export interface IStreamToolsWrite<TInput, TOutput> {
    truncate: () => void;
    push: (pushArg: TOutput) => void;
}
/**
 * the write function can return something.
 * It is called anytime a chunk is written to the stream.
 */
export interface IStreamWriteFunction<TInput, TOutput> {
    (chunkArg: TInput, toolsArg: IStreamToolsWrite<TInput, TOutput>): Promise<any>;
}
export interface IStreamFinalFunction<TInput, TOutput> {
    (toolsArg: IStreamToolsWrite<TInput, TOutput>): Promise<TOutput>;
}
export interface WebDuplexStreamOptions<TInput, TOutput> {
    readFunction?: IStreamReadFunction<TInput, TOutput>;
    writeFunction?: IStreamWriteFunction<TInput, TOutput>;
    finalFunction?: IStreamFinalFunction<TInput, TOutput>;
}
export declare class WebDuplexStream<TInput = any, TOutput = any> extends TransformStream<TInput, TOutput> {
    static fromUInt8Array(uint8Array: Uint8Array): WebDuplexStream<Uint8Array, Uint8Array>;
    options: WebDuplexStreamOptions<TInput, TOutput>;
    constructor(optionsArg: WebDuplexStreamOptions<TInput, TOutput>);
    getCustomReadableStream(): ReadableStream<any>;
}
