From 13bd7fa83bf437b32b34a6b446c61ba39f33ea04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E4=B8=80=E4=BA=8C?= Date: Sun, 2 Jan 2022 23:33:43 +0800 Subject: [PATCH] fix: fix json while it errors --- src/helpers/configSetting.ts | 26 +++++++++++++++----------- src/services/workspaces/index.ts | 20 ++++++++++++++++++-- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/helpers/configSetting.ts b/src/helpers/configSetting.ts index 867326ea..186bf81b 100644 --- a/src/helpers/configSetting.ts +++ b/src/helpers/configSetting.ts @@ -4,6 +4,20 @@ import { parse as bestEffortJsonParser } from 'best-effort-json-parser'; import { SETTINGS_FOLDER } from '@/constants/appPaths'; import { logger } from '@services/libs/log'; +export function fixSettingFileWhenError(jsonError: Error): void { + logger.error('Setting file format bad: ' + jsonError.message); + const jsonContent = fs.readFileSync(settings.file(), 'utf-8'); + logger.info('Try to fix JSON content.'); + try { + const repaired = bestEffortJsonParser(jsonContent) as Record; + logger.info('Fix JSON content done, writing it.'); + fs.writeJSONSync(settings.file(), repaired); + logger.info('Fix JSON content done, saved', { repaired }); + } catch (fixJSONError) { + logger.error('Setting file format bad, and cannot be fixed: ' + (fixJSONError as Error).message, { jsonContent }); + } +} + settings.configure({ dir: SETTINGS_FOLDER, atomicSave: process.platform !== 'win32', @@ -15,16 +29,6 @@ if (fs.existsSync(settings.file())) { fs.readJsonSync(settings.file()); logger.info('Setting file format good.'); } catch (jsonError) { - logger.error('Setting file format bad: ' + (jsonError as Error).message); - const jsonContent = fs.readFileSync(settings.file(), 'utf-8'); - logger.info('Try to fix JSON content.'); - try { - const repaired = bestEffortJsonParser(jsonContent) as Record; - logger.info('Fix JSON content done, writing it.'); - fs.writeJSONSync(settings.file(), repaired); - logger.info('Fix JSON content done, saved', { repaired }); - } catch (fixJSONError) { - logger.error('Setting file format bad, and cannot be fixed: ' + (fixJSONError as Error).message, { jsonContent }); - } + fixSettingFileWhenError(jsonError as Error); } } diff --git a/src/services/workspaces/index.ts b/src/services/workspaces/index.ts index 2844acf7..584eeb28 100644 --- a/src/services/workspaces/index.ts +++ b/src/services/workspaces/index.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/require-await */ /* eslint-disable unicorn/no-null */ import { injectable } from 'inversify'; @@ -26,9 +27,18 @@ import i18n from '@services/libs/i18n'; import { defaultServerIP } from '@/constants/urls'; import { logger } from '@services/libs/log'; import { workspaceSorter } from './utils'; +import { fixSettingFileWhenError } from '@/helpers/configSetting'; // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -const debouncedSetSettingFile = debounce(async (workspaces: Record) => await settings.set(`workspaces`, workspaces as any), 500); +const debouncedSetSettingFile = debounce(async (workspaces: Record) => { + try { + await settings.set(`workspaces`, workspaces as any); + } catch (error) { + logger.error('Setting file format bad in debouncedSetSettingFile, will try again', { workspaces }); + fixSettingFileWhenError(error as Error); + await settings.set(`workspaces`, workspaces as any); + } +}, 500); @injectable() export class Workspace implements IWorkspaceService { @@ -212,7 +222,13 @@ export class Workspace implements IWorkspaceService { this.workspaces[id] = this.sanitizeWorkspace(workspace); await this.reactBeforeWorkspaceChanged(workspace); if (immediate === true) { - await settings.set(`workspaces.${id}`, { ...workspace }); + try { + await settings.set(`workspaces.${id}`, { ...workspace }); + } catch (error) { + logger.error('Setting file format bad in public async set, will try again', { workspace }); + fixSettingFileWhenError(error as Error); + await settings.set(`workspaces.${id}`, { ...workspace }); + } } else { void debouncedSetSettingFile(this.workspaces); }