UNPKG

@gmod/bgzf-filehandle

Version:

read from a compressed bgzip file (with .gzi) as if it were uncompressed

59 lines 2.09 kB
"use strict"; 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