@xyo-network/archivist-indexeddb 2.86.0 → 2.87.0-rc.1

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.
Files changed (85) hide show
  1. package/dist/browser/{IndexedDbArchivist.d.cts → Archivist.d.cts} +17 -24
  2. package/dist/browser/Archivist.d.cts.map +1 -0
  3. package/dist/browser/{IndexedDbArchivist.d.ts → Archivist.d.mts} +17 -24
  4. package/dist/browser/Archivist.d.mts.map +1 -0
  5. package/dist/browser/{IndexedDbArchivist.d.mts → Archivist.d.ts} +17 -24
  6. package/dist/browser/Archivist.d.ts.map +1 -0
  7. package/dist/browser/Config.d.cts +30 -0
  8. package/dist/browser/Config.d.cts.map +1 -0
  9. package/dist/browser/Config.d.mts +30 -0
  10. package/dist/browser/Config.d.mts.map +1 -0
  11. package/dist/browser/Config.d.ts +30 -0
  12. package/dist/browser/Config.d.ts.map +1 -0
  13. package/dist/browser/Params.d.cts +5 -0
  14. package/dist/browser/Params.d.cts.map +1 -0
  15. package/dist/browser/Params.d.mts +5 -0
  16. package/dist/browser/Params.d.mts.map +1 -0
  17. package/dist/browser/Params.d.ts +5 -0
  18. package/dist/browser/Params.d.ts.map +1 -0
  19. package/dist/browser/Schema.d.cts +3 -0
  20. package/dist/browser/Schema.d.cts.map +1 -0
  21. package/dist/browser/Schema.d.mts +3 -0
  22. package/dist/browser/Schema.d.mts.map +1 -0
  23. package/dist/browser/Schema.d.ts +3 -0
  24. package/dist/browser/Schema.d.ts.map +1 -0
  25. package/dist/browser/index.cjs +80 -31
  26. package/dist/browser/index.cjs.map +1 -1
  27. package/dist/browser/index.d.cts +4 -1
  28. package/dist/browser/index.d.cts.map +1 -1
  29. package/dist/browser/index.d.mts +4 -1
  30. package/dist/browser/index.d.mts.map +1 -1
  31. package/dist/browser/index.d.ts +4 -1
  32. package/dist/browser/index.d.ts.map +1 -1
  33. package/dist/browser/index.js +80 -31
  34. package/dist/browser/index.js.map +1 -1
  35. package/dist/node/{IndexedDbArchivist.d.cts → Archivist.d.cts} +17 -24
  36. package/dist/node/Archivist.d.cts.map +1 -0
  37. package/dist/node/Archivist.d.mts +45 -0
  38. package/dist/node/Archivist.d.mts.map +1 -0
  39. package/dist/node/Archivist.d.ts +45 -0
  40. package/dist/node/Archivist.d.ts.map +1 -0
  41. package/dist/node/Config.d.cts +30 -0
  42. package/dist/node/Config.d.cts.map +1 -0
  43. package/dist/node/Config.d.mts +30 -0
  44. package/dist/node/Config.d.mts.map +1 -0
  45. package/dist/node/Config.d.ts +30 -0
  46. package/dist/node/Config.d.ts.map +1 -0
  47. package/dist/node/Params.d.cts +5 -0
  48. package/dist/node/Params.d.cts.map +1 -0
  49. package/dist/node/Params.d.mts +5 -0
  50. package/dist/node/Params.d.mts.map +1 -0
  51. package/dist/node/Params.d.ts +5 -0
  52. package/dist/node/Params.d.ts.map +1 -0
  53. package/dist/node/Schema.d.cts +3 -0
  54. package/dist/node/Schema.d.cts.map +1 -0
  55. package/dist/node/Schema.d.mts +3 -0
  56. package/dist/node/Schema.d.mts.map +1 -0
  57. package/dist/node/Schema.d.ts +3 -0
  58. package/dist/node/Schema.d.ts.map +1 -0
  59. package/dist/node/index.cjs +84 -32
  60. package/dist/node/index.cjs.map +1 -1
  61. package/dist/node/index.d.cts +4 -1
  62. package/dist/node/index.d.cts.map +1 -1
  63. package/dist/node/index.d.mts +4 -1
  64. package/dist/node/index.d.mts.map +1 -1
  65. package/dist/node/index.d.ts +4 -1
  66. package/dist/node/index.d.ts.map +1 -1
  67. package/dist/node/index.js +82 -31
  68. package/dist/node/index.js.map +1 -1
  69. package/package.json +14 -15
  70. package/src/Archivist.ts +144 -0
  71. package/src/Config.ts +32 -0
  72. package/src/Params.ts +6 -0
  73. package/src/Schema.ts +2 -0
  74. package/src/index.ts +4 -1
  75. package/dist/browser/IndexedDbArchivist.d.cts.map +0 -1
  76. package/dist/browser/IndexedDbArchivist.d.mts.map +0 -1
  77. package/dist/browser/IndexedDbArchivist.d.ts.map +0 -1
  78. package/dist/node/IndexedDbArchivist.d.cts.map +0 -1
  79. package/dist/node/IndexedDbArchivist.d.mts +0 -52
  80. package/dist/node/IndexedDbArchivist.d.mts.map +0 -1
  81. package/dist/node/IndexedDbArchivist.d.ts +0 -52
  82. package/dist/node/IndexedDbArchivist.d.ts.map +0 -1
  83. package/src/IndexedDbArchivist.ts +0 -120
  84. package/src/sample.archivist.xyo.json +0 -16
  85. package/src/spec/testArchivist.ts +0 -50
@@ -1,25 +1,16 @@
1
1
  import { AbstractArchivist } from '@xyo-network/archivist-abstract';
