| 
						
						
						
						 |  | @@ -1,15 +1,21 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | import { Cache, LoginCacheStore, LoginCacheStoreOpts } from './login-cache.ts'; |  |  |  | import { Cache } from './login-cache.ts'; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | import { homedir } from 'node:os'; |  |  |  | import { homedir } from 'node:os'; | 
			
		
	
		
		
			
				
					
					|  |  |  | import { join, dirname } from 'node:path'; |  |  |  | import { join, dirname } from 'node:path'; | 
			
		
	
		
		
			
				
					
					|  |  |  | import fs from 'node:fs'; |  |  |  | import fs from 'node:fs'; | 
			
		
	
		
		
			
				
					
					|  |  |  | import { readFileSync, writeFileSync, accessSync } from 'node:fs'; |  |  |  | import { readFileSync, writeFileSync, accessSync } from 'node:fs'; | 
			
		
	
		
		
			
				
					
					|  |  |  | import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; |  |  |  | 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 { |  |  |  |   try { | 
			
		
	
		
		
			
				
					
					|  |  |  |     accessSync(filePath, fs.constants.F_OK); |  |  |  |     accessSync(filePath, fs.constants.F_OK); | 
			
		
	
		
		
			
				
					
					|  |  |  |     return true; |  |  |  |     return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } catch (error) { |  |  |  |   } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (createIfNotExists) { |  |  |  |     if (createIfNotExists && isDir) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       await mkdir(filePath, { recursive: true }); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } else if (createIfNotExists && isFile) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       await mkdir(dirname(filePath), { recursive: true }); |  |  |  |       await mkdir(dirname(filePath), { recursive: true }); | 
			
		
	
		
		
			
				
					
					|  |  |  |       return false; |  |  |  |       return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -25,6 +31,9 @@ export const readConfigFile = (filePath: string) => { | 
			
		
	
		
		
			
				
					
					|  |  |  |     return {}; |  |  |  |     return {}; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | }; |  |  |  | }; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | export const writeConfigFile = (filePath: string, data: any) => { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   writeFileSync(filePath, JSON.stringify(data, null, 2)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | }; | 
			
		
	
		
		
			
				
					
					|  |  |  | export const getHostName = () => { |  |  |  | export const getHostName = () => { | 
			
		
	
		
		
			
				
					
					|  |  |  |   const configDir = join(homedir(), '.config', 'envision'); |  |  |  |   const configDir = join(homedir(), '.config', 'envision'); | 
			
		
	
		
		
			
				
					
					|  |  |  |   const configFile = join(configDir, 'config.json'); |  |  |  |   const configFile = join(configDir, 'config.json'); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -41,14 +50,13 @@ export class StorageNode implements Storage { | 
			
		
	
		
		
			
				
					
					|  |  |  |     const configDir = join(homedir(), '.config', 'envision'); |  |  |  |     const configDir = join(homedir(), '.config', 'envision'); | 
			
		
	
		
		
			
				
					
					|  |  |  |     const hostname = getHostName(); |  |  |  |     const hostname = getHostName(); | 
			
		
	
		
		
			
				
					
					|  |  |  |     this.filePath = join(configDir, 'config', `${hostname}-storage.json`); |  |  |  |     this.filePath = join(configDir, 'config', `${hostname}-storage.json`); | 
			
		
	
		
		
			
				
					
					|  |  |  |     fileExists(this.filePath, true); |  |  |  |     fileExists(this.filePath, { isFile: true }); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |   async loadCache() { |  |  |  |   async loadCache() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     const filePath = this.filePath; |  |  |  |     const filePath = this.filePath; | 
			
		
	
		
		
			
				
					
					|  |  |  |     try { |  |  |  |     try { | 
			
		
	
		
		
			
				
					
					|  |  |  |       const data = await readFile(filePath, 'utf-8'); |  |  |  |       const data = await readConfigFile(filePath); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       const jsonData = JSON.parse(data); |  |  |  |       this.cacheData = data; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       this.cacheData = jsonData; |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } catch (error) { |  |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       this.cacheData = {}; |  |  |  |       this.cacheData = {}; | 
			
		
	
		
		
			
				
					
					|  |  |  |       await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); |  |  |  |       await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -81,24 +89,23 @@ export class LoginNodeCache implements Cache { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   constructor(filepath?: string) { |  |  |  |   constructor(filepath?: string) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); |  |  |  |     this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); | 
			
		
	
		
		
			
				
					
					|  |  |  |     fileExists(this.filepath, true); |  |  |  |     fileExists(this.filepath, { isFile: true }); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |   async get(_key: string) { |  |  |  |   async get(_key: string) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     const data = readFileSync(this.filepath, 'utf-8'); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     try { |  |  |  |     try { | 
			
		
	
		
		
			
				
					
					|  |  |  |       const jsonData = JSON.parse(data); |  |  |  |       const filePath = this.filepath; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       return jsonData; |  |  |  |       const data = readConfigFile(filePath); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       return data; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } catch (error) { |  |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       console.log('get error', error); |  |  |  |       console.log('get error', error); | 
			
		
	
		
		
			
				
					
					|  |  |  |       return null; |  |  |  |       return {}; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |   async set(_key: string, value: any) { |  |  |  |   async set(_key: string, value: any) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     const data = readFileSync(this.filepath, 'utf-8'); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     try { |  |  |  |     try { | 
			
		
	
		
		
			
				
					
					|  |  |  |       const jsonData = JSON.parse(data); |  |  |  |       const data = readConfigFile(this.filepath); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       const newData = { ...jsonData, ...value }; |  |  |  |       const newData = { ...data, ...value }; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       writeFileSync(this.filepath, JSON.stringify(newData, null, 2)); |  |  |  |       writeConfigFile(this.filepath, newData); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } catch (error) { |  |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       console.log('set error', error); |  |  |  |       console.log('set error', error); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -114,7 +121,7 @@ export class LoginNodeCache implements Cache { | 
			
		
	
		
		
			
				
					
					|  |  |  |     } catch (error) { |  |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |  |       console.log('loadCache error', error); |  |  |  |       console.log('loadCache error', error); | 
			
		
	
		
		
			
				
					
					|  |  |  |       const defaultData = { loginUsers: [] }; |  |  |  |       const defaultData = { loginUsers: [] }; | 
			
		
	
		
		
			
				
					
					|  |  |  |       await writeFile(filePath, JSON.stringify(defaultData, null, 2)); |  |  |  |       writeConfigFile(filePath, defaultData); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       return defaultData; |  |  |  |       return defaultData; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
	
		
		
			
				
					
					|  |  |   |