build(ignoreStderr) { log.trace('build()', this); let cmd = this.cmd; for (const arg of this.args) { cmd += ' ' + arg; } if (ignoreStderr) { cmd += ' 2>/dev/null'; } log.debug('build()', cmd); return cmd; }
static async scan(req) { const context = await Context.create(); const request = new Request(context).extend(req); const pipeline = context.pipelines.filter(p => p.description === request.pipeline)[0]; const cmds = [Scanimage.command(request)].concat(pipeline.commands); log.debug('Executing cmds:', cmds); const buffer = await Process.chain(cmds); const filename = `${Config.outputDirectory}${Config.filename()}.${pipeline.extension}`; const file = new FileInfo(filename); file.save(buffer); log.debug(`Written data to: ${filename}`); return {}; }
static async fileList() { log.debug('fileList()'); return await new Promise((resolve, reject) => { let outdir = Config.outputDirectory; fs.readdir(outdir, (err, list) => { if (err) { reject(err); } let files = list .map(f => new FileInfo(outdir + f)) .filter(f => ['.tif', '.jpg', '.png', '.pdf'].includes(f.extension)); log.debug(files); resolve(files); }); }); }
static async createPreview(req) { const context = await Context.create(); const request = new Request(context).extend({ params: { deviceId: req.params.deviceId, mode: req.params.mode, resolution: Config.previewResolution, brightness: req.params.brightness, contrast: req.params.contrast, dynamicLineart: req.params.dynamicLineart } }); const cmd = `${Scanimage.command(request)} > ${Config.previewDirectory}preview.tif`; log.debug('Executing cmd:', cmd); await Process.spawn(cmd); return {}; }
static command(request) { log.debug(request); const params = request.params; const cmdBuilder = new CmdBuilder(Config.scanimage); cmdBuilder.arg('-d', params.deviceId) .arg('--mode', params.mode) .arg('--resolution', params.resolution) .arg('-l', params.left) .arg('-t', params.top) .arg('-x', params.width) .arg('-y', params.height) .arg('--format', params.format); if ('depth' in params) { cmdBuilder.arg('--depth', params.depth); } if ('brightness' in params) { cmdBuilder.arg('--brightness', params.brightness); } if ('contrast' in params) { cmdBuilder.arg('--contrast', params.contrast); } if (params.mode === 'Lineart' && params.dynamicLineart === false) { cmdBuilder.arg('--disable-dynamic-lineart=yes'); } return cmdBuilder.build(); }
/// Attempts to get a stored configuration of our device and if /// not gets it from the command line. static async get() { const file = new FileInfo(FILEPATH); let isCached = true; if (!file.exists()) { log.debug('device.conf does not exist. Reloading'); isCached = false; } else if (Device.from(file.toJson()).version !== Package.version) { log.debug('device.conf version is old. Reloading'); isCached = false; } if (!isCached) { const cmd = new CmdBuilder(Config.scanimage) .arg(' -A') .build(); const data = await Process.execute(cmd); const device = Device.from(data.output); file.save(JSON.stringify(device, null, 2)); return device; } else { return Device.from(file.toJson()); } }
log.debug(this); return this;
async spawn(cmd, stdin, ignoreErrors) { const MAX_BUFFER = 50 * 1024 * 1024; ignoreErrors = ignoreErrors === undefined ? false : true; log.debug(cmd, stdin, ignoreErrors); return await new Promise((resolve, reject) => { let stdout = Buffer.alloc(0); log.debug(`close(${code}): ${cmd}`); if (code !== 0 && !ignoreErrors) { reject(new Error(`${cmd} exited with code: ${code}, stderr: ${stderr}`));