58 lines
1.2 KiB
JavaScript
58 lines
1.2 KiB
JavaScript
const StreamUnzip = require('node-stream-zip');
|
|
|
|
class ZipReader {
|
|
constructor() {
|
|
this.zip = null;
|
|
}
|
|
|
|
checkState() {
|
|
if (!this.zip)
|
|
throw new Error('Zip closed');
|
|
}
|
|
|
|
async open(zipFile, zipEntries = true) {
|
|
if (this.zip)
|
|
throw new Error('Zip file is already open');
|
|
|
|
const zip = new StreamUnzip.async({file: zipFile, skipEntryNameValidation: true});
|
|
|
|
if (zipEntries)
|
|
this.zipEntries = await zip.entries();
|
|
|
|
this.zip = zip;
|
|
}
|
|
|
|
get entries() {
|
|
this.checkState();
|
|
|
|
return this.zipEntries;
|
|
}
|
|
|
|
async extractToBuf(entryFilePath) {
|
|
this.checkState();
|
|
|
|
return await this.zip.entryData(entryFilePath);
|
|
}
|
|
|
|
async extractToFile(entryFilePath, outputFile) {
|
|
this.checkState();
|
|
|
|
await this.zip.extract(entryFilePath, outputFile);
|
|
}
|
|
|
|
async extractAllToDir(outputDir) {
|
|
this.checkState();
|
|
|
|
await this.zip.extract(null, outputDir);
|
|
}
|
|
|
|
async close() {
|
|
if (this.zip) {
|
|
await this.zip.close();
|
|
this.zip = null;
|
|
this.zipEntries = undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = ZipReader; |