@aztec/kv-store 0.0.0-test.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 (166) hide show
  1. package/README.md +10 -0
  2. package/dest/config.d.ts +17 -0
  3. package/dest/config.d.ts.map +1 -0
  4. package/dest/config.js +24 -0
  5. package/dest/indexeddb/array.d.ts +21 -0
  6. package/dest/indexeddb/array.d.ts.map +1 -0
  7. package/dest/indexeddb/array.js +104 -0
  8. package/dest/indexeddb/index.d.ts +7 -0
  9. package/dest/indexeddb/index.d.ts.map +1 -0
  10. package/dest/indexeddb/index.js +19 -0
  11. package/dest/indexeddb/map.d.ts +26 -0
  12. package/dest/indexeddb/map.d.ts.map +1 -0
  13. package/dest/indexeddb/map.js +133 -0
  14. package/dest/indexeddb/set.d.ts +17 -0
  15. package/dest/indexeddb/set.d.ts.map +1 -0
  16. package/dest/indexeddb/set.js +24 -0
  17. package/dest/indexeddb/singleton.d.ts +16 -0
  18. package/dest/indexeddb/singleton.d.ts.map +1 -0
  19. package/dest/indexeddb/singleton.js +37 -0
  20. package/dest/indexeddb/store.d.ts +97 -0
  21. package/dest/indexeddb/store.d.ts.map +1 -0
  22. package/dest/indexeddb/store.js +164 -0
  23. package/dest/interfaces/array.d.ts +80 -0
  24. package/dest/interfaces/array.d.ts.map +1 -0
  25. package/dest/interfaces/array.js +3 -0
  26. package/dest/interfaces/array_test_suite.d.ts +3 -0
  27. package/dest/interfaces/array_test_suite.d.ts.map +1 -0
  28. package/dest/interfaces/array_test_suite.js +104 -0
  29. package/dest/interfaces/common.d.ts +23 -0
  30. package/dest/interfaces/common.d.ts.map +1 -0
  31. package/dest/interfaces/common.js +3 -0
  32. package/dest/interfaces/counter.d.ts +59 -0
  33. package/dest/interfaces/counter.d.ts.map +1 -0
  34. package/dest/interfaces/counter.js +1 -0
  35. package/dest/interfaces/index.d.ts +8 -0
  36. package/dest/interfaces/index.d.ts.map +1 -0
  37. package/dest/interfaces/index.js +6 -0
  38. package/dest/interfaces/map.d.ts +134 -0
  39. package/dest/interfaces/map.d.ts.map +1 -0
  40. package/dest/interfaces/map.js +3 -0
  41. package/dest/interfaces/map_test_suite.d.ts +3 -0
  42. package/dest/interfaces/map_test_suite.d.ts.map +1 -0
  43. package/dest/interfaces/map_test_suite.js +151 -0
  44. package/dest/interfaces/set.d.ts +44 -0
  45. package/dest/interfaces/set.d.ts.map +1 -0
  46. package/dest/interfaces/set.js +1 -0
  47. package/dest/interfaces/set_test_suite.d.ts +3 -0
  48. package/dest/interfaces/set_test_suite.d.ts.map +1 -0
  49. package/dest/interfaces/set_test_suite.js +96 -0
  50. package/dest/interfaces/singleton.d.ts +29 -0
  51. package/dest/interfaces/singleton.d.ts.map +1 -0
  52. package/dest/interfaces/singleton.js +4 -0
  53. package/dest/interfaces/singleton_test_suite.d.ts +3 -0
  54. package/dest/interfaces/singleton_test_suite.d.ts.map +1 -0
  55. package/dest/interfaces/singleton_test_suite.js +30 -0
  56. package/dest/interfaces/store.d.ts +145 -0
  57. package/dest/interfaces/store.d.ts.map +1 -0
  58. package/dest/interfaces/store.js +1 -0
  59. package/dest/interfaces/store_test_suite.d.ts +3 -0
  60. package/dest/interfaces/store_test_suite.d.ts.map +1 -0
  61. package/dest/interfaces/store_test_suite.js +37 -0
  62. package/dest/interfaces/utils.d.ts +16 -0
  63. package/dest/interfaces/utils.d.ts.map +1 -0
  64. package/dest/interfaces/utils.js +16 -0
  65. package/dest/lmdb/array.d.ts +23 -0
  66. package/dest/lmdb/array.d.ts.map +1 -0
  67. package/dest/lmdb/array.js +117 -0
  68. package/dest/lmdb/counter.d.ts +19 -0
  69. package/dest/lmdb/counter.d.ts.map +1 -0
  70. package/dest/lmdb/counter.js +50 -0
  71. package/dest/lmdb/index.d.ts +12 -0
  72. package/dest/lmdb/index.d.ts.map +1 -0
  73. package/dest/lmdb/index.js +25 -0
  74. package/dest/lmdb/map.d.ts +52 -0
  75. package/dest/lmdb/map.d.ts.map +1 -0
  76. package/dest/lmdb/map.js +222 -0
  77. package/dest/lmdb/set.d.ts +18 -0
  78. package/dest/lmdb/set.d.ts.map +1 -0
  79. package/dest/lmdb/set.js +32 -0
  80. package/dest/lmdb/singleton.d.ts +14 -0
  81. package/dest/lmdb/singleton.d.ts.map +1 -0
  82. package/dest/lmdb/singleton.js +26 -0
  83. package/dest/lmdb/store.d.ts +110 -0
  84. package/dest/lmdb/store.d.ts.map +1 -0
  85. package/dest/lmdb/store.js +216 -0
  86. package/dest/lmdb-v2/array.d.ts +18 -0
  87. package/dest/lmdb-v2/array.d.ts.map +1 -0
  88. package/dest/lmdb-v2/array.js +101 -0
  89. package/dest/lmdb-v2/factory.d.ts +12 -0
  90. package/dest/lmdb-v2/factory.d.ts.map +1 -0
  91. package/dest/lmdb-v2/factory.js +60 -0
  92. package/dest/lmdb-v2/index.d.ts +3 -0
  93. package/dest/lmdb-v2/index.d.ts.map +1 -0
  94. package/dest/lmdb-v2/index.js +2 -0
  95. package/dest/lmdb-v2/map.d.ts +86 -0
  96. package/dest/lmdb-v2/map.d.ts.map +1 -0
  97. package/dest/lmdb-v2/map.js +193 -0
  98. package/dest/lmdb-v2/message.d.ts +112 -0
  99. package/dest/lmdb-v2/message.d.ts.map +1 -0
  100. package/dest/lmdb-v2/message.js +18 -0
  101. package/dest/lmdb-v2/read_transaction.d.ts +14 -0
  102. package/dest/lmdb-v2/read_transaction.d.ts.map +1 -0
  103. package/dest/lmdb-v2/read_transaction.js +101 -0
  104. package/dest/lmdb-v2/singleton.d.ts +12 -0
  105. package/dest/lmdb-v2/singleton.d.ts.map +1 -0
  106. package/dest/lmdb-v2/singleton.js +31 -0
  107. package/dest/lmdb-v2/store.d.ts +43 -0
  108. package/dest/lmdb-v2/store.d.ts.map +1 -0
  109. package/dest/lmdb-v2/store.js +181 -0
  110. package/dest/lmdb-v2/utils.d.ts +19 -0
  111. package/dest/lmdb-v2/utils.d.ts.map +1 -0
  112. package/dest/lmdb-v2/utils.js +126 -0
  113. package/dest/lmdb-v2/write_transaction.d.ts +19 -0
  114. package/dest/lmdb-v2/write_transaction.d.ts.map +1 -0
  115. package/dest/lmdb-v2/write_transaction.js +254 -0
  116. package/dest/stores/index.d.ts +2 -0
  117. package/dest/stores/index.d.ts.map +1 -0
  118. package/dest/stores/index.js +1 -0
  119. package/dest/stores/l2_tips_store.d.ts +13 -0
  120. package/dest/stores/l2_tips_store.d.ts.map +1 -0
  121. package/dest/stores/l2_tips_store.js +65 -0
  122. package/dest/utils.d.ts +12 -0
  123. package/dest/utils.d.ts.map +1 -0
  124. package/dest/utils.js +24 -0
  125. package/package.json +99 -0
  126. package/src/config.ts +34 -0
  127. package/src/indexeddb/array.ts +118 -0
  128. package/src/indexeddb/index.ts +29 -0
  129. package/src/indexeddb/map.ts +142 -0
  130. package/src/indexeddb/set.ts +37 -0
  131. package/src/indexeddb/singleton.ts +49 -0
  132. package/src/indexeddb/store.ts +197 -0
  133. package/src/interfaces/array.ts +90 -0
  134. package/src/interfaces/array_test_suite.ts +130 -0
  135. package/src/interfaces/common.ts +20 -0
  136. package/src/interfaces/counter.ts +65 -0
  137. package/src/interfaces/index.ts +7 -0
  138. package/src/interfaces/map.ts +151 -0
  139. package/src/interfaces/map_test_suite.ts +143 -0
  140. package/src/interfaces/set.ts +48 -0
  141. package/src/interfaces/set_test_suite.ts +81 -0
  142. package/src/interfaces/singleton.ts +29 -0
  143. package/src/interfaces/singleton_test_suite.ts +46 -0
  144. package/src/interfaces/store.ts +177 -0
  145. package/src/interfaces/store_test_suite.ts +56 -0
  146. package/src/interfaces/utils.ts +21 -0
  147. package/src/lmdb/array.ts +139 -0
  148. package/src/lmdb/counter.ts +67 -0
  149. package/src/lmdb/index.ts +37 -0
  150. package/src/lmdb/map.ts +248 -0
  151. package/src/lmdb/set.ts +45 -0
  152. package/src/lmdb/singleton.ts +35 -0
  153. package/src/lmdb/store.ts +263 -0
  154. package/src/lmdb-v2/array.ts +115 -0
  155. package/src/lmdb-v2/factory.ts +98 -0
  156. package/src/lmdb-v2/index.ts +2 -0
  157. package/src/lmdb-v2/map.ts +233 -0
  158. package/src/lmdb-v2/message.ts +146 -0
  159. package/src/lmdb-v2/read_transaction.ts +116 -0
  160. package/src/lmdb-v2/singleton.ts +34 -0
  161. package/src/lmdb-v2/store.ts +237 -0
  162. package/src/lmdb-v2/utils.ts +150 -0
  163. package/src/lmdb-v2/write_transaction.ts +314 -0
  164. package/src/stores/index.ts +1 -0
  165. package/src/stores/l2_tips_store.ts +70 -0
  166. package/src/utils.ts +40 -0
