n8n
Version:
n8n Workflow Automation Tool
84 lines • 3.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TarPackageReader = void 0;
const tar_1 = require("tar");
const bad_request_error_1 = require("../../../../errors/response-errors/bad-request.error");
const MANIFEST_PATH = 'manifest.json';
class TarPackageReader {
constructor(buffer, maxUncompressedBytes) {
this.buffer = buffer;
this.maxUncompressedBytes = maxUncompressedBytes;
this.entries = null;
}
async readManifest() {
const entries = await this.load();
const manifest = entries.get(MANIFEST_PATH);
if (!manifest) {
throw new bad_request_error_1.BadRequestError('Package is missing manifest.json');
}
try {
return JSON.parse(manifest.toString('utf-8'));
}
catch {
throw new bad_request_error_1.BadRequestError('Package manifest is not valid JSON');
}
}
async readFile(path) {
const entries = await this.load();
const content = entries.get(path);
if (!content) {
throw new bad_request_error_1.BadRequestError(`Package does not contain entry: ${path}`);
}
return content;
}
async listEntries() {
const entries = await this.load();
return Array.from(entries.keys());
}
async load() {
if (this.entries)
return this.entries;
this.entries = await this.parse();
return this.entries;
}
async parse() {
const entries = new Map();
let totalUncompressedBytes = 0;
return await new Promise((resolve, reject) => {
const parser = new tar_1.Parser();
parser.on('entry', (entry) => {
if (entry.type !== 'File') {
entry.resume();
return;
}
const chunks = [];
let entryBytes = 0;
entry.on('data', (chunk) => {
entryBytes += chunk.length;
if (entryBytes > this.maxUncompressedBytes) {
reject(new bad_request_error_1.BadRequestError(`Package entry "${entry.path}" exceeds the maximum allowed uncompressed size`));
return;
}
chunks.push(chunk);
});
entry.on('end', () => {
const content = Buffer.concat(chunks);
totalUncompressedBytes += content.length;
if (totalUncompressedBytes > this.maxUncompressedBytes) {
reject(new bad_request_error_1.BadRequestError('Package exceeds the maximum allowed uncompressed size'));
return;
}
entries.set(entry.path, content);
});
entry.resume();
});
parser.on('error', (error) => {
reject(new bad_request_error_1.BadRequestError(error instanceof Error ? error.message : 'Failed to read package archive'));
});
parser.on('end', () => resolve(entries));
parser.end(this.buffer);
});
}
}
exports.TarPackageReader = TarPackageReader;
//# sourceMappingURL=tar-package-reader.js.map