@aztec/kv-store 0.0.1-commit.b33fc05d0 → 0.0.1-commit.b3d3157a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +8 -1
  2. package/dest/bench/shared_map_bench.d.ts +19 -0
  3. package/dest/bench/shared_map_bench.d.ts.map +1 -0
  4. package/dest/bench/shared_map_bench.js +91 -0
  5. package/dest/indexeddb/index.js +1 -1
  6. package/dest/interfaces/array_test_suite.d.ts +1 -1
  7. package/dest/interfaces/array_test_suite.d.ts.map +1 -1
  8. package/dest/interfaces/array_test_suite.js +33 -34
  9. package/dest/interfaces/index.d.ts +2 -2
  10. package/dest/interfaces/index.d.ts.map +1 -1
  11. package/dest/interfaces/map_test_suite.d.ts +1 -1
  12. package/dest/interfaces/map_test_suite.d.ts.map +1 -1
  13. package/dest/interfaces/map_test_suite.js +32 -33
  14. package/dest/interfaces/multi_map_test_suite.d.ts +1 -1
  15. package/dest/interfaces/multi_map_test_suite.d.ts.map +1 -1
  16. package/dest/interfaces/multi_map_test_suite.js +68 -69
  17. package/dest/interfaces/set_test_suite.d.ts +1 -1
  18. package/dest/interfaces/set_test_suite.d.ts.map +1 -1
  19. package/dest/interfaces/set_test_suite.js +13 -14
  20. package/dest/interfaces/singleton_test_suite.d.ts +1 -1
  21. package/dest/interfaces/singleton_test_suite.d.ts.map +1 -1
  22. package/dest/interfaces/singleton_test_suite.js +6 -7
  23. package/dest/lmdb/index.js +2 -2
  24. package/dest/lmdb/store.d.ts +3 -3
  25. package/dest/lmdb/store.d.ts.map +1 -1
  26. package/dest/lmdb/store.js +12 -8
  27. package/dest/lmdb-v2/factory.d.ts +28 -3
  28. package/dest/lmdb-v2/factory.d.ts.map +1 -1
  29. package/dest/lmdb-v2/factory.js +61 -10
  30. package/dest/lmdb-v2/read_transaction.js +21 -19
  31. package/dest/lmdb-v2/store.d.ts +2 -2
  32. package/dest/lmdb-v2/store.d.ts.map +1 -1
  33. package/dest/lmdb-v2/store.js +4 -4
  34. package/dest/sqlite-opfs/array.d.ts +21 -0
  35. package/dest/sqlite-opfs/array.d.ts.map +1 -0
  36. package/dest/sqlite-opfs/array.js +128 -0
  37. package/dest/sqlite-opfs/errors.d.ts +27 -0
  38. package/dest/sqlite-opfs/errors.d.ts.map +1 -0
  39. package/dest/sqlite-opfs/errors.js +34 -0
  40. package/dest/sqlite-opfs/index.d.ts +16 -0
  41. package/dest/sqlite-opfs/index.d.ts.map +1 -0
  42. package/dest/sqlite-opfs/index.js +22 -0
  43. package/dest/sqlite-opfs/internal/ordered-binary-browser.d.ts +32 -0
  44. package/dest/sqlite-opfs/internal/ordered-binary-browser.d.ts.map +1 -0
  45. package/dest/sqlite-opfs/internal/ordered-binary-browser.js +448 -0
  46. package/dest/sqlite-opfs/map.d.ts +35 -0
  47. package/dest/sqlite-opfs/map.d.ts.map +1 -0
  48. package/dest/sqlite-opfs/map.js +163 -0
  49. package/dest/sqlite-opfs/messages.d.ts +66 -0
  50. package/dest/sqlite-opfs/messages.d.ts.map +1 -0
  51. package/dest/sqlite-opfs/messages.js +5 -0
  52. package/dest/sqlite-opfs/multi_map.d.ts +16 -0
  53. package/dest/sqlite-opfs/multi_map.d.ts.map +1 -0
  54. package/dest/sqlite-opfs/multi_map.js +67 -0
  55. package/dest/sqlite-opfs/set.d.ts +13 -0
  56. package/dest/sqlite-opfs/set.d.ts.map +1 -0
  57. package/dest/sqlite-opfs/set.js +19 -0
  58. package/dest/sqlite-opfs/singleton.d.ts +13 -0
  59. package/dest/sqlite-opfs/singleton.d.ts.map +1 -0
  60. package/dest/sqlite-opfs/singleton.js +48 -0
  61. package/dest/sqlite-opfs/store.d.ts +79 -0
  62. package/dest/sqlite-opfs/store.d.ts.map +1 -0
  63. package/dest/sqlite-opfs/store.js +281 -0
  64. package/dest/sqlite-opfs/worker.d.ts +2 -0
  65. package/dest/sqlite-opfs/worker.d.ts.map +1 -0
  66. package/dest/sqlite-opfs/worker.js +249 -0
  67. package/dest/stores/l2_tips_store.d.ts +3 -3
  68. package/dest/stores/l2_tips_store.d.ts.map +1 -1
  69. package/dest/stores/l2_tips_store.js +2 -2
  70. package/package.json +22 -19
  71. package/src/bench/shared_map_bench.ts +111 -0
  72. package/src/indexeddb/index.ts +1 -1
  73. package/src/interfaces/array_test_suite.ts +33 -35
  74. package/src/interfaces/index.ts +1 -1
  75. package/src/interfaces/map_test_suite.ts +32 -34
  76. package/src/interfaces/multi_map_test_suite.ts +65 -67
  77. package/src/interfaces/set_test_suite.ts +13 -15
  78. package/src/interfaces/singleton_test_suite.ts +6 -8
  79. package/src/lmdb/index.ts +2 -2
  80. package/src/lmdb/store.ts +12 -8
  81. package/src/lmdb-v2/factory.ts +79 -9
  82. package/src/lmdb-v2/read_transaction.ts +23 -23
  83. package/src/lmdb-v2/store.ts +4 -2
  84. package/src/sqlite-opfs/array.ts +124 -0
  85. package/src/sqlite-opfs/errors.ts +44 -0
  86. package/src/sqlite-opfs/index.ts +39 -0
  87. package/src/sqlite-opfs/internal/ordered-binary-browser.js +465 -0
  88. package/src/sqlite-opfs/map.ts +163 -0
  89. package/src/sqlite-opfs/messages.ts +39 -0
  90. package/src/sqlite-opfs/multi_map.ts +74 -0
  91. package/src/sqlite-opfs/set.ts +29 -0
  92. package/src/sqlite-opfs/singleton.ts +48 -0
  93. package/src/sqlite-opfs/store.ts +296 -0
  94. package/src/sqlite-opfs/worker.ts +231 -0
  95. package/src/stores/l2_tips_store.ts +3 -2
