@mieweb/wikigdrive
Version:
Google Drive to MarkDown synchronization
95 lines (94 loc) • 2.94 kB
JavaScript
import fs from 'node:fs';
import { PassThrough } from 'node:stream';
import zlib from 'node:zlib';
export class JobLogFileProcessor {
constructor(logFile, options) {
Object.defineProperty(this, "logFile", {
enumerable: true,
configurable: true,
writable: true,
value: logFile
});
Object.defineProperty(this, "options", {
enumerable: true,
configurable: true,
writable: true,
value: options
});
}
createReadStream(logFile) {
const readStream = fs.createReadStream(logFile);
if (logFile.endsWith('.gz')) {
const stream = new PassThrough();
readStream.pipe(zlib.createGunzip()).pipe(stream);
return [readStream, stream];
}
else {
return [readStream, readStream];
}
}
stringToLogLine(buff) {
try {
const log = JSON.parse(buff);
if (!log || typeof log !== 'object') {
return null;
}
const time = new Date(log.timestamp);
log.timestamp = +time;
if (this.options.level && this.options.level !== log.level) {
return null;
}
return log;
}
catch (err) {
return null;
}
}
processLogFile(logFile) {
return new Promise((resolve, reject) => {
const results = [];
const [, stream] = this.createReadStream(logFile);
stream.on('error', (err) => {
if (stream.readable) {
stream.destroy();
}
if (err['code'] === 'ENOENT') {
resolve(results);
}
else {
reject(err);
}
});
let buff = '';
stream.on('data', (data) => {
const dataArr = (buff + data).split(/\n+/);
const l = dataArr.length - 1;
for (let i = 0; i < l; i++) {
const logLine = this.stringToLogLine(dataArr[i]);
if (!logLine)
continue;
results.push(logLine);
}
buff = dataArr[l];
});
stream.on('end', () => {
if (buff) {
const logLine = this.stringToLogLine(buff);
if (!logLine)
return;
results.push(logLine);
}
resolve(results);
});
});
}
async query() {
const retVal = [];
let results = await this.processLogFile(this.logFile);
if (this.options.order === 'desc') {
results = results.reverse();
}
retVal.push(...results);
return retVal;
}
}