Fix bugs from code review (state flow, idle timer, logger, kiosk, temp files)

This commit is contained in:
2026-05-31 20:10:23 +02:00
parent 58015340a2
commit a922ec29c4
5 changed files with 133 additions and 66 deletions
+41 -43
View File
@@ -2,22 +2,17 @@ import * as FileSystem from 'expo-file-system/legacy';
const logFileUri = FileSystem.documentDirectory + 'app_logs.txt';
export const logger = {
log: async (message: string) => {
// Queue to serialize file operations and prevent race conditions
let writeQueue = Promise.resolve();
const enqueueWrite = (logLine: string) => {
writeQueue = writeQueue.then(async () => {
try {
const timestamp = new Date().toISOString();
const logLine = `[INFO] ${timestamp}: ${message}\n`;
console.log(logLine.trim());
const fileInfo = await FileSystem.getInfoAsync(logFileUri);
if (!fileInfo.exists) {
await FileSystem.writeAsStringAsync(logFileUri, logLine, { encoding: FileSystem.EncodingType.UTF8 });
} else {
// Read existing and append (simplistic approach for small logs)
// expo-file-system doesn't have an append method out of the box in older versions,
// but wait, we can just read, then write. To avoid OOM we should truncate if too big.
const current = await FileSystem.readAsStringAsync(logFileUri, { encoding: FileSystem.EncodingType.UTF8 });
// Keep last 100000 chars
let newContent = current + logLine;
if (newContent.length > 100000) {
newContent = newContent.slice(-100000);
@@ -25,45 +20,45 @@ export const logger = {
await FileSystem.writeAsStringAsync(logFileUri, newContent, { encoding: FileSystem.EncodingType.UTF8 });
}
} catch (e) {
console.log('Failed to write log:', e);
console.warn('Failed to write to log file:', e);
// We catch here so the queue is not broken for subsequent logs
}
}).catch((e) => {
console.error('Queue error:', e);
});
return writeQueue;
};
export const logger = {
log: async (message: string) => {
const timestamp = new Date().toISOString();
const logLine = `[INFO] ${timestamp}: ${message}\n`;
console.log(logLine.trim());
return enqueueWrite(logLine);
},
error: async (message: string, error?: any) => {
try {
const timestamp = new Date().toISOString();
let errorString = '';
if (error) {
if (error instanceof Error) {
errorString = `\n Name: ${error.name}\n Message: ${error.message}\n Stack: ${error.stack}`;
} else if (typeof error === 'object') {
errorString = `\n Object: ${JSON.stringify(error)}`;
} else {
errorString = `\n Value: ${String(error)}`;
}
}
const logLine = `[ERROR] ${timestamp}: ${message}${errorString}\n`;
console.error(logLine.trim());
const fileInfo = await FileSystem.getInfoAsync(logFileUri);
if (!fileInfo.exists) {
await FileSystem.writeAsStringAsync(logFileUri, logLine, { encoding: FileSystem.EncodingType.UTF8 });
const timestamp = new Date().toISOString();
let errorString = '';
if (error) {
if (error instanceof Error) {
errorString = `\n Name: ${error.name}\n Message: ${error.message}\n Stack: ${error.stack}`;
} else if (typeof error === 'object') {
errorString = `\n Object: ${JSON.stringify(error)}`;
} else {
const current = await FileSystem.readAsStringAsync(logFileUri, { encoding: FileSystem.EncodingType.UTF8 });
let newContent = current + logLine;
if (newContent.length > 100000) {
newContent = newContent.slice(-100000);
}
await FileSystem.writeAsStringAsync(logFileUri, newContent, { encoding: FileSystem.EncodingType.UTF8 });
errorString = `\n Value: ${String(error)}`;
}
} catch (e) {
console.log('Failed to write error log:', e);
}
const logLine = `[ERROR] ${timestamp}: ${message}${errorString}\n`;
console.error(logLine.trim());
return enqueueWrite(logLine);
},
readLogs: async (): Promise<string> => {
try {
// Ensure we wait for pending writes before reading
await writeQueue;
const fileInfo = await FileSystem.getInfoAsync(logFileUri);
if (!fileInfo.exists) return 'Keine Logs vorhanden.';
return await FileSystem.readAsStringAsync(logFileUri, { encoding: FileSystem.EncodingType.UTF8 });
@@ -73,10 +68,13 @@ export const logger = {
},
clearLogs: async () => {
try {
await FileSystem.deleteAsync(logFileUri, { idempotent: true });
} catch (e) {
console.log('Failed to clear logs:', e);
}
writeQueue = writeQueue.then(async () => {
try {
await FileSystem.deleteAsync(logFileUri, { idempotent: true });
} catch (e) {
console.warn('Failed to clear logs:', e);
}
});
return writeQueue;
}
};