import QuickLRU from 'quick-lru';
import CramContainer from './container';
import CramRecord from './record';
import { BlockHeader, CompressionMethod } from './sectionParsers';
import type { GenericFilehandle } from 'generic-filehandle2';
export interface CramFileSource {
    filehandle?: GenericFilehandle;
    url?: string;
    path?: string;
}
export type SeqFetch = (seqId: number, start: number, end: number) => Promise<string>;
export type CramFileArgs = CramFileSource & {
    checkSequenceMD5?: boolean;
    cacheSize?: number;
    seqFetch?: SeqFetch;
};
export type CramFileBlock = BlockHeader & {
    _endPosition: number;
    contentPosition: number;
    _size: number;
    content: Uint8Array;
    crc32?: number;
};
export default class CramFile {
    private file;
    validateChecksums: boolean;
    fetchReferenceSequenceCallback?: SeqFetch;
    options: {
        checkSequenceMD5?: boolean;
        cacheSize: number;
    };
    featureCache: QuickLRU<string, Promise<CramRecord[]>>;
    private header;
    constructor(args: CramFileArgs);
    read(length: number, position: number): Promise<Uint8Array<ArrayBuffer>>;
    getDefinition(): Promise<{
        magic: string;
        majorVersion: number;
        minorVersion: number;
        fileId: string;
    }>;
    getSamHeader(): Promise<{
        tag: string;
        data: {
            tag: string;
            value: string;
        }[];
    }[]>;
    getHeaderText(): Promise<string | undefined>;
    getContainerById(containerNumber: number): Promise<CramContainer | undefined>;
    checkCrc32(position: number, length: number, recordedCrc32: number, description: string): Promise<void>;
    /**
     * @returns {Promise[number]} the number of containers in the file
     *
     * note: this is currently used only in unit tests, and after removing file
     * length check, relies on a try catch to read return an error to break
     */
    containerCount(): Promise<number | undefined>;
    getContainerAtPosition(position: number): CramContainer;
    readBlockHeader(position: number): Promise<{
        uncompressedSize: number;
        compressedSize: number;
        contentId: number;
        contentType: "FILE_HEADER" | "COMPRESSION_HEADER" | "MAPPED_SLICE_HEADER" | "UNMAPPED_SLICE_HEADER" | "EXTERNAL_DATA" | "CORE_DATA";
        compressionMethod: CompressionMethod;
    } & {
        _endPosition: number;
        _size: number;
    }>;
    _parseSection<T>(section: {
        maxLength: number;
        parser: (buffer: Uint8Array, offset: number) => {
            offset: number;
            value: T;
        };
    }, position: number, size?: number, preReadBuffer?: Uint8Array): Promise<T & {
        _endPosition: number;
        _size: number;
    }>;
    _uncompressPre(compressionMethod: CompressionMethod, inputBuffer: Uint8Array, uncompressedSize: number): Promise<any>;
    _uncompress(compressionMethod: CompressionMethod, inputBuffer: Uint8Array, uncompressedSize: number): Promise<any>;
    readBlock(position: number): Promise<CramFileBlock>;
}
