Skip to content

Commit 954cb17

Browse files
committed
fix: 🐛 Svelte store is the primary source of truth, while chrome storage is secondary.
1 parent b9e7bf6 commit 954cb17

File tree

1 file changed

+30
-33
lines changed

1 file changed

+30
-33
lines changed

src/storage.ts

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { writable, type Writable } from "svelte/store";
1+
import { writable, type Updater, type Writable } from "svelte/store";
22

33
/**
44
* Creates a persistent Svelte store backed by Chrome's sync storage.
@@ -8,48 +8,45 @@ import { writable, type Writable } from "svelte/store";
88
* @returns A writable Svelte store
99
*/
1010
export function persistentStore<T>(key: string, initialValue: T): Writable<T> {
11-
const store = writable(initialValue);
12-
// Ensure each value is updated exactly once in store and in chrome storage
13-
let storeValueQueue: T[] = [];
14-
let chromeValueQueue: T[] = [];
11+
const store = writable<T>(initialValue);
1512

16-
function watchStore() {
17-
store.subscribe((value) => {
18-
if (chromeValueQueue.length > 0 && value === chromeValueQueue[0]) {
19-
chromeValueQueue.shift();
20-
return;
21-
}
22-
23-
storeValueQueue.push(value);
24-
chrome.storage.sync.set({ [key]: value });
25-
});
13+
function updateChromeStorage(value: T): void {
14+
chrome.storage.sync.set({ [key]: value });
2615
}
2716

28-
function watchChrome() {
17+
function watchChromeStorage() {
2918
chrome.storage.sync.onChanged.addListener((changes) => {
30-
if (!Object.hasOwn(changes, key)) return;
31-
32-
const value = changes[key].newValue as T;
33-
if (storeValueQueue.length > 0 && value === storeValueQueue[0]) {
34-
storeValueQueue.shift();
35-
return;
19+
if (Object.hasOwn(changes, key)) {
20+
store.set(changes[key].newValue);
3621
}
22+
});
23+
}
3724

38-
chromeValueQueue.push(value);
39-
store.set(value);
25+
function initStoreFromChromeStorage() {
26+
chrome.storage.sync.get(key).then((result) => {
27+
if (Object.hasOwn(result, key)) {
28+
store.set(result[key]);
29+
}
4030
});
4131
}
4232

43-
// Initialize the store with the value from Chrome storage
44-
chrome.storage.sync.get(key).then((result) => {
45-
const value = Object.hasOwn(result, key) ? result[key] : initialValue;
46-
chromeValueQueue.push(value);
47-
store.set(value);
48-
watchStore();
49-
watchChrome();
50-
});
33+
initStoreFromChromeStorage();
34+
watchChromeStorage();
5135

52-
return store;
36+
return {
37+
set(this: void, value: T): void {
38+
store.set(value);
39+
updateChromeStorage(value);
40+
},
41+
update(this: void, updater: Updater<T>): void {
42+
return store.update((prev: T): T => {
43+
const value = updater(prev);
44+
updateChromeStorage(value);
45+
return value;
46+
});
47+
},
48+
subscribe: store.subscribe,
49+
};
5350
}
5451

5552
export const count = persistentStore("count", 10);

0 commit comments

Comments
 (0)