insomnia/packages/insomnia-app/app/main/local-storage.ts

76 lines
1.7 KiB
TypeScript
Raw Normal View History

import fs from 'fs';
2021-07-22 23:04:56 +00:00
import mkdirp from 'mkdirp';
import path from 'path';
class LocalStorage {
_buffer: Record<string, string> = {};
_timeouts: Record<string, NodeJS.Timeout> = {};
_basePath: string | null = null;
constructor(basePath: string) {
this._basePath = basePath;
// Debounce writes on a per key basis
mkdirp.sync(basePath);
2017-11-22 00:07:28 +00:00
console.log(`[localstorage] Initialized at ${basePath}`);
}
2018-06-25 17:42:50 +00:00
setItem(key, obj) {
clearTimeout(this._timeouts[key]);
2016-11-10 07:34:26 +00:00
this._buffer[key] = JSON.stringify(obj);
this._timeouts[key] = setTimeout(this._flush.bind(this), 100);
}
2018-06-25 17:42:50 +00:00
getItem(key, defaultObj) {
2016-11-10 07:34:26 +00:00
// Make sure things are flushed before we read
this._flush();
let contents = JSON.stringify(defaultObj);
const path = this._getKeyPath(key);
try {
contents = String(fs.readFileSync(path));
} catch (e) {
if (e.code === 'ENOENT') {
this.setItem(key, defaultObj);
}
}
try {
return JSON.parse(contents);
} catch (e) {
2018-10-17 16:42:33 +00:00
console.error(`[localstorage] Failed to parse item from LocalStorage: ${e}`);
2016-11-10 09:00:29 +00:00
return defaultObj;
}
}
2018-06-25 17:42:50 +00:00
_flush() {
2016-11-10 07:34:26 +00:00
const keys = Object.keys(this._buffer);
if (!keys.length) {
return;
}
for (const key of keys) {
const contents = this._buffer[key];
2016-11-10 07:34:26 +00:00
const path = this._getKeyPath(key);
delete this._buffer[key];
try {
fs.writeFileSync(path, contents);
} catch (e) {
console.error(`[localstorage] Failed to save to LocalStorage: ${e}`);
2016-11-10 07:34:26 +00:00
}
}
}
2018-06-25 17:42:50 +00:00
_getKeyPath(key) {
// @ts-expect-error -- TSCONVERSION this appears to be a genuine error
return path.join(this._basePath, key);
}
}
export default LocalStorage;