@xylabs/indexed-db 4.4.33 → 4.4.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/IndexDescription.d.ts +30 -0
- package/dist/browser/IndexDescription.d.ts.map +1 -0
- package/dist/browser/IndexedDbKeyValueStore.d.ts +17 -0
- package/dist/browser/IndexedDbKeyValueStore.d.ts.map +1 -0
- package/dist/browser/ObjectStore.d.ts +5 -0
- package/dist/browser/ObjectStore.d.ts.map +1 -0
- package/dist/browser/checkDbNeedsUpgrade.d.ts +7 -0
- package/dist/browser/checkDbNeedsUpgrade.d.ts.map +1 -0
- package/dist/browser/createStoreDuringUpgrade.d.ts +5 -0
- package/dist/browser/createStoreDuringUpgrade.d.ts.map +1 -0
- package/dist/{neutral/createStore.d.ts → browser/getExistingIndexes.d.ts} +2 -2
- package/dist/browser/getExistingIndexes.d.ts.map +1 -0
- package/dist/browser/index.d.ts +11 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.mjs +233 -0
- package/dist/browser/index.mjs.map +1 -0
- package/dist/browser/withDb.d.ts +6 -0
- package/dist/browser/withDb.d.ts.map +1 -0
- package/dist/browser/withReadOnlyStore.d.ts +6 -0
- package/dist/browser/withReadOnlyStore.d.ts.map +1 -0
- package/dist/browser/withReadWriteStore.d.ts +6 -0
- package/dist/browser/withReadWriteStore.d.ts.map +1 -0
- package/dist/browser/withStore.d.ts +8 -0
- package/dist/browser/withStore.d.ts.map +1 -0
- package/dist/neutral/IndexDescription.d.ts +0 -4
- package/dist/neutral/IndexDescription.d.ts.map +1 -1
- package/dist/neutral/IndexedDbKeyValueStore.d.ts +3 -3
- package/dist/neutral/IndexedDbKeyValueStore.d.ts.map +1 -1
- package/dist/neutral/checkDbNeedsUpgrade.d.ts +7 -0
- package/dist/neutral/checkDbNeedsUpgrade.d.ts.map +1 -0
- package/dist/neutral/createStoreDuringUpgrade.d.ts +5 -0
- package/dist/neutral/createStoreDuringUpgrade.d.ts.map +1 -0
- package/dist/neutral/getExistingIndexes.d.ts +2 -1
- package/dist/neutral/getExistingIndexes.d.ts.map +1 -1
- package/dist/neutral/index.d.ts +3 -1
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +131 -33
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/withDb.d.ts +3 -1
- package/dist/neutral/withDb.d.ts.map +1 -1
- package/dist/neutral/withReadOnlyStore.d.ts +2 -1
- package/dist/neutral/withReadOnlyStore.d.ts.map +1 -1
- package/dist/neutral/withReadWriteStore.d.ts +2 -1
- package/dist/neutral/withReadWriteStore.d.ts.map +1 -1
- package/dist/neutral/withStore.d.ts +8 -0
- package/dist/neutral/withStore.d.ts.map +1 -0
- package/dist/node/IndexDescription.d.ts +30 -0
- package/dist/node/IndexDescription.d.ts.map +1 -0
- package/dist/node/IndexedDbKeyValueStore.d.ts +17 -0
- package/dist/node/IndexedDbKeyValueStore.d.ts.map +1 -0
- package/dist/node/ObjectStore.d.ts +5 -0
- package/dist/node/ObjectStore.d.ts.map +1 -0
- package/dist/node/checkDbNeedsUpgrade.d.ts +7 -0
- package/dist/node/checkDbNeedsUpgrade.d.ts.map +1 -0
- package/dist/node/createStoreDuringUpgrade.d.ts +5 -0
- package/dist/node/createStoreDuringUpgrade.d.ts.map +1 -0
- package/dist/node/getExistingIndexes.d.ts +7 -0
- package/dist/node/getExistingIndexes.d.ts.map +1 -0
- package/dist/node/index.d.ts +11 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.mjs +233 -0
- package/dist/node/index.mjs.map +1 -0
- package/dist/node/withDb.d.ts +6 -0
- package/dist/node/withDb.d.ts.map +1 -0
- package/dist/node/withReadOnlyStore.d.ts +6 -0
- package/dist/node/withReadOnlyStore.d.ts.map +1 -0
- package/dist/node/withReadWriteStore.d.ts +6 -0
- package/dist/node/withReadWriteStore.d.ts.map +1 -0
- package/dist/node/withStore.d.ts +8 -0
- package/dist/node/withStore.d.ts.map +1 -0
- package/package.json +23 -9
- package/src/IndexDescription.ts +0 -4
- package/src/IndexedDbKeyValueStore.ts +3 -3
- package/src/checkDbNeedsUpgrade.ts +37 -0
- package/src/{createStore.ts → createStoreDuringUpgrade.ts} +17 -10
- package/src/getExistingIndexes.ts +39 -20
- package/src/index.ts +3 -1
- package/src/withDb.ts +48 -2
- package/src/withReadOnlyStore.ts +5 -8
- package/src/withReadWriteStore.ts +5 -8
- package/src/withStore.ts +34 -0
- package/xy.config.ts +2 -2
- package/dist/neutral/createStore.d.ts.map +0 -1
package/src/withDb.ts
CHANGED
|
@@ -1,12 +1,58 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger'
|
|
1
2
|
import type { EmptyObject } from '@xylabs/object'
|
|
2
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
DBSchema, IDBPDatabase, StoreNames,
|
|
5
|
+
} from 'idb'
|
|
3
6
|
import { openDB } from 'idb'
|
|
4
7
|
|
|
8
|
+
import { checkDbNeedsUpgrade } from './checkDbNeedsUpgrade.ts'
|
|
9
|
+
import { createStoreDuringUpgrade } from './createStoreDuringUpgrade.ts'
|
|
10
|
+
import { buildStandardIndexName, type IndexDescription } from './IndexDescription.ts'
|
|
11
|
+
|
|
5
12
|
export async function withDb<DBTypes extends DBSchema | unknown = unknown, R = EmptyObject>(
|
|
6
13
|
dbName: string,
|
|
7
14
|
callback: (db: IDBPDatabase<DBTypes>) => Promise<R> | R,
|
|
15
|
+
expectedIndexes?: Record<string, IndexDescription[]>,
|
|
16
|
+
logger?: Logger,
|
|
8
17
|
): Promise<R> {
|
|
9
|
-
const
|
|
18
|
+
const versionToOpen = expectedIndexes === undefined ? undefined : await checkDbNeedsUpgrade(dbName, expectedIndexes, logger)
|
|
19
|
+
const db = await openDB<DBTypes>(dbName, versionToOpen, {
|
|
20
|
+
blocked(currentVersion, blockedVersion, event) {
|
|
21
|
+
logger?.warn(`IndexedDb: Blocked from upgrading from ${currentVersion} to ${blockedVersion}`, event)
|
|
22
|
+
},
|
|
23
|
+
blocking(currentVersion, blockedVersion, event) {
|
|
24
|
+
logger?.warn(`IndexedDb: Blocking upgrade from ${currentVersion} to ${blockedVersion}`, event)
|
|
25
|
+
},
|
|
26
|
+
terminated() {
|
|
27
|
+
logger?.log('IndexedDb: Terminated')
|
|
28
|
+
},
|
|
29
|
+
upgrade(db, oldVersion, newVersion, transaction) {
|
|
30
|
+
if (oldVersion !== newVersion) {
|
|
31
|
+
logger?.log(`IndexedDb: Upgrading from ${oldVersion} to ${newVersion}`)
|
|
32
|
+
const objectStores = transaction.objectStoreNames
|
|
33
|
+
for (const name of objectStores) {
|
|
34
|
+
try {
|
|
35
|
+
db.deleteObjectStore(name)
|
|
36
|
+
} catch {
|
|
37
|
+
console.log(`IndexedDb: Failed to delete existing object store ${name}`)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (expectedIndexes) {
|
|
42
|
+
for (const [storeName, indexes] of Object.entries(expectedIndexes)) {
|
|
43
|
+
if (db.objectStoreNames.contains(storeName as StoreNames<DBTypes>)) {
|
|
44
|
+
continue
|
|
45
|
+
}
|
|
46
|
+
const indexesToCreate = indexes.map(idx => ({
|
|
47
|
+
...idx,
|
|
48
|
+
name: buildStandardIndexName(idx),
|
|
49
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
50
|
+
})).reduce((acc, idx) => acc.set(idx.name, idx), new Map<string, IndexDescription>()).values()
|
|
51
|
+
createStoreDuringUpgrade(db, storeName as StoreNames<DBTypes>, [...indexesToCreate], logger)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
})
|
|
10
56
|
try {
|
|
11
57
|
return await callback(db)
|
|
12
58
|
} finally {
|
package/src/withReadOnlyStore.ts
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger'
|
|
1
2
|
import type { EmptyObject } from '@xylabs/object'
|
|
2
3
|
import type {
|
|
3
4
|
IDBPDatabase, IDBPObjectStore, StoreNames,
|
|
4
5
|
} from 'idb'
|
|
5
6
|
|
|
6
7
|
import type { ObjectStore } from './ObjectStore.ts'
|
|
8
|
+
import { withStore } from './withStore.ts'
|
|
7
9
|
|
|
8
10
|
export async function withReadOnlyStore<T extends EmptyObject = EmptyObject, R = T>(
|
|
9
11
|
db: IDBPDatabase<ObjectStore<T>>,
|
|
10
12
|
storeName: StoreNames<ObjectStore<T>>,
|
|
11
|
-
callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>,
|
|
13
|
+
callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, 'readonly'> | null) => Promise<R> | R,
|
|
14
|
+
logger?: Logger,
|
|
12
15
|
): Promise<R> {
|
|
13
|
-
|
|
14
|
-
const store = transaction.objectStore(storeName)
|
|
15
|
-
try {
|
|
16
|
-
return await callback(store)
|
|
17
|
-
} finally {
|
|
18
|
-
await transaction.done
|
|
19
|
-
}
|
|
16
|
+
return await withStore(db, storeName, callback, 'readonly', logger)
|
|
20
17
|
}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger'
|
|
1
2
|
import type { EmptyObject } from '@xylabs/object'
|
|
2
3
|
import type {
|
|
3
4
|
IDBPDatabase, IDBPObjectStore, StoreNames,
|
|
4
5
|
} from 'idb'
|
|
5
6
|
|
|
6
7
|
import type { ObjectStore } from './ObjectStore.ts'
|
|
8
|
+
import { withStore } from './withStore.ts'
|
|
7
9
|
|
|
8
10
|
export async function withReadWriteStore<T extends EmptyObject = EmptyObject, R = T>(
|
|
9
11
|
db: IDBPDatabase<ObjectStore<T>>,
|
|
10
12
|
storeName: StoreNames<ObjectStore<T>>,
|
|
11
|
-
callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>,
|
|
13
|
+
callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, 'readwrite'> | null) => Promise<R> | R,
|
|
14
|
+
logger?: Logger,
|
|
12
15
|
): Promise<R> {
|
|
13
|
-
|
|
14
|
-
const store = transaction.objectStore(storeName)
|
|
15
|
-
try {
|
|
16
|
-
return await callback(store)
|
|
17
|
-
} finally {
|
|
18
|
-
await transaction.done
|
|
19
|
-
}
|
|
16
|
+
return await withStore(db, storeName, callback, 'readwrite', logger)
|
|
20
17
|
}
|
package/src/withStore.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger'
|
|
2
|
+
import type { EmptyObject } from '@xylabs/object'
|
|
3
|
+
import type {
|
|
4
|
+
IDBPDatabase, IDBPObjectStore, IDBPTransaction, StoreNames,
|
|
5
|
+
} from 'idb'
|
|
6
|
+
|
|
7
|
+
import type { ObjectStore } from './ObjectStore.ts'
|
|
8
|
+
|
|
9
|
+
export async function withStore<T extends EmptyObject = EmptyObject, R = T, M extends 'readonly' | 'readwrite' = 'readonly'>(
|
|
10
|
+
db: IDBPDatabase<ObjectStore<T>>,
|
|
11
|
+
storeName: StoreNames<ObjectStore<T>>,
|
|
12
|
+
callback: (store: IDBPObjectStore<ObjectStore<T>,
|
|
13
|
+
[StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, M> | null) => Promise<R> | R,
|
|
14
|
+
mode: M,
|
|
15
|
+
logger?: Logger,
|
|
16
|
+
): Promise<R> {
|
|
17
|
+
logger?.log('withStore', storeName, mode)
|
|
18
|
+
let transaction: IDBPTransaction<ObjectStore<T>, [StoreNames<ObjectStore<T>>], M> | undefined = undefined
|
|
19
|
+
logger?.log('withStore:transaction')
|
|
20
|
+
let store = null
|
|
21
|
+
try {
|
|
22
|
+
transaction = db.transaction(storeName, mode)
|
|
23
|
+
// we do this in a try/catch because the store might not exist
|
|
24
|
+
store = transaction.objectStore(storeName)
|
|
25
|
+
} catch (ex) {
|
|
26
|
+
logger?.log('withStore:catch', ex)
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
return await callback(store)
|
|
30
|
+
} finally {
|
|
31
|
+
logger?.log('withStore:finally')
|
|
32
|
+
await transaction?.done
|
|
33
|
+
}
|
|
34
|
+
}
|
package/xy.config.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createStore.d.ts","sourceRoot":"","sources":["../../src/createStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EACV,YAAY,EAAc,UAAU,EACrC,MAAM,KAAK,CAAA;AAEZ,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC7D,EAAE,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAChC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACrC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,CAAC,EAAE,MAAM,QAoBhB"}
|