82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import * as electron from "electron";
 | 
						|
import * as path from "path";
 | 
						|
import * as fs from "fs-extra";
 | 
						|
 | 
						|
const APP_DATA = electron.remote.app.getPath("userData");
 | 
						|
const SETTINGS_DIR = path.join(APP_DATA, "settings");
 | 
						|
 | 
						|
let _local_storage: {[key: string]: any} = {};
 | 
						|
let _local_storage_save: {[key: string]: boolean} = {};
 | 
						|
export async function initialize() {
 | 
						|
    await fs.mkdirs(SETTINGS_DIR);
 | 
						|
 | 
						|
    const files = await fs.readdir(SETTINGS_DIR);
 | 
						|
    for(const file of files) {
 | 
						|
        const key = decodeURIComponent(file);
 | 
						|
        console.log("Load settings: %s", key);
 | 
						|
 | 
						|
        try {
 | 
						|
            const data = await fs.readFile(path.join(SETTINGS_DIR, file));
 | 
						|
            const decoded = JSON.parse(data.toString() || "{}");
 | 
						|
 | 
						|
            _local_storage[key] = decoded;
 | 
						|
        } catch(error) {
 | 
						|
            console.error("Failed to load settings for %s: %o", key, error);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    let _new_storage: Storage = {} as any;
 | 
						|
 | 
						|
    _new_storage.getItem = key => _local_storage[key] || null;
 | 
						|
    _new_storage.setItem = (key, value) => {
 | 
						|
        _local_storage[key] = value;
 | 
						|
        _local_storage_save[key] = true;
 | 
						|
        save_key(key).catch(error => {
 | 
						|
            console.warn("Failed to save key: %s => %o", key, error);
 | 
						|
        });
 | 
						|
        (_new_storage as any)["length"] = Object.keys(_local_storage).length;
 | 
						|
    };
 | 
						|
 | 
						|
    _new_storage.clear = () => {
 | 
						|
        _local_storage = {};
 | 
						|
        _local_storage_save = {};
 | 
						|
 | 
						|
        try {
 | 
						|
            fs.emptyDirSync(SETTINGS_DIR);
 | 
						|
        } catch(error) {
 | 
						|
            console.warn("Failed to empty settings dir");
 | 
						|
        }
 | 
						|
        (_new_storage as any)["length"] = 0;
 | 
						|
    };
 | 
						|
 | 
						|
    _new_storage.key = index => Object.keys(_local_storage)[index];
 | 
						|
    _new_storage.removeItem = key => {
 | 
						|
        delete _local_storage[key];
 | 
						|
        delete_key(key).catch(error => {
 | 
						|
            console.warn("Failed to delete key on fs: %s => %o", key, error);
 | 
						|
        });
 | 
						|
        (_new_storage as any)["length"] = Object.keys(_local_storage).length;
 | 
						|
    };
 | 
						|
 | 
						|
    Object.assign(window.localStorage, _new_storage);
 | 
						|
}
 | 
						|
 | 
						|
export async function save_all() {
 | 
						|
    let promises: Promise<void>[] = [];
 | 
						|
    for(const key of Object.keys(_local_storage))
 | 
						|
        promises.push(save_key(key));
 | 
						|
    await Promise.all(promises);
 | 
						|
}
 | 
						|
 | 
						|
export async function save_key(key: string) {
 | 
						|
    if(!_local_storage_save[key])
 | 
						|
        return;
 | 
						|
 | 
						|
    _local_storage_save[key] = false;
 | 
						|
    await fs.writeJson(path.join(SETTINGS_DIR, encodeURIComponent(key)), _local_storage[key], {spaces: 0});
 | 
						|
}
 | 
						|
 | 
						|
export async function delete_key(key: string) {
 | 
						|
    delete  _local_storage_save[key];
 | 
						|
    await fs.remove(path.join(SETTINGS_DIR, encodeURIComponent(key)));
 | 
						|
} |