Fix 8 critical/high resilience issues across camera, preview, logger, settings, and admin
This commit is contained in:
+23
-12
@@ -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 = {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user