@gmod/cram
Version:
read CRAM files with pure Javascript
86 lines (85 loc) • 3.06 kB
TypeScript
import QuickLRU from '@jbrowse/quick-lru';
import CramContainer from './container/index.ts';
import { type BlockHeader, type CompressionMethod } from './sectionParsers.ts';
import type CramRecord from './record.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;
validateChecksums?: boolean;
};
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;
private _sectionParsers?;
private _definitionResult?;
private _samHeaderResult?;
constructor(args: CramFileArgs);
read(length: number, position: number): Promise<Uint8Array<ArrayBuffer>>;
private _getSectionParsers;
getDefinition(): Promise<{
magic: string;
majorVersion: number;
minorVersion: number;
fileId: string;
}>;
private _fetchDefinition;
getSamHeader(): Promise<{
tag: string;
data: {
tag: string;
value: string;
}[];
}[]>;
private _fetchSamHeader;
getHeaderText(): Promise<string | undefined>;
private iterContainers;
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<BlockHeader & {
_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;
}>;
_uncompress(compressionMethod: CompressionMethod, inputBuffer: Uint8Array, uncompressedSize: number): Promise<Uint8Array>;
readBlock(position: number): Promise<CramFileBlock>;
readBlockFromBuffer(buffer: Uint8Array, bufferOffset: number, filePosition: number): Promise<CramFileBlock>;
}