forked from elk-zone/elk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelk-idb.ts
51 lines (42 loc) · 1.28 KB
/
elk-idb.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
import {
type UseStore,
del as delIdb,
get as getIdb,
promisifyRequest,
set as setIdb,
update as updateIdb,
} from 'idb-keyval'
const databases: IDBOpenDBRequest[] = []
function createStore(): UseStore {
const storeName = 'keyval'
const request = indexedDB.open('keyval-store')
databases.push(request)
request.onupgradeneeded = () => request.result.createObjectStore(storeName)
const dbp = promisifyRequest(request)
return (txMode, callback) => dbp.then(db => callback(db.transaction(storeName, txMode).objectStore(storeName)))
}
let defaultGetStoreFunc: UseStore | undefined
function defaultGetStore() {
if (!defaultGetStoreFunc)
defaultGetStoreFunc = createStore()
return defaultGetStoreFunc
}
export function get<T = any>(key: IDBValidKey) {
return getIdb<T>(key, defaultGetStore())
}
export function set(key: IDBValidKey, value: any) {
return setIdb(key, value, defaultGetStore())
}
export function update<T = any>(key: IDBValidKey, updater: (oldValue: T | undefined) => T) {
return updateIdb(key, updater, defaultGetStore())
}
export function del(key: IDBValidKey) {
return delIdb(key, defaultGetStore())
}
export function closeDatabases() {
databases.forEach((db) => {
if (db.result)
db.result.close()
})
defaultGetStoreFunc = undefined
}