-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
idbstorage.ts
82 lines (71 loc) · 2.47 KB
/
idbstorage.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { openDB, IDBPDatabase } from 'idb';
import { DataCache, Storage, ItemCache } from './CacheTypes';
export type OnUpgrade = {
(db: any, oldVersion: number, newVersion: number, transaction: any): void
}
class IDBStorage {
static create(options: {
name?: string,
storeNames?: string[],
version?: number,
onUpgrade?: OnUpgrade
}): any[] {
const {
name = 'cache',
storeNames = ['persist'],
version = 1,
onUpgrade = (db, oldVersion, newVersion, transaction) => { }
} = options;
const dbPromise = openDB<any>(name, version, {
upgrade(dbPromise, oldVersion, newVersion, transaction) {
if (newVersion === 1) {
storeNames.forEach(storeName => {
dbPromise.createObjectStore(storeName);
});
}
onUpgrade(dbPromise, oldVersion, newVersion, transaction);
}
})
const listItems = storeNames.map((value) => (
createIdbStorage(dbPromise, value)
));
return listItems;
}
}
export function createIdbStorage(dbPromise: Promise<IDBPDatabase<any>>, storeName: string): Storage {
return {
multiRemove: (keys) => {
return dbPromise.then(db => {
for (var i = 0; i < keys.length; i++) {
db.delete(storeName, keys[i]);
}
})
},
multiGet: (keys) => {
return dbPromise.then(async db => {
const data: DataCache = {};
for (var i = 0; i < keys.length; i++) {
const key: string = keys[i];
data[key] = await db.get(storeName, key);
}
return data;
})
},
getAllKeys: () => {
return dbPromise.then(db => db.getAllKeys(storeName));
},
multiSet: async (items: Array<ItemCache<any>>) => {
return dbPromise.then(db =>
items.forEach(function (item) {
db.put(storeName, item.value, item.key);
}))
},
setItem: (key: string, value: string): Promise<void> => {
return dbPromise.then(db => db.put(storeName, value, key))
},
removeItem: (key: string): Promise<void> => {
return dbPromise.then(db => db.delete(storeName, key))
},
}
}
export default IDBStorage;