-
Notifications
You must be signed in to change notification settings - Fork 62
/
ChromeStorage.ts
65 lines (59 loc) · 1.69 KB
/
ChromeStorage.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { Storage, StorageKey, StorageKeyReturnType, defaultValues } from '@airgap/beacon-types'
/**
* @internalapi
*
* A storage that can be used in chrome extensions
*/
export class ChromeStorage implements Storage {
public static async isSupported(): Promise<boolean> {
return (
typeof window !== 'undefined' &&
typeof chrome !== 'undefined' &&
Boolean(chrome) &&
Boolean(chrome.runtime) &&
Boolean(chrome.runtime.id)
)
}
public async get<K extends StorageKey>(key: K): Promise<StorageKeyReturnType[K]> {
return new Promise((resolve) => {
chrome.storage.local.get(null, (storageContent) => {
if (storageContent[key]) {
resolve(storageContent[key])
} else {
if (typeof defaultValues[key] === 'object') {
resolve(JSON.parse(JSON.stringify(defaultValues[key])))
} else {
resolve(defaultValues[key])
}
}
})
})
}
public async set<K extends StorageKey>(key: K, value: StorageKeyReturnType[K]): Promise<void> {
return new Promise((resolve) => {
chrome.storage.local.set({ [key]: value }, () => {
resolve()
})
})
}
public async delete<K extends StorageKey>(key: K): Promise<void> {
return new Promise((resolve) => {
chrome.storage.local.set({ [key]: undefined }, () => {
resolve()
})
})
}
public async subscribeToStorageChanged(
_callback: (arg: {
eventType: 'storageCleared' | 'entryModified'
key: string | null
oldValue: string | null
newValue: string | null
}) => {}
): Promise<void> {
// TODO
}
public getPrefixedKey(key: string): string {
return key
}
}