@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.
@@ -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
- var IndexedDbArchivist_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 { creatableModule } from '@xyo-network/module';
8
- import { clear, createStore, delMany, entries, getMany, setMany } from 'idb-keyval';
4
+ import { openDB } from 'idb';
5
+ import { AbstractIndexedDbArchivist } from './AbstractIndexedDbArchivist';
9
6
  export const IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
10
- export let IndexedDbArchivist = class IndexedDbArchivist extends AbstractDirectArchivist {
11
- static { IndexedDbArchivist_1 = this; }
7
+ export class IndexedDbArchivist extends AbstractIndexedDbArchivist {
8
+ static CurrentSchemaVersion = 1;
12
9
  static configSchemas = [IndexedDbArchivistConfigSchema];
13
- static defaultDbName = 'archivist';
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 ?? IndexedDbArchivist_1.defaultDbName;
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 ?? IndexedDbArchivist_1.defaultStoreName;
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._db = createStore(this.dbName, this.storeName);
41
+ this.db = openDB(this.dbName, IndexedDbArchivist.CurrentSchemaVersion, {
42
+ upgrade: (db) => db.createObjectStore(this.storeName),
43
+ });
50
44
  }
51
45
  async allHandler() {
52
- const result = await entries(this.db);
53
- return result.map(([_hash, payload]) => payload);
46
+ return (await (await this.db)?.getAll(this.storeName)) ?? [];
54
47
  }
55
48
  async clearHandler() {
56
- await clear(this.db);
49
+ await (await this.db)?.clear(this.storeName);
57
50
  }
58
51
  async deleteHandler(hashes) {
59
- await delMany(hashes, this.db);
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 result = await getMany(hashes, this.db);
64
- return result;
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
- const entries = await Promise.all(payloads.map(async (payload) => {
64
+ await Promise.all(payloads.map(async (payload) => {
68
65
  const hash = await PayloadHasher.hashAsync(payload);
69
- return [hash, payload];
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":";;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EAEzB,0BAA0B,EAC1B,0BAA0B,GAG3B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAmB,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEtE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAY,MAAM,YAAY,CAAA;AAG7F,MAAM,CAAC,MAAM,8BAA8B,GAAmC,wCAAwC,CAAA;AAiB/G,WAAM,kBAAkB,GAAxB,MAAM,kBAGX,SAAQ,uBAA4C;;IACpD,MAAM,CAAU,aAAa,GAAG,CAAC,8BAA8B,CAAC,CAAA;IAChE,MAAM,CAAC,aAAa,GAAG,WAAW,CAAA;IAClC,MAAM,CAAC,gBAAgB,GAAG,UAAU,CAAA;IAE5B,GAAG,CAAsB;IAEjC;;;;;;OAMG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,oBAAkB,CAAC,aAAa,CAAA;IACrF,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,oBAAkB,CAAC,gBAAgB,CAAA;IACtE,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,CAAA;IACf,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;;AA9EU,kBAAkB;IAD9B,eAAe,EAAE;GACL,kBAAkB,CA+E9B"}
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":"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"}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './IndexedDbArchivist';
2
+ export * from './IndexedDbArchivistSimple';
2
3
  //# sourceMappingURL=index.js.map
@@ -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 declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractDirectArchivist<TParams, TEventData> {
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
- static defaultDbName: string;
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(): string;
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,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAGL,eAAe,EAGf,wBAAwB,EACxB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,eAAe,EAAmB,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,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,qBACa,kBAAkB,CAC7B,OAAO,SAAS,wBAAwB,GAAG,wBAAwB,EACnE,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CACtE,SAAQ,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC;IACpD,OAAgB,aAAa,6CAAmC;IAChE,MAAM,CAAC,aAAa,SAAc;IAClC,MAAM,CAAC,gBAAgB,SAAa;IAEpC,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"}
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"}
@@ -1,2 +1,3 @@
1
1
  export * from './IndexedDbArchivist';
2
+ export * from './IndexedDbArchivistSimple';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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
- "@xyo-network/abstract-archivist": "^2.65.2",
15
- "@xyo-network/archivist-model": "^2.65.2",
16
- "@xyo-network/boundwitness-model": "^2.65.2",
17
- "@xyo-network/core": "^2.65.2",
18
- "@xyo-network/module": "^2.65.2",
19
- "@xyo-network/payload-model": "^2.65.2",
20
- "@xyo-network/payload-wrapper": "^2.65.2",
21
- "@xyo-network/promise": "^2.65.2",
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/delay": "^2.9.3",
26
- "@xylabs/ts-scripts-yarn3": "^2.18.10",
27
- "@xylabs/tsconfig": "^2.18.10",
28
- "@xyo-network/boundwitness-wrapper": "^2.65.2",
29
- "@xyo-network/plugins": "^2.65.2",
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.2"
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 { assertEx } from '@xylabs/assert'
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, creatableModule } from '@xyo-network/module'
13
+ import { AnyConfigSchema } from '@xyo-network/module'
15
14
  import { Payload } from '@xyo-network/payload-model'
16
- import { clear, createStore, delMany, entries, getMany, setMany, UseStore } from 'idb-keyval'
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
- @creatableModule()
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 AbstractDirectArchivist<TParams, TEventData> {
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 _db: UseStore | undefined
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._db = createStore(this.dbName, this.storeName)
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
- const result = await entries<string, Payload>(this.db)
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 clear(this.db)
96
+ await (await this.db)?.clear(this.storeName)
92
97
  }
93
98
 
94
99
  protected override async deleteHandler(hashes: string[]): Promise<boolean[]> {
95
- await delMany(hashes, this.db)
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 result = await getMany<Payload>(hashes, this.db)
101
- return result
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
- const entries = await Promise.all(
106
- payloads.map<Promise<[string, Payload]>>(async (payload) => {
120
+ await Promise.all(
121
+ payloads.map(async (payload) => {
107
122
  const hash = await PayloadHasher.hashAsync(payload)
108
- return [hash, payload]
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
  }