From 70a8d03c9b60ae1849a0db8534d7eb69a75eb603 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 30 Nov 2023 11:19:17 +0700 Subject: [PATCH] fix: messages sync is not threadsafe (#784) --- electron/handlers/fs.ts | 84 ++++++++++++++----------------------- electron/package.json | 3 +- web/services/coreService.ts | 8 +--- 3 files changed, 34 insertions(+), 61 deletions(-) diff --git a/electron/handlers/fs.ts b/electron/handlers/fs.ts index 6ed67b2de..3e15266ad 100644 --- a/electron/handlers/fs.ts +++ b/electron/handlers/fs.ts @@ -60,15 +60,11 @@ export function handleFsIPCs() { ipcMain.handle( 'writeFile', async (event, path: string, data: string): Promise => { - return new Promise((resolve, reject) => { - fs.writeFile(join(userSpacePath, path), data, 'utf8', (err) => { - if (err) { - reject(err) - } else { - resolve() - } - }) - }) + try { + await fs.writeFileSync(join(userSpacePath, path), data, 'utf8') + } catch (err) { + console.error(`writeFile ${path} result: ${err}`) + } } ) @@ -79,15 +75,11 @@ export function handleFsIPCs() { * @returns A promise that resolves when the directory has been created. */ ipcMain.handle('mkdir', async (event, path: string): Promise => { - return new Promise((resolve, reject) => { - fs.mkdir(join(userSpacePath, path), { recursive: true }, (err) => { - if (err) { - reject(err) - } else { - resolve() - } - }) - }) + try { + fs.mkdirSync(join(userSpacePath, path), { recursive: true }) + } catch (err) { + console.error(`mkdir ${path} result: ${err}`) + } }) /** @@ -97,15 +89,11 @@ export function handleFsIPCs() { * @returns A promise that resolves when the directory is removed successfully. */ ipcMain.handle('rmdir', async (event, path: string): Promise => { - return new Promise((resolve, reject) => { - fs.rm(join(userSpacePath, path), { recursive: true }, (err) => { - if (err) { - reject(err) - } else { - resolve() - } - }) - }) + try { + await fs.rmSync(join(userSpacePath, path), { recursive: true }) + } catch (err) { + console.error(`rmdir ${path} result: ${err}`) + } }) /** @@ -136,23 +124,11 @@ export function handleFsIPCs() { * @returns A string indicating the result of the operation. */ ipcMain.handle('deleteFile', async (_event, filePath) => { - const fullPath = join(userSpacePath, filePath) - - let result = 'NULL' - fs.unlink(fullPath, function (err) { - if (err && err.code == 'ENOENT') { - result = `File not exist: ${err}` - } else if (err) { - result = `File delete error: ${err}` - } else { - result = 'File deleted successfully' - } - console.debug( - `Delete file ${filePath} from ${fullPath} result: ${result}` - ) - }) - - return result + try { + await fs.unlinkSync(join(userSpacePath, filePath)) + } catch (err) { + console.error(`unlink ${filePath} result: ${err}`) + } }) /** @@ -163,17 +139,19 @@ export function handleFsIPCs() { * @returns A promise that resolves when the file has been written. */ ipcMain.handle('appendFile', async (_event, path: string, data: string) => { - return new Promise((resolve, reject) => { - fs.appendFile(join(userSpacePath, path), data, 'utf8', (err) => { - if (err) { - reject(err) - } else { - resolve(data) - } - }) - }) + try { + await fs.appendFileSync(join(userSpacePath, path), data, 'utf8') + } catch (err) { + console.error(`appendFile ${path} result: ${err}`) + } }) + /** + * Reads a file line by line. + * @param event - The event object. + * @param path - The path of the file to read. + * @returns A promise that resolves with the contents of the file. + */ ipcMain.handle('readLineByLine', async (_event, path: string) => { const fullPath = join(userSpacePath, path) diff --git a/electron/package.json b/electron/package.json index 0eed33b2e..e791347e5 100644 --- a/electron/package.json +++ b/electron/package.json @@ -13,8 +13,7 @@ "renderer/**/*", "build/*.{js,map}", "build/**/*.{js,map}", - "core/pre-install", - "core/plugin-manager/facade" + "core/pre-install" ], "asarUnpack": [ "core/pre-install" diff --git a/web/services/coreService.ts b/web/services/coreService.ts index cbe84640d..66f4b72d6 100644 --- a/web/services/coreService.ts +++ b/web/services/coreService.ts @@ -1,4 +1,4 @@ -import * as cn from './cloudNativeService' +import * as restAPI from './cloudNativeService' import { EventEmitter } from './eventsService' export const setupCoreServices = () => { if (typeof window === 'undefined') { @@ -13,11 +13,7 @@ export const setupCoreServices = () => { } window.coreAPI = {} window.coreAPI = window.electronAPI ?? { - invokePluginFunc: cn.invokePluginFunc, - downloadFile: cn.downloadFile, - deleteFile: cn.deleteFile, - appVersion: cn.appVersion, - openExternalUrl: cn.openExternalUrl, + ...restAPI, } } }