import { ChildProcessWithoutNullStreams, spawn } from 'child_process'; export function stdoutOn(bat: ChildProcessWithoutNullStreams): Promise { return new Promise((resolve) => { bat.stdout.on('data', (data: Buffer) => { resolve(data.toString()); }); }); } export async function getFileRowsNumber(filePath: string): Promise { const res = await stdoutOn(spawn('wc', ['-l', filePath])); return Promise.resolve(Number(/\d+\s/.exec(res))); } export async function getFileHeadData(filePath: string, count: number): Promise { const rows = await getFileRowsNumber(filePath); if (rows <= 0) { return Promise.resolve([]); } const res = await stdoutOn(spawn('head', ['-n', count.toString(), filePath])); return Promise.resolve(res.split('\n', count)); } export async function getFileMiddleData(filePath: string, count: number): Promise { const rows = await getFileRowsNumber(filePath); if (rows <= count) { return Promise.resolve([]); } const halfRows = Math.floor(rows / 2); const halfCount = Math.floor(count / 2); const start = halfRows - halfCount; const end = count % 2 === 0 ? halfRows + halfCount - 1 : halfRows + halfCount; const res = await stdoutOn(spawn('sed', ['-n', `${start},${end}p`, filePath])); return Promise.resolve(res.split('\n', count)); } export async function getFileTailData(filePath: string, count: number): Promise { const rows = await getFileRowsNumber(filePath); if (rows <= 0) { return Promise.resolve([]); } const res = await stdoutOn(spawn('tail', ['-n', count.toString(), filePath])); return Promise.resolve(res.split('\n', count)); }