92 lines
2.9 KiB
JavaScript
92 lines
2.9 KiB
JavaScript
import { DataFile } from './ExtractorData.helper';
|
|
import { Extractor } from './Extractor';
|
|
export class ExtractorData extends Extractor {
|
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-explicit-any
|
|
constructor(unrar, data, password) {
|
|
super(unrar, password);
|
|
this.dataFiles = {};
|
|
this.dataFileMap = {};
|
|
this.currentFd = 1;
|
|
const rarFile = {
|
|
file: new DataFile(new Uint8Array(data)),
|
|
fd: this.currentFd++,
|
|
};
|
|
this._filePath = '_defaultUnrarJS_.rar';
|
|
this.dataFiles[this._filePath] = rarFile;
|
|
this.dataFileMap[rarFile.fd] = this._filePath;
|
|
}
|
|
extract(options = {}) {
|
|
const { arcHeader, files } = super.extract(options);
|
|
function* getFiles() {
|
|
for (const file of files) {
|
|
if (!file.fileHeader.flags.directory) {
|
|
file.extraction =
|
|
this.dataFiles[this.getExtractedFileName(file.fileHeader.name)].file.readAll();
|
|
}
|
|
yield file;
|
|
}
|
|
}
|
|
return { arcHeader, files: getFiles.call(this) };
|
|
}
|
|
getExtractedFileName(filename) {
|
|
return `*Extracted*/${filename}`;
|
|
}
|
|
open(filename) {
|
|
const dataFile = this.dataFiles[filename];
|
|
if (!dataFile) {
|
|
return 0;
|
|
}
|
|
return dataFile.fd;
|
|
}
|
|
create(filename) {
|
|
const fd = this.currentFd++;
|
|
this.dataFiles[this.getExtractedFileName(filename)] = {
|
|
file: new DataFile(),
|
|
fd: this.currentFd++,
|
|
};
|
|
this.dataFileMap[fd] = this.getExtractedFileName(filename);
|
|
return fd;
|
|
}
|
|
closeFile(fd) {
|
|
const fileData = this.dataFiles[this.dataFileMap[fd]];
|
|
if (!fileData) {
|
|
return;
|
|
}
|
|
fileData.file.seek(0, 'SET');
|
|
}
|
|
read(fd, buf, size) {
|
|
const fileData = this.dataFiles[this.dataFileMap[fd]];
|
|
if (!fileData) {
|
|
return -1;
|
|
}
|
|
const data = fileData.file.read(size);
|
|
if (data === null) {
|
|
return -1;
|
|
}
|
|
this.unrar.HEAPU8.set(data, buf);
|
|
return data.byteLength;
|
|
}
|
|
write(fd, buf, size) {
|
|
const fileData = this.dataFiles[this.dataFileMap[fd]];
|
|
if (!fileData) {
|
|
return false;
|
|
}
|
|
fileData.file.write(this.unrar.HEAPU8.slice(buf, buf + size));
|
|
return true;
|
|
}
|
|
tell(fd) {
|
|
const fileData = this.dataFiles[this.dataFileMap[fd]];
|
|
if (!fileData) {
|
|
return -1;
|
|
}
|
|
return fileData.file.tell();
|
|
}
|
|
seek(fd, pos, method) {
|
|
const fileData = this.dataFiles[this.dataFileMap[fd]];
|
|
if (!fileData) {
|
|
return false;
|
|
}
|
|
return fileData.file.seek(pos, method);
|
|
}
|
|
}
|
|
//# sourceMappingURL=ExtractorData.js.map
|