2
- import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
3
- import { AnyConfigSchema } from '@xyo-network/module-model';
2
+ import { ArchivistModuleEventData, IndexDescription } from '@xyo-network/archivist-model';
4
3
  import { Payload } from '@xyo-network/payload-model';
5
- export type IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
6
- export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
7
- export type IndexedDbArchivistConfig = ArchivistConfig<{
8
- /**
9
- * The database name
10
- */
11
- dbName?: string;
12
- schema: IndexedDbArchivistConfigSchema;
13
- /**
14
- * The name of the object store
15
- */
16
- storeName?: string;
17
- }>;
18
- export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
4
+ import { IndexedDbArchivistParams } from './Params';
5
+ export interface PayloadStore {
6
+ [s: string]: Payload;
7
+ }
19
8
  export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> {
20
9
  static configSchemas: "network.xyo.archivist.indexeddb.config"[];
21
10
  static defaultDbName: string;
11
+ static defaultDbVersion: number;
22
12
  static defaultStoreName: string;
13
+ static hashIndex: Required<IndexDescription>;
23
14
  private _db;
24
15
  /**
25
16
  * The database name. If not supplied via config, it defaults
@@ -29,16 +20,18 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
29
20
  * make the most sense for 99% of use cases.
30
21
  */
31
22
  get dbName(): string;
23
+ /**
24
+ * The database version. If not supplied via config, it defaults to 1.
25
+ */
26
+ get dbVersion(): number;
27
+ /**
28
+ * The database indexes.
29
+ */
30
+ get indexes(): IndexDescription[];
32
31
  get queries(): string[];
33
32
  /**
34
33
  * The name of the object store. If not supplied via config, it defaults
35
- * to `payloads`. The limitation of the current IndexedDB wrapper we're
36
- * using is that it only supports a single object store per DB. See here:
37
- * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
38
- * If this becomes a problem or we need migrations/transactions, we can
39
- * move to this more-flexible library, which they recommend (and who
40
- * recommends them for our simple use case of key-value storage):
41
- * https://www.npmjs.com/package/idb
34
+ * to `payloads`.
42
35
  */
43
36
  get storeName(): string;
44
37
  private get db();
@@ -49,4 +42,4 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
49
42
  protected insertHandler(payloads: Payload[]): Promise<Payload[]>;
50
43
  protected startHandler(): Promise<boolean>;
51
44
  }
52
- //# sourceMappingURL=IndexedDbArchivist.d.ts.map
45
+ //# sourceMappingURL=Archivist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAKL,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,WAAW,YAAY;IAC3B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;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,aAAa,6CAAmC;IAChE,MAAM,CAAC,aAAa,SAAc;IAClC,MAAM,CAAC,gBAAgB,SAAI;IAC3B,MAAM,CAAC,gBAAgB,SAAa;IACpC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAyD;IAErG,OAAO,CAAC,GAAG,CAAwC;IAEnD;;;;;;OAMG;IACH,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,SAAS,WAEZ;IAED;;OAEG;IACH,IAAI,OAAO,uBAEV;IAED,IAAa,OAAO,aAEnB;IACD;;;OAGG;IACH,IAAI,SAAS,WAEZ;IAED,OAAO,KAAK,EAAE,GAEb;cAEwB,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;cAOhC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAI7B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAgBlD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAKhD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAOtD,YAAY;CA4BtC"}
@@ -1,25 +1,16 @@
1
1
  import { AbstractArchivist } from '@xyo-network/archivist-abstract';
2
- import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
3
- import { AnyConfigSchema } from '@xyo-network/module-model';
2
+ import { ArchivistModuleEventData, IndexDescription } from '@xyo-network/archivist-model';
4
3
  import { Payload } from '@xyo-network/payload-model';
5
- export type IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
6
- export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
7
- export type IndexedDbArchivistConfig = ArchivistConfig<{
8
- /**
9
- * The database name
10
- */
11
- dbName?: string;
12
- schema: IndexedDbArchivistConfigSchema;
13
- /**
14
- * The name of the object store
15
- */
16
- storeName?: string;
17
- }>;
18
- export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
4
+ import { IndexedDbArchivistParams } from './Params';
5
+ export interface PayloadStore {
6
+ [s: string]: Payload;
7
+ }
19
8
  export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> {
20
9
  static configSchemas: "network.xyo.archivist.indexeddb.config"[];
21
10
  static defaultDbName: string;
11
+ static defaultDbVersion: number;
22
12
  static defaultStoreName: string;
13
+ static hashIndex: Required<IndexDescription>;
23
14
  private _db;
24
15
  /**
25
16
  * The database name. If not supplied via config, it defaults
@@ -29,16 +20,18 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
29
20
  * make the most sense for 99% of use cases.
30
21
  */
31
22
  get dbName(): string;
23
+ /**
24
+ * The database version. If not supplied via config, it defaults to 1.
25
+ */
26
+ get dbVersion(): number;
27
+ /**
28
+ * The database indexes.
29
+ */
30
+ get indexes(): IndexDescription[];
32
31
  get queries(): string[];
33
32
  /**
34
33
  * The name of the object store. If not supplied via config, it defaults
35
- * to `payloads`. The limitation of the current IndexedDB wrapper we're
36
- * using is that it only supports a single object store per DB. See here:
37
- * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
38
- * If this becomes a problem or we need migrations/transactions, we can
39
- * move to this more-flexible library, which they recommend (and who
40
- * recommends them for our simple use case of key-value storage):
41
- * https://www.npmjs.com/package/idb
34
+ * to `payloads`.
42
35
  */
43
36
  get storeName(): string;
44
37
  private get db();
@@ -49,4 +42,4 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
49
42
  protected insertHandler(payloads: Payload[]): Promise<Payload[]>;
50
43
  protected startHandler(): Promise<boolean>;
51
44
  }