@@ -0,0 +1,193 @@
1
+ import { Encoder } from 'msgpackr';
2
+ import { execInReadTx, execInWriteTx } from './store.js';
3
+ import { deserializeKey, maxKey, minKey, serializeKey } from './utils.js';
4
+ export class LMDBMap {
5
+ store;
6
+ prefix;
7
+ encoder;
8
+ constructor(store, name){
9
+ this.store = store;
10
+ this.encoder = new Encoder();
11
+ this.prefix = `map:${name}`;
12
+ }
13
+ /**
14
+ * Sets the value at the given key.
15
+ * @param key - The key to set the value at
16
+ * @param val - The value to set
17
+ */ set(key, val) {
18
+ return execInWriteTx(this.store, (tx)=>tx.set(serializeKey(this.prefix, key), this.encoder.pack(val)));
19
+ }
20
+ /**
21
+ * Sets the value at the given key if it does not already exist.
22
+ * @param key - The key to set the value at
23
+ * @param val - The value to set
24
+ */ setIfNotExists(key, val) {
25
+ return execInWriteTx(this.store, async (tx)=>{
26
+ const strKey = serializeKey(this.prefix, key);
27
+ const exists = !!await tx.get(strKey);
28
+ if (!exists) {
29
+ await tx.set(strKey, this.encoder.pack(val));
30
+ return true;
31
+ }
32
+ return false;
33
+ });
34
+ }
35
+ /**
36
+ * Deletes the value at the given key.
37
+ * @param key - The key to delete the value at
38
+ */ delete(key) {
39
+ return execInWriteTx(this.store, (tx)=>tx.remove(serializeKey(this.prefix, key)));
40
+ }
41
+ getAsync(key) {
42
+ return execInReadTx(this.store, async (tx)=>{
43
+ const val = await tx.get(serializeKey(this.prefix, key));
44
+ return val ? this.encoder.unpack(val) : undefined;
45
+ });
46
+ }
47
+ hasAsync(key) {
48
+ return execInReadTx(this.store, async (tx)=>!!await tx.get(serializeKey(this.prefix, key)));
49
+ }
50
+ /**
51
+ * Iterates over the map's key-value entries in the key's natural order
52
+ * @param range - The range of keys to iterate over
53
+ */ async *entriesAsync(range) {
54
+ const reverse = range?.reverse ?? false;
55
+ const startKey = range?.start ? serializeKey(this.prefix, range.start) : minKey(this.prefix);
56
+ const endKey = range?.end ? serializeKey(this.prefix, range.end) : reverse ? maxKey(this.prefix) : undefined;
57
+ let tx = this.store.getCurrentWriteTx();
58
+ const shouldClose = !tx;
59
+ tx ??= this.store.getReadTx();
60
+ try {
61
+ for await (const [key, val] of tx.iterate(reverse ? endKey : startKey, reverse ? startKey : endKey, reverse, range?.limit)){
62
+ const deserializedKey = deserializeKey(this.prefix, key);
63
+ if (!deserializedKey) {
64
+ break;
65
+ }
66
+ yield [
67
+ deserializedKey,
68
+ this.encoder.unpack(val)
69
+ ];
70
+ }
71
+ } finally{
72
+ if (shouldClose) {
73
+ tx.close();
74
+ }
75
+ }
76
+ }
77
+ /**
78
+ * Iterates over the map's values in the key's natural order
79
+ * @param range - The range of keys to iterate over
80
+ */ async *valuesAsync(range) {
81
+ for await (const [_, value] of this.entriesAsync(range)){
82
+ yield value;
83
+ }
84
+ }
85
+ /**
86
+ * Iterates over the map's keys in the key's natural order
87
+ * @param range - The range of keys to iterate over
88
+ */ async *keysAsync(range) {
89
+ for await (const [key, _] of this.entriesAsync(range)){
90
+ yield key;
91
+ }
92
+ }
93
+ }
94
+ export class LMDBMultiMap {
95
+ store;
96
+ prefix;
97
+ encoder;
98
+ constructor(store, name){
99
+ this.store = store;
100
+ this.encoder = new Encoder();
101
+ this.prefix = `multimap:${name}`;
102
+ }
103
+ /**
104
+ * Sets the value at the given key.
105
+ * @param key - The key to set the value at
106
+ * @param val - The value to set
107
+ */ set(key, val) {
108
+ return execInWriteTx(this.store, (tx)=>tx.setIndex(serializeKey(this.prefix, key), this.encoder.pack(val)));
109
+ }
110
+ /**
111
+ * Sets the value at the given key if it does not already exist.
112
+ * @param key - The key to set the value at
113
+ * @param val - The value to set
114
+ */ setIfNotExists(key, val) {
115
+ return execInWriteTx(this.store, async (tx)=>{
116
+ const exists = !!await this.getAsync(key);
117
+ if (!exists) {
118
+ await tx.setIndex(serializeKey(this.prefix, key), this.encoder.pack(val));
119
+ return true;
120
+ }
121
+ return false;
122
+ });
123
+ }
124
+ /**
125
+ * Deletes the value at the given key.
126
+ * @param key - The key to delete the value at
127
+ */ delete(key) {
128
+ return execInWriteTx(this.store, (tx)=>tx.removeIndex(serializeKey(this.prefix, key)));
129
+ }
130
+ getAsync(key) {
131
+ return execInReadTx(this.store, async (tx)=>{
132
+ const val = await tx.getIndex(serializeKey(this.prefix, key));
133
+ return val.length > 0 ? this.encoder.unpack(val[0]) : undefined;
134
+ });
135
+ }
136
+ hasAsync(key) {
137
+ return execInReadTx(this.store, async (tx)=>(await tx.getIndex(serializeKey(this.prefix, key))).length > 0);
138
+ }
139
+ /**
140
+ * Iterates over the map's key-value entries in the key's natural order
141
+ * @param range - The range of keys to iterate over
142
+ */ async *entriesAsync(range) {
143
+ const reverse = range?.reverse ?? false;
144
+ const startKey = range?.start ? serializeKey(this.prefix, range.start) : minKey(this.prefix);
145
+ const endKey = range?.end ? serializeKey(this.prefix, range.end) : reverse ? maxKey(this.prefix) : undefined;
146
+ let tx = this.store.getCurrentWriteTx();
147
+ const shouldClose = !tx;
148
+ tx ??= this.store.getReadTx();
149
+ try {
150
+ for await (const [key, vals] of tx.iterateIndex(reverse ? endKey : startKey, reverse ? startKey : endKey, reverse, range?.limit)){
151
+ const deserializedKey = deserializeKey(this.prefix, key);
152
+ if (!deserializedKey) {
153
+ break;
154
+ }
155
+ for (const val of vals){
156
+ yield [
157
+ deserializedKey,
158
+ this.encoder.unpack(val)
159
+ ];
160
+ }
161
+ }
162
+ } finally{
163
+ if (shouldClose) {
164
+ tx.close();
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * Iterates over the map's values in the key's natural order
170
+ * @param range - The range of keys to iterate over
171
+ */ async *valuesAsync(range) {
172
+ for await (const [_, value] of this.entriesAsync(range)){
173
+ yield value;
174
+ }
175
+ }
176
+ /**
177
+ * Iterates over the map's keys in the key's natural order
178
+ * @param range - The range of keys to iterate over
179
+ */ async *keysAsync(range) {
180
+ for await (const [key, _] of this.entriesAsync(range)){
181
+ yield key;
182
+ }
183
+ }
184
+ deleteValue(key, val) {
185
+ return execInWriteTx(this.store, (tx)=>tx.removeIndex(serializeKey(this.prefix, key), this.encoder.pack(val)));
186
+ }
187
+ async *getValuesAsync(key) {
188
+ const values = await execInReadTx(this.store, (tx)=>tx.getIndex(serializeKey(this.prefix, key)));
189
+ for (const value of values){
190
+ yield this.encoder.unpack(value);
191
+ }
192
+ }
193
+ }
@@ -0,0 +1,112 @@
1
+ export declare enum Database {
2
+ DATA = "data",
3
+ INDEX = "index"
4
+ }
5
+ export declare const CURSOR_PAGE_SIZE = 10;
6
+ export declare enum LMDBMessageType {
7
+ OPEN_DATABASE = 100,
8
+ GET = 101,
9
+ HAS = 102,
10
+ START_CURSOR = 103,
11
+ ADVANCE_CURSOR = 104,
12
+ CLOSE_CURSOR = 105,
13
+ BATCH = 106,
14
+ STATS = 107,
15
+ CLOSE = 108
16
+ }
17
+ type Key = Uint8Array;
18
+ type Value = Uint8Array;
19
+ type OptionalValues = Array<Value[] | null>;
20
+ type KeyOptionalValues = [Key, null | Array<Value>];
21
+ type KeyValues = [Key, Value[]];
22
+ interface OpenDatabaseRequest {
23
+ db: string;
24
+ uniqueKeys?: boolean;
25
+ }
26
+ interface GetRequest {
27
+ keys: Key[];
28
+ db: string;
29
+ }
30
+ interface GetResponse {
31
+ values: OptionalValues;
32
+ }
33
+ interface HasRequest {
34
+ entries: KeyOptionalValues[];
35
+ db: string;
36
+ }
37
+ interface StartCursorRequest {
38
+ key: Key;
39
+ reverse: boolean;
40
+ count: number | null;
41
+ onePage: boolean | null;
42
+ db: string;
43
+ }
44
+ interface AdvanceCursorRequest {
45
+ cursor: number;
46
+ count: number | null;
47
+ }
48
+ interface CloseCursorRequest {
49
+ cursor: number;
50
+ }
51
+ export interface Batch {
52
+ addEntries: Array<KeyValues>;
53
+ removeEntries: Array<KeyOptionalValues>;
54
+ }
55
+ interface BatchRequest {
56
+ batches: Map<string, Batch>;
57
+ }
58
+ export type LMDBRequestBody = {
59
+ [LMDBMessageType.OPEN_DATABASE]: OpenDatabaseRequest;
60
+ [LMDBMessageType.GET]: GetRequest;
61
+ [LMDBMessageType.HAS]: HasRequest;
62
+ [LMDBMessageType.START_CURSOR]: StartCursorRequest;
63
+ [LMDBMessageType.ADVANCE_CURSOR]: AdvanceCursorRequest;
64
+ [LMDBMessageType.CLOSE_CURSOR]: CloseCursorRequest;
65
+ [LMDBMessageType.BATCH]: BatchRequest;
66
+ [LMDBMessageType.STATS]: void;
67
+ [LMDBMessageType.CLOSE]: void;
68
+ };
69
+ interface GetResponse {
70
+ values: OptionalValues;
71
+ }
72
+ interface HasResponse {
73
+ exists: boolean[];
74
+ }
75
+ interface StartCursorResponse {
76
+ cursor: number | null;
77
+ entries: Array<KeyValues>;
78
+ }
79
+ interface AdvanceCursorResponse {
80
+ entries: Array<KeyValues>;
81
+ done: boolean;
82
+ }
83
+ interface BatchResponse {
84
+ durationNs: number;
85
+ }
86
+ interface BoolResponse {
87
+ ok: true;
88
+ }
89
+ interface StatsResponse {
90
+ stats: Array<{
91
+ name: string;
92
+ numDataItems: bigint | number;
93
+ totalUsedSize: bigint | number;
94
+ }>;
95
+ dbMapSizeBytes: bigint | number;
96
+ }
97
+ export type LMDBResponseBody = {
98
+ [LMDBMessageType.OPEN_DATABASE]: BoolResponse;
99
+ [LMDBMessageType.GET]: GetResponse;
100
+ [LMDBMessageType.HAS]: HasResponse;
101
+ [LMDBMessageType.START_CURSOR]: StartCursorResponse;
102
+ [LMDBMessageType.ADVANCE_CURSOR]: AdvanceCursorResponse;
103
+ [LMDBMessageType.CLOSE_CURSOR]: BoolResponse;
104
+ [LMDBMessageType.BATCH]: BatchResponse;
105
+ [LMDBMessageType.STATS]: StatsResponse;
106
+ [LMDBMessageType.CLOSE]: BoolResponse;
107
+ };
108
+ export interface LMDBMessageChannel {
109
+ sendMessage<T extends LMDBMessageType>(msgType: T, body: LMDBRequestBody[T]): Promise<LMDBResponseBody[T]>;
110
+ }
111
+ export {};
112
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export var Database = /*#__PURE__*/ function(Database) {
2
+ Database["DATA"] = "data";
3
+ Database["INDEX"] = "index";
4
+ return Database;
5
+ }({});
6
+ export const CURSOR_PAGE_SIZE = 10;
7
+ export var LMDBMessageType = /*#__PURE__*/ function(LMDBMessageType) {
8
+ LMDBMessageType[LMDBMessageType["OPEN_DATABASE"] = 100] = "OPEN_DATABASE";
9
+ LMDBMessageType[LMDBMessageType["GET"] = 101] = "GET";
10
+ LMDBMessageType[LMDBMessageType["HAS"] = 102] = "HAS";
11
+ LMDBMessageType[LMDBMessageType["START_CURSOR"] = 103] = "START_CURSOR";
12
+ LMDBMessageType[LMDBMessageType["ADVANCE_CURSOR"] = 104] = "ADVANCE_CURSOR";
13
+ LMDBMessageType[LMDBMessageType["CLOSE_CURSOR"] = 105] = "CLOSE_CURSOR";
14
+ LMDBMessageType[LMDBMessageType["BATCH"] = 106] = "BATCH";
15
+ LMDBMessageType[LMDBMessageType["STATS"] = 107] = "STATS";
16
+ LMDBMessageType[LMDBMessageType["CLOSE"] = 108] = "CLOSE";
17
+ return LMDBMessageType;
18
+ }({});
@@ -0,0 +1,14 @@
1
+ import { type LMDBMessageChannel } from './message.js';
2
+ export declare class ReadTransaction {
3
+ #private;
4
+ protected channel: LMDBMessageChannel;
5
+ protected open: boolean;
6
+ constructor(channel: LMDBMessageChannel);
7
+ close(): void;
8
+ protected assertIsOpen(): void;
9
+ get(key: Uint8Array): Promise<Uint8Array | undefined>;
10
+ getIndex(key: Uint8Array): Promise<Uint8Array[]>;
11
+ iterate(startKey: Uint8Array, endKey?: Uint8Array, reverse?: boolean, limit?: number): AsyncIterable<[Uint8Array, Uint8Array]>;
12
+ iterateIndex(startKey: Uint8Array, endKey?: Uint8Array, reverse?: boolean, limit?: number): AsyncIterable<[Uint8Array, Uint8Array[]]>;
13
+ }
14
+ //# sourceMappingURL=read_transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_transaction.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/read_transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,kBAAkB,EAAmB,MAAM,cAAc,CAAC;AAEpG,qBAAa,eAAe;;IAGd,SAAS,CAAC,OAAO,EAAE,kBAAkB;IAFjD,SAAS,CAAC,IAAI,UAAQ;gBAEA,OAAO,EAAE,kBAAkB;IAE1C,KAAK,IAAI,IAAI;IAOpB,SAAS,CAAC,YAAY;IAMT,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAMrD,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAM/C,OAAO,CACnB,QAAQ,EAAE,UAAU,EACpB,MAAM,CAAC,EAAE,UAAU,EACnB,OAAO,UAAQ,EACf,KAAK,CAAC,EAAE,MAAM,GACb,aAAa,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAI5B,YAAY,CACxB,QAAQ,EAAE,UAAU,EACpB,MAAM,CAAC,EAAE,UAAU,EACnB,OAAO,UAAQ,EACf,KAAK,CAAC,EAAE,MAAM,GACb,aAAa,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;CAqE7C"}
@@ -0,0 +1,101 @@
1
+ import { CURSOR_PAGE_SIZE, Database, LMDBMessageType } from './message.js';
2
+ export class ReadTransaction {
3
+ channel;
4
+ open;
5
+ constructor(channel){
6
+ this.channel = channel;
7
+ this.open = true;
8
+ }
9
+ close() {
10
+ if (!this.open) {
11
+ return;
12
+ }
13
+ this.open = false;
14
+ }
15
+ assertIsOpen() {
16
+ if (!this.open) {
17
+ throw new Error('Transaction is closed');
18
+ }
19
+ }
20
+ async get(key) {
21
+ this.assertIsOpen();
22
+ const response = await this.channel.sendMessage(LMDBMessageType.GET, {
23
+ keys: [
24
+ key
25
+ ],
26
+ db: Database.DATA
27
+ });
28
+ return response.values[0]?.[0] ?? undefined;
29
+ }
30
+ async getIndex(key) {
31
+ this.assertIsOpen();
32
+ const response = await this.channel.sendMessage(LMDBMessageType.GET, {
33
+ keys: [
34
+ key
35
+ ],
36
+ db: Database.INDEX
37
+ });
38
+ return response.values[0] ?? [];
39
+ }
40
+ async *iterate(startKey, endKey, reverse = false, limit) {
41
+ yield* this.#iterate(Database.DATA, startKey, endKey, reverse, limit, (vals)=>vals[0]);
42
+ }
43
+ async *iterateIndex(startKey, endKey, reverse = false, limit) {
44
+ yield* this.#iterate(Database.INDEX, startKey, endKey, reverse, limit, (vals)=>vals);
45
+ }
46
+ async *#iterate(db, startKey, endKey, reverse, limit, map) {
47
+ this.assertIsOpen();
48
+ const response = await this.channel.sendMessage(LMDBMessageType.START_CURSOR, {
49
+ key: startKey,
50
+ reverse,
51
+ count: typeof limit === 'number' ? Math.min(limit, CURSOR_PAGE_SIZE) : CURSOR_PAGE_SIZE,
52
+ onePage: typeof limit === 'number' && limit < CURSOR_PAGE_SIZE,
53
+ db
54
+ });
55
+ const cursor = response.cursor;
56
+ let entries = response.entries;
57
+ let done = typeof cursor !== 'number';
58
+ let count = 0;
59
+ try {
60
+ // emit the first page and any subsequent pages in a while loop
61
+ // NB: end contition is in the middle of the while loop
62
+ while(entries.length > 0){
63
+ for (const [key, values] of entries){
64
+ if (typeof limit === 'number' && count >= limit) {
65
+ done = true;
66
+ break;
67
+ }
68
+ if (endKey) {
69
+ const cmp = Buffer.compare(key, endKey);
70
+ if (!reverse && cmp >= 0 || reverse && cmp <= 0) {
71
+ done = true;
72
+ break;
73
+ }
74
+ }
75
+ count++;
76
+ yield [
77
+ key,
78
+ map(values)
79
+ ];
80
+ }
81
+ // cursor is null if DB returned everything in the first page
82
+ if (typeof cursor !== 'number' || done) {
83
+ break;
84
+ }
85
+ const response = await this.channel.sendMessage(LMDBMessageType.ADVANCE_CURSOR, {
86
+ cursor,
87
+ count: CURSOR_PAGE_SIZE
88
+ });
89
+ done = response.done;
90
+ entries = response.entries;
91
+ }
92
+ } finally{
93
+ // we might not have anything to close
94
+ if (typeof cursor === 'number') {
95
+ await this.channel.sendMessage(LMDBMessageType.CLOSE_CURSOR, {
96
+ cursor
97
+ });
98
+ }
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,12 @@
1
+ import type { AztecAsyncSingleton } from '../interfaces/singleton.js';
2
+ import { type AztecLMDBStoreV2 } from './store.js';
3
+ export declare class LMDBSingleValue<T> implements AztecAsyncSingleton<T> {
4
+ private store;
5
+ private key;
6
+ private encoder;
7
+ constructor(store: AztecLMDBStoreV2, name: string);
8
+ getAsync(): Promise<T | undefined>;
9
+ set(val: T): Promise<boolean>;
10
+ delete(): Promise<boolean>;
11
+ }
12
+ //# sourceMappingURL=singleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/singleton.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,KAAK,gBAAgB,EAA+B,MAAM,YAAY,CAAC;AAGhF,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,mBAAmB,CAAC,CAAC,CAAC;IAGnD,OAAO,CAAC,KAAK;IAFzB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,OAAO,CAAiB;gBACZ,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM;IAIzD,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAOlC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAO7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAM3B"}
@@ -0,0 +1,31 @@
1
+ import { Encoder } from 'msgpackr';
2
+ import { execInReadTx, execInWriteTx } from './store.js';
3
+ import { serializeKey } from './utils.js';
4
+ export class LMDBSingleValue {
5
+ store;
6
+ key;
7
+ encoder;
8
+ constructor(store, name){
9
+ this.store = store;
10
+ this.encoder = new Encoder();
11
+ this.key = serializeKey(`singleton:${name}`, 'value');
12
+ }
13
+ getAsync() {
14
+ return execInReadTx(this.store, async (tx)=>{
15
+ const val = await tx.get(this.key);
16
+ return val ? this.encoder.unpack(val) : undefined;
17
+ });
18
+ }
19
+ set(val) {
20
+ return execInWriteTx(this.store, async (tx)=>{
21
+ await tx.set(this.key, this.encoder.pack(val));
22
+ return true;
23
+ });
24
+ }
25
+ delete() {
26
+ return execInWriteTx(this.store, async (tx)=>{
27
+ await tx.remove(this.key);
28
+ return true;
29
+ });
30
+ }
31
+ }
@@ -0,0 +1,43 @@
1
+ import { type Logger } from '@aztec/foundation/log';
2
+ import type { AztecAsyncArray } from '../interfaces/array.js';
3
+ import type { Key, StoreSize } from '../interfaces/common.js';
4
+ import type { AztecAsyncCounter } from '../interfaces/counter.js';
5
+ import type { AztecAsyncMap, AztecAsyncMultiMap } from '../interfaces/map.js';
6
+ import type { AztecAsyncSet } from '../interfaces/set.js';
7
+ import type { AztecAsyncSingleton } from '../interfaces/singleton.js';
8
+ import type { AztecAsyncKVStore } from '../interfaces/store.js';
9
+ import { type LMDBMessageChannel, LMDBMessageType, type LMDBRequestBody, type LMDBResponseBody } from './message.js';
10
+ import { ReadTransaction } from './read_transaction.js';
11
+ import { WriteTransaction } from './write_transaction.js';
12
+ export declare class AztecLMDBStoreV2 implements AztecAsyncKVStore, LMDBMessageChannel {
13
+ private dataDir;
14
+ private log;
15
+ private cleanup?;
16
+ private open;
17
+ private channel;
18
+ private writerCtx;
19
+ private writerQueue;
20
+ private availableCursors;
21
+ private constructor();
22
+ get dataDirectory(): string;
23
+ private start;
24
+ static new(dataDir: string, dbMapSizeKb?: number, maxReaders?: number, cleanup?: () => Promise<void>, log?: Logger): Promise<AztecLMDBStoreV2>;
25
+ getReadTx(): ReadTransaction;
26
+ getCurrentWriteTx(): WriteTransaction | undefined;
27
+ openMap<K extends Key, V>(name: string): AztecAsyncMap<K, V>;
28
+ openMultiMap<K extends Key, V>(name: string): AztecAsyncMultiMap<K, V>;
29
+ openSingleton<T>(name: string): AztecAsyncSingleton<T>;
30
+ openArray<T>(name: string): AztecAsyncArray<T>;
31
+ openSet<K extends Key>(_name: string): AztecAsyncSet<K>;
32
+ openCounter<K extends Key>(_name: string): AztecAsyncCounter<K>;
33
+ transactionAsync<T extends Exclude<any, Promise<any>>>(callback: (tx: WriteTransaction) => Promise<T>): Promise<T>;
34
+ clear(): Promise<void>;
35
+ fork(): Promise<AztecAsyncKVStore>;
36
+ delete(): Promise<void>;
37
+ close(): Promise<void>;
38
+ sendMessage<T extends LMDBMessageType>(msgType: T, body: LMDBRequestBody[T]): Promise<LMDBResponseBody[T]>;
39
+ estimateSize(): Promise<StoreSize>;
40
+ }
41
+ export declare function execInWriteTx<T>(store: AztecLMDBStoreV2, fn: (tx: WriteTransaction) => Promise<T>): Promise<T>;
42
+ export declare function execInReadTx<T>(store: AztecLMDBStoreV2, fn: (tx: ReadTransaction) => T | Promise<T>): Promise<T>;
43
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/store.ts"],"names":[],"mappings":"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"}