@aztec/kv-store 0.23.0
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/README.md +10 -0
- package/dest/interfaces/array.d.ts +48 -0
- package/dest/interfaces/array.d.ts.map +1 -0
- package/dest/interfaces/array.js +2 -0
- package/dest/interfaces/common.d.ts +18 -0
- package/dest/interfaces/common.d.ts.map +1 -0
- package/dest/interfaces/common.js +2 -0
- package/dest/interfaces/counter.d.ts +39 -0
- package/dest/interfaces/counter.d.ts.map +1 -0
- package/dest/interfaces/counter.js +2 -0
- package/dest/interfaces/index.d.ts +7 -0
- package/dest/interfaces/index.d.ts.map +1 -0
- package/dest/interfaces/index.js +6 -0
- package/dest/interfaces/map.d.ts +72 -0
- package/dest/interfaces/map.d.ts.map +1 -0
- package/dest/interfaces/map.js +2 -0
- package/dest/interfaces/singleton.d.ts +20 -0
- package/dest/interfaces/singleton.d.ts.map +1 -0
- package/dest/interfaces/singleton.js +2 -0
- package/dest/interfaces/store.d.ts +47 -0
- package/dest/interfaces/store.d.ts.map +1 -0
- package/dest/interfaces/store.js +2 -0
- package/dest/lmdb/array.d.ts +18 -0
- package/dest/lmdb/array.d.ts.map +1 -0
- package/dest/lmdb/array.js +86 -0
- package/dest/lmdb/counter.d.ts +16 -0
- package/dest/lmdb/counter.d.ts.map +1 -0
- package/dest/lmdb/counter.js +48 -0
- package/dest/lmdb/index.d.ts +2 -0
- package/dest/lmdb/index.d.ts.map +1 -0
- package/dest/lmdb/index.js +2 -0
- package/dest/lmdb/map.d.ts +29 -0
- package/dest/lmdb/map.d.ts.map +1 -0
- package/dest/lmdb/map.js +100 -0
- package/dest/lmdb/singleton.d.ts +13 -0
- package/dest/lmdb/singleton.d.ts.map +1 -0
- package/dest/lmdb/singleton.js +24 -0
- package/dest/lmdb/store.d.ts +62 -0
- package/dest/lmdb/store.d.ts.map +1 -0
- package/dest/lmdb/store.js +97 -0
- package/dest/utils.d.ts +17 -0
- package/dest/utils.d.ts.map +1 -0
- package/dest/utils.js +27 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# KV Store
|
|
2
|
+
|
|
3
|
+
The Aztec KV store is an implementation of a durable key-value database with a pluggable backend. THe only supported backend right now is LMDB by using the [`lmdb-js` package](https://github.com/kriszyp/lmdb-js).
|
|
4
|
+
|
|
5
|
+
This package exports a number of primitive data structures that can be used to build domain-specific databases in each node component (e.g. a PXE database or an Archiver database). The data structures supported:
|
|
6
|
+
|
|
7
|
+
- singleton - holds a single value. Great for when a value needs to be stored but it's not a collection (e.g. the latest block header or the length of an array)
|
|
8
|
+
- array - works like a normal in-memory JS array. It can't contain holes and it can be used as a stack (push-pop mechanics).
|
|
9
|
+
- map - a hashmap where keys can be numbers or strings
|
|
10
|
+
- multi-map - just like a map but each key holds multiple values. Can be used for indexing into other data structures
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An array backed by a persistent store. Can not have any holes in it.
|
|
3
|
+
*/
|
|
4
|
+
export interface AztecArray<T> {
|
|
5
|
+
/**
|
|
6
|
+
* The size of the array
|
|
7
|
+
*/
|
|
8
|
+
length: number;
|
|
9
|
+
/**
|
|
10
|
+
* Pushes values to the end of the array
|
|
11
|
+
* @param vals - The values to push to the end of the array
|
|
12
|
+
* @returns The new length of the array
|
|
13
|
+
*/
|
|
14
|
+
push(...vals: T[]): Promise<number>;
|
|
15
|
+
/**
|
|
16
|
+
* Pops a value from the end of the array.
|
|
17
|
+
* @returns The value that was popped, or undefined if the array was empty
|
|
18
|
+
*/
|
|
19
|
+
pop(): Promise<T | undefined>;
|
|
20
|
+
/**
|
|
21
|
+
* Gets the value at the given index. Index can be in the range [-length, length - 1).
|
|
22
|
+
* If the index is negative, it will be treated as an offset from the end of the array.
|
|
23
|
+
*
|
|
24
|
+
* @param index - The index to get the value from
|
|
25
|
+
* @returns The value at the given index or undefined if the index is out of bounds
|
|
26
|
+
*/
|
|
27
|
+
at(index: number): T | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Updates the value at the given index. Index can be in the range [-length, length - 1).
|
|
30
|
+
* @param index - The index to set the value at
|
|
31
|
+
* @param val - The value to set
|
|
32
|
+
* @returns Whether the value was set
|
|
33
|
+
*/
|
|
34
|
+
setAt(index: number, val: T): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Iterates over the array with indexes.
|
|
37
|
+
*/
|
|
38
|
+
entries(): IterableIterator<[number, T]>;
|
|
39
|
+
/**
|
|
40
|
+
* Iterates over the array.
|
|
41
|
+
*/
|
|
42
|
+
values(): IterableIterator<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Iterates over the array.
|
|
45
|
+
*/
|
|
46
|
+
[Symbol.iterator](): IterableIterator<T>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/interfaces/array.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC;;;OAGG;IACH,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAE9B;;;;;;OAMG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAEjC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;OAEG;IACH,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzC;;OAEG;IACH,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE9B;;OAEG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC1C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The key type for use with the kv-store
|
|
3
|
+
*/
|
|
4
|
+
export type Key = string | number | Array<string | number>;
|
|
5
|
+
/**
|
|
6
|
+
* A range of keys to iterate over.
|
|
7
|
+
*/
|
|
8
|
+
export type Range<K extends Key = Key> = {
|
|
9
|
+
/** The key of the first item to include */
|
|
10
|
+
start?: K;
|
|
11
|
+
/** The key of the last item to include */
|
|
12
|
+
end?: K;
|
|
13
|
+
/** Whether to iterate in reverse */
|
|
14
|
+
reverse?: boolean;
|
|
15
|
+
/** The maximum number of items to iterate over */
|
|
16
|
+
limit?: number;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/interfaces/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI;IACvC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,0CAA0C;IAC1C,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Key, Range } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* A map that counts how many times it sees a key. Once 0 is reached, that key is removed from the map.
|
|
4
|
+
* Iterating over the map will only return keys that have a count over 0.
|
|
5
|
+
*
|
|
6
|
+
* Keys are stored in sorted order
|
|
7
|
+
*/
|
|
8
|
+
export interface AztecCounter<K extends Key = Key> {
|
|
9
|
+
/**
|
|
10
|
+
* Resets the count of the given key to the given value.
|
|
11
|
+
* @param key - The key to reset
|
|
12
|
+
* @param value - The value to reset the key to
|
|
13
|
+
*/
|
|
14
|
+
set(key: K, value: number): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Updates the count of the given key by the given delta. This can be used to increment or decrement the count.
|
|
17
|
+
* Once a key's count reaches 0, it is removed from the map.
|
|
18
|
+
*
|
|
19
|
+
* @param key - The key to update
|
|
20
|
+
* @param delta - The amount to modify the key by
|
|
21
|
+
*/
|
|
22
|
+
update(key: K, delta: number): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Gets the current count.
|
|
25
|
+
* @param key - The key to get the count of
|
|
26
|
+
*/
|
|
27
|
+
get(key: K): number;
|
|
28
|
+
/**
|
|
29
|
+
* Returns keys in the map in sorted order. Only returns keys that have been seen at least once.
|
|
30
|
+
* @param range - The range of keys to iterate over
|
|
31
|
+
*/
|
|
32
|
+
keys(range: Range<K>): IterableIterator<K>;
|
|
33
|
+
/**
|
|
34
|
+
* Returns keys and their counts in the map sorted by the key. Only returns keys that have been seen at least once.
|
|
35
|
+
* @param range - The range of keys to iterate over
|
|
36
|
+
*/
|
|
37
|
+
entries(range: Range<K>): IterableIterator<[K, number]>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../src/interfaces/counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;IAC/C;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC;IAEpB;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE3C;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './array.js';
|
|
2
|
+
export * from './map.js';
|
|
3
|
+
export * from './counter.js';
|
|
4
|
+
export * from './singleton.js';
|
|
5
|
+
export * from './store.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDIn0=
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Key, Range } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* A map backed by a persistent store.
|
|
4
|
+
*/
|
|
5
|
+
export interface AztecMap<K extends Key, V> {
|
|
6
|
+
/**
|
|
7
|
+
* Gets the value at the given key.
|
|
8
|
+
* @param key - The key to get the value from
|
|
9
|
+
*/
|
|
10
|
+
get(key: K): V | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Checks if a key exists in the map.
|
|
13
|
+
* @param key - The key to check
|
|
14
|
+
* @returns True if the key exists, false otherwise
|
|
15
|
+
*/
|
|
16
|
+
has(key: K): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Sets the value at the given key.
|
|
19
|
+
* @param key - The key to set the value at
|
|
20
|
+
* @param val - The value to set
|
|
21
|
+
*/
|
|
22
|
+
set(key: K, val: V): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Atomically swap the value at the given key
|
|
25
|
+
* @param key - The key to swap the value at
|
|
26
|
+
* @param fn - The function to swap the value with
|
|
27
|
+
*/
|
|
28
|
+
swap(key: K, fn: (val: V | undefined) => V): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Sets the value at the given key if it does not already exist.
|
|
31
|
+
* @param key - The key to set the value at
|
|
32
|
+
* @param val - The value to set
|
|
33
|
+
*/
|
|
34
|
+
setIfNotExists(key: K, val: V): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Deletes the value at the given key.
|
|
37
|
+
* @param key - The key to delete the value at
|
|
38
|
+
*/
|
|
39
|
+
delete(key: K): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Iterates over the map's key-value entries in the key's natural order
|
|
42
|
+
* @param range - The range of keys to iterate over
|
|
43
|
+
*/
|
|
44
|
+
entries(range?: Range<K>): IterableIterator<[K, V]>;
|
|
45
|
+
/**
|
|
46
|
+
* Iterates over the map's values in the key's natural order
|
|
47
|
+
* @param range - The range of keys to iterate over
|
|
48
|
+
*/
|
|
49
|
+
values(range?: Range<K>): IterableIterator<V>;
|
|
50
|
+
/**
|
|
51
|
+
* Iterates over the map's keys in the key's natural order
|
|
52
|
+
* @param range - The range of keys to iterate over
|
|
53
|
+
*/
|
|
54
|
+
keys(range?: Range<K>): IterableIterator<K>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A map backed by a persistent store that can have multiple values for a single key.
|
|
58
|
+
*/
|
|
59
|
+
export interface AztecMultiMap<K extends Key, V> extends AztecMap<K, V> {
|
|
60
|
+
/**
|
|
61
|
+
* Gets all the values at the given key.
|
|
62
|
+
* @param key - The key to get the values from
|
|
63
|
+
*/
|
|
64
|
+
getValues(key: K): IterableIterator<V>;
|
|
65
|
+
/**
|
|
66
|
+
* Deletes a specific value at the given key.
|
|
67
|
+
* @param key - The key to delete the value at
|
|
68
|
+
* @param val - The value to delete
|
|
69
|
+
*/
|
|
70
|
+
deleteValue(key: K, val: V): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/interfaces/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;IACxC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAE3B;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IAErB;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9D;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;OAGG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpD;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE9C;;;OAGG;IACH,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAEvC;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a singleton value in the database.
|
|
3
|
+
* Note: The singleton loses type info so it's recommended to serialize to buffer when storing it.
|
|
4
|
+
*/
|
|
5
|
+
export interface AztecSingleton<T> {
|
|
6
|
+
/**
|
|
7
|
+
* Gets the value.
|
|
8
|
+
*/
|
|
9
|
+
get(): T | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Sets the value.
|
|
12
|
+
* @param val - The new value
|
|
13
|
+
*/
|
|
14
|
+
set(val: T): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Deletes the value.
|
|
17
|
+
*/
|
|
18
|
+
delete(): Promise<boolean>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=singleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/interfaces/singleton.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B;;OAEG;IACH,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAErB;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9B;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { AztecArray } from './array.js';
|
|
2
|
+
import { Key } from './common.js';
|
|
3
|
+
import { AztecCounter } from './counter.js';
|
|
4
|
+
import { AztecMap, AztecMultiMap } from './map.js';
|
|
5
|
+
import { AztecSingleton } from './singleton.js';
|
|
6
|
+
/** A key-value store */
|
|
7
|
+
export interface AztecKVStore {
|
|
8
|
+
/**
|
|
9
|
+
* Creates a new map.
|
|
10
|
+
* @param name - The name of the map
|
|
11
|
+
* @returns The map
|
|
12
|
+
*/
|
|
13
|
+
openMap<K extends string | number, V>(name: string): AztecMap<K, V>;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new multi-map.
|
|
16
|
+
* @param name - The name of the multi-map
|
|
17
|
+
* @returns The multi-map
|
|
18
|
+
*/
|
|
19
|
+
openMultiMap<K extends string | number, V>(name: string): AztecMultiMap<K, V>;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new array.
|
|
22
|
+
* @param name - The name of the array
|
|
23
|
+
* @returns The array
|
|
24
|
+
*/
|
|
25
|
+
openArray<T>(name: string): AztecArray<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a new singleton.
|
|
28
|
+
* @param name - The name of the singleton
|
|
29
|
+
* @returns The singleton
|
|
30
|
+
*/
|
|
31
|
+
openSingleton<T>(name: string): AztecSingleton<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new count map.
|
|
34
|
+
* @param name - name of the counter
|
|
35
|
+
*/
|
|
36
|
+
openCounter<K extends Key>(name: string): AztecCounter<K>;
|
|
37
|
+
/**
|
|
38
|
+
* Starts a transaction. All calls to read/write data while in a transaction are queued and executed atomically.
|
|
39
|
+
* @param callback - The callback to execute in a transaction
|
|
40
|
+
*/
|
|
41
|
+
transaction<T extends Exclude<any, Promise<any>>>(callback: () => T): Promise<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Clears the store
|
|
44
|
+
*/
|
|
45
|
+
clear(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/interfaces/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wBAAwB;AACxB,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpE;;;;OAIG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E;;;;OAIG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAE1C;;;;OAIG;IACH,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAElD;;;OAGG;IACH,WAAW,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAE1D;;;OAGG;IACH,WAAW,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjF;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Database, Key } from 'lmdb';
|
|
2
|
+
import { AztecArray } from '../interfaces/array.js';
|
|
3
|
+
/**
|
|
4
|
+
* An persistent array backed by LMDB.
|
|
5
|
+
*/
|
|
6
|
+
export declare class LmdbAztecArray<T> implements AztecArray<T> {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(db: Database<unknown, Key>, arrName: string);
|
|
9
|
+
get length(): number;
|
|
10
|
+
push(...vals: T[]): Promise<number>;
|
|
11
|
+
pop(): Promise<T | undefined>;
|
|
12
|
+
at(index: number): T | undefined;
|
|
13
|
+
setAt(index: number, val: T): Promise<boolean>;
|
|
14
|
+
entries(): IterableIterator<[number, T]>;
|
|
15
|
+
values(): IterableIterator<T>;
|
|
16
|
+
[Symbol.iterator](): IterableIterator<T>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/lmdb/array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMpD;;GAEG;AACH,qBAAa,cAAc,CAAC,CAAC,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;;gBAKzC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM;IAMvD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAiB7B,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAchC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAY7C,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAYxC,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAM9B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC;CAOzC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
var _LmdbAztecArray_instances, _LmdbAztecArray_db, _LmdbAztecArray_name, _LmdbAztecArray_length, _LmdbAztecArray_slot;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { LmdbAztecSingleton } from './singleton.js';
|
|
4
|
+
/**
|
|
5
|
+
* An persistent array backed by LMDB.
|
|
6
|
+
*/
|
|
7
|
+
export class LmdbAztecArray {
|
|
8
|
+
constructor(db, arrName) {
|
|
9
|
+
_LmdbAztecArray_instances.add(this);
|
|
10
|
+
_LmdbAztecArray_db.set(this, void 0);
|
|
11
|
+
_LmdbAztecArray_name.set(this, void 0);
|
|
12
|
+
_LmdbAztecArray_length.set(this, void 0);
|
|
13
|
+
__classPrivateFieldSet(this, _LmdbAztecArray_name, arrName, "f");
|
|
14
|
+
__classPrivateFieldSet(this, _LmdbAztecArray_length, new LmdbAztecSingleton(db, `${arrName}:meta:length`), "f");
|
|
15
|
+
__classPrivateFieldSet(this, _LmdbAztecArray_db, db, "f");
|
|
16
|
+
}
|
|
17
|
+
get length() {
|
|
18
|
+
return __classPrivateFieldGet(this, _LmdbAztecArray_length, "f").get() ?? 0;
|
|
19
|
+
}
|
|
20
|
+
push(...vals) {
|
|
21
|
+
return __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").childTransaction(() => {
|
|
22
|
+
let length = this.length;
|
|
23
|
+
for (const val of vals) {
|
|
24
|
+
void __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").put(__classPrivateFieldGet(this, _LmdbAztecArray_instances, "m", _LmdbAztecArray_slot).call(this, length), val);
|
|
25
|
+
length += 1;
|
|
26
|
+
}
|
|
27
|
+
void __classPrivateFieldGet(this, _LmdbAztecArray_length, "f").set(length);
|
|
28
|
+
return length;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
pop() {
|
|
32
|
+
return __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").childTransaction(() => {
|
|
33
|
+
const length = this.length;
|
|
34
|
+
if (length === 0) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const slot = __classPrivateFieldGet(this, _LmdbAztecArray_instances, "m", _LmdbAztecArray_slot).call(this, length - 1);
|
|
38
|
+
const val = __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").get(slot);
|
|
39
|
+
void __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").remove(slot);
|
|
40
|
+
void __classPrivateFieldGet(this, _LmdbAztecArray_length, "f").set(length - 1);
|
|
41
|
+
return val;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
at(index) {
|
|
45
|
+
if (index < 0) {
|
|
46
|
+
index = this.length + index;
|
|
47
|
+
}
|
|
48
|
+
// the Array API only accepts indexes in the range [-this.length, this.length)
|
|
49
|
+
// so if after normalizing the index is still out of range, return undefined
|
|
50
|
+
if (index < 0 || index >= this.length) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").get(__classPrivateFieldGet(this, _LmdbAztecArray_instances, "m", _LmdbAztecArray_slot).call(this, index));
|
|
54
|
+
}
|
|
55
|
+
setAt(index, val) {
|
|
56
|
+
if (index < 0) {
|
|
57
|
+
index = this.length + index;
|
|
58
|
+
}
|
|
59
|
+
if (index < 0 || index >= this.length) {
|
|
60
|
+
return Promise.resolve(false);
|
|
61
|
+
}
|
|
62
|
+
return __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").put(__classPrivateFieldGet(this, _LmdbAztecArray_instances, "m", _LmdbAztecArray_slot).call(this, index), val);
|
|
63
|
+
}
|
|
64
|
+
*entries() {
|
|
65
|
+
const values = __classPrivateFieldGet(this, _LmdbAztecArray_db, "f").getRange({
|
|
66
|
+
start: __classPrivateFieldGet(this, _LmdbAztecArray_instances, "m", _LmdbAztecArray_slot).call(this, 0),
|
|
67
|
+
limit: this.length,
|
|
68
|
+
});
|
|
69
|
+
for (const { key, value } of values) {
|
|
70
|
+
const index = key[3];
|
|
71
|
+
yield [index, value];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
*values() {
|
|
75
|
+
for (const [_, value] of this.entries()) {
|
|
76
|
+
yield value;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
[(_LmdbAztecArray_db = new WeakMap(), _LmdbAztecArray_name = new WeakMap(), _LmdbAztecArray_length = new WeakMap(), _LmdbAztecArray_instances = new WeakSet(), Symbol.iterator)]() {
|
|
80
|
+
return this.values();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
_LmdbAztecArray_slot = function _LmdbAztecArray_slot(index) {
|
|
84
|
+
return ['array', __classPrivateFieldGet(this, _LmdbAztecArray_name, "f"), 'slot', index];
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi9hcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3BEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFLekIsWUFBWSxFQUEwQixFQUFFLE9BQWU7O1FBSnZELHFDQUFpQztRQUNqQyx1Q0FBYztRQUNkLHlDQUFvQztRQUdsQyx1QkFBQSxJQUFJLHdCQUFTLE9BQU8sTUFBQSxDQUFDO1FBQ3JCLHVCQUFBLElBQUksMEJBQVcsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLGNBQWMsQ0FBQyxNQUFBLENBQUM7UUFDcEUsdUJBQUEsSUFBSSxzQkFBTyxFQUFpQyxNQUFBLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sdUJBQUEsSUFBSSw4QkFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxDQUFDLEdBQUcsSUFBUztRQUNmLE9BQU8sdUJBQUEsSUFBSSwwQkFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUNwQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssdUJBQUEsSUFBSSwwQkFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBQSxJQUFJLHVEQUFNLE1BQVYsSUFBSSxFQUFPLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ2QsQ0FBQztZQUVELEtBQUssdUJBQUEsSUFBSSw4QkFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMs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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Key as BaseKey, Database } from 'lmdb';
|
|
2
|
+
import { Key, Range } from '../interfaces/common.js';
|
|
3
|
+
import { AztecCounter } from '../interfaces/counter.js';
|
|
4
|
+
/**
|
|
5
|
+
* A counter implementation backed by LMDB
|
|
6
|
+
*/
|
|
7
|
+
export declare class LmdbAztecCounter<K extends Key> implements AztecCounter<K> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(db: Database<unknown, BaseKey>, name: string);
|
|
10
|
+
set(key: K, value: number): Promise<boolean>;
|
|
11
|
+
update(key: K, delta?: number): Promise<boolean>;
|
|
12
|
+
get(key: K): number;
|
|
13
|
+
entries(range?: Range<K>): IterableIterator<[K, number]>;
|
|
14
|
+
keys(range?: Range<K>): IterableIterator<K>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../src/lmdb/counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD;;GAEG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,GAAG,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;;gBAKzD,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM;IAMxD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5C,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB3C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAInB,OAAO,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAI5D,IAAI,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAGhD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var _LmdbAztecCounter_db, _LmdbAztecCounter_name, _LmdbAztecCounter_map;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { LmdbAztecMap } from './map.js';
|
|
4
|
+
/**
|
|
5
|
+
* A counter implementation backed by LMDB
|
|
6
|
+
*/
|
|
7
|
+
export class LmdbAztecCounter {
|
|
8
|
+
constructor(db, name) {
|
|
9
|
+
_LmdbAztecCounter_db.set(this, void 0);
|
|
10
|
+
_LmdbAztecCounter_name.set(this, void 0);
|
|
11
|
+
_LmdbAztecCounter_map.set(this, void 0);
|
|
12
|
+
__classPrivateFieldSet(this, _LmdbAztecCounter_db, db, "f");
|
|
13
|
+
__classPrivateFieldSet(this, _LmdbAztecCounter_name, name, "f");
|
|
14
|
+
__classPrivateFieldSet(this, _LmdbAztecCounter_map, new LmdbAztecMap(db, name), "f");
|
|
15
|
+
}
|
|
16
|
+
set(key, value) {
|
|
17
|
+
return __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").set(key, value);
|
|
18
|
+
}
|
|
19
|
+
update(key, delta = 1) {
|
|
20
|
+
return __classPrivateFieldGet(this, _LmdbAztecCounter_db, "f").childTransaction(() => {
|
|
21
|
+
const current = __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").get(key) ?? 0;
|
|
22
|
+
const next = current + delta;
|
|
23
|
+
if (next < 0) {
|
|
24
|
+
throw new Error(`Cannot update ${key} in counter ${__classPrivateFieldGet(this, _LmdbAztecCounter_name, "f")} below zero`);
|
|
25
|
+
}
|
|
26
|
+
if (next === 0) {
|
|
27
|
+
void __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").delete(key);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// store the key inside the entry because LMDB might return an internal representation
|
|
31
|
+
// of the key when iterating over the database
|
|
32
|
+
void __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").set(key, next);
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
get(key) {
|
|
38
|
+
return __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").get(key) ?? 0;
|
|
39
|
+
}
|
|
40
|
+
entries(range = {}) {
|
|
41
|
+
return __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").entries(range);
|
|
42
|
+
}
|
|
43
|
+
keys(range = {}) {
|
|
44
|
+
return __classPrivateFieldGet(this, _LmdbAztecCounter_map, "f").keys(range);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
_LmdbAztecCounter_db = new WeakMap(), _LmdbAztecCounter_name = new WeakMap(), _LmdbAztecCounter_map = new WeakMap();
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sbWRiL2NvdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUszQixZQUFZLEVBQThCLEVBQUUsSUFBWTtRQUp4RCx1Q0FBYztRQUNkLHlDQUFjO1FBQ2Qsd0NBQThCO1FBRzVCLHVCQUFBLElBQUksd0JBQU8sRUFBRSxNQUFBLENBQUM7UUFDZCx1QkFBQSxJQUFJLDBCQUFTLElBQUksTUFBQSxDQUFDO1FBQ2xCLHVCQUFBLElBQUkseUJBQVEsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFBLENBQUM7SUFDekMsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFNLEVBQUUsS0FBYTtRQUN2QixPQUFPLHVCQUFBLElBQUksNkJBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBTSxFQUFFLEtBQUssR0FBRyxDQUFDO1FBQ3RCLE9BQU8sdUJBQUEsSUFBSSw0QkFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyx1QkFBQSxJQUFJLDZCQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxNQUFNLElBQUksR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBRTdCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsZUFBZSx1QkFBQSxJQUFJLDhCQUFNLGFBQWEsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFFRCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDZixLQUFLLHVCQUFBLElBQUksNkJBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHNGQUFzRjtnQkFDdEYsOENBQThDO2dCQUM5QyxLQUFLLHVCQUFBLElBQUksNkJBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFNO1FBQ1IsT0FBTyx1QkFBQSxJQUFJLDZCQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQWtCLEVBQUU7UUFDMUIsT0FBTyx1QkFBQSxJQUFJLDZCQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBa0IsRUFBRTtRQUN2QixPQUFPLHVCQUFBLElBQUksNkJBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lmdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AztecLmdbStore } from './store.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDIn0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { Database } from 'lmdb';
|
|
3
|
+
import { Key, Range } from '../interfaces/common.js';
|
|
4
|
+
import { AztecMultiMap } from '../interfaces/map.js';
|
|
5
|
+
/** The slot where a key-value entry would be stored */
|
|
6
|
+
type MapValueSlot<K extends Key | Buffer> = ['map', string, 'slot', K];
|
|
7
|
+
/**
|
|
8
|
+
* A map backed by LMDB.
|
|
9
|
+
*/
|
|
10
|
+
export declare class LmdbAztecMap<K extends Key, V> implements AztecMultiMap<K, V> {
|
|
11
|
+
#private;
|
|
12
|
+
protected db: Database<[K, V], MapValueSlot<K>>;
|
|
13
|
+
protected name: string;
|
|
14
|
+
constructor(rootDb: Database, mapName: string);
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
get(key: K): V | undefined;
|
|
17
|
+
getValues(key: K): IterableIterator<V>;
|
|
18
|
+
has(key: K): boolean;
|
|
19
|
+
set(key: K, val: V): Promise<boolean>;
|
|
20
|
+
swap(key: K, fn: (val: V | undefined) => V): Promise<boolean>;
|
|
21
|
+
setIfNotExists(key: K, val: V): Promise<boolean>;
|
|
22
|
+
delete(key: K): Promise<boolean>;
|
|
23
|
+
deleteValue(key: K, val: V): Promise<void>;
|
|
24
|
+
entries(range?: Range<K>): IterableIterator<[K, V]>;
|
|
25
|
+
values(range?: Range<K>): IterableIterator<V>;
|
|
26
|
+
keys(range?: Range<K>): IterableIterator<K>;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/lmdb/map.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAgB,MAAM,MAAM,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,uDAAuD;AACvD,KAAK,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAEvE;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;;IACxE,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;gBAKX,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;IAW7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAIzB,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAOvC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7D,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOhD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1B,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAoCvD,MAAM,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAMjD,IAAI,CAAC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;CASjD"}
|
package/dest/lmdb/map.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
var _LmdbAztecMap_instances, _LmdbAztecMap_startSentinel, _LmdbAztecMap_endSentinel, _LmdbAztecMap_slot;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
/**
|
|
4
|
+
* A map backed by LMDB.
|
|
5
|
+
*/
|
|
6
|
+
export class LmdbAztecMap {
|
|
7
|
+
constructor(rootDb, mapName) {
|
|
8
|
+
_LmdbAztecMap_instances.add(this);
|
|
9
|
+
_LmdbAztecMap_startSentinel.set(this, void 0);
|
|
10
|
+
_LmdbAztecMap_endSentinel.set(this, void 0);
|
|
11
|
+
this.name = mapName;
|
|
12
|
+
this.db = rootDb;
|
|
13
|
+
// sentinels are used to define the start and end of the map
|
|
14
|
+
// with LMDB's key encoding, no _primitive value_ can be "less than" an empty buffer or greater than Byte 255
|
|
15
|
+
// these will be used later to answer range queries
|
|
16
|
+
__classPrivateFieldSet(this, _LmdbAztecMap_startSentinel, ['map', this.name, 'slot', Buffer.from([])], "f");
|
|
17
|
+
__classPrivateFieldSet(this, _LmdbAztecMap_endSentinel, ['map', this.name, 'slot', Buffer.from([255])], "f");
|
|
18
|
+
}
|
|
19
|
+
close() {
|
|
20
|
+
return this.db.close();
|
|
21
|
+
}
|
|
22
|
+
get(key) {
|
|
23
|
+
return this.db.get(__classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key))?.[1];
|
|
24
|
+
}
|
|
25
|
+
*getValues(key) {
|
|
26
|
+
const values = this.db.getValues(__classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key));
|
|
27
|
+
for (const value of values) {
|
|
28
|
+
yield value?.[1];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
has(key) {
|
|
32
|
+
return this.db.doesExist(__classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key));
|
|
33
|
+
}
|
|
34
|
+
set(key, val) {
|
|
35
|
+
return this.db.put(__classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key), [key, val]);
|
|
36
|
+
}
|
|
37
|
+
swap(key, fn) {
|
|
38
|
+
return this.db.childTransaction(() => {
|
|
39
|
+
const slot = __classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key);
|
|
40
|
+
const entry = this.db.get(slot);
|
|
41
|
+
void this.db.put(slot, [key, fn(entry?.[1])]);
|
|
42
|
+
return true;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
setIfNotExists(key, val) {
|
|
46
|
+
const slot = __classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key);
|
|
47
|
+
return this.db.ifNoExists(slot, () => {
|
|
48
|
+
void this.db.put(slot, [key, val]);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
delete(key) {
|
|
52
|
+
return this.db.remove(__classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key));
|
|
53
|
+
}
|
|
54
|
+
async deleteValue(key, val) {
|
|
55
|
+
await this.db.remove(__classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, key), [key, val]);
|
|
56
|
+
}
|
|
57
|
+
*entries(range = {}) {
|
|
58
|
+
const { reverse = false, limit } = range;
|
|
59
|
+
// LMDB has a quirk where it expects start > end when reverse=true
|
|
60
|
+
// in that case, we need to swap the start and end sentinels
|
|
61
|
+
const start = reverse
|
|
62
|
+
? range.end
|
|
63
|
+
? __classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, range.end)
|
|
64
|
+
: __classPrivateFieldGet(this, _LmdbAztecMap_endSentinel, "f")
|
|
65
|
+
: range.start
|
|
66
|
+
? __classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, range.start)
|
|
67
|
+
: __classPrivateFieldGet(this, _LmdbAztecMap_startSentinel, "f");
|
|
68
|
+
const end = reverse
|
|
69
|
+
? range.start
|
|
70
|
+
? __classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, range.start)
|
|
71
|
+
: __classPrivateFieldGet(this, _LmdbAztecMap_startSentinel, "f")
|
|
72
|
+
: range.end
|
|
73
|
+
? __classPrivateFieldGet(this, _LmdbAztecMap_instances, "m", _LmdbAztecMap_slot).call(this, range.end)
|
|
74
|
+
: __classPrivateFieldGet(this, _LmdbAztecMap_endSentinel, "f");
|
|
75
|
+
const lmdbRange = {
|
|
76
|
+
start,
|
|
77
|
+
end,
|
|
78
|
+
reverse,
|
|
79
|
+
limit,
|
|
80
|
+
};
|
|
81
|
+
const iterator = this.db.getRange(lmdbRange);
|
|
82
|
+
for (const { value: [key, value], } of iterator) {
|
|
83
|
+
yield [key, value];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
*values(range = {}) {
|
|
87
|
+
for (const [_, value] of this.entries(range)) {
|
|
88
|
+
yield value;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
*keys(range = {}) {
|
|
92
|
+
for (const [key, _] of this.entries(range)) {
|
|
93
|
+
yield key;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
_LmdbAztecMap_startSentinel = new WeakMap(), _LmdbAztecMap_endSentinel = new WeakMap(), _LmdbAztecMap_instances = new WeakSet(), _LmdbAztecMap_slot = function _LmdbAztecMap_slot(key) {
|
|
98
|
+
return ['map', this.name, 'slot', key];
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xtZGIvbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQU92QixZQUFZLE1BQWdCLEVBQUUsT0FBZTs7UUFIN0MsOENBQXFDO1FBQ3JDLDRDQUFtQztRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQixJQUFJLENBQUMsRUFBRSxHQUFHLE1BQTJDLENBQUM7UUFFdEQsNERBQTREO1FBQzVELDZHQUE2RztRQUM3RyxtREFBbUQ7UUFDbkQsdUJBQUEsSUFBSSwrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFBLENBQUM7UUFDbEUsdUJBQUEsSUFBSSw2QkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBQSxDQUFDO0lBQ3JFLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsdUJBQUEsSUFBSSxtREFBTSxNQUFWLElBQUksRUFBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELENBQUMsU0FBUyxDQUFDLEdBQU07UUFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyx1QkFBQSxJQUFJLG1EQUFNLE1BQVYsSUFBSSxFQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsS0FBSyxN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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Database, Key } from 'lmdb';
|
|
2
|
+
import { AztecSingleton } from '../interfaces/singleton.js';
|
|
3
|
+
/**
|
|
4
|
+
* Stores a single value in LMDB.
|
|
5
|
+
*/
|
|
6
|
+
export declare class LmdbAztecSingleton<T> implements AztecSingleton<T> {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(db: Database<unknown, Key>, name: string);
|
|
9
|
+
get(): T | undefined;
|
|
10
|
+
set(val: T): Promise<boolean>;
|
|
11
|
+
delete(): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=singleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/lmdb/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAK5D;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;;gBAIjD,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM;IAKpD,GAAG,IAAI,CAAC,GAAG,SAAS;IAIpB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAG3B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
var _LmdbAztecSingleton_db, _LmdbAztecSingleton_slot;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
/**
|
|
4
|
+
* Stores a single value in LMDB.
|
|
5
|
+
*/
|
|
6
|
+
export class LmdbAztecSingleton {
|
|
7
|
+
constructor(db, name) {
|
|
8
|
+
_LmdbAztecSingleton_db.set(this, void 0);
|
|
9
|
+
_LmdbAztecSingleton_slot.set(this, void 0);
|
|
10
|
+
__classPrivateFieldSet(this, _LmdbAztecSingleton_db, db, "f");
|
|
11
|
+
__classPrivateFieldSet(this, _LmdbAztecSingleton_slot, ['singleton', name, 'value'], "f");
|
|
12
|
+
}
|
|
13
|
+
get() {
|
|
14
|
+
return __classPrivateFieldGet(this, _LmdbAztecSingleton_db, "f").get(__classPrivateFieldGet(this, _LmdbAztecSingleton_slot, "f"));
|
|
15
|
+
}
|
|
16
|
+
set(val) {
|
|
17
|
+
return __classPrivateFieldGet(this, _LmdbAztecSingleton_db, "f").put(__classPrivateFieldGet(this, _LmdbAztecSingleton_slot, "f"), val);
|
|
18
|
+
}
|
|
19
|
+
delete() {
|
|
20
|
+
return __classPrivateFieldGet(this, _LmdbAztecSingleton_db, "f").remove(__classPrivateFieldGet(this, _LmdbAztecSingleton_slot, "f"));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
_LmdbAztecSingleton_db = new WeakMap(), _LmdbAztecSingleton_slot = new WeakMap();
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xldG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xtZGIvc2luZ2xldG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0E7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBSTdCLFlBQVksRUFBMEIsRUFBRSxJQUFZO1FBSHBELHlDQUE0QjtRQUM1QiwyQ0FBaUI7UUFHZix1QkFBQSxJQUFJLDBCQUFPLEVBQTRCLE1BQUEsQ0FBQztRQUN4Qyx1QkFBQSxJQUFJLDRCQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBQSxDQUFDO0lBQzVDLENBQUM7SUFFRCxHQUFHO1FBQ0QsT0FBTyx1QkFBQSxJQUFJLDhCQUFJLENBQUMsR0FBRyxDQUFDLHVCQUFBLElBQUksZ0NBQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBTTtRQUNSLE9BQU8sdUJBQUEsSUFBSSw4QkFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBQSxJQUFJLGdDQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLHVCQUFBLElBQUksOEJBQUksQ0FBQyxNQUFNLENBQUMsdUJBQUEsSUFBSSxnQ0FBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { RootDatabase } from 'lmdb';
|
|
2
|
+
import { AztecArray } from '../interfaces/array.js';
|
|
3
|
+
import { AztecCounter } from '../interfaces/counter.js';
|
|
4
|
+
import { AztecMap, AztecMultiMap } from '../interfaces/map.js';
|
|
5
|
+
import { AztecSingleton } from '../interfaces/singleton.js';
|
|
6
|
+
import { AztecKVStore } from '../interfaces/store.js';
|
|
7
|
+
/**
|
|
8
|
+
* A key-value store backed by LMDB.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AztecLmdbStore implements AztecKVStore {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(rootDb: RootDatabase);
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new AztecKVStore backed by LMDB. The path to the database is optional. If not provided,
|
|
15
|
+
* the database will be stored in a temporary location and be deleted when the process exists.
|
|
16
|
+
*
|
|
17
|
+
* The `rollupAddress` passed is checked against what is stored in the database. If they do not match,
|
|
18
|
+
* the database is cleared before returning the store. This way data is not accidentally shared between
|
|
19
|
+
* different rollup instances.
|
|
20
|
+
*
|
|
21
|
+
* @param path - A path on the disk to store the database. Optional
|
|
22
|
+
* @param log - A logger to use. Optional
|
|
23
|
+
* @returns The store
|
|
24
|
+
*/
|
|
25
|
+
static open(path?: string, log?: import("@aztec/foundation/log").DebugLogger): AztecLmdbStore;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a new AztecMap in the store.
|
|
28
|
+
* @param name - Name of the map
|
|
29
|
+
* @returns A new AztecMap
|
|
30
|
+
*/
|
|
31
|
+
openMap<K extends string | number, V>(name: string): AztecMap<K, V>;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new AztecMultiMap in the store. A multi-map stores multiple values for a single key automatically.
|
|
34
|
+
* @param name - Name of the map
|
|
35
|
+
* @returns A new AztecMultiMap
|
|
36
|
+
*/
|
|
37
|
+
openMultiMap<K extends string | number, V>(name: string): AztecMultiMap<K, V>;
|
|
38
|
+
openCounter<K extends string | number | Array<string | number>>(name: string): AztecCounter<K>;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a new AztecArray in the store.
|
|
41
|
+
* @param name - Name of the array
|
|
42
|
+
* @returns A new AztecArray
|
|
43
|
+
*/
|
|
44
|
+
openArray<T>(name: string): AztecArray<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new AztecSingleton in the store.
|
|
47
|
+
* @param name - Name of the singleton
|
|
48
|
+
* @returns A new AztecSingleton
|
|
49
|
+
*/
|
|
50
|
+
openSingleton<T>(name: string): AztecSingleton<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Runs a callback in a transaction.
|
|
53
|
+
* @param callback - Function to execute in a transaction
|
|
54
|
+
* @returns A promise that resolves to the return value of the callback
|
|
55
|
+
*/
|
|
56
|
+
transaction<T>(callback: () => T): Promise<T>;
|
|
57
|
+
/**
|
|
58
|
+
* Clears the store
|
|
59
|
+
*/
|
|
60
|
+
clear(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lmdb/store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,YAAY,EAAQ,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMtD;;GAEG;AACH,qBAAa,cAAe,YAAW,YAAY;;gBAKrC,MAAM,EAAE,YAAY;IAgBhC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,8CAA2C,GAAG,cAAc;IAM1F;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAInE;;;;OAIG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAI7E,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC;IAI9F;;;;OAIG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAIzC;;;;OAIG;IACH,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;IAIjD;;;;OAIG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7C;;OAEG;IACG,KAAK;CAGZ"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
var _AztecLmdbStore_rootDb, _AztecLmdbStore_data, _AztecLmdbStore_multiMapData;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { open } from 'lmdb';
|
|
5
|
+
import { LmdbAztecArray } from './array.js';
|
|
6
|
+
import { LmdbAztecCounter } from './counter.js';
|
|
7
|
+
import { LmdbAztecMap } from './map.js';
|
|
8
|
+
import { LmdbAztecSingleton } from './singleton.js';
|
|
9
|
+
/**
|
|
10
|
+
* A key-value store backed by LMDB.
|
|
11
|
+
*/
|
|
12
|
+
export class AztecLmdbStore {
|
|
13
|
+
constructor(rootDb) {
|
|
14
|
+
_AztecLmdbStore_rootDb.set(this, void 0);
|
|
15
|
+
_AztecLmdbStore_data.set(this, void 0);
|
|
16
|
+
_AztecLmdbStore_multiMapData.set(this, void 0);
|
|
17
|
+
__classPrivateFieldSet(this, _AztecLmdbStore_rootDb, rootDb, "f");
|
|
18
|
+
// big bucket to store all the data
|
|
19
|
+
__classPrivateFieldSet(this, _AztecLmdbStore_data, rootDb.openDB('data', {
|
|
20
|
+
encoding: 'msgpack',
|
|
21
|
+
keyEncoding: 'ordered-binary',
|
|
22
|
+
}), "f");
|
|
23
|
+
__classPrivateFieldSet(this, _AztecLmdbStore_multiMapData, rootDb.openDB('data_dup_sort', {
|
|
24
|
+
encoding: 'msgpack',
|
|
25
|
+
keyEncoding: 'ordered-binary',
|
|
26
|
+
dupSort: true,
|
|
27
|
+
}), "f");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a new AztecKVStore backed by LMDB. The path to the database is optional. If not provided,
|
|
31
|
+
* the database will be stored in a temporary location and be deleted when the process exists.
|
|
32
|
+
*
|
|
33
|
+
* The `rollupAddress` passed is checked against what is stored in the database. If they do not match,
|
|
34
|
+
* the database is cleared before returning the store. This way data is not accidentally shared between
|
|
35
|
+
* different rollup instances.
|
|
36
|
+
*
|
|
37
|
+
* @param path - A path on the disk to store the database. Optional
|
|
38
|
+
* @param log - A logger to use. Optional
|
|
39
|
+
* @returns The store
|
|
40
|
+
*/
|
|
41
|
+
static open(path, log = createDebugLogger('aztec:kv-store:lmdb')) {
|
|
42
|
+
log.info(`Opening LMDB database at ${path || 'temporary location'}`);
|
|
43
|
+
const rootDb = open({ path });
|
|
44
|
+
return new AztecLmdbStore(rootDb);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates a new AztecMap in the store.
|
|
48
|
+
* @param name - Name of the map
|
|
49
|
+
* @returns A new AztecMap
|
|
50
|
+
*/
|
|
51
|
+
openMap(name) {
|
|
52
|
+
return new LmdbAztecMap(__classPrivateFieldGet(this, _AztecLmdbStore_data, "f"), name);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Creates a new AztecMultiMap in the store. A multi-map stores multiple values for a single key automatically.
|
|
56
|
+
* @param name - Name of the map
|
|
57
|
+
* @returns A new AztecMultiMap
|
|
58
|
+
*/
|
|
59
|
+
openMultiMap(name) {
|
|
60
|
+
return new LmdbAztecMap(__classPrivateFieldGet(this, _AztecLmdbStore_multiMapData, "f"), name);
|
|
61
|
+
}
|
|
62
|
+
openCounter(name) {
|
|
63
|
+
return new LmdbAztecCounter(__classPrivateFieldGet(this, _AztecLmdbStore_data, "f"), name);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a new AztecArray in the store.
|
|
67
|
+
* @param name - Name of the array
|
|
68
|
+
* @returns A new AztecArray
|
|
69
|
+
*/
|
|
70
|
+
openArray(name) {
|
|
71
|
+
return new LmdbAztecArray(__classPrivateFieldGet(this, _AztecLmdbStore_data, "f"), name);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Creates a new AztecSingleton in the store.
|
|
75
|
+
* @param name - Name of the singleton
|
|
76
|
+
* @returns A new AztecSingleton
|
|
77
|
+
*/
|
|
78
|
+
openSingleton(name) {
|
|
79
|
+
return new LmdbAztecSingleton(__classPrivateFieldGet(this, _AztecLmdbStore_data, "f"), name);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Runs a callback in a transaction.
|
|
83
|
+
* @param callback - Function to execute in a transaction
|
|
84
|
+
* @returns A promise that resolves to the return value of the callback
|
|
85
|
+
*/
|
|
86
|
+
transaction(callback) {
|
|
87
|
+
return __classPrivateFieldGet(this, _AztecLmdbStore_rootDb, "f").transaction(callback);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Clears the store
|
|
91
|
+
*/
|
|
92
|
+
async clear() {
|
|
93
|
+
await __classPrivateFieldGet(this, _AztecLmdbStore_rootDb, "f").clearAsync();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
_AztecLmdbStore_rootDb = new WeakMap(), _AztecLmdbStore_data = new WeakMap(), _AztecLmdbStore_multiMapData = new WeakMap();
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBK0IsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUt6QixZQUFZLE1BQW9CO1FBSmhDLHlDQUFzQjtRQUN0Qix1Q0FBOEI7UUFDOUIsK0NBQXNDO1FBR3BDLHVCQUFBLElBQUksMEJBQVcsTUFBTSxNQUFBLENBQUM7UUFFdEIsbUNBQW1DO1FBQ25DLHVCQUFBLElBQUksd0JBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakMsUUFBUSxFQUFFLFNBQVM7WUFDbkIsV0FBVyxFQUFFLGdCQUFnQjtTQUM5QixDQUFDLE1BQUEsQ0FBQztRQUVILHVCQUFBLElBQUksZ0NBQWlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO1lBQ2xELFFBQVEsRUFBRSxTQUFTO1lBQ25CLFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLE1BQUEsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBYSxFQUFFLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQztRQUN2RSxHQUFHLENBQUMsSUFBSSxDQUFDLDRCQUE0QixJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBK0IsSUFBWTtRQUNoRCxPQUFPLElBQUksWUFBWSxDQUFDLHVCQUFBLElBQUksNEJBQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBK0IsSUFBWTtRQUNyRCxPQUFPLElBQUksWUFBWSxDQUFDLHVCQUFBLElBQUksb0NBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsV0FBVyxDQUFxRCxJQUFZO1FBQzFFLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyx1QkFBQSxJQUFJLDRCQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUksSUFBWTtRQUN2QixPQUFPLElBQUksY0FBYyxDQUFDLHVCQUFBLElBQUksNEJBQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBSSxJQUFZO1FBQzNCLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyx1QkFBQSxJQUFJLDRCQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUksUUFBaUI7UUFDOUIsT0FBTyx1QkFBQSxJQUFJLDhCQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSx1QkFBQSxJQUFJLDhCQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEMsQ0FBQztDQUNGIn0=
|
package/dest/utils.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
import { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import { AztecKVStore } from './interfaces/store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Clears the store if the rollup address does not match the one stored in the database.
|
|
6
|
+
* This is to prevent data from being accidentally shared between different rollup instances.
|
|
7
|
+
* @param store - The store to check
|
|
8
|
+
* @param rollupAddress - The ETH address of the rollup contract
|
|
9
|
+
* @returns A promise that resolves when the store is cleared, or rejects if the rollup address does not match
|
|
10
|
+
*/
|
|
11
|
+
export declare function initStoreForRollup<T extends AztecKVStore>(store: T, rollupAddress: EthAddress, log?: Logger): Promise<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Opens a temporary store for testing purposes.
|
|
14
|
+
* @returns A new store
|
|
15
|
+
*/
|
|
16
|
+
export declare function openTmpStore(): AztecKVStore;
|
|
17
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,YAAY,EAC7D,KAAK,EAAE,CAAC,EACR,aAAa,EAAE,UAAU,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAE3C"}
|
package/dest/utils.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AztecLmdbStore } from './lmdb/store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clears the store if the rollup address does not match the one stored in the database.
|
|
4
|
+
* This is to prevent data from being accidentally shared between different rollup instances.
|
|
5
|
+
* @param store - The store to check
|
|
6
|
+
* @param rollupAddress - The ETH address of the rollup contract
|
|
7
|
+
* @returns A promise that resolves when the store is cleared, or rejects if the rollup address does not match
|
|
8
|
+
*/
|
|
9
|
+
export async function initStoreForRollup(store, rollupAddress, log) {
|
|
10
|
+
const rollupAddressValue = store.openSingleton('rollupAddress');
|
|
11
|
+
const rollupAddressString = rollupAddress.toString();
|
|
12
|
+
const storedRollupAddressString = rollupAddressValue.get();
|
|
13
|
+
if (typeof storedRollupAddressString !== 'undefined' && storedRollupAddressString !== rollupAddressString) {
|
|
14
|
+
log?.warn(`Rollup address mismatch: expected ${rollupAddress}, found ${rollupAddressValue}. Clearing entire database...`);
|
|
15
|
+
await store.clear();
|
|
16
|
+
}
|
|
17
|
+
await rollupAddressValue.set(rollupAddressString);
|
|
18
|
+
return store;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Opens a temporary store for testing purposes.
|
|
22
|
+
* @returns A new store
|
|
23
|
+
*/
|
|
24
|
+
export function openTmpStore() {
|
|
25
|
+
return AztecLmdbStore.open();
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEtBQVEsRUFDUixhQUF5QixFQUN6QixHQUFZO0lBRVosTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFxQyxlQUFlLENBQUMsQ0FBQztJQUNwRyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyRCxNQUFNLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNELElBQUksT0FBTyx5QkFBeUIsS0FBSyxXQUFXLElBQUkseUJBQXlCLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMxRyxHQUFHLEVBQUUsSUFBSSxDQUNQLHFDQUFxQyxhQUFhLFdBQVcsa0JBQWtCLCtCQUErQixDQUMvRyxDQUFDO1FBRUYsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sa0JBQWtCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVk7SUFDMUIsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDL0IsQ0FBQyJ9
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aztec/kv-store",
|
|
3
|
+
"version": "0.23.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./dest/interfaces/index.js",
|
|
7
|
+
"./lmdb": "./dest/lmdb/index.js",
|
|
8
|
+
"./utils": "./dest/utils.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "yarn clean && tsc -b",
|
|
12
|
+
"build:dev": "tsc -b --watch",
|
|
13
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
14
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
15
|
+
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
16
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests",
|
|
17
|
+
"start": "DEBUG='aztec:*' && node ./dest/bin/index.js"
|
|
18
|
+
},
|
|
19
|
+
"inherits": [
|
|
20
|
+
"../package.common.json"
|
|
21
|
+
],
|
|
22
|
+
"jest": {
|
|
23
|
+
"preset": "ts-jest/presets/default-esm",
|
|
24
|
+
"moduleNameMapper": {
|
|
25
|
+
"^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
|
|
26
|
+
},
|
|
27
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
28
|
+
"rootDir": "./src",
|
|
29
|
+
"workerThreads": true
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@aztec/foundation": "0.23.0",
|
|
33
|
+
"lmdb": "^2.9.2"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@jest/globals": "^29.5.0",
|
|
37
|
+
"@types/jest": "^29.5.0",
|
|
38
|
+
"@types/node": "^18.7.23",
|
|
39
|
+
"jest": "^29.5.0",
|
|
40
|
+
"jest-mock-extended": "^3.0.3",
|
|
41
|
+
"ts-jest": "^29.1.0",
|
|
42
|
+
"ts-node": "^10.9.1",
|
|
43
|
+
"typescript": "^5.0.4"
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dest",
|
|
47
|
+
"src",
|
|
48
|
+
"!*.test.*"
|
|
49
|
+
],
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18"
|
|
52
|
+
}
|
|
53
|
+
}
|