52
- //# sourceMappingURL=IndexedDbArchivist.d.ts.map
45
+ //# sourceMappingURL=Archivist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAKL,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,WAAW,YAAY;IAC3B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;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,aAAa,6CAAmC;IAChE,MAAM,CAAC,aAAa,SAAc;IAClC,MAAM,CAAC,gBAAgB,SAAI;IAC3B,MAAM,CAAC,gBAAgB,SAAa;IACpC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAyD;IAErG,OAAO,CAAC,GAAG,CAAwC;IAEnD;;;;;;OAMG;IACH,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,SAAS,WAEZ;IAED;;OAEG;IACH,IAAI,OAAO,uBAEV;IAED,IAAa,OAAO,aAEnB;IACD;;;OAGG;IACH,IAAI,SAAS,WAEZ;IAED,OAAO,KAAK,EAAE,GAEb;cAEwB,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;cAOhC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAI7B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAgBlD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAKhD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAOtD,YAAY;CA4BtC"}
@@ -1,25 +1,16 @@
1
1
  import { AbstractArchivist } from '@xyo-network/archivist-abstract';
2
- import { ArchivistConfig, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
3
- import { AnyConfigSchema } from '@xyo-network/module-model';
2
+ import { ArchivistModuleEventData, IndexDescription } from '@xyo-network/archivist-model';
4
3
  import { Payload } from '@xyo-network/payload-model';
5
- export type IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config';
6
- export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
7
- export type IndexedDbArchivistConfig = ArchivistConfig<{
8
- /**
9
- * The database name
10
- */
11
- dbName?: string;
12
- schema: IndexedDbArchivistConfigSchema;
13
- /**
14
- * The name of the object store
15
- */
16
- storeName?: string;
17
- }>;
18
- export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
4
+ import { IndexedDbArchivistParams } from './Params';
5
+ export interface PayloadStore {
6
+ [s: string]: Payload;
7
+ }
19
8
  export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> {
20
9
  static configSchemas: "network.xyo.archivist.indexeddb.config"[];
21
10
  static defaultDbName: string;
11
+ static defaultDbVersion: number;
22
12
  static defaultStoreName: string;
13
+ static hashIndex: Required<IndexDescription>;
23
14
  private _db;
24
15
  /**
25
16
  * The database name. If not supplied via config, it defaults
@@ -29,16 +20,18 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
29
20
  * make the most sense for 99% of use cases.
30
21
  */
31
22
  get dbName(): string;
23
+ /**
24
+ * The database version. If not supplied via config, it defaults to 1.
25
+ */
26
+ get dbVersion(): number;
27
+ /**
28
+ * The database indexes.
29
+ */
30
+ get indexes(): IndexDescription[];
32
31
  get queries(): string[];
33
32
  /**
34
33
  * The name of the object store. If not supplied via config, it defaults
35
- * to `payloads`. The limitation of the current IndexedDB wrapper we're
36
- * using is that it only supports a single object store per DB. See here:
37
- * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
38
- * If this becomes a problem or we need migrations/transactions, we can
39
- * move to this more-flexible library, which they recommend (and who
40
- * recommends them for our simple use case of key-value storage):
41
- * https://www.npmjs.com/package/idb
34
+ * to `payloads`.
42
35
  */
43
36
  get storeName(): string;
44
37
  private get db();
@@ -49,4 +42,4 @@ export declare class IndexedDbArchivist<TParams extends IndexedDbArchivistParams
49
42
  protected insertHandler(payloads: Payload[]): Promise<Payload[]>;
50
43
  protected startHandler(): Promise<boolean>;
51
44
  }
52
- //# sourceMappingURL=IndexedDbArchivist.d.ts.map
45
+ //# sourceMappingURL=Archivist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAKL,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,WAAW,YAAY;IAC3B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;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,aAAa,6CAAmC;IAChE,MAAM,CAAC,aAAa,SAAc;IAClC,MAAM,CAAC,gBAAgB,SAAI;IAC3B,MAAM,CAAC,gBAAgB,SAAa;IACpC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAyD;IAErG,OAAO,CAAC,GAAG,CAAwC;IAEnD;;;;;;OAMG;IACH,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,SAAS,WAEZ;IAED;;OAEG;IACH,IAAI,OAAO,uBAEV;IAED,IAAa,OAAO,aAEnB;IACD;;;OAGG;IACH,IAAI,SAAS,WAEZ;IAED,OAAO,KAAK,EAAE,GAEb;cAEwB,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;cAOhC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAI7B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAgBlD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAKhD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAOtD,YAAY;CA4BtC"}
@@ -0,0 +1,30 @@
1
+ import { ArchivistConfig, IndexDescription } from '@xyo-network/archivist-model';
2
+ import { IndexedDbArchivistSchema } from './Schema';
3
+ export type IndexedDbArchivistConfigSchema = `${IndexedDbArchivistSchema}.config`;
4
+ export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
5
+ export type IndexedDbArchivistConfig = ArchivistConfig<{
6
+ /**
7
+ * The database name
8
+ */
9
+ dbName?: string;
10
+ /**
11
+ * The version of the DB, defaults to 1
12
+ */
13
+ dbVersion?: number;
14
+ schema: IndexedDbArchivistConfigSchema;
15
+ /**
16
+ * The storage configuration
17
+ * // TODO: Hoist to main archivist config
18
+ */
19
+ storage?: {
20
+ /**
21
+ * The indexes to create on the object store
22
+ */
23
+ indexes?: IndexDescription[];
24
+ };
25
+ /**
26
+ * The name of the object store
27
+ */
28
+ storeName?: string;
29
+ }>;
30
+ //# sourceMappingURL=Config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,MAAM,8BAA8B,GAAG,GAAG,wBAAwB,SAAS,CAAA;AACjF,eAAO,MAAM,8BAA8B,EAAE,8BAAqE,CAAA;AAElH,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC;IACrD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,8BAA8B,CAAA;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE;QACR;;WAEG;QACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;KAC7B,CAAA;IACD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { ArchivistConfig, IndexDescription } from '@xyo-network/archivist-model';
2
+ import { IndexedDbArchivistSchema } from './Schema';
3
+ export type IndexedDbArchivistConfigSchema = `${IndexedDbArchivistSchema}.config`;
4
+ export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
5
+ export type IndexedDbArchivistConfig = ArchivistConfig<{
6
+ /**
7
+ * The database name
8
+ */
9
+ dbName?: string;
10
+ /**
11
+ * The version of the DB, defaults to 1
12
+ */
13
+ dbVersion?: number;
14
+ schema: IndexedDbArchivistConfigSchema;
15
+ /**
16
+ * The storage configuration
17
+ * // TODO: Hoist to main archivist config
18
+ */
19
+ storage?: {
20
+ /**
21
+ * The indexes to create on the object store
22
+ */
23
+ indexes?: IndexDescription[];
24
+ };
25
+ /**
26
+ * The name of the object store
27
+ */
28
+ storeName?: string;
29
+ }>;
30
+ //# sourceMappingURL=Config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,MAAM,8BAA8B,GAAG,GAAG,wBAAwB,SAAS,CAAA;AACjF,eAAO,MAAM,8BAA8B,EAAE,8BAAqE,CAAA;AAElH,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC;IACrD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,8BAA8B,CAAA;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE;QACR;;WAEG;QACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;KAC7B,CAAA;IACD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { ArchivistConfig, IndexDescription } from '@xyo-network/archivist-model';
2
+ import { IndexedDbArchivistSchema } from './Schema';
3
+ export type IndexedDbArchivistConfigSchema = `${IndexedDbArchivistSchema}.config`;
4
+ export declare const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema;
5
+ export type IndexedDbArchivistConfig = ArchivistConfig<{
6
+ /**
7
+ * The database name
8
+ */
9
+ dbName?: string;
10
+ /**
11
+ * The version of the DB, defaults to 1
12
+ */
13
+ dbVersion?: number;
14
+ schema: IndexedDbArchivistConfigSchema;
15
+ /**
16
+ * The storage configuration
17
+ * // TODO: Hoist to main archivist config
18
+ */
19
+ storage?: {
20
+ /**
21
+ * The indexes to create on the object store
22
+ */
23
+ indexes?: IndexDescription[];
24
+ };
25
+ /**
26
+ * The name of the object store
27
+ */
28
+ storeName?: string;
29
+ }>;
30
+ //# sourceMappingURL=Config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,MAAM,8BAA8B,GAAG,GAAG,wBAAwB,SAAS,CAAA;AACjF,eAAO,MAAM,8BAA8B,EAAE,8BAAqE,CAAA;AAElH,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC;IACrD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,8BAA8B,CAAA;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE;QACR;;WAEG;QACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;KAC7B,CAAA;IACD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ArchivistParams } from '@xyo-network/archivist-model';
2
+ import { AnyConfigSchema } from '@xyo-network/module-model';
3
+ import { IndexedDbArchivistConfig } from './Config';
4
+ export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
5
+ //# sourceMappingURL=Params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../src/Params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ArchivistParams } from '@xyo-network/archivist-model';
2
+ import { AnyConfigSchema } from '@xyo-network/module-model';
3
+ import { IndexedDbArchivistConfig } from './Config';
4
+ export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
5
+ //# sourceMappingURL=Params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../src/Params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ArchivistParams } from '@xyo-network/archivist-model';
2
+ import { AnyConfigSchema } from '@xyo-network/module-model';
3
+ import { IndexedDbArchivistConfig } from './Config';
4
+ export type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>;
5
+ //# sourceMappingURL=Params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../src/Params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export type IndexedDbArchivistSchema = 'network.xyo.archivist.indexeddb';
2
+ export declare const IndexedDbArchivistSchema: IndexedDbArchivistSchema;
3
+ //# sourceMappingURL=Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/Schema.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG,iCAAiC,CAAA;AACxE,eAAO,MAAM,wBAAwB,EAAE,wBAA4D,CAAA"}
@@ -0,0 +1,3 @@
1
+ export type IndexedDbArchivistSchema = 'network.xyo.archivist.indexeddb';
2
+ export declare const IndexedDbArchivistSchema: IndexedDbArchivistSchema;
3
+ //# sourceMappingURL=Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/Schema.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG,iCAAiC,CAAA;AACxE,eAAO,MAAM,wBAAwB,EAAE,wBAA4D,CAAA"}
@@ -0,0 +1,3 @@
1
+ export type IndexedDbArchivistSchema = 'network.xyo.archivist.indexeddb';
2
+ export declare const IndexedDbArchivistSchema: IndexedDbArchivistSchema;
3
+ //# sourceMappingURL=Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/Schema.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG,iCAAiC,CAAA;AACxE,eAAO,MAAM,wBAAwB,EAAE,wBAA4D,CAAA"}
@@ -22,17 +22,27 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var src_exports = {};
23
23
  __export(src_exports, {
24
24
  IndexedDbArchivist: () => IndexedDbArchivist,
25
- IndexedDbArchivistConfigSchema: () => IndexedDbArchivistConfigSchema
25
+ IndexedDbArchivistConfigSchema: () => IndexedDbArchivistConfigSchema,
26
+ IndexedDbArchivistSchema: () => IndexedDbArchivistSchema
26
27
  });
27
28
  module.exports = __toCommonJS(src_exports);
28
29
 
29
- // src/IndexedDbArchivist.ts
30
+ // src/Archivist.ts
30
31
  var import_assert = require("@xylabs/assert");
32
+ var import_exists = require("@xylabs/exists");
31
33
  var import_archivist_abstract = require("@xyo-network/archivist-abstract");
32
34
  var import_archivist_model = require("@xyo-network/archivist-model");
33
35
  var import_hash = require("@xyo-network/hash");
34
36
  var import_module_model = require("@xyo-network/module-model");
35
- var import_idb_keyval = require("idb-keyval");
37
+ var import_idb = require("idb");
38
+
39
+ // src/Schema.ts
40
+ var IndexedDbArchivistSchema = "network.xyo.archivist.indexeddb";
41
+
42
+ // src/Config.ts
43
+ var IndexedDbArchivistConfigSchema = `${IndexedDbArchivistSchema}.config`;
44
+
45
+ // src/Archivist.ts
36
46
  function _ts_decorate(decorators, target, key, desc) {
37
47
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
38
48
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -44,7 +54,6 @@ function _ts_decorate(decorators, target, key, desc) {
44
54
  return c > 3 && r && Object.defineProperty(target, key, r), r;
45
55
  }
46
56
  __name(_ts_decorate, "_ts_decorate");
47
- var IndexedDbArchivistConfigSchema = "network.xyo.archivist.indexeddb.config";
48
57
  var IndexedDbArchivist = class _IndexedDbArchivist extends import_archivist_abstract.AbstractArchivist {
49
58
  static {
50
59
  __name(this, "IndexedDbArchivist");
@@ -53,7 +62,15 @@ var IndexedDbArchivist = class _IndexedDbArchivist extends import_archivist_abst
53
62
  IndexedDbArchivistConfigSchema
54
63
  ];
55
64
  static defaultDbName = "archivist";
65
+ static defaultDbVersion = 1;
56
66
  static defaultStoreName = "payloads";
67
+ static hashIndex = {
68
+ key: {
69
+ _hash: 1
70
+ },
71
+ name: "IX__hash",
72
+ unique: false
73
+ };
57
74
  _db;
58
75
  /**
59
76
  * The database name. If not supplied via config, it defaults
@@ -65,6 +82,18 @@ var IndexedDbArchivist = class _IndexedDbArchivist extends import_archivist_abst
65
82
  get dbName() {
66
83
  return this.config?.dbName ?? this.config?.name ?? _IndexedDbArchivist.defaultDbName;
67
84
  }
85
+ /**
86
+ * The database version. If not supplied via config, it defaults to 1.
87
+ */
88
+ get dbVersion() {
89
+ return this.config?.dbVersion ?? _IndexedDbArchivist.defaultDbVersion;
90
+ }
91
+ /**
92
+ * The database indexes.
93
+ */
94
+ get indexes() {
95
+ return this.config?.storage?.indexes ?? [];
96
+ }
68
97
  get queries() {
69
98
  return [
70
99
  import_archivist_model.ArchivistAllQuerySchema,
@@ -76,13 +105,7 @@ var IndexedDbArchivist = class _IndexedDbArchivist extends import_archivist_abst
76
105
  }
77
106
  /**
78
107
  * The name of the object store. If not supplied via config, it defaults
79
- * to `payloads`. The limitation of the current IndexedDB wrapper we're
80
- * using is that it only supports a single object store per DB. See here:
81
- * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name
82
- * If this becomes a problem or we need migrations/transactions, we can
83
- * move to this more-flexible library, which they recommend (and who
84
- * recommends them for our simple use case of key-value storage):
85
- * https://www.npmjs.com/package/idb
108
+ * to `payloads`.
86
109
  */
87
110
  get storeName() {
88
111
  return this.config?.storeName ?? _IndexedDbArchivist.defaultStoreName;
@@ -91,38 +114,64 @@ var IndexedDbArchivist = class _IndexedDbArchivist extends import_archivist_abst
91
114
  return (0, import_assert.assertEx)(this._db, "DB not initialized");
92
115
  }
93
116
  async allHandler() {
94
- const result = await (0, import_idb_keyval.entries)(this.db);
95
- return result.map(([_hash, payload]) => payload);
117
+ const payloads = await this.db.getAll(this.storeName);
118
+ return payloads.map((payload) => import_hash.PayloadHasher.jsonPayload(payload));
96
119
  }
97
120
  async clearHandler() {
98
- await (0, import_idb_keyval.clear)(this.db);
121
+ await this.db.clear(this.storeName);
99
122
  }
100
123
  async deleteHandler(hashes) {
101
- const payloadPairs = await Promise.all((await this.get(hashes)).map(async (payload) => [
102
- await import_hash.PayloadHasher.hashAsync(payload),
103
- payload
104
- ]));
105
- const foundHashesToDelete = payloadPairs.map(([hash, _]) => hash);
106
- await (0, import_idb_keyval.delMany)(foundHashesToDelete, this.db);
107
- return foundHashesToDelete;
124
+ const distinctHashes = [
125
+ ...new Set(hashes)
126
+ ];
127
+ const found = await Promise.all(distinctHashes.map(async (hash) => {
128
+ let existing;
129
+ do {
130
+ existing = await this.db.getKeyFromIndex(this.storeName, _IndexedDbArchivist.hashIndex.name, hash);
131
+ if (existing)
132
+ await this.db.delete(this.storeName, existing);
133
+ } while (!existing);
134
+ return hash;
135
+ }));
136
+ return found.filter(import_exists.exists);
108
137
  }
109
138
  async getHandler(hashes) {
110
- return (await (0, import_idb_keyval.getMany)(hashes, this.db)).filter((result) => result !== void 0);
139
+ const payloads = await Promise.all(hashes.map((hash) => this.db.getFromIndex(this.storeName, _IndexedDbArchivist.hashIndex.name, hash)));
140
+ return payloads.filter(import_exists.exists);
111
141
  }
112
142
  async insertHandler(payloads) {
113
- const entries2 = await Promise.all(payloads.map(async (payload) => {
114
- const hash = await import_hash.PayloadHasher.hashAsync(payload);
115
- return [
116
- hash,
117
- payload
118
- ];
119
- }));
120
- await (0, import_idb_keyval.setMany)(entries2, this.db);
143
+ const pairs = await import_hash.PayloadHasher.hashPairs(payloads);
144
+ await Promise.all(pairs.map(([payload, _hash]) => this.db.put(this.storeName, {
145
+ ...payload,
146
+ _hash
147
+ })));
121
148
  return payloads;
122
149
  }
123
150
  async startHandler() {
124
151
  await super.startHandler();
125
- this._db = (0, import_idb_keyval.createStore)(this.dbName, this.storeName);
152
+ const { indexes, storeName, dbName, dbVersion } = this;
153
+ this._db = await (0, import_idb.openDB)(dbName, dbVersion, {
154
+ async upgrade(database) {
155
+ await Promise.resolve();
156
+ const store = database.createObjectStore(storeName, {
157
+ // If it isn't explicitly set, create a value by auto incrementing.
158
+ autoIncrement: true
159
+ });
160
+ store.name = storeName;
161
+ const indexesToCreate = [
162
+ ...indexes,
163
+ _IndexedDbArchivist.hashIndex
164
+ ];
165
+ for (const { key, name, unique } of indexesToCreate) {
166
+ const indexKeys = Object.keys(key);
167
+ const keys = indexKeys.length === 1 ? indexKeys[0] : indexKeys;
168
+ const indexName = name ?? `IX_${indexKeys.join("_")}`;
169
+ store.createIndex(indexName, keys, {
170
+ unique
171
+ });
172
+ }
173
+ }
174
+ });
126
175
  return true;
127
176
  }
128
177
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/IndexedDbArchivist.ts"],"sourcesContent":["export * from './IndexedDbArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistConfig,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n ArchivistParams,\n} from '@xyo-network/archivist-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AnyConfigSchema, creatableModule } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { clear, createStore, delMany, entries, getMany, setMany, UseStore } from 'idb-keyval'\n\nexport type IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config'\nexport const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema = 'network.xyo.archivist.indexeddb.config'\n\nexport type IndexedDbArchivistConfig = ArchivistConfig<{\n /**\n * The database name\n */\n dbName?: string\n schema: IndexedDbArchivistConfigSchema\n /**\n * The name of the object store\n */\n storeName?: string\n}>\n\nexport type IndexedDbArchivistParams = ArchivistParams<AnyConfigSchema<IndexedDbArchivistConfig>>\n\n@creatableModule()\nexport class IndexedDbArchivist<\n TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n> extends AbstractArchivist<TParams, TEventData> {\n static override configSchemas = [IndexedDbArchivistConfigSchema]\n static defaultDbName = 'archivist'\n static defaultStoreName = 'payloads'\n\n private _db: UseStore | undefined\n\n /**\n * The database name. If not supplied via config, it defaults\n * to the module name (not guaranteed to be unique) and if module\n * name is not supplied, it defaults to `archivist`. This behavior\n * biases towards a single, isolated DB per archivist which seems to\n * make the most sense for 99% of use cases.\n */\n get dbName() {\n return this.config?.dbName ?? this.config?.name ?? IndexedDbArchivist.defaultDbName\n }\n\n override get queries() {\n return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries]\n }\n /**\n * The name of the object store. If not supplied via config, it defaults\n * to `payloads`. The limitation of the current IndexedDB wrapper we're\n * using is that it only supports a single object store per DB. See here:\n * https://github.com/jakearchibald/idb-keyval/blob/main/custom-stores.md#defining-a-custom-database--store-name\n * If this becomes a problem or we need migrations/transactions, we can\n * move to this more-flexible library, which they recommend (and who\n * recommends them for our simple use case of key-value storage):\n * https://www.npmjs.com/package/idb\n */\n get storeName() {\n return this.config?.storeName ?? IndexedDbArchivist.defaultStoreName\n }\n\n private get db(): UseStore {\n return assertEx(this._db, 'DB not initialized')\n }\n\n protected override async allHandler(): Promise<Payload[]> {\n const result = await entries<string, Payload>(this.db)\n return result.map<Payload>(([_hash, payload]) => payload)\n }\n\n protected override async clearHandler(): Promise<void> {\n await clear(this.db)\n }\n\n protected override async deleteHandler(hashes: string[]): Promise<string[]> {\n const payloadPairs: [string, Payload][] = await Promise.all(\n (await this.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n\n const foundHashesToDelete = payloadPairs.map(([hash, _]) => hash)\n await delMany(foundHashesToDelete, this.db)\n\n return foundHashesToDelete\n }\n\n protected override async getHandler(hashes: string[]): Promise<Payload[]> {\n return (await getMany<Payload>(hashes, this.db)).filter((result) => result !== undefined)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const entries = await Promise.all(\n payloads.map<Promise<[string, Payload]>>(async (payload) => {\n const hash = await PayloadHasher.hashAsync(payload)\n return [hash, payload]\n }),\n )\n await setMany(entries, this.db)\n\n return payloads\n }\n\n protected override async startHandler() {\n await super.startHandler()\n // NOTE: We could defer this creation to first access but we\n // want to fail fast here in case something is wrong\n this._db = createStore(this.dbName, this.storeName)\n return true\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACAA,oBAAyB;AACzB,gCAAkC;AAClC,6BAQO;AACP,kBAA8B;AAC9B,0BAAiD;AAEjD,wBAAiF;;;;;;;;;;;;AAG1E,IAAMA,iCAAiE;AAiBvE,IAAMC,qBAAN,MAAMA,4BAGHC,4CAAAA;SAAAA;;;EACR,OAAgBC,gBAAgB;IAACH;;EACjC,OAAOI,gBAAgB;EACvB,OAAOC,mBAAmB;EAElBC;;;;;;;;EASR,IAAIC,SAAS;AACX,WAAO,KAAKC,QAAQD,UAAU,KAAKC,QAAQC,QAAQR,oBAAmBG;EACxE;EAEA,IAAaM,UAAU;AACrB,WAAO;MAACC;MAAyBC;MAA2BC;MAA4BC;SAA+B,MAAMJ;;EAC/H;;;;;;;;;;;EAWA,IAAIK,YAAY;AACd,WAAO,KAAKP,QAAQO,aAAad,oBAAmBI;EACtD;EAEA,IAAYW,KAAe;AACzB,eAAOC,wBAAS,KAAKX,KAAK,oBAAA;EAC5B;EAEA,MAAyBY,aAAiC;AACxD,UAAMC,SAAS,UAAMC,2BAAyB,KAAKJ,EAAE;AACrD,WAAOG,OAAOE,IAAa,CAAC,CAACC,OAAOC,OAAAA,MAAaA,OAAAA;EACnD;EAEA,MAAyBC,eAA8B;AACrD,cAAMC,yBAAM,KAAKT,EAAE;EACrB;EAEA,MAAyBU,cAAcC,QAAqC;AAC1E,UAAMC,eAAoC,MAAMC,QAAQC,KACrD,MAAM,KAAKC,IAAIJ,MAAAA,GAASN,IAAgC,OAAOE,YAAY;MAAC,MAAMS,0BAAcC,UAAUV,OAAAA;MAAUA;KAAQ,CAAA;AAG/H,UAAMW,sBAAsBN,aAAaP,IAAI,CAAC,CAACc,MAAMC,CAAAA,MAAOD,IAAAA;AAC5D,cAAME,2BAAQH,qBAAqB,KAAKlB,EAAE;AAE1C,WAAOkB;EACT;EAEA,MAAyBI,WAAWX,QAAsC;AACxE,YAAQ,UAAMY,2BAAiBZ,QAAQ,KAAKX,EAAE,GAAGwB,OAAO,CAACrB,WAAWA,WAAWsB,MAAAA;EACjF;EAEA,MAAyBC,cAAcC,UAAyC;AAC9E,UAAMvB,WAAU,MAAMS,QAAQC,IAC5Ba,SAAStB,IAAgC,OAAOE,YAAAA;AAC9C,YAAMY,OAAO,MAAMH,0BAAcC,UAAUV,OAAAA;AAC3C,aAAO;QAACY;QAAMZ;;IAChB,CAAA,CAAA;AAEF,cAAMqB,2BAAQxB,UAAS,KAAKJ,EAAE;AAE9B,WAAO2B;EACT;EAEA,MAAyBE,eAAe;AACtC,UAAM,MAAMA,aAAAA;AAGZ,SAAKvC,UAAMwC,+BAAY,KAAKvC,QAAQ,KAAKQ,SAAS;AAClD,WAAO;EACT;AACF;AArFad,qBAAAA,aAAAA;MADZ8C,qCAAAA;GACY9C,kBAAAA;","names":["IndexedDbArchivistConfigSchema","IndexedDbArchivist","AbstractArchivist","configSchemas","defaultDbName","defaultStoreName","_db","dbName","config","name","queries","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","storeName","db","assertEx","allHandler","result","entries","map","_hash","payload","clearHandler","clear","deleteHandler","hashes","payloadPairs","Promise","all","get","PayloadHasher","hashAsync","foundHashesToDelete","hash","_","delMany","getHandler","getMany","filter","undefined","insertHandler","payloads","setMany","startHandler","createStore","creatableModule"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Archivist.ts","../../src/Schema.ts","../../src/Config.ts"],"sourcesContent":["export * from './Archivist'\nexport * from './Config'\nexport * from './Params'\nexport * from './Schema'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n IndexDescription,\n} from '@xyo-network/archivist-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { IDBPDatabase, openDB } from 'idb'\n\nimport { IndexedDbArchivistConfigSchema } from './Config'\nimport { IndexedDbArchivistParams } from './Params'\n\nexport interface PayloadStore {\n [s: string]: Payload\n}\n\n@creatableModule()\nexport class IndexedDbArchivist<\n TParams extends IndexedDbArchivistParams = IndexedDbArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n> extends AbstractArchivist<TParams, TEventData> {\n static override configSchemas = [IndexedDbArchivistConfigSchema]\n static defaultDbName = 'archivist'\n static defaultDbVersion = 1\n static defaultStoreName = 'payloads'\n static hashIndex: Required<IndexDescription> = { key: { _hash: 1 }, name: 'IX__hash', unique: false }\n\n private _db: IDBPDatabase<PayloadStore> | undefined\n\n /**\n * The database name. If not supplied via config, it defaults\n * to the module name (not guaranteed to be unique) and if module\n * name is not supplied, it defaults to `archivist`. This behavior\n * biases towards a single, isolated DB per archivist which seems to\n * make the most sense for 99% of use cases.\n */\n get dbName() {\n return this.config?.dbName ?? this.config?.name ?? IndexedDbArchivist.defaultDbName\n }\n\n /**\n * The database version. If not supplied via config, it defaults to 1.\n */\n get dbVersion() {\n return this.config?.dbVersion ?? IndexedDbArchivist.defaultDbVersion\n }\n\n /**\n * The database indexes.\n */\n get indexes() {\n return this.config?.storage?.indexes ?? []\n }\n\n override get queries() {\n return [ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ...super.queries]\n }\n /**\n * The name of the object store. If not supplied via config, it defaults\n * to `payloads`.\n */\n get storeName() {\n return this.config?.storeName ?? IndexedDbArchivist.defaultStoreName\n }\n\n private get db(): IDBPDatabase<PayloadStore> {\n return assertEx(this._db, 'DB not initialized')\n }\n\n protected override async allHandler(): Promise<Payload[]> {\n // Get all payloads from the store\n const payloads = await this.db.getAll(this.storeName)\n // Remove any metadata before returning to the client\n return payloads.map((payload) => PayloadHasher.jsonPayload(payload))\n }\n\n protected override async clearHandler(): Promise<void> {\n await this.db.clear(this.storeName)\n }\n\n protected override async deleteHandler(hashes: string[]): Promise<string[]> {\n const distinctHashes = [...new Set(hashes)]\n const found = await Promise.all(\n distinctHashes.map(async (hash) => {\n let existing: IDBValidKey | undefined\n do {\n existing = await this.db.getKeyFromIndex(this.storeName, IndexedDbArchivist.hashIndex.name, hash)\n if (existing) await this.db.delete(this.storeName, existing)\n } while (!existing)\n return hash\n }),\n )\n // Return hashes removed\n return found.filter(exists)\n }\n\n protected override async getHandler(hashes: string[]): Promise<Payload[]> {\n const payloads = await Promise.all(hashes.map((hash) => this.db.getFromIndex(this.storeName, IndexedDbArchivist.hashIndex.name, hash)))\n return payloads.filter(exists)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const pairs = await PayloadHasher.hashPairs(payloads)\n // TODO: Only return the payloads that were successfully inserted\n await Promise.all(pairs.map(([payload, _hash]) => this.db.put(this.storeName, { ...payload, _hash })))\n return payloads\n }\n\n protected override async startHandler() {\n await super.startHandler()\n // NOTE: We could defer this creation to first access but we\n // want to fail fast here in case something is wrong\n const { indexes, storeName, dbName, dbVersion } = this\n this._db = await openDB<PayloadStore>(dbName, dbVersion, {\n async upgrade(database) {\n await Promise.resolve() // Async to match spec\n // Create the store\n const store = database.createObjectStore(storeName, {\n // If it isn't explicitly set, create a value by auto incrementing.\n autoIncrement: true,\n })\n // Name the store\n store.name = storeName\n // Create an index on the hash\n const indexesToCreate = [...indexes, IndexedDbArchivist.hashIndex]\n for (const { key, name, unique } of indexesToCreate) {\n const indexKeys = Object.keys(key)\n const keys = indexKeys.length === 1 ? indexKeys[0] : indexKeys\n const indexName = name ?? `IX_${indexKeys.join('_')}`\n store.createIndex(indexName, keys, { unique })\n }\n },\n })\n\n return true\n }\n}\n","export type IndexedDbArchivistSchema = 'network.xyo.archivist.indexeddb'\nexport const IndexedDbArchivistSchema: IndexedDbArchivistSchema = 'network.xyo.archivist.indexeddb'\n","import { ArchivistConfig, IndexDescription } from '@xyo-network/archivist-model'\n\nimport { IndexedDbArchivistSchema } from './Schema'\n\nexport type IndexedDbArchivistConfigSchema = `${IndexedDbArchivistSchema}.config`\nexport const IndexedDbArchivistConfigSchema: IndexedDbArchivistConfigSchema = `${IndexedDbArchivistSchema}.config`\n\nexport type IndexedDbArchivistConfig = ArchivistConfig<{\n /**\n * The database name\n */\n dbName?: string\n /**\n * The version of the DB, defaults to 1\n */\n dbVersion?: number\n schema: IndexedDbArchivistConfigSchema\n /**\n * The storage configuration\n * // TODO: Hoist to main archivist config\n */\n storage?: {\n /**\n * The indexes to create on the object store\n */\n indexes?: IndexDescription[]\n }\n /**\n * The name of the object store\n */\n storeName?: string\n}>\n"],"mappings":"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","names":["IndexedDbArchivistSchema","IndexedDbArchivistConfigSchema","IndexedDbArchivistSchema","IndexedDbArchivist","AbstractArchivist","configSchemas","IndexedDbArchivistConfigSchema","defaultDbName","defaultDbVersion","defaultStoreName","hashIndex","key","_hash","name","unique","_db","dbName","config","dbVersion","indexes","storage","queries","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","storeName","db","assertEx","allHandler","payloads","getAll","map","payload","PayloadHasher","jsonPayload","clearHandler","clear","deleteHandler","hashes","distinctHashes","Set","found","Promise","all","hash","existing","getKeyFromIndex","delete","filter","exists","getHandler","getFromIndex","insertHandler","pairs","hashPairs","put","startHandler","openDB","upgrade","database","resolve","store","createObjectStore","autoIncrement","indexesToCreate","indexKeys","Object","keys","length","indexName","join","createIndex","creatableModule"]}
@@ -1,2 +1,5 @@
1
- export * from './IndexedDbArchivist';
1
+ export * from './Archivist';
2
+ export * from './Config';
3
+ export * from './Params';
4
+ export * from './Schema';
2
5
  //# 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,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA"}
@@ -1,2 +1,5 @@
1
- export * from './IndexedDbArchivist';
1
+ export * from './Archivist';
2
+ export * from './Config';
3
+ export * from './Params';
4
+ export * from './Schema';
2
5
  //# 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,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA"}
@@ -1,2 +1,5 @@
1
- export * from './IndexedDbArchivist';
1
+ export * from './Archivist';
2
+ export * from './Config';
3
+ export * from './Params';
4
+ export * from './Schema';
2
5
  //# 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,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA"}