Fix 8 critical/high resilience issues across camera, preview, logger, settings, and admin

This commit is contained in:
2026-06-01 10:14:29 +02:00
parent e069fef170
commit 2ddd74468e
6 changed files with 39 additions and 18 deletions
+23 -12
View File
@@ -3,15 +3,23 @@ import * as FileSystem from 'expo-file-system/legacy';
const logFileUri = FileSystem.documentDirectory + 'app_logs.txt';
// Queue to serialize file operations and prevent race conditions
let writeQueue = Promise.resolve();
const logQueue: string[] = [];
let isWriting = false;
const enqueueWrite = (logLine: string) => {
writeQueue = writeQueue.then(async () => {
const processLogQueue = async () => {
if (isWriting) return;
isWriting = true;
while (logQueue.length > 0) {
const logLine = logQueue.shift();
if (!logLine) continue;
try {
const fileInfo = await FileSystem.getInfoAsync(logFileUri);
if (!fileInfo.exists) {
await FileSystem.writeAsStringAsync(logFileUri, logLine, { encoding: FileSystem.EncodingType.UTF8 });
} else {
if (logFileUri) {
const fileInfo = await FileSystem.getInfoAsync(logFileUri);
if (!fileInfo.exists) {
await FileSystem.writeAsStringAsync(logFileUri, '', { encoding: FileSystem.EncodingType.UTF8 });
}
const current = await FileSystem.readAsStringAsync(logFileUri, { encoding: FileSystem.EncodingType.UTF8 });
let newContent = current + logLine;
if (newContent.length > 100000) {
@@ -21,12 +29,15 @@ const enqueueWrite = (logLine: string) => {
}
} catch (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;
}
isWriting = false;
};
const enqueueWrite = async (logLine: string) => {
logQueue.push(logLine);
processLogQueue(); // Intentionally unawaited to run in background
};
export const logger = {
+1 -1
View File
@@ -61,7 +61,7 @@ export async function loadSettings(): Promise<AppSettings> {
export async function saveSettings(settings: AppSettings): Promise<void> {
try {
const content = JSON.stringify(settings, null, 2);
await FileSystem.writeAsStringAsync(settingsFile.uri, content);
await settingsFile.write(content);
console.log('Settings saved successfully:', content);
} catch (e) {
console.error('Failed to save settings:', e);