-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindexed-kv.ts
39 lines (34 loc) · 1.21 KB
/
indexed-kv.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
export async function get<Keys extends string[]>(
...keys: Keys
): Promise<Keys extends [string] ? unknown :{ [index in keyof Keys]: unknown }> {
const db = await openDb()
const store = db
.transaction("kv-store", "readonly")
.objectStore("kv-store")
const request = keys.map(key => store.get(key))
const response = await Promise.all(request.map(promise)) as any
if (keys.length === 1) return response[0]
return response
}
export async function set(key: string, value: unknown) {
const db = await openDb()
const request = db
.transaction("kv-store", "readwrite")
.objectStore("kv-store")
.put(value, key)
return await promise(request)
}
async function openDb() {
const request = indexedDB.open("kv-db")
request.onupgradeneeded = createStore
return await promise(request)
}
function createStore(event: IDBVersionChangeEvent) {
return (event.target as IDBOpenDBRequest).result.createObjectStore("kv-store")
}
function promise<T extends IDBRequest>(request: T) {
return new Promise<T["result"]>((resolve, reject) => {
request.onerror = () => reject(request.error)
request.onsuccess = () => resolve(request.result)
})
}