Julius Marmingeback in a pretty good statefcc94b38 months agoHistory
66 lines · 1.7 KB · TypeScript
RawDownload
/** * Provider event NDJSON logger helper. * * Best-effort writer for observability logs. Failures are downgraded to warnings * so provider runtime behavior is unaffected. */import fs from "node:fs";import path from "node:path"; import { createLogger } from "../../logger.ts"; const logger = createLogger("provider-observability"); export interface EventNdjsonLogger {  readonly filePath: string;  write: (record: unknown) => void;  close: () => void;} function stringifyRecord(record: unknown): string | undefined {  try {    return JSON.stringify(record);  } catch (error) {    logger.warn("failed to serialize provider event log record", { error });    return undefined;  }} export function makeEventNdjsonLogger(filePath: string): EventNdjsonLogger | undefined {  try {    fs.mkdirSync(path.dirname(filePath), { recursive: true });    fs.appendFileSync(filePath, "", { encoding: "utf8", flag: "a" });  } catch (error) {    logger.warn("failed to create provider event log directory", { filePath, error });    return undefined;  }   try {    let broken = false;     return {      filePath,      write(record: unknown) {        if (broken) {          return;        }        const serialized = stringifyRecord(record);        if (!serialized) {          return;        }        try {          fs.appendFileSync(filePath, `${serialized}\n`, { encoding: "utf8", flag: "a" });        } catch (error) {          broken = true;          logger.warn("provider event log write failed", { filePath, error });        }      },      close() {        // no-op for sync append logger      },    };  } catch (error) {    logger.warn("failed to create provider event log file", { filePath, error });    return undefined;  }}