@ethersphere/bee-js
Version:
Javascript client for Bee
79 lines (78 loc) • 2.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TarStream = void 0;
const stream_1 = require("stream");
class TarStream {
constructor() {
this.output = new stream_1.PassThrough();
this.currentFileSize = 0;
}
beginFile(path, size) {
if (path.length > 100) {
throw new Error(`File name too long: ${path}`);
}
const header = createHeader(path, size);
this.output.write(header);
this.currentFileSize = 0;
}
async appendFile(data) {
return new Promise(resolve => {
if (!this.output.write(data)) {
this.output.once('drain', () => {
resolve();
});
}
else {
resolve();
}
this.currentFileSize += data.length;
});
}
async endFile() {
const padding = this.currentFileSize % 512 === 0 ? 0 : 512 - (this.currentFileSize % 512);
if (padding > 0) {
this.output.write(Buffer.alloc(padding, 0));
}
}
async end() {
return new Promise(resolve => {
this.output.write(createEndOfArchive());
this.output.end(() => {
resolve();
});
});
}
}
exports.TarStream = TarStream;
function createHeader(path, size) {
// Initialize header with zeros
const header = Buffer.alloc(512, 0);
// File name, truncated to 100 characters if necessary
header.write(path.slice(0, 100).padEnd(100, '\0'), 0, 100);
// File mode (octal) and null-terminated
header.write('0000777\0', 100, 8);
// UID and GID (octal) and null-terminated
header.write('0001750\0', 108, 8); // UID
header.write('0001750\0', 116, 8); // GID
// File size in octal (11 chars) and null-terminated
header.write(size.toString(8).padStart(11, '0') + '\0', 124, 12);
// Modification time in octal and null-terminated
const modTime = Math.floor(new Date().getTime() / 1000);
header.write(modTime.toString(8).padStart(11, '0') + '\0', 136, 12);
// Checksum placeholder (8 spaces)
header.write(' ', 148, 8);
// Typeflag (normal file)
header.write('0', 156, 1);
// USTAR magic and version
header.write('ustar\0\0', 257, 8);
// Calculate checksum
let checksum = 0;
for (let i = 0; i < 512; i++) {
checksum += header[i];
}
header.write(checksum.toString(8).padStart(6, '0') + '\0 ', 148, 8);
return header;
}
function createEndOfArchive() {
return Buffer.alloc(1024, 0);
}