aboutsummaryrefslogtreecommitdiffstats
path: root/src/ark
diff options
context:
space:
mode:
Diffstat (limited to 'src/ark')
-rw-r--r--src/ark/store.js20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/ark/store.js b/src/ark/store.js
index b1caa94..24d8f55 100644
--- a/src/ark/store.js
+++ b/src/ark/store.js
@@ -139,6 +139,7 @@ export class ArkStore {
}
}
this.ready = true;
+ this._parsed = null; // peeks now read the opened store
if (migrated.length) {
this.flush().then(() => { for (const k of migrated) { try { ls.removeItem(k); } catch {} } }).catch(() => {});
}
@@ -153,13 +154,32 @@ export class ArkStore {
const v = this.mem.get(key);
return v ? clone(v) : null;
}
+ // The stored object itself, not a copy — for readers that only look (the
+ // render path). get() deep-copies, and a big wallet's state is ~1 MB: on a
+ // Pixel 9 each copy took ~220 ms and the first render asked five to seven
+ // times before the manager connected, 1.4 s of every launch. Never mutate
+ // what this returns. Before the store opens (or on localStorage) the parse
+ // is kept until the key is next written.
+ peek(key) {
+ if (!this.ready || this.lsMode) {
+ const hit = this._parsed && this._parsed.get(key);
+ if (hit !== undefined) return hit;
+ let v = null;
+ try { const raw = this.ls().getItem(key); v = raw ? JSON.parse(raw) : null; } catch { v = null; }
+ (this._parsed ||= new Map()).set(key, v);
+ return v;
+ }
+ return this.mem.get(key) || null;
+ }
set(key, obj) {
+ if (this._parsed) this._parsed.delete(key);
if (!this.ready || this.lsMode) { try { this.ls().setItem(key, JSON.stringify(obj)); } catch {} return; }
this.mem.set(key, obj);
this.dirty.add(key);
this._schedule();
}
remove(key) {
+ if (this._parsed) this._parsed.delete(key);
if (!this.ready || this.lsMode) { try { this.ls().removeItem(key); } catch {} return; }
this.mem.delete(key);
this.dirty.add(key);