import * as stream from 'stream';
import { Disposable } from '@theia/core/lib/common';
/**
 * The MultiRingBuffer is a ring buffer implementation that allows
 * multiple independent readers.
 *
 * These readers are created using the getReader or getStream functions
 * to create a reader that can be read using deq() or one that is a readable stream.
 */
export declare class MultiRingBufferReadableStream extends stream.Readable implements Disposable {
    protected readonly ringBuffer: MultiRingBuffer;
    protected readonly reader: number;
    protected readonly encoding: BufferEncoding;
    protected more: boolean;
    protected disposed: boolean;
    constructor(ringBuffer: MultiRingBuffer, reader: number, encoding?: BufferEncoding);
    _read(size: number): void;
    _destroy(err: Error | null, callback: (err: Error | null) => void): void;
    onData(): void;
    deq(size: number): void;
    dispose(): void;
}
export declare const MultiRingBufferOptions: unique symbol;
export interface MultiRingBufferOptions {
    readonly size: number;
    readonly encoding?: BufferEncoding;
}
export interface WrappedPosition {
    newPos: number;
    wrap: boolean;
}
export declare class MultiRingBuffer implements Disposable {
    protected readonly options: MultiRingBufferOptions;
    protected readonly buffer: Buffer;
    protected head: number;
    protected tail: number;
    protected readonly maxSize: number;
    protected readonly encoding: BufferEncoding;
    protected readonly readers: Map<number, number>;
    protected readonly streams: Map<MultiRingBufferReadableStream, number>;
    protected readerId: number;
    constructor(options: MultiRingBufferOptions);
    enq(str: string, encoding?: string): void;
    getReader(): number;
    closeReader(id: number): void;
    getStream(encoding?: BufferEncoding): MultiRingBufferReadableStream;
    closeStream(readableStream: MultiRingBufferReadableStream): void;
    protected onData(start: number): void;
    deq(id: number, size?: number, encoding?: BufferEncoding): string | undefined;
    sizeForReader(id: number): number;
    size(): number;
    protected isWrapped(from: number, to: number): boolean;
    protected sizeFrom(from: number, to: number, wrap: boolean): number;
    emptyForReader(id: number): boolean;
    empty(): boolean;
    streamsSize(): number;
    readersSize(): number;
    /**
     * Dispose all the attached readers/streams.
     */
    dispose(): void;
    protected shouldIncPos(pos: number, end: number, size: number): boolean;
    protected incTailSize(pos: number, head: number, size: number): WrappedPosition;
    protected incTail(pos: number, size: number): WrappedPosition;
    protected incTails(size: number): void;
    protected inc(pos: number, size: number): WrappedPosition;
}
//# sourceMappingURL=multi-ring-buffer.d.ts.map