UNPKG

@gmod/cram

Version:

read CRAM files with pure Javascript

86 lines (85 loc) 3.06 kB
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>; }