UNPKG

pw-stick-output

Version:

TypeScript utility for managing PipeWire audio node connections and routing with systemd integration

89 lines 2.59 kB
import notify from 'sd-notify'; import Journald from 'systemd-journald'; import { toSnakeCase } from './log.helper.js'; export const levelMap = { // level 0 – debug debug: 0, trace: 0, info: 1, information: 1, notice: 2, warning: 3, warn: 3, error: 4, err: 4, crit: 5, critical: 5, fatal: 5, }; export const levelNames = { 0: 'DEBUG', 1: 'INFO', 2: 'NOTICE', 3: 'WARNING', 4: 'ERROR', 5: 'CRIT', }; const journal = new Journald({ syslog_identifier: process.env.SYSLOG_IDENTIFIER || 'pw-stick-output' }); export let logLevel = (() => { let logLevel = process.env.SYSLOG_LEVEL?.toString().toLowerCase() || ''; let n = +process.env.SYSLOG_LEVEL; n = logLevel in levelMap ? levelMap[logLevel] : Number.isNaN(n) ? 2 : n; return Math.max(0, Math.min(5, n)); })(); export function log(someToLog, level = 0, hrtime = undefined) { level = Math.max(0, Math.min(5, level)); let msg = {}; if (level < logLevel) return; if (typeof someToLog === 'string') { msg.msg = someToLog; } if (someToLog instanceof Error) { msg.error = someToLog; } if (!hrtime) { hrtime = process.hrtime(); } let extraFieldsRaw = (hrtime ? { time_seconds: hrtime[0], time_nanoseconds: hrtime[1] } : {}); // omit & sort keys if (!(someToLog instanceof Error) && typeof someToLog === 'object') { Object.keys(someToLog) .sort() .forEach((key) => { if (['msg', 'error'].includes(key)) { return; } const val = someToLog[key]; if (typeof val === 'undefined' || val === null) { return; } extraFieldsRaw[toSnakeCase(key)] = val; }); } let extraFields; extraFields = extraFieldsRaw; const message = msg.error || msg.msg || '<?>'; if (level === 0) { journal.debug(message, extraFields); } else if (level === 1) { journal.info(message, extraFields); } else if (level === 2) { journal.notice(message, extraFields); } else if (level === 3) { journal.warning(message, extraFields); } else if (level === 4) { journal.err(message, extraFields); } else if (level === 5) { journal.crit(message, extraFields); } const statusLabel = levelNames[level]; notify.sendStatus(`${statusLabel}: ${message}`); } log({ msg: `SYSLOG_LEVEL=${logLevel}`, extraArray: [0] }, 0, process.hrtime()); //# sourceMappingURL=log.js.map