@@ -1,7 +1,5 @@
1
1
  import { toArray } from '@aztec/foundation/iterable';
2
2
 
3
- import { expect } from 'chai';
4
-
5
3
  import type { Key, Range } from './common.js';
6
4
  import type { AztecAsyncMap, AztecMap } from './map.js';
7
5
  import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
@@ -59,9 +57,9 @@ export function describeAztecMap(
59
57
  await map.set('foo', 'bar');
60
58
  await map.set('baz', 'qux');
61
59
 
62
- expect(await get('foo')).to.equal('bar');
63
- expect(await get('baz')).to.equal('qux');
64
- expect(await get('quux')).to.equal(undefined);
60
+ expect(await get('foo')).toBe('bar');
61
+ expect(await get('baz')).toBe('qux');
62
+ expect(await get('quux')).toBe(undefined);
65
63
  });
66
64
 
67
65
  it('should be able to set many values', async () => {
@@ -69,7 +67,7 @@ export function describeAztecMap(
69
67
  await map.setMany(pairs);
70
68
 
71
69
  for (const { key, value } of pairs) {
72
- expect(await get(key)).to.equal(value);
70
+ expect(await get(key)).toBe(value);
73
71
  }
74
72
  });
75
73
 
@@ -77,14 +75,14 @@ export function describeAztecMap(
77
75
  await map.set('foo', 'bar');
78
76
  await map.set('foo', 'baz');
79
77
 
80
- expect(await get('foo')).to.equal('baz');
78
+ expect(await get('foo')).toBe('baz');
81
79
  });
82
80
 
83
81
  it('should be able to set values if they do not exist', async () => {
84
- expect(await map.setIfNotExists('foo', 'bar')).to.equal(true);
85
- expect(await map.setIfNotExists('foo', 'baz')).to.equal(false);
82
+ expect(await map.setIfNotExists('foo', 'bar')).toBe(true);
83
+ expect(await map.setIfNotExists('foo', 'baz')).toBe(false);
86
84
 
87
- expect(await get('foo')).to.equal('bar');
85
+ expect(await get('foo')).toBe('bar');
88
86
  });
89
87
 
