@xyo-network/archivist-indexeddb 2.60.3 → 2.60.5

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.
@@ -1,28 +1,59 @@
1
+ var IndexedDbArchivist_1;
1
2
  import { __decorate } from "tslib";
3
+ import { assertEx } from '@xylabs/assert';
2
4
  import { AbstractArchivist } from '@xyo-network/abstract-archivist';
3
5
  import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, } from '@xyo-network/archivist-model';
4
6
  import { PayloadHasher } from '@xyo-network/core';
5
7
  import { creatableModule } from '@xyo-network/module';
6
- import { clear, delMany, entries, getMany, setMany } from 'idb-keyval';
7
- export const IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.storage';
8
- let IndexedDbArchivist = class IndexedDbArchivist extends AbstractArchivist {
8
+ import { clear, createStore, delMany, entries, getMany, setMany } from 'idb-keyval';
9
+ export const IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.indexeddb';
10
+ let IndexedDbArchivist = IndexedDbArchivist_1 = class IndexedDbArchivist extends AbstractArchivist {
9
11
  static configSchema = IndexedDbArchivistConfigSchema;
12
+ static defaultDbName = 'archivist';
13
+ static defaultStoreName = 'payloads';
14
+ _db;
15
+ /**
16
+ * The database name. If not supplied via config, it defaults
17
+ * to the module name (not guaranteed to be unique) and if module
18
+ * name is not supplied, it defaults to `archivist`. This behavior
19
+ * biases towards a single, isolated DB per archivist which seems to
20
+ * make the most sense for 99% of use cases.
21
+ */
22
+ get dbName() {
23
+ return this.config?.dbName ?? this.config?.name ?? IndexedDbArchivist_1.defaultDbName;
24
+ }
10
25
  get queries() {
11
26
  return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries];
12
27
  }
28
+ /**
29
+ * The name of the object store. If not supplied via config, it defaults
30
+ * to `payloads`. The limitation of the current IndexedDB wrapper we're
31
+ * using is that it only supports a single object store per DB. See here:
32
+ * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
33
+ * If this becomes a problem or we need migrations/transactions, we can
34
+ * move to this more-flexible library, which they recommend (and who
35
+ * recommends them for our simple use case of key-value storage):
36
+ * https://www.npmjs.com/package/idb
37
+ */
38
+ get storeName() {
39
+ return this.config?.storeName ?? IndexedDbArchivist_1.defaultStoreName;
40
+ }
41
+ get db() {
42
+ return assertEx(this._db, 'DB not initialized');
43
+ }
13
44
  async all() {
14
- const result = await entries(this.params.indexedDB ?? undefined);
45
+ const result = await entries(this.db);
15
46
  return result.map(([_hash, payload]) => payload);
16
47
  }
17
48
  async clear() {
18
- await clear(this.params.indexedDB ?? undefined);
49
+ await clear(this.db);
19
50
  }
20
51
  async delete(hashes) {
21
- await delMany(hashes, this.params.indexedDB ?? undefined);
52
+ await delMany(hashes, this.db);
22
53
  return hashes.map((_) => true);
23
54
  }
24
55
  async get(hashes) {
25
- const result = await getMany(hashes, this.params.indexedDB ?? undefined);
56
+ const result = await getMany(hashes, this.db);
26
57
  return result;
27
58
  }
28
59
  async insert(payloads) {
@@ -30,12 +61,18 @@ let IndexedDbArchivist = class IndexedDbArchivist extends AbstractArchivist {
30
61
  const hash = await PayloadHasher.hashAsync(payload);
31
62
  return [hash, payload];
32
63
  }));
33
- await setMany(entries, this.params.indexedDB ?? undefined);
64
+ await setMany(entries, this.db);
34
65
  const result = await this.bindQueryResult({ payloads, schema: ArchivistInsertQuerySchema }, payloads);
35
66
  return [result[0]];
36
67
  }
68
+ async start() {
69
+ await super.start();
70
+ // NOTE: We could defer this creation to first access but we
71
+ // want to fail fast here in case something is wrong
72
+ this._db = createStore(this.dbName, this.storeName);
73
+ }
37
74
  };
