UNPKG

@loaders.gl/i3s

Version:
29 lines (28 loc) 1.45 kB
import { parseZipCDFileHeader, CD_HEADER_SIGNATURE, parseZipLocalFileHeader, searchFromTheEnd, parseHashTable, makeHashTableFromZipHeaders } from '@loaders.gl/zip'; import { SLPKArchive } from "./slpk-archieve.js"; /** * Creates slpk file handler from raw file * @param fileProvider raw file data * @param cb is called with information message during parsing * @returns slpk file handler */ export async function parseSLPKArchive(fileProvider, cb, fileName) { const hashCDOffset = await searchFromTheEnd(fileProvider, CD_HEADER_SIGNATURE); const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider); let hashTable; if (cdFileHeader?.fileName !== '@specialIndexFileHASH128@') { hashTable = await makeHashTableFromZipHeaders(fileProvider); cb?.('SLPK doesnt contain hash file, hash info has been composed according to zip archive headers'); } else { // cb?.('SLPK contains hash file'); const localFileHeader = await parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, fileProvider); if (!localFileHeader) { throw new Error('corrupted SLPK'); } const fileDataOffset = localFileHeader.fileDataOffset; const hashFile = await fileProvider.slice(fileDataOffset, fileDataOffset + localFileHeader.compressedSize); hashTable = parseHashTable(hashFile); } return new SLPKArchive(fileProvider, hashTable, fileName); }