Files
bare-operating-system/packages/bare-os-booter/lib/bare-initd-journal.js
T
2026-04-04 00:01:11 -04:00

59 lines
1.4 KiB
JavaScript

/**
* In-memory structured initd journal (NDJSON lines) exposed under /run/bare-os/unit-journal/.
*/
const MAX_LINES_PER_UNIT = 400
const MAX_LINE_UTF8 = 4096
/** @type {Map<string, string[]>} */
const linesByUnit = new Map()
function journalMaxLinesPerUnit() {
const raw = globalThis.process?.env?.BARE_OS_INITD_JOURNAL_MAX_LINES
if (raw == null || raw === '') return MAX_LINES_PER_UNIT
const n = Number.parseInt(String(raw), 10)
return Number.isFinite(n) && n > 10 ? Math.min(n, 20000) : MAX_LINES_PER_UNIT
}
/**
* @param {string} unit
* @param {Record<string, unknown>} rec
*/
export function appendBareInitdJournal(unit, rec) {
if (!unit || !/^[a-zA-Z0-9._-]+$/.test(unit)) return
const payload = { ts: Date.now(), unit, ...rec }
let line
try {
line = JSON.stringify(payload) + '\n'
} catch {
return
}
if (line.length > MAX_LINE_UTF8) return
let arr = linesByUnit.get(unit)
if (!arr) {
arr = []
linesByUnit.set(unit, arr)
}
arr.push(line)
const cap = journalMaxLinesPerUnit()
while (arr.length > cap) arr.shift()
}
/**
* @param {string} unit
* @returns {string}
*/
export function getBareInitdJournalNdjson(unit) {
const arr = linesByUnit.get(unit)
return arr ? arr.join('') : ''
}
/** @returns {string[]} */
export function listBareInitdJournalUnits() {
return [...linesByUnit.keys()].sort()
}
export function clearBareInitdJournalForTests() {
linesByUnit.clear()
}