@aztec/kv-store 5.0.0-private.20260318 → 5.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dest/bench/shared_map_bench.d.ts +19 -0
- package/dest/bench/shared_map_bench.d.ts.map +1 -0
- package/dest/bench/shared_map_bench.js +91 -0
- package/dest/indexeddb/index.js +1 -1
- package/dest/interfaces/array_test_suite.d.ts +1 -1
- package/dest/interfaces/array_test_suite.d.ts.map +1 -1
- package/dest/interfaces/array_test_suite.js +33 -34
- package/dest/interfaces/index.d.ts +2 -2
- package/dest/interfaces/index.d.ts.map +1 -1
- package/dest/interfaces/map_test_suite.d.ts +1 -1
- package/dest/interfaces/map_test_suite.d.ts.map +1 -1
- package/dest/interfaces/map_test_suite.js +32 -33
- package/dest/interfaces/multi_map_test_suite.d.ts +1 -1
- package/dest/interfaces/multi_map_test_suite.d.ts.map +1 -1
- package/dest/interfaces/multi_map_test_suite.js +68 -69
- package/dest/interfaces/set_test_suite.d.ts +1 -1
- package/dest/interfaces/set_test_suite.d.ts.map +1 -1
- package/dest/interfaces/set_test_suite.js +13 -14
- package/dest/interfaces/singleton_test_suite.d.ts +1 -1
- package/dest/interfaces/singleton_test_suite.d.ts.map +1 -1
- package/dest/interfaces/singleton_test_suite.js +6 -7
- package/dest/lmdb/index.js +2 -2
- package/dest/lmdb-v2/factory.d.ts +28 -3
- package/dest/lmdb-v2/factory.d.ts.map +1 -1
- package/dest/lmdb-v2/factory.js +61 -10
- package/dest/lmdb-v2/read_transaction.js +21 -19
- package/dest/lmdb-v2/store.d.ts +2 -2
- package/dest/lmdb-v2/store.d.ts.map +1 -1
- package/dest/lmdb-v2/store.js +4 -4
- package/dest/sqlite-opfs/array.d.ts +21 -0
- package/dest/sqlite-opfs/array.d.ts.map +1 -0
- package/dest/sqlite-opfs/array.js +128 -0
- package/dest/sqlite-opfs/errors.d.ts +27 -0
- package/dest/sqlite-opfs/errors.d.ts.map +1 -0
- package/dest/sqlite-opfs/errors.js +34 -0
- package/dest/sqlite-opfs/index.d.ts +16 -0
- package/dest/sqlite-opfs/index.d.ts.map +1 -0
- package/dest/sqlite-opfs/index.js +22 -0
- package/dest/sqlite-opfs/internal/ordered-binary-browser.d.ts +32 -0
- package/dest/sqlite-opfs/internal/ordered-binary-browser.d.ts.map +1 -0
- package/dest/sqlite-opfs/internal/ordered-binary-browser.js +448 -0
- package/dest/sqlite-opfs/map.d.ts +35 -0
- package/dest/sqlite-opfs/map.d.ts.map +1 -0
- package/dest/sqlite-opfs/map.js +163 -0
- package/dest/sqlite-opfs/messages.d.ts +66 -0
- package/dest/sqlite-opfs/messages.d.ts.map +1 -0
- package/dest/sqlite-opfs/messages.js +5 -0
- package/dest/sqlite-opfs/multi_map.d.ts +16 -0
- package/dest/sqlite-opfs/multi_map.d.ts.map +1 -0
- package/dest/sqlite-opfs/multi_map.js +67 -0
- package/dest/sqlite-opfs/set.d.ts +13 -0
- package/dest/sqlite-opfs/set.d.ts.map +1 -0
- package/dest/sqlite-opfs/set.js +19 -0
- package/dest/sqlite-opfs/singleton.d.ts +13 -0
- package/dest/sqlite-opfs/singleton.d.ts.map +1 -0
- package/dest/sqlite-opfs/singleton.js +48 -0
- package/dest/sqlite-opfs/store.d.ts +79 -0
- package/dest/sqlite-opfs/store.d.ts.map +1 -0
- package/dest/sqlite-opfs/store.js +281 -0
- package/dest/sqlite-opfs/worker.d.ts +2 -0
- package/dest/sqlite-opfs/worker.d.ts.map +1 -0
- package/dest/sqlite-opfs/worker.js +248 -0
- package/dest/stores/l2_tips_store.d.ts +7 -13
- package/dest/stores/l2_tips_store.d.ts.map +1 -1
- package/dest/stores/l2_tips_store.js +24 -43
- package/package.json +22 -19
- package/src/bench/shared_map_bench.ts +111 -0
- package/src/indexeddb/index.ts +1 -1
- package/src/interfaces/array_test_suite.ts +33 -35
- package/src/interfaces/index.ts +1 -1
- package/src/interfaces/map_test_suite.ts +32 -34
- package/src/interfaces/multi_map_test_suite.ts +65 -67
- package/src/interfaces/set_test_suite.ts +13 -15
- package/src/interfaces/singleton_test_suite.ts +6 -8
- package/src/lmdb/index.ts +2 -2
- package/src/lmdb-v2/factory.ts +79 -9
- package/src/lmdb-v2/read_transaction.ts +23 -23
- package/src/lmdb-v2/store.ts +4 -2
- package/src/sqlite-opfs/array.ts +124 -0
- package/src/sqlite-opfs/errors.ts +44 -0
- package/src/sqlite-opfs/index.ts +39 -0
- package/src/sqlite-opfs/internal/ordered-binary-browser.js +465 -0
- package/src/sqlite-opfs/map.ts +163 -0
- package/src/sqlite-opfs/messages.ts +39 -0
- package/src/sqlite-opfs/multi_map.ts +74 -0
- package/src/sqlite-opfs/set.ts +29 -0
- package/src/sqlite-opfs/singleton.ts +48 -0
- package/src/sqlite-opfs/store.ts +296 -0
- package/src/sqlite-opfs/worker.ts +230 -0
- package/src/stores/l2_tips_store.ts +20 -41
package/README.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# KV Store
|
|
2
2
|
|
|
3
|
-
The Aztec KV store is an implementation of a durable key-value database with a pluggable backend.
|
|
3
|
+
The Aztec KV store is an implementation of a durable key-value database with a pluggable backend. Four backends are available, each exposed as its own package entrypoint:
|
|
4
|
+
|
|
5
|
+
- `@aztec/kv-store/lmdb-v2`: server / Node. The current default for node components.
|
|
6
|
+
- `@aztec/kv-store/lmdb`: the legacy LMDB backend, backed by [`lmdb-js`](https://github.com/kriszyp/lmdb-js).
|
|
7
|
+
- `@aztec/kv-store/indexeddb`: browser, backed by IndexedDB.
|
|
8
|
+
- `@aztec/kv-store/sqlite-opfs`: browser, backed by SQLite over the Origin Private File System.
|
|
9
|
+
|
|
10
|
+
The backend is selected at import time. You import `createStore` (and friends) from the entrypoint you want.
|
|
4
11
|
|
|
5
12
|
This package exports a number of primitive data structures that can be used to build domain-specific databases in each node component (e.g. a PXE database or an Archiver database). The data structures supported:
|
|
6
13
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { AztecAsyncKVStore } from '../interfaces/store.js';
|
|
3
|
+
/** One benchmark measurement. */
|
|
4
|
+
export type BenchResult = {
|
|
5
|
+
/** Benchmark name (includes the backend prefix for disambiguation). */
|
|
6
|
+
name: string;
|
|
7
|
+
value: number;
|
|
8
|
+
unit: 'ms' | 'us';
|
|
9
|
+
};
|
|
10
|
+
export type BenchReporter = (results: BenchResult[]) => void | Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Runs the standard Map benchmark suite against any `AztecAsyncKVStore` backend,
|
|
13
|
+
* populates `results`, and calls `reporter` in `afterAll`.
|
|
14
|
+
*
|
|
15
|
+
* Kept free of Node-only deps (`fs`, `path`) so the same runner works under
|
|
16
|
+
* vitest-browser for IndexedDB and SQLite-OPFS.
|
|
17
|
+
*/
|
|
18
|
+
export declare function describeAztecMapBench(backendPrefix: string, getStore: () => Promise<AztecAsyncKVStore>, logger: Logger, reporter: BenchReporter): void;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkX21hcF9iZW5jaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JlbmNoL3NoYXJlZF9tYXBfYmVuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRSxpQ0FBaUM7QUFDakMsTUFBTSxNQUFNLFdBQVcsR0FBRztJQUN4Qix1RUFBdUU7SUFDdkUsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQztDQUNuQixDQUFDO0FBRUYsTUFBTSxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRTdFOzs7Ozs7R0FNRztBQUNILHdCQUFnQixxQkFBcUIsQ0FDbkMsYUFBYSxFQUFFLE1BQU0sRUFDckIsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQzFDLE1BQU0sRUFBRSxNQUFNLEVBQ2QsUUFBUSxFQUFFLGFBQWEsUUFrRnhCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared_map_bench.d.ts","sourceRoot":"","sources":["../../src/bench/shared_map_bench.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAKpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,iCAAiC;AACjC,MAAM,MAAM,WAAW,GAAG;IACxB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7E;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,EAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,QAkFxB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
2
|
+
/**
|
|
3
|
+
* Runs the standard Map benchmark suite against any `AztecAsyncKVStore` backend,
|
|
4
|
+
* populates `results`, and calls `reporter` in `afterAll`.
|
|
5
|
+
*
|
|
6
|
+
* Kept free of Node-only deps (`fs`, `path`) so the same runner works under
|
|
7
|
+
* vitest-browser for IndexedDB and SQLite-OPFS.
|
|
8
|
+
*/ export function describeAztecMapBench(backendPrefix, getStore, logger, reporter) {
|
|
9
|
+
describe(`${backendPrefix} Map benchmarks`, ()=>{
|
|
10
|
+
let store;
|
|
11
|
+
let map;
|
|
12
|
+
const results = [];
|
|
13
|
+
const generateKeyValuePairs = (count, offset = 0)=>{
|
|
14
|
+
const keys = Array.from({
|
|
15
|
+
length: count
|
|
16
|
+
}, (_, i)=>`key-${i + offset}`);
|
|
17
|
+
const values = Array.from({
|
|
18
|
+
length: count
|
|
19
|
+
}, (_, i)=>`value-${i + offset}`);
|
|
20
|
+
return keys.map((key, i)=>({
|
|
21
|
+
key,
|
|
22
|
+
value: values[i]
|
|
23
|
+
}));
|
|
24
|
+
};
|
|
25
|
+
const record = (name, value, unit)=>{
|
|
26
|
+
results.push({
|
|
27
|
+
name: `${backendPrefix}/Map/${name}`,
|
|
28
|
+
value,
|
|
29
|
+
unit
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
beforeEach(async ()=>{
|
|
33
|
+
store = await getStore();
|
|
34
|
+
map = store.openMap('test');
|
|
35
|
+
});
|
|
36
|
+
afterEach(async ()=>{
|
|
37
|
+
await store.delete();
|
|
38
|
+
});
|
|
39
|
+
afterAll(async ()=>{
|
|
40
|
+
const pretty = results.map((r)=>`${r.name}: ${r.value.toFixed(2)} ${r.unit}`).join('\n');
|
|
41
|
+
logger.info(`\n${pretty}\n`);
|
|
42
|
+
await reporter(results);
|
|
43
|
+
});
|
|
44
|
+
it('adds individual values', async ()=>{
|
|
45
|
+
const pairs = generateKeyValuePairs(1000);
|
|
46
|
+
const timer = new Timer();
|
|
47
|
+
for (const pair of pairs){
|
|
48
|
+
await map.set(pair.key, pair.value);
|
|
49
|
+
}
|
|
50
|
+
record('Individual insertion', timer.ms() / pairs.length, 'ms');
|
|
51
|
+
});
|
|
52
|
+
it('adds batched values', async ()=>{
|
|
53
|
+
const batches = Array.from({
|
|
54
|
+
length: 100
|
|
55
|
+
}, (_, i)=>generateKeyValuePairs(1000, i * 1000));
|
|
56
|
+
const timer = new Timer();
|
|
57
|
+
for (const batch of batches){
|
|
58
|
+
await map.setMany(batch);
|
|
59
|
+
}
|
|
60
|
+
record(`Batch insertion of ${batches[0].length} items`, timer.ms() / batches.length, 'ms');
|
|
61
|
+
});
|
|
62
|
+
it('reads individual values', async ()=>{
|
|
63
|
+
const pairs = generateKeyValuePairs(10000);
|
|
64
|
+
await map.setMany(pairs);
|
|
65
|
+
const timer = new Timer();
|
|
66
|
+
for (const pair of pairs){
|
|
67
|
+
await map.getAsync(pair.key);
|
|
68
|
+
}
|
|
69
|
+
record('Individual read', timer.ms() * 1000 / pairs.length, 'us');
|
|
70
|
+
});
|
|
71
|
+
it('reads via a cursor', async ()=>{
|
|
72
|
+
const pairs = generateKeyValuePairs(10000);
|
|
73
|
+
await map.setMany(pairs);
|
|
74
|
+
const timer = new Timer();
|
|
75
|
+
for await (const _ of map.entriesAsync()){
|
|
76
|
+
// consume
|
|
77
|
+
}
|
|
78
|
+
record(`Iterator per item read of ${pairs.length} items`, timer.ms() * 1000 / pairs.length, 'us');
|
|
79
|
+
});
|
|
80
|
+
it('reads the size of the map', async ()=>{
|
|
81
|
+
const numIterations = 1000;
|
|
82
|
+
const pairs = generateKeyValuePairs(10000);
|
|
83
|
+
await map.setMany(pairs);
|
|
84
|
+
const timer = new Timer();
|
|
85
|
+
for(let i = 0; i < numIterations; i++){
|
|
86
|
+
await map.sizeAsync();
|
|
87
|
+
}
|
|
88
|
+
record(`Read size of ${pairs.length} items`, timer.ms() * 1000 / numIterations, 'us');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
package/dest/indexeddb/index.js
CHANGED
|
@@ -9,7 +9,7 @@ export async function createStore(name, config, schemaVersion = undefined, log =
|
|
|
9
9
|
}
|
|
10
10
|
log.info(dataDirectory ? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKb} KB` : `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKb} KB`);
|
|
11
11
|
const store = await AztecIndexedDBStore.open(createLogger('kv-store:indexeddb'), dataDirectory ?? '', false);
|
|
12
|
-
return initStoreForRollupAndSchemaVersion(store, schemaVersion, config.
|
|
12
|
+
return initStoreForRollupAndSchemaVersion(store, schemaVersion, config.rollupAddress, log);
|
|
13
13
|
}
|
|
14
14
|
export function openTmpStore(ephemeral = false) {
|
|
15
15
|
return AztecIndexedDBStore.open(createLogger('kv-store:indexeddb'), undefined, ephemeral);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
|
|
2
2
|
export declare function describeAztecArray(testName: string, getStore: () => AztecKVStore | Promise<AztecAsyncKVStore>, forceAsync?: boolean): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfdGVzdF9zdWl0ZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvYXJyYXlfdGVzdF9zdWl0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbEUsd0JBQWdCLGtCQUFrQixDQUNoQyxRQUFRLEVBQUUsTUFBTSxFQUNoQixRQUFRLEVBQUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQ3pELFVBQVUsR0FBRSxPQUFlLFFBc0g1QiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/array_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/array_test_suite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACzD,UAAU,GAAE,OAAe,QAsH5B"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { toArray } from '@aztec/foundation/iterable';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
2
|
import { isSyncStore } from './utils.js';
|
|
4
3
|
export function describeAztecArray(testName, getStore, forceAsync = false) {
|
|
5
4
|
describe(testName, ()=>{
|
|
@@ -28,56 +27,56 @@ export function describeAztecArray(testName, getStore, forceAsync = false) {
|
|
|
28
27
|
await arr.push(1);
|
|
29
28
|
await arr.push(2);
|
|
30
29
|
await arr.push(3);
|
|
31
|
-
expect(await length()).
|
|
32
|
-
expect(await arr.pop()).
|
|
33
|
-
expect(await arr.pop()).
|
|
34
|
-
expect(await arr.pop()).
|
|
35
|
-
expect(await arr.pop()).
|
|
30
|
+
expect(await length()).toBe(3);
|
|
31
|
+
expect(await arr.pop()).toBe(3);
|
|
32
|
+
expect(await arr.pop()).toBe(2);
|
|
33
|
+
expect(await arr.pop()).toBe(1);
|
|
34
|
+
expect(await arr.pop()).toBe(undefined);
|
|
36
35
|
});
|
|
37
36
|
it('should be able to get values by index', async ()=>{
|
|
38
37
|
await arr.push(1);
|
|
39
38
|
await arr.push(2);
|
|
40
39
|
await arr.push(3);
|
|
41
|
-
expect(await at(0)).
|
|
42
|
-
expect(await at(1)).
|
|
43
|
-
expect(await at(2)).
|
|
44
|
-
expect(await at(3)).
|
|
45
|
-
expect(await at(-1)).
|
|
46
|
-
expect(await at(-2)).
|
|
47
|
-
expect(await at(-3)).
|
|
48
|
-
expect(await at(-4)).
|
|
40
|
+
expect(await at(0)).toBe(1);
|
|
41
|
+
expect(await at(1)).toBe(2);
|
|
42
|
+
expect(await at(2)).toBe(3);
|
|
43
|
+
expect(await at(3)).toBe(undefined);
|
|
44
|
+
expect(await at(-1)).toBe(3);
|
|
45
|
+
expect(await at(-2)).toBe(2);
|
|
46
|
+
expect(await at(-3)).toBe(1);
|
|
47
|
+
expect(await at(-4)).toBe(undefined);
|
|
49
48
|
});
|
|
50
49
|
it('should be able to set values by index', async ()=>{
|
|
51
50
|
await arr.push(1);
|
|
52
51
|
await arr.push(2);
|
|
53
52
|
await arr.push(3);
|
|
54
|
-
expect(await arr.setAt(0, 4)).
|
|
55
|
-
expect(await arr.setAt(1, 5)).
|
|
56
|
-
expect(await arr.setAt(2, 6)).
|
|
57
|
-
expect(await arr.setAt(3, 7)).
|
|
58
|
-
expect(await at(0)).
|
|
59
|
-
expect(await at(1)).
|
|
60
|
-
expect(await at(2)).
|
|
61
|
-
expect(await at(3)).
|
|
62
|
-
expect(await arr.setAt(-1, 8)).
|
|
63
|
-
expect(await arr.setAt(-2, 9)).
|
|
64
|
-
expect(await arr.setAt(-3, 10)).
|
|
65
|
-
expect(await arr.setAt(-4, 11)).
|
|
66
|
-
expect(await at(-1)).
|
|
67
|
-
expect(await at(-2)).
|
|
68
|
-
expect(await at(-3)).
|
|
69
|
-
expect(await at(-4)).
|
|
53
|
+
expect(await arr.setAt(0, 4)).toBe(true);
|
|
54
|
+
expect(await arr.setAt(1, 5)).toBe(true);
|
|
55
|
+
expect(await arr.setAt(2, 6)).toBe(true);
|
|
56
|
+
expect(await arr.setAt(3, 7)).toBe(false);
|
|
57
|
+
expect(await at(0)).toBe(4);
|
|
58
|
+
expect(await at(1)).toBe(5);
|
|
59
|
+
expect(await at(2)).toBe(6);
|
|
60
|
+
expect(await at(3)).toBe(undefined);
|
|
61
|
+
expect(await arr.setAt(-1, 8)).toBe(true);
|
|
62
|
+
expect(await arr.setAt(-2, 9)).toBe(true);
|
|
63
|
+
expect(await arr.setAt(-3, 10)).toBe(true);
|
|
64
|
+
expect(await arr.setAt(-4, 11)).toBe(false);
|
|
65
|
+
expect(await at(-1)).toBe(8);
|
|
66
|
+
expect(await at(-2)).toBe(9);
|
|
67
|
+
expect(await at(-3)).toBe(10);
|
|
68
|
+
expect(await at(-4)).toBe(undefined);
|
|
70
69
|
});
|
|
71
70
|
it('should be able to iterate over values', async ()=>{
|
|
72
71
|
await arr.push(1);
|
|
73
72
|
await arr.push(2);
|
|
74
73
|
await arr.push(3);
|
|
75
|
-
expect(await values()).
|
|
74
|
+
expect(await values()).toEqual([
|
|
76
75
|
1,
|
|
77
76
|
2,
|
|
78
77
|
3
|
|
79
78
|
]);
|
|
80
|
-
expect(await entries()).
|
|
79
|
+
expect(await entries()).toEqual([
|
|
81
80
|
[
|
|
82
81
|
0,
|
|
83
82
|
1
|
|
@@ -97,8 +96,8 @@ export function describeAztecArray(testName, getStore, forceAsync = false) {
|
|
|
97
96
|
await arr.push(2);
|
|
98
97
|
await arr.push(3);
|
|
99
98
|
const arr2 = store.openArray('test');
|
|
100
|
-
expect(await length(arr2)).
|
|
101
|
-
expect(await values(arr2)).
|
|
99
|
+
expect(await length(arr2)).toBe(3);
|
|
100
|
+
expect(await values(arr2)).toEqual(await values());
|
|
102
101
|
});
|
|
103
102
|
});
|
|
104
103
|
}
|
|
@@ -6,5 +6,5 @@ export * from './store.js';
|
|
|
6
6
|
export * from './set.js';
|
|
7
7
|
export * from './multi_map.js';
|
|
8
8
|
export { mapRange } from './common.js';
|
|
9
|
-
export type { CustomRange, Range, StoreSize } from './common.js';
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
export type { CustomRange, Key, Range, StoreSize } from './common.js';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcmZhY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLFlBQVksRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
|
|
2
2
|
export declare function describeAztecMap(testName: string, getStore: () => AztecKVStore | Promise<AztecAsyncKVStore>, forceAsync?: boolean): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcmZhY2VzL21hcF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUdsRSx3QkFBZ0IsZ0JBQWdCLENBQzlCLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLFFBQVEsRUFBRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFDekQsVUFBVSxHQUFFLE9BQWUsUUEyTDVCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/map_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"map_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/map_test_suite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACzD,UAAU,GAAE,OAAe,QA2L5B"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { toArray } from '@aztec/foundation/iterable';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
2
|
import { isSyncStore } from './utils.js';
|
|
4
3
|
export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
5
4
|
describe(testName, ()=>{
|
|
@@ -30,9 +29,9 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
30
29
|
it('should be able to set and get values', async ()=>{
|
|
31
30
|
await map.set('foo', 'bar');
|
|
32
31
|
await map.set('baz', 'qux');
|
|
33
|
-
expect(await get('foo')).
|
|
34
|
-
expect(await get('baz')).
|
|
35
|
-
expect(await get('quux')).
|
|
32
|
+
expect(await get('foo')).toBe('bar');
|
|
33
|
+
expect(await get('baz')).toBe('qux');
|
|
34
|
+
expect(await get('quux')).toBe(undefined);
|
|
36
35
|
});
|
|
37
36
|
it('should be able to set many values', async ()=>{
|
|
38
37
|
const pairs = Array.from({
|
|
@@ -43,62 +42,62 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
43
42
|
}));
|
|
44
43
|
await map.setMany(pairs);
|
|
45
44
|
for (const { key, value } of pairs){
|
|
46
|
-
expect(await get(key)).
|
|
45
|
+
expect(await get(key)).toBe(value);
|
|
47
46
|
}
|
|
48
47
|
});
|
|
49
48
|
it('should be able to overwrite values', async ()=>{
|
|
50
49
|
await map.set('foo', 'bar');
|
|
51
50
|
await map.set('foo', 'baz');
|
|
52
|
-
expect(await get('foo')).
|
|
51
|
+
expect(await get('foo')).toBe('baz');
|
|
53
52
|
});
|
|
54
53
|
it('should be able to set values if they do not exist', async ()=>{
|
|
55
|
-
expect(await map.setIfNotExists('foo', 'bar')).
|
|
56
|
-
expect(await map.setIfNotExists('foo', 'baz')).
|
|
57
|
-
expect(await get('foo')).
|
|
54
|
+
expect(await map.setIfNotExists('foo', 'bar')).toBe(true);
|
|
55
|
+
expect(await map.setIfNotExists('foo', 'baz')).toBe(false);
|
|
56
|
+
expect(await get('foo')).toBe('bar');
|
|
58
57
|
});
|
|
59
58
|
it('should be able to delete values', async ()=>{
|
|
60
59
|
await map.set('foo', 'bar');
|
|
61
60
|
await map.set('baz', 'qux');
|
|
62
61
|
await map.delete('foo');
|
|
63
|
-
expect(await get('foo')).
|
|
64
|
-
expect(await get('baz')).
|
|
62
|
+
expect(await get('foo')).toBe(undefined);
|
|
63
|
+
expect(await get('baz')).toBe('qux');
|
|
65
64
|
});
|
|
66
65
|
it('should be able to return size of the map', async ()=>{
|
|
67
66
|
await map.set('foo', 'bar');
|
|
68
|
-
expect(await size()).
|
|
67
|
+
expect(await size()).toBe(1);
|
|
69
68
|
await map.set('baz', 'qux');
|
|
70
|
-
expect(await size()).
|
|
69
|
+
expect(await size()).toBe(2);
|
|
71
70
|
await map.delete('foo');
|
|
72
|
-
expect(await size()).
|
|
71
|
+
expect(await size()).toBe(1);
|
|
73
72
|
});
|
|
74
73
|
it('returns 0 for empty map size', async ()=>{
|
|
75
|
-
expect(await size()).
|
|
74
|
+
expect(await size()).toBe(0);
|
|
76
75
|
});
|
|
77
76
|
it('calculates size correctly across multiple operations', async ()=>{
|
|
78
|
-
expect(await size()).
|
|
77
|
+
expect(await size()).toBe(0);
|
|
79
78
|
// Add items
|
|
80
79
|
await map.set('a', 'value1');
|
|
81
80
|
await map.set('b', 'value2');
|
|
82
81
|
await map.set('c', 'value3');
|
|
83
|
-
expect(await size()).
|
|
82
|
+
expect(await size()).toBe(3);
|
|
84
83
|
// Update existing (size should not change)
|
|
85
84
|
await map.set('b', 'updated');
|
|
86
|
-
expect(await size()).
|
|
85
|
+
expect(await size()).toBe(3);
|
|
87
86
|
// Delete some
|
|
88
87
|
await map.delete('a');
|
|
89
|
-
expect(await size()).
|
|
88
|
+
expect(await size()).toBe(2);
|
|
90
89
|
// Delete all
|
|
91
90
|
await map.delete('b');
|
|
92
91
|
await map.delete('c');
|
|
93
|
-
expect(await size()).
|
|
92
|
+
expect(await size()).toBe(0);
|
|
94
93
|
});
|
|
95
94
|
it('should be able to iterate over entries when there are no keys', async ()=>{
|
|
96
|
-
expect(await entries()).
|
|
95
|
+
expect(await entries()).toEqual([]);
|
|
97
96
|
});
|
|
98
97
|
it('should be able to iterate over entries', async ()=>{
|
|
99
98
|
await map.set('foo', 'bar');
|
|
100
99
|
await map.set('baz', 'qux');
|
|
101
|
-
expect(await entries()).
|
|
100
|
+
expect(await entries()).toEqual([
|
|
102
101
|
[
|
|
103
102
|
'baz',
|
|
104
103
|
'qux'
|
|
@@ -112,7 +111,7 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
112
111
|
it('should be able to iterate over values', async ()=>{
|
|
113
112
|
await map.set('foo', 'bar');
|
|
114
113
|
await map.set('baz', 'quux');
|
|
115
|
-
expect(await values()).
|
|
114
|
+
expect(await values()).toEqual([
|
|
116
115
|
'quux',
|
|
117
116
|
'bar'
|
|
118
117
|
]);
|
|
@@ -120,7 +119,7 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
120
119
|
it('should be able to iterate over keys', async ()=>{
|
|
121
120
|
await map.set('foo', 'bar');
|
|
122
121
|
await map.set('baz', 'qux');
|
|
123
|
-
expect(await keys()).
|
|
122
|
+
expect(await keys()).toEqual([
|
|
124
123
|
'baz',
|
|
125
124
|
'foo'
|
|
126
125
|
]);
|
|
@@ -128,7 +127,7 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
128
127
|
it('should be able to iterate over string keys that represent numbers', async ()=>{
|
|
129
128
|
await map.set('0x22', 'bar');
|
|
130
129
|
await map.set('0x31', 'qux');
|
|
131
|
-
expect(await keys()).
|
|
130
|
+
expect(await keys()).toEqual([
|
|
132
131
|
'0x22',
|
|
133
132
|
'0x31'
|
|
134
133
|
]);
|
|
@@ -204,7 +203,7 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
204
203
|
await map.set(b, 'b');
|
|
205
204
|
await map.set(c, 'c');
|
|
206
205
|
await map.set(d, 'd');
|
|
207
|
-
expect(await keys()).
|
|
206
|
+
expect(await keys()).toEqual([
|
|
208
207
|
a,
|
|
209
208
|
b,
|
|
210
209
|
c,
|
|
@@ -213,19 +212,19 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
213
212
|
expect(await keys({
|
|
214
213
|
start: b,
|
|
215
214
|
end: c
|
|
216
|
-
})).
|
|
215
|
+
})).toEqual([
|
|
217
216
|
b
|
|
218
217
|
]);
|
|
219
218
|
expect(await keys({
|
|
220
219
|
start: b
|
|
221
|
-
})).
|
|
220
|
+
})).toEqual([
|
|
222
221
|
b,
|
|
223
222
|
c,
|
|
224
223
|
d
|
|
225
224
|
]);
|
|
226
225
|
expect(await keys({
|
|
227
226
|
end: c
|
|
228
|
-
})).
|
|
227
|
+
})).toEqual([
|
|
229
228
|
a,
|
|
230
229
|
b
|
|
231
230
|
]);
|
|
@@ -233,26 +232,26 @@ export function describeAztecMap(testName, getStore, forceAsync = false) {
|
|
|
233
232
|
start: b,
|
|
234
233
|
end: c,
|
|
235
234
|
reverse: true
|
|
236
|
-
})).
|
|
235
|
+
})).toEqual([
|
|
237
236
|
c
|
|
238
237
|
]);
|
|
239
238
|
expect(await keys({
|
|
240
239
|
start: b,
|
|
241
240
|
limit: 1
|
|
242
|
-
})).
|
|
241
|
+
})).toEqual([
|
|
243
242
|
b
|
|
244
243
|
]);
|
|
245
244
|
expect(await keys({
|
|
246
245
|
start: b,
|
|
247
246
|
reverse: true
|
|
248
|
-
})).
|
|
247
|
+
})).toEqual([
|
|
249
248
|
d,
|
|
250
249
|
c
|
|
251
250
|
]);
|
|
252
251
|
expect(await keys({
|
|
253
252
|
end: b,
|
|
254
253
|
reverse: true
|
|
255
|
-
})).
|
|
254
|
+
})).toEqual([
|
|
256
255
|
b,
|
|
257
256
|
a
|
|
258
257
|
]);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
|
|
2
2
|
export declare function describeAztecMultiMap(testName: string, getStore: () => AztecKVStore | Promise<AztecAsyncKVStore>, forceAsync?: boolean): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfbWFwX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcmZhY2VzL211bHRpX21hcF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUdsRSx3QkFBZ0IscUJBQXFCLENBQ25DLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLFFBQVEsRUFBRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFDekQsVUFBVSxHQUFFLE9BQWUsUUF5VzVCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi_map_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/multi_map_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"multi_map_test_suite.d.ts","sourceRoot":"","sources":["../../src/interfaces/multi_map_test_suite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACzD,UAAU,GAAE,OAAe,QAyW5B"}
|