diff --git a/src/login-cache.ts b/src/login-cache.ts index 1c00cb2..bec8c1d 100644 --- a/src/login-cache.ts +++ b/src/login-cache.ts @@ -38,9 +38,13 @@ type CacheLogin = { export type CacheStore = { name: string; + /** + * 缓存数据 + * @important 需要先调用init + */ cacheData: CacheLogin; /** - * 实际操作的cache + * 实际操作的cache, 需要先调用init */ cache: T; diff --git a/src/login-node-cache.ts b/src/login-node-cache.ts index 11bff14..6554bda 100644 --- a/src/login-node-cache.ts +++ b/src/login-node-cache.ts @@ -1,15 +1,21 @@ -import { Cache, LoginCacheStore, LoginCacheStoreOpts } from './login-cache.ts'; +import { Cache } from './login-cache.ts'; import { homedir } from 'node:os'; import { join, dirname } from 'node:path'; import fs from 'node:fs'; import { readFileSync, writeFileSync, accessSync } from 'node:fs'; import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; -export const fileExists = async (filePath: string, createIfNotExists = false) => { +export const fileExists = async ( + filePath: string, + { createIfNotExists = true, isFile = true, isDir = false }: { createIfNotExists?: boolean; isFile?: boolean; isDir?: boolean } = {}, +) => { try { accessSync(filePath, fs.constants.F_OK); return true; } catch (error) { - if (createIfNotExists) { + if (createIfNotExists && isDir) { + await mkdir(filePath, { recursive: true }); + return true; + } else if (createIfNotExists && isFile) { await mkdir(dirname(filePath), { recursive: true }); return false; } @@ -25,6 +31,9 @@ export const readConfigFile = (filePath: string) => { return {}; } }; +export const writeConfigFile = (filePath: string, data: any) => { + writeFileSync(filePath, JSON.stringify(data, null, 2)); +}; export const getHostName = () => { const configDir = join(homedir(), '.config', 'envision'); const configFile = join(configDir, 'config.json'); @@ -41,14 +50,13 @@ export class StorageNode implements Storage { const configDir = join(homedir(), '.config', 'envision'); const hostname = getHostName(); this.filePath = join(configDir, 'config', `${hostname}-storage.json`); - fileExists(this.filePath, true); + fileExists(this.filePath, { isFile: true }); } async loadCache() { const filePath = this.filePath; try { - const data = await readFile(filePath, 'utf-8'); - const jsonData = JSON.parse(data); - this.cacheData = jsonData; + const data = await readConfigFile(filePath); + this.cacheData = data; } catch (error) { this.cacheData = {}; await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); @@ -81,24 +89,23 @@ export class LoginNodeCache implements Cache { constructor(filepath?: string) { this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); - fileExists(this.filepath, true); + fileExists(this.filepath, { isFile: true }); } async get(_key: string) { - const data = readFileSync(this.filepath, 'utf-8'); try { - const jsonData = JSON.parse(data); - return jsonData; + const filePath = this.filepath; + const data = readConfigFile(filePath); + return data; } catch (error) { console.log('get error', error); - return null; + return {}; } } async set(_key: string, value: any) { - const data = readFileSync(this.filepath, 'utf-8'); try { - const jsonData = JSON.parse(data); - const newData = { ...jsonData, ...value }; - writeFileSync(this.filepath, JSON.stringify(newData, null, 2)); + const data = readConfigFile(this.filepath); + const newData = { ...data, ...value }; + writeConfigFile(this.filepath, newData); } catch (error) { console.log('set error', error); } @@ -114,7 +121,7 @@ export class LoginNodeCache implements Cache { } catch (error) { console.log('loadCache error', error); const defaultData = { loginUsers: [] }; - await writeFile(filePath, JSON.stringify(defaultData, null, 2)); + writeConfigFile(filePath, defaultData); return defaultData; } }