import { readFile } from "fs/promises"; import { CSVParser } from "../utils/csv_parser/csv_parser.js"; import { GamesLogError } from "./errors/games_log_error.js"; export type LogData = { eventType: string; eventPayload: { [key: string]: any }; }[]; export class GamesLogParser { async parseFile(filename: string, encoding: BufferEncoding = "utf-8") { let data; try { data = await readFile(filename, { encoding }); } catch (err) { throw new GamesLogError(`Unable to read log file: ${filename}`, { cause: err instanceof Error ? err : undefined, }); } return this.parse(data); } parse(data: string): LogData { const parser = new CSVParser({ headers: true }); const csvData = parser.parse(data); return csvData.map((row, rowNumber) => { if (!("event_type" in row)) { throw new GamesLogError(`Missing event type on row: ${rowNumber}`); } if (!("event_payload" in row)) { throw new GamesLogError(`Missing event payload on row: ${rowNumber}`); } let eventPayload; try { eventPayload = JSON.parse(row.event_payload); } catch (err) { throw new GamesLogError( "Unable to parse event payload on row: ${rowNumber}", { cause: err instanceof Error ? err : undefined, } ); } if (typeof eventPayload !== "object") { throw new GamesLogError("Invalid event payload on row: ${rowNumber}"); } return { eventType: row.event_type, eventPayload, }; }); } }