@gmod/bgzf-filehandle
Version:
read from a compressed bgzip file (with .gzi) as if it were uncompressed
59 lines • 2.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.unzip = unzip;
exports.unzipChunkSlice = unzipChunkSlice;
const pako_esm2_1 = require("pako-esm2");
const bgzf_wasm_inlined_js_1 = require("./wasm/bgzf-wasm-inlined.js");
function hasGzipHeader(data) {
return data[0] === 0x1f && data[1] === 0x8b;
}
function errorMessage(error) {
return error instanceof Error ? error.message : `${error}`;
}
async function decompressGzip(inputData) {
if (typeof DecompressionStream !== 'undefined') {
const stream = new Blob([inputData])
.stream()
.pipeThrough(new DecompressionStream('gzip'));
return new Uint8Array(await new Response(stream).arrayBuffer());
}
else {
return (0, pako_esm2_1.ungzip)(inputData, undefined);
}
}
function wrapGzipHeaderError(error) {
if (errorMessage(error).includes('invalid gzip header')) {
return new Error('problem decompressing block: incorrect gzip header check', { cause: error });
}
return error;
}
async function unzip(inputData) {
try {
return await (0, bgzf_wasm_inlined_js_1.decompressAll)(inputData);
}
catch (error) {
const message = errorMessage(error);
if (message.includes('invalid bgzf header')) {
if (hasGzipHeader(inputData)) {
return decompressGzip(inputData);
}
throw new Error('problem decompressing block: not a valid bgzf or gzip block', { cause: error });
}
throw wrapGzipHeaderError(error);
}
}
async function unzipChunkSlice(inputData, chunk) {
const { minv, maxv } = chunk;
try {
const result = await (0, bgzf_wasm_inlined_js_1.decompressChunkSlice)(inputData, minv.blockPosition, minv.dataPosition, maxv.blockPosition, maxv.dataPosition);
return {
buffer: result.buffer,
cpositions: result.cpositions,
dpositions: result.dpositions,
};
}
catch (error) {
throw wrapGzipHeaderError(error);
}
}
//# sourceMappingURL=unzip.js.map