/** * 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; }}
/**
* 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;
}
}