preferences.mjs 1.6 KB

12345678910111213141516
  1. import {readFile,writeFile,rename,mkdir,rm} from 'node:fs/promises'
  2. import {join} from 'node:path'
  3. import {randomUUID} from 'node:crypto'
  4. import {homedir} from 'node:os'
  5. export class DesktopPreferences {
  6. constructor(home){this.home=home;this.path=join(home,'desktop-preferences.json');this.value={backgroundAtLogin:false,startupChoice:'ask',remoteServer:''}}
  7. async load(){try{let source;try{source=await readFile(this.path,'utf8')}catch(error){if(error.code!=='ENOENT'||this.home!==join(homedir(),'.yaoyao'))throw error;source=await readFile(join(homedir(),'.hermes-yaoyao','desktop-preferences.json'),'utf8')}const value=JSON.parse(source);this.value={backgroundAtLogin:value.backgroundAtLogin===true,startupChoice:['ask','local','remote'].includes(value.startupChoice)?value.startupChoice:'ask',remoteServer:typeof value.remoteServer==='string'?value.remoteServer.slice(0,200):''}}catch(error){if(error.code!=='ENOENT')throw new Error('无法读取桌面偏好设置')}return this.value}
  8. async write(value){
  9. const temporary=this.path+'.'+randomUUID()
  10. await mkdir(this.home,{recursive:true,mode:0o700})
  11. try{await writeFile(temporary,JSON.stringify(value),{flag:'wx',mode:0o600});await rename(temporary,this.path);this.value=value}finally{await rm(temporary,{force:true})}
  12. }
  13. async setBackgroundAtLogin(enabled){await this.write({...this.value,backgroundAtLogin:enabled===true})}
  14. async setStartupChoice(choice){await this.write({...this.value,startupChoice:['ask','local','remote'].includes(choice)?choice:'ask'})}
  15. async setRemoteServer(url){await this.write({...this.value,remoteServer:typeof url==='string'?url.slice(0,200):''})}
  16. }