import MemoryStorage from '../infrastructures/MemoryStorage'; import Settings from '../../shared/settings/Settings'; import Properties from '../../shared/settings/Properties'; const CACHED_SETTING_KEY = 'setting'; export default interface CachedSettingRepository { get(): Promise; update(value: Settings): Promise; setProperty( name: string, value: string | number | boolean, ): Promise; } export class CachedSettingRepositoryImpl implements CachedSettingRepository { private cache: MemoryStorage; constructor() { this.cache = new MemoryStorage(); } get(): Promise { const data = this.cache.get(CACHED_SETTING_KEY); return Promise.resolve(Settings.fromJSON(data)); } update(value: Settings): Promise { this.cache.set(CACHED_SETTING_KEY, value.toJSON()); return Promise.resolve() } async setProperty( name: string, value: string | number | boolean, ): Promise { const def = Properties.def(name); if (!def) { throw new Error('unknown property: ' + name); } if (typeof value !== def.type) { throw new TypeError(`property type of ${name} mismatch: ${typeof value}`); } let newValue = value; if (typeof value === 'string' && value === '') { newValue = def.defaultValue; } const current = await this.get(); switch (name) { case 'hintchars': current.properties.hintchars = newValue as string; break; case 'smoothscroll': current.properties.smoothscroll = newValue as boolean; break; case 'complete': current.properties.complete = newValue as string; break; } await this.update(current); } }