Better code, more flexible ArchiveUtil
This commit is contained in:
parent
c715bb7731
commit
35e7610670
|
@ -10,6 +10,37 @@ const fs = require('fs');
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const pty = require('ptyw.js');
|
const pty = require('ptyw.js');
|
||||||
|
|
||||||
|
let archiveUtil;
|
||||||
|
|
||||||
|
class Archiver {
|
||||||
|
constructor(config) {
|
||||||
|
this.compress = config.compress;
|
||||||
|
this.decompress = config.decompress;
|
||||||
|
this.list = config.list;
|
||||||
|
this.extract = config.extract;
|
||||||
|
|
||||||
|
this.sig = new Buffer(config.sig, 'hex');
|
||||||
|
this.offset = config.offset || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok() {
|
||||||
|
return this.canCompress() && this.canDecompress();
|
||||||
|
}
|
||||||
|
|
||||||
|
can(what) {
|
||||||
|
if(!_.has(this, [ what, 'cmd' ]) || !_.has(this, [ what, 'args' ])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _.isString(this[what].cmd) && Array.isArray(this[what].args) && this[what].args.length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
canCompress() { return this.can('compress'); }
|
||||||
|
canDecompress() { return this.can('decompress'); }
|
||||||
|
canList() { return this.can('list'); }
|
||||||
|
canExtract() { return this.can('extract'); }
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = class ArchiveUtil {
|
module.exports = class ArchiveUtil {
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -17,34 +48,31 @@ module.exports = class ArchiveUtil {
|
||||||
this.longestSignature = 0;
|
this.longestSignature = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// singleton access
|
||||||
|
static getInstance() {
|
||||||
|
if(!archiveUtil) {
|
||||||
|
archiveUtil = new ArchiveUtil();
|
||||||
|
archiveUtil.init();
|
||||||
|
return archiveUtil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
//
|
//
|
||||||
// Load configuration
|
// Load configuration
|
||||||
//
|
//
|
||||||
if(_.has(Config, 'archivers')) {
|
if(_.has(Config, 'archivers')) {
|
||||||
Object.keys(Config.archivers).forEach(archKey => {
|
Object.keys(Config.archivers).forEach(archKey => {
|
||||||
const arch = Config.archivers[archKey];
|
|
||||||
if(!_.isString(arch.sig) ||
|
const archConfig = Config.archivers[archKey];
|
||||||
!_.isString(arch.compressCmd) ||
|
const archiver = new Archiver(archConfig);
|
||||||
!_.isString(arch.decompressCmd) ||
|
|
||||||
!_.isArray(arch.compressArgs) ||
|
if(!archiver.ok()) {
|
||||||
!_.isArray(arch.decompressArgs))
|
// :TODO: Log warning - bad archiver/config
|
||||||
{
|
|
||||||
// :TODO: log warning
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const archiver = {
|
|
||||||
compressCmd : arch.compressCmd,
|
|
||||||
compressArgs : arch.compressArgs,
|
|
||||||
decompressCmd : arch.decompressCmd,
|
|
||||||
decompressArgs : arch.decompressArgs,
|
|
||||||
sig : new Buffer(arch.sig, 'hex'),
|
|
||||||
offset : arch.offset || 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
this.archivers[archKey] = archiver;
|
this.archivers[archKey] = archiver;
|
||||||
|
|
||||||
if(archiver.offset + archiver.sig.length > this.longestSignature) {
|
if(archiver.offset + archiver.sig.length > this.longestSignature) {
|
||||||
this.longestSignature = archiver.offset + archiver.sig.length;
|
this.longestSignature = archiver.offset + archiver.sig.length;
|
||||||
}
|
}
|
||||||
|
@ -65,6 +93,10 @@ module.exports = class ArchiveUtil {
|
||||||
return this.getArchiver(archType) ? true : false;
|
return this.getArchiver(archType) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
detectTypeWithBuf(buf, cb) {
|
||||||
|
// :TODO: implement me!
|
||||||
|
}
|
||||||
|
|
||||||
detectType(path, cb) {
|
detectType(path, cb) {
|
||||||
fs.open(path, 'r', (err, fd) => {
|
fs.open(path, 'r', (err, fd) => {
|
||||||
if(err) {
|
if(err) {
|
||||||
|
@ -123,15 +155,13 @@ module.exports = class ArchiveUtil {
|
||||||
return cb(new Error(`Unknown archive type: ${archType}`));
|
return cb(new Error(`Unknown archive type: ${archType}`));
|
||||||
}
|
}
|
||||||
|
|
||||||
let args = _.clone(archiver.compressArgs); // don't muck with orig
|
const fmtObj = {
|
||||||
for(let i = 0; i < args.length; ++i) {
|
archivePath : archivePath,
|
||||||
args[i] = stringFormat(args[i], {
|
fileList : files.join(' '),
|
||||||
archivePath : archivePath,
|
};
|
||||||
fileList : files.join(' '),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let comp = pty.spawn(archiver.compressCmd, args, this.getPtyOpts());
|
const args = archiver.compress.args.map( arg => stringFormat(arg, fmtObj) );
|
||||||
|
const comp = pty.spawn(archiver.compress.cmd, args, this.getPtyOpts());
|
||||||
|
|
||||||
return this.spawnHandler(comp, 'Compression', cb);
|
return this.spawnHandler(comp, 'Compression', cb);
|
||||||
}
|
}
|
||||||
|
@ -142,16 +172,14 @@ module.exports = class ArchiveUtil {
|
||||||
if(!archiver) {
|
if(!archiver) {
|
||||||
return cb(new Error(`Unknown archive type: ${archType}`));
|
return cb(new Error(`Unknown archive type: ${archType}`));
|
||||||
}
|
}
|
||||||
|
|
||||||
let args = _.clone(archiver.decompressArgs); // don't muck with orig
|
const fmtObj = {
|
||||||
for(let i = 0; i < args.length; ++i) {
|
archivePath : archivePath,
|
||||||
args[i] = stringFormat(args[i], {
|
extractPath : extractPath,
|
||||||
archivePath : archivePath,
|
};
|
||||||
extractPath : extractPath,
|
|
||||||
});
|
const args = archiver.decompress.args.map( arg => stringFormat(arg, fmtObj) );
|
||||||
}
|
const comp = pty.spawn(archiver.decompress.cmd, args, this.getPtyOpts());
|
||||||
|
|
||||||
let comp = pty.spawn(archiver.decompressCmd, args, this.getPtyOpts());
|
|
||||||
|
|
||||||
return this.spawnHandler(comp, 'Decompression', cb);
|
return this.spawnHandler(comp, 'Decompression', cb);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue