UNPKG

@plastichub/osr-mail

Version:

This is a CLI(CommandLineInterface) toolset to convert media files

142 lines (136 loc) 4.73 kB
import { logger } from '../..'; import * as stream from 'stream'; import { ChildProcess, exec } from 'child_process'; import { os } from '../common/platform'; export enum STATUS { OK, ERROR, PENDING } const fatalHandler = (message: string, fn: (msg: string) => void): boolean => { if (message.startsWith('fatal:')) { fn('\t\ ' + message); return true; } return false; }; // tslint:disable-next-line:no-empty const subscribe = (signal: stream.Readable, collector: (data: any) => void = () => { }) => { const buffer: string[] = []; signal.on('message', (message) => logger.debug('message', message)); signal.on('error', (error) => logger.error('std-error', error)); signal.on('data', (data) => { const message = data.toString(); buffer.push(message); // .replace(/[\x00-\x1F\x7F-\x9F]/g, "") collector(buffer); }); }; const merge = (buffer: string[], data: any): string[] => buffer.concat(data); const hook = (process: ChildProcess, resolve: any, reject: any, cmd: string) => { let buffer: string[] = []; const collector = (data: any) => { buffer = buffer.concat(data); }; const stdout = subscribe(process.stdout, collector); const stderr = subscribe(process.stderr, collector); process.on('exit', (code, signal) => { if (code) { resolve({ code: STATUS.ERROR, command: cmd, error: code, messages: buffer }); } else { resolve({ code: STATUS.OK, command: cmd, messages: buffer }); } }); return process; }; export class Process { public binary = 'magick'; public cwd: string = ''; public args: string = ''; constructor(options: any = {}) { this.binary = options.binary || this.binary; //this.binary = path.resolve(which(this.binary)); this.cwd = options.cwd || process.cwd(); } public optionsToString(options: any): string { const args: any[] = []; // tslint:disable-next-line:forin for (const k in options) { const val = options[k]; if (k.length === 1) { // val is true, add '-k' if (val === true) { args.push('-' + k); } else if (val !== false) { // if val is not false, add '-k val' args.push('-' + k + ' ' + val); } } else { if (val === true) { args.push('--' + k); } else if (val !== false) { args.push('--' + k + '=' + val); } } } return args.join(' '); } public optionsToArray(options: any): string[] { const args: any[] = []; // tslint:disable-next-line:forin for (const k in options) { const val = options[k]; if (k.length === 1) { // val is true, add '-k' if (val === true) { args.push('-' + k); } else if (val !== false) { // if val is not false, add '-k val' args.push('-' + k + ' ' + val); } } else { if (val === true) { args.push('--' + k); } else if (val !== false) { args.push('--' + k + '=' + val); } } } return args; } public async exec(command: string, options: any = {}, args: any[] = []): Promise<any> { args = [command].concat(args); return new Promise<any>((resolve, reject) => { const p = exec(this.binary + ' ' + args.join(' '), { cwd: this.cwd }); return hook(p, resolve, reject, this.binary + ' ' + args.join(' ')); }); } } export class Helper { public static async run(cwd, command: string, gitArgs: string[]): Promise<any> { const gitProcess = new Process({ cwd: cwd, binary: os() == 'windows' ? 'magick' : '' }); const p = gitProcess.exec(command, {}, gitArgs); p.catch((e) => logger.error('Error git command : ' + command)); return p; } public static async runBin(cwd,bin, command: string, gitArgs: string[]): Promise<any> { const gitProcess = new Process({ cwd: cwd, binary: bin }); const p = gitProcess.exec(command, {}, gitArgs); p.catch((e) => logger.error('Error git command : ' + command)); return p; } }