chdman
Version:
💿 chdman binaries and wrapper for Node.js.
75 lines • 3.62 kB
JavaScript
import util from 'node:util';
import fs from 'node:fs';
import ChdmanBin from './chdmanBin.js';
import ChdmanInfo from './chdmanInfo.js';
export default {
/**
* Create a hard disk CHD.
*/
async createHd(options) {
let existedBefore;
try {
await util.promisify(fs.stat)(options.outputFilename);
existedBefore = true;
}
catch {
existedBefore = false;
}
try {
await ChdmanBin.run([
'createhd',
'--output', options.outputFilename,
...(options.outputParentFilename ? ['--outputparent', String(options.outputParentFilename)] : []),
...(options.force === true ? ['--force'] : []),
'--input', options.inputFilename,
...(options.inputStartByte === undefined ? [] : ['--inputstartbyte', String(options.inputStartByte)]),
...(options.inputStartHunk === undefined ? [] : ['--inputstarthunk', String(options.inputStartHunk)]),
...(options.inputBytes === undefined ? [] : ['--inputbytes', String(options.inputBytes)]),
...(options.inputHunks === undefined ? [] : ['--inputhunks', String(options.inputHunks)]),
...(options.hunkSize === undefined ? [] : ['--hunksize', String(options.hunkSize)]),
...(options.compression === undefined
? []
: ['--compression', Array.isArray(options.compression) ? options.compression.join(',') : options.compression]),
...(options.template === undefined ? [] : ['--template', String(options.template)]),
...(options.identFilename === undefined ? [] : ['--ident', options.identFilename]),
...(options.cylindersHeadsSectors ? ['--chs', options.cylindersHeadsSectors] : []),
...(options.size === undefined ? [] : ['--size', String(options.size)]),
...(options.sectorSize === undefined ? [] : ['--sectorsize', String(options.sectorSize)]),
...(options.numProcessors === undefined ? [] : ['--numprocessors', String(options.numProcessors)]),
], options);
}
catch (error) {
// chdman can leave cruft when it fails
if (!existedBefore) {
await util.promisify(fs.rm)(options.outputFilename, { force: true });
}
throw error;
}
// Test the created file
try {
await ChdmanInfo.info({
inputFilename: options.outputFilename,
});
}
catch (error) {
throw new Error(`created CHD is invalid: ${error}`);
}
},
/**
* Extract a hard disk CHD.
*/
async extractHd(options) {
await ChdmanBin.run([
'extracthd',
'--output', options.outputFilename,
...(options.force === true ? ['--force'] : []),
'--input', options.inputFilename,
...(options.inputParentFilename ? ['--inputparent', options.inputParentFilename] : []),
...(options.inputStartByte === undefined ? [] : ['--inputstartbyte', String(options.inputStartByte)]),
...(options.inputStartHunk === undefined ? [] : ['--inputstarthunk', String(options.inputStartHunk)]),
...(options.inputBytes === undefined ? [] : ['--inputbytes', String(options.inputBytes)]),
...(options.inputHunks === undefined ? [] : ['--inputhunks', String(options.inputHunks)]),
], options);
},
};
//# sourceMappingURL=chdmanHd.js.map