38
- IndexedDbArchivist = __decorate([
75
+ IndexedDbArchivist = IndexedDbArchivist_1 = __decorate([
39
76
  creatableModule()
40
77
  ], IndexedDbArchivist);
41
78
  export { IndexedDbArchivist };
@@ -1 +1 @@
1
- {"version":3,"file":"IndexedDbArchivist.js","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,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,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAY,MAAM,YAAY,CAAA;AAGhF,MAAM,CAAC,MAAM,8BAA8B,GAAmC,6CAA6C,CAAA;AAiBpH,IAAM,kBAAkB,GAAxB,MAAM,kBAGX,SAAQ,iBAAsC;IAC9C,MAAM,CAAU,YAAY,GAAG,8BAA8B,CAAA;IAE7D,IAAa,OAAO;QAClB,OAAO,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IACvI,CAAC;IAEQ,KAAK,CAAC,GAAG;QAChB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAkB,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;QACjF,OAAO,MAAM,CAAC,GAAG,CAAU,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;IAEQ,KAAK,CAAC,KAAK;QAClB,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;IACjD,CAAC;IAEQ,KAAK,CAAC,MAAM,CAAC,MAAgB;QACpC,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;QACzD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAEQ,KAAK,CAAC,GAAG,CAAC,MAAgB;QACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAU,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;QACjF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAmB;QAC9B,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,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,QAAQ,CAAC,CAAA;QACrG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;;AAvCU,kBAAkB;IAD9B,eAAe,EAAE;GACL,kBAAkB,CAwC9B;SAxCY,kBAAkB"}
1
+ {"version":3,"file":"IndexedDbArchivist.js","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"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"}
@@ -3,25 +3,51 @@ import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo
3
3
  import { BoundWitness } from '@xyo-network/boundwitness-model';
4
4
  import { AnyConfigSchema } from '@xyo-network/module';
5
5
  import { Payload } from '@xyo-network/payload-model';
6
- import { UseStore } from 'idb-keyval';
7
- export type IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.storage';
6
+ export type IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.indexeddb';
8
7
  export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
9
8
  export type IndexedDbArchivistConfig = ArchivistConfig<{
10
- maxEntries?: number;
11
- maxEntrySize?: number;
12
- namespace?: string;
9
+ /**
10
+ * The database name
11
+ */
12
+ dbName?: string;
13
13
  schema: IndexedDbArchivistConfigSchema;
14
+ /**
15
+ * The name of the object store
16
+ */
17
+ storeName?: string;
14
18
  }>;
15
- export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>, {
16
- indexedDB?: UseStore;
17
- }>;
19
+ export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
18
20
  export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> {
19
- static configSchema: "network.xyo.module.config.archivist.storage";
21
+ static configSchema: "network.xyo.module.config.archivist.indexeddb";
22
+ static defaultDbName: string;
23
+ static defaultStoreName: string;
24
+ private _db;
25
+ /**
26
+ * The database name. If not supplied via config, it defaults
27
+ * to the module name (not guaranteed to be unique) and if module
28
+ * name is not supplied, it defaults to `archivist`. This behavior
29
+ * biases towards a single, isolated DB per archivist which seems to
30
+ * make the most sense for 99% of use cases.
31
+ */
32
+ get dbName(): string;
20
33
  get queries(): string[];
34
+ /**
35
+ * The name of the object store. If not supplied via config, it defaults
36
+ * to `payloads`. The limitation of the current IndexedDB wrapper we're
37
+ * using is that it only supports a single object store per DB. See here:
38
+ * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
39
+ * If this becomes a problem or we need migrations/transactions, we can
40
+ * move to this more-flexible library, which they recommend (and who
41
+ * recommends them for our simple use case of key-value storage):
42
+ * https://www.npmjs.com/package/idb
43
+ */
44
+ get storeName(): string;
45
+ private get db();
21
46
  all(): Promise<Payload[]>;
22
47
  clear(): Promise<void>;
23
48
  delete(hashes: string[]): Promise<boolean[]>;
24
49
  get(hashes: string[]): Promise<Payload[]>;
25
50
  insert(payloads: Payload[]): Promise<BoundWitness[]>;
51
+ start(): Promise<void>;
26
52
  }
27
53
  //# sourceMappingURL=IndexedDbArchivist.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IndexedDbArchivist.d.ts","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,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;AACpD,OAAO,EAA6C,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEhF,MAAM,MAAM,8BAA8B,GAAG,6CAA6C,CAAA;AAC1F,eAAO,MAAM,8BAA8B,EAAE,8BAA8E,CAAA;AAE3H,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,8BAA8B,CAAA;CACvC,CAAC,CAAA;AAEF,MAAM,MAAM,wBAAwB,GAAG,eAAe,CACpD,eAAe,CAAC,wBAAwB,CAAC,EACzC;IACE,SAAS,CAAC,EAAE,QAAQ,CAAA;CACrB,CACF,CAAA;AAED,qBACa,kBAAkB,CAC7B,OAAO,SAAS,wBAAwB,GAAG,wBAAwB,EACnE,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CACtE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC;IAC9C,OAAgB,YAAY,gDAAiC;IAE7D,IAAa,OAAO,aAEnB;IAEc,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAK5C,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAKlD,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAW3D"}
1
+ {"version":3,"file":"IndexedDbArchivist.d.ts","sourceRoot":"","sources":["../../src/IndexedDbArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,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,+CAA+C,CAAA;AAC5F,eAAO,MAAM,8BAA8B,EAAE,8BAAgF,CAAA;AAE7H,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,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC;IAC9C,OAAgB,YAAY,kDAAiC;IAC7D,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,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAK5C,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAKlD,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAY3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAMtC"}
package/package.json CHANGED
@@ -10,23 +10,24 @@
10
10
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xyo-network/abstract-archivist": "^2.60.3",
14
- "@xyo-network/archivist-model": "^2.60.3",
15
- "@xyo-network/boundwitness-model": "^2.60.3",
16
- "@xyo-network/core": "^2.60.3",
17
- "@xyo-network/module": "^2.60.3",
18
- "@xyo-network/payload-model": "^2.60.3",
19
- "@xyo-network/payload-wrapper": "^2.60.3",
20
- "@xyo-network/promise": "^2.60.3",
13
+ "@xylabs/assert": "^2.9.1",
14
+ "@xyo-network/abstract-archivist": "^2.60.5",
15
+ "@xyo-network/archivist-model": "^2.60.5",
16
+ "@xyo-network/boundwitness-model": "^2.60.5",
17
+ "@xyo-network/core": "^2.60.5",
18
+ "@xyo-network/module": "^2.60.5",
19
+ "@xyo-network/payload-model": "^2.60.5",
20
+ "@xyo-network/payload-wrapper": "^2.60.5",
21
+ "@xyo-network/promise": "^2.60.5",
21
22
  "idb-keyval": "^6.2.1"
22
23
  },
23
24
  "devDependencies": {
24
- "@xylabs/delay": "^2.8.1",
25
+ "@xylabs/delay": "^2.9.1",
25
26
  "@xylabs/ts-scripts-yarn3": "^2.17.13",
26
27
  "@xylabs/tsconfig": "^2.17.13",
27
- "@xyo-network/archivist-wrapper": "^2.60.3",
28
- "@xyo-network/boundwitness-wrapper": "^2.60.3",
29
- "@xyo-network/plugins": "^2.60.3",
28
+ "@xyo-network/archivist-wrapper": "^2.60.5",
29
+ "@xyo-network/boundwitness-wrapper": "^2.60.5",
30
+ "@xyo-network/plugins": "^2.60.5",
30
31
  "fake-indexeddb": "^4.0.1",
31
32
  "typescript": "^5.1.3"
32
33
  },
@@ -63,5 +64,5 @@
63
64
  },
64
65
  "sideEffects": false,
65
66
  "types": "dist/types/index.d.ts",
66
- "version": "2.60.3"
67
+ "version": "2.60.5"
67
68
  }
@@ -1,3 +1,4 @@
1
+ import { assertEx } from '@xylabs/assert'
1
2
  import { AbstractArchivist } from '@xyo-network/abstract-archivist'
2
3
  import {
3
4
  ArchivistAllQuerySchema,
@@ -12,24 +13,24 @@ import { BoundWitness } from '@xyo-network/boundwitness-model'
12
13
  import { PayloadHasher } from '@xyo-network/core'
13
14
  import { AnyConfigSchema, creatableModule } from '@xyo-network/module'
14
15
  import { Payload } from '@xyo-network/payload-model'
15
- import { clear, delMany, entries, getMany, setMany, UseStore } from 'idb-keyval'
16
+ import { clear, createStore, delMany, entries, getMany, setMany, UseStore } from 'idb-keyval'
16
17
 
17
- export type IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.storage'
18
- export const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.storage'
18
+ export type IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.indexeddb'
19
+ export const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema = 'network.xyo.module.config.archivist.indexeddb'
19
20
 
20
21
  export type IndexedDbArchivistConfig = ArchivistConfig<{
21
- maxEntries?: number
22
- maxEntrySize?: number
23
- namespace?: string
22
+ /**
23
+ * The database name
24
+ */
25
+ dbName?: string
24
26
  schema: IndexedDbArchivistConfigSchema
27
+ /**
28
+ * The name of the object store
29
+ */
30
+ storeName?: string
25
31
  }>
26
32
 
27
- export type IndexedDbArchivistParams = ArchivistParams<
28
- AnyConfigSchema<IndexedDbArchivistConfig>,
29
- {
30
- indexedDB?: UseStore
31
- }
32
- >
33
+ export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>
33
34
 
34
35
  @creatableModule()
35
36
  export class IndexedDbArchivist<
@@ -37,27 +38,59 @@ export class IndexedDbArchivist<
37
38
  TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,
38
39
  > extends AbstractArchivist<TParams, TEventData> {
39
40
  static override configSchema = IndexedDbArchivistConfigSchema
41
+ static defaultDbName = 'archivist'
42
+ static defaultStoreName = 'payloads'
43
+
44
+ private _db: UseStore | undefined
45
+
46
+ /**
47
+ * The database name. If not supplied via config, it defaults
48
+ * to the module name (not guaranteed to be unique) and if module
49
+ * name is not supplied, it defaults to `archivist`. This behavior
50
+ * biases towards a single, isolated DB per archivist which seems to
51
+ * make the most sense for 99% of use cases.
52
+ */
53
+ get dbName() {
54
+ return this.config?.dbName ?? this.config?.name ?? IndexedDbArchivist.defaultDbName
55
+ }
40
56
 
41
57
  override get queries() {
42
58
  return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries]
43
59
  }
60
+ /**
61
+ * The name of the object store. If not supplied via config, it defaults
62
+ * to `payloads`. The limitation of the current IndexedDB wrapper we're
63
+ * using is that it only supports a single object store per DB. See here:
64
+ * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
65
+ * If this becomes a problem or we need migrations/transactions, we can
66
+ * move to this more-flexible library, which they recommend (and who
67
+ * recommends them for our simple use case of key-value storage):
68
+ * https://www.npmjs.com/package/idb
69
+ */
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')
76
+ }
44
77
 
45
78
  override async all(): Promise<Payload[]> {
46
- const result = await entries<string, Payload>(this.params.indexedDB ?? undefined)
79
+ const result = await entries<string, Payload>(this.db)
47
80
  return result.map<Payload>(([_hash, payload]) => payload)
48
81
  }
49
82
 
50
83
  override async clear(): Promise<void> {
51
- await clear(this.params.indexedDB ?? undefined)
84
+ await clear(this.db)
52
85
  }
53
86
 
54
87
  override async delete(hashes: string[]): Promise<boolean[]> {
55
- await delMany(hashes, this.params.indexedDB ?? undefined)
88
+ await delMany(hashes, this.db)
56
89
  return hashes.map((_) => true)
57
90
  }
58
91
 
59
92
  override async get(hashes: string[]): Promise<Payload[]> {
60
- const result = await getMany<Payload>(hashes, this.params.indexedDB ?? undefined)
93
+ const result = await getMany<Payload>(hashes, this.db)
61
94
  return result
62
95
  }
63
96
 
@@ -68,8 +101,15 @@ export class IndexedDbArchivist<
68
101
  return [hash, payload]
69
102
  }),
70
103
  )
71
- await setMany(entries, this.params.indexedDB ?? undefined)
104
+ await setMany(entries, this.db)
72
105
  const result = await this.bindQueryResult({ payloads, schema: ArchivistInsertQuerySchema }, payloads)
73
106
  return [result[0]]
74
107
  }
108
+
109
+ override async start(): Promise<void> {
110
+ await super.start()
111
+ // NOTE: We could defer this creation to first access but we
112
+ // want to fail fast here in case something is wrong
113
+ this._db = createStore(this.dbName, this.storeName)
114
+ }
75
115
  }