@gmod/cram
Version:
read CRAM files with pure Javascript
84 lines (83 loc) • 3.07 kB
TypeScript
import QuickLRU from 'quick-lru';
import CramContainer from './container/index.ts';
import CramRecord from './record.ts';
import { BlockHeader, CompressionMethod } from './sectionParsers.ts';
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>;
}