diff --git a/electron/api/logger.ts b/electron/api/logger.ts deleted file mode 100644 index 7107ecb..0000000 --- a/electron/api/logger.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { app, ipcMain, shell } from "electron"; -import { logInfo, logError, LogModule } from "../utils/log"; - -const fs = require("fs"); -const path = require("path"); -export const initLoggerApi = () => { - const logPath = path.join(app.getPath("userData"), "frpc.log"); - - const readLogger = (callback: (content: string) => void) => { - fs.readFile(logPath, "utf-8", (error, data) => { - if (!error) { - logInfo(LogModule.APP, "Log file read successfully."); - callback(data); - } else { - logError(LogModule.APP, `Error reading log file: ${error.message}`); - } - }); - }; - - ipcMain.on("logger.getLog", async (event, args) => { - logInfo(LogModule.APP, "Received request to get log."); - readLogger(content => { - event.reply("Logger.getLog.hook", content); - logInfo(LogModule.APP, "Log data sent to client."); - }); - }); - - ipcMain.on("logger.update", (event, args) => { - logInfo(LogModule.APP, "Watching log file for changes."); - fs.watch(logPath, (eventType, filename) => { - if (eventType === "change") { - logInfo(LogModule.APP, "Log file changed, reading new content."); - readLogger(content => { - event.reply("Logger.update.hook", content); - logInfo(LogModule.APP, "Updated log data sent to client."); - }); - } - }); - }); - - ipcMain.on("logger.openLog", (event, args) => { - logInfo(LogModule.APP, "Attempting to open log file."); - shell.openPath(logPath).then((errorMessage) => { - if (errorMessage) { - logError(LogModule.APP, `Failed to open Logger: ${errorMessage}`); - event.reply("Logger.openLog.hook", false); - } else { - logInfo(LogModule.APP, "Logger opened successfully."); - event.reply("Logger.openLog.hook", true); - } - }); - }); -}; diff --git a/electron/controller/BaseController.ts b/electron/controller/BaseController.ts new file mode 100644 index 0000000..81df41c --- /dev/null +++ b/electron/controller/BaseController.ts @@ -0,0 +1,21 @@ +class BaseController { + // success(data: any, message?: string) { + // const resp: ApiResponse = { + // success: true, + // data: data, + // message: message || "successful." + // }; + // return resp; + // } + // + // fail(message?: string) { + // const resp: ApiResponse = { + // success: false, + // data: null, + // message: message || "internal error." + // }; + // return resp; + // } +} + +export default BaseController; diff --git a/electron/controller/LaunchController.ts b/electron/controller/LaunchController.ts new file mode 100644 index 0000000..912dd0b --- /dev/null +++ b/electron/controller/LaunchController.ts @@ -0,0 +1,5 @@ +import BaseController from "./BaseController"; + +class LaunchController extends BaseController { + +} diff --git a/electron/controller/LogController.ts b/electron/controller/LogController.ts new file mode 100644 index 0000000..3bc00a2 --- /dev/null +++ b/electron/controller/LogController.ts @@ -0,0 +1,39 @@ +import BaseController from "./BaseController"; +import LogService from "../service/LogService"; +import { fail, success } from "../utils/response"; + +class LogController extends BaseController { + private readonly _logService: LogService; + + constructor(logService: LogService) { + super(); + this._logService = logService; + console.log("logService2", this._logService); + } + + getFrpLogContent(req: ControllerRequest) { + console.log("logService3", this._logService); + this._logService.getFrpLogContent().then(data => { + req.event.reply(req.reply, success(data)); + }); + } + + // watchFrpcLogContent(req: ControllerRequest) { + // this._logService.watchFrpcLog().then(data => { + // console.log('reply watch', data); + // req.event.reply(req.reply, this.success(data)); + // }); + // } + + openFrpcLogFile(req: ControllerRequest) { + this._logService.openFrpcLogFile().then(data => { + if (data) { + success(null); + } else { + fail(); + } + }); + } +} + +export default LogController; diff --git a/electron/controller/ProxyController.ts b/electron/controller/ProxyController.ts new file mode 100644 index 0000000..194d6dd --- /dev/null +++ b/electron/controller/ProxyController.ts @@ -0,0 +1,7 @@ +import BaseController from "./BaseController"; + +class ProxyController extends BaseController { + constructor() { + super(); + } +} diff --git a/electron/controller/ServerController.ts b/electron/controller/ServerController.ts new file mode 100644 index 0000000..fef922c --- /dev/null +++ b/electron/controller/ServerController.ts @@ -0,0 +1,18 @@ +import BaseController from "./BaseController"; +import ServerService from "../service/ServerService"; +import IpcMainEvent = Electron.IpcMainEvent; + +class ServerController extends BaseController { + serverService: ServerService; + + constructor(serverService: ServerService) { + super(); + this.serverService = serverService; + } + + saveConfig(event: IpcMainEvent, ...args: any[]) { + console.log("test", args); + } +} + +export default ServerController; diff --git a/electron/core/IpcRouter.ts b/electron/core/IpcRouter.ts new file mode 100644 index 0000000..d824fd4 --- /dev/null +++ b/electron/core/IpcRouter.ts @@ -0,0 +1,75 @@ +import ServerController from "../controller/ServerController"; +import ServerDao from "../dao/ServerDao"; +import ServerService from "../service/ServerService"; +import LogService from "../service/LogService"; +import { BrowserWindow, ipcMain } from "electron"; +import LogController from "../controller/LogController"; +import FileService from "../service/FileService"; + +type IpcRouter = { + path: string; + reply: string; + controller: any; + instance: any; +}; + +class IpcRouterConfigurate { + ipcRouters: Array; + private readonly _win: BrowserWindow; + + constructor(win: BrowserWindow) { + this._win = win; + const serverDao = new ServerDao(); + const fileService = new FileService(); + const serverService = new ServerService(serverDao); + const logService = new LogService(fileService); + const serverController = new ServerController(serverService); + const logController = new LogController(logService); + + logService.watchFrpcLog(win); + + this.ipcRouters = [ + { + path: "server/test", + reply: "server/test.hook", + controller: serverController.saveConfig, + instance: serverController + }, + { + path: "log/getFrpLogContent", + reply: "log/getFrpLogContent.hook", + controller: logController.getFrpLogContent, + instance: logController + }, + // { + // path: "log/watchFrpcLogContent", + // reply: "log/watchFrpcLogContent.hook", + // controller: logController.watchFrpcLogContent, + // instance: logController + // }, + { + path: "log/openFrpcLogFile", + reply: "log/openFrpcLogFile.hook", + controller: logController.openFrpcLogFile, + instance: logController + } + ]; + } + + init() { + this.ipcRouters.forEach(router => { + ipcMain.on(router.path, (event, args) => { + const req: ControllerRequest = { + win: this._win, + reply: router.reply, + event: event, + args: args + }; + router.controller.call(router.instance, req); + }); + }); + console.log("ipcRouter init success."); + } +} + +export default IpcRouterConfigurate; diff --git a/electron/dao/BaseDao.ts b/electron/dao/BaseDao.ts new file mode 100644 index 0000000..a4aedf6 --- /dev/null +++ b/electron/dao/BaseDao.ts @@ -0,0 +1,48 @@ +import Datastore from "nedb"; +import path from "path"; +import { app } from "electron"; + +interface BaseDaoInterface { + db: Datastore; + + insert(t: T): Promise; + + updateById(t: T): T; + + deleteById(id: string): void; + + findAll(): T[]; +} + +class BaseDao implements BaseDaoInterface { + db: Datastore; + + constructor(dbName: string) { + const dbFilename = path.join(app.getPath("userData"), `${dbName}-v2.db`); + this.db = new Datastore({ + autoload: true, + filename: dbFilename + }); + // todo log + } + + async insert(t: T): Promise { + return new Promise((resolve, reject) => { + resolve(t); + }); + } + + updateById(t: T): T { + return null; + } + + deleteById(id: string): void { + return null; + } + + findAll(): T[] { + return null; + } +} + +export default BaseDao; diff --git a/electron/dao/ServerDao.ts b/electron/dao/ServerDao.ts new file mode 100644 index 0000000..75edb0c --- /dev/null +++ b/electron/dao/ServerDao.ts @@ -0,0 +1,9 @@ +import BaseDao from "./BaseDao"; + +class ServerDao extends BaseDao { + constructor() { + super("config"); + } +} + +export default ServerDao \ No newline at end of file diff --git a/electron/electron-env.d.ts b/electron/electron-env.d.ts deleted file mode 100644 index b4c4211..0000000 --- a/electron/electron-env.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/// - -declare namespace NodeJS { - interface ProcessEnv { - VSCODE_DEBUG?: 'true' - DIST_ELECTRON: string - DIST: string - /** /dist/ or /public/ */ - VITE_PUBLIC: string - } -} diff --git a/electron/main/index.ts b/electron/main/index.ts index a6f3418..cf901bd 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -18,13 +18,13 @@ import { startFrpWorkerProcess, stopFrpcProcess } from "../api/frpc"; -import { initLoggerApi } from "../api/logger"; import { initFileApi } from "../api/file"; import { getConfig } from "../storage/config"; import { initCommonApi } from "../api/common"; import { initLocalApi } from "../api/local"; import { initLog, logError, logInfo, LogModule } from "../utils/log"; import { maskSensitiveData } from "../utils/desensitize"; +import IpcRouterConfigurate from "../core/IpcRouter"; process.env.DIST_ELECTRON = join(__dirname, ".."); process.env.DIST = join(process.env.DIST_ELECTRON, "../dist"); @@ -192,6 +192,8 @@ app.whenReady().then(() => { startFrpWorkerProcess(config); } } + const ipcRouterConfig = new IpcRouterConfigurate(win); + ipcRouterConfig.init(); // Initialize APIs try { initGitHubApi(win); @@ -206,8 +208,7 @@ app.whenReady().then(() => { initFrpcApi(); logInfo(LogModule.APP, `FRPC API initialized.`); - initLoggerApi(); - logInfo(LogModule.APP, `Logger API initialized.`); + // logInfo(LogModule.APP, `Logger API initialized.`); initFileApi(); logInfo(LogModule.APP, `File API initialized.`); diff --git a/electron/service/BaseService.ts b/electron/service/BaseService.ts new file mode 100644 index 0000000..d8da7f5 --- /dev/null +++ b/electron/service/BaseService.ts @@ -0,0 +1,15 @@ +import BaseDao from "../dao/BaseDao"; + +interface BaseServiceInterface { + dao: BaseDao; +} + +class BaseService implements BaseServiceInterface { + dao: BaseDao; + + constructor(dao: BaseDao) { + this.dao = dao; + } +} + +export default BaseService; diff --git a/electron/service/FileService.ts b/electron/service/FileService.ts new file mode 100644 index 0000000..d57b386 --- /dev/null +++ b/electron/service/FileService.ts @@ -0,0 +1,24 @@ +import { shell } from "electron"; + +class FileService { + constructor() {} + + openFile(filePath: string) { + return new Promise((resolve, reject) => { + shell + .openPath(filePath) + .then(errorMessage => { + if (errorMessage) { + resolve(false); + } else { + resolve(true); + } + }) + .catch(err => { + reject(err); + }); + }); + } +} + +export default FileService; diff --git a/electron/service/LogService.ts b/electron/service/LogService.ts new file mode 100644 index 0000000..c9e6f87 --- /dev/null +++ b/electron/service/LogService.ts @@ -0,0 +1,59 @@ +import fs from "fs"; +import path from "path"; +import { app, BrowserWindow } from "electron"; +import FileService from "./FileService"; +import { success } from "../utils/response"; + +class LogService { + private readonly _fileService: FileService; + private readonly _logPath: string = path.join( + app.getPath("userData"), + "frpc.log" + ); + + constructor(fileService: FileService) { + this._fileService = fileService; + } + + getFrpLogContent(): Promise { + return new Promise((resolve, reject) => { + fs.readFile(this._logPath, "utf-8", (error, data) => { + if (!error) { + resolve(data); + } else { + reject(error); + } + }); + }); + } + + watchFrpcLog(win: BrowserWindow) { + fs.watch(this._logPath, (eventType, filename) => { + if (eventType === "change") { + win.webContents.send( + "log/watchFrpcLogContent.hook", + success(true) + ) + } else { + } + }); + // return new Promise((resolve, reject) => { + // + // }); + } + + openFrpcLogFile(): Promise { + return new Promise((resolve, reject) => { + this._fileService + .openFile(this._logPath) + .then(result => { + resolve(result); + }) + .catch(err => { + reject(err); + }); + }); + } +} + +export default LogService; diff --git a/electron/service/ServerService.ts b/electron/service/ServerService.ts new file mode 100644 index 0000000..ee41bfa --- /dev/null +++ b/electron/service/ServerService.ts @@ -0,0 +1,12 @@ +import BaseService from "./BaseService"; +import ServerDao from "../dao/ServerDao"; + +class ServerService extends BaseService { + constructor(serverDao: ServerDao) { + super(serverDao); + } + + saveServerConfig(frpcServer: FrpcDesktopServer) {} +} + +export default ServerService; diff --git a/electron/utils/response.ts b/electron/utils/response.ts new file mode 100644 index 0000000..3165da5 --- /dev/null +++ b/electron/utils/response.ts @@ -0,0 +1,17 @@ +export function success(data: any, message?: string) { + const resp: ApiResponse = { + success: true, + data: data, + message: message || "successful." + }; + return resp; +} + +export function fail(message?: string) { + const resp: ApiResponse = { + success: false, + data: null, + message: message || "internal error." + }; + return resp; +} diff --git a/src/views/logger/index.vue b/src/views/logger/index.vue index bff0617..1b5be73 100644 --- a/src/views/logger/index.vue +++ b/src/views/logger/index.vue @@ -1,9 +1,9 @@