@aztec/kv-store 0.65.2 → 0.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/indexeddb/array.d.ts +21 -0
- package/dest/indexeddb/array.d.ts.map +1 -0
- package/dest/indexeddb/array.js +96 -0
- package/dest/indexeddb/index.d.ts +7 -0
- package/dest/indexeddb/index.d.ts.map +1 -0
- package/dest/indexeddb/index.js +22 -0
- package/dest/indexeddb/map.d.ts +26 -0
- package/dest/indexeddb/map.d.ts.map +1 -0
- package/dest/indexeddb/map.js +104 -0
- package/dest/indexeddb/set.d.ts +17 -0
- package/dest/indexeddb/set.d.ts.map +1 -0
- package/dest/indexeddb/set.js +25 -0
- package/dest/indexeddb/singleton.d.ts +16 -0
- package/dest/indexeddb/singleton.d.ts.map +1 -0
- package/dest/indexeddb/singleton.js +42 -0
- package/dest/indexeddb/store.d.ts +100 -0
- package/dest/indexeddb/store.d.ts.map +1 -0
- package/dest/indexeddb/store.js +156 -0
- package/dest/interfaces/array.d.ts +43 -11
- package/dest/interfaces/array.d.ts.map +1 -1
- package/dest/interfaces/array_test_suite.d.ts +3 -0
- package/dest/interfaces/array_test_suite.d.ts.map +1 -0
- package/dest/interfaces/array_test_suite.js +97 -0
- package/dest/interfaces/counter.d.ts +21 -1
- package/dest/interfaces/counter.d.ts.map +1 -1
- package/dest/interfaces/map.d.ts +62 -12
- package/dest/interfaces/map.d.ts.map +1 -1
- package/dest/interfaces/map_test_suite.d.ts +3 -0
- package/dest/interfaces/map_test_suite.d.ts.map +1 -0
- package/dest/interfaces/map_test_suite.js +114 -0
- package/dest/interfaces/set.d.ts +23 -7
- package/dest/interfaces/set.d.ts.map +1 -1
- package/dest/interfaces/set_test_suite.d.ts +3 -0
- package/dest/interfaces/set_test_suite.d.ts.map +1 -0
- package/dest/interfaces/set_test_suite.js +56 -0
- package/dest/interfaces/singleton.d.ts +14 -5
- package/dest/interfaces/singleton.d.ts.map +1 -1
- package/dest/interfaces/singleton_test_suite.d.ts +3 -0
- package/dest/interfaces/singleton_test_suite.d.ts.map +1 -0
- package/dest/interfaces/singleton_test_suite.js +30 -0
- package/dest/interfaces/store.d.ts +71 -8
- package/dest/interfaces/store.d.ts.map +1 -1
- package/dest/interfaces/store_test_suite.d.ts +3 -0
- package/dest/interfaces/store_test_suite.d.ts.map +1 -0
- package/dest/interfaces/store_test_suite.js +36 -0
- package/dest/interfaces/utils.d.ts +16 -0
- package/dest/interfaces/utils.d.ts.map +1 -0
- package/dest/interfaces/utils.js +19 -0
- package/dest/lmdb/array.d.ts +7 -2
- package/dest/lmdb/array.d.ts.map +1 -1
- package/dest/lmdb/array.js +20 -1
- package/dest/lmdb/counter.d.ts +5 -2
- package/dest/lmdb/counter.d.ts.map +1 -1
- package/dest/lmdb/counter.js +10 -1
- package/dest/lmdb/index.d.ts +10 -0
- package/dest/lmdb/index.d.ts.map +1 -1
- package/dest/lmdb/index.js +28 -1
- package/dest/lmdb/map.d.ts +8 -2
- package/dest/lmdb/map.d.ts.map +1 -1
- package/dest/lmdb/map.js +27 -1
- package/dest/lmdb/set.d.ts +4 -2
- package/dest/lmdb/set.d.ts.map +1 -1
- package/dest/lmdb/set.js +9 -1
- package/dest/lmdb/singleton.d.ts +3 -2
- package/dest/lmdb/singleton.d.ts.map +1 -1
- package/dest/lmdb/singleton.js +4 -1
- package/dest/lmdb/store.d.ts +21 -13
- package/dest/lmdb/store.d.ts.map +1 -1
- package/dest/lmdb/store.js +23 -19
- package/dest/stores/l2_tips_store.d.ts +2 -2
- package/dest/stores/l2_tips_store.d.ts.map +1 -1
- package/dest/stores/l2_tips_store.js +12 -12
- package/dest/utils.d.ts +8 -7
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +6 -25
- package/package.json +54 -38
- package/src/config.ts +1 -1
- package/src/indexeddb/array.ts +118 -0
- package/src/indexeddb/index.ts +29 -0
- package/src/indexeddb/map.ts +142 -0
- package/src/indexeddb/set.ts +37 -0
- package/src/indexeddb/singleton.ts +49 -0
- package/src/indexeddb/store.ts +192 -0
- package/src/interfaces/array.ts +48 -12
- package/src/interfaces/array_test_suite.ts +126 -0
- package/src/interfaces/counter.ts +23 -1
- package/src/interfaces/map.ts +69 -14
- package/src/interfaces/map_test_suite.ts +154 -0
- package/src/interfaces/set.ts +25 -8
- package/src/interfaces/set_test_suite.ts +77 -0
- package/src/interfaces/singleton.ts +14 -6
- package/src/interfaces/singleton_test_suite.ts +42 -0
- package/src/interfaces/store.ts +78 -8
- package/src/interfaces/store_test_suite.ts +52 -0
- package/src/interfaces/utils.ts +21 -0
- package/src/lmdb/array.ts +26 -2
- package/src/lmdb/counter.ts +14 -2
- package/src/lmdb/index.ts +36 -0
- package/src/lmdb/map.ts +34 -2
- package/src/lmdb/set.ts +12 -2
- package/src/lmdb/singleton.ts +6 -2
- package/src/lmdb/store.ts +39 -32
- package/src/stores/l2_tips_store.ts +16 -16
- package/src/utils.ts +8 -36
package/dest/lmdb/store.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
var _AztecLmdbStore_rootDb, _AztecLmdbStore_data, _AztecLmdbStore_multiMapData, _AztecLmdbStore_log;
|
|
2
2
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import {
|
|
4
|
-
import { mkdirSync } from 'fs';
|
|
5
|
-
import { mkdtemp, rm } from 'fs/promises';
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { promises as fs, mkdirSync } from 'fs';
|
|
6
5
|
import { open } from 'lmdb';
|
|
7
6
|
import { tmpdir } from 'os';
|
|
8
7
|
import { dirname, join } from 'path';
|
|
@@ -18,10 +17,11 @@ export class AztecLmdbStore {
|
|
|
18
17
|
constructor(rootDb, isEphemeral, path) {
|
|
19
18
|
this.isEphemeral = isEphemeral;
|
|
20
19
|
this.path = path;
|
|
20
|
+
this.syncGetters = true;
|
|
21
21
|
_AztecLmdbStore_rootDb.set(this, void 0);
|
|
22
22
|
_AztecLmdbStore_data.set(this, void 0);
|
|
23
23
|
_AztecLmdbStore_multiMapData.set(this, void 0);
|
|
24
|
-
_AztecLmdbStore_log.set(this,
|
|
24
|
+
_AztecLmdbStore_log.set(this, createLogger('kv-store:lmdb'));
|
|
25
25
|
__classPrivateFieldSet(this, _AztecLmdbStore_rootDb, rootDb, "f");
|
|
26
26
|
// big bucket to store all the data
|
|
27
27
|
__classPrivateFieldSet(this, _AztecLmdbStore_data, rootDb.openDB('data', {
|
|
@@ -48,7 +48,7 @@ export class AztecLmdbStore {
|
|
|
48
48
|
* @returns The store
|
|
49
49
|
*/
|
|
50
50
|
static open(path, mapSizeKb = 1 * 1024 * 1024, // defaults to 1 GB map size
|
|
51
|
-
ephemeral = false, log =
|
|
51
|
+
ephemeral = false, log = createLogger('kv-store:lmdb')) {
|
|
52
52
|
if (path) {
|
|
53
53
|
mkdirSync(path, { recursive: true });
|
|
54
54
|
}
|
|
@@ -64,7 +64,7 @@ export class AztecLmdbStore {
|
|
|
64
64
|
async fork() {
|
|
65
65
|
const baseDir = this.path ? dirname(this.path) : tmpdir();
|
|
66
66
|
__classPrivateFieldGet(this, _AztecLmdbStore_log, "f").debug(`Forking store with basedir ${baseDir}`);
|
|
67
|
-
const forkPath = (await mkdtemp(join(baseDir, 'aztec-store-fork-'))) + (this.isEphemeral || !this.path ? '/data.mdb' : '');
|
|
67
|
+
const forkPath = (await fs.mkdtemp(join(baseDir, 'aztec-store-fork-'))) + (this.isEphemeral || !this.path ? '/data.mdb' : '');
|
|
68
68
|
__classPrivateFieldGet(this, _AztecLmdbStore_log, "f").verbose(`Forking store to ${forkPath}`);
|
|
69
69
|
await __classPrivateFieldGet(this, _AztecLmdbStore_rootDb, "f").backup(forkPath, false);
|
|
70
70
|
const forkDb = open(forkPath, { noSync: this.isEphemeral });
|
|
@@ -122,6 +122,14 @@ export class AztecLmdbStore {
|
|
|
122
122
|
transaction(callback) {
|
|
123
123
|
return __classPrivateFieldGet(this, _AztecLmdbStore_rootDb, "f").transaction(callback);
|
|
124
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Runs a callback in a transaction.
|
|
127
|
+
* @param callback - Function to execute in a transaction
|
|
128
|
+
* @returns A promise that resolves to the return value of the callback
|
|
129
|
+
*/
|
|
130
|
+
async transactionAsync(callback) {
|
|
131
|
+
return await __classPrivateFieldGet(this, _AztecLmdbStore_rootDb, "f").transaction(callback);
|
|
132
|
+
}
|
|
125
133
|
/**
|
|
126
134
|
* Clears all entries in the store & sub DBs.
|
|
127
135
|
*/
|
|
@@ -151,7 +159,7 @@ export class AztecLmdbStore {
|
|
|
151
159
|
await this.drop();
|
|
152
160
|
await this.close();
|
|
153
161
|
if (this.path) {
|
|
154
|
-
await rm(this.path, { recursive: true, force: true });
|
|
162
|
+
await fs.rm(this.path, { recursive: true, force: true });
|
|
155
163
|
__classPrivateFieldGet(this, _AztecLmdbStore_log, "f").verbose(`Deleted database files at ${this.path}`);
|
|
156
164
|
}
|
|
157
165
|
}
|
|
@@ -173,11 +181,7 @@ export class AztecLmdbStore {
|
|
|
173
181
|
}
|
|
174
182
|
estimateSubDBSize(db) {
|
|
175
183
|
const stats = db.getStats();
|
|
176
|
-
let
|
|
177
|
-
let leafPages = 0;
|
|
178
|
-
let overflowPages = 0;
|
|
179
|
-
let pageSize = 0;
|
|
180
|
-
let totalSize = 0;
|
|
184
|
+
let actualSize = 0;
|
|
181
185
|
let numItems = 0;
|
|
182
186
|
// This is the total number of key/value pairs present in the DB
|
|
183
187
|
if ('entryCount' in stats && typeof stats.entryCount === 'number') {
|
|
@@ -192,14 +196,14 @@ export class AztecLmdbStore {
|
|
|
192
196
|
typeof stats.overflowPages === 'number' &&
|
|
193
197
|
'pageSize' in stats &&
|
|
194
198
|
typeof stats.pageSize === 'number') {
|
|
195
|
-
branchPages = stats.treeBranchPageCount;
|
|
196
|
-
leafPages = stats.treeLeafPageCount;
|
|
197
|
-
overflowPages = stats.overflowPages;
|
|
198
|
-
pageSize = stats.pageSize;
|
|
199
|
-
|
|
199
|
+
const branchPages = stats.treeBranchPageCount;
|
|
200
|
+
const leafPages = stats.treeLeafPageCount;
|
|
201
|
+
const overflowPages = stats.overflowPages;
|
|
202
|
+
const pageSize = stats.pageSize;
|
|
203
|
+
actualSize = (branchPages + leafPages + overflowPages) * pageSize;
|
|
200
204
|
}
|
|
201
|
-
return { actualSize
|
|
205
|
+
return { actualSize, numItems };
|
|
202
206
|
}
|
|
203
207
|
}
|
|
204
208
|
_AztecLmdbStore_rootDb = new WeakMap(), _AztecLmdbStore_data = new WeakMap(), _AztecLmdbStore_multiMapData = new WeakMap(), _AztecLmdbStore_log = new WeakMap();
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDL0MsT0FBTyxFQUFvQyxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQVF6QixZQUFZLE1BQW9CLEVBQWtCLFdBQW9CLEVBQVUsSUFBYTtRQUEzQyxnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUFVLFNBQUksR0FBSixJQUFJLENBQVM7UUFQN0YsZ0JBQVcsR0FBRyxJQUFhLENBQUM7UUFFNUIseUNBQXNCO1FBQ3RCLHVDQUE4QjtRQUM5QiwrQ0FBc0M7UUFDdEMsOEJBQU8sWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFDO1FBR25DLHVCQUFBLElBQUksMEJBQVcsTUFBTSxNQUFBLENBQUM7UUFFdEIsbUNBQW1DO1FBQ25DLHVCQUFBLElBQUksd0JBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakMsUUFBUSxF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
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type L2BlockStreamEvent, type L2BlockStreamEventHandler, type L2BlockStreamLocalDataProvider, type L2Tips } from '@aztec/circuit-types';
|
|
2
|
-
import { type
|
|
2
|
+
import { type AztecAsyncKVStore } from '../interfaces/store.js';
|
|
3
3
|
/** Stores currently synced L2 tips and unfinalized block hashes. */
|
|
4
4
|
export declare class L2TipsStore implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider {
|
|
5
5
|
private readonly l2TipsStore;
|
|
6
6
|
private readonly l2BlockHashesStore;
|
|
7
|
-
constructor(store:
|
|
7
|
+
constructor(store: AztecAsyncKVStore, namespace: string);
|
|
8
8
|
getL2BlockHash(number: number): Promise<string | undefined>;
|
|
9
9
|
getL2Tips(): Promise<L2Tips>;
|
|
10
10
|
private getL2Tip;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l2_tips_store.d.ts","sourceRoot":"","sources":["../../src/stores/l2_tips_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EAEnC,KAAK,MAAM,EACZ,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"l2_tips_store.d.ts","sourceRoot":"","sources":["../../src/stores/l2_tips_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EAEnC,KAAK,MAAM,EACZ,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,oEAAoE;AACpE,qBAAa,WAAY,YAAW,yBAAyB,EAAE,8BAA8B;IAC3F,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgC;gBAEvD,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM;IAKhD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIrD,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;YAQ3B,QAAQ;IAYT,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB9E"}
|
|
@@ -5,21 +5,21 @@ export class L2TipsStore {
|
|
|
5
5
|
this.l2BlockHashesStore = store.openMap([namespace, 'l2_block_hashes'].join('_'));
|
|
6
6
|
}
|
|
7
7
|
getL2BlockHash(number) {
|
|
8
|
-
return
|
|
8
|
+
return this.l2BlockHashesStore.getAsync(number);
|
|
9
9
|
}
|
|
10
|
-
getL2Tips() {
|
|
11
|
-
return
|
|
12
|
-
latest: this.getL2Tip('latest'),
|
|
13
|
-
finalized: this.getL2Tip('finalized'),
|
|
14
|
-
proven: this.getL2Tip('proven'),
|
|
15
|
-
}
|
|
10
|
+
async getL2Tips() {
|
|
11
|
+
return {
|
|
12
|
+
latest: await this.getL2Tip('latest'),
|
|
13
|
+
finalized: await this.getL2Tip('finalized'),
|
|
14
|
+
proven: await this.getL2Tip('proven'),
|
|
15
|
+
};
|
|
16
16
|
}
|
|
17
|
-
getL2Tip(tag) {
|
|
18
|
-
const blockNumber = this.l2TipsStore.
|
|
17
|
+
async getL2Tip(tag) {
|
|
18
|
+
const blockNumber = await this.l2TipsStore.getAsync(tag);
|
|
19
19
|
if (blockNumber === undefined || blockNumber === 0) {
|
|
20
20
|
return { number: 0, hash: undefined };
|
|
21
21
|
}
|
|
22
|
-
const blockHash = this.l2BlockHashesStore.
|
|
22
|
+
const blockHash = await this.l2BlockHashesStore.getAsync(blockNumber);
|
|
23
23
|
if (!blockHash) {
|
|
24
24
|
throw new Error(`Block hash not found for block number ${blockNumber}`);
|
|
25
25
|
}
|
|
@@ -41,11 +41,11 @@ export class L2TipsStore {
|
|
|
41
41
|
break;
|
|
42
42
|
case 'chain-finalized':
|
|
43
43
|
await this.l2TipsStore.set('finalized', event.blockNumber);
|
|
44
|
-
for (const key of this.l2BlockHashesStore.
|
|
44
|
+
for await (const key of this.l2BlockHashesStore.keysAsync({ end: event.blockNumber })) {
|
|
45
45
|
await this.l2BlockHashesStore.delete(key);
|
|
46
46
|
}
|
|
47
47
|
break;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvbDJfdGlwc19zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxvRUFBb0U7QUFDcEUsTUFBTSxPQUFPLFdBQVc7SUFJdEIsWUFBWSxLQUF3QixFQUFFLFNBQWlCO1FBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTSxjQUFjLENBQUMsTUFBYztRQUNsQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBZTtRQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBeUI7UUFDM0QsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsS0FBSyxjQUFjO2dCQUNqQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLGNBQWM7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEQsTUFBTTtZQUNSLEtBQUssY0FBYztnQkFDakIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNO1lBQ1IsS0FBSyxpQkFBaUI7Z0JBQ3BCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN0RixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBQ0QsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
package/dest/utils.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
1
2
|
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
-
import { type
|
|
3
|
-
import { AztecLmdbStore } from './lmdb/store.js';
|
|
4
|
-
export declare function createStore(name: string, config: DataStoreConfig, log?: Logger): Promise<AztecLmdbStore>;
|
|
3
|
+
import { type AztecAsyncKVStore, type AztecKVStore } from './interfaces/store.js';
|
|
5
4
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* @
|
|
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
|
|
9
10
|
*/
|
|
10
|
-
export declare function
|
|
11
|
+
export declare function initStoreForRollup<T extends AztecKVStore | AztecAsyncKVStore>(store: T, rollupAddress: EthAddress, log?: Logger): Promise<T>;
|
|
11
12
|
//# sourceMappingURL=utils.d.ts.map
|
package/dest/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGlF;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,YAAY,GAAG,iBAAiB,EACjF,KAAK,EAAE,CAAC,EACR,aAAa,EAAE,UAAU,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
|
package/dest/utils.js
CHANGED
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { AztecLmdbStore } from './lmdb/store.js';
|
|
4
|
-
export function createStore(name, config, log = createDebugLogger('aztec:kv-store')) {
|
|
5
|
-
let { dataDirectory } = config;
|
|
6
|
-
if (typeof dataDirectory !== 'undefined') {
|
|
7
|
-
dataDirectory = join(dataDirectory, name);
|
|
8
|
-
}
|
|
9
|
-
log.info(dataDirectory
|
|
10
|
-
? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKB} KB`
|
|
11
|
-
: `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKB} KB`);
|
|
12
|
-
return initStoreForRollup(AztecLmdbStore.open(dataDirectory, config.dataStoreMapSizeKB, false), config.l1Contracts.rollupAddress, log);
|
|
13
|
-
}
|
|
1
|
+
import { isSyncStore } from './interfaces/utils.js';
|
|
14
2
|
/**
|
|
15
3
|
* Clears the store if the rollup address does not match the one stored in the database.
|
|
16
4
|
* This is to prevent data from being accidentally shared between different rollup instances.
|
|
@@ -18,13 +6,15 @@ export function createStore(name, config, log = createDebugLogger('aztec:kv-stor
|
|
|
18
6
|
* @param rollupAddress - The ETH address of the rollup contract
|
|
19
7
|
* @returns A promise that resolves when the store is cleared, or rejects if the rollup address does not match
|
|
20
8
|
*/
|
|
21
|
-
async function initStoreForRollup(store, rollupAddress, log) {
|
|
9
|
+
export async function initStoreForRollup(store, rollupAddress, log) {
|
|
22
10
|
if (!rollupAddress) {
|
|
23
11
|
throw new Error('Rollup address is required');
|
|
24
12
|
}
|
|
25
13
|
const rollupAddressValue = store.openSingleton('rollupAddress');
|
|
26
14
|
const rollupAddressString = rollupAddress.toString();
|
|
27
|
-
const storedRollupAddressString =
|
|
15
|
+
const storedRollupAddressString = isSyncStore(store)
|
|
16
|
+
? rollupAddressValue.get()
|
|
17
|
+
: await rollupAddressValue.getAsync();
|
|
28
18
|
if (typeof storedRollupAddressString !== 'undefined' && storedRollupAddressString !== rollupAddressString) {
|
|
29
19
|
log?.warn(`Rollup address mismatch. Clearing entire database...`, {
|
|
30
20
|
expected: rollupAddressString,
|
|
@@ -35,13 +25,4 @@ async function initStoreForRollup(store, rollupAddress, log) {
|
|
|
35
25
|
await rollupAddressValue.set(rollupAddressString);
|
|
36
26
|
return store;
|
|
37
27
|
}
|
|
38
|
-
|
|
39
|
-
* Opens a temporary store for testing purposes.
|
|
40
|
-
* @param ephemeral - true if the store should only exist in memory and not automatically be flushed to disk. Optional
|
|
41
|
-
* @returns A new store
|
|
42
|
-
*/
|
|
43
|
-
export function openTmpStore(ephemeral = false) {
|
|
44
|
-
const mapSize = 1024 * 1024 * 10; // 10 GB map size
|
|
45
|
-
return AztecLmdbStore.open(undefined, mapSize, ephemeral);
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUk1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFZLEVBQUUsTUFBdUIsRUFBRSxNQUFjLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDO0lBQ2xILElBQUksRUFBRSxhQUFhLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDL0IsSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FDTixhQUFhO1FBQ1gsQ0FBQyxDQUFDLFlBQVksSUFBSSw0QkFBNEIsYUFBYSxrQkFBa0IsTUFBTSxDQUFDLGtCQUFrQixLQUFLO1FBQzNHLENBQUMsQ0FBQyxZQUFZLElBQUksdUNBQXVDLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxDQUMxRixDQUFDO0lBQ0YsT0FBTyxrQkFBa0IsQ0FDdkIsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxFQUNwRSxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFDaEMsR0FBRyxDQUNKLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUMvQixLQUFRLEVBQ1IsYUFBeUIsRUFDekIsR0FBWTtJQUVaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBcUMsZUFBZSxDQUFDLENBQUM7SUFDcEcsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDckQsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUUzRCxJQUFJLE9BQU8seUJBQXlCLEtBQUssV0FBVyxJQUFJLHlCQUF5QixLQUFLLG1CQUFtQixFQUFFLENBQUM7UUFDMUcsR0FBRyxFQUFFLElBQUksQ0FBQyxzREFBc0QsRUFBRTtZQUNoRSxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLEtBQUssRUFBRSx5QkFBeUI7U0FDakMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sa0JBQWtCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsWUFBcUIsS0FBSztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtJQUNuRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1RCxDQUFDIn0=
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEtBQVEsRUFDUixhQUF5QixFQUN6QixHQUFZO0lBRVosSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFxQyxlQUFlLENBQUMsQ0FBQztJQUNwRyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyRCxNQUFNLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDbEQsQ0FBQyxDQUFFLGtCQUF5RSxDQUFDLEdBQUcsRUFBRTtRQUNsRixDQUFDLENBQUMsTUFBTyxrQkFBOEUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVyRyxJQUFJLE9BQU8seUJBQXlCLEtBQUssV0FBVyxJQUFJLHlCQUF5QixLQUFLLG1CQUFtQixFQUFFLENBQUM7UUFDMUcsR0FBRyxFQUFFLElBQUksQ0FBQyxzREFBc0QsRUFBRTtZQUNoRSxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLEtBQUssRUFBRSx5QkFBeUI7U0FDakMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sa0JBQWtCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/kv-store",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.67.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/interfaces/index.js",
|
|
7
7
|
"./lmdb": "./dest/lmdb/index.js",
|
|
8
|
-
"./
|
|
8
|
+
"./indexeddb": "./dest/indexeddb/index.js",
|
|
9
9
|
"./stores": "./dest/stores/index.js",
|
|
10
10
|
"./config": "./dest/config.js"
|
|
11
11
|
},
|
|
@@ -15,19 +15,53 @@
|
|
|
15
15
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
16
16
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
17
17
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
18
|
-
"test": "NODE_NO_WARNINGS=1
|
|
19
|
-
"
|
|
18
|
+
"test:node": "NODE_NO_WARNINGS=1 mocha --config ./.mocharc.json",
|
|
19
|
+
"test:browser": "wtr --config ./web-test-runner.config.mjs",
|
|
20
|
+
"test": "yarn test:node && yarn test:browser"
|
|
20
21
|
},
|
|
21
22
|
"inherits": [
|
|
22
|
-
"../package.common.json"
|
|
23
|
+
"../package.common.json",
|
|
24
|
+
"./package.local.json"
|
|
23
25
|
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@aztec/circuit-types": "0.67.0",
|
|
28
|
+
"@aztec/ethereum": "0.67.0",
|
|
29
|
+
"@aztec/foundation": "0.67.0",
|
|
30
|
+
"idb": "^8.0.0",
|
|
31
|
+
"lmdb": "^3.0.6"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@aztec/circuits.js": "workspace:^",
|
|
35
|
+
"@jest/globals": "^29.5.0",
|
|
36
|
+
"@types/chai": "^5.0.1",
|
|
37
|
+
"@types/chai-as-promised": "^8.0.1",
|
|
38
|
+
"@types/jest": "^29.5.0",
|
|
39
|
+
"@types/mocha": "^10.0.10",
|
|
40
|
+
"@types/mocha-each": "^2.0.4",
|
|
41
|
+
"@types/node": "^18.7.23",
|
|
42
|
+
"@web/dev-server-esbuild": "^1.0.3",
|
|
43
|
+
"@web/test-runner": "^0.19.0",
|
|
44
|
+
"@web/test-runner-playwright": "^0.11.0",
|
|
45
|
+
"chai": "^5.1.2",
|
|
46
|
+
"chai-as-promised": "^8.0.1",
|
|
47
|
+
"jest": "^29.5.0",
|
|
48
|
+
"mocha": "^10.8.2",
|
|
49
|
+
"mocha-each": "^2.0.1",
|
|
50
|
+
"ts-node": "^10.9.1",
|
|
51
|
+
"typescript": "^5.0.4"
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"dest",
|
|
55
|
+
"src",
|
|
56
|
+
"!*.test.*"
|
|
57
|
+
],
|
|
58
|
+
"engines": {
|
|
59
|
+
"node": ">=18"
|
|
60
|
+
},
|
|
24
61
|
"jest": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
29
|
-
"rootDir": "./src",
|
|
30
|
-
"workerThreads": true,
|
|
62
|
+
"extensionsToTreatAsEsm": [
|
|
63
|
+
".ts"
|
|
64
|
+
],
|
|
31
65
|
"transform": {
|
|
32
66
|
"^.+\\.tsx?$": [
|
|
33
67
|
"@swc/jest",
|
|
@@ -44,9 +78,9 @@
|
|
|
44
78
|
}
|
|
45
79
|
]
|
|
46
80
|
},
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
81
|
+
"moduleNameMapper": {
|
|
82
|
+
"^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
|
|
83
|
+
},
|
|
50
84
|
"reporters": [
|
|
51
85
|
[
|
|
52
86
|
"default",
|
|
@@ -54,30 +88,12 @@
|
|
|
54
88
|
"summaryThreshold": 9999
|
|
55
89
|
}
|
|
56
90
|
]
|
|
91
|
+
],
|
|
92
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
93
|
+
"rootDir": "./src",
|
|
94
|
+
"testTimeout": 30000,
|
|
95
|
+
"setupFiles": [
|
|
96
|
+
"../../foundation/src/jest/setup.mjs"
|
|
57
97
|
]
|
|
58
|
-
},
|
|
59
|
-
"dependencies": {
|
|
60
|
-
"@aztec/circuit-types": "0.65.2",
|
|
61
|
-
"@aztec/ethereum": "0.65.2",
|
|
62
|
-
"@aztec/foundation": "0.65.2",
|
|
63
|
-
"lmdb": "^3.0.6"
|
|
64
|
-
},
|
|
65
|
-
"devDependencies": {
|
|
66
|
-
"@aztec/circuits.js": "workspace:^",
|
|
67
|
-
"@jest/globals": "^29.5.0",
|
|
68
|
-
"@types/jest": "^29.5.0",
|
|
69
|
-
"@types/node": "^18.7.23",
|
|
70
|
-
"jest": "^29.5.0",
|
|
71
|
-
"jest-mock-extended": "^3.0.3",
|
|
72
|
-
"ts-node": "^10.9.1",
|
|
73
|
-
"typescript": "^5.0.4"
|
|
74
|
-
},
|
|
75
|
-
"files": [
|
|
76
|
-
"dest",
|
|
77
|
-
"src",
|
|
78
|
-
"!*.test.*"
|
|
79
|
-
],
|
|
80
|
-
"engines": {
|
|
81
|
-
"node": ">=18"
|
|
82
98
|
}
|
|
83
99
|
}
|
package/src/config.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
|
5
5
|
export type DataStoreConfig = {
|
|
6
6
|
dataDirectory: string | undefined;
|
|
7
7
|
dataStoreMapSizeKB: number;
|
|
8
|
-
l1Contracts
|
|
8
|
+
l1Contracts?: { rollupAddress: EthAddress };
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
export const dataConfigMappings: ConfigMappingsType<DataStoreConfig> = {
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { type IDBPDatabase, type IDBPObjectStore } from 'idb';
|
|
2
|
+
|
|
3
|
+
import { type AztecAsyncArray } from '../interfaces/array.js';
|
|
4
|
+
import { type AztecIDBSchema } from './store.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A persistent array backed by IndexedDB.
|
|
8
|
+
*/
|
|
9
|
+
export class IndexedDBAztecArray<T> implements AztecAsyncArray<T> {
|
|
10
|
+
#_db?: IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'>;
|
|
11
|
+
#rootDB: IDBPDatabase<AztecIDBSchema>;
|
|
12
|
+
#container: string;
|
|
13
|
+
#name: string;
|
|
14
|
+
|
|
15
|
+
constructor(rootDB: IDBPDatabase<AztecIDBSchema>, name: string) {
|
|
16
|
+
this.#rootDB = rootDB;
|
|
17
|
+
this.#name = name;
|
|
18
|
+
this.#container = `array:${this.#name}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
set db(db: IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'> | undefined) {
|
|
22
|
+
this.#_db = db;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get db(): IDBPObjectStore<AztecIDBSchema, ['data'], 'data', 'readwrite'> {
|
|
26
|
+
return this.#_db ? this.#_db : this.#rootDB.transaction('data', 'readwrite').store;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async lengthAsync(): Promise<number> {
|
|
30
|
+
return (
|
|
31
|
+
(await this.db
|
|
32
|
+
.index('key')
|
|
33
|
+
.count(IDBKeyRange.bound([this.#container, this.#name], [this.#container, this.#name]))) ?? 0
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async push(...vals: T[]): Promise<number> {
|
|
38
|
+
let length = await this.lengthAsync();
|
|
39
|
+
for (const val of vals) {
|
|
40
|
+
await this.db.put({
|
|
41
|
+
value: val,
|
|
42
|
+
container: this.#container,
|
|
43
|
+
key: this.#name,
|
|
44
|
+
keyCount: length + 1,
|
|
45
|
+
slot: this.#slot(length),
|
|
46
|
+
});
|
|
47
|
+
length += 1;
|
|
48
|
+
}
|
|
49
|
+
return length;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async pop(): Promise<T | undefined> {
|
|
53
|
+
const length = await this.lengthAsync();
|
|
54
|
+
if (length === 0) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const slot = this.#slot(length - 1);
|
|
59
|
+
const data = await this.db.get(slot);
|
|
60
|
+
await this.db.delete(slot);
|
|
61
|
+
|
|
62
|
+
return data?.value;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async atAsync(index: number): Promise<T | undefined> {
|
|
66
|
+
const length = await this.lengthAsync();
|
|
67
|
+
|
|
68
|
+
if (index < 0) {
|
|
69
|
+
index = length + index;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const data = await this.db.get(this.#slot(index));
|
|
73
|
+
return data?.value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async setAt(index: number, val: T): Promise<boolean> {
|
|
77
|
+
const length = await this.lengthAsync();
|
|
78
|
+
|
|
79
|
+
if (index < 0) {
|
|
80
|
+
index = length + index;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (index < 0 || index >= length) {
|
|
84
|
+
return Promise.resolve(false);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
await this.db.put({
|
|
88
|
+
value: val,
|
|
89
|
+
container: this.#container,
|
|
90
|
+
key: this.#name,
|
|
91
|
+
keyCount: index + 1,
|
|
92
|
+
slot: this.#slot(index),
|
|
93
|
+
});
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async *entriesAsync(): AsyncIterableIterator<[number, T]> {
|
|
98
|
+
const index = this.db.index('key');
|
|
99
|
+
const rangeQuery = IDBKeyRange.bound([this.#container, this.#name], [this.#container, this.#name]);
|
|
100
|
+
for await (const cursor of index.iterate(rangeQuery)) {
|
|
101
|
+
yield [cursor.value.keyCount - 1, cursor.value.value] as [number, T];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async *valuesAsync(): AsyncIterableIterator<T> {
|
|
106
|
+
for await (const [_, value] of this.entriesAsync()) {
|
|
107
|
+
yield value;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<T> {
|
|
112
|
+
return this.valuesAsync();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#slot(index: number): string {
|
|
116
|
+
return `array:${this.#name}:slot:${index}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import { type DataStoreConfig } from '../config.js';
|
|
4
|
+
import { initStoreForRollup } from '../utils.js';
|
|
5
|
+
import { AztecIndexedDBStore } from './store.js';
|
|
6
|
+
|
|
7
|
+
export { AztecIndexedDBStore } from './store.js';
|
|
8
|
+
|
|
9
|
+
export async function createStore(name: string, config: DataStoreConfig, log: Logger = createLogger('kv-store')) {
|
|
10
|
+
let { dataDirectory } = config;
|
|
11
|
+
if (typeof dataDirectory !== 'undefined') {
|
|
12
|
+
dataDirectory = `${dataDirectory}/${name}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
log.info(
|
|
16
|
+
dataDirectory
|
|
17
|
+
? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKB} KB`
|
|
18
|
+
: `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKB} KB`,
|
|
19
|
+
);
|
|
20
|
+
const store = await AztecIndexedDBStore.open(createLogger('kv-store:indexeddb'), dataDirectory ?? '', false);
|
|
21
|
+
if (config.l1Contracts?.rollupAddress) {
|
|
22
|
+
return initStoreForRollup(store, config.l1Contracts.rollupAddress, log);
|
|
23
|
+
}
|
|
24
|
+
return store;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function openTmpStore(ephemeral: boolean = false): Promise<AztecIndexedDBStore> {
|
|
28
|
+
return AztecIndexedDBStore.open(createLogger('kv-store:indexeddb'), undefined, ephemeral);
|
|
29
|
+
}
|