Add typed event logging and restructure server #11
|
|
@ -18,15 +18,15 @@ export type LogEvent =
|
|||
| { type: "discord-ready" }
|
||||
| { type: "error"; error: unknown; context?: string }
|
||||
|
||||
export type StoredLogEvent = LogEvent & { ts: string; sha: string }
|
||||
export type StoredLogEvent = LogEvent & { ts: string }
|
||||
|
||||
type Listener = (event: StoredLogEvent) => void
|
||||
const listeners: Listener[] = []
|
||||
|
||||
const sha = process.env.RENDER_GIT_COMMIT?.slice(0, 7) || "dev"
|
||||
const releaseSha = process.env.RENDER_GIT_COMMIT?.slice(0, 7) || "dev"
|
||||
|
||||
export function log(event: LogEvent) {
|
||||
const stored = { ...event, ts: new Date().toISOString(), sha } as StoredLogEvent
|
||||
const stored = { ...event, ts: new Date().toISOString() } as StoredLogEvent
|
||||
for (const listener of listeners) {
|
||||
listener(stored)
|
||||
}
|
||||
|
|
@ -47,7 +47,7 @@ mkdirSync(logsDir, { recursive: true })
|
|||
|
||||
function createLogFile(): string {
|
||||
const timestamp = new Date().toISOString().replace(/[:.]/g, "-")
|
||||
return `${logsDir}/${sha}_${timestamp}.jsonl`
|
||||
return `${logsDir}/${releaseSha}_${timestamp}.jsonl`
|
||||
}
|
||||
|
||||
export function listLogFiles(): string[] {
|
||||
|
|
@ -55,9 +55,11 @@ export function listLogFiles(): string[] {
|
|||
.filter((f) => f.endsWith(".jsonl"))
|
||||
.sort()
|
||||
.reverse()
|
||||
.slice(0, 20)
|
||||
}
|
||||
|
||||
export function readLogFile(filename: string): StoredLogEvent[] {
|
||||
// Reject path traversal attempts (e.g. "../../../etc/passwd")
|
||||
if (filename !== basename(filename)) return []
|
||||
const path = `${logsDir}/${filename}`
|
||||
try {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user