@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.
- package/dist/browser/{IndexedDbArchivist.d.cts → Archivist.d.cts} +17 -24
- package/dist/browser/Archivist.d.cts.map +1 -0
- package/dist/browser/{IndexedDbArchivist.d.ts → Archivist.d.mts} +17 -24
- package/dist/browser/Archivist.d.mts.map +1 -0
- package/dist/browser/{IndexedDbArchivist.d.mts → Archivist.d.ts} +17 -24
- package/dist/browser/Archivist.d.ts.map +1 -0
- package/dist/browser/Config.d.cts +30 -0
- package/dist/browser/Config.d.cts.map +1 -0
- package/dist/browser/Config.d.mts +30 -0
- package/dist/browser/Config.d.mts.map +1 -0
- package/dist/browser/Config.d.ts +30 -0
- package/dist/browser/Config.d.ts.map +1 -0
- package/dist/browser/Params.d.cts +5 -0
- package/dist/browser/Params.d.cts.map +1 -0
- package/dist/browser/Params.d.mts +5 -0
- package/dist/browser/Params.d.mts.map +1 -0
- package/dist/browser/Params.d.ts +5 -0
- package/dist/browser/Params.d.ts.map +1 -0
- package/dist/browser/Schema.d.cts +3 -0
- package/dist/browser/Schema.d.cts.map +1 -0
- package/dist/browser/Schema.d.mts +3 -0
- package/dist/browser/Schema.d.mts.map +1 -0
- package/dist/browser/Schema.d.ts +3 -0
- package/dist/browser/Schema.d.ts.map +1 -0
- package/dist/browser/index.cjs +80 -31
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +4 -1
- package/dist/browser/index.d.cts.map +1 -1
- package/dist/browser/index.d.mts +4 -1
- package/dist/browser/index.d.mts.map +1 -1
- package/dist/browser/index.d.ts +4 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +80 -31
- package/dist/browser/index.js.map +1 -1
- package/dist/node/{IndexedDbArchivist.d.cts → Archivist.d.cts} +17 -24
- package/dist/node/Archivist.d.cts.map +1 -0
- package/dist/node/Archivist.d.mts +45 -0
- package/dist/node/Archivist.d.mts.map +1 -0
- package/dist/node/Archivist.d.ts +45 -0
- package/dist/node/Archivist.d.ts.map +1 -0
- package/dist/node/Config.d.cts +30 -0
- package/dist/node/Config.d.cts.map +1 -0
- package/dist/node/Config.d.mts +30 -0
- package/dist/node/Config.d.mts.map +1 -0
- package/dist/node/Config.d.ts +30 -0
- package/dist/node/Config.d.ts.map +1 -0
- package/dist/node/Params.d.cts +5 -0
- package/dist/node/Params.d.cts.map +1 -0
- package/dist/node/Params.d.mts +5 -0
- package/dist/node/Params.d.mts.map +1 -0
- package/dist/node/Params.d.ts +5 -0
- package/dist/node/Params.d.ts.map +1 -0
- package/dist/node/Schema.d.cts +3 -0
- package/dist/node/Schema.d.cts.map +1 -0
- package/dist/node/Schema.d.mts +3 -0
- package/dist/node/Schema.d.mts.map +1 -0
- package/dist/node/Schema.d.ts +3 -0
- package/dist/node/Schema.d.ts.map +1 -0
- package/dist/node/index.cjs +84 -32
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +4 -1
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.mts +4 -1
- package/dist/node/index.d.mts.map +1 -1
- package/dist/node/index.d.ts +4 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +82 -31
- package/dist/node/index.js.map +1 -1
- package/package.json +14 -15
- package/src/Archivist.ts +144 -0
- package/src/Config.ts +32 -0
- package/src/Params.ts +6 -0
- package/src/Schema.ts +2 -0
- package/src/index.ts +4 -1
- package/dist/browser/IndexedDbArchivist.d.cts.map +0 -1
- package/dist/browser/IndexedDbArchivist.d.mts.map +0 -1
- package/dist/browser/IndexedDbArchivist.d.ts.map +0 -1
- package/dist/node/IndexedDbArchivist.d.cts.map +0 -1
- package/dist/node/IndexedDbArchivist.d.mts +0 -52
- package/dist/node/IndexedDbArchivist.d.mts.map +0 -1
- package/dist/node/IndexedDbArchivist.d.ts +0 -52
- package/dist/node/IndexedDbArchivist.d.ts.map +0 -1
- package/src/IndexedDbArchivist.ts +0 -120
- package/src/sample.archivist.xyo.json +0 -16
- package/src/spec/testArchivist.ts +0 -50
|
@@ -1,25 +1,16 @@
|
|
|
1
1
|
import { AbstractArchivist } from '@xyo-network/archivist-abstract';
|
|
2
|
-
import {
|
|
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
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
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`.
|
|
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=
|
|
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 {
|
|
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
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
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`.
|
|
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=
|
|
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 {
|
|
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
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
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`.
|
|
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=
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -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/
|
|
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
|
|
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`.
|
|
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
|
|
95
|
-
return
|
|
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
|
|
121
|
+
await this.db.clear(this.storeName);
|
|
99
122
|
}
|
|
100
123
|
async deleteHandler(hashes) {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
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"]}
|
package/dist/browser/index.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
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"}
|
package/dist/browser/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
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"}
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
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"}
|