@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.
Files changed (44) hide show
  1. package/README.md +10 -0
  2. package/dest/interfaces/array.d.ts +48 -0
  3. package/dest/interfaces/array.d.ts.map +1 -0
  4. package/dest/interfaces/array.js +2 -0
  5. package/dest/interfaces/common.d.ts +18 -0
  6. package/dest/interfaces/common.d.ts.map +1 -0
  7. package/dest/interfaces/common.js +2 -0
  8. package/dest/interfaces/counter.d.ts +39 -0
  9. package/dest/interfaces/counter.d.ts.map +1 -0
  10. package/dest/interfaces/counter.js +2 -0
  11. package/dest/interfaces/index.d.ts +7 -0
  12. package/dest/interfaces/index.d.ts.map +1 -0
  13. package/dest/interfaces/index.js +6 -0
  14. package/dest/interfaces/map.d.ts +72 -0
  15. package/dest/interfaces/map.d.ts.map +1 -0
  16. package/dest/interfaces/map.js +2 -0
  17. package/dest/interfaces/singleton.d.ts +20 -0
  18. package/dest/interfaces/singleton.d.ts.map +1 -0
  19. package/dest/interfaces/singleton.js +2 -0
  20. package/dest/interfaces/store.d.ts +47 -0
  21. package/dest/interfaces/store.d.ts.map +1 -0
  22. package/dest/interfaces/store.js +2 -0
  23. package/dest/lmdb/array.d.ts +18 -0
  24. package/dest/lmdb/array.d.ts.map +1 -0
  25. package/dest/lmdb/array.js +86 -0
  26. package/dest/lmdb/counter.d.ts +16 -0
  27. package/dest/lmdb/counter.d.ts.map +1 -0
  28. package/dest/lmdb/counter.js +48 -0
  29. package/dest/lmdb/index.d.ts +2 -0
  30. package/dest/lmdb/index.d.ts.map +1 -0
  31. package/dest/lmdb/index.js +2 -0
  32. package/dest/lmdb/map.d.ts +29 -0
  33. package/dest/lmdb/map.d.ts.map +1 -0
  34. package/dest/lmdb/map.js +100 -0
  35. package/dest/lmdb/singleton.d.ts +13 -0
  36. package/dest/lmdb/singleton.d.ts.map +1 -0
  37. package/dest/lmdb/singleton.js +24 -0
  38. package/dest/lmdb/store.d.ts +62 -0
  39. package/dest/lmdb/store.d.ts.map +1 -0
  40. package/dest/lmdb/store.js +97 -0
  41. package/dest/utils.d.ts +17 -0
  42. package/dest/utils.d.ts.map +1 -0
  43. package/dest/utils.js +27 -0
  44. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9hcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcmZhY2VzL2NvdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,7 @@
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
+ export { Range } from './common.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xldG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvc2luZ2xldG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -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,2 @@
1
+ export { AztecLmdbStore } from './store.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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=
@@ -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
+ }