90
88
  it('should be able to delete values', async () => {
@@ -93,56 +91,56 @@ export function describeAztecMap(
93
91
 
94
92
  await map.delete('foo');
95
93
 
96
- expect(await get('foo')).to.equal(undefined);
97
- expect(await get('baz')).to.equal('qux');
94
+ expect(await get('foo')).toBe(undefined);
95
+ expect(await get('baz')).toBe('qux');
98
96
  });
99
97
 
100
98
  it('should be able to return size of the map', async () => {
101
99
  await map.set('foo', 'bar');
102
- expect(await size()).to.equal(1);
100
+ expect(await size()).toBe(1);
103
101
  await map.set('baz', 'qux');
104
- expect(await size()).to.equal(2);
102
+ expect(await size()).toBe(2);
105
103
 
106
104
  await map.delete('foo');
107
- expect(await size()).to.equal(1);
105
+ expect(await size()).toBe(1);
108
106
  });
109
107
 
110
108
  it('returns 0 for empty map size', async () => {
111
- expect(await size()).to.equal(0);
109
+ expect(await size()).toBe(0);
112
110
  });
113
111
 
114
112
  it('calculates size correctly across multiple operations', async () => {
115
- expect(await size()).to.equal(0);
113
+ expect(await size()).toBe(0);
116
114
 
117
115
  // Add items
118
116
  await map.set('a', 'value1');
119
117
  await map.set('b', 'value2');
120
118
  await map.set('c', 'value3');
121
- expect(await size()).to.equal(3);
119
+ expect(await size()).toBe(3);
122
120
 
123
121
  // Update existing (size should not change)
124
122
  await map.set('b', 'updated');
125
- expect(await size()).to.equal(3);
123
+ expect(await size()).toBe(3);
126
124
 
127
125
  // Delete some
128
126
  await map.delete('a');
129
- expect(await size()).to.equal(2);
127
+ expect(await size()).toBe(2);
130
128
 
131
129
  // Delete all
132
130
  await map.delete('b');
133
131
  await map.delete('c');
134
- expect(await size()).to.equal(0);
132
+ expect(await size()).toBe(0);
135
133
  });
136
134
 
137
135
  it('should be able to iterate over entries when there are no keys', async () => {
138
- expect(await entries()).to.deep.equal([]);
136
+ expect(await entries()).toEqual([]);
139
137
  });
140
138
 
141
139
  it('should be able to iterate over entries', async () => {
142
140
  await map.set('foo', 'bar');
143
141
  await map.set('baz', 'qux');
144
142
 
145
- expect(await entries()).to.deep.equal([
143
+ expect(await entries()).toEqual([
146
144
  ['baz', 'qux'],
147
145
  ['foo', 'bar'],
148
146
  ]);
@@ -152,21 +150,21 @@ export function describeAztecMap(
152
150
  await map.set('foo', 'bar');
153
151
  await map.set('baz', 'quux');
154
152
 
155
- expect(await values()).to.deep.equal(['quux', 'bar']);
153
+ expect(await values()).toEqual(['quux', 'bar']);
156
154
  });
157
155
 
158
156
  it('should be able to iterate over keys', async () => {
159
157
  await map.set('foo', 'bar');
160
158
  await map.set('baz', 'qux');
161
159
 
162
- expect(await keys()).to.deep.equal(['baz', 'foo']);
160
+ expect(await keys()).toEqual(['baz', 'foo']);
163
161
  });
164
162
 
165
163
  it('should be able to iterate over string keys that represent numbers', async () => {
166
164
  await map.set('0x22', 'bar');
167
165
  await map.set('0x31', 'qux');
168
166
 
169
- expect(await keys()).to.deep.equal(['0x22', '0x31']);
167
+ expect(await keys()).toEqual(['0x22', '0x31']);
170
168
  });
171
169
 
172
170
  for (const [name, data] of [
@@ -186,14 +184,14 @@ export function describeAztecMap(
186
184
  await map.set(c, 'c');
187
185
  await map.set(d, 'd');
188
186
 
189
- expect(await keys()).to.deep.equal([a, b, c, d]);
190
- expect(await keys({ start: b, end: c })).to.deep.equal([b]);
191
- expect(await keys({ start: b })).to.deep.equal([b, c, d]);
192
- expect(await keys({ end: c })).to.deep.equal([a, b]);
193
- expect(await keys({ start: b, end: c, reverse: true })).to.deep.equal([c]);
194
- expect(await keys({ start: b, limit: 1 })).to.deep.equal([b]);
195
- expect(await keys({ start: b, reverse: true })).to.deep.equal([d, c]);
196
- expect(await keys({ end: b, reverse: true })).to.deep.equal([b, a]);
187
+ expect(await keys()).toEqual([a, b, c, d]);
188
+ expect(await keys({ start: b, end: c })).toEqual([b]);
189
+ expect(await keys({ start: b })).toEqual([b, c, d]);
190
+ expect(await keys({ end: c })).toEqual([a, b]);
191
+ expect(await keys({ start: b, end: c, reverse: true })).toEqual([c]);
192
+ expect(await keys({ start: b, limit: 1 })).toEqual([b]);
193
+ expect(await keys({ start: b, reverse: true })).toEqual([d, c]);
194
+ expect(await keys({ end: b, reverse: true })).toEqual([b, a]);
197
195
  });
198
196
  }
199
197
  });
@@ -1,7 +1,5 @@
1
1
  import { toArray } from '@aztec/foundation/iterable';
2
2
 
3
- import { expect } from 'chai';
4
-
5
3
  import type { Key, Range } from './common.js';
6
4
  import type { AztecAsyncMultiMap, AztecMultiMap } from './multi_map.js';
7
5
  import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
@@ -72,16 +70,16 @@ export function describeAztecMultiMap(
72
70
  await multiMap.set('foo', 'bar');
73
71
  await multiMap.set('baz', 'qux');
74
72
 
75
- expect(await get('foo')).to.equal('bar');
76
- expect(await get('baz')).to.equal('qux');
77
- expect(await get('quux')).to.equal(undefined);
73
+ expect(await get('foo')).toBe('bar');
74
+ expect(await get('baz')).toBe('qux');
75
+ expect(await get('quux')).toBe(undefined);
78
76
  });
79
77
 
80
78
  it('should be able to set values if they do not exist', async () => {
81
- expect(await multiMap.setIfNotExists('foo', 'bar')).to.equal(true);
82
- expect(await multiMap.setIfNotExists('foo', 'baz')).to.equal(false);
79
+ expect(await multiMap.setIfNotExists('foo', 'bar')).toBe(true);
80
+ expect(await multiMap.setIfNotExists('foo', 'baz')).toBe(false);
83
81
 
84
- expect(await get('foo')).to.equal('bar');
82
+ expect(await get('foo')).toBe('bar');
85
83
  });
86
84
 
87
85
  it('should be able to delete values', async () => {
@@ -90,61 +88,61 @@ export function describeAztecMultiMap(
90
88
 
91
89
  await multiMap.delete('foo');
92
90
 
93
- expect(await get('foo')).to.equal(undefined);
94
- expect(await get('baz')).to.equal('qux');
91
+ expect(await get('foo')).toBe(undefined);
92
+ expect(await get('baz')).toBe('qux');
95
93
  });
96
94
 
97
95
  it('should be able to get size of the map', async () => {
98
96
  await multiMap.set('foo', 'bar');
99
- expect(await size()).to.equal(1);
97
+ expect(await size()).toBe(1);
100
98
  await multiMap.set('baz', 'qux');
101
- expect(await size()).to.equal(2);
99
+ expect(await size()).toBe(2);
102
100
 
103
101
  await multiMap.delete('foo');
104
- expect(await size()).to.equal(1);
102
+ expect(await size()).toBe(1);
105
103
  });
106
104
 
107
105
  it('returns 0 for empty multimap size', async () => {
108
- expect(await size()).to.equal(0);
106
+ expect(await size()).toBe(0);
109
107
  });
110
108
 
111
109
  it('calculates size correctly with multiple values per key', async () => {
112
- expect(await size()).to.equal(0);
110
+ expect(await size()).toBe(0);
113
111
 
114
112
  // Add multiple values for same key
115
113
  await multiMap.set('key1', 'value1');
116
- expect(await size()).to.equal(1);
114
+ expect(await size()).toBe(1);
117
115
  await multiMap.set('key1', 'value2');
118
- expect(await size()).to.equal(2);
116
+ expect(await size()).toBe(2);
119
117
  await multiMap.set('key1', 'value3');
120
- expect(await size()).to.equal(3);
118
+ expect(await size()).toBe(3);
121
119
 
122
120
  // Add values for different key
123
121
  await multiMap.set('key2', 'value4');
124
- expect(await size()).to.equal(4);
122
+ expect(await size()).toBe(4);
125
123
 
126
124
  // Delete one value from key1
127
125
  await multiMap.deleteValue('key1', 'value2');
128
- expect(await size()).to.equal(3);
126
+ expect(await size()).toBe(3);
129
127
 
130
128
  // Delete entire key
131
129
  await multiMap.delete('key1');
132
- expect(await size()).to.equal(1);
130
+ expect(await size()).toBe(1);
133
131
 
134
132
  // Delete last key
135
133
  await multiMap.delete('key2');
136
- expect(await size()).to.equal(0);
134
+ expect(await size()).toBe(0);
137
135
  });
138
136
 
139
137
  it('should be able to iterate over entries when there are no keys', async () => {
140
- expect(await entries()).to.deep.equal([]);
138
+ expect(await entries()).toEqual([]);
141
139
  });
142
140
 
143
141
  it('should be able to iterate over entries', async () => {
144
142
  await multiMap.set('foo', 'bar');
145
143
  await multiMap.set('baz', 'qux');
146
144
 
147
- expect(await entries()).to.deep.equal([
145
+ expect(await entries()).toEqual([
148
146
  ['baz', 'qux'],
149
147
  ['foo', 'bar'],
150
148
  ]);
@@ -154,28 +152,28 @@ export function describeAztecMultiMap(
154
152
  await multiMap.set('foo', 'bar');
155
153
  await multiMap.set('baz', 'quux');
156
154
 
157
- expect(await values()).to.deep.equal(['quux', 'bar']);
155
+ expect(await values()).toEqual(['quux', 'bar']);
158
156
  });
159
157
 
160
158
  it('should be able to iterate over keys', async () => {
161
159
  await multiMap.set('foo', 'bar');
162
160
  await multiMap.set('baz', 'qux');
163
161
 
164
- expect(await keys()).to.deep.equal(['baz', 'foo']);
162
+ expect(await keys()).toEqual(['baz', 'foo']);
165
163
  });
166
164
 
167
165
  it('should be able to get multiple values for a single key', async () => {
168
166
  await multiMap.set('foo', 'bar');
169
167
  await multiMap.set('foo', 'baz');
170
168
 
171
- expect(await getValues('foo')).to.deep.equal(['bar', 'baz']);
169
+ expect(await getValues('foo')).toEqual(['bar', 'baz']);
172
170
  });
173
171
 
174
172
  it('should ignore multiple identical values', async () => {
175
173
  await multiMap.set('foo', 'bar');
176
174
  await multiMap.set('foo', 'bar');
177
175
 
178
- expect(await getValues('foo')).to.deep.equal(['bar']);
176
+ expect(await getValues('foo')).toEqual(['bar']);
179
177
  });
180
178
 
181
179
  it('should be able to delete individual values for a single key', async () => {
@@ -185,22 +183,22 @@ export function describeAztecMultiMap(
185
183
 
186
184
  await multiMap.deleteValue('foo', '2');
187
185
 
188
- expect(await getValues('foo')).to.deep.equal(['1', '3']);
186
+ expect(await getValues('foo')).toEqual(['1', '3']);
189
187
  });
190
188
 
191
189
  it('should be able to get size of the map with duplicate keys', async () => {
192
190
  await multiMap.set('foo', '1');
193
191
  await multiMap.set('foo', '2');
194
192
  await multiMap.set('foo', '3');
195
- expect(await size()).to.equal(3);
193
+ expect(await size()).toBe(3);
196
194
 
197
195
  await multiMap.set('bar', '1');
198
196
  await multiMap.set('bar', '2');
199
197
  await multiMap.set('bar', '3');
200
- expect(await size()).to.equal(6);
198
+ expect(await size()).toBe(6);
201
199
 
202
200
  await multiMap.deleteValue('foo', '2');
203
- expect(await size()).to.equal(5);
201
+ expect(await size()).toBe(5);
204
202
  });
205
203
 
206
204
  it('should be able to delete the last and first values for a key', async () => {
@@ -210,11 +208,11 @@ export function describeAztecMultiMap(
210
208
 
211
209
  await multiMap.deleteValue('foo', '1');
212
210
 
213
- expect(await getValues('foo')).to.deep.equal(['2', '3']);
211
+ expect(await getValues('foo')).toEqual(['2', '3']);
214
212
 
215
213
  await multiMap.deleteValue('foo', '3');
216
214
 
217
- expect(await getValues('foo')).to.deep.equal(['2']);
215
+ expect(await getValues('foo')).toEqual(['2']);
218
216
  });
219
217
 
220
218
  it('should be able to fully clear a key', async () => {
@@ -226,7 +224,7 @@ export function describeAztecMultiMap(
226
224
  await multiMap.deleteValue('foo', '3');
227
225
  await multiMap.deleteValue('foo', '2');
228
226
 
229
- expect(await getValues('foo')).to.deep.equal([]);
227
+ expect(await getValues('foo')).toEqual([]);
230
228
  });
231
229
 
232
230
  it('should be able to insert after deletion', async () => {
@@ -237,12 +235,12 @@ export function describeAztecMultiMap(
237
235
  await multiMap.deleteValue('foo', '2');
238
236
  await multiMap.set('foo', 'bar');
239
237
 
240
- expect(await getValues('foo')).to.deep.equal(['1', '3', 'bar']);
238
+ expect(await getValues('foo')).toEqual(['1', '3', 'bar']);
241
239
 
242
240
  // Delete the just-added entry
243
241
  await multiMap.deleteValue('foo', 'bar');
244
242
 
245
- expect(await getValues('foo')).to.deep.equal(['1', '3']);
243
+ expect(await getValues('foo')).toEqual(['1', '3']);
246
244
 
247
245
  // Reinsert the initially deleted key
248
246
  await multiMap.set('foo', '2');
@@ -250,7 +248,7 @@ export function describeAztecMultiMap(
250
248
  // LMDB and IndexedDB behave differently here, the former ordering by value and the latter by insertion. This is
251
249
  // fine because there is no expectation for values in a multimap to be ordered.
252
250
  const values = (await getValues('foo')).sort((a, b) => a.localeCompare(b));
253
- expect(values).to.deep.equal(['1', '2', '3']);
251
+ expect(values).toEqual(['1', '2', '3']);
254
252
 
255
253
  // Fully clear the key
256
254
  await multiMap.deleteValue('foo', '1');
@@ -260,7 +258,7 @@ export function describeAztecMultiMap(
260
258
  // Insert some more
261
259
  await multiMap.set('foo', 'baz');
262
260
  await multiMap.set('foo', 'qux');
263
- expect(await getValues('foo')).to.deep.equal(['baz', 'qux']);
261
+ expect(await getValues('foo')).toEqual(['baz', 'qux']);
264
262
  });
265
263
 
266
264
  it('supports range queries', async () => {
@@ -269,29 +267,29 @@ export function describeAztecMultiMap(
269
267
  await multiMap.set('c', 'c');
270
268
  await multiMap.set('d', 'd');
271
269
 
272
- expect(await keys({ start: 'b', end: 'c' })).to.deep.equal(['b']);
273
- expect(await keys({ start: 'b' })).to.deep.equal(['b', 'c', 'd']);
274
- expect(await keys({ end: 'c' })).to.deep.equal(['a', 'b']);
275
- expect(await keys({ start: 'b', end: 'c', reverse: true })).to.deep.equal(['c']);
276
- expect(await keys({ start: 'b', limit: 1 })).to.deep.equal(['b']);
277
- expect(await keys({ start: 'b', reverse: true })).to.deep.equal(['d', 'c']);
278
- expect(await keys({ end: 'b', reverse: true })).to.deep.equal(['b', 'a']);
270
+ expect(await keys({ start: 'b', end: 'c' })).toEqual(['b']);
271
+ expect(await keys({ start: 'b' })).toEqual(['b', 'c', 'd']);
272
+ expect(await keys({ end: 'c' })).toEqual(['a', 'b']);
273
+ expect(await keys({ start: 'b', end: 'c', reverse: true })).toEqual(['c']);
274
+ expect(await keys({ start: 'b', limit: 1 })).toEqual(['b']);
275
+ expect(await keys({ start: 'b', reverse: true })).toEqual(['d', 'c']);
276
+ expect(await keys({ end: 'b', reverse: true })).toEqual(['b', 'a']);
279
277
  });
280
278
 
281
279
  it('returns 0 for missing key', async () => {
282
- expect(await getValueCount('missing')).to.equal(0);
280
+ expect(await getValueCount('missing')).toBe(0);
283
281
  });
284
282
 
285
283
  it('counts a single value', async () => {
286
284
  await multiMap.set('foo', 'bar');
287
- expect(await getValueCount('foo')).to.equal(1);
285
+ expect(await getValueCount('foo')).toBe(1);
288
286
  });
289
287
 
290
288
  it('counts multiple distinct values for same key', async () => {
291
289
  await multiMap.set('foo', 'bar');
292
290
  await multiMap.set('foo', 'baz');
293
291
  await multiMap.set('foo', 'qux');
294
- expect(await getValueCount('foo')).to.equal(3);
292
+ expect(await getValueCount('foo')).toBe(3);
295
293
  });
296
294
 
297
295
  it('does not increase count for duplicate inserts', async () => {
@@ -299,42 +297,42 @@ export function describeAztecMultiMap(
299
297
  await multiMap.set('foo', 'bar');
300
298
  await multiMap.set('foo', 'baz');
301
299
  await multiMap.set('foo', 'baz');
302
- expect(await getValueCount('foo')).to.equal(2);
303
- expect(await getValues('foo')).to.have.members(['bar', 'baz']);
300
+ expect(await getValueCount('foo')).toBe(2);
301
+ expect((await getValues('foo')).sort()).toEqual(['bar', 'baz'].sort());
304
302
  });
305
303
 
306
304
  it('decrements when deleting a single value', async () => {
307
305
  await multiMap.set('foo', '1');
308
306
  await multiMap.set('foo', '2');
309
307
  await multiMap.set('foo', '3');
310
- expect(await getValueCount('foo')).to.equal(3);
308
+ expect(await getValueCount('foo')).toBe(3);
311
309
  await multiMap.deleteValue('foo', '2');
312
- expect(await getValueCount('foo')).to.equal(2);
313
- expect(await getValues('foo')).to.have.members(['1', '3']);
310
+ expect(await getValueCount('foo')).toBe(2);
311
+ expect((await getValues('foo')).sort()).toEqual(['1', '3'].sort());
314
312
  });
315
313
 
316
314
  it('does not change count when deleting a non-existent value', async () => {
317
315
  await multiMap.set('foo', '1');
318
316
  await multiMap.set('foo', '3');
319
- expect(await getValueCount('foo')).to.equal(2);
317
+ expect(await getValueCount('foo')).toBe(2);
320
318
  await multiMap.deleteValue('foo', '2');
321
- expect(await getValueCount('foo')).to.equal(2);
319
+ expect(await getValueCount('foo')).toBe(2);
322
320
  });
323
321
 
324
322
  it('clears all values when deleting a key', async () => {
325
323
  await multiMap.set('foo', 'bar');
326
324
  await multiMap.set('foo', 'baz');
327
- expect(await getValueCount('foo')).to.equal(2);
325
+ expect(await getValueCount('foo')).toBe(2);
328
326
  await multiMap.delete('foo');
329
- expect(await getValueCount('foo')).to.equal(0);
330
- expect(await getValues('foo')).to.deep.equal([]);
327
+ expect(await getValueCount('foo')).toBe(0);
328
+ expect(await getValues('foo')).toEqual([]);
331
329
  });
332
330
 
333
331
  it('count equals enumerated values length', async () => {
334
332
  await multiMap.set('foo', '1');
335
333
  await multiMap.set('foo', '2');
336
334
  const vals = await getValues('foo');
337
- expect(await getValueCount('foo')).to.equal(vals.length);
335
+ expect(await getValueCount('foo')).toBe(vals.length);
338
336
  });
339
337
 
340
338
  it('sum of per-key counts equals total size', async () => {
@@ -348,27 +346,27 @@ export function describeAztecMultiMap(
348
346
  const uniqueKeys = Array.from(new Set(allKeys));
349
347
  const counts = await Promise.all(uniqueKeys.map(k => getValueCount(k)));
350
348
  const sum = counts.reduce((s, n) => s + n, 0);
351
- expect(sum).to.equal(await size());
349
+ expect(sum).toBe(await size());
352
350
  });
353
351
 
354
352
  it('supports sparse slots: delete middle, reinsert new, count remains correct', async () => {
355
353
  await multiMap.set('foo', '1');
356
354
  await multiMap.set('foo', '2');
357
355
  await multiMap.set('foo', '3');
358
- expect(await getValueCount('foo')).to.equal(3);
356
+ expect(await getValueCount('foo')).toBe(3);
359
357
  await multiMap.deleteValue('foo', '2');
360
- expect(await getValueCount('foo')).to.equal(2);
358
+ expect(await getValueCount('foo')).toBe(2);
361
359
  await multiMap.set('foo', '4');
362
- expect(await getValueCount('foo')).to.equal(3);
363
- expect(await getValues('foo')).to.have.members(['1', '3', '4']);
360
+ expect(await getValueCount('foo')).toBe(3);
361
+ expect((await getValues('foo')).sort()).toEqual(['1', '3', '4'].sort());
364
362
  });
365
363
 
366
364
  it('multiple keys are independent', async () => {
367
365
  await multiMap.set('foo', '1');
368
366
  await multiMap.set('foo', '2');
369
367
  await multiMap.set('bar', '3');
370
- expect(await getValueCount('foo')).to.equal(2);
371
- expect(await getValueCount('bar')).to.equal(1);
368
+ expect(await getValueCount('foo')).toBe(2);
369
+ expect(await getValueCount('bar')).toBe(1);
372
370
  });
373
371
  });
374
372
  }
@@ -1,7 +1,5 @@
1
1
  import { toArray } from '@aztec/foundation/iterable';
2
2
 
3
- import { expect } from 'chai';
4
-
5
3
  import type { Range } from './common.js';
6
4
  import type { AztecAsyncSet, AztecSet } from './set.js';
7
5
  import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
@@ -41,9 +39,9 @@ export function describeAztecSet(
41
39
  await set.add('foo');
42
40
  await set.add('baz');
43
41
 
44
- expect(await has('foo')).to.equal(true);
45
- expect(await has('baz')).to.equal(true);
46
- expect(await has('bar')).to.equal(false);
42
+ expect(await has('foo')).toBe(true);
43
+ expect(await has('baz')).toBe(true);
44
+ expect(await has('bar')).toBe(false);
47
45
  });
48
46
 
49
47
  it('should be able to delete values', async () => {
@@ -52,15 +50,15 @@ export function describeAztecSet(
52
50
 
53
51
  await set.delete('foo');
54
52
 
55
- expect(await has('foo')).to.equal(false);
56
- expect(await has('baz')).to.equal(true);
53
+ expect(await has('foo')).toBe(false);
54
+ expect(await has('baz')).toBe(true);
57
55
  });
58
56
 
59
57
  it('should be able to iterate over entries', async () => {
60
58
  await set.add('baz');
61
59
  await set.add('foo');
62
60
 
63
- expect(await entries()).to.deep.equal(['baz', 'foo']);
61
+ expect(await entries()).toEqual(['baz', 'foo']);
64
62
  });
65
63
 
66
64
  it('supports range queries', async () => {
@@ -69,13 +67,13 @@ export function describeAztecSet(
69
67
  await set.add('c');
70
68
  await set.add('d');
71
69
 
72
- expect(await entries({ start: 'b', end: 'c' })).to.deep.equal(['b']);
73
- expect(await entries({ start: 'b' })).to.deep.equal(['b', 'c', 'd']);
74
- expect(await entries({ end: 'c' })).to.deep.equal(['a', 'b']);
75
- expect(await entries({ start: 'b', end: 'c', reverse: true })).to.deep.equal(['c']);
76
- expect(await entries({ start: 'b', limit: 1 })).to.deep.equal(['b']);
77
- expect(await entries({ start: 'b', reverse: true })).to.deep.equal(['d', 'c']);
78
- expect(await entries({ end: 'b', reverse: true })).to.deep.equal(['b', 'a']);
70
+ expect(await entries({ start: 'b', end: 'c' })).toEqual(['b']);
71
+ expect(await entries({ start: 'b' })).toEqual(['b', 'c', 'd']);
72
+ expect(await entries({ end: 'c' })).toEqual(['a', 'b']);
73
+ expect(await entries({ start: 'b', end: 'c', reverse: true })).toEqual(['c']);
74
+ expect(await entries({ start: 'b', limit: 1 })).toEqual(['b']);
75
+ expect(await entries({ start: 'b', reverse: true })).toEqual(['d', 'c']);
76
+ expect(await entries({ end: 'b', reverse: true })).toEqual(['b', 'a']);
79
77
  });
80
78
  });
81
79
  }
@@ -1,5 +1,3 @@
1
- import { expect } from 'chai';
2
-
3
1
  import type { AztecAsyncSingleton, AztecSingleton } from './singleton.js';
4
2
  import type { AztecAsyncKVStore, AztecKVStore } from './store.js';
5
3
  import { isSyncStore } from './utils.js';
@@ -29,18 +27,18 @@ export function describeAztecSingleton(
29
27
  }
30
28
 
31
29
  it('returns undefined if the value is not set', async () => {
32
- expect(await get()).to.equal(undefined);
30
+ expect(await get()).toBe(undefined);
33
31
  });
34
32
 
35
33
  it('should be able to set and get values', async () => {
36
- expect(await singleton.set('foo')).to.equal(true);
37
- expect(await get()).to.equal('foo');
34
+ expect(await singleton.set('foo')).toBe(true);
35
+ expect(await get()).toBe('foo');
38
36
  });
39
37
 
40
38
  it('overwrites the value if it is set again', async () => {
41
- expect(await singleton.set('foo')).to.equal(true);
42
- expect(await singleton.set('bar')).to.equal(true);
43
- expect(await get()).to.equal('bar');
39
+ expect(await singleton.set('foo')).toBe(true);
40
+ expect(await singleton.set('bar')).toBe(true);
41
+ expect(await get()).toBe('bar');
44
42
  });
45
43
  });
46
44
  }
package/src/lmdb/index.ts CHANGED
@@ -26,8 +26,8 @@ export function createStore(
26
26
  );
27
27
 
28
28
  const store = AztecLmdbStore.open(dataDirectory, config.dataStoreMapSizeKb, false);
29
- if (config.l1Contracts?.rollupAddress) {
30
- return initStoreForRollupAndSchemaVersion(store, schemaVersion, config.l1Contracts.rollupAddress, log);
29
+ if (config.rollupAddress) {
30
+ return initStoreForRollupAndSchemaVersion(store, schemaVersion, config.rollupAddress, log);
31
31
  }
32
32
  return store;
33
33
  }
package/src/lmdb/store.ts CHANGED
@@ -147,21 +147,25 @@ export class AztecLmdbStore implements AztecKVStore, AztecAsyncKVStore {
147
147
  }
148
148
 
149
149
  /**
150
- * Clears all entries in the store & sub DBs.
150
+ * Clears all entries in the store & sub DBs atomically within a single transaction.
151
151
  */
152
152
  async clear() {
153
- await this.#data.clearAsync();
154
- await this.#multiMapData.clearAsync();
155
- await this.#rootDb.clearAsync();
153
+ await this.#rootDb.transaction(async () => {
154
+ await this.#data.clearAsync();
155
+ await this.#multiMapData.clearAsync();
156
+ await this.#rootDb.clearAsync();
157
+ });
156
158
  }
157
159
 
158
160
  /**
159
- * Drops the database & sub DBs.
161
+ * Drops the database & sub DBs atomically within a single transaction.
160
162
  */
161
163
  async drop() {
162
- await this.#data.drop();
163
- await this.#multiMapData.drop();
164
- await this.#rootDb.drop();
164
+ await this.#rootDb.transaction(async () => {
165
+ await this.#data.drop();
166
+ await this.#multiMapData.drop();
167
+ await this.#rootDb.drop();
168
+ });
165
169
  }
166
170
 
167
171
  /**