Skip to content

Commit 0fb8ead

Browse files
committed
fix(12-04): add try-catch to JSON.parse in FilePersistenceAdapter
- Wrap all 3 JSON.parse calls in try-catch blocks - Add descriptive error messages for corrupted files - Gracefully handle backup file parse failures (continue to next) - Prevents crashes on corrupted cache/metadata files
1 parent 6804c52 commit 0fb8ead

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

src/infrastructure/persistence/FilePersistenceAdapter.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,14 @@ export class FilePersistenceAdapter {
5757
}
5858

5959
const data = await this.readFile(this.metadataFile);
60-
const metadata = JSON.parse(data) as SyncMetadata[];
60+
let metadata: SyncMetadata[];
61+
try {
62+
metadata = JSON.parse(data) as SyncMetadata[];
63+
} catch (parseError) {
64+
const message = parseError instanceof Error ? parseError.message : String(parseError);
65+
this.logger.error(`Failed to parse metadata JSON: ${message}`);
66+
throw new Error(`Corrupted metadata file: ${message}`);
67+
}
6168

6269
this.logger.info(`Loaded ${metadata.length} metadata entries from persistence`);
6370
return metadata;
@@ -321,7 +328,12 @@ export class FilePersistenceAdapter {
321328
}
322329

323330
const data = await this.readFile(this.metadataFile);
324-
return JSON.parse(data) as SyncMetadata[];
331+
try {
332+
return JSON.parse(data) as SyncMetadata[];
333+
} catch (parseError) {
334+
const message = parseError instanceof Error ? parseError.message : String(parseError);
335+
throw new Error(`Failed to parse metadata file: ${message}`);
336+
}
325337
}
326338

327339
/**
@@ -358,7 +370,14 @@ export class FilePersistenceAdapter {
358370
try {
359371
const backupPath = path.join(this.options.cacheDirectory, backupFile);
360372
const data = await this.readFile(backupPath);
361-
const metadata = JSON.parse(data) as SyncMetadata[];
373+
let metadata: SyncMetadata[];
374+
try {
375+
metadata = JSON.parse(data) as SyncMetadata[];
376+
} catch (parseError) {
377+
const message = parseError instanceof Error ? parseError.message : String(parseError);
378+
this.logger.warn(`Failed to parse backup ${backupFile}: ${message}`);
379+
continue; // Try next backup
380+
}
362381

363382
this.logger.info(`Recovered ${metadata.length} metadata entries from backup: ${backupFile}`);
364383
return metadata;

0 commit comments

Comments
 (0)