@aztec/kv-store 0.73.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/dest/config.js +5 -7
- package/dest/indexeddb/array.js +44 -36
- package/dest/indexeddb/index.js +1 -4
- package/dest/indexeddb/map.js +72 -43
- package/dest/indexeddb/set.js +3 -4
- package/dest/indexeddb/singleton.js +17 -22
- package/dest/indexeddb/store.js +97 -93
- package/dest/interfaces/array.js +3 -2
- package/dest/interfaces/array_test_suite.js +29 -25
- package/dest/interfaces/common.js +3 -2
- package/dest/interfaces/counter.js +1 -2
- package/dest/interfaces/index.js +0 -1
- package/dest/interfaces/map.js +3 -2
- package/dest/interfaces/map_test_suite.js +87 -42
- package/dest/interfaces/set.js +1 -2
- package/dest/interfaces/set_test_suite.js +59 -22
- package/dest/interfaces/singleton.js +4 -2
- package/dest/interfaces/singleton_test_suite.js +7 -10
- package/dest/interfaces/store.js +1 -2
- package/dest/interfaces/store_test_suite.js +6 -9
- package/dest/interfaces/utils.js +12 -15
- package/dest/lmdb/array.js +46 -41
- package/dest/lmdb/counter.js +18 -24
- package/dest/lmdb/index.js +2 -6
- package/dest/lmdb/map.js +90 -68
- package/dest/lmdb/set.js +4 -5
- package/dest/lmdb/singleton.js +13 -14
- package/dest/lmdb/store.js +124 -134
- package/dest/lmdb-v2/factory.js +25 -17
- package/dest/lmdb-v2/index.js +0 -1
- package/dest/lmdb-v2/map.js +82 -85
- package/dest/lmdb-v2/message.js +6 -7
- package/dest/lmdb-v2/read_transaction.js +65 -53
- package/dest/lmdb-v2/singleton.js +7 -5
- package/dest/lmdb-v2/store.js +52 -29
- package/dest/lmdb-v2/utils.js +30 -30
- package/dest/lmdb-v2/write_transaction.js +130 -110
- package/dest/stores/index.js +0 -1
- package/dest/stores/l2_tips_store.js +26 -12
- package/dest/utils.js +3 -7
- package/package.json +6 -6
- package/src/interfaces/index.ts +1 -1
- package/src/lmdb-v2/factory.ts +10 -0
- package/src/lmdb-v2/store.ts +29 -3
- package/dest/config.d.ts +0 -17
- package/dest/config.d.ts.map +0 -1
- package/dest/indexeddb/array.d.ts +0 -21
- package/dest/indexeddb/array.d.ts.map +0 -1
- package/dest/indexeddb/index.d.ts +0 -7
- package/dest/indexeddb/index.d.ts.map +0 -1
- package/dest/indexeddb/map.d.ts +0 -26
- package/dest/indexeddb/map.d.ts.map +0 -1
- package/dest/indexeddb/set.d.ts +0 -17
- package/dest/indexeddb/set.d.ts.map +0 -1
- package/dest/indexeddb/singleton.d.ts +0 -16
- package/dest/indexeddb/singleton.d.ts.map +0 -1
- package/dest/indexeddb/store.d.ts +0 -97
- package/dest/indexeddb/store.d.ts.map +0 -1
- package/dest/interfaces/array.d.ts +0 -80
- package/dest/interfaces/array.d.ts.map +0 -1
- package/dest/interfaces/array_test_suite.d.ts +0 -3
- package/dest/interfaces/array_test_suite.d.ts.map +0 -1
- package/dest/interfaces/common.d.ts +0 -23
- package/dest/interfaces/common.d.ts.map +0 -1
- package/dest/interfaces/counter.d.ts +0 -59
- package/dest/interfaces/counter.d.ts.map +0 -1
- package/dest/interfaces/index.d.ts +0 -8
- package/dest/interfaces/index.d.ts.map +0 -1
- package/dest/interfaces/map.d.ts +0 -134
- package/dest/interfaces/map.d.ts.map +0 -1
- package/dest/interfaces/map_test_suite.d.ts +0 -3
- package/dest/interfaces/map_test_suite.d.ts.map +0 -1
- package/dest/interfaces/set.d.ts +0 -44
- package/dest/interfaces/set.d.ts.map +0 -1
- package/dest/interfaces/set_test_suite.d.ts +0 -3
- package/dest/interfaces/set_test_suite.d.ts.map +0 -1
- package/dest/interfaces/singleton.d.ts +0 -29
- package/dest/interfaces/singleton.d.ts.map +0 -1
- package/dest/interfaces/singleton_test_suite.d.ts +0 -3
- package/dest/interfaces/singleton_test_suite.d.ts.map +0 -1
- package/dest/interfaces/store.d.ts +0 -145
- package/dest/interfaces/store.d.ts.map +0 -1
- package/dest/interfaces/store_test_suite.d.ts +0 -3
- package/dest/interfaces/store_test_suite.d.ts.map +0 -1
- package/dest/interfaces/utils.d.ts +0 -16
- package/dest/interfaces/utils.d.ts.map +0 -1
- package/dest/lmdb/array.d.ts +0 -23
- package/dest/lmdb/array.d.ts.map +0 -1
- package/dest/lmdb/counter.d.ts +0 -19
- package/dest/lmdb/counter.d.ts.map +0 -1
- package/dest/lmdb/index.d.ts +0 -12
- package/dest/lmdb/index.d.ts.map +0 -1
- package/dest/lmdb/map.d.ts +0 -52
- package/dest/lmdb/map.d.ts.map +0 -1
- package/dest/lmdb/set.d.ts +0 -18
- package/dest/lmdb/set.d.ts.map +0 -1
- package/dest/lmdb/singleton.d.ts +0 -14
- package/dest/lmdb/singleton.d.ts.map +0 -1
- package/dest/lmdb/store.d.ts +0 -110
- package/dest/lmdb/store.d.ts.map +0 -1
- package/dest/lmdb-v2/factory.d.ts +0 -7
- package/dest/lmdb-v2/factory.d.ts.map +0 -1
- package/dest/lmdb-v2/index.d.ts +0 -3
- package/dest/lmdb-v2/index.d.ts.map +0 -1
- package/dest/lmdb-v2/map.d.ts +0 -86
- package/dest/lmdb-v2/map.d.ts.map +0 -1
- package/dest/lmdb-v2/message.d.ts +0 -112
- package/dest/lmdb-v2/message.d.ts.map +0 -1
- package/dest/lmdb-v2/read_transaction.d.ts +0 -14
- package/dest/lmdb-v2/read_transaction.d.ts.map +0 -1
- package/dest/lmdb-v2/singleton.d.ts +0 -12
- package/dest/lmdb-v2/singleton.d.ts.map +0 -1
- package/dest/lmdb-v2/store.d.ts +0 -41
- package/dest/lmdb-v2/store.d.ts.map +0 -1
- package/dest/lmdb-v2/utils.d.ts +0 -19
- package/dest/lmdb-v2/utils.d.ts.map +0 -1
- package/dest/lmdb-v2/write_transaction.d.ts +0 -19
- package/dest/lmdb-v2/write_transaction.d.ts.map +0 -1
- package/dest/stores/index.d.ts +0 -2
- package/dest/stores/index.d.ts.map +0 -1
- package/dest/stores/l2_tips_store.d.ts +0 -13
- package/dest/stores/l2_tips_store.d.ts.map +0 -1
- package/dest/utils.d.ts +0 -12
- package/dest/utils.d.ts.map +0 -1
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
var _WriteTransaction_instances, _WriteTransaction_iterate;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
1
|
import { Database, LMDBMessageType } from './message.js';
|
|
4
2
|
import { ReadTransaction } from './read_transaction.js';
|
|
5
|
-
import { dedupeSortedArray, findInSortedArray, findIndexInSortedArray, insertIntoSortedArray, keyCmp, merge, removeAnyOf, removeFromSortedArray, singleKeyCmp
|
|
3
|
+
import { dedupeSortedArray, findInSortedArray, findIndexInSortedArray, insertIntoSortedArray, keyCmp, merge, removeAnyOf, removeFromSortedArray, singleKeyCmp } from './utils.js';
|
|
6
4
|
export class WriteTransaction extends ReadTransaction {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
addEntries: [],
|
|
17
|
-
removeEntries: [],
|
|
18
|
-
};
|
|
19
|
-
}
|
|
5
|
+
// exposed for tests
|
|
6
|
+
dataBatch = {
|
|
7
|
+
addEntries: [],
|
|
8
|
+
removeEntries: []
|
|
9
|
+
};
|
|
10
|
+
indexBatch = {
|
|
11
|
+
addEntries: [],
|
|
12
|
+
removeEntries: []
|
|
13
|
+
};
|
|
20
14
|
set(key, value) {
|
|
21
15
|
this.assertIsOpen();
|
|
22
16
|
const addEntry = findInSortedArray(this.dataBatch.addEntries, key, singleKeyCmp);
|
|
23
17
|
if (!addEntry) {
|
|
24
|
-
insertIntoSortedArray(this.dataBatch.addEntries, [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
insertIntoSortedArray(this.dataBatch.addEntries, [
|
|
19
|
+
key,
|
|
20
|
+
[
|
|
21
|
+
value
|
|
22
|
+
]
|
|
23
|
+
], keyCmp);
|
|
24
|
+
} else {
|
|
25
|
+
addEntry[1] = [
|
|
26
|
+
value
|
|
27
|
+
];
|
|
28
28
|
}
|
|
29
29
|
const removeEntryIndex = findIndexInSortedArray(this.dataBatch.removeEntries, key, singleKeyCmp);
|
|
30
30
|
if (removeEntryIndex > -1) {
|
|
@@ -35,7 +35,10 @@ export class WriteTransaction extends ReadTransaction {
|
|
|
35
35
|
remove(key) {
|
|
36
36
|
const removeEntryIndex = findIndexInSortedArray(this.dataBatch.removeEntries, key, singleKeyCmp);
|
|
37
37
|
if (removeEntryIndex === -1) {
|
|
38
|
-
this.dataBatch.removeEntries.push([
|
|
38
|
+
this.dataBatch.removeEntries.push([
|
|
39
|
+
key,
|
|
40
|
+
null
|
|
41
|
+
]);
|
|
39
42
|
}
|
|
40
43
|
const addEntryIndex = findIndexInSortedArray(this.dataBatch.addEntries, key, singleKeyCmp);
|
|
41
44
|
if (addEntryIndex > -1) {
|
|
@@ -73,9 +76,11 @@ export class WriteTransaction extends ReadTransaction {
|
|
|
73
76
|
if (addEntries) {
|
|
74
77
|
merge(addEntries[1], values, Buffer.compare);
|
|
75
78
|
dedupeSortedArray(addEntries[1], Buffer.compare);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
} else {
|
|
80
|
+
insertIntoSortedArray(this.indexBatch.addEntries, [
|
|
81
|
+
key,
|
|
82
|
+
values
|
|
83
|
+
], keyCmp);
|
|
79
84
|
}
|
|
80
85
|
return Promise.resolve();
|
|
81
86
|
}
|
|
@@ -90,9 +95,11 @@ export class WriteTransaction extends ReadTransaction {
|
|
|
90
95
|
}
|
|
91
96
|
if (removeEntries) {
|
|
92
97
|
removeEntries[1] = null;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
|
|
98
|
+
} else {
|
|
99
|
+
insertIntoSortedArray(this.indexBatch.removeEntries, [
|
|
100
|
+
key,
|
|
101
|
+
null
|
|
102
|
+
], keyCmp);
|
|
96
103
|
}
|
|
97
104
|
return Promise.resolve();
|
|
98
105
|
}
|
|
@@ -103,12 +110,14 @@ export class WriteTransaction extends ReadTransaction {
|
|
|
103
110
|
}
|
|
104
111
|
}
|
|
105
112
|
if (removeEntries) {
|
|
106
|
-
removeEntries[1]
|
|
113
|
+
removeEntries[1] ??= [];
|
|
107
114
|
merge(removeEntries[1], values, Buffer.compare);
|
|
108
115
|
dedupeSortedArray(removeEntries[1], Buffer.compare);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
116
|
+
} else {
|
|
117
|
+
insertIntoSortedArray(this.indexBatch.removeEntries, [
|
|
118
|
+
key,
|
|
119
|
+
values
|
|
120
|
+
], keyCmp);
|
|
112
121
|
}
|
|
113
122
|
return Promise.resolve();
|
|
114
123
|
}
|
|
@@ -130,10 +139,10 @@ export class WriteTransaction extends ReadTransaction {
|
|
|
130
139
|
return results;
|
|
131
140
|
}
|
|
132
141
|
async *iterate(startKey, endKey, reverse, limit) {
|
|
133
|
-
yield*
|
|
142
|
+
yield* this.#iterate(super.iterate(startKey, endKey, reverse), this.dataBatch, startKey, endKey, reverse, limit, (committed, toAdd)=>toAdd.length > 0 ? toAdd[0] : committed, (vals)=>vals[0]);
|
|
134
143
|
}
|
|
135
144
|
async *iterateIndex(startKey, endKey, reverse, limit) {
|
|
136
|
-
yield*
|
|
145
|
+
yield* this.#iterate(super.iterateIndex(startKey, endKey, reverse), this.indexBatch, startKey, endKey, reverse, limit, (committed, toAdd, toRemove)=>{
|
|
137
146
|
if (toAdd.length > 0) {
|
|
138
147
|
merge(committed, toAdd, Buffer.compare);
|
|
139
148
|
dedupeSortedArray(committed, Buffer.compare);
|
|
@@ -142,93 +151,104 @@ export class WriteTransaction extends ReadTransaction {
|
|
|
142
151
|
removeAnyOf(committed, toRemove, Buffer.compare);
|
|
143
152
|
}
|
|
144
153
|
return committed;
|
|
145
|
-
}, vals
|
|
154
|
+
}, (vals)=>vals);
|
|
146
155
|
}
|
|
147
|
-
async
|
|
156
|
+
async *#iterate(iterator, batch, startKey, endKey, reverse = false, limit, merge, map) {
|
|
148
157
|
this.assertIsOpen();
|
|
149
|
-
this
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const uncommittedEntries = [...batch.addEntries];
|
|
162
|
-
// used to check we're in the right order when comparing between a key and uncommittedEntries
|
|
163
|
-
let cmpDirection = -1;
|
|
164
|
-
if (reverse) {
|
|
165
|
-
cmpDirection = 1;
|
|
166
|
-
uncommittedEntries.reverse();
|
|
167
|
-
}
|
|
168
|
-
let uncommittedEntriesIdx = 0;
|
|
169
|
-
while (uncommittedEntriesIdx < uncommittedEntries.length) {
|
|
170
|
-
const entry = uncommittedEntries[uncommittedEntriesIdx];
|
|
171
|
-
// go to the first key in our cache that would be captured by the iterator
|
|
172
|
-
if (Buffer.compare(entry[0], startKey) !== cmpDirection) {
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
uncommittedEntriesIdx++;
|
|
176
|
-
}
|
|
177
|
-
let count = 0;
|
|
178
|
-
// helper to early return if we've reached our limit
|
|
179
|
-
const checkLimit = typeof limit === 'number' ? () => count < limit : () => true;
|
|
180
|
-
for await (const [key, values] of iterator) {
|
|
181
|
-
// yield every key that we have cached that's captured by the iterator
|
|
182
|
-
while (uncommittedEntriesIdx < uncommittedEntries.length && checkLimit()) {
|
|
158
|
+
// make a copy of this in case we're running in reverse
|
|
159
|
+
const uncommittedEntries = [
|
|
160
|
+
...batch.addEntries
|
|
161
|
+
];
|
|
162
|
+
// used to check we're in the right order when comparing between a key and uncommittedEntries
|
|
163
|
+
let cmpDirection = -1;
|
|
164
|
+
if (reverse) {
|
|
165
|
+
cmpDirection = 1;
|
|
166
|
+
uncommittedEntries.reverse();
|
|
167
|
+
}
|
|
168
|
+
let uncommittedEntriesIdx = 0;
|
|
169
|
+
while(uncommittedEntriesIdx < uncommittedEntries.length){
|
|
183
170
|
const entry = uncommittedEntries[uncommittedEntriesIdx];
|
|
184
|
-
|
|
171
|
+
// go to the first key in our cache that would be captured by the iterator
|
|
172
|
+
if (Buffer.compare(entry[0], startKey) !== cmpDirection) {
|
|
185
173
|
break;
|
|
186
174
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
175
|
+
uncommittedEntriesIdx++;
|
|
176
|
+
}
|
|
177
|
+
let count = 0;
|
|
178
|
+
// helper to early return if we've reached our limit
|
|
179
|
+
const checkLimit = typeof limit === 'number' ? ()=>count < limit : ()=>true;
|
|
180
|
+
for await (const [key, values] of iterator){
|
|
181
|
+
// yield every key that we have cached that's captured by the iterator
|
|
182
|
+
while(uncommittedEntriesIdx < uncommittedEntries.length && checkLimit()){
|
|
183
|
+
const entry = uncommittedEntries[uncommittedEntriesIdx];
|
|
184
|
+
if (endKey && Buffer.compare(entry[0], endKey) !== cmpDirection) {
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
if (Buffer.compare(entry[0], key) === cmpDirection) {
|
|
188
|
+
count++;
|
|
189
|
+
yield [
|
|
190
|
+
entry[0],
|
|
191
|
+
map(entry[1])
|
|
192
|
+
];
|
|
193
|
+
} else {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
uncommittedEntriesIdx++;
|
|
190
197
|
}
|
|
191
|
-
|
|
198
|
+
if (!checkLimit()) {
|
|
192
199
|
break;
|
|
193
200
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
// we
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
201
|
+
const toRemove = findInSortedArray(batch.removeEntries, key, singleKeyCmp);
|
|
202
|
+
// at this point we've either exhausted all uncommitted entries,
|
|
203
|
+
// we reached a key strictly greater/smaller than `key`
|
|
204
|
+
// or we found the key itself
|
|
205
|
+
// check if it's the key and use the uncommitted value
|
|
206
|
+
let toAdd = [];
|
|
207
|
+
if (uncommittedEntriesIdx < uncommittedEntries.length && Buffer.compare(uncommittedEntries[uncommittedEntriesIdx][0], key) === 0) {
|
|
208
|
+
toAdd = uncommittedEntries[uncommittedEntriesIdx][1];
|
|
209
|
+
uncommittedEntriesIdx++;
|
|
210
|
+
}
|
|
211
|
+
if (toRemove && !toRemove[1]) {
|
|
212
|
+
continue;
|
|
213
|
+
} else {
|
|
214
|
+
const mergedValues = merge(values, toAdd, toRemove?.[1] ?? []);
|
|
215
|
+
if (mergedValues) {
|
|
216
|
+
count++;
|
|
217
|
+
yield [
|
|
218
|
+
key,
|
|
219
|
+
mergedValues
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
214
223
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
224
|
+
// emit all the uncommitted data that would be captured by this iterator
|
|
225
|
+
while(uncommittedEntriesIdx < uncommittedEntries.length && checkLimit()){
|
|
226
|
+
const entry = uncommittedEntries[uncommittedEntriesIdx];
|
|
227
|
+
if (endKey && Buffer.compare(entry[0], endKey) !== cmpDirection) {
|
|
228
|
+
break;
|
|
220
229
|
}
|
|
230
|
+
count++;
|
|
231
|
+
yield [
|
|
232
|
+
entry[0],
|
|
233
|
+
map(entry[1])
|
|
234
|
+
];
|
|
235
|
+
uncommittedEntriesIdx++;
|
|
221
236
|
}
|
|
222
237
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
238
|
+
async commit() {
|
|
239
|
+
this.assertIsOpen();
|
|
240
|
+
this.close();
|
|
241
|
+
await this.channel.sendMessage(LMDBMessageType.BATCH, {
|
|
242
|
+
batches: new Map([
|
|
243
|
+
[
|
|
244
|
+
Database.DATA,
|
|
245
|
+
this.dataBatch
|
|
246
|
+
],
|
|
247
|
+
[
|
|
248
|
+
Database.INDEX,
|
|
249
|
+
this.indexBatch
|
|
250
|
+
]
|
|
251
|
+
])
|
|
252
|
+
});
|
|
232
253
|
}
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVfdHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi93cml0ZV90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixZQUFZLEdBQ2IsTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGVBQWU7SUFBckQ7OztRQUNFLG9CQUFvQjtRQUNKLGNBQVMsR0FBVTtZQUNqQyxVQUFVLEVBQUUsRUFBRTtZQUNkLGFBQWEsRUFBRSxFQUFFO1NBQ2xCLENBQUM7UUFDYyxlQUFVLEdBQVU7WUFDbEMsVUFBVSxFQUFFLEVBQUU7WUFDZCxhQUFhLEVBQUUsRUFBRTtTQUNsQixDQUFDO0lBa1NKLENBQUM7SUFoU0MsR0FBRyxDQUFDLEdBQWUsRUFBRSxLQUFpQjtRQUNwQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLHFCQUFxQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxD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
|
|
254
|
+
}
|
package/dest/stores/index.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
/** Stores currently synced L2 tips and unfinalized block hashes. */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
this.
|
|
1
|
+
/** Stores currently synced L2 tips and unfinalized block hashes. */ export class L2TipsStore {
|
|
2
|
+
l2TipsStore;
|
|
3
|
+
l2BlockHashesStore;
|
|
4
|
+
constructor(store, namespace){
|
|
5
|
+
this.l2TipsStore = store.openMap([
|
|
6
|
+
namespace,
|
|
7
|
+
'l2_tips'
|
|
8
|
+
].join('_'));
|
|
9
|
+
this.l2BlockHashesStore = store.openMap([
|
|
10
|
+
namespace,
|
|
11
|
+
'l2_block_hashes'
|
|
12
|
+
].join('_'));
|
|
6
13
|
}
|
|
7
14
|
getL2BlockHash(number) {
|
|
8
15
|
return this.l2BlockHashesStore.getAsync(number);
|
|
@@ -11,24 +18,30 @@ export class L2TipsStore {
|
|
|
11
18
|
return {
|
|
12
19
|
latest: await this.getL2Tip('latest'),
|
|
13
20
|
finalized: await this.getL2Tip('finalized'),
|
|
14
|
-
proven: await this.getL2Tip('proven')
|
|
21
|
+
proven: await this.getL2Tip('proven')
|
|
15
22
|
};
|
|
16
23
|
}
|
|
17
24
|
async getL2Tip(tag) {
|
|
18
25
|
const blockNumber = await this.l2TipsStore.getAsync(tag);
|
|
19
26
|
if (blockNumber === undefined || blockNumber === 0) {
|
|
20
|
-
return {
|
|
27
|
+
return {
|
|
28
|
+
number: 0,
|
|
29
|
+
hash: undefined
|
|
30
|
+
};
|
|
21
31
|
}
|
|
22
32
|
const blockHash = await this.l2BlockHashesStore.getAsync(blockNumber);
|
|
23
33
|
if (!blockHash) {
|
|
24
34
|
throw new Error(`Block hash not found for block number ${blockNumber}`);
|
|
25
35
|
}
|
|
26
|
-
return {
|
|
36
|
+
return {
|
|
37
|
+
number: blockNumber,
|
|
38
|
+
hash: blockHash
|
|
39
|
+
};
|
|
27
40
|
}
|
|
28
41
|
async handleBlockStreamEvent(event) {
|
|
29
|
-
switch
|
|
42
|
+
switch(event.type){
|
|
30
43
|
case 'blocks-added':
|
|
31
|
-
for (const block of event.blocks)
|
|
44
|
+
for (const block of event.blocks){
|
|
32
45
|
await this.l2BlockHashesStore.set(block.number, (await block.header.hash()).toString());
|
|
33
46
|
}
|
|
34
47
|
await this.l2TipsStore.set('latest', event.blocks.at(-1).number);
|
|
@@ -41,11 +54,12 @@ export class L2TipsStore {
|
|
|
41
54
|
break;
|
|
42
55
|
case 'chain-finalized':
|
|
43
56
|
await this.l2TipsStore.set('finalized', event.blockNumber);
|
|
44
|
-
for await (const key of this.l2BlockHashesStore.keysAsync({
|
|
57
|
+
for await (const key of this.l2BlockHashesStore.keysAsync({
|
|
58
|
+
end: event.blockNumber
|
|
59
|
+
})){
|
|
45
60
|
await this.l2BlockHashesStore.delete(key);
|
|
46
61
|
}
|
|
47
62
|
break;
|
|
48
63
|
}
|
|
49
64
|
}
|
|
50
65
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvbDJfdGlwc19zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxvRUFBb0U7QUFDcEUsTUFBTSxPQUFPLFdBQVc7SUFJdEIsWUFBWSxLQUF3QixFQUFFLFNBQWlCO1FBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTSxjQUFjLENBQUMsTUFBYztRQUNsQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBZTtRQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBeUI7UUFDM0QsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsS0FBSyxjQUFjO2dCQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRixDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xFLE1BQU07WUFDUixLQUFLLGNBQWM7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEQsTUFBTTtZQUNSLEtBQUssY0FBYztnQkFDakIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNO1lBQ1IsS0FBSyxpQkFBaUI7Z0JBQ3BCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN0RixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBQ0QsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
package/dest/utils.js
CHANGED
|
@@ -5,24 +5,20 @@ import { isSyncStore } from './interfaces/utils.js';
|
|
|
5
5
|
* @param store - The store to check
|
|
6
6
|
* @param rollupAddress - The ETH address of the rollup contract
|
|
7
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) {
|
|
8
|
+
*/ export async function initStoreForRollup(store, rollupAddress, log) {
|
|
10
9
|
if (!rollupAddress) {
|
|
11
10
|
throw new Error('Rollup address is required');
|
|
12
11
|
}
|
|
13
12
|
const rollupAddressValue = store.openSingleton('rollupAddress');
|
|
14
13
|
const rollupAddressString = rollupAddress.toString();
|
|
15
|
-
const storedRollupAddressString = isSyncStore(store)
|
|
16
|
-
? rollupAddressValue.get()
|
|
17
|
-
: await rollupAddressValue.getAsync();
|
|
14
|
+
const storedRollupAddressString = isSyncStore(store) ? rollupAddressValue.get() : await rollupAddressValue.getAsync();
|
|
18
15
|
if (typeof storedRollupAddressString !== 'undefined' && storedRollupAddressString !== rollupAddressString) {
|
|
19
16
|
log?.warn(`Rollup address mismatch. Clearing entire database...`, {
|
|
20
17
|
expected: rollupAddressString,
|
|
21
|
-
found: storedRollupAddressString
|
|
18
|
+
found: storedRollupAddressString
|
|
22
19
|
});
|
|
23
20
|
await store.clear();
|
|
24
21
|
}
|
|
25
22
|
await rollupAddressValue.set(rollupAddressString);
|
|
26
23
|
return store;
|
|
27
24
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEtBQVEsRUFDUixhQUF5QixFQUN6QixHQUFZO0lBRVosSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFxQyxlQUFlLENBQUMsQ0FBQztJQUNwRyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyRCxNQUFNLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDbEQsQ0FBQyxDQUFFLGtCQUF5RSxDQUFDLEdBQUcsRUFBRTtRQUNsRixDQUFDLENBQUMsTUFBTyxrQkFBOEUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVyRyxJQUFJLE9BQU8seUJBQXlCLEtBQUssV0FBVyxJQUFJLHlCQUF5QixLQUFLLG1CQUFtQixFQUFFLENBQUM7UUFDMUcsR0FBRyxFQUFFLElBQUksQ0FBQyxzREFBc0QsRUFBRTtZQUNoRSxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLEtBQUssRUFBRSx5QkFBeUI7U0FDakMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sa0JBQWtCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/kv-store",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/interfaces/index.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
18
18
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
19
19
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
20
|
-
"test:node": "NODE_NO_WARNINGS=1 mocha --config ./.mocharc.json
|
|
20
|
+
"test:node": "NODE_NO_WARNINGS=1 mocha --config ./.mocharc.json",
|
|
21
21
|
"test:browser": "wtr --config ./web-test-runner.config.mjs",
|
|
22
22
|
"test": "yarn test:node && yarn test:browser && true",
|
|
23
23
|
"generate": "mkdir -p build && cp -v ../../barretenberg/cpp/build-pic/lib/nodejs_module.node build"
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"./package.local.json"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@aztec/circuit-types": "0.
|
|
31
|
-
"@aztec/ethereum": "0.
|
|
32
|
-
"@aztec/foundation": "0.
|
|
33
|
-
"@aztec/native": "0.
|
|
30
|
+
"@aztec/circuit-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
31
|
+
"@aztec/ethereum": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
32
|
+
"@aztec/foundation": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
33
|
+
"@aztec/native": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
34
34
|
"idb": "^8.0.0",
|
|
35
35
|
"lmdb": "^3.2.0",
|
|
36
36
|
"msgpackr": "^1.11.2",
|
package/src/interfaces/index.ts
CHANGED
package/src/lmdb-v2/factory.ts
CHANGED
|
@@ -77,3 +77,13 @@ export async function openTmpStore(
|
|
|
77
77
|
|
|
78
78
|
return AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, cleanup, log);
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
export function openStoreAt(
|
|
82
|
+
dataDir: string,
|
|
83
|
+
dbMapSizeKb = 10 * 1_024 * 1_024, // 10GB
|
|
84
|
+
maxReaders = MAX_READERS,
|
|
85
|
+
log: Logger = createLogger('kv-store:lmdb-v2'),
|
|
86
|
+
): Promise<AztecLMDBStoreV2> {
|
|
87
|
+
log.debug(`Opening data store at: ${dataDir} with size: ${dbMapSizeKb} KB (LMDB v2)`);
|
|
88
|
+
return AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, undefined, log);
|
|
89
|
+
}
|
package/src/lmdb-v2/store.ts
CHANGED
|
@@ -25,6 +25,7 @@ import { LMDBSingleValue } from './singleton.js';
|
|
|
25
25
|
import { WriteTransaction } from './write_transaction.js';
|
|
26
26
|
|
|
27
27
|
export class AztecLMDBStoreV2 implements AztecAsyncKVStore, LMDBMessageChannel {
|
|
28
|
+
private open = false;
|
|
28
29
|
private channel: MsgpackChannel<LMDBMessageType, LMDBRequestBody, LMDBResponseBody>;
|
|
29
30
|
private writerCtx = new AsyncLocalStorage<WriteTransaction>();
|
|
30
31
|
private writerQueue = new SerialQueue();
|
|
@@ -43,18 +44,24 @@ export class AztecLMDBStoreV2 implements AztecAsyncKVStore, LMDBMessageChannel {
|
|
|
43
44
|
this.availableCursors = new Semaphore(maxReaders - 1);
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
public get dataDirectory(): string {
|
|
48
|
+
return this.dataDir;
|
|
49
|
+
}
|
|
50
|
+
|
|
46
51
|
private async start() {
|
|
47
52
|
this.writerQueue.start();
|
|
48
53
|
|
|
49
|
-
await this.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
54
|
+
await this.channel.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
50
55
|
db: Database.DATA,
|
|
51
56
|
uniqueKeys: true,
|
|
52
57
|
});
|
|
53
58
|
|
|
54
|
-
await this.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
59
|
+
await this.channel.sendMessage(LMDBMessageType.OPEN_DATABASE, {
|
|
55
60
|
db: Database.INDEX,
|
|
56
61
|
uniqueKeys: false,
|
|
57
62
|
});
|
|
63
|
+
|
|
64
|
+
this.open = true;
|
|
58
65
|
}
|
|
59
66
|
|
|
60
67
|
public static async new(
|
|
@@ -70,10 +77,16 @@ export class AztecLMDBStoreV2 implements AztecAsyncKVStore, LMDBMessageChannel {
|
|
|
70
77
|
}
|
|
71
78
|
|
|
72
79
|
public getReadTx(): ReadTransaction {
|
|
80
|
+
if (!this.open) {
|
|
81
|
+
throw new Error('Store is closed');
|
|
82
|
+
}
|
|
73
83
|
return new ReadTransaction(this);
|
|
74
84
|
}
|
|
75
85
|
|
|
76
86
|
public getCurrentWriteTx(): WriteTransaction | undefined {
|
|
87
|
+
if (!this.open) {
|
|
88
|
+
throw new Error('Store is closed');
|
|
89
|
+
}
|
|
77
90
|
const currentWrite = this.writerCtx.getStore();
|
|
78
91
|
return currentWrite;
|
|
79
92
|
}
|
|
@@ -105,6 +118,10 @@ export class AztecLMDBStoreV2 implements AztecAsyncKVStore, LMDBMessageChannel {
|
|
|
105
118
|
async transactionAsync<T extends Exclude<any, Promise<any>>>(
|
|
106
119
|
callback: (tx: WriteTransaction) => Promise<T>,
|
|
107
120
|
): Promise<T> {
|
|
121
|
+
if (!this.open) {
|
|
122
|
+
throw new Error('Store is closed');
|
|
123
|
+
}
|
|
124
|
+
|
|
108
125
|
// transactionAsync might be called recursively
|
|
109
126
|
// send any writes to the parent tx, but don't close it
|
|
110
127
|
// if the callback throws then the parent tx will rollback automatically
|
|
@@ -144,14 +161,23 @@ export class AztecLMDBStoreV2 implements AztecAsyncKVStore, LMDBMessageChannel {
|
|
|
144
161
|
}
|
|
145
162
|
|
|
146
163
|
async close() {
|
|
164
|
+
if (!this.open) {
|
|
165
|
+
// already closed
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.open = false;
|
|
147
169
|
await this.writerQueue.cancel();
|
|
148
|
-
await this.sendMessage(LMDBMessageType.CLOSE, undefined);
|
|
170
|
+
await this.channel.sendMessage(LMDBMessageType.CLOSE, undefined);
|
|
149
171
|
}
|
|
150
172
|
|
|
151
173
|
public async sendMessage<T extends LMDBMessageType>(
|
|
152
174
|
msgType: T,
|
|
153
175
|
body: LMDBRequestBody[T],
|
|
154
176
|
): Promise<LMDBResponseBody[T]> {
|
|
177
|
+
if (!this.open) {
|
|
178
|
+
throw new Error('Store is closed');
|
|
179
|
+
}
|
|
180
|
+
|
|
155
181
|
if (msgType === LMDBMessageType.START_CURSOR) {
|
|
156
182
|
await this.availableCursors.acquire();
|
|
157
183
|
}
|
package/dest/config.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
|
-
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
-
export type DataStoreConfig = {
|
|
4
|
-
dataDirectory: string | undefined;
|
|
5
|
-
dataStoreMapSizeKB: number;
|
|
6
|
-
l1Contracts?: {
|
|
7
|
-
rollupAddress: EthAddress;
|
|
8
|
-
};
|
|
9
|
-
};
|
|
10
|
-
export declare const dataConfigMappings: ConfigMappingsType<DataStoreConfig>;
|
|
11
|
-
/**
|
|
12
|
-
* Returns the archiver configuration from the environment variables.
|
|
13
|
-
* Note: If an environment variable is not set, the default value is used.
|
|
14
|
-
* @returns The archiver configuration.
|
|
15
|
-
*/
|
|
16
|
-
export declare function getDataConfigFromEnv(): DataStoreConfig;
|
|
17
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dest/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAA6C,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE;QAAE,aAAa,EAAE,UAAU,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,CAAC,eAAe,CAclE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,CAEtD"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type IDBPDatabase, type IDBPObjectStore } from 'idb';
|
|
2
|
-
import { type AztecAsyncArray } from '../interfaces/array.js';
|
|
3
|
-
import { type AztecIDBSchema } from './store.js';
|
|
4
|
-
/**
|
|
5
|
-
* A persistent array backed by IndexedDB.
|
|
6
|
-
*/
|
|
7
|
-
export declare class IndexedDBAztecArray<T> implements AztecAsyncArray<T> {
|
|
8
|
-
#private;
|
|
9
|
-
constructor(rootDB: IDBPDatabase<AztecIDBSchema>, name: string);
|
|
10
|
-
set db(db: IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'> | undefined);
|
|
11
|
-
get db(): IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'>;
|
|
12
|
-
lengthAsync(): Promise<number>;
|
|
13
|
-
push(...vals: T[]): Promise<number>;
|
|
14
|
-
pop(): Promise<T | undefined>;
|
|
15
|
-
atAsync(index: number): Promise<T | undefined>;
|
|
16
|
-
setAt(index: number, val: T): Promise<boolean>;
|
|
17
|
-
entriesAsync(): AsyncIterableIterator<[number, T]>;
|
|
18
|
-
valuesAsync(): AsyncIterableIterator<T>;
|
|
19
|
-
[Symbol.asyncIterator](): AsyncIterableIterator<T>;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=array.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/indexeddb/array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,KAAK,CAAC;AAE9D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,mBAAmB,CAAC,CAAC,CAAE,YAAW,eAAe,CAAC,CAAC,CAAC;;gBAMnD,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM;IAM9D,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAEpF;IAED,IAAI,EAAE,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAEvE;IAEK,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ9B,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAenC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAa7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAW9C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB7C,YAAY,IAAI,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAQlD,WAAW,IAAI,qBAAqB,CAAC,CAAC,CAAC;IAM9C,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC;CAOnD"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
-
import { type DataStoreConfig } from '../config.js';
|
|
3
|
-
import { AztecIndexedDBStore } from './store.js';
|
|
4
|
-
export { AztecIndexedDBStore } from './store.js';
|
|
5
|
-
export declare function createStore(name: string, config: DataStoreConfig, log?: Logger): Promise<AztecIndexedDBStore>;
|
|
6
|
-
export declare function openTmpStore(ephemeral?: boolean): Promise<AztecIndexedDBStore>;
|
|
7
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexeddb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,GAAE,MAAiC,gCAgB9G;AAED,wBAAgB,YAAY,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAErF"}
|