@xyo-network/archivist-indexeddb 2.65.2 → 2.65.4
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/cjs/AbstractIndexedDbArchivist.js +16 -0
- package/dist/cjs/AbstractIndexedDbArchivist.js.map +1 -0
- package/dist/cjs/IndexedDbArchivist.js +32 -27
- package/dist/cjs/IndexedDbArchivist.js.map +1 -1
- package/dist/cjs/IndexedDbArchivistSimple.js +92 -0
- package/dist/cjs/IndexedDbArchivistSimple.js.map +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/docs.json +19661 -2509
- package/dist/esm/AbstractIndexedDbArchivist.js +12 -0
- package/dist/esm/AbstractIndexedDbArchivist.js.map +1 -0
- package/dist/esm/IndexedDbArchivist.js +23 -30
- package/dist/esm/IndexedDbArchivist.js.map +1 -1
- package/dist/esm/IndexedDbArchivistSimple.js +71 -0
- package/dist/esm/IndexedDbArchivistSimple.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/AbstractIndexedDbArchivist.d.ts +32 -0
- package/dist/types/AbstractIndexedDbArchivist.d.ts.map +1 -0
- package/dist/types/IndexedDbArchivist.d.ts +14 -7
- package/dist/types/IndexedDbArchivist.d.ts.map +1 -1
- package/dist/types/IndexedDbArchivistSimple.d.ts +51 -0
- package/dist/types/IndexedDbArchivistSimple.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +16 -15
- package/src/AbstractIndexedDbArchivist.ts +51 -0
- package/src/IndexedDbArchivist.ts +40 -26
- package/src/IndexedDbArchivistSimple.ts +114 -0
- package/src/index.ts +1 -0
- package/src/spec/testArchivist.ts +48 -13
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AbstractDirectArchivist } from '@xyo-network/abstract-archivist';
|
|
2
|
+
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, } from '@xyo-network/archivist-model';
|
|
3
|
+
export const AbstractIndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
|
|
4
|
+
export class AbstractIndexedDbArchivist extends AbstractDirectArchivist {
|
|
5
|
+
static configSchemas = [AbstractIndexedDbArchivistConfigSchema];
|
|
6
|
+
static defaultDbName = 'archivist';
|
|
7
|
+
static defaultStoreName = 'payloads';
|
|
8
|
+
get queries() {
|
|
9
|
+
return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=AbstractIndexedDbArchivist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractIndexedDbArchivist.js","sourceRoot":"","sources":["../../src/AbstractIndexedDbArchivist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EAEzB,0BAA0B,EAC1B,0BAA0B,GAG3B,MAAM,8BAA8B,CAAA;AAIrC,MAAM,CAAC,MAAM,sCAAsC,GAA2C,wCAAwC,CAAA;AAgBtI,MAAM,OAAgB,0BAGpB,SAAQ,uBAA4C;IACpD,MAAM,CAAU,aAAa,GAAG,CAAC,sCAAsC,CAAC,CAAA;IACxE,MAAM,CAAC,aAAa,GAAG,WAAW,CAAA;IAClC,MAAM,CAAC,gBAAgB,GAAG,UAAU,CAAA;IAEpC,IAAa,OAAO;QAClB,OAAO,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IACvI,CAAC"}
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import { __decorate } from "tslib";
|
|
3
|
-
import { assertEx } from '@xylabs/assert';
|
|
4
|
-
import { AbstractDirectArchivist } from '@xyo-network/abstract-archivist';
|
|
1
|
+
import { exists } from '@xylabs/exists';
|
|
5
2
|
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, } from '@xyo-network/archivist-model';
|
|
6
3
|
import { PayloadHasher } from '@xyo-network/core';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
4
|
+
import { openDB } from 'idb';
|
|
5
|
+
import { AbstractIndexedDbArchivist } from './AbstractIndexedDbArchivist';
|
|
9
6
|
export const IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
|
|
10
|
-
export
|
|
11
|
-
static
|
|
7
|
+
export class IndexedDbArchivist extends AbstractIndexedDbArchivist {
|
|
8
|
+
static CurrentSchemaVersion = 1;
|
|
12
9
|
static configSchemas = [IndexedDbArchivistConfigSchema];
|
|
13
|
-
|
|
14
|
-
static defaultStoreName = 'payloads';
|
|
15
|
-
_db;
|
|
10
|
+
db = undefined;
|
|
16
11
|
/**
|
|
17
12
|
* The database name. If not supplied via config, it defaults
|
|
18
13
|
* to the module name (not guaranteed to be unique) and if module
|
|
@@ -21,7 +16,7 @@ export let IndexedDbArchivist = class IndexedDbArchivist extends AbstractDirectA
|
|
|
21
16
|
* make the most sense for 99% of use cases.
|
|
22
17
|
*/
|
|
23
18
|
get dbName() {
|
|
24
|
-
return this.config?.dbName ?? this.config?.name ??
|
|
19
|
+
return this.config?.dbName ?? this.config?.name ?? IndexedDbArchivist.defaultDbName;
|
|
25
20
|
}
|
|
26
21
|
get queries() {
|
|
27
22
|
return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries];
|
|
@@ -37,43 +32,41 @@ export let IndexedDbArchivist = class IndexedDbArchivist extends AbstractDirectA
|
|
|
37
32
|
* https://www.npmjs.com/package/idb
|
|
38
33
|
*/
|
|
39
34
|
get storeName() {
|
|
40
|
-
return this.config?.storeName ??
|
|
41
|
-
}
|
|
42
|
-
get db() {
|
|
43
|
-
return assertEx(this._db, 'DB not initialized');
|
|
35
|
+
return (this.config?.storeName ?? IndexedDbArchivist.defaultStoreName);
|
|
44
36
|
}
|
|
45
37
|
async start() {
|
|
46
38
|
await super.start();
|
|
47
39
|
// NOTE: We could defer this creation to first access but we
|
|
48
40
|
// want to fail fast here in case something is wrong
|
|
49
|
-
this.
|
|
41
|
+
this.db = openDB(this.dbName, IndexedDbArchivist.CurrentSchemaVersion, {
|
|
42
|
+
upgrade: (db) => db.createObjectStore(this.storeName),
|
|
43
|
+
});
|
|
50
44
|
}
|
|
51
45
|
async allHandler() {
|
|
52
|
-
|
|
53
|
-
return result.map(([_hash, payload]) => payload);
|
|
46
|
+
return (await (await this.db)?.getAll(this.storeName)) ?? [];
|
|
54
47
|
}
|
|
55
48
|
async clearHandler() {
|
|
56
|
-
await
|
|
49
|
+
await (await this.db)?.clear(this.storeName);
|
|
57
50
|
}
|
|
58
51
|
async deleteHandler(hashes) {
|
|
59
|
-
await
|
|
52
|
+
await Promise.all(hashes.map(async (hash) => {
|
|
53
|
+
await (await this.db)?.delete(this.storeName, hash);
|
|
54
|
+
}));
|
|
60
55
|
return hashes.map((_) => true);
|
|
61
56
|
}
|
|
62
57
|
async getHandler(hashes) {
|
|
63
|
-
const
|
|
64
|
-
|
|
58
|
+
const results = (await Promise.all(hashes.map(async (hash) => {
|
|
59
|
+
return await (await this.db)?.get(this.storeName, hash);
|
|
60
|
+
}))).filter(exists);
|
|
61
|
+
return results;
|
|
65
62
|
}
|
|
66
63
|
async insertHandler(payloads) {
|
|
67
|
-
|
|
64
|
+
await Promise.all(payloads.map(async (payload) => {
|
|
68
65
|
const hash = await PayloadHasher.hashAsync(payload);
|
|
69
|
-
|
|
66
|
+
await (await this.db)?.put(this.storeName, payload, hash);
|
|
70
67
|
}));
|
|
71
|
-
await setMany(entries, this.db);
|
|
72
68
|
const [result] = await this.bindQueryResult({ payloads, schema: ArchivistInsertQuerySchema }, payloads);
|
|
73
69
|
return [result[0]];
|
|
74
70
|
}
|
|
75
|
-
}
|
|
76
|
-
IndexedDbArchivist = IndexedDbArchivist_1 = __decorate([
|
|
77
|
-
creatableModule()
|
|
78
|
-
], IndexedDbArchivist);
|
|
71
|
+
}
|
|
79
72
|
//# sourceMappingURL=IndexedDbArchivist.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexedDbArchivist.js","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IndexedDbArchivist.js","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert';
|
|
2
|
+
import { exists } from '@xylabs/exists';
|
|
3
|
+
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, } from '@xyo-network/archivist-model';
|
|
4
|
+
import { PayloadHasher } from '@xyo-network/core';
|
|
5
|
+
import { clear, createStore, delMany, entries, getMany, setMany } from 'idb-keyval';
|
|
6
|
+
import { AbstractIndexedDbArchivist } from './AbstractIndexedDbArchivist';
|
|
7
|
+
export const IndexedDbArchivistSimpleConfigSchema = 'network.xyo.archivist.indexeddb.config';
|
|
8
|
+
export class IndexedDbArchivistSimple extends AbstractIndexedDbArchivist {
|
|
9
|
+
static configSchemas = [IndexedDbArchivistSimpleConfigSchema];
|
|
10
|
+
_db;
|
|
11
|
+
/**
|
|
12
|
+
* The database name. If not supplied via config, it defaults
|
|
13
|
+
* to the module name (not guaranteed to be unique) and if module
|
|
14
|
+
* name is not supplied, it defaults to `archivist`. This behavior
|
|
15
|
+
* biases towards a single, isolated DB per archivist which seems to
|
|
16
|
+
* make the most sense for 99% of use cases.
|
|
17
|
+
*/
|
|
18
|
+
get dbName() {
|
|
19
|
+
return this.config?.dbName ?? this.config?.name ?? IndexedDbArchivistSimple.defaultDbName;
|
|
20
|
+
}
|
|
21
|
+
get queries() {
|
|
22
|
+
return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The name of the object store. If not supplied via config, it defaults
|
|
26
|
+
* to `payloads`. The limitation of the current IndexedDB wrapper we're
|
|
27
|
+
* using is that it only supports a single object store per DB. See here:
|
|
28
|
+
* https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
|
|
29
|
+
* If this becomes a problem or we need migrations/transactions, we can
|
|
30
|
+
* move to this more-flexible library, which they recommend (and who
|
|
31
|
+
* recommends them for our simple use case of key-value storage):
|
|
32
|
+
* https://www.npmjs.com/package/idb
|
|
33
|
+
*/
|
|
34
|
+
get storeName() {
|
|
35
|
+
return this.config?.storeName ?? IndexedDbArchivistSimple.defaultStoreName;
|
|
36
|
+
}
|
|
37
|
+
get db() {
|
|
38
|
+
return assertEx(this._db, 'DB not initialized');
|
|
39
|
+
}
|
|
40
|
+
async start() {
|
|
41
|
+
await super.start();
|
|
42
|
+
// NOTE: We could defer this creation to first access but we
|
|
43
|
+
// want to fail fast here in case something is wrong
|
|
44
|
+
this._db = createStore(this.dbName, this.storeName);
|
|
45
|
+
}
|
|
46
|
+
async allHandler() {
|
|
47
|
+
const result = await entries(this.db);
|
|
48
|
+
return result.map(([_hash, payload]) => payload);
|
|
49
|
+
}
|
|
50
|
+
async clearHandler() {
|
|
51
|
+
await clear(this.db);
|
|
52
|
+
}
|
|
53
|
+
async deleteHandler(hashes) {
|
|
54
|
+
await delMany(hashes, this.db);
|
|
55
|
+
return hashes.map((_) => true);
|
|
56
|
+
}
|
|
57
|
+
async getHandler(hashes) {
|
|
58
|
+
const result = await getMany(hashes, this.db);
|
|
59
|
+
return result.filter(exists);
|
|
60
|
+
}
|
|
61
|
+
async insertHandler(payloads) {
|
|
62
|
+
const entries = await Promise.all(payloads.map(async (payload) => {
|
|
63
|
+
const hash = await PayloadHasher.hashAsync(payload);
|
|
64
|
+
return [hash, payload];
|
|
65
|
+
}));
|
|
66
|
+
await setMany(entries, this.db);
|
|
67
|
+
const [result] = await this.bindQueryResult({ payloads, schema: ArchivistInsertQuerySchema }, payloads);
|
|
68
|
+
return [result[0]];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=IndexedDbArchivistSimple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedDbArchivistSimple.js","sourceRoot":"","sources":["../../src/IndexedDbArchivistSimple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EAEzB,0BAA0B,EAC1B,0BAA0B,GAG3B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAY,MAAM,YAAY,CAAA;AAE7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAGzE,MAAM,CAAC,MAAM,oCAAoC,GAAyC,wCAAwC,CAAA;AAgBlI,MAAM,OAAO,wBAGX,SAAQ,0BAA+C;IACvD,MAAM,CAAU,aAAa,GAAG,CAAC,oCAAoC,CAAC,CAAA;IAE9D,GAAG,CAAsB;IAEjC;;;;;;OAMG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,wBAAwB,CAAC,aAAa,CAAA;IAC3F,CAAC;IAED,IAAa,OAAO;QAClB,OAAO,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IACvI,CAAC;IACD;;;;;;;;;OASG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,wBAAwB,CAAC,gBAAgB,CAAA;IAC5E,CAAC;IAED,IAAY,EAAE;QACZ,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAA;IACjD,CAAC;IAEQ,KAAK,CAAC,KAAK;QAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACnB,4DAA4D;QAC5D,oDAAoD;QACpD,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrD,CAAC;IAEkB,KAAK,CAAC,UAAU;QACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAkB,IAAI,CAAC,EAAE,CAAC,CAAA;QACtD,OAAO,MAAM,CAAC,GAAG,CAAU,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;IAEkB,KAAK,CAAC,YAAY;QACnC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtB,CAAC;IAEkB,KAAK,CAAC,aAAa,CAAC,MAAgB;QACrD,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAEkB,KAAK,CAAC,UAAU,CAAC,MAAgB;QAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAU,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QACtD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,QAAmB;QAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,QAAQ,CAAC,GAAG,CAA6B,KAAK,EAAE,OAAO,EAAE,EAAE;YACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACnD,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACxB,CAAC,CAAC,CACH,CAAA;QACD,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,QAAQ,CAAC,CAAA;QACvG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AbstractDirectArchivist } from '@xyo-network/abstract-archivist';
|
|
2
|
+
import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
|
|
3
|
+
import { AnyConfigSchema } from '@xyo-network/module';
|
|
4
|
+
export type AbstractIndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
|
|
5
|
+
export declare const AbstractIndexedDbArchivistConfigSchema: AbstractIndexedDbArchivistConfigSchema;
|
|
6
|
+
export type AbstractIndexedDbArchivistConfig = ArchivistConfig<{
|
|
7
|
+
/**
|
|
8
|
+
* The database name
|
|
9
|
+
*/
|
|
10
|
+
dbName?: string;
|
|
11
|
+
schema: AbstractIndexedDbArchivistConfigSchema;
|
|
12
|
+
/**
|
|
13
|
+
* The name of the object store
|
|
14
|
+
*/
|
|
15
|
+
storeName?: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type AbstractIndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<AbstractIndexedDbArchivistConfig>>;
|
|
18
|
+
export declare abstract class AbstractIndexedDbArchivist<TParams extends AbstractIndexedDbArchivistParams = AbstractIndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractDirectArchivist<TParams, TEventData> {
|
|
19
|
+
static configSchemas: "network.xyo.archivist.indexeddb.config"[];
|
|
20
|
+
static defaultDbName: string;
|
|
21
|
+
static defaultStoreName: string;
|
|
22
|
+
get queries(): string[];
|
|
23
|
+
/**
|
|
24
|
+
* The database name.
|
|
25
|
+
*/
|
|
26
|
+
abstract get dbName(): string;
|
|
27
|
+
/**
|
|
28
|
+
* The name of the object store.
|
|
29
|
+
*/
|
|
30
|
+
abstract get storeName(): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=AbstractIndexedDbArchivist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractIndexedDbArchivist.d.ts","sourceRoot":"","sources":["../../src/AbstractIndexedDbArchivist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAGL,eAAe,EAGf,wBAAwB,EACxB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,MAAM,MAAM,sCAAsC,GAAG,wCAAwC,CAAA;AAC7F,eAAO,MAAM,sCAAsC,EAAE,sCAAiF,CAAA;AAEtI,MAAM,MAAM,gCAAgC,GAAG,eAAe,CAAC;IAC7D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,sCAAsC,CAAA;IAC9C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,MAAM,MAAM,gCAAgC,GAAG,eAAe,CAAC,eAAe,CAAC,gCAAgC,CAAC,CAAC,CAAA;AAEjH,8BAAsB,0BAA0B,CAC9C,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,EACnF,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CACtE,SAAQ,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC;IACpD,OAAgB,aAAa,6CAA2C;IACxE,MAAM,CAAC,aAAa,SAAc;IAClC,MAAM,CAAC,gBAAgB,SAAa;IAEpC,IAAa,OAAO,aAEnB;IAED;;OAEG;IACH,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAA;IAE7B;;OAEG;IACH,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAA;CACjC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { AbstractDirectArchivist } from '@xyo-network/abstract-archivist';
|
|
2
1
|
import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
|
|
3
2
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
3
|
import { AnyConfigSchema } from '@xyo-network/module';
|
|
5
4
|
import { Payload } from '@xyo-network/payload-model';
|
|
5
|
+
import { DBSchema } from 'idb';
|
|
6
|
+
import { AbstractIndexedDbArchivist } from './AbstractIndexedDbArchivist';
|
|
6
7
|
export type IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
|
|
7
8
|
export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
|
|
8
9
|
export type IndexedDbArchivistConfig = ArchivistConfig<{
|
|
@@ -17,11 +18,17 @@ export type IndexedDbArchivistConfig = ArchivistConfig<{
|
|
|
17
18
|
storeName?: string;
|
|
18
19
|
}>;
|
|
19
20
|
export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
|
|
20
|
-
export
|
|
21
|
+
export interface IndexedDbArchivistSchemaV1 extends DBSchema {
|
|
22
|
+
archivist: {
|
|
23
|
+
key: string;
|
|
24
|
+
value: Payload;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
type StoreName = keyof Pick<IndexedDbArchivistSchemaV1, 'archivist'>;
|
|
28
|
+
export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractIndexedDbArchivist<TParams, TEventData> {
|
|
29
|
+
static readonly CurrentSchemaVersion = 1;
|
|
21
30
|
static configSchemas: "network.xyo.archivist.indexeddb.config"[];
|
|
22
|
-
|
|
23
|
-
static defaultStoreName: string;
|
|
24
|
-
private _db;
|
|
31
|
+
private db;
|
|
25
32
|
/**
|
|
26
33
|
* The database name. If not supplied via config, it defaults
|
|
27
34
|
* to the module name (not guaranteed to be unique) and if module
|
|
@@ -41,8 +48,7 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
|
|
|
41
48
|
* recommends them for our simple use case of key-value storage):
|
|
42
49
|
* https://www.npmjs.com/package/idb
|
|
43
50
|
*/
|
|
44
|
-
get storeName():
|
|
45
|
-
private get db();
|
|
51
|
+
get storeName(): StoreName;
|
|
46
52
|
start(): Promise<void>;
|
|
47
53
|
protected allHandler(): Promise<Payload[]>;
|
|
48
54
|
protected clearHandler(): Promise<void>;
|
|
@@ -50,4 +56,5 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
|
|
|
50
56
|
protected getHandler(hashes: string[]): Promise<Payload[]>;
|
|
51
57
|
protected insertHandler(payloads: Payload[]): Promise<BoundWitness[]>;
|
|
52
58
|
}
|
|
59
|
+
export {};
|
|
53
60
|
//# sourceMappingURL=IndexedDbArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexedDbArchivist.d.ts","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"IndexedDbArchivist.d.ts","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,eAAe,EAGf,wBAAwB,EACxB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAwB,MAAM,KAAK,CAAA;AAEpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAEzE,MAAM,MAAM,8BAA8B,GAAG,wCAAwC,CAAA;AACrF,eAAO,MAAM,8BAA8B,EAAE,8BAAyE,CAAA;AAEtH,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC;IACrD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,8BAA8B,CAAA;IACtC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CAAA;AAEjG,MAAM,WAAW,0BAA2B,SAAQ,QAAQ;IAC1D,SAAS,EAAE;QACT,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,OAAO,CAAA;KACf,CAAA;CACF;AAED,KAAK,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAA;AAEpE,qBAAa,kBAAkB,CAC7B,OAAO,SAAS,wBAAwB,GAAG,wBAAwB,EACnE,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CACtE,SAAQ,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC;IACvD,MAAM,CAAC,QAAQ,CAAC,oBAAoB,KAAI;IACxC,OAAgB,aAAa,6CAAmC;IAEhE,OAAO,CAAC,EAAE,CAA2E;IAErF;;;;;;OAMG;IACH,IAAI,MAAM,WAET;IAED,IAAa,OAAO,aAEnB;IACD;;;;;;;;;OASG;IACH,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEc,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cASZ,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;cAIhC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAI7B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cASnD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAWzD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAU5E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
|
|
2
|
+
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
3
|
+
import { AnyConfigSchema } from '@xyo-network/module';
|
|
4
|
+
import { Payload } from '@xyo-network/payload-model';
|
|
5
|
+
import { AbstractIndexedDbArchivist } from './AbstractIndexedDbArchivist';
|
|
6
|
+
export type IndexedDbArchivistSimpleConfigSchema = 'network.xyo.archivist.indexeddb.config';
|
|
7
|
+
export declare const IndexedDbArchivistSimpleConfigSchema: IndexedDbArchivistSimpleConfigSchema;
|
|
8
|
+
export type IndexedDbArchivistSimpleConfig = ArchivistConfig<{
|
|
9
|
+
/**
|
|
10
|
+
* The database name
|
|
11
|
+
*/
|
|
12
|
+
dbName?: string;
|
|
13
|
+
schema: IndexedDbArchivistSimpleConfigSchema;
|
|
14
|
+
/**
|
|
15
|
+
* The name of the object store
|
|
16
|
+
*/
|
|
17
|
+
storeName?: string;
|
|
18
|
+
}>;
|
|
19
|
+
export type IndexedDbArchivistSimpleParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistSimpleConfig>>;
|
|
20
|
+
export declare class IndexedDbArchivistSimple<TParams extends IndexedDbArchivistSimpleParams = IndexedDbArchivistSimpleParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractIndexedDbArchivist<TParams, TEventData> {
|
|
21
|
+
static configSchemas: "network.xyo.archivist.indexeddb.config"[];
|
|
22
|
+
private _db;
|
|
23
|
+
/**
|
|
24
|
+
* The database name. If not supplied via config, it defaults
|
|
25
|
+
* to the module name (not guaranteed to be unique) and if module
|
|
26
|
+
* name is not supplied, it defaults to `archivist`. This behavior
|
|
27
|
+
* biases towards a single, isolated DB per archivist which seems to
|
|
28
|
+
* make the most sense for 99% of use cases.
|
|
29
|
+
*/
|
|
30
|
+
get dbName(): string;
|
|
31
|
+
get queries(): string[];
|
|
32
|
+
/**
|
|
33
|
+
* The name of the object store. If not supplied via config, it defaults
|
|
34
|
+
* to `payloads`. The limitation of the current IndexedDB wrapper we're
|
|
35
|
+
* using is that it only supports a single object store per DB. See here:
|
|
36
|
+
* https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
|
|
37
|
+
* If this becomes a problem or we need migrations/transactions, we can
|
|
38
|
+
* move to this more-flexible library, which they recommend (and who
|
|
39
|
+
* recommends them for our simple use case of key-value storage):
|
|
40
|
+
* https://www.npmjs.com/package/idb
|
|
41
|
+
*/
|
|
42
|
+
get storeName(): string;
|
|
43
|
+
private get db();
|
|
44
|
+
start(): Promise<void>;
|
|
45
|
+
protected allHandler(): Promise<Payload[]>;
|
|
46
|
+
protected clearHandler(): Promise<void>;
|
|
47
|
+
protected deleteHandler(hashes: string[]): Promise<boolean[]>;
|
|
48
|
+
protected getHandler(hashes: string[]): Promise<Payload[]>;
|
|
49
|
+
protected insertHandler(payloads: Payload[]): Promise<BoundWitness[]>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=IndexedDbArchivistSimple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedDbArchivistSimple.d.ts","sourceRoot":"","sources":["../../src/IndexedDbArchivistSimple.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,eAAe,EAGf,wBAAwB,EACxB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAEzE,MAAM,MAAM,oCAAoC,GAAG,wCAAwC,CAAA;AAC3F,eAAO,MAAM,oCAAoC,EAAE,oCAA+E,CAAA;AAElI,MAAM,MAAM,8BAA8B,GAAG,eAAe,CAAC;IAC3D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,oCAAoC,CAAA;IAC5C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,MAAM,MAAM,8BAA8B,GAAG,eAAe,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC,CAAA;AAE7G,qBAAa,wBAAwB,CACnC,OAAO,SAAS,8BAA8B,GAAG,8BAA8B,EAC/E,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CACtE,SAAQ,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC;IACvD,OAAgB,aAAa,6CAAyC;IAEtE,OAAO,CAAC,GAAG,CAAsB;IAEjC;;;;;;OAMG;IACH,IAAI,MAAM,WAET;IAED,IAAa,OAAO,aAEnB;IACD;;;;;;;;;OASG;IACH,IAAI,SAAS,WAEZ;IAED,OAAO,KAAK,EAAE,GAEb;IAEc,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAOZ,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;cAKhC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAI7B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAKnD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAKzD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAW5E"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,4BAA4B,CAAA"}
|
package/package.json
CHANGED
|
@@ -11,23 +11,24 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@xylabs/assert": "^2.9.3",
|
|
14
|
-
"@
|
|
15
|
-
"@xyo-network/archivist
|
|
16
|
-
"@xyo-network/
|
|
17
|
-
"@xyo-network/
|
|
18
|
-
"@xyo-network/
|
|
19
|
-
"@xyo-network/
|
|
20
|
-
"@xyo-network/payload-
|
|
21
|
-
"@xyo-network/
|
|
14
|
+
"@xylabs/exists": "^2.9.3",
|
|
15
|
+
"@xyo-network/abstract-archivist": "^2.65.4",
|
|
16
|
+
"@xyo-network/archivist-model": "^2.65.4",
|
|
17
|
+
"@xyo-network/boundwitness-model": "^2.65.4",
|
|
18
|
+
"@xyo-network/core": "^2.65.4",
|
|
19
|
+
"@xyo-network/module": "^2.65.4",
|
|
20
|
+
"@xyo-network/payload-model": "^2.65.4",
|
|
21
|
+
"@xyo-network/payload-wrapper": "^2.65.4",
|
|
22
|
+
"@xyo-network/promise": "^2.65.4",
|
|
23
|
+
"idb": "^7.1.1",
|
|
22
24
|
"idb-keyval": "^6.2.1"
|
|
23
25
|
},
|
|
24
26
|
"devDependencies": {
|
|
25
|
-
"@xylabs/
|
|
26
|
-
"@xylabs/
|
|
27
|
-
"@
|
|
28
|
-
"@xyo-network/
|
|
29
|
-
"
|
|
30
|
-
"fake-indexeddb": "^4.0.1",
|
|
27
|
+
"@xylabs/ts-scripts-yarn3": "^2.18.11",
|
|
28
|
+
"@xylabs/tsconfig": "^2.18.11",
|
|
29
|
+
"@xyo-network/boundwitness-wrapper": "^2.65.4",
|
|
30
|
+
"@xyo-network/id-payload-plugin": "^2.65.4",
|
|
31
|
+
"fake-indexeddb": "^4.0.2",
|
|
31
32
|
"typescript": "^5.1.6"
|
|
32
33
|
},
|
|
33
34
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
@@ -63,5 +64,5 @@
|
|
|
63
64
|
},
|
|
64
65
|
"sideEffects": false,
|
|
65
66
|
"types": "dist/types/index.d.ts",
|
|
66
|
-
"version": "2.65.
|
|
67
|
+
"version": "2.65.4"
|
|
67
68
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { AbstractDirectArchivist } from '@xyo-network/abstract-archivist'
|
|
2
|
+
import {
|
|
3
|
+
ArchivistAllQuerySchema,
|
|
4
|
+
ArchivistClearQuerySchema,
|
|
5
|
+
ArchivistConfig,
|
|
6
|
+
ArchivistDeleteQuerySchema,
|
|
7
|
+
ArchivistInsertQuerySchema,
|
|
8
|
+
ArchivistModuleEventData,
|
|
9
|
+
ArchivistParams,
|
|
10
|
+
} from '@xyo-network/archivist-model'
|
|
11
|
+
import { AnyConfigSchema } from '@xyo-network/module'
|
|
12
|
+
|
|
13
|
+
export type AbstractIndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config'
|
|
14
|
+
export const AbstractIndexedDbArchivistConfigSchema: AbstractIndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config'
|
|
15
|
+
|
|
16
|
+
export type AbstractIndexedDbArchivistConfig = ArchivistConfig<{
|
|
17
|
+
/**
|
|
18
|
+
* The database name
|
|
19
|
+
*/
|
|
20
|
+
dbName?: string
|
|
21
|
+
schema: AbstractIndexedDbArchivistConfigSchema
|
|
22
|
+
/**
|
|
23
|
+
* The name of the object store
|
|
24
|
+
*/
|
|
25
|
+
storeName?: string
|
|
26
|
+
}>
|
|
27
|
+
|
|
28
|
+
export type AbstractIndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<AbstractIndexedDbArchivistConfig>>
|
|
29
|
+
|
|
30
|
+
export abstract class AbstractIndexedDbArchivist<
|
|
31
|
+
TParams extends AbstractIndexedDbArchivistParams = AbstractIndexedDbArchivistParams,
|
|
32
|
+
TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,
|
|
33
|
+
> extends AbstractDirectArchivist<TParams, TEventData> {
|
|
34
|
+
static override configSchemas = [AbstractIndexedDbArchivistConfigSchema]
|
|
35
|
+
static defaultDbName = 'archivist'
|
|
36
|
+
static defaultStoreName = 'payloads'
|
|
37
|
+
|
|
38
|
+
override get queries() {
|
|
39
|
+
return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The database name.
|
|
44
|
+
*/
|
|
45
|
+
abstract get dbName(): string
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The name of the object store.
|
|
49
|
+
*/
|
|
50
|
+
abstract get storeName(): string
|
|
51
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { AbstractDirectArchivist } from '@xyo-network/abstract-archivist'
|
|
1
|
+
import { exists } from '@xylabs/exists'
|
|
3
2
|
import {
|
|
4
3
|
ArchivistAllQuerySchema,
|
|
5
4
|
ArchivistClearQuerySchema,
|
|
@@ -11,9 +10,11 @@ import {
|
|
|
11
10
|
} from '@xyo-network/archivist-model'
|
|
12
11
|
import { BoundWitness } from '@xyo-network/boundwitness-model'
|
|
13
12
|
import { PayloadHasher } from '@xyo-network/core'
|
|
14
|
-
import { AnyConfigSchema
|
|
13
|
+
import { AnyConfigSchema } from '@xyo-network/module'
|
|
15
14
|
import { Payload } from '@xyo-network/payload-model'
|
|
16
|
-
import {
|
|
15
|
+
import { DBSchema, IDBPDatabase, openDB } from 'idb'
|
|
16
|
+
|
|
17
|
+
import { AbstractIndexedDbArchivist } from './AbstractIndexedDbArchivist'
|
|
17
18
|
|
|
18
19
|
export type IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config'
|
|
19
20
|
export const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config'
|
|
@@ -32,16 +33,23 @@ export type IndexedDbArchivistConfig = ArchivistConfig<{
|
|
|
32
33
|
|
|
33
34
|
export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
export interface IndexedDbArchivistSchemaV1 extends DBSchema {
|
|
37
|
+
archivist: {
|
|
38
|
+
key: string
|
|
39
|
+
value: Payload
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type StoreName = keyof Pick<IndexedDbArchivistSchemaV1, 'archivist'>
|
|
44
|
+
|
|
36
45
|
export class IndexedDbArchivist<
|
|
37
46
|
TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams,
|
|
38
47
|
TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,
|
|
39
|
-
> extends
|
|
48
|
+
> extends AbstractIndexedDbArchivist<TParams, TEventData> {
|
|
49
|
+
static readonly CurrentSchemaVersion = 1
|
|
40
50
|
static override configSchemas = [IndexedDbArchivistConfigSchema]
|
|
41
|
-
static defaultDbName = 'archivist'
|
|
42
|
-
static defaultStoreName = 'payloads'
|
|
43
51
|
|
|
44
|
-
private
|
|
52
|
+
private db: Promise<IDBPDatabase<IndexedDbArchivistSchemaV1>> | undefined = undefined
|
|
45
53
|
|
|
46
54
|
/**
|
|
47
55
|
* The database name. If not supplied via config, it defaults
|
|
@@ -67,48 +75,54 @@ export class IndexedDbArchivist<
|
|
|
67
75
|
* recommends them for our simple use case of key-value storage):
|
|
68
76
|
* https://www.npmjs.com/package/idb
|
|
69
77
|
*/
|
|
70
|
-
get storeName() {
|
|
71
|
-
return this.config?.storeName ?? IndexedDbArchivist.defaultStoreName
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private get db(): UseStore {
|
|
75
|
-
return assertEx(this._db, 'DB not initialized')
|
|
78
|
+
get storeName(): StoreName {
|
|
79
|
+
return (this.config?.storeName ?? IndexedDbArchivist.defaultStoreName) as StoreName
|
|
76
80
|
}
|
|
77
81
|
|
|
78
82
|
override async start(): Promise<void> {
|
|
79
83
|
await super.start()
|
|
80
84
|
// NOTE: We could defer this creation to first access but we
|
|
81
85
|
// want to fail fast here in case something is wrong
|
|
82
|
-
this.
|
|
86
|
+
this.db = openDB<IndexedDbArchivistSchemaV1>(this.dbName, IndexedDbArchivist.CurrentSchemaVersion, {
|
|
87
|
+
upgrade: (db) => db.createObjectStore(this.storeName),
|
|
88
|
+
})
|
|
83
89
|
}
|
|
84
90
|
|
|
85
91
|
protected override async allHandler(): Promise<Payload[]> {
|
|
86
|
-
|
|
87
|
-
return result.map<Payload>(([_hash, payload]) => payload)
|
|
92
|
+
return (await (await this.db)?.getAll(this.storeName)) ?? []
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
protected override async clearHandler(): Promise<void> {
|
|
91
|
-
await
|
|
96
|
+
await (await this.db)?.clear(this.storeName)
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
protected override async deleteHandler(hashes: string[]): Promise<boolean[]> {
|
|
95
|
-
await
|
|
100
|
+
await Promise.all(
|
|
101
|
+
hashes.map(async (hash) => {
|
|
102
|
+
await (await this.db)?.delete(this.storeName, hash)
|
|
103
|
+
}),
|
|
104
|
+
)
|
|
96
105
|
return hashes.map((_) => true)
|
|
97
106
|
}
|
|
98
107
|
|
|
99
108
|
protected override async getHandler(hashes: string[]): Promise<Payload[]> {
|
|
100
|
-
const
|
|
101
|
-
|
|
109
|
+
const results = (
|
|
110
|
+
await Promise.all(
|
|
111
|
+
hashes.map(async (hash) => {
|
|
112
|
+
return await (await this.db)?.get(this.storeName, hash)
|
|
113
|
+
}),
|
|
114
|
+
)
|
|
115
|
+
).filter(exists)
|
|
116
|
+
return results
|
|
102
117
|
}
|
|
103
118
|
|
|
104
119
|
protected async insertHandler(payloads: Payload[]): Promise<BoundWitness[]> {
|
|
105
|
-
|
|
106
|
-
payloads.map
|
|
120
|
+
await Promise.all(
|
|
121
|
+
payloads.map(async (payload) => {
|
|
107
122
|
const hash = await PayloadHasher.hashAsync(payload)
|
|
108
|
-
|
|
123
|
+
await (await this.db)?.put(this.storeName, payload, hash)
|
|
109
124
|
}),
|
|
110
125
|
)
|
|
111
|
-
await setMany(entries, this.db)
|
|
112
126
|
const [result] = await this.bindQueryResult({ payloads, schema: ArchivistInsertQuerySchema }, payloads)
|
|
113
127
|
return [result[0]]
|
|
114
128
|
}
|